From 76e368953aef27a77d6ae9985d62600fba15710b Mon Sep 17 00:00:00 2001 From: Matt Kempster Date: Sat, 12 Feb 2022 23:11:23 -0500 Subject: [PATCH] Reformat using black --- fast64_internal/f3d/f3d_constants.py | 415 +- fast64_internal/f3d/f3d_enums.py | 546 +- fast64_internal/f3d/f3d_gbi.py | 12855 +- fast64_internal/f3d/f3d_generate_presets.py | 36 +- fast64_internal/f3d/f3d_material.py | 7007 +- fast64_internal/f3d/f3d_material_nodes.py | 2650 +- fast64_internal/f3d/f3d_material_presets.py | 195 +- fast64_internal/f3d/f3d_material_settings.py | 814 +- fast64_internal/f3d/f3d_parser.py | 4249 +- fast64_internal/f3d/f3d_render_engine.py | 746 +- fast64_internal/f3d/f3d_writer.py | 5532 +- fast64_internal/f3d_material_converter.py | 548 +- fast64_internal/oot/__init__.py | 229 +- fast64_internal/oot/c_writer/__init__.py | 2 +- fast64_internal/oot/c_writer/oot_level_c.py | 1431 +- .../oot/c_writer/oot_scene_folder.py | 42 +- .../oot/c_writer/oot_scene_id_c.py | 83 +- .../oot/c_writer/oot_scene_table_c.py | 163 +- .../oot/c_writer/oot_segment_symbols_c.py | 107 +- fast64_internal/oot/c_writer/oot_spec.py | 216 +- fast64_internal/oot/oot_actor.py | 417 +- fast64_internal/oot/oot_anim.py | 972 +- fast64_internal/oot/oot_collision.py | 1152 +- fast64_internal/oot/oot_collision_classes.py | 594 +- fast64_internal/oot/oot_constants.py | 2882 +- fast64_internal/oot/oot_cutscene.py | 1110 +- fast64_internal/oot/oot_f3d_writer.py | 1081 +- fast64_internal/oot/oot_level.py | 508 +- fast64_internal/oot/oot_level_classes.py | 909 +- fast64_internal/oot/oot_level_writer.py | 1570 +- fast64_internal/oot/oot_model_classes.py | 377 +- fast64_internal/oot/oot_operators.py | 369 +- fast64_internal/oot/oot_parse.py | 107 +- fast64_internal/oot/oot_scene_room.py | 1344 +- fast64_internal/oot/oot_skeleton.py | 2132 +- fast64_internal/oot/oot_spline.py | 140 +- fast64_internal/oot/oot_utility.py | 1076 +- fast64_internal/oot/sceneDirectoryParser.py | 40 +- fast64_internal/operators.py | 112 +- fast64_internal/panels.py | 45 +- fast64_internal/sm64/__init__.py | 517 +- .../sm64/c_templates/tile_scroll.py | 8 +- fast64_internal/sm64/parse_function_map.py | 23 +- fast64_internal/sm64/sm64_anim.py | 1980 +- fast64_internal/sm64/sm64_camera.py | 392 +- fast64_internal/sm64/sm64_collision.py | 2644 +- fast64_internal/sm64/sm64_constants.py | 3907 +- fast64_internal/sm64/sm64_enum_parser.py | 99 +- fast64_internal/sm64/sm64_f3d_parser.py | 169 +- fast64_internal/sm64/sm64_f3d_writer.py | 2104 +- fast64_internal/sm64/sm64_function_map.py | 103168 +++++++-------- fast64_internal/sm64/sm64_geolayout_bone.py | 1062 +- .../sm64/sm64_geolayout_classes.py | 2237 +- .../sm64/sm64_geolayout_constants.py | 163 +- fast64_internal/sm64/sm64_geolayout_parser.py | 2895 +- .../sm64/sm64_geolayout_utility.py | 145 +- fast64_internal/sm64/sm64_geolayout_writer.py | 5880 +- fast64_internal/sm64/sm64_level_constants.py | 149 +- fast64_internal/sm64/sm64_level_parser.py | 792 +- fast64_internal/sm64/sm64_level_writer.py | 2291 +- fast64_internal/sm64/sm64_objects.py | 3848 +- fast64_internal/sm64/sm64_rom_tweaks.py | 54 +- fast64_internal/sm64/sm64_spline.py | 297 +- fast64_internal/sm64/sm64_texscroll.py | 906 +- fast64_internal/sm64/sm64_utility.py | 27 +- fast64_internal/utility.py | 2013 +- fast64_internal/utility_anim.py | 97 +- 67 files changed, 102915 insertions(+), 89755 deletions(-) diff --git a/fast64_internal/f3d/f3d_constants.py b/fast64_internal/f3d/f3d_constants.py index f7bb049ec..476066ac5 100644 --- a/fast64_internal/f3d/f3d_constants.py +++ b/fast64_internal/f3d/f3d_constants.py @@ -1,129 +1,346 @@ import mathutils # Equivalent of euler(-90, -90, 0) -blenderToSM64Rotation = mathutils.Matrix( - [[0, 1, 0], - [0, 0, 1], - [1, 0, 0]] -) - -blenderToSM64RotationLevel = mathutils.Matrix( - [[1, 0, 0], - [0, 0, 1], - [0,-1, 0]] -) - -colorFormats = { - 'RGBA' : 0, - 'YUV' : 1, - 'CI' : 2, - 'IA' : 3, - 'I' : 4 -} - -pixelBitSizes = { - '4bit' : 0, - '8bit' : 1, - '16bit' : 2, - '32bit' : 3 -} +blenderToSM64Rotation = mathutils.Matrix([[0, 1, 0], [0, 0, 1], [1, 0, 0]]) + +blenderToSM64RotationLevel = mathutils.Matrix([[1, 0, 0], [0, 0, 1], [0, -1, 0]]) + +colorFormats = {"RGBA": 0, "YUV": 1, "CI": 2, "IA": 3, "I": 4} + +pixelBitSizes = {"4bit": 0, "8bit": 1, "16bit": 2, "32bit": 3} # Color combinations # In SM64, environment alpha controls Mario's alpha. # 2 cycle with specular lighting stored in primitive -S_PHONG_TEX = ['TEXEL0', '0', 'SHADE', '0', - 'TEXEL0', '0', 'ENVIRONMENT', '0', - 'PRIMITIVE', 'COMBINED', 'TEXEL0', 'COMBINED', - '0', '0', '0', 'COMBINED'] +S_PHONG_TEX = [ + "TEXEL0", + "0", + "SHADE", + "0", + "TEXEL0", + "0", + "ENVIRONMENT", + "0", + "PRIMITIVE", + "COMBINED", + "TEXEL0", + "COMBINED", + "0", + "0", + "0", + "COMBINED", +] # MULTIPLY TWO TEXTURES S_MULTIPLY = [ - 'TEXEL0', '0', 'TEXEL1', '0', - '0', '0', '0', 'ENVIRONMENT', - 'TEXEL0', '0', 'TEXEL1', '0', - '0', '0', '0', 'ENVIRONMENT' + "TEXEL0", + "0", + "TEXEL1", + "0", + "0", + "0", + "0", + "ENVIRONMENT", + "TEXEL0", + "0", + "TEXEL1", + "0", + "0", + "0", + "0", + "ENVIRONMENT", ] -S_PRIM_TRANSPARENT_SHADE = ['TEXEL0', '0', 'SHADE', '0', - 'TEXEL0', '0', 'PRIMITIVE', '0', - 'TEXEL0', '0', 'SHADE', '0', - 'TEXEL0', '0', 'PRIMITIVE', '0'] +S_PRIM_TRANSPARENT_SHADE = [ + "TEXEL0", + "0", + "SHADE", + "0", + "TEXEL0", + "0", + "PRIMITIVE", + "0", + "TEXEL0", + "0", + "SHADE", + "0", + "TEXEL0", + "0", + "PRIMITIVE", + "0", +] # REGULAR SHADED TEXTURE -S_SHADED_TEX = ['TEXEL0', '0', 'SHADE', '0', - '0', '0', '0', 'ENVIRONMENT', - 'TEXEL0', '0', 'SHADE', '0', - '0', '0', '0', 'ENVIRONMENT'] +S_SHADED_TEX = [ + "TEXEL0", + "0", + "SHADE", + "0", + "0", + "0", + "0", + "ENVIRONMENT", + "TEXEL0", + "0", + "SHADE", + "0", + "0", + "0", + "0", + "ENVIRONMENT", +] # VERTEX COLOR -S_VERTEX_COLORED_TEX = ['TEXEL0', '0', 'SHADE', '0', - 'ENVIRONMENT', '0', 'SHADE', '0', - 'TEXEL0', '0', 'SHADE', '0', - 'ENVIRONMENT', '0', 'SHADE', '0'] - -S_VERTEX_COLORED_TEX_NO_VERT_ALPHA = ['TEXEL0', '0', 'SHADE', '0', - '0', '0', '0', 'TEXEL0', - 'TEXEL0', '0', 'SHADE', '0', - '0', '0', '0', 'TEXEL0',] - -S_VERTEX_COLORED_TEX_TRANSPARENT = ['TEXEL0', '0', 'SHADE', '0', - 'TEXEL0', '0', 'SHADE', '0', - 'TEXEL0', '0', 'SHADE', '0', - 'TEXEL0', '0', 'SHADE', '0'] - -S_SHADED_TEX_CUTOUT = ['TEXEL0', '0', 'SHADE', '0', - 'TEXEL0', '0', 'ENVIRONMENT', '0', - 'TEXEL0', '0', 'SHADE', '0', - 'TEXEL0', '0', 'ENVIRONMENT', '0'] +S_VERTEX_COLORED_TEX = [ + "TEXEL0", + "0", + "SHADE", + "0", + "ENVIRONMENT", + "0", + "SHADE", + "0", + "TEXEL0", + "0", + "SHADE", + "0", + "ENVIRONMENT", + "0", + "SHADE", + "0", +] + +S_VERTEX_COLORED_TEX_NO_VERT_ALPHA = [ + "TEXEL0", + "0", + "SHADE", + "0", + "0", + "0", + "0", + "TEXEL0", + "TEXEL0", + "0", + "SHADE", + "0", + "0", + "0", + "0", + "TEXEL0", +] + +S_VERTEX_COLORED_TEX_TRANSPARENT = [ + "TEXEL0", + "0", + "SHADE", + "0", + "TEXEL0", + "0", + "SHADE", + "0", + "TEXEL0", + "0", + "SHADE", + "0", + "TEXEL0", + "0", + "SHADE", + "0", +] + +S_SHADED_TEX_CUTOUT = [ + "TEXEL0", + "0", + "SHADE", + "0", + "TEXEL0", + "0", + "ENVIRONMENT", + "0", + "TEXEL0", + "0", + "SHADE", + "0", + "TEXEL0", + "0", + "ENVIRONMENT", + "0", +] # UNLIT TEXTURE, USED FOR METAL MARIO -S_UNLIT_TEX = ['0', '0', '0', 'TEXEL0', - '0', '0', '0', 'ENVIRONMENT', - '0', '0', '0', 'TEXEL0', - '0', '0', '0', 'ENVIRONMENT'] +S_UNLIT_TEX = [ + "0", + "0", + "0", + "TEXEL0", + "0", + "0", + "0", + "ENVIRONMENT", + "0", + "0", + "0", + "TEXEL0", + "0", + "0", + "0", + "ENVIRONMENT", +] -S_UNLIT_TEX_CUTOUT = ['0', '0', '0', 'TEXEL0', - 'TEXEL0', '0', 'ENVIRONMENT', '0', - '0', '0', '0', 'TEXEL0', - 'TEXEL0', '0', 'ENVIRONMENT', '0'] +S_UNLIT_TEX_CUTOUT = [ + "0", + "0", + "0", + "TEXEL0", + "TEXEL0", + "0", + "ENVIRONMENT", + "0", + "0", + "0", + "0", + "TEXEL0", + "TEXEL0", + "0", + "ENVIRONMENT", + "0", +] # SM64 CUSTOM IMPORTER CC -S_SHADED_TEX_NOALPHA = ['TEXEL0', '0', 'SHADE', '0', - '0', '0', '0', 'SHADE', - 'TEXEL0', '0', 'SHADE', '0', - '0', '0', '0', 'SHADE'] +S_SHADED_TEX_NOALPHA = [ + "TEXEL0", + "0", + "SHADE", + "0", + "0", + "0", + "0", + "SHADE", + "TEXEL0", + "0", + "SHADE", + "0", + "0", + "0", + "0", + "SHADE", +] # SM64 BODY CC -S_SHADED_SOLID = ['0', '0', '0', 'SHADE', - '0', '0', '0', 'ENVIRONMENT', - '0', '0', '0', 'SHADE', - '0', '0', '0', 'ENVIRONMENT'] +S_SHADED_SOLID = [ + "0", + "0", + "0", + "SHADE", + "0", + "0", + "0", + "ENVIRONMENT", + "0", + "0", + "0", + "SHADE", + "0", + "0", + "0", + "ENVIRONMENT", +] # SM64 BODY TEXTURES (FACE, SIDEBURNS, ETC.) -S_UNLIT_DECAL_ON_SHADED_SOLID = ['TEXEL0', 'SHADE', 'TEXEL0_ALPHA', 'SHADE', - '0', '0', '0', 'ENVIRONMENT', - 'TEXEL0', 'SHADE', 'TEXEL0_ALPHA', 'SHADE', - '0', '0', '0', 'ENVIRONMENT'] +S_UNLIT_DECAL_ON_SHADED_SOLID = [ + "TEXEL0", + "SHADE", + "TEXEL0_ALPHA", + "SHADE", + "0", + "0", + "0", + "ENVIRONMENT", + "TEXEL0", + "SHADE", + "TEXEL0_ALPHA", + "SHADE", + "0", + "0", + "0", + "ENVIRONMENT", +] # SHADED RANDOM NOISE -S_SHADED_NOISE = ['NOISE', '0', 'SHADE', '0', - '0', '0', '0', 'ENVIRONMENT', - 'NOISE', '0', 'SHADE', '0', - '0', '0', '0', 'ENVIRONMENT'] +S_SHADED_NOISE = [ + "NOISE", + "0", + "SHADE", + "0", + "0", + "0", + "0", + "ENVIRONMENT", + "NOISE", + "0", + "SHADE", + "0", + "0", + "0", + "0", + "ENVIRONMENT", +] # FOG SHADED TEXTURES -S_FOG_SHADED_TEX = ['TEXEL0', '0', 'SHADE', '0', - '0', '0', '0', 'ENVIRONMENT', - '0', '0', '0', 'COMBINED', - '0', '0', '0', 'COMBINED'] - -S_FOG_SHADED_TEX_CUTOUT = ['TEXEL0', '0', 'SHADE', '0', - 'TEXEL0', '0', 'ENVIRONMENT', '0', - '0', '0', '0', 'COMBINED', - '0', '0', '0', 'COMBINED'] - -S_FOG_PRIM_TRANSPARENT_SHADE = ['TEXEL0', '0', 'SHADE', '0', - 'TEXEL0', '0', 'PRIMITIVE', '0', - '0', '0', '0', 'COMBINED', - '0', '0', '0', 'COMBINED'] \ No newline at end of file +S_FOG_SHADED_TEX = [ + "TEXEL0", + "0", + "SHADE", + "0", + "0", + "0", + "0", + "ENVIRONMENT", + "0", + "0", + "0", + "COMBINED", + "0", + "0", + "0", + "COMBINED", +] + +S_FOG_SHADED_TEX_CUTOUT = [ + "TEXEL0", + "0", + "SHADE", + "0", + "TEXEL0", + "0", + "ENVIRONMENT", + "0", + "0", + "0", + "0", + "COMBINED", + "0", + "0", + "0", + "COMBINED", +] + +S_FOG_PRIM_TRANSPARENT_SHADE = [ + "TEXEL0", + "0", + "SHADE", + "0", + "TEXEL0", + "0", + "PRIMITIVE", + "0", + "0", + "0", + "0", + "COMBINED", + "0", + "0", + "0", + "COMBINED", +] diff --git a/fast64_internal/f3d/f3d_enums.py b/fast64_internal/f3d/f3d_enums.py index ee6a7c23b..8527200a5 100644 --- a/fast64_internal/f3d/f3d_enums.py +++ b/fast64_internal/f3d/f3d_enums.py @@ -1,373 +1,369 @@ - combiner_enums = { - 'Case A' : ( - ('COMBINED', 'Combined Color', 'Combined Color'), - ('TEXEL0', 'Texture 0 Color', 'Texture 0 Color'), - ('TEXEL1', 'Texture 1 Color', 'Texture 1 Color'), - ('PRIMITIVE', 'Primitive Color', 'Primitive Color'), - ('SHADE', 'Shade Color', 'Shade Color'), - ('ENVIRONMENT', 'Environment Color', 'Environment Color'), - ('1', '1', '1'), - ('NOISE', 'Noise', 'Noise'), - ('0', '0', '0'), - ), - - 'Case B' : ( - ('COMBINED', 'Combined Color', 'Combined Color'), - ('TEXEL0', 'Texture 0 Color', 'Texture 0 Color'), - ('TEXEL1', 'Texture 1 Color', 'Texture 1 Color'), - ('PRIMITIVE', 'Primitive Color', 'Primitive Color'), - ('SHADE', 'Shade Color', 'Shade Color'), - ('ENVIRONMENT', 'Environment Color', 'Environment Color'), - ('CENTER', 'Chroma Key Center', 'Chroma Key Center'), - ('K4', 'YUV Convert K4', 'YUV Convert K4'), - ('0', '0', '0') - ), - - 'Case C' : ( - ('COMBINED' , 'Combined Color', 'Combined Color'), - ('TEXEL0' , 'Texture 0 Color', 'Texture 0 Color'), - ('TEXEL1' , 'Texture 1 Color', 'Texture 1 Color'), - ('PRIMITIVE' , 'Primitive Color', 'Primitive Color'), - ('SHADE' , 'Shade Color', 'Shade Color'), - ('ENVIRONMENT' , 'Environment Color', 'Environment Color'), - ('SCALE' , 'Chroma Key Scale', 'Chroma Key Scale'), - ('COMBINED_ALPHA' , 'Combined Color Alpha', 'Combined Color Alpha'), - ('TEXEL0_ALPHA' , 'Texture 0 Alpha', 'Texture 0 Alpha'), - ('TEXEL1_ALPHA' , 'Texture 1 Alpha', 'Texture 1 Alpha'), - ('PRIMITIVE_ALPHA' , 'Primitive Color Alpha', 'Primitive Color Alpha'), - ('SHADE_ALPHA' , 'Shade Color Alpha', 'Shade Color Alpha'), - ('ENV_ALPHA' , 'Environment Color Alpha', 'Environment Color Alpha'), - ('LOD_FRACTION' , 'LOD Fraction', 'LOD Fraction'), - ('PRIM_LOD_FRAC' , 'Primitive LOD Fraction', 'Primitive LOD Fraction'), - ('K5' , 'YUV Convert K5', 'YUV Convert K5'), - ('0' , '0', '0'), - ), - - 'Case D' : ( - ('COMBINED', 'Combined Color', 'Combined Color'), - ('TEXEL0', 'Texture 0 Color', 'Texture 0 Color'), - ('TEXEL1', 'Texture 1 Color', 'Texture 1 Color'), - ('PRIMITIVE', 'Primitive Color', 'Primitive Color'), - ('SHADE', 'Shade Color', 'Shade Color'), - ('ENVIRONMENT', 'Environment Color', 'Environment Color'), - ('1', '1', '1'), - ('0', '0', '0'), - ), - - 'Case A Alpha' : ( - ('COMBINED', 'Combined Color Alpha', 'Combined Color Alpha'), - ('TEXEL0', 'Texture 0 Alpha', 'Texture 0 Alpha'), - ('TEXEL1', 'Texture 1 Alpha', 'Texture 1 Alpha'), - ('PRIMITIVE', 'Primitive Color Alpha', 'Primitive Color Alpha'), - ('SHADE', 'Shade Color Alpha', 'Shade Color Alpha'), - ('ENVIRONMENT', 'Environment Color Alpha', 'Environment Color Alpha'), - ('1', '1', '1'), - ('0', '0', '0'), - ), - - 'Case B Alpha' : ( - ('COMBINED', 'Combined Color Alpha', 'Combined Color Alpha'), - ('TEXEL0', 'Texture 0 Alpha', 'Texture 0 Alpha'), - ('TEXEL1', 'Texture 1 Alpha', 'Texture 1 Alpha'), - ('PRIMITIVE', 'Primitive Color Alpha', 'Primitive Color Alpha'), - ('SHADE', 'Shade Color Alpha', 'Shade Color Alpha'), - ('ENVIRONMENT', 'Environment Color Alpha', 'Environment Color Alpha'), - ('1', '1', '1'), - ('0', '0', '0'), - ), - - 'Case C Alpha' : ( - ('LOD_FRACTION', 'LOD Fraction', 'LOD Fraction'), - ('TEXEL0', 'Texture 0 Alpha', 'Texture 0 Alpha'), - ('TEXEL1', 'Texture 1 Alpha', 'Texture 1 Alpha'), - ('PRIMITIVE', 'Primitive Color Alpha', 'Primitive Color Alpha'), - ('SHADE', 'Shade Color Alpha', 'Shade Color Alpha'), - ('ENVIRONMENT', 'Environment Color Alpha', 'Environment Color Alpha'), - ('PRIM_LOD_FRAC', 'Primitive LOD Fraction', 'Primitive LOD Fraction'), - ('0', '0', '0'), - ), - - 'Case D Alpha' : ( - ('COMBINED', 'Combined Color Alpha', 'Combined Color Alpha'), - ('TEXEL0', 'Texture 0 Alpha', 'Texture 0 Alpha'), - ('TEXEL1', 'Texture 1 Alpha', 'Texture 1 Alpha'), - ('PRIMITIVE', 'Primitive Color Alpha', 'Primitive Color Alpha'), - ('SHADE', 'Shade Color Alpha', 'Shade Color Alpha'), - ('ENVIRONMENT', 'Environment Color Alpha', 'Environment Color Alpha'), - ('1', '1', '1'), - ('0', '0', '0'), - ), + "Case A": ( + ("COMBINED", "Combined Color", "Combined Color"), + ("TEXEL0", "Texture 0 Color", "Texture 0 Color"), + ("TEXEL1", "Texture 1 Color", "Texture 1 Color"), + ("PRIMITIVE", "Primitive Color", "Primitive Color"), + ("SHADE", "Shade Color", "Shade Color"), + ("ENVIRONMENT", "Environment Color", "Environment Color"), + ("1", "1", "1"), + ("NOISE", "Noise", "Noise"), + ("0", "0", "0"), + ), + "Case B": ( + ("COMBINED", "Combined Color", "Combined Color"), + ("TEXEL0", "Texture 0 Color", "Texture 0 Color"), + ("TEXEL1", "Texture 1 Color", "Texture 1 Color"), + ("PRIMITIVE", "Primitive Color", "Primitive Color"), + ("SHADE", "Shade Color", "Shade Color"), + ("ENVIRONMENT", "Environment Color", "Environment Color"), + ("CENTER", "Chroma Key Center", "Chroma Key Center"), + ("K4", "YUV Convert K4", "YUV Convert K4"), + ("0", "0", "0"), + ), + "Case C": ( + ("COMBINED", "Combined Color", "Combined Color"), + ("TEXEL0", "Texture 0 Color", "Texture 0 Color"), + ("TEXEL1", "Texture 1 Color", "Texture 1 Color"), + ("PRIMITIVE", "Primitive Color", "Primitive Color"), + ("SHADE", "Shade Color", "Shade Color"), + ("ENVIRONMENT", "Environment Color", "Environment Color"), + ("SCALE", "Chroma Key Scale", "Chroma Key Scale"), + ("COMBINED_ALPHA", "Combined Color Alpha", "Combined Color Alpha"), + ("TEXEL0_ALPHA", "Texture 0 Alpha", "Texture 0 Alpha"), + ("TEXEL1_ALPHA", "Texture 1 Alpha", "Texture 1 Alpha"), + ("PRIMITIVE_ALPHA", "Primitive Color Alpha", "Primitive Color Alpha"), + ("SHADE_ALPHA", "Shade Color Alpha", "Shade Color Alpha"), + ("ENV_ALPHA", "Environment Color Alpha", "Environment Color Alpha"), + ("LOD_FRACTION", "LOD Fraction", "LOD Fraction"), + ("PRIM_LOD_FRAC", "Primitive LOD Fraction", "Primitive LOD Fraction"), + ("K5", "YUV Convert K5", "YUV Convert K5"), + ("0", "0", "0"), + ), + "Case D": ( + ("COMBINED", "Combined Color", "Combined Color"), + ("TEXEL0", "Texture 0 Color", "Texture 0 Color"), + ("TEXEL1", "Texture 1 Color", "Texture 1 Color"), + ("PRIMITIVE", "Primitive Color", "Primitive Color"), + ("SHADE", "Shade Color", "Shade Color"), + ("ENVIRONMENT", "Environment Color", "Environment Color"), + ("1", "1", "1"), + ("0", "0", "0"), + ), + "Case A Alpha": ( + ("COMBINED", "Combined Color Alpha", "Combined Color Alpha"), + ("TEXEL0", "Texture 0 Alpha", "Texture 0 Alpha"), + ("TEXEL1", "Texture 1 Alpha", "Texture 1 Alpha"), + ("PRIMITIVE", "Primitive Color Alpha", "Primitive Color Alpha"), + ("SHADE", "Shade Color Alpha", "Shade Color Alpha"), + ("ENVIRONMENT", "Environment Color Alpha", "Environment Color Alpha"), + ("1", "1", "1"), + ("0", "0", "0"), + ), + "Case B Alpha": ( + ("COMBINED", "Combined Color Alpha", "Combined Color Alpha"), + ("TEXEL0", "Texture 0 Alpha", "Texture 0 Alpha"), + ("TEXEL1", "Texture 1 Alpha", "Texture 1 Alpha"), + ("PRIMITIVE", "Primitive Color Alpha", "Primitive Color Alpha"), + ("SHADE", "Shade Color Alpha", "Shade Color Alpha"), + ("ENVIRONMENT", "Environment Color Alpha", "Environment Color Alpha"), + ("1", "1", "1"), + ("0", "0", "0"), + ), + "Case C Alpha": ( + ("LOD_FRACTION", "LOD Fraction", "LOD Fraction"), + ("TEXEL0", "Texture 0 Alpha", "Texture 0 Alpha"), + ("TEXEL1", "Texture 1 Alpha", "Texture 1 Alpha"), + ("PRIMITIVE", "Primitive Color Alpha", "Primitive Color Alpha"), + ("SHADE", "Shade Color Alpha", "Shade Color Alpha"), + ("ENVIRONMENT", "Environment Color Alpha", "Environment Color Alpha"), + ("PRIM_LOD_FRAC", "Primitive LOD Fraction", "Primitive LOD Fraction"), + ("0", "0", "0"), + ), + "Case D Alpha": ( + ("COMBINED", "Combined Color Alpha", "Combined Color Alpha"), + ("TEXEL0", "Texture 0 Alpha", "Texture 0 Alpha"), + ("TEXEL1", "Texture 1 Alpha", "Texture 1 Alpha"), + ("PRIMITIVE", "Primitive Color Alpha", "Primitive Color Alpha"), + ("SHADE", "Shade Color Alpha", "Shade Color Alpha"), + ("ENVIRONMENT", "Environment Color Alpha", "Environment Color Alpha"), + ("1", "1", "1"), + ("0", "0", "0"), + ), } caseTemplateDict = { - 'Case A' : 'NodeSocketColor', - 'Case B' : 'NodeSocketColor', - 'Case C' : 'NodeSocketColor', - 'Case D' : 'NodeSocketColor', - 'Case A Alpha' : 'NodeSocketFloat', - 'Case B Alpha' : 'NodeSocketFloat', - 'Case C Alpha' : 'NodeSocketFloat', - 'Case D Alpha' : 'NodeSocketFloat', + "Case A": "NodeSocketColor", + "Case B": "NodeSocketColor", + "Case C": "NodeSocketColor", + "Case D": "NodeSocketColor", + "Case A Alpha": "NodeSocketFloat", + "Case B Alpha": "NodeSocketFloat", + "Case C Alpha": "NodeSocketFloat", + "Case D Alpha": "NodeSocketFloat", } otherTemplateDict = { - 'Cycle Type': 'NodeSocketFloat', - 'Cull Front': 'NodeSocketFloat', - 'Cull Back': 'NodeSocketFloat', + "Cycle Type": "NodeSocketFloat", + "Cull Front": "NodeSocketFloat", + "Cull Back": "NodeSocketFloat", } # Given combiner value, find node and socket index combinerToNodeDictColor = { - 'COMBINED' : (None, 0), - 'TEXEL0' : ("Get Texture Color", 0), - 'TEXEL1' : ("Get Texture Color.001", 0), - 'PRIMITIVE' : ("Primitive Color RGB", 0), - 'SHADE' : ("Shade Color", 0), - 'ENVIRONMENT' : ("Environment Color RGB", 0), - 'CENTER': ("Chroma Key Center", 0), - 'SCALE' : ("Chroma Key Scale", 0), - 'COMBINED_ALPHA' : (None, 0), - 'TEXEL0_ALPHA' : ("Get Texture Color", 1), - 'TEXEL1_ALPHA' : ("Get Texture Color.001", 1), - 'PRIMITIVE_ALPHA': ("Primitive Color Alpha", 0), - 'SHADE_ALPHA' : ("Shade Color", 1), - 'ENV_ALPHA' : ("Environment Color Alpha", 0), - 'LOD_FRACTION' : ("LOD Fraction", 0), - 'PRIM_LOD_FRAC' : ("Primitive LOD Fraction", 0), - 'NOISE': ("Noise", 0), - 'K4': ("YUV Convert K4", 0), - 'K5' : ("YUV Convert K5", 0), - '1': ("1", 0), - '0': ("0", 0), + "COMBINED": (None, 0), + "TEXEL0": ("Get Texture Color", 0), + "TEXEL1": ("Get Texture Color.001", 0), + "PRIMITIVE": ("Primitive Color RGB", 0), + "SHADE": ("Shade Color", 0), + "ENVIRONMENT": ("Environment Color RGB", 0), + "CENTER": ("Chroma Key Center", 0), + "SCALE": ("Chroma Key Scale", 0), + "COMBINED_ALPHA": (None, 0), + "TEXEL0_ALPHA": ("Get Texture Color", 1), + "TEXEL1_ALPHA": ("Get Texture Color.001", 1), + "PRIMITIVE_ALPHA": ("Primitive Color Alpha", 0), + "SHADE_ALPHA": ("Shade Color", 1), + "ENV_ALPHA": ("Environment Color Alpha", 0), + "LOD_FRACTION": ("LOD Fraction", 0), + "PRIM_LOD_FRAC": ("Primitive LOD Fraction", 0), + "NOISE": ("Noise", 0), + "K4": ("YUV Convert K4", 0), + "K5": ("YUV Convert K5", 0), + "1": ("1", 0), + "0": ("0", 0), } combinerToNodeDictAlpha = { - 'COMBINED' : (None, 1), - 'TEXEL0' : ("Get Texture Color", 1), - 'TEXEL1' : ("Get Texture Color.001", 1), - 'PRIMITIVE' : ("Primitive Color Alpha", 0), - 'SHADE' : ("Shade Color", 1), - 'ENVIRONMENT' : ("Environment Color Alpha", 0), - 'LOD_FRACTION' : ("LOD Fraction", 0), - 'PRIM_LOD_FRAC' : ("Primitive LOD Fraction", 0), - '1' : ("1", 0), - '0' : ("0", 0), + "COMBINED": (None, 1), + "TEXEL0": ("Get Texture Color", 1), + "TEXEL1": ("Get Texture Color.001", 1), + "PRIMITIVE": ("Primitive Color Alpha", 0), + "SHADE": ("Shade Color", 1), + "ENVIRONMENT": ("Environment Color Alpha", 0), + "LOD_FRACTION": ("LOD Fraction", 0), + "PRIM_LOD_FRAC": ("Primitive LOD Fraction", 0), + "1": ("1", 0), + "0": ("0", 0), } # hardware v2 enumAlphaDither = [ - ('G_AD_PATTERN', 'Pattern', 'Pattern'), - ('G_AD_NOTPATTERN', 'NOT Pattern', 'NOT Pattern'), - ('G_AD_NOISE', 'Noise', 'Noise'), - ('G_AD_DISABLE', 'Disable', 'Disable'), + ("G_AD_PATTERN", "Pattern", "Pattern"), + ("G_AD_NOTPATTERN", "NOT Pattern", "NOT Pattern"), + ("G_AD_NOISE", "Noise", "Noise"), + ("G_AD_DISABLE", "Disable", "Disable"), ] # hardware v2 enumRGBDither = [ - ('G_CD_MAGICSQ', 'Magic Square', 'Magic Square'), - ('G_CD_BAYER', 'Bayer', 'Bayer'), - ('G_CD_NOISE', 'Noise', 'Noise'), - ('G_CD_DISABLE', 'Disable', 'Disable'), - ('G_CD_ENABLE', 'Enable', 'Enable') + ("G_CD_MAGICSQ", "Magic Square", "Magic Square"), + ("G_CD_BAYER", "Bayer", "Bayer"), + ("G_CD_NOISE", "Noise", "Noise"), + ("G_CD_DISABLE", "Disable", "Disable"), + ("G_CD_ENABLE", "Enable", "Enable"), ] enumCombKey = [ - ('G_CK_NONE', 'None', 'None'), - ('G_CK_KEY', 'Key', 'Key'), + ("G_CK_NONE", "None", "None"), + ("G_CK_KEY", "Key", "Key"), ] enumTextConv = [ - ('G_TC_CONV', 'Convert', 'Convert'), - ('G_TC_FILTCONV', 'Filter And Convert', 'Filter And Convert'), - ('G_TC_FILT', 'Filter', 'Filter') + ("G_TC_CONV", "Convert", "Convert"), + ("G_TC_FILTCONV", "Filter And Convert", "Filter And Convert"), + ("G_TC_FILT", "Filter", "Filter"), ] enumTextFilt = [ - ('G_TF_POINT', 'Point', 'Point'), - ('G_TF_AVERAGE', 'Average', 'Average'), - ('G_TF_BILERP', 'Bilinear', 'Bilinear'), + ("G_TF_POINT", "Point", "Point"), + ("G_TF_AVERAGE", "Average", "Average"), + ("G_TF_BILERP", "Bilinear", "Bilinear"), ] enumTextLUT = [ - ('G_TT_NONE', 'None', 'None'), - ('G_TT_RGBA16', 'RGBA16', 'RGBA16'), - ('G_TT_IA16', 'IA16', 'IA16'), + ("G_TT_NONE", "None", "None"), + ("G_TT_RGBA16", "RGBA16", "RGBA16"), + ("G_TT_IA16", "IA16", "IA16"), ] enumTextLOD = [ - ('G_TL_TILE', 'Tile', 'Tile'), - ('G_TL_LOD', 'LOD', 'LOD'), + ("G_TL_TILE", "Tile", "Tile"), + ("G_TL_LOD", "LOD", "LOD"), ] enumTextDetail = [ - ('G_TD_CLAMP', 'Clamp', 'Clamp'), - ('G_TD_SHARPEN', 'Sharpen', 'Sharpen'), - ('G_TD_DETAIL', 'Detail', 'Detail'), + ("G_TD_CLAMP", "Clamp", "Clamp"), + ("G_TD_SHARPEN", "Sharpen", "Sharpen"), + ("G_TD_DETAIL", "Detail", "Detail"), ] enumTextPersp = [ - ('G_TP_NONE', 'None', 'None'), - ('G_TP_PERSP', 'Perspective', 'Perspective'), + ("G_TP_NONE", "None", "None"), + ("G_TP_PERSP", "Perspective", "Perspective"), ] enumCycleType = [ - ('G_CYC_1CYCLE', '1 Cycle', '1 Cycle'), - ('G_CYC_2CYCLE', '2 Cycle', '2 Cycle'), - ('G_CYC_COPY', 'Copy', 'Copy'), - ('G_CYC_FILL', 'Fill', 'Fill'), + ("G_CYC_1CYCLE", "1 Cycle", "1 Cycle"), + ("G_CYC_2CYCLE", "2 Cycle", "2 Cycle"), + ("G_CYC_COPY", "Copy", "Copy"), + ("G_CYC_FILL", "Fill", "Fill"), ] enumColorDither = [ - ('G_CD_DISABLE', 'Disable', 'Disable'), - ('G_CD_ENABLE', 'Enable', 'Enable') + ("G_CD_DISABLE", "Disable", "Disable"), + ("G_CD_ENABLE", "Enable", "Enable"), ] enumPipelineMode = [ - ('G_PM_1PRIMITIVE', '1 Primitive', '1 Primitive'), - ('G_PM_NPRIMITIVE', 'N Primitive', 'N Primitive') + ("G_PM_1PRIMITIVE", "1 Primitive", "1 Primitive"), + ("G_PM_NPRIMITIVE", "N Primitive", "N Primitive"), ] enumAlphaCompare = [ - ('G_AC_NONE', 'None', 'None'), - ('G_AC_THRESHOLD', 'Threshold', 'Threshold'), - ('G_AC_DITHER', 'Dither', 'Dither'), + ("G_AC_NONE", "None", "None"), + ("G_AC_THRESHOLD", "Threshold", "Threshold"), + ("G_AC_DITHER", "Dither", "Dither"), ] enumDepthSource = [ - ('G_ZS_PIXEL', 'Pixel', 'Pixel'), - ('G_ZS_PRIM', 'Primitive', 'Primitive'), + ("G_ZS_PIXEL", "Pixel", "Pixel"), + ("G_ZS_PRIM", "Primitive", "Primitive"), ] enumCoverage = [ - ('CVG_DST_CLAMP', 'Clamp', 'Clamp'), - ('CVG_DST_WRAP', 'Wrap', 'Wrap'), - ('CVG_DST_FULL', 'Full', 'Full'), - ('CVG_DST_SAVE', 'Save', 'Save') + ("CVG_DST_CLAMP", "Clamp", "Clamp"), + ("CVG_DST_WRAP", "Wrap", "Wrap"), + ("CVG_DST_FULL", "Full", "Full"), + ("CVG_DST_SAVE", "Save", "Save"), ] enumZMode = [ - ('ZMODE_OPA', 'Opaque', 'Opaque'), - ('ZMODE_INTER', 'Interpenetrating', 'Interpenetrating'), - ('ZMODE_XLU', 'Transparent (XLU)', 'Transparent (XLU)'), - ('ZMODE_DEC', 'Decal', 'Decal') + ("ZMODE_OPA", "Opaque", "Opaque"), + ("ZMODE_INTER", "Interpenetrating", "Interpenetrating"), + ("ZMODE_XLU", "Transparent (XLU)", "Transparent (XLU)"), + ("ZMODE_DEC", "Decal", "Decal"), ] enumBlendColor = [ - ('G_BL_CLR_IN', 'Input (CC/Blender)', 'First cycle: Color Combiner RGB, Second cycle: Blender numerator from first cycle'), - ('G_BL_CLR_MEM', 'Framebuffer Color', 'Framebuffer Color (Memory)'), - ('G_BL_CLR_BL', 'Blend Color', 'Blend Color Register'), - ('G_BL_CLR_FOG', 'Fog Color', 'Fog Color Register') + ( + "G_BL_CLR_IN", + "Input (CC/Blender)", + "First cycle: Color Combiner RGB, Second cycle: Blender numerator from first cycle", + ), + ("G_BL_CLR_MEM", "Framebuffer Color", "Framebuffer Color (Memory)"), + ("G_BL_CLR_BL", "Blend Color", "Blend Color Register"), + ("G_BL_CLR_FOG", "Fog Color", "Fog Color Register"), ] enumBlendAlpha = [ - ('G_BL_A_IN', 'Color Combiner Alpha', 'Color Combiner Alpha'), - ('G_BL_A_FOG', 'Fog Alpha', 'Fog Color Register Alpha'), - ('G_BL_A_SHADE', 'Shade Alpha', 'Stepped Shade Alpha'), - ('G_BL_0', '0', '0') + ("G_BL_A_IN", "Color Combiner Alpha", "Color Combiner Alpha"), + ("G_BL_A_FOG", "Fog Alpha", "Fog Color Register Alpha"), + ("G_BL_A_SHADE", "Shade Alpha", "Stepped Shade Alpha"), + ("G_BL_0", "0", "0"), ] enumBlendMix = [ - ('G_BL_1MA', '1 - A', '1 - A, where A is selected above'), - ('G_BL_A_MEM', 'Framebuffer Alpha', 'Framebuffer (Memory) Alpha'), - ('G_BL_1', '1', '1'), - ('G_BL_0', '0', '0') + ("G_BL_1MA", "1 - A", "1 - A, where A is selected above"), + ("G_BL_A_MEM", "Framebuffer Alpha", "Framebuffer (Memory) Alpha"), + ("G_BL_1", "1", "1"), + ("G_BL_0", "0", "0"), ] enumRenderModesCycle1 = [ - #('Use Draw Layer', 'Use Draw Layer', 'Use Draw Layer'), - ('G_RM_ZB_OPA_SURF', 'Background', 'G_RM_ZB_OPA_SURF'), - ('G_RM_AA_ZB_OPA_SURF', 'Opaque', 'G_RM_AA_ZB_OPA_SURF'), - ('G_RM_AA_ZB_OPA_DECAL', 'Opaque Decal', 'G_RM_AA_ZB_OPA_DECAL'), - ('G_RM_AA_ZB_OPA_INTER', 'Opaque Intersecting', 'G_RM_AA_ZB_OPA_INTER'), - ('G_RM_AA_ZB_TEX_EDGE', 'Cutout', 'G_RM_AA_ZB_TEX_EDGE'), - ('G_RM_AA_ZB_XLU_SURF', 'Transparent', 'G_RM_AA_ZB_XLU_SURF'), - ('G_RM_AA_ZB_XLU_DECAL', 'Transparent Decal', 'G_RM_AA_ZB_XLU_DECAL'), - ('G_RM_AA_ZB_XLU_INTER', 'Transparent Intersecting', 'G_RM_AA_ZB_XLU_INTER'), - ('G_RM_FOG_SHADE_A', 'Fog Shade', 'G_RM_FOG_SHADE_A'), - ('G_RM_FOG_PRIM_A', 'Fog Primitive', 'G_RM_FOG_PRIM_A'), - ('G_RM_PASS', 'Pass', 'G_RM_PASS'), - ('G_RM_ADD', 'Add', 'G_RM_ADD'), - ('G_RM_NOOP', 'No Op', 'G_RM_NOOP'), - ('G_RM_ZB_OPA_SURF', "Opaque (No AA)", 'G_RM_ZB_OPA_SURF'), - ('G_RM_ZB_OPA_DECAL', "Opaque Decal (No AA)", 'G_RM_ZB_OPA_DECAL'), - ('G_RM_ZB_XLU_SURF', "Transparent (No AA)", 'G_RM_ZB_XLU_SURF'), - ('G_RM_ZB_XLU_DECAL', "Transparent Decal (No AA)", 'G_RM_ZB_XLU_DECAL'), - ('G_RM_OPA_SURF', "Opaque (No AA, No ZBuf)", 'G_RM_OPA_SURF'), - ('G_RM_ZB_CLD_SURF', "Cloud (No AA)", 'G_RM_ZB_CLD_SURF'), + # ('Use Draw Layer', 'Use Draw Layer', 'Use Draw Layer'), + ("G_RM_ZB_OPA_SURF", "Background", "G_RM_ZB_OPA_SURF"), + ("G_RM_AA_ZB_OPA_SURF", "Opaque", "G_RM_AA_ZB_OPA_SURF"), + ("G_RM_AA_ZB_OPA_DECAL", "Opaque Decal", "G_RM_AA_ZB_OPA_DECAL"), + ("G_RM_AA_ZB_OPA_INTER", "Opaque Intersecting", "G_RM_AA_ZB_OPA_INTER"), + ("G_RM_AA_ZB_TEX_EDGE", "Cutout", "G_RM_AA_ZB_TEX_EDGE"), + ("G_RM_AA_ZB_XLU_SURF", "Transparent", "G_RM_AA_ZB_XLU_SURF"), + ("G_RM_AA_ZB_XLU_DECAL", "Transparent Decal", "G_RM_AA_ZB_XLU_DECAL"), + ("G_RM_AA_ZB_XLU_INTER", "Transparent Intersecting", "G_RM_AA_ZB_XLU_INTER"), + ("G_RM_FOG_SHADE_A", "Fog Shade", "G_RM_FOG_SHADE_A"), + ("G_RM_FOG_PRIM_A", "Fog Primitive", "G_RM_FOG_PRIM_A"), + ("G_RM_PASS", "Pass", "G_RM_PASS"), + ("G_RM_ADD", "Add", "G_RM_ADD"), + ("G_RM_NOOP", "No Op", "G_RM_NOOP"), + ("G_RM_ZB_OPA_SURF", "Opaque (No AA)", "G_RM_ZB_OPA_SURF"), + ("G_RM_ZB_OPA_DECAL", "Opaque Decal (No AA)", "G_RM_ZB_OPA_DECAL"), + ("G_RM_ZB_XLU_SURF", "Transparent (No AA)", "G_RM_ZB_XLU_SURF"), + ("G_RM_ZB_XLU_DECAL", "Transparent Decal (No AA)", "G_RM_ZB_XLU_DECAL"), + ("G_RM_OPA_SURF", "Opaque (No AA, No ZBuf)", "G_RM_OPA_SURF"), + ("G_RM_ZB_CLD_SURF", "Cloud (No AA)", "G_RM_ZB_CLD_SURF"), ] enumRenderModesCycle2 = [ - #('Use Draw Layer', 'Use Draw Layer', 'Use Draw Layer'), - ('G_RM_ZB_OPA_SURF2', 'Background', 'G_RM_ZB_OPA_SURF2'), - ('G_RM_AA_ZB_OPA_SURF2', 'Opaque', 'G_RM_AA_ZB_OPA_SURF2'), - ('G_RM_AA_ZB_OPA_DECAL2', 'Opaque Decal', 'G_RM_AA_ZB_OPA_DECAL2'), - ('G_RM_AA_ZB_OPA_INTER2', 'Opaque Intersecting', 'G_RM_AA_ZB_OPA_INTER2'), - ('G_RM_AA_ZB_TEX_EDGE2', 'Cutout', 'G_RM_AA_ZB_TEX_EDGE2'), - ('G_RM_AA_ZB_XLU_SURF2', 'Transparent', 'G_RM_AA_ZB_XLU_SURF2'), - ('G_RM_AA_ZB_XLU_DECAL2', 'Transparent Decal', 'G_RM_AA_ZB_XLU_DECAL2'), - ('G_RM_AA_ZB_XLU_INTER2', 'Transparent Intersecting', 'G_RM_AA_ZB_XLU_INTER2'), - ('G_RM_ADD2', 'Add', 'G_RM_ADD2'), - ('G_RM_NOOP', 'No Op', 'G_RM_NOOP'), - ('G_RM_ZB_OPA_SURF2', "Opaque (No AA)", 'G_RM_ZB_OPA_SURF2'), - ('G_RM_ZB_OPA_DECAL2', "Opaque Decal (No AA)", 'G_RM_ZB_OPA_DECAL2'), - ('G_RM_ZB_XLU_SURF2', "Transparent (No AA)", 'G_RM_ZB_XLU_SURF2'), - ('G_RM_ZB_XLU_DECAL2', "Transparent Decal (No AA)", 'G_RM_ZB_XLU_DECAL2'), - ('G_RM_ZB_CLD_SURF2', "Cloud (No AA)", 'G_RM_ZB_CLD_SURF2'), + # ('Use Draw Layer', 'Use Draw Layer', 'Use Draw Layer'), + ("G_RM_ZB_OPA_SURF2", "Background", "G_RM_ZB_OPA_SURF2"), + ("G_RM_AA_ZB_OPA_SURF2", "Opaque", "G_RM_AA_ZB_OPA_SURF2"), + ("G_RM_AA_ZB_OPA_DECAL2", "Opaque Decal", "G_RM_AA_ZB_OPA_DECAL2"), + ("G_RM_AA_ZB_OPA_INTER2", "Opaque Intersecting", "G_RM_AA_ZB_OPA_INTER2"), + ("G_RM_AA_ZB_TEX_EDGE2", "Cutout", "G_RM_AA_ZB_TEX_EDGE2"), + ("G_RM_AA_ZB_XLU_SURF2", "Transparent", "G_RM_AA_ZB_XLU_SURF2"), + ("G_RM_AA_ZB_XLU_DECAL2", "Transparent Decal", "G_RM_AA_ZB_XLU_DECAL2"), + ("G_RM_AA_ZB_XLU_INTER2", "Transparent Intersecting", "G_RM_AA_ZB_XLU_INTER2"), + ("G_RM_ADD2", "Add", "G_RM_ADD2"), + ("G_RM_NOOP", "No Op", "G_RM_NOOP"), + ("G_RM_ZB_OPA_SURF2", "Opaque (No AA)", "G_RM_ZB_OPA_SURF2"), + ("G_RM_ZB_OPA_DECAL2", "Opaque Decal (No AA)", "G_RM_ZB_OPA_DECAL2"), + ("G_RM_ZB_XLU_SURF2", "Transparent (No AA)", "G_RM_ZB_XLU_SURF2"), + ("G_RM_ZB_XLU_DECAL2", "Transparent Decal (No AA)", "G_RM_ZB_XLU_DECAL2"), + ("G_RM_ZB_CLD_SURF2", "Cloud (No AA)", "G_RM_ZB_CLD_SURF2"), ] enumTexFormat = [ - ('I4','Intensity 4-bit', 'Intensity 4-bit'), - ('I8','Intensity 8-bit', 'Intensity 8-bit'), - ('IA4','Intensity Alpha 4-bit', 'Intensity Alpha 4-bit'), - ('IA8','Intensity Alpha 8-bit', 'Intensity Alpha 8-bit'), - ('IA16','Intensity Alpha 16-bit', 'Intensity Alpha 16-bit'), - ('CI4','Color Index 4-bit', 'Color Index 4-bit'), - ('CI8','Color Index 8-bit', 'Color Index 8-bit'), - ('RGBA16','RGBA 16-bit', 'RGBA 16-bit'), - ('RGBA32','RGBA 32-bit', 'RGBA 32-bit'), - #('YUV16','YUV 16-bit', 'YUV 16-bit'), + ("I4", "Intensity 4-bit", "Intensity 4-bit"), + ("I8", "Intensity 8-bit", "Intensity 8-bit"), + ("IA4", "Intensity Alpha 4-bit", "Intensity Alpha 4-bit"), + ("IA8", "Intensity Alpha 8-bit", "Intensity Alpha 8-bit"), + ("IA16", "Intensity Alpha 16-bit", "Intensity Alpha 16-bit"), + ("CI4", "Color Index 4-bit", "Color Index 4-bit"), + ("CI8", "Color Index 8-bit", "Color Index 8-bit"), + ("RGBA16", "RGBA 16-bit", "RGBA 16-bit"), + ("RGBA32", "RGBA 32-bit", "RGBA 32-bit"), + # ('YUV16','YUV 16-bit', 'YUV 16-bit'), ] enumCIFormat = [ - ('RGBA16','RGBA 16-bit', 'RGBA 16-bit'), - ('IA16','Intensity Alpha 16-bit', 'Intensity Alpha 16-bit'), + ("RGBA16", "RGBA 16-bit", "RGBA 16-bit"), + ("IA16", "Intensity Alpha 16-bit", "Intensity Alpha 16-bit"), ] enumTexUV = [ - ('TEXEL0', 'Texture 0', 'Texture 0'), - ('TEXEL1', 'Texture 1', 'Texture 1'), + ("TEXEL0", "Texture 0", "Texture 0"), + ("TEXEL1", "Texture 1", "Texture 1"), ] texBitSize = { - 'I4' : 4, - 'IA4' : 4, - 'CI4' : 4, - 'I8' : 8, - 'IA8' : 8, - 'CI8' : 8, - 'RGBA16' : 16, - 'IA16' : 16, - 'YUV16' : 16, - 'RGBA32' : 32, + "I4": 4, + "IA4": 4, + "CI4": 4, + "I8": 8, + "IA8": 8, + "CI8": 8, + "RGBA16": 16, + "IA16": 16, + "YUV16": 16, + "RGBA32": 32, } # 512 words * 64 bits / n bitSize maxTexelCount = { - 32 : 1024, - 16 : 2048, - 8 : 4096, - 4 : 8192, + 32: 1024, + 16: 2048, + 8: 4096, + 4: 8192, } enumF3D = [ - #('F3D_GBI', 'Fast3D', "Fast3D"), - #('F3DEX_GBI', 'F3DEX', "F3DEX"), - #('F3DEX_GBI_2', 'F3DEX2', "F3DEX2"), - ('F3D', 'F3D', 'F3D'), - ('F3DEX/LX', 'F3DEX/LX', 'F3DEX/LX'), - ('F3DLX.Rej', 'F3DLX.Rej', 'F3DLX.Rej'), - ('F3DLP.Rej', 'F3DLP.Rej', 'F3DLP.Rej'), - ('F3DEX2/LX2', 'F3DEX2/LX2', 'F3DEX2/LX2'), - ('F3DEX2.Rej/LX2.Rej', 'F3DEX2.Rej/LX2.Rej', 'F3DEX2.Rej/LX2.Rej'), -] \ No newline at end of file + # ('F3D_GBI', 'Fast3D', "Fast3D"), + # ('F3DEX_GBI', 'F3DEX', "F3DEX"), + # ('F3DEX_GBI_2', 'F3DEX2', "F3DEX2"), + ("F3D", "F3D", "F3D"), + ("F3DEX/LX", "F3DEX/LX", "F3DEX/LX"), + ("F3DLX.Rej", "F3DLX.Rej", "F3DLX.Rej"), + ("F3DLP.Rej", "F3DLP.Rej", "F3DLP.Rej"), + ("F3DEX2/LX2", "F3DEX2/LX2", "F3DEX2/LX2"), + ("F3DEX2.Rej/LX2.Rej", "F3DEX2.Rej/LX2.Rej", "F3DEX2.Rej/LX2.Rej"), +] diff --git a/fast64_internal/f3d/f3d_gbi.py b/fast64_internal/f3d/f3d_gbi.py index 0793203ab..feac150d4 100644 --- a/fast64_internal/f3d/f3d_gbi.py +++ b/fast64_internal/f3d/f3d_gbi.py @@ -3,1299 +3,1928 @@ from math import ceil from ..utility import * + class ScrollMethod(enum.Enum): - Vertex = 1 - Tile = 2 - Ignore = 3 + Vertex = 1 + Tile = 2 + Ignore = 3 + class DLFormat(enum.Enum): - Static = 1 - Dynamic = 2 + Static = 1 + Dynamic = 2 + class GfxListTag(enum.Enum): - Geometry = 1 - Material = 2 - MaterialRevert = 3 - Draw = 3 + Geometry = 1 + Material = 2 + MaterialRevert = 3 + Draw = 3 + class GfxMatWriteMethod(enum.Enum): - WriteAll = 1 - WriteDifferingAndRevert = 2 + WriteAll = 1 + WriteDifferingAndRevert = 2 + enumTexScroll = [ - ("None", "None", "None"), - ("Linear", "Linear", "Linear"), - ("Sine", "Sine", "Sine"), - ("Noise", "Noise", "Noise"), + ("None", "None", "None"), + ("Linear", "Linear", "Linear"), + ("Sine", "Sine", "Sine"), + ("Noise", "Noise", "Noise"), ] dlTypeEnum = [ - ('STATIC', "Static", "Static"), - ('MATERIAL', 'Dynamic Material', 'Dynamic Material'), - ('PROCEDURAL', 'Procedural', 'Procedural'), + ("STATIC", "Static", "Static"), + ("MATERIAL", "Dynamic Material", "Dynamic Material"), + ("PROCEDURAL", "Procedural", "Procedural"), ] lightIndex = { - 'LIGHT_1' : 1, - 'LIGHT_2' : 2, - 'LIGHT_3' : 3, - 'LIGHT_4' : 4, - 'LIGHT_5' : 5, - 'LIGHT_6' : 6, - 'LIGHT_7' : 7, - 'LIGHT_8' : 8, + "LIGHT_1": 1, + "LIGHT_2": 2, + "LIGHT_3": 3, + "LIGHT_4": 4, + "LIGHT_5": 5, + "LIGHT_6": 6, + "LIGHT_7": 7, + "LIGHT_8": 8, } # tuple of max buffer size, max load count. vertexBufferSize = { - 'F3D' : (16, 16), - 'F3DEX/LX' : (32, 32), - 'F3DLX.Rej' : (64, 32), - 'F3DLP.Rej' : (80, 32), - 'F3DEX2/LX2' : (32, 32), - 'F3DEX2.Rej/LX2.Rej' : (64, 64), + "F3D": (16, 16), + "F3DEX/LX": (32, 32), + "F3DLX.Rej": (64, 32), + "F3DLP.Rej": (80, 32), + "F3DEX2/LX2": (32, 32), + "F3DEX2.Rej/LX2.Rej": (64, 64), } drawLayerRenderMode = { - 0: ('G_RM_ZB_OPA_SURF', 'G_RM_NOOP2'), - 1: ('G_RM_AA_ZB_OPA_SURF', 'G_RM_NOOP2'), - 2: ('G_RM_AA_ZB_OPA_DECAL', 'G_RM_NOOP2'), - 3: ('G_RM_AA_ZB_OPA_INTER', 'G_RM_NOOP2'), - 4: ('G_RM_AA_ZB_TEX_EDGE', 'G_RM_NOOP2'), - 5: ('G_RM_AA_ZB_XLU_SURF', 'G_RM_NOOP2'), - 6: ('G_RM_AA_ZB_XLU_DECAL', 'G_RM_NOOP2'), - 7: ('G_RM_AA_ZB_XLU_INTER', 'G_RM_NOOP2'), + 0: ("G_RM_ZB_OPA_SURF", "G_RM_NOOP2"), + 1: ("G_RM_AA_ZB_OPA_SURF", "G_RM_NOOP2"), + 2: ("G_RM_AA_ZB_OPA_DECAL", "G_RM_NOOP2"), + 3: ("G_RM_AA_ZB_OPA_INTER", "G_RM_NOOP2"), + 4: ("G_RM_AA_ZB_TEX_EDGE", "G_RM_NOOP2"), + 5: ("G_RM_AA_ZB_XLU_SURF", "G_RM_NOOP2"), + 6: ("G_RM_AA_ZB_XLU_DECAL", "G_RM_NOOP2"), + 7: ("G_RM_AA_ZB_XLU_INTER", "G_RM_NOOP2"), } -class F3D: - def __init__(self, F3D_VER, _HW_VERSION_1): - if F3D_VER == 'F3DEX2.Rej/LX2.Rej' or \ - F3D_VER == 'F3DEX2/LX2': - self.F3DEX_GBI = False - self.F3DEX_GBI_2 = True - self.F3DLP_GBI = False - elif F3D_VER == 'F3DLP.Rej' or F3D_VER == 'F3DLX.Rej' or \ - F3D_VER == 'F3DEX/LX': - self.F3DEX_GBI = True - self.F3DEX_GBI_2 = False - self.F3DLP_GBI = True - elif F3D_VER == 'F3D': - self.F3DEX_GBI = False - self.F3DEX_GBI_2 = False - self.F3DLP_GBI = False - else: - raise PluginError("Invalid F3D version " + F3D_VER + ".") - - self.vert_buffer_size = vertexBufferSize[F3D_VER][0] - self.vert_load_size = vertexBufferSize[F3D_VER][1] - - F3DEX_GBI = self.F3DEX_GBI - F3DEX_GBI_2 = self.F3DEX_GBI_2 - F3DLP_GBI = self.F3DLP_GBI - self._HW_VERSION_1 = _HW_VERSION_1 - self.F3D_VER = F3D_VER - #self._LANGUAGE_ASSEMBLY = _LANGUAGE_ASSEMBLY - - if F3DEX_GBI_2: - self.F3DEX_GBI = True - F3DEX_GBI = True - - self.G_NOOP = 0x00 - self.G_RDPHALF_2 = 0xf1 - self.G_SETOTHERMODE_H = 0xe3 - self.G_SETOTHERMODE_L = 0xe2 - self.G_RDPHALF_1 = 0xe1 - self.G_SPNOOP = 0xe0 - self.G_ENDDL = 0xdf - self.G_DL = 0xde - self.G_LOAD_UCODE = 0xdd - self.G_MOVEMEM = 0xdc - self.G_MOVEWORD = 0xdb - self.G_MTX = 0xda - self.G_GEOMETRYMODE = 0xd9 - self.G_POPMTX = 0xd8 - self.G_TEXTURE = 0xd7 - self.G_DMA_IO = 0xd6 - self.G_SPECIAL_1 = 0xd5 - self.G_SPECIAL_2 = 0xd4 - self.G_SPECIAL_3 = 0xd3 - - self.G_VTX = 0x01 - self.G_MODIFYVTX = 0x02 - self.G_CULLDL = 0x03 - self.G_BRANCH_Z = 0x04 - self.G_TRI1 = 0x05 - self.G_TRI2 = 0x06 - self.G_QUAD = 0x07 - self.G_LINE3D = 0x08 - - else: - # DMA commands - self.G_SPNOOP = 0 # handle 0 gracefully - self.G_MTX = 1 - self.G_RESERVED0 = 2 # not implemeted - self.G_MOVEMEM = 3 # move a block of memory (up to 4 words) to dmem - self.G_VTX = 4 - self.G_RESERVED1 = 5 # not implemeted - self.G_DL = 6 - self.G_RESERVED2 = 7 # not implemeted - self.G_RESERVED3 = 8 # not implemeted - self.G_SPRITE2D_BASE = 9 # sprite command - - # IMMEDIATE commands - self.G_IMMFIRST = -65 - self.G_TRI1 = (self.G_IMMFIRST-0) - self.G_CULLDL = (self.G_IMMFIRST-1) - self.G_POPMTX = (self.G_IMMFIRST-2) - self.G_MOVEWORD = (self.G_IMMFIRST-3) - self.G_TEXTURE = (self.G_IMMFIRST-4) - self.G_SETOTHERMODE_H = (self.G_IMMFIRST-5) - self.G_SETOTHERMODE_L = (self.G_IMMFIRST-6) - self.G_ENDDL = (self.G_IMMFIRST-7) - self.G_SETGEOMETRYMODE = (self.G_IMMFIRST-8) - self.G_CLEARGEOMETRYMODE = (self.G_IMMFIRST-9) - self.G_LINE3D = (self.G_IMMFIRST-10) - self.G_RDPHALF_1 = (self.G_IMMFIRST-11) - self.G_RDPHALF_2 = (self.G_IMMFIRST-12) - if F3DEX_GBI or F3DLP_GBI: - self.G_MODIFYVTX = (self.G_IMMFIRST-13) - self.G_TRI2 = (self.G_IMMFIRST-14) - self.G_BRANCH_Z = (self.G_IMMFIRST-15) - self.G_LOAD_UCODE = (self.G_IMMFIRST-16) - else: - self.G_RDPHALF_CONT = (self.G_IMMFIRST-13) - - # We are overloading 2 of the immediate commands - # to keep the byte alignment of dmem the same - - self.G_SPRITE2D_SCALEFLIP = (self.G_IMMFIRST-1) - self.G_SPRITE2D_DRAW = (self.G_IMMFIRST-2) - - # RDP commands - self.G_NOOP = 0xc0 - - # RDP commands - self.G_SETCIMG = 0xff # -1 - self.G_SETZIMG = 0xfe # -2 - self.G_SETTIMG = 0xfd # -3 - self.G_SETCOMBINE = 0xfc # -4 - self.G_SETENVCOLOR = 0xfb # -5 - self.G_SETPRIMCOLOR = 0xfa # -6 - self.G_SETBLENDCOLOR = 0xf9 # -7 - self.G_SETFOGCOLOR = 0xf8 # -8 - self.G_SETFILLCOLOR = 0xf7 # -9 - self.G_FILLRECT = 0xf6 # -10 - self.G_SETTILE = 0xf5 # -11 - self.G_LOADTILE = 0xf4 # -12 - self.G_LOADBLOCK = 0xf3 # -13 - self.G_SETTILESIZE = 0xf2 # -14 - self.G_LOADTLUT = 0xf0 # -16 - self.G_RDPSETOTHERMODE = 0xef # -17 - self.G_SETPRIMDEPTH = 0xee # -18 - self.G_SETSCISSOR = 0xed # -19 - self.G_SETCONVERT = 0xec # -20 - self.G_SETKEYR = 0xeb # -21 - self.G_SETKEYGB = 0xea # -22 - self.G_RDPFULLSYNC = 0xe9 # -23 - self.G_RDPTILESYNC = 0xe8 # -24 - self.G_RDPPIPESYNC = 0xe7 # -25 - self.G_RDPLOADSYNC = 0xe6 # -26 - self.G_TEXRECTFLIP = 0xe5 # -27 - self.G_TEXRECT = 0xe4 # -28 - - self.G_TRI_FILL = 0xc8 # fill triangle: 11001000 - self.G_TRI_SHADE = 0xcc # shade triangle: 11001100 - self.G_TRI_TXTR = 0xca # texture triangle: 11001010 - self.G_TRI_SHADE_TXTR = 0xce # shade, texture triangle: 11001110 - self.G_TRI_FILL_ZBUFF = 0xc9 # fill, zbuff triangle: 11001001 - self.G_TRI_SHADE_ZBUFF = 0xcd # shade, zbuff triangle: 11001101 - self.G_TRI_TXTR_ZBUFF = 0xcb # texture, zbuff triangle: 11001011 - self.G_TRI_SHADE_TXTR_ZBUFF=0xcf # shade, txtr, zbuff trngl: 11001111 - - # masks to build RDP triangle commands - self.G_RDP_TRI_FILL_MASK = 0x08 - self.G_RDP_TRI_SHADE_MASK = 0x04 - self.G_RDP_TRI_TXTR_MASK = 0x02 - self.G_RDP_TRI_ZBUFF_MASK = 0x01 - - self.BOWTIE_VAL = 0 - - # gets added to RDP command, in order to test for addres fixup - self.G_RDP_ADDR_FIXUP = 3 # |RDP cmds| <= this, do addr fixup - # if _LANGUAGE_ASSEMBLY: - self.G_RDP_TEXRECT_CHECK = ((-1*self.G_TEXRECTFLIP)& 0xff) - #endif - - self.G_DMACMDSIZ = 128 - self.G_IMMCMDSIZ = 64 - self.G_RDPCMDSIZ = 64 - - # Coordinate shift values, number of bits of fraction - self.G_TEXTURE_IMAGE_FRAC = 2 - self.G_TEXTURE_SCALE_FRAC = 16 - self.G_SCALE_FRAC = 8 - self.G_ROTATE_FRAC = 16 - - self.G_MAXFBZ = 0x3fff # 3b exp, 11b mantissa - - # G_MTX: parameter flags - - if F3DEX_GBI_2: - self.G_MTX_MODELVIEW = 0x00 # matrix types - self.G_MTX_PROJECTION = 0x04 - self.G_MTX_MUL = 0x00 # concat or load - self.G_MTX_LOAD = 0x02 - self.G_MTX_NOPUSH = 0x00 # push or not - self.G_MTX_PUSH = 0x01 - else: - self.G_MTX_MODELVIEW = 0x00 # matrix types - self.G_MTX_PROJECTION = 0x01 - self.G_MTX_MUL = 0x00 # concat or load - self.G_MTX_LOAD = 0x02 - self.G_MTX_NOPUSH = 0x00 # push or not - self.G_MTX_PUSH = 0x04 - - self.G_ZBUFFER = 0x00000001 - self.G_SHADE = 0x00000004 # enable Gouraud interp - # rest of low byte reserved for setup ucode - if F3DEX_GBI_2: - self.G_TEXTURE_ENABLE = 0x00000000 # Ignored - self.G_SHADING_SMOOTH = 0x00200000 # flat or smooth shaded - self.G_CULL_FRONT = 0x00000200 - self.G_CULL_BACK = 0x00000400 - self.G_CULL_BOTH = 0x00000600 # To make code cleaner - else: - self.G_TEXTURE_ENABLE = 0x00000002 # Microcode use only - self.G_SHADING_SMOOTH = 0x00000200 # flat or smooth shaded - self.G_CULL_FRONT = 0x00001000 - self.G_CULL_BACK = 0x00002000 - self.G_CULL_BOTH = 0x00003000 # To make code cleaner - self.G_FOG = 0x00010000 - self.G_LIGHTING = 0x00020000 - self.G_TEXTURE_GEN = 0x00040000 - self.G_TEXTURE_GEN_LINEAR = 0x00080000 - self.G_LOD = 0x00100000 # NOT IMPLEMENTED - if F3DEX_GBI or F3DLP_GBI: - self.G_CLIPPING = 0x00800000 - else: - self.G_CLIPPING = 0x00000000 - - #if _LANGUAGE_ASSEMBLY: - self.G_FOG_H = (self.G_FOG/0x10000) - self.G_LIGHTING_H = (self.G_LIGHTING/0x10000) - self.G_TEXTURE_GEN_H = (self.G_TEXTURE_GEN/0x10000) - self.G_TEXTURE_GEN_LINEAR_H = (self.G_TEXTURE_GEN_LINEAR/0x10000) - self.G_LOD_H = (self.G_LOD/0x10000) # NOT IMPLEMENTED - if F3DEX_GBI or F3DLP_GBI: - self.G_CLIPPING_H = (self.G_CLIPPING/0x10000) - #endif - - # Need these defined for Sprite Microcode - # if _LANGUAGE_ASSEMBLY: - self.G_TX_LOADTILE = 7 - self.G_TX_RENDERTILE = 0 - - self.G_TX_NOMIRROR = 0 - self.G_TX_WRAP = 0 - self.G_TX_MIRROR = 0x1 - self.G_TX_CLAMP = 0x2 - self.G_TX_NOMASK = 0 - self.G_TX_NOLOD = 0 - #endif - - self.G_TX_VARS = { - 'G_TX_NOMIRROR' : 0, - 'G_TX_WRAP' : 0, - 'G_TX_MIRROR' : 1, - 'G_TX_CLAMP' : 2, - 'G_TX_NOMASK' : 0, - 'G_TX_NOLOD' : 0, - } - - # G_SETIMG fmt: set image formats - self.G_IM_FMT_RGBA = 0 - self.G_IM_FMT_YUV = 1 - self.G_IM_FMT_CI = 2 - self.G_IM_FMT_IA = 3 - self.G_IM_FMT_I = 4 - - self.G_IM_FMT_VARS = { - '0' : 0, - 'G_IM_FMT_RGBA' : 0, - 'G_IM_FMT_YUV' : 1, - 'G_IM_FMT_CI' : 2, - 'G_IM_FMT_IA' : 3, - 'G_IM_FMT_I' : 4, - } - - # G_SETIMG siz: set image pixel size - self.G_IM_SIZ_4b = 0 - self.G_IM_SIZ_8b = 1 - self.G_IM_SIZ_16b = 2 - self.G_IM_SIZ_32b = 3 - self.G_IM_SIZ_DD = 5 - - self.G_IM_SIZ_4b_BYTES = 0 - self.G_IM_SIZ_4b_TILE_BYTES = self.G_IM_SIZ_4b_BYTES - self.G_IM_SIZ_4b_LINE_BYTES = self.G_IM_SIZ_4b_BYTES - - self.G_IM_SIZ_8b_BYTES = 1 - self.G_IM_SIZ_8b_TILE_BYTES = self.G_IM_SIZ_8b_BYTES - self.G_IM_SIZ_8b_LINE_BYTES = self.G_IM_SIZ_8b_BYTES - - self.G_IM_SIZ_16b_BYTES = 2 - self.G_IM_SIZ_16b_TILE_BYTES = self.G_IM_SIZ_16b_BYTES - self.G_IM_SIZ_16b_LINE_BYTES = self.G_IM_SIZ_16b_BYTES - - self.G_IM_SIZ_32b_BYTES = 4 - self.G_IM_SIZ_32b_TILE_BYTES = 2 - self.G_IM_SIZ_32b_LINE_BYTES = 2 - - self.G_IM_SIZ_4b_LOAD_BLOCK = self.G_IM_SIZ_16b - self.G_IM_SIZ_8b_LOAD_BLOCK = self.G_IM_SIZ_16b - self.G_IM_SIZ_16b_LOAD_BLOCK = self.G_IM_SIZ_16b - self.G_IM_SIZ_32b_LOAD_BLOCK = self.G_IM_SIZ_32b - - self.G_IM_SIZ_4b_SHIFT = 2 - self.G_IM_SIZ_8b_SHIFT = 1 - self.G_IM_SIZ_16b_SHIFT = 0 - self.G_IM_SIZ_32b_SHIFT = 0 - - self.G_IM_SIZ_4b_INCR = 3 - self.G_IM_SIZ_8b_INCR = 1 - self.G_IM_SIZ_16b_INCR = 0 - self.G_IM_SIZ_32b_INCR = 0 - - self.G_IM_SIZ_VARS = { - '0' : 0, - 'G_IM_SIZ_4b' : 0, - 'G_IM_SIZ_8b' : 1, - 'G_IM_SIZ_16b' : 2, - 'G_IM_SIZ_32b' : 3, - 'G_IM_SIZ_DD' : 5, - 'G_IM_SIZ_4b_BYTES' : 0, - 'G_IM_SIZ_4b_TILE_BYTES' : self.G_IM_SIZ_4b_BYTES, - 'G_IM_SIZ_4b_LINE_BYTES' : self.G_IM_SIZ_4b_BYTES, - 'G_IM_SIZ_8b_BYTES' : 1, - 'G_IM_SIZ_8b_TILE_BYTES' : self.G_IM_SIZ_8b_BYTES, - 'G_IM_SIZ_8b_LINE_BYTES' : self.G_IM_SIZ_8b_BYTES, - 'G_IM_SIZ_16b_BYTES' : 2, - 'G_IM_SIZ_16b_TILE_BYTES' : self.G_IM_SIZ_16b_BYTES, - 'G_IM_SIZ_16b_LINE_BYTES' : self.G_IM_SIZ_16b_BYTES, - 'G_IM_SIZ_32b_BYTES' : 4, - 'G_IM_SIZ_32b_TILE_BYTES' : 2, - 'G_IM_SIZ_32b_LINE_BYTES' : 2, - 'G_IM_SIZ_4b_LOAD_BLOCK' : self.G_IM_SIZ_16b, - 'G_IM_SIZ_8b_LOAD_BLOCK' : self.G_IM_SIZ_16b, - 'G_IM_SIZ_16b_LOAD_BLOCK' : self.G_IM_SIZ_16b, - 'G_IM_SIZ_32b_LOAD_BLOCK' : self.G_IM_SIZ_32b, - 'G_IM_SIZ_4b_SHIFT' : 2, - 'G_IM_SIZ_8b_SHIFT' : 1, - 'G_IM_SIZ_16b_SHIFT' : 0, - 'G_IM_SIZ_32b_SHIFT' : 0, - 'G_IM_SIZ_4b_INCR' : 3, - 'G_IM_SIZ_8b_INCR' : 1, - 'G_IM_SIZ_16b_INCR' : 0, - 'G_IM_SIZ_32b_INCR' : 0 - } - - # G_SETCOMBINE: color combine modes - - # Color combiner constants: - self.G_CCMUX_COMBINED = 0 - self.G_CCMUX_TEXEL0 = 1 - self.G_CCMUX_TEXEL1 = 2 - self.G_CCMUX_PRIMITIVE = 3 - self.G_CCMUX_SHADE = 4 - self.G_CCMUX_ENVIRONMENT = 5 - self.G_CCMUX_CENTER = 6 - self.G_CCMUX_SCALE = 6 - self.G_CCMUX_COMBINED_ALPHA = 7 - self.G_CCMUX_TEXEL0_ALPHA = 8 - self.G_CCMUX_TEXEL1_ALPHA = 9 - self.G_CCMUX_PRIMITIVE_ALPHA = 10 - self.G_CCMUX_SHADE_ALPHA = 11 - self.G_CCMUX_ENV_ALPHA = 12 - self.G_CCMUX_LOD_FRACTION = 13 - self.G_CCMUX_PRIM_LOD_FRAC = 14 - self.G_CCMUX_NOISE = 7 - self.G_CCMUX_K4 = 7 - self.G_CCMUX_K5 = 15 - self.G_CCMUX_1 = 6 - self.G_CCMUX_0 = 31 - - self.CCMUXDict = { - 'COMBINED' : 0, - 'TEXEL0' : 1, - 'TEXEL1' : 2, - 'PRIMITIVE' : 3, - 'SHADE' : 4, - 'ENVIRONMENT' : 5, - 'CENTER' : 6, - 'SCALE' : 6, - 'COMBINED_ALPHA' : 7, - 'TEXEL0_ALPHA' : 8, - 'TEXEL1_ALPHA' : 9, - 'PRIMITIVE_ALPHA' : 10, - 'SHADE_ALPHA' : 11, - 'ENV_ALPHA' : 12, - 'LOD_FRACTION' : 13, - 'PRIM_LOD_FRAC' : 14, - 'NOISE' : 7, - 'K4' : 7, - 'K5' : 15, - '1' : 6, - '0' : 31 - } - - self.ACMUXDict = { - 'COMBINED' : 0, - 'TEXEL0' : 1, - 'TEXEL1' : 2, - 'PRIMITIVE' : 3, - 'SHADE' : 4, - 'ENVIRONMENT' : 5, - 'LOD_FRACTION' : 0, - 'PRIM_LOD_FRAC' : 6, - '1' : 6, - '0' : 7, - } - - # Alpha combiner constants: - self.G_ACMUX_COMBINED = 0 - self.G_ACMUX_TEXEL0 = 1 - self.G_ACMUX_TEXEL1 = 2 - self.G_ACMUX_PRIMITIVE = 3 - self.G_ACMUX_SHADE = 4 - self.G_ACMUX_ENVIRONMENT = 5 - self.G_ACMUX_LOD_FRACTION = 0 - self.G_ACMUX_PRIM_LOD_FRAC = 6 - self.G_ACMUX_1 = 6 - self.G_ACMUX_0 = 7 - - # typical CC cycle 1 modes - self.G_CC_PRIMITIVE = '0', '0', '0', 'PRIMITIVE', '0', '0', '0', 'PRIMITIVE' - self.G_CC_SHADE = '0', '0', '0', 'SHADE', '0', '0', '0', 'SHADE' - - self.G_CC_MODULATEI = 'TEXEL0', '0', 'SHADE', '0', '0', '0', '0', 'SHADE' - self.G_CC_MODULATEIDECALA = 'TEXEL0', '0', 'SHADE', '0', '0', '0', '0', 'TEXEL0' - self.G_CC_MODULATEIFADE = 'TEXEL0', '0', 'SHADE', '0', '0', '0', '0', 'ENVIRONMENT' - - self.G_CC_MODULATERGB = self.G_CC_MODULATEI - self.G_CC_MODULATERGBDECALA = self.G_CC_MODULATEIDECALA - self.G_CC_MODULATERGBFADE = self.G_CC_MODULATEIFADE - - self.G_CC_MODULATEIA = 'TEXEL0', '0', 'SHADE', '0', 'TEXEL0', '0', 'SHADE', '0' - self.G_CC_MODULATEIFADEA = 'TEXEL0', '0', 'SHADE', '0', 'TEXEL0', '0', 'ENVIRONMENT', '0' - - self.G_CC_MODULATEFADE = 'TEXEL0', '0', 'SHADE', '0', 'ENVIRONMENT', '0', 'TEXEL0', '0' - - self.G_CC_MODULATERGBA = self.G_CC_MODULATEIA - self.G_CC_MODULATERGBFADEA = self.G_CC_MODULATEIFADEA - - self.G_CC_MODULATEI_PRIM = 'TEXEL0', '0', 'PRIMITIVE', '0', '0', '0', '0', 'PRIMITIVE' - self.G_CC_MODULATEIA_PRIM = 'TEXEL0', '0', 'PRIMITIVE', '0', 'TEXEL0', '0', 'PRIMITIVE', '0' - self.G_CC_MODULATEIDECALA_PRIM = 'TEXEL0', '0', 'PRIMITIVE', '0', '0', '0', '0', 'TEXEL0' - - self.G_CC_MODULATERGB_PRIM = self.G_CC_MODULATEI_PRIM - self.G_CC_MODULATERGBA_PRIM = self.G_CC_MODULATEIA_PRIM - self.G_CC_MODULATERGBDECALA_PRIM = self.G_CC_MODULATEIDECALA_PRIM - - self.G_CC_FADE = 'SHADE', '0', 'ENVIRONMENT', '0', 'SHADE', '0', 'ENVIRONMENT', '0' - self.G_CC_FADEA = 'TEXEL0', '0', 'ENVIRONMENT', '0', 'TEXEL0', '0', 'ENVIRONMENT', '0' - - self.G_CC_DECALRGB = '0', '0', '0', 'TEXEL0', '0', '0', '0', 'SHADE' - self.G_CC_DECALRGBA = '0', '0', '0', 'TEXEL0', '0', '0', '0', 'TEXEL0' - self.G_CC_DECALFADE = '0', '0', '0', 'TEXEL0', '0', '0', '0', 'ENVIRONMENT' - - self.G_CC_DECALFADEA = '0', '0', '0', 'TEXEL0', 'TEXEL0', '0', 'ENVIRONMENT', '0' - - self.G_CC_BLENDI = 'ENVIRONMENT', 'SHADE', 'TEXEL0', 'SHADE', '0', '0', '0', 'SHADE' - self.G_CC_BLENDIA = 'ENVIRONMENT', 'SHADE', 'TEXEL0', 'SHADE', 'TEXEL0', '0', 'SHADE', '0' - self.G_CC_BLENDIDECALA = 'ENVIRONMENT', 'SHADE', 'TEXEL0', 'SHADE', '0', '0', '0', 'TEXEL0' - - self.G_CC_BLENDRGBA = 'TEXEL0', 'SHADE', 'TEXEL0_ALPHA', 'SHADE', '0', '0', '0', 'SHADE' - self.G_CC_BLENDRGBDECALA = 'TEXEL0', 'SHADE', 'TEXEL0_ALPHA', 'SHADE', '0', '0', '0', 'TEXEL0' - self.G_CC_BLENDRGBFADEA = 'TEXEL0', 'SHADE', 'TEXEL0_ALPHA', 'SHADE', '0', '0', '0', 'ENVIRONMENT' - - self.G_CC_ADDRGB = 'TEXEL0', '0', 'TEXEL0', 'SHADE', '0', '0', '0', 'SHADE' - self.G_CC_ADDRGBDECALA = 'TEXEL0', '0', 'TEXEL0', 'SHADE', '0', '0', '0', 'TEXEL0' - self.G_CC_ADDRGBFADE = 'TEXEL0', '0', 'TEXEL0', 'SHADE', '0', '0', '0', 'ENVIRONMENT' - - self.G_CC_REFLECTRGB = 'ENVIRONMENT', '0', 'TEXEL0', 'SHADE', '0', '0', '0', 'SHADE' - self.G_CC_REFLECTRGBDECALA = 'ENVIRONMENT', '0', 'TEXEL0', 'SHADE', '0', '0', '0', 'TEXEL0' - - self.G_CC_HILITERGB = 'PRIMITIVE', 'SHADE', 'TEXEL0', 'SHADE', '0', '0', '0', 'SHADE' - self.G_CC_HILITERGBA = 'PRIMITIVE', 'SHADE', 'TEXEL0', 'SHADE', 'PRIMITIVE', 'SHADE', 'TEXEL0', 'SHADE' - self.G_CC_HILITERGBDECALA = 'PRIMITIVE', 'SHADE', 'TEXEL0', 'SHADE', '0', '0', '0', 'TEXEL0' - - self.G_CC_SHADEDECALA = '0', '0', '0', 'SHADE', '0', '0', '0', 'TEXEL0' - self.G_CC_SHADEFADEA = '0', '0', '0', 'SHADE', '0', '0', '0', 'ENVIRONMENT' - - self.G_CC_BLENDPE = 'PRIMITIVE', 'ENVIRONMENT', 'TEXEL0', 'ENVIRONMENT', 'TEXEL0', '0', 'SHADE', '0' - self.G_CC_BLENDPEDECALA = 'PRIMITIVE', 'ENVIRONMENT', 'TEXEL0', 'ENVIRONMENT', '0', '0', '0', 'TEXEL0' - - # oddball modes - self._G_CC_BLENDPE = 'ENVIRONMENT', 'PRIMITIVE', 'TEXEL0', 'PRIMITIVE', 'TEXEL0', '0', 'SHADE', '0' - self._G_CC_BLENDPEDECALA = 'ENVIRONMENT', 'PRIMITIVE', 'TEXEL0', 'PRIMITIVE', '0', '0', '0', 'TEXEL0' - self._G_CC_TWOCOLORTEX = 'PRIMITIVE', 'SHADE', 'TEXEL0', 'SHADE', '0', '0', '0', 'SHADE' - - # used for 1-cycle sparse mip-maps, primitive color has color of lowest LOD - self._G_CC_SPARSEST = 'PRIMITIVE', 'TEXEL0', 'LOD_FRACTION', 'TEXEL0', 'PRIMITIVE', 'TEXEL0', 'LOD_FRACTION', 'TEXEL0' - self.G_CC_TEMPLERP = 'TEXEL1', 'TEXEL0', 'PRIM_LOD_FRAC', 'TEXEL0', 'TEXEL1', 'TEXEL0', 'PRIM_LOD_FRAC', 'TEXEL0' - - # typical CC cycle 1 modes, usually followed by other cycle 2 modes - self.G_CC_TRILERP = 'TEXEL1', 'TEXEL0', 'LOD_FRACTION', 'TEXEL0', 'TEXEL1', 'TEXEL0', 'LOD_FRACTION', 'TEXEL0' - self.G_CC_INTERFERENCE = 'TEXEL0', '0', 'TEXEL1', '0', 'TEXEL0', '0', 'TEXEL1', '0' - - self.G_CC_1CYUV2RGB = 'TEXEL0', 'K4', 'K5', 'TEXEL0', '0', '0', '0', 'SHADE' - self.G_CC_YUV2RGB = 'TEXEL1', 'K4', 'K5', 'TEXEL1', '0', '0', '0', '0' - - #typical CC cycle 2 modes - self.G_CC_PASS2 = '0', '0', '0', 'COMBINED', '0', '0', '0', 'COMBINED' - self.G_CC_MODULATEI2 = 'COMBINED', '0', 'SHADE', '0', '0', '0', '0', 'SHADE' - self.G_CC_MODULATEIA2 = 'COMBINED', '0', 'SHADE', '0', 'COMBINED', '0', 'SHADE', '0' - self.G_CC_MODULATERGB2 = self.G_CC_MODULATEI2 - self.G_CC_MODULATERGBA2 = self.G_CC_MODULATEIA2 - self.G_CC_MODULATEI_PRIM2 = 'COMBINED', '0', 'PRIMITIVE', '0', '0', '0', '0', 'PRIMITIVE' - self.G_CC_MODULATEIA_PRIM2 = 'COMBINED', '0', 'PRIMITIVE', '0', 'COMBINED', '0', 'PRIMITIVE', '0' - self.G_CC_MODULATERGB_PRIM2 = self.G_CC_MODULATEI_PRIM2 - self.G_CC_MODULATERGBA_PRIM2 = self.G_CC_MODULATEIA_PRIM2 - self.G_CC_DECALRGB2 = '0', '0', '0', 'COMBINED', '0', '0', '0', 'SHADE' - - self.G_CC_DECALRGBA2 = 'COMBINED', 'SHADE', 'COMBINED_ALPHA', 'SHADE', '0', '0', '0', 'SHADE' - self.G_CC_BLENDI2 = 'ENVIRONMENT', 'SHADE', 'COMBINED', 'SHADE', '0', '0', '0', 'SHADE' - self.G_CC_BLENDIA2 = 'ENVIRONMENT', 'SHADE', 'COMBINED', 'SHADE', 'COMBINED', '0', 'SHADE', '0' - self.G_CC_CHROMA_KEY2 = 'TEXEL0', 'CENTER', 'SCALE', '0', '0', '0', '0', '0' - self.G_CC_HILITERGB2 = 'ENVIRONMENT', 'COMBINED', 'TEXEL0', 'COMBINED', '0', '0', '0', 'SHADE' - self.G_CC_HILITERGBA2 = 'ENVIRONMENT', 'COMBINED', 'TEXEL0', 'COMBINED', 'ENVIRONMENT', 'COMBINED', 'TEXEL0', 'COMBINED' - self.G_CC_HILITERGBDECALA2 = 'ENVIRONMENT', 'COMBINED', 'TEXEL0', 'COMBINED', '0', '0', '0', 'TEXEL0' - self.G_CC_HILITERGBPASSA2 = 'ENVIRONMENT', 'COMBINED', 'TEXEL0', 'COMBINED', '0', '0', '0', 'COMBINED' - - # G_SETOTHERMODE_L sft: shift count - - self.G_MDSFT_ALPHACOMPARE = G_MDSFT_ALPHACOMPARE = 0 - self.G_MDSFT_ZSRCSEL = G_MDSFT_ZSRCSEL = 2 - self.G_MDSFT_RENDERMODE = G_MDSFT_RENDERMODE = 3 - self.G_MDSFT_BLENDER = G_MDSFT_BLENDER = 16 - - - # G_SETOTHERMODE_H sft: shift count - - self.G_MDSFT_BLENDMASK = G_MDSFT_BLENDMASK = 0 # unsupported - self.G_MDSFT_ALPHADITHER = G_MDSFT_ALPHADITHER = 4 - self.G_MDSFT_RGBDITHER = G_MDSFT_RGBDITHER = 6 - - self.G_MDSFT_COMBKEY = G_MDSFT_COMBKEY = 8 - self.G_MDSFT_TEXTCONV = G_MDSFT_TEXTCONV = 9 - self.G_MDSFT_TEXTFILT = G_MDSFT_TEXTFILT = 12 - self.G_MDSFT_TEXTLUT = G_MDSFT_TEXTLUT = 14 - self.G_MDSFT_TEXTLOD = G_MDSFT_TEXTLOD = 16 - self.G_MDSFT_TEXTDETAIL = G_MDSFT_TEXTDETAIL = 17 - self.G_MDSFT_TEXTPERSP = G_MDSFT_TEXTPERSP = 19 - self.G_MDSFT_CYCLETYPE = G_MDSFT_CYCLETYPE = 20 - self.G_MDSFT_COLORDITHER = G_MDSFT_COLORDITHER = 22 # unsupported in HW 2.0 - self.G_MDSFT_PIPELINE = G_MDSFT_PIPELINE = 23 - - # G_SETOTHERMODE_H gPipelineMode - self.G_PM_1PRIMITIVE = (1 << G_MDSFT_PIPELINE) - self.G_PM_NPRIMITIVE = (0 << G_MDSFT_PIPELINE) - - # G_SETOTHERMODE_H gSetCycleType - self.G_CYC_1CYCLE = (0 << G_MDSFT_CYCLETYPE) - self.G_CYC_2CYCLE = (1 << G_MDSFT_CYCLETYPE) - self.G_CYC_COPY = (2 << G_MDSFT_CYCLETYPE) - self.G_CYC_FILL = (3 << G_MDSFT_CYCLETYPE) - - # G_SETOTHERMODE_H gSetTexturePersp - self.G_TP_NONE = (0 << G_MDSFT_TEXTPERSP) - self.G_TP_PERSP = (1 << G_MDSFT_TEXTPERSP) - - # G_SETOTHERMODE_H gSetTextureDetail - self.G_TD_CLAMP = (0 << G_MDSFT_TEXTDETAIL) - self.G_TD_SHARPEN = (1 << G_MDSFT_TEXTDETAIL) - self.G_TD_DETAIL = (2 << G_MDSFT_TEXTDETAIL) - - # G_SETOTHERMODE_H gSetTextureLOD - self.G_TL_TILE = (0 << G_MDSFT_TEXTLOD) - self.G_TL_LOD = (1 << G_MDSFT_TEXTLOD) - - # G_SETOTHERMODE_H gSetTextureLUT - self.G_TT_NONE = (0 << G_MDSFT_TEXTLUT) - self.G_TT_RGBA16 = (2 << G_MDSFT_TEXTLUT) - self.G_TT_IA16 = (3 << G_MDSFT_TEXTLUT) - - # G_SETOTHERMODE_H gSetTextureFilter - self.G_TF_POINT = (0 << G_MDSFT_TEXTFILT) - self.G_TF_AVERAGE = (3 << G_MDSFT_TEXTFILT) - self.G_TF_BILERP = (2 << G_MDSFT_TEXTFILT) - - # G_SETOTHERMODE_H gSetTextureConvert - self.G_TC_CONV = (0 << G_MDSFT_TEXTCONV) - self.G_TC_FILTCONV = (5 << G_MDSFT_TEXTCONV) - self.G_TC_FILT = (6 << G_MDSFT_TEXTCONV) - - # G_SETOTHERMODE_H gSetCombineKey - self.G_CK_NONE = (0 << G_MDSFT_COMBKEY) - self.G_CK_KEY = (1 << G_MDSFT_COMBKEY) - - # G_SETOTHERMODE_H gSetColorDither - self.G_CD_MAGICSQ = (0 << G_MDSFT_RGBDITHER) - self.G_CD_BAYER = (1 << G_MDSFT_RGBDITHER) - self.G_CD_NOISE = (2 << G_MDSFT_RGBDITHER) - - if not _HW_VERSION_1: - self.G_CD_DISABLE = (3 << G_MDSFT_RGBDITHER) - self.G_CD_ENABLE = self.G_CD_NOISE # HW 1.0 compatibility mode - else: - self.G_CD_ENABLE = (1 << G_MDSFT_COLORDITHER) - self.G_CD_DISABLE = (0 << G_MDSFT_COLORDITHER) - - # G_SETOTHERMODE_H gSetAlphaDither - self.G_AD_PATTERN = (0 << G_MDSFT_ALPHADITHER) - self.G_AD_NOTPATTERN = (1 << G_MDSFT_ALPHADITHER) - self.G_AD_NOISE = (2 << G_MDSFT_ALPHADITHER) - self.G_AD_DISABLE = (3 << G_MDSFT_ALPHADITHER) - - # G_SETOTHERMODE_L gSetAlphaCompare - self.G_AC_NONE = (0 << G_MDSFT_ALPHACOMPARE) - self.G_AC_THRESHOLD = (1 << G_MDSFT_ALPHACOMPARE) - self.G_AC_DITHER = (3 << G_MDSFT_ALPHACOMPARE) - - # G_SETOTHERMODE_L gSetDepthSource - self.G_ZS_PIXEL = (0 << G_MDSFT_ZSRCSEL) - self.G_ZS_PRIM = (1 << G_MDSFT_ZSRCSEL) - - # G_SETOTHERMODE_L gSetRenderMode - self.AA_EN = AA_EN = 0x8 - self.Z_CMP = Z_CMP = 0x10 - self.Z_UPD = Z_UPD = 0x20 - self.IM_RD = IM_RD = 0x40 - self.CLR_ON_CVG = CLR_ON_CVG = 0x80 - self.CVG_DST_CLAMP = CVG_DST_CLAMP = 0 - self.CVG_DST_WRAP = CVG_DST_WRAP = 0x100 - self.CVG_DST_FULL = CVG_DST_FULL = 0x200 - self.CVG_DST_SAVE = CVG_DST_SAVE = 0x300 - self.ZMODE_OPA = ZMODE_OPA = 0 - self.ZMODE_INTER = ZMODE_INTER = 0x400 - self.ZMODE_XLU = ZMODE_XLU = 0x800 - self.ZMODE_DEC = ZMODE_DEC = 0xc00 - self.CVG_X_ALPHA = CVG_X_ALPHA = 0x1000 - self.ALPHA_CVG_SEL = ALPHA_CVG_SEL = 0x2000 - self.FORCE_BL = FORCE_BL = 0x4000 - self.TEX_EDGE = TEX_EDGE = 0x0000 # used to be 0x8000 - - self.G_BL_CLR_IN = G_BL_CLR_IN = 0 - self.G_BL_CLR_MEM = G_BL_CLR_MEM = 1 - self.G_BL_CLR_BL = G_BL_CLR_BL = 2 - self.G_BL_CLR_FOG = G_BL_CLR_FOG = 3 - self.G_BL_1MA = G_BL_1MA = 0 - self.G_BL_A_MEM = G_BL_A_MEM = 1 - self.G_BL_A_IN = G_BL_A_IN = 0 - self.G_BL_A_FOG = G_BL_A_FOG = 1 - self.G_BL_A_SHADE = G_BL_A_SHADE = 2 - self.G_BL_1 = G_BL_1 = 2 - self.G_BL_0 = G_BL_0 = 3 - - self.cvgDstDict = { - CVG_DST_CLAMP : "CVG_DST_CLAMP", - CVG_DST_WRAP : "CVG_DST_WRAP", - CVG_DST_FULL : "CVG_DST_FULL", - CVG_DST_SAVE : "CVG_DST_SAVE", - } - - self.zmodeDict = { - ZMODE_OPA : "ZMODE_OPA", - ZMODE_INTER : "ZMODE_INTER", - ZMODE_XLU : "ZMODE_XLU", - ZMODE_DEC : "ZMODE_DEC", - } - - self.blendColorDict = { - G_BL_CLR_IN : "G_BL_CLR_IN", - G_BL_CLR_MEM : "G_BL_CLR_MEM", - G_BL_CLR_BL : "G_BL_CLR_BL", - G_BL_CLR_FOG : "G_BL_CLR_FOG", - } - - self.blendAlphaDict = { - G_BL_A_IN : 'G_BL_A_IN', - G_BL_A_FOG : 'G_BL_A_FOG', - G_BL_A_SHADE : 'G_BL_A_SHADE', - G_BL_0 : 'G_BL_0', - } - - self.blendMixDict = { - G_BL_1MA : 'G_BL_1MA', - G_BL_A_MEM : 'G_BL_A_MEM', - G_BL_1 : 'G_BL_1', - G_BL_0 : 'G_BL_0', - } - - def GBL_c1(m1a, m1b, m2a, m2b): - return (m1a) << 30 | (m1b) << 26 | (m2a) << 22 | (m2b) << 18 - def GBL_c2(m1a, m1b, m2a, m2b): - return (m1a) << 28 | (m1b) << 24 | (m2a) << 20 | (m2b) << 16 - - def RM_AA_ZB_OPA_SURF(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ - ZMODE_OPA | ALPHA_CVG_SEL | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) - - def RM_RA_ZB_OPA_SURF(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | \ - ZMODE_OPA | ALPHA_CVG_SEL | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) - - def RM_AA_ZB_XLU_SURF(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \ - FORCE_BL | ZMODE_XLU | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - def RM_AA_ZB_OPA_DECAL(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | ALPHA_CVG_SEL | \ - ZMODE_DEC | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) - - def RM_RA_ZB_OPA_DECAL(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | Z_CMP | CVG_DST_WRAP | ALPHA_CVG_SEL | \ - ZMODE_DEC | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) - - def RM_AA_ZB_XLU_DECAL(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \ - FORCE_BL | ZMODE_DEC | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - def RM_AA_ZB_OPA_INTER(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ - ALPHA_CVG_SEL | ZMODE_INTER | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) - - def RM_RA_ZB_OPA_INTER(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | \ - ALPHA_CVG_SEL | ZMODE_INTER | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) - - def RM_AA_ZB_XLU_INTER(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \ - FORCE_BL | ZMODE_INTER | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - def RM_AA_ZB_XLU_LINE(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | Z_CMP | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | \ - ALPHA_CVG_SEL | FORCE_BL | ZMODE_XLU | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - def RM_AA_ZB_DEC_LINE(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | Z_CMP | IM_RD | CVG_DST_SAVE | CVG_X_ALPHA | \ - ALPHA_CVG_SEL | FORCE_BL | ZMODE_DEC | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - def RM_AA_ZB_TEX_EDGE(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ - CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) - - def RM_AA_ZB_TEX_INTER(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ - CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_INTER | TEX_EDGE | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) - - def RM_AA_ZB_SUB_SURF(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | \ - ZMODE_OPA | ALPHA_CVG_SEL | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) - - def RM_AA_ZB_PCL_SURF(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ - ZMODE_OPA | self.G_AC_DITHER | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - def RM_AA_ZB_OPA_TERR(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ - ZMODE_OPA | ALPHA_CVG_SEL | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - def RM_AA_ZB_TEX_TERR(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ - CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - def RM_AA_ZB_SUB_TERR(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | \ - ZMODE_OPA | ALPHA_CVG_SEL | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - - def RM_AA_OPA_SURF(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | IM_RD | CVG_DST_CLAMP | \ - ZMODE_OPA | ALPHA_CVG_SEL | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) - - def RM_RA_OPA_SURF(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | CVG_DST_CLAMP | \ - ZMODE_OPA | ALPHA_CVG_SEL | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) - - def RM_AA_XLU_SURF(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | \ - ZMODE_OPA | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - def RM_AA_XLU_LINE(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | \ - ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - def RM_AA_DEC_LINE(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | IM_RD | CVG_DST_FULL | CVG_X_ALPHA | \ - ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - def RM_AA_TEX_EDGE(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | IM_RD | CVG_DST_CLAMP | \ - CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) - - def RM_AA_SUB_SURF(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | IM_RD | CVG_DST_FULL | \ - ZMODE_OPA | ALPHA_CVG_SEL | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) - - def RM_AA_PCL_SURF(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | IM_RD | CVG_DST_CLAMP | \ - ZMODE_OPA | self.G_AC_DITHER | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - def RM_AA_OPA_TERR(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | IM_RD | CVG_DST_CLAMP | \ - ZMODE_OPA | ALPHA_CVG_SEL | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - def RM_AA_TEX_TERR(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | IM_RD | CVG_DST_CLAMP | \ - CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - def RM_AA_SUB_TERR(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return AA_EN | IM_RD | CVG_DST_FULL | \ - ZMODE_OPA | ALPHA_CVG_SEL | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - - def RM_ZB_OPA_SURF(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return Z_CMP | Z_UPD | CVG_DST_FULL | ALPHA_CVG_SEL | \ - ZMODE_OPA | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) - - def RM_ZB_XLU_SURF(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return Z_CMP | IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_XLU | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - def RM_ZB_OPA_DECAL(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return Z_CMP | CVG_DST_FULL | ALPHA_CVG_SEL | ZMODE_DEC | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) - - def RM_ZB_XLU_DECAL(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return Z_CMP | IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_DEC | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - def RM_ZB_CLD_SURF(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return Z_CMP | IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_XLU | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - def RM_ZB_OVL_SURF(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return Z_CMP | IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_DEC | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - def RM_ZB_PCL_SURF(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | \ - self.G_AC_DITHER | \ - func(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) - - - def RM_OPA_SURF(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return CVG_DST_CLAMP | FORCE_BL | ZMODE_OPA | \ - func(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) - - def RM_XLU_SURF(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_OPA | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - def RM_TEX_EDGE(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL |\ - ZMODE_OPA | TEX_EDGE | AA_EN | \ - func(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) - - def RM_CLD_SURF(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_OPA | \ - func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) - - def RM_PCL_SURF(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return CVG_DST_FULL | FORCE_BL | ZMODE_OPA | \ - self.G_AC_DITHER | \ - func(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) - - def RM_ADD(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_OPA | \ - func(G_BL_CLR_IN, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_1) - - def RM_NOOP(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return func(0, 0, 0, 0) - - def RM_VISCVG(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return IM_RD | FORCE_BL | \ - func(G_BL_CLR_IN, G_BL_0, G_BL_CLR_BL, G_BL_A_MEM) - - # for rendering to an 8-bit framebuffer - def RM_OPA_CI(clk): - func = GBL_c1 if clk == 1 else GBL_c2 - return CVG_DST_CLAMP | ZMODE_OPA | \ - func(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) - - self.G_RM_AA_ZB_OPA_SURF = RM_AA_ZB_OPA_SURF(1) - self.G_RM_AA_ZB_OPA_SURF2 = RM_AA_ZB_OPA_SURF(2) - self.G_RM_AA_ZB_XLU_SURF = RM_AA_ZB_XLU_SURF(1) - self.G_RM_AA_ZB_XLU_SURF2 = RM_AA_ZB_XLU_SURF(2) - self.G_RM_AA_ZB_OPA_DECAL = RM_AA_ZB_OPA_DECAL(1) - self.G_RM_AA_ZB_OPA_DECAL2 = RM_AA_ZB_OPA_DECAL(2) - self.G_RM_AA_ZB_XLU_DECAL = RM_AA_ZB_XLU_DECAL(1) - self.G_RM_AA_ZB_XLU_DECAL2 = RM_AA_ZB_XLU_DECAL(2) - self.G_RM_AA_ZB_OPA_INTER = RM_AA_ZB_OPA_INTER(1) - self.G_RM_AA_ZB_OPA_INTER2 = RM_AA_ZB_OPA_INTER(2) - self.G_RM_AA_ZB_XLU_INTER = RM_AA_ZB_XLU_INTER(1) - self.G_RM_AA_ZB_XLU_INTER2 = RM_AA_ZB_XLU_INTER(2) - self.G_RM_AA_ZB_XLU_LINE = RM_AA_ZB_XLU_LINE(1) - self.G_RM_AA_ZB_XLU_LINE2 = RM_AA_ZB_XLU_LINE(2) - self.G_RM_AA_ZB_DEC_LINE = RM_AA_ZB_DEC_LINE(1) - self.G_RM_AA_ZB_DEC_LINE2 = RM_AA_ZB_DEC_LINE(2) - self.G_RM_AA_ZB_TEX_EDGE = RM_AA_ZB_TEX_EDGE(1) - self.G_RM_AA_ZB_TEX_EDGE2 = RM_AA_ZB_TEX_EDGE(2) - self.G_RM_AA_ZB_TEX_INTER = RM_AA_ZB_TEX_INTER(1) - self.G_RM_AA_ZB_TEX_INTER2 = RM_AA_ZB_TEX_INTER(2) - self.G_RM_AA_ZB_SUB_SURF = RM_AA_ZB_SUB_SURF(1) - self.G_RM_AA_ZB_SUB_SURF2 = RM_AA_ZB_SUB_SURF(2) - self.G_RM_AA_ZB_PCL_SURF = RM_AA_ZB_PCL_SURF(1) - self.G_RM_AA_ZB_PCL_SURF2 = RM_AA_ZB_PCL_SURF(2) - self.G_RM_AA_ZB_OPA_TERR = RM_AA_ZB_OPA_TERR(1) - self.G_RM_AA_ZB_OPA_TERR2 = RM_AA_ZB_OPA_TERR(2) - self.G_RM_AA_ZB_TEX_TERR = RM_AA_ZB_TEX_TERR(1) - self.G_RM_AA_ZB_TEX_TERR2 = RM_AA_ZB_TEX_TERR(2) - self.G_RM_AA_ZB_SUB_TERR = RM_AA_ZB_SUB_TERR(1) - self.G_RM_AA_ZB_SUB_TERR2 = RM_AA_ZB_SUB_TERR(2) - - self.G_RM_RA_ZB_OPA_SURF = RM_RA_ZB_OPA_SURF(1) - self.G_RM_RA_ZB_OPA_SURF2 = RM_RA_ZB_OPA_SURF(2) - self.G_RM_RA_ZB_OPA_DECAL = RM_RA_ZB_OPA_DECAL(1) - self.G_RM_RA_ZB_OPA_DECAL2 = RM_RA_ZB_OPA_DECAL(2) - self.G_RM_RA_ZB_OPA_INTER = RM_RA_ZB_OPA_INTER(1) - self.G_RM_RA_ZB_OPA_INTER2 = RM_RA_ZB_OPA_INTER(2) - - self.G_RM_AA_OPA_SURF = RM_AA_OPA_SURF(1) - self.G_RM_AA_OPA_SURF2 = RM_AA_OPA_SURF(2) - self.G_RM_AA_XLU_SURF = RM_AA_XLU_SURF(1) - self.G_RM_AA_XLU_SURF2 = RM_AA_XLU_SURF(2) - self.G_RM_AA_XLU_LINE = RM_AA_XLU_LINE(1) - self.G_RM_AA_XLU_LINE2 = RM_AA_XLU_LINE(2) - self.G_RM_AA_DEC_LINE = RM_AA_DEC_LINE(1) - self.G_RM_AA_DEC_LINE2 = RM_AA_DEC_LINE(2) - self.G_RM_AA_TEX_EDGE = RM_AA_TEX_EDGE(1) - self.G_RM_AA_TEX_EDGE2 = RM_AA_TEX_EDGE(2) - self.G_RM_AA_SUB_SURF = RM_AA_SUB_SURF(1) - self.G_RM_AA_SUB_SURF2 = RM_AA_SUB_SURF(2) - self.G_RM_AA_PCL_SURF = RM_AA_PCL_SURF(1) - self.G_RM_AA_PCL_SURF2 = RM_AA_PCL_SURF(2) - self.G_RM_AA_OPA_TERR = RM_AA_OPA_TERR(1) - self.G_RM_AA_OPA_TERR2 = RM_AA_OPA_TERR(2) - self.G_RM_AA_TEX_TERR = RM_AA_TEX_TERR(1) - self.G_RM_AA_TEX_TERR2 = RM_AA_TEX_TERR(2) - self.G_RM_AA_SUB_TERR = RM_AA_SUB_TERR(1) - self.G_RM_AA_SUB_TERR2 = RM_AA_SUB_TERR(2) - - self.G_RM_RA_OPA_SURF = RM_RA_OPA_SURF(1) - self.G_RM_RA_OPA_SURF2 = RM_RA_OPA_SURF(2) - - self.G_RM_ZB_OPA_SURF = RM_ZB_OPA_SURF(1) - self.G_RM_ZB_OPA_SURF2 = RM_ZB_OPA_SURF(2) - self.G_RM_ZB_XLU_SURF = RM_ZB_XLU_SURF(1) - self.G_RM_ZB_XLU_SURF2 = RM_ZB_XLU_SURF(2) - self.G_RM_ZB_OPA_DECAL = RM_ZB_OPA_DECAL(1) - self.G_RM_ZB_OPA_DECAL2 = RM_ZB_OPA_DECAL(2) - self.G_RM_ZB_XLU_DECAL = RM_ZB_XLU_DECAL(1) - self.G_RM_ZB_XLU_DECAL2 = RM_ZB_XLU_DECAL(2) - self.G_RM_ZB_CLD_SURF = RM_ZB_CLD_SURF(1) - self.G_RM_ZB_CLD_SURF2 = RM_ZB_CLD_SURF(2) - self.G_RM_ZB_OVL_SURF = RM_ZB_OVL_SURF(1) - self.G_RM_ZB_OVL_SURF2 = RM_ZB_OVL_SURF(2) - self.G_RM_ZB_PCL_SURF = RM_ZB_PCL_SURF(1) - self.G_RM_ZB_PCL_SURF2 = RM_ZB_PCL_SURF(2) - - self.G_RM_OPA_SURF = RM_OPA_SURF(1) - self.G_RM_OPA_SURF2 = RM_OPA_SURF(2) - self.G_RM_XLU_SURF = RM_XLU_SURF(1) - self.G_RM_XLU_SURF2 = RM_XLU_SURF(2) - self.G_RM_CLD_SURF = RM_CLD_SURF(1) - self.G_RM_CLD_SURF2 = RM_CLD_SURF(2) - self.G_RM_TEX_EDGE = RM_TEX_EDGE(1) - self.G_RM_TEX_EDGE2 = RM_TEX_EDGE(2) - self.G_RM_PCL_SURF = RM_PCL_SURF(1) - self.G_RM_PCL_SURF2 = RM_PCL_SURF(2) - self.G_RM_ADD = RM_ADD(1) - self.G_RM_ADD2 = RM_ADD(2) - self.G_RM_NOOP = RM_NOOP(1) - self.G_RM_NOOP2 = RM_NOOP(2) - self.G_RM_VISCVG = RM_VISCVG(1) - self.G_RM_VISCVG2 = RM_VISCVG(2) - self.G_RM_OPA_CI = RM_OPA_CI(1) - self.G_RM_OPA_CI2 = RM_OPA_CI(2) - - - self.G_RM_FOG_SHADE_A = GBL_c1(G_BL_CLR_FOG, G_BL_A_SHADE, G_BL_CLR_IN, G_BL_1MA) - self.G_RM_FOG_PRIM_A = GBL_c1(G_BL_CLR_FOG, G_BL_A_FOG, G_BL_CLR_IN, G_BL_1MA) - self.G_RM_PASS = GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) - - - # G_SETCONVERT: K0-5 - - self.G_CV_K0 = 175 - self.G_CV_K1 = -43 - self.G_CV_K2 = -89 - self.G_CV_K3 = 222 - self.G_CV_K4 = 114 - self.G_CV_K5 = 42 - - - # G_SETSCISSOR: interlace mode - - self.G_SC_NON_INTERLACE = 0 - self.G_SC_ODD_INTERLACE = 3 - self.G_SC_EVEN_INTERLACE = 2 - - # flags to inhibit pushing of the display list (on branch) - self.G_DL_PUSH = 0x00 - self.G_DL_NOPUSH = 0x01 - - # Some structs here - - self.G_MAXZ = 0x03ff # 10 bits of integer screen-Z precision - - # more structs here - - ''' +class F3D: + def __init__(self, F3D_VER, _HW_VERSION_1): + if F3D_VER == "F3DEX2.Rej/LX2.Rej" or F3D_VER == "F3DEX2/LX2": + self.F3DEX_GBI = False + self.F3DEX_GBI_2 = True + self.F3DLP_GBI = False + elif F3D_VER == "F3DLP.Rej" or F3D_VER == "F3DLX.Rej" or F3D_VER == "F3DEX/LX": + self.F3DEX_GBI = True + self.F3DEX_GBI_2 = False + self.F3DLP_GBI = True + elif F3D_VER == "F3D": + self.F3DEX_GBI = False + self.F3DEX_GBI_2 = False + self.F3DLP_GBI = False + else: + raise PluginError("Invalid F3D version " + F3D_VER + ".") + + self.vert_buffer_size = vertexBufferSize[F3D_VER][0] + self.vert_load_size = vertexBufferSize[F3D_VER][1] + + F3DEX_GBI = self.F3DEX_GBI + F3DEX_GBI_2 = self.F3DEX_GBI_2 + F3DLP_GBI = self.F3DLP_GBI + self._HW_VERSION_1 = _HW_VERSION_1 + self.F3D_VER = F3D_VER + # self._LANGUAGE_ASSEMBLY = _LANGUAGE_ASSEMBLY + + if F3DEX_GBI_2: + self.F3DEX_GBI = True + F3DEX_GBI = True + + self.G_NOOP = 0x00 + self.G_RDPHALF_2 = 0xF1 + self.G_SETOTHERMODE_H = 0xE3 + self.G_SETOTHERMODE_L = 0xE2 + self.G_RDPHALF_1 = 0xE1 + self.G_SPNOOP = 0xE0 + self.G_ENDDL = 0xDF + self.G_DL = 0xDE + self.G_LOAD_UCODE = 0xDD + self.G_MOVEMEM = 0xDC + self.G_MOVEWORD = 0xDB + self.G_MTX = 0xDA + self.G_GEOMETRYMODE = 0xD9 + self.G_POPMTX = 0xD8 + self.G_TEXTURE = 0xD7 + self.G_DMA_IO = 0xD6 + self.G_SPECIAL_1 = 0xD5 + self.G_SPECIAL_2 = 0xD4 + self.G_SPECIAL_3 = 0xD3 + + self.G_VTX = 0x01 + self.G_MODIFYVTX = 0x02 + self.G_CULLDL = 0x03 + self.G_BRANCH_Z = 0x04 + self.G_TRI1 = 0x05 + self.G_TRI2 = 0x06 + self.G_QUAD = 0x07 + self.G_LINE3D = 0x08 + + else: + # DMA commands + self.G_SPNOOP = 0 # handle 0 gracefully + self.G_MTX = 1 + self.G_RESERVED0 = 2 # not implemeted + self.G_MOVEMEM = 3 # move a block of memory (up to 4 words) to dmem + self.G_VTX = 4 + self.G_RESERVED1 = 5 # not implemeted + self.G_DL = 6 + self.G_RESERVED2 = 7 # not implemeted + self.G_RESERVED3 = 8 # not implemeted + self.G_SPRITE2D_BASE = 9 # sprite command + + # IMMEDIATE commands + self.G_IMMFIRST = -65 + self.G_TRI1 = self.G_IMMFIRST - 0 + self.G_CULLDL = self.G_IMMFIRST - 1 + self.G_POPMTX = self.G_IMMFIRST - 2 + self.G_MOVEWORD = self.G_IMMFIRST - 3 + self.G_TEXTURE = self.G_IMMFIRST - 4 + self.G_SETOTHERMODE_H = self.G_IMMFIRST - 5 + self.G_SETOTHERMODE_L = self.G_IMMFIRST - 6 + self.G_ENDDL = self.G_IMMFIRST - 7 + self.G_SETGEOMETRYMODE = self.G_IMMFIRST - 8 + self.G_CLEARGEOMETRYMODE = self.G_IMMFIRST - 9 + self.G_LINE3D = self.G_IMMFIRST - 10 + self.G_RDPHALF_1 = self.G_IMMFIRST - 11 + self.G_RDPHALF_2 = self.G_IMMFIRST - 12 + if F3DEX_GBI or F3DLP_GBI: + self.G_MODIFYVTX = self.G_IMMFIRST - 13 + self.G_TRI2 = self.G_IMMFIRST - 14 + self.G_BRANCH_Z = self.G_IMMFIRST - 15 + self.G_LOAD_UCODE = self.G_IMMFIRST - 16 + else: + self.G_RDPHALF_CONT = self.G_IMMFIRST - 13 + + # We are overloading 2 of the immediate commands + # to keep the byte alignment of dmem the same + + self.G_SPRITE2D_SCALEFLIP = self.G_IMMFIRST - 1 + self.G_SPRITE2D_DRAW = self.G_IMMFIRST - 2 + + # RDP commands + self.G_NOOP = 0xC0 + + # RDP commands + self.G_SETCIMG = 0xFF # -1 + self.G_SETZIMG = 0xFE # -2 + self.G_SETTIMG = 0xFD # -3 + self.G_SETCOMBINE = 0xFC # -4 + self.G_SETENVCOLOR = 0xFB # -5 + self.G_SETPRIMCOLOR = 0xFA # -6 + self.G_SETBLENDCOLOR = 0xF9 # -7 + self.G_SETFOGCOLOR = 0xF8 # -8 + self.G_SETFILLCOLOR = 0xF7 # -9 + self.G_FILLRECT = 0xF6 # -10 + self.G_SETTILE = 0xF5 # -11 + self.G_LOADTILE = 0xF4 # -12 + self.G_LOADBLOCK = 0xF3 # -13 + self.G_SETTILESIZE = 0xF2 # -14 + self.G_LOADTLUT = 0xF0 # -16 + self.G_RDPSETOTHERMODE = 0xEF # -17 + self.G_SETPRIMDEPTH = 0xEE # -18 + self.G_SETSCISSOR = 0xED # -19 + self.G_SETCONVERT = 0xEC # -20 + self.G_SETKEYR = 0xEB # -21 + self.G_SETKEYGB = 0xEA # -22 + self.G_RDPFULLSYNC = 0xE9 # -23 + self.G_RDPTILESYNC = 0xE8 # -24 + self.G_RDPPIPESYNC = 0xE7 # -25 + self.G_RDPLOADSYNC = 0xE6 # -26 + self.G_TEXRECTFLIP = 0xE5 # -27 + self.G_TEXRECT = 0xE4 # -28 + + self.G_TRI_FILL = 0xC8 # fill triangle: 11001000 + self.G_TRI_SHADE = 0xCC # shade triangle: 11001100 + self.G_TRI_TXTR = 0xCA # texture triangle: 11001010 + self.G_TRI_SHADE_TXTR = 0xCE # shade, texture triangle: 11001110 + self.G_TRI_FILL_ZBUFF = 0xC9 # fill, zbuff triangle: 11001001 + self.G_TRI_SHADE_ZBUFF = 0xCD # shade, zbuff triangle: 11001101 + self.G_TRI_TXTR_ZBUFF = 0xCB # texture, zbuff triangle: 11001011 + self.G_TRI_SHADE_TXTR_ZBUFF = 0xCF # shade, txtr, zbuff trngl: 11001111 + + # masks to build RDP triangle commands + self.G_RDP_TRI_FILL_MASK = 0x08 + self.G_RDP_TRI_SHADE_MASK = 0x04 + self.G_RDP_TRI_TXTR_MASK = 0x02 + self.G_RDP_TRI_ZBUFF_MASK = 0x01 + + self.BOWTIE_VAL = 0 + + # gets added to RDP command, in order to test for addres fixup + self.G_RDP_ADDR_FIXUP = 3 # |RDP cmds| <= this, do addr fixup + # if _LANGUAGE_ASSEMBLY: + self.G_RDP_TEXRECT_CHECK = (-1 * self.G_TEXRECTFLIP) & 0xFF + # endif + + self.G_DMACMDSIZ = 128 + self.G_IMMCMDSIZ = 64 + self.G_RDPCMDSIZ = 64 + + # Coordinate shift values, number of bits of fraction + self.G_TEXTURE_IMAGE_FRAC = 2 + self.G_TEXTURE_SCALE_FRAC = 16 + self.G_SCALE_FRAC = 8 + self.G_ROTATE_FRAC = 16 + + self.G_MAXFBZ = 0x3FFF # 3b exp, 11b mantissa + + # G_MTX: parameter flags + + if F3DEX_GBI_2: + self.G_MTX_MODELVIEW = 0x00 # matrix types + self.G_MTX_PROJECTION = 0x04 + self.G_MTX_MUL = 0x00 # concat or load + self.G_MTX_LOAD = 0x02 + self.G_MTX_NOPUSH = 0x00 # push or not + self.G_MTX_PUSH = 0x01 + else: + self.G_MTX_MODELVIEW = 0x00 # matrix types + self.G_MTX_PROJECTION = 0x01 + self.G_MTX_MUL = 0x00 # concat or load + self.G_MTX_LOAD = 0x02 + self.G_MTX_NOPUSH = 0x00 # push or not + self.G_MTX_PUSH = 0x04 + + self.G_ZBUFFER = 0x00000001 + self.G_SHADE = 0x00000004 # enable Gouraud interp + # rest of low byte reserved for setup ucode + if F3DEX_GBI_2: + self.G_TEXTURE_ENABLE = 0x00000000 # Ignored + self.G_SHADING_SMOOTH = 0x00200000 # flat or smooth shaded + self.G_CULL_FRONT = 0x00000200 + self.G_CULL_BACK = 0x00000400 + self.G_CULL_BOTH = 0x00000600 # To make code cleaner + else: + self.G_TEXTURE_ENABLE = 0x00000002 # Microcode use only + self.G_SHADING_SMOOTH = 0x00000200 # flat or smooth shaded + self.G_CULL_FRONT = 0x00001000 + self.G_CULL_BACK = 0x00002000 + self.G_CULL_BOTH = 0x00003000 # To make code cleaner + self.G_FOG = 0x00010000 + self.G_LIGHTING = 0x00020000 + self.G_TEXTURE_GEN = 0x00040000 + self.G_TEXTURE_GEN_LINEAR = 0x00080000 + self.G_LOD = 0x00100000 # NOT IMPLEMENTED + if F3DEX_GBI or F3DLP_GBI: + self.G_CLIPPING = 0x00800000 + else: + self.G_CLIPPING = 0x00000000 + + # if _LANGUAGE_ASSEMBLY: + self.G_FOG_H = self.G_FOG / 0x10000 + self.G_LIGHTING_H = self.G_LIGHTING / 0x10000 + self.G_TEXTURE_GEN_H = self.G_TEXTURE_GEN / 0x10000 + self.G_TEXTURE_GEN_LINEAR_H = self.G_TEXTURE_GEN_LINEAR / 0x10000 + self.G_LOD_H = self.G_LOD / 0x10000 # NOT IMPLEMENTED + if F3DEX_GBI or F3DLP_GBI: + self.G_CLIPPING_H = self.G_CLIPPING / 0x10000 + # endif + + # Need these defined for Sprite Microcode + # if _LANGUAGE_ASSEMBLY: + self.G_TX_LOADTILE = 7 + self.G_TX_RENDERTILE = 0 + + self.G_TX_NOMIRROR = 0 + self.G_TX_WRAP = 0 + self.G_TX_MIRROR = 0x1 + self.G_TX_CLAMP = 0x2 + self.G_TX_NOMASK = 0 + self.G_TX_NOLOD = 0 + # endif + + self.G_TX_VARS = { + "G_TX_NOMIRROR": 0, + "G_TX_WRAP": 0, + "G_TX_MIRROR": 1, + "G_TX_CLAMP": 2, + "G_TX_NOMASK": 0, + "G_TX_NOLOD": 0, + } + + # G_SETIMG fmt: set image formats + self.G_IM_FMT_RGBA = 0 + self.G_IM_FMT_YUV = 1 + self.G_IM_FMT_CI = 2 + self.G_IM_FMT_IA = 3 + self.G_IM_FMT_I = 4 + + self.G_IM_FMT_VARS = { + "0": 0, + "G_IM_FMT_RGBA": 0, + "G_IM_FMT_YUV": 1, + "G_IM_FMT_CI": 2, + "G_IM_FMT_IA": 3, + "G_IM_FMT_I": 4, + } + + # G_SETIMG siz: set image pixel size + self.G_IM_SIZ_4b = 0 + self.G_IM_SIZ_8b = 1 + self.G_IM_SIZ_16b = 2 + self.G_IM_SIZ_32b = 3 + self.G_IM_SIZ_DD = 5 + + self.G_IM_SIZ_4b_BYTES = 0 + self.G_IM_SIZ_4b_TILE_BYTES = self.G_IM_SIZ_4b_BYTES + self.G_IM_SIZ_4b_LINE_BYTES = self.G_IM_SIZ_4b_BYTES + + self.G_IM_SIZ_8b_BYTES = 1 + self.G_IM_SIZ_8b_TILE_BYTES = self.G_IM_SIZ_8b_BYTES + self.G_IM_SIZ_8b_LINE_BYTES = self.G_IM_SIZ_8b_BYTES + + self.G_IM_SIZ_16b_BYTES = 2 + self.G_IM_SIZ_16b_TILE_BYTES = self.G_IM_SIZ_16b_BYTES + self.G_IM_SIZ_16b_LINE_BYTES = self.G_IM_SIZ_16b_BYTES + + self.G_IM_SIZ_32b_BYTES = 4 + self.G_IM_SIZ_32b_TILE_BYTES = 2 + self.G_IM_SIZ_32b_LINE_BYTES = 2 + + self.G_IM_SIZ_4b_LOAD_BLOCK = self.G_IM_SIZ_16b + self.G_IM_SIZ_8b_LOAD_BLOCK = self.G_IM_SIZ_16b + self.G_IM_SIZ_16b_LOAD_BLOCK = self.G_IM_SIZ_16b + self.G_IM_SIZ_32b_LOAD_BLOCK = self.G_IM_SIZ_32b + + self.G_IM_SIZ_4b_SHIFT = 2 + self.G_IM_SIZ_8b_SHIFT = 1 + self.G_IM_SIZ_16b_SHIFT = 0 + self.G_IM_SIZ_32b_SHIFT = 0 + + self.G_IM_SIZ_4b_INCR = 3 + self.G_IM_SIZ_8b_INCR = 1 + self.G_IM_SIZ_16b_INCR = 0 + self.G_IM_SIZ_32b_INCR = 0 + + self.G_IM_SIZ_VARS = { + "0": 0, + "G_IM_SIZ_4b": 0, + "G_IM_SIZ_8b": 1, + "G_IM_SIZ_16b": 2, + "G_IM_SIZ_32b": 3, + "G_IM_SIZ_DD": 5, + "G_IM_SIZ_4b_BYTES": 0, + "G_IM_SIZ_4b_TILE_BYTES": self.G_IM_SIZ_4b_BYTES, + "G_IM_SIZ_4b_LINE_BYTES": self.G_IM_SIZ_4b_BYTES, + "G_IM_SIZ_8b_BYTES": 1, + "G_IM_SIZ_8b_TILE_BYTES": self.G_IM_SIZ_8b_BYTES, + "G_IM_SIZ_8b_LINE_BYTES": self.G_IM_SIZ_8b_BYTES, + "G_IM_SIZ_16b_BYTES": 2, + "G_IM_SIZ_16b_TILE_BYTES": self.G_IM_SIZ_16b_BYTES, + "G_IM_SIZ_16b_LINE_BYTES": self.G_IM_SIZ_16b_BYTES, + "G_IM_SIZ_32b_BYTES": 4, + "G_IM_SIZ_32b_TILE_BYTES": 2, + "G_IM_SIZ_32b_LINE_BYTES": 2, + "G_IM_SIZ_4b_LOAD_BLOCK": self.G_IM_SIZ_16b, + "G_IM_SIZ_8b_LOAD_BLOCK": self.G_IM_SIZ_16b, + "G_IM_SIZ_16b_LOAD_BLOCK": self.G_IM_SIZ_16b, + "G_IM_SIZ_32b_LOAD_BLOCK": self.G_IM_SIZ_32b, + "G_IM_SIZ_4b_SHIFT": 2, + "G_IM_SIZ_8b_SHIFT": 1, + "G_IM_SIZ_16b_SHIFT": 0, + "G_IM_SIZ_32b_SHIFT": 0, + "G_IM_SIZ_4b_INCR": 3, + "G_IM_SIZ_8b_INCR": 1, + "G_IM_SIZ_16b_INCR": 0, + "G_IM_SIZ_32b_INCR": 0, + } + + # G_SETCOMBINE: color combine modes + + # Color combiner constants: + self.G_CCMUX_COMBINED = 0 + self.G_CCMUX_TEXEL0 = 1 + self.G_CCMUX_TEXEL1 = 2 + self.G_CCMUX_PRIMITIVE = 3 + self.G_CCMUX_SHADE = 4 + self.G_CCMUX_ENVIRONMENT = 5 + self.G_CCMUX_CENTER = 6 + self.G_CCMUX_SCALE = 6 + self.G_CCMUX_COMBINED_ALPHA = 7 + self.G_CCMUX_TEXEL0_ALPHA = 8 + self.G_CCMUX_TEXEL1_ALPHA = 9 + self.G_CCMUX_PRIMITIVE_ALPHA = 10 + self.G_CCMUX_SHADE_ALPHA = 11 + self.G_CCMUX_ENV_ALPHA = 12 + self.G_CCMUX_LOD_FRACTION = 13 + self.G_CCMUX_PRIM_LOD_FRAC = 14 + self.G_CCMUX_NOISE = 7 + self.G_CCMUX_K4 = 7 + self.G_CCMUX_K5 = 15 + self.G_CCMUX_1 = 6 + self.G_CCMUX_0 = 31 + + self.CCMUXDict = { + "COMBINED": 0, + "TEXEL0": 1, + "TEXEL1": 2, + "PRIMITIVE": 3, + "SHADE": 4, + "ENVIRONMENT": 5, + "CENTER": 6, + "SCALE": 6, + "COMBINED_ALPHA": 7, + "TEXEL0_ALPHA": 8, + "TEXEL1_ALPHA": 9, + "PRIMITIVE_ALPHA": 10, + "SHADE_ALPHA": 11, + "ENV_ALPHA": 12, + "LOD_FRACTION": 13, + "PRIM_LOD_FRAC": 14, + "NOISE": 7, + "K4": 7, + "K5": 15, + "1": 6, + "0": 31, + } + + self.ACMUXDict = { + "COMBINED": 0, + "TEXEL0": 1, + "TEXEL1": 2, + "PRIMITIVE": 3, + "SHADE": 4, + "ENVIRONMENT": 5, + "LOD_FRACTION": 0, + "PRIM_LOD_FRAC": 6, + "1": 6, + "0": 7, + } + + # Alpha combiner constants: + self.G_ACMUX_COMBINED = 0 + self.G_ACMUX_TEXEL0 = 1 + self.G_ACMUX_TEXEL1 = 2 + self.G_ACMUX_PRIMITIVE = 3 + self.G_ACMUX_SHADE = 4 + self.G_ACMUX_ENVIRONMENT = 5 + self.G_ACMUX_LOD_FRACTION = 0 + self.G_ACMUX_PRIM_LOD_FRAC = 6 + self.G_ACMUX_1 = 6 + self.G_ACMUX_0 = 7 + + # typical CC cycle 1 modes + self.G_CC_PRIMITIVE = "0", "0", "0", "PRIMITIVE", "0", "0", "0", "PRIMITIVE" + self.G_CC_SHADE = "0", "0", "0", "SHADE", "0", "0", "0", "SHADE" + + self.G_CC_MODULATEI = "TEXEL0", "0", "SHADE", "0", "0", "0", "0", "SHADE" + self.G_CC_MODULATEIDECALA = "TEXEL0", "0", "SHADE", "0", "0", "0", "0", "TEXEL0" + self.G_CC_MODULATEIFADE = ( + "TEXEL0", + "0", + "SHADE", + "0", + "0", + "0", + "0", + "ENVIRONMENT", + ) + + self.G_CC_MODULATERGB = self.G_CC_MODULATEI + self.G_CC_MODULATERGBDECALA = self.G_CC_MODULATEIDECALA + self.G_CC_MODULATERGBFADE = self.G_CC_MODULATEIFADE + + self.G_CC_MODULATEIA = "TEXEL0", "0", "SHADE", "0", "TEXEL0", "0", "SHADE", "0" + self.G_CC_MODULATEIFADEA = ( + "TEXEL0", + "0", + "SHADE", + "0", + "TEXEL0", + "0", + "ENVIRONMENT", + "0", + ) + + self.G_CC_MODULATEFADE = ( + "TEXEL0", + "0", + "SHADE", + "0", + "ENVIRONMENT", + "0", + "TEXEL0", + "0", + ) + + self.G_CC_MODULATERGBA = self.G_CC_MODULATEIA + self.G_CC_MODULATERGBFADEA = self.G_CC_MODULATEIFADEA + + self.G_CC_MODULATEI_PRIM = ( + "TEXEL0", + "0", + "PRIMITIVE", + "0", + "0", + "0", + "0", + "PRIMITIVE", + ) + self.G_CC_MODULATEIA_PRIM = ( + "TEXEL0", + "0", + "PRIMITIVE", + "0", + "TEXEL0", + "0", + "PRIMITIVE", + "0", + ) + self.G_CC_MODULATEIDECALA_PRIM = ( + "TEXEL0", + "0", + "PRIMITIVE", + "0", + "0", + "0", + "0", + "TEXEL0", + ) + + self.G_CC_MODULATERGB_PRIM = self.G_CC_MODULATEI_PRIM + self.G_CC_MODULATERGBA_PRIM = self.G_CC_MODULATEIA_PRIM + self.G_CC_MODULATERGBDECALA_PRIM = self.G_CC_MODULATEIDECALA_PRIM + + self.G_CC_FADE = ( + "SHADE", + "0", + "ENVIRONMENT", + "0", + "SHADE", + "0", + "ENVIRONMENT", + "0", + ) + self.G_CC_FADEA = ( + "TEXEL0", + "0", + "ENVIRONMENT", + "0", + "TEXEL0", + "0", + "ENVIRONMENT", + "0", + ) + + self.G_CC_DECALRGB = "0", "0", "0", "TEXEL0", "0", "0", "0", "SHADE" + self.G_CC_DECALRGBA = "0", "0", "0", "TEXEL0", "0", "0", "0", "TEXEL0" + self.G_CC_DECALFADE = "0", "0", "0", "TEXEL0", "0", "0", "0", "ENVIRONMENT" + + self.G_CC_DECALFADEA = ( + "0", + "0", + "0", + "TEXEL0", + "TEXEL0", + "0", + "ENVIRONMENT", + "0", + ) + + self.G_CC_BLENDI = ( + "ENVIRONMENT", + "SHADE", + "TEXEL0", + "SHADE", + "0", + "0", + "0", + "SHADE", + ) + self.G_CC_BLENDIA = ( + "ENVIRONMENT", + "SHADE", + "TEXEL0", + "SHADE", + "TEXEL0", + "0", + "SHADE", + "0", + ) + self.G_CC_BLENDIDECALA = ( + "ENVIRONMENT", + "SHADE", + "TEXEL0", + "SHADE", + "0", + "0", + "0", + "TEXEL0", + ) + + self.G_CC_BLENDRGBA = ( + "TEXEL0", + "SHADE", + "TEXEL0_ALPHA", + "SHADE", + "0", + "0", + "0", + "SHADE", + ) + self.G_CC_BLENDRGBDECALA = ( + "TEXEL0", + "SHADE", + "TEXEL0_ALPHA", + "SHADE", + "0", + "0", + "0", + "TEXEL0", + ) + self.G_CC_BLENDRGBFADEA = ( + "TEXEL0", + "SHADE", + "TEXEL0_ALPHA", + "SHADE", + "0", + "0", + "0", + "ENVIRONMENT", + ) + + self.G_CC_ADDRGB = "TEXEL0", "0", "TEXEL0", "SHADE", "0", "0", "0", "SHADE" + self.G_CC_ADDRGBDECALA = ( + "TEXEL0", + "0", + "TEXEL0", + "SHADE", + "0", + "0", + "0", + "TEXEL0", + ) + self.G_CC_ADDRGBFADE = ( + "TEXEL0", + "0", + "TEXEL0", + "SHADE", + "0", + "0", + "0", + "ENVIRONMENT", + ) + + self.G_CC_REFLECTRGB = ( + "ENVIRONMENT", + "0", + "TEXEL0", + "SHADE", + "0", + "0", + "0", + "SHADE", + ) + self.G_CC_REFLECTRGBDECALA = ( + "ENVIRONMENT", + "0", + "TEXEL0", + "SHADE", + "0", + "0", + "0", + "TEXEL0", + ) + + self.G_CC_HILITERGB = ( + "PRIMITIVE", + "SHADE", + "TEXEL0", + "SHADE", + "0", + "0", + "0", + "SHADE", + ) + self.G_CC_HILITERGBA = ( + "PRIMITIVE", + "SHADE", + "TEXEL0", + "SHADE", + "PRIMITIVE", + "SHADE", + "TEXEL0", + "SHADE", + ) + self.G_CC_HILITERGBDECALA = ( + "PRIMITIVE", + "SHADE", + "TEXEL0", + "SHADE", + "0", + "0", + "0", + "TEXEL0", + ) + + self.G_CC_SHADEDECALA = "0", "0", "0", "SHADE", "0", "0", "0", "TEXEL0" + self.G_CC_SHADEFADEA = "0", "0", "0", "SHADE", "0", "0", "0", "ENVIRONMENT" + + self.G_CC_BLENDPE = ( + "PRIMITIVE", + "ENVIRONMENT", + "TEXEL0", + "ENVIRONMENT", + "TEXEL0", + "0", + "SHADE", + "0", + ) + self.G_CC_BLENDPEDECALA = ( + "PRIMITIVE", + "ENVIRONMENT", + "TEXEL0", + "ENVIRONMENT", + "0", + "0", + "0", + "TEXEL0", + ) + + # oddball modes + self._G_CC_BLENDPE = ( + "ENVIRONMENT", + "PRIMITIVE", + "TEXEL0", + "PRIMITIVE", + "TEXEL0", + "0", + "SHADE", + "0", + ) + self._G_CC_BLENDPEDECALA = ( + "ENVIRONMENT", + "PRIMITIVE", + "TEXEL0", + "PRIMITIVE", + "0", + "0", + "0", + "TEXEL0", + ) + self._G_CC_TWOCOLORTEX = ( + "PRIMITIVE", + "SHADE", + "TEXEL0", + "SHADE", + "0", + "0", + "0", + "SHADE", + ) + + # used for 1-cycle sparse mip-maps, primitive color has color of lowest LOD + self._G_CC_SPARSEST = ( + "PRIMITIVE", + "TEXEL0", + "LOD_FRACTION", + "TEXEL0", + "PRIMITIVE", + "TEXEL0", + "LOD_FRACTION", + "TEXEL0", + ) + self.G_CC_TEMPLERP = ( + "TEXEL1", + "TEXEL0", + "PRIM_LOD_FRAC", + "TEXEL0", + "TEXEL1", + "TEXEL0", + "PRIM_LOD_FRAC", + "TEXEL0", + ) + + # typical CC cycle 1 modes, usually followed by other cycle 2 modes + self.G_CC_TRILERP = ( + "TEXEL1", + "TEXEL0", + "LOD_FRACTION", + "TEXEL0", + "TEXEL1", + "TEXEL0", + "LOD_FRACTION", + "TEXEL0", + ) + self.G_CC_INTERFERENCE = ( + "TEXEL0", + "0", + "TEXEL1", + "0", + "TEXEL0", + "0", + "TEXEL1", + "0", + ) + + self.G_CC_1CYUV2RGB = "TEXEL0", "K4", "K5", "TEXEL0", "0", "0", "0", "SHADE" + self.G_CC_YUV2RGB = "TEXEL1", "K4", "K5", "TEXEL1", "0", "0", "0", "0" + + # typical CC cycle 2 modes + self.G_CC_PASS2 = "0", "0", "0", "COMBINED", "0", "0", "0", "COMBINED" + self.G_CC_MODULATEI2 = "COMBINED", "0", "SHADE", "0", "0", "0", "0", "SHADE" + self.G_CC_MODULATEIA2 = ( + "COMBINED", + "0", + "SHADE", + "0", + "COMBINED", + "0", + "SHADE", + "0", + ) + self.G_CC_MODULATERGB2 = self.G_CC_MODULATEI2 + self.G_CC_MODULATERGBA2 = self.G_CC_MODULATEIA2 + self.G_CC_MODULATEI_PRIM2 = ( + "COMBINED", + "0", + "PRIMITIVE", + "0", + "0", + "0", + "0", + "PRIMITIVE", + ) + self.G_CC_MODULATEIA_PRIM2 = ( + "COMBINED", + "0", + "PRIMITIVE", + "0", + "COMBINED", + "0", + "PRIMITIVE", + "0", + ) + self.G_CC_MODULATERGB_PRIM2 = self.G_CC_MODULATEI_PRIM2 + self.G_CC_MODULATERGBA_PRIM2 = self.G_CC_MODULATEIA_PRIM2 + self.G_CC_DECALRGB2 = "0", "0", "0", "COMBINED", "0", "0", "0", "SHADE" + + self.G_CC_DECALRGBA2 = ( + "COMBINED", + "SHADE", + "COMBINED_ALPHA", + "SHADE", + "0", + "0", + "0", + "SHADE", + ) + self.G_CC_BLENDI2 = ( + "ENVIRONMENT", + "SHADE", + "COMBINED", + "SHADE", + "0", + "0", + "0", + "SHADE", + ) + self.G_CC_BLENDIA2 = ( + "ENVIRONMENT", + "SHADE", + "COMBINED", + "SHADE", + "COMBINED", + "0", + "SHADE", + "0", + ) + self.G_CC_CHROMA_KEY2 = "TEXEL0", "CENTER", "SCALE", "0", "0", "0", "0", "0" + self.G_CC_HILITERGB2 = ( + "ENVIRONMENT", + "COMBINED", + "TEXEL0", + "COMBINED", + "0", + "0", + "0", + "SHADE", + ) + self.G_CC_HILITERGBA2 = ( + "ENVIRONMENT", + "COMBINED", + "TEXEL0", + "COMBINED", + "ENVIRONMENT", + "COMBINED", + "TEXEL0", + "COMBINED", + ) + self.G_CC_HILITERGBDECALA2 = ( + "ENVIRONMENT", + "COMBINED", + "TEXEL0", + "COMBINED", + "0", + "0", + "0", + "TEXEL0", + ) + self.G_CC_HILITERGBPASSA2 = ( + "ENVIRONMENT", + "COMBINED", + "TEXEL0", + "COMBINED", + "0", + "0", + "0", + "COMBINED", + ) + + # G_SETOTHERMODE_L sft: shift count + + self.G_MDSFT_ALPHACOMPARE = G_MDSFT_ALPHACOMPARE = 0 + self.G_MDSFT_ZSRCSEL = G_MDSFT_ZSRCSEL = 2 + self.G_MDSFT_RENDERMODE = G_MDSFT_RENDERMODE = 3 + self.G_MDSFT_BLENDER = G_MDSFT_BLENDER = 16 + + # G_SETOTHERMODE_H sft: shift count + + self.G_MDSFT_BLENDMASK = G_MDSFT_BLENDMASK = 0 # unsupported + self.G_MDSFT_ALPHADITHER = G_MDSFT_ALPHADITHER = 4 + self.G_MDSFT_RGBDITHER = G_MDSFT_RGBDITHER = 6 + + self.G_MDSFT_COMBKEY = G_MDSFT_COMBKEY = 8 + self.G_MDSFT_TEXTCONV = G_MDSFT_TEXTCONV = 9 + self.G_MDSFT_TEXTFILT = G_MDSFT_TEXTFILT = 12 + self.G_MDSFT_TEXTLUT = G_MDSFT_TEXTLUT = 14 + self.G_MDSFT_TEXTLOD = G_MDSFT_TEXTLOD = 16 + self.G_MDSFT_TEXTDETAIL = G_MDSFT_TEXTDETAIL = 17 + self.G_MDSFT_TEXTPERSP = G_MDSFT_TEXTPERSP = 19 + self.G_MDSFT_CYCLETYPE = G_MDSFT_CYCLETYPE = 20 + self.G_MDSFT_COLORDITHER = G_MDSFT_COLORDITHER = 22 # unsupported in HW 2.0 + self.G_MDSFT_PIPELINE = G_MDSFT_PIPELINE = 23 + + # G_SETOTHERMODE_H gPipelineMode + self.G_PM_1PRIMITIVE = 1 << G_MDSFT_PIPELINE + self.G_PM_NPRIMITIVE = 0 << G_MDSFT_PIPELINE + + # G_SETOTHERMODE_H gSetCycleType + self.G_CYC_1CYCLE = 0 << G_MDSFT_CYCLETYPE + self.G_CYC_2CYCLE = 1 << G_MDSFT_CYCLETYPE + self.G_CYC_COPY = 2 << G_MDSFT_CYCLETYPE + self.G_CYC_FILL = 3 << G_MDSFT_CYCLETYPE + + # G_SETOTHERMODE_H gSetTexturePersp + self.G_TP_NONE = 0 << G_MDSFT_TEXTPERSP + self.G_TP_PERSP = 1 << G_MDSFT_TEXTPERSP + + # G_SETOTHERMODE_H gSetTextureDetail + self.G_TD_CLAMP = 0 << G_MDSFT_TEXTDETAIL + self.G_TD_SHARPEN = 1 << G_MDSFT_TEXTDETAIL + self.G_TD_DETAIL = 2 << G_MDSFT_TEXTDETAIL + + # G_SETOTHERMODE_H gSetTextureLOD + self.G_TL_TILE = 0 << G_MDSFT_TEXTLOD + self.G_TL_LOD = 1 << G_MDSFT_TEXTLOD + + # G_SETOTHERMODE_H gSetTextureLUT + self.G_TT_NONE = 0 << G_MDSFT_TEXTLUT + self.G_TT_RGBA16 = 2 << G_MDSFT_TEXTLUT + self.G_TT_IA16 = 3 << G_MDSFT_TEXTLUT + + # G_SETOTHERMODE_H gSetTextureFilter + self.G_TF_POINT = 0 << G_MDSFT_TEXTFILT + self.G_TF_AVERAGE = 3 << G_MDSFT_TEXTFILT + self.G_TF_BILERP = 2 << G_MDSFT_TEXTFILT + + # G_SETOTHERMODE_H gSetTextureConvert + self.G_TC_CONV = 0 << G_MDSFT_TEXTCONV + self.G_TC_FILTCONV = 5 << G_MDSFT_TEXTCONV + self.G_TC_FILT = 6 << G_MDSFT_TEXTCONV + + # G_SETOTHERMODE_H gSetCombineKey + self.G_CK_NONE = 0 << G_MDSFT_COMBKEY + self.G_CK_KEY = 1 << G_MDSFT_COMBKEY + + # G_SETOTHERMODE_H gSetColorDither + self.G_CD_MAGICSQ = 0 << G_MDSFT_RGBDITHER + self.G_CD_BAYER = 1 << G_MDSFT_RGBDITHER + self.G_CD_NOISE = 2 << G_MDSFT_RGBDITHER + + if not _HW_VERSION_1: + self.G_CD_DISABLE = 3 << G_MDSFT_RGBDITHER + self.G_CD_ENABLE = self.G_CD_NOISE # HW 1.0 compatibility mode + else: + self.G_CD_ENABLE = 1 << G_MDSFT_COLORDITHER + self.G_CD_DISABLE = 0 << G_MDSFT_COLORDITHER + + # G_SETOTHERMODE_H gSetAlphaDither + self.G_AD_PATTERN = 0 << G_MDSFT_ALPHADITHER + self.G_AD_NOTPATTERN = 1 << G_MDSFT_ALPHADITHER + self.G_AD_NOISE = 2 << G_MDSFT_ALPHADITHER + self.G_AD_DISABLE = 3 << G_MDSFT_ALPHADITHER + + # G_SETOTHERMODE_L gSetAlphaCompare + self.G_AC_NONE = 0 << G_MDSFT_ALPHACOMPARE + self.G_AC_THRESHOLD = 1 << G_MDSFT_ALPHACOMPARE + self.G_AC_DITHER = 3 << G_MDSFT_ALPHACOMPARE + + # G_SETOTHERMODE_L gSetDepthSource + self.G_ZS_PIXEL = 0 << G_MDSFT_ZSRCSEL + self.G_ZS_PRIM = 1 << G_MDSFT_ZSRCSEL + + # G_SETOTHERMODE_L gSetRenderMode + self.AA_EN = AA_EN = 0x8 + self.Z_CMP = Z_CMP = 0x10 + self.Z_UPD = Z_UPD = 0x20 + self.IM_RD = IM_RD = 0x40 + self.CLR_ON_CVG = CLR_ON_CVG = 0x80 + self.CVG_DST_CLAMP = CVG_DST_CLAMP = 0 + self.CVG_DST_WRAP = CVG_DST_WRAP = 0x100 + self.CVG_DST_FULL = CVG_DST_FULL = 0x200 + self.CVG_DST_SAVE = CVG_DST_SAVE = 0x300 + self.ZMODE_OPA = ZMODE_OPA = 0 + self.ZMODE_INTER = ZMODE_INTER = 0x400 + self.ZMODE_XLU = ZMODE_XLU = 0x800 + self.ZMODE_DEC = ZMODE_DEC = 0xC00 + self.CVG_X_ALPHA = CVG_X_ALPHA = 0x1000 + self.ALPHA_CVG_SEL = ALPHA_CVG_SEL = 0x2000 + self.FORCE_BL = FORCE_BL = 0x4000 + self.TEX_EDGE = TEX_EDGE = 0x0000 # used to be 0x8000 + + self.G_BL_CLR_IN = G_BL_CLR_IN = 0 + self.G_BL_CLR_MEM = G_BL_CLR_MEM = 1 + self.G_BL_CLR_BL = G_BL_CLR_BL = 2 + self.G_BL_CLR_FOG = G_BL_CLR_FOG = 3 + self.G_BL_1MA = G_BL_1MA = 0 + self.G_BL_A_MEM = G_BL_A_MEM = 1 + self.G_BL_A_IN = G_BL_A_IN = 0 + self.G_BL_A_FOG = G_BL_A_FOG = 1 + self.G_BL_A_SHADE = G_BL_A_SHADE = 2 + self.G_BL_1 = G_BL_1 = 2 + self.G_BL_0 = G_BL_0 = 3 + + self.cvgDstDict = { + CVG_DST_CLAMP: "CVG_DST_CLAMP", + CVG_DST_WRAP: "CVG_DST_WRAP", + CVG_DST_FULL: "CVG_DST_FULL", + CVG_DST_SAVE: "CVG_DST_SAVE", + } + + self.zmodeDict = { + ZMODE_OPA: "ZMODE_OPA", + ZMODE_INTER: "ZMODE_INTER", + ZMODE_XLU: "ZMODE_XLU", + ZMODE_DEC: "ZMODE_DEC", + } + + self.blendColorDict = { + G_BL_CLR_IN: "G_BL_CLR_IN", + G_BL_CLR_MEM: "G_BL_CLR_MEM", + G_BL_CLR_BL: "G_BL_CLR_BL", + G_BL_CLR_FOG: "G_BL_CLR_FOG", + } + + self.blendAlphaDict = { + G_BL_A_IN: "G_BL_A_IN", + G_BL_A_FOG: "G_BL_A_FOG", + G_BL_A_SHADE: "G_BL_A_SHADE", + G_BL_0: "G_BL_0", + } + + self.blendMixDict = { + G_BL_1MA: "G_BL_1MA", + G_BL_A_MEM: "G_BL_A_MEM", + G_BL_1: "G_BL_1", + G_BL_0: "G_BL_0", + } + + def GBL_c1(m1a, m1b, m2a, m2b): + return (m1a) << 30 | (m1b) << 26 | (m2a) << 22 | (m2b) << 18 + + def GBL_c2(m1a, m1b, m2a, m2b): + return (m1a) << 28 | (m1b) << 24 | (m2a) << 20 | (m2b) << 16 + + def RM_AA_ZB_OPA_SURF(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | Z_CMP + | Z_UPD + | IM_RD + | CVG_DST_CLAMP + | ZMODE_OPA + | ALPHA_CVG_SEL + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + ) + + def RM_RA_ZB_OPA_SURF(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | Z_CMP + | Z_UPD + | CVG_DST_CLAMP + | ZMODE_OPA + | ALPHA_CVG_SEL + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + ) + + def RM_AA_ZB_XLU_SURF(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | Z_CMP + | IM_RD + | CVG_DST_WRAP + | CLR_ON_CVG + | FORCE_BL + | ZMODE_XLU + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_AA_ZB_OPA_DECAL(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | Z_CMP + | IM_RD + | CVG_DST_WRAP + | ALPHA_CVG_SEL + | ZMODE_DEC + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + ) + + def RM_RA_ZB_OPA_DECAL(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | Z_CMP + | CVG_DST_WRAP + | ALPHA_CVG_SEL + | ZMODE_DEC + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + ) + + def RM_AA_ZB_XLU_DECAL(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | Z_CMP + | IM_RD + | CVG_DST_WRAP + | CLR_ON_CVG + | FORCE_BL + | ZMODE_DEC + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_AA_ZB_OPA_INTER(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | Z_CMP + | Z_UPD + | IM_RD + | CVG_DST_CLAMP + | ALPHA_CVG_SEL + | ZMODE_INTER + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + ) + + def RM_RA_ZB_OPA_INTER(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | Z_CMP + | Z_UPD + | CVG_DST_CLAMP + | ALPHA_CVG_SEL + | ZMODE_INTER + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + ) + + def RM_AA_ZB_XLU_INTER(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | Z_CMP + | IM_RD + | CVG_DST_WRAP + | CLR_ON_CVG + | FORCE_BL + | ZMODE_INTER + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_AA_ZB_XLU_LINE(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | Z_CMP + | IM_RD + | CVG_DST_CLAMP + | CVG_X_ALPHA + | ALPHA_CVG_SEL + | FORCE_BL + | ZMODE_XLU + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_AA_ZB_DEC_LINE(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | Z_CMP + | IM_RD + | CVG_DST_SAVE + | CVG_X_ALPHA + | ALPHA_CVG_SEL + | FORCE_BL + | ZMODE_DEC + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_AA_ZB_TEX_EDGE(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | Z_CMP + | Z_UPD + | IM_RD + | CVG_DST_CLAMP + | CVG_X_ALPHA + | ALPHA_CVG_SEL + | ZMODE_OPA + | TEX_EDGE + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + ) + + def RM_AA_ZB_TEX_INTER(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | Z_CMP + | Z_UPD + | IM_RD + | CVG_DST_CLAMP + | CVG_X_ALPHA + | ALPHA_CVG_SEL + | ZMODE_INTER + | TEX_EDGE + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + ) + + def RM_AA_ZB_SUB_SURF(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | Z_CMP + | Z_UPD + | IM_RD + | CVG_DST_FULL + | ZMODE_OPA + | ALPHA_CVG_SEL + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + ) + + def RM_AA_ZB_PCL_SURF(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | Z_CMP + | Z_UPD + | IM_RD + | CVG_DST_CLAMP + | ZMODE_OPA + | self.G_AC_DITHER + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_AA_ZB_OPA_TERR(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | Z_CMP + | Z_UPD + | IM_RD + | CVG_DST_CLAMP + | ZMODE_OPA + | ALPHA_CVG_SEL + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_AA_ZB_TEX_TERR(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | Z_CMP + | Z_UPD + | IM_RD + | CVG_DST_CLAMP + | CVG_X_ALPHA + | ALPHA_CVG_SEL + | ZMODE_OPA + | TEX_EDGE + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_AA_ZB_SUB_TERR(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | Z_CMP + | Z_UPD + | IM_RD + | CVG_DST_FULL + | ZMODE_OPA + | ALPHA_CVG_SEL + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_AA_OPA_SURF(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | IM_RD + | CVG_DST_CLAMP + | ZMODE_OPA + | ALPHA_CVG_SEL + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + ) + + def RM_RA_OPA_SURF(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | CVG_DST_CLAMP + | ZMODE_OPA + | ALPHA_CVG_SEL + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + ) + + def RM_AA_XLU_SURF(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | IM_RD + | CVG_DST_WRAP + | CLR_ON_CVG + | FORCE_BL + | ZMODE_OPA + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_AA_XLU_LINE(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | IM_RD + | CVG_DST_CLAMP + | CVG_X_ALPHA + | ALPHA_CVG_SEL + | FORCE_BL + | ZMODE_OPA + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_AA_DEC_LINE(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | IM_RD + | CVG_DST_FULL + | CVG_X_ALPHA + | ALPHA_CVG_SEL + | FORCE_BL + | ZMODE_OPA + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_AA_TEX_EDGE(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | IM_RD + | CVG_DST_CLAMP + | CVG_X_ALPHA + | ALPHA_CVG_SEL + | ZMODE_OPA + | TEX_EDGE + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + ) + + def RM_AA_SUB_SURF(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | IM_RD + | CVG_DST_FULL + | ZMODE_OPA + | ALPHA_CVG_SEL + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + ) + + def RM_AA_PCL_SURF(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | IM_RD + | CVG_DST_CLAMP + | ZMODE_OPA + | self.G_AC_DITHER + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_AA_OPA_TERR(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | IM_RD + | CVG_DST_CLAMP + | ZMODE_OPA + | ALPHA_CVG_SEL + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_AA_TEX_TERR(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | IM_RD + | CVG_DST_CLAMP + | CVG_X_ALPHA + | ALPHA_CVG_SEL + | ZMODE_OPA + | TEX_EDGE + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_AA_SUB_TERR(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + AA_EN + | IM_RD + | CVG_DST_FULL + | ZMODE_OPA + | ALPHA_CVG_SEL + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_ZB_OPA_SURF(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + Z_CMP + | Z_UPD + | CVG_DST_FULL + | ALPHA_CVG_SEL + | ZMODE_OPA + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + ) + + def RM_ZB_XLU_SURF(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + Z_CMP + | IM_RD + | CVG_DST_FULL + | FORCE_BL + | ZMODE_XLU + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_ZB_OPA_DECAL(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + Z_CMP + | CVG_DST_FULL + | ALPHA_CVG_SEL + | ZMODE_DEC + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + ) + + def RM_ZB_XLU_DECAL(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + Z_CMP + | IM_RD + | CVG_DST_FULL + | FORCE_BL + | ZMODE_DEC + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_ZB_CLD_SURF(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + Z_CMP + | IM_RD + | CVG_DST_SAVE + | FORCE_BL + | ZMODE_XLU + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_ZB_OVL_SURF(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + Z_CMP + | IM_RD + | CVG_DST_SAVE + | FORCE_BL + | ZMODE_DEC + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_ZB_PCL_SURF(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + Z_CMP + | Z_UPD + | CVG_DST_FULL + | ZMODE_OPA + | self.G_AC_DITHER + | func(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + ) + + def RM_OPA_SURF(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + CVG_DST_CLAMP + | FORCE_BL + | ZMODE_OPA + | func(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + ) + + def RM_XLU_SURF(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + IM_RD + | CVG_DST_FULL + | FORCE_BL + | ZMODE_OPA + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_TEX_EDGE(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + CVG_DST_CLAMP + | CVG_X_ALPHA + | ALPHA_CVG_SEL + | FORCE_BL + | ZMODE_OPA + | TEX_EDGE + | AA_EN + | func(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + ) + + def RM_CLD_SURF(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + IM_RD + | CVG_DST_SAVE + | FORCE_BL + | ZMODE_OPA + | func(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + ) + + def RM_PCL_SURF(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + CVG_DST_FULL + | FORCE_BL + | ZMODE_OPA + | self.G_AC_DITHER + | func(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + ) + + def RM_ADD(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + IM_RD + | CVG_DST_SAVE + | FORCE_BL + | ZMODE_OPA + | func(G_BL_CLR_IN, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_1) + ) + + def RM_NOOP(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return func(0, 0, 0, 0) + + def RM_VISCVG(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return IM_RD | FORCE_BL | func(G_BL_CLR_IN, G_BL_0, G_BL_CLR_BL, G_BL_A_MEM) + + # for rendering to an 8-bit framebuffer + def RM_OPA_CI(clk): + func = GBL_c1 if clk == 1 else GBL_c2 + return ( + CVG_DST_CLAMP + | ZMODE_OPA + | func(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + ) + + self.G_RM_AA_ZB_OPA_SURF = RM_AA_ZB_OPA_SURF(1) + self.G_RM_AA_ZB_OPA_SURF2 = RM_AA_ZB_OPA_SURF(2) + self.G_RM_AA_ZB_XLU_SURF = RM_AA_ZB_XLU_SURF(1) + self.G_RM_AA_ZB_XLU_SURF2 = RM_AA_ZB_XLU_SURF(2) + self.G_RM_AA_ZB_OPA_DECAL = RM_AA_ZB_OPA_DECAL(1) + self.G_RM_AA_ZB_OPA_DECAL2 = RM_AA_ZB_OPA_DECAL(2) + self.G_RM_AA_ZB_XLU_DECAL = RM_AA_ZB_XLU_DECAL(1) + self.G_RM_AA_ZB_XLU_DECAL2 = RM_AA_ZB_XLU_DECAL(2) + self.G_RM_AA_ZB_OPA_INTER = RM_AA_ZB_OPA_INTER(1) + self.G_RM_AA_ZB_OPA_INTER2 = RM_AA_ZB_OPA_INTER(2) + self.G_RM_AA_ZB_XLU_INTER = RM_AA_ZB_XLU_INTER(1) + self.G_RM_AA_ZB_XLU_INTER2 = RM_AA_ZB_XLU_INTER(2) + self.G_RM_AA_ZB_XLU_LINE = RM_AA_ZB_XLU_LINE(1) + self.G_RM_AA_ZB_XLU_LINE2 = RM_AA_ZB_XLU_LINE(2) + self.G_RM_AA_ZB_DEC_LINE = RM_AA_ZB_DEC_LINE(1) + self.G_RM_AA_ZB_DEC_LINE2 = RM_AA_ZB_DEC_LINE(2) + self.G_RM_AA_ZB_TEX_EDGE = RM_AA_ZB_TEX_EDGE(1) + self.G_RM_AA_ZB_TEX_EDGE2 = RM_AA_ZB_TEX_EDGE(2) + self.G_RM_AA_ZB_TEX_INTER = RM_AA_ZB_TEX_INTER(1) + self.G_RM_AA_ZB_TEX_INTER2 = RM_AA_ZB_TEX_INTER(2) + self.G_RM_AA_ZB_SUB_SURF = RM_AA_ZB_SUB_SURF(1) + self.G_RM_AA_ZB_SUB_SURF2 = RM_AA_ZB_SUB_SURF(2) + self.G_RM_AA_ZB_PCL_SURF = RM_AA_ZB_PCL_SURF(1) + self.G_RM_AA_ZB_PCL_SURF2 = RM_AA_ZB_PCL_SURF(2) + self.G_RM_AA_ZB_OPA_TERR = RM_AA_ZB_OPA_TERR(1) + self.G_RM_AA_ZB_OPA_TERR2 = RM_AA_ZB_OPA_TERR(2) + self.G_RM_AA_ZB_TEX_TERR = RM_AA_ZB_TEX_TERR(1) + self.G_RM_AA_ZB_TEX_TERR2 = RM_AA_ZB_TEX_TERR(2) + self.G_RM_AA_ZB_SUB_TERR = RM_AA_ZB_SUB_TERR(1) + self.G_RM_AA_ZB_SUB_TERR2 = RM_AA_ZB_SUB_TERR(2) + + self.G_RM_RA_ZB_OPA_SURF = RM_RA_ZB_OPA_SURF(1) + self.G_RM_RA_ZB_OPA_SURF2 = RM_RA_ZB_OPA_SURF(2) + self.G_RM_RA_ZB_OPA_DECAL = RM_RA_ZB_OPA_DECAL(1) + self.G_RM_RA_ZB_OPA_DECAL2 = RM_RA_ZB_OPA_DECAL(2) + self.G_RM_RA_ZB_OPA_INTER = RM_RA_ZB_OPA_INTER(1) + self.G_RM_RA_ZB_OPA_INTER2 = RM_RA_ZB_OPA_INTER(2) + + self.G_RM_AA_OPA_SURF = RM_AA_OPA_SURF(1) + self.G_RM_AA_OPA_SURF2 = RM_AA_OPA_SURF(2) + self.G_RM_AA_XLU_SURF = RM_AA_XLU_SURF(1) + self.G_RM_AA_XLU_SURF2 = RM_AA_XLU_SURF(2) + self.G_RM_AA_XLU_LINE = RM_AA_XLU_LINE(1) + self.G_RM_AA_XLU_LINE2 = RM_AA_XLU_LINE(2) + self.G_RM_AA_DEC_LINE = RM_AA_DEC_LINE(1) + self.G_RM_AA_DEC_LINE2 = RM_AA_DEC_LINE(2) + self.G_RM_AA_TEX_EDGE = RM_AA_TEX_EDGE(1) + self.G_RM_AA_TEX_EDGE2 = RM_AA_TEX_EDGE(2) + self.G_RM_AA_SUB_SURF = RM_AA_SUB_SURF(1) + self.G_RM_AA_SUB_SURF2 = RM_AA_SUB_SURF(2) + self.G_RM_AA_PCL_SURF = RM_AA_PCL_SURF(1) + self.G_RM_AA_PCL_SURF2 = RM_AA_PCL_SURF(2) + self.G_RM_AA_OPA_TERR = RM_AA_OPA_TERR(1) + self.G_RM_AA_OPA_TERR2 = RM_AA_OPA_TERR(2) + self.G_RM_AA_TEX_TERR = RM_AA_TEX_TERR(1) + self.G_RM_AA_TEX_TERR2 = RM_AA_TEX_TERR(2) + self.G_RM_AA_SUB_TERR = RM_AA_SUB_TERR(1) + self.G_RM_AA_SUB_TERR2 = RM_AA_SUB_TERR(2) + + self.G_RM_RA_OPA_SURF = RM_RA_OPA_SURF(1) + self.G_RM_RA_OPA_SURF2 = RM_RA_OPA_SURF(2) + + self.G_RM_ZB_OPA_SURF = RM_ZB_OPA_SURF(1) + self.G_RM_ZB_OPA_SURF2 = RM_ZB_OPA_SURF(2) + self.G_RM_ZB_XLU_SURF = RM_ZB_XLU_SURF(1) + self.G_RM_ZB_XLU_SURF2 = RM_ZB_XLU_SURF(2) + self.G_RM_ZB_OPA_DECAL = RM_ZB_OPA_DECAL(1) + self.G_RM_ZB_OPA_DECAL2 = RM_ZB_OPA_DECAL(2) + self.G_RM_ZB_XLU_DECAL = RM_ZB_XLU_DECAL(1) + self.G_RM_ZB_XLU_DECAL2 = RM_ZB_XLU_DECAL(2) + self.G_RM_ZB_CLD_SURF = RM_ZB_CLD_SURF(1) + self.G_RM_ZB_CLD_SURF2 = RM_ZB_CLD_SURF(2) + self.G_RM_ZB_OVL_SURF = RM_ZB_OVL_SURF(1) + self.G_RM_ZB_OVL_SURF2 = RM_ZB_OVL_SURF(2) + self.G_RM_ZB_PCL_SURF = RM_ZB_PCL_SURF(1) + self.G_RM_ZB_PCL_SURF2 = RM_ZB_PCL_SURF(2) + + self.G_RM_OPA_SURF = RM_OPA_SURF(1) + self.G_RM_OPA_SURF2 = RM_OPA_SURF(2) + self.G_RM_XLU_SURF = RM_XLU_SURF(1) + self.G_RM_XLU_SURF2 = RM_XLU_SURF(2) + self.G_RM_CLD_SURF = RM_CLD_SURF(1) + self.G_RM_CLD_SURF2 = RM_CLD_SURF(2) + self.G_RM_TEX_EDGE = RM_TEX_EDGE(1) + self.G_RM_TEX_EDGE2 = RM_TEX_EDGE(2) + self.G_RM_PCL_SURF = RM_PCL_SURF(1) + self.G_RM_PCL_SURF2 = RM_PCL_SURF(2) + self.G_RM_ADD = RM_ADD(1) + self.G_RM_ADD2 = RM_ADD(2) + self.G_RM_NOOP = RM_NOOP(1) + self.G_RM_NOOP2 = RM_NOOP(2) + self.G_RM_VISCVG = RM_VISCVG(1) + self.G_RM_VISCVG2 = RM_VISCVG(2) + self.G_RM_OPA_CI = RM_OPA_CI(1) + self.G_RM_OPA_CI2 = RM_OPA_CI(2) + + self.G_RM_FOG_SHADE_A = GBL_c1( + G_BL_CLR_FOG, G_BL_A_SHADE, G_BL_CLR_IN, G_BL_1MA + ) + self.G_RM_FOG_PRIM_A = GBL_c1(G_BL_CLR_FOG, G_BL_A_FOG, G_BL_CLR_IN, G_BL_1MA) + self.G_RM_PASS = GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + + # G_SETCONVERT: K0-5 + + self.G_CV_K0 = 175 + self.G_CV_K1 = -43 + self.G_CV_K2 = -89 + self.G_CV_K3 = 222 + self.G_CV_K4 = 114 + self.G_CV_K5 = 42 + + # G_SETSCISSOR: interlace mode + + self.G_SC_NON_INTERLACE = 0 + self.G_SC_ODD_INTERLACE = 3 + self.G_SC_EVEN_INTERLACE = 2 + + # flags to inhibit pushing of the display list (on branch) + self.G_DL_PUSH = 0x00 + self.G_DL_NOPUSH = 0x01 + + # Some structs here + + self.G_MAXZ = 0x03FF # 10 bits of integer screen-Z precision + + # more structs here + + """ MOVEMEM indices Each of these indexes an entry in a dmem table which points to a 1-4 word block of dmem in which to store a 1-4 word DMA. - ''' - - if F3DEX_GBI_2: - # 0,4 are reserved by G_MTX - self.G_MV_MMTX = 2 - self.G_MV_PMTX = 6 - self.G_MV_VIEWPORT = 8 - self.G_MV_LIGHT = 10 - self.G_MV_POINT = 12 - self.G_MV_MATRIX = 14 # NOTE: this is in moveword table - self.G_MVO_LOOKATX = (0*24) - self.G_MVO_LOOKATY = (1*24) - self.G_MVO_L0 = (2*24) - self.G_MVO_L1 = (3*24) - self.G_MVO_L2 = (4*24) - self.G_MVO_L3 = (5*24) - self.G_MVO_L4 = (6*24) - self.G_MVO_L5 = (7*24) - self.G_MVO_L6 = (8*24) - self.G_MVO_L7 = (9*24) - else: - self.G_MV_VIEWPORT = 0x80 - self.G_MV_LOOKATY = 0x82 - self.G_MV_LOOKATX = 0x84 - self.G_MV_L0 = 0x86 - self.G_MV_L1 = 0x88 - self.G_MV_L2 = 0x8a - self.G_MV_L3 = 0x8c - self.G_MV_L4 = 0x8e - self.G_MV_L5 = 0x90 - self.G_MV_L6 = 0x92 - self.G_MV_L7 = 0x94 - self.G_MV_TXTATT = 0x96 - self.G_MV_MATRIX_1 = 0x9e # NOTE: this is in moveword table - self.G_MV_MATRIX_2 = 0x98 - self.G_MV_MATRIX_3 = 0x9a - self.G_MV_MATRIX_4 = 0x9c - - ''' + """ + + if F3DEX_GBI_2: + # 0,4 are reserved by G_MTX + self.G_MV_MMTX = 2 + self.G_MV_PMTX = 6 + self.G_MV_VIEWPORT = 8 + self.G_MV_LIGHT = 10 + self.G_MV_POINT = 12 + self.G_MV_MATRIX = 14 # NOTE: this is in moveword table + self.G_MVO_LOOKATX = 0 * 24 + self.G_MVO_LOOKATY = 1 * 24 + self.G_MVO_L0 = 2 * 24 + self.G_MVO_L1 = 3 * 24 + self.G_MVO_L2 = 4 * 24 + self.G_MVO_L3 = 5 * 24 + self.G_MVO_L4 = 6 * 24 + self.G_MVO_L5 = 7 * 24 + self.G_MVO_L6 = 8 * 24 + self.G_MVO_L7 = 9 * 24 + else: + self.G_MV_VIEWPORT = 0x80 + self.G_MV_LOOKATY = 0x82 + self.G_MV_LOOKATX = 0x84 + self.G_MV_L0 = 0x86 + self.G_MV_L1 = 0x88 + self.G_MV_L2 = 0x8A + self.G_MV_L3 = 0x8C + self.G_MV_L4 = 0x8E + self.G_MV_L5 = 0x90 + self.G_MV_L6 = 0x92 + self.G_MV_L7 = 0x94 + self.G_MV_TXTATT = 0x96 + self.G_MV_MATRIX_1 = 0x9E # NOTE: this is in moveword table + self.G_MV_MATRIX_2 = 0x98 + self.G_MV_MATRIX_3 = 0x9A + self.G_MV_MATRIX_4 = 0x9C + + """ MOVEWORD indices Each of these indexes an entry in a dmem table which points to a word in dmem in dmem where an immediate word will be stored. - ''' - - self.G_MW_MATRIX = 0x00 # NOTE: also used by movemem - self.G_MW_NUMLIGHT = 0x02 - self.G_MW_CLIP = 0x04 - self.G_MW_SEGMENT = 0x06 - self.G_MW_FOG = 0x08 - self.G_MW_LIGHTCOL = 0x0a - if F3DEX_GBI_2: - self.G_MW_FORCEMTX = 0x0c - else: - self.G_MW_POINTS = 0x0c - self.G_MW_PERSPNORM = 0x0e - - - # These are offsets from the address in the dmem table - - self.G_MWO_NUMLIGHT = 0x00 - self.G_MWO_CLIP_RNX = 0x04 - self.G_MWO_CLIP_RNY = 0x0c - self.G_MWO_CLIP_RPX = 0x14 - self.G_MWO_CLIP_RPY = 0x1c - self.G_MWO_SEGMENT_0 = 0x00 - self.G_MWO_SEGMENT_1 = 0x01 - self.G_MWO_SEGMENT_2 = 0x02 - self.G_MWO_SEGMENT_3 = 0x03 - self.G_MWO_SEGMENT_4 = 0x04 - self.G_MWO_SEGMENT_5 = 0x05 - self.G_MWO_SEGMENT_6 = 0x06 - self.G_MWO_SEGMENT_7 = 0x07 - self.G_MWO_SEGMENT_8 = 0x08 - self.G_MWO_SEGMENT_9 = 0x09 - self.G_MWO_SEGMENT_A = 0x0a - self.G_MWO_SEGMENT_B = 0x0b - self.G_MWO_SEGMENT_C = 0x0c - self.G_MWO_SEGMENT_D = 0x0d - self.G_MWO_SEGMENT_E = 0x0e - self.G_MWO_SEGMENT_F = 0x0f - self.G_MWO_FOG = 0x00 - self.G_MWO_aLIGHT_1 = 0x00 - self.G_MWO_bLIGHT_1 = 0x04 - - if F3DEX_GBI_2: - self.G_MWO_aLIGHT_2 = 0x18 - self.G_MWO_bLIGHT_2 = 0x1c - self.G_MWO_aLIGHT_3 = 0x30 - self.G_MWO_bLIGHT_3 = 0x34 - self.G_MWO_aLIGHT_4 = 0x48 - self.G_MWO_bLIGHT_4 = 0x4c - self.G_MWO_aLIGHT_5 = 0x60 - self.G_MWO_bLIGHT_5 = 0x64 - self.G_MWO_aLIGHT_6 = 0x78 - self.G_MWO_bLIGHT_6 = 0x7c - self.G_MWO_aLIGHT_7 = 0x90 - self.G_MWO_bLIGHT_7 = 0x94 - self.G_MWO_aLIGHT_8 = 0xa8 - self.G_MWO_bLIGHT_8 = 0xac - else: - self.G_MWO_aLIGHT_2 = 0x20 - self.G_MWO_bLIGHT_2 = 0x24 - self.G_MWO_aLIGHT_3 = 0x40 - self.G_MWO_bLIGHT_3 = 0x44 - self.G_MWO_aLIGHT_4 = 0x60 - self.G_MWO_bLIGHT_4 = 0x64 - self.G_MWO_aLIGHT_5 = 0x80 - self.G_MWO_bLIGHT_5 = 0x84 - self.G_MWO_aLIGHT_6 = 0xa0 - self.G_MWO_bLIGHT_6 = 0xa4 - self.G_MWO_aLIGHT_7 = 0xc0 - self.G_MWO_bLIGHT_7 = 0xc4 - self.G_MWO_aLIGHT_8 = 0xe0 - self.G_MWO_bLIGHT_8 = 0xe4 - - self.G_MWO_MATRIX_XX_XY_I = 0x00 - self.G_MWO_MATRIX_XZ_XW_I = 0x04 - self.G_MWO_MATRIX_YX_YY_I = 0x08 - self.G_MWO_MATRIX_YZ_YW_I = 0x0c - self.G_MWO_MATRIX_ZX_ZY_I = 0x10 - self.G_MWO_MATRIX_ZZ_ZW_I = 0x14 - self.G_MWO_MATRIX_WX_WY_I = 0x18 - self.G_MWO_MATRIX_WZ_WW_I = 0x1c - self.G_MWO_MATRIX_XX_XY_F = 0x20 - self.G_MWO_MATRIX_XZ_XW_F = 0x24 - self.G_MWO_MATRIX_YX_YY_F = 0x28 - self.G_MWO_MATRIX_YZ_YW_F = 0x2c - self.G_MWO_MATRIX_ZX_ZY_F = 0x30 - self.G_MWO_MATRIX_ZZ_ZW_F = 0x34 - self.G_MWO_MATRIX_WX_WY_F = 0x38 - self.G_MWO_MATRIX_WZ_WW_F = 0x3c - self.G_MWO_POINT_RGBA = 0x10 - self.G_MWO_POINT_ST = 0x14 - self.G_MWO_POINT_XYSCREEN = 0x18 - self.G_MWO_POINT_ZSCREEN = 0x1c - - - # Texturing macros - - # These are also defined defined above for Sprite Microcode - self.G_TX_LOADTILE = 7 - self.G_TX_RENDERTILE = 0 - - self.G_TX_NOMIRROR = 0 - self.G_TX_WRAP = 0 - self.G_TX_MIRROR = 0x1 - self.G_TX_CLAMP = 0x2 - self.G_TX_NOMASK = 0 - self.G_TX_NOLOD = 0 - - ''' + """ + + self.G_MW_MATRIX = 0x00 # NOTE: also used by movemem + self.G_MW_NUMLIGHT = 0x02 + self.G_MW_CLIP = 0x04 + self.G_MW_SEGMENT = 0x06 + self.G_MW_FOG = 0x08 + self.G_MW_LIGHTCOL = 0x0A + if F3DEX_GBI_2: + self.G_MW_FORCEMTX = 0x0C + else: + self.G_MW_POINTS = 0x0C + self.G_MW_PERSPNORM = 0x0E + + # These are offsets from the address in the dmem table + + self.G_MWO_NUMLIGHT = 0x00 + self.G_MWO_CLIP_RNX = 0x04 + self.G_MWO_CLIP_RNY = 0x0C + self.G_MWO_CLIP_RPX = 0x14 + self.G_MWO_CLIP_RPY = 0x1C + self.G_MWO_SEGMENT_0 = 0x00 + self.G_MWO_SEGMENT_1 = 0x01 + self.G_MWO_SEGMENT_2 = 0x02 + self.G_MWO_SEGMENT_3 = 0x03 + self.G_MWO_SEGMENT_4 = 0x04 + self.G_MWO_SEGMENT_5 = 0x05 + self.G_MWO_SEGMENT_6 = 0x06 + self.G_MWO_SEGMENT_7 = 0x07 + self.G_MWO_SEGMENT_8 = 0x08 + self.G_MWO_SEGMENT_9 = 0x09 + self.G_MWO_SEGMENT_A = 0x0A + self.G_MWO_SEGMENT_B = 0x0B + self.G_MWO_SEGMENT_C = 0x0C + self.G_MWO_SEGMENT_D = 0x0D + self.G_MWO_SEGMENT_E = 0x0E + self.G_MWO_SEGMENT_F = 0x0F + self.G_MWO_FOG = 0x00 + self.G_MWO_aLIGHT_1 = 0x00 + self.G_MWO_bLIGHT_1 = 0x04 + + if F3DEX_GBI_2: + self.G_MWO_aLIGHT_2 = 0x18 + self.G_MWO_bLIGHT_2 = 0x1C + self.G_MWO_aLIGHT_3 = 0x30 + self.G_MWO_bLIGHT_3 = 0x34 + self.G_MWO_aLIGHT_4 = 0x48 + self.G_MWO_bLIGHT_4 = 0x4C + self.G_MWO_aLIGHT_5 = 0x60 + self.G_MWO_bLIGHT_5 = 0x64 + self.G_MWO_aLIGHT_6 = 0x78 + self.G_MWO_bLIGHT_6 = 0x7C + self.G_MWO_aLIGHT_7 = 0x90 + self.G_MWO_bLIGHT_7 = 0x94 + self.G_MWO_aLIGHT_8 = 0xA8 + self.G_MWO_bLIGHT_8 = 0xAC + else: + self.G_MWO_aLIGHT_2 = 0x20 + self.G_MWO_bLIGHT_2 = 0x24 + self.G_MWO_aLIGHT_3 = 0x40 + self.G_MWO_bLIGHT_3 = 0x44 + self.G_MWO_aLIGHT_4 = 0x60 + self.G_MWO_bLIGHT_4 = 0x64 + self.G_MWO_aLIGHT_5 = 0x80 + self.G_MWO_bLIGHT_5 = 0x84 + self.G_MWO_aLIGHT_6 = 0xA0 + self.G_MWO_bLIGHT_6 = 0xA4 + self.G_MWO_aLIGHT_7 = 0xC0 + self.G_MWO_bLIGHT_7 = 0xC4 + self.G_MWO_aLIGHT_8 = 0xE0 + self.G_MWO_bLIGHT_8 = 0xE4 + + self.G_MWO_MATRIX_XX_XY_I = 0x00 + self.G_MWO_MATRIX_XZ_XW_I = 0x04 + self.G_MWO_MATRIX_YX_YY_I = 0x08 + self.G_MWO_MATRIX_YZ_YW_I = 0x0C + self.G_MWO_MATRIX_ZX_ZY_I = 0x10 + self.G_MWO_MATRIX_ZZ_ZW_I = 0x14 + self.G_MWO_MATRIX_WX_WY_I = 0x18 + self.G_MWO_MATRIX_WZ_WW_I = 0x1C + self.G_MWO_MATRIX_XX_XY_F = 0x20 + self.G_MWO_MATRIX_XZ_XW_F = 0x24 + self.G_MWO_MATRIX_YX_YY_F = 0x28 + self.G_MWO_MATRIX_YZ_YW_F = 0x2C + self.G_MWO_MATRIX_ZX_ZY_F = 0x30 + self.G_MWO_MATRIX_ZZ_ZW_F = 0x34 + self.G_MWO_MATRIX_WX_WY_F = 0x38 + self.G_MWO_MATRIX_WZ_WW_F = 0x3C + self.G_MWO_POINT_RGBA = 0x10 + self.G_MWO_POINT_ST = 0x14 + self.G_MWO_POINT_XYSCREEN = 0x18 + self.G_MWO_POINT_ZSCREEN = 0x1C + + # Texturing macros + + # These are also defined defined above for Sprite Microcode + self.G_TX_LOADTILE = 7 + self.G_TX_RENDERTILE = 0 + + self.G_TX_NOMIRROR = 0 + self.G_TX_WRAP = 0 + self.G_TX_MIRROR = 0x1 + self.G_TX_CLAMP = 0x2 + self.G_TX_NOMASK = 0 + self.G_TX_NOLOD = 0 + + """ Dxt is the inverse of the number of 64-bit words in a line of the texture being loaded using the load_block command. If there are any 1's to the right of the 11th fractional bit, dxt should be rounded up. The following macros accomplish this. The 4b macros are a special case since 4-bit textures are loaded as 8-bit textures. Dxt is fixed point 1.11. RJM - ''' - self.G_TX_DXT_FRAC = 11 + """ + self.G_TX_DXT_FRAC = 11 - ''' + """ For RCP 2.0, the maximum number of texels that can be loaded using a load_block command is 2048. In order to load the total 4kB of Tmem, change the texel size when loading to be G_IM_SIZ_16b, @@ -1304,1778 +1933,2220 @@ def RM_OPA_CI(clk): will be transparent if you use these macros. If you use the g*DPLoadBlock macros directly, you will need to handle this tile manipulation yourself. RJM. - ''' - - if _HW_VERSION_1: - self.G_TX_LDBLK_MAX_TXL = 4095 - else: - self.G_TX_LDBLK_MAX_TXL = 2047 - - - # Clipping Macros - self.FR_NEG_FRUSTRATIO_1 = 0x00000001 - self.FR_POS_FRUSTRATIO_1 = 0x0000ffff - self.FR_NEG_FRUSTRATIO_2 = 0x00000002 - self.FR_POS_FRUSTRATIO_2 = 0x0000fffe - self.FR_NEG_FRUSTRATIO_3 = 0x00000003 - self.FR_POS_FRUSTRATIO_3 = 0x0000fffd - self.FR_NEG_FRUSTRATIO_4 = 0x00000004 - self.FR_POS_FRUSTRATIO_4 = 0x0000fffc - self.FR_NEG_FRUSTRATIO_5 = 0x00000005 - self.FR_POS_FRUSTRATIO_5 = 0x0000fffb - self.FR_NEG_FRUSTRATIO_6 = 0x00000006 - self.FR_POS_FRUSTRATIO_6 = 0x0000fffa - - self.G_BZ_PERSP = 0 - self.G_BZ_ORTHO = 1 + """ + + if _HW_VERSION_1: + self.G_TX_LDBLK_MAX_TXL = 4095 + else: + self.G_TX_LDBLK_MAX_TXL = 2047 + + # Clipping Macros + self.FR_NEG_FRUSTRATIO_1 = 0x00000001 + self.FR_POS_FRUSTRATIO_1 = 0x0000FFFF + self.FR_NEG_FRUSTRATIO_2 = 0x00000002 + self.FR_POS_FRUSTRATIO_2 = 0x0000FFFE + self.FR_NEG_FRUSTRATIO_3 = 0x00000003 + self.FR_POS_FRUSTRATIO_3 = 0x0000FFFD + self.FR_NEG_FRUSTRATIO_4 = 0x00000004 + self.FR_POS_FRUSTRATIO_4 = 0x0000FFFC + self.FR_NEG_FRUSTRATIO_5 = 0x00000005 + self.FR_POS_FRUSTRATIO_5 = 0x0000FFFB + self.FR_NEG_FRUSTRATIO_6 = 0x00000006 + self.FR_POS_FRUSTRATIO_6 = 0x0000FFFA + + self.G_BZ_PERSP = 0 + self.G_BZ_ORTHO = 1 + + # Lighting Macros + self.numLights = { + "NUMLIGHTS_0": 1, + "NUMLIGHTS_1": 1, + "NUMLIGHTS_2": 2, + "NUMLIGHTS_3": 3, + "NUMLIGHTS_4": 4, + "NUMLIGHTS_5": 5, + "NUMLIGHTS_6": 6, + "NUMLIGHTS_7": 7, + } + + def GBL_c1(self, m1a, m1b, m2a, m2b): + return (m1a) << 30 | (m1b) << 26 | (m2a) << 22 | (m2b) << 18 + + def GBL_c2(self, m1a, m1b, m2a, m2b): + return (m1a) << 28 | (m1b) << 24 | (m2a) << 20 | (m2b) << 16 + + # macros for command parsing + def GDMACMD(self, x): + return x + + def GIMMCMD(self, x): + return self.G_IMMFIRST - (x) + + def GRDPCMD(self, x): + return 0xFF - (x) + + def GPACK_RGBA5551(self, r, g, b, a): + return ( + (((r) << 8) & 0xF800) + | (((g) << 3) & 0x7C0) + | (((b) >> 2) & 0x3E) + | ((a) & 0x1) + ) + + def GPACK_ZDZ(self, z, dz): + return (z) << 2 | (dz) + + def TXL2WORDS(self, txls, b_txl): + return int(max(1, ((txls) * (b_txl) / 8))) + + def CALC_DXT(self, width, b_txl): + return int( + ((1 << self.G_TX_DXT_FRAC) + self.TXL2WORDS(width, b_txl) - 1) + / self.TXL2WORDS(width, b_txl) + ) + + def TXL2WORDS_4b(self, txls): + return int(max(1, ((txls) / 16))) + + def CALC_DXT_4b(self, width): + return int( + ((1 << self.G_TX_DXT_FRAC) + self.TXL2WORDS_4b(width) - 1) + / self.TXL2WORDS_4b(width) + ) + + def NUML(self, n): + nVal = self.numLights[n] + return ((nVal) * 24) if self.F3DEX_GBI_2 else (((nVal) + 1) * 32 + 0x80000000) + + def getLightMWO_a(self, n): + if n == "G_MWO_aLIGHT_1": + return self.G_MWO_aLIGHT_1 + elif n == "G_MWO_aLIGHT_2": + return self.G_MWO_aLIGHT_2 + elif n == "G_MWO_aLIGHT_3": + return self.G_MWO_aLIGHT_3 + elif n == "G_MWO_aLIGHT_4": + return self.G_MWO_aLIGHT_4 + elif n == "G_MWO_aLIGHT_5": + return self.G_MWO_aLIGHT_5 + elif n == "G_MWO_aLIGHT_6": + return self.G_MWO_aLIGHT_6 + elif n == "G_MWO_aLIGHT_7": + return self.G_MWO_aLIGHT_7 + elif n == "G_MWO_aLIGHT_8": + return self.G_MWO_aLIGHT_8 + else: + raise PluginError("Invalid G_MWO_a value for lights: " + n) + + def getLightMWO_b(self, n): + if n == "G_MWO_bLIGHT_1": + return self.G_MWO_bLIGHT_1 + elif n == "G_MWO_bLIGHT_2": + return self.G_MWO_bLIGHT_2 + elif n == "G_MWO_bLIGHT_3": + return self.G_MWO_bLIGHT_3 + elif n == "G_MWO_bLIGHT_4": + return self.G_MWO_bLIGHT_4 + elif n == "G_MWO_bLIGHT_5": + return self.G_MWO_bLIGHT_5 + elif n == "G_MWO_bLIGHT_6": + return self.G_MWO_bLIGHT_6 + elif n == "G_MWO_bLIGHT_7": + return self.G_MWO_bLIGHT_7 + elif n == "G_MWO_bLIGHT_8": + return self.G_MWO_bLIGHT_8 + else: + raise PluginError("Invalid G_MWO_b value for lights: " + n) - - # Lighting Macros - self.numLights = { - 'NUMLIGHTS_0' : 1, - 'NUMLIGHTS_1' : 1, - 'NUMLIGHTS_2' : 2, - 'NUMLIGHTS_3' : 3, - 'NUMLIGHTS_4' : 4, - 'NUMLIGHTS_5' : 5, - 'NUMLIGHTS_6' : 6, - 'NUMLIGHTS_7' : 7, - } - - def GBL_c1(self, m1a, m1b, m2a, m2b): - return (m1a) << 30 | (m1b) << 26 | (m2a) << 22 | (m2b) << 18 - def GBL_c2(self, m1a, m1b, m2a, m2b): - return (m1a) << 28 | (m1b) << 24 | (m2a) << 20 | (m2b) << 16 - - # macros for command parsing - def GDMACMD(self, x): return (x) - def GIMMCMD(self, x): return (self.G_IMMFIRST-(x)) - def GRDPCMD(self, x): return (0xff-(x)) - - def GPACK_RGBA5551(self, r, g, b, a): - return ((((r)<<8) & 0xf800) | \ - (((g)<<3) & 0x7c0) | \ - (((b)>>2) & 0x3e) | ((a) & 0x1)) - def GPACK_ZDZ(self, z, dz): - return ((z) << 2 | (dz)) - - def TXL2WORDS(self, txls, b_txl): return int(max(1, ((txls)*(b_txl)/8))) - def CALC_DXT(self, width, b_txl): - return int(((1 << self.G_TX_DXT_FRAC) + self.TXL2WORDS(width, b_txl) -\ - 1) / self.TXL2WORDS(width, b_txl)) - - def TXL2WORDS_4b(self, txls): return int(max(1, ((txls)/16))) - def CALC_DXT_4b(self, width): - return int(((1 << self.G_TX_DXT_FRAC) + self.TXL2WORDS_4b(width) - 1)/\ - self.TXL2WORDS_4b(width)) - - def NUML(self, n): - nVal = self.numLights[n] - return ((nVal)*24) if self.F3DEX_GBI_2 else (((nVal)+1)*32 + 0x80000000) - - def getLightMWO_a(self, n): - if n == 'G_MWO_aLIGHT_1': return self.G_MWO_aLIGHT_1 - elif n == 'G_MWO_aLIGHT_2': return self.G_MWO_aLIGHT_2 - elif n == 'G_MWO_aLIGHT_3': return self.G_MWO_aLIGHT_3 - elif n == 'G_MWO_aLIGHT_4': return self.G_MWO_aLIGHT_4 - elif n == 'G_MWO_aLIGHT_5': return self.G_MWO_aLIGHT_5 - elif n == 'G_MWO_aLIGHT_6': return self.G_MWO_aLIGHT_6 - elif n == 'G_MWO_aLIGHT_7': return self.G_MWO_aLIGHT_7 - elif n == 'G_MWO_aLIGHT_8': return self.G_MWO_aLIGHT_8 - else: raise PluginError('Invalid G_MWO_a value for lights: ' + n) - - def getLightMWO_b(self, n): - if n == 'G_MWO_bLIGHT_1': return self.G_MWO_bLIGHT_1 - elif n == 'G_MWO_bLIGHT_2': return self.G_MWO_bLIGHT_2 - elif n == 'G_MWO_bLIGHT_3': return self.G_MWO_bLIGHT_3 - elif n == 'G_MWO_bLIGHT_4': return self.G_MWO_bLIGHT_4 - elif n == 'G_MWO_bLIGHT_5': return self.G_MWO_bLIGHT_5 - elif n == 'G_MWO_bLIGHT_6': return self.G_MWO_bLIGHT_6 - elif n == 'G_MWO_bLIGHT_7': return self.G_MWO_bLIGHT_7 - elif n == 'G_MWO_bLIGHT_8': return self.G_MWO_bLIGHT_8 - else: raise PluginError('Invalid G_MWO_b value for lights: ' + n) def _SHIFTL(value, amount, mask): - return (int(value) & ((1 << mask) - 1)) << amount + return (int(value) & ((1 << mask) - 1)) << amount + MTX_SIZE = 64 VTX_SIZE = 16 GFX_SIZE = 8 VP_SIZE = 8 -LIGHT_SIZE = 16 # 12, but padded to 64bit alignment +LIGHT_SIZE = 16 # 12, but padded to 64bit alignment AMBIENT_SIZE = 8 HILITE_SIZE = 16 + class ExportCData: - def __init__(self, staticData, dynamicData, textureData): - self.staticData = staticData - self.dynamicData = dynamicData - self.textureData = textureData - - def all(self): - data = CData() - data.append(self.staticData) - data.append(self.dynamicData) - data.append(self.textureData) - return data + def __init__(self, staticData, dynamicData, textureData): + self.staticData = staticData + self.dynamicData = dynamicData + self.textureData = textureData + + def all(self): + data = CData() + data.append(self.staticData) + data.append(self.dynamicData) + data.append(self.textureData) + return data + class TextureExportSettings: - def __init__(self, texCSeparate, savePNG, includeDir, exportPath = ''): - self.texCSeparate = texCSeparate - self.savePNG = savePNG - self.includeDir = includeDir - self.exportPath = exportPath + def __init__(self, texCSeparate, savePNG, includeDir, exportPath=""): + self.texCSeparate = texCSeparate + self.savePNG = savePNG + self.includeDir = includeDir + self.exportPath = exportPath + # SetTileSize Scroll Data class FSetTileSizeScrollField: - def __init__(self): - self.s = 0 - self.t = 0 - self.interval = 1 + def __init__(self): + self.s = 0 + self.t = 0 + self.interval = 1 + def tile_func(direction: str, speed: int, cmd_num: int): - if speed == 0 or speed is None: - return None + if speed == 0 or speed is None: + return None + + func = f"shift_{direction}" - func = f'shift_{direction}' + if speed < 0: + func += "_down" - if speed < 0: - func += '_down' + return f"\t{func}(mat, {cmd_num}, PACK_TILESIZE(0, {abs(speed)}));" - return f'\t{func}(mat, {cmd_num}, PACK_TILESIZE(0, {abs(speed)}));' def get_sts_interval_vars(tex_num: str): - return f'intervalTex{tex_num}', f'curInterval{tex_num}' + return f"intervalTex{tex_num}", f"curInterval{tex_num}" + def get_tex_sts_code(tex: FSetTileSizeScrollField, tex_num: int, cmd_num: int): - variables = [] - # create func calls - lines = [ - tile_func('s', tex.s, cmd_num), - tile_func('t', tex.t, cmd_num), - ] - # filter lines - lines = [func for func in lines if func] - # add interval logic if needed - if len(lines) and tex.interval > 1: - # get interval and variable for tracking interval - interval, cur_interval = get_sts_interval_vars(tex_num) - # pass each var and its value to variables - variables.extend([(interval, tex.interval), (cur_interval, tex.interval)]) - - # indent again for if statement - lines = [('\t' + func) for func in lines] - - lines = [ - f'\n\tif (--{cur_interval} <= 0) {{', - *lines, - f'\t\t{cur_interval} = {interval};', - '\t}' - ] - return variables, lines + variables = [] + # create func calls + lines = [ + tile_func("s", tex.s, cmd_num), + tile_func("t", tex.t, cmd_num), + ] + # filter lines + lines = [func for func in lines if func] + # add interval logic if needed + if len(lines) and tex.interval > 1: + # get interval and variable for tracking interval + interval, cur_interval = get_sts_interval_vars(tex_num) + # pass each var and its value to variables + variables.extend([(interval, tex.interval), (cur_interval, tex.interval)]) + + # indent again for if statement + lines = [("\t" + func) for func in lines] + + lines = [ + f"\n\tif (--{cur_interval} <= 0) {{", + *lines, + f"\t\t{cur_interval} = {interval};", + "\t}", + ] + return variables, lines def mat_tile_scroll( - mat: str, - tex0: FSetTileSizeScrollField, - tex1: FSetTileSizeScrollField, - cmd_num0: int, - cmd_num1: int + mat: str, + tex0: FSetTileSizeScrollField, + tex1: FSetTileSizeScrollField, + cmd_num0: int, + cmd_num1: int, ): - func = f'void scroll_sts_{mat}()' - lines = [f'{func} {{'] + func = f"void scroll_sts_{mat}()" + lines = [f"{func} {{"] + + tex0_variables, tex0_lines = get_tex_sts_code(tex0, 0, cmd_num0) + tex1_variables, tex1_lines = get_tex_sts_code(tex1, 1, cmd_num1) + static_variables = [*tex0_variables, *tex1_variables] - tex0_variables, tex0_lines = get_tex_sts_code(tex0, 0, cmd_num0) - tex1_variables, tex1_lines = get_tex_sts_code(tex1, 1, cmd_num1) - static_variables = [*tex0_variables, *tex1_variables] + for variable, val in static_variables: + lines.append(f"\tstatic int {variable} = {val};") - for variable, val in static_variables: - lines.append(f'\tstatic int {variable} = {val};') - - lines.append(f'\tGfx *mat = segmented_to_virtual({mat});') - lines.extend(tex0_lines) - lines.extend(tex1_lines) - lines.append('};\n\n') + lines.append(f"\tGfx *mat = segmented_to_virtual({mat});") + lines.extend(tex0_lines) + lines.extend(tex1_lines) + lines.append("};\n\n") - return func, '\n'.join([line for line in lines if line]) + return func, "\n".join([line for line in lines if line]) class GfxFormatter: - def __init__(self, scrollMethod: ScrollMethod, texArrayBitSize): - self.scrollMethod: ScrollMethod = scrollMethod - self.texArrayBitSize = texArrayBitSize - self.tileScrollFunc = None # Used to add tile scroll func to headers - - def vertexScrollTemplate(self, fScrollData, name, count, - absFunc, signFunc, cosFunc, randomFloatFunc, randomSignFunc, segToVirtualFunc): - scrollDataFields = fScrollData.fields[0] - if scrollDataFields[0].animType == "None" and\ - scrollDataFields[1].animType == "None": - return '' - - data = 'void scroll_' + name + "() {\n" +\ - "\tint i = 0;\n" +\ - "\tint count = " + str(count) + ';\n' +\ - "\tint width = " + str(fScrollData.dimensions[0]) + ' * 0x20;\n' +\ - "\tint height = " + str(fScrollData.dimensions[1]) + ' * 0x20;' - - variables = "" - currentVars = "" - deltaCalculate = "" - checkOverflow = "" - scrolling = "" - increaseCurrentDelta = "" - for i in range(2): - field = 'XYZ'[i] - axis = ['width', 'height'][i] - if scrollDataFields[i].animType != "None": - currentVars += "\tstatic int current" + field + ' = 0;\n\tint delta' + field + ';\n' - checkOverflow += '\tif (' + absFunc + '(current' + field + ') > ' + axis + ') {\n' +\ - '\t\tdelta' + field + ' -= (int)(absi(current' + field + ') / ' + axis + ') * ' + axis +\ - ' * ' + signFunc + '(delta' + field + ');\n\t}\n' - scrolling += '\t\tvertices[i].n.tc[' + str(i) + '] += delta' + field + ';\n' - increaseCurrentDelta += '\tcurrent' + field + ' += delta' + field + ';' - - if scrollDataFields[i].animType == "Linear": - deltaCalculate += '\tdelta' + field + ' = (int)(' + str(scrollDataFields[i].speed) + ' * 0x20) % ' + axis + ';\n' - elif scrollDataFields[i].animType == "Sine": - currentVars += '\tstatic int time' + field + ';\n' +\ - '\tfloat amplitude' + field + ' = ' + str(scrollDataFields[i].amplitude) + ';\n' +\ - '\tfloat frequency' + field + ' = ' + str(scrollDataFields[i].frequency) + ';\n' +\ - '\tfloat offset' + field + ' = ' + str(scrollDataFields[i].offset) + ';\n' - - deltaCalculate += '\tdelta' + field + ' = (int)(amplitude' + field + ' * frequency' +\ - field + ' * ' + cosFunc + '((frequency' + field + ' * time' + field + ' + offset' + field + \ - ') * (1024 * 16 - 1) / 6.28318530718) * 0x20);\n' - # Conversion from s10.5 to u16 - #checkOverflow += '\tif (frequency' + field + ' * current' + field + ' / 2 > 6.28318530718) {\n' +\ - # '\t\tcurrent' + field + ' -= 6.28318530718 * 2 / frequency' + field + ';\n\t}\n' - increaseCurrentDelta += '\ttime' + field + ' += 1;' - elif scrollDataFields[i].animType == "Noise": - deltaCalculate += '\tdelta' + field + ' = (int)(' + str(scrollDataFields[i].noiseAmplitude) + ' * 0x20 * ' +\ - randomFloatFunc + '() * ' + randomSignFunc + '()) % ' + axis + ';\n' - else: - raise PluginError("Unhandled scroll type: " + str(scrollDataFields[i].animType)) - - return data + '\n' + variables + '\n' + currentVars +\ - '\tVtx *vertices = ' + segToVirtualFunc + '(' + name + ');\n\n' +\ - deltaCalculate + '\n' + checkOverflow + '\n' +\ - "\tfor (i = 0; i < count; i++) {\n" +\ - scrolling + '\t}\n' + increaseCurrentDelta + '\n}\n\n' - - # Called for handling vertex texture scrolling. - def vertexScrollToC(self, fScrollData, name, vertexCount): - raise PluginError("Use of unimplemented GfxFormatter function vertexScrollToC.") - - # Called for building the entry point DL for drawing a model. - def drawToC(self, f3d, gfxList): - return gfxList.to_c(f3d) - - # Called for creating a dynamic material using tile texture scrolling. - # ScrollMethod and DLFormat checks are already handled. - def tileScrollMaterialToC(self, f3d, fMaterial): - raise PluginError("No tile scroll implementation specified.") - - # Modify static material using tile texture scrolling. - def tileScrollStaticMaterialToC(self, fMaterial): - setTileSizeIndex0 = -1 - setTileSizeIndex1 = -1 - - # Find index of SetTileSize commands - for i, c in enumerate(fMaterial.material.commands): - if isinstance(c, DPSetTileSize): - if setTileSizeIndex0 >= 0: - setTileSizeIndex1 = i - break - else: - setTileSizeIndex0 = i - mat_name = fMaterial.material.name - - tile_scroll_tex0 = fMaterial.scrollData.tile_scroll_tex0 - tile_scroll_tex1 = fMaterial.scrollData.tile_scroll_tex1 - if fMaterial.scrollData.tile_scroll_exported: - return None - if tile_scroll_tex0.s or tile_scroll_tex0.t or tile_scroll_tex1.s or tile_scroll_tex1.t: - func, data = mat_tile_scroll( - mat_name, tile_scroll_tex0, tile_scroll_tex1, setTileSizeIndex0, setTileSizeIndex1 - ) - self.tileScrollFunc = f'extern {func};' # save for later - fMaterial.scrollData.tile_scroll_exported = True - return data - - return None + def __init__(self, scrollMethod: ScrollMethod, texArrayBitSize): + self.scrollMethod: ScrollMethod = scrollMethod + self.texArrayBitSize = texArrayBitSize + self.tileScrollFunc = None # Used to add tile scroll func to headers + + def vertexScrollTemplate( + self, + fScrollData, + name, + count, + absFunc, + signFunc, + cosFunc, + randomFloatFunc, + randomSignFunc, + segToVirtualFunc, + ): + scrollDataFields = fScrollData.fields[0] + if ( + scrollDataFields[0].animType == "None" + and scrollDataFields[1].animType == "None" + ): + return "" + + data = ( + "void scroll_" + + name + + "() {\n" + + "\tint i = 0;\n" + + "\tint count = " + + str(count) + + ";\n" + + "\tint width = " + + str(fScrollData.dimensions[0]) + + " * 0x20;\n" + + "\tint height = " + + str(fScrollData.dimensions[1]) + + " * 0x20;" + ) + + variables = "" + currentVars = "" + deltaCalculate = "" + checkOverflow = "" + scrolling = "" + increaseCurrentDelta = "" + for i in range(2): + field = "XYZ"[i] + axis = ["width", "height"][i] + if scrollDataFields[i].animType != "None": + currentVars += ( + "\tstatic int current" + + field + + " = 0;\n\tint delta" + + field + + ";\n" + ) + checkOverflow += ( + "\tif (" + + absFunc + + "(current" + + field + + ") > " + + axis + + ") {\n" + + "\t\tdelta" + + field + + " -= (int)(absi(current" + + field + + ") / " + + axis + + ") * " + + axis + + " * " + + signFunc + + "(delta" + + field + + ");\n\t}\n" + ) + scrolling += ( + "\t\tvertices[i].n.tc[" + str(i) + "] += delta" + field + ";\n" + ) + increaseCurrentDelta += "\tcurrent" + field + " += delta" + field + ";" + + if scrollDataFields[i].animType == "Linear": + deltaCalculate += ( + "\tdelta" + + field + + " = (int)(" + + str(scrollDataFields[i].speed) + + " * 0x20) % " + + axis + + ";\n" + ) + elif scrollDataFields[i].animType == "Sine": + currentVars += ( + "\tstatic int time" + + field + + ";\n" + + "\tfloat amplitude" + + field + + " = " + + str(scrollDataFields[i].amplitude) + + ";\n" + + "\tfloat frequency" + + field + + " = " + + str(scrollDataFields[i].frequency) + + ";\n" + + "\tfloat offset" + + field + + " = " + + str(scrollDataFields[i].offset) + + ";\n" + ) + + deltaCalculate += ( + "\tdelta" + + field + + " = (int)(amplitude" + + field + + " * frequency" + + field + + " * " + + cosFunc + + "((frequency" + + field + + " * time" + + field + + " + offset" + + field + + ") * (1024 * 16 - 1) / 6.28318530718) * 0x20);\n" + ) + # Conversion from s10.5 to u16 + # checkOverflow += '\tif (frequency' + field + ' * current' + field + ' / 2 > 6.28318530718) {\n' +\ + # '\t\tcurrent' + field + ' -= 6.28318530718 * 2 / frequency' + field + ';\n\t}\n' + increaseCurrentDelta += "\ttime" + field + " += 1;" + elif scrollDataFields[i].animType == "Noise": + deltaCalculate += ( + "\tdelta" + + field + + " = (int)(" + + str(scrollDataFields[i].noiseAmplitude) + + " * 0x20 * " + + randomFloatFunc + + "() * " + + randomSignFunc + + "()) % " + + axis + + ";\n" + ) + else: + raise PluginError( + "Unhandled scroll type: " + str(scrollDataFields[i].animType) + ) + + return ( + data + + "\n" + + variables + + "\n" + + currentVars + + "\tVtx *vertices = " + + segToVirtualFunc + + "(" + + name + + ");\n\n" + + deltaCalculate + + "\n" + + checkOverflow + + "\n" + + "\tfor (i = 0; i < count; i++) {\n" + + scrolling + + "\t}\n" + + increaseCurrentDelta + + "\n}\n\n" + ) + + # Called for handling vertex texture scrolling. + def vertexScrollToC(self, fScrollData, name, vertexCount): + raise PluginError("Use of unimplemented GfxFormatter function vertexScrollToC.") + + # Called for building the entry point DL for drawing a model. + def drawToC(self, f3d, gfxList): + return gfxList.to_c(f3d) + + # Called for creating a dynamic material using tile texture scrolling. + # ScrollMethod and DLFormat checks are already handled. + def tileScrollMaterialToC(self, f3d, fMaterial): + raise PluginError("No tile scroll implementation specified.") + + # Modify static material using tile texture scrolling. + def tileScrollStaticMaterialToC(self, fMaterial): + setTileSizeIndex0 = -1 + setTileSizeIndex1 = -1 + + # Find index of SetTileSize commands + for i, c in enumerate(fMaterial.material.commands): + if isinstance(c, DPSetTileSize): + if setTileSizeIndex0 >= 0: + setTileSizeIndex1 = i + break + else: + setTileSizeIndex0 = i + mat_name = fMaterial.material.name + + tile_scroll_tex0 = fMaterial.scrollData.tile_scroll_tex0 + tile_scroll_tex1 = fMaterial.scrollData.tile_scroll_tex1 + if fMaterial.scrollData.tile_scroll_exported: + return None + if ( + tile_scroll_tex0.s + or tile_scroll_tex0.t + or tile_scroll_tex1.s + or tile_scroll_tex1.t + ): + func, data = mat_tile_scroll( + mat_name, + tile_scroll_tex0, + tile_scroll_tex1, + setTileSizeIndex0, + setTileSizeIndex1, + ) + self.tileScrollFunc = f"extern {func};" # save for later + fMaterial.scrollData.tile_scroll_exported = True + return data + + return None class Vtx: - def __init__(self, position, uv, colorOrNormal): - self.position = position - self.uv = uv - self.colorOrNormal = colorOrNormal - - def to_binary(self): - signX = 1 if self.uv[0] >= 0 else -1 - signY = 1 if self.uv[1] >= 0 else -1 - uv = [self.uv[0] % (signX * 2**15), self.uv[1] % (signY * 2**15)] - return self.position[0].to_bytes(2, 'big', signed=True) + \ - self.position[1].to_bytes(2, 'big', signed=True) + \ - self.position[2].to_bytes(2, 'big', signed=True) + \ - bytearray([0x00, 0x00]) + \ - uv[0].to_bytes(2, 'big', signed = True) +\ - uv[1].to_bytes(2, 'big', signed = True) +\ - bytearray(self.colorOrNormal) - - def to_c(self): - if bpy.context.scene.decomp_compatible: - return '{{' + \ - '{' +\ - str(self.position[0]) + ', ' + \ - str(self.position[1]) + ', ' + \ - str(self.position[2]) + \ - '},' +\ - '0, ' + \ - '{' +\ - str(self.uv[0]) + ", " +\ - str(self.uv[1]) + \ - '},' +\ - '{' +\ - '0x' + format(self.colorOrNormal[0], 'X') + ', ' + \ - '0x' + format(self.colorOrNormal[1], 'X') + ', ' + \ - '0x' + format(self.colorOrNormal[2], 'X') + ', ' + \ - '0x' + format(self.colorOrNormal[3], 'X') + \ - '}' + '}}' - else: - return '{' + \ - str(self.position[0]) + ', ' + \ - str(self.position[1]) + ', ' + \ - str(self.position[2]) + ', ' + \ - '0, ' + \ - str(self.uv[0]) + ", " +\ - str(self.uv[1]) + ", " +\ - '0x' + format(self.colorOrNormal[0], 'X') + ', ' + \ - '0x' + format(self.colorOrNormal[1], 'X') + ', ' + \ - '0x' + format(self.colorOrNormal[2], 'X') + ', ' + \ - '0x' + format(self.colorOrNormal[3], 'X') + \ - '}' - - def to_sm64_decomp_s(self): - return 'vertex ' + \ - str(self.position[0]) + ', ' + \ - str(self.position[1]) + ', ' + \ - str(self.position[2]) + ', ' + \ - '0, ' + \ - '0x' + format(self.uv[0], 'X') + ", " +\ - '0x' + format(self.uv[1], 'X') + ', ' + \ - '0x' + format(self.colorOrNormal[0], 'X') + ', ' + \ - '0x' + format(self.colorOrNormal[1], 'X') + ', ' + \ - '0x' + format(self.colorOrNormal[2], 'X') + ', ' + \ - '0x' + format(self.colorOrNormal[3], 'X') + def __init__(self, position, uv, colorOrNormal): + self.position = position + self.uv = uv + self.colorOrNormal = colorOrNormal + + def to_binary(self): + signX = 1 if self.uv[0] >= 0 else -1 + signY = 1 if self.uv[1] >= 0 else -1 + uv = [self.uv[0] % (signX * 2 ** 15), self.uv[1] % (signY * 2 ** 15)] + return ( + self.position[0].to_bytes(2, "big", signed=True) + + self.position[1].to_bytes(2, "big", signed=True) + + self.position[2].to_bytes(2, "big", signed=True) + + bytearray([0x00, 0x00]) + + uv[0].to_bytes(2, "big", signed=True) + + uv[1].to_bytes(2, "big", signed=True) + + bytearray(self.colorOrNormal) + ) + + def to_c(self): + if bpy.context.scene.decomp_compatible: + return ( + "{{" + + "{" + + str(self.position[0]) + + ", " + + str(self.position[1]) + + ", " + + str(self.position[2]) + + "}," + + "0, " + + "{" + + str(self.uv[0]) + + ", " + + str(self.uv[1]) + + "}," + + "{" + + "0x" + + format(self.colorOrNormal[0], "X") + + ", " + + "0x" + + format(self.colorOrNormal[1], "X") + + ", " + + "0x" + + format(self.colorOrNormal[2], "X") + + ", " + + "0x" + + format(self.colorOrNormal[3], "X") + + "}" + + "}}" + ) + else: + return ( + "{" + + str(self.position[0]) + + ", " + + str(self.position[1]) + + ", " + + str(self.position[2]) + + ", " + + "0, " + + str(self.uv[0]) + + ", " + + str(self.uv[1]) + + ", " + + "0x" + + format(self.colorOrNormal[0], "X") + + ", " + + "0x" + + format(self.colorOrNormal[1], "X") + + ", " + + "0x" + + format(self.colorOrNormal[2], "X") + + ", " + + "0x" + + format(self.colorOrNormal[3], "X") + + "}" + ) + + def to_sm64_decomp_s(self): + return ( + "vertex " + + str(self.position[0]) + + ", " + + str(self.position[1]) + + ", " + + str(self.position[2]) + + ", " + + "0, " + + "0x" + + format(self.uv[0], "X") + + ", " + + "0x" + + format(self.uv[1], "X") + + ", " + + "0x" + + format(self.colorOrNormal[0], "X") + + ", " + + "0x" + + format(self.colorOrNormal[1], "X") + + ", " + + "0x" + + format(self.colorOrNormal[2], "X") + + ", " + + "0x" + + format(self.colorOrNormal[3], "X") + ) + class VtxList: - def __init__(self, name): - self.vertices = [] - self.name = name - self.startAddress = 0 - - def set_addr(self, startAddress): - startAddress = get64bitAlignedAddr(startAddress) - self.startAddress = startAddress - print('VtxList ' + self.name + ': ' + str(startAddress) + \ - ', ' + str(self.size())) - return startAddress, startAddress + self.size() - - def save_binary(self, romfile): - romfile.seek(self.startAddress) - romfile.write(self.to_binary()) - - def size(self): - return len(self.vertices) * VTX_SIZE - - def to_binary(self): - data = bytearray(0) - for vert in self.vertices: - data.extend(vert.to_binary()) - return data - - def to_c(self): - data = CData() - data.header = 'extern Vtx ' + self.name + '[' + str(len(self.vertices)) + '];\n' - data.source = 'Vtx ' + self.name + '[' + str(len(self.vertices)) + '] = {\n' - for vert in self.vertices: - data.source += '\t' + vert.to_c() + ',\n' - data.source += '};\n\n' - return data - - def to_sm64_decomp_s(self): - data = self.name + ':\n' - for vert in self.vertices: - data += vert.to_sm64_decomp_s() + '\n' - return data + def __init__(self, name): + self.vertices = [] + self.name = name + self.startAddress = 0 + + def set_addr(self, startAddress): + startAddress = get64bitAlignedAddr(startAddress) + self.startAddress = startAddress + print( + "VtxList " + self.name + ": " + str(startAddress) + ", " + str(self.size()) + ) + return startAddress, startAddress + self.size() + + def save_binary(self, romfile): + romfile.seek(self.startAddress) + romfile.write(self.to_binary()) + + def size(self): + return len(self.vertices) * VTX_SIZE + + def to_binary(self): + data = bytearray(0) + for vert in self.vertices: + data.extend(vert.to_binary()) + return data + + def to_c(self): + data = CData() + data.header = "extern Vtx " + self.name + "[" + str(len(self.vertices)) + "];\n" + data.source = "Vtx " + self.name + "[" + str(len(self.vertices)) + "] = {\n" + for vert in self.vertices: + data.source += "\t" + vert.to_c() + ",\n" + data.source += "};\n\n" + return data + + def to_sm64_decomp_s(self): + data = self.name + ":\n" + for vert in self.vertices: + data += vert.to_sm64_decomp_s() + "\n" + return data + class GfxList: - def __init__(self, name, tag, DLFormat): - self.commands = [] - self.name = name - self.startAddress = 0 - self.tag = tag - self.DLFormat = DLFormat - - def set_addr(self, startAddress, f3d): - startAddress = get64bitAlignedAddr(startAddress) - self.startAddress = startAddress - print('GfxList ' + self.name + ': ' + str(startAddress) + \ - ', ' + str(self.size(f3d))) - return startAddress, startAddress + self.size(f3d) - - def save_binary(self, romfile, f3d, segments): - print('GfxList ' + self.name + ': ' + str(self.startAddress) + \ - ', ' + str(self.size(f3d))) - romfile.seek(self.startAddress) - romfile.write(self.to_binary(f3d, segments)) - - def size(self, f3d): - size = 0 - for command in self.commands: - size += command.size(f3d) - return size - - # Size, including display lists called with SPDisplayList - def size_total(self,f3d): - size = 0 - for command in self.commands: - if isinstance(command, SPDisplayList) and command.displayList.DLFormat != DLFormat.Static: - size += command.displayList.size_total(f3d) - else: - size += command.size(f3d) - return size - - def get_ptr_addresses(self, f3d): - ptrs = [] - address = self.startAddress - for command in self.commands: - if type(command) in F3DClassesWithPointers: - for offset in command.get_ptr_offsets(f3d): - ptrs.append(address + offset) - address += command.size(f3d) - return ptrs - - def to_binary(self, f3d, segments): - data = bytearray(0) - for command in self.commands: - data.extend(command.to_binary(f3d, segments)) - - return data - - def to_c_static(self): - data = 'Gfx ' + self.name + '[] = {\n' - for command in self.commands: - data += '\t' + command.to_c(True) + ',\n' - data += '};\n\n' - return data - - def to_c_dynamic(self): - data = 'Gfx* ' + self.name + '(Gfx* glistp) {\n' - for command in self.commands: - data += '\t' + command.to_c(False) + ';\n' - data += '\treturn glistp;\n}\n\n' - return data - - def to_c(self, f3d): - data = CData() - if self.DLFormat == DLFormat.Static: - data.header = 'extern Gfx ' + self.name + '[];\n' - data.source = self.to_c_static() - elif self.DLFormat == DLFormat.Dynamic: - data.header = 'Gfx* ' + self.name + '(Gfx* glistp);\n' - data.source = self.to_c_dynamic() - else: - raise PluginError("Invalid GfxList format: " + str(self.DLFormat)) - return data - - def to_sm64_decomp_s(self): - data = 'glabel ' + self.name + '\n' - for command in self.commands: - data += command.to_sm64_decomp_s() + '\n' - return data + def __init__(self, name, tag, DLFormat): + self.commands = [] + self.name = name + self.startAddress = 0 + self.tag = tag + self.DLFormat = DLFormat + + def set_addr(self, startAddress, f3d): + startAddress = get64bitAlignedAddr(startAddress) + self.startAddress = startAddress + print( + "GfxList " + + self.name + + ": " + + str(startAddress) + + ", " + + str(self.size(f3d)) + ) + return startAddress, startAddress + self.size(f3d) + + def save_binary(self, romfile, f3d, segments): + print( + "GfxList " + + self.name + + ": " + + str(self.startAddress) + + ", " + + str(self.size(f3d)) + ) + romfile.seek(self.startAddress) + romfile.write(self.to_binary(f3d, segments)) + + def size(self, f3d): + size = 0 + for command in self.commands: + size += command.size(f3d) + return size + + # Size, including display lists called with SPDisplayList + def size_total(self, f3d): + size = 0 + for command in self.commands: + if ( + isinstance(command, SPDisplayList) + and command.displayList.DLFormat != DLFormat.Static + ): + size += command.displayList.size_total(f3d) + else: + size += command.size(f3d) + return size + + def get_ptr_addresses(self, f3d): + ptrs = [] + address = self.startAddress + for command in self.commands: + if type(command) in F3DClassesWithPointers: + for offset in command.get_ptr_offsets(f3d): + ptrs.append(address + offset) + address += command.size(f3d) + return ptrs + + def to_binary(self, f3d, segments): + data = bytearray(0) + for command in self.commands: + data.extend(command.to_binary(f3d, segments)) + + return data + + def to_c_static(self): + data = "Gfx " + self.name + "[] = {\n" + for command in self.commands: + data += "\t" + command.to_c(True) + ",\n" + data += "};\n\n" + return data + + def to_c_dynamic(self): + data = "Gfx* " + self.name + "(Gfx* glistp) {\n" + for command in self.commands: + data += "\t" + command.to_c(False) + ";\n" + data += "\treturn glistp;\n}\n\n" + return data + + def to_c(self, f3d): + data = CData() + if self.DLFormat == DLFormat.Static: + data.header = "extern Gfx " + self.name + "[];\n" + data.source = self.to_c_static() + elif self.DLFormat == DLFormat.Dynamic: + data.header = "Gfx* " + self.name + "(Gfx* glistp);\n" + data.source = self.to_c_dynamic() + else: + raise PluginError("Invalid GfxList format: " + str(self.DLFormat)) + return data + + def to_sm64_decomp_s(self): + data = "glabel " + self.name + "\n" + for command in self.commands: + data += command.to_sm64_decomp_s() + "\n" + return data + class FFogData: - def __init__(self, position = (970, 1000), color = (0,0,0,1)): - self.position = tuple(position) - self.color = ( - round(color[0], 8), - round(color[1], 8), - round(color[2], 8), - round(color[3], 8)) - - def __eq__(self, other): - return tuple(self.position) == tuple(other.position) and \ - tuple(self.color) == tuple(other.color) - - def makeKey(self): - return (self.position, self.color) - - def requiresKey(self, material): - return material.set_fog and material.use_global_fog - + def __init__(self, position=(970, 1000), color=(0, 0, 0, 1)): + self.position = tuple(position) + self.color = ( + round(color[0], 8), + round(color[1], 8), + round(color[2], 8), + round(color[3], 8), + ) + + def __eq__(self, other): + return tuple(self.position) == tuple(other.position) and tuple( + self.color + ) == tuple(other.color) + + def makeKey(self): + return (self.position, self.color) + + def requiresKey(self, material): + return material.set_fog and material.use_global_fog + + class FAreaData: - def __eq__(self, other): - return self.fog_data == other.fog_data + def __eq__(self, other): + return self.fog_data == other.fog_data + + def __init__(self, fog_data): + self.fog_data = fog_data - def __init__(self, fog_data): - self.fog_data = fog_data + def makeKey(self): + return self.fog_data.makeKey() + + def requiresKey(self, material): + return self.fog_data.requiresKey(material) - def makeKey(self): - return self.fog_data.makeKey() - - def requiresKey(self, material): - return self.fog_data.requiresKey(material) class FGlobalData: - def __init__(self): - # dict of area index : FFogData - self.area_data = {} - self.current_area_index = 1 - - def addAreaData(self, areaIndex : int, areaData : FAreaData): - if areaIndex in self.area_data: - raise ValueError("Error: Detected repeat FAreaData.") - self.area_data[areaIndex] = areaData - self.current_area_index = areaIndex - - def getCurrentAreaData(self): - if len(self.area_data) == 0: - return None - else: - return self.area_data[self.current_area_index] - - def getCurrentAreaKey(self, material): - if len(self.area_data) == 0: - return None - # No need to have area specific variants of a material if they don't use global fog. - # Without this, a non-global-fog material used across areas will have redefined duplicate light names. - elif not self.area_data[self.current_area_index].requiresKey(material): - return None - else: - return self.area_data[self.current_area_index].makeKey() + def __init__(self): + # dict of area index : FFogData + self.area_data = {} + self.current_area_index = 1 + + def addAreaData(self, areaIndex: int, areaData: FAreaData): + if areaIndex in self.area_data: + raise ValueError("Error: Detected repeat FAreaData.") + self.area_data[areaIndex] = areaData + self.current_area_index = areaIndex + + def getCurrentAreaData(self): + if len(self.area_data) == 0: + return None + else: + return self.area_data[self.current_area_index] + + def getCurrentAreaKey(self, material): + if len(self.area_data) == 0: + return None + # No need to have area specific variants of a material if they don't use global fog. + # Without this, a non-global-fog material used across areas will have redefined duplicate light names. + elif not self.area_data[self.current_area_index].requiresKey(material): + return None + else: + return self.area_data[self.current_area_index].makeKey() + class FModel: - def __init__(self, f3dType, isHWv1, name, DLFormat, matWriteMethod): - self.name = name # used for texture prefixing - # dict of light name : Lights - self.lights = {} - # dict of (texture, (texture format, palette format)) : FImage - self.textures = {} - # dict of (material, drawLayer, FAreaData): (FMaterial, (width, height)) - self.materials = {} - # dict of body part name : FMesh - self.meshes = {} - # GfxList - self.materialRevert = None - # F3D library - self.f3d = F3D(f3dType, isHWv1) - # array of FModel - self.subModels = [] - self.parentModel = None - - # dict of name : FLODGroup - self.LODGroups = {} - self.DLFormat = DLFormat - self.matWriteMethod = matWriteMethod - self.global_data = FGlobalData() - self.texturesSavedLastExport = 0 # hacky - - # Called before SPEndDisplayList - def onMaterialCommandsBuilt(self, gfxList, revertList, material, drawLayer): - return - - def getTextureSuffixFromFormat(self, texFmt): - return texFmt.lower() - - def getDrawLayerV3(self, obj): - return None - - def getRenderMode(self, drawLayer): - return None - - def addLODGroup(self, name, position, alwaysRenderFarthest): - if name in self.LODGroups: - raise PluginError("Duplicate LOD group: " + str(name)) - lod = FLODGroup(name, position, alwaysRenderFarthest, self.DLFormat) - self.LODGroups[name] = lod - return lod - - def addSubModel(self, subModel): - self.subModels.append(subModel) - subModel.parentModel = self - return subModel - - def addTexture(self, key, value, fMaterial): - fMaterial.usedImages.append(key) - self.textures[key] = value - - def addLight(self, key, value, fMaterial): - fMaterial.usedLights.append(key) - self.lights[key] = value - - def addMesh(self, name, namePrefix, drawLayer, isSkinned, contextObj): - meshName = getFMeshName(name, namePrefix, drawLayer, isSkinned) - checkUniqueBoneNames(self, meshName, name) - self.meshes[meshName] = FMesh(meshName, self.DLFormat) - - self.onAddMesh(self.meshes[meshName], contextObj) - - return self.meshes[meshName] - - def onAddMesh(self, fMesh, contextObj): - return - - def endDraw(self, fMesh, contextObj): - self.onEndDraw(fMesh, contextObj) - fMesh.draw.commands.append(SPEndDisplayList()) - - def onEndDraw(self, fMesh, contextObj): - return - - def getTextureAndHandleShared(self, imageKey): - # Check if texture is in self - if imageKey in self.textures: - fImage = self.textures[imageKey] - fPalette = self.textures[fImage.paletteKey] if fImage.paletteKey is not None else None - return fImage, fPalette - - if self.parentModel is not None: - # Check if texture is in parent - if imageKey in self.parentModel.textures: - fImage = self.parentModel.textures[imageKey] - fPalette = self.parentModel.textures[fImage.paletteKey] if fImage.paletteKey is not None else None - return fImage, fPalette - - # Check if texture is in siblings - for subModel in self.parentModel.subModels: - if imageKey in subModel.textures: - fImage = subModel.textures.pop(imageKey) - self.parentModel.textures[imageKey] = fImage - - paletteKey = fImage.paletteKey - fPalette = None - if paletteKey is not None: - fPalette = subModel.textures.pop(paletteKey) - self.parentModel.textures[paletteKey] = fPalette - return fImage, fPalette - return None, None - else: - return None, None - - def getLightAndHandleShared(self, lightName): - # Check if light is in self - if lightName in self.lights: - return self.lights[lightName] - - if self.parentModel is not None: - # Check if light is in parent - if lightName in self.parentModel.lights: - return self.parentModel.lights[lightName] - - # Check if light is in siblings - for subModel in self.parentModel.subModels: - if lightName in subModel.lights: - light = subModel.lights.pop(lightName) - self.parentModel.lights[lightName] = light - return light - else: - return None - - - def getMaterialAndHandleShared(self, materialKey): - # Check if material is in self - if materialKey in self.materials: - return self.materials[materialKey] - - if self.parentModel is not None: - # Check if material is in parent - if materialKey in self.parentModel.materials: - return self.parentModel.materials[materialKey] - - # Check if material is in siblings - for subModel in self.parentModel.subModels: - if materialKey in subModel.materials: - materialItem = subModel.materials.pop(materialKey) - self.parentModel.materials[materialKey] = materialItem - - # If material is in sibling, handle the material's textures as well. - for imageKey in materialItem[0].usedImages: - fImage, fPalette = self.getTextureAndHandleShared(imageKey) - if fImage is None: - raise PluginError("Error: If a material exists, its textures should exist too.") - - for lightName in materialItem[0].usedLights: - light = self.getLightAndHandleShared(lightName) - if light is None: - raise PluginError("Error: If a material exists, its lights should exist too.") - return materialItem - else: - return None - - def getAllMaterials(self): - materials = {} - materials.update(self.materials) - for subModel in self.subModels: - materials.update(subModel.getAllMaterials()) - return materials - - def get_ptr_addresses(self, f3d): - addresses = [] - for name, lod in self.LODGroups.items(): - addresses.extend(lod.get_ptr_addresses(f3d)) - for name, mesh in self.meshes.items(): - addresses.extend(mesh.get_ptr_addresses(f3d)) - for materialKey, (fMaterial, texDimensions) in self.materials.items(): - addresses.extend(fMaterial.get_ptr_addresses(f3d)) - if self.materialRevert is not None: - addresses.extend(self.materialRevert.get_ptr_addresses(f3d)) - return addresses - - def set_addr(self, startAddress): - addrRange = (startAddress, startAddress) - startAddrSet = False - for name, lod in self.LODGroups.items(): - addrRange = lod.set_addr(addrRange[1], self.f3d) - if not startAddrSet: - startAddrSet = True - startAddress = addrRange[0] - # Important to set mesh groups first, so that - # export address corrseponds to drawing start. - for name, mesh in self.meshes.items(): - addrRange = mesh.set_addr(addrRange[1], self.f3d) - if not startAddrSet: - startAddrSet = True - startAddress = addrRange[0] - for name, light in self.lights.items(): - addrRange = light.set_addr(addrRange[1]) - if not startAddrSet: - startAddrSet = True - startAddress = addrRange[0] - for info, texture in self.textures.items(): - addrRange = texture.set_addr(addrRange[1]) - if not startAddrSet: - startAddrSet = True - startAddress = addrRange[0] - for materialKey, (fMaterial, texDimensions) in self.materials.items(): - addrRange = fMaterial.set_addr(addrRange[1], self.f3d) - if not startAddrSet: - startAddrSet = True - startAddress = addrRange[0] - if self.materialRevert is not None: - addrRange = self.materialRevert.set_addr(addrRange[1], self.f3d) - if not startAddrSet: - startAddrSet = True - startAddress = addrRange[0] - for subModel in self.subModels: - addrRange = subModel.set_addr(addrRange[1]) - if not startAddrSet: - startAddrSet = True - startAddress = addrRange[0] - return startAddress, addrRange[1] - - def save_binary(self, romfile, segments): - for name, light in self.lights.items(): - light.save_binary(romfile) - for info, texture in self.textures.items(): - texture.save_binary(romfile) - for materialKey, (fMaterial, texDimensions) in self.materials.items(): - if fMaterial.useLargeTextures and (fMaterial.saveLargeTextures[0] or fMaterial.saveLargeTextures[0]): - raise PluginError("Large texture mode textures must have their texture specific 'Save As PNG' disabled for binary export.") - fMaterial.save_binary(romfile, self.f3d, segments) - for name, mesh in self.meshes.items(): - mesh.save_binary(romfile, self.f3d, segments) - for name, lod in self.LODGroups.items(): - lod.save_binary(romfile, self.f3d, segments) - if self.materialRevert is not None: - self.materialRevert.save_binary(romfile, self.f3d, segments) - for subModel in self.subModels: - subModel.save_binary(romfile, segments) - - def to_c_lights(self): - data = CData() - for name, light in self.lights.items(): - data.append(light.to_c()) - return data - - def to_c_textures(self, texCSeparate, savePNG, texDir, texArrayBitSize): - # since decomp is linux, don't use os.path.join - # on windows this results in '\', which is incorrect (should be '/') - if len(texDir) > 0 and texDir[-1] != '/': - texDir += '/' - data = CData() - for info, texture in self.textures.items(): - if savePNG or texture.isLargeTexture: - data.append(texture.to_c_tex_separate(texDir, texArrayBitSize)) - else: - data.append(texture.to_c(texArrayBitSize)) - return data - - def to_c_materials(self, gfxFormatter): - data = CData() - for materialKey, (fMaterial, texDimensions) in self.materials.items(): - if gfxFormatter.scrollMethod == ScrollMethod.Tile: - if fMaterial.material.DLFormat == DLFormat.Static: - raise PluginError("Tile scrolling cannot be done with static DLs.") - data.append(gfxFormatter.tileScrollMaterialToC(self.f3d, fMaterial)) - else: - data.append(fMaterial.to_c(self.f3d)) - return data - - def to_c_material_revert(self, gfxFormatter): - data = CData() - if self.materialRevert is not None: - data.append(self.materialRevert.to_c(self.f3d)) - return data - - def to_c(self, textureExportSettings, gfxFormatter): - texCSeparate = textureExportSettings.texCSeparate - savePNG = textureExportSettings.savePNG - texDir = textureExportSettings.includeDir - - staticData = CData() - dynamicData = CData() - texC = CData() - - # Source - staticData.append(self.to_c_lights()) - - texData = self.to_c_textures(texCSeparate, savePNG, texDir, gfxFormatter.texArrayBitSize) - staticData.header += texData.header - if texCSeparate: - texC.source += texData.source - else: - staticData.source += texData.source - - dynamicData.append(self.to_c_materials(gfxFormatter)) - - for name, lod in self.LODGroups.items(): - lodStatic, lodDynamic = lod.to_c(self.f3d, gfxFormatter) - staticData.append(lodStatic) - dynamicData.append(lodDynamic) - - for name, mesh in self.meshes.items(): - meshStatic, meshDynamic = mesh.to_c(self.f3d, gfxFormatter) - staticData.append(meshStatic) - dynamicData.append(meshDynamic) - - dynamicData.append(self.to_c_material_revert(gfxFormatter)) - - self.texturesSavedLastExport = self.save_textures(textureExportSettings.exportPath, not savePNG) - self.freePalettes() - return ExportCData(staticData, dynamicData, texC) - - def to_c_vertex_scroll(self, scrollName, gfxFormatter): - scrollData = CData() - for name, mesh in self.meshes.items(): - scrollData.append(mesh.to_c_vertex_scroll(gfxFormatter)) - - hasScrolling = len(scrollData.header) > 0 - - scrollDefinesSplit = scrollData.header.split('extern void ') - scrollData.source += 'void scroll_' + scrollName + '() {\n' - for scrollFunc in scrollDefinesSplit: - if scrollFunc == '': - continue - scrollData.source += '\t' + scrollFunc - scrollData.source += '}\n' - - scrollData.header += 'extern void scroll_' + scrollName + '();\n' - return scrollData, hasScrolling - - def save_textures(self, dirpath, largeTexturesOnly): - texturesSaved = 0 - for (image, texInfo), texture in self.textures.items(): - if texInfo[1] == 'PAL' or (largeTexturesOnly and not texture.isLargeTexture): - continue - - # remove '.inc.c' - imageFileName = texture.filename[:-6] + '.png' - - # image.save_render(os.path.join(dirpath, imageFileName)) - - isPacked = image.packed_file is not None - if not isPacked: - image.pack() - oldpath = image.filepath - try: - image.filepath = \ - bpy.path.abspath(os.path.join(dirpath, imageFileName)) - image.save() - texturesSaved += 1 - if not isPacked: - image.unpack() - except Exception as e: - image.filepath = oldpath - raise Exception(str(e)) - image.filepath = oldpath - return texturesSaved - - def freePalettes(self): - # Palettes no longer saved - return - for (image, texInfo), texture in self.textures.items(): - #texDict[name] = texture.to_c_data() + '\n' - if texInfo[1] == 'PAL': - bpy.data.images.remove(image) + def __init__(self, f3dType, isHWv1, name, DLFormat, matWriteMethod): + self.name = name # used for texture prefixing + # dict of light name : Lights + self.lights = {} + # dict of (texture, (texture format, palette format)) : FImage + self.textures = {} + # dict of (material, drawLayer, FAreaData): (FMaterial, (width, height)) + self.materials = {} + # dict of body part name : FMesh + self.meshes = {} + # GfxList + self.materialRevert = None + # F3D library + self.f3d = F3D(f3dType, isHWv1) + # array of FModel + self.subModels = [] + self.parentModel = None + + # dict of name : FLODGroup + self.LODGroups = {} + self.DLFormat = DLFormat + self.matWriteMethod = matWriteMethod + self.global_data = FGlobalData() + self.texturesSavedLastExport = 0 # hacky + + # Called before SPEndDisplayList + def onMaterialCommandsBuilt(self, gfxList, revertList, material, drawLayer): + return + + def getTextureSuffixFromFormat(self, texFmt): + return texFmt.lower() + + def getDrawLayerV3(self, obj): + return None + + def getRenderMode(self, drawLayer): + return None + + def addLODGroup(self, name, position, alwaysRenderFarthest): + if name in self.LODGroups: + raise PluginError("Duplicate LOD group: " + str(name)) + lod = FLODGroup(name, position, alwaysRenderFarthest, self.DLFormat) + self.LODGroups[name] = lod + return lod + + def addSubModel(self, subModel): + self.subModels.append(subModel) + subModel.parentModel = self + return subModel + + def addTexture(self, key, value, fMaterial): + fMaterial.usedImages.append(key) + self.textures[key] = value + + def addLight(self, key, value, fMaterial): + fMaterial.usedLights.append(key) + self.lights[key] = value + + def addMesh(self, name, namePrefix, drawLayer, isSkinned, contextObj): + meshName = getFMeshName(name, namePrefix, drawLayer, isSkinned) + checkUniqueBoneNames(self, meshName, name) + self.meshes[meshName] = FMesh(meshName, self.DLFormat) + + self.onAddMesh(self.meshes[meshName], contextObj) + + return self.meshes[meshName] + + def onAddMesh(self, fMesh, contextObj): + return + + def endDraw(self, fMesh, contextObj): + self.onEndDraw(fMesh, contextObj) + fMesh.draw.commands.append(SPEndDisplayList()) + + def onEndDraw(self, fMesh, contextObj): + return + + def getTextureAndHandleShared(self, imageKey): + # Check if texture is in self + if imageKey in self.textures: + fImage = self.textures[imageKey] + fPalette = ( + self.textures[fImage.paletteKey] + if fImage.paletteKey is not None + else None + ) + return fImage, fPalette + + if self.parentModel is not None: + # Check if texture is in parent + if imageKey in self.parentModel.textures: + fImage = self.parentModel.textures[imageKey] + fPalette = ( + self.parentModel.textures[fImage.paletteKey] + if fImage.paletteKey is not None + else None + ) + return fImage, fPalette + + # Check if texture is in siblings + for subModel in self.parentModel.subModels: + if imageKey in subModel.textures: + fImage = subModel.textures.pop(imageKey) + self.parentModel.textures[imageKey] = fImage + + paletteKey = fImage.paletteKey + fPalette = None + if paletteKey is not None: + fPalette = subModel.textures.pop(paletteKey) + self.parentModel.textures[paletteKey] = fPalette + return fImage, fPalette + return None, None + else: + return None, None + + def getLightAndHandleShared(self, lightName): + # Check if light is in self + if lightName in self.lights: + return self.lights[lightName] + + if self.parentModel is not None: + # Check if light is in parent + if lightName in self.parentModel.lights: + return self.parentModel.lights[lightName] + + # Check if light is in siblings + for subModel in self.parentModel.subModels: + if lightName in subModel.lights: + light = subModel.lights.pop(lightName) + self.parentModel.lights[lightName] = light + return light + else: + return None + + def getMaterialAndHandleShared(self, materialKey): + # Check if material is in self + if materialKey in self.materials: + return self.materials[materialKey] + + if self.parentModel is not None: + # Check if material is in parent + if materialKey in self.parentModel.materials: + return self.parentModel.materials[materialKey] + + # Check if material is in siblings + for subModel in self.parentModel.subModels: + if materialKey in subModel.materials: + materialItem = subModel.materials.pop(materialKey) + self.parentModel.materials[materialKey] = materialItem + + # If material is in sibling, handle the material's textures as well. + for imageKey in materialItem[0].usedImages: + fImage, fPalette = self.getTextureAndHandleShared(imageKey) + if fImage is None: + raise PluginError( + "Error: If a material exists, its textures should exist too." + ) + + for lightName in materialItem[0].usedLights: + light = self.getLightAndHandleShared(lightName) + if light is None: + raise PluginError( + "Error: If a material exists, its lights should exist too." + ) + return materialItem + else: + return None + + def getAllMaterials(self): + materials = {} + materials.update(self.materials) + for subModel in self.subModels: + materials.update(subModel.getAllMaterials()) + return materials + + def get_ptr_addresses(self, f3d): + addresses = [] + for name, lod in self.LODGroups.items(): + addresses.extend(lod.get_ptr_addresses(f3d)) + for name, mesh in self.meshes.items(): + addresses.extend(mesh.get_ptr_addresses(f3d)) + for materialKey, (fMaterial, texDimensions) in self.materials.items(): + addresses.extend(fMaterial.get_ptr_addresses(f3d)) + if self.materialRevert is not None: + addresses.extend(self.materialRevert.get_ptr_addresses(f3d)) + return addresses + + def set_addr(self, startAddress): + addrRange = (startAddress, startAddress) + startAddrSet = False + for name, lod in self.LODGroups.items(): + addrRange = lod.set_addr(addrRange[1], self.f3d) + if not startAddrSet: + startAddrSet = True + startAddress = addrRange[0] + # Important to set mesh groups first, so that + # export address corrseponds to drawing start. + for name, mesh in self.meshes.items(): + addrRange = mesh.set_addr(addrRange[1], self.f3d) + if not startAddrSet: + startAddrSet = True + startAddress = addrRange[0] + for name, light in self.lights.items(): + addrRange = light.set_addr(addrRange[1]) + if not startAddrSet: + startAddrSet = True + startAddress = addrRange[0] + for info, texture in self.textures.items(): + addrRange = texture.set_addr(addrRange[1]) + if not startAddrSet: + startAddrSet = True + startAddress = addrRange[0] + for materialKey, (fMaterial, texDimensions) in self.materials.items(): + addrRange = fMaterial.set_addr(addrRange[1], self.f3d) + if not startAddrSet: + startAddrSet = True + startAddress = addrRange[0] + if self.materialRevert is not None: + addrRange = self.materialRevert.set_addr(addrRange[1], self.f3d) + if not startAddrSet: + startAddrSet = True + startAddress = addrRange[0] + for subModel in self.subModels: + addrRange = subModel.set_addr(addrRange[1]) + if not startAddrSet: + startAddrSet = True + startAddress = addrRange[0] + return startAddress, addrRange[1] + + def save_binary(self, romfile, segments): + for name, light in self.lights.items(): + light.save_binary(romfile) + for info, texture in self.textures.items(): + texture.save_binary(romfile) + for materialKey, (fMaterial, texDimensions) in self.materials.items(): + if fMaterial.useLargeTextures and ( + fMaterial.saveLargeTextures[0] or fMaterial.saveLargeTextures[0] + ): + raise PluginError( + "Large texture mode textures must have their texture specific 'Save As PNG' disabled for binary export." + ) + fMaterial.save_binary(romfile, self.f3d, segments) + for name, mesh in self.meshes.items(): + mesh.save_binary(romfile, self.f3d, segments) + for name, lod in self.LODGroups.items(): + lod.save_binary(romfile, self.f3d, segments) + if self.materialRevert is not None: + self.materialRevert.save_binary(romfile, self.f3d, segments) + for subModel in self.subModels: + subModel.save_binary(romfile, segments) + + def to_c_lights(self): + data = CData() + for name, light in self.lights.items(): + data.append(light.to_c()) + return data + + def to_c_textures(self, texCSeparate, savePNG, texDir, texArrayBitSize): + # since decomp is linux, don't use os.path.join + # on windows this results in '\', which is incorrect (should be '/') + if len(texDir) > 0 and texDir[-1] != "/": + texDir += "/" + data = CData() + for info, texture in self.textures.items(): + if savePNG or texture.isLargeTexture: + data.append(texture.to_c_tex_separate(texDir, texArrayBitSize)) + else: + data.append(texture.to_c(texArrayBitSize)) + return data + + def to_c_materials(self, gfxFormatter): + data = CData() + for materialKey, (fMaterial, texDimensions) in self.materials.items(): + if gfxFormatter.scrollMethod == ScrollMethod.Tile: + if fMaterial.material.DLFormat == DLFormat.Static: + raise PluginError("Tile scrolling cannot be done with static DLs.") + data.append(gfxFormatter.tileScrollMaterialToC(self.f3d, fMaterial)) + else: + data.append(fMaterial.to_c(self.f3d)) + return data + + def to_c_material_revert(self, gfxFormatter): + data = CData() + if self.materialRevert is not None: + data.append(self.materialRevert.to_c(self.f3d)) + return data + + def to_c(self, textureExportSettings, gfxFormatter): + texCSeparate = textureExportSettings.texCSeparate + savePNG = textureExportSettings.savePNG + texDir = textureExportSettings.includeDir + + staticData = CData() + dynamicData = CData() + texC = CData() + + # Source + staticData.append(self.to_c_lights()) + + texData = self.to_c_textures( + texCSeparate, savePNG, texDir, gfxFormatter.texArrayBitSize + ) + staticData.header += texData.header + if texCSeparate: + texC.source += texData.source + else: + staticData.source += texData.source + + dynamicData.append(self.to_c_materials(gfxFormatter)) + + for name, lod in self.LODGroups.items(): + lodStatic, lodDynamic = lod.to_c(self.f3d, gfxFormatter) + staticData.append(lodStatic) + dynamicData.append(lodDynamic) + + for name, mesh in self.meshes.items(): + meshStatic, meshDynamic = mesh.to_c(self.f3d, gfxFormatter) + staticData.append(meshStatic) + dynamicData.append(meshDynamic) + + dynamicData.append(self.to_c_material_revert(gfxFormatter)) + + self.texturesSavedLastExport = self.save_textures( + textureExportSettings.exportPath, not savePNG + ) + self.freePalettes() + return ExportCData(staticData, dynamicData, texC) + + def to_c_vertex_scroll(self, scrollName, gfxFormatter): + scrollData = CData() + for name, mesh in self.meshes.items(): + scrollData.append(mesh.to_c_vertex_scroll(gfxFormatter)) + + hasScrolling = len(scrollData.header) > 0 + + scrollDefinesSplit = scrollData.header.split("extern void ") + scrollData.source += "void scroll_" + scrollName + "() {\n" + for scrollFunc in scrollDefinesSplit: + if scrollFunc == "": + continue + scrollData.source += "\t" + scrollFunc + scrollData.source += "}\n" + + scrollData.header += "extern void scroll_" + scrollName + "();\n" + return scrollData, hasScrolling + + def save_textures(self, dirpath, largeTexturesOnly): + texturesSaved = 0 + for (image, texInfo), texture in self.textures.items(): + if texInfo[1] == "PAL" or ( + largeTexturesOnly and not texture.isLargeTexture + ): + continue + + # remove '.inc.c' + imageFileName = texture.filename[:-6] + ".png" + + # image.save_render(os.path.join(dirpath, imageFileName)) + + isPacked = image.packed_file is not None + if not isPacked: + image.pack() + oldpath = image.filepath + try: + image.filepath = bpy.path.abspath(os.path.join(dirpath, imageFileName)) + image.save() + texturesSaved += 1 + if not isPacked: + image.unpack() + except Exception as e: + image.filepath = oldpath + raise Exception(str(e)) + image.filepath = oldpath + return texturesSaved + + def freePalettes(self): + # Palettes no longer saved + return + for (image, texInfo), texture in self.textures.items(): + # texDict[name] = texture.to_c_data() + '\n' + if texInfo[1] == "PAL": + bpy.data.images.remove(image) + class FTexRect(FModel): - def __init__(self, f3dType, isHWv1, name, matWriteMethod): - self.draw = GfxList(name, GfxListTag.Draw, DLFormat.Dynamic) - FModel.__init__(self, f3dType, isHWv1, name, DLFormat, matWriteMethod) - - def to_c(self, savePNG, texDir, gfxFormatter): - staticData = CData() - dynamicData = CData() - # since decomp is linux, don't use os.path.join - # on windows this results in '\', which is incorrect (should be '/') - if texDir[-1] != '/': - texDir += '/' - for info, texture in self.textures.items(): - if savePNG: - staticData.append(texture.to_c_tex_separate(texDir, gfxFormatter.texArrayBitSize)) - else: - staticData.append(texture.to_c(gfxFormatter.texArrayBitSize)) - dynamicData.append(self.draw.to_c(self.f3d)) - return ExportCData(staticData, dynamicData, CData()) + def __init__(self, f3dType, isHWv1, name, matWriteMethod): + self.draw = GfxList(name, GfxListTag.Draw, DLFormat.Dynamic) + FModel.__init__(self, f3dType, isHWv1, name, DLFormat, matWriteMethod) + + def to_c(self, savePNG, texDir, gfxFormatter): + staticData = CData() + dynamicData = CData() + # since decomp is linux, don't use os.path.join + # on windows this results in '\', which is incorrect (should be '/') + if texDir[-1] != "/": + texDir += "/" + for info, texture in self.textures.items(): + if savePNG: + staticData.append( + texture.to_c_tex_separate(texDir, gfxFormatter.texArrayBitSize) + ) + else: + staticData.append(texture.to_c(gfxFormatter.texArrayBitSize)) + dynamicData.append(self.draw.to_c(self.f3d)) + return ExportCData(staticData, dynamicData, CData()) + class FLODGroup: - def __init__(self, name, position, alwaysRenderFarthest, DLFormat): - self.name = name - self.DLFormat = DLFormat - self.lodEntries = [] # list of tuple(z, DL) - self.alwaysRenderFarthest = alwaysRenderFarthest - - self.vertexList = VtxList(self.get_vtx_name()) - self.vertexList.vertices.append(Vtx(position, [0,0], [0,0,0,0])) - - self.draw = None - self.subdraws = [] - self.drawCommandsBuilt = False - - def add_lod(self, displayList, zValue): - if displayList is not None: - self.lodEntries.append((abs(int(round(zValue))), displayList)) - - def get_dl_name(self): - return self.name + "_lod" - - def get_vtx_name(self): - return self.name + "_vtx" - - def get_ptr_addresses(self, f3d): - addresses = self.draw.get_ptr_addresses(f3d) - for displayList in self.subdraws: - if displayList is not None: - addresses.extend(displayList.get_ptr_addresses(f3d)) - return addresses - - def set_addr(self, startAddress, f3d): - self.create_data() - addrRange = self.draw.set_addr(startAddress, f3d) - for displayList in self.subdraws: - if displayList is not None: - addrRange = displayList.set_addr(addrRange[1], f3d) - addrRange = self.vertexList.set_addr(addrRange[1]) - return startAddress, addrRange[1] - - def save_binary(self, romfile, f3d, segments): - self.draw.save_binary(romfile, f3d, segments) - for displayList in self.subdraws: - if displayList is not None: - displayList.save_binary(romfile,f3d, segments) - self.vertexList.save_binary(romfile) - - def to_c(self, f3d, gfxFormatter): - self.create_data() - - staticData = CData() - dynamicData = CData() - staticData.append(self.vertexList.to_c()) - for displayList in self.subdraws: - if displayList is not None: - dynamicData.append(displayList.to_c(f3d)) - dynamicData.append(self.draw.to_c(f3d)) - return staticData, dynamicData - - def create_data(self): - if self.drawCommandsBuilt: - return - - self.drawCommandsBuilt = True - self.draw = GfxList(self.get_dl_name(), GfxListTag.Draw, self.DLFormat) - - index = 0 - self.draw.commands.append(SPVertex(self.vertexList, 0, 1, index)) - - sortedList = sorted(self.lodEntries, key = lambda tup: tup[0]) - hasAnyDLs = False - for item in sortedList: - - # If no DLs are called, we still need an empty DL to preserve LOD. - if len(item[1].commands) < 2: - DL = item[1] - self.subdraws.append(DL) - # If one DL is called, we can just call it directly. - elif len(item[1].commands) == 2: # branch DL, then end DL: - DL = item[1].commands[0].displayList - hasAnyDLs = True - # If more DLs are called, we have to use a sub DL. - else: - DL = item[1] - self.subdraws.append(DL) - hasAnyDLs = True - - self.draw.commands.append(SPBranchLessZraw(DL, index, item[0])) - - if len(sortedList) > 0: - lastCmd = self.draw.commands[-1] - if self.alwaysRenderFarthest: - self.draw.commands.remove(lastCmd) - self.draw.commands.append(SPBranchList(lastCmd.dl)) - - if not hasAnyDLs: - self.draw.commands.clear() - self.subdraws.clear() - - self.draw.commands.append(SPEndDisplayList()) + def __init__(self, name, position, alwaysRenderFarthest, DLFormat): + self.name = name + self.DLFormat = DLFormat + self.lodEntries = [] # list of tuple(z, DL) + self.alwaysRenderFarthest = alwaysRenderFarthest + + self.vertexList = VtxList(self.get_vtx_name()) + self.vertexList.vertices.append(Vtx(position, [0, 0], [0, 0, 0, 0])) + + self.draw = None + self.subdraws = [] + self.drawCommandsBuilt = False + + def add_lod(self, displayList, zValue): + if displayList is not None: + self.lodEntries.append((abs(int(round(zValue))), displayList)) + + def get_dl_name(self): + return self.name + "_lod" + + def get_vtx_name(self): + return self.name + "_vtx" + + def get_ptr_addresses(self, f3d): + addresses = self.draw.get_ptr_addresses(f3d) + for displayList in self.subdraws: + if displayList is not None: + addresses.extend(displayList.get_ptr_addresses(f3d)) + return addresses + + def set_addr(self, startAddress, f3d): + self.create_data() + addrRange = self.draw.set_addr(startAddress, f3d) + for displayList in self.subdraws: + if displayList is not None: + addrRange = displayList.set_addr(addrRange[1], f3d) + addrRange = self.vertexList.set_addr(addrRange[1]) + return startAddress, addrRange[1] + + def save_binary(self, romfile, f3d, segments): + self.draw.save_binary(romfile, f3d, segments) + for displayList in self.subdraws: + if displayList is not None: + displayList.save_binary(romfile, f3d, segments) + self.vertexList.save_binary(romfile) + + def to_c(self, f3d, gfxFormatter): + self.create_data() + + staticData = CData() + dynamicData = CData() + staticData.append(self.vertexList.to_c()) + for displayList in self.subdraws: + if displayList is not None: + dynamicData.append(displayList.to_c(f3d)) + dynamicData.append(self.draw.to_c(f3d)) + return staticData, dynamicData + + def create_data(self): + if self.drawCommandsBuilt: + return + + self.drawCommandsBuilt = True + self.draw = GfxList(self.get_dl_name(), GfxListTag.Draw, self.DLFormat) + + index = 0 + self.draw.commands.append(SPVertex(self.vertexList, 0, 1, index)) + + sortedList = sorted(self.lodEntries, key=lambda tup: tup[0]) + hasAnyDLs = False + for item in sortedList: + + # If no DLs are called, we still need an empty DL to preserve LOD. + if len(item[1].commands) < 2: + DL = item[1] + self.subdraws.append(DL) + # If one DL is called, we can just call it directly. + elif len(item[1].commands) == 2: # branch DL, then end DL: + DL = item[1].commands[0].displayList + hasAnyDLs = True + # If more DLs are called, we have to use a sub DL. + else: + DL = item[1] + self.subdraws.append(DL) + hasAnyDLs = True + + self.draw.commands.append(SPBranchLessZraw(DL, index, item[0])) + + if len(sortedList) > 0: + lastCmd = self.draw.commands[-1] + if self.alwaysRenderFarthest: + self.draw.commands.remove(lastCmd) + self.draw.commands.append(SPBranchList(lastCmd.dl)) + + if not hasAnyDLs: + self.draw.commands.clear() + self.subdraws.clear() + + self.draw.commands.append(SPEndDisplayList()) class FMesh: - def __init__(self, name, DLFormat): - self.name = name - # GfxList - self.draw = GfxList(name, GfxListTag.Draw, DLFormat) - # list of FTriGroup - self.triangleGroups: list[FTriGroup] = [] - # VtxList - self.cullVertexList = None - # dict of (override Material, specified Material to override, - # overrideType, draw layer) : GfxList - self.drawMatOverrides = {} - self.DLFormat = DLFormat - - # Used to avoid consecutive calls to the same material if unnecessary - self.currentFMaterial = None - - def add_material_call(self, fMaterial): - sameMaterial = self.currentFMaterial is fMaterial - if not sameMaterial: - self.currentFMaterial = fMaterial - self.draw.commands.append(SPDisplayList(fMaterial.material)) - else: - lastCommand = self.draw.commands[-1] - if isinstance(lastCommand, SPDisplayList) and \ - lastCommand.displayList == fMaterial.revert: - self.draw.commands.remove(lastCommand) - - def add_cull_vtx(self): - self.cullVertexList = VtxList(self.name + '_vtx_cull') - - def get_ptr_addresses(self, f3d): - addresses = self.draw.get_ptr_addresses(f3d) - for triGroup in self.triangleGroups: - addresses.extend(triGroup.get_ptr_addresses(f3d)) - for materialTuple, drawOverride in self.drawMatOverrides.items(): - addresses.extend(drawOverride.get_ptr_addresses(f3d)) - return addresses - - def tri_group_new(self, fMaterial): - # Always static DL - triGroup = FTriGroup(self.name, len(self.triangleGroups), fMaterial) - self.triangleGroups.append(triGroup) - return triGroup - - def set_addr(self, startAddress, f3d): - addrRange = self.draw.set_addr(startAddress, f3d) - startAddress = addrRange[0] - for triGroup in self.triangleGroups: - addrRange = triGroup.set_addr(addrRange[1], f3d) - if self.cullVertexList is not None: - addrRange = self.cullVertexList.set_addr(addrRange[1]) - for materialTuple, drawOverride in self.drawMatOverrides.items(): - addrRange = drawOverride.set_addr(addrRange[1], f3d) - return startAddress, addrRange[1] - - def save_binary(self, romfile, f3d, segments): - self.draw.save_binary(romfile, f3d, segments) - for triGroup in self.triangleGroups: - triGroup.save_binary(romfile, f3d, segments) - if self.cullVertexList is not None: - self.cullVertexList.save_binary(romfile) - for materialTuple, drawOverride in self.drawMatOverrides.items(): - drawOverride.save_binary(romfile, f3d, segments) - - def to_c(self, f3d, gfxFormatter): - staticData = CData() - if self.cullVertexList is not None: - staticData.append(self.cullVertexList.to_c()) - for triGroup in self.triangleGroups: - staticData.append(triGroup.to_c(f3d, gfxFormatter)) - dynamicData = gfxFormatter.drawToC(f3d, self.draw) - for materialTuple, drawOverride in self.drawMatOverrides.items(): - dynamicData.append(drawOverride.to_c(f3d)) - return staticData, dynamicData - - def to_c_vertex_scroll(self, gfxFormatter): - cData = CData() - scrollData = [] - stsScrollData = [] - for triGroup in self.triangleGroups: - data, sts_data = triGroup.to_c_vertex_scroll(gfxFormatter) - cData.append(data) - if sts_data is not None: - stsScrollData.append(sts_data) - - filtered_sts: list[CData] = [] - for d in stsScrollData: - if not d.header or not d.source: - continue - new_one = True - for stsd in filtered_sts: - if stsd.header == d.header or stsd.source == d.source: - new_one = False - break - if new_one: - filtered_sts.append(d) - - for fsts in filtered_sts: - cData.append(fsts) + def __init__(self, name, DLFormat): + self.name = name + # GfxList + self.draw = GfxList(name, GfxListTag.Draw, DLFormat) + # list of FTriGroup + self.triangleGroups: list[FTriGroup] = [] + # VtxList + self.cullVertexList = None + # dict of (override Material, specified Material to override, + # overrideType, draw layer) : GfxList + self.drawMatOverrides = {} + self.DLFormat = DLFormat + + # Used to avoid consecutive calls to the same material if unnecessary + self.currentFMaterial = None + + def add_material_call(self, fMaterial): + sameMaterial = self.currentFMaterial is fMaterial + if not sameMaterial: + self.currentFMaterial = fMaterial + self.draw.commands.append(SPDisplayList(fMaterial.material)) + else: + lastCommand = self.draw.commands[-1] + if ( + isinstance(lastCommand, SPDisplayList) + and lastCommand.displayList == fMaterial.revert + ): + self.draw.commands.remove(lastCommand) + + def add_cull_vtx(self): + self.cullVertexList = VtxList(self.name + "_vtx_cull") + + def get_ptr_addresses(self, f3d): + addresses = self.draw.get_ptr_addresses(f3d) + for triGroup in self.triangleGroups: + addresses.extend(triGroup.get_ptr_addresses(f3d)) + for materialTuple, drawOverride in self.drawMatOverrides.items(): + addresses.extend(drawOverride.get_ptr_addresses(f3d)) + return addresses + + def tri_group_new(self, fMaterial): + # Always static DL + triGroup = FTriGroup(self.name, len(self.triangleGroups), fMaterial) + self.triangleGroups.append(triGroup) + return triGroup + + def set_addr(self, startAddress, f3d): + addrRange = self.draw.set_addr(startAddress, f3d) + startAddress = addrRange[0] + for triGroup in self.triangleGroups: + addrRange = triGroup.set_addr(addrRange[1], f3d) + if self.cullVertexList is not None: + addrRange = self.cullVertexList.set_addr(addrRange[1]) + for materialTuple, drawOverride in self.drawMatOverrides.items(): + addrRange = drawOverride.set_addr(addrRange[1], f3d) + return startAddress, addrRange[1] + + def save_binary(self, romfile, f3d, segments): + self.draw.save_binary(romfile, f3d, segments) + for triGroup in self.triangleGroups: + triGroup.save_binary(romfile, f3d, segments) + if self.cullVertexList is not None: + self.cullVertexList.save_binary(romfile) + for materialTuple, drawOverride in self.drawMatOverrides.items(): + drawOverride.save_binary(romfile, f3d, segments) + + def to_c(self, f3d, gfxFormatter): + staticData = CData() + if self.cullVertexList is not None: + staticData.append(self.cullVertexList.to_c()) + for triGroup in self.triangleGroups: + staticData.append(triGroup.to_c(f3d, gfxFormatter)) + dynamicData = gfxFormatter.drawToC(f3d, self.draw) + for materialTuple, drawOverride in self.drawMatOverrides.items(): + dynamicData.append(drawOverride.to_c(f3d)) + return staticData, dynamicData + + def to_c_vertex_scroll(self, gfxFormatter): + cData = CData() + scrollData = [] + stsScrollData = [] + for triGroup in self.triangleGroups: + data, sts_data = triGroup.to_c_vertex_scroll(gfxFormatter) + cData.append(data) + if sts_data is not None: + stsScrollData.append(sts_data) + + filtered_sts: list[CData] = [] + for d in stsScrollData: + if not d.header or not d.source: + continue + new_one = True + for stsd in filtered_sts: + if stsd.header == d.header or stsd.source == d.source: + new_one = False + break + if new_one: + filtered_sts.append(d) + + for fsts in filtered_sts: + cData.append(fsts) + + return cData - return cData class FTriGroup: - def __init__(self, name, index, fMaterial): - self.fMaterial = fMaterial - self.vertexList = VtxList(name + '_vtx_' + str(index)) - self.triList = GfxList(name + '_tri_' + str(index), GfxListTag.Geometry, DLFormat.Static) - - def get_ptr_addresses(self, f3d): - return self.triList.get_ptr_addresses(f3d) - - def set_addr(self, startAddress, f3d): - addrRange = self.triList.set_addr(startAddress, f3d) - addrRange = self.vertexList.set_addr(addrRange[1]) - return startAddress, addrRange[1] - - def save_binary(self, romfile, f3d, segments): - self.triList.save_binary(romfile, f3d, segments) - self.vertexList.save_binary(romfile) - - def to_c(self, f3d, gfxFormatter): - data = CData() - data.append(self.vertexList.to_c()) - data.append(self.triList.to_c(f3d)) - return data - - def to_c_vertex_scroll(self, gfxFormatter: GfxFormatter): - if self.fMaterial.scrollData is not None: - return gfxFormatter.vertexScrollToC( - self.fMaterial, - self.vertexList.name, - len(self.vertexList.vertices) - ) - else: - return CData(), CData() - + def __init__(self, name, index, fMaterial): + self.fMaterial = fMaterial + self.vertexList = VtxList(name + "_vtx_" + str(index)) + self.triList = GfxList( + name + "_tri_" + str(index), GfxListTag.Geometry, DLFormat.Static + ) + + def get_ptr_addresses(self, f3d): + return self.triList.get_ptr_addresses(f3d) + + def set_addr(self, startAddress, f3d): + addrRange = self.triList.set_addr(startAddress, f3d) + addrRange = self.vertexList.set_addr(addrRange[1]) + return startAddress, addrRange[1] + + def save_binary(self, romfile, f3d, segments): + self.triList.save_binary(romfile, f3d, segments) + self.vertexList.save_binary(romfile) + + def to_c(self, f3d, gfxFormatter): + data = CData() + data.append(self.vertexList.to_c()) + data.append(self.triList.to_c(f3d)) + return data + + def to_c_vertex_scroll(self, gfxFormatter: GfxFormatter): + if self.fMaterial.scrollData is not None: + return gfxFormatter.vertexScrollToC( + self.fMaterial, self.vertexList.name, len(self.vertexList.vertices) + ) + else: + return CData(), CData() + + class FScrollDataField: - def __init__(self): - self.animType = "None" - self.speed = 0 + def __init__(self): + self.animType = "None" + self.speed = 0 + + self.amplitude = 0 + self.frequency = 0 + self.offset = 0 - self.amplitude = 0 - self.frequency = 0 - self.offset = 0 + self.noiseAmplitude = 0 - self.noiseAmplitude = 0 class FScrollData: - def __init__(self): - self.fields = [ - [FScrollDataField(), - FScrollDataField()], - - [FScrollDataField(), - FScrollDataField()] - ] - self.dimensions = [0, 0] - self.tile_scroll_tex0 = FSetTileSizeScrollField() - self.tile_scroll_tex1 = FSetTileSizeScrollField() - self.tile_scroll_exported = False + def __init__(self): + self.fields = [ + [FScrollDataField(), FScrollDataField()], + [FScrollDataField(), FScrollDataField()], + ] + self.dimensions = [0, 0] + self.tile_scroll_tex0 = FSetTileSizeScrollField() + self.tile_scroll_tex1 = FSetTileSizeScrollField() + self.tile_scroll_exported = False + def get_f3d_mat_from_version(material: bpy.types.Material): - return material.f3d_mat if material.mat_ver > 3 else material + return material.f3d_mat if material.mat_ver > 3 else material + class FMaterial: - def __init__(self, name, DLFormat): - self.material = GfxList('mat_' + name, GfxListTag.Material, DLFormat) - self.revert = GfxList('mat_revert_' + name, GfxListTag.MaterialRevert, DLFormat.Static) - self.DLFormat = DLFormat - self.scrollData = FScrollData() - - # Used for keeping track of shared resources in FModel hierarchy - self.usedImages = [] # array of (image, texFormat, paletteType) = imageKey - self.usedLights = [] # array of light names - # Used for tile scrolling - self.tileSizeCommands = {} # dict of {texIndex : DPSetTileSize} - - self.useLargeTextures = False - self.largeTextureIndex = None - self.texturesLoaded = [False, False] - self.saveLargeTextures = [True, True] - - def getScrollData(self, material, dimensions): - self.getScrollDataField(material, 0, 0) - self.getScrollDataField(material, 0, 1) - self.getScrollDataField(material, 1, 0) - self.getScrollDataField(material, 1, 1) - self.scrollData.dimensions = dimensions - self.getSetTileSizeScrollData(material) - - def getScrollDataField(self, material, texIndex, fieldIndex): - UVanim0 = material.f3d_mat.UVanim0 if material.mat_ver > 3 else material.UVanim - UVanim1 = material.f3d_mat.UVanim1 if material.mat_ver > 3 else material.UVanim_tex1 - - if texIndex == 0: - field = getattr(UVanim0, 'xyz'[fieldIndex]) - elif texIndex == 1: - field = getattr(UVanim1, 'xyz'[fieldIndex]) - else: - raise PluginError("Invalid texture index.") - - scrollField = self.scrollData.fields[texIndex][fieldIndex] - - scrollField.animType = field.animType - scrollField.speed = field.speed - scrollField.amplitude = field.amplitude - scrollField.frequency = field.frequency - scrollField.offset = field.offset - - scrollField.noiseAmplitude = field.noiseAmplitude - - def getSetTileSizeScrollData(self, material): - tex0 = get_f3d_mat_from_version(material).tex0 - tex1 = get_f3d_mat_from_version(material).tex1 - - self.scrollData.tile_scroll_tex0.s = tex0.tile_scroll.s - self.scrollData.tile_scroll_tex0.t = tex0.tile_scroll.t - self.scrollData.tile_scroll_tex0.interval = tex0.tile_scroll.interval - self.scrollData.tile_scroll_tex1.s = tex1.tile_scroll.s - self.scrollData.tile_scroll_tex1.t = tex1.tile_scroll.t - self.scrollData.tile_scroll_tex1.interval = tex1.tile_scroll.interval - - def sets_rendermode(self): - for command in self.material.commands: - if isinstance(command, DPSetRenderMode): - return True - return False - - def get_ptr_addresses(self, f3d): - addresses = self.material.get_ptr_addresses(f3d) - if self.revert is not None: - addresses.extend(self.revert.get_ptr_addresses(f3d)) - return addresses - - def set_addr(self, startAddress, f3d): - addrRange = self.material.set_addr(startAddress, f3d) - startAddress = addrRange[0] - if self.revert is not None: - addrRange = self.revert.set_addr(addrRange[1], f3d) - return startAddress, addrRange[1] - - def save_binary(self, romfile, f3d, segments): - self.material.save_binary(romfile, f3d, segments) - if self.revert is not None: - self.revert.save_binary(romfile, f3d, segments) - - def to_c(self, f3d): - data = CData() - data.append(self.material.to_c(f3d)) - if self.revert is not None: - data.append(self.revert.to_c(f3d)) - return data + def __init__(self, name, DLFormat): + self.material = GfxList("mat_" + name, GfxListTag.Material, DLFormat) + self.revert = GfxList( + "mat_revert_" + name, GfxListTag.MaterialRevert, DLFormat.Static + ) + self.DLFormat = DLFormat + self.scrollData = FScrollData() + + # Used for keeping track of shared resources in FModel hierarchy + self.usedImages = [] # array of (image, texFormat, paletteType) = imageKey + self.usedLights = [] # array of light names + # Used for tile scrolling + self.tileSizeCommands = {} # dict of {texIndex : DPSetTileSize} + + self.useLargeTextures = False + self.largeTextureIndex = None + self.texturesLoaded = [False, False] + self.saveLargeTextures = [True, True] + + def getScrollData(self, material, dimensions): + self.getScrollDataField(material, 0, 0) + self.getScrollDataField(material, 0, 1) + self.getScrollDataField(material, 1, 0) + self.getScrollDataField(material, 1, 1) + self.scrollData.dimensions = dimensions + self.getSetTileSizeScrollData(material) + + def getScrollDataField(self, material, texIndex, fieldIndex): + UVanim0 = material.f3d_mat.UVanim0 if material.mat_ver > 3 else material.UVanim + UVanim1 = ( + material.f3d_mat.UVanim1 if material.mat_ver > 3 else material.UVanim_tex1 + ) + + if texIndex == 0: + field = getattr(UVanim0, "xyz"[fieldIndex]) + elif texIndex == 1: + field = getattr(UVanim1, "xyz"[fieldIndex]) + else: + raise PluginError("Invalid texture index.") + + scrollField = self.scrollData.fields[texIndex][fieldIndex] + + scrollField.animType = field.animType + scrollField.speed = field.speed + scrollField.amplitude = field.amplitude + scrollField.frequency = field.frequency + scrollField.offset = field.offset + + scrollField.noiseAmplitude = field.noiseAmplitude + + def getSetTileSizeScrollData(self, material): + tex0 = get_f3d_mat_from_version(material).tex0 + tex1 = get_f3d_mat_from_version(material).tex1 + + self.scrollData.tile_scroll_tex0.s = tex0.tile_scroll.s + self.scrollData.tile_scroll_tex0.t = tex0.tile_scroll.t + self.scrollData.tile_scroll_tex0.interval = tex0.tile_scroll.interval + self.scrollData.tile_scroll_tex1.s = tex1.tile_scroll.s + self.scrollData.tile_scroll_tex1.t = tex1.tile_scroll.t + self.scrollData.tile_scroll_tex1.interval = tex1.tile_scroll.interval + + def sets_rendermode(self): + for command in self.material.commands: + if isinstance(command, DPSetRenderMode): + return True + return False + + def get_ptr_addresses(self, f3d): + addresses = self.material.get_ptr_addresses(f3d) + if self.revert is not None: + addresses.extend(self.revert.get_ptr_addresses(f3d)) + return addresses + + def set_addr(self, startAddress, f3d): + addrRange = self.material.set_addr(startAddress, f3d) + startAddress = addrRange[0] + if self.revert is not None: + addrRange = self.revert.set_addr(addrRange[1], f3d) + return startAddress, addrRange[1] + + def save_binary(self, romfile, f3d, segments): + self.material.save_binary(romfile, f3d, segments) + if self.revert is not None: + self.revert.save_binary(romfile, f3d, segments) + + def to_c(self, f3d): + data = CData() + data.append(self.material.to_c(f3d)) + if self.revert is not None: + data.append(self.revert.to_c(f3d)) + return data + # viewport # NOTE: unfinished class Vp: - def __init__(self, scale, translation): - self.startAddress = 0 + def __init__(self, scale, translation): + self.startAddress = 0 + class Light: - def __init__(self, color, normal): - self.color = color - self.normal = normal - - def to_binary(self): - return bytearray(self.color + [0x00] + self.color + [0x00] + \ - self.normal + [0x00] + [0x00] * 4) - - def to_c(self): - return \ - '0x' + format(self.color[0], 'X') + ', ' +\ - '0x' + format(self.color[1], 'X') + ', ' +\ - '0x' + format(self.color[2], 'X') + ', ' +\ - '0x' + format(self.normal[0], 'X') + ', ' +\ - '0x' + format(self.normal[1], 'X') + ', ' +\ - '0x' + format(self.normal[2], 'X') - - def to_sm64_decomp_s(self): - return '.byte ' +\ - '0x' + format(self.color[0], 'X') + ', ' +\ - '0x' + format(self.color[1], 'X') + ', ' +\ - '0x' + format(self.color[2], 'X') + ', ' +\ - '0x00, ' + \ - '0x' + format(self.color[0], 'X') + ', ' +\ - '0x' + format(self.color[1], 'X') + ', ' +\ - '0x' + format(self.color[2], 'X') + ', ' +\ - '0x00 \n' +\ - '.byte ' + \ - '0x' + format(self.normal[0], 'X') + ', ' +\ - '0x' + format(self.normal[1], 'X') + ', ' +\ - '0x' + format(self.normal[2], 'X') + ', ' +\ - '0x00, ' + \ - '0x00, 0x00, 0x00, 0x00\n' + def __init__(self, color, normal): + self.color = color + self.normal = normal + + def to_binary(self): + return bytearray( + self.color + + [0x00] + + self.color + + [0x00] + + self.normal + + [0x00] + + [0x00] * 4 + ) + + def to_c(self): + return ( + "0x" + + format(self.color[0], "X") + + ", " + + "0x" + + format(self.color[1], "X") + + ", " + + "0x" + + format(self.color[2], "X") + + ", " + + "0x" + + format(self.normal[0], "X") + + ", " + + "0x" + + format(self.normal[1], "X") + + ", " + + "0x" + + format(self.normal[2], "X") + ) + + def to_sm64_decomp_s(self): + return ( + ".byte " + + "0x" + + format(self.color[0], "X") + + ", " + + "0x" + + format(self.color[1], "X") + + ", " + + "0x" + + format(self.color[2], "X") + + ", " + + "0x00, " + + "0x" + + format(self.color[0], "X") + + ", " + + "0x" + + format(self.color[1], "X") + + ", " + + "0x" + + format(self.color[2], "X") + + ", " + + "0x00 \n" + + ".byte " + + "0x" + + format(self.normal[0], "X") + + ", " + + "0x" + + format(self.normal[1], "X") + + ", " + + "0x" + + format(self.normal[2], "X") + + ", " + + "0x00, " + + "0x00, 0x00, 0x00, 0x00\n" + ) + class Ambient: - def __init__(self, color): - self.color = color - - def to_binary(self): - return bytearray(self.color + [0x00] + self.color + [0x00]) - - def to_c(self): - return \ - '0x' + format(self.color[0], 'X') + ', ' +\ - '0x' + format(self.color[1], 'X') + ', ' +\ - '0x' + format(self.color[2], 'X') - - def to_sm64_decomp_s(self): - return '.byte ' +\ - '0x' + format(self.color[0], 'X') + ', ' +\ - '0x' + format(self.color[1], 'X') + ', ' +\ - '0x' + format(self.color[2], 'X') + ', ' +\ - '0x00, ' + \ - '0x' + format(self.color[0], 'X') + ', ' +\ - '0x' + format(self.color[1], 'X') + ', ' +\ - '0x' + format(self.color[2], 'X') + ', ' +\ - '0x00\n' + def __init__(self, color): + self.color = color + + def to_binary(self): + return bytearray(self.color + [0x00] + self.color + [0x00]) + + def to_c(self): + return ( + "0x" + + format(self.color[0], "X") + + ", " + + "0x" + + format(self.color[1], "X") + + ", " + + "0x" + + format(self.color[2], "X") + ) + + def to_sm64_decomp_s(self): + return ( + ".byte " + + "0x" + + format(self.color[0], "X") + + ", " + + "0x" + + format(self.color[1], "X") + + ", " + + "0x" + + format(self.color[2], "X") + + ", " + + "0x00, " + + "0x" + + format(self.color[0], "X") + + ", " + + "0x" + + format(self.color[1], "X") + + ", " + + "0x" + + format(self.color[2], "X") + + ", " + + "0x00\n" + ) + class Hilite: - def __init__(self, name, x1, y1, x2, y2): - self.name = name - self.startAddress = 0 - self.x1 = x1 - self.y1 = y1 - self.x2 = x2 - self.y2 = y2 - - def to_binary(self): - return self.x1.to_bytes(4, 'big') +\ - self.y1.to_bytes(4, 'big') +\ - self.x2.to_bytes(4, 'big') +\ - self.y2.to_bytes(4, 'big') - - def to_c(self): - return 'Hilite ' + self.name + ' = {' + \ - str(self.x1) + ', ' +\ - str(self.y1) + ', ' +\ - str(self.x2) + ', ' +\ - str(self.y2) + '}' - - def to_sm64_decomp_s(self): - return self.name + ':\n' + '.word ' +\ - str(self.x1) + ', ' +\ - str(self.y1) + ', ' +\ - str(self.x2) + ', ' +\ - str(self.y2) + '\n' + def __init__(self, name, x1, y1, x2, y2): + self.name = name + self.startAddress = 0 + self.x1 = x1 + self.y1 = y1 + self.x2 = x2 + self.y2 = y2 + + def to_binary(self): + return ( + self.x1.to_bytes(4, "big") + + self.y1.to_bytes(4, "big") + + self.x2.to_bytes(4, "big") + + self.y2.to_bytes(4, "big") + ) + + def to_c(self): + return ( + "Hilite " + + self.name + + " = {" + + str(self.x1) + + ", " + + str(self.y1) + + ", " + + str(self.x2) + + ", " + + str(self.y2) + + "}" + ) + + def to_sm64_decomp_s(self): + return ( + self.name + + ":\n" + + ".word " + + str(self.x1) + + ", " + + str(self.y1) + + ", " + + str(self.x2) + + ", " + + str(self.y2) + + "\n" + ) + class Lights: - def __init__(self, name): - self.name = name - self.startAddress = 0 - self.a = None - self.l = [] - - def set_addr(self, startAddress): - startAddress = get64bitAlignedAddr(startAddress) - self.startAddress = startAddress - print('Lights ' + self.name + ': ' + str(startAddress) + ', ' + str(self.size())) - return (startAddress, startAddress + self.size()) - - def save_binary(self, romfile): - romfile.seek(self.startAddress) - romfile.write(self.to_binary()) - - def size(self): - return max(len(self.l), 1) * LIGHT_SIZE + AMBIENT_SIZE - - def getLightPointer(self, i): - return self.startAddress + AMBIENT_SIZE + i * LIGHT_SIZE - - def getAmbientPointer(self): - return self.startAddress - - def to_binary(self): - data = self.a.to_binary() - if len(self.l) == 0: - data += Light([0,0,0],[0,0,0]).to_binary() - else: - for i in range(len(self.l)): - data += self.l[i].to_binary() - return data - - def to_c(self): - data = CData() - data.header = "extern Lights" + str(len(self.l)) + " " + self.name + ";\n" - data.source = 'Lights' + str(len(self.l)) + " " + self.name + " = " +\ - 'gdSPDefLights' + str(len(self.l)) + '(\n' - data.source += '\t' + self.a.to_c() - for light in self.l: - data.source += ',\n\t' + light.to_c() - data.source += ');\n\n' - return data - - def to_sm64_decomp_s(self): - data = '.balign 8\n' + self.name + ':\n' - data += self.name + '_a:\n' + self.a.to_sm64_decomp_s() + '\n' - if len(self.l) == 0: - data += self.name + '_l0:\n' + \ - Light([0,0,0],[0,0,0]).to_sm64_decomp_s() + '\n' - else: - for i in range(len(self.l)): - data += self.name + '_l' + str(i) + ':\n' + \ - self.l[i].to_sm64_decomp_s() + '\n' - return data + def __init__(self, name): + self.name = name + self.startAddress = 0 + self.a = None + self.l = [] + + def set_addr(self, startAddress): + startAddress = get64bitAlignedAddr(startAddress) + self.startAddress = startAddress + print( + "Lights " + self.name + ": " + str(startAddress) + ", " + str(self.size()) + ) + return (startAddress, startAddress + self.size()) + + def save_binary(self, romfile): + romfile.seek(self.startAddress) + romfile.write(self.to_binary()) + + def size(self): + return max(len(self.l), 1) * LIGHT_SIZE + AMBIENT_SIZE + + def getLightPointer(self, i): + return self.startAddress + AMBIENT_SIZE + i * LIGHT_SIZE + + def getAmbientPointer(self): + return self.startAddress + + def to_binary(self): + data = self.a.to_binary() + if len(self.l) == 0: + data += Light([0, 0, 0], [0, 0, 0]).to_binary() + else: + for i in range(len(self.l)): + data += self.l[i].to_binary() + return data + + def to_c(self): + data = CData() + data.header = "extern Lights" + str(len(self.l)) + " " + self.name + ";\n" + data.source = ( + "Lights" + + str(len(self.l)) + + " " + + self.name + + " = " + + "gdSPDefLights" + + str(len(self.l)) + + "(\n" + ) + data.source += "\t" + self.a.to_c() + for light in self.l: + data.source += ",\n\t" + light.to_c() + data.source += ");\n\n" + return data + + def to_sm64_decomp_s(self): + data = ".balign 8\n" + self.name + ":\n" + data += self.name + "_a:\n" + self.a.to_sm64_decomp_s() + "\n" + if len(self.l) == 0: + data += ( + self.name + + "_l0:\n" + + Light([0, 0, 0], [0, 0, 0]).to_sm64_decomp_s() + + "\n" + ) + else: + for i in range(len(self.l)): + data += ( + self.name + + "_l" + + str(i) + + ":\n" + + self.l[i].to_sm64_decomp_s() + + "\n" + ) + return data + class LookAt: - def __init__(self, name): - self.name = name - self.startAddress = 0 - self.l = [] #2 lights - - def to_binary(self): - return self.l[0].to_binary() + self.l[1].to_binary() - - def to_c(self): - # {{}} => lookat, light array, - # {{}} => light, light_t - return 'LookAt ' + self.name + ' = {{' + \ - '{{' + \ - "{" + \ - str(self.l[0].color[0]) + ', ' + \ - str(self.l[0].color[1]) + ', ' + \ - str(self.l[0].color[2]) + \ - '}, 0, ' +\ - "{" + \ - str(self.l[0].normal[0]) + ', ' + \ - str(self.l[0].normal[1]) + ', ' + \ - str(self.l[0].normal[2]) + \ - '}, 0' +\ - '}}' + \ - '{{' + \ - "{" + \ - str(self.l[1].color[0]) + ', ' + \ - str(self.l[1].color[1]) + ', ' + \ - str(self.l[1].color[2]) + \ - '}, 0, ' +\ - "{" + \ - str(self.l[1].normal[0]) + ', ' + \ - str(self.l[1].normal[1]) + ', ' + \ - str(self.l[1].normal[2]) + \ - '}, 0' +\ - '}}' + '}}\n' - - def to_sm64_decomp_s(self): - data = '.balign 8\n' + self.name + ':\n' - data += self.name + ':\n' - data += self.l[0].to_sm64_decomp_s() + '\n' - data += self.l[1].to_sm64_decomp_s() + '\n' - return data + def __init__(self, name): + self.name = name + self.startAddress = 0 + self.l = [] # 2 lights + + def to_binary(self): + return self.l[0].to_binary() + self.l[1].to_binary() + + def to_c(self): + # {{}} => lookat, light array, + # {{}} => light, light_t + return ( + "LookAt " + + self.name + + " = {{" + + "{{" + + "{" + + str(self.l[0].color[0]) + + ", " + + str(self.l[0].color[1]) + + ", " + + str(self.l[0].color[2]) + + "}, 0, " + + "{" + + str(self.l[0].normal[0]) + + ", " + + str(self.l[0].normal[1]) + + ", " + + str(self.l[0].normal[2]) + + "}, 0" + + "}}" + + "{{" + + "{" + + str(self.l[1].color[0]) + + ", " + + str(self.l[1].color[1]) + + ", " + + str(self.l[1].color[2]) + + "}, 0, " + + "{" + + str(self.l[1].normal[0]) + + ", " + + str(self.l[1].normal[1]) + + ", " + + str(self.l[1].normal[2]) + + "}, 0" + + "}}" + + "}}\n" + ) + + def to_sm64_decomp_s(self): + data = ".balign 8\n" + self.name + ":\n" + data += self.name + ":\n" + data += self.l[0].to_sm64_decomp_s() + "\n" + data += self.l[1].to_sm64_decomp_s() + "\n" + return data + # A palette is just a RGBA16 texture with width = 1. class FImage: - def __init__(self, name, fmt, bitSize, width, height, filename, converted): - self.name = name - self.fmt = fmt - self.bitSize = bitSize - self.width = width - self.height = height - self.startAddress = 0 - self.data = bytearray(0) - self.filename = filename - self.converted = converted - self.isLargeTexture = False - self.paletteKey = None # another FImage reference - - def size(self): - return len(self.data) - - def to_binary(self): - return self.data - - def to_c(self, texArrayBitSize): - return self.to_c_helper(self.to_c_data(texArrayBitSize), texArrayBitSize) - - def to_c_tex_separate(self, texPath, texArrayBitSize): - return self.to_c_helper('#include "' + texPath + self.filename + '"', texArrayBitSize) - - def to_c_helper(self, texData, bitsPerValue): - code = CData() - code.header = 'extern u' + str(bitsPerValue) + ' ' + self.name + '[];\n' - - # This is to force 8 byte alignment - if bitsPerValue != 64: - code.source = 'Gfx ' + self.name + '_aligner[] = {gsSPEndDisplayList()};\n' - code.source += 'u' + str(bitsPerValue) + ' ' + self.name + '[] = {\n\t' - code.source += texData - code.source += '\n};\n\n' - return code - - def to_c_data(self, bitsPerValue): - if not self.converted: - raise PluginError("Error: Trying to write texture data to C, but haven't actually converted the image file to bytes yet.") - - bytesPerValue = int(bitsPerValue / 8) - numValues = int(len(self.data) / bytesPerValue) - remainderCount = len(self.data) - numValues * bytesPerValue - digits = 2 + 2 * bytesPerValue - - code = ''.join([ - format(int.from_bytes(self.data[ - i * bytesPerValue : (i+1) * bytesPerValue], 'big'), - '#0' + str(digits) + 'x') + ', ' +\ - ('\n\t' if i % 8 == 7 else '') - for i in range(numValues)]) - - if remainderCount > 0: - start = numValues * bytesPerValue - end = (numValues + 1) * bytesPerValue - code += format(int.from_bytes(self.data[start:end], 'big') << \ - (8 * (bytesPerValue - remainderCount)), '#0' + str(digits) + 'x') - - return code - - def set_addr(self, startAddress): - startAddress = get64bitAlignedAddr(startAddress) - self.startAddress = startAddress - print('Image ' + self.name + ': ' + str(startAddress) + \ - ', ' + str(self.size())) - return startAddress, startAddress + self.size() - - def save_binary(self, romfile): - romfile.seek(self.startAddress) - romfile.write(self.to_binary()) + def __init__(self, name, fmt, bitSize, width, height, filename, converted): + self.name = name + self.fmt = fmt + self.bitSize = bitSize + self.width = width + self.height = height + self.startAddress = 0 + self.data = bytearray(0) + self.filename = filename + self.converted = converted + self.isLargeTexture = False + self.paletteKey = None # another FImage reference + + def size(self): + return len(self.data) + + def to_binary(self): + return self.data + + def to_c(self, texArrayBitSize): + return self.to_c_helper(self.to_c_data(texArrayBitSize), texArrayBitSize) + + def to_c_tex_separate(self, texPath, texArrayBitSize): + return self.to_c_helper( + '#include "' + texPath + self.filename + '"', texArrayBitSize + ) + + def to_c_helper(self, texData, bitsPerValue): + code = CData() + code.header = "extern u" + str(bitsPerValue) + " " + self.name + "[];\n" + + # This is to force 8 byte alignment + if bitsPerValue != 64: + code.source = "Gfx " + self.name + "_aligner[] = {gsSPEndDisplayList()};\n" + code.source += "u" + str(bitsPerValue) + " " + self.name + "[] = {\n\t" + code.source += texData + code.source += "\n};\n\n" + return code + + def to_c_data(self, bitsPerValue): + if not self.converted: + raise PluginError( + "Error: Trying to write texture data to C, but haven't actually converted the image file to bytes yet." + ) + + bytesPerValue = int(bitsPerValue / 8) + numValues = int(len(self.data) / bytesPerValue) + remainderCount = len(self.data) - numValues * bytesPerValue + digits = 2 + 2 * bytesPerValue + + code = "".join( + [ + format( + int.from_bytes( + self.data[i * bytesPerValue : (i + 1) * bytesPerValue], "big" + ), + "#0" + str(digits) + "x", + ) + + ", " + + ("\n\t" if i % 8 == 7 else "") + for i in range(numValues) + ] + ) + + if remainderCount > 0: + start = numValues * bytesPerValue + end = (numValues + 1) * bytesPerValue + code += format( + int.from_bytes(self.data[start:end], "big") + << (8 * (bytesPerValue - remainderCount)), + "#0" + str(digits) + "x", + ) + + return code + + def set_addr(self, startAddress): + startAddress = get64bitAlignedAddr(startAddress) + self.startAddress = startAddress + print("Image " + self.name + ": " + str(startAddress) + ", " + str(self.size())) + return startAddress, startAddress + self.size() + + def save_binary(self, romfile): + romfile.seek(self.startAddress) + romfile.write(self.to_binary()) + # second arg of Dma is a pointer. def gsDma0p(c, s, l): - words = _SHIFTL(c, 24, 8) | _SHIFTL(l, 0, 24), int(s) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') + words = _SHIFTL(c, 24, 8) | _SHIFTL(l, 0, 24), int(s) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + def gsDma1p(c, s, l, p): - words = _SHIFTL(c, 24, 8) | _SHIFTL(p, 16, 8) | \ - _SHIFTL(l, 0, 16), int(s) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') + words = _SHIFTL(c, 24, 8) | _SHIFTL(p, 16, 8) | _SHIFTL(l, 0, 16), int(s) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + def gsDma2p(c, adrs, length, idx, ofs): - words = _SHIFTL(c,24,8) | _SHIFTL((length-1)/8,19,5) | \ - _SHIFTL(ofs/8,8,8) | _SHIFTL(idx,0,8), int(adrs) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') - + words = _SHIFTL(c, 24, 8) | _SHIFTL((length - 1) / 8, 19, 5) | _SHIFTL( + ofs / 8, 8, 8 + ) | _SHIFTL(idx, 0, 8), int(adrs) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + def gsSPNoOp(f3d): - return gsDma0p(f3d.G_SPNOOP, 0, 0) + return gsDma0p(f3d.G_SPNOOP, 0, 0) + class SPMatrix: - def __init__(self, matrix, param): - self.matrix = matrix - self.param = param - - def get_ptr_offsets(self, f3d): - return [4] - - def to_binary(self, f3d, segments): - matPtr = int(self.matrix, 16) - if f3d.F3DEX_GBI_2: - return gsDma2p(f3d.G_MTX, matPtr, MTX_SIZE, self.param ^ f3d.G_MTX_PUSH, 0) - else: - return gsDma1p(f3d.G_MTX, matPtr, MTX_SIZE, self.param) - - def to_c(self, static = True): - header = 'gsSPMatrix(' if static else 'gSPMatrix(glistp++, ' - if not static and bpy.context.scene.decomp_compatible: - header += 'segmented_to_virtual(' + str(self.matrix) + ')' - else: - header += str(self.matrix) - return header + ", " + \ - str(self.param) + ')' - - def to_sm64_decomp_s(self): - return 'gsSPMatrix ' + str(self.matrix) + ", " + str(self.param) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, matrix, param): + self.matrix = matrix + self.param = param + + def get_ptr_offsets(self, f3d): + return [4] + + def to_binary(self, f3d, segments): + matPtr = int(self.matrix, 16) + if f3d.F3DEX_GBI_2: + return gsDma2p(f3d.G_MTX, matPtr, MTX_SIZE, self.param ^ f3d.G_MTX_PUSH, 0) + else: + return gsDma1p(f3d.G_MTX, matPtr, MTX_SIZE, self.param) + + def to_c(self, static=True): + header = "gsSPMatrix(" if static else "gSPMatrix(glistp++, " + if not static and bpy.context.scene.decomp_compatible: + header += "segmented_to_virtual(" + str(self.matrix) + ")" + else: + header += str(self.matrix) + return header + ", " + str(self.param) + ")" + + def to_sm64_decomp_s(self): + return "gsSPMatrix " + str(self.matrix) + ", " + str(self.param) + + def size(self, f3d): + return GFX_SIZE + # TODO: Divide vertlist into sections # Divide mesh drawing by materials into separate gfx class SPVertex: - # v = seg pointer, n = count, v0 = ? - def __init__(self, vertList, offset, count, index): - self.vertList = vertList - self.offset = offset - self.count = count - self.index = index - - def get_ptr_offsets(self, f3d): - return [4] - - def to_binary(self, f3d, segments): - vertPtr = int.from_bytes(encodeSegmentedAddr( - self.vertList.startAddress + self.offset * VTX_SIZE, - segments), 'big') - - if f3d.F3DEX_GBI_2: - words = _SHIFTL(f3d.G_VTX, 24, 8) | _SHIFTL(self.count, 12, 8) | \ - _SHIFTL(self.index + self.count, 1, 7), vertPtr - - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') - - elif f3d.F3DEX_GBI or f3d.F3DLP_GBI: - return gsDma1p(f3d.G_VTX, vertPtr, \ - (self.count << 10) | (VTX_SIZE * self.count -1), \ - self.index * 2) - - else: - return gsDma1p(f3d.G_VTX, vertPtr, \ - VTX_SIZE * self.count, (self.count - 1) << 4 | \ - self.index) - - def to_c(self, static = True): - header = 'gsSPVertex(' if static else 'gSPVertex(glistp++, ' - if not static and bpy.context.scene.decomp_compatible: - header += 'segmented_to_virtual(' + self.vertList.name + ' + ' + str(self.offset) + ')' - else: - header += self.vertList.name + ' + ' + str(self.offset) - return header + ", " + \ - str(self.count) + ', ' + str(self.index) + ')' - - def to_sm64_decomp_s(self): - return 'gsSPVertex ' + self.vertList.name + ", " + str(self.offset) +\ - ', ' + str(self.count) + ', ' + str(self.index) - - def size(self, f3d): - return GFX_SIZE + # v = seg pointer, n = count, v0 = ? + def __init__(self, vertList, offset, count, index): + self.vertList = vertList + self.offset = offset + self.count = count + self.index = index + + def get_ptr_offsets(self, f3d): + return [4] + + def to_binary(self, f3d, segments): + vertPtr = int.from_bytes( + encodeSegmentedAddr( + self.vertList.startAddress + self.offset * VTX_SIZE, segments + ), + "big", + ) + + if f3d.F3DEX_GBI_2: + words = ( + _SHIFTL(f3d.G_VTX, 24, 8) + | _SHIFTL(self.count, 12, 8) + | _SHIFTL(self.index + self.count, 1, 7), + vertPtr, + ) + + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + elif f3d.F3DEX_GBI or f3d.F3DLP_GBI: + return gsDma1p( + f3d.G_VTX, + vertPtr, + (self.count << 10) | (VTX_SIZE * self.count - 1), + self.index * 2, + ) + + else: + return gsDma1p( + f3d.G_VTX, + vertPtr, + VTX_SIZE * self.count, + (self.count - 1) << 4 | self.index, + ) + + def to_c(self, static=True): + header = "gsSPVertex(" if static else "gSPVertex(glistp++, " + if not static and bpy.context.scene.decomp_compatible: + header += ( + "segmented_to_virtual(" + + self.vertList.name + + " + " + + str(self.offset) + + ")" + ) + else: + header += self.vertList.name + " + " + str(self.offset) + return header + ", " + str(self.count) + ", " + str(self.index) + ")" + + def to_sm64_decomp_s(self): + return ( + "gsSPVertex " + + self.vertList.name + + ", " + + str(self.offset) + + ", " + + str(self.count) + + ", " + + str(self.index) + ) + + def size(self, f3d): + return GFX_SIZE + class SPViewport: - # v = seg pointer, n = count, v0 = ? - def __init__(self, viewport): - self.viewport = viewport - - def get_ptr_offsets(self, f3d): - return [4] - - def to_binary(self, f3d, segments): - vpPtr = int.from_bytes(encodeSegmentedAddr( - self.viewport.startAddress, segments), 'big') - - if f3d.F3DEX_GBI_2: - return gsDma2p(f3d.G_MOVEMEM, vpPtr, VP_SIZE, f3d.G_MV_VIEWPORT, 0) - else: - return gsDma1p(f3d.G_MOVEMEM, vpPtr, VP_SIZE, f3d.G_MV_VIEWPORT) - - def to_c(self, static = True): - header = 'gsSPViewport(' if static else 'gSPViewport(glistp++, ' - return header + '&' + self.viewport.name + ')' - - def to_sm64_decomp_s(self): - return 'gsSPViewport ' + self.viewport.name - - def size(self, f3d): - return GFX_SIZE + # v = seg pointer, n = count, v0 = ? + def __init__(self, viewport): + self.viewport = viewport + + def get_ptr_offsets(self, f3d): + return [4] + + def to_binary(self, f3d, segments): + vpPtr = int.from_bytes( + encodeSegmentedAddr(self.viewport.startAddress, segments), "big" + ) + + if f3d.F3DEX_GBI_2: + return gsDma2p(f3d.G_MOVEMEM, vpPtr, VP_SIZE, f3d.G_MV_VIEWPORT, 0) + else: + return gsDma1p(f3d.G_MOVEMEM, vpPtr, VP_SIZE, f3d.G_MV_VIEWPORT) + + def to_c(self, static=True): + header = "gsSPViewport(" if static else "gSPViewport(glistp++, " + return header + "&" + self.viewport.name + ")" + + def to_sm64_decomp_s(self): + return "gsSPViewport " + self.viewport.name + + def size(self, f3d): + return GFX_SIZE + class SPDisplayList: - def __init__(self, displayList): - self.displayList = displayList - - def get_ptr_offsets(self, f3d): - return [4] - - def to_binary(self, f3d, segments): - dlPtr = int.from_bytes(encodeSegmentedAddr( - self.displayList.startAddress, segments), 'big') - return gsDma1p(f3d.G_DL, dlPtr, 0, f3d.G_DL_PUSH) - - def to_c(self, static = True): - if static: - return 'gsSPDisplayList(' + self.displayList.name + ')' - elif self.displayList.DLFormat == DLFormat.Static: - header = 'gSPDisplayList(glistp++, ' - if bpy.context.scene.decomp_compatible: - return header + 'segmented_to_virtual(' + self.displayList.name + '))' - else: - return header + self.displayList.name + ')' - else: - return 'glistp = ' + self.displayList.name + '(glistp)' - - def to_sm64_decomp_s(self): - return 'gsSPDisplayList ' + self.displayList.name - - def size(self, f3d): - return GFX_SIZE + def __init__(self, displayList): + self.displayList = displayList + + def get_ptr_offsets(self, f3d): + return [4] + + def to_binary(self, f3d, segments): + dlPtr = int.from_bytes( + encodeSegmentedAddr(self.displayList.startAddress, segments), "big" + ) + return gsDma1p(f3d.G_DL, dlPtr, 0, f3d.G_DL_PUSH) + + def to_c(self, static=True): + if static: + return "gsSPDisplayList(" + self.displayList.name + ")" + elif self.displayList.DLFormat == DLFormat.Static: + header = "gSPDisplayList(glistp++, " + if bpy.context.scene.decomp_compatible: + return header + "segmented_to_virtual(" + self.displayList.name + "))" + else: + return header + self.displayList.name + ")" + else: + return "glistp = " + self.displayList.name + "(glistp)" + + def to_sm64_decomp_s(self): + return "gsSPDisplayList " + self.displayList.name + + def size(self, f3d): + return GFX_SIZE + class SPBranchList: - def __init__(self, displayList): - self.displayList = displayList - - def get_ptr_offsets(self, f3d): - return [4] - - def to_binary(self, f3d, segments): - dlPtr = int.from_bytes(encodeSegmentedAddr( - self.displayList.startAddress, segments), 'big') - return gsDma1p(f3d.G_DL, dlPtr, 0, f3d.G_DL_NOPUSH) - - def to_c(self, static = True): - header = 'gsSPBranchList(' if static else 'gSPBranchList(glistp++, ' - return header + '&' + self.displayList.name + ')' - - def to_sm64_decomp_s(self): - return 'gsSPBranchList ' + self.displayList.name - - def size(self, f3d): - return GFX_SIZE + def __init__(self, displayList): + self.displayList = displayList + + def get_ptr_offsets(self, f3d): + return [4] + + def to_binary(self, f3d, segments): + dlPtr = int.from_bytes( + encodeSegmentedAddr(self.displayList.startAddress, segments), "big" + ) + return gsDma1p(f3d.G_DL, dlPtr, 0, f3d.G_DL_NOPUSH) + + def to_c(self, static=True): + header = "gsSPBranchList(" if static else "gSPBranchList(glistp++, " + return header + "&" + self.displayList.name + ")" + + def to_sm64_decomp_s(self): + return "gsSPBranchList " + self.displayList.name + + def size(self, f3d): + return GFX_SIZE + # SPSprite2DBase # RSP short command (no DMA required) macros def gsImmp0(c): - words = _SHIFTL((c), 24, 8), 0 - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') + words = _SHIFTL((c), 24, 8), 0 + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + def gsImmp1(c, p0): - words = _SHIFTL((c), 24, 8), int(p0) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') + words = _SHIFTL((c), 24, 8), int(p0) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + def gsImmp2(c, p0, p1): - words = _SHIFTL((c), 24, 8), _SHIFTL((p0), 16, 16) | _SHIFTL((p1), 8, 8) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') - -def gsImmp3(c, p0, p1, p2): - words = _SHIFTL((c), 24, 8), (_SHIFTL((p0), 16, 16) | \ - _SHIFTL((p1), 8, 8) | _SHIFTL((p2), 0, 8)) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') - + words = _SHIFTL((c), 24, 8), _SHIFTL((p0), 16, 16) | _SHIFTL((p1), 8, 8) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + +def gsImmp3(c, p0, p1, p2): + words = _SHIFTL((c), 24, 8), ( + _SHIFTL((p0), 16, 16) | _SHIFTL((p1), 8, 8) | _SHIFTL((p2), 0, 8) + ) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + # last arg of Immp21 is a pointer. -def gsImmp21(c, p0, p1, dat): - words = _SHIFTL((c), 24, 8) | _SHIFTL((p0), 8, 16) | _SHIFTL((p1), 0, 8),\ - int(dat) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') +def gsImmp21(c, p0, p1, dat): + words = _SHIFTL((c), 24, 8) | _SHIFTL((p0), 8, 16) | _SHIFTL((p1), 0, 8), int(dat) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + def gsMoveWd(index, offset, data, f3d): - if f3d.F3DEX_GBI_2: - return gsDma1p(f3d.G_MOVEWORD, data, offset, index) - else: - return gsImmp21(f3d.G_MOVEWORD, offset, index, data) + if f3d.F3DEX_GBI_2: + return gsDma1p(f3d.G_MOVEWORD, data, offset, index) + else: + return gsImmp21(f3d.G_MOVEWORD, offset, index, data) + # SPSprite2DScaleFlip # SPSprite2DDraw @@ -3083,318 +4154,446 @@ def gsMoveWd(index, offset, data, f3d): # Note: the SP1Triangle() and line macros multiply the vertex indices # by 10, this is an optimization for the microcode. + def _gsSP1Triangle_w1(v0, v1, v2): - return (_SHIFTL((v0)*2,16,8)|_SHIFTL((v1)*2,8,8)|_SHIFTL((v2)*2,0,8)) + return _SHIFTL((v0) * 2, 16, 8) | _SHIFTL((v1) * 2, 8, 8) | _SHIFTL((v2) * 2, 0, 8) + def _gsSP1Triangle_w1f(v0, v1, v2, flag, f3d): - if f3d.F3DLP_GBI or f3d.F3DEX_GBI: - if flag == 0: - return _gsSP1Triangle_w1(v0, v1, v2) - elif flag == 1: - return _gsSP1Triangle_w1(v1, v2, v0) - else: - return _gsSP1Triangle_w1(v2, v0, v1) - else: - return (_SHIFTL((flag), 24,8)|_SHIFTL((v0)*10,16,8)|\ - _SHIFTL((v1)*10, 8,8)|_SHIFTL((v2)*10, 0,8)) + if f3d.F3DLP_GBI or f3d.F3DEX_GBI: + if flag == 0: + return _gsSP1Triangle_w1(v0, v1, v2) + elif flag == 1: + return _gsSP1Triangle_w1(v1, v2, v0) + else: + return _gsSP1Triangle_w1(v2, v0, v1) + else: + return ( + _SHIFTL((flag), 24, 8) + | _SHIFTL((v0) * 10, 16, 8) + | _SHIFTL((v1) * 10, 8, 8) + | _SHIFTL((v2) * 10, 0, 8) + ) + def _gsSPLine3D_w1(v0, v1, wd): - return (_SHIFTL((v0)*2,16,8)|_SHIFTL((v1)*2,8,8)|_SHIFTL((wd),0,8)) + return _SHIFTL((v0) * 2, 16, 8) | _SHIFTL((v1) * 2, 8, 8) | _SHIFTL((wd), 0, 8) + def _gsSPLine3D_w1f(v0, v1, wd, flag, f3d): - if f3d.F3DLP_GBI or f3d.F3DEX_GBI: - if flag == 0: - return _gsSPLine3D_w1(v0, v1, wd) - else: - return _gsSPLine3D_w1(v1, v0, wd) - else: - return (_SHIFTL((flag), 24,8)|_SHIFTL((v0)*10,16,8)| \ - _SHIFTL((v1)*10, 8,8)|_SHIFTL((wd),0,8)) + if f3d.F3DLP_GBI or f3d.F3DEX_GBI: + if flag == 0: + return _gsSPLine3D_w1(v0, v1, wd) + else: + return _gsSPLine3D_w1(v1, v0, wd) + else: + return ( + _SHIFTL((flag), 24, 8) + | _SHIFTL((v0) * 10, 16, 8) + | _SHIFTL((v1) * 10, 8, 8) + | _SHIFTL((wd), 0, 8) + ) + def _gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag): - if flag == 0: - return _gsSP1Triangle_w1(v0, v1, v2) - elif flag == 1: - return _gsSP1Triangle_w1(v1, v2, v3) - elif flag == 2: - return _gsSP1Triangle_w1(v2, v3, v0) - else: - return _gsSP1Triangle_w1(v3, v0, v1) + if flag == 0: + return _gsSP1Triangle_w1(v0, v1, v2) + elif flag == 1: + return _gsSP1Triangle_w1(v1, v2, v3) + elif flag == 2: + return _gsSP1Triangle_w1(v2, v3, v0) + else: + return _gsSP1Triangle_w1(v3, v0, v1) + def _gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag): - if flag == 0: - return _gsSP1Triangle_w1(v0, v2, v3) - elif flag == 1: - return _gsSP1Triangle_w1(v1, v3, v0) - elif flag == 1: - return _gsSP1Triangle_w1(v2, v0, v1) - else: - return _gsSP1Triangle_w1(v3, v1, v2) + if flag == 0: + return _gsSP1Triangle_w1(v0, v2, v3) + elif flag == 1: + return _gsSP1Triangle_w1(v1, v3, v0) + elif flag == 1: + return _gsSP1Triangle_w1(v2, v0, v1) + else: + return _gsSP1Triangle_w1(v3, v1, v2) + class SP1Triangle: - def __init__(self, v0, v1, v2, flag): - self.v0 = v0 - self.v1 = v1 - self.v2 = v2 - self.flag = flag - - def to_binary(self, f3d, segments): - if f3d.F3DEX_GBI_2: - words = _SHIFTL(f3d.G_TRI1, 24, 8) | \ - _gsSP1Triangle_w1f(self.v0, self.v1, self.v2, - self.flag, f3d), 0 - else: - words = _SHIFTL(f3d.G_TRI1, 24, 8), _gsSP1Triangle_w1f( - self.v0, self.v1, self.v2, self.flag, f3d) - - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') + def __init__(self, v0, v1, v2, flag): + self.v0 = v0 + self.v1 = v1 + self.v2 = v2 + self.flag = flag + + def to_binary(self, f3d, segments): + if f3d.F3DEX_GBI_2: + words = ( + _SHIFTL(f3d.G_TRI1, 24, 8) + | _gsSP1Triangle_w1f(self.v0, self.v1, self.v2, self.flag, f3d), + 0, + ) + else: + words = _SHIFTL(f3d.G_TRI1, 24, 8), _gsSP1Triangle_w1f( + self.v0, self.v1, self.v2, self.flag, f3d + ) + + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + def to_c(self, static=True): + header = "gsSP1Triangle(" if static else "gSP1Triangle(glistp++, " + return ( + header + + str(self.v0) + + ", " + + str(self.v1) + + ", " + + str(self.v2) + + ", " + + str(self.flag) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsSP1Triangle " + + str(self.v0) + + ", " + + str(self.v1) + + ", " + + str(self.v2) + + ", " + + str(self.flag) + ) + + def size(self, f3d): + return GFX_SIZE - - def to_c(self, static = True): - header = 'gsSP1Triangle(' if static else 'gSP1Triangle(glistp++, ' - return header + str(self.v0) + ', ' + str(self.v1) + ', ' + \ - str(self.v2) + ', ' + str(self.flag) + ')' - - def to_sm64_decomp_s(self): - return 'gsSP1Triangle ' + str(self.v0) + ', ' + str(self.v1) + \ - ', ' + str(self.v2) + ', ' + str(self.flag) - - def size(self, f3d): - return GFX_SIZE class SPLine3D: - def __init__(self, v0, v1,flag): - self.v0 = v0 - self.v1 = v1 - self.flag = flag - - def to_binary(self, f3d, segments): - if f3d.F3DEX_GBI_2: - words = _SHIFTL(f3d.G_LINE3D, 24, 8)|_gsSPLine3D_w1f( - self.v0, self.v1, 0, self.flag, f3d), 0 - else: - words = _SHIFTL(f3d.G_LINE3D, 24, 8), _gsSPLine3D_w1f( - self.v0, self.v1, 0, self.flag, f3d) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') - - def to_c(self, static = True): - header = 'gsSPLine3D(' if static else 'gSPLine3D(glistp++, ' - return header + str(self.v0) + ', ' + str(self.v1) + ', ' + \ - str(self.flag) + ')' - - def to_sm64_decomp_s(self): - return 'gsSPLine3D ' + str(self.v0) + ', ' + str(self.v1) + \ - ', ' + str(self.flag) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, v0, v1, flag): + self.v0 = v0 + self.v1 = v1 + self.flag = flag + + def to_binary(self, f3d, segments): + if f3d.F3DEX_GBI_2: + words = ( + _SHIFTL(f3d.G_LINE3D, 24, 8) + | _gsSPLine3D_w1f(self.v0, self.v1, 0, self.flag, f3d), + 0, + ) + else: + words = _SHIFTL(f3d.G_LINE3D, 24, 8), _gsSPLine3D_w1f( + self.v0, self.v1, 0, self.flag, f3d + ) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + def to_c(self, static=True): + header = "gsSPLine3D(" if static else "gSPLine3D(glistp++, " + return header + str(self.v0) + ", " + str(self.v1) + ", " + str(self.flag) + ")" + + def to_sm64_decomp_s(self): + return ( + "gsSPLine3D " + str(self.v0) + ", " + str(self.v1) + ", " + str(self.flag) + ) + + def size(self, f3d): + return GFX_SIZE + class SPLineW3D: - def __init__(self, v0, v1, wd, flag): - self.v0 = v0 - self.v1 = v1 - self.wd = wd - self.flag = flag - - def to_binary(self, f3d, segments): - if f3d.F3DEX_GBI_2: - words = _SHIFTL(f3d.G_LINE3D, 24, 8) | _gsSPLine3D_w1f( - self.v0, self.v1, self.wd, self.flag, f3d), 0 - else: - words = _SHIFTL(f3d.G_LINE3D, 24, 8), _gsSPLine3D_w1f( - self.v0, self.v1, self.wd, self.flag, f3d) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') - - def to_c(self, static = True): - header = 'gsSPLineW3D(' if static else 'gSPLineW3D(glistp++, ' - return header + str(self.v0) + ', ' + str(self.v1) + ', ' + \ - str(self.wd) + ', ' + str(self.flag) + ')' - - def to_sm64_decomp_s(self): - return 'gsSPLineW3D ' + str(self.v0) + ', ' + str(self.v1) + ', ' + \ - str(self.wd) + ', ' + str(self.flag) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, v0, v1, wd, flag): + self.v0 = v0 + self.v1 = v1 + self.wd = wd + self.flag = flag + + def to_binary(self, f3d, segments): + if f3d.F3DEX_GBI_2: + words = ( + _SHIFTL(f3d.G_LINE3D, 24, 8) + | _gsSPLine3D_w1f(self.v0, self.v1, self.wd, self.flag, f3d), + 0, + ) + else: + words = _SHIFTL(f3d.G_LINE3D, 24, 8), _gsSPLine3D_w1f( + self.v0, self.v1, self.wd, self.flag, f3d + ) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + def to_c(self, static=True): + header = "gsSPLineW3D(" if static else "gSPLineW3D(glistp++, " + return ( + header + + str(self.v0) + + ", " + + str(self.v1) + + ", " + + str(self.wd) + + ", " + + str(self.flag) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsSPLineW3D " + + str(self.v0) + + ", " + + str(self.v1) + + ", " + + str(self.wd) + + ", " + + str(self.flag) + ) + + def size(self, f3d): + return GFX_SIZE + # SP1Quadrangle + class SP2Triangles: - def __init__(self, v00, v01, v02, flag0, v10, v11, v12, flag1): - self.v00 = v00 - self.v01 = v01 - self.v02 = v02 - self.flag0 = flag0 - self.v10 = v10 - self.v11 = v11 - self.v12 = v12 - self.flag1 = flag1 - - def to_binary(self, f3d, segments): - if f3d.F3DLP_GBI or f3d.F3DEX_GBI: - words = (_SHIFTL(f3d.G_TRI2, 24, 8) | \ - _gsSP1Triangle_w1f( - self.v00, self.v01, self.v02, self.flag0, f3d)), \ - _gsSP1Triangle_w1f( - self.v10, self.v11, self.v12, self.flag1, f3d) - else: - raise PluginError("SP2Triangles not available in Fast3D.") - - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') + def __init__(self, v00, v01, v02, flag0, v10, v11, v12, flag1): + self.v00 = v00 + self.v01 = v01 + self.v02 = v02 + self.flag0 = flag0 + self.v10 = v10 + self.v11 = v11 + self.v12 = v12 + self.flag1 = flag1 + + def to_binary(self, f3d, segments): + if f3d.F3DLP_GBI or f3d.F3DEX_GBI: + words = ( + _SHIFTL(f3d.G_TRI2, 24, 8) + | _gsSP1Triangle_w1f(self.v00, self.v01, self.v02, self.flag0, f3d) + ), _gsSP1Triangle_w1f(self.v10, self.v11, self.v12, self.flag1, f3d) + else: + raise PluginError("SP2Triangles not available in Fast3D.") + + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + def to_c(self, static=True): + header = "gsSP2Triangles(" if static else "gSP2Triangles(glistp++, " + return ( + header + + str(self.v00) + + ", " + + str(self.v01) + + ", " + + str(self.v02) + + ", " + + str(self.flag0) + + ", " + + str(self.v10) + + ", " + + str(self.v11) + + ", " + + str(self.v12) + + ", " + + str(self.flag1) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsSP2Triangles " + + str(self.v00) + + ", " + + str(self.v01) + + ", " + + str(self.v02) + + ", " + + str(self.flag0) + + ", " + + str(self.v10) + + ", " + + str(self.v11) + + ", " + + str(self.v12) + + ", " + + str(self.flag1) + ) + + def size(self, f3d): + return GFX_SIZE - - def to_c(self, static = True): - header = 'gsSP2Triangles(' if static else 'gSP2Triangles(glistp++, ' - return header + str(self.v00) + ', ' + str(self.v01) + ', ' + \ - str(self.v02) + ', ' + str(self.flag0) + ', ' + str(self.v10) + \ - ', ' + str(self.v11) + ', ' + str(self.v12) + ', ' + \ - str(self.flag1) + ')' - - def to_sm64_decomp_s(self): - return 'gsSP2Triangles ' + str(self.v00) + ', ' + str(self.v01) + \ - ', ' + str(self.v02) + ', ' + str(self.flag0) + ', ' + \ - str(self.v10) + ', ' + str(self.v11) + ', ' + str(self.v12) + \ - ', ' + str(self.flag1) - - def size(self, f3d): - return GFX_SIZE class SPCullDisplayList: - def __init__(self, vstart, vend): - self.vstart = vstart - self.vend = vend - - def to_binary(self, f3d, segments): - if f3d.F3DLP_GBI or f3d.F3DEX_GBI: - words = _SHIFTL(f3d.G_CULLDL, 24, 8) | \ - _SHIFTL((self.vstart)*2, 0, 16), _SHIFTL((self.vend)*2, 0, 16) - else: - words = _SHIFTL(f3d.G_CULLDL, 24, 8) | ((0x0f & (self.vstart))*40),\ - ((0x0f & ((self.vend)+1))*40) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') - - def to_c(self, static = True): - header = 'gsSPCullDisplayList(' if static else \ - 'gSPCullDisplayList(glistp++, ' - return header + str(self.vstart) + ', ' + str(self.vend) + ')' + def __init__(self, vstart, vend): + self.vstart = vstart + self.vend = vend + + def to_binary(self, f3d, segments): + if f3d.F3DLP_GBI or f3d.F3DEX_GBI: + words = _SHIFTL(f3d.G_CULLDL, 24, 8) | _SHIFTL( + (self.vstart) * 2, 0, 16 + ), _SHIFTL((self.vend) * 2, 0, 16) + else: + words = _SHIFTL(f3d.G_CULLDL, 24, 8) | ((0x0F & (self.vstart)) * 40), ( + (0x0F & ((self.vend) + 1)) * 40 + ) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + def to_c(self, static=True): + header = "gsSPCullDisplayList(" if static else "gSPCullDisplayList(glistp++, " + return header + str(self.vstart) + ", " + str(self.vend) + ")" + + def to_sm64_decomp_s(self): + return "gsSPCullDisplayList " + str(self.vstart) + ", " + str(self.vend) + + def size(self, f3d): + return GFX_SIZE - def to_sm64_decomp_s(self): - return 'gsSPCullDisplayList ' + str(self.vstart) + ', ' + str(self.vend) - - def size(self, f3d): - return GFX_SIZE class SPSegment: - def __init__(self, segment, base): - self.segment = segment - self.base = base + def __init__(self, segment, base): + self.segment = segment + self.base = base + + def to_binary(self, f3d, segments): + return gsMoveWd(f3d.G_MW_SEGMENT, (self.segment) * 4, self.base, f3d) + + def to_c(self, static=True): + header = "gsSPSegment(" if static else "gSPSegment(glistp++, " + return header + str(self.segment) + ", " + "0x" + format(self.base, "X") + ")" + + def to_sm64_decomp_s(self): + return "gsSPSegment " + str(self.segment) + ", 0x" + format(self.base, "X") + + def size(self, f3d): + return GFX_SIZE - def to_binary(self, f3d, segments): - return gsMoveWd(f3d.G_MW_SEGMENT, (self.segment)*4, self.base, f3d) - - def to_c(self, static = True): - header = 'gsSPSegment(' if static else 'gSPSegment(glistp++, ' - return header + str(self.segment) + ', ' + '0x' + \ - format(self.base, 'X') + ')' - - def to_sm64_decomp_s(self): - return 'gsSPSegment ' + str(self.segment) + ', 0x' + \ - format(self.base, 'X') - - def size(self, f3d): - return GFX_SIZE class SPClipRatio: - def __init__(self, ratio): - self.ratio = ratio + def __init__(self, ratio): + self.ratio = ratio - def to_binary(self, f3d, segments): + def to_binary(self, f3d, segments): - # These values are supposed to be flipped. - shortRatioPos = int.from_bytes((-self.ratio).to_bytes( - 2, 'big', signed = True), 'big', signed = False) - shortRatioNeg = int.from_bytes(self.ratio.to_bytes( - 2, 'big', signed = True), 'big', signed = False) + # These values are supposed to be flipped. + shortRatioPos = int.from_bytes( + (-self.ratio).to_bytes(2, "big", signed=True), "big", signed=False + ) + shortRatioNeg = int.from_bytes( + self.ratio.to_bytes(2, "big", signed=True), "big", signed=False + ) - return \ - gsMoveWd(f3d.G_MW_CLIP, f3d.G_MWO_CLIP_RNX, shortRatioNeg, f3d) +\ - gsMoveWd(f3d.G_MW_CLIP, f3d.G_MWO_CLIP_RNY, shortRatioNeg, f3d) +\ - gsMoveWd(f3d.G_MW_CLIP, f3d.G_MWO_CLIP_RPX, shortRatioPos, f3d) +\ - gsMoveWd(f3d.G_MW_CLIP, f3d.G_MWO_CLIP_RPY, shortRatioPos, f3d) + return ( + gsMoveWd(f3d.G_MW_CLIP, f3d.G_MWO_CLIP_RNX, shortRatioNeg, f3d) + + gsMoveWd(f3d.G_MW_CLIP, f3d.G_MWO_CLIP_RNY, shortRatioNeg, f3d) + + gsMoveWd(f3d.G_MW_CLIP, f3d.G_MWO_CLIP_RPX, shortRatioPos, f3d) + + gsMoveWd(f3d.G_MW_CLIP, f3d.G_MWO_CLIP_RPY, shortRatioPos, f3d) + ) - def to_c(self, static = True): - header = 'gsSPClipRatio(' if static else 'gSPClipRatio(glistp++, ' - return header + str(self.ratio) + ')' + def to_c(self, static=True): + header = "gsSPClipRatio(" if static else "gSPClipRatio(glistp++, " + return header + str(self.ratio) + ")" + + def to_sm64_decomp_s(self): + return "gsSPClipRatio " + str(self.ratio) + + def size(self, f3d): + return GFX_SIZE * 4 - def to_sm64_decomp_s(self): - return 'gsSPClipRatio ' + str(self.ratio) - - def size(self, f3d): - return GFX_SIZE * 4 # SPInsertMatrix # SPForceMatrix -class SPModifyVertex: - def __init__(self, vtx, where, val): - self.vtx = vtx - self.where = where - self.val = val - - def to_binary(self, f3d, segments): - if f3d.F3DLP_GBI or f3d.F3DEX_GBI: - words = _SHIFTL(f3d.G_MODIFYVTX,24,8) | \ - _SHIFTL((self.where),16,8) | \ - _SHIFTL((self.vtx)*2,0,16), self.val - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') - else: - return gsMoveWd(f3d.G_MW_POINTS, (self.vtx)*40+(self.where), \ - self.val, f3d) - - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') - def to_c(self, static = True): - header = 'gsSPModifyVertex(' if static else 'gSPModifyVertex(glistp++, ' - return header + str(self.vtx) + ', ' + str(self.where) + ', ' + \ - str(self.val) + ')' +class SPModifyVertex: + def __init__(self, vtx, where, val): + self.vtx = vtx + self.where = where + self.val = val + + def to_binary(self, f3d, segments): + if f3d.F3DLP_GBI or f3d.F3DEX_GBI: + words = ( + _SHIFTL(f3d.G_MODIFYVTX, 24, 8) + | _SHIFTL((self.where), 16, 8) + | _SHIFTL((self.vtx) * 2, 0, 16), + self.val, + ) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + else: + return gsMoveWd( + f3d.G_MW_POINTS, (self.vtx) * 40 + (self.where), self.val, f3d + ) + + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + def to_c(self, static=True): + header = "gsSPModifyVertex(" if static else "gSPModifyVertex(glistp++, " + return ( + header + str(self.vtx) + ", " + str(self.where) + ", " + str(self.val) + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsSPModifyVertex " + + str(self.vtx) + + ", " + + str(self.where) + + ", " + + str(self.val) + ) + + def size(self, f3d): + return GFX_SIZE - def to_sm64_decomp_s(self): - return 'gsSPModifyVertex ' + str(self.vtx) + ', ' + \ - str(self.where) + ', ' + str(self.val) - - def size(self, f3d): - return GFX_SIZE # LOD commands? # SPBranchLessZ -class SPBranchLessZraw: - def __init__(self, dl, vtx, zval): - self.dl = dl - self.vtx = vtx - self.zval = zval - - def to_binary(self, f3d, segments): - dlPtr = int.from_bytes(encodeSegmentedAddr( - self.dl.startAddress, segments), 'big') - words0 = _SHIFTL(f3d.G_RDPHALF_1, 24, 8), dlPtr - words1 = _SHIFTL(f3d.G_BRANCH_Z,24,8)|_SHIFTL((self.vtx)*5,12,12)|_SHIFTL((self.vtx)*2,0,12), self.zval - - return words0[0].to_bytes(4, 'big') + words0[1].to_bytes(4, 'big') +\ - words1[0].to_bytes(4, 'big') + words1[1].to_bytes(4, 'big') - - def to_c(self, static = True): - dlName = self.dl.name - header = 'gsSPBranchLessZraw(' if static else 'gSPBranchLessZraw(glistp++, ' - return header + dlName + ", " + str(self.vtx) + ", " + str(self.zval) + ")" +class SPBranchLessZraw: + def __init__(self, dl, vtx, zval): + self.dl = dl + self.vtx = vtx + self.zval = zval + + def to_binary(self, f3d, segments): + dlPtr = int.from_bytes( + encodeSegmentedAddr(self.dl.startAddress, segments), "big" + ) + + words0 = _SHIFTL(f3d.G_RDPHALF_1, 24, 8), dlPtr + words1 = ( + _SHIFTL(f3d.G_BRANCH_Z, 24, 8) + | _SHIFTL((self.vtx) * 5, 12, 12) + | _SHIFTL((self.vtx) * 2, 0, 12), + self.zval, + ) + + return ( + words0[0].to_bytes(4, "big") + + words0[1].to_bytes(4, "big") + + words1[0].to_bytes(4, "big") + + words1[1].to_bytes(4, "big") + ) + + def to_c(self, static=True): + dlName = self.dl.name + header = "gsSPBranchLessZraw(" if static else "gSPBranchLessZraw(glistp++, " + return header + dlName + ", " + str(self.vtx) + ", " + str(self.zval) + ")" + + def to_sm64_decomp_s(self): + dlName = self.dl.name + return ( + "gsSPBranchLessZraw " + + dlName + + ", " + + str(self.vtx) + + ", " + + str(self.zval) + ) + + def size(self, f3d): + return GFX_SIZE * 2 - def to_sm64_decomp_s(self): - dlName = self.dl.name - return 'gsSPBranchLessZraw ' + dlName + ", " + str(self.vtx) + ", " + str(self.zval) - - def size(self, f3d): - return GFX_SIZE * 2 # SPLoadUcode (RSP) @@ -3404,914 +4603,1146 @@ def size(self, f3d): # SPDmaWrite # SPDmaWrite + class SPNumLights: - # n is macro name (string) - def __init__(self, n): - self.n = n - - def to_binary(self, f3d, segments): - return gsMoveWd(f3d.G_MW_NUMLIGHT, f3d.G_MWO_NUMLIGHT, \ - f3d.NUML(self.n), f3d) - - def to_c(self, static = True): - header = 'gsSPNumLights(' if static else 'gSPNumLights(glistp++, ' - return header + str(self.n) + ')' - - def to_sm64_decomp_s(self): - return 'gsSPNumLights ' + str(self.n) - - def size(self, f3d): - return GFX_SIZE + # n is macro name (string) + def __init__(self, n): + self.n = n + + def to_binary(self, f3d, segments): + return gsMoveWd(f3d.G_MW_NUMLIGHT, f3d.G_MWO_NUMLIGHT, f3d.NUML(self.n), f3d) + + def to_c(self, static=True): + header = "gsSPNumLights(" if static else "gSPNumLights(glistp++, " + return header + str(self.n) + ")" + + def to_sm64_decomp_s(self): + return "gsSPNumLights " + str(self.n) + + def size(self, f3d): + return GFX_SIZE + class SPLight: - # n is macro name (string) - def __init__(self, light, n): - self.light = light # start address of light - self.n = n - - def get_ptr_offsets(self, f3d): - return [4] - - def to_binary(self, f3d, segments): - lightPtr = int.from_bytes(encodeSegmentedAddr( - self.light, segments), 'big') - if f3d.F3DEX_GBI_2: - data = gsDma2p(f3d.G_MOVEMEM, lightPtr, LIGHT_SIZE, \ - f3d.G_MV_LIGHT, lightIndex[self.n] * 24 + 24) - else: - data = gsDma1p(f3d.G_MOVEMEM, lightPtr, LIGHT_SIZE, \ - (lightIndex[self.n]-1) * 2 + f3d.G_MV_L0) - return data - - def to_c(self, static = True): - header = 'gsSPLight(' if static else 'gSPLight(glistp++, ' - if not static and bpy.context.scene.decomp_compatible: - header += 'segmented_to_virtual(' + self.light.name + ')' - else: - header += self.light.name - return header + ', ' + str(self.n) + ')' - - def to_sm64_decomp_s(self): - return 'gsSPLight ' + self.light.name + ', ' + str(self.n) - - def size(self, f3d): - return GFX_SIZE + # n is macro name (string) + def __init__(self, light, n): + self.light = light # start address of light + self.n = n + + def get_ptr_offsets(self, f3d): + return [4] + + def to_binary(self, f3d, segments): + lightPtr = int.from_bytes(encodeSegmentedAddr(self.light, segments), "big") + if f3d.F3DEX_GBI_2: + data = gsDma2p( + f3d.G_MOVEMEM, + lightPtr, + LIGHT_SIZE, + f3d.G_MV_LIGHT, + lightIndex[self.n] * 24 + 24, + ) + else: + data = gsDma1p( + f3d.G_MOVEMEM, + lightPtr, + LIGHT_SIZE, + (lightIndex[self.n] - 1) * 2 + f3d.G_MV_L0, + ) + return data + + def to_c(self, static=True): + header = "gsSPLight(" if static else "gSPLight(glistp++, " + if not static and bpy.context.scene.decomp_compatible: + header += "segmented_to_virtual(" + self.light.name + ")" + else: + header += self.light.name + return header + ", " + str(self.n) + ")" + + def to_sm64_decomp_s(self): + return "gsSPLight " + self.light.name + ", " + str(self.n) + + def size(self, f3d): + return GFX_SIZE + class SPLightColor: - # n is macro name (string) - def __init__(self, n, col): - self.n = n - self.col = col - - def to_binary(self, f3d, segments): - return \ - gsMoveWd(f3d.G_MW_LIGHTCOL, f3d.getLightMWO_a(self.n), - self.col, f3d), +\ - gsMoveWd(f3d.G_MW_LIGHTCOL, f3d.getLightMWO_b(self.n), - self.col, f3d) - - def to_c(self, static = True): - header = 'gsSPLightColor(' if static else 'gSPLightColor(glistp++, ' - return header + str(self.n) + ', 0x' + format(self.col, '08X') + ')' - - def to_sm64_decomp_s(self): - return 'gsSPLightColor ' + str(self.n) + ', 0x' + \ - format(self.col, '08X') - - def size(self, f3d): - return GFX_SIZE + # n is macro name (string) + def __init__(self, n, col): + self.n = n + self.col = col + + def to_binary(self, f3d, segments): + return gsMoveWd( + f3d.G_MW_LIGHTCOL, f3d.getLightMWO_a(self.n), self.col, f3d + ), +gsMoveWd(f3d.G_MW_LIGHTCOL, f3d.getLightMWO_b(self.n), self.col, f3d) + + def to_c(self, static=True): + header = "gsSPLightColor(" if static else "gSPLightColor(glistp++, " + return header + str(self.n) + ", 0x" + format(self.col, "08X") + ")" + + def to_sm64_decomp_s(self): + return "gsSPLightColor " + str(self.n) + ", 0x" + format(self.col, "08X") + + def size(self, f3d): + return GFX_SIZE + class SPSetLights: - def __init__(self, lights): - self.lights = lights - - def get_ptr_offsets(self, f3d): - offsets = [] - if len(self.lights.l) == 0: - offsets = [12, 20] - else: - lightNum = len(self.lights.l) - for i in range(lightNum): - offsets.append((i+1) * 8 + 4) - offsets.append((lightNum + 1) * 8 + 4) - return offsets - - def to_binary(self, f3d, segments): - data = SPNumLights('NUMLIGHTS_' + str(len(self.lights.l))).to_binary( - f3d, segments) - if len(self.lights.l) == 0: - # The light does not exist in python, but is added in - # when converted to binary, making this address valid. - data += SPLight(self.lights.getLightPointer(0), 'LIGHT_1' - ).to_binary(f3d, segments) - data += SPLight(self.lights.getAmbientPointer(), 'LIGHT_2' - ).to_binary(f3d, segments) - else: - for i in range(len(self.lights.l)): - data += SPLight(self.lights.getLightPointer(i), - 'LIGHT_' + str(i+1)).to_binary(f3d, segments) - data += SPLight(self.lights.getAmbientPointer(), - 'LIGHT_' + str(len(self.lights.l) + 1)).to_binary(f3d, segments) - return data - - def to_c(self, static = True): - header = 'gsSPSetLights' + str(len(self.lights.l)) + '(' if static \ - else 'gSPSetLights' + str(len(self.lights.l)) + '(glistp++, ' - if not static and bpy.context.scene.decomp_compatible: - header += '(*(Lights' + str(len(self.lights.l)) + '*) segmented_to_virtual(&' + self.lights.name + '))' - else: - header += self.lights.name - return header + ')' - - def to_sm64_decomp_s(self): - return 'gsSPSetLights ' + self.lights.name - - def size(self, f3d): - return GFX_SIZE * (2 + max(len(self.lights.l), 1)) + def __init__(self, lights): + self.lights = lights + + def get_ptr_offsets(self, f3d): + offsets = [] + if len(self.lights.l) == 0: + offsets = [12, 20] + else: + lightNum = len(self.lights.l) + for i in range(lightNum): + offsets.append((i + 1) * 8 + 4) + offsets.append((lightNum + 1) * 8 + 4) + return offsets + + def to_binary(self, f3d, segments): + data = SPNumLights("NUMLIGHTS_" + str(len(self.lights.l))).to_binary( + f3d, segments + ) + if len(self.lights.l) == 0: + # The light does not exist in python, but is added in + # when converted to binary, making this address valid. + data += SPLight(self.lights.getLightPointer(0), "LIGHT_1").to_binary( + f3d, segments + ) + data += SPLight(self.lights.getAmbientPointer(), "LIGHT_2").to_binary( + f3d, segments + ) + else: + for i in range(len(self.lights.l)): + data += SPLight( + self.lights.getLightPointer(i), "LIGHT_" + str(i + 1) + ).to_binary(f3d, segments) + data += SPLight( + self.lights.getAmbientPointer(), "LIGHT_" + str(len(self.lights.l) + 1) + ).to_binary(f3d, segments) + return data + + def to_c(self, static=True): + header = ( + "gsSPSetLights" + str(len(self.lights.l)) + "(" + if static + else "gSPSetLights" + str(len(self.lights.l)) + "(glistp++, " + ) + if not static and bpy.context.scene.decomp_compatible: + header += ( + "(*(Lights" + + str(len(self.lights.l)) + + "*) segmented_to_virtual(&" + + self.lights.name + + "))" + ) + else: + header += self.lights.name + return header + ")" + + def to_sm64_decomp_s(self): + return "gsSPSetLights " + self.lights.name + + def size(self, f3d): + return GFX_SIZE * (2 + max(len(self.lights.l), 1)) + # Reflection/Hiliting Macros + def gsSPLookAtX(l, f3d): - if f3d.F3DEX_GBI_2: - return gsDma2p(f3d.G_MOVEMEM, l, LIGHT_SIZE, f3d.G_MV_LIGHT, - f3d.G_MVO_LOOKATX) - else: - return gsDma1p(f3d.G_MOVEMEM, l, LIGHT_SIZE, f3d.G_MV_LOOKATX) + if f3d.F3DEX_GBI_2: + return gsDma2p(f3d.G_MOVEMEM, l, LIGHT_SIZE, f3d.G_MV_LIGHT, f3d.G_MVO_LOOKATX) + else: + return gsDma1p(f3d.G_MOVEMEM, l, LIGHT_SIZE, f3d.G_MV_LOOKATX) + def gsSPLookAtY(l, f3d): - if f3d.F3DEX_GBI_2: - return gsDma2p(f3d.G_MOVEMEM, l, LIGHT_SIZE, f3d.G_MV_LIGHT, - f3d.G_MVO_LOOKATY) - else: - return gsDma1p(f3d.G_MOVEMEM, l, LIGHT_SIZE, f3d.G_MV_LOOKATY) + if f3d.F3DEX_GBI_2: + return gsDma2p(f3d.G_MOVEMEM, l, LIGHT_SIZE, f3d.G_MV_LIGHT, f3d.G_MVO_LOOKATY) + else: + return gsDma1p(f3d.G_MOVEMEM, l, LIGHT_SIZE, f3d.G_MV_LOOKATY) + class SPLookAt: - def __init__(self, la): - self.la = la - - def get_ptr_offsets(self, f3d): - return [4] - - def to_binary(self, f3d, segments): - light0Ptr = int.from_bytes(encodeSegmentedAddr( - self.la.startAddress, segments), 'big') - return gsSPLookAtX(light0Ptr, f3d) + gsSPLookAtY(light0Ptr + 16, f3d) - - def to_c(self, static = True): - header = 'gsSPLookAt(' if static else 'gSPLookAt(glistp++, ' - return header + '&' + self.la.name + ')' - - def to_sm64_decomp_s(self): - return 'gsSPLookAt ' + self.la.name - - def size(self, f3d): - return GFX_SIZE + def __init__(self, la): + self.la = la + + def get_ptr_offsets(self, f3d): + return [4] + + def to_binary(self, f3d, segments): + light0Ptr = int.from_bytes( + encodeSegmentedAddr(self.la.startAddress, segments), "big" + ) + return gsSPLookAtX(light0Ptr, f3d) + gsSPLookAtY(light0Ptr + 16, f3d) + + def to_c(self, static=True): + header = "gsSPLookAt(" if static else "gSPLookAt(glistp++, " + return header + "&" + self.la.name + ")" + + def to_sm64_decomp_s(self): + return "gsSPLookAt " + self.la.name + + def size(self, f3d): + return GFX_SIZE + class DPSetHilite1Tile: - def __init__(self, tile, hilite, width, height): - self.tile = tile - self.hilite = hilite - self.width = width - self.height = height - - def to_binary(self, f3d, segments): - return DPSetTileSize(self.tile, - self.hilite.x1 & 0xfff, self.hilite.y1 & 0xfff, - ((self.width - 1) * 4 + self.hilite.x1) & 0xfff, - ((self.height - 1) * 4 + self.hilite.y1) & 0xfff).to_binary( - f3d,segments) - - def to_c(self, static = True): - header = 'gsDPSetHilite1Tile(' if static else \ - 'gDPSetHilite1Tile(glistp++, ' - return header + str(self.tile) + ', ' + '&' + self.hilite.name + \ - ', ' + str(self.width) + ', ' + str(self.height) + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetHilite1Tile ' + str(self.tile) + ', ' + \ - self.hilite.name + ', ' + str(self.width) + ', ' + str(self.height) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, tile, hilite, width, height): + self.tile = tile + self.hilite = hilite + self.width = width + self.height = height + + def to_binary(self, f3d, segments): + return DPSetTileSize( + self.tile, + self.hilite.x1 & 0xFFF, + self.hilite.y1 & 0xFFF, + ((self.width - 1) * 4 + self.hilite.x1) & 0xFFF, + ((self.height - 1) * 4 + self.hilite.y1) & 0xFFF, + ).to_binary(f3d, segments) + + def to_c(self, static=True): + header = "gsDPSetHilite1Tile(" if static else "gDPSetHilite1Tile(glistp++, " + return ( + header + + str(self.tile) + + ", " + + "&" + + self.hilite.name + + ", " + + str(self.width) + + ", " + + str(self.height) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsDPSetHilite1Tile " + + str(self.tile) + + ", " + + self.hilite.name + + ", " + + str(self.width) + + ", " + + str(self.height) + ) + + def size(self, f3d): + return GFX_SIZE + class DPSetHilite2Tile: - def __init__(self, tile, hilite, width, height): - self.tile = tile - self.hilite = hilite - self.width = width - self.height = height - - def to_binary(self, f3d, segments): - return DPSetTileSize(self.tile, - self.hilite.x2 & 0xfff, self.hilite.y2 & 0xfff, - ((self.width - 1) * 4 + self.hilite.x2) & 0xfff, - ((self.height - 1) * 4 + self.hilite.y2) & 0xfff).to_binary( - f3d,segments) - - def to_c(self, static = True): - header = 'gsDPSetHilite2Tile(' if static else \ - 'gDPSetHilite2Tile(glistp++, ' - return header + str(self.tile) + ', ' + '&' + self.hilite.name + \ - ', ' + str(self.width) + ', ' + str(self.height) + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetHilite2Tile ' + str(self.tile) + ', ' + \ - self.hilite.name + ', ' + str(self.width) + ', ' + str(self.height) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, tile, hilite, width, height): + self.tile = tile + self.hilite = hilite + self.width = width + self.height = height + + def to_binary(self, f3d, segments): + return DPSetTileSize( + self.tile, + self.hilite.x2 & 0xFFF, + self.hilite.y2 & 0xFFF, + ((self.width - 1) * 4 + self.hilite.x2) & 0xFFF, + ((self.height - 1) * 4 + self.hilite.y2) & 0xFFF, + ).to_binary(f3d, segments) + + def to_c(self, static=True): + header = "gsDPSetHilite2Tile(" if static else "gDPSetHilite2Tile(glistp++, " + return ( + header + + str(self.tile) + + ", " + + "&" + + self.hilite.name + + ", " + + str(self.width) + + ", " + + str(self.height) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsDPSetHilite2Tile " + + str(self.tile) + + ", " + + self.hilite.name + + ", " + + str(self.width) + + ", " + + str(self.height) + ) + + def size(self, f3d): + return GFX_SIZE + class SPFogFactor: - def __init__(self, fm, fo): - self.fm = fm - self.fo = fo - - def to_binary(self, f3d, segments): - return gsMoveWd(f3d.G_MW_FOG, f3d.G_MWO_FOG, \ - (_SHIFTL(self.fm,16,16) | _SHIFTL(self.fo,0,16)), f3d) - - def to_c(self, static = True): - header = 'gsSPFogFactor(' if static else 'gSPFogFactor(glistp++, ' - return header + str(self.fm) + ', ' + str(self.fo) + ')' - - def to_sm64_decomp_s(self): - return 'gsSPFogFactor ' + str(self.fm) + ', ' + str(self.fo) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, fm, fo): + self.fm = fm + self.fo = fo + + def to_binary(self, f3d, segments): + return gsMoveWd( + f3d.G_MW_FOG, + f3d.G_MWO_FOG, + (_SHIFTL(self.fm, 16, 16) | _SHIFTL(self.fo, 0, 16)), + f3d, + ) + + def to_c(self, static=True): + header = "gsSPFogFactor(" if static else "gSPFogFactor(glistp++, " + return header + str(self.fm) + ", " + str(self.fo) + ")" + + def to_sm64_decomp_s(self): + return "gsSPFogFactor " + str(self.fm) + ", " + str(self.fo) + + def size(self, f3d): + return GFX_SIZE + class SPFogPosition: - def __init__(self, minVal, maxVal): - self.minVal = int(round(minVal)) - self.maxVal = int(round(maxVal)) - - def to_binary(self, f3d, segments): - return gsMoveWd(f3d.G_MW_FOG, f3d.G_MWO_FOG,\ - (_SHIFTL((128000/((self.maxVal)-(self.minVal))),16,16) | \ - _SHIFTL(((500-(self.minVal))*256/((self.maxVal)-(self.minVal))), - 0,16)), f3d) - - def to_c(self, static = True): - header = 'gsSPFogPosition(' if static else 'gSPFogPosition(glistp++, ' - return header + str(self.minVal) + ', ' + str(self.maxVal) + ')' - - def to_sm64_decomp_s(self): - return 'gsSPFogPosition ' + str(self.minVal) + ', ' + str(self.maxVal) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, minVal, maxVal): + self.minVal = int(round(minVal)) + self.maxVal = int(round(maxVal)) + + def to_binary(self, f3d, segments): + return gsMoveWd( + f3d.G_MW_FOG, + f3d.G_MWO_FOG, + ( + _SHIFTL((128000 / ((self.maxVal) - (self.minVal))), 16, 16) + | _SHIFTL( + ((500 - (self.minVal)) * 256 / ((self.maxVal) - (self.minVal))), + 0, + 16, + ) + ), + f3d, + ) + + def to_c(self, static=True): + header = "gsSPFogPosition(" if static else "gSPFogPosition(glistp++, " + return header + str(self.minVal) + ", " + str(self.maxVal) + ")" + + def to_sm64_decomp_s(self): + return "gsSPFogPosition " + str(self.minVal) + ", " + str(self.maxVal) + + def size(self, f3d): + return GFX_SIZE + class SPTexture: - def __init__(self, s, t, level, tile, on): - self.s = s - self.t = t - self.level = level - self.tile = tile - self.on = on - - def to_binary(self, f3d, segments): - if f3d.F3DEX_GBI_2: - words = (_SHIFTL(f3d.G_TEXTURE,24,8) | \ - _SHIFTL(f3d.BOWTIE_VAL,16,8) | \ - _SHIFTL((self.level),11,3) | _SHIFTL((self.tile),8,3) | \ - _SHIFTL((self.on),1,7)), (_SHIFTL((self.s),16,16) | \ - _SHIFTL((self.t),0,16)) - else: - words = (_SHIFTL(f3d.G_TEXTURE,24,8) | \ - _SHIFTL(f3d.BOWTIE_VAL,16,8) | \ - _SHIFTL((self.level),11,3)|_SHIFTL((self.tile),8,3) | \ - _SHIFTL((self.on),0,8)), (_SHIFTL((self.s),16,16) | \ - _SHIFTL((self.t),0,16)) - - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') - - def to_c(self, static = True): - header = 'gsSPTexture(' if static else 'gSPTexture(glistp++, ' - return header + str(self.s) + ', ' + str(self.t) + ', ' + \ - str(self.level) + ', ' + str(self.tile) + ', ' + str(self.on) + ')' - - def to_sm64_decomp_s(self): - return 'gsSPTexture ' + str(self.s) + ', ' + str(self.t) + ', ' + \ - str(self.level) + ', ' + str(self.tile) + ', ' + str(self.on) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, s, t, level, tile, on): + self.s = s + self.t = t + self.level = level + self.tile = tile + self.on = on + + def to_binary(self, f3d, segments): + if f3d.F3DEX_GBI_2: + words = ( + _SHIFTL(f3d.G_TEXTURE, 24, 8) + | _SHIFTL(f3d.BOWTIE_VAL, 16, 8) + | _SHIFTL((self.level), 11, 3) + | _SHIFTL((self.tile), 8, 3) + | _SHIFTL((self.on), 1, 7) + ), (_SHIFTL((self.s), 16, 16) | _SHIFTL((self.t), 0, 16)) + else: + words = ( + _SHIFTL(f3d.G_TEXTURE, 24, 8) + | _SHIFTL(f3d.BOWTIE_VAL, 16, 8) + | _SHIFTL((self.level), 11, 3) + | _SHIFTL((self.tile), 8, 3) + | _SHIFTL((self.on), 0, 8) + ), (_SHIFTL((self.s), 16, 16) | _SHIFTL((self.t), 0, 16)) + + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + def to_c(self, static=True): + header = "gsSPTexture(" if static else "gSPTexture(glistp++, " + return ( + header + + str(self.s) + + ", " + + str(self.t) + + ", " + + str(self.level) + + ", " + + str(self.tile) + + ", " + + str(self.on) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsSPTexture " + + str(self.s) + + ", " + + str(self.t) + + ", " + + str(self.level) + + ", " + + str(self.tile) + + ", " + + str(self.on) + ) + + def size(self, f3d): + return GFX_SIZE + # SPTextureL + class SPPerspNormalize: - def __init__(self, s): - self.s = s - - def to_binary(self, f3d, segments): - return gsMoveWd(f3d.G_MW_PERSPNORM, 0, (self.s), f3d) - - def to_c(self, static = True): - header = 'gsSPPerspNormalize(' if static else \ - 'gSPPerspNormalize(glistp++, ' - return header + str(self.s) + ')' - - def to_sm64_decomp_s(self): - return 'gsSPPerspNormalize ' + str(self.s) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, s): + self.s = s + + def to_binary(self, f3d, segments): + return gsMoveWd(f3d.G_MW_PERSPNORM, 0, (self.s), f3d) + + def to_c(self, static=True): + header = "gsSPPerspNormalize(" if static else "gSPPerspNormalize(glistp++, " + return header + str(self.s) + ")" + + def to_sm64_decomp_s(self): + return "gsSPPerspNormalize " + str(self.s) + + def size(self, f3d): + return GFX_SIZE + # SPPopMatrixN # SPPopMatrix + class SPEndDisplayList: - def __init__(self): - pass - - def to_binary(self, f3d, segments): - words = _SHIFTL(f3d.G_ENDDL, 24, 8), 0 - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') + def __init__(self): + pass + + def to_binary(self, f3d, segments): + words = _SHIFTL(f3d.G_ENDDL, 24, 8), 0 + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + def to_c(self, static=True): + return "gsSPEndDisplayList()" if static else "gSPEndDisplayList(glistp++)" - def to_c(self, static = True): - return 'gsSPEndDisplayList()' if static else \ - 'gSPEndDisplayList(glistp++)' + def to_sm64_decomp_s(self): + return "gsSPEndDisplayList" - def to_sm64_decomp_s(self): - return 'gsSPEndDisplayList' - - def size(self, f3d): - return GFX_SIZE + def size(self, f3d): + return GFX_SIZE + + +def gsSPGeometryMode_F3DEX_GBI_2(c, s, f3d): + words = (_SHIFTL(f3d.G_GEOMETRYMODE, 24, 8) | _SHIFTL(~c, 0, 24)), s + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") -def gsSPGeometryMode_F3DEX_GBI_2(c,s,f3d): - words = (_SHIFTL(f3d.G_GEOMETRYMODE,24,8) | \ - _SHIFTL(~c,0,24)), s - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') def gsSPGeometryMode_Non_F3DEX_GBI_2(word, f3d): - words = _SHIFTL(f3d.G_SETGEOMETRYMODE, 24, 8), word - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') + words = _SHIFTL(f3d.G_SETGEOMETRYMODE, 24, 8), word + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + def geoFlagListToWord(flagList, f3d): - word = 0 - for name in flagList: - if name == 'G_ZBUFFER': word += f3d.G_ZBUFFER - elif name == 'G_SHADE': word += f3d.G_SHADE - elif name == 'G_TEXTURE_ENABLE': word += f3d.G_TEXTURE_ENABLE - elif name == 'G_SHADING_SMOOTH': word += f3d.G_SHADING_SMOOTH - elif name == 'G_CULL_FRONT': word += f3d.G_CULL_FRONT - elif name == 'G_CULL_BACK': word += f3d.G_CULL_BACK - elif name == 'G_CULL_BOTH': word += f3d.G_CULL_BOTH - elif name == 'G_FOG': word += f3d.G_FOG - elif name == 'G_LIGHTING': word += f3d.G_LIGHTING - elif name == 'G_TEXTURE_GEN': word += f3d.G_TEXTURE_GEN - elif name == 'G_TEXTURE_GEN_LINEAR': word += f3d.G_TEXTURE_GEN_LINEAR - elif name == 'G_LOD': word += f3d.G_LOD - elif name == 'G_CLIPPING': word += f3d.G_CLIPPING - else: raise PluginError("Invalid geometry mode flag " + name) - - return word + word = 0 + for name in flagList: + if name == "G_ZBUFFER": + word += f3d.G_ZBUFFER + elif name == "G_SHADE": + word += f3d.G_SHADE + elif name == "G_TEXTURE_ENABLE": + word += f3d.G_TEXTURE_ENABLE + elif name == "G_SHADING_SMOOTH": + word += f3d.G_SHADING_SMOOTH + elif name == "G_CULL_FRONT": + word += f3d.G_CULL_FRONT + elif name == "G_CULL_BACK": + word += f3d.G_CULL_BACK + elif name == "G_CULL_BOTH": + word += f3d.G_CULL_BOTH + elif name == "G_FOG": + word += f3d.G_FOG + elif name == "G_LIGHTING": + word += f3d.G_LIGHTING + elif name == "G_TEXTURE_GEN": + word += f3d.G_TEXTURE_GEN + elif name == "G_TEXTURE_GEN_LINEAR": + word += f3d.G_TEXTURE_GEN_LINEAR + elif name == "G_LOD": + word += f3d.G_LOD + elif name == "G_CLIPPING": + word += f3d.G_CLIPPING + else: + raise PluginError("Invalid geometry mode flag " + name) + + return word + class SPGeometryMode: - def __init__(self, clearFlagList, setFlagList): - self.clearFlagList = clearFlagList - self.setFlagList = setFlagList - - def to_binary(self, f3d, segments): - if f3d.F3DEX_GBI_2: - wordClear = geoFlagListToWord(self.clearFlagList, f3d) - wordSet = geoFlagListToWord(self.setFlagList, f3d) - - return gsSPGeometryMode_F3DEX_GBI_2(wordClear, wordSet, f3d) - else: - raise PluginError("GeometryMode only available in F3DEX_GBI_2.") - - def to_c(self, static = True): - data = 'gsSPGeometryMode(' if static else \ - 'gSPGeometryMode(glistp++, ' - data += ((' | '.join(self.clearFlagList)) if len(self.clearFlagList) > 0 else '0') + ', ' - data += ((' | '.join(self.setFlagList)) if len(self.setFlagList) > 0 else '0') + ')' - return data - - def to_sm64_decomp_s(self): - data = 'gsSPGeometryMode ' - for flag in self.clearFlagList: - data += flag + ' | ' - data = data[:-3] + ', ' - for flag in self.setFlagList: - data += flag + ' | ' - return data[:-3] - - def size(self, f3d): - return GFX_SIZE + def __init__(self, clearFlagList, setFlagList): + self.clearFlagList = clearFlagList + self.setFlagList = setFlagList + + def to_binary(self, f3d, segments): + if f3d.F3DEX_GBI_2: + wordClear = geoFlagListToWord(self.clearFlagList, f3d) + wordSet = geoFlagListToWord(self.setFlagList, f3d) + + return gsSPGeometryMode_F3DEX_GBI_2(wordClear, wordSet, f3d) + else: + raise PluginError("GeometryMode only available in F3DEX_GBI_2.") + + def to_c(self, static=True): + data = "gsSPGeometryMode(" if static else "gSPGeometryMode(glistp++, " + data += ( + (" | ".join(self.clearFlagList)) if len(self.clearFlagList) > 0 else "0" + ) + ", " + data += ( + (" | ".join(self.setFlagList)) if len(self.setFlagList) > 0 else "0" + ) + ")" + return data + + def to_sm64_decomp_s(self): + data = "gsSPGeometryMode " + for flag in self.clearFlagList: + data += flag + " | " + data = data[:-3] + ", " + for flag in self.setFlagList: + data += flag + " | " + return data[:-3] + + def size(self, f3d): + return GFX_SIZE + class SPSetGeometryMode: - def __init__(self, flagList): - self.flagList = flagList - - def to_binary(self, f3d, segments): - word = geoFlagListToWord(self.flagList, f3d) - if f3d.F3DEX_GBI_2: - return gsSPGeometryMode_F3DEX_GBI_2(0, word, f3d) - else: - words = _SHIFTL(f3d.G_SETGEOMETRYMODE, 24, 8), word - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') - - def to_c(self, static = True): - data = 'gsSPSetGeometryMode(' if static else \ - 'gSPSetGeometryMode(glistp++, ' - for flag in self.flagList: - data += flag + ' | ' - return data[:-3] + ')' - - def to_sm64_decomp_s(self): - data = 'gsSPSetGeometryMode ' - for flag in self.flagList: - data += flag + ' | ' - return data[:-3] - - def size(self, f3d): - return GFX_SIZE + def __init__(self, flagList): + self.flagList = flagList + + def to_binary(self, f3d, segments): + word = geoFlagListToWord(self.flagList, f3d) + if f3d.F3DEX_GBI_2: + return gsSPGeometryMode_F3DEX_GBI_2(0, word, f3d) + else: + words = _SHIFTL(f3d.G_SETGEOMETRYMODE, 24, 8), word + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + def to_c(self, static=True): + data = "gsSPSetGeometryMode(" if static else "gSPSetGeometryMode(glistp++, " + for flag in self.flagList: + data += flag + " | " + return data[:-3] + ")" + + def to_sm64_decomp_s(self): + data = "gsSPSetGeometryMode " + for flag in self.flagList: + data += flag + " | " + return data[:-3] + + def size(self, f3d): + return GFX_SIZE + class SPClearGeometryMode: - def __init__(self, flagList): - self.flagList = flagList - - def to_binary(self, f3d, segments): - word = geoFlagListToWord(self.flagList, f3d) - if f3d.F3DEX_GBI_2: - return gsSPGeometryMode_F3DEX_GBI_2(word, 0, f3d) - else: - words = _SHIFTL(f3d.G_CLEARGEOMETRYMODE, 24, 8), word - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') - - def to_c(self, static = True): - data = 'gsSPClearGeometryMode(' if static else \ - 'gSPClearGeometryMode(glistp++, ' - for flag in self.flagList: - data += flag + ' | ' - return data[:-3] + ')' - - def to_sm64_decomp_s(self): - data = 'gsSPClearGeometryMode ' - for flag in self.flagList: - data += flag + ' | ' - return data[:-3] - - def size(self, f3d): - return GFX_SIZE + def __init__(self, flagList): + self.flagList = flagList + + def to_binary(self, f3d, segments): + word = geoFlagListToWord(self.flagList, f3d) + if f3d.F3DEX_GBI_2: + return gsSPGeometryMode_F3DEX_GBI_2(word, 0, f3d) + else: + words = _SHIFTL(f3d.G_CLEARGEOMETRYMODE, 24, 8), word + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + def to_c(self, static=True): + data = "gsSPClearGeometryMode(" if static else "gSPClearGeometryMode(glistp++, " + for flag in self.flagList: + data += flag + " | " + return data[:-3] + ")" + + def to_sm64_decomp_s(self): + data = "gsSPClearGeometryMode " + for flag in self.flagList: + data += flag + " | " + return data[:-3] + + def size(self, f3d): + return GFX_SIZE + class SPLoadGeometryMode: - def __init__(self, flagList): - self.flagList = flagList - - def to_binary(self, f3d, segments): - word = geoFlagListToWord(self.flagList, f3d) - if f3d.F3DEX_GBI_2: - return gsSPGeometryMode_F3DEX_GBI_2(-1, word, f3d) - else: - raise PluginError("LoadGeometryMode only available in F3DEX_GBI_2.") - - def to_c(self, static = True): - data = 'gsSPLoadGeometryMode(' if static else \ - 'gSPLoadGeometryMode(glistp++, ' - for flag in self.flagList: - data += flag + ' | ' - return data[:-3] + ')' - - def to_sm64_decomp_s(self): - data = 'gsSPLoadGeometryMode ' - for flag in self.flagList: - data += flag + ' | ' - return data[:-3] - - def size(self, f3d): - return GFX_SIZE + def __init__(self, flagList): + self.flagList = flagList + + def to_binary(self, f3d, segments): + word = geoFlagListToWord(self.flagList, f3d) + if f3d.F3DEX_GBI_2: + return gsSPGeometryMode_F3DEX_GBI_2(-1, word, f3d) + else: + raise PluginError("LoadGeometryMode only available in F3DEX_GBI_2.") + + def to_c(self, static=True): + data = "gsSPLoadGeometryMode(" if static else "gSPLoadGeometryMode(glistp++, " + for flag in self.flagList: + data += flag + " | " + return data[:-3] + ")" + + def to_sm64_decomp_s(self): + data = "gsSPLoadGeometryMode " + for flag in self.flagList: + data += flag + " | " + return data[:-3] + + def size(self, f3d): + return GFX_SIZE + def gsSPSetOtherMode(cmd, sft, length, data, f3d): - if f3d.F3DEX_GBI_2: - words = _SHIFTL(cmd,24,8) | _SHIFTL(32-(sft)-(length),8,8) | \ - _SHIFTL((length)-1,0,8), data - else: - words = _SHIFTL(cmd, 24, 8) | _SHIFTL(sft, 8, 8) | \ - _SHIFTL(length, 0, 8), (data) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') + if f3d.F3DEX_GBI_2: + words = ( + _SHIFTL(cmd, 24, 8) + | _SHIFTL(32 - (sft) - (length), 8, 8) + | _SHIFTL((length) - 1, 0, 8), + data, + ) + else: + words = _SHIFTL(cmd, 24, 8) | _SHIFTL(sft, 8, 8) | _SHIFTL(length, 0, 8), (data) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + class SPSetOtherMode: - def __init__(self, cmd, sft, length, flagList): - self.cmd = cmd - self.sft = sft - self.length = length - self.flagList = [] - - def to_binary(self, f3d, segments): - data = 0 - for flag in self.flagList: - data |= getattr(f3d, flag) if hasattr(f3d, str(flag)) else flag - cmd = getattr(f3d, self.cmd) if hasattr(f3d, str(self.cmd)) else self.cmd - sft = getattr(f3d, self.sft) if hasattr(f3d, str(self.sft)) else self.sft - return gsSPSetOtherMode(cmd, sft, self.length, data, f3d) - - def to_c(self, static = True): - data = '' - for flag in self.flagList: - data += flag + ' | ' - data = data[:-3] - header = 'gsSPSetOtherMode(' if static else \ - 'gSPSetOtherMode(glistp++, ' - return header + str(self.cmd) + ", " + str(self.sft) + ", " + str(self.length) + ", " + data + ')' - - def to_sm64_decomp_s(self): - data = '' - for flag in self.flagList: - data += flag + ' | ' - data = data[:-3] - return 'gsSPSetOtherMode ' + str(self.cmd) + ", " + str(self.sft) + ", " + str(self.length) + ", " + data - - def size(self, f3d): - return GFX_SIZE + def __init__(self, cmd, sft, length, flagList): + self.cmd = cmd + self.sft = sft + self.length = length + self.flagList = [] + + def to_binary(self, f3d, segments): + data = 0 + for flag in self.flagList: + data |= getattr(f3d, flag) if hasattr(f3d, str(flag)) else flag + cmd = getattr(f3d, self.cmd) if hasattr(f3d, str(self.cmd)) else self.cmd + sft = getattr(f3d, self.sft) if hasattr(f3d, str(self.sft)) else self.sft + return gsSPSetOtherMode(cmd, sft, self.length, data, f3d) + + def to_c(self, static=True): + data = "" + for flag in self.flagList: + data += flag + " | " + data = data[:-3] + header = "gsSPSetOtherMode(" if static else "gSPSetOtherMode(glistp++, " + return ( + header + + str(self.cmd) + + ", " + + str(self.sft) + + ", " + + str(self.length) + + ", " + + data + + ")" + ) + + def to_sm64_decomp_s(self): + data = "" + for flag in self.flagList: + data += flag + " | " + data = data[:-3] + return ( + "gsSPSetOtherMode " + + str(self.cmd) + + ", " + + str(self.sft) + + ", " + + str(self.length) + + ", " + + data + ) + + def size(self, f3d): + return GFX_SIZE + class DPPipelineMode: - # mode is a string - def __init__(self, mode): - self.mode = mode - - def to_binary(self, f3d, segments): - if self.mode == 'G_PM_1PRIMITIVE': modeVal = f3d.G_PM_1PRIMITIVE - elif self.mode == 'G_PM_NPRIMITIVE': modeVal = f3d.G_PM_NPRIMITIVE - return gsSPSetOtherMode(f3d.G_SETOTHERMODE_H, - f3d.G_MDSFT_PIPELINE, 1, modeVal, f3d) + # mode is a string + def __init__(self, mode): + self.mode = mode + + def to_binary(self, f3d, segments): + if self.mode == "G_PM_1PRIMITIVE": + modeVal = f3d.G_PM_1PRIMITIVE + elif self.mode == "G_PM_NPRIMITIVE": + modeVal = f3d.G_PM_NPRIMITIVE + return gsSPSetOtherMode( + f3d.G_SETOTHERMODE_H, f3d.G_MDSFT_PIPELINE, 1, modeVal, f3d + ) - def to_c(self, static = True): - header = 'gsDPPipelineMode(' if static else \ - 'gDPPipelineMode(glistp++, ' - return header + self.mode + ')' + def to_c(self, static=True): + header = "gsDPPipelineMode(" if static else "gDPPipelineMode(glistp++, " + return header + self.mode + ")" + def to_sm64_decomp_s(self): + return "gsDPPipelineMode " + self.mode - def to_sm64_decomp_s(self): - return 'gsDPPipelineMode ' + self.mode + def size(self, f3d): + return GFX_SIZE - def size(self, f3d): - return GFX_SIZE class DPSetCycleType: - # mode is a string - def __init__(self, mode): - self.mode = mode - - def to_binary(self, f3d, segments): - if self.mode == 'G_CYC_1CYCLE': modeVal = f3d.G_CYC_1CYCLE - elif self.mode == 'G_CYC_2CYCLE': modeVal = f3d.G_CYC_2CYCLE - elif self.mode == 'G_CYC_COPY': modeVal = f3d.G_CYC_COPY - elif self.mode == 'G_CYC_FILL': modeVal = f3d.G_CYC_FILL - return gsSPSetOtherMode(f3d.G_SETOTHERMODE_H, - f3d.G_MDSFT_CYCLETYPE, 2, modeVal, f3d) - - def to_c(self, static = True): - header = 'gsDPSetCycleType(' if static else \ - 'gDPSetCycleType(glistp++, ' - return header + self.mode + ')' - - - def to_sm64_decomp_s(self): - return 'gsDPSetCycleType ' + self.mode - - def size(self, f3d): - return GFX_SIZE + # mode is a string + def __init__(self, mode): + self.mode = mode + + def to_binary(self, f3d, segments): + if self.mode == "G_CYC_1CYCLE": + modeVal = f3d.G_CYC_1CYCLE + elif self.mode == "G_CYC_2CYCLE": + modeVal = f3d.G_CYC_2CYCLE + elif self.mode == "G_CYC_COPY": + modeVal = f3d.G_CYC_COPY + elif self.mode == "G_CYC_FILL": + modeVal = f3d.G_CYC_FILL + return gsSPSetOtherMode( + f3d.G_SETOTHERMODE_H, f3d.G_MDSFT_CYCLETYPE, 2, modeVal, f3d + ) + + def to_c(self, static=True): + header = "gsDPSetCycleType(" if static else "gDPSetCycleType(glistp++, " + return header + self.mode + ")" + + def to_sm64_decomp_s(self): + return "gsDPSetCycleType " + self.mode + + def size(self, f3d): + return GFX_SIZE + class DPSetTexturePersp: - # mode is a string - def __init__(self, mode): - self.mode = mode - - def to_binary(self, f3d, segments): - if self.mode == 'G_TP_NONE': modeVal = f3d.G_TP_NONE - elif self.mode == 'G_TP_PERSP': modeVal = f3d.G_TP_PERSP - return gsSPSetOtherMode(f3d.G_SETOTHERMODE_H, - f3d.G_MDSFT_TEXTPERSP, 1, modeVal, f3d) - - def to_c(self, static = True): - header = 'gsDPSetTexturePersp(' if static else \ - 'gDPSetTexturePersp(glistp++, ' - return header + self.mode + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetTexturePersp ' + self.mode - - def size(self, f3d): - return GFX_SIZE + # mode is a string + def __init__(self, mode): + self.mode = mode + + def to_binary(self, f3d, segments): + if self.mode == "G_TP_NONE": + modeVal = f3d.G_TP_NONE + elif self.mode == "G_TP_PERSP": + modeVal = f3d.G_TP_PERSP + return gsSPSetOtherMode( + f3d.G_SETOTHERMODE_H, f3d.G_MDSFT_TEXTPERSP, 1, modeVal, f3d + ) + + def to_c(self, static=True): + header = "gsDPSetTexturePersp(" if static else "gDPSetTexturePersp(glistp++, " + return header + self.mode + ")" + + def to_sm64_decomp_s(self): + return "gsDPSetTexturePersp " + self.mode + + def size(self, f3d): + return GFX_SIZE + class DPSetTextureDetail: - # mode is a string - def __init__(self, mode): - self.mode = mode - - def to_binary(self, f3d, segments): - if self.mode == 'G_TD_CLAMP': modeVal = f3d.G_TD_CLAMP - elif self.mode == 'G_TD_SHARPEN': modeVal = f3d.G_TD_SHARPEN - elif self.mode == 'G_TD_DETAIL': modeVal = f3d.G_TD_DETAIL - return gsSPSetOtherMode(f3d.G_SETOTHERMODE_H, - f3d.G_MDSFT_TEXTDETAIL, 2, modeVal, f3d) - - def to_c(self, static = True): - header = 'gsDPSetTextureDetail(' if static else \ - 'gDPSetTextureDetail(glistp++, ' - return header + self.mode + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetTextureDetail ' + self.mode - - def size(self, f3d): - return GFX_SIZE + # mode is a string + def __init__(self, mode): + self.mode = mode + + def to_binary(self, f3d, segments): + if self.mode == "G_TD_CLAMP": + modeVal = f3d.G_TD_CLAMP + elif self.mode == "G_TD_SHARPEN": + modeVal = f3d.G_TD_SHARPEN + elif self.mode == "G_TD_DETAIL": + modeVal = f3d.G_TD_DETAIL + return gsSPSetOtherMode( + f3d.G_SETOTHERMODE_H, f3d.G_MDSFT_TEXTDETAIL, 2, modeVal, f3d + ) + + def to_c(self, static=True): + header = "gsDPSetTextureDetail(" if static else "gDPSetTextureDetail(glistp++, " + return header + self.mode + ")" + + def to_sm64_decomp_s(self): + return "gsDPSetTextureDetail " + self.mode + + def size(self, f3d): + return GFX_SIZE + class DPSetTextureLOD: - # mode is a string - def __init__(self, mode): - self.mode = mode - - def to_binary(self, f3d, segments): - if self.mode == 'G_TL_TILE': modeVal = f3d.G_TL_TILE - elif self.mode == 'G_TL_LOD': modeVal = f3d.G_TL_LOD - return gsSPSetOtherMode(f3d.G_SETOTHERMODE_H, - f3d.G_MDSFT_TEXTLOD, 1, modeVal, f3d) - - def to_c(self, static = True): - header = 'gsDPSetTextureLOD(' if static else \ - 'gDPSetTextureLOD(glistp++, ' - return header + self.mode + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetTextureLOD ' + self.mode - - def size(self, f3d): - return GFX_SIZE + # mode is a string + def __init__(self, mode): + self.mode = mode + + def to_binary(self, f3d, segments): + if self.mode == "G_TL_TILE": + modeVal = f3d.G_TL_TILE + elif self.mode == "G_TL_LOD": + modeVal = f3d.G_TL_LOD + return gsSPSetOtherMode( + f3d.G_SETOTHERMODE_H, f3d.G_MDSFT_TEXTLOD, 1, modeVal, f3d + ) + + def to_c(self, static=True): + header = "gsDPSetTextureLOD(" if static else "gDPSetTextureLOD(glistp++, " + return header + self.mode + ")" + + def to_sm64_decomp_s(self): + return "gsDPSetTextureLOD " + self.mode + + def size(self, f3d): + return GFX_SIZE + class DPSetTextureLUT: - # mode is a string - def __init__(self, mode): - self.mode = mode - - def to_binary(self, f3d, segments): - if self.mode == 'G_TT_NONE': modeVal = f3d.G_TT_NONE - elif self.mode == 'G_TT_RGBA16': modeVal = f3d.G_TT_RGBA16 - elif self.mode == 'G_TT_IA16': modeVal = f3d.G_TT_IA16 - else: print("Invalid LUT mode " + str(self.mode)) - return gsSPSetOtherMode(f3d.G_SETOTHERMODE_H, - f3d.G_MDSFT_TEXTLUT, 2, modeVal, f3d) - - def to_c(self, static = True): - header = 'gsDPSetTextureLUT(' if static else \ - 'gDPSetTextureLUT(glistp++, ' - return header + self.mode + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetTextureLUT ' + self.mode - - def size(self, f3d): - return GFX_SIZE + # mode is a string + def __init__(self, mode): + self.mode = mode + + def to_binary(self, f3d, segments): + if self.mode == "G_TT_NONE": + modeVal = f3d.G_TT_NONE + elif self.mode == "G_TT_RGBA16": + modeVal = f3d.G_TT_RGBA16 + elif self.mode == "G_TT_IA16": + modeVal = f3d.G_TT_IA16 + else: + print("Invalid LUT mode " + str(self.mode)) + return gsSPSetOtherMode( + f3d.G_SETOTHERMODE_H, f3d.G_MDSFT_TEXTLUT, 2, modeVal, f3d + ) + + def to_c(self, static=True): + header = "gsDPSetTextureLUT(" if static else "gDPSetTextureLUT(glistp++, " + return header + self.mode + ")" + + def to_sm64_decomp_s(self): + return "gsDPSetTextureLUT " + self.mode + + def size(self, f3d): + return GFX_SIZE + class DPSetTextureFilter: - # mode is a string - def __init__(self, mode): - self.mode = mode - - def to_binary(self, f3d, segments): - if self.mode == 'G_TF_POINT': modeVal = f3d.G_TF_POINT - elif self.mode == 'G_TF_AVERAGE': modeVal = f3d.G_TF_AVERAGE - elif self.mode == 'G_TF_BILERP': modeVal = f3d.G_TF_BILERP - return gsSPSetOtherMode(f3d.G_SETOTHERMODE_H, - f3d.G_MDSFT_TEXTFILT, 2, modeVal, f3d) - - def to_c(self, static = True): - header = 'gsDPSetTextureFilter(' if static else \ - 'gDPSetTextureFilter(glistp++, ' - return header + self.mode + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetTextureFilter ' + self.mode - - def size(self, f3d): - return GFX_SIZE + # mode is a string + def __init__(self, mode): + self.mode = mode + + def to_binary(self, f3d, segments): + if self.mode == "G_TF_POINT": + modeVal = f3d.G_TF_POINT + elif self.mode == "G_TF_AVERAGE": + modeVal = f3d.G_TF_AVERAGE + elif self.mode == "G_TF_BILERP": + modeVal = f3d.G_TF_BILERP + return gsSPSetOtherMode( + f3d.G_SETOTHERMODE_H, f3d.G_MDSFT_TEXTFILT, 2, modeVal, f3d + ) + + def to_c(self, static=True): + header = "gsDPSetTextureFilter(" if static else "gDPSetTextureFilter(glistp++, " + return header + self.mode + ")" + + def to_sm64_decomp_s(self): + return "gsDPSetTextureFilter " + self.mode + + def size(self, f3d): + return GFX_SIZE + class DPSetTextureConvert: - # mode is a string - def __init__(self, mode): - self.mode = mode - - def to_binary(self, f3d, segments): - if self.mode == 'G_TC_CONV': modeVal = f3d.G_TC_CONV - elif self.mode == 'G_TC_FILTCONV': modeVal = f3d.G_TC_FILTCONV - elif self.mode == 'G_TC_FILT': modeVal = f3d.G_TC_FILT - return gsSPSetOtherMode(f3d.G_SETOTHERMODE_H, - f3d.G_MDSFT_TEXTCONV, 3, modeVal, f3d) - - def to_c(self, static = True): - header = 'gsDPSetTextureConvert(' if static else \ - 'gDPSetTextureConvert(glistp++, ' - return header + self.mode + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetTextureConvert ' + self.mode - - def size(self, f3d): - return GFX_SIZE + # mode is a string + def __init__(self, mode): + self.mode = mode + + def to_binary(self, f3d, segments): + if self.mode == "G_TC_CONV": + modeVal = f3d.G_TC_CONV + elif self.mode == "G_TC_FILTCONV": + modeVal = f3d.G_TC_FILTCONV + elif self.mode == "G_TC_FILT": + modeVal = f3d.G_TC_FILT + return gsSPSetOtherMode( + f3d.G_SETOTHERMODE_H, f3d.G_MDSFT_TEXTCONV, 3, modeVal, f3d + ) + + def to_c(self, static=True): + header = ( + "gsDPSetTextureConvert(" if static else "gDPSetTextureConvert(glistp++, " + ) + return header + self.mode + ")" + + def to_sm64_decomp_s(self): + return "gsDPSetTextureConvert " + self.mode + + def size(self, f3d): + return GFX_SIZE + class DPSetCombineKey: - # mode is a string - def __init__(self, mode): - self.mode = mode - - def to_binary(self, f3d, segments): - if self.mode == 'G_CK_NONE': modeVal = f3d.G_CK_NONE - elif self.mode == 'G_CK_KEY': modeVal = f3d.G_CK_KEY - return gsSPSetOtherMode(f3d.G_SETOTHERMODE_H, - f3d.G_MDSFT_COMBKEY, 1, modeVal, f3d) - - def to_c(self, static = True): - header = 'gsDPSetCombineKey(' if static else \ - 'gDPSetCombineKey(glistp++, ' - return header + self.mode + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetCombineKey ' + self.mode - - def size(self, f3d): - return GFX_SIZE + # mode is a string + def __init__(self, mode): + self.mode = mode + + def to_binary(self, f3d, segments): + if self.mode == "G_CK_NONE": + modeVal = f3d.G_CK_NONE + elif self.mode == "G_CK_KEY": + modeVal = f3d.G_CK_KEY + return gsSPSetOtherMode( + f3d.G_SETOTHERMODE_H, f3d.G_MDSFT_COMBKEY, 1, modeVal, f3d + ) + + def to_c(self, static=True): + header = "gsDPSetCombineKey(" if static else "gDPSetCombineKey(glistp++, " + return header + self.mode + ")" + + def to_sm64_decomp_s(self): + return "gsDPSetCombineKey " + self.mode + + def size(self, f3d): + return GFX_SIZE + class DPSetColorDither: - # mode is a string - def __init__(self, mode): - self.mode = mode - - def to_binary(self, f3d, segments): - if not f3d._HW_VERSION_1: - if self.mode == 'G_CD_MAGICSQ': modeVal = f3d.G_CD_MAGICSQ - elif self.mode == 'G_CD_BAYER': modeVal = f3d.G_CD_BAYER - elif self.mode == 'G_CD_NOISE': modeVal = f3d.G_CD_NOISE - elif self.mode == 'G_CD_DISABLE': modeVal = f3d.G_CD_DISABLE - elif self.mode == 'G_CD_ENABLE': modeVal = f3d.G_CD_ENABLE - return gsSPSetOtherMode(f3d.G_SETOTHERMODE_H, - f3d.G_MDSFT_RGBDITHER, 2, modeVal, f3d) - else: - if self.mode == 'G_CD_ENABLE': modeVal = f3d.G_CD_ENABLE - elif self.mode == 'G_CD_DISABLE': modeVal = f3d.G_CD_DISABLE - return gsSPSetOtherMode(f3d.G_SETOTHERMODE_H, - f3d.G_MDSFT_COLORDITHER, 1, modeVal, f3d) - - def to_c(self, static = True): - header = 'gsDPSetColorDither(' if static else \ - 'gDPSetColorDither(glistp++, ' - return header + self.mode + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetColorDither ' + self.mode - - def size(self, f3d): - return GFX_SIZE + # mode is a string + def __init__(self, mode): + self.mode = mode + + def to_binary(self, f3d, segments): + if not f3d._HW_VERSION_1: + if self.mode == "G_CD_MAGICSQ": + modeVal = f3d.G_CD_MAGICSQ + elif self.mode == "G_CD_BAYER": + modeVal = f3d.G_CD_BAYER + elif self.mode == "G_CD_NOISE": + modeVal = f3d.G_CD_NOISE + elif self.mode == "G_CD_DISABLE": + modeVal = f3d.G_CD_DISABLE + elif self.mode == "G_CD_ENABLE": + modeVal = f3d.G_CD_ENABLE + return gsSPSetOtherMode( + f3d.G_SETOTHERMODE_H, f3d.G_MDSFT_RGBDITHER, 2, modeVal, f3d + ) + else: + if self.mode == "G_CD_ENABLE": + modeVal = f3d.G_CD_ENABLE + elif self.mode == "G_CD_DISABLE": + modeVal = f3d.G_CD_DISABLE + return gsSPSetOtherMode( + f3d.G_SETOTHERMODE_H, f3d.G_MDSFT_COLORDITHER, 1, modeVal, f3d + ) + + def to_c(self, static=True): + header = "gsDPSetColorDither(" if static else "gDPSetColorDither(glistp++, " + return header + self.mode + ")" + + def to_sm64_decomp_s(self): + return "gsDPSetColorDither " + self.mode + + def size(self, f3d): + return GFX_SIZE + class DPSetAlphaDither: - # mode is a string - def __init__(self, mode): - self.mode = mode - - def to_binary(self, f3d, segments): - if not f3d._HW_VERSION_1: - if self.mode == 'G_AD_PATTERN': modeVal = f3d.G_AD_PATTERN - elif self.mode == 'G_AD_NOTPATTERN': modeVal = f3d.G_AD_NOTPATTERN - elif self.mode == 'G_AD_NOISE': modeVal = f3d.G_AD_NOISE - elif self.mode == 'G_AD_DISABLE': modeVal = f3d.G_AD_DISABLE - return gsSPSetOtherMode(f3d.G_SETOTHERMODE_H, - f3d.G_MDSFT_ALPHADITHER, 2, modeVal, f3d) - else: - raise PluginError("SetAlphaDither not available in HW v1.") - - def to_c(self, static = True): - header = 'gsDPSetAlphaDither(' if static else \ - 'gDPSetAlphaDither(glistp++, ' - return header + self.mode + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetAlphaDither ' + self.mode - - def size(self, f3d): - return GFX_SIZE + # mode is a string + def __init__(self, mode): + self.mode = mode + + def to_binary(self, f3d, segments): + if not f3d._HW_VERSION_1: + if self.mode == "G_AD_PATTERN": + modeVal = f3d.G_AD_PATTERN + elif self.mode == "G_AD_NOTPATTERN": + modeVal = f3d.G_AD_NOTPATTERN + elif self.mode == "G_AD_NOISE": + modeVal = f3d.G_AD_NOISE + elif self.mode == "G_AD_DISABLE": + modeVal = f3d.G_AD_DISABLE + return gsSPSetOtherMode( + f3d.G_SETOTHERMODE_H, f3d.G_MDSFT_ALPHADITHER, 2, modeVal, f3d + ) + else: + raise PluginError("SetAlphaDither not available in HW v1.") + + def to_c(self, static=True): + header = "gsDPSetAlphaDither(" if static else "gDPSetAlphaDither(glistp++, " + return header + self.mode + ")" + + def to_sm64_decomp_s(self): + return "gsDPSetAlphaDither " + self.mode + + def size(self, f3d): + return GFX_SIZE + class DPSetAlphaCompare: - # mask is a string - def __init__(self, mask): - self.mask = mask - - def to_binary(self, f3d, segments): - if self.mask == 'G_AC_NONE': maskVal = f3d.G_AC_NONE - elif self.mask == 'G_AC_THRESHOLD': maskVal = f3d.G_AC_THRESHOLD - elif self.mask == 'G_AC_DITHER': maskVal = f3d.G_AC_DITHER - return gsSPSetOtherMode(f3d.G_SETOTHERMODE_L, - f3d.G_MDSFT_ALPHACOMPARE, 2, maskVal, f3d) - - def to_c(self, static = True): - header = 'gsDPSetAlphaCompare(' if static else \ - 'gDPSetAlphaCompare(glistp++, ' - return header + self.mask + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetAlphaCompare ' + self.mask - - def size(self, f3d): - return GFX_SIZE + # mask is a string + def __init__(self, mask): + self.mask = mask + + def to_binary(self, f3d, segments): + if self.mask == "G_AC_NONE": + maskVal = f3d.G_AC_NONE + elif self.mask == "G_AC_THRESHOLD": + maskVal = f3d.G_AC_THRESHOLD + elif self.mask == "G_AC_DITHER": + maskVal = f3d.G_AC_DITHER + return gsSPSetOtherMode( + f3d.G_SETOTHERMODE_L, f3d.G_MDSFT_ALPHACOMPARE, 2, maskVal, f3d + ) + + def to_c(self, static=True): + header = "gsDPSetAlphaCompare(" if static else "gDPSetAlphaCompare(glistp++, " + return header + self.mask + ")" + + def to_sm64_decomp_s(self): + return "gsDPSetAlphaCompare " + self.mask + + def size(self, f3d): + return GFX_SIZE + class DPSetDepthSource: - # src is a string - def __init__(self, src): - self.src = src - - def to_binary(self, f3d, segments): - if self.src == 'G_ZS_PIXEL': srcVal = f3d.G_ZS_PIXEL - elif self.src == 'G_ZS_PRIM': srcVal = f3d.G_ZS_PRIM - return gsSPSetOtherMode(f3d.G_SETOTHERMODE_L, - f3d.G_MDSFT_ZSRCSEL, 1, srcVal, f3d) - - def to_c(self, static = True): - header = 'gsDPSetDepthSource(' if static else \ - 'gDPSetDepthSource(glistp++, ' - return header + self.src + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetDepthSource ' + self.src - - def size(self, f3d): - return GFX_SIZE + # src is a string + def __init__(self, src): + self.src = src + + def to_binary(self, f3d, segments): + if self.src == "G_ZS_PIXEL": + srcVal = f3d.G_ZS_PIXEL + elif self.src == "G_ZS_PRIM": + srcVal = f3d.G_ZS_PRIM + return gsSPSetOtherMode( + f3d.G_SETOTHERMODE_L, f3d.G_MDSFT_ZSRCSEL, 1, srcVal, f3d + ) + + def to_c(self, static=True): + header = "gsDPSetDepthSource(" if static else "gDPSetDepthSource(glistp++, " + return header + self.src + ")" + + def to_sm64_decomp_s(self): + return "gsDPSetDepthSource " + self.src + + def size(self, f3d): + return GFX_SIZE + def renderFlagListToWord(flagList, f3d): - word = 0 - for name in flagList: - word += getattr(f3d, name) - - return word + word = 0 + for name in flagList: + word += getattr(f3d, name) + + return word + + +def GBL_c1(m1a, m1b, m2a, m2b): + return (m1a) << 30 | (m1b) << 26 | (m2a) << 22 | (m2b) << 18 + + +def GBL_c2(m1a, m1b, m2a, m2b): + return (m1a) << 28 | (m1b) << 24 | (m2a) << 20 | (m2b) << 16 -def GBL_c1(m1a, m1b, m2a, m2b): - return (m1a) << 30 | (m1b) << 26 | (m2a) << 22 | (m2b) << 18 -def GBL_c2(m1a, m1b, m2a, m2b): - return (m1a) << 28 | (m1b) << 24 | (m2a) << 20 | (m2b) << 16 class DPSetRenderMode: - # bl0-3 are string for each blender enum - def __init__(self, flagList, blendList): - self.flagList = flagList - self.use_preset = blendList is None - if not self.use_preset: - self.bl00 = blendList[0] - self.bl01 = blendList[1] - self.bl02 = blendList[2] - self.bl03 = blendList[3] - self.bl10 = blendList[4] - self.bl11 = blendList[5] - self.bl12 = blendList[6] - self.bl13 = blendList[7] - - def getGBL_c(self, f3d): - bl00 = getattr(f3d, self.bl00) - bl01 = getattr(f3d, self.bl01) - bl02 = getattr(f3d, self.bl02) - bl03 = getattr(f3d, self.bl03) - bl10 = getattr(f3d, self.bl10) - bl11 = getattr(f3d, self.bl11) - bl12 = getattr(f3d, self.bl12) - bl13 = getattr(f3d, self.bl13) - return GBL_c1(bl00, bl01, bl02, bl03) | \ - GBL_c2(bl10, bl11, bl12, bl13) - - def to_binary(self, f3d, segments): - flagWord = renderFlagListToWord(self.flagList, f3d) - - if not self.use_preset: - return gsSPSetOtherMode(f3d.G_SETOTHERMODE_L, - f3d.G_MDSFT_RENDERMODE, 29, flagWord | self.getGBL_c(f3d), f3d) - else: - return gsSPSetOtherMode(f3d.G_SETOTHERMODE_L, - f3d.G_MDSFT_RENDERMODE, 29, flagWord, f3d) - - def to_c(self, static = True): - data = 'gsDPSetRenderMode(' if static else \ - 'gDPSetRenderMode(glistp++, ' - - if not self.use_preset: - data += 'GBL_c1(' + self.bl00 + ', ' + self.bl01 + ', ' + \ - self.bl02 + ', ' + self.bl03 + ') | GBL_c2(' + self.bl10 + \ - ', ' + self.bl11 + ', ' + self.bl12 + ', ' + self.bl13 + '), ' - for name in self.flagList: - data += name + ' | ' - return data[:-3] + ')' - else: - if len(self.flagList) != 2: - raise PluginError("For a rendermode preset, only two fields should be used.") - data += self.flagList[0] + ', ' + self.flagList[1] + ')' - return data - - def to_sm64_decomp_s(self): - raise PluginError("Cannot use DPSetRenderMode with gbi.inc.") - flagWord = renderFlagListToWord(self.flagList, f3d) - data = 'gsDPSetRenderMode ' - data += '0x' + format(flagWord, 'X') + ', ' - data += '0x' + format(self.getGBL_c(f3d), 'X') - return data - - ''' + # bl0-3 are string for each blender enum + def __init__(self, flagList, blendList): + self.flagList = flagList + self.use_preset = blendList is None + if not self.use_preset: + self.bl00 = blendList[0] + self.bl01 = blendList[1] + self.bl02 = blendList[2] + self.bl03 = blendList[3] + self.bl10 = blendList[4] + self.bl11 = blendList[5] + self.bl12 = blendList[6] + self.bl13 = blendList[7] + + def getGBL_c(self, f3d): + bl00 = getattr(f3d, self.bl00) + bl01 = getattr(f3d, self.bl01) + bl02 = getattr(f3d, self.bl02) + bl03 = getattr(f3d, self.bl03) + bl10 = getattr(f3d, self.bl10) + bl11 = getattr(f3d, self.bl11) + bl12 = getattr(f3d, self.bl12) + bl13 = getattr(f3d, self.bl13) + return GBL_c1(bl00, bl01, bl02, bl03) | GBL_c2(bl10, bl11, bl12, bl13) + + def to_binary(self, f3d, segments): + flagWord = renderFlagListToWord(self.flagList, f3d) + + if not self.use_preset: + return gsSPSetOtherMode( + f3d.G_SETOTHERMODE_L, + f3d.G_MDSFT_RENDERMODE, + 29, + flagWord | self.getGBL_c(f3d), + f3d, + ) + else: + return gsSPSetOtherMode( + f3d.G_SETOTHERMODE_L, f3d.G_MDSFT_RENDERMODE, 29, flagWord, f3d + ) + + def to_c(self, static=True): + data = "gsDPSetRenderMode(" if static else "gDPSetRenderMode(glistp++, " + + if not self.use_preset: + data += ( + "GBL_c1(" + + self.bl00 + + ", " + + self.bl01 + + ", " + + self.bl02 + + ", " + + self.bl03 + + ") | GBL_c2(" + + self.bl10 + + ", " + + self.bl11 + + ", " + + self.bl12 + + ", " + + self.bl13 + + "), " + ) + for name in self.flagList: + data += name + " | " + return data[:-3] + ")" + else: + if len(self.flagList) != 2: + raise PluginError( + "For a rendermode preset, only two fields should be used." + ) + data += self.flagList[0] + ", " + self.flagList[1] + ")" + return data + + def to_sm64_decomp_s(self): + raise PluginError("Cannot use DPSetRenderMode with gbi.inc.") + flagWord = renderFlagListToWord(self.flagList, f3d) + data = "gsDPSetRenderMode " + data += "0x" + format(flagWord, "X") + ", " + data += "0x" + format(self.getGBL_c(f3d), "X") + return data + + """ # G_SETOTHERMODE_L gSetRenderMode self.AA_EN = AA_EN = 0x8 self.Z_CMP = Z_CMP = 0x10 @@ -4342,1299 +5773,2399 @@ def to_sm64_decomp_s(self): self.G_BL_A_SHADE = G_BL_A_SHADE = 2 self.G_BL_1 = G_BL_1 = 2 self.G_BL_0 = G_BL_0 = 3 - ''' - - def size(self, f3d): - return GFX_SIZE + """ + + def size(self, f3d): + return GFX_SIZE + def gsSetImage(cmd, fmt, siz, width, i): - words = _SHIFTL(cmd, 24, 8) | _SHIFTL(fmt, 21, 3) | \ - _SHIFTL(siz, 19, 2) | _SHIFTL((width)-1, 0, 12), i - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') + words = ( + _SHIFTL(cmd, 24, 8) + | _SHIFTL(fmt, 21, 3) + | _SHIFTL(siz, 19, 2) + | _SHIFTL((width) - 1, 0, 12), + i, + ) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") -# DPSetColorImage + +# DPSetColorImage # DPSetDepthImage + class DPSetTextureImage: - def __init__(self, fmt, siz, width, img): - self.fmt = fmt # string - self.siz = siz # string - self.width = width - self.image = img - - def get_ptr_offsets(self, f3d): - return [4] - - def to_binary(self, f3d, segments): - fmt = f3d.G_IM_FMT_VARS[self.fmt] - siz = f3d.G_IM_SIZ_VARS[self.siz] - imagePtr = int.from_bytes(encodeSegmentedAddr( - self.image.startAddress, segments), 'big') - return gsSetImage(f3d.G_SETTIMG, fmt, siz, self.width, imagePtr) - - def to_c(self, static = True): - header = 'gsDPSetTextureImage(' if static else \ - 'gDPSetTextureImage(glistp++, ' - header += self.fmt + ', ' + self.siz + ', ' + \ - str(self.width) + ', ' - if not static and bpy.context.scene.decomp_compatible: - header += 'segmented_to_virtual(' + self.image.name + '))' - else: - header += self.image.name + ')' - return header - - def to_sm64_decomp_s(self): - return 'gsDPSetTextureImage ' + self.fmt + ', ' + self.siz + \ - ', ' + str(self.width) + ', ' + self.image.name - - def size(self, f3d): - return GFX_SIZE + def __init__(self, fmt, siz, width, img): + self.fmt = fmt # string + self.siz = siz # string + self.width = width + self.image = img + + def get_ptr_offsets(self, f3d): + return [4] + + def to_binary(self, f3d, segments): + fmt = f3d.G_IM_FMT_VARS[self.fmt] + siz = f3d.G_IM_SIZ_VARS[self.siz] + imagePtr = int.from_bytes( + encodeSegmentedAddr(self.image.startAddress, segments), "big" + ) + return gsSetImage(f3d.G_SETTIMG, fmt, siz, self.width, imagePtr) + + def to_c(self, static=True): + header = "gsDPSetTextureImage(" if static else "gDPSetTextureImage(glistp++, " + header += self.fmt + ", " + self.siz + ", " + str(self.width) + ", " + if not static and bpy.context.scene.decomp_compatible: + header += "segmented_to_virtual(" + self.image.name + "))" + else: + header += self.image.name + ")" + return header + + def to_sm64_decomp_s(self): + return ( + "gsDPSetTextureImage " + + self.fmt + + ", " + + self.siz + + ", " + + str(self.width) + + ", " + + self.image.name + ) + + def size(self, f3d): + return GFX_SIZE + + +def gsDPSetCombine(muxs0, muxs1, f3d): + words = _SHIFTL(f3d.G_SETCOMBINE, 24, 8) | _SHIFTL(muxs0, 0, 24), muxs1 + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + +def GCCc0w0(saRGB0, mRGB0, saA0, mA0): + return ( + _SHIFTL((saRGB0), 20, 4) + | _SHIFTL((mRGB0), 15, 5) + | _SHIFTL((saA0), 12, 3) + | _SHIFTL((mA0), 9, 3) + ) + + +def GCCc1w0(saRGB1, mRGB1): + return _SHIFTL((saRGB1), 5, 4) | _SHIFTL((mRGB1), 0, 5) -def gsDPSetCombine(muxs0, muxs1, f3d): - words = _SHIFTL(f3d.G_SETCOMBINE, 24, 8) | _SHIFTL(muxs0, 0, 24), muxs1 - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') -def GCCc0w0(saRGB0, mRGB0, saA0, mA0): - return (_SHIFTL((saRGB0), 20, 4) | _SHIFTL((mRGB0), 15, 5) | \ - _SHIFTL((saA0), 12, 3) | _SHIFTL((mA0), 9, 3)) +def GCCc0w1(sbRGB0, aRGB0, sbA0, aA0): + return ( + _SHIFTL((sbRGB0), 28, 4) + | _SHIFTL((aRGB0), 15, 3) + | _SHIFTL((sbA0), 12, 3) + | _SHIFTL((aA0), 9, 3) + ) -def GCCc1w0(saRGB1, mRGB1): - return (_SHIFTL((saRGB1), 5, 4) | _SHIFTL((mRGB1), 0, 5)) -def GCCc0w1(sbRGB0, aRGB0, sbA0, aA0): - return (_SHIFTL((sbRGB0), 28, 4) | _SHIFTL((aRGB0), 15, 3) |\ - _SHIFTL((sbA0), 12, 3) | _SHIFTL((aA0), 9, 3)) +def GCCc1w1(sbRGB1, saA1, mA1, aRGB1, sbA1, aA1): + return ( + _SHIFTL((sbRGB1), 24, 4) + | _SHIFTL((saA1), 21, 3) + | _SHIFTL((mA1), 18, 3) + | _SHIFTL((aRGB1), 6, 3) + | _SHIFTL((sbA1), 3, 3) + | _SHIFTL((aA1), 0, 3) + ) -def GCCc1w1(sbRGB1, saA1, mA1, aRGB1, sbA1, aA1): - return (_SHIFTL((sbRGB1), 24, 4) | _SHIFTL((saA1), 21, 3) | \ - _SHIFTL((mA1), 18, 3) | _SHIFTL((aRGB1), 6, 3) | \ - _SHIFTL((sbA1), 3, 3) | _SHIFTL((aA1), 0, 3)) class DPSetCombineMode: - # all strings - def __init__(self, a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, - a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1): - self.a0 = a0 - self.b0 = b0 - self.c0 = c0 - self.d0 = d0 - self.Aa0 = Aa0 - self.Ab0 = Ab0 - self.Ac0 = Ac0 - self.Ad0 = Ad0 - - self.a1 = a1 - self.b1 = b1 - self.c1 = c1 - self.d1 = d1 - self.Aa1 = Aa1 - self.Ab1 = Ab1 - self.Ac1 = Ac1 - self.Ad1 = Ad1 - - def to_binary(self, f3d, segments): - words = _SHIFTL(f3d.G_SETCOMBINE, 24, 8) | \ - _SHIFTL( - GCCc0w0( - f3d.CCMUXDict[self.a0], f3d.CCMUXDict[self.c0], \ - f3d.ACMUXDict[self.Aa0], f3d.ACMUXDict[self.Ac0]) | \ - GCCc1w0( - f3d.CCMUXDict[self.a1], f3d.CCMUXDict[self.c1]), \ - 0, 24),\ - GCCc0w1( - f3d.CCMUXDict[self.b0], f3d.CCMUXDict[self.d0], \ - f3d.ACMUXDict[self.Ab0], f3d.ACMUXDict[self.Ad0]) | \ - GCCc1w1( - f3d.CCMUXDict[self.b1], f3d.ACMUXDict[self.Aa1], \ - f3d.ACMUXDict[self.Ac1], f3d.CCMUXDict[self.d1], \ - f3d.ACMUXDict[self.Ab1], f3d.ACMUXDict[self.Ad1]) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') - - def to_c(self, static = True): - a0 = self.a0 # 'G_CCMUX_' + self.a0 - b0 = self.b0 # 'G_CCMUX_' + self.b0 - c0 = self.c0 # 'G_CCMUX_' + self.c0 - d0 = self.d0 # 'G_CCMUX_' + self.d0 - - Aa0 = self.Aa0 # 'G_ACMUX_' + self.Aa0 - Ab0 = self.Ab0 # 'G_ACMUX_' + self.Ab0 - Ac0 = self.Ac0 # 'G_ACMUX_' + self.Ac0 - Ad0 = self.Ad0 # 'G_ACMUX_' + self.Ad0 - - a1 = self.a1 # 'G_CCMUX_' + self.a1 - b1 = self.b1 # 'G_CCMUX_' + self.b1 - c1 = self.c1 # 'G_CCMUX_' + self.c1 - d1 = self.d1 # 'G_CCMUX_' + self.d1 - - Aa1 = self.Aa1 # 'G_ACMUX_' + self.Aa1 - Ab1 = self.Ab1 # 'G_ACMUX_' + self.Ab1 - Ac1 = self.Ac1 # 'G_ACMUX_' + self.Ac1 - Ad1 = self.Ad1 # 'G_ACMUX_' + self.Ad1 - - # No tabs/line breaks, breaks macros - header = 'gsDPSetCombineLERP(' if static else \ - 'gDPSetCombineLERP(glistp++, ' - return header + a0 + ', ' + b0 + ', ' + c0 + ', ' + \ - d0 + ', ' + Aa0 + ', ' + Ab0 + ', ' + \ - Ac0 + ', ' + Ad0 + ', ' + a1 + ', ' + \ - b1 + ', ' + c1 + ', ' + d1 + ', ' + Aa1 + \ - ', ' + Ab1 + ', ' + Ac1 + ', ' + Ad1 + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetCombineLERP ' + self.a0 + ', ' + self.b0 + ', ' +\ - self.c0 + ', ' + self.d0 + ', ' + self.Aa0 + ', ' + \ - self.Ab0 + ', ' + self.Ac0 + ', ' + self.Ad0 + ', ' + \ - self.a1 + ', ' + self.b1 + ', ' + self.c1 + ', ' + self.d1 + \ - ', ' + self.Aa1 + ', ' + self.Ab1 + ', ' + self.Ac1 + \ - ', ' + self.Ad1 - - def size(self, f3d): - return GFX_SIZE + # all strings + def __init__( + self, a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1 + ): + self.a0 = a0 + self.b0 = b0 + self.c0 = c0 + self.d0 = d0 + self.Aa0 = Aa0 + self.Ab0 = Ab0 + self.Ac0 = Ac0 + self.Ad0 = Ad0 + + self.a1 = a1 + self.b1 = b1 + self.c1 = c1 + self.d1 = d1 + self.Aa1 = Aa1 + self.Ab1 = Ab1 + self.Ac1 = Ac1 + self.Ad1 = Ad1 + + def to_binary(self, f3d, segments): + words = _SHIFTL(f3d.G_SETCOMBINE, 24, 8) | _SHIFTL( + GCCc0w0( + f3d.CCMUXDict[self.a0], + f3d.CCMUXDict[self.c0], + f3d.ACMUXDict[self.Aa0], + f3d.ACMUXDict[self.Ac0], + ) + | GCCc1w0(f3d.CCMUXDict[self.a1], f3d.CCMUXDict[self.c1]), + 0, + 24, + ), GCCc0w1( + f3d.CCMUXDict[self.b0], + f3d.CCMUXDict[self.d0], + f3d.ACMUXDict[self.Ab0], + f3d.ACMUXDict[self.Ad0], + ) | GCCc1w1( + f3d.CCMUXDict[self.b1], + f3d.ACMUXDict[self.Aa1], + f3d.ACMUXDict[self.Ac1], + f3d.CCMUXDict[self.d1], + f3d.ACMUXDict[self.Ab1], + f3d.ACMUXDict[self.Ad1], + ) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + def to_c(self, static=True): + a0 = self.a0 # 'G_CCMUX_' + self.a0 + b0 = self.b0 # 'G_CCMUX_' + self.b0 + c0 = self.c0 # 'G_CCMUX_' + self.c0 + d0 = self.d0 # 'G_CCMUX_' + self.d0 + + Aa0 = self.Aa0 # 'G_ACMUX_' + self.Aa0 + Ab0 = self.Ab0 # 'G_ACMUX_' + self.Ab0 + Ac0 = self.Ac0 # 'G_ACMUX_' + self.Ac0 + Ad0 = self.Ad0 # 'G_ACMUX_' + self.Ad0 + + a1 = self.a1 # 'G_CCMUX_' + self.a1 + b1 = self.b1 # 'G_CCMUX_' + self.b1 + c1 = self.c1 # 'G_CCMUX_' + self.c1 + d1 = self.d1 # 'G_CCMUX_' + self.d1 + + Aa1 = self.Aa1 # 'G_ACMUX_' + self.Aa1 + Ab1 = self.Ab1 # 'G_ACMUX_' + self.Ab1 + Ac1 = self.Ac1 # 'G_ACMUX_' + self.Ac1 + Ad1 = self.Ad1 # 'G_ACMUX_' + self.Ad1 + + # No tabs/line breaks, breaks macros + header = "gsDPSetCombineLERP(" if static else "gDPSetCombineLERP(glistp++, " + return ( + header + + a0 + + ", " + + b0 + + ", " + + c0 + + ", " + + d0 + + ", " + + Aa0 + + ", " + + Ab0 + + ", " + + Ac0 + + ", " + + Ad0 + + ", " + + a1 + + ", " + + b1 + + ", " + + c1 + + ", " + + d1 + + ", " + + Aa1 + + ", " + + Ab1 + + ", " + + Ac1 + + ", " + + Ad1 + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsDPSetCombineLERP " + + self.a0 + + ", " + + self.b0 + + ", " + + self.c0 + + ", " + + self.d0 + + ", " + + self.Aa0 + + ", " + + self.Ab0 + + ", " + + self.Ac0 + + ", " + + self.Ad0 + + ", " + + self.a1 + + ", " + + self.b1 + + ", " + + self.c1 + + ", " + + self.d1 + + ", " + + self.Aa1 + + ", " + + self.Ab1 + + ", " + + self.Ac1 + + ", " + + self.Ad1 + ) + + def size(self, f3d): + return GFX_SIZE + def gsDPSetColor(c, d): - words = _SHIFTL(c, 24, 8), d - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') + words = _SHIFTL(c, 24, 8), d + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + +def sDPRGBColor(cmd, r, g, b, a): + return gsDPSetColor( + cmd, + (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8)), + ) -def sDPRGBColor(cmd, r, g, b, a): - return gsDPSetColor(cmd, \ - (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | \ - _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8))) class DPSetEnvColor: - def __init__(self, r, g, b, a): - self.r = r - self.g = g - self.b = b - self.a = a - - def to_binary(self, f3d, segments): - return sDPRGBColor(f3d.G_SETENVCOLOR, self.r, self.g, self.b, self.a) - - def to_c(self, static = True): - header = 'gsDPSetEnvColor(' if static else 'gDPSetEnvColor(glistp++, ' - return header + str(self.r) + ', ' + str(self.g) + ', ' + \ - str(self.b) + ', ' + str(self.a) + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetEnvColor ' + str(self.r) + ', ' + str(self.g) + \ - ', ' + str(self.b) + ', ' + str(self.a) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, r, g, b, a): + self.r = r + self.g = g + self.b = b + self.a = a + + def to_binary(self, f3d, segments): + return sDPRGBColor(f3d.G_SETENVCOLOR, self.r, self.g, self.b, self.a) + + def to_c(self, static=True): + header = "gsDPSetEnvColor(" if static else "gDPSetEnvColor(glistp++, " + return ( + header + + str(self.r) + + ", " + + str(self.g) + + ", " + + str(self.b) + + ", " + + str(self.a) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsDPSetEnvColor " + + str(self.r) + + ", " + + str(self.g) + + ", " + + str(self.b) + + ", " + + str(self.a) + ) + + def size(self, f3d): + return GFX_SIZE + class DPSetBlendColor: - def __init__(self, r, g, b, a): - self.r = r - self.g = g - self.b = b - self.a = a - - def to_binary(self, f3d, segments): - return sDPRGBColor(f3d.G_SETBLENDCOLOR, self.r, self.g, self.b, self.a) - - def to_c(self, static = True): - header = 'gsDPSetBlendColor(' if static else \ - 'gDPSetBlendColor(glistp++, ' - return header + str(self.r) + ', ' + str(self.g) + ', ' + \ - str(self.b) + ', ' + str(self.a) + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetBlendColor ' + str(self.r) + ', ' + str(self.g) + \ - ', ' + str(self.b) + ', ' + str(self.a) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, r, g, b, a): + self.r = r + self.g = g + self.b = b + self.a = a + + def to_binary(self, f3d, segments): + return sDPRGBColor(f3d.G_SETBLENDCOLOR, self.r, self.g, self.b, self.a) + + def to_c(self, static=True): + header = "gsDPSetBlendColor(" if static else "gDPSetBlendColor(glistp++, " + return ( + header + + str(self.r) + + ", " + + str(self.g) + + ", " + + str(self.b) + + ", " + + str(self.a) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsDPSetBlendColor " + + str(self.r) + + ", " + + str(self.g) + + ", " + + str(self.b) + + ", " + + str(self.a) + ) + + def size(self, f3d): + return GFX_SIZE + class DPSetFogColor: - def __init__(self, r, g, b, a): - self.r = r - self.g = g - self.b = b - self.a = a - - def to_binary(self, f3d, segments): - return sDPRGBColor(f3d.G_SETFOGCOLOR, self.r, self.g, self.b, self.a) - - def to_c(self, static = True): - header = 'gsDPSetFogColor(' if static else \ - 'gDPSetFogColor(glistp++, ' - return header + str(self.r) + ', ' + str(self.g) + ', ' + \ - str(self.b) + ', ' + str(self.a) + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetFogColor ' + str(self.r) + ', ' + str(self.g) + \ - ', ' + str(self.b) + ', ' + str(self.a) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, r, g, b, a): + self.r = r + self.g = g + self.b = b + self.a = a + + def to_binary(self, f3d, segments): + return sDPRGBColor(f3d.G_SETFOGCOLOR, self.r, self.g, self.b, self.a) + + def to_c(self, static=True): + header = "gsDPSetFogColor(" if static else "gDPSetFogColor(glistp++, " + return ( + header + + str(self.r) + + ", " + + str(self.g) + + ", " + + str(self.b) + + ", " + + str(self.a) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsDPSetFogColor " + + str(self.r) + + ", " + + str(self.g) + + ", " + + str(self.b) + + ", " + + str(self.a) + ) + + def size(self, f3d): + return GFX_SIZE + class DPSetFillColor: - def __init__(self, d): - self.d = d - - def to_binary(self, f3d, segments): - return gsDPSetColor(f3d.G_SETFILLCOLOR, self.d) - - def to_c(self, static = True): - header = 'gsDPSetFillColor(' if static else \ - 'gDPSetFillColor(glistp++, ' - return header + str(self.d) + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetFillColor ' + str(self.d) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, d): + self.d = d + + def to_binary(self, f3d, segments): + return gsDPSetColor(f3d.G_SETFILLCOLOR, self.d) + + def to_c(self, static=True): + header = "gsDPSetFillColor(" if static else "gDPSetFillColor(glistp++, " + return header + str(self.d) + ")" + + def to_sm64_decomp_s(self): + return "gsDPSetFillColor " + str(self.d) + + def size(self, f3d): + return GFX_SIZE + class DPSetPrimDepth: - def __init__(self, z=0, dz=0): - self.z = z - self.dz = dz - - def to_binary(self, f3d, segments): - return gsDPSetColor(f3d.G_SETPRIMDEPTH, _SHIFTL(self.z, 16, 16) | \ - _SHIFTL(self.dz, 0, 16)) - - def to_c(self, static = True): - header = 'gsDPSetPrimDepth(' if static else \ - 'gDPSetPrimDepth(glistp++, ' - return header + str(self.z) + ', ' + str(self.dz) + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetPrimDepth ' + str(self.z) + ', ' + str(self.dz) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, z=0, dz=0): + self.z = z + self.dz = dz + + def to_binary(self, f3d, segments): + return gsDPSetColor( + f3d.G_SETPRIMDEPTH, _SHIFTL(self.z, 16, 16) | _SHIFTL(self.dz, 0, 16) + ) + + def to_c(self, static=True): + header = "gsDPSetPrimDepth(" if static else "gDPSetPrimDepth(glistp++, " + return header + str(self.z) + ", " + str(self.dz) + ")" + + def to_sm64_decomp_s(self): + return "gsDPSetPrimDepth " + str(self.z) + ", " + str(self.dz) + + def size(self, f3d): + return GFX_SIZE + class DPSetPrimColor: - def __init__(self, m, l, r, g, b, a): - self.m = m - self.l = l - self.r = r - self.g = g - self.b = b - self.a = a - - def to_binary(self, f3d, segments): - words = (_SHIFTL(f3d.G_SETPRIMCOLOR, 24, 8) | _SHIFTL(self.m, 8, 8) | \ - _SHIFTL(self.l, 0, 8)), (_SHIFTL(self.r, 24, 8) | \ - _SHIFTL(self.g, 16, 8) | _SHIFTL(self.b, 8, 8) | \ - _SHIFTL(self.a, 0, 8)) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') - - def to_c(self, static = True): - header = 'gsDPSetPrimColor(' if static else \ - 'gDPSetPrimColor(glistp++, ' - return header + str(self.m) + ', ' + str(self.l) + ', ' + \ - str(self.r) + ', ' + str(self.g) + ', ' + \ - str(self.b) + ', ' + str(self.a) + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetPrimColor ' + str(self.m) + ', ' + str(self.l) + \ - ', ' + str(self.r) + ', ' + str(self.g) + \ - ', ' + str(self.b) + ', ' + str(self.a) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, m, l, r, g, b, a): + self.m = m + self.l = l + self.r = r + self.g = g + self.b = b + self.a = a + + def to_binary(self, f3d, segments): + words = ( + _SHIFTL(f3d.G_SETPRIMCOLOR, 24, 8) + | _SHIFTL(self.m, 8, 8) + | _SHIFTL(self.l, 0, 8) + ), ( + _SHIFTL(self.r, 24, 8) + | _SHIFTL(self.g, 16, 8) + | _SHIFTL(self.b, 8, 8) + | _SHIFTL(self.a, 0, 8) + ) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + def to_c(self, static=True): + header = "gsDPSetPrimColor(" if static else "gDPSetPrimColor(glistp++, " + return ( + header + + str(self.m) + + ", " + + str(self.l) + + ", " + + str(self.r) + + ", " + + str(self.g) + + ", " + + str(self.b) + + ", " + + str(self.a) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsDPSetPrimColor " + + str(self.m) + + ", " + + str(self.l) + + ", " + + str(self.r) + + ", " + + str(self.g) + + ", " + + str(self.b) + + ", " + + str(self.a) + ) + + def size(self, f3d): + return GFX_SIZE + class DPSetOtherMode: - def __init__(self, mode0, mode1): - self.mode0 = mode0 - self.mode1 = mode1 - - def to_binary(self, f3d, segments): - words = _SHIFTL(f3d.G_RDPSETOTHERMODE,24,8) | \ - _SHIFTL(self.mode0,0,24), self.mode1 - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') - - def to_c(self, static = True): - header = 'gsDPSetOtherMode(' if static else \ - 'gDPSetOtherMode(glistp++, ' - - mode0String = '' - for item in self.mode0: - mode0String += item + ' | ' - mode0String = mode0String[:-3] - - mode1String = '' - for item in self.mode1: - mode1String += item + ' | ' - mode1String = mode1String[:-3] - - return header + mode0String + ', ' + mode1String + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetOtherMode ' + str(self.mode0) + ', ' + str(self.mode1) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, mode0, mode1): + self.mode0 = mode0 + self.mode1 = mode1 + + def to_binary(self, f3d, segments): + words = ( + _SHIFTL(f3d.G_RDPSETOTHERMODE, 24, 8) | _SHIFTL(self.mode0, 0, 24), + self.mode1, + ) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + def to_c(self, static=True): + header = "gsDPSetOtherMode(" if static else "gDPSetOtherMode(glistp++, " + + mode0String = "" + for item in self.mode0: + mode0String += item + " | " + mode0String = mode0String[:-3] + + mode1String = "" + for item in self.mode1: + mode1String += item + " | " + mode1String = mode1String[:-3] + + return header + mode0String + ", " + mode1String + ")" + + def to_sm64_decomp_s(self): + return "gsDPSetOtherMode " + str(self.mode0) + ", " + str(self.mode1) + + def size(self, f3d): + return GFX_SIZE + def gsDPLoadTileGeneric(c, tile, uls, ult, lrs, lrt): - words = _SHIFTL(c, 24, 8) | _SHIFTL(uls, 12, 12) | _SHIFTL(ult, 0, 12), \ - _SHIFTL(tile, 24, 3) | _SHIFTL(lrs, 12, 12) | _SHIFTL(lrt, 0, 12) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') + words = _SHIFTL(c, 24, 8) | _SHIFTL(uls, 12, 12) | _SHIFTL(ult, 0, 12), _SHIFTL( + tile, 24, 3 + ) | _SHIFTL(lrs, 12, 12) | _SHIFTL(lrt, 0, 12) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + class DPSetTileSize: - def __init__(self, t, uls, ult, lrs, lrt): - self.t = t - self.uls = uls - self.ult = ult - self.lrs = lrs - self.lrt = lrt - - def to_binary(self, f3d, segments): - return gsDPLoadTileGeneric(f3d.G_SETTILESIZE, self.t, - self.uls, self.ult, self.lrs, self.lrt) - - def to_c(self, static = True): - header = 'gsDPSetTileSize(' if static else 'gDPSetTileSize(glistp++, ' - return header + str(self.t) + ', ' + str(self.uls) + ', ' + \ - str(self.ult) + ', ' + str(self.lrs) + ', ' + str(self.lrt) + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetTileSize ' + str(self.t) + ', ' + str(self.uls) + ', ' + \ - str(self.ult) + ', ' + str(self.lrs) + ', ' + str(self.lrt) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, t, uls, ult, lrs, lrt): + self.t = t + self.uls = uls + self.ult = ult + self.lrs = lrs + self.lrt = lrt + + def to_binary(self, f3d, segments): + return gsDPLoadTileGeneric( + f3d.G_SETTILESIZE, self.t, self.uls, self.ult, self.lrs, self.lrt + ) + + def to_c(self, static=True): + header = "gsDPSetTileSize(" if static else "gDPSetTileSize(glistp++, " + return ( + header + + str(self.t) + + ", " + + str(self.uls) + + ", " + + str(self.ult) + + ", " + + str(self.lrs) + + ", " + + str(self.lrt) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsDPSetTileSize " + + str(self.t) + + ", " + + str(self.uls) + + ", " + + str(self.ult) + + ", " + + str(self.lrs) + + ", " + + str(self.lrt) + ) + + def size(self, f3d): + return GFX_SIZE + class DPLoadTile: - def __init__(self, t, uls, ult, lrs, lrt): - self.t = t - self.uls = uls - self.ult = ult - self.lrs = lrs - self.lrt = lrt - - def to_binary(self, f3d, segments): - return gsDPLoadTileGeneric(f3d.G_LOADTILE, self.t, - self.uls, self.ult, self.lrs, self.lrt) - - def to_c(self, static = True): - header = 'gsDPLoadTile(' if static else 'gDPLoadTile(glistp++, ' - return header + str(self.t) + ', ' + str(self.uls) + ', ' + \ - str(self.ult) + ', ' + str(self.lrs) + ', ' + str(self.lrt) + ')' - - def to_sm64_decomp_s(self): - return 'gsDPLoadTile ' + str(self.t) + ', ' + str(self.uls) + ', ' + \ - str(self.ult) + ', ' + str(self.lrs) + ', ' + str(self.lrt) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, t, uls, ult, lrs, lrt): + self.t = t + self.uls = uls + self.ult = ult + self.lrs = lrs + self.lrt = lrt + + def to_binary(self, f3d, segments): + return gsDPLoadTileGeneric( + f3d.G_LOADTILE, self.t, self.uls, self.ult, self.lrs, self.lrt + ) + + def to_c(self, static=True): + header = "gsDPLoadTile(" if static else "gDPLoadTile(glistp++, " + return ( + header + + str(self.t) + + ", " + + str(self.uls) + + ", " + + str(self.ult) + + ", " + + str(self.lrs) + + ", " + + str(self.lrt) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsDPLoadTile " + + str(self.t) + + ", " + + str(self.uls) + + ", " + + str(self.ult) + + ", " + + str(self.lrs) + + ", " + + str(self.lrt) + ) + + def size(self, f3d): + return GFX_SIZE + class DPSetTile: - def __init__(self, fmt, siz, line, tmem, tile, palette, cmt, \ - maskt, shiftt, cms, masks, shifts): - self.fmt = fmt # is a string - self.siz = siz # is a string - self.line = line - self.tmem = tmem - self.tile = tile - self.palette = palette - self.cmt = cmt # list of two strings - self.maskt = maskt - self.shiftt = shiftt - self.cms = cms # list of two strings - self.masks = masks - self.shifts = shifts - - def to_binary(self, f3d, segments): - cms = f3d.G_TX_VARS[self.cms[0]] + f3d.G_TX_VARS[self.cms[1]] - cmt = f3d.G_TX_VARS[self.cmt[0]] + f3d.G_TX_VARS[self.cmt[1]] - - words = (_SHIFTL(f3d.G_SETTILE, 24, 8) | \ - _SHIFTL(f3d.G_IM_FMT_VARS[self.fmt], 21, 3) | \ - _SHIFTL(f3d.G_IM_SIZ_VARS[self.siz], 19, 2) | \ - _SHIFTL(self.line, 9, 9) | \ - _SHIFTL(self.tmem, 0, 9)), (_SHIFTL(self.tile, 24, 3) | \ - _SHIFTL(self.palette, 20, 4) | _SHIFTL(cmt, 18, 2) | \ - _SHIFTL(self.maskt, 14, 4) | _SHIFTL(self.shiftt, 10, 4) | \ - _SHIFTL(cms, 8, 2) | _SHIFTL(self.masks, 4, 4) | \ - _SHIFTL(self.shifts, 0, 4)) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') - - def to_c(self, static = True): - # no tabs/line breaks, breaks macros - header = 'gsDPSetTile(' if static else 'gDPSetTile(glistp++, ' - return header + self.fmt + ', ' + self.siz + ', ' + \ - str(self.line) + ', ' + str(self.tmem) + ', ' + \ - str(self.tile) + ', ' + str(self.palette) + ', ' + \ - self.cmt[0] + ' | ' + self.cmt[1] + ', ' + str(self.maskt) + \ - ', ' + str(self.shiftt) + ', ' + self.cms[0] + ' | ' + \ - self.cms[1] + ', ' + str(self.masks) + ', ' + str(self.shifts) + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetTile ' + self.fmt + ', ' + self.siz + ', ' + \ - str(self.line) + ', ' + str(self.tmem) + ', ' + \ - str(self.tile) + ', ' + str(self.palette) + ', ' + \ - self.cmt[0] + ' | ' + self.cmt[1] + ', ' + str(self.maskt) + \ - ', ' + str(self.shiftt) + ', ' + self.cms[0] + ' | ' + \ - self.cms[1] + ', ' + str(self.masks) + ', ' + str(self.shifts) - - def size(self, f3d): - return GFX_SIZE + def __init__( + self, + fmt, + siz, + line, + tmem, + tile, + palette, + cmt, + maskt, + shiftt, + cms, + masks, + shifts, + ): + self.fmt = fmt # is a string + self.siz = siz # is a string + self.line = line + self.tmem = tmem + self.tile = tile + self.palette = palette + self.cmt = cmt # list of two strings + self.maskt = maskt + self.shiftt = shiftt + self.cms = cms # list of two strings + self.masks = masks + self.shifts = shifts + + def to_binary(self, f3d, segments): + cms = f3d.G_TX_VARS[self.cms[0]] + f3d.G_TX_VARS[self.cms[1]] + cmt = f3d.G_TX_VARS[self.cmt[0]] + f3d.G_TX_VARS[self.cmt[1]] + + words = ( + _SHIFTL(f3d.G_SETTILE, 24, 8) + | _SHIFTL(f3d.G_IM_FMT_VARS[self.fmt], 21, 3) + | _SHIFTL(f3d.G_IM_SIZ_VARS[self.siz], 19, 2) + | _SHIFTL(self.line, 9, 9) + | _SHIFTL(self.tmem, 0, 9) + ), ( + _SHIFTL(self.tile, 24, 3) + | _SHIFTL(self.palette, 20, 4) + | _SHIFTL(cmt, 18, 2) + | _SHIFTL(self.maskt, 14, 4) + | _SHIFTL(self.shiftt, 10, 4) + | _SHIFTL(cms, 8, 2) + | _SHIFTL(self.masks, 4, 4) + | _SHIFTL(self.shifts, 0, 4) + ) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + def to_c(self, static=True): + # no tabs/line breaks, breaks macros + header = "gsDPSetTile(" if static else "gDPSetTile(glistp++, " + return ( + header + + self.fmt + + ", " + + self.siz + + ", " + + str(self.line) + + ", " + + str(self.tmem) + + ", " + + str(self.tile) + + ", " + + str(self.palette) + + ", " + + self.cmt[0] + + " | " + + self.cmt[1] + + ", " + + str(self.maskt) + + ", " + + str(self.shiftt) + + ", " + + self.cms[0] + + " | " + + self.cms[1] + + ", " + + str(self.masks) + + ", " + + str(self.shifts) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsDPSetTile " + + self.fmt + + ", " + + self.siz + + ", " + + str(self.line) + + ", " + + str(self.tmem) + + ", " + + str(self.tile) + + ", " + + str(self.palette) + + ", " + + self.cmt[0] + + " | " + + self.cmt[1] + + ", " + + str(self.maskt) + + ", " + + str(self.shiftt) + + ", " + + self.cms[0] + + " | " + + self.cms[1] + + ", " + + str(self.masks) + + ", " + + str(self.shifts) + ) + + def size(self, f3d): + return GFX_SIZE + class DPLoadBlock: - def __init__(self, tile, uls, ult, lrs, dxt): - self.tile = tile - self.uls = uls - self.ult = ult - self.lrs = lrs - self.dxt = dxt - - def to_binary(self, f3d, segments): - words = (_SHIFTL(f3d.G_LOADBLOCK, 24, 8) | _SHIFTL(self.uls, 12, 12) | \ - _SHIFTL(self.ult, 0, 12)), (_SHIFTL(self.tile, 24, 3) | \ - _SHIFTL((min(self.lrs,f3d.G_TX_LDBLK_MAX_TXL)), 12, 12) | \ - _SHIFTL(self.dxt, 0, 12)) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') - - def to_c(self, static = True): - header = 'gsDPLoadBlock(' if static else 'gDPLoadBlock(glistp++, ' - return header + str(self.tile) + ', ' + str(self.uls) + ', ' + \ - str(self.ult) + ', ' + str(self.lrs) + ', ' + str(self.dxt) + ')' - - def to_sm64_decomp_s(self): - return 'gsDPLoadBlock ' + str(self.tile) + ', ' + str(self.uls) + ', ' + \ - str(self.ult) + ', ' + str(self.lrs) + ', ' + str(self.dxt) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, tile, uls, ult, lrs, dxt): + self.tile = tile + self.uls = uls + self.ult = ult + self.lrs = lrs + self.dxt = dxt + + def to_binary(self, f3d, segments): + words = ( + _SHIFTL(f3d.G_LOADBLOCK, 24, 8) + | _SHIFTL(self.uls, 12, 12) + | _SHIFTL(self.ult, 0, 12) + ), ( + _SHIFTL(self.tile, 24, 3) + | _SHIFTL((min(self.lrs, f3d.G_TX_LDBLK_MAX_TXL)), 12, 12) + | _SHIFTL(self.dxt, 0, 12) + ) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + def to_c(self, static=True): + header = "gsDPLoadBlock(" if static else "gDPLoadBlock(glistp++, " + return ( + header + + str(self.tile) + + ", " + + str(self.uls) + + ", " + + str(self.ult) + + ", " + + str(self.lrs) + + ", " + + str(self.dxt) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsDPLoadBlock " + + str(self.tile) + + ", " + + str(self.uls) + + ", " + + str(self.ult) + + ", " + + str(self.lrs) + + ", " + + str(self.dxt) + ) + + def size(self, f3d): + return GFX_SIZE + class DPLoadTLUTCmd: - def __init__(self, tile, count): - self.tile = tile - self.count = count - - def to_binary(self, f3d, segments): - words = _SHIFTL(f3d.G_LOADTLUT, 24, 8), \ - _SHIFTL((self.tile), 24, 3) | _SHIFTL((self.count), 14, 10) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') + def __init__(self, tile, count): + self.tile = tile + self.count = count + + def to_binary(self, f3d, segments): + words = _SHIFTL(f3d.G_LOADTLUT, 24, 8), _SHIFTL((self.tile), 24, 3) | _SHIFTL( + (self.count), 14, 10 + ) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + def to_c(self, static=True): + header = "gsDPLoadTLUTCmd(" if static else "gDPLoadTLUTCmd(glistp++, " + return header + str(self.tile) + ", " + str(self.count) + ")" + + def to_sm64_decomp_s(self): + return "gsDPLoadTLUTCmd " + str(self.tile) + ", " + str(self.count) - def to_c(self, static = True): - header = 'gsDPLoadTLUTCmd(' if static else 'gDPLoadTLUTCmd(glistp++, ' - return header + str(self.tile) + ', ' + str(self.count) + ')' + def size(self, f3d): + return GFX_SIZE - def to_sm64_decomp_s(self): - return 'gsDPLoadTLUTCmd ' + str(self.tile) + ', ' + str(self.count) - - def size(self, f3d): - return GFX_SIZE class DPLoadTextureBlock: - def __init__(self, timg, fmt, siz, width, height, - pal, cms, cmt, masks, maskt, shifts, shiftt): - self.timg = timg # FImage object - self.fmt = fmt # string - self.siz = siz # string - self.width = width - self.height = height - self.pal = pal - self.cms = cms # list of two strings - self.cmt = cmt # list of two strings - self.masks = masks - self.maskt = maskt - self.shifts = shifts - self.shiftt = shiftt - - def get_ptr_offsets(self, f3d): - return [4] - - def to_binary(self, f3d, segments): - return \ - DPSetTextureImage(self.fmt, self.siz + '_LOAD_BLOCK', \ - 1, self.timg).to_binary(f3d, segments) + \ - DPSetTile(self.fmt, self.siz + '_LOAD_BLOCK', - 0, 0, f3d.G_TX_LOADTILE, 0, self.cmt, self.maskt, self.shiftt, \ - self.cms, self.masks, self.shifts).to_binary(f3d, segments) + \ - DPLoadSync().to_binary(f3d, segments) + \ - DPLoadBlock(f3d.G_TX_LOADTILE, 0, 0, \ - (((self.width)*(self.height) + \ - f3d.G_IM_SIZ_VARS[self.siz + '_INCR']) >> \ - f3d.G_IM_SIZ_VARS[self.siz + '_SHIFT'])-1, \ - f3d.CALC_DXT(self.width, f3d.G_IM_SIZ_VARS[self.siz + \ - '_BYTES'])).to_binary(f3d, segments) + \ - DPPipeSync().to_binary(f3d, segments) + \ - DPSetTile(self.fmt, self.siz, ((((self.width) * \ - f3d.G_IM_SIZ_VARS[self.siz + '_LINE_BYTES'])+7)>>3), 0, \ - f3d.G_TX_RENDERTILE, self.pal, self.cmt, self.maskt, \ - self.shiftt, self.cms, self.masks, self.shifts).to_binary(\ - f3d, segments) + \ - DPSetTileSize(f3d.G_TX_RENDERTILE, 0, 0, \ - ((self.width)-1) << f3d.G_TEXTURE_IMAGE_FRAC, \ - ((self.height)-1) << f3d.G_TEXTURE_IMAGE_FRAC).to_binary(\ - f3d, segments) - - def to_c(self, static = True): - header = 'gsDPLoadTextureBlock(' if static else \ - 'gDPLoadTextureBlock(glistp++, ' - return header + '&' + self.timg.name + ', ' + self.fmt + ', ' + \ - self.siz + ', ' + str(self.width) + ', ' + \ - str(self.height) + ', ' + str(self.pal) + ', ' + \ - self.cms[0] + ' | ' + self.cms[1] + ', ' + self.cmt[0] + \ - ' | ' + self.cmt[1] + ', ' + \ - str(self.masks) + ', ' + str(self.maskt) + ', ' + \ - str(self.shifts) + ', ' + str(self.shiftt) + ')' - - def to_sm64_decomp_s(self): - return 'gsDPLoadTextureBlock ' + \ - self.timg.name + ', ' + self.fmt + ', ' + \ - self.siz + ', ' + str(self.width) + ', ' + \ - str(self.height) + ', ' + str(self.pal) + ', ' + \ - str(self.cms) + ', ' + str(self.cmt) + ', ' + \ - str(self.masks) + ', ' + str(self.maskt) + ', ' + \ - str(self.shifts) + ', ' + str(self.shiftt) - - def size(self, f3d): - return GFX_SIZE * 7 + def __init__( + self, timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt + ): + self.timg = timg # FImage object + self.fmt = fmt # string + self.siz = siz # string + self.width = width + self.height = height + self.pal = pal + self.cms = cms # list of two strings + self.cmt = cmt # list of two strings + self.masks = masks + self.maskt = maskt + self.shifts = shifts + self.shiftt = shiftt + + def get_ptr_offsets(self, f3d): + return [4] + + def to_binary(self, f3d, segments): + return ( + DPSetTextureImage( + self.fmt, self.siz + "_LOAD_BLOCK", 1, self.timg + ).to_binary(f3d, segments) + + DPSetTile( + self.fmt, + self.siz + "_LOAD_BLOCK", + 0, + 0, + f3d.G_TX_LOADTILE, + 0, + self.cmt, + self.maskt, + self.shiftt, + self.cms, + self.masks, + self.shifts, + ).to_binary(f3d, segments) + + DPLoadSync().to_binary(f3d, segments) + + DPLoadBlock( + f3d.G_TX_LOADTILE, + 0, + 0, + ( + ( + (self.width) * (self.height) + + f3d.G_IM_SIZ_VARS[self.siz + "_INCR"] + ) + >> f3d.G_IM_SIZ_VARS[self.siz + "_SHIFT"] + ) + - 1, + f3d.CALC_DXT(self.width, f3d.G_IM_SIZ_VARS[self.siz + "_BYTES"]), + ).to_binary(f3d, segments) + + DPPipeSync().to_binary(f3d, segments) + + DPSetTile( + self.fmt, + self.siz, + ( + (((self.width) * f3d.G_IM_SIZ_VARS[self.siz + "_LINE_BYTES"]) + 7) + >> 3 + ), + 0, + f3d.G_TX_RENDERTILE, + self.pal, + self.cmt, + self.maskt, + self.shiftt, + self.cms, + self.masks, + self.shifts, + ).to_binary(f3d, segments) + + DPSetTileSize( + f3d.G_TX_RENDERTILE, + 0, + 0, + ((self.width) - 1) << f3d.G_TEXTURE_IMAGE_FRAC, + ((self.height) - 1) << f3d.G_TEXTURE_IMAGE_FRAC, + ).to_binary(f3d, segments) + ) + + def to_c(self, static=True): + header = "gsDPLoadTextureBlock(" if static else "gDPLoadTextureBlock(glistp++, " + return ( + header + + "&" + + self.timg.name + + ", " + + self.fmt + + ", " + + self.siz + + ", " + + str(self.width) + + ", " + + str(self.height) + + ", " + + str(self.pal) + + ", " + + self.cms[0] + + " | " + + self.cms[1] + + ", " + + self.cmt[0] + + " | " + + self.cmt[1] + + ", " + + str(self.masks) + + ", " + + str(self.maskt) + + ", " + + str(self.shifts) + + ", " + + str(self.shiftt) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsDPLoadTextureBlock " + + self.timg.name + + ", " + + self.fmt + + ", " + + self.siz + + ", " + + str(self.width) + + ", " + + str(self.height) + + ", " + + str(self.pal) + + ", " + + str(self.cms) + + ", " + + str(self.cmt) + + ", " + + str(self.masks) + + ", " + + str(self.maskt) + + ", " + + str(self.shifts) + + ", " + + str(self.shiftt) + ) + + def size(self, f3d): + return GFX_SIZE * 7 + class DPLoadTextureBlockYuv: - def __init__(self, timg, fmt, siz, width, height, - pal, cms, cmt, masks, maskt, shifts, shiftt): - self.timg = timg # FImage object - self.fmt = fmt # string - self.siz = siz # string - self.width = width - self.height = height - self.pal = pal - self.cms = cms - self.cmt = cmt - self.masks = masks - self.maskt = maskt - self.shifts = shifts - self.shiftt = shiftt - - def get_ptr_offsets(self, f3d): - return [4] - - def to_binary(self, f3d, segments): - return \ - DPSetTextureImage(self.fmt, self.siz + '_LOAD_BLOCK', \ - 1, self.timg).to_binary(f3d, segments) + \ - DPSetTile(self.fmt, self.siz + '_LOAD_BLOCK', - 0, 0, f3d.G_TX_LOADTILE, 0, self.cmt, self.maskt, self.shiftt, \ - self.cms, self.masks, self.shifts).to_binary(f3d, segments) + \ - DPLoadSync().to_binary(f3d, segments) + \ - DPLoadBlock(f3d.G_TX_LOADTILE, 0, 0, \ - (((self.width)*(self.height) + \ - f3d.G_IM_SIZ_VARS[self.siz + '_INCR']) >> \ - f3d.G_IM_SIZ_VARS[self.siz + '_SHIFT'])-1, \ - f3d.CALC_DXT(self.width, f3d.G_IM_SIZ_VARS[self.siz + \ - '_BYTES'])).to_binary(f3d, segments) + \ - DPPipeSync().to_binary(f3d, segments) + \ - DPSetTile(self.fmt, self.siz, \ - ((((self.width) * 1)+7)>>3), 0, \ - f3d.G_TX_RENDERTILE, self.pal, self.cmt, self.maskt, \ - self.shiftt, self.cms, self.masks, self.shifts).to_binary(\ - f3d, segments) + \ - DPSetTileSize(f3d.G_TX_RENDERTILE, 0, 0, \ - ((self.width)-1) << f3d.G_TEXTURE_IMAGE_FRAC, \ - ((self.height)-1) << f3d.G_TEXTURE_IMAGE_FRAC).to_binary(\ - f3d, segments) - - def to_c(self, static = True): - header = 'gsDPLoadTextureBlockYuv(' if static else \ - 'gDPLoadTextureBlockYuv(glistp++, ' - return header + '&' + self.timg.name + ', ' + self.fmt + ', ' + \ - self.siz + ', ' + str(self.width) + ', ' + \ - str(self.height) + ', ' + str(self.pal) + ', ' + \ - self.cms[0] + ' | ' + self.cms[1] + ', ' + self.cmt[0] + \ - ' | ' + self.cmt[1] + ', ' + \ - str(self.masks) + ', ' + str(self.maskt) + ', ' + \ - str(self.shifts) + ', ' + str(self.shiftt) + ')' - - def to_sm64_decomp_s(self): - return 'gsDPLoadTextureBlockYuv ' + \ - self.timg.name + ', ' + self.fmt + ', ' + \ - self.siz + ', ' + str(self.width) + ', ' + \ - str(self.height) + ', ' + str(self.pal) + ', ' + \ - str(self.cms) + ', ' + str(self.cmt) + ', ' + \ - str(self.masks) + ', ' + str(self.maskt) + ', ' + \ - str(self.shifts) + ', ' + str(self.shiftt) - - def size(self, f3d): - return GFX_SIZE * 7 + def __init__( + self, timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt + ): + self.timg = timg # FImage object + self.fmt = fmt # string + self.siz = siz # string + self.width = width + self.height = height + self.pal = pal + self.cms = cms + self.cmt = cmt + self.masks = masks + self.maskt = maskt + self.shifts = shifts + self.shiftt = shiftt + + def get_ptr_offsets(self, f3d): + return [4] + + def to_binary(self, f3d, segments): + return ( + DPSetTextureImage( + self.fmt, self.siz + "_LOAD_BLOCK", 1, self.timg + ).to_binary(f3d, segments) + + DPSetTile( + self.fmt, + self.siz + "_LOAD_BLOCK", + 0, + 0, + f3d.G_TX_LOADTILE, + 0, + self.cmt, + self.maskt, + self.shiftt, + self.cms, + self.masks, + self.shifts, + ).to_binary(f3d, segments) + + DPLoadSync().to_binary(f3d, segments) + + DPLoadBlock( + f3d.G_TX_LOADTILE, + 0, + 0, + ( + ( + (self.width) * (self.height) + + f3d.G_IM_SIZ_VARS[self.siz + "_INCR"] + ) + >> f3d.G_IM_SIZ_VARS[self.siz + "_SHIFT"] + ) + - 1, + f3d.CALC_DXT(self.width, f3d.G_IM_SIZ_VARS[self.siz + "_BYTES"]), + ).to_binary(f3d, segments) + + DPPipeSync().to_binary(f3d, segments) + + DPSetTile( + self.fmt, + self.siz, + ((((self.width) * 1) + 7) >> 3), + 0, + f3d.G_TX_RENDERTILE, + self.pal, + self.cmt, + self.maskt, + self.shiftt, + self.cms, + self.masks, + self.shifts, + ).to_binary(f3d, segments) + + DPSetTileSize( + f3d.G_TX_RENDERTILE, + 0, + 0, + ((self.width) - 1) << f3d.G_TEXTURE_IMAGE_FRAC, + ((self.height) - 1) << f3d.G_TEXTURE_IMAGE_FRAC, + ).to_binary(f3d, segments) + ) + + def to_c(self, static=True): + header = ( + "gsDPLoadTextureBlockYuv(" + if static + else "gDPLoadTextureBlockYuv(glistp++, " + ) + return ( + header + + "&" + + self.timg.name + + ", " + + self.fmt + + ", " + + self.siz + + ", " + + str(self.width) + + ", " + + str(self.height) + + ", " + + str(self.pal) + + ", " + + self.cms[0] + + " | " + + self.cms[1] + + ", " + + self.cmt[0] + + " | " + + self.cmt[1] + + ", " + + str(self.masks) + + ", " + + str(self.maskt) + + ", " + + str(self.shifts) + + ", " + + str(self.shiftt) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsDPLoadTextureBlockYuv " + + self.timg.name + + ", " + + self.fmt + + ", " + + self.siz + + ", " + + str(self.width) + + ", " + + str(self.height) + + ", " + + str(self.pal) + + ", " + + str(self.cms) + + ", " + + str(self.cmt) + + ", " + + str(self.masks) + + ", " + + str(self.maskt) + + ", " + + str(self.shifts) + + ", " + + str(self.shiftt) + ) + + def size(self, f3d): + return GFX_SIZE * 7 + # gsDPLoadTextureBlockS # gsDPLoadMultiBlockS # gsDPLoadTextureBlockYuvS + class _DPLoadTextureBlock: - def __init__(self, timg, tmem, fmt, siz, width, height, - pal, cms, cmt, masks, maskt, shifts, shiftt): - self.timg = timg # FImage object - self.tmem = tmem - self.fmt = fmt # string - self.siz = siz # string - self.width = width - self.height = height - self.pal = pal - self.cms = cms - self.cmt = cmt - self.masks = masks - self.maskt = maskt - self.shifts = shifts - self.shiftt = shiftt - - def get_ptr_offsets(self, f3d): - return [4] - - def to_binary(self, f3d, segments): - return \ - DPSetTextureImage(self.fmt, self.siz + '_LOAD_BLOCK', \ - 1, self.timg).to_binary(f3d, segments) + \ - DPSetTile(self.fmt, self.siz + '_LOAD_BLOCK', - 0, self.tmem, f3d.G_TX_LOADTILE, 0, self.cmt, self.maskt, - self.shiftt, self.cms, self.masks, self.shifts).to_binary(\ - f3d, segments) + \ - DPLoadSync().to_binary(f3d, segments) + \ - DPLoadBlock(f3d.G_TX_LOADTILE, 0, 0, \ - (((self.width)*(self.height) + \ - f3d.G_IM_SIZ_VARS[self.siz + '_INCR']) >> \ - f3d.G_IM_SIZ_VARS[self.siz + '_SHIFT'])-1, \ - f3d.CALC_DXT(self.width, f3d.G_IM_SIZ_VARS[self.siz + \ - '_BYTES'])).to_binary(f3d, segments) + \ - DPPipeSync().to_binary(f3d, segments) + \ - DPSetTile(self.fmt, self.siz, ((((self.width) * \ - f3d.G_IM_SIZ_VARS[self.siz + '_LINE_BYTES'])+7)>>3), \ - self.tmem, f3d.G_TX_RENDERTILE, self.pal, self.cmt, \ - self.maskt, self.shiftt, self.cms, self.masks, \ - self.shifts).to_binary(f3d, segments) + \ - DPSetTileSize(f3d.G_TX_RENDERTILE, 0, 0, \ - ((self.width)-1) << f3d.G_TEXTURE_IMAGE_FRAC, \ - ((self.height)-1) << f3d.G_TEXTURE_IMAGE_FRAC).to_binary(\ - f3d, segments) - - def to_c(self, static = True): - header = '_gsDPLoadTextureBlock(' if static else \ - '_gDPLoadTextureBlock(glistp++, ' - return header + '&' + self.timg.name + ', ' + str(self.tmem) + ', ' +\ - self.fmt + ', ' + self.siz + ', ' + str(self.width) + ', ' + \ - str(self.height) + ', ' + str(self.pal) + ', ' + \ - self.cms[0] + ' | ' + self.cms[1] + ', ' + self.cmt[0] + \ - ' | ' + self.cmt[1] + ', ' + \ - str(self.masks) + ', ' + str(self.maskt) + ', ' + \ - str(self.shifts) + ', ' + str(self.shiftt) + ')' - - def to_sm64_decomp_s(self): - return '_gsDPLoadTextureBlock ' + \ - self.timg.name + ', ' + str(self.tmem) + ', ' + self.fmt + ', ' + \ - self.siz + ', ' + str(self.width) + ', ' + \ - str(self.height) + ', ' + str(self.pal) + ', ' + \ - str(self.cms) + ', ' + str(self.cmt) + ', ' + \ - str(self.masks) + ', ' + str(self.maskt) + ', ' + \ - str(self.shifts) + ', ' + str(self.shiftt) - - def size(self, f3d): - return GFX_SIZE * 7 + def __init__( + self, + timg, + tmem, + fmt, + siz, + width, + height, + pal, + cms, + cmt, + masks, + maskt, + shifts, + shiftt, + ): + self.timg = timg # FImage object + self.tmem = tmem + self.fmt = fmt # string + self.siz = siz # string + self.width = width + self.height = height + self.pal = pal + self.cms = cms + self.cmt = cmt + self.masks = masks + self.maskt = maskt + self.shifts = shifts + self.shiftt = shiftt + + def get_ptr_offsets(self, f3d): + return [4] + + def to_binary(self, f3d, segments): + return ( + DPSetTextureImage( + self.fmt, self.siz + "_LOAD_BLOCK", 1, self.timg + ).to_binary(f3d, segments) + + DPSetTile( + self.fmt, + self.siz + "_LOAD_BLOCK", + 0, + self.tmem, + f3d.G_TX_LOADTILE, + 0, + self.cmt, + self.maskt, + self.shiftt, + self.cms, + self.masks, + self.shifts, + ).to_binary(f3d, segments) + + DPLoadSync().to_binary(f3d, segments) + + DPLoadBlock( + f3d.G_TX_LOADTILE, + 0, + 0, + ( + ( + (self.width) * (self.height) + + f3d.G_IM_SIZ_VARS[self.siz + "_INCR"] + ) + >> f3d.G_IM_SIZ_VARS[self.siz + "_SHIFT"] + ) + - 1, + f3d.CALC_DXT(self.width, f3d.G_IM_SIZ_VARS[self.siz + "_BYTES"]), + ).to_binary(f3d, segments) + + DPPipeSync().to_binary(f3d, segments) + + DPSetTile( + self.fmt, + self.siz, + ( + (((self.width) * f3d.G_IM_SIZ_VARS[self.siz + "_LINE_BYTES"]) + 7) + >> 3 + ), + self.tmem, + f3d.G_TX_RENDERTILE, + self.pal, + self.cmt, + self.maskt, + self.shiftt, + self.cms, + self.masks, + self.shifts, + ).to_binary(f3d, segments) + + DPSetTileSize( + f3d.G_TX_RENDERTILE, + 0, + 0, + ((self.width) - 1) << f3d.G_TEXTURE_IMAGE_FRAC, + ((self.height) - 1) << f3d.G_TEXTURE_IMAGE_FRAC, + ).to_binary(f3d, segments) + ) + + def to_c(self, static=True): + header = ( + "_gsDPLoadTextureBlock(" if static else "_gDPLoadTextureBlock(glistp++, " + ) + return ( + header + + "&" + + self.timg.name + + ", " + + str(self.tmem) + + ", " + + self.fmt + + ", " + + self.siz + + ", " + + str(self.width) + + ", " + + str(self.height) + + ", " + + str(self.pal) + + ", " + + self.cms[0] + + " | " + + self.cms[1] + + ", " + + self.cmt[0] + + " | " + + self.cmt[1] + + ", " + + str(self.masks) + + ", " + + str(self.maskt) + + ", " + + str(self.shifts) + + ", " + + str(self.shiftt) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "_gsDPLoadTextureBlock " + + self.timg.name + + ", " + + str(self.tmem) + + ", " + + self.fmt + + ", " + + self.siz + + ", " + + str(self.width) + + ", " + + str(self.height) + + ", " + + str(self.pal) + + ", " + + str(self.cms) + + ", " + + str(self.cmt) + + ", " + + str(self.masks) + + ", " + + str(self.maskt) + + ", " + + str(self.shifts) + + ", " + + str(self.shiftt) + ) + + def size(self, f3d): + return GFX_SIZE * 7 + # _gsDPLoadTextureBlockTile # gsDPLoadMultiBlock # gsDPLoadMultiBlockS + class DPLoadTextureBlock_4b: - def __init__(self, timg, fmt, width, height, - pal, cms, cmt, masks, maskt, shifts, shiftt): - self.timg = timg # FImage object - self.fmt = fmt # string - self.width = width - self.height = height - self.pal = pal - self.cms = cms - self.cmt = cmt - self.masks = masks - self.maskt = maskt - self.shifts = shifts - self.shiftt = shiftt - - def get_ptr_offsets(self, f3d): - return [4] - - def to_binary(self, f3d, segments): - return \ - DPSetTextureImage(self.fmt, 'G_IM_SIZ_16b', \ - 1, self.timg).to_binary(f3d, segments) + \ - DPSetTile(self.fmt, 'G_IM_SIZ_16b', - 0, 0, f3d.G_TX_LOADTILE, 0, self.cmt, self.maskt, self.shiftt, \ - self.cms, self.masks, self.shifts).to_binary(f3d, segments) + \ - DPLoadSync().to_binary(f3d, segments) + \ - DPLoadBlock(f3d.G_TX_LOADTILE, 0, 0, \ - (((self.width)*(self.height) + 3) >> 2) - 1, \ - f3d.CALC_DXT_4b(self.width)).to_binary(f3d, segments) + \ - DPPipeSync().to_binary(f3d, segments) + \ - DPSetTile(self.fmt, 'G_IM_SIZ_4b', \ - (((self.width >> 1) + 7) >> 3), 0, \ - f3d.G_TX_RENDERTILE, self.pal, self.cmt, self.maskt, \ - self.shiftt, self.cms, self.masks, self.shifts).to_binary(\ - f3d, segments) + \ - DPSetTileSize(f3d.G_TX_RENDERTILE, 0, 0, \ - ((self.width)-1) << f3d.G_TEXTURE_IMAGE_FRAC, \ - ((self.height)-1) << f3d.G_TEXTURE_IMAGE_FRAC).to_binary(\ - f3d, segments) - - def to_c(self, static = True): - header = 'gsDPLoadTextureBlock_4b(' if static else \ - 'gDPLoadTextureBlock_4b(glistp++, ' - return header + '&' + self.timg.name + ', ' + self.fmt + ', ' + str(self.width) + ', ' + \ - str(self.height) + ', ' + str(self.pal) + ', ' + \ - self.cms[0] + ' | ' + self.cms[1] + ', ' + self.cmt[0] + \ - ' | ' + self.cmt[1] + ', ' + \ - str(self.masks) + ', ' + str(self.maskt) + ', ' + \ - str(self.shifts) + ', ' + str(self.shiftt) + ')' - - def to_sm64_decomp_s(self): - return 'gsDPLoadTextureBlock_4b ' + \ - self.timg.name + ', ' + self.fmt + ', ' + str(self.width) + ', ' + \ - str(self.height) + ', ' + str(self.pal) + ', ' + \ - str(self.cms) + ', ' + str(self.cmt) + ', ' + \ - str(self.masks) + ', ' + str(self.maskt) + ', ' + \ - str(self.shifts) + ', ' + str(self.shiftt) - - def size(self, f3d): - return GFX_SIZE * 7 + def __init__( + self, timg, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt + ): + self.timg = timg # FImage object + self.fmt = fmt # string + self.width = width + self.height = height + self.pal = pal + self.cms = cms + self.cmt = cmt + self.masks = masks + self.maskt = maskt + self.shifts = shifts + self.shiftt = shiftt + + def get_ptr_offsets(self, f3d): + return [4] + + def to_binary(self, f3d, segments): + return ( + DPSetTextureImage(self.fmt, "G_IM_SIZ_16b", 1, self.timg).to_binary( + f3d, segments + ) + + DPSetTile( + self.fmt, + "G_IM_SIZ_16b", + 0, + 0, + f3d.G_TX_LOADTILE, + 0, + self.cmt, + self.maskt, + self.shiftt, + self.cms, + self.masks, + self.shifts, + ).to_binary(f3d, segments) + + DPLoadSync().to_binary(f3d, segments) + + DPLoadBlock( + f3d.G_TX_LOADTILE, + 0, + 0, + (((self.width) * (self.height) + 3) >> 2) - 1, + f3d.CALC_DXT_4b(self.width), + ).to_binary(f3d, segments) + + DPPipeSync().to_binary(f3d, segments) + + DPSetTile( + self.fmt, + "G_IM_SIZ_4b", + (((self.width >> 1) + 7) >> 3), + 0, + f3d.G_TX_RENDERTILE, + self.pal, + self.cmt, + self.maskt, + self.shiftt, + self.cms, + self.masks, + self.shifts, + ).to_binary(f3d, segments) + + DPSetTileSize( + f3d.G_TX_RENDERTILE, + 0, + 0, + ((self.width) - 1) << f3d.G_TEXTURE_IMAGE_FRAC, + ((self.height) - 1) << f3d.G_TEXTURE_IMAGE_FRAC, + ).to_binary(f3d, segments) + ) + + def to_c(self, static=True): + header = ( + "gsDPLoadTextureBlock_4b(" + if static + else "gDPLoadTextureBlock_4b(glistp++, " + ) + return ( + header + + "&" + + self.timg.name + + ", " + + self.fmt + + ", " + + str(self.width) + + ", " + + str(self.height) + + ", " + + str(self.pal) + + ", " + + self.cms[0] + + " | " + + self.cms[1] + + ", " + + self.cmt[0] + + " | " + + self.cmt[1] + + ", " + + str(self.masks) + + ", " + + str(self.maskt) + + ", " + + str(self.shifts) + + ", " + + str(self.shiftt) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsDPLoadTextureBlock_4b " + + self.timg.name + + ", " + + self.fmt + + ", " + + str(self.width) + + ", " + + str(self.height) + + ", " + + str(self.pal) + + ", " + + str(self.cms) + + ", " + + str(self.cmt) + + ", " + + str(self.masks) + + ", " + + str(self.maskt) + + ", " + + str(self.shifts) + + ", " + + str(self.shiftt) + ) + + def size(self, f3d): + return GFX_SIZE * 7 + # gsDPLoadTextureBlock_4bS # gsDPLoadMultiBlock_4b # gsDPLoadMultiBlock_4bS # _gsDPLoadTextureBlock_4b + class DPLoadTextureTile: - def __init__(self, timg, fmt, siz, width, height, - uls, ult, lrs, lrt, - pal, cms, cmt, masks, maskt, shifts, shiftt): - self.timg = timg # FImage object - self.fmt = fmt # string - self.siz = siz # string - self.width = width - self.height = height - self.uls = uls - self.ult = ult - self.lrs = lrs - self.lrt = lrt - self.pal = pal - self.cms = cms - self.cmt = cmt - self.masks = masks - self.maskt = maskt - self.shifts = shifts - self.shiftt = shiftt - - def get_ptr_offsets(self, f3d): - return [4] - - def to_binary(self, f3d, segments): - return \ - DPSetTextureImage(self.fmt, self.siz, \ - self.width, self.timg).to_binary(f3d, segments) + \ - DPSetTile(self.fmt, self.siz, \ - (((self.lrs-self.uls+1) * f3d.G_IM_SIZ_VARS[self.siz +\ - '_TILE_BYTES'] + 7)>>3), 0, f3d.G_TX_LOADTILE, 0, \ - self.cmt, self.maskt, self.shiftt, self.cms, self.masks,\ - self.shifts).to_binary(f3d, segments) + \ - DPLoadSync().to_binary(f3d, segments) + \ - DPLoadTile(f3d.G_TX_LOADTILE, - (self.uls) << f3d.G_TEXTURE_IMAGE_FRAC, - (self.ult) << f3d.G_TEXTURE_IMAGE_FRAC, - (self.lrs) << f3d.G_TEXTURE_IMAGE_FRAC, - (self.lrt) << f3d.G_TEXTURE_IMAGE_FRAC).to_binary( - f3d, segments) + \ - DPPipeSync().to_binary(f3d, segments) + \ - DPSetTile(self.fmt, self.siz, - ((((self.lrs-self.uls+1) * \ - f3d.G_IM_SIZ_VARS[self.siz + '_LINE_BYTES'])+7)>>3), 0, \ - f3d.G_TX_RENDERTILE, self.pal, self.cmt, self.maskt, \ - self.shiftt, self.cms, self.masks, self.shifts).to_binary(\ - f3d, segments) + \ - DPSetTileSize(f3d.G_TX_RENDERTILE, \ - (self.uls) << f3d.G_TEXTURE_IMAGE_FRAC, \ - (self.ult) << f3d.G_TEXTURE_IMAGE_FRAC, \ - (self.lrs) << f3d.G_TEXTURE_IMAGE_FRAC, \ - (self.lrt) << f3d.G_TEXTURE_IMAGE_FRAC).to_binary(\ - f3d, segments) - - def to_c(self, static = True): - header = 'gsDPLoadTextureTile(' if static else \ - 'gDPLoadTextureTile(glistp++, ' - return header + '&' + self.timg.name + ', ' + self.fmt + ', ' + \ - self.siz + ', ' + str(self.width) + ', ' + \ - str(self.height) + ', ' + self.uls + ', ' + str(self.ult) + \ - ', ' + str(self.lrs) + ', ' + str(self.lrt) + str(self.pal) + \ - ', ' + self.cms[0] + ' | ' + self.cms[1] + ', ' + self.cmt[0] + \ - ' | ' + self.cmt[1] + ', ' + \ - str(self.masks) + ', ' + str(self.maskt) + ', ' + \ - str(self.shifts) + ', ' + str(self.shiftt) + ')' - - def to_sm64_decomp_s(self): - return 'gsDPLoadTextureTile ' + \ - self.timg.name + ', ' + self.fmt + ', ' + \ - self.siz + ', ' + str(self.width) + ', ' + \ - str(self.height) + ', ' + self.uls + ', ' + str(self.ult) + \ - ', ' + str(self.lrs) + ', ' + str(self.lrt)+ ', ' + \ - str(self.pal) + ', ' + \ - str(self.cms) + ', ' + str(self.cmt) + ', ' + \ - str(self.masks) + ', ' + str(self.maskt) + ', ' + \ - str(self.shifts) + ', ' + str(self.shiftt) - - def size(self, f3d): - return GFX_SIZE * 7 + def __init__( + self, + timg, + fmt, + siz, + width, + height, + uls, + ult, + lrs, + lrt, + pal, + cms, + cmt, + masks, + maskt, + shifts, + shiftt, + ): + self.timg = timg # FImage object + self.fmt = fmt # string + self.siz = siz # string + self.width = width + self.height = height + self.uls = uls + self.ult = ult + self.lrs = lrs + self.lrt = lrt + self.pal = pal + self.cms = cms + self.cmt = cmt + self.masks = masks + self.maskt = maskt + self.shifts = shifts + self.shiftt = shiftt + + def get_ptr_offsets(self, f3d): + return [4] + + def to_binary(self, f3d, segments): + return ( + DPSetTextureImage(self.fmt, self.siz, self.width, self.timg).to_binary( + f3d, segments + ) + + DPSetTile( + self.fmt, + self.siz, + ( + ( + (self.lrs - self.uls + 1) + * f3d.G_IM_SIZ_VARS[self.siz + "_TILE_BYTES"] + + 7 + ) + >> 3 + ), + 0, + f3d.G_TX_LOADTILE, + 0, + self.cmt, + self.maskt, + self.shiftt, + self.cms, + self.masks, + self.shifts, + ).to_binary(f3d, segments) + + DPLoadSync().to_binary(f3d, segments) + + DPLoadTile( + f3d.G_TX_LOADTILE, + (self.uls) << f3d.G_TEXTURE_IMAGE_FRAC, + (self.ult) << f3d.G_TEXTURE_IMAGE_FRAC, + (self.lrs) << f3d.G_TEXTURE_IMAGE_FRAC, + (self.lrt) << f3d.G_TEXTURE_IMAGE_FRAC, + ).to_binary(f3d, segments) + + DPPipeSync().to_binary(f3d, segments) + + DPSetTile( + self.fmt, + self.siz, + ( + ( + ( + (self.lrs - self.uls + 1) + * f3d.G_IM_SIZ_VARS[self.siz + "_LINE_BYTES"] + ) + + 7 + ) + >> 3 + ), + 0, + f3d.G_TX_RENDERTILE, + self.pal, + self.cmt, + self.maskt, + self.shiftt, + self.cms, + self.masks, + self.shifts, + ).to_binary(f3d, segments) + + DPSetTileSize( + f3d.G_TX_RENDERTILE, + (self.uls) << f3d.G_TEXTURE_IMAGE_FRAC, + (self.ult) << f3d.G_TEXTURE_IMAGE_FRAC, + (self.lrs) << f3d.G_TEXTURE_IMAGE_FRAC, + (self.lrt) << f3d.G_TEXTURE_IMAGE_FRAC, + ).to_binary(f3d, segments) + ) + + def to_c(self, static=True): + header = "gsDPLoadTextureTile(" if static else "gDPLoadTextureTile(glistp++, " + return ( + header + + "&" + + self.timg.name + + ", " + + self.fmt + + ", " + + self.siz + + ", " + + str(self.width) + + ", " + + str(self.height) + + ", " + + self.uls + + ", " + + str(self.ult) + + ", " + + str(self.lrs) + + ", " + + str(self.lrt) + + str(self.pal) + + ", " + + self.cms[0] + + " | " + + self.cms[1] + + ", " + + self.cmt[0] + + " | " + + self.cmt[1] + + ", " + + str(self.masks) + + ", " + + str(self.maskt) + + ", " + + str(self.shifts) + + ", " + + str(self.shiftt) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsDPLoadTextureTile " + + self.timg.name + + ", " + + self.fmt + + ", " + + self.siz + + ", " + + str(self.width) + + ", " + + str(self.height) + + ", " + + self.uls + + ", " + + str(self.ult) + + ", " + + str(self.lrs) + + ", " + + str(self.lrt) + + ", " + + str(self.pal) + + ", " + + str(self.cms) + + ", " + + str(self.cmt) + + ", " + + str(self.masks) + + ", " + + str(self.maskt) + + ", " + + str(self.shifts) + + ", " + + str(self.shiftt) + ) + + def size(self, f3d): + return GFX_SIZE * 7 + # gsDPLoadMultiTile + class DPLoadTextureTile_4b: - def __init__(self, timg, fmt, width, height, - uls, ult, lrs, lrt, - pal, cms, cmt, masks, maskt, shifts, shiftt): - self.timg = timg # FImage object - self.fmt = fmt # string - self.width = width - self.height = height - self.uls = uls - self.ult = ult - self.lrs = lrs - self.lrt = lrt - self.pal = pal - self.cms = cms - self.cmt = cmt - self.masks = masks - self.maskt = maskt - self.shifts = shifts - self.shiftt = shiftt - - def get_ptr_offsets(self, f3d): - return [4] - - def to_binary(self, f3d, segments): - return \ - DPSetTextureImage(self.fmt, 'G_IM_SIZ_8b', \ - self.width >> 1, self.timg).to_binary(f3d, segments) + \ - DPSetTile(self.fmt, 'G_IM_SIZ_8b', \ - ((((self.lrs-self.uls+1) >> 1) + 7)>>3), 0, f3d.G_TX_LOADTILE, \ - 0, self.cmt, self.maskt, self.shiftt, self.cms, self.masks,\ - self.shifts).to_binary(f3d, segments) + \ - DPLoadSync().to_binary(f3d, segments) + \ - DPLoadTile(f3d.G_TX_LOADTILE, - (self.uls) << (f3d.G_TEXTURE_IMAGE_FRAC - 1), - (self.ult) << f3d.G_TEXTURE_IMAGE_FRAC, - (self.lrs) << (f3d.G_TEXTURE_IMAGE_FRAC - 1), - (self.lrt) << f3d.G_TEXTURE_IMAGE_FRAC).to_binary( - f3d, segments) + \ - DPPipeSync().to_binary(f3d, segments) + \ - DPSetTile(self.fmt, 'G_IM_SIZ_4b', - ((((self.lrs-self.uls+1) >> 1)+7)>>3), 0, \ - f3d.G_TX_RENDERTILE, self.pal, self.cmt, self.maskt, \ - self.shiftt, self.cms, self.masks, self.shifts).to_binary(\ - f3d, segments) + \ - DPSetTileSize(f3d.G_TX_RENDERTILE, \ - (self.uls) << f3d.G_TEXTURE_IMAGE_FRAC, \ - (self.ult) << f3d.G_TEXTURE_IMAGE_FRAC, \ - (self.lrs) << f3d.G_TEXTURE_IMAGE_FRAC, \ - (self.lrt) << f3d.G_TEXTURE_IMAGE_FRAC).to_binary(\ - f3d, segments) - - def to_c(self, static = True): - header = 'gsDPLoadTextureTile_4b(' if static else \ - 'gDPLoadTextureTile_4b(glistp++, ' - return header + '&' + self.timg.name + ', ' + self.fmt + ', ' + \ - str(self.width) + ', ' + \ - str(self.height) + ', ' + self.uls + ', ' + str(self.ult) + \ - ', ' + str(self.lrs) + ', ' + str(self.lrt) + str(self.pal) + \ - ', ' + self.cms[0] + ' | ' + self.cms[1] + ', ' + self.cmt[0] + \ - ' | ' + self.cmt[1] + ', ' + \ - str(self.masks) + ', ' + str(self.maskt) + ', ' + \ - str(self.shifts) + ', ' + str(self.shiftt) + ')' - - def to_sm64_decomp_s(self): - return 'gsDPLoadTextureTile_4b ' + \ - self.timg.name + ', ' + self.fmt + ', ' + \ - str(self.width) + ', ' + \ - str(self.height) + ', ' + self.uls + ', ' + str(self.ult) + \ - ', ' + str(self.lrs) + ', ' + str(self.lrt)+ ', ' + \ - str(self.pal) + ', ' + \ - str(self.cms) + ', ' + str(self.cmt) + ', ' + \ - str(self.masks) + ', ' + str(self.maskt) + ', ' + \ - str(self.shifts) + ', ' + str(self.shiftt) - - def size(self, f3d): - return GFX_SIZE * 7 + def __init__( + self, + timg, + fmt, + width, + height, + uls, + ult, + lrs, + lrt, + pal, + cms, + cmt, + masks, + maskt, + shifts, + shiftt, + ): + self.timg = timg # FImage object + self.fmt = fmt # string + self.width = width + self.height = height + self.uls = uls + self.ult = ult + self.lrs = lrs + self.lrt = lrt + self.pal = pal + self.cms = cms + self.cmt = cmt + self.masks = masks + self.maskt = maskt + self.shifts = shifts + self.shiftt = shiftt + + def get_ptr_offsets(self, f3d): + return [4] + + def to_binary(self, f3d, segments): + return ( + DPSetTextureImage( + self.fmt, "G_IM_SIZ_8b", self.width >> 1, self.timg + ).to_binary(f3d, segments) + + DPSetTile( + self.fmt, + "G_IM_SIZ_8b", + ((((self.lrs - self.uls + 1) >> 1) + 7) >> 3), + 0, + f3d.G_TX_LOADTILE, + 0, + self.cmt, + self.maskt, + self.shiftt, + self.cms, + self.masks, + self.shifts, + ).to_binary(f3d, segments) + + DPLoadSync().to_binary(f3d, segments) + + DPLoadTile( + f3d.G_TX_LOADTILE, + (self.uls) << (f3d.G_TEXTURE_IMAGE_FRAC - 1), + (self.ult) << f3d.G_TEXTURE_IMAGE_FRAC, + (self.lrs) << (f3d.G_TEXTURE_IMAGE_FRAC - 1), + (self.lrt) << f3d.G_TEXTURE_IMAGE_FRAC, + ).to_binary(f3d, segments) + + DPPipeSync().to_binary(f3d, segments) + + DPSetTile( + self.fmt, + "G_IM_SIZ_4b", + ((((self.lrs - self.uls + 1) >> 1) + 7) >> 3), + 0, + f3d.G_TX_RENDERTILE, + self.pal, + self.cmt, + self.maskt, + self.shiftt, + self.cms, + self.masks, + self.shifts, + ).to_binary(f3d, segments) + + DPSetTileSize( + f3d.G_TX_RENDERTILE, + (self.uls) << f3d.G_TEXTURE_IMAGE_FRAC, + (self.ult) << f3d.G_TEXTURE_IMAGE_FRAC, + (self.lrs) << f3d.G_TEXTURE_IMAGE_FRAC, + (self.lrt) << f3d.G_TEXTURE_IMAGE_FRAC, + ).to_binary(f3d, segments) + ) + + def to_c(self, static=True): + header = ( + "gsDPLoadTextureTile_4b(" if static else "gDPLoadTextureTile_4b(glistp++, " + ) + return ( + header + + "&" + + self.timg.name + + ", " + + self.fmt + + ", " + + str(self.width) + + ", " + + str(self.height) + + ", " + + self.uls + + ", " + + str(self.ult) + + ", " + + str(self.lrs) + + ", " + + str(self.lrt) + + str(self.pal) + + ", " + + self.cms[0] + + " | " + + self.cms[1] + + ", " + + self.cmt[0] + + " | " + + self.cmt[1] + + ", " + + str(self.masks) + + ", " + + str(self.maskt) + + ", " + + str(self.shifts) + + ", " + + str(self.shiftt) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsDPLoadTextureTile_4b " + + self.timg.name + + ", " + + self.fmt + + ", " + + str(self.width) + + ", " + + str(self.height) + + ", " + + self.uls + + ", " + + str(self.ult) + + ", " + + str(self.lrs) + + ", " + + str(self.lrt) + + ", " + + str(self.pal) + + ", " + + str(self.cms) + + ", " + + str(self.cmt) + + ", " + + str(self.masks) + + ", " + + str(self.maskt) + + ", " + + str(self.shifts) + + ", " + + str(self.shiftt) + ) + + def size(self, f3d): + return GFX_SIZE * 7 + # gsDPLoadMultiTile_4b + class DPLoadTLUT_pal16: - def __init__(self, pal, dram): - self.pal = pal - self.dram = dram # pallete object - - def get_ptr_offsets(self, f3d): - return [4] - - def to_binary(self, f3d, segments): - if not f3d._HW_VERSION_1: - return \ - DPSetTextureImage('G_IM_FMT_RGBA', 'G_IM_SIZ_16b', 1, \ - self.dram).to_binary(f3d, segments) + \ - DPTileSync().to_binary(f3d, segments) + \ - DPSetTile('0', '0', 0, (256+(((self.pal)&0xf)*16)),\ - f3d.G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0).to_binary(\ - f3d, segments) + \ - DPLoadSync().to_binary(f3d, segments) + \ - DPLoadTLUTCmd(f3d.G_TX_LOADTILE, 15).to_binary( - f3d, segments) + \ - DPPipeSync().to_binary(f3d, segments) - else: - return _DPLoadTextureBlock(self.dram, \ - (256+(((self.pal)&0xf)*16)), \ - f3d.G_IM_FMT_VARS['G_IM_FMT_RGBA'], \ - f3d.G_IM_SIZ_VARS['G_IM_SIZ_16b'], 4*16, 1, - self.pal, 0, 0, 0, 0, 0, 0).to_binary(f3d, segments) - - def to_c(self, static = True): - header = 'gsDPLoadTLUT_pal16(' if static else \ - 'gDPLoadTLUT_pal16(glistp++, ' - return header + str(self.pal) + ', ' + '&' + self.dram.name + ')' - - def to_sm64_decomp_s(self): - return 'gsDPLoadTLUT_pal16 ' + str(self.pal) + ', ' + self.dram.name - - def size(self, f3d): - if not f3d._HW_VERSION_1: - return GFX_SIZE * 6 - else: - return GFX_SIZE * 7 + def __init__(self, pal, dram): + self.pal = pal + self.dram = dram # pallete object + + def get_ptr_offsets(self, f3d): + return [4] + + def to_binary(self, f3d, segments): + if not f3d._HW_VERSION_1: + return ( + DPSetTextureImage( + "G_IM_FMT_RGBA", "G_IM_SIZ_16b", 1, self.dram + ).to_binary(f3d, segments) + + DPTileSync().to_binary(f3d, segments) + + DPSetTile( + "0", + "0", + 0, + (256 + (((self.pal) & 0xF) * 16)), + f3d.G_TX_LOADTILE, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ).to_binary(f3d, segments) + + DPLoadSync().to_binary(f3d, segments) + + DPLoadTLUTCmd(f3d.G_TX_LOADTILE, 15).to_binary(f3d, segments) + + DPPipeSync().to_binary(f3d, segments) + ) + else: + return _DPLoadTextureBlock( + self.dram, + (256 + (((self.pal) & 0xF) * 16)), + f3d.G_IM_FMT_VARS["G_IM_FMT_RGBA"], + f3d.G_IM_SIZ_VARS["G_IM_SIZ_16b"], + 4 * 16, + 1, + self.pal, + 0, + 0, + 0, + 0, + 0, + 0, + ).to_binary(f3d, segments) + + def to_c(self, static=True): + header = "gsDPLoadTLUT_pal16(" if static else "gDPLoadTLUT_pal16(glistp++, " + return header + str(self.pal) + ", " + "&" + self.dram.name + ")" + + def to_sm64_decomp_s(self): + return "gsDPLoadTLUT_pal16 " + str(self.pal) + ", " + self.dram.name + + def size(self, f3d): + if not f3d._HW_VERSION_1: + return GFX_SIZE * 6 + else: + return GFX_SIZE * 7 + class DPLoadTLUT_pal256: - def __init__(self, dram): - self.dram = dram # pallete object - - def get_ptr_offsets(self, f3d): - return [4] - - def to_binary(self, f3d, segments): - if not f3d._HW_VERSION_1: - return \ - DPSetTextureImage('G_IM_FMT_RGBA', 'G_IM_SIZ_16b', 1, \ - self.dram).to_binary(f3d, segments) + \ - DPTileSync().to_binary(f3d, segments) + \ - DPSetTile('0', '0', 0, 256, f3d.G_TX_LOADTILE, 0, 0, 0, 0, - 0, 0, 0).to_binary(f3d, segments) + \ - DPLoadSync().to_binary(f3d, segments) + \ - DPLoadTLUTCmd(f3d.G_TX_LOADTILE, 255).to_binary( - f3d, segments) + \ - DPPipeSync().to_binary(f3d, segments) - else: - return _DPLoadTextureBlock(self.dram, 256, \ - f3d.G_IM_FMT_VARS['G_IM_FMT_RGBA'], \ - f3d.G_IM_SIZ_VARS['G_IM_SIZ_16b'], 4*256, 1, - 0, 0, 0, 0, 0, 0, 0).to_binary(f3d, segments) - - def to_c(self, static = True): - header = 'gsDPLoadTLUT_pal256(' if static else \ - 'gDPLoadTLUT_pal256(glistp++, ' - return header + '&' + self.dram.name + ')' - - def to_sm64_decomp_s(self): - return 'gsDPLoadTLUT_pal256 ' + self.dram.name - - def size(self, f3d): - if not f3d._HW_VERSION_1: - return GFX_SIZE * 6 - else: - return GFX_SIZE * 7 + def __init__(self, dram): + self.dram = dram # pallete object + + def get_ptr_offsets(self, f3d): + return [4] + + def to_binary(self, f3d, segments): + if not f3d._HW_VERSION_1: + return ( + DPSetTextureImage( + "G_IM_FMT_RGBA", "G_IM_SIZ_16b", 1, self.dram + ).to_binary(f3d, segments) + + DPTileSync().to_binary(f3d, segments) + + DPSetTile( + "0", "0", 0, 256, f3d.G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0 + ).to_binary(f3d, segments) + + DPLoadSync().to_binary(f3d, segments) + + DPLoadTLUTCmd(f3d.G_TX_LOADTILE, 255).to_binary(f3d, segments) + + DPPipeSync().to_binary(f3d, segments) + ) + else: + return _DPLoadTextureBlock( + self.dram, + 256, + f3d.G_IM_FMT_VARS["G_IM_FMT_RGBA"], + f3d.G_IM_SIZ_VARS["G_IM_SIZ_16b"], + 4 * 256, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ).to_binary(f3d, segments) + + def to_c(self, static=True): + header = "gsDPLoadTLUT_pal256(" if static else "gDPLoadTLUT_pal256(glistp++, " + return header + "&" + self.dram.name + ")" + + def to_sm64_decomp_s(self): + return "gsDPLoadTLUT_pal256 " + self.dram.name + + def size(self, f3d): + if not f3d._HW_VERSION_1: + return GFX_SIZE * 6 + else: + return GFX_SIZE * 7 + class DPLoadTLUT: - def __init__(self, count, tmemaddr, dram): - self.count = count - self.tmemaddr = tmemaddr - self.dram = dram # pallete object - - def get_ptr_offsets(self, f3d): - return [4] - - def to_binary(self, f3d, segments): - if not f3d._HW_VERSION_1: - return \ - DPSetTextureImage('G_IM_FMT_RGBA', 'G_IM_SIZ_16b', 1, \ - self.dram).to_binary(f3d, segments) + \ - DPTileSync().to_binary(f3d, segments) + \ - DPSetTile('0', '0', 0, self.tmemaddr, f3d.G_TX_LOADTILE, \ - 0, 0, 0, 0, 0, 0, 0).to_binary(f3d, segments) + \ - DPLoadSync().to_binary(f3d, segments) + \ - DPLoadTLUTCmd(f3d.G_TX_LOADTILE, self.count - 1).to_binary( - f3d, segments) + \ - DPPipeSync().to_binary(f3d, segments) - else: - return _DPLoadTextureBlock(self.dram, self.tmemaddr, \ - f3d.G_IM_FMT_VARS['G_IM_FMT_RGBA'], \ - f3d.G_IM_SIZ_VARS['G_IM_SIZ_16b'], 4, self.count, - 0, 0, 0, 0, 0, 0, 0).to_binary(f3d, segments) - - def to_c(self, static = True): - header = 'gsDPLoadTLUT(' if static else \ - 'gDPLoadTLUT(glistp++, ' - return header + str(self.count) + ', ' + str(self.tmemaddr) + ', ' + \ - '&' + self.dram.name + ')' - - def to_sm64_decomp_s(self): - return 'gsDPLoadTLUT ' + str(self.count) + ', ' + \ - str(self.tmemaddr) + ', ' + self.dram.name - - def size(self, f3d): - if not f3d._HW_VERSION_1: - return GFX_SIZE * 6 - else: - return GFX_SIZE * 7 + def __init__(self, count, tmemaddr, dram): + self.count = count + self.tmemaddr = tmemaddr + self.dram = dram # pallete object + + def get_ptr_offsets(self, f3d): + return [4] + + def to_binary(self, f3d, segments): + if not f3d._HW_VERSION_1: + return ( + DPSetTextureImage( + "G_IM_FMT_RGBA", "G_IM_SIZ_16b", 1, self.dram + ).to_binary(f3d, segments) + + DPTileSync().to_binary(f3d, segments) + + DPSetTile( + "0", "0", 0, self.tmemaddr, f3d.G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0 + ).to_binary(f3d, segments) + + DPLoadSync().to_binary(f3d, segments) + + DPLoadTLUTCmd(f3d.G_TX_LOADTILE, self.count - 1).to_binary( + f3d, segments + ) + + DPPipeSync().to_binary(f3d, segments) + ) + else: + return _DPLoadTextureBlock( + self.dram, + self.tmemaddr, + f3d.G_IM_FMT_VARS["G_IM_FMT_RGBA"], + f3d.G_IM_SIZ_VARS["G_IM_SIZ_16b"], + 4, + self.count, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ).to_binary(f3d, segments) + + def to_c(self, static=True): + header = "gsDPLoadTLUT(" if static else "gDPLoadTLUT(glistp++, " + return ( + header + + str(self.count) + + ", " + + str(self.tmemaddr) + + ", " + + "&" + + self.dram.name + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsDPLoadTLUT " + + str(self.count) + + ", " + + str(self.tmemaddr) + + ", " + + self.dram.name + ) + + def size(self, f3d): + if not f3d._HW_VERSION_1: + return GFX_SIZE * 6 + else: + return GFX_SIZE * 7 + # gsDPSetScissor # gsDPSetScissorFrac # gsDPFillRectangle + class DPSetConvert: - def __init__(self, k0, k1, k2, k3, k4, k5): - self.k0 = k0 - self.k1 = k1 - self.k2 = k2 - self.k3 = k3 - self.k4 = k4 - self.k5 = k5 - - def to_binary(self, f3d, segments): - words = (_SHIFTL(f3d.G_SETCONVERT, 24, 8) | \ - _SHIFTL(self.k0, 13, 9) | _SHIFTL(self.k1, 4, 9) | \ - _SHIFTL(self.k2, 5, 4)), (_SHIFTL(self.k2, 27, 5) | \ - _SHIFTL(self.k3, 18, 9) | _SHIFTL(self.k4, 9, 9) | \ - _SHIFTL(self.k5, 0, 9)) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') - - def to_c(self, static = True): - header = 'gsDPSetConvert(' if static else 'gDPSetConvert(glistp++, ' - return header + str(self.k0) + ', ' + str(self.k1) + ', ' + \ - str(self.k2) + ', ' + str(self.k3) + ', ' + str(self.k4) + \ - ', ' + str(self.k5) + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetConvert ' + str(self.k0) + ', ' + str(self.k1) + ', ' + \ - str(self.k2) + ', ' + str(self.k3) + ', ' + str(self.k4) + \ - ', ' + str(self.k5) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, k0, k1, k2, k3, k4, k5): + self.k0 = k0 + self.k1 = k1 + self.k2 = k2 + self.k3 = k3 + self.k4 = k4 + self.k5 = k5 + + def to_binary(self, f3d, segments): + words = ( + _SHIFTL(f3d.G_SETCONVERT, 24, 8) + | _SHIFTL(self.k0, 13, 9) + | _SHIFTL(self.k1, 4, 9) + | _SHIFTL(self.k2, 5, 4) + ), ( + _SHIFTL(self.k2, 27, 5) + | _SHIFTL(self.k3, 18, 9) + | _SHIFTL(self.k4, 9, 9) + | _SHIFTL(self.k5, 0, 9) + ) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + def to_c(self, static=True): + header = "gsDPSetConvert(" if static else "gDPSetConvert(glistp++, " + return ( + header + + str(self.k0) + + ", " + + str(self.k1) + + ", " + + str(self.k2) + + ", " + + str(self.k3) + + ", " + + str(self.k4) + + ", " + + str(self.k5) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsDPSetConvert " + + str(self.k0) + + ", " + + str(self.k1) + + ", " + + str(self.k2) + + ", " + + str(self.k3) + + ", " + + str(self.k4) + + ", " + + str(self.k5) + ) + + def size(self, f3d): + return GFX_SIZE + class DPSetKeyR: - def __init__(self, cR, sR, wR): - self.cR = cR - self.sR = sR - self.wR = wR - - def to_binary(self, f3d, segments): - words = _SHIFTL(f3d.G_SETKEYR, 24, 8), \ - _SHIFTL(self.wR, 16, 12) | _SHIFTL(self.cR, 8, 8) | \ - _SHIFTL(self.sR, 0, 8) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') - - def to_c(self, static = True): - header = 'gsDPSetKeyR(' if static else 'gDPSetKeyR(glistp++, ' - return header + str(self.cR) + ', ' + str(self.sR) + ', ' + \ - str(self.wR) + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetKeyR ' + str(self.cR) + ', ' + str(self.sR) + ', ' + \ - str(self.wR) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, cR, sR, wR): + self.cR = cR + self.sR = sR + self.wR = wR + + def to_binary(self, f3d, segments): + words = _SHIFTL(f3d.G_SETKEYR, 24, 8), _SHIFTL(self.wR, 16, 12) | _SHIFTL( + self.cR, 8, 8 + ) | _SHIFTL(self.sR, 0, 8) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + def to_c(self, static=True): + header = "gsDPSetKeyR(" if static else "gDPSetKeyR(glistp++, " + return header + str(self.cR) + ", " + str(self.sR) + ", " + str(self.wR) + ")" + + def to_sm64_decomp_s(self): + return "gsDPSetKeyR " + str(self.cR) + ", " + str(self.sR) + ", " + str(self.wR) + + def size(self, f3d): + return GFX_SIZE + class DPSetKeyGB: - def __init__(self, cG, sG, wG, cB, sB, wB): - self.cG = cG - self.sG = sG - self.wG = wG - self.cB = cB - self.sB = sB - self.wB = wB - - def to_binary(self, f3d, segments): - words = (_SHIFTL(f3d.G_SETKEYGB, 24, 8) | _SHIFTL(self.wG, 12, 12) |\ - _SHIFTL(self.wB, 0, 12)), (_SHIFTL(self.cG, 24, 8) | \ - _SHIFTL(self.sG, 16, 8) | _SHIFTL(self.cB, 8, 8) | \ - _SHIFTL(self.sB, 0, 8)) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') - - def to_c(self, static = True): - header = 'gsDPSetKeyGB(' if static else 'gDPSetKeyGB(glistp++, ' - return header + str(self.cG) + ', ' + str(self.sG) + ', ' + \ - str(self.wG) + ', ' + str(self.cB) + ', ' + str(self.sB) + \ - ', ' + str(self.wB) + ')' - - def to_sm64_decomp_s(self): - return 'gsDPSetKeyGB ' + str(self.cG) + ', ' + str(self.sG) + ', ' + \ - str(self.wG) + ', ' + str(self.cB) + ', ' + str(self.sB) + \ - ', ' + str(self.wB) - - def size(self, f3d): - return GFX_SIZE + def __init__(self, cG, sG, wG, cB, sB, wB): + self.cG = cG + self.sG = sG + self.wG = wG + self.cB = cB + self.sB = sB + self.wB = wB + + def to_binary(self, f3d, segments): + words = ( + _SHIFTL(f3d.G_SETKEYGB, 24, 8) + | _SHIFTL(self.wG, 12, 12) + | _SHIFTL(self.wB, 0, 12) + ), ( + _SHIFTL(self.cG, 24, 8) + | _SHIFTL(self.sG, 16, 8) + | _SHIFTL(self.cB, 8, 8) + | _SHIFTL(self.sB, 0, 8) + ) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + def to_c(self, static=True): + header = "gsDPSetKeyGB(" if static else "gDPSetKeyGB(glistp++, " + return ( + header + + str(self.cG) + + ", " + + str(self.sG) + + ", " + + str(self.wG) + + ", " + + str(self.cB) + + ", " + + str(self.sB) + + ", " + + str(self.wB) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsDPSetKeyGB " + + str(self.cG) + + ", " + + str(self.sG) + + ", " + + str(self.wG) + + ", " + + str(self.cB) + + ", " + + str(self.sB) + + ", " + + str(self.wB) + ) + + def size(self, f3d): + return GFX_SIZE + def gsDPNoParam(cmd): - words = _SHIFTL(cmd, 24, 8), 0 - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') + words = _SHIFTL(cmd, 24, 8), 0 + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + def gsDPParam(cmd, param): - words = _SHIFTL(cmd, 24, 8), (param) - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') + words = _SHIFTL(cmd, 24, 8), (param) + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + # gsDPTextureRectangle # gsDPTextureRectangleFlip + class SPTextureRectangle: - def __init__(self, xl, yl, xh, yh, tile, s, t, dsdx = 4 << 10, dtdy = 1 << 10): - self.xl = xl - self.yl = yl - self.xh = xh - self.yh = yh - self.tile = tile - self.s = s - self.t = t - self.dsdx = dsdx - self.dtdy = dtdy - - def to_binary(self, f3d, segments): - words = (_SHIFTL(f3d.G_TEXRECT, 24, 8) | _SHIFTL(self.xh, 12, 12) | \ - _SHIFTL(self.yh, 0, 12)), \ - (_SHIFTL(self.tile, 24, 3) | _SHIFTL(self.xl, 12, 12) | \ - _SHIFTL(self.yl, 0, 12)), \ - gsImmp1(f3d.G_RDPHALF_1, (_SHIFTL(self.s, 16, 16) | _SHIFTL(self.t, 0, 16))), \ - gsImmp1(f3d.G_RDPHALF_2, (_SHIFTL(self.dsdx, 16, 16) | _SHIFTL(self.dtdy, 0, 16))) - - return words[0].to_bytes(4, 'big') + words[1].to_bytes(4, 'big') +\ - words[2].to_bytes(4, 'big') + words[3].to_bytes(4, 'big') - - def to_c(self, static = True): - header = 'gsSPTextureRectangle(' if static else 'gSPTextureRectangle(glistp++, ' - return header + str(self.xl) + ', ' + str(self.yl) + ', ' + \ - str(self.xh) + ', ' + str(self.yh) + ', ' + str(self.tile) + \ - ', ' + str(self.s) + ', ' + str(self.t) + ', ' + str(self.dsdx) + ', ' + str(self.dtdy) + ')' - - def to_sm64_decomp_s(self): - return 'gsSPTextureRectangle ' + str(self.xl) + ', ' + str(self.yl) + ', ' + \ - str(self.xh) + ', ' + str(self.yh) + ', ' + str(self.tile) + \ - ', ' + str(self.s) + ', ' + str(self.t) + ', ' + str(self.dsdx) + ', ' + str(self.dtdy) - - def size(self, f3d): - return GFX_SIZE * 2 + def __init__(self, xl, yl, xh, yh, tile, s, t, dsdx=4 << 10, dtdy=1 << 10): + self.xl = xl + self.yl = yl + self.xh = xh + self.yh = yh + self.tile = tile + self.s = s + self.t = t + self.dsdx = dsdx + self.dtdy = dtdy + + def to_binary(self, f3d, segments): + words = ( + ( + _SHIFTL(f3d.G_TEXRECT, 24, 8) + | _SHIFTL(self.xh, 12, 12) + | _SHIFTL(self.yh, 0, 12) + ), + ( + _SHIFTL(self.tile, 24, 3) + | _SHIFTL(self.xl, 12, 12) + | _SHIFTL(self.yl, 0, 12) + ), + gsImmp1( + f3d.G_RDPHALF_1, (_SHIFTL(self.s, 16, 16) | _SHIFTL(self.t, 0, 16)) + ), + gsImmp1( + f3d.G_RDPHALF_2, + (_SHIFTL(self.dsdx, 16, 16) | _SHIFTL(self.dtdy, 0, 16)), + ), + ) + + return ( + words[0].to_bytes(4, "big") + + words[1].to_bytes(4, "big") + + words[2].to_bytes(4, "big") + + words[3].to_bytes(4, "big") + ) + + def to_c(self, static=True): + header = "gsSPTextureRectangle(" if static else "gSPTextureRectangle(glistp++, " + return ( + header + + str(self.xl) + + ", " + + str(self.yl) + + ", " + + str(self.xh) + + ", " + + str(self.yh) + + ", " + + str(self.tile) + + ", " + + str(self.s) + + ", " + + str(self.t) + + ", " + + str(self.dsdx) + + ", " + + str(self.dtdy) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsSPTextureRectangle " + + str(self.xl) + + ", " + + str(self.yl) + + ", " + + str(self.xh) + + ", " + + str(self.yh) + + ", " + + str(self.tile) + + ", " + + str(self.s) + + ", " + + str(self.t) + + ", " + + str(self.dsdx) + + ", " + + str(self.dtdy) + ) + + def size(self, f3d): + return GFX_SIZE * 2 + class SPScisTextureRectangle: - def __init__(self, xl, yl, xh, yh, tile, s, t, dsdx = 4 << 10, dtdy = 1 << 10): - self.xl = xl - self.yl = yl - self.xh = xh - self.yh = yh - self.tile = tile - self.s = s - self.t = t - self.dsdx = dsdx - self.dtdy = dtdy - - def to_binary(self, f3d, segments): - raise PluginError("SPScisTextureRectangle not implemented for binary.") - - def to_c(self, static = True): - if static: - raise PluginError("SPScisTextureRectangle is dynamic only.") - header = 'gSPScisTextureRectangle(glistp++, ' - return header + str(self.xl) + ', ' + str(self.yl) + ', ' + \ - str(self.xh) + ', ' + str(self.yh) + ', ' + str(self.tile) + \ - ', ' + str(self.s) + ', ' + str(self.t) + ', ' + str(self.dsdx) + ', ' + str(self.dtdy) + ')' - - def to_sm64_decomp_s(self): - return 'gsSPScisTextureRectangle ' + str(self.xl) + ', ' + str(self.yl) + ', ' + \ - str(self.xh) + ', ' + str(self.yh) + ', ' + str(self.tile) + \ - ', ' + str(self.s) + ', ' + str(self.t) + ', ' + str(self.dsdx) + ', ' + str(self.dtdy) - - def size(self, f3d): - return GFX_SIZE * 2 + def __init__(self, xl, yl, xh, yh, tile, s, t, dsdx=4 << 10, dtdy=1 << 10): + self.xl = xl + self.yl = yl + self.xh = xh + self.yh = yh + self.tile = tile + self.s = s + self.t = t + self.dsdx = dsdx + self.dtdy = dtdy + + def to_binary(self, f3d, segments): + raise PluginError("SPScisTextureRectangle not implemented for binary.") + + def to_c(self, static=True): + if static: + raise PluginError("SPScisTextureRectangle is dynamic only.") + header = "gSPScisTextureRectangle(glistp++, " + return ( + header + + str(self.xl) + + ", " + + str(self.yl) + + ", " + + str(self.xh) + + ", " + + str(self.yh) + + ", " + + str(self.tile) + + ", " + + str(self.s) + + ", " + + str(self.t) + + ", " + + str(self.dsdx) + + ", " + + str(self.dtdy) + + ")" + ) + + def to_sm64_decomp_s(self): + return ( + "gsSPScisTextureRectangle " + + str(self.xl) + + ", " + + str(self.yl) + + ", " + + str(self.xh) + + ", " + + str(self.yh) + + ", " + + str(self.tile) + + ", " + + str(self.s) + + ", " + + str(self.t) + + ", " + + str(self.dsdx) + + ", " + + str(self.dtdy) + ) + + def size(self, f3d): + return GFX_SIZE * 2 + # gsSPTextureRectangleFlip # gsDPWord + class DPFullSync: - def __init__(self): - pass - - def to_binary(self, f3d, segments): - return gsDPNoParam(f3d.G_RDPFULLSYNC) + def __init__(self): + pass + + def to_binary(self, f3d, segments): + return gsDPNoParam(f3d.G_RDPFULLSYNC) - def to_c(self, static = True): - return 'gsDPFullSync()' if static else 'gDPFullSync(glistp++)' + def to_c(self, static=True): + return "gsDPFullSync()" if static else "gDPFullSync(glistp++)" + + def to_sm64_decomp_s(self): + return "gsDPFullSync" + + def size(self, f3d): + return GFX_SIZE - def to_sm64_decomp_s(self): - return 'gsDPFullSync' - - def size(self, f3d): - return GFX_SIZE class DPTileSync: - def __init__(self): - pass - - def to_binary(self, f3d, segments): - return gsDPNoParam(f3d.G_RDPTILESYNC) - - def to_c(self, static = True): - return 'gsDPTileSync()' if static else 'gDPTileSync(glistp++)' - - def to_sm64_decomp_s(self): - return 'gsDPTileSync' - - def size(self, f3d): - return GFX_SIZE - + def __init__(self): + pass + + def to_binary(self, f3d, segments): + return gsDPNoParam(f3d.G_RDPTILESYNC) + + def to_c(self, static=True): + return "gsDPTileSync()" if static else "gDPTileSync(glistp++)" + + def to_sm64_decomp_s(self): + return "gsDPTileSync" + + def size(self, f3d): + return GFX_SIZE + + class DPPipeSync: - def __init__(self): - pass - - def to_binary(self, f3d, segments): - return gsDPNoParam(f3d.G_RDPPIPESYNC) + def __init__(self): + pass + + def to_binary(self, f3d, segments): + return gsDPNoParam(f3d.G_RDPPIPESYNC) + + def to_c(self, static=True): + return "gsDPPipeSync()" if static else "gDPPipeSync(glistp++)" + + def to_sm64_decomp_s(self): + return "gsDPPipeSync" - def to_c(self, static = True): - return 'gsDPPipeSync()' if static else 'gDPPipeSync(glistp++)' + def size(self, f3d): + return GFX_SIZE - def to_sm64_decomp_s(self): - return 'gsDPPipeSync' - - def size(self, f3d): - return GFX_SIZE class DPLoadSync: - def __init__(self): - pass - - def to_binary(self, f3d, segments): - return gsDPNoParam(f3d.G_RDPLOADSYNC) + def __init__(self): + pass + + def to_binary(self, f3d, segments): + return gsDPNoParam(f3d.G_RDPLOADSYNC) + + def to_c(self, static=True): + return "gsDPLoadSync()" if static else "gDPLoadSync(glistp++)" + + def to_sm64_decomp_s(self): + return "gsDPLoadSync" - def to_c(self, static = True): - return 'gsDPLoadSync()' if static else 'gDPLoadSync(glistp++)' + def size(self, f3d): + return GFX_SIZE - def to_sm64_decomp_s(self): - return 'gsDPLoadSync' - - def size(self, f3d): - return GFX_SIZE F3DClassesWithPointers = [ - SPVertex, - SPDisplayList, - SPViewport, - SPBranchList, - SPLight, - SPSetLights, - SPLookAt, - DPSetTextureImage, - DPLoadTextureBlock, - DPLoadTextureBlockYuv, - _DPLoadTextureBlock, - DPLoadTextureBlock_4b, - DPLoadTextureTile, - DPLoadTextureTile_4b, - DPLoadTLUT_pal16, - DPLoadTLUT_pal256, - DPLoadTLUT, + SPVertex, + SPDisplayList, + SPViewport, + SPBranchList, + SPLight, + SPSetLights, + SPLookAt, + DPSetTextureImage, + DPLoadTextureBlock, + DPLoadTextureBlockYuv, + _DPLoadTextureBlock, + DPLoadTextureBlock_4b, + DPLoadTextureTile, + DPLoadTextureTile_4b, + DPLoadTLUT_pal16, + DPLoadTLUT_pal256, + DPLoadTLUT, ] diff --git a/fast64_internal/f3d/f3d_generate_presets.py b/fast64_internal/f3d/f3d_generate_presets.py index f5d381e3e..98c16ef1e 100644 --- a/fast64_internal/f3d/f3d_generate_presets.py +++ b/fast64_internal/f3d/f3d_generate_presets.py @@ -1,29 +1,29 @@ import os -basePath = 'presets/f3d' -data = '' +basePath = "presets/f3d" +data = "" presetList = "material_presets = {\n" for subdir in os.listdir(basePath): - subPath = os.path.join(basePath, subdir) - if subdir != '__pycache__' and subdir != 'user' and os.path.isdir(subPath): - presetList += '\t"' + subdir + '" : {\n' - for filename in os.listdir(subPath): - presetPath = os.path.join(subPath, filename) - if os.path.isfile(presetPath): - print(presetPath) - presetFile = open(presetPath, 'r') - presetData = presetFile.read() - presetFile.close() + subPath = os.path.join(basePath, subdir) + if subdir != "__pycache__" and subdir != "user" and os.path.isdir(subPath): + presetList += '\t"' + subdir + '" : {\n' + for filename in os.listdir(subPath): + presetPath = os.path.join(subPath, filename) + if os.path.isfile(presetPath): + print(presetPath) + presetFile = open(presetPath, "r") + presetData = presetFile.read() + presetFile.close() - data += filename[:-3] + " = '''\n" + presetData + "'''\n\n" - presetList += '\t\t"' + filename[:-3] + '" : ' + filename[:-3] + ',\n' - presetList += '\t},\n' + data += filename[:-3] + " = '''\n" + presetData + "'''\n\n" + presetList += '\t\t"' + filename[:-3] + '" : ' + filename[:-3] + ",\n" + presetList += "\t},\n" -presetList += '}\n' +presetList += "}\n" data += presetList -outFile = open('f3d_material_presets.py', 'w') +outFile = open("f3d_material_presets.py", "w") outFile.write(data) -outFile.close() \ No newline at end of file +outFile.close() diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index a5180586b..cc9ceefd7 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -1,6 +1,13 @@ import bpy, math, mathutils, sys, copy, os from bpy.app.handlers import persistent -from bpy.types import Node, NodeSocket, NodeSocketInterface, ShaderNode, ShaderNodeGroup, Panel +from bpy.types import ( + Node, + NodeSocket, + NodeSocketInterface, + ShaderNode, + ShaderNodeGroup, + Panel, +) from bpy.types import Operator, Menu from bl_operators.presets import AddPresetBase from bpy.utils import register_class, unregister_class @@ -18,2270 +25,2949 @@ # env color bitSizeDict = { - 'G_IM_SIZ_4b' : 4, - 'G_IM_SIZ_8b' : 8, - 'G_IM_SIZ_16b' : 16, - 'G_IM_SIZ_32b' : 32, + "G_IM_SIZ_4b": 4, + "G_IM_SIZ_8b": 8, + "G_IM_SIZ_16b": 16, + "G_IM_SIZ_32b": 32, } texBitSizeOf = { - 'I4' : 'G_IM_SIZ_4b', - 'IA4' : 'G_IM_SIZ_4b', - 'CI4' : 'G_IM_SIZ_4b', - 'I8' : 'G_IM_SIZ_8b', - 'IA8' : 'G_IM_SIZ_8b', - 'CI8' : 'G_IM_SIZ_8b', - 'RGBA16' : 'G_IM_SIZ_16b', - 'IA16' : 'G_IM_SIZ_16b', - 'YUV16' : 'G_IM_SIZ_16b', - 'RGBA32' : 'G_IM_SIZ_32b', + "I4": "G_IM_SIZ_4b", + "IA4": "G_IM_SIZ_4b", + "CI4": "G_IM_SIZ_4b", + "I8": "G_IM_SIZ_8b", + "IA8": "G_IM_SIZ_8b", + "CI8": "G_IM_SIZ_8b", + "RGBA16": "G_IM_SIZ_16b", + "IA16": "G_IM_SIZ_16b", + "YUV16": "G_IM_SIZ_16b", + "RGBA32": "G_IM_SIZ_32b", } texFormatOf = { - 'I4' : 'G_IM_FMT_I', - 'IA4' : 'G_IM_FMT_IA', - 'CI4' : 'G_IM_FMT_CI', - 'I8' : 'G_IM_FMT_I', - 'IA8' : 'G_IM_FMT_IA', - 'CI8' : 'G_IM_FMT_CI', - 'RGBA16' : 'G_IM_FMT_RGBA', - 'IA16' : 'G_IM_FMT_IA', - 'YUV16' : 'G_IM_FMT_YUV', - 'RGBA32' : 'G_IM_FMT_RGBA', + "I4": "G_IM_FMT_I", + "IA4": "G_IM_FMT_IA", + "CI4": "G_IM_FMT_CI", + "I8": "G_IM_FMT_I", + "IA8": "G_IM_FMT_IA", + "CI8": "G_IM_FMT_CI", + "RGBA16": "G_IM_FMT_RGBA", + "IA16": "G_IM_FMT_IA", + "YUV16": "G_IM_FMT_YUV", + "RGBA32": "G_IM_FMT_RGBA", } sm64EnumDrawLayers = [ - ('0', 'Background (0x00)', 'Background'), - ('1', 'Opaque (0x01)', 'Opaque'), - ('2', 'Opaque Decal (0x02)', 'Opaque Decal'), - ('3', 'Opaque Intersecting (0x03)', 'Opaque Intersecting'), - ('4', 'Cutout (0x04)', 'Cutout'), - ('5', 'Transparent (0x05)', 'Transparent'), - ('6', 'Transparent Decal (0x06)', 'Transparent Decal'), - ('7', 'Transparent Intersecting (0x07)', 'Transparent Intersecting'), + ("0", "Background (0x00)", "Background"), + ("1", "Opaque (0x01)", "Opaque"), + ("2", "Opaque Decal (0x02)", "Opaque Decal"), + ("3", "Opaque Intersecting (0x03)", "Opaque Intersecting"), + ("4", "Cutout (0x04)", "Cutout"), + ("5", "Transparent (0x05)", "Transparent"), + ("6", "Transparent Decal (0x06)", "Transparent Decal"), + ("7", "Transparent Intersecting (0x07)", "Transparent Intersecting"), ] ootEnumDrawLayers = [ - ('Opaque', 'Opaque', 'Opaque'), - ('Transparent', 'Transparent', 'Transparent'), - ('Overlay', 'Overlay', 'Overlay'), + ("Opaque", "Opaque", "Opaque"), + ("Transparent", "Transparent", "Transparent"), + ("Overlay", "Overlay", "Overlay"), ] drawLayerSM64toOOT = { - '0' : "Opaque", - '1' : "Opaque", - '2' : "Opaque", - '3' : "Opaque", - '4' : "Opaque", - '5' : "Transparent", - '6' : "Transparent", - '7' : "Transparent", + "0": "Opaque", + "1": "Opaque", + "2": "Opaque", + "3": "Opaque", + "4": "Opaque", + "5": "Transparent", + "6": "Transparent", + "7": "Transparent", } drawLayerOOTtoSM64 = { - "Opaque" : '1', - "Transparent" : '5', - "Overlay" : '1', + "Opaque": "1", + "Transparent": "5", + "Overlay": "1", } -#drawLayerOOTAlpha = { -# "Opaque" : "OPAQUE", -# "Transparent" : "BLEND", -# "Overlay" : 'CLIP', -#} +# drawLayerOOTAlpha = { +# "Opaque" : "OPAQUE", +# "Transparent" : "BLEND", +# "Overlay" : 'CLIP', +# } drawLayerSM64Alpha = { - '0' : "CLIP", - '1' : "CLIP", - '2' : "CLIP", - '3' : "CLIP", - '4' : "CLIP", - '5' : "BLEND", - '6' : "BLEND", - '7' : "BLEND", + "0": "CLIP", + "1": "CLIP", + "2": "CLIP", + "3": "CLIP", + "4": "CLIP", + "5": "BLEND", + "6": "BLEND", + "7": "BLEND", } enumF3DMenu = [ - ("Combiner", "Combiner", "Combiner"), - ("Sources", "Sources", "Sources"), - ("Geo", "Geo", "Geo"), - ("Upper", "Upper", "Upper"), - ("Lower", "Lower", "Lower"), + ("Combiner", "Combiner", "Combiner"), + ("Sources", "Sources", "Sources"), + ("Geo", "Geo", "Geo"), + ("Upper", "Upper", "Upper"), + ("Lower", "Lower", "Lower"), ] enumF3DSource = [ - ("None", "None", "None"), - ('Texture', 'Texture', 'Texture'), - ('Tile Size', 'Tile Size', 'Tile Size'), - ('Primitive', 'Primitive', 'Primitive'), - ('Environment', 'Environment', 'Environment'), - ('Shade', 'Shade', 'Shade'), - ('Key', 'Key', 'Key'), - ('LOD Fraction', 'LOD Fraction', 'LOD Fraction'), - ('Convert', 'Convert', 'Convert'), + ("None", "None", "None"), + ("Texture", "Texture", "Texture"), + ("Tile Size", "Tile Size", "Tile Size"), + ("Primitive", "Primitive", "Primitive"), + ("Environment", "Environment", "Environment"), + ("Shade", "Shade", "Shade"), + ("Key", "Key", "Key"), + ("LOD Fraction", "LOD Fraction", "LOD Fraction"), + ("Convert", "Convert", "Convert"), ] defaultMaterialPresets = { - "Shaded Solid" : { - "SM64" : "Shaded Solid", - "OOT" : "oot_shaded_solid" - }, - "Shaded Texture" : { - "SM64" : "Shaded Texture", - "OOT" : "oot_shaded_texture" - } + "Shaded Solid": {"SM64": "Shaded Solid", "OOT": "oot_shaded_solid"}, + "Shaded Texture": {"SM64": "Shaded Texture", "OOT": "oot_shaded_texture"}, } + def getDefaultMaterialPreset(category): - game = bpy.context.scene.gameEditorMode - if game in defaultMaterialPresets[category]: - return defaultMaterialPresets[category][game] - else: - return "Shaded Solid" + game = bpy.context.scene.gameEditorMode + if game in defaultMaterialPresets[category]: + return defaultMaterialPresets[category][game] + else: + return "Shaded Solid" + def update_draw_layer(self, context): - if hasattr(context, 'material_slot') and context.material_slot is not None: - material = context.material_slot.material # Handles case of texture property groups - if not material.is_f3d or material.f3d_update_flag: - return - - material.f3d_update_flag = True - if material.mat_ver > 3: - drawLayer = material.f3d_mat.draw_layer - if context.scene.gameEditorMode == "SM64": - drawLayer.oot = drawLayerSM64toOOT[drawLayer.sm64] - elif context.scene.gameEditorMode == "OOT": - if material.f3d_mat.draw_layer.oot == "Opaque": - if int(material.f3d_mat.draw_layer.sm64) > 4: - material.f3d_mat.draw_layer.sm64 = '1' - elif material.f3d_mat.draw_layer.oot == "Transparent": - if int(material.f3d_mat.draw_layer.sm64) < 5: - material.f3d_mat.draw_layer.sm64 = '5' - material.f3d_mat.presetName = "Custom" - update_blend_method(material, context) - material.f3d_update_flag = False + if hasattr(context, "material_slot") and context.material_slot is not None: + material = ( + context.material_slot.material + ) # Handles case of texture property groups + if not material.is_f3d or material.f3d_update_flag: + return + + material.f3d_update_flag = True + if material.mat_ver > 3: + drawLayer = material.f3d_mat.draw_layer + if context.scene.gameEditorMode == "SM64": + drawLayer.oot = drawLayerSM64toOOT[drawLayer.sm64] + elif context.scene.gameEditorMode == "OOT": + if material.f3d_mat.draw_layer.oot == "Opaque": + if int(material.f3d_mat.draw_layer.sm64) > 4: + material.f3d_mat.draw_layer.sm64 = "1" + elif material.f3d_mat.draw_layer.oot == "Transparent": + if int(material.f3d_mat.draw_layer.sm64) < 5: + material.f3d_mat.draw_layer.sm64 = "5" + material.f3d_mat.presetName = "Custom" + update_blend_method(material, context) + material.f3d_update_flag = False + def update_blend_method(material, context): - if material.mat_ver > 3: - drawLayer = material.f3d_mat.draw_layer - if context.scene.gameEditorMode == "OOT": - if drawLayer.oot == "Opaque" or drawLayer.oot == "Overlay": - f3dMat = material.f3d_mat - if not f3dMat.rdp_settings.rendermode_advanced_enabled and\ - "TEX_EDGE" not in f3dMat.rdp_settings.rendermode_preset_cycle_1 and\ - ("TEX_EDGE" not in f3dMat.rdp_settings.rendermode_preset_cycle_2 or\ - f3dMat.rdp_settings.g_mdsft_cycletype != 'G_CYC_2CYCLE'): - material.blend_method = "OPAQUE" - else: - material.blend_method = "CLIP" - else: - material.blend_method = "BLEND" - elif context.scene.gameEditorMode == "SM64": - material.blend_method = drawLayerSM64Alpha[drawLayer.sm64] + if material.mat_ver > 3: + drawLayer = material.f3d_mat.draw_layer + if context.scene.gameEditorMode == "OOT": + if drawLayer.oot == "Opaque" or drawLayer.oot == "Overlay": + f3dMat = material.f3d_mat + if ( + not f3dMat.rdp_settings.rendermode_advanced_enabled + and "TEX_EDGE" not in f3dMat.rdp_settings.rendermode_preset_cycle_1 + and ( + "TEX_EDGE" not in f3dMat.rdp_settings.rendermode_preset_cycle_2 + or f3dMat.rdp_settings.g_mdsft_cycletype != "G_CYC_2CYCLE" + ) + ): + material.blend_method = "OPAQUE" + else: + material.blend_method = "CLIP" + else: + material.blend_method = "BLEND" + elif context.scene.gameEditorMode == "SM64": + material.blend_method = drawLayerSM64Alpha[drawLayer.sm64] + class DrawLayerProperty(bpy.types.PropertyGroup): - sm64 : bpy.props.EnumProperty(items = sm64EnumDrawLayers, default = "1", update = update_draw_layer) - oot : bpy.props.EnumProperty(items = ootEnumDrawLayers, default = "Opaque", update = update_draw_layer) + sm64: bpy.props.EnumProperty( + items=sm64EnumDrawLayers, default="1", update=update_draw_layer + ) + oot: bpy.props.EnumProperty( + items=ootEnumDrawLayers, default="Opaque", update=update_draw_layer + ) + def getTmemWordUsage(texFormat, width, height): - texelsPerLine = 64 / bitSizeDict[texBitSizeOf[texFormat]] - return math.ceil(width / texelsPerLine) * height + texelsPerLine = 64 / bitSizeDict[texBitSizeOf[texFormat]] + return math.ceil(width / texelsPerLine) * height + def getTmemMax(texFormat): - return 4096 if texFormat[:2] != 'CI' else 2048 + return 4096 if texFormat[:2] != "CI" else 2048 + def F3DOrganizeLights(self, context): - # Flag to prevent infinite recursion on update callback - if not hasattr(context, "material") or context.material.f3d_update_flag: - return - context.material.f3d_update_flag = True - lightList = [] - if self.f3d_light1 is not None: lightList.append(self.f3d_light1) - if self.f3d_light2 is not None: lightList.append(self.f3d_light2) - if self.f3d_light3 is not None: lightList.append(self.f3d_light3) - if self.f3d_light4 is not None: lightList.append(self.f3d_light4) - if self.f3d_light5 is not None: lightList.append(self.f3d_light5) - if self.f3d_light5 is not None: lightList.append(self.f3d_light6) - if self.f3d_light6 is not None: lightList.append(self.f3d_light7) - - self.f3d_light1 = lightList[0] if len(lightList) > 0 else None - self.f3d_light2 = lightList[1] if len(lightList) > 1 else None - self.f3d_light3 = lightList[2] if len(lightList) > 2 else None - self.f3d_light4 = lightList[3] if len(lightList) > 3 else None - self.f3d_light5 = lightList[4] if len(lightList) > 4 else None - self.f3d_light6 = lightList[5] if len(lightList) > 5 else None - self.f3d_light7 = lightList[6] if len(lightList) > 6 else None - context.material.f3d_update_flag = False + # Flag to prevent infinite recursion on update callback + if not hasattr(context, "material") or context.material.f3d_update_flag: + return + context.material.f3d_update_flag = True + lightList = [] + if self.f3d_light1 is not None: + lightList.append(self.f3d_light1) + if self.f3d_light2 is not None: + lightList.append(self.f3d_light2) + if self.f3d_light3 is not None: + lightList.append(self.f3d_light3) + if self.f3d_light4 is not None: + lightList.append(self.f3d_light4) + if self.f3d_light5 is not None: + lightList.append(self.f3d_light5) + if self.f3d_light5 is not None: + lightList.append(self.f3d_light6) + if self.f3d_light6 is not None: + lightList.append(self.f3d_light7) + + self.f3d_light1 = lightList[0] if len(lightList) > 0 else None + self.f3d_light2 = lightList[1] if len(lightList) > 1 else None + self.f3d_light3 = lightList[2] if len(lightList) > 2 else None + self.f3d_light4 = lightList[3] if len(lightList) > 3 else None + self.f3d_light5 = lightList[4] if len(lightList) > 4 else None + self.f3d_light6 = lightList[5] if len(lightList) > 5 else None + self.f3d_light7 = lightList[6] if len(lightList) > 6 else None + context.material.f3d_update_flag = False + def combiner_uses(material, checkList, is2Cycle): - display = False - for value in checkList: - if value[:5] == "TEXEL": - value1 = value - value2 = value.replace("0", "1") if "0" in value else value.replace("1", "0") - else: - value1 = value - value2 = value + display = False + for value in checkList: + if value[:5] == "TEXEL": + value1 = value + value2 = ( + value.replace("0", "1") if "0" in value else value.replace("1", "0") + ) + else: + value1 = value + value2 = value - display |= material.combiner1.A == value1 - if is2Cycle: - display |= material.combiner2.A == value2 + display |= material.combiner1.A == value1 + if is2Cycle: + display |= material.combiner2.A == value2 - display |= material.combiner1.B == value1 - if is2Cycle: - display |= material.combiner2.B == value2 + display |= material.combiner1.B == value1 + if is2Cycle: + display |= material.combiner2.B == value2 - display |= material.combiner1.C == value1 - if is2Cycle: - display |= material.combiner2.C == value2 + display |= material.combiner1.C == value1 + if is2Cycle: + display |= material.combiner2.C == value2 - display |= material.combiner1.D == value1 - if is2Cycle: - display |= material.combiner2.D == value2 + display |= material.combiner1.D == value1 + if is2Cycle: + display |= material.combiner2.D == value2 + display |= material.combiner1.A_alpha == value1 + if is2Cycle: + display |= material.combiner2.A_alpha == value2 - display |= material.combiner1.A_alpha == value1 - if is2Cycle: - display |= material.combiner2.A_alpha == value2 + display |= material.combiner1.B_alpha == value1 + if is2Cycle: + display |= material.combiner2.B_alpha == value2 - display |= material.combiner1.B_alpha == value1 - if is2Cycle: - display |= material.combiner2.B_alpha == value2 + display |= material.combiner1.C_alpha == value1 + if is2Cycle: + display |= material.combiner2.C_alpha == value2 - display |= material.combiner1.C_alpha == value1 - if is2Cycle: - display |= material.combiner2.C_alpha == value2 + display |= material.combiner1.D_alpha == value1 + if is2Cycle: + display |= material.combiner2.D_alpha == value2 - display |= material.combiner1.D_alpha == value1 - if is2Cycle: - display |= material.combiner2.D_alpha == value2 + return display - return display def combiner_uses_alpha(material, checkList, is2Cycle): - display = False - for value in checkList: - if value[:5] == "TEXEL": - value1 = value - value2 = value.replace("0", "1") if "0" in value else value.replace("1", "0") - else: - value1 = value - value2 = value - - display |= material.combiner1.A_alpha == value1 - if is2Cycle: - display |= material.combiner2.A_alpha == value2 + display = False + for value in checkList: + if value[:5] == "TEXEL": + value1 = value + value2 = ( + value.replace("0", "1") if "0" in value else value.replace("1", "0") + ) + else: + value1 = value + value2 = value - display |= material.combiner1.B_alpha == value1 - if is2Cycle: - display |= material.combiner2.B_alpha == value2 + display |= material.combiner1.A_alpha == value1 + if is2Cycle: + display |= material.combiner2.A_alpha == value2 - display |= material.combiner1.C_alpha == value1 - if is2Cycle: - display |= material.combiner2.C_alpha == value2 + display |= material.combiner1.B_alpha == value1 + if is2Cycle: + display |= material.combiner2.B_alpha == value2 - display |= material.combiner1.D_alpha == value1 - if is2Cycle: - display |= material.combiner2.D_alpha == value2 + display |= material.combiner1.C_alpha == value1 + if is2Cycle: + display |= material.combiner2.C_alpha == value2 - return display + display |= material.combiner1.D_alpha == value1 + if is2Cycle: + display |= material.combiner2.D_alpha == value2 -def all_combiner_uses(material): - useDict = { - 'Texture' : combiner_uses(material, - ['TEXEL0', 'TEXEL0_ALPHA', 'TEXEL1', 'TEXEL1_ALPHA'], - material.rdp_settings.g_mdsft_cycletype == 'G_CYC_2CYCLE'), - - 'Texture 0' : combiner_uses(material, - ['TEXEL0', 'TEXEL0_ALPHA'], - material.rdp_settings.g_mdsft_cycletype == 'G_CYC_2CYCLE'), - - 'Texture 1' : combiner_uses(material, - ['TEXEL1', 'TEXEL1_ALPHA'], - material.rdp_settings.g_mdsft_cycletype == 'G_CYC_2CYCLE'), - - 'Primitive' : combiner_uses(material, - ['PRIMITIVE', 'PRIMITIVE_ALPHA', 'PRIM_LOD_FRAC'], - material.rdp_settings.g_mdsft_cycletype == 'G_CYC_2CYCLE'), - - 'Environment' : combiner_uses(material, - ['ENVIRONMENT', 'ENV_ALPHA'], - material.rdp_settings.g_mdsft_cycletype == 'G_CYC_2CYCLE'), + return display - 'Shade' : combiner_uses(material, - ['SHADE', 'SHADE_ALPHA'], - material.rdp_settings.g_mdsft_cycletype == 'G_CYC_2CYCLE'), - 'Shade Alpha' : combiner_uses_alpha(material, - ['SHADE'], - material.rdp_settings.g_mdsft_cycletype == 'G_CYC_2CYCLE'), - - 'Key' : combiner_uses(material, ['CENTER', 'SCALE'], - material.rdp_settings.g_mdsft_cycletype == 'G_CYC_2CYCLE'), - - 'LOD Fraction' : combiner_uses(material, ['LOD_FRACTION'], - material.rdp_settings.g_mdsft_cycletype == 'G_CYC_2CYCLE'), +def all_combiner_uses(material): + useDict = { + "Texture": combiner_uses( + material, + ["TEXEL0", "TEXEL0_ALPHA", "TEXEL1", "TEXEL1_ALPHA"], + material.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE", + ), + "Texture 0": combiner_uses( + material, + ["TEXEL0", "TEXEL0_ALPHA"], + material.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE", + ), + "Texture 1": combiner_uses( + material, + ["TEXEL1", "TEXEL1_ALPHA"], + material.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE", + ), + "Primitive": combiner_uses( + material, + ["PRIMITIVE", "PRIMITIVE_ALPHA", "PRIM_LOD_FRAC"], + material.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE", + ), + "Environment": combiner_uses( + material, + ["ENVIRONMENT", "ENV_ALPHA"], + material.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE", + ), + "Shade": combiner_uses( + material, + ["SHADE", "SHADE_ALPHA"], + material.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE", + ), + "Shade Alpha": combiner_uses_alpha( + material, + ["SHADE"], + material.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE", + ), + "Key": combiner_uses( + material, + ["CENTER", "SCALE"], + material.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE", + ), + "LOD Fraction": combiner_uses( + material, + ["LOD_FRACTION"], + material.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE", + ), + "Convert": combiner_uses( + material, + ["K4", "K5"], + material.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE", + ), + } + return useDict - 'Convert' : combiner_uses(material, ['K4', 'K5'], - material.rdp_settings.g_mdsft_cycletype == 'G_CYC_2CYCLE'), - } - return useDict def ui_geo_mode(settings, dataHolder, layout, useDropdown): - inputGroup = layout.column() - if useDropdown: - inputGroup.prop(dataHolder, 'menu_geo', - text = 'Geometry Mode Settings', - icon = 'TRIA_DOWN' if dataHolder.menu_geo else 'TRIA_RIGHT') - if not useDropdown or dataHolder.menu_geo: - inputGroup.prop(settings, 'g_zbuffer', text = 'Z Buffer') - inputGroup.prop(settings, 'g_shade', text = 'Shading') - inputGroup.prop(settings, 'g_cull_front', text = 'Cull Front') - inputGroup.prop(settings, 'g_cull_back', text = 'Cull Back') - inputGroup.prop(settings, 'g_fog', text = 'Fog') - #if isinstance(dataHolder, bpy.types.Material) and \ - # settings.g_fog: - # material = dataHolder - # fogInfoBox = inputGroup.box() - # fogInfoBox.label(text = 'To enable fog, make sure to do these things:') - # fogInfoBox.label(text = '(Ignore this if you used the preset)') - # fogInfoBox.label(text = 'In Other Mode Upper Settings, set Cycle Type to "2 Cycle".') - # fogInfoBox.label(text = 'Use a combiner that has "Shade Color".') - # fogInfoBox.label(text = 'In Render Settings, check "Set Render Mode".') - # fogInfoBox.label(text = 'Set the first field to "Fog Shade".') - # fogInfoBox.label(text = 'Set the second to the material\'s draw layer, usually "Opaque".') - - inputGroup.prop(settings, 'g_lighting', text = 'Lighting') - inputGroup.prop(settings, 'g_tex_gen', text = 'Texture UV Generate') - inputGroup.prop(settings, 'g_tex_gen_linear', - text = 'Texture UV Generate Linear') - inputGroup.prop(settings, 'g_shade_smooth', text = 'Smooth Shading') - if bpy.context.scene.f3d_type == 'F3DEX_GBI_2' or \ - bpy.context.scene.f3d_type == 'F3DEX_GBI': - inputGroup.prop(settings, 'g_clipping', text = 'Clipping') + inputGroup = layout.column() + if useDropdown: + inputGroup.prop( + dataHolder, + "menu_geo", + text="Geometry Mode Settings", + icon="TRIA_DOWN" if dataHolder.menu_geo else "TRIA_RIGHT", + ) + if not useDropdown or dataHolder.menu_geo: + inputGroup.prop(settings, "g_zbuffer", text="Z Buffer") + inputGroup.prop(settings, "g_shade", text="Shading") + inputGroup.prop(settings, "g_cull_front", text="Cull Front") + inputGroup.prop(settings, "g_cull_back", text="Cull Back") + inputGroup.prop(settings, "g_fog", text="Fog") + # if isinstance(dataHolder, bpy.types.Material) and \ + # settings.g_fog: + # material = dataHolder + # fogInfoBox = inputGroup.box() + # fogInfoBox.label(text = 'To enable fog, make sure to do these things:') + # fogInfoBox.label(text = '(Ignore this if you used the preset)') + # fogInfoBox.label(text = 'In Other Mode Upper Settings, set Cycle Type to "2 Cycle".') + # fogInfoBox.label(text = 'Use a combiner that has "Shade Color".') + # fogInfoBox.label(text = 'In Render Settings, check "Set Render Mode".') + # fogInfoBox.label(text = 'Set the first field to "Fog Shade".') + # fogInfoBox.label(text = 'Set the second to the material\'s draw layer, usually "Opaque".') + + inputGroup.prop(settings, "g_lighting", text="Lighting") + inputGroup.prop(settings, "g_tex_gen", text="Texture UV Generate") + inputGroup.prop(settings, "g_tex_gen_linear", text="Texture UV Generate Linear") + inputGroup.prop(settings, "g_shade_smooth", text="Smooth Shading") + if ( + bpy.context.scene.f3d_type == "F3DEX_GBI_2" + or bpy.context.scene.f3d_type == "F3DEX_GBI" + ): + inputGroup.prop(settings, "g_clipping", text="Clipping") + def ui_upper_mode(settings, dataHolder, layout, useDropdown): - inputGroup = layout.column() - if useDropdown: - inputGroup.prop(dataHolder, 'menu_upper', - text = 'Other Mode Upper Settings', - icon = 'TRIA_DOWN' if dataHolder.menu_upper else 'TRIA_RIGHT') - if not useDropdown or dataHolder.menu_upper: - if not bpy.context.scene.isHWv1: - prop_split(inputGroup, settings, 'g_mdsft_alpha_dither', - 'Alpha Dither') - prop_split(inputGroup, settings, 'g_mdsft_rgb_dither', - 'RGB Dither') - else: - prop_split(inputGroup, settings, 'g_mdsft_color_dither', - 'Color Dither') - prop_split(inputGroup, settings, 'g_mdsft_combkey', 'Chroma Key') - prop_split(inputGroup, settings, 'g_mdsft_textconv', 'Texture Convert') - prop_split(inputGroup, settings, 'g_mdsft_text_filt', 'Texture Filter') - #prop_split(inputGroup, settings, 'g_mdsft_textlut', 'Texture LUT') - prop_split(inputGroup, settings, 'g_mdsft_textlod', 'Texture LOD') - prop_split(inputGroup, settings, 'g_mdsft_textdetail', 'Texture Detail') - prop_split(inputGroup, settings, 'g_mdsft_textpersp', 'Texture Perspective Correction') - prop_split(inputGroup, settings, 'g_mdsft_cycletype', 'Cycle Type') - - prop_split(inputGroup, settings, 'g_mdsft_pipeline', 'Pipeline Span Buffer Coherency') + inputGroup = layout.column() + if useDropdown: + inputGroup.prop( + dataHolder, + "menu_upper", + text="Other Mode Upper Settings", + icon="TRIA_DOWN" if dataHolder.menu_upper else "TRIA_RIGHT", + ) + if not useDropdown or dataHolder.menu_upper: + if not bpy.context.scene.isHWv1: + prop_split(inputGroup, settings, "g_mdsft_alpha_dither", "Alpha Dither") + prop_split(inputGroup, settings, "g_mdsft_rgb_dither", "RGB Dither") + else: + prop_split(inputGroup, settings, "g_mdsft_color_dither", "Color Dither") + prop_split(inputGroup, settings, "g_mdsft_combkey", "Chroma Key") + prop_split(inputGroup, settings, "g_mdsft_textconv", "Texture Convert") + prop_split(inputGroup, settings, "g_mdsft_text_filt", "Texture Filter") + # prop_split(inputGroup, settings, 'g_mdsft_textlut', 'Texture LUT') + prop_split(inputGroup, settings, "g_mdsft_textlod", "Texture LOD") + prop_split(inputGroup, settings, "g_mdsft_textdetail", "Texture Detail") + prop_split( + inputGroup, settings, "g_mdsft_textpersp", "Texture Perspective Correction" + ) + prop_split(inputGroup, settings, "g_mdsft_cycletype", "Cycle Type") + + prop_split( + inputGroup, settings, "g_mdsft_pipeline", "Pipeline Span Buffer Coherency" + ) + def ui_lower_mode(settings, dataHolder, layout: bpy.types.UILayout, useDropdown): - inputGroup: bpy.types.UILayout = layout.column() - if useDropdown: - inputGroup.prop(dataHolder, 'menu_lower', - text = 'Other Mode Lower Settings', - icon = 'TRIA_DOWN' if dataHolder.menu_lower else 'TRIA_RIGHT') - if not useDropdown or dataHolder.menu_lower: - prop_split(inputGroup, settings, 'g_mdsft_alpha_compare', 'Alpha Compare') - prop_split(inputGroup, settings, 'g_mdsft_zsrcsel', 'Z Source Selection') - if settings.g_mdsft_zsrcsel == 'G_ZS_PRIM': - prim_box = inputGroup.box() - prop_split(prim_box, settings.prim_depth, 'z', 'Prim Depth: Z') - prop_split(prim_box, settings.prim_depth, 'dz', 'Prim Depth: Delta Z') - if settings.prim_depth.dz != 0 and settings.prim_depth.dz & (settings.prim_depth.dz - 1): - prim_box.label(text='Warning: DZ should ideally be a power of 2 up to 0x4000', icon='TEXTURE_DATA') + inputGroup: bpy.types.UILayout = layout.column() + if useDropdown: + inputGroup.prop( + dataHolder, + "menu_lower", + text="Other Mode Lower Settings", + icon="TRIA_DOWN" if dataHolder.menu_lower else "TRIA_RIGHT", + ) + if not useDropdown or dataHolder.menu_lower: + prop_split(inputGroup, settings, "g_mdsft_alpha_compare", "Alpha Compare") + prop_split(inputGroup, settings, "g_mdsft_zsrcsel", "Z Source Selection") + if settings.g_mdsft_zsrcsel == "G_ZS_PRIM": + prim_box = inputGroup.box() + prop_split(prim_box, settings.prim_depth, "z", "Prim Depth: Z") + prop_split(prim_box, settings.prim_depth, "dz", "Prim Depth: Delta Z") + if settings.prim_depth.dz != 0 and settings.prim_depth.dz & ( + settings.prim_depth.dz - 1 + ): + prim_box.label( + text="Warning: DZ should ideally be a power of 2 up to 0x4000", + icon="TEXTURE_DATA", + ) + def ui_other(settings, dataHolder, layout, useDropdown): - inputGroup = layout.column() - if useDropdown: - inputGroup.prop(dataHolder, 'menu_other', - text = 'Other Settings', - icon = 'TRIA_DOWN' if dataHolder.menu_other else 'TRIA_RIGHT') - if not useDropdown or dataHolder.menu_other: - clipRatioGroup = inputGroup.column() - prop_split(clipRatioGroup, settings, 'clip_ratio', "Clip Ratio") - - if isinstance(dataHolder, bpy.types.Material) or isinstance(dataHolder, F3DMaterialProperty): - blend_color_group = layout.row() - prop_input_name = blend_color_group.column() - prop_input = blend_color_group.column() - prop_input_name.prop(dataHolder, 'set_blend', text = "Blend Color") - prop_input.prop(dataHolder, 'blend_color', text='') - prop_input.enabled = dataHolder.set_blend + inputGroup = layout.column() + if useDropdown: + inputGroup.prop( + dataHolder, + "menu_other", + text="Other Settings", + icon="TRIA_DOWN" if dataHolder.menu_other else "TRIA_RIGHT", + ) + if not useDropdown or dataHolder.menu_other: + clipRatioGroup = inputGroup.column() + prop_split(clipRatioGroup, settings, "clip_ratio", "Clip Ratio") + + if isinstance(dataHolder, bpy.types.Material) or isinstance( + dataHolder, F3DMaterialProperty + ): + blend_color_group = layout.row() + prop_input_name = blend_color_group.column() + prop_input = blend_color_group.column() + prop_input_name.prop(dataHolder, "set_blend", text="Blend Color") + prop_input.prop(dataHolder, "blend_color", text="") + prop_input.enabled = dataHolder.set_blend def tmemUsageUI(layout, textureProp): - tex = textureProp.tex - if tex is not None and tex.size[0] > 0 and tex.size[1] > 0: - tmemUsage = getTmemWordUsage(textureProp.tex_format, tex.size[0], tex.size[1]) * 8 - tmemMax = getTmemMax(textureProp.tex_format) - layout.label(text = 'TMEM Usage: ' + str(tmemUsage) + ' / ' + str(tmemMax) + ' bytes') - if tmemUsage > tmemMax: - tmemSizeWarning = layout.box() - tmemSizeWarning.label(text = 'WARNING: Texture size is too large.') - tmemSizeWarning.label(text = 'Note that width will be internally padded to 64 bit boundaries.') + tex = textureProp.tex + if tex is not None and tex.size[0] > 0 and tex.size[1] > 0: + tmemUsage = ( + getTmemWordUsage(textureProp.tex_format, tex.size[0], tex.size[1]) * 8 + ) + tmemMax = getTmemMax(textureProp.tex_format) + layout.label( + text="TMEM Usage: " + str(tmemUsage) + " / " + str(tmemMax) + " bytes" + ) + if tmemUsage > tmemMax: + tmemSizeWarning = layout.box() + tmemSizeWarning.label(text="WARNING: Texture size is too large.") + tmemSizeWarning.label( + text="Note that width will be internally padded to 64 bit boundaries." + ) + # UI Assumptions: # shading = 1 # lighting = 1 # cycle type = 1 cycle class F3DPanel(bpy.types.Panel): - bl_label = "F3D Material" - bl_idname = "MATERIAL_PT_F3D_Inspector" - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "material" - bl_options = {'HIDE_HEADER'} - - #def hasNecessaryNodes(self, nodes): - # result = True - # for name, nodeType in caseTemplateDict.items(): - # result &= (name in nodes) - # return result - - def ui_image(self, material, layout, textureProp, name, showCheckBox): - nodes = material.node_tree.nodes - inputGroup = layout.box().column() - - inputGroup.prop(textureProp, 'menu', text = name + ' Properties', - icon = 'TRIA_DOWN' if textureProp.menu else 'TRIA_RIGHT') - if textureProp.menu: - tex = textureProp.tex - prop_input_name = inputGroup.column() - prop_input = inputGroup.column() - - if showCheckBox: - prop_input_name.prop(textureProp, 'tex_set', text = "Set Texture") - else: - prop_input_name.label(text = name) - #prop_input.template_image(textureProp, 'tex', - # nodes[name].image_user) - texIndex = name[-1] - - prop_input.prop(textureProp, "use_tex_reference") - if textureProp.use_tex_reference: - prop_split(prop_input, textureProp, "tex_reference", "Texture Reference") - prop_split(prop_input, textureProp, "tex_reference_size", "Texture Size") - if textureProp.tex_format[:2] == 'CI': - prop_split(prop_input, textureProp, "pal_reference", "Palette Reference") - prop_split(prop_input, textureProp, "pal_reference_size", "Palette Size") - - else: - prop_input.template_ID(textureProp, 'tex', new='image.new', open='image.open', - unlink='image.tex' + texIndex + "_unlink") - prop_input.enabled = textureProp.tex_set - - if tex is not None: - prop_input.label(text = "Size: " + str(tex.size[0]) + " x " + str(tex.size[1])) - - if material.mat_ver > 3 and material.f3d_mat.use_large_textures: - prop_input.label(text = "Large texture mode enabled.") - prop_input.label(text = "Each triangle must fit in a single tile load.") - prop_input.label(text = "UVs must be in the [0, 1024] pixel range.") - prop_input.prop(textureProp, "save_large_texture") - if not textureProp.save_large_texture: - prop_input.label(text = "Most large textures will take forever to convert.", icon = 'PREVIEW_RANGE') - else: - tmemUsageUI(prop_input, textureProp) - - prop_split(prop_input, textureProp, 'tex_format', name = 'Format') - if textureProp.tex_format[:2] == 'CI': - prop_split(prop_input, textureProp, 'ci_format', name = 'CI Format') - - if not (material.mat_ver > 3 and material.f3d_mat.use_large_textures): - texFieldSettings = prop_input.column() - clampSettings = texFieldSettings.row() - clampSettings.prop(textureProp.S, "clamp", text = 'Clamp S') - clampSettings.prop(textureProp.T, "clamp", text = 'Clamp T') - - mirrorSettings = texFieldSettings.row() - mirrorSettings.prop(textureProp.S, "mirror", text = 'Mirror S') - mirrorSettings.prop(textureProp.T, "mirror", text = 'Mirror T') - - prop_input.prop(textureProp, 'autoprop', - text = 'Auto Set Other Properties') - - if not textureProp.autoprop: - mask = prop_input.row() - mask.prop(textureProp.S, "mask", text = 'Mask S') - mask.prop(textureProp.T, "mask", text = 'Mask T') - - shift = prop_input.row() - shift.prop(textureProp.S, "shift", text = 'Shift S') - shift.prop(textureProp.T, "shift", text = 'Shift T') - - low = prop_input.row() - low.prop(textureProp.S, "low", text = 'S Low') - low.prop(textureProp.T, "low", text = 'T Low') - - high = prop_input.row() - high.prop(textureProp.S, "high", text = 'S High') - high.prop(textureProp.T, "high", text = 'T High') - - if tex is not None and tex.size[0] > 0 and tex.size[1] > 0 and \ - (math.log(tex.size[0], 2) % 1 > 0.000001 or \ - math.log(tex.size[1], 2) % 1 > 0.000001): - warnBox = layout.box() - warnBox.label( - text = 'Warning: Texture dimensions are not power of 2.') - warnBox.label(text = 'Wrapping only occurs on power of 2 bounds.') - - def ui_prop(self, material, layout, name, setName, setProp, showCheckBox): - nodes = material.node_tree.nodes - inputGroup = layout.row() - prop_input_name = inputGroup.column() - prop_input = inputGroup.column() - if showCheckBox: - prop_input_name.prop(material, setName, text = name) - else: - prop_input_name.label(text = name) - prop_input.prop(nodes[name].outputs[0], 'default_value', text='') - prop_input.enabled = setProp - return inputGroup - - def ui_prop_non_node(self, material, layout, label, name, setName, setProp): - inputGroup = layout.row() - prop_input_name = inputGroup.column() - prop_input = inputGroup.column() - prop_input_name.prop(material, setName, text = name) - prop_input.prop(material, name, text='') - prop_input.enabled = setProp - return inputGroup - - def ui_scale(self, material, layout): - inputGroup = layout.row().split(factor = 0.5) - #prop_input_name = inputGroup.column() - prop_input = inputGroup.column() - prop_input.prop(material, 'scale_autoprop', text='Texture Auto Scale') - prop_input_group = inputGroup.row() - prop_input_group.prop(material, 'tex_scale', text='') - prop_input_group.enabled = not material.scale_autoprop - return inputGroup - - def ui_prim(self, material, layout, setName, setProp, showCheckBox): - if material.mat_ver > 3: - f3dMat = material.f3d_mat - else: - f3dMat = material - nodes = material.node_tree.nodes - inputGroup = layout.row() - prop_input_name = inputGroup.column() - prop_input = inputGroup.column() - if showCheckBox: - prop_input_name.prop(f3dMat, setName, text = 'Primitive Color') - else: - prop_input_name.label(text = 'Primitive Color') - - if material.mat_ver == 4: - prop_input.prop(material.f3d_mat, 'prim_color', text = '') - elif material.mat_ver == 3: - prop_input.prop(nodes['Primitive Color Output'].inputs[0], 'default_value', text='') - else: - prop_input.prop(nodes['Primitive Color'].outputs[0], 'default_value', text='') - - prop_input.prop(f3dMat, 'prim_lod_frac', text='Prim LOD Fraction') - prop_input.prop(f3dMat, 'prim_lod_min', text='Min LOD Ratio') - prop_input.enabled = setProp - return inputGroup - - def ui_env(self, material, layout, showCheckBox): - nodes = material.node_tree.nodes - inputGroup = layout.row() - prop_input_name = inputGroup.column() - prop_input = inputGroup.column() - - if material.mat_ver > 3: - if showCheckBox: - prop_input_name.prop(material.f3d_mat, 'set_env', text = 'Environment Color') - else: - prop_input_name.label(text = "Environment Color") - prop_input.prop(material.f3d_mat, 'env_color', text = '') - setProp = material.f3d_mat.set_env - else: - prop_input_name.prop(material, 'set_env', text = 'Environment Color') - prop_input.prop(nodes['Environment Color Output'].inputs[0], 'default_value', text='') - setProp = material.set_env - prop_input.enabled = setProp - return inputGroup - - def ui_chroma(self, material, layout, name, setName, setProp, showCheckBox): - nodes = material.node_tree.nodes - inputGroup = layout.row() - prop_input_name = inputGroup.column() - prop_input = inputGroup.column() - if showCheckBox: - prop_input_name.prop(material, setName, text = 'Chroma Key') - else: - prop_input_name.label(text = "Chroma Key") - if material.mat_ver == 4: - prop_input.prop(material.f3d_mat, 'key_center', text = 'Center') - else: - prop_input.prop(nodes['Chroma Key Center'].outputs[0], - 'default_value', text='Center') - prop_input.prop(material, 'key_scale', text = 'Scale') - prop_input.prop(material, 'key_width', text = 'Width') - if material.key_width[0] > 1 or material.key_width[1] > 1 or \ - material.key_width[2] > 1: - layout.box().label(text = \ - "NOTE: Keying is disabled for channels with width > 1.") - prop_input.enabled = setProp - return inputGroup - - def ui_lights(self, material, layout, name, showCheckBox): - inputGroup = layout.row() - prop_input_name = inputGroup.column() - prop_input = inputGroup.column() - if showCheckBox: - prop_input_name.prop(material, 'set_lights', text = name) - else: - prop_input_name.label(text = name) - prop_input_name.enabled = material.rdp_settings.g_lighting and \ - material.rdp_settings.g_shade - lightSettings = prop_input.column() - if material.rdp_settings.g_lighting: - if material.use_default_lighting: - lightSettings.prop(material, 'default_light_color', text = '') - else: - lightSettings.prop(material, 'ambient_light_color', text = 'Ambient Color') - - lightSettings.prop_search(material, 'f3d_light1', - bpy.data, 'lights', text = '') - if material.f3d_light1 is not None: - lightSettings.prop_search(material, 'f3d_light2', - bpy.data, 'lights', text = '') - if material.f3d_light2 is not None: - lightSettings.prop_search(material, 'f3d_light3', - bpy.data, 'lights', text = '') - if material.f3d_light3 is not None: - lightSettings.prop_search(material, 'f3d_light4', - bpy.data, 'lights', text = '') - if material.f3d_light4 is not None: - lightSettings.prop_search(material, 'f3d_light5', - bpy.data, 'lights', text = '') - if material.f3d_light5 is not None: - lightSettings.prop_search(material, 'f3d_light6', - bpy.data, 'lights', text = '') - if material.f3d_light6 is not None: - lightSettings.prop_search(material, 'f3d_light7', - bpy.data, 'lights', text = '') - prop_input.prop(material, 'use_default_lighting', text = 'Use Custom Lighting', invert_checkbox = True) - #layout.box().label(text = "Note: Lighting preview is not 100% accurate.") - #layout.box().label(text = "For vertex colors, clear 'Lighting'.") - prop_input.enabled = material.set_lights and \ - material.rdp_settings.g_lighting and \ - material.rdp_settings.g_shade - - return inputGroup - - def ui_convert(self, material, layout, showCheckBox): - inputGroup = layout.row() - prop_input_name = inputGroup.column() - prop_input = inputGroup.column() - if showCheckBox: - prop_input_name.prop(material, 'set_k0_5', text = 'YUV Convert') - else: - prop_input_name.label(text = 'YUV Convert') - - prop_k0 = prop_input.row() - prop_k0.prop(material, 'k0', text='K0') - prop_k0.label(text = str(int(material.k0 * 255))) - - prop_k1 = prop_input.row() - prop_k1.prop(material, 'k1', text='K1') - prop_k1.label(text = str(int(material.k1 * 255))) - - prop_k2 = prop_input.row() - prop_k2.prop(material, 'k2', text='K2') - prop_k2.label(text = str(int(material.k2 * 255))) - - prop_k3 = prop_input.row() - prop_k3.prop(material, 'k3', text='K3') - prop_k3.label(text = str(int(material.k3 * 255))) - - prop_k4 = prop_input.row() - prop_k4.prop(material, 'k4', text='K4') - prop_k4.label(text = str(int(material.k4 * 255))) - - prop_k5 = prop_input.row() - prop_k5.prop(material, 'k5', text='K5') - prop_k5.label(text = str(int(material.k5 * 255))) - - prop_input.enabled = material.set_k0_5 - return inputGroup - - def ui_lower_render_mode(self, material, layout, useDropdown): - # cycle independent - inputGroup = layout.column() - if useDropdown: - inputGroup.prop(material, 'menu_lower_render', - text = 'Render Settings', - icon = 'TRIA_DOWN' if material.menu_lower_render else 'TRIA_RIGHT') - if not useDropdown or material.menu_lower_render: - inputGroup.prop(material.rdp_settings, 'set_rendermode', - text ='Set Render Mode?') - - renderGroup = inputGroup.column() - renderGroup.prop(material.rdp_settings, 'rendermode_advanced_enabled', - text = 'Show Advanced Settings') - if not material.rdp_settings.rendermode_advanced_enabled: - prop_split(renderGroup, material.rdp_settings, - 'rendermode_preset_cycle_1', "Render Mode") - if material.rdp_settings.g_mdsft_cycletype == 'G_CYC_2CYCLE': - prop_split(renderGroup, material.rdp_settings, - 'rendermode_preset_cycle_2', "Render Mode Cycle 2") - else: - prop_split(renderGroup, material.rdp_settings, 'aa_en', 'Antialiasing') - prop_split(renderGroup, material.rdp_settings, 'z_cmp', 'Z Testing') - prop_split(renderGroup, material.rdp_settings, 'z_upd', 'Z Writing') - prop_split(renderGroup, material.rdp_settings, 'im_rd', 'IM_RD (?)') - prop_split(renderGroup, material.rdp_settings, 'clr_on_cvg', - 'Color On Coverage') - prop_split(renderGroup, material.rdp_settings, 'cvg_dst', - 'Coverage Destination') - prop_split(renderGroup, material.rdp_settings, 'zmode', 'Z Mode') - prop_split(renderGroup, material.rdp_settings, 'cvg_x_alpha', - 'Multiply Coverage And Alpha') - prop_split(renderGroup, material.rdp_settings, 'alpha_cvg_sel', - 'Use Coverage For Alpha') - prop_split(renderGroup, material.rdp_settings, 'force_bl', 'Force Blending') - - # cycle dependent - (P * A + M - B) / (A + B) - combinerBox = renderGroup.box() - combinerBox.label(text='Blender (Color = (P * A + M * B) / (A + B)') - combinerCol = combinerBox.row() - rowColor = combinerCol.column() - rowAlpha = combinerCol.column() - rowColor.prop(material.rdp_settings, 'blend_p1', text = 'P') - rowColor.prop(material.rdp_settings, 'blend_m1', text = 'M') - rowAlpha.prop(material.rdp_settings, 'blend_a1', text = 'A') - rowAlpha.prop(material.rdp_settings, 'blend_b1', text = 'B') - - if material.rdp_settings.g_mdsft_cycletype == 'G_CYC_2CYCLE': - combinerBox2 = renderGroup.box() - combinerBox2.label(text='Blender Cycle 2') - combinerCol2 = combinerBox2.row() - rowColor2 = combinerCol2.column() - rowAlpha2 = combinerCol2.column() - rowColor2.prop(material.rdp_settings, 'blend_p2', text = 'P') - rowColor2.prop(material.rdp_settings, 'blend_m2', text = 'M') - rowAlpha2.prop(material.rdp_settings, 'blend_a2', text = 'A') - rowAlpha2.prop(material.rdp_settings, 'blend_b2', text = 'B') - - renderGroup.enabled = material.rdp_settings.set_rendermode - - def ui_uvCheck(self, layout, context): - if hasattr(context, 'object') and context.object is not None and \ - isinstance(context.object.data, bpy.types.Mesh): - uv_layers = context.object.data.uv_layers - if uv_layers.active is None or uv_layers.active.name != 'UVMap': - uvErrorBox = layout.box() - uvErrorBox.label(text = 'Warning: This mesh\'s active UV layer is not named \"UVMap\".') - uvErrorBox.label(text = 'This will cause incorrect UVs to display.') - - def ui_draw_layer(self, material, layout, context): - if material.mat_ver > 3: - if context.scene.gameEditorMode == 'SM64': - prop_split(layout, material.f3d_mat.draw_layer, "sm64", "Draw Layer") - elif context.scene.gameEditorMode == 'OOT': - prop_split(layout, material.f3d_mat.draw_layer, "oot", "Draw Layer") - - def ui_fog(self, f3dMat, inputCol, showCheckBox): - if f3dMat.rdp_settings.g_fog: - inputGroup = inputCol.column() - if showCheckBox: - inputGroup.prop(f3dMat, 'set_fog', text = 'Set Fog') - if f3dMat.set_fog: - inputGroup.prop(f3dMat, 'use_global_fog', text = 'Use Global Fog (SM64)') - if f3dMat.use_global_fog: - inputGroup.label(text = 'Only applies to levels (area fog settings).', icon = 'INFO') - else: - fogColorGroup = inputGroup.row().split(factor = 0.5) - fogColorGroup.label(text = 'Fog Color') - fogColorGroup.prop(f3dMat, 'fog_color', text = '') - fogPositionGroup = inputGroup.row().split(factor = 0.5) - fogPositionGroup.label(text = 'Fog Range') - fogPositionGroup.prop(f3dMat, 'fog_position', text = '') - - - #inputGroup = inputCol.column() - #inputGroup.prop(f3dMat, 'set_fog', text = 'Set Fog') - #fogInputGroup = inputGroup.column() - #globalFogBox = fogInputGroup.box() - #globalFogBox.prop(f3dMat, 'use_global_fog', text = 'Use Global Fog') - #globalFogInfoBox = globalFogBox.box() - #globalFogInfoBox.label(text = 'Only applies to levels (area fog settings).') - #globalFogInfoBox.label(text = 'Disable this for non-level geolayout/dl exporting.') - #fogGroup = fogInputGroup.column() - #fogColorGroup = fogGroup.row().split(factor = 0.5) - #fogColorGroup.label(text = 'Fog Color') - #fogColorGroup.prop(f3dMat, 'fog_color', text = '') - #fogPositionGroup = fogGroup.row().split(factor = 0.5) - #fogPositionGroup.label(text = 'Fog Range') - #fogPositionGroup.prop(f3dMat, 'fog_position', text = '') - #fogInputGroup.enabled = f3dMat.set_fog - #fogGroup.enabled = not f3dMat.use_global_fog - #inputGroup.box().label(text = 'NOTE: Fog will break with draw layer overrides.') - - def drawVertexColorNotice(self, layout): - noticeBox = layout.box().column() - noticeBox.label( - text = 'There must be two vertex color layers.', icon = 'LINENUMBERS_ON') - noticeBox.label( - text = 'They should be called "Col" and "Alpha".') - - def drawShadeAlphaNotice(self, layout): - layout.box().column().label(text = "There must be a vertex color layer called \"Alpha\".", icon = 'IMAGE_ALPHA') - - def drawCIMultitextureNotice(self, layout): - layout.label(text = 'CI textures will break with multitexturing.', icon = 'LIBRARY_DATA_BROKEN') - - def draw_simple(self, f3dMat, material, layout, context): - self.ui_uvCheck(layout, context) - - inputCol = layout.column() - useDict = all_combiner_uses(f3dMat) - - if not f3dMat.rdp_settings.g_lighting: - self.drawVertexColorNotice(layout) - elif useDict["Shade Alpha"]: - self.drawShadeAlphaNotice(layout) - - useMultitexture = useDict['Texture 0'] and useDict['Texture 1'] and f3dMat.tex0.tex_set and f3dMat.tex1.tex_set - - if useMultitexture and f3dMat.tex0.tex_format[:2] == "CI" or f3dMat.tex1.tex_format[:2] == "CI": - self.drawCIMultitextureNotice(inputCol) - - if useDict['Texture 0'] and f3dMat.tex0.tex_set: - self.ui_image(material, inputCol, f3dMat.tex0, 'Texture 0', False) - - if useDict['Texture 1'] and f3dMat.tex1.tex_set: - self.ui_image(material, inputCol, f3dMat.tex1, 'Texture 1', False) - - if useMultitexture: - inputCol.prop(f3dMat, 'uv_basis', text = 'UV Basis') - - if useDict['Texture']: - if material.mat_ver > 3: - inputCol.prop(f3dMat, 'use_large_textures') - self.ui_scale(f3dMat, inputCol) - - if useDict['Primitive'] and f3dMat.set_prim: - self.ui_prim(material, inputCol, 'set_prim', f3dMat.set_prim, False) - - if useDict['Environment'] and f3dMat.set_env: - if material.mat_ver >= 3: - self.ui_env(material, inputCol, False) - else: - self.ui_prop(material, inputCol, 'Environment Color', 'set_env', material.set_env, False) - - showLightProperty = f3dMat.set_lights and \ - f3dMat.rdp_settings.g_lighting and \ - f3dMat.rdp_settings.g_shade - if useDict['Shade'] and showLightProperty: - self.ui_lights(f3dMat, inputCol, 'Shade Color', False) - - if useDict['Key'] and f3dMat.set_key: - self.ui_chroma(material, inputCol, 'Chroma Key Center', - 'set_key', f3dMat.set_key, False) - - if useDict['Convert'] and f3dMat.set_k0_5: - self.ui_convert(f3dMat, inputCol, False) - - if f3dMat.set_fog: - self.ui_fog(f3dMat, inputCol, False) - - def draw_full(self, f3dMat, material, layout, context): - - layout.row().prop(material, "menu_tab", expand = True) - menuTab = material.menu_tab - useDict = all_combiner_uses(f3dMat) - - if menuTab == "Combiner": - if material.mat_ver > 3: - self.ui_draw_layer(material, layout, context) - - if not f3dMat.rdp_settings.g_lighting: - self.drawVertexColorNotice(layout) - elif useDict["Shade Alpha"]: - self.drawShadeAlphaNotice(layout) - - combinerBox = layout.box() - combinerBox.prop(f3dMat, 'set_combiner', - text = 'Color Combiner (Color = (A - B) * C + D)') - combinerCol = combinerBox.row() - combinerCol.enabled = f3dMat.set_combiner - rowColor = combinerCol.column() - rowAlpha = combinerCol.column() - - rowColor.prop(f3dMat.combiner1, 'A') - rowColor.prop(f3dMat.combiner1, 'B') - rowColor.prop(f3dMat.combiner1, 'C') - rowColor.prop(f3dMat.combiner1, 'D') - rowAlpha.prop(f3dMat.combiner1, 'A_alpha') - rowAlpha.prop(f3dMat.combiner1, 'B_alpha') - rowAlpha.prop(f3dMat.combiner1, 'C_alpha') - rowAlpha.prop(f3dMat.combiner1, 'D_alpha') - - if f3dMat.rdp_settings.g_mdsft_cycletype == 'G_CYC_2CYCLE': - combinerBox2 = layout.box() - combinerBox2.label(text = 'Color Combiner Cycle 2') - combinerBox2.enabled = f3dMat.set_combiner - combinerCol2 = combinerBox2.row() - rowColor2 = combinerCol2.column() - rowAlpha2 = combinerCol2.column() - - rowColor2.prop(f3dMat.combiner2, 'A') - rowColor2.prop(f3dMat.combiner2, 'B') - rowColor2.prop(f3dMat.combiner2, 'C') - rowColor2.prop(f3dMat.combiner2, 'D') - rowAlpha2.prop(f3dMat.combiner2, 'A_alpha') - rowAlpha2.prop(f3dMat.combiner2, 'B_alpha') - rowAlpha2.prop(f3dMat.combiner2, 'C_alpha') - rowAlpha2.prop(f3dMat.combiner2, 'D_alpha') - - layout.box().label( - text = 'Note: In cycle 2, texture 0 and texture 1 are flipped.') - - #layout.box().label( - # text = 'Note: Alpha preview is not 100% accurate.') - - if menuTab == "Sources": - self.ui_uvCheck(layout, context) - - inputCol = layout.column() - - useMultitexture = useDict['Texture 0'] and useDict['Texture 1'] - - if useMultitexture and f3dMat.tex0.tex_format[:2] == "CI" or f3dMat.tex1.tex_format[:2] == "CI": - self.drawCIMultitextureNotice(inputCol) - - if useDict['Texture 0']: - self.ui_image(material, inputCol, f3dMat.tex0, 'Texture 0', True) - - if useDict['Texture 1']: - self.ui_image(material, inputCol, f3dMat.tex1, 'Texture 1', True) - - if useMultitexture: - inputCol.prop(f3dMat, 'uv_basis', text = 'UV Basis') - - if useDict['Texture']: - if material.mat_ver > 3: - inputCol.prop(f3dMat, 'use_large_textures') - self.ui_scale(f3dMat, inputCol) - - if useDict['Primitive']: - self.ui_prim(material, inputCol, 'set_prim', f3dMat.set_prim, True) - - if useDict['Environment']: - if material.mat_ver >= 3: - self.ui_env(material, inputCol, True) - else: - self.ui_prop(material, inputCol, 'Environment Color', 'set_env', material.set_env, True) - - if useDict['Shade']: - self.ui_lights(f3dMat, inputCol, 'Shade Color', True) - - if useDict['Key']: - self.ui_chroma(material, inputCol, 'Chroma Key Center', - 'set_key', f3dMat.set_key, True) - - if useDict['Convert']: - self.ui_convert(f3dMat, inputCol, True) - - self.ui_fog(f3dMat, inputCol, True) - - if menuTab == "Geo": - ui_geo_mode(f3dMat.rdp_settings, f3dMat, layout, False) - if menuTab == "Upper": - ui_upper_mode(f3dMat.rdp_settings, f3dMat, layout, False) - if menuTab == "Lower": - ui_lower_mode(f3dMat.rdp_settings, f3dMat, layout, False) - #layout.box().label(text = \ - # 'WARNING: Render mode settings not reset after drawing.') - self.ui_lower_render_mode(f3dMat, layout, False) - ui_other(f3dMat.rdp_settings, f3dMat, layout, False) - - # texture convert/LUT controlled by texture settings - # add node support for geo mode settings - def draw(self, context): - layout = self.layout - - layout.operator(CreateFast3DMaterial.bl_idname) - material = context.material - if material is None: - return - elif not(material.use_nodes and material.is_f3d): - layout.label(text="This is not a Fast3D material.") - return - - if material.mat_ver > 3: - f3dMat = material.f3d_mat - else: - f3dMat = material - #layout.box().label(text = 'Note: Do not copy paste materials.') - layout.prop(context.scene, 'f3d_simple', text = "Show Simplified UI") - layout = layout.box() - titleCol = layout.column() - titleCol.box().label(text = "F3D Material Inspector") - - if material.mat_ver > 3: - presetCol = layout.column() - split = presetCol.split(factor = 0.33) - split.label(text = 'Preset') - row = split.row(align=True) - row.menu(MATERIAL_MT_f3d_presets.__name__, text=f3dMat.presetName) - row.operator(AddPresetF3D.bl_idname, text="", icon='ZOOM_IN') - row.operator(AddPresetF3D.bl_idname, text="", icon='ZOOM_OUT').remove_active = True - else: - prop_split(layout, material, 'f3d_preset', 'Preset Material') - - if context.scene.f3d_simple and \ - ((material.mat_ver > 3 and f3dMat.presetName != "Custom") or \ - (material.mat_ver <= 3 and f3dMat.f3d_preset != "Custom")): - self.draw_simple(f3dMat, material, layout, context) - else: - if material.mat_ver > 3: - presetCol.prop(context.scene, 'f3dUserPresetsOnly') - self.draw_full(f3dMat, material, layout, context) - -#def ui_procAnimVec(self, procAnimVec, layout, name, vecType): -# layout.prop(procAnimVec, 'menu', text = name, -# icon = 'TRIA_DOWN' if procAnimVec.menu else 'TRIA_RIGHT') -# if procAnimVec.menu: -# box = layout.box() -# self.ui_procAnimField(procAnimVec.x, box, vecType[0]) -# self.ui_procAnimField(procAnimVec.y, box, vecType[1]) -# if len(vecType) > 2: -# self.ui_procAnimField(procAnimVec.z, box, vecType[2]) + bl_label = "F3D Material" + bl_idname = "MATERIAL_PT_F3D_Inspector" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "material" + bl_options = {"HIDE_HEADER"} + + # def hasNecessaryNodes(self, nodes): + # result = True + # for name, nodeType in caseTemplateDict.items(): + # result &= (name in nodes) + # return result + + def ui_image(self, material, layout, textureProp, name, showCheckBox): + nodes = material.node_tree.nodes + inputGroup = layout.box().column() + + inputGroup.prop( + textureProp, + "menu", + text=name + " Properties", + icon="TRIA_DOWN" if textureProp.menu else "TRIA_RIGHT", + ) + if textureProp.menu: + tex = textureProp.tex + prop_input_name = inputGroup.column() + prop_input = inputGroup.column() + + if showCheckBox: + prop_input_name.prop(textureProp, "tex_set", text="Set Texture") + else: + prop_input_name.label(text=name) + # prop_input.template_image(textureProp, 'tex', + # nodes[name].image_user) + texIndex = name[-1] + + prop_input.prop(textureProp, "use_tex_reference") + if textureProp.use_tex_reference: + prop_split( + prop_input, textureProp, "tex_reference", "Texture Reference" + ) + prop_split( + prop_input, textureProp, "tex_reference_size", "Texture Size" + ) + if textureProp.tex_format[:2] == "CI": + prop_split( + prop_input, textureProp, "pal_reference", "Palette Reference" + ) + prop_split( + prop_input, textureProp, "pal_reference_size", "Palette Size" + ) + + else: + prop_input.template_ID( + textureProp, + "tex", + new="image.new", + open="image.open", + unlink="image.tex" + texIndex + "_unlink", + ) + prop_input.enabled = textureProp.tex_set + + if tex is not None: + prop_input.label( + text="Size: " + str(tex.size[0]) + " x " + str(tex.size[1]) + ) + + if material.mat_ver > 3 and material.f3d_mat.use_large_textures: + prop_input.label(text="Large texture mode enabled.") + prop_input.label(text="Each triangle must fit in a single tile load.") + prop_input.label(text="UVs must be in the [0, 1024] pixel range.") + prop_input.prop(textureProp, "save_large_texture") + if not textureProp.save_large_texture: + prop_input.label( + text="Most large textures will take forever to convert.", + icon="PREVIEW_RANGE", + ) + else: + tmemUsageUI(prop_input, textureProp) + + prop_split(prop_input, textureProp, "tex_format", name="Format") + if textureProp.tex_format[:2] == "CI": + prop_split(prop_input, textureProp, "ci_format", name="CI Format") + + if not (material.mat_ver > 3 and material.f3d_mat.use_large_textures): + texFieldSettings = prop_input.column() + clampSettings = texFieldSettings.row() + clampSettings.prop(textureProp.S, "clamp", text="Clamp S") + clampSettings.prop(textureProp.T, "clamp", text="Clamp T") + + mirrorSettings = texFieldSettings.row() + mirrorSettings.prop(textureProp.S, "mirror", text="Mirror S") + mirrorSettings.prop(textureProp.T, "mirror", text="Mirror T") + + prop_input.prop( + textureProp, "autoprop", text="Auto Set Other Properties" + ) + + if not textureProp.autoprop: + mask = prop_input.row() + mask.prop(textureProp.S, "mask", text="Mask S") + mask.prop(textureProp.T, "mask", text="Mask T") + + shift = prop_input.row() + shift.prop(textureProp.S, "shift", text="Shift S") + shift.prop(textureProp.T, "shift", text="Shift T") + + low = prop_input.row() + low.prop(textureProp.S, "low", text="S Low") + low.prop(textureProp.T, "low", text="T Low") + + high = prop_input.row() + high.prop(textureProp.S, "high", text="S High") + high.prop(textureProp.T, "high", text="T High") + + if ( + tex is not None + and tex.size[0] > 0 + and tex.size[1] > 0 + and ( + math.log(tex.size[0], 2) % 1 > 0.000001 + or math.log(tex.size[1], 2) % 1 > 0.000001 + ) + ): + warnBox = layout.box() + warnBox.label( + text="Warning: Texture dimensions are not power of 2." + ) + warnBox.label(text="Wrapping only occurs on power of 2 bounds.") + + def ui_prop(self, material, layout, name, setName, setProp, showCheckBox): + nodes = material.node_tree.nodes + inputGroup = layout.row() + prop_input_name = inputGroup.column() + prop_input = inputGroup.column() + if showCheckBox: + prop_input_name.prop(material, setName, text=name) + else: + prop_input_name.label(text=name) + prop_input.prop(nodes[name].outputs[0], "default_value", text="") + prop_input.enabled = setProp + return inputGroup + + def ui_prop_non_node(self, material, layout, label, name, setName, setProp): + inputGroup = layout.row() + prop_input_name = inputGroup.column() + prop_input = inputGroup.column() + prop_input_name.prop(material, setName, text=name) + prop_input.prop(material, name, text="") + prop_input.enabled = setProp + return inputGroup + + def ui_scale(self, material, layout): + inputGroup = layout.row().split(factor=0.5) + # prop_input_name = inputGroup.column() + prop_input = inputGroup.column() + prop_input.prop(material, "scale_autoprop", text="Texture Auto Scale") + prop_input_group = inputGroup.row() + prop_input_group.prop(material, "tex_scale", text="") + prop_input_group.enabled = not material.scale_autoprop + return inputGroup + + def ui_prim(self, material, layout, setName, setProp, showCheckBox): + if material.mat_ver > 3: + f3dMat = material.f3d_mat + else: + f3dMat = material + nodes = material.node_tree.nodes + inputGroup = layout.row() + prop_input_name = inputGroup.column() + prop_input = inputGroup.column() + if showCheckBox: + prop_input_name.prop(f3dMat, setName, text="Primitive Color") + else: + prop_input_name.label(text="Primitive Color") + + if material.mat_ver == 4: + prop_input.prop(material.f3d_mat, "prim_color", text="") + elif material.mat_ver == 3: + prop_input.prop( + nodes["Primitive Color Output"].inputs[0], "default_value", text="" + ) + else: + prop_input.prop( + nodes["Primitive Color"].outputs[0], "default_value", text="" + ) + + prop_input.prop(f3dMat, "prim_lod_frac", text="Prim LOD Fraction") + prop_input.prop(f3dMat, "prim_lod_min", text="Min LOD Ratio") + prop_input.enabled = setProp + return inputGroup + + def ui_env(self, material, layout, showCheckBox): + nodes = material.node_tree.nodes + inputGroup = layout.row() + prop_input_name = inputGroup.column() + prop_input = inputGroup.column() + + if material.mat_ver > 3: + if showCheckBox: + prop_input_name.prop( + material.f3d_mat, "set_env", text="Environment Color" + ) + else: + prop_input_name.label(text="Environment Color") + prop_input.prop(material.f3d_mat, "env_color", text="") + setProp = material.f3d_mat.set_env + else: + prop_input_name.prop(material, "set_env", text="Environment Color") + prop_input.prop( + nodes["Environment Color Output"].inputs[0], "default_value", text="" + ) + setProp = material.set_env + prop_input.enabled = setProp + return inputGroup + + def ui_chroma(self, material, layout, name, setName, setProp, showCheckBox): + nodes = material.node_tree.nodes + inputGroup = layout.row() + prop_input_name = inputGroup.column() + prop_input = inputGroup.column() + if showCheckBox: + prop_input_name.prop(material, setName, text="Chroma Key") + else: + prop_input_name.label(text="Chroma Key") + if material.mat_ver == 4: + prop_input.prop(material.f3d_mat, "key_center", text="Center") + else: + prop_input.prop( + nodes["Chroma Key Center"].outputs[0], "default_value", text="Center" + ) + prop_input.prop(material, "key_scale", text="Scale") + prop_input.prop(material, "key_width", text="Width") + if ( + material.key_width[0] > 1 + or material.key_width[1] > 1 + or material.key_width[2] > 1 + ): + layout.box().label( + text="NOTE: Keying is disabled for channels with width > 1." + ) + prop_input.enabled = setProp + return inputGroup + + def ui_lights(self, material, layout, name, showCheckBox): + inputGroup = layout.row() + prop_input_name = inputGroup.column() + prop_input = inputGroup.column() + if showCheckBox: + prop_input_name.prop(material, "set_lights", text=name) + else: + prop_input_name.label(text=name) + prop_input_name.enabled = ( + material.rdp_settings.g_lighting and material.rdp_settings.g_shade + ) + lightSettings = prop_input.column() + if material.rdp_settings.g_lighting: + if material.use_default_lighting: + lightSettings.prop(material, "default_light_color", text="") + else: + lightSettings.prop( + material, "ambient_light_color", text="Ambient Color" + ) + + lightSettings.prop_search( + material, "f3d_light1", bpy.data, "lights", text="" + ) + if material.f3d_light1 is not None: + lightSettings.prop_search( + material, "f3d_light2", bpy.data, "lights", text="" + ) + if material.f3d_light2 is not None: + lightSettings.prop_search( + material, "f3d_light3", bpy.data, "lights", text="" + ) + if material.f3d_light3 is not None: + lightSettings.prop_search( + material, "f3d_light4", bpy.data, "lights", text="" + ) + if material.f3d_light4 is not None: + lightSettings.prop_search( + material, "f3d_light5", bpy.data, "lights", text="" + ) + if material.f3d_light5 is not None: + lightSettings.prop_search( + material, "f3d_light6", bpy.data, "lights", text="" + ) + if material.f3d_light6 is not None: + lightSettings.prop_search( + material, "f3d_light7", bpy.data, "lights", text="" + ) + prop_input.prop( + material, + "use_default_lighting", + text="Use Custom Lighting", + invert_checkbox=True, + ) + # layout.box().label(text = "Note: Lighting preview is not 100% accurate.") + # layout.box().label(text = "For vertex colors, clear 'Lighting'.") + prop_input.enabled = ( + material.set_lights + and material.rdp_settings.g_lighting + and material.rdp_settings.g_shade + ) + + return inputGroup + + def ui_convert(self, material, layout, showCheckBox): + inputGroup = layout.row() + prop_input_name = inputGroup.column() + prop_input = inputGroup.column() + if showCheckBox: + prop_input_name.prop(material, "set_k0_5", text="YUV Convert") + else: + prop_input_name.label(text="YUV Convert") + + prop_k0 = prop_input.row() + prop_k0.prop(material, "k0", text="K0") + prop_k0.label(text=str(int(material.k0 * 255))) + + prop_k1 = prop_input.row() + prop_k1.prop(material, "k1", text="K1") + prop_k1.label(text=str(int(material.k1 * 255))) + + prop_k2 = prop_input.row() + prop_k2.prop(material, "k2", text="K2") + prop_k2.label(text=str(int(material.k2 * 255))) + + prop_k3 = prop_input.row() + prop_k3.prop(material, "k3", text="K3") + prop_k3.label(text=str(int(material.k3 * 255))) + + prop_k4 = prop_input.row() + prop_k4.prop(material, "k4", text="K4") + prop_k4.label(text=str(int(material.k4 * 255))) + + prop_k5 = prop_input.row() + prop_k5.prop(material, "k5", text="K5") + prop_k5.label(text=str(int(material.k5 * 255))) + + prop_input.enabled = material.set_k0_5 + return inputGroup + + def ui_lower_render_mode(self, material, layout, useDropdown): + # cycle independent + inputGroup = layout.column() + if useDropdown: + inputGroup.prop( + material, + "menu_lower_render", + text="Render Settings", + icon="TRIA_DOWN" if material.menu_lower_render else "TRIA_RIGHT", + ) + if not useDropdown or material.menu_lower_render: + inputGroup.prop( + material.rdp_settings, "set_rendermode", text="Set Render Mode?" + ) + + renderGroup = inputGroup.column() + renderGroup.prop( + material.rdp_settings, + "rendermode_advanced_enabled", + text="Show Advanced Settings", + ) + if not material.rdp_settings.rendermode_advanced_enabled: + prop_split( + renderGroup, + material.rdp_settings, + "rendermode_preset_cycle_1", + "Render Mode", + ) + if material.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE": + prop_split( + renderGroup, + material.rdp_settings, + "rendermode_preset_cycle_2", + "Render Mode Cycle 2", + ) + else: + prop_split(renderGroup, material.rdp_settings, "aa_en", "Antialiasing") + prop_split(renderGroup, material.rdp_settings, "z_cmp", "Z Testing") + prop_split(renderGroup, material.rdp_settings, "z_upd", "Z Writing") + prop_split(renderGroup, material.rdp_settings, "im_rd", "IM_RD (?)") + prop_split( + renderGroup, + material.rdp_settings, + "clr_on_cvg", + "Color On Coverage", + ) + prop_split( + renderGroup, + material.rdp_settings, + "cvg_dst", + "Coverage Destination", + ) + prop_split(renderGroup, material.rdp_settings, "zmode", "Z Mode") + prop_split( + renderGroup, + material.rdp_settings, + "cvg_x_alpha", + "Multiply Coverage And Alpha", + ) + prop_split( + renderGroup, + material.rdp_settings, + "alpha_cvg_sel", + "Use Coverage For Alpha", + ) + prop_split( + renderGroup, material.rdp_settings, "force_bl", "Force Blending" + ) + + # cycle dependent - (P * A + M - B) / (A + B) + combinerBox = renderGroup.box() + combinerBox.label(text="Blender (Color = (P * A + M * B) / (A + B)") + combinerCol = combinerBox.row() + rowColor = combinerCol.column() + rowAlpha = combinerCol.column() + rowColor.prop(material.rdp_settings, "blend_p1", text="P") + rowColor.prop(material.rdp_settings, "blend_m1", text="M") + rowAlpha.prop(material.rdp_settings, "blend_a1", text="A") + rowAlpha.prop(material.rdp_settings, "blend_b1", text="B") + + if material.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE": + combinerBox2 = renderGroup.box() + combinerBox2.label(text="Blender Cycle 2") + combinerCol2 = combinerBox2.row() + rowColor2 = combinerCol2.column() + rowAlpha2 = combinerCol2.column() + rowColor2.prop(material.rdp_settings, "blend_p2", text="P") + rowColor2.prop(material.rdp_settings, "blend_m2", text="M") + rowAlpha2.prop(material.rdp_settings, "blend_a2", text="A") + rowAlpha2.prop(material.rdp_settings, "blend_b2", text="B") + + renderGroup.enabled = material.rdp_settings.set_rendermode + + def ui_uvCheck(self, layout, context): + if ( + hasattr(context, "object") + and context.object is not None + and isinstance(context.object.data, bpy.types.Mesh) + ): + uv_layers = context.object.data.uv_layers + if uv_layers.active is None or uv_layers.active.name != "UVMap": + uvErrorBox = layout.box() + uvErrorBox.label( + text='Warning: This mesh\'s active UV layer is not named "UVMap".' + ) + uvErrorBox.label(text="This will cause incorrect UVs to display.") + + def ui_draw_layer(self, material, layout, context): + if material.mat_ver > 3: + if context.scene.gameEditorMode == "SM64": + prop_split(layout, material.f3d_mat.draw_layer, "sm64", "Draw Layer") + elif context.scene.gameEditorMode == "OOT": + prop_split(layout, material.f3d_mat.draw_layer, "oot", "Draw Layer") + + def ui_fog(self, f3dMat, inputCol, showCheckBox): + if f3dMat.rdp_settings.g_fog: + inputGroup = inputCol.column() + if showCheckBox: + inputGroup.prop(f3dMat, "set_fog", text="Set Fog") + if f3dMat.set_fog: + inputGroup.prop(f3dMat, "use_global_fog", text="Use Global Fog (SM64)") + if f3dMat.use_global_fog: + inputGroup.label( + text="Only applies to levels (area fog settings).", icon="INFO" + ) + else: + fogColorGroup = inputGroup.row().split(factor=0.5) + fogColorGroup.label(text="Fog Color") + fogColorGroup.prop(f3dMat, "fog_color", text="") + fogPositionGroup = inputGroup.row().split(factor=0.5) + fogPositionGroup.label(text="Fog Range") + fogPositionGroup.prop(f3dMat, "fog_position", text="") + + # inputGroup = inputCol.column() + # inputGroup.prop(f3dMat, 'set_fog', text = 'Set Fog') + # fogInputGroup = inputGroup.column() + # globalFogBox = fogInputGroup.box() + # globalFogBox.prop(f3dMat, 'use_global_fog', text = 'Use Global Fog') + # globalFogInfoBox = globalFogBox.box() + # globalFogInfoBox.label(text = 'Only applies to levels (area fog settings).') + # globalFogInfoBox.label(text = 'Disable this for non-level geolayout/dl exporting.') + # fogGroup = fogInputGroup.column() + # fogColorGroup = fogGroup.row().split(factor = 0.5) + # fogColorGroup.label(text = 'Fog Color') + # fogColorGroup.prop(f3dMat, 'fog_color', text = '') + # fogPositionGroup = fogGroup.row().split(factor = 0.5) + # fogPositionGroup.label(text = 'Fog Range') + # fogPositionGroup.prop(f3dMat, 'fog_position', text = '') + # fogInputGroup.enabled = f3dMat.set_fog + # fogGroup.enabled = not f3dMat.use_global_fog + # inputGroup.box().label(text = 'NOTE: Fog will break with draw layer overrides.') + + def drawVertexColorNotice(self, layout): + noticeBox = layout.box().column() + noticeBox.label( + text="There must be two vertex color layers.", icon="LINENUMBERS_ON" + ) + noticeBox.label(text='They should be called "Col" and "Alpha".') + + def drawShadeAlphaNotice(self, layout): + layout.box().column().label( + text='There must be a vertex color layer called "Alpha".', + icon="IMAGE_ALPHA", + ) + + def drawCIMultitextureNotice(self, layout): + layout.label( + text="CI textures will break with multitexturing.", + icon="LIBRARY_DATA_BROKEN", + ) + + def draw_simple(self, f3dMat, material, layout, context): + self.ui_uvCheck(layout, context) + + inputCol = layout.column() + useDict = all_combiner_uses(f3dMat) + + if not f3dMat.rdp_settings.g_lighting: + self.drawVertexColorNotice(layout) + elif useDict["Shade Alpha"]: + self.drawShadeAlphaNotice(layout) + + useMultitexture = ( + useDict["Texture 0"] + and useDict["Texture 1"] + and f3dMat.tex0.tex_set + and f3dMat.tex1.tex_set + ) + + if ( + useMultitexture + and f3dMat.tex0.tex_format[:2] == "CI" + or f3dMat.tex1.tex_format[:2] == "CI" + ): + self.drawCIMultitextureNotice(inputCol) + + if useDict["Texture 0"] and f3dMat.tex0.tex_set: + self.ui_image(material, inputCol, f3dMat.tex0, "Texture 0", False) + + if useDict["Texture 1"] and f3dMat.tex1.tex_set: + self.ui_image(material, inputCol, f3dMat.tex1, "Texture 1", False) + + if useMultitexture: + inputCol.prop(f3dMat, "uv_basis", text="UV Basis") + + if useDict["Texture"]: + if material.mat_ver > 3: + inputCol.prop(f3dMat, "use_large_textures") + self.ui_scale(f3dMat, inputCol) + + if useDict["Primitive"] and f3dMat.set_prim: + self.ui_prim(material, inputCol, "set_prim", f3dMat.set_prim, False) + + if useDict["Environment"] and f3dMat.set_env: + if material.mat_ver >= 3: + self.ui_env(material, inputCol, False) + else: + self.ui_prop( + material, + inputCol, + "Environment Color", + "set_env", + material.set_env, + False, + ) + + showLightProperty = ( + f3dMat.set_lights + and f3dMat.rdp_settings.g_lighting + and f3dMat.rdp_settings.g_shade + ) + if useDict["Shade"] and showLightProperty: + self.ui_lights(f3dMat, inputCol, "Shade Color", False) + + if useDict["Key"] and f3dMat.set_key: + self.ui_chroma( + material, + inputCol, + "Chroma Key Center", + "set_key", + f3dMat.set_key, + False, + ) + + if useDict["Convert"] and f3dMat.set_k0_5: + self.ui_convert(f3dMat, inputCol, False) + + if f3dMat.set_fog: + self.ui_fog(f3dMat, inputCol, False) + + def draw_full(self, f3dMat, material, layout, context): + + layout.row().prop(material, "menu_tab", expand=True) + menuTab = material.menu_tab + useDict = all_combiner_uses(f3dMat) + + if menuTab == "Combiner": + if material.mat_ver > 3: + self.ui_draw_layer(material, layout, context) + + if not f3dMat.rdp_settings.g_lighting: + self.drawVertexColorNotice(layout) + elif useDict["Shade Alpha"]: + self.drawShadeAlphaNotice(layout) + + combinerBox = layout.box() + combinerBox.prop( + f3dMat, "set_combiner", text="Color Combiner (Color = (A - B) * C + D)" + ) + combinerCol = combinerBox.row() + combinerCol.enabled = f3dMat.set_combiner + rowColor = combinerCol.column() + rowAlpha = combinerCol.column() + + rowColor.prop(f3dMat.combiner1, "A") + rowColor.prop(f3dMat.combiner1, "B") + rowColor.prop(f3dMat.combiner1, "C") + rowColor.prop(f3dMat.combiner1, "D") + rowAlpha.prop(f3dMat.combiner1, "A_alpha") + rowAlpha.prop(f3dMat.combiner1, "B_alpha") + rowAlpha.prop(f3dMat.combiner1, "C_alpha") + rowAlpha.prop(f3dMat.combiner1, "D_alpha") + + if f3dMat.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE": + combinerBox2 = layout.box() + combinerBox2.label(text="Color Combiner Cycle 2") + combinerBox2.enabled = f3dMat.set_combiner + combinerCol2 = combinerBox2.row() + rowColor2 = combinerCol2.column() + rowAlpha2 = combinerCol2.column() + + rowColor2.prop(f3dMat.combiner2, "A") + rowColor2.prop(f3dMat.combiner2, "B") + rowColor2.prop(f3dMat.combiner2, "C") + rowColor2.prop(f3dMat.combiner2, "D") + rowAlpha2.prop(f3dMat.combiner2, "A_alpha") + rowAlpha2.prop(f3dMat.combiner2, "B_alpha") + rowAlpha2.prop(f3dMat.combiner2, "C_alpha") + rowAlpha2.prop(f3dMat.combiner2, "D_alpha") + + layout.box().label( + text="Note: In cycle 2, texture 0 and texture 1 are flipped." + ) + + # layout.box().label( + # text = 'Note: Alpha preview is not 100% accurate.') + + if menuTab == "Sources": + self.ui_uvCheck(layout, context) + + inputCol = layout.column() + + useMultitexture = useDict["Texture 0"] and useDict["Texture 1"] + + if ( + useMultitexture + and f3dMat.tex0.tex_format[:2] == "CI" + or f3dMat.tex1.tex_format[:2] == "CI" + ): + self.drawCIMultitextureNotice(inputCol) + + if useDict["Texture 0"]: + self.ui_image(material, inputCol, f3dMat.tex0, "Texture 0", True) + + if useDict["Texture 1"]: + self.ui_image(material, inputCol, f3dMat.tex1, "Texture 1", True) + + if useMultitexture: + inputCol.prop(f3dMat, "uv_basis", text="UV Basis") + + if useDict["Texture"]: + if material.mat_ver > 3: + inputCol.prop(f3dMat, "use_large_textures") + self.ui_scale(f3dMat, inputCol) + + if useDict["Primitive"]: + self.ui_prim(material, inputCol, "set_prim", f3dMat.set_prim, True) + + if useDict["Environment"]: + if material.mat_ver >= 3: + self.ui_env(material, inputCol, True) + else: + self.ui_prop( + material, + inputCol, + "Environment Color", + "set_env", + material.set_env, + True, + ) + + if useDict["Shade"]: + self.ui_lights(f3dMat, inputCol, "Shade Color", True) + + if useDict["Key"]: + self.ui_chroma( + material, + inputCol, + "Chroma Key Center", + "set_key", + f3dMat.set_key, + True, + ) + + if useDict["Convert"]: + self.ui_convert(f3dMat, inputCol, True) + + self.ui_fog(f3dMat, inputCol, True) + + if menuTab == "Geo": + ui_geo_mode(f3dMat.rdp_settings, f3dMat, layout, False) + if menuTab == "Upper": + ui_upper_mode(f3dMat.rdp_settings, f3dMat, layout, False) + if menuTab == "Lower": + ui_lower_mode(f3dMat.rdp_settings, f3dMat, layout, False) + # layout.box().label(text = \ + # 'WARNING: Render mode settings not reset after drawing.') + self.ui_lower_render_mode(f3dMat, layout, False) + ui_other(f3dMat.rdp_settings, f3dMat, layout, False) + + # texture convert/LUT controlled by texture settings + # add node support for geo mode settings + def draw(self, context): + layout = self.layout + + layout.operator(CreateFast3DMaterial.bl_idname) + material = context.material + if material is None: + return + elif not (material.use_nodes and material.is_f3d): + layout.label(text="This is not a Fast3D material.") + return + + if material.mat_ver > 3: + f3dMat = material.f3d_mat + else: + f3dMat = material + # layout.box().label(text = 'Note: Do not copy paste materials.') + layout.prop(context.scene, "f3d_simple", text="Show Simplified UI") + layout = layout.box() + titleCol = layout.column() + titleCol.box().label(text="F3D Material Inspector") + + if material.mat_ver > 3: + presetCol = layout.column() + split = presetCol.split(factor=0.33) + split.label(text="Preset") + row = split.row(align=True) + row.menu(MATERIAL_MT_f3d_presets.__name__, text=f3dMat.presetName) + row.operator(AddPresetF3D.bl_idname, text="", icon="ZOOM_IN") + row.operator( + AddPresetF3D.bl_idname, text="", icon="ZOOM_OUT" + ).remove_active = True + else: + prop_split(layout, material, "f3d_preset", "Preset Material") + + if context.scene.f3d_simple and ( + (material.mat_ver > 3 and f3dMat.presetName != "Custom") + or (material.mat_ver <= 3 and f3dMat.f3d_preset != "Custom") + ): + self.draw_simple(f3dMat, material, layout, context) + else: + if material.mat_ver > 3: + presetCol.prop(context.scene, "f3dUserPresetsOnly") + self.draw_full(f3dMat, material, layout, context) + + +# def ui_procAnimVec(self, procAnimVec, layout, name, vecType): +# layout.prop(procAnimVec, 'menu', text = name, +# icon = 'TRIA_DOWN' if procAnimVec.menu else 'TRIA_RIGHT') +# if procAnimVec.menu: +# box = layout.box() +# self.ui_procAnimField(procAnimVec.x, box, vecType[0]) +# self.ui_procAnimField(procAnimVec.y, box, vecType[1]) +# if len(vecType) > 2: +# self.ui_procAnimField(procAnimVec.z, box, vecType[2]) + def ui_tileScroll(tex, name, layout): - row = layout.row() - row.label(text = name) - row.prop(tex.tile_scroll, 's', text = 'S:') - row.prop(tex.tile_scroll, 't', text = 'T:') - row.prop(tex.tile_scroll, 'interval', text = 'Interval:') - -def ui_procAnimVecEnum(material, procAnimVec, layout, name, vecType, useDropdown, useTex0, useTex1): - layout = layout.box() - box = layout.column() - if useDropdown: - layout.prop(procAnimVec, 'menu', text = name, - icon = 'TRIA_DOWN' if procAnimVec.menu else 'TRIA_RIGHT') - else: - layout.box().label(text = name) - - if not useDropdown or procAnimVec.menu: - box = layout.column() - #box.box().label(text = 'Scrolling not visible in preview.') - #box.box().label(text = 'This is decomp only.') - combinedOption = None - xCombined = procAnimVec.x.animType == 'Rotation' - if xCombined: - combinedOption = procAnimVec.x.animType - yCombined = procAnimVec.y.animType == 'Rotation' - if yCombined: - combinedOption = procAnimVec.y.animType - if not yCombined: - ui_procAnimFieldEnum(procAnimVec.x, box, vecType[0], "UV" if xCombined else None) - if not xCombined: - ui_procAnimFieldEnum(procAnimVec.y, box, vecType[1], "UV" if yCombined else None) - if len(vecType) > 2: - ui_procAnimFieldEnum(procAnimVec.z, box, vecType[2]) - if xCombined or yCombined: - box.row().prop(procAnimVec, 'pivot') - box.row().prop(procAnimVec, 'angularSpeed') - if combinedOption == "Rotation": - pass - - if useTex0 or useTex1: - layout.box().label(text = 'SM64 SetTileSize Texture Scroll') - - if useTex0: - ui_tileScroll(material.tex0, 'Tex 0 Speed', layout) - - if useTex1: - ui_tileScroll(material.tex1, 'Tex 1 Speed', layout) + row = layout.row() + row.label(text=name) + row.prop(tex.tile_scroll, "s", text="S:") + row.prop(tex.tile_scroll, "t", text="T:") + row.prop(tex.tile_scroll, "interval", text="Interval:") + + +def ui_procAnimVecEnum( + material, procAnimVec, layout, name, vecType, useDropdown, useTex0, useTex1 +): + layout = layout.box() + box = layout.column() + if useDropdown: + layout.prop( + procAnimVec, + "menu", + text=name, + icon="TRIA_DOWN" if procAnimVec.menu else "TRIA_RIGHT", + ) + else: + layout.box().label(text=name) + + if not useDropdown or procAnimVec.menu: + box = layout.column() + # box.box().label(text = 'Scrolling not visible in preview.') + # box.box().label(text = 'This is decomp only.') + combinedOption = None + xCombined = procAnimVec.x.animType == "Rotation" + if xCombined: + combinedOption = procAnimVec.x.animType + yCombined = procAnimVec.y.animType == "Rotation" + if yCombined: + combinedOption = procAnimVec.y.animType + if not yCombined: + ui_procAnimFieldEnum( + procAnimVec.x, box, vecType[0], "UV" if xCombined else None + ) + if not xCombined: + ui_procAnimFieldEnum( + procAnimVec.y, box, vecType[1], "UV" if yCombined else None + ) + if len(vecType) > 2: + ui_procAnimFieldEnum(procAnimVec.z, box, vecType[2]) + if xCombined or yCombined: + box.row().prop(procAnimVec, "pivot") + box.row().prop(procAnimVec, "angularSpeed") + if combinedOption == "Rotation": + pass + + if useTex0 or useTex1: + layout.box().label(text="SM64 SetTileSize Texture Scroll") + + if useTex0: + ui_tileScroll(material.tex0, "Tex 0 Speed", layout) + + if useTex1: + ui_tileScroll(material.tex1, "Tex 1 Speed", layout) + def ui_procAnimFieldEnum(procAnimField, layout, name, overrideName): - box = layout - box.prop(procAnimField, 'animType', text = name if overrideName is None else overrideName) - if overrideName is None: - if procAnimField.animType == "Linear": - split0 = box.row().split(factor = 1) - split0.prop(procAnimField, 'speed') - elif procAnimField.animType == "Sine": - split1 = box.row().split(factor = 0.3333) - split1.prop(procAnimField, 'amplitude') - split1.prop(procAnimField, 'frequency') - #layout.row().prop(procAnimField, 'spaceFrequency') - #split2 = box.row().split(factor = 0.5) - split1.prop(procAnimField, 'offset') - elif procAnimField.animType == 'Noise': - box.row().prop(procAnimField, 'noiseAmplitude') + box = layout + box.prop( + procAnimField, "animType", text=name if overrideName is None else overrideName + ) + if overrideName is None: + if procAnimField.animType == "Linear": + split0 = box.row().split(factor=1) + split0.prop(procAnimField, "speed") + elif procAnimField.animType == "Sine": + split1 = box.row().split(factor=0.3333) + split1.prop(procAnimField, "amplitude") + split1.prop(procAnimField, "frequency") + # layout.row().prop(procAnimField, 'spaceFrequency') + # split2 = box.row().split(factor = 0.5) + split1.prop(procAnimField, "offset") + elif procAnimField.animType == "Noise": + box.row().prop(procAnimField, "noiseAmplitude") + def ui_procAnimField(procAnimField, layout, name): - box = layout - box.prop(procAnimField, 'animate', text = name) - if procAnimField.animate: - if name not in 'XYZ': - split0 = box.row().split(factor = 1) - split0.prop(procAnimField, 'speed') - split1 = box.row().split(factor = 0.5) - split1.prop(procAnimField, 'amplitude') - split1.prop(procAnimField, 'frequency') - layout.row().prop(procAnimField, 'spaceFrequency') - split2 = box.row().split(factor = 0.5) - split2.prop(procAnimField, 'offset') - split2.prop(procAnimField, 'noiseAmplitude') + box = layout + box.prop(procAnimField, "animate", text=name) + if procAnimField.animate: + if name not in "XYZ": + split0 = box.row().split(factor=1) + split0.prop(procAnimField, "speed") + split1 = box.row().split(factor=0.5) + split1.prop(procAnimField, "amplitude") + split1.prop(procAnimField, "frequency") + layout.row().prop(procAnimField, "spaceFrequency") + split2 = box.row().split(factor=0.5) + split2.prop(procAnimField, "offset") + split2.prop(procAnimField, "noiseAmplitude") + def ui_procAnim(material, layout, useTex0, useTex1, title, useDropdown): - if material.mat_ver > 3: - ui_procAnimVecEnum(material.f3d_mat, material.f3d_mat.UVanim0, layout, title, 'UV', useDropdown, useTex0, useTex1) - else: - ui_procAnimVecEnum(material, material.UVanim, layout, title, 'UV', useDropdown, useTex0, useTex1) - #layout.prop(material, 'menu_procAnim', - # text = 'Procedural Animation', - # icon = 'TRIA_DOWN' if material.menu_procAnim else 'TRIA_RIGHT') - #if material.menu_procAnim: - # procAnimBox = layout.box() - # if useTex0: - # ui_procAnimVec(material.UVanim_tex0, procAnimBox, - # "UV Texture 0", 'UV') - # if useTex1: - # ui_procAnimVec(material.UVanim_tex1, procAnimBox, - # "UV Texture 1", 'UV') - # ui_procAnimVec(material.positionAnim, procAnimBox, - # "Position", 'XYZ') - # ui_procAnimVec(material.colorAnim, procAnimBox, "Color", - # 'RGB') + if material.mat_ver > 3: + ui_procAnimVecEnum( + material.f3d_mat, + material.f3d_mat.UVanim0, + layout, + title, + "UV", + useDropdown, + useTex0, + useTex1, + ) + else: + ui_procAnimVecEnum( + material, + material.UVanim, + layout, + title, + "UV", + useDropdown, + useTex0, + useTex1, + ) + # layout.prop(material, 'menu_procAnim', + # text = 'Procedural Animation', + # icon = 'TRIA_DOWN' if material.menu_procAnim else 'TRIA_RIGHT') + # if material.menu_procAnim: + # procAnimBox = layout.box() + # if useTex0: + # ui_procAnimVec(material.UVanim_tex0, procAnimBox, + # "UV Texture 0", 'UV') + # if useTex1: + # ui_procAnimVec(material.UVanim_tex1, procAnimBox, + # "UV Texture 1", 'UV') + # ui_procAnimVec(material.positionAnim, procAnimBox, + # "Position", 'XYZ') + # ui_procAnimVec(material.colorAnim, procAnimBox, "Color", + # 'RGB') def update_node_values(self, context): - if hasattr(context.scene, 'world') and \ - self == context.scene.world.rdp_defaults: - pass - elif hasattr(context, 'material_slot') and context.material_slot is not None: - material = context.material_slot.material # Handles case of texture property groups - if not material.is_f3d or material.f3d_update_flag: - return - - material.f3d_update_flag = True - update_node_values_of_material(material, context) - if material.mat_ver > 3: - material.f3d_mat.presetName = "Custom" - else: - material.f3d_preset = 'Custom' - material.f3d_update_flag = False + if hasattr(context.scene, "world") and self == context.scene.world.rdp_defaults: + pass + elif hasattr(context, "material_slot") and context.material_slot is not None: + material = ( + context.material_slot.material + ) # Handles case of texture property groups + if not material.is_f3d or material.f3d_update_flag: + return + + material.f3d_update_flag = True + update_node_values_of_material(material, context) + if material.mat_ver > 3: + material.f3d_mat.presetName = "Custom" + else: + material.f3d_preset = "Custom" + material.f3d_update_flag = False + def update_node_values_without_preset(self, context): - if hasattr(context.scene, 'world') and \ - self == context.scene.world.rdp_defaults: - pass - elif hasattr(context, 'material_slot') and context.material_slot is not None: - material = context.material_slot.material # Handles case of texture property groups - if not material.is_f3d or material.f3d_update_flag: - return - - material.f3d_update_flag = True - update_node_values_of_material(material, context) - material.f3d_update_flag = False - elif hasattr(context, 'material') and context.material is not None: - material = context.material - if not material.is_f3d or material.f3d_update_flag: - return - - material.f3d_update_flag = True - update_node_values_of_material(material, context) - material.f3d_update_flag = False - else: - #print('No material in context.') - pass + if hasattr(context.scene, "world") and self == context.scene.world.rdp_defaults: + pass + elif hasattr(context, "material_slot") and context.material_slot is not None: + material = ( + context.material_slot.material + ) # Handles case of texture property groups + if not material.is_f3d or material.f3d_update_flag: + return + + material.f3d_update_flag = True + update_node_values_of_material(material, context) + material.f3d_update_flag = False + elif hasattr(context, "material") and context.material is not None: + material = context.material + if not material.is_f3d or material.f3d_update_flag: + return + + material.f3d_update_flag = True + update_node_values_of_material(material, context) + material.f3d_update_flag = False + else: + # print('No material in context.') + pass + def update_node_values_directly(material, context): - if not material.is_f3d or material.f3d_update_flag: - return - material.f3d_update_flag = True - update_node_values_of_material(material, context) - material.f3d_preset = 'Custom' - material.f3d_update_flag = False + if not material.is_f3d or material.f3d_update_flag: + return + material.f3d_update_flag = True + update_node_values_of_material(material, context) + material.f3d_preset = "Custom" + material.f3d_update_flag = False + def getSocketFromCombinerToNodeDictColor(nodes, f3dVer, combinerInput): - nodeName, socketIndex = combinerToNodeDictColor[combinerInput] - return nodes[nodeName].outputs[socketIndex] if nodeName is not None else None + nodeName, socketIndex = combinerToNodeDictColor[combinerInput] + return nodes[nodeName].outputs[socketIndex] if nodeName is not None else None + def getSocketFromCombinerToNodeDictAlpha(nodes, f3dVer, combinerInput): - nodeName, socketIndex = combinerToNodeDictAlpha[combinerInput] - return nodes[nodeName].outputs[socketIndex] if nodeName is not None else None + nodeName, socketIndex = combinerToNodeDictAlpha[combinerInput] + return nodes[nodeName].outputs[socketIndex] if nodeName is not None else None + def update_node_combiner(material, combinerInputs, f3dVer, cycleIndex): - nodes = material.node_tree.nodes - combinerNode = nodes['Color Combiner Cycle ' + str(cycleIndex) + ' F3D v3'] - for i in range(8): - for link in combinerNode.inputs[i].links: - material.node_tree.links.remove(link) - if i in range(0,4): - if combinerInputs[i] == 'COMBINED' or combinerInputs[i] == 'COMBINED_ALPHA': - if cycleIndex == 2: - combiner1 = nodes['Color Combiner Cycle 1 F3D v3'] - combiner2 = nodes['Color Combiner Cycle 2 F3D v3'] - material.node_tree.links.new(combiner2.inputs[i], - combiner1.outputs[0 if combinerInputs[i] == 'COMBINED' else 1]) - else: - if cycleIndex == 2 and combinerInputs[i][:5] == "TEXEL": - value = combinerInputs[i] - combinerInput = value.replace("0", "1") if "0" in value else value.replace("1", "0") - else: - combinerInput = combinerInputs[i] - combinerSocket = getSocketFromCombinerToNodeDictColor(nodes, f3dVer, combinerInput) - material.node_tree.links.new(combinerNode.inputs[i], combinerSocket) - else: - if combinerInputs[i] == 'COMBINED': - if cycleIndex == 2: - combiner1 = nodes['Color Combiner Cycle 1 F3D v3'] - combiner2 = nodes['Color Combiner Cycle 2 F3D v3'] - material.node_tree.links.new(combiner2.inputs[i], combiner1.outputs[1]) - else: - combinerSocket = getSocketFromCombinerToNodeDictAlpha(nodes, f3dVer, combinerInputs[i]) - material.node_tree.links.new(combinerNode.inputs[i], combinerSocket) + nodes = material.node_tree.nodes + combinerNode = nodes["Color Combiner Cycle " + str(cycleIndex) + " F3D v3"] + for i in range(8): + for link in combinerNode.inputs[i].links: + material.node_tree.links.remove(link) + if i in range(0, 4): + if combinerInputs[i] == "COMBINED" or combinerInputs[i] == "COMBINED_ALPHA": + if cycleIndex == 2: + combiner1 = nodes["Color Combiner Cycle 1 F3D v3"] + combiner2 = nodes["Color Combiner Cycle 2 F3D v3"] + material.node_tree.links.new( + combiner2.inputs[i], + combiner1.outputs[0 if combinerInputs[i] == "COMBINED" else 1], + ) + else: + if cycleIndex == 2 and combinerInputs[i][:5] == "TEXEL": + value = combinerInputs[i] + combinerInput = ( + value.replace("0", "1") + if "0" in value + else value.replace("1", "0") + ) + else: + combinerInput = combinerInputs[i] + combinerSocket = getSocketFromCombinerToNodeDictColor( + nodes, f3dVer, combinerInput + ) + material.node_tree.links.new(combinerNode.inputs[i], combinerSocket) + else: + if combinerInputs[i] == "COMBINED": + if cycleIndex == 2: + combiner1 = nodes["Color Combiner Cycle 1 F3D v3"] + combiner2 = nodes["Color Combiner Cycle 2 F3D v3"] + material.node_tree.links.new( + combiner2.inputs[i], combiner1.outputs[1] + ) + else: + combinerSocket = getSocketFromCombinerToNodeDictAlpha( + nodes, f3dVer, combinerInputs[i] + ) + material.node_tree.links.new(combinerNode.inputs[i], combinerSocket) + def update_node_values_of_material(material, context): - nodes = material.node_tree.nodes - - # Case where f3d render engine is used instead of node graph - # Note that v4 doesn't change the node graph from v3, so we use that name - if material.mat_ver > 3: - update_blend_method(material, context) - if not hasNodeGraph(material): - return - - if material.mat_ver > 3: - f3dMat = material.f3d_mat - else: - f3dMat = material - - f3dVer = F3D('F3D', False) - if material.mat_ver == 1: - nodes['Case A 1'].inA = material.combiner1.A - nodes['Case B 1'].inB = material.combiner1.B - nodes['Case C 1'].inC = material.combiner1.C - nodes['Case D 1'].inD = material.combiner1.D - nodes['Case A Alpha 1'].inA_alpha = material.combiner1.A_alpha - nodes['Case B Alpha 1'].inB_alpha = material.combiner1.B_alpha - nodes['Case C Alpha 1'].inC_alpha = material.combiner1.C_alpha - nodes['Case D Alpha 1'].inD_alpha = material.combiner1.D_alpha - nodes['Case A 2'].inA = material.combiner2.A - nodes['Case B 2'].inB = material.combiner2.B - nodes['Case C 2'].inC = material.combiner2.C - nodes['Case D 2'].inD = material.combiner2.D - nodes['Case A Alpha 2'].inA_alpha = material.combiner2.A_alpha - nodes['Case B Alpha 2'].inB_alpha = material.combiner2.B_alpha - nodes['Case C Alpha 2'].inC_alpha = material.combiner2.C_alpha - nodes['Case D Alpha 2'].inD_alpha = material.combiner2.D_alpha - elif material.mat_ver == 2: - nodes['Case A 1'].outputs[0].default_value = f3dVer.CCMUXDict[material.combiner1.A] - nodes['Case B 1'].outputs[0].default_value = f3dVer.CCMUXDict[material.combiner1.B] - nodes['Case C 1'].outputs[0].default_value = f3dVer.CCMUXDict[material.combiner1.C] - nodes['Case D 1'].outputs[0].default_value = f3dVer.CCMUXDict[material.combiner1.D] - nodes['Case A Alpha 1'].outputs[0].default_value = f3dVer.ACMUXDict[material.combiner1.A_alpha] - nodes['Case B Alpha 1'].outputs[0].default_value = f3dVer.ACMUXDict[material.combiner1.B_alpha] - nodes['Case C Alpha 1'].outputs[0].default_value = f3dVer.ACMUXDict[material.combiner1.C_alpha] - nodes['Case D Alpha 1'].outputs[0].default_value = f3dVer.ACMUXDict[material.combiner1.D_alpha] - nodes['Case A 2'].outputs[0].default_value = f3dVer.CCMUXDict[material.combiner2.A] - nodes['Case B 2'].outputs[0].default_value = f3dVer.CCMUXDict[material.combiner2.B] - nodes['Case C 2'].outputs[0].default_value = f3dVer.CCMUXDict[material.combiner2.C] - nodes['Case D 2'].outputs[0].default_value = f3dVer.CCMUXDict[material.combiner2.D] - nodes['Case A Alpha 2'].outputs[0].default_value = f3dVer.ACMUXDict[material.combiner2.A_alpha] - nodes['Case B Alpha 2'].outputs[0].default_value = f3dVer.ACMUXDict[material.combiner2.B_alpha] - nodes['Case C Alpha 2'].outputs[0].default_value = f3dVer.ACMUXDict[material.combiner2.C_alpha] - nodes['Case D Alpha 2'].outputs[0].default_value = f3dVer.ACMUXDict[material.combiner2.D_alpha] - elif material.mat_ver >= 3: - combinerInputs1 = [ - f3dMat.combiner1.A, - f3dMat.combiner1.B, - f3dMat.combiner1.C, - f3dMat.combiner1.D, - f3dMat.combiner1.A_alpha, - f3dMat.combiner1.B_alpha, - f3dMat.combiner1.C_alpha, - f3dMat.combiner1.D_alpha, - ] - - combinerInputs2 = [ - f3dMat.combiner2.A, - f3dMat.combiner2.B, - f3dMat.combiner2.C, - f3dMat.combiner2.D, - f3dMat.combiner2.A_alpha, - f3dMat.combiner2.B_alpha, - f3dMat.combiner2.C_alpha, - f3dMat.combiner2.D_alpha, - ] - - update_node_combiner(material, combinerInputs1, f3dVer, 1) - update_node_combiner(material, combinerInputs2, f3dVer, 2) - - if material.mat_ver >= 3: - nodes['F3D v3'].inputs[4].default_value = 1 if \ - f3dMat.rdp_settings.g_mdsft_cycletype == 'G_CYC_2CYCLE' else 0 - nodes['F3D v3'].inputs[5].default_value = \ - 0 if f3dMat.rdp_settings.g_cull_front else 1 - nodes['F3D v3'].inputs[6].default_value = \ - 0 if f3dMat.rdp_settings.g_cull_back else 1 - - nodes['Get UV 0 F3D v3'].inputs[0].default_value = 1 if \ - f3dMat.rdp_settings.g_tex_gen else 0 - nodes['Get UV 0 F3D v3'].inputs[1].default_value = 1 if \ - f3dMat.rdp_settings.g_tex_gen_linear else 0 - nodes['Get UV 1 F3D v3'].inputs[0].default_value = 1 if \ - f3dMat.rdp_settings.g_tex_gen else 0 - nodes['Get UV 1 F3D v3'].inputs[1].default_value = 1 if \ - f3dMat.rdp_settings.g_tex_gen_linear else 0 - - nodes['Shade Color'].inputs[0].default_value = 0 if \ - not f3dMat.rdp_settings.g_shade else 1 - nodes['Shade Color'].inputs[1].default_value = 0 if \ - not f3dMat.rdp_settings.g_lighting else 1 - - if f3dMat.use_default_lighting: - nodes['Shade Color'].inputs[2].default_value = \ - (f3dMat.default_light_color[0], - f3dMat.default_light_color[1], - f3dMat.default_light_color[2], - f3dMat.default_light_color[3]) - else: - nodes['Shade Color'].inputs[2].default_value = \ - (f3dMat.ambient_light_color[0], - f3dMat.ambient_light_color[1], - f3dMat.ambient_light_color[2], - f3dMat.ambient_light_color[3]) - - if material.mat_ver > 3: - nodes['Primitive Color Output'].inputs[0].default_value = \ - (f3dMat.prim_color[0], - f3dMat.prim_color[1], - f3dMat.prim_color[2], - f3dMat.prim_color[3]) - - nodes['Environment Color Output'].inputs[0].default_value = \ - (f3dMat.env_color[0], - f3dMat.env_color[1], - f3dMat.env_color[2], - f3dMat.env_color[3]) - - nodes['Chroma Key Center'].outputs[0].default_value = \ - (f3dMat.key_center[0], - f3dMat.key_center[1], - f3dMat.key_center[2], - f3dMat.key_center[3]) - - else: - nodes['Cycle Type'].outputs[0].default_value = 1 if \ - material.rdp_settings.g_mdsft_cycletype == 'G_CYC_2CYCLE' else 0 - nodes['Cull Front'].outputs[0].default_value = \ - 0 if material.rdp_settings.g_cull_front else 1 - nodes['Cull Back'].outputs[0].default_value = \ - 0 if material.rdp_settings.g_cull_back else 1 - nodes['Texture Gen'].outputs[0].default_value = 1 if \ - material.rdp_settings.g_tex_gen else 0 - nodes['Texture Gen Linear'].outputs[0].default_value = 1 if \ - material.rdp_settings.g_tex_gen_linear else 0 - nodes['Shading'].outputs[0].default_value = 0 if \ - not material.rdp_settings.g_shade else 1 - nodes['Lighting'].outputs[0].default_value = 0 if \ - not material.rdp_settings.g_lighting else 1 - - if material.use_default_lighting: - nodes['Ambient Color'].outputs[0].default_value = \ - (material.default_light_color[0], - material.default_light_color[1], - material.default_light_color[2], - material.default_light_color[3]) - else: - nodes['Ambient Color'].outputs[0].default_value = \ - (material.ambient_light_color[0], - material.ambient_light_color[1], - material.ambient_light_color[2], - material.ambient_light_color[3]) - - material.show_transparent_back = f3dMat.rdp_settings.g_cull_front - nodes['Chroma Key Scale'].outputs[0].default_value = \ - [value for value in f3dMat.key_scale] + [1] - nodes['Primitive LOD Fraction'].outputs[0].default_value = \ - f3dMat.prim_lod_frac - - # nodes['YUV Convert K0'].outputs[0].default_value = material.k0 - # nodes['YUV Convert K1'].outputs[0].default_value = material.k1 - # nodes['YUV Convert K2'].outputs[0].default_value = material.k2 - # nodes['YUV Convert K3'].outputs[0].default_value = material.k3 - nodes['YUV Convert K4'].outputs[0].default_value = f3dMat.k4 - nodes['YUV Convert K5'].outputs[0].default_value = f3dMat.k5 - - update_tex_values_manual(material, context) - -def update_tex_values_field(self, fieldProperty, texCoordNode, pixelLength, - isTexGen, uvBasisScale, scale, autoprop, reverseValues, texIndex, field): - clamp = fieldProperty.clamp - mirror = fieldProperty.mirror - - clampNode = texCoordNode['Clamp'] - mirrorNode = texCoordNode['Mirror'] - normHalfPixelNode = texCoordNode['Normalized Half Pixel'] - normLNode = texCoordNode["Normalized L"] - normHNode = texCoordNode["Normalized H"] - normMaskNode = texCoordNode["Normalized Mask"] - shiftNode = texCoordNode['Shift'] - scaleNode = texCoordNode['Scale'] - - clampNode.outputs[0].default_value = 1 if clamp else 0 - mirrorNode.outputs[0].default_value = 1 if mirror else 0 - normHalfPixelNode.outputs[0].default_value = \ - 1 / (2 * pixelLength) - - if autoprop: - fieldProperty.low = 0 - fieldProperty.high = pixelLength - 1 - fieldProperty.mask = math.ceil(math.log(pixelLength, 2) - 0.001) - #fieldProperty.mask = 0 - fieldProperty.shift = 0 - - L = fieldProperty.low - H = fieldProperty.high - mask = fieldProperty.mask - shift = fieldProperty.shift - - if reverseValues: - normLNode.outputs[0].default_value = -L / pixelLength - else: - normLNode.outputs[0].default_value = L / pixelLength - normHNode.outputs[0].default_value = (H + 1)/pixelLength - normMaskNode.outputs[0].default_value = \ - (2 ** mask) / pixelLength if mask > 0 else 0 - - shiftNode.outputs[0].default_value = shift - scaleNode.outputs[0].default_value = scale * uvBasisScale + nodes = material.node_tree.nodes + + # Case where f3d render engine is used instead of node graph + # Note that v4 doesn't change the node graph from v3, so we use that name + if material.mat_ver > 3: + update_blend_method(material, context) + if not hasNodeGraph(material): + return + + if material.mat_ver > 3: + f3dMat = material.f3d_mat + else: + f3dMat = material + + f3dVer = F3D("F3D", False) + if material.mat_ver == 1: + nodes["Case A 1"].inA = material.combiner1.A + nodes["Case B 1"].inB = material.combiner1.B + nodes["Case C 1"].inC = material.combiner1.C + nodes["Case D 1"].inD = material.combiner1.D + nodes["Case A Alpha 1"].inA_alpha = material.combiner1.A_alpha + nodes["Case B Alpha 1"].inB_alpha = material.combiner1.B_alpha + nodes["Case C Alpha 1"].inC_alpha = material.combiner1.C_alpha + nodes["Case D Alpha 1"].inD_alpha = material.combiner1.D_alpha + nodes["Case A 2"].inA = material.combiner2.A + nodes["Case B 2"].inB = material.combiner2.B + nodes["Case C 2"].inC = material.combiner2.C + nodes["Case D 2"].inD = material.combiner2.D + nodes["Case A Alpha 2"].inA_alpha = material.combiner2.A_alpha + nodes["Case B Alpha 2"].inB_alpha = material.combiner2.B_alpha + nodes["Case C Alpha 2"].inC_alpha = material.combiner2.C_alpha + nodes["Case D Alpha 2"].inD_alpha = material.combiner2.D_alpha + elif material.mat_ver == 2: + nodes["Case A 1"].outputs[0].default_value = f3dVer.CCMUXDict[ + material.combiner1.A + ] + nodes["Case B 1"].outputs[0].default_value = f3dVer.CCMUXDict[ + material.combiner1.B + ] + nodes["Case C 1"].outputs[0].default_value = f3dVer.CCMUXDict[ + material.combiner1.C + ] + nodes["Case D 1"].outputs[0].default_value = f3dVer.CCMUXDict[ + material.combiner1.D + ] + nodes["Case A Alpha 1"].outputs[0].default_value = f3dVer.ACMUXDict[ + material.combiner1.A_alpha + ] + nodes["Case B Alpha 1"].outputs[0].default_value = f3dVer.ACMUXDict[ + material.combiner1.B_alpha + ] + nodes["Case C Alpha 1"].outputs[0].default_value = f3dVer.ACMUXDict[ + material.combiner1.C_alpha + ] + nodes["Case D Alpha 1"].outputs[0].default_value = f3dVer.ACMUXDict[ + material.combiner1.D_alpha + ] + nodes["Case A 2"].outputs[0].default_value = f3dVer.CCMUXDict[ + material.combiner2.A + ] + nodes["Case B 2"].outputs[0].default_value = f3dVer.CCMUXDict[ + material.combiner2.B + ] + nodes["Case C 2"].outputs[0].default_value = f3dVer.CCMUXDict[ + material.combiner2.C + ] + nodes["Case D 2"].outputs[0].default_value = f3dVer.CCMUXDict[ + material.combiner2.D + ] + nodes["Case A Alpha 2"].outputs[0].default_value = f3dVer.ACMUXDict[ + material.combiner2.A_alpha + ] + nodes["Case B Alpha 2"].outputs[0].default_value = f3dVer.ACMUXDict[ + material.combiner2.B_alpha + ] + nodes["Case C Alpha 2"].outputs[0].default_value = f3dVer.ACMUXDict[ + material.combiner2.C_alpha + ] + nodes["Case D Alpha 2"].outputs[0].default_value = f3dVer.ACMUXDict[ + material.combiner2.D_alpha + ] + elif material.mat_ver >= 3: + combinerInputs1 = [ + f3dMat.combiner1.A, + f3dMat.combiner1.B, + f3dMat.combiner1.C, + f3dMat.combiner1.D, + f3dMat.combiner1.A_alpha, + f3dMat.combiner1.B_alpha, + f3dMat.combiner1.C_alpha, + f3dMat.combiner1.D_alpha, + ] + + combinerInputs2 = [ + f3dMat.combiner2.A, + f3dMat.combiner2.B, + f3dMat.combiner2.C, + f3dMat.combiner2.D, + f3dMat.combiner2.A_alpha, + f3dMat.combiner2.B_alpha, + f3dMat.combiner2.C_alpha, + f3dMat.combiner2.D_alpha, + ] + + update_node_combiner(material, combinerInputs1, f3dVer, 1) + update_node_combiner(material, combinerInputs2, f3dVer, 2) + + if material.mat_ver >= 3: + nodes["F3D v3"].inputs[4].default_value = ( + 1 if f3dMat.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE" else 0 + ) + nodes["F3D v3"].inputs[5].default_value = ( + 0 if f3dMat.rdp_settings.g_cull_front else 1 + ) + nodes["F3D v3"].inputs[6].default_value = ( + 0 if f3dMat.rdp_settings.g_cull_back else 1 + ) + + nodes["Get UV 0 F3D v3"].inputs[0].default_value = ( + 1 if f3dMat.rdp_settings.g_tex_gen else 0 + ) + nodes["Get UV 0 F3D v3"].inputs[1].default_value = ( + 1 if f3dMat.rdp_settings.g_tex_gen_linear else 0 + ) + nodes["Get UV 1 F3D v3"].inputs[0].default_value = ( + 1 if f3dMat.rdp_settings.g_tex_gen else 0 + ) + nodes["Get UV 1 F3D v3"].inputs[1].default_value = ( + 1 if f3dMat.rdp_settings.g_tex_gen_linear else 0 + ) + + nodes["Shade Color"].inputs[0].default_value = ( + 0 if not f3dMat.rdp_settings.g_shade else 1 + ) + nodes["Shade Color"].inputs[1].default_value = ( + 0 if not f3dMat.rdp_settings.g_lighting else 1 + ) + + if f3dMat.use_default_lighting: + nodes["Shade Color"].inputs[2].default_value = ( + f3dMat.default_light_color[0], + f3dMat.default_light_color[1], + f3dMat.default_light_color[2], + f3dMat.default_light_color[3], + ) + else: + nodes["Shade Color"].inputs[2].default_value = ( + f3dMat.ambient_light_color[0], + f3dMat.ambient_light_color[1], + f3dMat.ambient_light_color[2], + f3dMat.ambient_light_color[3], + ) + + if material.mat_ver > 3: + nodes["Primitive Color Output"].inputs[0].default_value = ( + f3dMat.prim_color[0], + f3dMat.prim_color[1], + f3dMat.prim_color[2], + f3dMat.prim_color[3], + ) + + nodes["Environment Color Output"].inputs[0].default_value = ( + f3dMat.env_color[0], + f3dMat.env_color[1], + f3dMat.env_color[2], + f3dMat.env_color[3], + ) + + nodes["Chroma Key Center"].outputs[0].default_value = ( + f3dMat.key_center[0], + f3dMat.key_center[1], + f3dMat.key_center[2], + f3dMat.key_center[3], + ) + + else: + nodes["Cycle Type"].outputs[0].default_value = ( + 1 if material.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE" else 0 + ) + nodes["Cull Front"].outputs[0].default_value = ( + 0 if material.rdp_settings.g_cull_front else 1 + ) + nodes["Cull Back"].outputs[0].default_value = ( + 0 if material.rdp_settings.g_cull_back else 1 + ) + nodes["Texture Gen"].outputs[0].default_value = ( + 1 if material.rdp_settings.g_tex_gen else 0 + ) + nodes["Texture Gen Linear"].outputs[0].default_value = ( + 1 if material.rdp_settings.g_tex_gen_linear else 0 + ) + nodes["Shading"].outputs[0].default_value = ( + 0 if not material.rdp_settings.g_shade else 1 + ) + nodes["Lighting"].outputs[0].default_value = ( + 0 if not material.rdp_settings.g_lighting else 1 + ) + + if material.use_default_lighting: + nodes["Ambient Color"].outputs[0].default_value = ( + material.default_light_color[0], + material.default_light_color[1], + material.default_light_color[2], + material.default_light_color[3], + ) + else: + nodes["Ambient Color"].outputs[0].default_value = ( + material.ambient_light_color[0], + material.ambient_light_color[1], + material.ambient_light_color[2], + material.ambient_light_color[3], + ) + + material.show_transparent_back = f3dMat.rdp_settings.g_cull_front + nodes["Chroma Key Scale"].outputs[0].default_value = [ + value for value in f3dMat.key_scale + ] + [1] + nodes["Primitive LOD Fraction"].outputs[0].default_value = f3dMat.prim_lod_frac + + # nodes['YUV Convert K0'].outputs[0].default_value = material.k0 + # nodes['YUV Convert K1'].outputs[0].default_value = material.k1 + # nodes['YUV Convert K2'].outputs[0].default_value = material.k2 + # nodes['YUV Convert K3'].outputs[0].default_value = material.k3 + nodes["YUV Convert K4"].outputs[0].default_value = f3dMat.k4 + nodes["YUV Convert K5"].outputs[0].default_value = f3dMat.k5 + + update_tex_values_manual(material, context) + + +def update_tex_values_field( + self, + fieldProperty, + texCoordNode, + pixelLength, + isTexGen, + uvBasisScale, + scale, + autoprop, + reverseValues, + texIndex, + field, +): + clamp = fieldProperty.clamp + mirror = fieldProperty.mirror + + clampNode = texCoordNode["Clamp"] + mirrorNode = texCoordNode["Mirror"] + normHalfPixelNode = texCoordNode["Normalized Half Pixel"] + normLNode = texCoordNode["Normalized L"] + normHNode = texCoordNode["Normalized H"] + normMaskNode = texCoordNode["Normalized Mask"] + shiftNode = texCoordNode["Shift"] + scaleNode = texCoordNode["Scale"] + + clampNode.outputs[0].default_value = 1 if clamp else 0 + mirrorNode.outputs[0].default_value = 1 if mirror else 0 + normHalfPixelNode.outputs[0].default_value = 1 / (2 * pixelLength) + + if autoprop: + fieldProperty.low = 0 + fieldProperty.high = pixelLength - 1 + fieldProperty.mask = math.ceil(math.log(pixelLength, 2) - 0.001) + # fieldProperty.mask = 0 + fieldProperty.shift = 0 + + L = fieldProperty.low + H = fieldProperty.high + mask = fieldProperty.mask + shift = fieldProperty.shift + + if reverseValues: + normLNode.outputs[0].default_value = -L / pixelLength + else: + normLNode.outputs[0].default_value = L / pixelLength + normHNode.outputs[0].default_value = (H + 1) / pixelLength + normMaskNode.outputs[0].default_value = (2 ** mask) / pixelLength if mask > 0 else 0 + + shiftNode.outputs[0].default_value = shift + scaleNode.outputs[0].default_value = scale * uvBasisScale + def setAutoProp(fieldProperty, pixelLength): - fieldProperty.low = 0 - fieldProperty.high = pixelLength - 1 - fieldProperty.mask = math.ceil(math.log(pixelLength, 2) - 0.001) - #fieldProperty.mask = 0 - fieldProperty.shift = 0 - -def update_tex_values_field_v2(self, fieldProperty, pixelLength, - uvBasisScale, scale, autoprop, texIndex, field): - - fieldIndex = 0 if field == 'S' else 1 - pixelLengthAxis = pixelLength[fieldIndex] - - nodes = self.node_tree.nodes - clampNode = nodes['Tex ' + str(texIndex) + ' Clamp'] - mirrorNode = nodes['Tex ' + str(texIndex) + ' Mirror'] - normHalfPixelNode = nodes['Tex ' + str(texIndex) + ' Normalized Half Pixel'] - normLNode = nodes['Tex ' + str(texIndex) + " Normalized L"] - normHNode = nodes['Tex ' + str(texIndex) + " Normalized H"] - normMaskNode = nodes["Tex " + str(texIndex) + " Normalized Mask"] - shiftNode = nodes['Tex ' + str(texIndex) + ' Shift'] - scaleNode = nodes['Tex ' + str(texIndex) + ' Scale'] - - clampNode.inputs[fieldIndex].default_value = 1 if fieldProperty.clamp else 0 - mirrorNode.inputs[fieldIndex].default_value = 1 if fieldProperty.mirror else 0 - normHalfPixelNode.inputs[fieldIndex].default_value = 1 / (2 * pixelLengthAxis) - - if autoprop: - setAutoProp(fieldProperty, pixelLengthAxis) - - normLNode.inputs[fieldIndex].default_value = fieldProperty.low / pixelLengthAxis * (-1 if field == 'T' else 1) - normHNode.inputs[fieldIndex].default_value = (fieldProperty.high + 1)/pixelLengthAxis - normMaskNode.inputs[fieldIndex].default_value = (2 ** fieldProperty.mask) / pixelLengthAxis if fieldProperty.mask > 0 else 0 - shiftNode.inputs[fieldIndex].default_value = fieldProperty.shift - scaleNode.inputs[fieldIndex].default_value = scale[fieldIndex] * uvBasisScale[fieldIndex] - -def update_tex_values_field_v3(self, texProperty, tex_size, - uvBasisScale, scale, texIndex): - nodes = self.node_tree.nodes - if texProperty.autoprop: - setAutoProp(texProperty.S, tex_size[0]) - setAutoProp(texProperty.T, tex_size[1]) - - # For input index, Tex Gen = 0, Tex Gen Linear = 1 - - # Image Factor - nodes['Get UV ' + str(texIndex) + ' F3D v3'].inputs[2].default_value = ( - 1024 / tex_size[0], 1024 / tex_size[1], 0) - - # Normalized L - nodes['Get UV ' + str(texIndex) + ' F3D v3'].inputs[3].default_value = ( - texProperty.S.low / tex_size[0], - texProperty.T.low / tex_size[1], 0) - - # Normalized H - nodes['Get UV ' + str(texIndex) + ' F3D v3'].inputs[4].default_value = ( - (texProperty.S.high + 1) / tex_size[0], - (texProperty.T.high + 1) / tex_size[1], 0) - - # Clamp - isTexGen = self.f3d_mat.rdp_settings.g_tex_gen or self.f3d_mat.rdp_settings.g_tex_gen_linear - nodes['Get UV ' + str(texIndex) + ' F3D v3'].inputs[5].default_value = ( - 1 if texProperty.S.clamp and not isTexGen else 0, - 1 if texProperty.T.clamp and not isTexGen else 0, 0) - - # Normalized Mask - nodes['Get UV ' + str(texIndex) + ' F3D v3'].inputs[6].default_value = ( - (2 ** texProperty.S.mask) / tex_size[0] if texProperty.S.mask > 0 else 0, - (2 ** texProperty.T.mask) / tex_size[1] if texProperty.T.mask > 0 else 0, 0) - - # Mirror - nodes['Get UV ' + str(texIndex) + ' F3D v3'].inputs[7].default_value = ( - 1 if texProperty.S.mirror else 0, - 1 if texProperty.T.mirror else 0, 0) - - # Shift - nodes['Get UV ' + str(texIndex) + ' F3D v3'].inputs[8].default_value = ( - texProperty.S.shift, - texProperty.T.shift, 0) - - # Scale - nodes['Get UV ' + str(texIndex) + ' F3D v3'].inputs[9].default_value = ( - scale[0] * uvBasisScale[0], - scale[1] * uvBasisScale[1], 0) - - # Normalized Half Pixel - nodes['Get UV ' + str(texIndex) + ' F3D v3'].inputs[10].default_value = ( - 1 / (2 * tex_size[0]), - 1 / (2 * tex_size[1]), 0) - -def update_tex_values_index(self, context, texProperty, texNodeName, - uvNodeName, isTexGen, uvBasisScale, scale, texIndex): - nodes = self.node_tree.nodes - - nodes[texNodeName].image = texProperty.tex - if nodes[texNodeName].image is not None or texProperty.use_tex_reference: - if nodes[texNodeName].image is not None: - tex_size = nodes[texNodeName].image.size - else: - tex_size = texProperty.tex_reference_size - if tex_size[0] > 0 and tex_size[1] > 0: - if self.mat_ver == 1: - tex_x = nodes[uvNodeName].node_tree.nodes[\ - 'Create Tex Coord'].node_tree.nodes - tex_y = nodes[uvNodeName].node_tree.nodes[\ - 'Create Tex Coord.001'].node_tree.nodes - imageWidthNode = nodes[uvNodeName].node_tree.nodes['Image Width Factor'] - imageHeightNode = nodes[uvNodeName].node_tree.nodes['Image Height Factor'] - # 1024 == 2^16 / 2^6 (converting 0.16 to 10.5 fixed point) - imageWidthNode.outputs[0].default_value = 1024 / tex_size[0] - imageHeightNode.outputs[0].default_value = 1024 / tex_size[1] - - update_tex_values_field(self, texProperty.S, tex_x, tex_size[0], - self.rdp_settings.g_tex_gen or self.rdp_settings.g_tex_gen_linear, - uvBasisScale[0], scale[0], texProperty.autoprop, False, texIndex, 'S') - update_tex_values_field(self, texProperty.T, tex_y, tex_size[1], - self.rdp_settings.g_tex_gen or self.rdp_settings.g_tex_gen_linear, - uvBasisScale[1], scale[1], texProperty.autoprop, True, texIndex, 'T') - elif self.mat_ver == 2: - tex_x = nodes - tex_y = nodes - imageFactorNode = nodes['Tex ' + str(texIndex) + ' Image Factor'] - imageFactorNode.inputs[0].default_value = 1024 / tex_size[0] - imageFactorNode.inputs[1].default_value = 1024 / tex_size[1] - - update_tex_values_field_v2(self, texProperty.S, tex_size, - uvBasisScale, scale, texProperty.autoprop, texIndex, 'S') - update_tex_values_field_v2(self, texProperty.T, tex_size, - uvBasisScale, scale, texProperty.autoprop, texIndex, 'T') - elif self.mat_ver >= 3: - if self.mat_ver > 3: - f3dMat = self.f3d_mat - else: - f3dMat = self - if self.mat_ver == 3 or hasNodeGraph(self): - update_tex_values_field_v3(self, texProperty, tex_size, - uvBasisScale, scale, texIndex) - #nodes[texNodeName].interpolation = "Closest" - nodes[texNodeName].interpolation = "Closest" if \ - f3dMat.rdp_settings.g_mdsft_text_filt == 'G_TF_POINT' else "Linear" - else: - if texProperty.autoprop: - setAutoProp(texProperty.S, tex_size[0]) - setAutoProp(texProperty.T, tex_size[1]) - else: - print("Error: Unhandled material version " + str(self.mat_ver) + ' for texture properties.') - - texFormat = texProperty.tex_format - ciFormat = texProperty.ci_format - if self.mat_ver >= 3: # No nodes, only sockets (0 = color, 1 = alpha) - if self.mat_ver == 3 or hasNodeGraph(self): - getTextureColorName = 'Get Texture Color' if texIndex == 0 else "Get Texture Color.001" - # Is Greyscale - nodes[getTextureColorName].inputs[2].default_value =\ - 1 if (texFormat[0] == 'I' or \ - (texFormat[:2] == 'CI' and ciFormat[0] == 'I')) else 0 - - # Has Alpha - nodes[getTextureColorName].inputs[3].default_value = \ - 1 if ('A' in texFormat or \ - (texFormat[:2] == 'CI' and 'A' in ciFormat)) else 0 - - # Is Intensity - nodes[getTextureColorName].inputs[4].default_value =\ - 1 if (texFormat == 'I4' or texFormat == 'I8') else 0 - - else: - nodes[texNodeName + ' Is Greyscale'].outputs[0].default_value = \ - 1 if (texFormat[0] == 'I' or \ - (texFormat[:2] == 'CI' and ciFormat[0] == 'I')) else 0 - nodes[texNodeName + ' Has Alpha'].outputs[0].default_value = \ - 1 if ('A' in texFormat or \ - (texFormat[:2] == 'CI' and 'A' in ciFormat))else 0 - - if texNodeName + " Is Intensity" in nodes: - nodes[texNodeName + " Is Intensity"].outputs[0].default_value =\ - 1 if (texFormat == 'I4' or texFormat == 'I8') else 0 - else: - print("Using old node graph, cannot set intensity as alpha.") + fieldProperty.low = 0 + fieldProperty.high = pixelLength - 1 + fieldProperty.mask = math.ceil(math.log(pixelLength, 2) - 0.001) + # fieldProperty.mask = 0 + fieldProperty.shift = 0 + + +def update_tex_values_field_v2( + self, fieldProperty, pixelLength, uvBasisScale, scale, autoprop, texIndex, field +): + + fieldIndex = 0 if field == "S" else 1 + pixelLengthAxis = pixelLength[fieldIndex] + + nodes = self.node_tree.nodes + clampNode = nodes["Tex " + str(texIndex) + " Clamp"] + mirrorNode = nodes["Tex " + str(texIndex) + " Mirror"] + normHalfPixelNode = nodes["Tex " + str(texIndex) + " Normalized Half Pixel"] + normLNode = nodes["Tex " + str(texIndex) + " Normalized L"] + normHNode = nodes["Tex " + str(texIndex) + " Normalized H"] + normMaskNode = nodes["Tex " + str(texIndex) + " Normalized Mask"] + shiftNode = nodes["Tex " + str(texIndex) + " Shift"] + scaleNode = nodes["Tex " + str(texIndex) + " Scale"] + + clampNode.inputs[fieldIndex].default_value = 1 if fieldProperty.clamp else 0 + mirrorNode.inputs[fieldIndex].default_value = 1 if fieldProperty.mirror else 0 + normHalfPixelNode.inputs[fieldIndex].default_value = 1 / (2 * pixelLengthAxis) + + if autoprop: + setAutoProp(fieldProperty, pixelLengthAxis) + + normLNode.inputs[fieldIndex].default_value = ( + fieldProperty.low / pixelLengthAxis * (-1 if field == "T" else 1) + ) + normHNode.inputs[fieldIndex].default_value = ( + fieldProperty.high + 1 + ) / pixelLengthAxis + normMaskNode.inputs[fieldIndex].default_value = ( + (2 ** fieldProperty.mask) / pixelLengthAxis if fieldProperty.mask > 0 else 0 + ) + shiftNode.inputs[fieldIndex].default_value = fieldProperty.shift + scaleNode.inputs[fieldIndex].default_value = ( + scale[fieldIndex] * uvBasisScale[fieldIndex] + ) + + +def update_tex_values_field_v3( + self, texProperty, tex_size, uvBasisScale, scale, texIndex +): + nodes = self.node_tree.nodes + if texProperty.autoprop: + setAutoProp(texProperty.S, tex_size[0]) + setAutoProp(texProperty.T, tex_size[1]) + + # For input index, Tex Gen = 0, Tex Gen Linear = 1 + + # Image Factor + nodes["Get UV " + str(texIndex) + " F3D v3"].inputs[2].default_value = ( + 1024 / tex_size[0], + 1024 / tex_size[1], + 0, + ) + + # Normalized L + nodes["Get UV " + str(texIndex) + " F3D v3"].inputs[3].default_value = ( + texProperty.S.low / tex_size[0], + texProperty.T.low / tex_size[1], + 0, + ) + + # Normalized H + nodes["Get UV " + str(texIndex) + " F3D v3"].inputs[4].default_value = ( + (texProperty.S.high + 1) / tex_size[0], + (texProperty.T.high + 1) / tex_size[1], + 0, + ) + + # Clamp + isTexGen = ( + self.f3d_mat.rdp_settings.g_tex_gen + or self.f3d_mat.rdp_settings.g_tex_gen_linear + ) + nodes["Get UV " + str(texIndex) + " F3D v3"].inputs[5].default_value = ( + 1 if texProperty.S.clamp and not isTexGen else 0, + 1 if texProperty.T.clamp and not isTexGen else 0, + 0, + ) + + # Normalized Mask + nodes["Get UV " + str(texIndex) + " F3D v3"].inputs[6].default_value = ( + (2 ** texProperty.S.mask) / tex_size[0] if texProperty.S.mask > 0 else 0, + (2 ** texProperty.T.mask) / tex_size[1] if texProperty.T.mask > 0 else 0, + 0, + ) + + # Mirror + nodes["Get UV " + str(texIndex) + " F3D v3"].inputs[7].default_value = ( + 1 if texProperty.S.mirror else 0, + 1 if texProperty.T.mirror else 0, + 0, + ) + + # Shift + nodes["Get UV " + str(texIndex) + " F3D v3"].inputs[8].default_value = ( + texProperty.S.shift, + texProperty.T.shift, + 0, + ) + + # Scale + nodes["Get UV " + str(texIndex) + " F3D v3"].inputs[9].default_value = ( + scale[0] * uvBasisScale[0], + scale[1] * uvBasisScale[1], + 0, + ) + + # Normalized Half Pixel + nodes["Get UV " + str(texIndex) + " F3D v3"].inputs[10].default_value = ( + 1 / (2 * tex_size[0]), + 1 / (2 * tex_size[1]), + 0, + ) + + +def update_tex_values_index( + self, + context, + texProperty, + texNodeName, + uvNodeName, + isTexGen, + uvBasisScale, + scale, + texIndex, +): + nodes = self.node_tree.nodes + + nodes[texNodeName].image = texProperty.tex + if nodes[texNodeName].image is not None or texProperty.use_tex_reference: + if nodes[texNodeName].image is not None: + tex_size = nodes[texNodeName].image.size + else: + tex_size = texProperty.tex_reference_size + if tex_size[0] > 0 and tex_size[1] > 0: + if self.mat_ver == 1: + tex_x = ( + nodes[uvNodeName] + .node_tree.nodes["Create Tex Coord"] + .node_tree.nodes + ) + tex_y = ( + nodes[uvNodeName] + .node_tree.nodes["Create Tex Coord.001"] + .node_tree.nodes + ) + imageWidthNode = nodes[uvNodeName].node_tree.nodes["Image Width Factor"] + imageHeightNode = nodes[uvNodeName].node_tree.nodes[ + "Image Height Factor" + ] + # 1024 == 2^16 / 2^6 (converting 0.16 to 10.5 fixed point) + imageWidthNode.outputs[0].default_value = 1024 / tex_size[0] + imageHeightNode.outputs[0].default_value = 1024 / tex_size[1] + + update_tex_values_field( + self, + texProperty.S, + tex_x, + tex_size[0], + self.rdp_settings.g_tex_gen or self.rdp_settings.g_tex_gen_linear, + uvBasisScale[0], + scale[0], + texProperty.autoprop, + False, + texIndex, + "S", + ) + update_tex_values_field( + self, + texProperty.T, + tex_y, + tex_size[1], + self.rdp_settings.g_tex_gen or self.rdp_settings.g_tex_gen_linear, + uvBasisScale[1], + scale[1], + texProperty.autoprop, + True, + texIndex, + "T", + ) + elif self.mat_ver == 2: + tex_x = nodes + tex_y = nodes + imageFactorNode = nodes["Tex " + str(texIndex) + " Image Factor"] + imageFactorNode.inputs[0].default_value = 1024 / tex_size[0] + imageFactorNode.inputs[1].default_value = 1024 / tex_size[1] + + update_tex_values_field_v2( + self, + texProperty.S, + tex_size, + uvBasisScale, + scale, + texProperty.autoprop, + texIndex, + "S", + ) + update_tex_values_field_v2( + self, + texProperty.T, + tex_size, + uvBasisScale, + scale, + texProperty.autoprop, + texIndex, + "T", + ) + elif self.mat_ver >= 3: + if self.mat_ver > 3: + f3dMat = self.f3d_mat + else: + f3dMat = self + if self.mat_ver == 3 or hasNodeGraph(self): + update_tex_values_field_v3( + self, texProperty, tex_size, uvBasisScale, scale, texIndex + ) + # nodes[texNodeName].interpolation = "Closest" + nodes[texNodeName].interpolation = ( + "Closest" + if f3dMat.rdp_settings.g_mdsft_text_filt == "G_TF_POINT" + else "Linear" + ) + else: + if texProperty.autoprop: + setAutoProp(texProperty.S, tex_size[0]) + setAutoProp(texProperty.T, tex_size[1]) + else: + print( + "Error: Unhandled material version " + + str(self.mat_ver) + + " for texture properties." + ) + + texFormat = texProperty.tex_format + ciFormat = texProperty.ci_format + if self.mat_ver >= 3: # No nodes, only sockets (0 = color, 1 = alpha) + if self.mat_ver == 3 or hasNodeGraph(self): + getTextureColorName = ( + "Get Texture Color" + if texIndex == 0 + else "Get Texture Color.001" + ) + # Is Greyscale + nodes[getTextureColorName].inputs[2].default_value = ( + 1 + if ( + texFormat[0] == "I" + or (texFormat[:2] == "CI" and ciFormat[0] == "I") + ) + else 0 + ) + + # Has Alpha + nodes[getTextureColorName].inputs[3].default_value = ( + 1 + if ( + "A" in texFormat + or (texFormat[:2] == "CI" and "A" in ciFormat) + ) + else 0 + ) + + # Is Intensity + nodes[getTextureColorName].inputs[4].default_value = ( + 1 if (texFormat == "I4" or texFormat == "I8") else 0 + ) + + else: + nodes[texNodeName + " Is Greyscale"].outputs[0].default_value = ( + 1 + if ( + texFormat[0] == "I" + or (texFormat[:2] == "CI" and ciFormat[0] == "I") + ) + else 0 + ) + nodes[texNodeName + " Has Alpha"].outputs[0].default_value = ( + 1 + if ("A" in texFormat or (texFormat[:2] == "CI" and "A" in ciFormat)) + else 0 + ) + + if texNodeName + " Is Intensity" in nodes: + nodes[texNodeName + " Is Intensity"].outputs[0].default_value = ( + 1 if (texFormat == "I4" or texFormat == "I8") else 0 + ) + else: + print("Using old node graph, cannot set intensity as alpha.") + def update_tex_values_and_formats(self, context): - if hasattr(context, 'material') and context.material is not None: - if context.material.mat_ver > 3: - material = context.material.f3d_mat - useLargeTextures = material.use_large_textures - isMultiTexture = "multitexture" in material.presetName.lower() - else: - material = context.material - useLargeTextures = False - isMultiTexture = False - - if context.material.f3d_update_flag: - return - context.material.f3d_update_flag = True - if material.tex0 == self and material.tex0.tex is not None: - if isMultiTexture: - material.tex0.tex_format = 'RGBA16' - else: - material.tex0.tex_format = getOptimalFormat(material.tex0.tex, useLargeTextures) - if material.tex1 == self and material.tex1.tex is not None: - if isMultiTexture: - material.tex1.tex_format = 'RGBA16' - else: - material.tex1.tex_format = getOptimalFormat(material.tex1.tex, useLargeTextures) - context.material.f3d_update_flag = False - - update_tex_values(context.material, context) - else: - if self.tex is not None: - self.tex_format = getOptimalFormat(self.tex, False) + if hasattr(context, "material") and context.material is not None: + if context.material.mat_ver > 3: + material = context.material.f3d_mat + useLargeTextures = material.use_large_textures + isMultiTexture = "multitexture" in material.presetName.lower() + else: + material = context.material + useLargeTextures = False + isMultiTexture = False + + if context.material.f3d_update_flag: + return + context.material.f3d_update_flag = True + if material.tex0 == self and material.tex0.tex is not None: + if isMultiTexture: + material.tex0.tex_format = "RGBA16" + else: + material.tex0.tex_format = getOptimalFormat( + material.tex0.tex, useLargeTextures + ) + if material.tex1 == self and material.tex1.tex is not None: + if isMultiTexture: + material.tex1.tex_format = "RGBA16" + else: + material.tex1.tex_format = getOptimalFormat( + material.tex1.tex, useLargeTextures + ) + context.material.f3d_update_flag = False + + update_tex_values(context.material, context) + else: + if self.tex is not None: + self.tex_format = getOptimalFormat(self.tex, False) + def update_tex_values(self, context): - if hasattr(context, 'material') and context.material is not None: - material = context.material # Handles case of texture property groups - if material.f3d_update_flag: - return - material.f3d_update_flag = True - update_tex_values_manual(material, context) - material.f3d_update_flag = False + if hasattr(context, "material") and context.material is not None: + material = context.material # Handles case of texture property groups + if material.f3d_update_flag: + return + material.f3d_update_flag = True + update_tex_values_manual(material, context) + material.f3d_update_flag = False + def update_tex_values_manual(self, context): - if self.mat_ver > 3: - material = self.f3d_mat - else: - material = self - isTexGen = material.rdp_settings.g_tex_gen or material.rdp_settings.g_tex_gen_linear - - if material.scale_autoprop: - tex_size = None - if material.tex0.tex is not None and material.tex1.tex is not None: - tex_size = material.tex0.tex.size if material.uv_basis == 'TEXEL0' else \ - material.tex1.tex.size - elif material.tex0.tex is not None: - tex_size = material.tex0.tex.size - elif material.tex1.tex is not None: - tex_size = material.tex1.tex.size - - if isTexGen and tex_size is not None: - material.tex_scale = ((tex_size[0] - 1) / 1024, - (tex_size[1] - 1) / 1024) - else: - material.tex_scale = (1,1) - - - useDict = all_combiner_uses(material) - - if useDict['Texture 0'] and material.tex0.tex is not None and \ - useDict['Texture 1'] and material.tex1.tex is not None and\ - material.tex0.tex.size[0] > 0 and material.tex0.tex.size[1] > 0 and\ - material.tex1.tex.size[0] > 0 and material.tex1.tex.size[1] > 0: - if material.uv_basis == 'TEXEL0': - uvBasisScale0 = (1,1) - uvBasisScale1 = (material.tex0.tex.size[0] / material.tex1.tex.size[0], - material.tex0.tex.size[1] / material.tex1.tex.size[1]) - else: - uvBasisScale1 = (1,1) - uvBasisScale0 = (material.tex1.tex.size[0] / material.tex0.tex.size[0], - material.tex1.tex.size[1] / material.tex0.tex.size[1]) - else: - uvBasisScale0 = (1,1) - uvBasisScale1 = (1,1) - - update_tex_values_index(self, context, material.tex0, 'Texture 0', - 'Get UV', isTexGen, uvBasisScale0, material.tex_scale, 0) - update_tex_values_index(self, context, material.tex1, 'Texture 1', - 'Get UV.001', isTexGen, uvBasisScale1, material.tex_scale, 1) + if self.mat_ver > 3: + material = self.f3d_mat + else: + material = self + isTexGen = material.rdp_settings.g_tex_gen or material.rdp_settings.g_tex_gen_linear + + if material.scale_autoprop: + tex_size = None + if material.tex0.tex is not None and material.tex1.tex is not None: + tex_size = ( + material.tex0.tex.size + if material.uv_basis == "TEXEL0" + else material.tex1.tex.size + ) + elif material.tex0.tex is not None: + tex_size = material.tex0.tex.size + elif material.tex1.tex is not None: + tex_size = material.tex1.tex.size + + if isTexGen and tex_size is not None: + material.tex_scale = ((tex_size[0] - 1) / 1024, (tex_size[1] - 1) / 1024) + else: + material.tex_scale = (1, 1) + + useDict = all_combiner_uses(material) + + if ( + useDict["Texture 0"] + and material.tex0.tex is not None + and useDict["Texture 1"] + and material.tex1.tex is not None + and material.tex0.tex.size[0] > 0 + and material.tex0.tex.size[1] > 0 + and material.tex1.tex.size[0] > 0 + and material.tex1.tex.size[1] > 0 + ): + if material.uv_basis == "TEXEL0": + uvBasisScale0 = (1, 1) + uvBasisScale1 = ( + material.tex0.tex.size[0] / material.tex1.tex.size[0], + material.tex0.tex.size[1] / material.tex1.tex.size[1], + ) + else: + uvBasisScale1 = (1, 1) + uvBasisScale0 = ( + material.tex1.tex.size[0] / material.tex0.tex.size[0], + material.tex1.tex.size[1] / material.tex0.tex.size[1], + ) + else: + uvBasisScale0 = (1, 1) + uvBasisScale1 = (1, 1) + + update_tex_values_index( + self, + context, + material.tex0, + "Texture 0", + "Get UV", + isTexGen, + uvBasisScale0, + material.tex_scale, + 0, + ) + update_tex_values_index( + self, + context, + material.tex1, + "Texture 1", + "Get UV.001", + isTexGen, + uvBasisScale1, + material.tex_scale, + 1, + ) + def getMaterialScrollDimensions(material): - useDict = all_combiner_uses(material) - - if useDict['Texture 0'] and material.tex0.tex is not None and \ - useDict['Texture 1'] and material.tex1.tex is not None and\ - material.tex0.tex.size[0] > 0 and material.tex0.tex.size[1] > 0 and\ - material.tex1.tex.size[0] > 0 and material.tex1.tex.size[1] > 0: - if material.uv_basis == 'TEXEL0': - return material.tex0.tex.size - else: - return material.tex1.tex.size - elif useDict['Texture 1'] and material.tex1.tex is not None and\ - material.tex1.tex.size[0] > 0 and material.tex1.tex.size[1] > 0: - return material.tex1.tex.size - elif useDict['Texture 0'] and material.tex0.tex is not None and\ - material.tex0.tex.size[0] > 0 and material.tex0.tex.size[1] > 0: - return material.tex0.tex.size - else: - return [32, 32] + useDict = all_combiner_uses(material) + + if ( + useDict["Texture 0"] + and material.tex0.tex is not None + and useDict["Texture 1"] + and material.tex1.tex is not None + and material.tex0.tex.size[0] > 0 + and material.tex0.tex.size[1] > 0 + and material.tex1.tex.size[0] > 0 + and material.tex1.tex.size[1] > 0 + ): + if material.uv_basis == "TEXEL0": + return material.tex0.tex.size + else: + return material.tex1.tex.size + elif ( + useDict["Texture 1"] + and material.tex1.tex is not None + and material.tex1.tex.size[0] > 0 + and material.tex1.tex.size[1] > 0 + ): + return material.tex1.tex.size + elif ( + useDict["Texture 0"] + and material.tex0.tex is not None + and material.tex0.tex.size[0] > 0 + and material.tex0.tex.size[1] > 0 + ): + return material.tex0.tex.size + else: + return [32, 32] + def update_preset(self, context): - if hasattr(context, 'material_slot') and context.material_slot is not None: - material = context.material_slot.material - if material.mat_ver < 4 and material.f3d_preset != 'Custom': - materialSettings = materialPresetDict[material.f3d_preset] - materialSettings.applyToMaterial(material, False, update_node_values_of_material, bpy.context) + if hasattr(context, "material_slot") and context.material_slot is not None: + material = context.material_slot.material + if material.mat_ver < 4 and material.f3d_preset != "Custom": + materialSettings = materialPresetDict[material.f3d_preset] + materialSettings.applyToMaterial( + material, False, update_node_values_of_material, bpy.context + ) + def update_preset_manual(material, context): - if material.mat_ver < 4 and material.f3d_preset != 'Custom': - materialSettings = materialPresetDict[material.f3d_preset] - materialSettings.applyToMaterial(material, False, update_node_values_of_material, bpy.context) + if material.mat_ver < 4 and material.f3d_preset != "Custom": + materialSettings = materialPresetDict[material.f3d_preset] + materialSettings.applyToMaterial( + material, False, update_node_values_of_material, bpy.context + ) + + if material.mat_ver > 3: + if hasNodeGraph(material): + update_node_values_of_material(material, context) + update_tex_values_manual(material, context) - if material.mat_ver > 3: - if hasNodeGraph(material): - update_node_values_of_material(material, context) - update_tex_values_manual(material, context) def update_preset_manual_v4(material, preset): - override = bpy.context.copy() - override['material'] = material - if preset == 'Shaded Solid': - preset = 'sm64_shaded_solid' - if preset == 'Shaded Texture': - preset = "sm64_shaded_texture" - if preset.lower() != "custom": - material.f3d_update_flag = True - bpy.ops.script.execute_preset(override, - filepath=findF3DPresetPath(preset), - menu_idname='MATERIAL_MT_f3d_presets') - material.f3d_update_flag = False + override = bpy.context.copy() + override["material"] = material + if preset == "Shaded Solid": + preset = "sm64_shaded_solid" + if preset == "Shaded Texture": + preset = "sm64_shaded_texture" + if preset.lower() != "custom": + material.f3d_update_flag = True + bpy.ops.script.execute_preset( + override, + filepath=findF3DPresetPath(preset), + menu_idname="MATERIAL_MT_f3d_presets", + ) + material.f3d_update_flag = False + def hasNodeGraph(material): - return "F3D v3" in material.node_tree.nodes - -def createF3DMat(obj, preset = 'Shaded Solid', index = None): - material = bpy.data.materials.new('f3d_material') - if obj is not None: - if index is None: - obj.data.materials.append(material) - if bpy.context.object is not None: - bpy.context.object.active_material_index = len(obj.material_slots) - 1 - else: - obj.material_slots[index].material = material - if bpy.context.object is not None: - bpy.context.object.active_material_index = index - - material.is_f3d = True - material.mat_ver = 4 - - if material.mat_ver > 3 and not bpy.context.scene.generateF3DNodeGraph: - material.use_nodes = True - material.blend_method = 'BLEND' - material.show_transparent_back = False - - # Remove default shader - node_tree = material.node_tree - nodes = material.node_tree.nodes - links = material.node_tree.links - bsdf = nodes.get('Principled BSDF') - material_output = nodes.get('Material Output') - - tex0Node = node_tree.nodes.new("ShaderNodeTexImage") - tex0Node.name = "Texture 0" - tex0Node.label = "Texture 0" - tex0Node.location = [-300, 300] - tex1Node = node_tree.nodes.new("ShaderNodeTexImage") - tex1Node.name = "Texture 1" - tex1Node.label = "Texture 1" - tex1Node.location = [-300, 50] - - links.new(bsdf.inputs["Base Color"], tex0Node.outputs["Color"]) - links.new(bsdf.inputs["Subsurface Color"], tex1Node.outputs["Color"]) - bsdf.inputs['Specular'].default_value = 0 - - update_preset_manual_v4(material, preset) - - return material - - material.use_nodes = True - material.blend_method = 'HASHED' - material.show_transparent_back = False - - # Remove default shader - node_tree = material.node_tree - nodes = material.node_tree.nodes - links = material.node_tree.links - nodes.remove(nodes.get('Principled BSDF')) - material_output = nodes.get('Material Output') - - x = 0 - y = 0 - - uvDict = {} - #texGenNode, x, y = addNodeAt(node_tree, 'ShaderNodeValue', - # 'Texture Gen', x, y, 'Texture Gen', uvDict) - #texGenLinearNode, x, y = addNodeAt(node_tree, 'ShaderNodeValue', - # 'Texture Gen Linear', x, y, 'Texture Gen Linear', uvDict) - - # Create UV nodes - uvNode0, x, y = createUVInputsAndGroup(node_tree, 0, x, y) - uvNode1, x, y = createUVInputsAndGroup(node_tree, 1, x, y) - - x += 600 - y = 0 - x,y, primNode = addColorWithAlphaNode("Primitive Color", x, y, node_tree) - x,y, envNode = addColorWithAlphaNode("Environment Color", x, y, node_tree) - nodeDict, x, y = addNodeListAt(node_tree, { - 'Texture 0': 'ShaderNodeTexImage', - 'Texture 1': 'ShaderNodeTexImage', - #'Primitive Color': 'ShaderNodeRGB', - #'Shade Color': 'ShaderNodeBsdfDiffuse', - #'Environment Color': 'ShaderNodeRGB', - 'Chroma Key Center': 'ShaderNodeRGB', - 'Chroma Key Scale': 'ShaderNodeRGB', - #'Primitive Alpha': 'ShaderNodeValue', - #'Shade Alpha': 'ShaderNodeValue', - #'Environment Alpha' : 'ShaderNodeValue', - 'LOD Fraction' : 'ShaderNodeValue', - 'Primitive LOD Fraction' : 'ShaderNodeValue', - 'Noise' : 'ShaderNodeTexNoise', - 'YUV Convert K4' : 'ShaderNodeValue', - 'YUV Convert K5' : 'ShaderNodeValue', - '1' : 'ShaderNodeValue', - '0' : 'ShaderNodeValue', - }, x, y) - - # Set noise scale - nodeDict["Noise"].inputs[2].default_value = 10 - - createGroupLink(node_tree, nodeDict['Texture 0'].inputs[0], - uvNode0.outputs[0], 'NodeSocketVector', 'UV0Output') - createGroupLink(node_tree, nodeDict['Texture 1'].inputs[0], - uvNode1.outputs[0], 'NodeSocketVector', 'UV1Output') - - - # Note: Because of modulo operations on UVs, aliasing occurs - # due to mipmapping when 'Linear' filtering is used. - # When using 'Cubic', clamping doesn't work correctly either. - # Thus 'Closest' is used instead. - nodes['Texture 0'].interpolation = 'Linear' - nodes['Texture 1'].interpolation = 'Linear' - - # Create texture format nodes - x += 300 - y = 0 - colorNode0, x, y = createTextureInputsAndGroup(node_tree, 0, x, y) - colorNode1, x, y = createTextureInputsAndGroup(node_tree, 1, x, y) - nodeDict["Texture 0"] = colorNode0 - nodeDict["Texture 1"] = colorNode1 - - # Create cases A-D - #x += 300 - #y = 0 - #caseNodeDict1, x, y = addNodeListAt(node_tree, - # caseTemplateDict2, x, y, 1) - # - #caseNodeDict2, x, y = addNodeListAt(node_tree, - # caseTemplateDict2, x, y, 2) - - # create shade node - x += 300 - y = 0 - #lightingNode, x, y = addNodeAt(node_tree, 'ShaderNodeValue', - # 'Lighting', x, y) - #shadingNode, x, y = addNodeAt(node_tree, 'ShaderNodeValue', - # 'Shading', x, y) - #ambientNode, x, y = addNodeAt(node_tree, 'ShaderNodeRGB', - # 'Ambient Color', x, y) - nodeDict['Shade Color'] = createShadeNode(node_tree, [x, y]) - - #x += 300 - #y = 0 - #otherDict = {} - #cycleTypeNode, x, y = \ - # addNodeAt(node_tree, 'ShaderNodeValue', 'Cycle Type', x, y, 'Cycle Type', otherDict) - #cullFront, x, y = \ - # addNodeAt(node_tree, 'ShaderNodeValue', 'Cull Front', x, y, "Cull Front", otherDict) - #cullBack, x, y = \ - # addNodeAt(node_tree, 'ShaderNodeValue', 'Cull Back', x, y, 'Cull Back', otherDict) - - x += 300 - y = 0 - # Create combiner nodes - # caseNodeDict is the A-D for color and alpha - # nodeDict is all sources - # otherDict is other shader inputs - - combiner1 = createNodeCombiner(node_tree, 1) - combiner1.location = [x, y] - - combiner2 = createNodeCombiner(node_tree, 2) - combiner2.location = [x, y-400] - - x += 300 - y = 0 - finalNode, x, y = createNodeF3D(node_tree, [x, y]) - - links.new(finalNode.inputs[0], combiner1.outputs[0]) - links.new(finalNode.inputs[1], combiner1.outputs[1]) - links.new(finalNode.inputs[2], combiner2.outputs[0]) - links.new(finalNode.inputs[3], combiner2.outputs[1]) - - # link new node output to material_output input - links.new(material_output.inputs[0], finalNode.outputs[0]) - - x += 300 - y = 0 - material_output.location = [x, y] - - #update_node_values_directly(material, bpy.context) - #update_tex_values(material, bpy.context) - - if material.mat_ver > 3: - update_preset_manual_v4(material, preset) - else: - # This won't update because material is not in context - if preset in [enumValue[0] for enumValue in enumMaterialPresets]: - material.f3d_preset = preset - else: - raise PluginError('Enum \'' + preset + '\' not found in material preset enum list.') - # That's why we force update - update_preset_manual(material, bpy.context) - #materialPresetDict['Shaded Texture'].applyToMaterial(material) - - return material + return "F3D v3" in material.node_tree.nodes + + +def createF3DMat(obj, preset="Shaded Solid", index=None): + material = bpy.data.materials.new("f3d_material") + if obj is not None: + if index is None: + obj.data.materials.append(material) + if bpy.context.object is not None: + bpy.context.object.active_material_index = len(obj.material_slots) - 1 + else: + obj.material_slots[index].material = material + if bpy.context.object is not None: + bpy.context.object.active_material_index = index + + material.is_f3d = True + material.mat_ver = 4 + + if material.mat_ver > 3 and not bpy.context.scene.generateF3DNodeGraph: + material.use_nodes = True + material.blend_method = "BLEND" + material.show_transparent_back = False + + # Remove default shader + node_tree = material.node_tree + nodes = material.node_tree.nodes + links = material.node_tree.links + bsdf = nodes.get("Principled BSDF") + material_output = nodes.get("Material Output") + + tex0Node = node_tree.nodes.new("ShaderNodeTexImage") + tex0Node.name = "Texture 0" + tex0Node.label = "Texture 0" + tex0Node.location = [-300, 300] + tex1Node = node_tree.nodes.new("ShaderNodeTexImage") + tex1Node.name = "Texture 1" + tex1Node.label = "Texture 1" + tex1Node.location = [-300, 50] + + links.new(bsdf.inputs["Base Color"], tex0Node.outputs["Color"]) + links.new(bsdf.inputs["Subsurface Color"], tex1Node.outputs["Color"]) + bsdf.inputs["Specular"].default_value = 0 + + update_preset_manual_v4(material, preset) + + return material + + material.use_nodes = True + material.blend_method = "HASHED" + material.show_transparent_back = False + + # Remove default shader + node_tree = material.node_tree + nodes = material.node_tree.nodes + links = material.node_tree.links + nodes.remove(nodes.get("Principled BSDF")) + material_output = nodes.get("Material Output") + + x = 0 + y = 0 + + uvDict = {} + # texGenNode, x, y = addNodeAt(node_tree, 'ShaderNodeValue', + # 'Texture Gen', x, y, 'Texture Gen', uvDict) + # texGenLinearNode, x, y = addNodeAt(node_tree, 'ShaderNodeValue', + # 'Texture Gen Linear', x, y, 'Texture Gen Linear', uvDict) + + # Create UV nodes + uvNode0, x, y = createUVInputsAndGroup(node_tree, 0, x, y) + uvNode1, x, y = createUVInputsAndGroup(node_tree, 1, x, y) + + x += 600 + y = 0 + x, y, primNode = addColorWithAlphaNode("Primitive Color", x, y, node_tree) + x, y, envNode = addColorWithAlphaNode("Environment Color", x, y, node_tree) + nodeDict, x, y = addNodeListAt( + node_tree, + { + "Texture 0": "ShaderNodeTexImage", + "Texture 1": "ShaderNodeTexImage", + #'Primitive Color': 'ShaderNodeRGB', + #'Shade Color': 'ShaderNodeBsdfDiffuse', + #'Environment Color': 'ShaderNodeRGB', + "Chroma Key Center": "ShaderNodeRGB", + "Chroma Key Scale": "ShaderNodeRGB", + #'Primitive Alpha': 'ShaderNodeValue', + #'Shade Alpha': 'ShaderNodeValue', + #'Environment Alpha' : 'ShaderNodeValue', + "LOD Fraction": "ShaderNodeValue", + "Primitive LOD Fraction": "ShaderNodeValue", + "Noise": "ShaderNodeTexNoise", + "YUV Convert K4": "ShaderNodeValue", + "YUV Convert K5": "ShaderNodeValue", + "1": "ShaderNodeValue", + "0": "ShaderNodeValue", + }, + x, + y, + ) + + # Set noise scale + nodeDict["Noise"].inputs[2].default_value = 10 + + createGroupLink( + node_tree, + nodeDict["Texture 0"].inputs[0], + uvNode0.outputs[0], + "NodeSocketVector", + "UV0Output", + ) + createGroupLink( + node_tree, + nodeDict["Texture 1"].inputs[0], + uvNode1.outputs[0], + "NodeSocketVector", + "UV1Output", + ) + + # Note: Because of modulo operations on UVs, aliasing occurs + # due to mipmapping when 'Linear' filtering is used. + # When using 'Cubic', clamping doesn't work correctly either. + # Thus 'Closest' is used instead. + nodes["Texture 0"].interpolation = "Linear" + nodes["Texture 1"].interpolation = "Linear" + + # Create texture format nodes + x += 300 + y = 0 + colorNode0, x, y = createTextureInputsAndGroup(node_tree, 0, x, y) + colorNode1, x, y = createTextureInputsAndGroup(node_tree, 1, x, y) + nodeDict["Texture 0"] = colorNode0 + nodeDict["Texture 1"] = colorNode1 + + # Create cases A-D + # x += 300 + # y = 0 + # caseNodeDict1, x, y = addNodeListAt(node_tree, + # caseTemplateDict2, x, y, 1) + # + # caseNodeDict2, x, y = addNodeListAt(node_tree, + # caseTemplateDict2, x, y, 2) + + # create shade node + x += 300 + y = 0 + # lightingNode, x, y = addNodeAt(node_tree, 'ShaderNodeValue', + # 'Lighting', x, y) + # shadingNode, x, y = addNodeAt(node_tree, 'ShaderNodeValue', + # 'Shading', x, y) + # ambientNode, x, y = addNodeAt(node_tree, 'ShaderNodeRGB', + # 'Ambient Color', x, y) + nodeDict["Shade Color"] = createShadeNode(node_tree, [x, y]) + + # x += 300 + # y = 0 + # otherDict = {} + # cycleTypeNode, x, y = \ + # addNodeAt(node_tree, 'ShaderNodeValue', 'Cycle Type', x, y, 'Cycle Type', otherDict) + # cullFront, x, y = \ + # addNodeAt(node_tree, 'ShaderNodeValue', 'Cull Front', x, y, "Cull Front", otherDict) + # cullBack, x, y = \ + # addNodeAt(node_tree, 'ShaderNodeValue', 'Cull Back', x, y, 'Cull Back', otherDict) + + x += 300 + y = 0 + # Create combiner nodes + # caseNodeDict is the A-D for color and alpha + # nodeDict is all sources + # otherDict is other shader inputs + + combiner1 = createNodeCombiner(node_tree, 1) + combiner1.location = [x, y] + + combiner2 = createNodeCombiner(node_tree, 2) + combiner2.location = [x, y - 400] + + x += 300 + y = 0 + finalNode, x, y = createNodeF3D(node_tree, [x, y]) + + links.new(finalNode.inputs[0], combiner1.outputs[0]) + links.new(finalNode.inputs[1], combiner1.outputs[1]) + links.new(finalNode.inputs[2], combiner2.outputs[0]) + links.new(finalNode.inputs[3], combiner2.outputs[1]) + + # link new node output to material_output input + links.new(material_output.inputs[0], finalNode.outputs[0]) + + x += 300 + y = 0 + material_output.location = [x, y] + + # update_node_values_directly(material, bpy.context) + # update_tex_values(material, bpy.context) + + if material.mat_ver > 3: + update_preset_manual_v4(material, preset) + else: + # This won't update because material is not in context + if preset in [enumValue[0] for enumValue in enumMaterialPresets]: + material.f3d_preset = preset + else: + raise PluginError( + "Enum '" + preset + "' not found in material preset enum list." + ) + # That's why we force update + update_preset_manual(material, bpy.context) + # materialPresetDict['Shaded Texture'].applyToMaterial(material) + + return material + def reloadDefaultF3DPresets(): - presetNameToFilename = {} - for game, gamePresets in material_presets.items(): - for presetName, preset in gamePresets.items(): - presetNameToFilename[bpy.path.display_name(presetName)] = presetName - for material in bpy.data.materials: - if material.mat_ver > 3 and material.f3d_mat.presetName in presetNameToFilename: - update_preset_manual_v4(material, presetNameToFilename[material.f3d_mat.presetName]) + presetNameToFilename = {} + for game, gamePresets in material_presets.items(): + for presetName, preset in gamePresets.items(): + presetNameToFilename[bpy.path.display_name(presetName)] = presetName + for material in bpy.data.materials: + if material.mat_ver > 3 and material.f3d_mat.presetName in presetNameToFilename: + update_preset_manual_v4( + material, presetNameToFilename[material.f3d_mat.presetName] + ) + class CreateFast3DMaterial(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.create_f3d_mat' - bl_label = "Create Fast3D Material" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - obj = bpy.context.view_layer.objects.active - if obj is None: - self.report({'ERROR'}, 'No active object selected.') - else: - preset = getDefaultMaterialPreset("Shaded Solid") - createF3DMat(obj, preset) - self.report({'INFO'}, 'Created new Fast3D material.') - return {'FINISHED'} # must return a set + # set bl_ properties + bl_idname = "object.create_f3d_mat" + bl_label = "Create Fast3D Material" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + obj = bpy.context.view_layer.objects.active + if obj is None: + self.report({"ERROR"}, "No active object selected.") + else: + preset = getDefaultMaterialPreset("Shaded Solid") + createF3DMat(obj, preset) + self.report({"INFO"}, "Created new Fast3D material.") + return {"FINISHED"} # must return a set + class ReloadDefaultF3DPresets(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.reload_f3d_presets' - bl_label = "Reload Default Fast3D Presets" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - reloadDefaultF3DPresets() - self.report({'INFO'}, 'Success!') - return {'FINISHED'} # must return a set + # set bl_ properties + bl_idname = "object.reload_f3d_presets" + bl_label = "Reload Default Fast3D Presets" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + reloadDefaultF3DPresets() + self.report({"INFO"}, "Success!") + return {"FINISHED"} # must return a set + class TextureFieldProperty(bpy.types.PropertyGroup): - clamp : bpy.props.BoolProperty(name = 'Clamp', - update = update_tex_values) - mirror : bpy.props.BoolProperty(name = 'Mirror', - update = update_tex_values) - low : bpy.props.FloatProperty(name = 'Low', min = 0, max = 1023.75, - update = update_tex_values) - high : bpy.props.FloatProperty(name = 'High', min = 0, max = 1023.75, - update = update_tex_values) - mask : bpy.props.IntProperty(min = 0, max = 15, - update = update_tex_values, default = 5) - shift : bpy.props.IntProperty(min = -5, max = 10, - update = update_tex_values) + clamp: bpy.props.BoolProperty(name="Clamp", update=update_tex_values) + mirror: bpy.props.BoolProperty(name="Mirror", update=update_tex_values) + low: bpy.props.FloatProperty( + name="Low", min=0, max=1023.75, update=update_tex_values + ) + high: bpy.props.FloatProperty( + name="High", min=0, max=1023.75, update=update_tex_values + ) + mask: bpy.props.IntProperty(min=0, max=15, update=update_tex_values, default=5) + shift: bpy.props.IntProperty(min=-5, max=10, update=update_tex_values) + class SetTileSizeScrollProperty(bpy.types.PropertyGroup): - s : bpy.props.IntProperty(min = -4095, max = 4095, default = 0) - t : bpy.props.IntProperty(min = -4095, max = 4095, default = 0) - interval : bpy.props.IntProperty(min = 1, soft_max = 1000, default = 1) + s: bpy.props.IntProperty(min=-4095, max=4095, default=0) + t: bpy.props.IntProperty(min=-4095, max=4095, default=0) + interval: bpy.props.IntProperty(min=1, soft_max=1000, default=1) + class TextureProperty(bpy.types.PropertyGroup): - tex : bpy.props.PointerProperty(type = bpy.types.Image, name = 'Texture', update = update_tex_values_and_formats) - - tex_format : bpy.props.EnumProperty(name = 'Format', items = enumTexFormat, default = 'RGBA16', update = update_tex_values) - ci_format : bpy.props.EnumProperty(name = 'CI Format', items = enumCIFormat, default = 'RGBA16', update = update_tex_values) - S : bpy.props.PointerProperty(type = TextureFieldProperty) - T : bpy.props.PointerProperty(type = TextureFieldProperty) - - use_tex_reference: bpy.props.BoolProperty(name = "Use Texture Reference", default = False, update = update_tex_values) - tex_reference: bpy.props.StringProperty(name = "Texture Reference", default = '0x08000000') - tex_reference_size: bpy.props.IntVectorProperty(name = "Texture Reference Size", min = 1, size = 2, default = (32,32), update = update_tex_values) - pal_reference: bpy.props.StringProperty(name = "Palette Reference", default = '0x08000000') - pal_reference_size : bpy.props.IntProperty(name = "Texture Reference Size", min = 1, default = 16) - - menu : bpy.props.BoolProperty() - tex_set : bpy.props.BoolProperty(default = True, update = update_node_values) - autoprop : bpy.props.BoolProperty(name = 'Autoprop', update = update_tex_values, default = True) - save_large_texture : bpy.props.BoolProperty(name = "Save Large Texture As PNG", default = True) - tile_scroll : bpy.props.PointerProperty(type = SetTileSizeScrollProperty) - #autoprop : bpy.props.BoolProperty(name = 'Autoprop', update = on_tex_autoprop, default = True) + tex: bpy.props.PointerProperty( + type=bpy.types.Image, name="Texture", update=update_tex_values_and_formats + ) + + tex_format: bpy.props.EnumProperty( + name="Format", items=enumTexFormat, default="RGBA16", update=update_tex_values + ) + ci_format: bpy.props.EnumProperty( + name="CI Format", items=enumCIFormat, default="RGBA16", update=update_tex_values + ) + S: bpy.props.PointerProperty(type=TextureFieldProperty) + T: bpy.props.PointerProperty(type=TextureFieldProperty) + + use_tex_reference: bpy.props.BoolProperty( + name="Use Texture Reference", default=False, update=update_tex_values + ) + tex_reference: bpy.props.StringProperty( + name="Texture Reference", default="0x08000000" + ) + tex_reference_size: bpy.props.IntVectorProperty( + name="Texture Reference Size", + min=1, + size=2, + default=(32, 32), + update=update_tex_values, + ) + pal_reference: bpy.props.StringProperty( + name="Palette Reference", default="0x08000000" + ) + pal_reference_size: bpy.props.IntProperty( + name="Texture Reference Size", min=1, default=16 + ) + + menu: bpy.props.BoolProperty() + tex_set: bpy.props.BoolProperty(default=True, update=update_node_values) + autoprop: bpy.props.BoolProperty( + name="Autoprop", update=update_tex_values, default=True + ) + save_large_texture: bpy.props.BoolProperty( + name="Save Large Texture As PNG", default=True + ) + tile_scroll: bpy.props.PointerProperty(type=SetTileSizeScrollProperty) + # autoprop : bpy.props.BoolProperty(name = 'Autoprop', update = on_tex_autoprop, default = True) + def on_tex_autoprop(texProperty, context): - if texProperty.autoprop and texProperty.tex is not None: - tex_size = texProperty.tex.size - if tex_size[0] > 0 and tex_size[1] > 0: - setAutoProp(texProperty.S, tex_size[0]) - setAutoProp(texProperty.T, tex_size[1]) + if texProperty.autoprop and texProperty.tex is not None: + tex_size = texProperty.tex.size + if tex_size[0] > 0 and tex_size[1] > 0: + setAutoProp(texProperty.S, tex_size[0]) + setAutoProp(texProperty.T, tex_size[1]) + class CombinerProperty(bpy.types.PropertyGroup): - A : bpy.props.EnumProperty( - name = "A", description = "A", items = combiner_enums['Case A'], - default = 'TEXEL0', update = update_node_values) - - B : bpy.props.EnumProperty( - name = "B", description = "B", items = combiner_enums['Case B'], - default = '0', update = update_node_values) - - C : bpy.props.EnumProperty( - name = "C", description = "C", items = combiner_enums['Case C'], - default = 'SHADE', update = update_node_values) - - D : bpy.props.EnumProperty( - name = "D", description = "D", items = combiner_enums['Case D'], - default = '0', update = update_node_values) - - A_alpha : bpy.props.EnumProperty( - name = "A Alpha", description = "A Alpha", - items = combiner_enums['Case A Alpha'], - default = '0', update = update_node_values) - - B_alpha : bpy.props.EnumProperty( - name = "B Alpha", description = "B Alpha", - items = combiner_enums['Case B Alpha'], - default = '0', update = update_node_values) - - C_alpha : bpy.props.EnumProperty( - name = "C Alpha", description = "C Alpha", - items = combiner_enums['Case C Alpha'], - default = '0', update = update_node_values) - - D_alpha : bpy.props.EnumProperty( - name = "D Alpha", description = "D Alpha", - items = combiner_enums['Case D Alpha'], - default = 'ENVIRONMENT', update = update_node_values) + A: bpy.props.EnumProperty( + name="A", + description="A", + items=combiner_enums["Case A"], + default="TEXEL0", + update=update_node_values, + ) + + B: bpy.props.EnumProperty( + name="B", + description="B", + items=combiner_enums["Case B"], + default="0", + update=update_node_values, + ) + + C: bpy.props.EnumProperty( + name="C", + description="C", + items=combiner_enums["Case C"], + default="SHADE", + update=update_node_values, + ) + + D: bpy.props.EnumProperty( + name="D", + description="D", + items=combiner_enums["Case D"], + default="0", + update=update_node_values, + ) + + A_alpha: bpy.props.EnumProperty( + name="A Alpha", + description="A Alpha", + items=combiner_enums["Case A Alpha"], + default="0", + update=update_node_values, + ) + + B_alpha: bpy.props.EnumProperty( + name="B Alpha", + description="B Alpha", + items=combiner_enums["Case B Alpha"], + default="0", + update=update_node_values, + ) + + C_alpha: bpy.props.EnumProperty( + name="C Alpha", + description="C Alpha", + items=combiner_enums["Case C Alpha"], + default="0", + update=update_node_values, + ) + + D_alpha: bpy.props.EnumProperty( + name="D Alpha", + description="D Alpha", + items=combiner_enums["Case D Alpha"], + default="ENVIRONMENT", + update=update_node_values, + ) + class ProceduralAnimProperty(bpy.types.PropertyGroup): - speed : bpy.props.FloatProperty(name = 'Speed', default = 1) - amplitude : bpy.props.FloatProperty(name = 'Amplitude', default = 1) - frequency : bpy.props.FloatProperty(name = 'Frequency', default = 1) - #spaceFrequency : bpy.props.FloatVectorProperty(name = 'Space Frequency', - # size = 3, default = (0,0,0)) - spaceFrequency : bpy.props.FloatProperty(name = 'Space Frequency', - default = 0) - offset : bpy.props.FloatProperty(name = 'Offset', default = 0) - noiseAmplitude : bpy.props.FloatProperty(name = 'Amplitude', default = 1) - animate : bpy.props.BoolProperty() - animType : bpy.props.EnumProperty(name = 'Type', items = enumTexScroll) + speed: bpy.props.FloatProperty(name="Speed", default=1) + amplitude: bpy.props.FloatProperty(name="Amplitude", default=1) + frequency: bpy.props.FloatProperty(name="Frequency", default=1) + # spaceFrequency : bpy.props.FloatVectorProperty(name = 'Space Frequency', + # size = 3, default = (0,0,0)) + spaceFrequency: bpy.props.FloatProperty(name="Space Frequency", default=0) + offset: bpy.props.FloatProperty(name="Offset", default=0) + noiseAmplitude: bpy.props.FloatProperty(name="Amplitude", default=1) + animate: bpy.props.BoolProperty() + animType: bpy.props.EnumProperty(name="Type", items=enumTexScroll) + class ProcAnimVectorProperty(bpy.types.PropertyGroup): - x : bpy.props.PointerProperty(type = ProceduralAnimProperty) - y : bpy.props.PointerProperty(type = ProceduralAnimProperty) - z : bpy.props.PointerProperty(type = ProceduralAnimProperty) - pivot : bpy.props.FloatVectorProperty(size = 2, name = 'Pivot') - angularSpeed : bpy.props.FloatProperty(default = 1, name = 'Angular Speed') - menu : bpy.props.BoolProperty() + x: bpy.props.PointerProperty(type=ProceduralAnimProperty) + y: bpy.props.PointerProperty(type=ProceduralAnimProperty) + z: bpy.props.PointerProperty(type=ProceduralAnimProperty) + pivot: bpy.props.FloatVectorProperty(size=2, name="Pivot") + angularSpeed: bpy.props.FloatProperty(default=1, name="Angular Speed") + menu: bpy.props.BoolProperty() + class PrimDepthSettings(bpy.types.PropertyGroup): - z: bpy.props.IntProperty( - name="Prim Depth: Z", - default=0, - soft_min=-1, - soft_max=0x7fff, - description= - '''The value to use for z is the screen Z position of the object you are rendering. This is a value ranging from 0x0000 to 0x7fff, where 0x0000 usually corresponds to the near clipping plane and 0x7fff usually corresponds to the far clipping plane. You can use -1 to force Z to be at the far clipping plane.''' - ) - dz: bpy.props.IntProperty( - name="Prim Depth: Delta Z", - default=0, - soft_min=0, - soft_max=0x4000, - description= - '''The dz value should be set to 0. This value is used for antialiasing and objects drawn in decal render mode and must always be a power of 2 (0, 1, 2, 4, 8, ... 0x4000). If you are using decal mode and part of the decaled object is not being rendered correctly, try setting this to powers of 2. Otherwise use 0.''' - ) + z: bpy.props.IntProperty( + name="Prim Depth: Z", + default=0, + soft_min=-1, + soft_max=0x7FFF, + description="""The value to use for z is the screen Z position of the object you are rendering. This is a value ranging from 0x0000 to 0x7fff, where 0x0000 usually corresponds to the near clipping plane and 0x7fff usually corresponds to the far clipping plane. You can use -1 to force Z to be at the far clipping plane.""", + ) + dz: bpy.props.IntProperty( + name="Prim Depth: Delta Z", + default=0, + soft_min=0, + soft_max=0x4000, + description="""The dz value should be set to 0. This value is used for antialiasing and objects drawn in decal render mode and must always be a power of 2 (0, 1, 2, 4, 8, ... 0x4000). If you are using decal mode and part of the decaled object is not being rendered correctly, try setting this to powers of 2. Otherwise use 0.""", + ) + class RDPSettings(bpy.types.PropertyGroup): - g_zbuffer : bpy.props.BoolProperty(name = 'Z Buffer', default = True, - update = update_node_values) - g_shade : bpy.props.BoolProperty(name = 'Shading', default = True, - update = update_node_values) - #v1/2 difference - g_cull_front : bpy.props.BoolProperty(name = 'Cull Front', - update = update_node_values) - #v1/2 difference - g_cull_back : bpy.props.BoolProperty(name = 'Cull Back', default = True, - update = update_node_values) - g_fog : bpy.props.BoolProperty(name = 'Fog', - update = update_node_values) - g_lighting : bpy.props.BoolProperty(name = 'Lighting', default = True, - update = update_node_values) - g_tex_gen : bpy.props.BoolProperty(name = 'Texture UV Generate', - update = update_node_values) - g_tex_gen_linear : bpy.props.BoolProperty( - name = 'Texture UV Generate Linear', - update = update_node_values) - #v1/2 difference - g_shade_smooth : bpy.props.BoolProperty(name = 'Smooth Shading', - default = True, update = update_node_values) - # f3dlx2 only - g_clipping : bpy.props.BoolProperty(name = 'Clipping', - update = update_node_values) - - # upper half mode - # v2 only - g_mdsft_alpha_dither : bpy.props.EnumProperty( - name = 'Alpha Dither', items = enumAlphaDither, default = 'G_AD_NOISE', update = update_node_values) - # v2 only - g_mdsft_rgb_dither : bpy.props.EnumProperty( - name = 'RGB Dither', items = enumRGBDither, default = 'G_CD_MAGICSQ', update = update_node_values) - g_mdsft_combkey : bpy.props.EnumProperty( - name = 'Chroma Key', items = enumCombKey, default = 'G_CK_NONE', update = update_node_values) - g_mdsft_textconv : bpy.props.EnumProperty( - name = 'Texture Convert', items = enumTextConv, default = 'G_TC_FILT', update = update_node_values) - g_mdsft_text_filt : bpy.props.EnumProperty( - name = 'Texture Filter', items = enumTextFilt, default = 'G_TF_BILERP', - update = update_node_values_without_preset) - g_mdsft_textlut : bpy.props.EnumProperty( - name = 'Texture LUT', items = enumTextLUT, default = 'G_TT_NONE') - g_mdsft_textlod : bpy.props.EnumProperty( - name = 'Texture LOD', items = enumTextLOD, default = 'G_TL_TILE', update = update_node_values) - g_mdsft_textdetail : bpy.props.EnumProperty( - name = 'Texture Detail', items = enumTextDetail, default = 'G_TD_CLAMP', update = update_node_values) - g_mdsft_textpersp : bpy.props.EnumProperty( - name = 'Texture Perspective Correction', items = enumTextPersp, - default = 'G_TP_PERSP', update = update_node_values) - g_mdsft_cycletype : bpy.props.EnumProperty( - name = 'Cycle Type', items = enumCycleType, default = 'G_CYC_1CYCLE', - update = update_node_values) - # v1 only - g_mdsft_color_dither : bpy.props.EnumProperty( - name = 'Color Dither', items = enumColorDither, default = 'G_CD_ENABLE', update = update_node_values) - g_mdsft_pipeline : bpy.props.EnumProperty( - name = 'Pipeline Span Buffer Coherency', items = enumPipelineMode, - default = 'G_PM_1PRIMITIVE', update = update_node_values) - - # lower half mode - g_mdsft_alpha_compare : bpy.props.EnumProperty( - name = 'Alpha Compare', items = enumAlphaCompare, - default = 'G_AC_NONE', update = update_node_values) - g_mdsft_zsrcsel : bpy.props.EnumProperty( - name = 'Z Source Selection', items = enumDepthSource, - default = 'G_ZS_PIXEL', update = update_node_values) - - prim_depth : bpy.props.PointerProperty(type=PrimDepthSettings, name='Prim Depth Settings (gDPSetPrimDepth)', description='gDPSetPrimDepth') - - clip_ratio : bpy.props.IntProperty(default = 1, - min = 1, max = 2**15 - 1, update = update_node_values) - - # cycle independent - set_rendermode : bpy.props.BoolProperty(default = False, update = update_node_values) - rendermode_advanced_enabled : bpy.props.BoolProperty(default = False, update = update_node_values) - rendermode_preset_cycle_1 : bpy.props.EnumProperty(items = enumRenderModesCycle1, - default = 'G_RM_AA_ZB_OPA_SURF', name = 'Render Mode Cycle 1', update = update_node_values) - rendermode_preset_cycle_2 : bpy.props.EnumProperty(items = enumRenderModesCycle2, - default = 'G_RM_AA_ZB_OPA_SURF2', name = 'Render Mode Cycle 2', update = update_node_values) - aa_en : bpy.props.BoolProperty(update = update_node_values) - z_cmp : bpy.props.BoolProperty(update = update_node_values) - z_upd : bpy.props.BoolProperty(update = update_node_values) - im_rd : bpy.props.BoolProperty(update = update_node_values) - clr_on_cvg : bpy.props.BoolProperty(update = update_node_values) - cvg_dst : bpy.props.EnumProperty( - name = 'Coverage Destination', items = enumCoverage, - update = update_node_values) - zmode : bpy.props.EnumProperty( - name = 'Z Mode', items = enumZMode, update = update_node_values) - cvg_x_alpha : bpy.props.BoolProperty(update = update_node_values) - alpha_cvg_sel : bpy.props.BoolProperty(update = update_node_values) - force_bl : bpy.props.BoolProperty(update = update_node_values) - - # cycle dependent - (P * A + M - B) / (A + B) - blend_p1 : bpy.props.EnumProperty( - name = 'Color Source 1', items = enumBlendColor, update = update_node_values) - blend_p2 : bpy.props.EnumProperty( - name = 'Color Source 1', items = enumBlendColor, update = update_node_values) - blend_m1 : bpy.props.EnumProperty( - name = 'Color Source 2', items = enumBlendColor, update = update_node_values) - blend_m2 : bpy.props.EnumProperty( - name = 'Color Source 2', items = enumBlendColor, update = update_node_values) - blend_a1 : bpy.props.EnumProperty( - name = 'Alpha Source', items = enumBlendAlpha, update = update_node_values) - blend_a2 : bpy.props.EnumProperty( - name = 'Alpha Source', items = enumBlendAlpha, update = update_node_values) - blend_b1 : bpy.props.EnumProperty( - name = 'Alpha Mix', items = enumBlendMix, update = update_node_values) - blend_b2 : bpy.props.EnumProperty( - name = 'Alpha Mix', items = enumBlendMix, update = update_node_values) + g_zbuffer: bpy.props.BoolProperty( + name="Z Buffer", default=True, update=update_node_values + ) + g_shade: bpy.props.BoolProperty( + name="Shading", default=True, update=update_node_values + ) + # v1/2 difference + g_cull_front: bpy.props.BoolProperty(name="Cull Front", update=update_node_values) + # v1/2 difference + g_cull_back: bpy.props.BoolProperty( + name="Cull Back", default=True, update=update_node_values + ) + g_fog: bpy.props.BoolProperty(name="Fog", update=update_node_values) + g_lighting: bpy.props.BoolProperty( + name="Lighting", default=True, update=update_node_values + ) + g_tex_gen: bpy.props.BoolProperty( + name="Texture UV Generate", update=update_node_values + ) + g_tex_gen_linear: bpy.props.BoolProperty( + name="Texture UV Generate Linear", update=update_node_values + ) + # v1/2 difference + g_shade_smooth: bpy.props.BoolProperty( + name="Smooth Shading", default=True, update=update_node_values + ) + # f3dlx2 only + g_clipping: bpy.props.BoolProperty(name="Clipping", update=update_node_values) + + # upper half mode + # v2 only + g_mdsft_alpha_dither: bpy.props.EnumProperty( + name="Alpha Dither", + items=enumAlphaDither, + default="G_AD_NOISE", + update=update_node_values, + ) + # v2 only + g_mdsft_rgb_dither: bpy.props.EnumProperty( + name="RGB Dither", + items=enumRGBDither, + default="G_CD_MAGICSQ", + update=update_node_values, + ) + g_mdsft_combkey: bpy.props.EnumProperty( + name="Chroma Key", + items=enumCombKey, + default="G_CK_NONE", + update=update_node_values, + ) + g_mdsft_textconv: bpy.props.EnumProperty( + name="Texture Convert", + items=enumTextConv, + default="G_TC_FILT", + update=update_node_values, + ) + g_mdsft_text_filt: bpy.props.EnumProperty( + name="Texture Filter", + items=enumTextFilt, + default="G_TF_BILERP", + update=update_node_values_without_preset, + ) + g_mdsft_textlut: bpy.props.EnumProperty( + name="Texture LUT", items=enumTextLUT, default="G_TT_NONE" + ) + g_mdsft_textlod: bpy.props.EnumProperty( + name="Texture LOD", + items=enumTextLOD, + default="G_TL_TILE", + update=update_node_values, + ) + g_mdsft_textdetail: bpy.props.EnumProperty( + name="Texture Detail", + items=enumTextDetail, + default="G_TD_CLAMP", + update=update_node_values, + ) + g_mdsft_textpersp: bpy.props.EnumProperty( + name="Texture Perspective Correction", + items=enumTextPersp, + default="G_TP_PERSP", + update=update_node_values, + ) + g_mdsft_cycletype: bpy.props.EnumProperty( + name="Cycle Type", + items=enumCycleType, + default="G_CYC_1CYCLE", + update=update_node_values, + ) + # v1 only + g_mdsft_color_dither: bpy.props.EnumProperty( + name="Color Dither", + items=enumColorDither, + default="G_CD_ENABLE", + update=update_node_values, + ) + g_mdsft_pipeline: bpy.props.EnumProperty( + name="Pipeline Span Buffer Coherency", + items=enumPipelineMode, + default="G_PM_1PRIMITIVE", + update=update_node_values, + ) + + # lower half mode + g_mdsft_alpha_compare: bpy.props.EnumProperty( + name="Alpha Compare", + items=enumAlphaCompare, + default="G_AC_NONE", + update=update_node_values, + ) + g_mdsft_zsrcsel: bpy.props.EnumProperty( + name="Z Source Selection", + items=enumDepthSource, + default="G_ZS_PIXEL", + update=update_node_values, + ) + + prim_depth: bpy.props.PointerProperty( + type=PrimDepthSettings, + name="Prim Depth Settings (gDPSetPrimDepth)", + description="gDPSetPrimDepth", + ) + + clip_ratio: bpy.props.IntProperty( + default=1, min=1, max=2 ** 15 - 1, update=update_node_values + ) + + # cycle independent + set_rendermode: bpy.props.BoolProperty(default=False, update=update_node_values) + rendermode_advanced_enabled: bpy.props.BoolProperty( + default=False, update=update_node_values + ) + rendermode_preset_cycle_1: bpy.props.EnumProperty( + items=enumRenderModesCycle1, + default="G_RM_AA_ZB_OPA_SURF", + name="Render Mode Cycle 1", + update=update_node_values, + ) + rendermode_preset_cycle_2: bpy.props.EnumProperty( + items=enumRenderModesCycle2, + default="G_RM_AA_ZB_OPA_SURF2", + name="Render Mode Cycle 2", + update=update_node_values, + ) + aa_en: bpy.props.BoolProperty(update=update_node_values) + z_cmp: bpy.props.BoolProperty(update=update_node_values) + z_upd: bpy.props.BoolProperty(update=update_node_values) + im_rd: bpy.props.BoolProperty(update=update_node_values) + clr_on_cvg: bpy.props.BoolProperty(update=update_node_values) + cvg_dst: bpy.props.EnumProperty( + name="Coverage Destination", items=enumCoverage, update=update_node_values + ) + zmode: bpy.props.EnumProperty( + name="Z Mode", items=enumZMode, update=update_node_values + ) + cvg_x_alpha: bpy.props.BoolProperty(update=update_node_values) + alpha_cvg_sel: bpy.props.BoolProperty(update=update_node_values) + force_bl: bpy.props.BoolProperty(update=update_node_values) + + # cycle dependent - (P * A + M - B) / (A + B) + blend_p1: bpy.props.EnumProperty( + name="Color Source 1", items=enumBlendColor, update=update_node_values + ) + blend_p2: bpy.props.EnumProperty( + name="Color Source 1", items=enumBlendColor, update=update_node_values + ) + blend_m1: bpy.props.EnumProperty( + name="Color Source 2", items=enumBlendColor, update=update_node_values + ) + blend_m2: bpy.props.EnumProperty( + name="Color Source 2", items=enumBlendColor, update=update_node_values + ) + blend_a1: bpy.props.EnumProperty( + name="Alpha Source", items=enumBlendAlpha, update=update_node_values + ) + blend_a2: bpy.props.EnumProperty( + name="Alpha Source", items=enumBlendAlpha, update=update_node_values + ) + blend_b1: bpy.props.EnumProperty( + name="Alpha Mix", items=enumBlendMix, update=update_node_values + ) + blend_b2: bpy.props.EnumProperty( + name="Alpha Mix", items=enumBlendMix, update=update_node_values + ) + class DefaultRDPSettingsPanel(bpy.types.Panel): - bl_label = "RDP Default Settings" - bl_idname = "WORLD_PT_RDP_Default_Inspector" - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "world" - bl_options = {'HIDE_HEADER'} - - @classmethod - def poll(cls, context): - return context.scene.gameEditorMode == "SM64" - - def draw(self, context): - world = context.scene.world - layout = self.layout - layout.box().label(text = 'RDP Default Settings') - layout.label(text = "If a material setting is a same as a default " +\ - "setting, then it won't be set.") - ui_geo_mode(world.rdp_defaults, world, layout, True) - ui_upper_mode(world.rdp_defaults, world, layout, True) - ui_lower_mode(world.rdp_defaults, world, layout, True) - ui_other(world.rdp_defaults, world, layout, True) + bl_label = "RDP Default Settings" + bl_idname = "WORLD_PT_RDP_Default_Inspector" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "world" + bl_options = {"HIDE_HEADER"} + + @classmethod + def poll(cls, context): + return context.scene.gameEditorMode == "SM64" + + def draw(self, context): + world = context.scene.world + layout = self.layout + layout.box().label(text="RDP Default Settings") + layout.label( + text="If a material setting is a same as a default " + + "setting, then it won't be set." + ) + ui_geo_mode(world.rdp_defaults, world, layout, True) + ui_upper_mode(world.rdp_defaults, world, layout, True) + ui_lower_mode(world.rdp_defaults, world, layout, True) + ui_other(world.rdp_defaults, world, layout, True) + ### Node Categories ### # Node categories are a python system for automatically @@ -2290,24 +2976,31 @@ def draw(self, context): # all categories in a list node_categories = [ - # identifier, label, items list - F3DNodeCategory('CUSTOM', 'Custom', items = [ - NodeItem("GetAlphaFromColor",label="Get Alpha From Color", settings={}), - ]), - F3DNodeCategory('FAST3D', "Fast3D", items=[ - # the node item can have additional settings, - # which are applied to new nodes - # NB: settings values are stored as string expressions, - # for this reason they should be converted to strings using repr() - NodeItem("Fast3D_A", label="A"), - NodeItem("Fast3D_B", label="B"), - NodeItem("Fast3D_C", label="C"), - NodeItem("Fast3D_D", label="D"), - NodeItem("Fast3D_A_alpha", label="A Alpha"), - NodeItem("Fast3D_B_alpha", label="B Alpha"), - NodeItem("Fast3D_C_alpha", label="C Alpha"), - NodeItem("Fast3D_D_alpha", label="D Alpha"), - ''' + # identifier, label, items list + F3DNodeCategory( + "CUSTOM", + "Custom", + items=[ + NodeItem("GetAlphaFromColor", label="Get Alpha From Color", settings={}), + ], + ), + F3DNodeCategory( + "FAST3D", + "Fast3D", + items=[ + # the node item can have additional settings, + # which are applied to new nodes + # NB: settings values are stored as string expressions, + # for this reason they should be converted to strings using repr() + NodeItem("Fast3D_A", label="A"), + NodeItem("Fast3D_B", label="B"), + NodeItem("Fast3D_C", label="C"), + NodeItem("Fast3D_D", label="D"), + NodeItem("Fast3D_A_alpha", label="A Alpha"), + NodeItem("Fast3D_B_alpha", label="B Alpha"), + NodeItem("Fast3D_C_alpha", label="C Alpha"), + NodeItem("Fast3D_D_alpha", label="D Alpha"), + """ NodeItem("Test_NodeType", label="Full", settings={ "my_string_prop": repr("consectetur adipisicing elit"), "my_float_prop": repr(2.0), @@ -2319,941 +3012,1105 @@ def draw(self, context): }), NodeItem("Fast3DSplitter_NodeType", label="Splitter", settings={ }), - ''' - ]), + """, + ], + ), ] + def getOptimalFormat(tex, useLargeTextures): - texFormat = 'RGBA16' - if useLargeTextures: - return 'RGBA16' - if bpy.context.scene.ignoreTextureRestrictions or \ - tex.size[0] * tex.size[1] > 8192: # Image too big - return 'RGBA32' - - isGreyscale = True - hasAlpha4bit = False - hasAlpha1bit = False - pixelValues = [] - - # N64 is -Y, Blender is +Y - for j in reversed(range(tex.size[1])): - for i in range(tex.size[0]): - color = [1,1,1,1] - for field in range(tex.channels): - color[field] = tex.pixels[ - (j * tex.size[0] + i) * tex.channels + field] - if not (color[0] == color[1] and color[1] == color[2]): - isGreyscale = False - if color[3] < 0.9375: - hasAlpha4bit = True - if color[3] < 0.5: - hasAlpha1bit = True - pixelColor = getRGBA16Tuple(color) - if pixelColor not in pixelValues: - pixelValues.append(pixelColor) - - if isGreyscale: - if tex.size[0] * tex.size[1] > 4096: - if not hasAlpha1bit: - texFormat = 'I4' - else: - texFormat = 'IA4' - else: - if not hasAlpha4bit: - texFormat = 'I8' - else: - texFormat = 'IA8' - else: - if len(pixelValues) <= 16: - texFormat = 'CI4' - elif len(pixelValues) <= 256: - texFormat = 'CI8' - else: - texFormat = 'RGBA16' - - return texFormat + texFormat = "RGBA16" + if useLargeTextures: + return "RGBA16" + if ( + bpy.context.scene.ignoreTextureRestrictions or tex.size[0] * tex.size[1] > 8192 + ): # Image too big + return "RGBA32" + + isGreyscale = True + hasAlpha4bit = False + hasAlpha1bit = False + pixelValues = [] + + # N64 is -Y, Blender is +Y + for j in reversed(range(tex.size[1])): + for i in range(tex.size[0]): + color = [1, 1, 1, 1] + for field in range(tex.channels): + color[field] = tex.pixels[(j * tex.size[0] + i) * tex.channels + field] + if not (color[0] == color[1] and color[1] == color[2]): + isGreyscale = False + if color[3] < 0.9375: + hasAlpha4bit = True + if color[3] < 0.5: + hasAlpha1bit = True + pixelColor = getRGBA16Tuple(color) + if pixelColor not in pixelValues: + pixelValues.append(pixelColor) + + if isGreyscale: + if tex.size[0] * tex.size[1] > 4096: + if not hasAlpha1bit: + texFormat = "I4" + else: + texFormat = "IA4" + else: + if not hasAlpha4bit: + texFormat = "I8" + else: + texFormat = "IA8" + else: + if len(pixelValues) <= 16: + texFormat = "CI4" + elif len(pixelValues) <= 256: + texFormat = "CI8" + else: + texFormat = "RGBA16" + + return texFormat + def getCurrentPresetDir(): - return "f3d/" + bpy.context.scene.gameEditorMode.lower() + return "f3d/" + bpy.context.scene.gameEditorMode.lower() + # modules/bpy_types.py -> Menu class MATERIAL_MT_f3d_presets(Menu): - bl_label = "F3D Material Presets" - preset_operator = "script.execute_preset" - - def draw(self, _context): - """ - Define these on the subclass: - - preset_operator (string) - - preset_subdir (string) - - Optionally: - - preset_add_operator (string) - - preset_extensions (set of strings) - - preset_operator_defaults (dict of keyword args) - """ - import bpy - ext_valid = getattr(self, "preset_extensions", {".py", ".xml"}) - props_default = getattr(self, "preset_operator_defaults", None) - add_operator = getattr(self, "preset_add_operator", None) - presetDir = getCurrentPresetDir() - paths = (bpy.utils.preset_paths(presetDir) if \ - not bpy.context.scene.f3dUserPresetsOnly else []) + \ - bpy.utils.preset_paths("f3d/user") - self.path_menu( - paths, - self.preset_operator, - props_default=props_default, - filter_ext=lambda ext: ext.lower() in ext_valid, - add_operator=add_operator, - ) + bl_label = "F3D Material Presets" + preset_operator = "script.execute_preset" + + def draw(self, _context): + """ + Define these on the subclass: + - preset_operator (string) + - preset_subdir (string) + + Optionally: + - preset_add_operator (string) + - preset_extensions (set of strings) + - preset_operator_defaults (dict of keyword args) + """ + import bpy + + ext_valid = getattr(self, "preset_extensions", {".py", ".xml"}) + props_default = getattr(self, "preset_operator_defaults", None) + add_operator = getattr(self, "preset_add_operator", None) + presetDir = getCurrentPresetDir() + paths = ( + bpy.utils.preset_paths(presetDir) + if not bpy.context.scene.f3dUserPresetsOnly + else [] + ) + bpy.utils.preset_paths("f3d/user") + self.path_menu( + paths, + self.preset_operator, + props_default=props_default, + filter_ext=lambda ext: ext.lower() in ext_valid, + add_operator=add_operator, + ) + # https://docs.blender.org/api/current/bpy.ops.script.html -#class F3DExecutePreset(ExecutePreset): -# """Execute a preset""" -# bl_idname = "script.f3d_execute_preset" -# bl_label = "Execute an F3D Preset" +# class F3DExecutePreset(ExecutePreset): +# """Execute a preset""" +# bl_idname = "script.f3d_execute_preset" +# bl_label = "Execute an F3D Preset" # -# filepath: StringProperty( -# subtype='FILE_PATH', -# options={'SKIP_SAVE'}, -# ) -# menu_idname: StringProperty( -# name="Menu ID Name", -# description="ID name of the menu this was called from", -# options={'SKIP_SAVE'}, -# ) +# filepath: StringProperty( +# subtype='FILE_PATH', +# options={'SKIP_SAVE'}, +# ) +# menu_idname: StringProperty( +# name="Menu ID Name", +# description="ID name of the menu this was called from", +# options={'SKIP_SAVE'}, +# ) # -# def post_cb(self, context): -# presetName = bpy.path.display_name(basename(filepath)) -# for material in bpy.data.materials: -# if material.is_f3d and material.mat_ver > 3 and \ -# material.f3d_mat.preset_name == presetName: +# def post_cb(self, context): +# presetName = bpy.path.display_name(basename(filepath)) +# for material in bpy.data.materials: +# if material.is_f3d and material.mat_ver > 3 and \ +# material.f3d_mat.preset_name == presetName: class AddPresetF3D(AddPresetBase, Operator): - '''Add an F3D Material Preset''' - bl_idname = "material.f3d_preset_add" - bl_label = "Add F3D Material Preset" - preset_menu = "MATERIAL_MT_f3d_presets" - - # variable used for all preset values - # do NOT set "mat" in this operator, even in a for loop! it overrides this value - preset_defines = [ - "f3d_mat = bpy.context.material.f3d_mat" - ] - - # properties to store in the preset - preset_values = [ - "f3d_mat", - ] - - # where to store the preset - preset_subdir = "f3d/user" - - defaults = [ - "Custom", - #"Shaded Texture", - ] - - ignore_props = [ - "f3d_mat.tex0.tex", - "f3d_mat.tex0.tex_format", - "f3d_mat.tex0.ci_format", - "f3d_mat.tex0.use_tex_reference", - "f3d_mat.tex0.tex_reference", - "f3d_mat.tex0.tex_reference_size", - "f3d_mat.tex0.pal_reference", - "f3d_mat.tex0.pal_reference_size", - "f3d_mat.tex0.S", - "f3d_mat.tex0.T", - "f3d_mat.tex0.menu", - "f3d_mat.tex0.autoprop", - "f3d_mat.tex0.save_large_texture", - "f3d_mat.tex0.tile_scroll", - "f3d_mat.tex0.tile_scroll.s", - "f3d_mat.tex0.tile_scroll.t", - "f3d_mat.tex0.tile_scroll.interval", - "f3d_mat.tex1.tex", - "f3d_mat.tex1.tex_format", - "f3d_mat.tex1.ci_format", - "f3d_mat.tex1.use_tex_reference", - "f3d_mat.tex1.tex_reference", - "f3d_mat.tex1.tex_reference_size", - "f3d_mat.tex1.pal_reference", - "f3d_mat.tex1.pal_reference_size", - "f3d_mat.tex1.S", - "f3d_mat.tex1.T", - "f3d_mat.tex1.menu", - "f3d_mat.tex1.autoprop", - "f3d_mat.tex1.save_large_texture", - "f3d_mat.tex1.tile_scroll", - "f3d_mat.tex1.tile_scroll.s", - "f3d_mat.tex1.tile_scroll.t", - "f3d_mat.tex1.tile_scroll.interval", - "f3d_mat.tex_scale", - "f3d_mat.scale_autoprop", - "f3d_mat.uv_basis", - "f3d_mat.UVanim0", - "f3d_mat.UVanim1", - "f3d_mat.menu_procAnim", - "f3d_mat.menu_geo", - "f3d_mat.menu_upper", - "f3d_mat.menu_lower", - "f3d_mat.menu_other", - "f3d_mat.menu_lower_render", - "f3d_mat.f3d_update_flag", - "f3d_mat.name", - "f3d_mat.use_large_textures", - ] - - def execute(self, context): - import os - from bpy.utils import is_path_builtin - - if hasattr(self, "pre_cb"): - self.pre_cb(context) - - preset_menu_class = getattr(bpy.types, self.preset_menu) - - is_xml = getattr(preset_menu_class, "preset_type", None) == 'XML' - is_preset_add = not (self.remove_name or self.remove_active) - - if is_xml: - ext = ".xml" - else: - ext = ".py" - - name = self.name.strip() if is_preset_add else self.name - - if is_preset_add: - if not name: - return {'FINISHED'} - - filename = self.as_filename(name) - if filename in material_presets or filename == "custom": - self.report({'WARNING'}, "Unable to delete/overwrite default presets.") - return {'CANCELLED'} - - # Reset preset name - wm = bpy.data.window_managers[0] - if name == wm.preset_name: - wm.preset_name = 'New Preset' - - filename = self.as_filename(name) - context.material.f3d_mat.presetName = bpy.path.display_name(filename) - - target_path = os.path.join("presets", self.preset_subdir) - try: - target_path = bpy.utils.user_resource('SCRIPTS', - target_path, - create=True) - except: # 3.0 - target_path = bpy.utils.user_resource('SCRIPTS', - path=target_path, - create=True) - - if not target_path: - self.report({'WARNING'}, "Failed to create presets path") - return {'CANCELLED'} - - filepath = os.path.join(target_path, filename) + ext - - if hasattr(self, "add"): - self.add(context, filepath) - else: - print("Writing Preset: %r" % filepath) - - if is_xml: - import rna_xml - rna_xml.xml_file_write(context, - filepath, - preset_menu_class.preset_xml_map) - else: - - def rna_recursive_attr_expand(value, rna_path_step, level): - if rna_path_step in self.ignore_props: - #print("Ignoring: " + str(rna_path_step)) - return - #else: - # print("Processing: " + str(rna_path_step)) - if isinstance(value, bpy.types.PropertyGroup): - for sub_value_attr in value.bl_rna.properties.keys(): - if sub_value_attr == "rna_type": - continue - sub_value = getattr(value, sub_value_attr) - rna_recursive_attr_expand(sub_value, "%s.%s" % (rna_path_step, sub_value_attr), level) - elif type(value).__name__ == "bpy_prop_collection_idprop": # could use nicer method - file_preset.write("%s.clear()\n" % rna_path_step) - for sub_value in value: - file_preset.write("item_sub_%d = %s.add()\n" % (level, rna_path_step)) - rna_recursive_attr_expand(sub_value, "item_sub_%d" % level, level + 1) - else: - # convert thin wrapped sequences - # to simple lists to repr() - try: - value = value[:] - except: - pass - - file_preset.write("%s = %r\n" % (rna_path_step, value)) - - file_preset = open(filepath, 'w', encoding="utf-8") - file_preset.write("import bpy\n") - - if hasattr(self, "preset_defines"): - for rna_path in self.preset_defines: - exec(rna_path) - file_preset.write("%s\n" % rna_path) - file_preset.write("\n") - file_preset.write("bpy.context.material.f3d_update_flag = True\n") - - for rna_path in self.preset_values: - value = eval(rna_path) - rna_recursive_attr_expand(value, rna_path, 1) - - file_preset.write("bpy.context.material.f3d_update_flag = False\n") - file_preset.write("f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update\n") - file_preset.close() - - presetName = bpy.path.display_name(filename) - preset_menu_class.bl_label = presetName - - for otherMat in bpy.data.materials: - if otherMat.f3d_mat.presetName == presetName and otherMat != context.material: - update_preset_manual_v4(otherMat, filename) - context.material.f3d_mat.presetName = bpy.path.display_name(filename) - - else: - if self.remove_active: - name = preset_menu_class.bl_label - filename = self.as_filename(name) - presetName = bpy.path.display_name(filename) - - if filename in material_presets or filename == "custom": - self.report({'WARNING'}, "Unable to delete/overwrite default presets.") - return {'CANCELLED'} - - # fairly sloppy but convenient. - filepath = bpy.utils.preset_find(name, - self.preset_subdir, - ext=ext) - - if not filepath: - filepath = bpy.utils.preset_find(name, - self.preset_subdir, - display_name=True, - ext=ext) - - if not filepath: - return {'CANCELLED'} - - # Do not remove bundled presets - if is_path_builtin(filepath): - self.report({'WARNING'}, "Unable to remove default presets") - return {'CANCELLED'} - - try: - if hasattr(self, "remove"): - self.remove(context, filepath) - else: - os.remove(filepath) - except Exception as e: - self.report({'ERROR'}, "Unable to remove preset: %r" % e) - import traceback - traceback.print_exc() - return {'CANCELLED'} - - # XXX, stupid! - preset_menu_class.bl_label = "Presets" - for material in bpy.data.materials: - if material.f3d_mat.presetName == presetName: - material.f3d_mat.presetName = "Custom" - #context.material.f3d_mat.presetName = "Custom" - - if hasattr(self, "post_cb"): - self.post_cb(context) - - return {'FINISHED'} + """Add an F3D Material Preset""" + + bl_idname = "material.f3d_preset_add" + bl_label = "Add F3D Material Preset" + preset_menu = "MATERIAL_MT_f3d_presets" + + # variable used for all preset values + # do NOT set "mat" in this operator, even in a for loop! it overrides this value + preset_defines = ["f3d_mat = bpy.context.material.f3d_mat"] + + # properties to store in the preset + preset_values = [ + "f3d_mat", + ] + + # where to store the preset + preset_subdir = "f3d/user" + + defaults = [ + "Custom", + # "Shaded Texture", + ] + + ignore_props = [ + "f3d_mat.tex0.tex", + "f3d_mat.tex0.tex_format", + "f3d_mat.tex0.ci_format", + "f3d_mat.tex0.use_tex_reference", + "f3d_mat.tex0.tex_reference", + "f3d_mat.tex0.tex_reference_size", + "f3d_mat.tex0.pal_reference", + "f3d_mat.tex0.pal_reference_size", + "f3d_mat.tex0.S", + "f3d_mat.tex0.T", + "f3d_mat.tex0.menu", + "f3d_mat.tex0.autoprop", + "f3d_mat.tex0.save_large_texture", + "f3d_mat.tex0.tile_scroll", + "f3d_mat.tex0.tile_scroll.s", + "f3d_mat.tex0.tile_scroll.t", + "f3d_mat.tex0.tile_scroll.interval", + "f3d_mat.tex1.tex", + "f3d_mat.tex1.tex_format", + "f3d_mat.tex1.ci_format", + "f3d_mat.tex1.use_tex_reference", + "f3d_mat.tex1.tex_reference", + "f3d_mat.tex1.tex_reference_size", + "f3d_mat.tex1.pal_reference", + "f3d_mat.tex1.pal_reference_size", + "f3d_mat.tex1.S", + "f3d_mat.tex1.T", + "f3d_mat.tex1.menu", + "f3d_mat.tex1.autoprop", + "f3d_mat.tex1.save_large_texture", + "f3d_mat.tex1.tile_scroll", + "f3d_mat.tex1.tile_scroll.s", + "f3d_mat.tex1.tile_scroll.t", + "f3d_mat.tex1.tile_scroll.interval", + "f3d_mat.tex_scale", + "f3d_mat.scale_autoprop", + "f3d_mat.uv_basis", + "f3d_mat.UVanim0", + "f3d_mat.UVanim1", + "f3d_mat.menu_procAnim", + "f3d_mat.menu_geo", + "f3d_mat.menu_upper", + "f3d_mat.menu_lower", + "f3d_mat.menu_other", + "f3d_mat.menu_lower_render", + "f3d_mat.f3d_update_flag", + "f3d_mat.name", + "f3d_mat.use_large_textures", + ] + + def execute(self, context): + import os + from bpy.utils import is_path_builtin + + if hasattr(self, "pre_cb"): + self.pre_cb(context) + + preset_menu_class = getattr(bpy.types, self.preset_menu) + + is_xml = getattr(preset_menu_class, "preset_type", None) == "XML" + is_preset_add = not (self.remove_name or self.remove_active) + + if is_xml: + ext = ".xml" + else: + ext = ".py" + + name = self.name.strip() if is_preset_add else self.name + + if is_preset_add: + if not name: + return {"FINISHED"} + + filename = self.as_filename(name) + if filename in material_presets or filename == "custom": + self.report({"WARNING"}, "Unable to delete/overwrite default presets.") + return {"CANCELLED"} + + # Reset preset name + wm = bpy.data.window_managers[0] + if name == wm.preset_name: + wm.preset_name = "New Preset" + + filename = self.as_filename(name) + context.material.f3d_mat.presetName = bpy.path.display_name(filename) + + target_path = os.path.join("presets", self.preset_subdir) + try: + target_path = bpy.utils.user_resource( + "SCRIPTS", target_path, create=True + ) + except: # 3.0 + target_path = bpy.utils.user_resource( + "SCRIPTS", path=target_path, create=True + ) + + if not target_path: + self.report({"WARNING"}, "Failed to create presets path") + return {"CANCELLED"} + + filepath = os.path.join(target_path, filename) + ext + + if hasattr(self, "add"): + self.add(context, filepath) + else: + print("Writing Preset: %r" % filepath) + + if is_xml: + import rna_xml + + rna_xml.xml_file_write( + context, filepath, preset_menu_class.preset_xml_map + ) + else: + + def rna_recursive_attr_expand(value, rna_path_step, level): + if rna_path_step in self.ignore_props: + # print("Ignoring: " + str(rna_path_step)) + return + # else: + # print("Processing: " + str(rna_path_step)) + if isinstance(value, bpy.types.PropertyGroup): + for sub_value_attr in value.bl_rna.properties.keys(): + if sub_value_attr == "rna_type": + continue + sub_value = getattr(value, sub_value_attr) + rna_recursive_attr_expand( + sub_value, + "%s.%s" % (rna_path_step, sub_value_attr), + level, + ) + elif ( + type(value).__name__ == "bpy_prop_collection_idprop" + ): # could use nicer method + file_preset.write("%s.clear()\n" % rna_path_step) + for sub_value in value: + file_preset.write( + "item_sub_%d = %s.add()\n" % (level, rna_path_step) + ) + rna_recursive_attr_expand( + sub_value, "item_sub_%d" % level, level + 1 + ) + else: + # convert thin wrapped sequences + # to simple lists to repr() + try: + value = value[:] + except: + pass + + file_preset.write("%s = %r\n" % (rna_path_step, value)) + + file_preset = open(filepath, "w", encoding="utf-8") + file_preset.write("import bpy\n") + + if hasattr(self, "preset_defines"): + for rna_path in self.preset_defines: + exec(rna_path) + file_preset.write("%s\n" % rna_path) + file_preset.write("\n") + file_preset.write("bpy.context.material.f3d_update_flag = True\n") + + for rna_path in self.preset_values: + value = eval(rna_path) + rna_recursive_attr_expand(value, rna_path, 1) + + file_preset.write("bpy.context.material.f3d_update_flag = False\n") + file_preset.write( + "f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update\n" + ) + file_preset.close() + + presetName = bpy.path.display_name(filename) + preset_menu_class.bl_label = presetName + + for otherMat in bpy.data.materials: + if ( + otherMat.f3d_mat.presetName == presetName + and otherMat != context.material + ): + update_preset_manual_v4(otherMat, filename) + context.material.f3d_mat.presetName = bpy.path.display_name(filename) + + else: + if self.remove_active: + name = preset_menu_class.bl_label + filename = self.as_filename(name) + presetName = bpy.path.display_name(filename) + + if filename in material_presets or filename == "custom": + self.report( + {"WARNING"}, "Unable to delete/overwrite default presets." + ) + return {"CANCELLED"} + + # fairly sloppy but convenient. + filepath = bpy.utils.preset_find(name, self.preset_subdir, ext=ext) + + if not filepath: + filepath = bpy.utils.preset_find( + name, self.preset_subdir, display_name=True, ext=ext + ) + + if not filepath: + return {"CANCELLED"} + + # Do not remove bundled presets + if is_path_builtin(filepath): + self.report({"WARNING"}, "Unable to remove default presets") + return {"CANCELLED"} + + try: + if hasattr(self, "remove"): + self.remove(context, filepath) + else: + os.remove(filepath) + except Exception as e: + self.report({"ERROR"}, "Unable to remove preset: %r" % e) + import traceback + + traceback.print_exc() + return {"CANCELLED"} + + # XXX, stupid! + preset_menu_class.bl_label = "Presets" + for material in bpy.data.materials: + if material.f3d_mat.presetName == presetName: + material.f3d_mat.presetName = "Custom" + # context.material.f3d_mat.presetName = "Custom" + + if hasattr(self, "post_cb"): + self.post_cb(context) + + return {"FINISHED"} + def convertToNewMat(material, oldMat): - #mat_register_old() - material.f3d_mat.presetName = oldMat.presetName - - material.f3d_mat.scale_autoprop = oldMat.scale_autoprop - material.f3d_mat.uv_basis = oldMat.uv_basis - - # Combiners - copyPropertyGroup(oldMat.combiner1, material.f3d_mat.combiner1) - copyPropertyGroup(oldMat.combiner2, material.f3d_mat.combiner2) - #material.f3d_mat.combiner1 = oldMat.combiner1 - #material.f3d_mat.combiner2 = oldMat.combiner2 - - # Texture animation - material.f3d_mat.menu_procAnim = oldMat.menu_procAnim - copyPropertyGroup(oldMat.UVanim, material.f3d_mat.UVanim0) - copyPropertyGroup(oldMat.UVanim_tex1, material.f3d_mat.UVanim1) - - # material textures - material.f3d_mat.tex_scale = oldMat.tex_scale - copyPropertyGroup(oldMat.tex0, material.f3d_mat.tex0) - copyPropertyGroup(oldMat.tex1, material.f3d_mat.tex1) - - # Should Set? - material.f3d_mat.set_prim = oldMat.set_prim - material.f3d_mat.set_lights = oldMat.set_lights - material.f3d_mat.set_env = oldMat.set_env - material.f3d_mat.set_blend = oldMat.set_blend - material.f3d_mat.set_key = oldMat.set_key - material.f3d_mat.set_k0_5 = oldMat.set_k0_5 - material.f3d_mat.set_combiner = oldMat.set_combiner - material.f3d_mat.use_default_lighting = oldMat.use_default_lighting - - # Colors - nodes = oldMat.node_tree.nodes - material.f3d_mat.blend_color = oldMat.blend_color - if oldMat.mat_ver == 3: - prim = nodes['Primitive Color Output'].inputs[0].default_value - env = nodes['Environment Color Output'].inputs[0].default_value - else: - prim = nodes['Primitive Color'].outputs[0].default_value - env = nodes['Environment Color'].outputs[0].default_value - - material.f3d_mat.blend_color = oldMat.blend_color - material.f3d_mat.prim_color = prim - material.f3d_mat.env_color = env - material.f3d_mat.key_center = nodes['Chroma Key Center'].outputs[0].default_value - - # Chroma - material.f3d_mat.key_scale = oldMat.key_scale - material.f3d_mat.key_width = oldMat.key_width - - # Convert - material.f3d_mat.k0 = oldMat.k0 - material.f3d_mat.k1 = oldMat.k1 - material.f3d_mat.k2 = oldMat.k2 - material.f3d_mat.k3 = oldMat.k3 - material.f3d_mat.k4 = oldMat.k4 - material.f3d_mat.k5 = oldMat.k5 - - # Prim - material.f3d_mat.prim_lod_frac = oldMat.prim_lod_frac - material.f3d_mat.prim_lod_min = oldMat.prim_lod_min - - # lights - material.f3d_mat.default_light_color = oldMat.default_light_color - material.f3d_mat.ambient_light_color = oldMat.ambient_light_color - material.f3d_mat.f3d_light1 = oldMat.f3d_light1 - material.f3d_mat.f3d_light2 = oldMat.f3d_light2 - material.f3d_mat.f3d_light3 = oldMat.f3d_light3 - material.f3d_mat.f3d_light4 = oldMat.f3d_light4 - material.f3d_mat.f3d_light5 = oldMat.f3d_light5 - material.f3d_mat.f3d_light6 = oldMat.f3d_light6 - material.f3d_mat.f3d_light7 = oldMat.f3d_light7 - - # Fog Properties - material.f3d_mat.fog_color = oldMat.fog_color - material.f3d_mat.fog_position = oldMat.fog_position - material.f3d_mat.set_fog = oldMat.set_fog - material.f3d_mat.use_global_fog = oldMat.use_global_fog - - # geometry mode - material.f3d_mat.menu_geo = oldMat.menu_geo - material.f3d_mat.menu_upper = oldMat.menu_upper - material.f3d_mat.menu_lower = oldMat.menu_lower - material.f3d_mat.menu_other = oldMat.menu_other - material.f3d_mat.menu_lower_render = oldMat.menu_lower_render - copyPropertyGroup(oldMat.rdp_settings, material.f3d_mat.rdp_settings) - - #mat_unregister_old() + # mat_register_old() + material.f3d_mat.presetName = oldMat.presetName + + material.f3d_mat.scale_autoprop = oldMat.scale_autoprop + material.f3d_mat.uv_basis = oldMat.uv_basis + + # Combiners + copyPropertyGroup(oldMat.combiner1, material.f3d_mat.combiner1) + copyPropertyGroup(oldMat.combiner2, material.f3d_mat.combiner2) + # material.f3d_mat.combiner1 = oldMat.combiner1 + # material.f3d_mat.combiner2 = oldMat.combiner2 + + # Texture animation + material.f3d_mat.menu_procAnim = oldMat.menu_procAnim + copyPropertyGroup(oldMat.UVanim, material.f3d_mat.UVanim0) + copyPropertyGroup(oldMat.UVanim_tex1, material.f3d_mat.UVanim1) + + # material textures + material.f3d_mat.tex_scale = oldMat.tex_scale + copyPropertyGroup(oldMat.tex0, material.f3d_mat.tex0) + copyPropertyGroup(oldMat.tex1, material.f3d_mat.tex1) + + # Should Set? + material.f3d_mat.set_prim = oldMat.set_prim + material.f3d_mat.set_lights = oldMat.set_lights + material.f3d_mat.set_env = oldMat.set_env + material.f3d_mat.set_blend = oldMat.set_blend + material.f3d_mat.set_key = oldMat.set_key + material.f3d_mat.set_k0_5 = oldMat.set_k0_5 + material.f3d_mat.set_combiner = oldMat.set_combiner + material.f3d_mat.use_default_lighting = oldMat.use_default_lighting + + # Colors + nodes = oldMat.node_tree.nodes + material.f3d_mat.blend_color = oldMat.blend_color + if oldMat.mat_ver == 3: + prim = nodes["Primitive Color Output"].inputs[0].default_value + env = nodes["Environment Color Output"].inputs[0].default_value + else: + prim = nodes["Primitive Color"].outputs[0].default_value + env = nodes["Environment Color"].outputs[0].default_value + + material.f3d_mat.blend_color = oldMat.blend_color + material.f3d_mat.prim_color = prim + material.f3d_mat.env_color = env + material.f3d_mat.key_center = nodes["Chroma Key Center"].outputs[0].default_value + + # Chroma + material.f3d_mat.key_scale = oldMat.key_scale + material.f3d_mat.key_width = oldMat.key_width + + # Convert + material.f3d_mat.k0 = oldMat.k0 + material.f3d_mat.k1 = oldMat.k1 + material.f3d_mat.k2 = oldMat.k2 + material.f3d_mat.k3 = oldMat.k3 + material.f3d_mat.k4 = oldMat.k4 + material.f3d_mat.k5 = oldMat.k5 + + # Prim + material.f3d_mat.prim_lod_frac = oldMat.prim_lod_frac + material.f3d_mat.prim_lod_min = oldMat.prim_lod_min + + # lights + material.f3d_mat.default_light_color = oldMat.default_light_color + material.f3d_mat.ambient_light_color = oldMat.ambient_light_color + material.f3d_mat.f3d_light1 = oldMat.f3d_light1 + material.f3d_mat.f3d_light2 = oldMat.f3d_light2 + material.f3d_mat.f3d_light3 = oldMat.f3d_light3 + material.f3d_mat.f3d_light4 = oldMat.f3d_light4 + material.f3d_mat.f3d_light5 = oldMat.f3d_light5 + material.f3d_mat.f3d_light6 = oldMat.f3d_light6 + material.f3d_mat.f3d_light7 = oldMat.f3d_light7 + + # Fog Properties + material.f3d_mat.fog_color = oldMat.fog_color + material.f3d_mat.fog_position = oldMat.fog_position + material.f3d_mat.set_fog = oldMat.set_fog + material.f3d_mat.use_global_fog = oldMat.use_global_fog + + # geometry mode + material.f3d_mat.menu_geo = oldMat.menu_geo + material.f3d_mat.menu_upper = oldMat.menu_upper + material.f3d_mat.menu_lower = oldMat.menu_lower + material.f3d_mat.menu_other = oldMat.menu_other + material.f3d_mat.menu_lower_render = oldMat.menu_lower_render + copyPropertyGroup(oldMat.rdp_settings, material.f3d_mat.rdp_settings) + + # mat_unregister_old() + class F3DMaterialProperty(bpy.types.PropertyGroup): - presetName : bpy.props.StringProperty(name = "Preset Name", default = "Custom") - - scale_autoprop : bpy.props.BoolProperty(name = 'Auto Set Scale', default = True, update = update_tex_values) - uv_basis : bpy.props.EnumProperty(name = 'UV Basis', default = 'TEXEL0', items = enumTexUV, update = update_tex_values) - - # Combiners - combiner1 : bpy.props.PointerProperty(type = CombinerProperty) - combiner2 : bpy.props.PointerProperty(type = CombinerProperty) - - # Texture animation - menu_procAnim : bpy.props.BoolProperty() - UVanim0 : bpy.props.PointerProperty(type = ProcAnimVectorProperty) - UVanim1 : bpy.props.PointerProperty(type = ProcAnimVectorProperty) - - # material textures - tex_scale : bpy.props.FloatVectorProperty(min = 0, max = 1, size = 2, default = (1,1), step = 1, update = update_tex_values) - tex0 : bpy.props.PointerProperty(type = TextureProperty) - tex1 : bpy.props.PointerProperty(type = TextureProperty) - - # Should Set? - - set_prim : bpy.props.BoolProperty(default = True, update = update_node_values) - set_lights : bpy.props.BoolProperty(default = True, update = update_node_values) - set_env : bpy.props.BoolProperty(default = False, update = update_node_values) - set_blend : bpy.props.BoolProperty(default = False, update = update_node_values) - set_key : bpy.props.BoolProperty(default = True, update = update_node_values) - set_k0_5 : bpy.props.BoolProperty(default = True, update = update_node_values) - set_combiner : bpy.props.BoolProperty(default = True, update = update_node_values) - use_default_lighting : bpy.props.BoolProperty(default = True, update = update_node_values_without_preset) - - # Blend Color - blend_color : bpy.props.FloatVectorProperty( - name = 'Blend Color', subtype='COLOR', size = 4, min = 0, max = 1, default = (0,0,0,1)) - prim_color : bpy.props.FloatVectorProperty( - name = 'Primitive Color', subtype='COLOR', size = 4, min = 0, max = 1, default = (1,1,1,1), - update = update_node_values_without_preset) - env_color : bpy.props.FloatVectorProperty( - name = 'Environment Color', subtype='COLOR', size = 4, min = 0, max = 1, default = (1,1,1,1), - update = update_node_values_without_preset) - key_center : bpy.props.FloatVectorProperty( - name = 'Key Center', subtype='COLOR', size = 4, min = 0, max = 1, default = (1,1,1,1), - update = update_node_values_without_preset) - - # Chroma - key_scale : bpy.props.FloatVectorProperty(name = 'Key Scale', min = 0, max = 1, step = 1, update = update_node_values) - key_width : bpy.props.FloatVectorProperty(name = 'Key Width', min = 0, max = 16, update = update_node_values) - - # Convert - k0 : bpy.props.FloatProperty(min = -1, max = 1, default = 175/255, step = 1, update = update_node_values) - k1 : bpy.props.FloatProperty(min = -1, max = 1, default = -43/255, step = 1, update = update_node_values) - k2 : bpy.props.FloatProperty(min = -1, max = 1, default = -89/255, step = 1, update = update_node_values) - k3 : bpy.props.FloatProperty(min = -1, max = 1, default = 222/255, step = 1, update = update_node_values) - k4 : bpy.props.FloatProperty(min = -1, max = 1, default = 114/255, step = 1, update = update_node_values) - k5 : bpy.props.FloatProperty(min = -1, max = 1, default = 42/255, step = 1, update = update_node_values) - - # Prim - prim_lod_frac : bpy.props.FloatProperty(name = 'Prim LOD Frac', min = 0, max = 1, step = 1, update = update_node_values) - prim_lod_min : bpy.props.FloatProperty(name = 'Min LOD Ratio', min = 0, max = 1, step = 1, update = update_node_values) - - # lights - default_light_color : bpy.props.FloatVectorProperty( - name = 'Default Light Color', subtype = 'COLOR', size = 4, min = 0, max = 1, default = (1,1,1,1), - update = update_node_values_without_preset) - ambient_light_color : bpy.props.FloatVectorProperty( - name = 'Ambient Light Color', subtype = 'COLOR', size = 4, min = 0, max = 1, default = (0.5,0.5,0.5,1), - update = update_node_values_without_preset) - f3d_light1 : bpy.props.PointerProperty(type = bpy.types.Light, update = F3DOrganizeLights) - f3d_light2 : bpy.props.PointerProperty(type = bpy.types.Light, update = F3DOrganizeLights) - f3d_light3 : bpy.props.PointerProperty(type = bpy.types.Light, update = F3DOrganizeLights) - f3d_light4 : bpy.props.PointerProperty(type = bpy.types.Light, update = F3DOrganizeLights) - f3d_light5 : bpy.props.PointerProperty(type = bpy.types.Light, update = F3DOrganizeLights) - f3d_light6 : bpy.props.PointerProperty(type = bpy.types.Light, update = F3DOrganizeLights) - f3d_light7 : bpy.props.PointerProperty(type = bpy.types.Light, update = F3DOrganizeLights) - - # Fog Properties - fog_color : bpy.props.FloatVectorProperty( - name = 'Fog Color', subtype='COLOR', size = 4, min = 0, max = 1, default = (0,0,0,1)) - fog_position : bpy.props.IntVectorProperty( - name = 'Fog Range', size = 2, min = 0, max = 1000, default = (970,1000)) - set_fog : bpy.props.BoolProperty() - use_global_fog : bpy.props.BoolProperty(default = False) - - # geometry mode - menu_geo : bpy.props.BoolProperty() - menu_upper : bpy.props.BoolProperty() - menu_lower : bpy.props.BoolProperty() - menu_other : bpy.props.BoolProperty() - menu_lower_render : bpy.props.BoolProperty() - rdp_settings : bpy.props.PointerProperty(type = RDPSettings) - - draw_layer : bpy.props.PointerProperty(type = DrawLayerProperty) - use_large_textures : bpy.props.BoolProperty(name = "Large Texture Mode") + presetName: bpy.props.StringProperty(name="Preset Name", default="Custom") + + scale_autoprop: bpy.props.BoolProperty( + name="Auto Set Scale", default=True, update=update_tex_values + ) + uv_basis: bpy.props.EnumProperty( + name="UV Basis", default="TEXEL0", items=enumTexUV, update=update_tex_values + ) + + # Combiners + combiner1: bpy.props.PointerProperty(type=CombinerProperty) + combiner2: bpy.props.PointerProperty(type=CombinerProperty) + + # Texture animation + menu_procAnim: bpy.props.BoolProperty() + UVanim0: bpy.props.PointerProperty(type=ProcAnimVectorProperty) + UVanim1: bpy.props.PointerProperty(type=ProcAnimVectorProperty) + + # material textures + tex_scale: bpy.props.FloatVectorProperty( + min=0, max=1, size=2, default=(1, 1), step=1, update=update_tex_values + ) + tex0: bpy.props.PointerProperty(type=TextureProperty) + tex1: bpy.props.PointerProperty(type=TextureProperty) + + # Should Set? + + set_prim: bpy.props.BoolProperty(default=True, update=update_node_values) + set_lights: bpy.props.BoolProperty(default=True, update=update_node_values) + set_env: bpy.props.BoolProperty(default=False, update=update_node_values) + set_blend: bpy.props.BoolProperty(default=False, update=update_node_values) + set_key: bpy.props.BoolProperty(default=True, update=update_node_values) + set_k0_5: bpy.props.BoolProperty(default=True, update=update_node_values) + set_combiner: bpy.props.BoolProperty(default=True, update=update_node_values) + use_default_lighting: bpy.props.BoolProperty( + default=True, update=update_node_values_without_preset + ) + + # Blend Color + blend_color: bpy.props.FloatVectorProperty( + name="Blend Color", subtype="COLOR", size=4, min=0, max=1, default=(0, 0, 0, 1) + ) + prim_color: bpy.props.FloatVectorProperty( + name="Primitive Color", + subtype="COLOR", + size=4, + min=0, + max=1, + default=(1, 1, 1, 1), + update=update_node_values_without_preset, + ) + env_color: bpy.props.FloatVectorProperty( + name="Environment Color", + subtype="COLOR", + size=4, + min=0, + max=1, + default=(1, 1, 1, 1), + update=update_node_values_without_preset, + ) + key_center: bpy.props.FloatVectorProperty( + name="Key Center", + subtype="COLOR", + size=4, + min=0, + max=1, + default=(1, 1, 1, 1), + update=update_node_values_without_preset, + ) + + # Chroma + key_scale: bpy.props.FloatVectorProperty( + name="Key Scale", min=0, max=1, step=1, update=update_node_values + ) + key_width: bpy.props.FloatVectorProperty( + name="Key Width", min=0, max=16, update=update_node_values + ) + + # Convert + k0: bpy.props.FloatProperty( + min=-1, max=1, default=175 / 255, step=1, update=update_node_values + ) + k1: bpy.props.FloatProperty( + min=-1, max=1, default=-43 / 255, step=1, update=update_node_values + ) + k2: bpy.props.FloatProperty( + min=-1, max=1, default=-89 / 255, step=1, update=update_node_values + ) + k3: bpy.props.FloatProperty( + min=-1, max=1, default=222 / 255, step=1, update=update_node_values + ) + k4: bpy.props.FloatProperty( + min=-1, max=1, default=114 / 255, step=1, update=update_node_values + ) + k5: bpy.props.FloatProperty( + min=-1, max=1, default=42 / 255, step=1, update=update_node_values + ) + + # Prim + prim_lod_frac: bpy.props.FloatProperty( + name="Prim LOD Frac", min=0, max=1, step=1, update=update_node_values + ) + prim_lod_min: bpy.props.FloatProperty( + name="Min LOD Ratio", min=0, max=1, step=1, update=update_node_values + ) + + # lights + default_light_color: bpy.props.FloatVectorProperty( + name="Default Light Color", + subtype="COLOR", + size=4, + min=0, + max=1, + default=(1, 1, 1, 1), + update=update_node_values_without_preset, + ) + ambient_light_color: bpy.props.FloatVectorProperty( + name="Ambient Light Color", + subtype="COLOR", + size=4, + min=0, + max=1, + default=(0.5, 0.5, 0.5, 1), + update=update_node_values_without_preset, + ) + f3d_light1: bpy.props.PointerProperty( + type=bpy.types.Light, update=F3DOrganizeLights + ) + f3d_light2: bpy.props.PointerProperty( + type=bpy.types.Light, update=F3DOrganizeLights + ) + f3d_light3: bpy.props.PointerProperty( + type=bpy.types.Light, update=F3DOrganizeLights + ) + f3d_light4: bpy.props.PointerProperty( + type=bpy.types.Light, update=F3DOrganizeLights + ) + f3d_light5: bpy.props.PointerProperty( + type=bpy.types.Light, update=F3DOrganizeLights + ) + f3d_light6: bpy.props.PointerProperty( + type=bpy.types.Light, update=F3DOrganizeLights + ) + f3d_light7: bpy.props.PointerProperty( + type=bpy.types.Light, update=F3DOrganizeLights + ) + + # Fog Properties + fog_color: bpy.props.FloatVectorProperty( + name="Fog Color", subtype="COLOR", size=4, min=0, max=1, default=(0, 0, 0, 1) + ) + fog_position: bpy.props.IntVectorProperty( + name="Fog Range", size=2, min=0, max=1000, default=(970, 1000) + ) + set_fog: bpy.props.BoolProperty() + use_global_fog: bpy.props.BoolProperty(default=False) + + # geometry mode + menu_geo: bpy.props.BoolProperty() + menu_upper: bpy.props.BoolProperty() + menu_lower: bpy.props.BoolProperty() + menu_other: bpy.props.BoolProperty() + menu_lower_render: bpy.props.BoolProperty() + rdp_settings: bpy.props.PointerProperty(type=RDPSettings) + + draw_layer: bpy.props.PointerProperty(type=DrawLayerProperty) + use_large_textures: bpy.props.BoolProperty(name="Large Texture Mode") + class UnlinkF3DImage0(bpy.types.Operator): - bl_idname = 'image.tex0_unlink' - bl_label = "Unlink F3D Image" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - if context.material.mat_ver > 3: - context.material.f3d_mat.tex0.tex = None - else: - context.material.tex0.tex = None - return {'FINISHED'} # must return a set + bl_idname = "image.tex0_unlink" + bl_label = "Unlink F3D Image" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + if context.material.mat_ver > 3: + context.material.f3d_mat.tex0.tex = None + else: + context.material.tex0.tex = None + return {"FINISHED"} # must return a set + class UnlinkF3DImage1(bpy.types.Operator): - bl_idname = 'image.tex1_unlink' - bl_label = "Unlink F3D Image" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - if context.material.mat_ver > 3: - context.material.f3d_mat.tex1.tex = None - else: - context.material.tex1.tex = None - return {'FINISHED'} # must return a set + bl_idname = "image.tex1_unlink" + bl_label = "Unlink F3D Image" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + if context.material.mat_ver > 3: + context.material.f3d_mat.tex1.tex = None + else: + context.material.tex1.tex = None + return {"FINISHED"} # must return a set + class UpdateF3DNodes(bpy.types.Operator): - bl_idname = 'material.update_f3d_nodes' - bl_label = "Update F3D Nodes" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - if context is None or not hasattr(context, "material") or context.material is None: - self.report({"ERROR"}, "Material not found in context.") - return {"CANCELLED"} - if not context.material.is_f3d: - self.report({"ERROR"}, "Material is not F3D.") - return {"CANCELLED"} - material = context.material - - material.f3d_update_flag = True - update_node_values_of_material(material, context) - if material.mat_ver > 3: - material.f3d_mat.presetName = "Custom" - else: - material.f3d_preset = 'Custom' - material.f3d_update_flag = False - return {'FINISHED'} # must return a set + bl_idname = "material.update_f3d_nodes" + bl_label = "Update F3D Nodes" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + if ( + context is None + or not hasattr(context, "material") + or context.material is None + ): + self.report({"ERROR"}, "Material not found in context.") + return {"CANCELLED"} + if not context.material.is_f3d: + self.report({"ERROR"}, "Material is not F3D.") + return {"CANCELLED"} + material = context.material + + material.f3d_update_flag = True + update_node_values_of_material(material, context) + if material.mat_ver > 3: + material.f3d_mat.presetName = "Custom" + else: + material.f3d_preset = "Custom" + material.f3d_update_flag = False + return {"FINISHED"} # must return a set + mat_classes = ( - F3DNodeA, - F3DNodeB, - F3DNodeC, - F3DNodeD, - F3DNodeA_alpha, - F3DNodeB_alpha, - F3DNodeC_alpha, - F3DNodeD_alpha, - UnlinkF3DImage0, - UnlinkF3DImage1, - DrawLayerProperty, - MATERIAL_MT_f3d_presets, - AddPresetF3D, - F3DPanel, - CreateFast3DMaterial, - GetAlphaFromColor, - TextureFieldProperty, - SetTileSizeScrollProperty, - TextureProperty, - CombinerProperty, - ProceduralAnimProperty, - ProcAnimVectorProperty, - PrimDepthSettings, - RDPSettings, - DefaultRDPSettingsPanel, - F3DMaterialProperty, - ReloadDefaultF3DPresets, - UpdateF3DNodes, + F3DNodeA, + F3DNodeB, + F3DNodeC, + F3DNodeD, + F3DNodeA_alpha, + F3DNodeB_alpha, + F3DNodeC_alpha, + F3DNodeD_alpha, + UnlinkF3DImage0, + UnlinkF3DImage1, + DrawLayerProperty, + MATERIAL_MT_f3d_presets, + AddPresetF3D, + F3DPanel, + CreateFast3DMaterial, + GetAlphaFromColor, + TextureFieldProperty, + SetTileSizeScrollProperty, + TextureProperty, + CombinerProperty, + ProceduralAnimProperty, + ProcAnimVectorProperty, + PrimDepthSettings, + RDPSettings, + DefaultRDPSettingsPanel, + F3DMaterialProperty, + ReloadDefaultF3DPresets, + UpdateF3DNodes, ) + def mat_unregister_old(): - del bpy.types.Material.f3d_preset - - del bpy.types.Material.scale_autoprop - del bpy.types.Material.uv_basis - - # Combiners - del bpy.types.Material.presetName - - del bpy.types.Material.combiner1 - del bpy.types.Material.combiner2 - - # Texture animation - del bpy.types.Material.menu_procAnim - del bpy.types.Material.UVanim_tex1 - del bpy.types.Material.UVanim - - # material textures - del bpy.types.Material.tex_scale - del bpy.types.Material.tex0 - del bpy.types.Material.tex1 - - # Should Set? - del bpy.types.Material.set_prim - del bpy.types.Material.set_lights - del bpy.types.Material.set_env - del bpy.types.Material.set_blend - del bpy.types.Material.set_key - del bpy.types.Material.set_k0_5 - del bpy.types.Material.set_combiner - del bpy.types.Material.use_default_lighting - - # Blend Color - del bpy.types.Material.blend_color - - # Chroma - del bpy.types.Material.key_scale - del bpy.types.Material.key_width - - # Convert - del bpy.types.Material.k0 - del bpy.types.Material.k1 - del bpy.types.Material.k2 - del bpy.types.Material.k3 - del bpy.types.Material.k4 - del bpy.types.Material.k5 - - # Prim - del bpy.types.Material.prim_lod_frac - del bpy.types.Material.prim_lod_min - - # lights - del bpy.types.Material.default_light_color - del bpy.types.Material.ambient_light_color - del bpy.types.Material.f3d_light1 - del bpy.types.Material.f3d_light2 - del bpy.types.Material.f3d_light3 - del bpy.types.Material.f3d_light4 - del bpy.types.Material.f3d_light5 - del bpy.types.Material.f3d_light6 - del bpy.types.Material.f3d_light7 - - # Fog Properties - del bpy.types.Material.fog_color - del bpy.types.Material.fog_position - del bpy.types.Material.set_fog - del bpy.types.Material.use_global_fog - - # geometry mode - del bpy.types.Material.menu_geo - del bpy.types.Material.menu_upper - del bpy.types.Material.menu_lower - del bpy.types.Material.menu_other - del bpy.types.Material.menu_lower_render - del bpy.types.Material.rdp_settings + del bpy.types.Material.f3d_preset + + del bpy.types.Material.scale_autoprop + del bpy.types.Material.uv_basis + + # Combiners + del bpy.types.Material.presetName + + del bpy.types.Material.combiner1 + del bpy.types.Material.combiner2 + + # Texture animation + del bpy.types.Material.menu_procAnim + del bpy.types.Material.UVanim_tex1 + del bpy.types.Material.UVanim + + # material textures + del bpy.types.Material.tex_scale + del bpy.types.Material.tex0 + del bpy.types.Material.tex1 + + # Should Set? + del bpy.types.Material.set_prim + del bpy.types.Material.set_lights + del bpy.types.Material.set_env + del bpy.types.Material.set_blend + del bpy.types.Material.set_key + del bpy.types.Material.set_k0_5 + del bpy.types.Material.set_combiner + del bpy.types.Material.use_default_lighting + + # Blend Color + del bpy.types.Material.blend_color + + # Chroma + del bpy.types.Material.key_scale + del bpy.types.Material.key_width + + # Convert + del bpy.types.Material.k0 + del bpy.types.Material.k1 + del bpy.types.Material.k2 + del bpy.types.Material.k3 + del bpy.types.Material.k4 + del bpy.types.Material.k5 + + # Prim + del bpy.types.Material.prim_lod_frac + del bpy.types.Material.prim_lod_min + + # lights + del bpy.types.Material.default_light_color + del bpy.types.Material.ambient_light_color + del bpy.types.Material.f3d_light1 + del bpy.types.Material.f3d_light2 + del bpy.types.Material.f3d_light3 + del bpy.types.Material.f3d_light4 + del bpy.types.Material.f3d_light5 + del bpy.types.Material.f3d_light6 + del bpy.types.Material.f3d_light7 + + # Fog Properties + del bpy.types.Material.fog_color + del bpy.types.Material.fog_position + del bpy.types.Material.set_fog + del bpy.types.Material.use_global_fog + + # geometry mode + del bpy.types.Material.menu_geo + del bpy.types.Material.menu_upper + del bpy.types.Material.menu_lower + del bpy.types.Material.menu_other + del bpy.types.Material.menu_lower_render + del bpy.types.Material.rdp_settings + def mat_register_old(): - bpy.types.Material.f3d_preset = bpy.props.EnumProperty(name = 'F3D Preset', - items = enumMaterialPresets, default = 'Custom', - update = update_preset) - - bpy.types.Material.scale_autoprop = bpy.props.BoolProperty( - name = 'Auto Set Scale', default = True, - update = update_node_values_without_preset) - bpy.types.Material.uv_basis = bpy.props.EnumProperty( - name = 'UV Basis', default = 'TEXEL0', - update = update_tex_values, items = enumTexUV) - - # Combiners - bpy.types.Material.presetName = bpy.props.StringProperty(name = "Preset Name", default = "Custom") - - bpy.types.Material.combiner1 = bpy.props.PointerProperty(type = \ - CombinerProperty) - bpy.types.Material.combiner2 = bpy.props.PointerProperty(type = \ - CombinerProperty) - - # Texture animation - bpy.types.Material.menu_procAnim = bpy.props.BoolProperty() - #bpy.types.Material.positionAnim = bpy.props.PointerProperty( - # type = ProcAnimVectorProperty) - #bpy.types.Material.UVanim_tex0 = bpy.props.PointerProperty( - # type = ProcAnimVectorProperty) - bpy.types.Material.UVanim_tex1 = bpy.props.PointerProperty( - type = ProcAnimVectorProperty) - #bpy.types.Material.colorAnim = bpy.props.PointerProperty( - # type = ProcAnimVectorProperty) - - bpy.types.Material.UVanim = bpy.props.PointerProperty( - type = ProcAnimVectorProperty) - - # material textures - bpy.types.Material.tex_scale = bpy.props.FloatVectorProperty( - min = 0, max = 1, size = 2, default = (1,1), step = 1, - update = update_tex_values) - bpy.types.Material.tex0 = bpy.props.PointerProperty(type = TextureProperty) - bpy.types.Material.tex1 = bpy.props.PointerProperty(type = TextureProperty) - - # Should Set? - bpy.types.Material.set_prim = bpy.props.BoolProperty(default = True, - update = update_node_values) - bpy.types.Material.set_lights = bpy.props.BoolProperty(default = True, - update = update_node_values) - bpy.types.Material.set_env = bpy.props.BoolProperty(default = False, - update = update_node_values) - bpy.types.Material.set_blend = bpy.props.BoolProperty(default = False, - update = update_node_values) - bpy.types.Material.set_key = bpy.props.BoolProperty(default = True, - update = update_node_values) - bpy.types.Material.set_k0_5 = bpy.props.BoolProperty(default = True, - update = update_node_values) - bpy.types.Material.set_combiner = bpy.props.BoolProperty(default = True, - update = update_node_values) - bpy.types.Material.use_default_lighting = bpy.props.BoolProperty(default = True, - update = update_node_values_without_preset) - - # Blend Color - bpy.types.Material.blend_color = bpy.props.FloatVectorProperty( - name = 'Blend Color', subtype='COLOR', size = 4, min = 0, max = 1, default = (0,0,0,1)) - - # Chroma - bpy.types.Material.key_scale = bpy.props.FloatVectorProperty( - name = 'Key Scale', min = 0, max = 1, step = 1, - update = update_node_values) - bpy.types.Material.key_width = bpy.props.FloatVectorProperty( - name = 'Key Width', min = 0, max = 16, - update = update_node_values) - - # Convert - bpy.types.Material.k0 = bpy.props.FloatProperty(min = -1, max = 1, - default = 175/255, step = 1, update = update_node_values) - bpy.types.Material.k1 = bpy.props.FloatProperty(min = -1, max = 1, - default = -43/255, step = 1, update = update_node_values) - bpy.types.Material.k2 = bpy.props.FloatProperty(min = -1, max = 1, - default = -89/255, step = 1, update = update_node_values) - bpy.types.Material.k3 = bpy.props.FloatProperty(min = -1, max = 1, - default = 222/255, step = 1, update = update_node_values) - bpy.types.Material.k4 = bpy.props.FloatProperty(min = -1, max = 1, - default = 114/255, step = 1, update = update_node_values) - bpy.types.Material.k5 = bpy.props.FloatProperty(min = -1, max = 1, - default = 42/255, step = 1, update = update_node_values) - - # Prim - bpy.types.Material.prim_lod_frac = bpy.props.FloatProperty( - name = 'Prim LOD Frac', min = 0, max = 1, step = 1, - update = update_node_values) - bpy.types.Material.prim_lod_min = bpy.props.FloatProperty( - name = 'Min LOD Ratio', min = 0, max = 1, step = 1, - update = update_node_values) - - # lights - bpy.types.Material.default_light_color = bpy.props.FloatVectorProperty( - name = 'Default Light Color', subtype = 'COLOR', size = 4, min = 0, max = 1, default = (1,1,1,1), - update = update_node_values_without_preset) - bpy.types.Material.ambient_light_color = bpy.props.FloatVectorProperty( - name = 'Ambient Light Color', subtype = 'COLOR', size = 4, min = 0, max = 1, default = (0.5,0.5,0.5,1), - update = update_node_values_without_preset) - bpy.types.Material.f3d_light1 = bpy.props.PointerProperty( - type = bpy.types.Light, update = F3DOrganizeLights) - bpy.types.Material.f3d_light2 = bpy.props.PointerProperty( - type = bpy.types.Light, update = F3DOrganizeLights) - bpy.types.Material.f3d_light3 = bpy.props.PointerProperty( - type = bpy.types.Light, update = F3DOrganizeLights) - bpy.types.Material.f3d_light4 = bpy.props.PointerProperty( - type = bpy.types.Light, update = F3DOrganizeLights) - bpy.types.Material.f3d_light5 = bpy.props.PointerProperty( - type = bpy.types.Light, update = F3DOrganizeLights) - bpy.types.Material.f3d_light6 = bpy.props.PointerProperty( - type = bpy.types.Light, update = F3DOrganizeLights) - bpy.types.Material.f3d_light7 = bpy.props.PointerProperty( - type = bpy.types.Light, update = F3DOrganizeLights) - - # Fog Properties - bpy.types.Material.fog_color = bpy.props.FloatVectorProperty( - name = 'Fog Color', subtype='COLOR', size = 4, min = 0, max = 1, default = (0,0,0,1)) - bpy.types.Material.fog_position = bpy.props.IntVectorProperty( - name = 'Fog Range', size = 2, min = 0, max = 1000, default = (970,1000)) - bpy.types.Material.set_fog = bpy.props.BoolProperty() - bpy.types.Material.use_global_fog = bpy.props.BoolProperty(default = True) - - # geometry mode - bpy.types.Material.menu_geo = bpy.props.BoolProperty() - bpy.types.Material.menu_upper = bpy.props.BoolProperty() - bpy.types.Material.menu_lower = bpy.props.BoolProperty() - bpy.types.Material.menu_other = bpy.props.BoolProperty() - bpy.types.Material.menu_lower_render = bpy.props.BoolProperty() - bpy.types.Material.rdp_settings = bpy.props.PointerProperty( - type = RDPSettings) + bpy.types.Material.f3d_preset = bpy.props.EnumProperty( + name="F3D Preset", + items=enumMaterialPresets, + default="Custom", + update=update_preset, + ) + + bpy.types.Material.scale_autoprop = bpy.props.BoolProperty( + name="Auto Set Scale", default=True, update=update_node_values_without_preset + ) + bpy.types.Material.uv_basis = bpy.props.EnumProperty( + name="UV Basis", default="TEXEL0", update=update_tex_values, items=enumTexUV + ) + + # Combiners + bpy.types.Material.presetName = bpy.props.StringProperty( + name="Preset Name", default="Custom" + ) + + bpy.types.Material.combiner1 = bpy.props.PointerProperty(type=CombinerProperty) + bpy.types.Material.combiner2 = bpy.props.PointerProperty(type=CombinerProperty) + + # Texture animation + bpy.types.Material.menu_procAnim = bpy.props.BoolProperty() + # bpy.types.Material.positionAnim = bpy.props.PointerProperty( + # type = ProcAnimVectorProperty) + # bpy.types.Material.UVanim_tex0 = bpy.props.PointerProperty( + # type = ProcAnimVectorProperty) + bpy.types.Material.UVanim_tex1 = bpy.props.PointerProperty( + type=ProcAnimVectorProperty + ) + # bpy.types.Material.colorAnim = bpy.props.PointerProperty( + # type = ProcAnimVectorProperty) + + bpy.types.Material.UVanim = bpy.props.PointerProperty(type=ProcAnimVectorProperty) + + # material textures + bpy.types.Material.tex_scale = bpy.props.FloatVectorProperty( + min=0, max=1, size=2, default=(1, 1), step=1, update=update_tex_values + ) + bpy.types.Material.tex0 = bpy.props.PointerProperty(type=TextureProperty) + bpy.types.Material.tex1 = bpy.props.PointerProperty(type=TextureProperty) + + # Should Set? + bpy.types.Material.set_prim = bpy.props.BoolProperty( + default=True, update=update_node_values + ) + bpy.types.Material.set_lights = bpy.props.BoolProperty( + default=True, update=update_node_values + ) + bpy.types.Material.set_env = bpy.props.BoolProperty( + default=False, update=update_node_values + ) + bpy.types.Material.set_blend = bpy.props.BoolProperty( + default=False, update=update_node_values + ) + bpy.types.Material.set_key = bpy.props.BoolProperty( + default=True, update=update_node_values + ) + bpy.types.Material.set_k0_5 = bpy.props.BoolProperty( + default=True, update=update_node_values + ) + bpy.types.Material.set_combiner = bpy.props.BoolProperty( + default=True, update=update_node_values + ) + bpy.types.Material.use_default_lighting = bpy.props.BoolProperty( + default=True, update=update_node_values_without_preset + ) + + # Blend Color + bpy.types.Material.blend_color = bpy.props.FloatVectorProperty( + name="Blend Color", subtype="COLOR", size=4, min=0, max=1, default=(0, 0, 0, 1) + ) + + # Chroma + bpy.types.Material.key_scale = bpy.props.FloatVectorProperty( + name="Key Scale", min=0, max=1, step=1, update=update_node_values + ) + bpy.types.Material.key_width = bpy.props.FloatVectorProperty( + name="Key Width", min=0, max=16, update=update_node_values + ) + + # Convert + bpy.types.Material.k0 = bpy.props.FloatProperty( + min=-1, max=1, default=175 / 255, step=1, update=update_node_values + ) + bpy.types.Material.k1 = bpy.props.FloatProperty( + min=-1, max=1, default=-43 / 255, step=1, update=update_node_values + ) + bpy.types.Material.k2 = bpy.props.FloatProperty( + min=-1, max=1, default=-89 / 255, step=1, update=update_node_values + ) + bpy.types.Material.k3 = bpy.props.FloatProperty( + min=-1, max=1, default=222 / 255, step=1, update=update_node_values + ) + bpy.types.Material.k4 = bpy.props.FloatProperty( + min=-1, max=1, default=114 / 255, step=1, update=update_node_values + ) + bpy.types.Material.k5 = bpy.props.FloatProperty( + min=-1, max=1, default=42 / 255, step=1, update=update_node_values + ) + + # Prim + bpy.types.Material.prim_lod_frac = bpy.props.FloatProperty( + name="Prim LOD Frac", min=0, max=1, step=1, update=update_node_values + ) + bpy.types.Material.prim_lod_min = bpy.props.FloatProperty( + name="Min LOD Ratio", min=0, max=1, step=1, update=update_node_values + ) + + # lights + bpy.types.Material.default_light_color = bpy.props.FloatVectorProperty( + name="Default Light Color", + subtype="COLOR", + size=4, + min=0, + max=1, + default=(1, 1, 1, 1), + update=update_node_values_without_preset, + ) + bpy.types.Material.ambient_light_color = bpy.props.FloatVectorProperty( + name="Ambient Light Color", + subtype="COLOR", + size=4, + min=0, + max=1, + default=(0.5, 0.5, 0.5, 1), + update=update_node_values_without_preset, + ) + bpy.types.Material.f3d_light1 = bpy.props.PointerProperty( + type=bpy.types.Light, update=F3DOrganizeLights + ) + bpy.types.Material.f3d_light2 = bpy.props.PointerProperty( + type=bpy.types.Light, update=F3DOrganizeLights + ) + bpy.types.Material.f3d_light3 = bpy.props.PointerProperty( + type=bpy.types.Light, update=F3DOrganizeLights + ) + bpy.types.Material.f3d_light4 = bpy.props.PointerProperty( + type=bpy.types.Light, update=F3DOrganizeLights + ) + bpy.types.Material.f3d_light5 = bpy.props.PointerProperty( + type=bpy.types.Light, update=F3DOrganizeLights + ) + bpy.types.Material.f3d_light6 = bpy.props.PointerProperty( + type=bpy.types.Light, update=F3DOrganizeLights + ) + bpy.types.Material.f3d_light7 = bpy.props.PointerProperty( + type=bpy.types.Light, update=F3DOrganizeLights + ) + + # Fog Properties + bpy.types.Material.fog_color = bpy.props.FloatVectorProperty( + name="Fog Color", subtype="COLOR", size=4, min=0, max=1, default=(0, 0, 0, 1) + ) + bpy.types.Material.fog_position = bpy.props.IntVectorProperty( + name="Fog Range", size=2, min=0, max=1000, default=(970, 1000) + ) + bpy.types.Material.set_fog = bpy.props.BoolProperty() + bpy.types.Material.use_global_fog = bpy.props.BoolProperty(default=True) + + # geometry mode + bpy.types.Material.menu_geo = bpy.props.BoolProperty() + bpy.types.Material.menu_upper = bpy.props.BoolProperty() + bpy.types.Material.menu_lower = bpy.props.BoolProperty() + bpy.types.Material.menu_other = bpy.props.BoolProperty() + bpy.types.Material.menu_lower_render = bpy.props.BoolProperty() + bpy.types.Material.rdp_settings = bpy.props.PointerProperty(type=RDPSettings) + def findF3DPresetPath(filename): - try: - presetPath = bpy.utils.user_resource('SCRIPTS', - os.path.join("presets", "f3d"), create=True) - except: # 3.0 - presetPath = bpy.utils.user_resource('SCRIPTS', - path=os.path.join("presets", "f3d"), create=True) - for subdir in os.listdir(presetPath): - subPath = os.path.join(presetPath, subdir) - if os.path.isdir(subPath): - for preset in os.listdir(subPath): - if preset[:-3] == filename: - return os.path.join(subPath, filename) + ".py" - raise PluginError("Preset " + str(filename) + " not found.") + try: + presetPath = bpy.utils.user_resource( + "SCRIPTS", os.path.join("presets", "f3d"), create=True + ) + except: # 3.0 + presetPath = bpy.utils.user_resource( + "SCRIPTS", path=os.path.join("presets", "f3d"), create=True + ) + for subdir in os.listdir(presetPath): + subPath = os.path.join(presetPath, subdir) + if os.path.isdir(subPath): + for preset in os.listdir(subPath): + if preset[:-3] == filename: + return os.path.join(subPath, filename) + ".py" + raise PluginError("Preset " + str(filename) + " not found.") + def getF3DPresetPath(filename, subdir): - try: - presetPath = bpy.utils.user_resource('SCRIPTS', - os.path.join("presets", subdir), create=True) - except: # 3.0 - presetPath = bpy.utils.user_resource('SCRIPTS', - path=os.path.join("presets", subdir), create=True) - return os.path.join(presetPath, filename) + ".py" + try: + presetPath = bpy.utils.user_resource( + "SCRIPTS", os.path.join("presets", subdir), create=True + ) + except: # 3.0 + presetPath = bpy.utils.user_resource( + "SCRIPTS", path=os.path.join("presets", subdir), create=True + ) + return os.path.join(presetPath, filename) + ".py" + def savePresets(): - for subdir, presets in material_presets.items(): - for filename, preset in presets.items(): - filepath = getF3DPresetPath(filename, 'f3d/' + subdir) - file_preset = open(filepath, 'w', encoding="utf-8") - file_preset.write(preset) - file_preset.close() + for subdir, presets in material_presets.items(): + for filename, preset in presets.items(): + filepath = getF3DPresetPath(filename, "f3d/" + subdir) + file_preset = open(filepath, "w", encoding="utf-8") + file_preset.write(preset) + file_preset.close() + def mat_register(): - #bpy.app.handlers.load_post.append(loadTimer) - for cls in mat_classes: - try: - register_class(cls) - except: - print('failed to register:', cls) - - #presetDict = addMaterialPresets() - #for presetName, presetItem in presetDict.items(): - # enumMaterialPresets.append((presetName, presetName, presetName)) - # materialPresetDict[presetName] = presetItem - - savePresets() - - nodeitems_utils.register_node_categories('CUSTOM_NODES', node_categories) - - bpy.types.Scene.f3d_type = bpy.props.EnumProperty( - name = 'F3D Microcode', items = enumF3D, default = 'F3D') - bpy.types.Scene.isHWv1 = bpy.props.BoolProperty(name = 'Is Hardware v1?') - - # RDP Defaults - bpy.types.World.rdp_defaults = bpy.props.PointerProperty( - type = RDPSettings) - bpy.types.World.menu_geo = bpy.props.BoolProperty() - bpy.types.World.menu_upper = bpy.props.BoolProperty() - bpy.types.World.menu_lower = bpy.props.BoolProperty() - bpy.types.World.menu_other = bpy.props.BoolProperty() - bpy.types.World.menu_layers = bpy.props.BoolProperty() - - mat_register_old() - bpy.types.Material.is_f3d = bpy.props.BoolProperty() - bpy.types.Material.mat_ver = bpy.props.IntProperty(default = 1) - bpy.types.Material.f3d_update_flag = bpy.props.BoolProperty() - bpy.types.Material.f3d_mat = bpy.props.PointerProperty(type = F3DMaterialProperty) - bpy.types.Material.menu_tab = bpy.props.EnumProperty(items = enumF3DMenu) - - bpy.types.Scene.f3dUserPresetsOnly = bpy.props.BoolProperty(name = "User Presets Only") - bpy.types.Scene.f3d_simple = bpy.props.BoolProperty(name = "Display Simple", default = True) - - bpy.types.Object.use_f3d_culling = bpy.props.BoolProperty( - name = 'Enable Culling (Applies to F3DEX and up)', default = True) - bpy.types.Object.ignore_render = bpy.props.BoolProperty( - name = 'Ignore Render') - bpy.types.Object.ignore_collision = bpy.props.BoolProperty( - name = 'Ignore Collision') - bpy.types.Object.f3d_lod_z = bpy.props.IntProperty( - name = "F3D LOD Z", min = 1, default = 10) - bpy.types.Object.f3d_lod_always_render_farthest = bpy.props.BoolProperty(name = "Always Render Farthest LOD") + # bpy.app.handlers.load_post.append(loadTimer) + for cls in mat_classes: + try: + register_class(cls) + except: + print("failed to register:", cls) + + # presetDict = addMaterialPresets() + # for presetName, presetItem in presetDict.items(): + # enumMaterialPresets.append((presetName, presetName, presetName)) + # materialPresetDict[presetName] = presetItem + + savePresets() + + nodeitems_utils.register_node_categories("CUSTOM_NODES", node_categories) + + bpy.types.Scene.f3d_type = bpy.props.EnumProperty( + name="F3D Microcode", items=enumF3D, default="F3D" + ) + bpy.types.Scene.isHWv1 = bpy.props.BoolProperty(name="Is Hardware v1?") + + # RDP Defaults + bpy.types.World.rdp_defaults = bpy.props.PointerProperty(type=RDPSettings) + bpy.types.World.menu_geo = bpy.props.BoolProperty() + bpy.types.World.menu_upper = bpy.props.BoolProperty() + bpy.types.World.menu_lower = bpy.props.BoolProperty() + bpy.types.World.menu_other = bpy.props.BoolProperty() + bpy.types.World.menu_layers = bpy.props.BoolProperty() + + mat_register_old() + bpy.types.Material.is_f3d = bpy.props.BoolProperty() + bpy.types.Material.mat_ver = bpy.props.IntProperty(default=1) + bpy.types.Material.f3d_update_flag = bpy.props.BoolProperty() + bpy.types.Material.f3d_mat = bpy.props.PointerProperty(type=F3DMaterialProperty) + bpy.types.Material.menu_tab = bpy.props.EnumProperty(items=enumF3DMenu) + + bpy.types.Scene.f3dUserPresetsOnly = bpy.props.BoolProperty( + name="User Presets Only" + ) + bpy.types.Scene.f3d_simple = bpy.props.BoolProperty( + name="Display Simple", default=True + ) + + bpy.types.Object.use_f3d_culling = bpy.props.BoolProperty( + name="Enable Culling (Applies to F3DEX and up)", default=True + ) + bpy.types.Object.ignore_render = bpy.props.BoolProperty(name="Ignore Render") + bpy.types.Object.ignore_collision = bpy.props.BoolProperty(name="Ignore Collision") + bpy.types.Object.f3d_lod_z = bpy.props.IntProperty( + name="F3D LOD Z", min=1, default=10 + ) + bpy.types.Object.f3d_lod_always_render_farthest = bpy.props.BoolProperty( + name="Always Render Farthest LOD" + ) + def mat_unregister(): - del bpy.types.Material.menu_tab - del bpy.types.Material.f3d_mat - del bpy.types.Material.is_f3d - del bpy.types.Material.mat_ver - del bpy.types.Material.f3d_update_flag - del bpy.types.Scene.f3d_simple - del bpy.types.Object.ignore_render - del bpy.types.Object.ignore_collision - del bpy.types.Object.use_f3d_culling - del bpy.types.Scene.f3dUserPresetsOnly - del bpy.types.Object.f3d_lod_z - del bpy.types.Object.f3d_lod_always_render_farthest - nodeitems_utils.unregister_node_categories('CUSTOM_NODES') - for cls in reversed(mat_classes): - unregister_class(cls) - -#from .f3d_material import * + del bpy.types.Material.menu_tab + del bpy.types.Material.f3d_mat + del bpy.types.Material.is_f3d + del bpy.types.Material.mat_ver + del bpy.types.Material.f3d_update_flag + del bpy.types.Scene.f3d_simple + del bpy.types.Object.ignore_render + del bpy.types.Object.ignore_collision + del bpy.types.Object.use_f3d_culling + del bpy.types.Scene.f3dUserPresetsOnly + del bpy.types.Object.f3d_lod_z + del bpy.types.Object.f3d_lod_always_render_farthest + nodeitems_utils.unregister_node_categories("CUSTOM_NODES") + for cls in reversed(mat_classes): + unregister_class(cls) + + +# from .f3d_material import * # Presets sm64_unlit_texture = F3DMaterialSettings() @@ -3295,12 +4152,16 @@ def mat_unregister(): sm64_vert_colored_tex.set_env = False sm64_vert_colored_tex_no_vert_alpha = F3DMaterialSettings() -sm64_vert_colored_tex_no_vert_alpha.color_combiner = tuple(S_VERTEX_COLORED_TEX_NO_VERT_ALPHA) +sm64_vert_colored_tex_no_vert_alpha.color_combiner = tuple( + S_VERTEX_COLORED_TEX_NO_VERT_ALPHA +) sm64_vert_colored_tex_no_vert_alpha.g_lighting = False sm64_vert_colored_tex_no_vert_alpha.set_env = False sm64_vert_colored_tex_transparent = F3DMaterialSettings() -sm64_vert_colored_tex_transparent.color_combiner = tuple(S_VERTEX_COLORED_TEX_TRANSPARENT) +sm64_vert_colored_tex_transparent.color_combiner = tuple( + S_VERTEX_COLORED_TEX_TRANSPARENT +) sm64_vert_colored_tex_transparent.g_lighting = False sm64_vert_colored_tex_transparent.set_env = False sm64_vert_colored_tex_transparent.blend_method = "BLEND" @@ -3320,61 +4181,79 @@ def mat_unregister(): sm64_fog_shaded_texture.color_combiner = tuple(S_FOG_SHADED_TEX) sm64_fog_shaded_texture.set_env = False sm64_fog_shaded_texture.set_fog = True -sm64_fog_shaded_texture.g_mdsft_cycletype = 'G_CYC_2CYCLE' +sm64_fog_shaded_texture.g_mdsft_cycletype = "G_CYC_2CYCLE" sm64_fog_shaded_texture.set_rendermode = True sm64_fog_shaded_texture.rendermode_advanced_enabled = False -sm64_fog_shaded_texture.rendermode_preset_cycle_1 = 'G_RM_FOG_SHADE_A' -sm64_fog_shaded_texture.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_OPA_SURF2' +sm64_fog_shaded_texture.rendermode_preset_cycle_1 = "G_RM_FOG_SHADE_A" +sm64_fog_shaded_texture.rendermode_preset_cycle_2 = "G_RM_AA_ZB_OPA_SURF2" sm64_fog_shaded_texture_cutout = copy.deepcopy(sm64_fog_shaded_texture) -sm64_fog_shaded_texture_cutout.color_combiner = \ - tuple(S_FOG_SHADED_TEX_CUTOUT) -sm64_fog_shaded_texture_cutout.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_TEX_EDGE2' +sm64_fog_shaded_texture_cutout.color_combiner = tuple(S_FOG_SHADED_TEX_CUTOUT) +sm64_fog_shaded_texture_cutout.rendermode_preset_cycle_2 = "G_RM_AA_ZB_TEX_EDGE2" sm64_fog_shaded_texture_cutout.g_cull_back = False sm64_fog_shaded_texture_cutout.blend_method = "CLIP" sm64_fog_shaded_texture_transparent = copy.deepcopy(sm64_fog_shaded_texture) -sm64_fog_shaded_texture_transparent.color_combiner = \ - tuple(S_FOG_PRIM_TRANSPARENT_SHADE) -sm64_fog_shaded_texture_transparent.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_XLU_SURF2' +sm64_fog_shaded_texture_transparent.color_combiner = tuple(S_FOG_PRIM_TRANSPARENT_SHADE) +sm64_fog_shaded_texture_transparent.rendermode_preset_cycle_2 = "G_RM_AA_ZB_XLU_SURF2" sm64_fog_shaded_texture_transparent.g_cull_back = False sm64_fog_shaded_texture_transparent.blend_method = "BLEND" # WARNING: Adding new presets will break any custom presets added afterward. enumMaterialPresets = [ - ('Custom', 'Custom', 'Custom'), - ('Unlit Texture', 'Unlit Texture', 'Unlit Texture'), - ('Unlit Texture Cutout', 'Unlit Texture Cutout', 'Unlit Texture Cutout'), - ('Shaded Solid', 'Shaded Solid', 'Shaded Solid'), - ('Decal On Shaded Solid', 'Decal On Shaded Solid', 'Decal On Shaded Solid'), - ('Shaded Texture', 'Shaded Texture', 'Shaded Texture'), - ('Shaded Texture Cutout', 'Shaded Texture Cutout', 'Shaded Texture Cutout'), - ('Shaded Texture Transparent', 'Shaded Texture Transparent (Prim Alpha)', 'Shaded Texture Transparent (Prim Alpha)'), - ('Vertex Colored Texture', 'Vertex Colored Texture', 'Vertex Colored Texture'), - ('Environment Mapped', 'Environment Mapped', 'Environment Mapped'), - ('Fog Shaded Texture', 'Fog Shaded Texture', 'Fog Shaded Texture'), - ('Fog Shaded Texture Cutout', 'Fog Shaded Texture Cutout', 'Fog Shaded Texture Cutout'), - ('Fog Shaded Texture Transparent', 'Fog Shaded Texture Transparent (Prim Alpha)', 'Fog Shaded Texture Transparent (Prim Alpha)'), - ('Vertex Colored Texture Transparent', 'Vertex Colored Texture Transparent', 'Vertex Colored Texture Transparent'), - ('Shaded Noise', 'Shaded Noise', 'Shaded Noise'), - ('Vertex Colored Texture (No Vertex Alpha)', 'Vertex Colored Texture (No Vertex Alpha)', 'Vertex Colored Texture (No Vertex Alpha)'), + ("Custom", "Custom", "Custom"), + ("Unlit Texture", "Unlit Texture", "Unlit Texture"), + ("Unlit Texture Cutout", "Unlit Texture Cutout", "Unlit Texture Cutout"), + ("Shaded Solid", "Shaded Solid", "Shaded Solid"), + ("Decal On Shaded Solid", "Decal On Shaded Solid", "Decal On Shaded Solid"), + ("Shaded Texture", "Shaded Texture", "Shaded Texture"), + ("Shaded Texture Cutout", "Shaded Texture Cutout", "Shaded Texture Cutout"), + ( + "Shaded Texture Transparent", + "Shaded Texture Transparent (Prim Alpha)", + "Shaded Texture Transparent (Prim Alpha)", + ), + ("Vertex Colored Texture", "Vertex Colored Texture", "Vertex Colored Texture"), + ("Environment Mapped", "Environment Mapped", "Environment Mapped"), + ("Fog Shaded Texture", "Fog Shaded Texture", "Fog Shaded Texture"), + ( + "Fog Shaded Texture Cutout", + "Fog Shaded Texture Cutout", + "Fog Shaded Texture Cutout", + ), + ( + "Fog Shaded Texture Transparent", + "Fog Shaded Texture Transparent (Prim Alpha)", + "Fog Shaded Texture Transparent (Prim Alpha)", + ), + ( + "Vertex Colored Texture Transparent", + "Vertex Colored Texture Transparent", + "Vertex Colored Texture Transparent", + ), + ("Shaded Noise", "Shaded Noise", "Shaded Noise"), + ( + "Vertex Colored Texture (No Vertex Alpha)", + "Vertex Colored Texture (No Vertex Alpha)", + "Vertex Colored Texture (No Vertex Alpha)", + ), ] materialPresetDict = { - 'Unlit Texture' : sm64_unlit_texture, - 'Unlit Texture Cutout' : sm64_unlit_texture_cutout, - 'Shaded Solid' : sm64_shaded_solid, - 'Shaded Texture' : sm64_shaded_texture, - 'Shaded Texture Cutout' : sm64_shaded_texture_cutout, - 'Shaded Texture Transparent' : sm64_prim_transparent_shade, - 'Environment Mapped' : sm64_unlit_env_map, - 'Decal On Shaded Solid' : sm64_decal, - 'Vertex Colored Texture' : sm64_vert_colored_tex, - 'Fog Shaded Texture' : sm64_fog_shaded_texture, - 'Fog Shaded Texture Cutout' : sm64_fog_shaded_texture_cutout, - 'Fog Shaded Texture Transparent' : sm64_fog_shaded_texture_transparent, - 'Vertex Colored Texture Transparent' : sm64_vert_colored_tex_transparent, - 'Shaded Noise' : sm64_shaded_noise, - 'Vertex Colored Texture (No Vertex Alpha)' : sm64_vert_colored_tex_no_vert_alpha, + "Unlit Texture": sm64_unlit_texture, + "Unlit Texture Cutout": sm64_unlit_texture_cutout, + "Shaded Solid": sm64_shaded_solid, + "Shaded Texture": sm64_shaded_texture, + "Shaded Texture Cutout": sm64_shaded_texture_cutout, + "Shaded Texture Transparent": sm64_prim_transparent_shade, + "Environment Mapped": sm64_unlit_env_map, + "Decal On Shaded Solid": sm64_decal, + "Vertex Colored Texture": sm64_vert_colored_tex, + "Fog Shaded Texture": sm64_fog_shaded_texture, + "Fog Shaded Texture Cutout": sm64_fog_shaded_texture_cutout, + "Fog Shaded Texture Transparent": sm64_fog_shaded_texture_transparent, + "Vertex Colored Texture Transparent": sm64_vert_colored_tex_transparent, + "Shaded Noise": sm64_shaded_noise, + "Vertex Colored Texture (No Vertex Alpha)": sm64_vert_colored_tex_no_vert_alpha, } diff --git a/fast64_internal/f3d/f3d_material_nodes.py b/fast64_internal/f3d/f3d_material_nodes.py index 5d46b39ce..eb06e8270 100644 --- a/fast64_internal/f3d/f3d_material_nodes.py +++ b/fast64_internal/f3d/f3d_material_nodes.py @@ -1,1111 +1,1264 @@ import bpy, math, mathutils, nodeitems_utils -from bpy.types import Node, NodeSocket, NodeSocketInterface, ShaderNode, ShaderNodeGroup, Panel +from bpy.types import ( + Node, + NodeSocket, + NodeSocketInterface, + ShaderNode, + ShaderNodeGroup, + Panel, +) from nodeitems_utils import NodeCategory, NodeItem from .f3d_gbi import F3D from .f3d_enums import * from bpy.utils import register_class, unregister_class + def createGroupLink(node_tree, inputSocket, outputSocket, outputType, outputName): - if outputType is not None: - node_tree.outputs.new(outputType, outputName) - node_tree.links.new(inputSocket, outputSocket) + if outputType is not None: + node_tree.outputs.new(outputType, outputName) + node_tree.links.new(inputSocket, outputSocket) + def addColorWithAlphaNode(label, x, y, node_tree): - alphaSplitNode = node_tree.nodes.new('GetAlphaFromColor') - alphaSplitNode.location = (x-300, y) - alphaSplitNode.name = label + " Output" - - addNode = node_tree.nodes.new('ShaderNodeMath') - addNode.operation = 'ADD' - addNode.inputs[1].default_value = 0 - node_tree.links.new(addNode.inputs[0], alphaSplitNode.outputs[1]) - addNode.location = (x,y) - addNode.name = label + ' Alpha' - - mixNode = node_tree.nodes.new('ShaderNodeMixRGB') - mixNode.inputs[0].default_value = 0 - node_tree.links.new(mixNode.inputs[1], alphaSplitNode.outputs[0]) - mixNode.location = (x,y - 100) - mixNode.name = label + ' RGB' - - y -= 100 - return x, y, alphaSplitNode - -def addNodeAt(node_tree, name, label, x, y, nodeKey = None, nodeDict = None): - node = node_tree.nodes.new(name) - if label is not None: - node.label = label - node.name = label - node.location = (x,y) - if label == '1': - node.outputs[0].default_value = 1 - elif label == '0': - node.outputs[0].default_value = 0 - elif label == 'Shade Color': - node.label = 'Shade Shader' - colorNode = node_tree.nodes.new('ShaderNodeShaderToRGB') - node.inputs[0].default_value = (1,1,1,1) - if label is not None: - colorNode.label = label - node_tree.links.new(colorNode.inputs[0], node.outputs[0]) - colorNode.location = (x,y) - node.location = (x - 300, y) - node = colorNode - elif label == 'Noise': - node.inputs[1].default_value = 40 # scale - node.inputs[2].default_value = 0 # detail - - if nodeDict is not None: - if name in nodeDict: - raise ValueError(name + " already in the node dictionary.") - if nodeKey is not None: - nodeDict[nodeKey] = node - else: - nodeDict[name] = node - return (node, x, y - (node.height)) - -def addNodeListAt(node_tree, nodeDict, x,y, cycleIndex = None): - newDict = {} - for label, typename in nodeDict.items(): - if cycleIndex is not None: - name = label + " " + str(cycleIndex) - else: - name = label - node, xDiscard, y = addNodeAt(node_tree, typename, name, x, y) - newDict[name] = node - return newDict, x, y - -def addSocketList(groupNode, groupInputNode, socketDict, cycleIndex = None): - newDict = {} - for label, typename in socketDict.items(): - if cycleIndex is not None: - name = label + " " + str(cycleIndex) - else: - name = label - #addNodeAt(node_tree, typename, name, x, y) - groupNode.inputs.new(typename, name) - groupInputNode.outputs.new(typename, name) - - # We want to get the new output socket. - # new() doesn't actually return the socket, so we must index the collection. - # -1 is the index for the virtual socket at the end, so we want -2 instead. - outputSocket = groupInputNode.outputs[-2] - - newDict[name] = outputSocket - return newDict + alphaSplitNode = node_tree.nodes.new("GetAlphaFromColor") + alphaSplitNode.location = (x - 300, y) + alphaSplitNode.name = label + " Output" + + addNode = node_tree.nodes.new("ShaderNodeMath") + addNode.operation = "ADD" + addNode.inputs[1].default_value = 0 + node_tree.links.new(addNode.inputs[0], alphaSplitNode.outputs[1]) + addNode.location = (x, y) + addNode.name = label + " Alpha" + + mixNode = node_tree.nodes.new("ShaderNodeMixRGB") + mixNode.inputs[0].default_value = 0 + node_tree.links.new(mixNode.inputs[1], alphaSplitNode.outputs[0]) + mixNode.location = (x, y - 100) + mixNode.name = label + " RGB" + + y -= 100 + return x, y, alphaSplitNode + + +def addNodeAt(node_tree, name, label, x, y, nodeKey=None, nodeDict=None): + node = node_tree.nodes.new(name) + if label is not None: + node.label = label + node.name = label + node.location = (x, y) + if label == "1": + node.outputs[0].default_value = 1 + elif label == "0": + node.outputs[0].default_value = 0 + elif label == "Shade Color": + node.label = "Shade Shader" + colorNode = node_tree.nodes.new("ShaderNodeShaderToRGB") + node.inputs[0].default_value = (1, 1, 1, 1) + if label is not None: + colorNode.label = label + node_tree.links.new(colorNode.inputs[0], node.outputs[0]) + colorNode.location = (x, y) + node.location = (x - 300, y) + node = colorNode + elif label == "Noise": + node.inputs[1].default_value = 40 # scale + node.inputs[2].default_value = 0 # detail + + if nodeDict is not None: + if name in nodeDict: + raise ValueError(name + " already in the node dictionary.") + if nodeKey is not None: + nodeDict[nodeKey] = node + else: + nodeDict[name] = node + return (node, x, y - (node.height)) + + +def addNodeListAt(node_tree, nodeDict, x, y, cycleIndex=None): + newDict = {} + for label, typename in nodeDict.items(): + if cycleIndex is not None: + name = label + " " + str(cycleIndex) + else: + name = label + node, xDiscard, y = addNodeAt(node_tree, typename, name, x, y) + newDict[name] = node + return newDict, x, y + + +def addSocketList(groupNode, groupInputNode, socketDict, cycleIndex=None): + newDict = {} + for label, typename in socketDict.items(): + if cycleIndex is not None: + name = label + " " + str(cycleIndex) + else: + name = label + # addNodeAt(node_tree, typename, name, x, y) + groupNode.inputs.new(typename, name) + groupInputNode.outputs.new(typename, name) + + # We want to get the new output socket. + # new() doesn't actually return the socket, so we must index the collection. + # -1 is the index for the virtual socket at the end, so we want -2 instead. + outputSocket = groupInputNode.outputs[-2] + + newDict[name] = outputSocket + return newDict + # In 2.8 the Node.update function does not work. # We can bypass this by adding an update callback to a property in the node. # However, forcing an output socket update does NOT work when the output # is a group node input. Thus we must add an "add" bridge node in between to fix this. -def addNodeListAtWithZeroAddNode(node_tree, nodeDict, x,y, cycleIndex): - newDict = {} - for label, typename in nodeDict.items(): - name = label + " " + str(cycleIndex) - node, nextX, nextY = addNodeAt(node_tree, typename, name, x, y) - bridge, nextX, nextY = addNodeAt( - node_tree, 'ShaderNodeMath', name + ' Bridge', nextX, y) - bridge.operation = 'ADD' - bridge.inputs[1].default_value = 0 - node_tree.links.new(bridge.inputs[0], node.outputs[0]) - newDict[name] = bridge - y = nextY - return newDict +def addNodeListAtWithZeroAddNode(node_tree, nodeDict, x, y, cycleIndex): + newDict = {} + for label, typename in nodeDict.items(): + name = label + " " + str(cycleIndex) + node, nextX, nextY = addNodeAt(node_tree, typename, name, x, y) + bridge, nextX, nextY = addNodeAt( + node_tree, "ShaderNodeMath", name + " Bridge", nextX, y + ) + bridge.operation = "ADD" + bridge.inputs[1].default_value = 0 + node_tree.links.new(bridge.inputs[0], node.outputs[0]) + newDict[name] = bridge + y = nextY + return newDict + # Assumes ascending order of cases. -def createNodeSwitch(node_tree, caseDict, caseSocket, caseName, - location, socketDict): - groupNode = node_tree.nodes.new("ShaderNodeGroup") - groupNode.location = location - location[1] = location[1] - (groupNode.height + 100) - - createGroup = 'Switch ' + caseName + ' F3D v3' not in bpy.data.node_groups - if not createGroup: - group_tree = bpy.data.node_groups["Switch " + caseName + " F3D v3"] - groupNode.node_tree = group_tree - - node_tree.links.new(groupNode.inputs[0], caseSocket) - internalSocketDict, nextSocketIndex = socketDictToInternalSocket(node_tree, - groupNode, None, socketDict, 1, False) - return groupNode - - group_tree = bpy.data.node_groups.new(type="ShaderNodeTree", name = 'Switch ' + caseName + ' F3D v3') - groupNode.node_tree = group_tree - input_node = group_tree.nodes.new("NodeGroupInput") - output_node = group_tree.nodes.new("NodeGroupOutput") - input_node.location = (-300, 0) - output_node.location = (600, 0) - - # Add case node links - groupNode.inputs.new('NodeSocketInt', caseName) - node_tree.links.new(groupNode.inputs[0], caseSocket) - input_node.outputs.new('NodeSocketInt', caseName) - output_node.inputs.new('NodeSocketInt', caseName) - caseNodeInternal = input_node.outputs[0] - - internalSocketDict, nextSocketIndex = socketDictToInternalSocket(node_tree, - groupNode, input_node, socketDict, 1, True) - - nodePos = [0,0] - for case in reversed(range (len(caseDict))): - name = caseDict[case] - if case == len(caseDict) - 1: - prevSocket = internalSocketDict[name] - else: - greaterThanNode, mixNodeX, y = \ - addNodeAt(group_tree, 'ShaderNodeMath', None, *nodePos) - greaterThanNode.operation = 'GREATER_THAN' - mixNode, x, nodePos[1] = addNodeAt(group_tree, - 'ShaderNodeMixRGB', None, mixNodeX, nodePos[1]) - - group_tree.links.new(greaterThanNode.inputs[0], caseNodeInternal) - group_tree.links.new(mixNode.inputs[0], - greaterThanNode.outputs[0]) - greaterThanNode.inputs[1].default_value = case - - # Connect group input to nodes - group_tree.links.new(mixNode.inputs[1], - internalSocketDict[name]) - group_tree.links.new(mixNode.inputs[2], - prevSocket) - - prevSocket = mixNode.outputs[0] - - group_tree.links.new(output_node.inputs[0], prevSocket) - - return groupNode - -def createNodeCombinerMix(node_tree, nodeASocket, nodeBSocket, nodeCSocket, nodeDSocket, location, isAlpha): - groupNode = node_tree.nodes.new("ShaderNodeGroup") - groupNode.location = location - location[1] = location[1] - (groupNode.height + 100) - - alphaText = 'Alpha ' if isAlpha else '' - - createGroup = 'Color Combiner ' + alphaText + 'Mix F3D v3' not in bpy.data.node_groups - if not createGroup: - group_tree = bpy.data.node_groups['Color Combiner ' + alphaText + 'Mix F3D v3'] - groupNode.node_tree = group_tree - - inputA = groupNode.inputs[0] - node_tree.links.new(inputA, nodeASocket) - - inputB = groupNode.inputs[1] - node_tree.links.new(inputB, nodeBSocket) - - inputC = groupNode.inputs[2] - node_tree.links.new(inputC, nodeCSocket) - - inputD = groupNode.inputs[3] - node_tree.links.new(inputD, nodeDSocket) - - return groupNode - - # (A-B)*C + D - group_tree = bpy.data.node_groups.new(type="ShaderNodeTree", name = 'Color Combiner ' + alphaText + 'Mix F3D v3') - groupNode.node_tree = group_tree - input_node = group_tree.nodes.new("NodeGroupInput") - input_node.location = (-300, 0) - output_node = group_tree.nodes.new("NodeGroupOutput") - output_node.location = (600, 0) - - # Add input source to group input - socketType = 'NodeSocketColor' if not isAlpha else 'NodeSocketFloat' - groupNode.inputs.new(socketType, 'A') - input_node.outputs.new(socketType, 'A') - inputA = groupNode.inputs[0] - node_tree.links.new(inputA, nodeASocket) - - groupNode.inputs.new(socketType, 'B') - input_node.outputs.new(socketType, 'B') - inputB = groupNode.inputs[1] - node_tree.links.new(inputB, nodeBSocket) - - groupNode.inputs.new(socketType, 'C') - input_node.outputs.new(socketType, 'C') - inputC = groupNode.inputs[2] - node_tree.links.new(inputC, nodeCSocket) - - groupNode.inputs.new(socketType, 'D') - input_node.outputs.new(socketType, 'D') - inputD = groupNode.inputs[3] - node_tree.links.new(inputD, nodeDSocket) - - nodePos = [0,0] - if not isAlpha: - nodeSubtract, x, nodePos[1] = \ - addNodeAt(group_tree, 'ShaderNodeMixRGB', 'Subtract', *nodePos) - nodeMultiply, x, nodePos[1] = \ - addNodeAt(group_tree, 'ShaderNodeMixRGB', 'Multiply', *nodePos) - nodeAdd, x, nodePos[1] = \ - addNodeAt(group_tree, 'ShaderNodeMixRGB', 'Add', *nodePos) - - nodeSubtract.blend_type = 'SUBTRACT' - nodeMultiply.blend_type = 'MULTIPLY' - nodeAdd.blend_type = 'ADD' - - nodeSubtract.inputs['Fac'].default_value = 1 - nodeMultiply.inputs['Fac'].default_value = 1 - nodeAdd.inputs['Fac'].default_value = 1 - else: - nodeSubtract, x, nodePos[1] = \ - addNodeAt(group_tree, 'ShaderNodeMath', 'Subtract', *nodePos) - nodeMultiply, x, nodePos[1] = \ - addNodeAt(group_tree, 'ShaderNodeMath', 'Multiply', *nodePos) - nodeAdd, x, nodePos[1] = \ - addNodeAt(group_tree, 'ShaderNodeMath', 'Add', *nodePos) - - nodeSubtract.operation = 'SUBTRACT' - nodeMultiply.operation = 'MULTIPLY' - nodeAdd.operation = 'ADD' - - index1 = 1 if not isAlpha else 0 - index2 = 2 if not isAlpha else 1 - group_tree.links.new(nodeSubtract.inputs[index1], input_node.outputs[0]) - group_tree.links.new(nodeSubtract.inputs[index2], input_node.outputs[1]) - group_tree.links.new(nodeMultiply.inputs[index1], nodeSubtract.outputs[0]) - group_tree.links.new(nodeMultiply.inputs[index2], input_node.outputs[2]) - group_tree.links.new(nodeAdd.inputs[index1], nodeMultiply.outputs[0]) - group_tree.links.new(nodeAdd.inputs[index2], input_node.outputs[3]) - - output_node.inputs.new(socketType, 'Output') - groupNode.outputs.new(socketType, 'Output') - group_tree.links.new(output_node.inputs[0], nodeAdd.outputs[0]) - - return groupNode +def createNodeSwitch(node_tree, caseDict, caseSocket, caseName, location, socketDict): + groupNode = node_tree.nodes.new("ShaderNodeGroup") + groupNode.location = location + location[1] = location[1] - (groupNode.height + 100) + + createGroup = "Switch " + caseName + " F3D v3" not in bpy.data.node_groups + if not createGroup: + group_tree = bpy.data.node_groups["Switch " + caseName + " F3D v3"] + groupNode.node_tree = group_tree + + node_tree.links.new(groupNode.inputs[0], caseSocket) + internalSocketDict, nextSocketIndex = socketDictToInternalSocket( + node_tree, groupNode, None, socketDict, 1, False + ) + return groupNode + + group_tree = bpy.data.node_groups.new( + type="ShaderNodeTree", name="Switch " + caseName + " F3D v3" + ) + groupNode.node_tree = group_tree + input_node = group_tree.nodes.new("NodeGroupInput") + output_node = group_tree.nodes.new("NodeGroupOutput") + input_node.location = (-300, 0) + output_node.location = (600, 0) + + # Add case node links + groupNode.inputs.new("NodeSocketInt", caseName) + node_tree.links.new(groupNode.inputs[0], caseSocket) + input_node.outputs.new("NodeSocketInt", caseName) + output_node.inputs.new("NodeSocketInt", caseName) + caseNodeInternal = input_node.outputs[0] + + internalSocketDict, nextSocketIndex = socketDictToInternalSocket( + node_tree, groupNode, input_node, socketDict, 1, True + ) + + nodePos = [0, 0] + for case in reversed(range(len(caseDict))): + name = caseDict[case] + if case == len(caseDict) - 1: + prevSocket = internalSocketDict[name] + else: + greaterThanNode, mixNodeX, y = addNodeAt( + group_tree, "ShaderNodeMath", None, *nodePos + ) + greaterThanNode.operation = "GREATER_THAN" + mixNode, x, nodePos[1] = addNodeAt( + group_tree, "ShaderNodeMixRGB", None, mixNodeX, nodePos[1] + ) + + group_tree.links.new(greaterThanNode.inputs[0], caseNodeInternal) + group_tree.links.new(mixNode.inputs[0], greaterThanNode.outputs[0]) + greaterThanNode.inputs[1].default_value = case + + # Connect group input to nodes + group_tree.links.new(mixNode.inputs[1], internalSocketDict[name]) + group_tree.links.new(mixNode.inputs[2], prevSocket) + + prevSocket = mixNode.outputs[0] + + group_tree.links.new(output_node.inputs[0], prevSocket) + + return groupNode + + +def createNodeCombinerMix( + node_tree, nodeASocket, nodeBSocket, nodeCSocket, nodeDSocket, location, isAlpha +): + groupNode = node_tree.nodes.new("ShaderNodeGroup") + groupNode.location = location + location[1] = location[1] - (groupNode.height + 100) + + alphaText = "Alpha " if isAlpha else "" + + createGroup = ( + "Color Combiner " + alphaText + "Mix F3D v3" not in bpy.data.node_groups + ) + if not createGroup: + group_tree = bpy.data.node_groups["Color Combiner " + alphaText + "Mix F3D v3"] + groupNode.node_tree = group_tree + + inputA = groupNode.inputs[0] + node_tree.links.new(inputA, nodeASocket) + + inputB = groupNode.inputs[1] + node_tree.links.new(inputB, nodeBSocket) + + inputC = groupNode.inputs[2] + node_tree.links.new(inputC, nodeCSocket) + + inputD = groupNode.inputs[3] + node_tree.links.new(inputD, nodeDSocket) + + return groupNode + + # (A-B)*C + D + group_tree = bpy.data.node_groups.new( + type="ShaderNodeTree", name="Color Combiner " + alphaText + "Mix F3D v3" + ) + groupNode.node_tree = group_tree + input_node = group_tree.nodes.new("NodeGroupInput") + input_node.location = (-300, 0) + output_node = group_tree.nodes.new("NodeGroupOutput") + output_node.location = (600, 0) + + # Add input source to group input + socketType = "NodeSocketColor" if not isAlpha else "NodeSocketFloat" + groupNode.inputs.new(socketType, "A") + input_node.outputs.new(socketType, "A") + inputA = groupNode.inputs[0] + node_tree.links.new(inputA, nodeASocket) + + groupNode.inputs.new(socketType, "B") + input_node.outputs.new(socketType, "B") + inputB = groupNode.inputs[1] + node_tree.links.new(inputB, nodeBSocket) + + groupNode.inputs.new(socketType, "C") + input_node.outputs.new(socketType, "C") + inputC = groupNode.inputs[2] + node_tree.links.new(inputC, nodeCSocket) + + groupNode.inputs.new(socketType, "D") + input_node.outputs.new(socketType, "D") + inputD = groupNode.inputs[3] + node_tree.links.new(inputD, nodeDSocket) + + nodePos = [0, 0] + if not isAlpha: + nodeSubtract, x, nodePos[1] = addNodeAt( + group_tree, "ShaderNodeMixRGB", "Subtract", *nodePos + ) + nodeMultiply, x, nodePos[1] = addNodeAt( + group_tree, "ShaderNodeMixRGB", "Multiply", *nodePos + ) + nodeAdd, x, nodePos[1] = addNodeAt( + group_tree, "ShaderNodeMixRGB", "Add", *nodePos + ) + + nodeSubtract.blend_type = "SUBTRACT" + nodeMultiply.blend_type = "MULTIPLY" + nodeAdd.blend_type = "ADD" + + nodeSubtract.inputs["Fac"].default_value = 1 + nodeMultiply.inputs["Fac"].default_value = 1 + nodeAdd.inputs["Fac"].default_value = 1 + else: + nodeSubtract, x, nodePos[1] = addNodeAt( + group_tree, "ShaderNodeMath", "Subtract", *nodePos + ) + nodeMultiply, x, nodePos[1] = addNodeAt( + group_tree, "ShaderNodeMath", "Multiply", *nodePos + ) + nodeAdd, x, nodePos[1] = addNodeAt( + group_tree, "ShaderNodeMath", "Add", *nodePos + ) + + nodeSubtract.operation = "SUBTRACT" + nodeMultiply.operation = "MULTIPLY" + nodeAdd.operation = "ADD" + + index1 = 1 if not isAlpha else 0 + index2 = 2 if not isAlpha else 1 + group_tree.links.new(nodeSubtract.inputs[index1], input_node.outputs[0]) + group_tree.links.new(nodeSubtract.inputs[index2], input_node.outputs[1]) + group_tree.links.new(nodeMultiply.inputs[index1], nodeSubtract.outputs[0]) + group_tree.links.new(nodeMultiply.inputs[index2], input_node.outputs[2]) + group_tree.links.new(nodeAdd.inputs[index1], nodeMultiply.outputs[0]) + group_tree.links.new(nodeAdd.inputs[index2], input_node.outputs[3]) + + output_node.inputs.new(socketType, "Output") + groupNode.outputs.new(socketType, "Output") + group_tree.links.new(output_node.inputs[0], nodeAdd.outputs[0]) + + return groupNode + # caseSocketDict is Case A-D for color and alpha # socketDict is all color sources def createNodeCombiner(node_tree, cycleIndex): - groupNode = node_tree.nodes.new("ShaderNodeGroup") - - createGroup = 'Color Combiner F3D v3' not in bpy.data.node_groups - if not createGroup: - group_tree = bpy.data.node_groups['Color Combiner F3D v3'] - groupNode.node_tree = group_tree - groupNode.name = 'Color Combiner Cycle ' + str(cycleIndex) + ' F3D v3' - - #caseSocketDict, nextIndex = \ - # socketDictToInternalSocket(node_tree, groupNode, None, caseSocketDict, 0, False) - - #socketDict, nextIndex = \ - # socketDictToInternalSocket(node_tree, groupNode, None, socketDict, nextIndex, False) - - return groupNode - - group_tree = bpy.data.node_groups.new( - type="ShaderNodeTree", name = 'Color Combiner F3D v3') - groupNode.node_tree = group_tree - groupNode.name = 'Color Combiner Cycle ' + str(cycleIndex) + ' F3D v3' - input_node = group_tree.nodes.new("NodeGroupInput") - input_node.location = (-300, 0) - output_node = group_tree.nodes.new("NodeGroupOutput") - output_node.location = (900, 0) - - caseSocketDict = addSocketList(groupNode, input_node, caseTemplateDict, cycleIndex) - #caseSocketDict, nextIndex = \ - # socketDictToInternalSocket(node_tree, groupNode, input_node, caseSocketDict, 0, True) - - #socketDict, nextIndex = \ - # socketDictToInternalSocket(node_tree, groupNode, input_node, socketDict, nextIndex, True) - - nodePos = [300, 0] - - # Creating switch cascade - #caseNodes = {} - #for name, socket in caseSocketDict.items(): - # caseNodes[name] = createNodeSwitch(group_tree, - # [item[1] for item in combiner_enums[name[:-2]]], - # socket, name[:-2] , nodePos, socketDict) - - nodePos = [600, 0] - out1 = createNodeCombinerMix( - group_tree, caseSocketDict['Case A ' + str(cycleIndex)], caseSocketDict['Case B ' + str(cycleIndex)], - caseSocketDict['Case C ' + str(cycleIndex)], caseSocketDict['Case D ' + str(cycleIndex)], nodePos, False) - out_alpha1 = createNodeCombinerMix(group_tree, caseSocketDict['Case A Alpha ' + str(cycleIndex)], - caseSocketDict['Case B Alpha ' + str(cycleIndex)], caseSocketDict['Case C Alpha ' + str(cycleIndex)], - caseSocketDict['Case D Alpha ' + str(cycleIndex)], nodePos, True) - - groupNode.outputs.new('NodeSocketColor', 'Color Combiner') - output_node.inputs.new('NodeSocketColor', 'Color Combiner') - groupNode.outputs.new('NodeSocketFloat', 'Color Combiner Alpha') - output_node.inputs.new('NodeSocketFloat', 'Color Combiner Alpha') - group_tree.links.new(output_node.inputs[0], out1.outputs[0]) - group_tree.links.new(output_node.inputs[1], out_alpha1.outputs[0]) - - return groupNode + groupNode = node_tree.nodes.new("ShaderNodeGroup") + + createGroup = "Color Combiner F3D v3" not in bpy.data.node_groups + if not createGroup: + group_tree = bpy.data.node_groups["Color Combiner F3D v3"] + groupNode.node_tree = group_tree + groupNode.name = "Color Combiner Cycle " + str(cycleIndex) + " F3D v3" + + # caseSocketDict, nextIndex = \ + # socketDictToInternalSocket(node_tree, groupNode, None, caseSocketDict, 0, False) + + # socketDict, nextIndex = \ + # socketDictToInternalSocket(node_tree, groupNode, None, socketDict, nextIndex, False) + + return groupNode + + group_tree = bpy.data.node_groups.new( + type="ShaderNodeTree", name="Color Combiner F3D v3" + ) + groupNode.node_tree = group_tree + groupNode.name = "Color Combiner Cycle " + str(cycleIndex) + " F3D v3" + input_node = group_tree.nodes.new("NodeGroupInput") + input_node.location = (-300, 0) + output_node = group_tree.nodes.new("NodeGroupOutput") + output_node.location = (900, 0) + + caseSocketDict = addSocketList(groupNode, input_node, caseTemplateDict, cycleIndex) + # caseSocketDict, nextIndex = \ + # socketDictToInternalSocket(node_tree, groupNode, input_node, caseSocketDict, 0, True) + + # socketDict, nextIndex = \ + # socketDictToInternalSocket(node_tree, groupNode, input_node, socketDict, nextIndex, True) + + nodePos = [300, 0] + + # Creating switch cascade + # caseNodes = {} + # for name, socket in caseSocketDict.items(): + # caseNodes[name] = createNodeSwitch(group_tree, + # [item[1] for item in combiner_enums[name[:-2]]], + # socket, name[:-2] , nodePos, socketDict) + + nodePos = [600, 0] + out1 = createNodeCombinerMix( + group_tree, + caseSocketDict["Case A " + str(cycleIndex)], + caseSocketDict["Case B " + str(cycleIndex)], + caseSocketDict["Case C " + str(cycleIndex)], + caseSocketDict["Case D " + str(cycleIndex)], + nodePos, + False, + ) + out_alpha1 = createNodeCombinerMix( + group_tree, + caseSocketDict["Case A Alpha " + str(cycleIndex)], + caseSocketDict["Case B Alpha " + str(cycleIndex)], + caseSocketDict["Case C Alpha " + str(cycleIndex)], + caseSocketDict["Case D Alpha " + str(cycleIndex)], + nodePos, + True, + ) + + groupNode.outputs.new("NodeSocketColor", "Color Combiner") + output_node.inputs.new("NodeSocketColor", "Color Combiner") + groupNode.outputs.new("NodeSocketFloat", "Color Combiner Alpha") + output_node.inputs.new("NodeSocketFloat", "Color Combiner Alpha") + group_tree.links.new(output_node.inputs[0], out1.outputs[0]) + group_tree.links.new(output_node.inputs[1], out_alpha1.outputs[0]) + + return groupNode + # caseNodeDict is the A-D for color and alpha # nodeDict is all sources # otherDict is other shader inputs def createNodeF3D(node_tree, location): - groupNode = node_tree.nodes.new("ShaderNodeGroup") - groupNode.location = location - groupNode.name = 'F3D v3' - location[1] = location[1] - (groupNode.height + 100) - - createGroup = 'F3D v3' not in bpy.data.node_groups - if not createGroup: - group_tree = bpy.data.node_groups['F3D v3'] - groupNode.node_tree = group_tree - - #caseSocketDict1, nextIndex = \ - # nodeDictToInternalSocket(node_tree, groupNode, None, - # caseNodeDict1, [], [], 0, False) - - #caseSocketDict2, nextIndex = \ - # nodeDictToInternalSocket(node_tree, groupNode, None, - # caseNodeDict2, [], [], nextIndex, False) - - #socketDict, nextIndex = \ - # nodeDictToInternalSocket(node_tree, groupNode, None, - # nodeDict, ['Combined Color', 'Shade Color', "Texture 0", "Texture 1"], - # ['Environment Color', 'Primitive Color'], nextIndex, False) - - #otherSocketDict, nextIndex = \ - # nodeDictToInternalSocket(node_tree, groupNode, None, - # otherDict, [], [], nextIndex, False) - - return groupNode, location[0], location[1] - - group_tree = bpy.data.node_groups.new(type="ShaderNodeTree", name = 'F3D v3') - groupNode.node_tree = group_tree - input_node = group_tree.nodes.new("NodeGroupInput") - output_node = group_tree.nodes.new("NodeGroupOutput") - input_node.location = (-300, 0) - output_node.location = (600, 0) - links = group_tree.links - - #caseSocketDict1, nextIndex = \ - # nodeDictToInternalSocket(node_tree, groupNode, input_node, - # caseNodeDict1, [], [], 0, True) - - #caseSocketDict2, nextIndex = \ - # nodeDictToInternalSocket(node_tree, groupNode, input_node, - # caseNodeDict2, [], [], nextIndex, True) - - #socketDict, nextIndex = \ - # nodeDictToInternalSocket(node_tree, groupNode, input_node, - # nodeDict, ['Combined Color', 'Shade Color', "Texture 0", "Texture 1"], - # ['Environment Color', 'Primitive Color'], nextIndex, True) - - #otherSocketDict, nextIndex = \ - # nodeDictToInternalSocket(node_tree, groupNode, input_node, - # otherDict, [], [], nextIndex, True) - - #caseSocketDict1 = addSocketList(groupNode, input_node, caseTemplateDict, 1) - #caseSocketDict2 = addSocketList(groupNode, input_node, caseTemplateDict, 2) - - #x = 0 - #y = 0 - #combiner1 = createNodeCombiner(group_tree, caseSocketDict1, 1) - #combiner1.location = [x, y] -# - #combiner2 = createNodeCombiner(group_tree, caseSocketDict2, 2) - #combiner2.location = [x, y-800] - - addSocketList(groupNode, input_node, { - "Cycle 1 RGB" : "NodeSocketColor", - "Cycle 1 Alpha" : "NodeSocketFloat", - "Cycle 2 RGB" : "NodeSocketColor", - "Cycle 2 Alpha" : "NodeSocketFloat", - }) - - otherSocketDict = addSocketList(groupNode, input_node, otherTemplateDict) - - x = 0 - y = 0 - mixCycleNodeRGB, x, y = \ - addNodeAt(group_tree, 'ShaderNodeMixRGB', 'Cycle Mix RGB', x, y) - mixCycleNodeAlpha, x, y = \ - addNodeAt(group_tree, 'ShaderNodeMixRGB', 'Cycle Mix Alpha', x, y) - - links.new(mixCycleNodeRGB.inputs[1], input_node.outputs[0]) - links.new(mixCycleNodeRGB.inputs[1], input_node.outputs[0]) - links.new(mixCycleNodeRGB.inputs[2], input_node.outputs[2]) - links.new(mixCycleNodeAlpha.inputs[1], input_node.outputs[1]) - links.new(mixCycleNodeAlpha.inputs[2], input_node.outputs[3]) - links.new(mixCycleNodeRGB.inputs[0], otherSocketDict['Cycle Type']) - links.new(mixCycleNodeAlpha.inputs[0], otherSocketDict['Cycle Type']) - - x += 300 - y = 0 - - backFacing, x, y = \ - addNodeAt(group_tree, 'ShaderNodeNewGeometry', 'Is Backfacing', - x, y) - - x += 300 - y = 0 - multCullFront,x,y = \ - addNodeAt(group_tree, 'ShaderNodeMath','Multiply Cull Front', x, y) - multCullFront.operation = 'MULTIPLY' - multCullBack,x,y = \ - addNodeAt(group_tree, 'ShaderNodeMath','Multiply Cull Back', x, y) - multCullBack.operation = 'MULTIPLY' - - finalCullAlpha,x,y = \ - addNodeAt(group_tree, 'ShaderNodeMixRGB','Cull Alpha', x, y) - - links.new(multCullFront.inputs[0], otherSocketDict['Cull Front']) - links.new(multCullBack.inputs[0], otherSocketDict['Cull Back']) - links.new(multCullFront.inputs[1], mixCycleNodeAlpha.outputs[0]) - links.new(multCullBack.inputs[1], mixCycleNodeAlpha.outputs[0]) - links.new(finalCullAlpha.inputs[0], backFacing.outputs[6]) - links.new(finalCullAlpha.inputs[1], multCullFront.outputs[0]) - links.new(finalCullAlpha.inputs[2], multCullBack.outputs[0]) - - # Create mix shader to allow for alpha blending - # we cannot input alpha directly to material output, but we can mix between - # our final color and a completely transparent material based on alpha - - x += 300 - y = 0 - output_node.location = [x,y] - mixShaderNode = group_tree.nodes.new('ShaderNodeMixShader') - mixShaderNode.location = [x, y - 300] - clearNode = group_tree.nodes.new('ShaderNodeEeveeSpecular') - clearNode.location = [x, y - 600] - clearNode.inputs[4].default_value = 1 # transparency - links.new(mixShaderNode.inputs[2], mixCycleNodeRGB.outputs[0]) - links.new(mixShaderNode.inputs[0], finalCullAlpha.outputs[0]) - links.new(mixShaderNode.inputs[1], clearNode.outputs[0]) - - groupNode.outputs.new("NodeSocketShader", "Output") - output_node.inputs.new("NodeSocketShader", "Output") - links.new(output_node.inputs[0], mixShaderNode.outputs[0]) - - return groupNode, location[0], location[1] - -def createNodeToGroupLink(node, outputIndex, groupNode, groupInputNode, - node_tree, nodeIndex, name, createSockets): - return createSocketToGroupLink(node.outputs[outputIndex], groupNode, - groupInputNode, node_tree, nodeIndex, name, createSockets) - -def createSocketToGroupLink(socket, groupNode, groupInputNode, - node_tree, nodeIndex, name, createSockets): - if createSockets: - inputType = str(type(socket))[18:-2] # convert class to string - groupNode.inputs.new(inputType, name) - groupInputNode.outputs.new(inputType, name) - nodeExternal = groupNode.inputs[nodeIndex] - node_tree.links.new(nodeExternal, socket) - - if createSockets: - nodeInternal = groupInputNode.outputs[nodeIndex] - return nodeInternal - else: - return None - -def nodeDictToInternalSocket(node_tree, groupNode, groupInputNode, nodeDict, - texAlphaList, texAlphaWithBridgeList, startIndex, createSockets): - nodeIndex = startIndex - newDict = {} - for name, node in nodeDict.items(): - newDict[name] = createNodeToGroupLink(node, 0 if name != 'Noise' else 1, - groupNode, groupInputNode, node_tree, nodeIndex, name, createSockets) - nodeIndex += 1 - if name in texAlphaList: - newDict[name + " Alpha"] = createNodeToGroupLink(node, 1, groupNode, - groupInputNode, node_tree, nodeIndex, name + " Alpha", createSockets) - nodeIndex += 1 - elif name in texAlphaWithBridgeList: - alphaSplitNode = node.inputs[1].links[0].from_socket.node - bridgeNode = alphaSplitNode.outputs[1].links[0].to_socket.node - newDict[name + " Alpha"] = createNodeToGroupLink(bridgeNode, 0, - groupNode, groupInputNode, node_tree, nodeIndex, - name + " Alpha", createSockets) - nodeIndex += 1 - - return newDict, nodeIndex - -def socketDictToInternalSocket(node_tree, groupNode, groupInputNode, socketDict, - startIndex, createSockets): - nodeIndex = startIndex - newDict = {} - for name, socket in socketDict.items(): - newDict[name] = createSocketToGroupLink(socket, groupNode, - groupInputNode, node_tree, nodeIndex, name, createSockets) - nodeIndex += 1 - return newDict, nodeIndex + groupNode = node_tree.nodes.new("ShaderNodeGroup") + groupNode.location = location + groupNode.name = "F3D v3" + location[1] = location[1] - (groupNode.height + 100) + + createGroup = "F3D v3" not in bpy.data.node_groups + if not createGroup: + group_tree = bpy.data.node_groups["F3D v3"] + groupNode.node_tree = group_tree + + # caseSocketDict1, nextIndex = \ + # nodeDictToInternalSocket(node_tree, groupNode, None, + # caseNodeDict1, [], [], 0, False) + + # caseSocketDict2, nextIndex = \ + # nodeDictToInternalSocket(node_tree, groupNode, None, + # caseNodeDict2, [], [], nextIndex, False) + + # socketDict, nextIndex = \ + # nodeDictToInternalSocket(node_tree, groupNode, None, + # nodeDict, ['Combined Color', 'Shade Color', "Texture 0", "Texture 1"], + # ['Environment Color', 'Primitive Color'], nextIndex, False) + + # otherSocketDict, nextIndex = \ + # nodeDictToInternalSocket(node_tree, groupNode, None, + # otherDict, [], [], nextIndex, False) + + return groupNode, location[0], location[1] + + group_tree = bpy.data.node_groups.new(type="ShaderNodeTree", name="F3D v3") + groupNode.node_tree = group_tree + input_node = group_tree.nodes.new("NodeGroupInput") + output_node = group_tree.nodes.new("NodeGroupOutput") + input_node.location = (-300, 0) + output_node.location = (600, 0) + links = group_tree.links + + # caseSocketDict1, nextIndex = \ + # nodeDictToInternalSocket(node_tree, groupNode, input_node, + # caseNodeDict1, [], [], 0, True) + + # caseSocketDict2, nextIndex = \ + # nodeDictToInternalSocket(node_tree, groupNode, input_node, + # caseNodeDict2, [], [], nextIndex, True) + + # socketDict, nextIndex = \ + # nodeDictToInternalSocket(node_tree, groupNode, input_node, + # nodeDict, ['Combined Color', 'Shade Color', "Texture 0", "Texture 1"], + # ['Environment Color', 'Primitive Color'], nextIndex, True) + + # otherSocketDict, nextIndex = \ + # nodeDictToInternalSocket(node_tree, groupNode, input_node, + # otherDict, [], [], nextIndex, True) + + # caseSocketDict1 = addSocketList(groupNode, input_node, caseTemplateDict, 1) + # caseSocketDict2 = addSocketList(groupNode, input_node, caseTemplateDict, 2) + + # x = 0 + # y = 0 + # combiner1 = createNodeCombiner(group_tree, caseSocketDict1, 1) + # combiner1.location = [x, y] + # + # combiner2 = createNodeCombiner(group_tree, caseSocketDict2, 2) + # combiner2.location = [x, y-800] + + addSocketList( + groupNode, + input_node, + { + "Cycle 1 RGB": "NodeSocketColor", + "Cycle 1 Alpha": "NodeSocketFloat", + "Cycle 2 RGB": "NodeSocketColor", + "Cycle 2 Alpha": "NodeSocketFloat", + }, + ) + + otherSocketDict = addSocketList(groupNode, input_node, otherTemplateDict) + + x = 0 + y = 0 + mixCycleNodeRGB, x, y = addNodeAt( + group_tree, "ShaderNodeMixRGB", "Cycle Mix RGB", x, y + ) + mixCycleNodeAlpha, x, y = addNodeAt( + group_tree, "ShaderNodeMixRGB", "Cycle Mix Alpha", x, y + ) + + links.new(mixCycleNodeRGB.inputs[1], input_node.outputs[0]) + links.new(mixCycleNodeRGB.inputs[1], input_node.outputs[0]) + links.new(mixCycleNodeRGB.inputs[2], input_node.outputs[2]) + links.new(mixCycleNodeAlpha.inputs[1], input_node.outputs[1]) + links.new(mixCycleNodeAlpha.inputs[2], input_node.outputs[3]) + links.new(mixCycleNodeRGB.inputs[0], otherSocketDict["Cycle Type"]) + links.new(mixCycleNodeAlpha.inputs[0], otherSocketDict["Cycle Type"]) + + x += 300 + y = 0 + + backFacing, x, y = addNodeAt( + group_tree, "ShaderNodeNewGeometry", "Is Backfacing", x, y + ) + + x += 300 + y = 0 + multCullFront, x, y = addNodeAt( + group_tree, "ShaderNodeMath", "Multiply Cull Front", x, y + ) + multCullFront.operation = "MULTIPLY" + multCullBack, x, y = addNodeAt( + group_tree, "ShaderNodeMath", "Multiply Cull Back", x, y + ) + multCullBack.operation = "MULTIPLY" + + finalCullAlpha, x, y = addNodeAt(group_tree, "ShaderNodeMixRGB", "Cull Alpha", x, y) + + links.new(multCullFront.inputs[0], otherSocketDict["Cull Front"]) + links.new(multCullBack.inputs[0], otherSocketDict["Cull Back"]) + links.new(multCullFront.inputs[1], mixCycleNodeAlpha.outputs[0]) + links.new(multCullBack.inputs[1], mixCycleNodeAlpha.outputs[0]) + links.new(finalCullAlpha.inputs[0], backFacing.outputs[6]) + links.new(finalCullAlpha.inputs[1], multCullFront.outputs[0]) + links.new(finalCullAlpha.inputs[2], multCullBack.outputs[0]) + + # Create mix shader to allow for alpha blending + # we cannot input alpha directly to material output, but we can mix between + # our final color and a completely transparent material based on alpha + + x += 300 + y = 0 + output_node.location = [x, y] + mixShaderNode = group_tree.nodes.new("ShaderNodeMixShader") + mixShaderNode.location = [x, y - 300] + clearNode = group_tree.nodes.new("ShaderNodeEeveeSpecular") + clearNode.location = [x, y - 600] + clearNode.inputs[4].default_value = 1 # transparency + links.new(mixShaderNode.inputs[2], mixCycleNodeRGB.outputs[0]) + links.new(mixShaderNode.inputs[0], finalCullAlpha.outputs[0]) + links.new(mixShaderNode.inputs[1], clearNode.outputs[0]) + + groupNode.outputs.new("NodeSocketShader", "Output") + output_node.inputs.new("NodeSocketShader", "Output") + links.new(output_node.inputs[0], mixShaderNode.outputs[0]) + + return groupNode, location[0], location[1] + + +def createNodeToGroupLink( + node, + outputIndex, + groupNode, + groupInputNode, + node_tree, + nodeIndex, + name, + createSockets, +): + return createSocketToGroupLink( + node.outputs[outputIndex], + groupNode, + groupInputNode, + node_tree, + nodeIndex, + name, + createSockets, + ) + + +def createSocketToGroupLink( + socket, groupNode, groupInputNode, node_tree, nodeIndex, name, createSockets +): + if createSockets: + inputType = str(type(socket))[18:-2] # convert class to string + groupNode.inputs.new(inputType, name) + groupInputNode.outputs.new(inputType, name) + nodeExternal = groupNode.inputs[nodeIndex] + node_tree.links.new(nodeExternal, socket) + + if createSockets: + nodeInternal = groupInputNode.outputs[nodeIndex] + return nodeInternal + else: + return None + + +def nodeDictToInternalSocket( + node_tree, + groupNode, + groupInputNode, + nodeDict, + texAlphaList, + texAlphaWithBridgeList, + startIndex, + createSockets, +): + nodeIndex = startIndex + newDict = {} + for name, node in nodeDict.items(): + newDict[name] = createNodeToGroupLink( + node, + 0 if name != "Noise" else 1, + groupNode, + groupInputNode, + node_tree, + nodeIndex, + name, + createSockets, + ) + nodeIndex += 1 + if name in texAlphaList: + newDict[name + " Alpha"] = createNodeToGroupLink( + node, + 1, + groupNode, + groupInputNode, + node_tree, + nodeIndex, + name + " Alpha", + createSockets, + ) + nodeIndex += 1 + elif name in texAlphaWithBridgeList: + alphaSplitNode = node.inputs[1].links[0].from_socket.node + bridgeNode = alphaSplitNode.outputs[1].links[0].to_socket.node + newDict[name + " Alpha"] = createNodeToGroupLink( + bridgeNode, + 0, + groupNode, + groupInputNode, + node_tree, + nodeIndex, + name + " Alpha", + createSockets, + ) + nodeIndex += 1 + + return newDict, nodeIndex + + +def socketDictToInternalSocket( + node_tree, groupNode, groupInputNode, socketDict, startIndex, createSockets +): + nodeIndex = startIndex + newDict = {} + for name, socket in socketDict.items(): + newDict[name] = createSocketToGroupLink( + socket, groupNode, groupInputNode, node_tree, nodeIndex, name, createSockets + ) + nodeIndex += 1 + return newDict, nodeIndex + def createTexCoordNode(node_tree, location, uvSocket, socketDict, isV): - groupNode = node_tree.nodes.new("ShaderNodeGroup") - groupNode.name = 'Create Tex Coord' - groupNode.label = 'Create Tex Coord' - groupNode.location = location - location[1] = location[1] - (groupNode.height + 100) - - verticalString = "U" if not isV else "V" - createGroup = 'Create Tex Coord ' + verticalString + ' F3D v3' not in bpy.data.node_groups - if not createGroup: - group_tree = bpy.data.node_groups['Create Tex Coord ' + verticalString + ' F3D v3'] - groupNode.node_tree = group_tree - socketDict, nextSocketIndex = socketDictToInternalSocket( - node_tree, groupNode, None, socketDict, 0, False) - return groupNode - - group_tree = bpy.data.node_groups.new( - type="ShaderNodeTree", name = 'Create Tex Coord ' + verticalString + ' F3D v3') - links = group_tree.links - groupNode.node_tree = group_tree - input_node = group_tree.nodes.new("NodeGroupInput") - output_node = group_tree.nodes.new("NodeGroupOutput") - input_node.location = (-800, 0) - output_node.location = (2800, 0) - - uvSocket = \ - createSocketToGroupLink(uvSocket, groupNode, - input_node, node_tree, 0, 'UV', True) - socketDict, nextSocketIndex = socketDictToInternalSocket( - node_tree, groupNode, input_node, socketDict, 1, True) - - output_node.inputs.new('NodeSocketVector', 'UV') - - x = 0 - y = 0 - - # Change origin to top left corner - if isV: - toUpperOrigin, x, y = addNodeAt(group_tree, 'ShaderNodeMath', None, -400, 200) - toUpperOrigin.operation = "MULTIPLY_ADD" - toUpperOrigin.inputs[1].default_value = -1 - toUpperOrigin.inputs[2].default_value = 1 - links.new(toUpperOrigin.inputs[0], uvSocket) - prevSocket = toUpperOrigin.outputs[0] - else: - prevSocket = uvSocket - - # Apply shift - shiftPower, x, y = addNodeAt(group_tree, 'ShaderNodeMath', None, -400, 0) - shiftPower.operation = "POWER" - shiftPower.inputs[0].default_value = 0.5 - links.new(shiftPower.inputs[1], socketDict['Shift']) - - shiftMult, x, y = addNodeAt(group_tree, 'ShaderNodeMath', None, -400, -200) - shiftMult.operation = 'MULTIPLY' - links.new(shiftMult.inputs[0], prevSocket) - links.new(shiftMult.inputs[1], shiftPower.outputs[0]) - - # Apply scale - scaleMult, x, y = addNodeAt(group_tree, 'ShaderNodeMath', None, -200,-200) - scaleMult.operation = 'MULTIPLY' - links.new(scaleMult.inputs[0], shiftMult.outputs[0]) - links.new(scaleMult.inputs[1], socketDict['Scale']) - - # Revert origin to lower left corner - if isV: - toLowerOrigin, x, y = addNodeAt(group_tree, 'ShaderNodeMath', None, -200, -400) - toLowerOrigin.operation = "MULTIPLY_ADD" - toLowerOrigin.inputs[1].default_value = -1 - toLowerOrigin.inputs[2].default_value = 1 - links.new(toLowerOrigin.inputs[0], scaleMult.outputs[0]) - prevNode2 = toLowerOrigin - else: - prevNode2 = scaleMult - - # Add L - # offsetting by L means subtracting L from UV - addL, x, y = addNodeAt(group_tree, 'ShaderNodeMath', None, 0, 0) - addL.operation = 'SUBTRACT' - links.new(addL.inputs[0], prevNode2.outputs[0]) - links.new(addL.inputs[1], socketDict["Normalized L"]) - - # Clamp using H - clampLow, x, y = addNodeAt(group_tree, 'ShaderNodeMath', - 'Max of NOT zero', 200, 0) - clampLow.operation = 'MAXIMUM' - clampLow.inputs[0].default_value = 0.0000001 # so negative clamping works - links.new(clampLow.inputs[0], socketDict["Normalized Half Pixel"]) - links.new(clampLow.inputs[1], addL.outputs[0]) - - clampHighHalfPixelOffset, x, y = \ - addNodeAt(group_tree, 'ShaderNodeMath', None, 400, 200) - clampHighHalfPixelOffset.operation = 'SUBTRACT' - links.new(clampHighHalfPixelOffset.inputs[0], socketDict["Normalized H"]) - links.new(clampHighHalfPixelOffset.inputs[1], socketDict["Normalized Half Pixel"]) - - clampHigh, x, y = addNodeAt(group_tree, 'ShaderNodeMath', None, 400, 0) - clampHigh.operation = 'MINIMUM' - links.new(clampHigh.inputs[0], clampHighHalfPixelOffset.outputs[0]) - links.new(clampHigh.inputs[1], clampLow.outputs[0]) - - clampMix, x, y = addNodeAt(group_tree, 'ShaderNodeMixRGB', None, 600, 0) - links.new(clampMix.inputs[0], socketDict["Clamp"]) - links.new(clampMix.inputs[1], addL.outputs[0]) - links.new(clampMix.inputs[2], clampHigh.outputs[0]) - - # Apply mask - maskPositive, x, y = addNodeAt(group_tree, 'ShaderNodeMath', None, 800,-400) - maskPositive.operation = "MODULO" - links.new(maskPositive.inputs[0], clampMix.outputs[0]) - links.new(maskPositive.inputs[1], socketDict["Normalized Mask"]) - - ifNegative, x, y = addNodeAt(group_tree, 'ShaderNodeMath', None, 800, 0) - ifNegative.operation = 'LESS_THAN' - links.new(ifNegative.inputs[0], clampMix.outputs[0]) - ifNegative.inputs[1].default_value = 0 - - maskNegative, x, y = addNodeAt(group_tree, 'ShaderNodeMath', None, 800,-200) - links.new(maskNegative.inputs[0], socketDict["Normalized Mask"]) - links.new(maskNegative.inputs[1], maskPositive.outputs[0]) - - maskSignMix, x, y = addNodeAt(group_tree, 'ShaderNodeMixRGB',None,1000,-200) - links.new(maskSignMix.inputs[0], ifNegative.outputs[0]) - links.new(maskSignMix.inputs[1], maskPositive.outputs[0]) - links.new(maskSignMix.inputs[2], maskNegative.outputs[0]) - - # Apply mirror - mirrorAbs, x, y = addNodeAt(group_tree, 'ShaderNodeMath', None, 1000,-600) - mirrorAbs.operation = "ABSOLUTE" - links.new(mirrorAbs.inputs[0], clampMix.outputs[0]) - mirrorAbs.inputs[1].default_value = 0 - - mirrorMaskDiv, x, y = addNodeAt(group_tree, 'ShaderNodeMath',None,1200,-600) - mirrorMaskDiv.operation = 'DIVIDE' - links.new(mirrorMaskDiv.inputs[0], mirrorAbs.outputs[0]) - links.new(mirrorMaskDiv.inputs[1], socketDict["Normalized Mask"]) - - mirrorFloor, x, y = addNodeAt(group_tree, 'ShaderNodeMath', None, 1400,-600) - mirrorFloor.operation = 'FLOOR' - links.new(mirrorFloor.inputs[0], mirrorMaskDiv.outputs[0]) - mirrorFloor.inputs[1].default_value = 0 - - mirrorMod, x, y = addNodeAt(group_tree, 'ShaderNodeMath', None, 1600,-600) - mirrorMod.operation = 'MODULO' - links.new(mirrorMod.inputs[0], mirrorFloor.outputs[0]) - mirrorMod.inputs[1].default_value = 2 - - mirrorSub, x, y = addNodeAt(group_tree, 'ShaderNodeMath', None, 1600,-800) - mirrorSub.operation = "SUBTRACT" - mirrorSub.inputs[0].default_value = 1 - links.new(mirrorSub.inputs[1], mirrorMod.outputs[0]) - - mirrorToggleMix, x, y = addNodeAt(group_tree, 'ShaderNodeMixRGB', - None, 1800, -600) - links.new(mirrorToggleMix.inputs[0], ifNegative.outputs[0]) - links.new(mirrorToggleMix.inputs[1], mirrorMod.outputs[0]) - links.new(mirrorToggleMix.inputs[2], mirrorSub.outputs[0]) - - mirrorCheck, x, y = addNodeAt(group_tree, 'ShaderNodeMath', None, 2000,-400) - mirrorCheck.operation = 'MULTIPLY' - links.new(mirrorCheck.inputs[0], mirrorToggleMix.outputs[0]) - links.new(mirrorCheck.inputs[1], socketDict["Mirror"]) - - mirrored, x, y = addNodeAt(group_tree, 'ShaderNodeMath', None, 2000,-200) - mirrored.operation = 'SUBTRACT' - links.new(mirrored.inputs[0], socketDict["Normalized Mask"]) - links.new(mirrored.inputs[1], maskSignMix.outputs[0]) - - mirrorMix, x, y = addNodeAt(group_tree, 'ShaderNodeMixRGB', None, 2200,-200) - links.new(mirrorMix.inputs[0], mirrorCheck.outputs[0]) - links.new(mirrorMix.inputs[1], maskSignMix.outputs[0]) - links.new(mirrorMix.inputs[2], mirrored.outputs[0]) - - # Handle 0 Mask - check0Mask, x, y = addNodeAt(group_tree, 'ShaderNodeMath', None, 800,-1000) - check0Mask.operation = 'GREATER_THAN' - links.new(check0Mask.inputs[0], socketDict["Normalized Mask"]) - check0Mask.inputs[1].default_value = 0 - - mix0Mask, x, y = addNodeAt(group_tree, 'ShaderNodeMixRGB', None, 2400,-200) - links.new(mix0Mask.inputs[0], check0Mask.outputs[0]) - links.new(mix0Mask.inputs[1], clampHigh.outputs[0]) - links.new(mix0Mask.inputs[2], mirrorMix.outputs[0]) - - # Output - links.new(output_node.inputs[0], mix0Mask.outputs[0]) - return groupNode + groupNode = node_tree.nodes.new("ShaderNodeGroup") + groupNode.name = "Create Tex Coord" + groupNode.label = "Create Tex Coord" + groupNode.location = location + location[1] = location[1] - (groupNode.height + 100) + + verticalString = "U" if not isV else "V" + createGroup = ( + "Create Tex Coord " + verticalString + " F3D v3" not in bpy.data.node_groups + ) + if not createGroup: + group_tree = bpy.data.node_groups[ + "Create Tex Coord " + verticalString + " F3D v3" + ] + groupNode.node_tree = group_tree + socketDict, nextSocketIndex = socketDictToInternalSocket( + node_tree, groupNode, None, socketDict, 0, False + ) + return groupNode + + group_tree = bpy.data.node_groups.new( + type="ShaderNodeTree", name="Create Tex Coord " + verticalString + " F3D v3" + ) + links = group_tree.links + groupNode.node_tree = group_tree + input_node = group_tree.nodes.new("NodeGroupInput") + output_node = group_tree.nodes.new("NodeGroupOutput") + input_node.location = (-800, 0) + output_node.location = (2800, 0) + + uvSocket = createSocketToGroupLink( + uvSocket, groupNode, input_node, node_tree, 0, "UV", True + ) + socketDict, nextSocketIndex = socketDictToInternalSocket( + node_tree, groupNode, input_node, socketDict, 1, True + ) + + output_node.inputs.new("NodeSocketVector", "UV") + + x = 0 + y = 0 + + # Change origin to top left corner + if isV: + toUpperOrigin, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, -400, 200) + toUpperOrigin.operation = "MULTIPLY_ADD" + toUpperOrigin.inputs[1].default_value = -1 + toUpperOrigin.inputs[2].default_value = 1 + links.new(toUpperOrigin.inputs[0], uvSocket) + prevSocket = toUpperOrigin.outputs[0] + else: + prevSocket = uvSocket + + # Apply shift + shiftPower, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, -400, 0) + shiftPower.operation = "POWER" + shiftPower.inputs[0].default_value = 0.5 + links.new(shiftPower.inputs[1], socketDict["Shift"]) + + shiftMult, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, -400, -200) + shiftMult.operation = "MULTIPLY" + links.new(shiftMult.inputs[0], prevSocket) + links.new(shiftMult.inputs[1], shiftPower.outputs[0]) + + # Apply scale + scaleMult, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, -200, -200) + scaleMult.operation = "MULTIPLY" + links.new(scaleMult.inputs[0], shiftMult.outputs[0]) + links.new(scaleMult.inputs[1], socketDict["Scale"]) + + # Revert origin to lower left corner + if isV: + toLowerOrigin, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, -200, -400) + toLowerOrigin.operation = "MULTIPLY_ADD" + toLowerOrigin.inputs[1].default_value = -1 + toLowerOrigin.inputs[2].default_value = 1 + links.new(toLowerOrigin.inputs[0], scaleMult.outputs[0]) + prevNode2 = toLowerOrigin + else: + prevNode2 = scaleMult + + # Add L + # offsetting by L means subtracting L from UV + addL, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, 0, 0) + addL.operation = "SUBTRACT" + links.new(addL.inputs[0], prevNode2.outputs[0]) + links.new(addL.inputs[1], socketDict["Normalized L"]) + + # Clamp using H + clampLow, x, y = addNodeAt(group_tree, "ShaderNodeMath", "Max of NOT zero", 200, 0) + clampLow.operation = "MAXIMUM" + clampLow.inputs[0].default_value = 0.0000001 # so negative clamping works + links.new(clampLow.inputs[0], socketDict["Normalized Half Pixel"]) + links.new(clampLow.inputs[1], addL.outputs[0]) + + clampHighHalfPixelOffset, x, y = addNodeAt( + group_tree, "ShaderNodeMath", None, 400, 200 + ) + clampHighHalfPixelOffset.operation = "SUBTRACT" + links.new(clampHighHalfPixelOffset.inputs[0], socketDict["Normalized H"]) + links.new(clampHighHalfPixelOffset.inputs[1], socketDict["Normalized Half Pixel"]) + + clampHigh, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, 400, 0) + clampHigh.operation = "MINIMUM" + links.new(clampHigh.inputs[0], clampHighHalfPixelOffset.outputs[0]) + links.new(clampHigh.inputs[1], clampLow.outputs[0]) + + clampMix, x, y = addNodeAt(group_tree, "ShaderNodeMixRGB", None, 600, 0) + links.new(clampMix.inputs[0], socketDict["Clamp"]) + links.new(clampMix.inputs[1], addL.outputs[0]) + links.new(clampMix.inputs[2], clampHigh.outputs[0]) + + # Apply mask + maskPositive, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, 800, -400) + maskPositive.operation = "MODULO" + links.new(maskPositive.inputs[0], clampMix.outputs[0]) + links.new(maskPositive.inputs[1], socketDict["Normalized Mask"]) + + ifNegative, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, 800, 0) + ifNegative.operation = "LESS_THAN" + links.new(ifNegative.inputs[0], clampMix.outputs[0]) + ifNegative.inputs[1].default_value = 0 + + maskNegative, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, 800, -200) + links.new(maskNegative.inputs[0], socketDict["Normalized Mask"]) + links.new(maskNegative.inputs[1], maskPositive.outputs[0]) + + maskSignMix, x, y = addNodeAt(group_tree, "ShaderNodeMixRGB", None, 1000, -200) + links.new(maskSignMix.inputs[0], ifNegative.outputs[0]) + links.new(maskSignMix.inputs[1], maskPositive.outputs[0]) + links.new(maskSignMix.inputs[2], maskNegative.outputs[0]) + + # Apply mirror + mirrorAbs, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, 1000, -600) + mirrorAbs.operation = "ABSOLUTE" + links.new(mirrorAbs.inputs[0], clampMix.outputs[0]) + mirrorAbs.inputs[1].default_value = 0 + + mirrorMaskDiv, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, 1200, -600) + mirrorMaskDiv.operation = "DIVIDE" + links.new(mirrorMaskDiv.inputs[0], mirrorAbs.outputs[0]) + links.new(mirrorMaskDiv.inputs[1], socketDict["Normalized Mask"]) + + mirrorFloor, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, 1400, -600) + mirrorFloor.operation = "FLOOR" + links.new(mirrorFloor.inputs[0], mirrorMaskDiv.outputs[0]) + mirrorFloor.inputs[1].default_value = 0 + + mirrorMod, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, 1600, -600) + mirrorMod.operation = "MODULO" + links.new(mirrorMod.inputs[0], mirrorFloor.outputs[0]) + mirrorMod.inputs[1].default_value = 2 + + mirrorSub, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, 1600, -800) + mirrorSub.operation = "SUBTRACT" + mirrorSub.inputs[0].default_value = 1 + links.new(mirrorSub.inputs[1], mirrorMod.outputs[0]) + + mirrorToggleMix, x, y = addNodeAt(group_tree, "ShaderNodeMixRGB", None, 1800, -600) + links.new(mirrorToggleMix.inputs[0], ifNegative.outputs[0]) + links.new(mirrorToggleMix.inputs[1], mirrorMod.outputs[0]) + links.new(mirrorToggleMix.inputs[2], mirrorSub.outputs[0]) + + mirrorCheck, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, 2000, -400) + mirrorCheck.operation = "MULTIPLY" + links.new(mirrorCheck.inputs[0], mirrorToggleMix.outputs[0]) + links.new(mirrorCheck.inputs[1], socketDict["Mirror"]) + + mirrored, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, 2000, -200) + mirrored.operation = "SUBTRACT" + links.new(mirrored.inputs[0], socketDict["Normalized Mask"]) + links.new(mirrored.inputs[1], maskSignMix.outputs[0]) + + mirrorMix, x, y = addNodeAt(group_tree, "ShaderNodeMixRGB", None, 2200, -200) + links.new(mirrorMix.inputs[0], mirrorCheck.outputs[0]) + links.new(mirrorMix.inputs[1], maskSignMix.outputs[0]) + links.new(mirrorMix.inputs[2], mirrored.outputs[0]) + + # Handle 0 Mask + check0Mask, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, 800, -1000) + check0Mask.operation = "GREATER_THAN" + links.new(check0Mask.inputs[0], socketDict["Normalized Mask"]) + check0Mask.inputs[1].default_value = 0 + + mix0Mask, x, y = addNodeAt(group_tree, "ShaderNodeMixRGB", None, 2400, -200) + links.new(mix0Mask.inputs[0], check0Mask.outputs[0]) + links.new(mix0Mask.inputs[1], clampHigh.outputs[0]) + links.new(mix0Mask.inputs[2], mirrorMix.outputs[0]) + + # Output + links.new(output_node.inputs[0], mix0Mask.outputs[0]) + return groupNode + def splitTextureVectorInputs(node_tree, socketDict, x, y): - horizontalDict = {} - verticalDict = {} - for name, socket in socketDict.items(): - splitNode, x, y = addNodeAt(node_tree, "ShaderNodeSeparateXYZ", "Split Texture Vector", x, y) - node_tree.links.new(splitNode.inputs[0], socket) - horizontalDict[name] = splitNode.outputs[0] - verticalDict[name] = splitNode.outputs[1] + horizontalDict = {} + verticalDict = {} + for name, socket in socketDict.items(): + splitNode, x, y = addNodeAt( + node_tree, "ShaderNodeSeparateXYZ", "Split Texture Vector", x, y + ) + node_tree.links.new(splitNode.inputs[0], socket) + horizontalDict[name] = splitNode.outputs[0] + verticalDict[name] = splitNode.outputs[1] + + return horizontalDict, verticalDict, x, y - return horizontalDict, verticalDict, x, y def createUVGroup(node_tree, location, textureIndex): - groupNode = node_tree.nodes.new("ShaderNodeGroup") - groupNode.name = 'Get UV' - groupNode.label = 'Get UV' - groupNode.location = location - groupNode.name = 'Get UV ' + str(textureIndex) + ' F3D v3' - location[1] = location[1] - (groupNode.height + 100) - - createGroup = 'Get UV F3D v3' not in bpy.data.node_groups - if not createGroup: - group_tree = bpy.data.node_groups['Get UV F3D v3'] - groupNode.node_tree = group_tree - #texGenSocketDict, nodeIndex = nodeDictToInternalSocket(node_tree, - # groupNode, None, texGenDict, [], [], 0, False) - #socketDict, nodeIndex = nodeDictToInternalSocket(node_tree, - # groupNode, None, nodeDict, [], [], nodeIndex, False) - - return groupNode, location[0], location[1] - - group_tree = bpy.data.node_groups.new(type="ShaderNodeTree", name = 'Get UV F3D v3') - links = group_tree.links - groupNode.node_tree = group_tree - input_node = group_tree.nodes.new("NodeGroupInput") - output_node = group_tree.nodes.new("NodeGroupOutput") - input_node.location = (-300, 0) - output_node.location = (2400, 0) - - output_node.inputs.new('NodeSocketVector', 'UV') - - #texGenSocketDict, nodeIndex = nodeDictToInternalSocket(node_tree, - # groupNode, input_node, texGenDict, [], [], 0, True) - #socketDict, nodeIndex = nodeDictToInternalSocket(node_tree, - # groupNode, input_node, nodeDict, [], [], nodeIndex, True) - - texGenSocketDict = addSocketList(groupNode, input_node, { - "Texture Gen" : "NodeSocketFloat", - "Texture Gen Linear" : "NodeSocketFloat", - }) - - socketDict = addSocketList(groupNode, input_node, { - "Image Factor" : "NodeSocketVector", - 'Normalized L' : "NodeSocketVector", - 'Normalized H' : "NodeSocketVector", - 'Clamp' : "NodeSocketVector", - 'Normalized Mask' : "NodeSocketVector", - 'Mirror' : "NodeSocketVector", - 'Shift' : "NodeSocketVector", - 'Scale' : "NodeSocketVector", - 'Normalized Half Pixel' : "NodeSocketVector", - }) - - x = 0 - y = 0 - horizontalDict, verticalDict, x, y = \ - splitTextureVectorInputs(group_tree, socketDict, x, y) - - # Regular UVs - x += 300 - y = 0 - UVMapNode, x, y = addNodeAt(group_tree, 'ShaderNodeUVMap', None, x, y) - UVMapNode.uv_map = 'UVMap' - - # Get normal - geometryNode, x, y = \ - addNodeAt(group_tree, "ShaderNodeNewGeometry", None, x, y) - - # Convert to screen space normal - transformNode, x, y = \ - addNodeAt(group_tree, "ShaderNodeVectorTransform", None, x, y) - transformNode.convert_from = 'WORLD' - transformNode.convert_to = 'CAMERA' - transformNode.vector_type = 'NORMAL' - links.new(transformNode.inputs[0], geometryNode.outputs[1]) - - # Convert [-1,1] to [0,1] - x += 300 - y = 0 - addOneNode, x, y = \ - addNodeAt(group_tree, "ShaderNodeVectorMath", None, x, y) - addOneNode.inputs[1].default_value = (1,1,1) - links.new(addOneNode.inputs[0], transformNode.outputs[0]) - - separateNode, x, y = \ - addNodeAt(group_tree, "ShaderNodeSeparateXYZ", None, x, y) - links.new(separateNode.inputs[0], addOneNode.outputs[0]) - - divideTwoX, x, y = \ - addNodeAt(group_tree, 'ShaderNodeMath', None, x, y) - divideTwoY, x, y = \ - addNodeAt(group_tree, 'ShaderNodeMath', None, x, y) - divideTwoX.operation = 'DIVIDE' - divideTwoY.operation = 'DIVIDE' - divideTwoX.inputs[1].default_value = -2 # Must be negative (env, not sphere) - divideTwoY.inputs[1].default_value = -2 - links.new(divideTwoX.inputs[0], separateNode.outputs[0]) - links.new(divideTwoY.inputs[0], separateNode.outputs[1]) - - # Normalize values based on tex size. - x += 300 - y = 0 - normalizeX, x, y = \ - addNodeAt(group_tree, 'ShaderNodeMath', None, x, y) - normalizeY, x, y = \ - addNodeAt(group_tree, 'ShaderNodeMath', None, x, y) - normalizeX.operation = 'MULTIPLY' - normalizeY.operation = 'MULTIPLY' - links.new(normalizeX.inputs[0], divideTwoX.outputs[0]) - links.new(normalizeY.inputs[0], divideTwoY.outputs[0]) - links.new(normalizeX.inputs[1], horizontalDict["Image Factor"]) - links.new(normalizeY.inputs[1], verticalDict["Image Factor"]) - - # Get UVs for tex gen, scaled by texture scale. - - texGenCombine, x, y = \ - addNodeAt(group_tree, 'ShaderNodeCombineXYZ', None, 1200, -300) - links.new(texGenCombine.inputs[0], normalizeX.outputs[0]) - links.new(texGenCombine.inputs[1], normalizeY.outputs[0]) - - # Get UVs for tex gen linear, scaled by texture scale. - texGenLinearAcosX, x, y = \ - addNodeAt(group_tree, 'ShaderNodeMath', None, 600, -600) - texGenLinearAcosY, x, y = \ - addNodeAt(group_tree, 'ShaderNodeMath', None, 600, y) - texGenLinearAcosX.operation = 'ARCCOSINE' - texGenLinearAcosY.operation = 'ARCCOSINE' - links.new(texGenLinearAcosX.inputs[0], divideTwoX.outputs[0]) - links.new(texGenLinearAcosY.inputs[0], divideTwoY.outputs[0]) - texGenLinearAcosX.inputs[1].default_value = 0 - texGenLinearAcosY.inputs[1].default_value = 0 - - # Normalize values based on tex size. - normalizeLinearX, x, y = \ - addNodeAt(group_tree, 'ShaderNodeMath', None, 600, y) - normalizeLinearY, x, y = \ - addNodeAt(group_tree, 'ShaderNodeMath', None, 600, y) - normalizeLinearX.operation = 'MULTIPLY' - normalizeLinearY.operation = 'MULTIPLY' - links.new(normalizeLinearX.inputs[0], texGenLinearAcosX.outputs[0]) - links.new(normalizeLinearY.inputs[0], texGenLinearAcosY.outputs[0]) - links.new(normalizeLinearX.inputs[1], horizontalDict["Image Factor"]) - links.new(normalizeLinearY.inputs[1], verticalDict["Image Factor"]) - - texGenLinearCombine, x, y = \ - addNodeAt(group_tree, 'ShaderNodeCombineXYZ', None, 1200, -600) - links.new(texGenLinearCombine.inputs[0], normalizeLinearX.outputs[0]) - links.new(texGenLinearCombine.inputs[1], normalizeLinearY.outputs[0]) - - # Mix UV based on flags - mixTexGen, x, y = \ - addNodeAt(group_tree, 'ShaderNodeMixRGB', None, 1500, 0) - links.new(mixTexGen.inputs[0], texGenSocketDict["Texture Gen"]) - links.new(mixTexGen.inputs[1], UVMapNode.outputs[0]) - links.new(mixTexGen.inputs[2], texGenCombine.outputs[0]) - - mixTexGenLinear, x, y = \ - addNodeAt(group_tree, 'ShaderNodeMixRGB', None, 1500, y) - links.new(mixTexGenLinear.inputs[0], texGenSocketDict["Texture Gen Linear"]) - links.new(mixTexGenLinear.inputs[1], mixTexGen.outputs[0]) - links.new(mixTexGenLinear.inputs[2], texGenLinearCombine.outputs[0]) - - # Apply tile attributes - uvSplit, x, y = \ - addNodeAt(group_tree, 'ShaderNodeSeparateXYZ', None, 1800, 500) - links.new(uvSplit.inputs[0], mixTexGenLinear.outputs[0]) - - uv_xNode = createTexCoordNode(group_tree, [2000, 500], uvSplit.outputs[0], horizontalDict, False) - uv_yNode = createTexCoordNode(group_tree, [2000, 300], uvSplit.outputs[1], verticalDict, True) - - links.new(uv_xNode.inputs[0], uvSplit.outputs[0]) - links.new(uv_yNode.inputs[0], uvSplit.outputs[1]) - - uvCombine, x, y = \ - addNodeAt(group_tree, 'ShaderNodeCombineXYZ', None, 2200, 500) - - links.new(uvCombine.inputs[0], uv_xNode.outputs[0]) - links.new(uvCombine.inputs[1], uv_yNode.outputs[0]) - - links.new(output_node.inputs[0], uvCombine.outputs[0]) - return groupNode, location[0], location[1] + groupNode = node_tree.nodes.new("ShaderNodeGroup") + groupNode.name = "Get UV" + groupNode.label = "Get UV" + groupNode.location = location + groupNode.name = "Get UV " + str(textureIndex) + " F3D v3" + location[1] = location[1] - (groupNode.height + 100) + + createGroup = "Get UV F3D v3" not in bpy.data.node_groups + if not createGroup: + group_tree = bpy.data.node_groups["Get UV F3D v3"] + groupNode.node_tree = group_tree + # texGenSocketDict, nodeIndex = nodeDictToInternalSocket(node_tree, + # groupNode, None, texGenDict, [], [], 0, False) + # socketDict, nodeIndex = nodeDictToInternalSocket(node_tree, + # groupNode, None, nodeDict, [], [], nodeIndex, False) + + return groupNode, location[0], location[1] + + group_tree = bpy.data.node_groups.new(type="ShaderNodeTree", name="Get UV F3D v3") + links = group_tree.links + groupNode.node_tree = group_tree + input_node = group_tree.nodes.new("NodeGroupInput") + output_node = group_tree.nodes.new("NodeGroupOutput") + input_node.location = (-300, 0) + output_node.location = (2400, 0) + + output_node.inputs.new("NodeSocketVector", "UV") + + # texGenSocketDict, nodeIndex = nodeDictToInternalSocket(node_tree, + # groupNode, input_node, texGenDict, [], [], 0, True) + # socketDict, nodeIndex = nodeDictToInternalSocket(node_tree, + # groupNode, input_node, nodeDict, [], [], nodeIndex, True) + + texGenSocketDict = addSocketList( + groupNode, + input_node, + { + "Texture Gen": "NodeSocketFloat", + "Texture Gen Linear": "NodeSocketFloat", + }, + ) + + socketDict = addSocketList( + groupNode, + input_node, + { + "Image Factor": "NodeSocketVector", + "Normalized L": "NodeSocketVector", + "Normalized H": "NodeSocketVector", + "Clamp": "NodeSocketVector", + "Normalized Mask": "NodeSocketVector", + "Mirror": "NodeSocketVector", + "Shift": "NodeSocketVector", + "Scale": "NodeSocketVector", + "Normalized Half Pixel": "NodeSocketVector", + }, + ) + + x = 0 + y = 0 + horizontalDict, verticalDict, x, y = splitTextureVectorInputs( + group_tree, socketDict, x, y + ) + + # Regular UVs + x += 300 + y = 0 + UVMapNode, x, y = addNodeAt(group_tree, "ShaderNodeUVMap", None, x, y) + UVMapNode.uv_map = "UVMap" + + # Get normal + geometryNode, x, y = addNodeAt(group_tree, "ShaderNodeNewGeometry", None, x, y) + + # Convert to screen space normal + transformNode, x, y = addNodeAt(group_tree, "ShaderNodeVectorTransform", None, x, y) + transformNode.convert_from = "WORLD" + transformNode.convert_to = "CAMERA" + transformNode.vector_type = "NORMAL" + links.new(transformNode.inputs[0], geometryNode.outputs[1]) + + # Convert [-1,1] to [0,1] + x += 300 + y = 0 + addOneNode, x, y = addNodeAt(group_tree, "ShaderNodeVectorMath", None, x, y) + addOneNode.inputs[1].default_value = (1, 1, 1) + links.new(addOneNode.inputs[0], transformNode.outputs[0]) + + separateNode, x, y = addNodeAt(group_tree, "ShaderNodeSeparateXYZ", None, x, y) + links.new(separateNode.inputs[0], addOneNode.outputs[0]) + + divideTwoX, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, x, y) + divideTwoY, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, x, y) + divideTwoX.operation = "DIVIDE" + divideTwoY.operation = "DIVIDE" + divideTwoX.inputs[1].default_value = -2 # Must be negative (env, not sphere) + divideTwoY.inputs[1].default_value = -2 + links.new(divideTwoX.inputs[0], separateNode.outputs[0]) + links.new(divideTwoY.inputs[0], separateNode.outputs[1]) + + # Normalize values based on tex size. + x += 300 + y = 0 + normalizeX, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, x, y) + normalizeY, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, x, y) + normalizeX.operation = "MULTIPLY" + normalizeY.operation = "MULTIPLY" + links.new(normalizeX.inputs[0], divideTwoX.outputs[0]) + links.new(normalizeY.inputs[0], divideTwoY.outputs[0]) + links.new(normalizeX.inputs[1], horizontalDict["Image Factor"]) + links.new(normalizeY.inputs[1], verticalDict["Image Factor"]) + + # Get UVs for tex gen, scaled by texture scale. + + texGenCombine, x, y = addNodeAt( + group_tree, "ShaderNodeCombineXYZ", None, 1200, -300 + ) + links.new(texGenCombine.inputs[0], normalizeX.outputs[0]) + links.new(texGenCombine.inputs[1], normalizeY.outputs[0]) + + # Get UVs for tex gen linear, scaled by texture scale. + texGenLinearAcosX, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, 600, -600) + texGenLinearAcosY, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, 600, y) + texGenLinearAcosX.operation = "ARCCOSINE" + texGenLinearAcosY.operation = "ARCCOSINE" + links.new(texGenLinearAcosX.inputs[0], divideTwoX.outputs[0]) + links.new(texGenLinearAcosY.inputs[0], divideTwoY.outputs[0]) + texGenLinearAcosX.inputs[1].default_value = 0 + texGenLinearAcosY.inputs[1].default_value = 0 + + # Normalize values based on tex size. + normalizeLinearX, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, 600, y) + normalizeLinearY, x, y = addNodeAt(group_tree, "ShaderNodeMath", None, 600, y) + normalizeLinearX.operation = "MULTIPLY" + normalizeLinearY.operation = "MULTIPLY" + links.new(normalizeLinearX.inputs[0], texGenLinearAcosX.outputs[0]) + links.new(normalizeLinearY.inputs[0], texGenLinearAcosY.outputs[0]) + links.new(normalizeLinearX.inputs[1], horizontalDict["Image Factor"]) + links.new(normalizeLinearY.inputs[1], verticalDict["Image Factor"]) + + texGenLinearCombine, x, y = addNodeAt( + group_tree, "ShaderNodeCombineXYZ", None, 1200, -600 + ) + links.new(texGenLinearCombine.inputs[0], normalizeLinearX.outputs[0]) + links.new(texGenLinearCombine.inputs[1], normalizeLinearY.outputs[0]) + + # Mix UV based on flags + mixTexGen, x, y = addNodeAt(group_tree, "ShaderNodeMixRGB", None, 1500, 0) + links.new(mixTexGen.inputs[0], texGenSocketDict["Texture Gen"]) + links.new(mixTexGen.inputs[1], UVMapNode.outputs[0]) + links.new(mixTexGen.inputs[2], texGenCombine.outputs[0]) + + mixTexGenLinear, x, y = addNodeAt(group_tree, "ShaderNodeMixRGB", None, 1500, y) + links.new(mixTexGenLinear.inputs[0], texGenSocketDict["Texture Gen Linear"]) + links.new(mixTexGenLinear.inputs[1], mixTexGen.outputs[0]) + links.new(mixTexGenLinear.inputs[2], texGenLinearCombine.outputs[0]) + + # Apply tile attributes + uvSplit, x, y = addNodeAt(group_tree, "ShaderNodeSeparateXYZ", None, 1800, 500) + links.new(uvSplit.inputs[0], mixTexGenLinear.outputs[0]) + + uv_xNode = createTexCoordNode( + group_tree, [2000, 500], uvSplit.outputs[0], horizontalDict, False + ) + uv_yNode = createTexCoordNode( + group_tree, [2000, 300], uvSplit.outputs[1], verticalDict, True + ) + + links.new(uv_xNode.inputs[0], uvSplit.outputs[0]) + links.new(uv_yNode.inputs[0], uvSplit.outputs[1]) + + uvCombine, x, y = addNodeAt(group_tree, "ShaderNodeCombineXYZ", None, 2200, 500) + + links.new(uvCombine.inputs[0], uv_xNode.outputs[0]) + links.new(uvCombine.inputs[1], uv_yNode.outputs[0]) + + links.new(output_node.inputs[0], uvCombine.outputs[0]) + return groupNode, location[0], location[1] + def createShadeNode(node_tree, location): - groupNode = node_tree.nodes.new("ShaderNodeGroup") - groupNode.name = 'Shade Color' - groupNode.label = 'Shade Color' - groupNode.location = location - location[1] = location[1] - (groupNode.height + 100) - - createGroup = 'Get Shade Color F3D v3' not in bpy.data.node_groups - if not createGroup: - group_tree = bpy.data.node_groups['Get Shade Color F3D v3'] - groupNode.node_tree = group_tree - #shadingNodeInternal = createSocketToGroupLink(shadingNode.outputs[0], - # groupNode, None, node_tree, 0, 'Shading', False) - #lightingNodeInternal = createSocketToGroupLink(lightingNode.outputs[0], - # groupNode, None, node_tree, 1, 'Lighting', False) - #ambientInternal = createSocketToGroupLink(ambientNode.outputs[0], - # groupNode, None, node_tree, 2, 'Ambient Color', False) - - # Handle case so that shade alpha is visible even when using lighting. - nodes = group_tree.nodes - links = group_tree.links - if "Mix.002" in nodes: - outputNode = nodes["Group Output"] - alphaNode = nodes["Attribute.001"] - alphaMixNode = nodes["Mix.002"] - #if outputNode.inputs[1].links[0].from_node == alphaMixNode: - - # Link alpha node to alpha output. - links.new(alphaNode.outputs[2], outputNode.inputs[1]) - nodes.remove(alphaMixNode) - - return groupNode - - group_tree = bpy.data.node_groups.new(type="ShaderNodeTree", - name = 'Get Shade Color F3D v3') - links = group_tree.links - groupNode.node_tree = group_tree - input_node = group_tree.nodes.new("NodeGroupInput") - output_node = group_tree.nodes.new("NodeGroupOutput") - input_node.location = (-300, 0) - output_node.location = (600, 0) - - socketDict = addSocketList(groupNode, input_node, { - "Shading" : "NodeSocketFloat", - 'Lighting' : "NodeSocketFloat", - 'Ambient Color' : "NodeSocketColor" - }) - - #shadingNodeInternal = createSocketToGroupLink(shadingNode.outputs[0], - # groupNode, input_node, node_tree, 0, 'Shading', createGroup) - #lightingNodeInternal = createSocketToGroupLink(lightingNode.outputs[0], - # groupNode, input_node, node_tree, 1, 'Lighting', createGroup) - #ambientInternal = createSocketToGroupLink(ambientNode.outputs[0], - # groupNode, input_node, node_tree, 2, 'Ambient Color', createGroup) - groupNode.outputs.new('NodeSocketColor', 'Color') - output_node.inputs.new('NodeSocketColor', 'Color') - groupNode.outputs.new('NodeSocketFloat', 'Alpha') - output_node.inputs.new('NodeSocketFloat', 'Alpha') - - diffuseNode, x, y = addNodeAt(group_tree, 'ShaderNodeBsdfDiffuse', None, 0, 0) - colorNode, x, y = addNodeAt(group_tree, 'ShaderNodeRGB', None, 0, y) - toRGBNode, x, y = addNodeAt(group_tree, 'ShaderNodeShaderToRGB', None, 200, 0) - vertColorNode, x, y = addNodeAt(group_tree,'ShaderNodeAttribute',None, 200, y) - vertAlphaNode, x, y = addNodeAt(group_tree,'ShaderNodeAttribute',None, 200, y) - - addAmbient, x, y = \ - addNodeAt(group_tree, 'ShaderNodeVectorMath', None, 400, 0) - - mixRGB, x, y = addNodeAt(group_tree, 'ShaderNodeMixRGB', None, 600, 0) - mixRGBShadeless, x, y = addNodeAt(group_tree, 'ShaderNodeMixRGB', None,600, y) - mixAlpha, x, y = addNodeAt(group_tree, 'ShaderNodeMixRGB', None, 600, y) - - colorNode.outputs[0].default_value = (1,1,1,1) - vertColorNode.attribute_name = 'Col' - vertAlphaNode.attribute_name = 'Alpha' - - #links.new(diffuseNode.inputs[0], ambientInternal) - links.new(toRGBNode.inputs[0], diffuseNode.outputs[0]) - links.new(addAmbient.inputs[0], socketDict['Ambient Color']) - links.new(addAmbient.inputs[1], toRGBNode.outputs[0]) - links.new(mixRGB.inputs[0], socketDict['Lighting']) - links.new(mixRGB.inputs[1], vertColorNode.outputs[0]) - links.new(mixRGB.inputs[2], addAmbient.outputs[0]) - - links.new(mixRGBShadeless.inputs[0], socketDict['Shading']) - links.new(mixRGBShadeless.inputs[1], colorNode.outputs[0]) - links.new(mixRGBShadeless.inputs[2], mixRGB.outputs[0]) - - links.new(mixAlpha.inputs[0], socketDict['Lighting']) - links.new(mixAlpha.inputs[1], vertAlphaNode.outputs[2]) - mixAlpha.inputs[2].default_value = (1,1,1,1) - - links.new(output_node.inputs[0], mixRGBShadeless.outputs[0]) - links.new(output_node.inputs[1], mixAlpha.outputs[0]) - - return groupNode + groupNode = node_tree.nodes.new("ShaderNodeGroup") + groupNode.name = "Shade Color" + groupNode.label = "Shade Color" + groupNode.location = location + location[1] = location[1] - (groupNode.height + 100) + + createGroup = "Get Shade Color F3D v3" not in bpy.data.node_groups + if not createGroup: + group_tree = bpy.data.node_groups["Get Shade Color F3D v3"] + groupNode.node_tree = group_tree + # shadingNodeInternal = createSocketToGroupLink(shadingNode.outputs[0], + # groupNode, None, node_tree, 0, 'Shading', False) + # lightingNodeInternal = createSocketToGroupLink(lightingNode.outputs[0], + # groupNode, None, node_tree, 1, 'Lighting', False) + # ambientInternal = createSocketToGroupLink(ambientNode.outputs[0], + # groupNode, None, node_tree, 2, 'Ambient Color', False) + + # Handle case so that shade alpha is visible even when using lighting. + nodes = group_tree.nodes + links = group_tree.links + if "Mix.002" in nodes: + outputNode = nodes["Group Output"] + alphaNode = nodes["Attribute.001"] + alphaMixNode = nodes["Mix.002"] + # if outputNode.inputs[1].links[0].from_node == alphaMixNode: + + # Link alpha node to alpha output. + links.new(alphaNode.outputs[2], outputNode.inputs[1]) + nodes.remove(alphaMixNode) + + return groupNode + + group_tree = bpy.data.node_groups.new( + type="ShaderNodeTree", name="Get Shade Color F3D v3" + ) + links = group_tree.links + groupNode.node_tree = group_tree + input_node = group_tree.nodes.new("NodeGroupInput") + output_node = group_tree.nodes.new("NodeGroupOutput") + input_node.location = (-300, 0) + output_node.location = (600, 0) + + socketDict = addSocketList( + groupNode, + input_node, + { + "Shading": "NodeSocketFloat", + "Lighting": "NodeSocketFloat", + "Ambient Color": "NodeSocketColor", + }, + ) + + # shadingNodeInternal = createSocketToGroupLink(shadingNode.outputs[0], + # groupNode, input_node, node_tree, 0, 'Shading', createGroup) + # lightingNodeInternal = createSocketToGroupLink(lightingNode.outputs[0], + # groupNode, input_node, node_tree, 1, 'Lighting', createGroup) + # ambientInternal = createSocketToGroupLink(ambientNode.outputs[0], + # groupNode, input_node, node_tree, 2, 'Ambient Color', createGroup) + groupNode.outputs.new("NodeSocketColor", "Color") + output_node.inputs.new("NodeSocketColor", "Color") + groupNode.outputs.new("NodeSocketFloat", "Alpha") + output_node.inputs.new("NodeSocketFloat", "Alpha") + + diffuseNode, x, y = addNodeAt(group_tree, "ShaderNodeBsdfDiffuse", None, 0, 0) + colorNode, x, y = addNodeAt(group_tree, "ShaderNodeRGB", None, 0, y) + toRGBNode, x, y = addNodeAt(group_tree, "ShaderNodeShaderToRGB", None, 200, 0) + vertColorNode, x, y = addNodeAt(group_tree, "ShaderNodeAttribute", None, 200, y) + vertAlphaNode, x, y = addNodeAt(group_tree, "ShaderNodeAttribute", None, 200, y) + + addAmbient, x, y = addNodeAt(group_tree, "ShaderNodeVectorMath", None, 400, 0) + + mixRGB, x, y = addNodeAt(group_tree, "ShaderNodeMixRGB", None, 600, 0) + mixRGBShadeless, x, y = addNodeAt(group_tree, "ShaderNodeMixRGB", None, 600, y) + mixAlpha, x, y = addNodeAt(group_tree, "ShaderNodeMixRGB", None, 600, y) + + colorNode.outputs[0].default_value = (1, 1, 1, 1) + vertColorNode.attribute_name = "Col" + vertAlphaNode.attribute_name = "Alpha" + + # links.new(diffuseNode.inputs[0], ambientInternal) + links.new(toRGBNode.inputs[0], diffuseNode.outputs[0]) + links.new(addAmbient.inputs[0], socketDict["Ambient Color"]) + links.new(addAmbient.inputs[1], toRGBNode.outputs[0]) + links.new(mixRGB.inputs[0], socketDict["Lighting"]) + links.new(mixRGB.inputs[1], vertColorNode.outputs[0]) + links.new(mixRGB.inputs[2], addAmbient.outputs[0]) + + links.new(mixRGBShadeless.inputs[0], socketDict["Shading"]) + links.new(mixRGBShadeless.inputs[1], colorNode.outputs[0]) + links.new(mixRGBShadeless.inputs[2], mixRGB.outputs[0]) + + links.new(mixAlpha.inputs[0], socketDict["Lighting"]) + links.new(mixAlpha.inputs[1], vertAlphaNode.outputs[2]) + mixAlpha.inputs[2].default_value = (1, 1, 1, 1) + + links.new(output_node.inputs[0], mixRGBShadeless.outputs[0]) + links.new(output_node.inputs[1], mixAlpha.outputs[0]) + + return groupNode + def createTexFormatNodes(node_tree, location, externalColorSocket, externalAlphaSocket): - groupNode = node_tree.nodes.new("ShaderNodeGroup") - groupNode.location = location - groupNode.name = 'Get Texture Color' - location[1] = location[1] - (groupNode.height + 100) - - createGroup = 'Get Texture Color F3D v3' not in bpy.data.node_groups - if not createGroup: - group_tree = bpy.data.node_groups['Get Texture Color F3D v3'] - groupNode.node_tree = group_tree - - nodeIndex = 0 - colorSocket = createSocketToGroupLink(externalColorSocket, groupNode, None, - node_tree, nodeIndex, "Color", createGroup) - nodeIndex += 1 - alphaSocket = createSocketToGroupLink(externalAlphaSocket, groupNode, None, - node_tree, nodeIndex, "Alpha", createGroup) - nodeIndex += 1 - - #socketDict, nodeIndex = nodeDictToInternalSocket(node_tree, - # groupNode, None, nodeDict, [], [], nodeIndex, createGroup) - - return groupNode, location[0], location[1] - - group_tree = bpy.data.node_groups.new(type="ShaderNodeTree", name = 'Get Texture Color F3D v3') - links = group_tree.links - groupNode.node_tree = group_tree - input_node = group_tree.nodes.new("NodeGroupInput") - output_node = group_tree.nodes.new("NodeGroupOutput") - - x = 0 - y = 0 - input_node.location = (x,y) - - output_node.inputs.new('NodeSocketColor', 'Color') - groupNode.outputs.new("NodeSocketColor", "Color") - output_node.inputs.new('NodeSocketFloat', 'Alpha') - groupNode.outputs.new("NodeSocketFloat", "Alpha") - - nodeIndex = 0 - colorSocket = createSocketToGroupLink(externalColorSocket, groupNode, input_node, - node_tree, nodeIndex, "Color", createGroup) - nodeIndex += 1 - alphaSocket = createSocketToGroupLink(externalAlphaSocket, groupNode, input_node, - node_tree, nodeIndex, "Alpha", createGroup) - nodeIndex += 1 - - socketDict = addSocketList(groupNode, input_node, { - "Is Greyscale" : "NodeSocketFloat", - "Has Alpha" : "NodeSocketFloat", - 'Is Intensity' : "NodeSocketFloat" - }) - - #socketDict, nodeIndex = nodeDictToInternalSocket(node_tree, - # groupNode, input_node, nodeDict, [], [], nodeIndex, createGroup) - - # Add texture format mixes - x += 300 - greyNode, x, y = addNodeAt(group_tree, 'ShaderNodeSeparateHSV', - None, x, y) - links.new(greyNode.inputs[0], colorSocket) - - greyMix, x, y = addNodeAt(group_tree, 'ShaderNodeMixRGB', - None, x, y) - links.new(greyMix.inputs[0], socketDict["Is Greyscale"]) - links.new(greyMix.inputs[1], colorSocket) - links.new(greyMix.inputs[2], greyNode.outputs[2]) - links.new(output_node.inputs[0], greyMix.outputs[0]) - - alphaMix, x, y = addNodeAt(group_tree, 'ShaderNodeMixRGB', - None, x, y) - links.new(alphaMix.inputs[0], socketDict["Has Alpha"]) - links.new(alphaMix.inputs[2], alphaSocket) - alphaMix.inputs[1].default_value = (1,1,1,1) - - alphaMixIntensity, x, y = addNodeAt(group_tree, 'ShaderNodeMixRGB', - None, x, y) - links.new(alphaMixIntensity.inputs[0], socketDict["Is Intensity"]) - links.new(alphaMixIntensity.inputs[1], alphaMix.outputs[0]) - links.new(alphaMixIntensity.inputs[2], greyNode.outputs[2]) - links.new(output_node.inputs[1], alphaMixIntensity.outputs[0]) - - x += 300 - output_node.location = (x, 0) - - return groupNode, location[0], location[1] + groupNode = node_tree.nodes.new("ShaderNodeGroup") + groupNode.location = location + groupNode.name = "Get Texture Color" + location[1] = location[1] - (groupNode.height + 100) + + createGroup = "Get Texture Color F3D v3" not in bpy.data.node_groups + if not createGroup: + group_tree = bpy.data.node_groups["Get Texture Color F3D v3"] + groupNode.node_tree = group_tree + + nodeIndex = 0 + colorSocket = createSocketToGroupLink( + externalColorSocket, + groupNode, + None, + node_tree, + nodeIndex, + "Color", + createGroup, + ) + nodeIndex += 1 + alphaSocket = createSocketToGroupLink( + externalAlphaSocket, + groupNode, + None, + node_tree, + nodeIndex, + "Alpha", + createGroup, + ) + nodeIndex += 1 + + # socketDict, nodeIndex = nodeDictToInternalSocket(node_tree, + # groupNode, None, nodeDict, [], [], nodeIndex, createGroup) + + return groupNode, location[0], location[1] + + group_tree = bpy.data.node_groups.new( + type="ShaderNodeTree", name="Get Texture Color F3D v3" + ) + links = group_tree.links + groupNode.node_tree = group_tree + input_node = group_tree.nodes.new("NodeGroupInput") + output_node = group_tree.nodes.new("NodeGroupOutput") + + x = 0 + y = 0 + input_node.location = (x, y) + + output_node.inputs.new("NodeSocketColor", "Color") + groupNode.outputs.new("NodeSocketColor", "Color") + output_node.inputs.new("NodeSocketFloat", "Alpha") + groupNode.outputs.new("NodeSocketFloat", "Alpha") + + nodeIndex = 0 + colorSocket = createSocketToGroupLink( + externalColorSocket, + groupNode, + input_node, + node_tree, + nodeIndex, + "Color", + createGroup, + ) + nodeIndex += 1 + alphaSocket = createSocketToGroupLink( + externalAlphaSocket, + groupNode, + input_node, + node_tree, + nodeIndex, + "Alpha", + createGroup, + ) + nodeIndex += 1 + + socketDict = addSocketList( + groupNode, + input_node, + { + "Is Greyscale": "NodeSocketFloat", + "Has Alpha": "NodeSocketFloat", + "Is Intensity": "NodeSocketFloat", + }, + ) + + # socketDict, nodeIndex = nodeDictToInternalSocket(node_tree, + # groupNode, input_node, nodeDict, [], [], nodeIndex, createGroup) + + # Add texture format mixes + x += 300 + greyNode, x, y = addNodeAt(group_tree, "ShaderNodeSeparateHSV", None, x, y) + links.new(greyNode.inputs[0], colorSocket) + + greyMix, x, y = addNodeAt(group_tree, "ShaderNodeMixRGB", None, x, y) + links.new(greyMix.inputs[0], socketDict["Is Greyscale"]) + links.new(greyMix.inputs[1], colorSocket) + links.new(greyMix.inputs[2], greyNode.outputs[2]) + links.new(output_node.inputs[0], greyMix.outputs[0]) + + alphaMix, x, y = addNodeAt(group_tree, "ShaderNodeMixRGB", None, x, y) + links.new(alphaMix.inputs[0], socketDict["Has Alpha"]) + links.new(alphaMix.inputs[2], alphaSocket) + alphaMix.inputs[1].default_value = (1, 1, 1, 1) + + alphaMixIntensity, x, y = addNodeAt(group_tree, "ShaderNodeMixRGB", None, x, y) + links.new(alphaMixIntensity.inputs[0], socketDict["Is Intensity"]) + links.new(alphaMixIntensity.inputs[1], alphaMix.outputs[0]) + links.new(alphaMixIntensity.inputs[2], greyNode.outputs[2]) + links.new(output_node.inputs[1], alphaMixIntensity.outputs[0]) + + x += 300 + output_node.location = (x, 0) + + return groupNode, location[0], location[1] + def createUVInputsAndGroup(node_tree, texIndex, x, y): - uvNode, x, y = createUVGroup(node_tree, [x,y], texIndex) + uvNode, x, y = createUVGroup(node_tree, [x, y], texIndex) + + return uvNode, x + 300, 0 - return uvNode, x + 300, 0 def createTextureInputsAndGroup(node_tree, texIndex, x, y): - colorSocket = node_tree.nodes["Texture " + str(texIndex)].outputs[0] - alphaSocket = node_tree.nodes["Texture " + str(texIndex)].outputs[1] + colorSocket = node_tree.nodes["Texture " + str(texIndex)].outputs[0] + alphaSocket = node_tree.nodes["Texture " + str(texIndex)].outputs[1] - colorNode, x, y = createTexFormatNodes(node_tree, [x,y], colorSocket, alphaSocket) - return colorNode, x, y + colorNode, x, y = createTexFormatNodes(node_tree, [x, y], colorSocket, alphaSocket) + return colorNode, x, y -''' +""" class F3DLightCollectionProperty(bpy.types.PropertyGroup): light1 : bpy.props.PointerProperty(type = bpy.types.Light) light2 : bpy.props.PointerProperty(type = bpy.types.Light) @@ -1114,107 +1267,112 @@ class F3DLightCollectionProperty(bpy.types.PropertyGroup): light5 : bpy.props.PointerProperty(type = bpy.types.Light) light6 : bpy.props.PointerProperty(type = bpy.types.Light) light7 : bpy.props.PointerProperty(type = bpy.types.Light) -''' - +""" + + class GetAlphaFromColor(ShaderNode): - bl_idname = 'GetAlphaFromColor' - # Label for nice name display - bl_label = "Get Alpha From Color" - # Icon identifier - bl_icon = 'NODE' - - def update_GetAlphaFromColor(self, context): - inputSocket = self.inputs[0] - if inputSocket.is_linked: - for link in inputSocket.links: - if link.is_valid: - self.inputs[0].default_value = \ - link.from_socket.default_value - - if len(self.outputs) >= 2: - out = self.outputs[0] - if out.is_linked: - for link in out.links: - if link.is_valid: - link.to_socket.default_value = self.inputs[0].default_value - - outAlpha = self.outputs[1] - if outAlpha.is_linked: - for link in outAlpha.links: - if link.is_valid: - link.to_socket.default_value = self.inputs[0].default_value[3] - - inColor : bpy.props.FloatVectorProperty( - name = 'Input Color', subtype='COLOR', size = 4, - update = update_GetAlphaFromColor) - - def init(self, context): - self.inputs.new("NodeSocketColor", "Input Color") - self.outputs.new("NodeSocketColor", "Output Color") - self.outputs.new("NodeSocketFloat", "Output Alpha") - - # Copy function to initialize a copied node from an existing one. - def copy(self, node): - pass #print("Copying from node ", node) - - # Free function to clean up on removal. - def free(self): - print("Removing node ", self, ", Goodbye!") - - # Additional buttons displayed on the node. - def draw_buttons(self, context, layout): - pass - #layout.prop(self, 'inA') - - def draw_label(self): - return "Get Alpha From Color" - - def update(self): - inputSocket = self.inputs[0] - if inputSocket.is_linked: - for link in inputSocket.links: - if link.is_valid: - self.inputs[0].default_value = \ - link.from_socket.default_value - - if len(self.outputs) >= 2: - out = self.outputs[0] - if out.is_linked: - for link in out.links: - if link.is_valid: - link.to_socket.default_value = self.inputs[0].default_value - - outAlpha = self.outputs[1] - if outAlpha.is_linked: - for link in outAlpha.links: - if link.is_valid: - link.to_socket.default_value = self.inputs[0].default_value[3] + bl_idname = "GetAlphaFromColor" + # Label for nice name display + bl_label = "Get Alpha From Color" + # Icon identifier + bl_icon = "NODE" + + def update_GetAlphaFromColor(self, context): + inputSocket = self.inputs[0] + if inputSocket.is_linked: + for link in inputSocket.links: + if link.is_valid: + self.inputs[0].default_value = link.from_socket.default_value + + if len(self.outputs) >= 2: + out = self.outputs[0] + if out.is_linked: + for link in out.links: + if link.is_valid: + link.to_socket.default_value = self.inputs[0].default_value + + outAlpha = self.outputs[1] + if outAlpha.is_linked: + for link in outAlpha.links: + if link.is_valid: + link.to_socket.default_value = self.inputs[0].default_value[3] + + inColor: bpy.props.FloatVectorProperty( + name="Input Color", subtype="COLOR", size=4, update=update_GetAlphaFromColor + ) + + def init(self, context): + self.inputs.new("NodeSocketColor", "Input Color") + self.outputs.new("NodeSocketColor", "Output Color") + self.outputs.new("NodeSocketFloat", "Output Alpha") + + # Copy function to initialize a copied node from an existing one. + def copy(self, node): + pass # print("Copying from node ", node) + + # Free function to clean up on removal. + def free(self): + print("Removing node ", self, ", Goodbye!") + + # Additional buttons displayed on the node. + def draw_buttons(self, context, layout): + pass + # layout.prop(self, 'inA') + + def draw_label(self): + return "Get Alpha From Color" + + def update(self): + inputSocket = self.inputs[0] + if inputSocket.is_linked: + for link in inputSocket.links: + if link.is_valid: + self.inputs[0].default_value = link.from_socket.default_value + + if len(self.outputs) >= 2: + out = self.outputs[0] + if out.is_linked: + for link in out.links: + if link.is_valid: + link.to_socket.default_value = self.inputs[0].default_value + + outAlpha = self.outputs[1] + if outAlpha.is_linked: + for link in outAlpha.links: + if link.is_valid: + link.to_socket.default_value = self.inputs[0].default_value[3] + class F3DNodeA(ShaderNode): - bl_idname = 'Fast3D_A' + bl_idname = "Fast3D_A" # Label for nice name display bl_label = "Case A" # Icon identifier - bl_icon = 'NODE' + bl_icon = "NODE" def update_F3DNodeA(self, context): out = self.outputs[0] if out.is_linked: for link in out.links: if link.is_valid: - link.to_socket.default_value = F3D('F3D', False).CCMUXDict[self.inA] + link.to_socket.default_value = F3D("F3D", False).CCMUXDict[self.inA] - inA : bpy.props.EnumProperty(name = "A", description = "A", - items = combiner_enums['Case A'], default = 'TEXEL0', update = update_F3DNodeA) + inA: bpy.props.EnumProperty( + name="A", + description="A", + items=combiner_enums["Case A"], + default="TEXEL0", + update=update_F3DNodeA, + ) def init(self, context): self.outputs.new("NodeSocketInt", "A") # Copy function to initialize a copied node from an existing one. def copy(self, node): - pass #print("Copying from node ", node) + pass # print("Copying from node ", node) # Free function to clean up on removal. def free(self): @@ -1222,42 +1380,48 @@ def free(self): # Additional buttons displayed on the node. def draw_buttons(self, context, layout): - layout.prop(self, 'inA') + layout.prop(self, "inA") def draw_label(self): return "Fast3D Node A" - + def update(self): out = self.outputs[0] if out.is_linked: for link in out.links: if link.is_valid: - link.to_socket.default_value = F3D('F3D', False).CCMUXDict[self.inA] + link.to_socket.default_value = F3D("F3D", False).CCMUXDict[self.inA] + class F3DNodeB(ShaderNode): - bl_idname = 'Fast3D_B' + bl_idname = "Fast3D_B" # Label for nice name display bl_label = "Case B" # Icon identifier - bl_icon = 'NODE' + bl_icon = "NODE" def update_F3DNodeB(self, context): out = self.outputs[0] if out.is_linked: for link in out.links: if link.is_valid: - link.to_socket.default_value = F3D('F3D', False).CCMUXDict[self.inB] + link.to_socket.default_value = F3D("F3D", False).CCMUXDict[self.inB] - inB : bpy.props.EnumProperty(name = "B", description = "B", - items = combiner_enums['Case B'], default = '0', update = update_F3DNodeB) + inB: bpy.props.EnumProperty( + name="B", + description="B", + items=combiner_enums["Case B"], + default="0", + update=update_F3DNodeB, + ) def init(self, context): self.outputs.new("NodeSocketInt", "B") # Copy function to initialize a copied node from an existing one. def copy(self, node): - pass #print("Copying from node ", node) + pass # print("Copying from node ", node) # Free function to clean up on removal. def free(self): @@ -1265,42 +1429,48 @@ def free(self): # Additional buttons displayed on the node. def draw_buttons(self, context, layout): - layout.prop(self, 'inB') + layout.prop(self, "inB") def draw_label(self): return "Fast3D Node B" - + def update(self): out = self.outputs[0] if out.is_linked: for link in out.links: if link.is_valid: - link.to_socket.default_value = F3D('F3D', False).CCMUXDict[self.inB] - + link.to_socket.default_value = F3D("F3D", False).CCMUXDict[self.inB] + + class F3DNodeC(ShaderNode): - bl_idname = 'Fast3D_C' + bl_idname = "Fast3D_C" # Label for nice name display bl_label = "Case C" # Icon identifier - bl_icon = 'NODE' + bl_icon = "NODE" def update_F3DNodeC(self, context): out = self.outputs[0] if out.is_linked: for link in out.links: if link.is_valid: - link.to_socket.default_value = F3D('F3D', False).CCMUXDict[self.inC] + link.to_socket.default_value = F3D("F3D", False).CCMUXDict[self.inC] - inC : bpy.props.EnumProperty(name = "C", description = "C", - items = combiner_enums['Case C'], default = 'SHADE', update = update_F3DNodeC) + inC: bpy.props.EnumProperty( + name="C", + description="C", + items=combiner_enums["Case C"], + default="SHADE", + update=update_F3DNodeC, + ) def init(self, context): self.outputs.new("NodeSocketInt", "C") # Copy function to initialize a copied node from an existing one. def copy(self, node): - pass #print("Copying from node ", node) + pass # print("Copying from node ", node) # Free function to clean up on removal. def free(self): @@ -1308,42 +1478,48 @@ def free(self): # Additional buttons displayed on the node. def draw_buttons(self, context, layout): - layout.prop(self, 'inC') + layout.prop(self, "inC") def draw_label(self): return "Fast3D Node C" - + def update(self): out = self.outputs[0] if out.is_linked: for link in out.links: if link.is_valid: - link.to_socket.default_value = F3D('F3D', False).CCMUXDict[self.inC] + link.to_socket.default_value = F3D("F3D", False).CCMUXDict[self.inC] + class F3DNodeD(ShaderNode): - bl_idname = 'Fast3D_D' + bl_idname = "Fast3D_D" # Label for nice name display bl_label = "Case D" # Icon identifier - bl_icon = 'NODE' + bl_icon = "NODE" def update_F3DNodeD(self, context): out = self.outputs[0] if out.is_linked: for link in out.links: if link.is_valid: - link.to_socket.default_value = F3D('F3D', False).CCMUXDict[self.inD] + link.to_socket.default_value = F3D("F3D", False).CCMUXDict[self.inD] - inD : bpy.props.EnumProperty(name = "D", description = "D", - items = combiner_enums['Case D'], default = '0', update = update_F3DNodeD) + inD: bpy.props.EnumProperty( + name="D", + description="D", + items=combiner_enums["Case D"], + default="0", + update=update_F3DNodeD, + ) def init(self, context): self.outputs.new("NodeSocketInt", "D") # Copy function to initialize a copied node from an existing one. def copy(self, node): - pass #print("Copying from node ", node) + pass # print("Copying from node ", node) # Free function to clean up on removal. def free(self): @@ -1351,43 +1527,50 @@ def free(self): # Additional buttons displayed on the node. def draw_buttons(self, context, layout): - layout.prop(self, 'inD') + layout.prop(self, "inD") def draw_label(self): return "Fast3D Node D" - + def update(self): out = self.outputs[0] if out.is_linked: for link in out.links: if link.is_valid: - link.to_socket.default_value = F3D('F3D', False).CCMUXDict[self.inD] + link.to_socket.default_value = F3D("F3D", False).CCMUXDict[self.inD] + class F3DNodeA_alpha(ShaderNode): - bl_idname = 'Fast3D_A_alpha' + bl_idname = "Fast3D_A_alpha" # Label for nice name display bl_label = "Case A Alpha" # Icon identifier - bl_icon = 'NODE' + bl_icon = "NODE" def update_F3DNodeA_alpha(self, context): out = self.outputs[0] if out.is_linked: for link in out.links: if link.is_valid: - link.to_socket.default_value = F3D('F3D', False).ACMUXDict[self.inA_alpha] - - inA_alpha : bpy.props.EnumProperty(name = "A Alpha", - description = "A Alpha", items = combiner_enums['Case A Alpha'], - default = '0', update = update_F3DNodeA_alpha) + link.to_socket.default_value = F3D("F3D", False).ACMUXDict[ + self.inA_alpha + ] + + inA_alpha: bpy.props.EnumProperty( + name="A Alpha", + description="A Alpha", + items=combiner_enums["Case A Alpha"], + default="0", + update=update_F3DNodeA_alpha, + ) def init(self, context): self.outputs.new("NodeSocketInt", "A Alpha") # Copy function to initialize a copied node from an existing one. def copy(self, node): - pass #print("Copying from node ", node) + pass # print("Copying from node ", node) # Free function to clean up on removal. def free(self): @@ -1395,42 +1578,52 @@ def free(self): # Additional buttons displayed on the node. def draw_buttons(self, context, layout): - layout.prop(self, 'inA_alpha') + layout.prop(self, "inA_alpha") def draw_label(self): return "Fast3D Node A Alpha" - + def update(self): out = self.outputs[0] if out.is_linked: for link in out.links: if link.is_valid: - link.to_socket.default_value = F3D('F3D', False).ACMUXDict[self.inA_alpha] + link.to_socket.default_value = F3D("F3D", False).ACMUXDict[ + self.inA_alpha + ] + class F3DNodeB_alpha(ShaderNode): - bl_idname = 'Fast3D_B_alpha' + bl_idname = "Fast3D_B_alpha" # Label for nice name display bl_label = "Case B Alpha" # Icon identifier - bl_icon = 'NODE' + bl_icon = "NODE" def update_F3DNodeB_alpha(self, context): out = self.outputs[0] if out.is_linked: for link in out.links: if link.is_valid: - link.to_socket.default_value = F3D('F3D', False).ACMUXDict[self.inB_alpha] - - inB_alpha : bpy.props.EnumProperty(name = "B Alpha", description = "B Alpha", - items = combiner_enums['Case B Alpha'], default = '0', update = update_F3DNodeB_alpha) + link.to_socket.default_value = F3D("F3D", False).ACMUXDict[ + self.inB_alpha + ] + + inB_alpha: bpy.props.EnumProperty( + name="B Alpha", + description="B Alpha", + items=combiner_enums["Case B Alpha"], + default="0", + update=update_F3DNodeB_alpha, + ) def init(self, context): self.outputs.new("NodeSocketInt", "B Alpha") # Copy function to initialize a copied node from an existing one. def copy(self, node): - pass #print("Copying from node ", node) + pass # print("Copying from node ", node) # Free function to clean up on removal. def free(self): @@ -1438,42 +1631,52 @@ def free(self): # Additional buttons displayed on the node. def draw_buttons(self, context, layout): - layout.prop(self, 'inB_alpha') + layout.prop(self, "inB_alpha") def draw_label(self): return "Fast3D Node B Alpha" - + def update(self): out = self.outputs[0] if out.is_linked: for link in out.links: if link.is_valid: - link.to_socket.default_value = F3D('F3D', False).ACMUXDict[self.inB_alpha] + link.to_socket.default_value = F3D("F3D", False).ACMUXDict[ + self.inB_alpha + ] + class F3DNodeC_alpha(ShaderNode): - bl_idname = 'Fast3D_C_alpha' + bl_idname = "Fast3D_C_alpha" # Label for nice name display bl_label = "Case C Alpha" # Icon identifier - bl_icon = 'NODE' + bl_icon = "NODE" def update_F3DNodeC_alpha(self, context): out = self.outputs[0] if out.is_linked: for link in out.links: if link.is_valid: - link.to_socket.default_value = F3D('F3D', False).ACMUXDict[self.inC_alpha] - - inC_alpha : bpy.props.EnumProperty(name = "C Alpha", description = "C Alpha", - items = combiner_enums['Case C Alpha'], default = '0', update = update_F3DNodeC_alpha) + link.to_socket.default_value = F3D("F3D", False).ACMUXDict[ + self.inC_alpha + ] + + inC_alpha: bpy.props.EnumProperty( + name="C Alpha", + description="C Alpha", + items=combiner_enums["Case C Alpha"], + default="0", + update=update_F3DNodeC_alpha, + ) def init(self, context): self.outputs.new("NodeSocketInt", "C Alpha") # Copy function to initialize a copied node from an existing one. def copy(self, node): - pass #print("Copying from node ", node) + pass # print("Copying from node ", node) # Free function to clean up on removal. def free(self): @@ -1481,42 +1684,52 @@ def free(self): # Additional buttons displayed on the node. def draw_buttons(self, context, layout): - layout.prop(self, 'inC_alpha') + layout.prop(self, "inC_alpha") def draw_label(self): return "Fast3D Node C Alpha" - + def update(self): out = self.outputs[0] if out.is_linked: for link in out.links: if link.is_valid: - link.to_socket.default_value = F3D('F3D', False).ACMUXDict[self.inC_alpha] + link.to_socket.default_value = F3D("F3D", False).ACMUXDict[ + self.inC_alpha + ] + class F3DNodeD_alpha(ShaderNode): - bl_idname = 'Fast3D_D_alpha' + bl_idname = "Fast3D_D_alpha" # Label for nice name display bl_label = "Case D Alpha" # Icon identifier - bl_icon = 'NODE' + bl_icon = "NODE" def update_F3DNodeD_alpha(self, context): out = self.outputs[0] if out.is_linked: for link in out.links: if link.is_valid: - link.to_socket.default_value = F3D('F3D', False).ACMUXDict[self.inD_alpha] - - inD_alpha : bpy.props.EnumProperty(name = "D Alpha", description = "D Alpha", - items = combiner_enums['Case D Alpha'], default = 'ENVIRONMENT', update = update_F3DNodeD_alpha) + link.to_socket.default_value = F3D("F3D", False).ACMUXDict[ + self.inD_alpha + ] + + inD_alpha: bpy.props.EnumProperty( + name="D Alpha", + description="D Alpha", + items=combiner_enums["Case D Alpha"], + default="ENVIRONMENT", + update=update_F3DNodeD_alpha, + ) def init(self, context): self.outputs.new("NodeSocketInt", "D Alpha") # Copy function to initialize a copied node from an existing one. def copy(self, node): - pass #print("Copying from node ", node) + pass # print("Copying from node ", node) # Free function to clean up on removal. def free(self): @@ -1524,21 +1737,22 @@ def free(self): # Additional buttons displayed on the node. def draw_buttons(self, context, layout): - layout.prop(self, 'inD_alpha') + layout.prop(self, "inD_alpha") def draw_label(self): return "Fast3D Node D Alpha" - + def update(self): out = self.outputs[0] if out.is_linked: for link in out.links: if link.is_valid: - link.to_socket.default_value = \ - F3D('F3D', False).ACMUXDict[self.inD_alpha] + link.to_socket.default_value = F3D("F3D", False).ACMUXDict[ + self.inD_alpha + ] class F3DNodeCategory(NodeCategory): @classmethod def poll(cls, context): - return context.space_data.tree_type == 'CustomTreeType' + return context.space_data.tree_type == "CustomTreeType" diff --git a/fast64_internal/f3d/f3d_material_presets.py b/fast64_internal/f3d/f3d_material_presets.py index 2991dc5cd..d2e2a8e90 100644 --- a/fast64_internal/f3d/f3d_material_presets.py +++ b/fast64_internal/f3d/f3d_material_presets.py @@ -1,4 +1,4 @@ -oot_shaded_environment_mapped = ''' +oot_shaded_environment_mapped = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -114,9 +114,9 @@ f3d_mat.draw_layer.oot = 'Opaque' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -oot_shaded_environment_mapped_transparent = ''' +oot_shaded_environment_mapped_transparent = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -232,9 +232,9 @@ f3d_mat.draw_layer.oot = 'Transparent' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -oot_shaded_multitexture_lerp = ''' +oot_shaded_multitexture_lerp = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -350,9 +350,9 @@ f3d_mat.draw_layer.oot = 'Opaque' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -oot_shaded_multitexture_lerp_transparent = ''' +oot_shaded_multitexture_lerp_transparent = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -468,9 +468,9 @@ f3d_mat.draw_layer.oot = 'Transparent' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -oot_shaded_solid = ''' +oot_shaded_solid = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -586,9 +586,9 @@ f3d_mat.draw_layer.oot = 'Opaque' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -oot_shaded_solid_transparent = ''' +oot_shaded_solid_transparent = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -704,9 +704,9 @@ f3d_mat.draw_layer.oot = 'Transparent' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -oot_shaded_texture = ''' +oot_shaded_texture = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -822,9 +822,9 @@ f3d_mat.draw_layer.oot = 'Opaque' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -oot_shaded_texture_cutout = ''' +oot_shaded_texture_cutout = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -940,9 +940,9 @@ f3d_mat.draw_layer.oot = 'Opaque' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -oot_shaded_texture_transparent = ''' +oot_shaded_texture_transparent = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -1058,9 +1058,9 @@ f3d_mat.draw_layer.oot = 'Transparent' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -oot_unlit_texture = ''' +oot_unlit_texture = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -1176,9 +1176,9 @@ f3d_mat.draw_layer.oot = 'Opaque' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -oot_unlit_texture_cutout = ''' +oot_unlit_texture_cutout = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -1294,9 +1294,9 @@ f3d_mat.draw_layer.oot = 'Opaque' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -oot_unlit_texture_transparent = ''' +oot_unlit_texture_transparent = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -1412,9 +1412,9 @@ f3d_mat.draw_layer.oot = 'Transparent' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -oot_vertex_colored_texture = ''' +oot_vertex_colored_texture = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -1530,9 +1530,9 @@ f3d_mat.draw_layer.oot = 'Opaque' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -oot_vertex_colored_texture_cutout = ''' +oot_vertex_colored_texture_cutout = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -1648,9 +1648,9 @@ f3d_mat.draw_layer.oot = 'Opaque' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -oot_vertex_colored_texture_transparent = ''' +oot_vertex_colored_texture_transparent = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -1766,9 +1766,9 @@ f3d_mat.draw_layer.oot = 'Transparent' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -sm64_decal = ''' +sm64_decal = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -1883,9 +1883,9 @@ f3d_mat.draw_layer.oot = 'Opaque' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -sm64_environment_map = ''' +sm64_environment_map = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -2000,9 +2000,9 @@ f3d_mat.draw_layer.oot = 'Opaque' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -sm64_fog_shaded_texture = ''' +sm64_fog_shaded_texture = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -2117,9 +2117,9 @@ f3d_mat.draw_layer.oot = 'Opaque' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -sm64_fog_shaded_texture_cutout = ''' +sm64_fog_shaded_texture_cutout = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -2234,9 +2234,9 @@ f3d_mat.draw_layer.oot = 'Opaque' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -sm64_fog_shaded_texture_transparent = ''' +sm64_fog_shaded_texture_transparent = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -2351,9 +2351,9 @@ f3d_mat.draw_layer.oot = 'Transparent' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -sm64_shaded_noise = ''' +sm64_shaded_noise = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -2468,9 +2468,9 @@ f3d_mat.draw_layer.oot = 'Opaque' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -sm64_shaded_solid = ''' +sm64_shaded_solid = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -2585,9 +2585,9 @@ f3d_mat.draw_layer.oot = 'Opaque' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -sm64_shaded_texture = ''' +sm64_shaded_texture = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -2702,9 +2702,9 @@ f3d_mat.draw_layer.oot = 'Opaque' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -sm64_shaded_texture_cutout = ''' +sm64_shaded_texture_cutout = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -2819,9 +2819,9 @@ f3d_mat.draw_layer.oot = 'Opaque' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -sm64_shaded_texture_transparent = ''' +sm64_shaded_texture_transparent = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -2936,9 +2936,9 @@ f3d_mat.draw_layer.oot = 'Transparent' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -sm64_unlit_texture = ''' +sm64_unlit_texture = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -3053,9 +3053,9 @@ f3d_mat.draw_layer.oot = 'Opaque' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -sm64_unlit_texture_cutout = ''' +sm64_unlit_texture_cutout = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -3170,9 +3170,9 @@ f3d_mat.draw_layer.oot = 'Opaque' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -sm64_vertex_colored_texture = ''' +sm64_vertex_colored_texture = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -3287,9 +3287,9 @@ f3d_mat.draw_layer.oot = 'Opaque' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -sm64_vertex_colored_texture_transparent = ''' +sm64_vertex_colored_texture_transparent = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -3404,9 +3404,9 @@ f3d_mat.draw_layer.oot = 'Transparent' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -oot_shaded_multitexture_lerp_transparent_vertex_alpha = ''' +oot_shaded_multitexture_lerp_transparent_vertex_alpha = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -3523,9 +3523,9 @@ f3d_mat.draw_layer.oot = 'Transparent' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" -oot_shaded_texture_transparent_vertex_alpha = ''' +oot_shaded_texture_transparent_vertex_alpha = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -3642,43 +3642,42 @@ f3d_mat.draw_layer.oot = 'Transparent' bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update -''' +""" material_presets = { - "oot" : { - "oot_shaded_environment_mapped" : oot_shaded_environment_mapped, - "oot_shaded_environment_mapped_transparent" : oot_shaded_environment_mapped_transparent, - "oot_shaded_multitexture_lerp" : oot_shaded_multitexture_lerp, - "oot_shaded_multitexture_lerp_transparent" : oot_shaded_multitexture_lerp_transparent, - "oot_shaded_multitexture_lerp_transparent_vertex_alpha" : oot_shaded_multitexture_lerp_transparent_vertex_alpha, - "oot_shaded_solid" : oot_shaded_solid, - "oot_shaded_solid_transparent" : oot_shaded_solid_transparent, - "oot_shaded_texture" : oot_shaded_texture, - "oot_shaded_texture_cutout" : oot_shaded_texture_cutout, - "oot_shaded_texture_transparent" : oot_shaded_texture_transparent, - "oot_shaded_texture_transparent_vertex_alpha" : oot_shaded_texture_transparent_vertex_alpha, - "oot_unlit_texture" : oot_unlit_texture, - "oot_unlit_texture_cutout" : oot_unlit_texture_cutout, - "oot_unlit_texture_transparent" : oot_unlit_texture_transparent, - "oot_vertex_colored_texture" : oot_vertex_colored_texture, - "oot_vertex_colored_texture_cutout" : oot_vertex_colored_texture_cutout, - "oot_vertex_colored_texture_transparent" : oot_vertex_colored_texture_transparent, - - }, - "sm64" : { - "sm64_decal" : sm64_decal, - "sm64_environment_map" : sm64_environment_map, - "sm64_fog_shaded_texture" : sm64_fog_shaded_texture, - "sm64_fog_shaded_texture_cutout" : sm64_fog_shaded_texture_cutout, - "sm64_fog_shaded_texture_transparent" : sm64_fog_shaded_texture_transparent, - "sm64_shaded_noise" : sm64_shaded_noise, - "sm64_shaded_solid" : sm64_shaded_solid, - "sm64_shaded_texture" : sm64_shaded_texture, - "sm64_shaded_texture_cutout" : sm64_shaded_texture_cutout, - "sm64_shaded_texture_transparent" : sm64_shaded_texture_transparent, - "sm64_unlit_texture" : sm64_unlit_texture, - "sm64_unlit_texture_cutout" : sm64_unlit_texture_cutout, - "sm64_vertex_colored_texture" : sm64_vertex_colored_texture, - "sm64_vertex_colored_texture_transparent" : sm64_vertex_colored_texture_transparent, - }, + "oot": { + "oot_shaded_environment_mapped": oot_shaded_environment_mapped, + "oot_shaded_environment_mapped_transparent": oot_shaded_environment_mapped_transparent, + "oot_shaded_multitexture_lerp": oot_shaded_multitexture_lerp, + "oot_shaded_multitexture_lerp_transparent": oot_shaded_multitexture_lerp_transparent, + "oot_shaded_multitexture_lerp_transparent_vertex_alpha": oot_shaded_multitexture_lerp_transparent_vertex_alpha, + "oot_shaded_solid": oot_shaded_solid, + "oot_shaded_solid_transparent": oot_shaded_solid_transparent, + "oot_shaded_texture": oot_shaded_texture, + "oot_shaded_texture_cutout": oot_shaded_texture_cutout, + "oot_shaded_texture_transparent": oot_shaded_texture_transparent, + "oot_shaded_texture_transparent_vertex_alpha": oot_shaded_texture_transparent_vertex_alpha, + "oot_unlit_texture": oot_unlit_texture, + "oot_unlit_texture_cutout": oot_unlit_texture_cutout, + "oot_unlit_texture_transparent": oot_unlit_texture_transparent, + "oot_vertex_colored_texture": oot_vertex_colored_texture, + "oot_vertex_colored_texture_cutout": oot_vertex_colored_texture_cutout, + "oot_vertex_colored_texture_transparent": oot_vertex_colored_texture_transparent, + }, + "sm64": { + "sm64_decal": sm64_decal, + "sm64_environment_map": sm64_environment_map, + "sm64_fog_shaded_texture": sm64_fog_shaded_texture, + "sm64_fog_shaded_texture_cutout": sm64_fog_shaded_texture_cutout, + "sm64_fog_shaded_texture_transparent": sm64_fog_shaded_texture_transparent, + "sm64_shaded_noise": sm64_shaded_noise, + "sm64_shaded_solid": sm64_shaded_solid, + "sm64_shaded_texture": sm64_shaded_texture, + "sm64_shaded_texture_cutout": sm64_shaded_texture_cutout, + "sm64_shaded_texture_transparent": sm64_shaded_texture_transparent, + "sm64_unlit_texture": sm64_unlit_texture, + "sm64_unlit_texture_cutout": sm64_unlit_texture_cutout, + "sm64_vertex_colored_texture": sm64_vertex_colored_texture, + "sm64_vertex_colored_texture_transparent": sm64_vertex_colored_texture_transparent, + }, } diff --git a/fast64_internal/f3d/f3d_material_settings.py b/fast64_internal/f3d/f3d_material_settings.py index 7cf21bdee..b161b96ef 100644 --- a/fast64_internal/f3d/f3d_material_settings.py +++ b/fast64_internal/f3d/f3d_material_settings.py @@ -1,406 +1,428 @@ from .f3d_constants import * F3DOutputCopyList = { - 'prim_color' : "Primitive Color", - 'env_color' : "Environment Color", - 'chroma_key_center' : "Chroma Key Center", - 'chroma_key_scale' : "Chroma Key Scale", - 'lod_fraction' : "LOD Fraction", - 'prim_lod_fraction' : "Primitive LOD Fraction", - 'k4' : "YUV Convert K4", - 'k5' : "YUV Convert K5"} + "prim_color": "Primitive Color", + "env_color": "Environment Color", + "chroma_key_center": "Chroma Key Center", + "chroma_key_scale": "Chroma Key Scale", + "lod_fraction": "LOD Fraction", + "prim_lod_fraction": "Primitive LOD Fraction", + "k4": "YUV Convert K4", + "k5": "YUV Convert K5", +} + class F3DMaterialSettings: + def __eq__(self, other): + for attr in dir(self): + if not hasattr(other, attr) or getattr(self, attr) != getattr(other, attr): + return False + return True + + def __ne__(self, other): + return not self.__eq__(other) + + def __init__(self): + self.color_combiner = tuple(S_SHADED_TEX + S_SHADED_TEX) + self.set_texture0 = True + self.set_texture1 = True + self.set_prim = True + self.set_lights = True + self.set_env = True + self.set_blend = False + self.set_key = True + self.set_k0_5 = True + self.set_combiner = True + self.set_rendermode = False + self.scale_autoprop = True + + self.clip_ratio = 1 + + # geometry mode + self.g_zbuffer = True + self.g_shade = True + self.g_cull_front = False + self.g_cull_back = True + self.g_fog = False + self.set_fog = False + self.g_lighting = True + self.g_tex_gen = False + self.g_tex_gen_linear = False + self.g_shade_smooth = True + # f3dlx2 only + self.g_clipping = False + + # upper half mode + self.g_mdsft_alpha_dither = "G_AD_NOISE" + self.g_mdsft_rgb_dither = "G_CD_MAGICSQ" + self.g_mdsft_combkey = "G_CK_NONE" + self.g_mdsft_textconv = "G_TC_FILT" + self.g_mdsft_text_filt = "G_TF_BILERP" + self.g_mdsft_textlut = "G_TT_NONE" + self.g_mdsft_textlod = "G_TL_TILE" + self.g_mdsft_textdetail = "G_TD_CLAMP" + self.g_mdsft_textpersp = "G_TP_PERSP" + self.g_mdsft_cycletype = "G_CYC_1CYCLE" + # v1 only + self.g_mdsft_color_dither = "G_CD_ENABLE" + self.g_mdsft_pipeline = "G_PM_1PRIMITIVE" + + # lower half mode + self.g_mdsft_alpha_compare = "G_AC_NONE" + self.g_mdsft_zsrcsel = "G_ZS_PIXEL" + + # cycle independent + self.aa_en = False + self.z_cmp = False + self.z_upd = False + self.im_rd = False + self.clr_on_cvg = False + self.aa_en = False + self.cvg_dst = "CVG_DST_CLAMP" + self.zmode = "ZMODE_OPA" + self.cvg_x_alpha = False + self.alpha_cvg_sel = False + self.force_bl = False + + # cycle dependent - (P * A + M - B) / (A + B) + self.rendermode_advanced_enabled = False + self.rendermode_preset_cycle_1 = "G_RM_AA_ZB_OPA_SURF" + self.rendermode_preset_cycle_2 = "G_RM_AA_ZB_OPA_SURF2" + self.blend_p1 = "G_BL_CLR_IN" + self.blend_p2 = "G_BL_CLR_IN" + self.blend_m1 = "G_BL_CLR_IN" + self.blend_m2 = "G_BL_CLR_IN" + self.blend_a1 = "G_BL_A_IN" + self.blend_a2 = "G_BL_A_IN" + self.blend_b1 = "G_BL_1MA" + self.blend_b2 = "G_BL_1MA" + + self.prim_color = [1, 1, 1, 1] + self.env_color = [1, 1, 1, 1] + self.chroma_key_center = [1, 1, 1, 1] + self.chroma_key_scale = [1, 1, 1, 1] + self.lod_fraction = 1 + self.prim_lod_fraction = 1 + self.k4 = 1 + self.k5 = 1 + + self.tex0Prop = TexturePropertySettings() + self.tex1Prop = TexturePropertySettings() + + self.use_global_fog = True + self.fog_color = None # [0,0,0,1] + self.fog_position = None # [970,1000] + + self.blend_method = "HASHED" + + def loadFromMaterial(self, material, includeValues): + if not material.is_f3d: + print(material.name + " is not an f3d material.") + return + + self.color_combiner = ( + material.combiner1.A, + material.combiner1.B, + material.combiner1.C, + material.combiner1.D, + material.combiner1.A_alpha, + material.combiner1.B_alpha, + material.combiner1.C_alpha, + material.combiner1.D_alpha, + material.combiner2.A, + material.combiner2.B, + material.combiner2.C, + material.combiner2.D, + material.combiner2.A_alpha, + material.combiner2.B_alpha, + material.combiner2.C_alpha, + material.combiner2.D_alpha, + ) + self.set_prim = material.set_prim + self.set_lights = material.set_lights + self.set_env = material.set_env + self.set_blend = material.set_blend + self.set_key = material.set_key + self.set_k0_5 = material.set_k0_5 + self.set_combiner = material.set_combiner + self.set_rendermode = material.rdp_settings.set_rendermode + self.scale_autoprop = material.scale_autoprop + + self.clip_ratio = material.rdp_settings.clip_ratio + + # geometry mode + self.g_zbuffer = material.rdp_settings.g_zbuffer + self.g_shade = material.rdp_settings.g_shade + self.g_cull_front = material.rdp_settings.g_cull_front + self.g_cull_back = material.rdp_settings.g_cull_back + self.g_fog = material.rdp_settings.g_fog + self.set_fog = material.set_fog + self.g_lighting = material.rdp_settings.g_lighting + self.g_tex_gen = material.rdp_settings.g_tex_gen + self.g_tex_gen_linear = material.rdp_settings.g_tex_gen_linear + self.g_shade_smooth = material.rdp_settings.g_shade_smooth + # f3dlx2 only + self.g_clipping = material.rdp_settings.g_clipping + + # upper half mode + self.g_mdsft_alpha_dither = material.rdp_settings.g_mdsft_alpha_dither + self.g_mdsft_rgb_dither = material.rdp_settings.g_mdsft_rgb_dither + self.g_mdsft_combkey = material.rdp_settings.g_mdsft_combkey + self.g_mdsft_textconv = material.rdp_settings.g_mdsft_textconv + self.g_mdsft_text_filt = material.rdp_settings.g_mdsft_text_filt + self.g_mdsft_textlut = material.rdp_settings.g_mdsft_textlut + self.g_mdsft_textlod = material.rdp_settings.g_mdsft_textlod + self.g_mdsft_textdetail = material.rdp_settings.g_mdsft_textdetail + self.g_mdsft_textpersp = material.rdp_settings.g_mdsft_textpersp + self.g_mdsft_cycletype = material.rdp_settings.g_mdsft_cycletype + # v1 only + self.g_mdsft_color_dither = material.rdp_settings.g_mdsft_color_dither + self.g_mdsft_pipeline = material.rdp_settings.g_mdsft_pipeline + + # lower half mode + self.g_mdsft_alpha_compare = material.rdp_settings.g_mdsft_alpha_compare + self.g_mdsft_zsrcsel = material.rdp_settings.g_mdsft_zsrcsel + + # cycle independent + self.aa_en = material.rdp_settings.aa_en + self.z_cmp = material.rdp_settings.z_cmp + self.z_upd = material.rdp_settings.z_upd + self.im_rd = material.rdp_settings.im_rd + self.clr_on_cvg = material.rdp_settings.clr_on_cvg + self.aa_en = material.rdp_settings.aa_en + self.cvg_dst = material.rdp_settings.cvg_dst + self.zmode = material.rdp_settings.zmode + self.cvg_x_alpha = material.rdp_settings.cvg_x_alpha + self.alpha_cvg_sel = material.rdp_settings.alpha_cvg_sel + self.force_bl = material.rdp_settings.force_bl + + # cycle dependent - (P * A + M - B) / (A + B) + self.rendermode_advanced_enabled = ( + material.rdp_settings.rendermode_advanced_enabled + ) + self.rendermode_preset_cycle_1 = material.rdp_settings.rendermode_preset_cycle_1 + self.rendermode_preset_cycle_2 = material.rdp_settings.rendermode_preset_cycle_2 + self.blend_p1 = material.rdp_settings.blend_p1 + self.blend_p2 = material.rdp_settings.blend_p2 + self.blend_m1 = material.rdp_settings.blend_m1 + self.blend_m2 = material.rdp_settings.blend_m2 + self.blend_a1 = material.rdp_settings.blend_a1 + self.blend_a2 = material.rdp_settings.blend_a2 + self.blend_b1 = material.rdp_settings.blend_b1 + self.blend_b2 = material.rdp_settings.blend_b2 + + self.blend_method = material.blend_method + + if includeValues: + nodes = material.node_tree.nodes + for name, item in F3DOutputCopyList.items(): + if material.mat_ver == 3 and item == "Primitive Color": + if "Primitive Color Output" in nodes: + setattr( + self, + "prim_color", + nodes["Primitive Color Output"].inputs[0].default_value, + ) + elif material.mat_ver == 3 and item == "Environment Color": + if "Environment Color Output" in nodes: + setattr( + self, + "env_color", + nodes["Environment Color Output"].inputs[0].default_value, + ) + else: + if item in nodes: + setattr(self, name, nodes[item].outputs[0].default_value) + + self.tex0Prop.load(material.tex0) + self.tex1Prop.load(material.tex1) + + self.use_global_fog = material.use_global_fog + self.fog_color = material.fog_color + self.fog_position = material.fog_position + self.default_light_color = material.default_light_color + self.ambient_light_color = material.ambient_light_color + + def applyToMaterial(self, material, includeValues, updateFunc, context): + if not material.is_f3d: + print(material.name + " is not an f3d material.") + return + + material.f3d_update_flag = True + material.combiner1.A = self.color_combiner[0] + material.combiner1.B = self.color_combiner[1] + material.combiner1.C = self.color_combiner[2] + material.combiner1.D = self.color_combiner[3] + material.combiner1.A_alpha = self.color_combiner[4] + material.combiner1.B_alpha = self.color_combiner[5] + material.combiner1.C_alpha = self.color_combiner[6] + material.combiner1.D_alpha = self.color_combiner[7] + material.combiner2.A = self.color_combiner[8] + material.combiner2.B = self.color_combiner[9] + material.combiner2.C = self.color_combiner[10] + material.combiner2.D = self.color_combiner[11] + material.combiner2.A_alpha = self.color_combiner[12] + material.combiner2.B_alpha = self.color_combiner[13] + material.combiner2.C_alpha = self.color_combiner[14] + material.combiner2.D_alpha = self.color_combiner[15] + + material.set_prim = self.set_prim + material.set_lights = self.set_lights + material.set_env = self.set_env + material.set_blend = self.set_blend + material.set_key = self.set_key + material.set_k0_5 = self.set_k0_5 + material.set_combiner = self.set_combiner + material.rdp_settings.set_rendermode = self.set_rendermode + material.scale_autoprop = self.scale_autoprop + + material.rdp_settings.clip_ratio = self.clip_ratio + + # geometry mode + material.rdp_settings.g_zbuffer = self.g_zbuffer + material.rdp_settings.g_shade = self.g_shade + material.rdp_settings.g_cull_front = self.g_cull_front + material.rdp_settings.g_cull_back = self.g_cull_back + material.rdp_settings.g_fog = self.g_fog + material.set_fog = self.set_fog + material.rdp_settings.g_lighting = self.g_lighting + material.rdp_settings.g_tex_gen = self.g_tex_gen + material.rdp_settings.g_tex_gen_linear = self.g_tex_gen_linear + material.rdp_settings.g_shade_smooth = self.g_shade_smooth + # f3dlx2 only + material.rdp_settings.g_clipping = self.g_clipping + + # upper half mode + material.rdp_settings.g_mdsft_alpha_dither = self.g_mdsft_alpha_dither + material.rdp_settings.g_mdsft_rgb_dither = self.g_mdsft_rgb_dither + material.rdp_settings.g_mdsft_combkey = self.g_mdsft_combkey + material.rdp_settings.g_mdsft_textconv = self.g_mdsft_textconv + material.rdp_settings.g_mdsft_text_filt = self.g_mdsft_text_filt + material.rdp_settings.g_mdsft_textlut = self.g_mdsft_textlut + material.rdp_settings.g_mdsft_textlod = self.g_mdsft_textlod + material.rdp_settings.g_mdsft_textdetail = self.g_mdsft_textdetail + material.rdp_settings.g_mdsft_textpersp = self.g_mdsft_textpersp + material.rdp_settings.g_mdsft_cycletype = self.g_mdsft_cycletype + # v1 only + material.rdp_settings.g_mdsft_color_dither = self.g_mdsft_color_dither + material.rdp_settings.g_mdsft_pipeline = self.g_mdsft_pipeline + + # lower half mode + material.rdp_settings.g_mdsft_alpha_compare = self.g_mdsft_alpha_compare + material.rdp_settings.g_mdsft_zsrcsel = self.g_mdsft_zsrcsel + + # cycle independent + if self.set_rendermode: + material.rdp_settings.rendermode_advanced_enabled = ( + self.rendermode_advanced_enabled + ) + material.rdp_settings.rendermode_preset_cycle_1 = ( + self.rendermode_preset_cycle_1 + ) + material.rdp_settings.rendermode_preset_cycle_2 = ( + self.rendermode_preset_cycle_2 + ) + material.rdp_settings.aa_en = self.aa_en + material.rdp_settings.z_cmp = self.z_cmp + material.rdp_settings.z_upd = self.z_upd + material.rdp_settings.im_rd = self.im_rd + material.rdp_settings.clr_on_cvg = self.clr_on_cvg + material.rdp_settings.aa_en = self.aa_en + material.rdp_settings.cvg_dst = self.cvg_dst + material.rdp_settings.zmode = self.zmode + material.rdp_settings.cvg_x_alpha = self.cvg_x_alpha + material.rdp_settings.alpha_cvg_sel = self.alpha_cvg_sel + material.rdp_settings.force_bl = self.force_bl + + # cycle dependent - (P * A + M - B) / (A + B) + material.rdp_settings.blend_p1 = self.blend_p1 + material.rdp_settings.blend_p2 = self.blend_p2 + material.rdp_settings.blend_m1 = self.blend_m1 + material.rdp_settings.blend_m2 = self.blend_m2 + material.rdp_settings.blend_a1 = self.blend_a1 + material.rdp_settings.blend_a2 = self.blend_a2 + material.rdp_settings.blend_b1 = self.blend_b1 + material.rdp_settings.blend_b2 = self.blend_b2 + + material.blend_method = self.blend_method + + if includeValues: + nodes = material.node_tree.nodes + for name, item in F3DOutputCopyList.items(): + if material.mat_ver == 3 and item == "Primitive Color": + nodes["Primitive Color Output"].inputs[0].default_value = getattr( + self, "prim_color" + ) + elif material.mat_ver == 3 and item == "Environment Color": + nodes["Environment Color Output"].inputs[0].default_value = getattr( + self, "env_color" + ) + else: + nodes[item].outputs[0].default_value = getattr(self, name) + + self.tex0Prop.apply(material.tex0) + self.tex1Prop.apply(material.tex1) + + material.use_global_fog = self.use_global_fog + material.fog_color = self.fog_color + material.fog_position = self.fog_position + material.default_light_color = self.default_light_color + material.ambient_light_color = self.ambient_light_color + + updateFunc(material, context) + material.f3d_update_flag = False - def __eq__(self, other): - for attr in dir(self): - if not hasattr(other, attr) or getattr(self, attr) != getattr(other, attr): - return False - return True - - def __ne__(self, other): - return not self.__eq__(other) - - def __init__(self): - self.color_combiner = tuple(S_SHADED_TEX + S_SHADED_TEX) - self.set_texture0 = True - self.set_texture1 = True - self.set_prim = True - self.set_lights = True - self.set_env = True - self.set_blend = False - self.set_key = True - self.set_k0_5 = True - self.set_combiner = True - self.set_rendermode = False - self.scale_autoprop = True - - self.clip_ratio = 1 - - # geometry mode - self.g_zbuffer = True - self.g_shade = True - self.g_cull_front = False - self.g_cull_back = True - self.g_fog = False - self.set_fog = False - self.g_lighting = True - self.g_tex_gen = False - self.g_tex_gen_linear = False - self.g_shade_smooth = True - # f3dlx2 only - self.g_clipping = False - - # upper half mode - self.g_mdsft_alpha_dither = 'G_AD_NOISE' - self.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' - self.g_mdsft_combkey = 'G_CK_NONE' - self.g_mdsft_textconv = 'G_TC_FILT' - self.g_mdsft_text_filt = 'G_TF_BILERP' - self.g_mdsft_textlut = 'G_TT_NONE' - self.g_mdsft_textlod = 'G_TL_TILE' - self.g_mdsft_textdetail = 'G_TD_CLAMP' - self.g_mdsft_textpersp = 'G_TP_PERSP' - self.g_mdsft_cycletype = 'G_CYC_1CYCLE' - # v1 only - self.g_mdsft_color_dither = 'G_CD_ENABLE' - self.g_mdsft_pipeline = 'G_PM_1PRIMITIVE' - - # lower half mode - self.g_mdsft_alpha_compare = 'G_AC_NONE' - self.g_mdsft_zsrcsel = 'G_ZS_PIXEL' - - # cycle independent - self.aa_en = False - self.z_cmp = False - self.z_upd = False - self.im_rd = False - self.clr_on_cvg = False - self.aa_en = False - self.cvg_dst = 'CVG_DST_CLAMP' - self.zmode = 'ZMODE_OPA' - self.cvg_x_alpha = False - self.alpha_cvg_sel = False - self.force_bl = False - - # cycle dependent - (P * A + M - B) / (A + B) - self.rendermode_advanced_enabled = False - self.rendermode_preset_cycle_1 = 'G_RM_AA_ZB_OPA_SURF' - self.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_OPA_SURF2' - self.blend_p1 = 'G_BL_CLR_IN' - self.blend_p2 = 'G_BL_CLR_IN' - self.blend_m1 = 'G_BL_CLR_IN' - self.blend_m2 = 'G_BL_CLR_IN' - self.blend_a1 = 'G_BL_A_IN' - self.blend_a2 = 'G_BL_A_IN' - self.blend_b1 = 'G_BL_1MA' - self.blend_b2 = 'G_BL_1MA' - - self.prim_color = [1,1,1,1] - self.env_color = [1,1,1,1] - self.chroma_key_center = [1,1,1,1] - self.chroma_key_scale = [1,1,1,1] - self.lod_fraction = 1 - self.prim_lod_fraction = 1 - self.k4 = 1 - self.k5 = 1 - - self.tex0Prop = TexturePropertySettings() - self.tex1Prop = TexturePropertySettings() - - self.use_global_fog = True - self.fog_color = None #[0,0,0,1] - self.fog_position = None #[970,1000] - - self.blend_method = "HASHED" - - def loadFromMaterial(self, material, includeValues): - if not material.is_f3d: - print(material.name + ' is not an f3d material.') - return - - self.color_combiner = ( - material.combiner1.A, - material.combiner1.B, - material.combiner1.C, - material.combiner1.D, - material.combiner1.A_alpha, - material.combiner1.B_alpha, - material.combiner1.C_alpha, - material.combiner1.D_alpha, - material.combiner2.A, - material.combiner2.B, - material.combiner2.C, - material.combiner2.D, - material.combiner2.A_alpha, - material.combiner2.B_alpha, - material.combiner2.C_alpha, - material.combiner2.D_alpha, - ) - self.set_prim = material.set_prim - self.set_lights = material.set_lights - self.set_env = material.set_env - self.set_blend = material.set_blend - self.set_key = material.set_key - self.set_k0_5 = material.set_k0_5 - self.set_combiner = material.set_combiner - self.set_rendermode = material.rdp_settings.set_rendermode - self.scale_autoprop = material.scale_autoprop - - self.clip_ratio = material.rdp_settings.clip_ratio - - # geometry mode - self.g_zbuffer = material.rdp_settings.g_zbuffer - self.g_shade = material.rdp_settings.g_shade - self.g_cull_front = material.rdp_settings.g_cull_front - self.g_cull_back = material.rdp_settings.g_cull_back - self.g_fog = material.rdp_settings.g_fog - self.set_fog = material.set_fog - self.g_lighting = material.rdp_settings.g_lighting - self.g_tex_gen = material.rdp_settings.g_tex_gen - self.g_tex_gen_linear = material.rdp_settings.g_tex_gen_linear - self.g_shade_smooth = material.rdp_settings.g_shade_smooth - # f3dlx2 only - self.g_clipping = material.rdp_settings.g_clipping - - # upper half mode - self.g_mdsft_alpha_dither = material.rdp_settings.g_mdsft_alpha_dither - self.g_mdsft_rgb_dither = material.rdp_settings.g_mdsft_rgb_dither - self.g_mdsft_combkey = material.rdp_settings.g_mdsft_combkey - self.g_mdsft_textconv = material.rdp_settings.g_mdsft_textconv - self.g_mdsft_text_filt = material.rdp_settings.g_mdsft_text_filt - self.g_mdsft_textlut = material.rdp_settings.g_mdsft_textlut - self.g_mdsft_textlod = material.rdp_settings.g_mdsft_textlod - self.g_mdsft_textdetail = material.rdp_settings.g_mdsft_textdetail - self.g_mdsft_textpersp = material.rdp_settings.g_mdsft_textpersp - self.g_mdsft_cycletype = material.rdp_settings.g_mdsft_cycletype - # v1 only - self.g_mdsft_color_dither = material.rdp_settings.g_mdsft_color_dither - self.g_mdsft_pipeline = material.rdp_settings.g_mdsft_pipeline - - # lower half mode - self.g_mdsft_alpha_compare = material.rdp_settings.g_mdsft_alpha_compare - self.g_mdsft_zsrcsel = material.rdp_settings.g_mdsft_zsrcsel - - # cycle independent - self.aa_en = material.rdp_settings.aa_en - self.z_cmp = material.rdp_settings.z_cmp - self.z_upd = material.rdp_settings.z_upd - self.im_rd = material.rdp_settings.im_rd - self.clr_on_cvg = material.rdp_settings.clr_on_cvg - self.aa_en = material.rdp_settings.aa_en - self.cvg_dst = material.rdp_settings.cvg_dst - self.zmode = material.rdp_settings.zmode - self.cvg_x_alpha = material.rdp_settings.cvg_x_alpha - self.alpha_cvg_sel = material.rdp_settings.alpha_cvg_sel - self.force_bl = material.rdp_settings.force_bl - - # cycle dependent - (P * A + M - B) / (A + B) - self.rendermode_advanced_enabled = material.rdp_settings.rendermode_advanced_enabled - self.rendermode_preset_cycle_1 = material.rdp_settings.rendermode_preset_cycle_1 - self.rendermode_preset_cycle_2 = material.rdp_settings.rendermode_preset_cycle_2 - self.blend_p1 = material.rdp_settings.blend_p1 - self.blend_p2 = material.rdp_settings.blend_p2 - self.blend_m1 = material.rdp_settings.blend_m1 - self.blend_m2 = material.rdp_settings.blend_m2 - self.blend_a1 = material.rdp_settings.blend_a1 - self.blend_a2 = material.rdp_settings.blend_a2 - self.blend_b1 = material.rdp_settings.blend_b1 - self.blend_b2 = material.rdp_settings.blend_b2 - - self.blend_method = material.blend_method - - if includeValues: - nodes = material.node_tree.nodes - for name, item in F3DOutputCopyList.items(): - if material.mat_ver == 3 and item == 'Primitive Color': - if 'Primitive Color Output' in nodes: - setattr(self, 'prim_color', nodes['Primitive Color Output'].inputs[0].default_value) - elif material.mat_ver == 3 and item == 'Environment Color': - if 'Environment Color Output' in nodes: - setattr(self, 'env_color', nodes['Environment Color Output'].inputs[0].default_value) - else: - if item in nodes: - setattr(self, name, nodes[item].outputs[0].default_value) - - self.tex0Prop.load(material.tex0) - self.tex1Prop.load(material.tex1) - - self.use_global_fog = material.use_global_fog - self.fog_color = material.fog_color - self.fog_position = material.fog_position - self.default_light_color = material.default_light_color - self.ambient_light_color = material.ambient_light_color - - def applyToMaterial(self, material, includeValues, updateFunc, context): - if not material.is_f3d: - print(material.name + ' is not an f3d material.') - return - - material.f3d_update_flag = True - material.combiner1.A = self.color_combiner[0] - material.combiner1.B = self.color_combiner[1] - material.combiner1.C = self.color_combiner[2] - material.combiner1.D = self.color_combiner[3] - material.combiner1.A_alpha = self.color_combiner[4] - material.combiner1.B_alpha = self.color_combiner[5] - material.combiner1.C_alpha = self.color_combiner[6] - material.combiner1.D_alpha = self.color_combiner[7] - material.combiner2.A = self.color_combiner[8] - material.combiner2.B = self.color_combiner[9] - material.combiner2.C = self.color_combiner[10] - material.combiner2.D = self.color_combiner[11] - material.combiner2.A_alpha = self.color_combiner[12] - material.combiner2.B_alpha = self.color_combiner[13] - material.combiner2.C_alpha = self.color_combiner[14] - material.combiner2.D_alpha = self.color_combiner[15] - - material.set_prim = self.set_prim - material.set_lights = self.set_lights - material.set_env = self.set_env - material.set_blend = self.set_blend - material.set_key = self.set_key - material.set_k0_5 = self.set_k0_5 - material.set_combiner = self.set_combiner - material.rdp_settings.set_rendermode = self.set_rendermode - material.scale_autoprop = self.scale_autoprop - - material.rdp_settings.clip_ratio = self.clip_ratio - - # geometry mode - material.rdp_settings.g_zbuffer = self.g_zbuffer - material.rdp_settings.g_shade = self.g_shade - material.rdp_settings.g_cull_front = self.g_cull_front - material.rdp_settings.g_cull_back = self.g_cull_back - material.rdp_settings.g_fog = self.g_fog - material.set_fog = self.set_fog - material.rdp_settings.g_lighting = self.g_lighting - material.rdp_settings.g_tex_gen = self.g_tex_gen - material.rdp_settings.g_tex_gen_linear = self.g_tex_gen_linear - material.rdp_settings.g_shade_smooth = self.g_shade_smooth - # f3dlx2 only - material.rdp_settings.g_clipping = self.g_clipping - - # upper half mode - material.rdp_settings.g_mdsft_alpha_dither = self.g_mdsft_alpha_dither - material.rdp_settings.g_mdsft_rgb_dither = self.g_mdsft_rgb_dither - material.rdp_settings.g_mdsft_combkey = self.g_mdsft_combkey - material.rdp_settings.g_mdsft_textconv = self.g_mdsft_textconv - material.rdp_settings.g_mdsft_text_filt = self.g_mdsft_text_filt - material.rdp_settings.g_mdsft_textlut = self.g_mdsft_textlut - material.rdp_settings.g_mdsft_textlod = self.g_mdsft_textlod - material.rdp_settings.g_mdsft_textdetail = self.g_mdsft_textdetail - material.rdp_settings.g_mdsft_textpersp = self.g_mdsft_textpersp - material.rdp_settings.g_mdsft_cycletype = self.g_mdsft_cycletype - # v1 only - material.rdp_settings.g_mdsft_color_dither = self.g_mdsft_color_dither - material.rdp_settings.g_mdsft_pipeline = self.g_mdsft_pipeline - - # lower half mode - material.rdp_settings.g_mdsft_alpha_compare = self.g_mdsft_alpha_compare - material.rdp_settings.g_mdsft_zsrcsel = self.g_mdsft_zsrcsel - - # cycle independent - if self.set_rendermode: - material.rdp_settings.rendermode_advanced_enabled = self.rendermode_advanced_enabled - material.rdp_settings.rendermode_preset_cycle_1 = self.rendermode_preset_cycle_1 - material.rdp_settings.rendermode_preset_cycle_2 = self.rendermode_preset_cycle_2 - material.rdp_settings.aa_en = self.aa_en - material.rdp_settings.z_cmp = self.z_cmp - material.rdp_settings.z_upd = self.z_upd - material.rdp_settings.im_rd = self.im_rd - material.rdp_settings.clr_on_cvg = self.clr_on_cvg - material.rdp_settings.aa_en = self.aa_en - material.rdp_settings.cvg_dst = self.cvg_dst - material.rdp_settings.zmode = self.zmode - material.rdp_settings.cvg_x_alpha = self.cvg_x_alpha - material.rdp_settings.alpha_cvg_sel = self.alpha_cvg_sel - material.rdp_settings.force_bl = self.force_bl - - # cycle dependent - (P * A + M - B) / (A + B) - material.rdp_settings.blend_p1 = self.blend_p1 - material.rdp_settings.blend_p2 = self.blend_p2 - material.rdp_settings.blend_m1 = self.blend_m1 - material.rdp_settings.blend_m2 = self.blend_m2 - material.rdp_settings.blend_a1 = self.blend_a1 - material.rdp_settings.blend_a2 = self.blend_a2 - material.rdp_settings.blend_b1 = self.blend_b1 - material.rdp_settings.blend_b2 = self.blend_b2 - - material.blend_method = self.blend_method - - if includeValues: - nodes = material.node_tree.nodes - for name, item in F3DOutputCopyList.items(): - if material.mat_ver == 3 and item == 'Primitive Color': - nodes['Primitive Color Output'].inputs[0].default_value = getattr(self, 'prim_color') - elif material.mat_ver == 3 and item == 'Environment Color': - nodes['Environment Color Output'].inputs[0].default_value = getattr(self, 'env_color') - else: - nodes[item].outputs[0].default_value = getattr(self, name) - - - self.tex0Prop.apply(material.tex0) - self.tex1Prop.apply(material.tex1) - - material.use_global_fog = self.use_global_fog - material.fog_color = self.fog_color - material.fog_position = self.fog_position - material.default_light_color = self.default_light_color - material.ambient_light_color = self.ambient_light_color - - updateFunc(material, context) - material.f3d_update_flag = False class TexturePropertyFieldSettings: - def __init__(self): - self.clamp = False - self.mirror = False - self.low = 0 - self.high = 32 - self.mask = 5 - self.shift = 0 - - def load(self, texField): - self.clamp = texField.clamp - self.mirror = texField.mirror - self.low = texField.low - self.high = texField.high - self.mask = texField.mask - self.shift = texField.shift - - def apply(self, texField): - texField.clamp = self.clamp - texField.mirror = self.mirror - texField.low = self.low - texField.high = self.high - texField.mask = self.mask - texField.shift = self.shift + def __init__(self): + self.clamp = False + self.mirror = False + self.low = 0 + self.high = 32 + self.mask = 5 + self.shift = 0 + + def load(self, texField): + self.clamp = texField.clamp + self.mirror = texField.mirror + self.low = texField.low + self.high = texField.high + self.mask = texField.mask + self.shift = texField.shift + + def apply(self, texField): + texField.clamp = self.clamp + texField.mirror = self.mirror + texField.low = self.low + texField.high = self.high + texField.mask = self.mask + texField.shift = self.shift + class TexturePropertySettings: - def __init__(self): - self.tex = None - self.tex_format = 'RGBA16' - self.ci_format = 'RGBA16' - self.S = TexturePropertyFieldSettings() - self.T = TexturePropertyFieldSettings() - self.autoprop = True - self.tex_set = False - - def load(self, texProp): - self.tex = texProp.tex - self.tex_format = texProp.tex_format - self.ci_format = texProp.ci_format - self.S.load(texProp.S) - self.T.load(texProp.T) - self.autoprop = texProp.autoprop - self.tex_set = texProp.tex_set - - def apply(self, texProp): - texProp.tex = self.tex - texProp.tex_format = self.tex_format - texProp.ci_format = self.ci_format - self.S.apply(texProp.S) - self.T.apply(texProp.T) - texProp.autoprop = self.autoprop - texProp.tex_set = self.tex_set \ No newline at end of file + def __init__(self): + self.tex = None + self.tex_format = "RGBA16" + self.ci_format = "RGBA16" + self.S = TexturePropertyFieldSettings() + self.T = TexturePropertyFieldSettings() + self.autoprop = True + self.tex_set = False + + def load(self, texProp): + self.tex = texProp.tex + self.tex_format = texProp.tex_format + self.ci_format = texProp.ci_format + self.S.load(texProp.S) + self.T.load(texProp.T) + self.autoprop = texProp.autoprop + self.tex_set = texProp.tex_set + + def apply(self, texProp): + texProp.tex = self.tex + texProp.tex_format = self.tex_format + texProp.ci_format = self.ci_format + self.S.apply(texProp.S) + self.T.apply(texProp.T) + texProp.autoprop = self.autoprop + texProp.tex_set = self.tex_set diff --git a/fast64_internal/f3d/f3d_parser.py b/fast64_internal/f3d/f3d_parser.py index 9ef813a1c..e829df569 100644 --- a/fast64_internal/f3d/f3d_parser.py +++ b/fast64_internal/f3d/f3d_parser.py @@ -1,1570 +1,2023 @@ import bmesh, bpy, mathutils, pprint, re, math, traceback from bpy.utils import register_class, unregister_class from .f3d_gbi import * -from .f3d_material import createF3DMat, update_preset_manual, update_node_values_directly, all_combiner_uses, ootEnumDrawLayers +from .f3d_material import ( + createF3DMat, + update_preset_manual, + update_node_values_directly, + all_combiner_uses, + ootEnumDrawLayers, +) from .f3d_writer import BufferVertex from ..utility import * import ast, operator colorCombinationCommands = [ - 0x03, #load lighting data - 0xB6, #clear geometry params - 0xB7, #set geometry params - 0xBB, #set texture scaling factor - 0xF3, #set texture size - 0xF5, #set texture properties - 0xF7, #set fill color - 0xF8, #set fog color - 0xFB, #set env color - 0xFC, #set color combination - 0xFD #load texture + 0x03, # load lighting data + 0xB6, # clear geometry params + 0xB7, # set geometry params + 0xBB, # set texture scaling factor + 0xF3, # set texture size + 0xF5, # set texture properties + 0xF7, # set fill color + 0xF8, # set fog color + 0xFB, # set env color + 0xFC, # set color combination + 0xFD, # load texture ] -drawCommands = [ - 0x04, #load vertex data - 0xBF #draw triangle -] +drawCommands = [0x04, 0xBF] # load vertex data # draw triangle + def getAxisVector(enumValue): - sign = -1 if enumValue[0] == '-' else 1 - axis = enumValue[0] if sign == 1 else enumValue[1] - return ( - sign if axis == 'X' else 0, - sign if axis == 'Y' else 0, - sign if axis == 'Z' else 0 - ) + sign = -1 if enumValue[0] == "-" else 1 + axis = enumValue[0] if sign == 1 else enumValue[1] + return ( + sign if axis == "X" else 0, + sign if axis == "Y" else 0, + sign if axis == "Z" else 0, + ) + def getExportRotation(forwardAxisEnum, convertTransformMatrix): - if 'Z' in forwardAxisEnum: - print("Z axis reserved for verticals.") - return None - elif forwardAxisEnum == 'X': - rightAxisEnum = '-Y' - elif forwardAxisEnum == '-Y': - rightAxisEnum = '-X' - elif forwardAxisEnum == '-X': - rightAxisEnum = 'Y' - else: - rightAxisEnum = 'X' - - forwardAxis = getAxisVector(forwardAxisEnum) - rightAxis = getAxisVector(rightAxisEnum) - - upAxis = (0, 0, 1) - - # Z assumed to be up - columns = [rightAxis, forwardAxis, upAxis] - localToBlenderRotation = mathutils.Matrix([ - [col[0] for col in columns], - [col[1] for col in columns], - [col[2] for col in columns] - ]).to_quaternion() - - return convertTransformMatrix.to_quaternion() @ localToBlenderRotation - -def F3DtoBlenderObject(romfile, startAddress, scene, - newname, transformMatrix, - segmentData, shadeSmooth): - - mesh = bpy.data.meshes.new(newname + '-mesh') - obj = bpy.data.objects.new(newname, mesh) - scene.collection.objects.link(obj) - createBlankMaterial(obj) - - bMesh = bmesh.new() - bMesh.from_mesh(mesh) - - parseF3DBinary(romfile, startAddress, scene, bMesh, obj, \ - transformMatrix, newname, segmentData, \ - [None] * 16 * 16) - - #bmesh.ops.rotate(bMesh, cent = [0,0,0], - # matrix = blenderToSM64Rotation, - # verts = bMesh.verts) - bMesh.to_mesh(mesh) - bMesh.free() - mesh.update() - - if shadeSmooth: - bpy.ops.object.select_all(action = 'DESELECT') - obj.select_set(True) - bpy.ops.object.shade_smooth() - - return obj + if "Z" in forwardAxisEnum: + print("Z axis reserved for verticals.") + return None + elif forwardAxisEnum == "X": + rightAxisEnum = "-Y" + elif forwardAxisEnum == "-Y": + rightAxisEnum = "-X" + elif forwardAxisEnum == "-X": + rightAxisEnum = "Y" + else: + rightAxisEnum = "X" + + forwardAxis = getAxisVector(forwardAxisEnum) + rightAxis = getAxisVector(rightAxisEnum) + + upAxis = (0, 0, 1) + + # Z assumed to be up + columns = [rightAxis, forwardAxis, upAxis] + localToBlenderRotation = mathutils.Matrix( + [ + [col[0] for col in columns], + [col[1] for col in columns], + [col[2] for col in columns], + ] + ).to_quaternion() + + return convertTransformMatrix.to_quaternion() @ localToBlenderRotation + + +def F3DtoBlenderObject( + romfile, startAddress, scene, newname, transformMatrix, segmentData, shadeSmooth +): + + mesh = bpy.data.meshes.new(newname + "-mesh") + obj = bpy.data.objects.new(newname, mesh) + scene.collection.objects.link(obj) + createBlankMaterial(obj) + + bMesh = bmesh.new() + bMesh.from_mesh(mesh) + + parseF3DBinary( + romfile, + startAddress, + scene, + bMesh, + obj, + transformMatrix, + newname, + segmentData, + [None] * 16 * 16, + ) + + # bmesh.ops.rotate(bMesh, cent = [0,0,0], + # matrix = blenderToSM64Rotation, + # verts = bMesh.verts) + bMesh.to_mesh(mesh) + bMesh.free() + mesh.update() + + if shadeSmooth: + bpy.ops.object.select_all(action="DESELECT") + obj.select_set(True) + bpy.ops.object.shade_smooth() + + return obj def cmdToPositiveInt(cmd): - return cmd if cmd >= 0 else 256 + cmd - -def parseF3DBinary(romfile, startAddress, scene, - bMesh, obj, transformMatrix, groupName, segmentData, vertexBuffer): - f3d = F3D('F3D', False) - currentAddress = startAddress - romfile.seek(currentAddress) - command = romfile.read(8) - - faceSeq = bMesh.faces - vertSeq = bMesh.verts - uv_layer = bMesh.loops.layers.uv.verify() - deform_layer = bMesh.verts.layers.deform.verify() - vertexGroup = getOrMakeVertexGroup(obj, groupName) - groupIndex = vertexGroup.index - - textureSize = [32, 32] - - currentTextureAddr = -1 - jumps = [startAddress] - - # Used for remove_double op at end - vertList = [] - - while len(jumps) > 0: - # FD, FC, B7 (tex, shader, geomode) - #print(format(command[0], '#04x') + ' at ' + hex(currentAddress)) - if command[0] == cmdToPositiveInt(f3d.G_TRI1): - try: - newVerts = interpretDrawTriangle(command, vertexBuffer, - faceSeq, vertSeq, uv_layer, deform_layer, groupIndex) - vertList.extend(newVerts) - except TypeError: - print("Ignoring triangle from unloaded vertices.") - - elif command[0] == cmdToPositiveInt(f3d.G_VTX): - interpretLoadVertices(romfile, vertexBuffer, transformMatrix, - command, segmentData) - - # Note: size can usually be indicated in LoadTile / LoadBlock. - elif command[0] == cmdToPositiveInt(f3d.G_SETTILESIZE): - textureSize = interpretSetTileSize( - int.from_bytes(command[4:8], 'big')) - - elif command[0] == cmdToPositiveInt(f3d.G_DL): - if command[1] == 0: - jumps.append(currentAddress) - currentAddress = decodeSegmentedAddr(command[4:8], - segmentData = segmentData) - romfile.seek(currentAddress) - command = romfile.read(8) - continue - - elif command[0] == cmdToPositiveInt(f3d.G_ENDDL): - currentAddress = jumps.pop() - - elif command[0] == cmdToPositiveInt(f3d.G_SETGEOMETRYMODE): - pass - elif command[0] == cmdToPositiveInt(f3d.G_SETCOMBINE): - pass - - elif command[0] == cmdToPositiveInt(f3d.G_SETTIMG): - currentTextureAddr =\ - interpretSetTImage(command, segmentData) - - elif command[0] == cmdToPositiveInt(f3d.G_LOADBLOCK): - # for now only 16bit RGBA is supported. - interpretLoadBlock(command, romfile, currentTextureAddr, textureSize, - 'RGBA', 16) - - elif command[0] == cmdToPositiveInt(f3d.G_SETTILE): - interpretSetTile(int.from_bytes(command[4:8], 'big'), None) - - else: - pass - #print(format(command[0], '#04x') + ' at ' + hex(currentAddress)) - - currentAddress += 8 - romfile.seek(currentAddress) - command = romfile.read(8) - - bmesh.ops.remove_doubles(bMesh, verts = vertList, dist = 0.0001) - return vertexBuffer + return cmd if cmd >= 0 else 256 + cmd + + +def parseF3DBinary( + romfile, + startAddress, + scene, + bMesh, + obj, + transformMatrix, + groupName, + segmentData, + vertexBuffer, +): + f3d = F3D("F3D", False) + currentAddress = startAddress + romfile.seek(currentAddress) + command = romfile.read(8) + + faceSeq = bMesh.faces + vertSeq = bMesh.verts + uv_layer = bMesh.loops.layers.uv.verify() + deform_layer = bMesh.verts.layers.deform.verify() + vertexGroup = getOrMakeVertexGroup(obj, groupName) + groupIndex = vertexGroup.index + + textureSize = [32, 32] + + currentTextureAddr = -1 + jumps = [startAddress] + + # Used for remove_double op at end + vertList = [] + + while len(jumps) > 0: + # FD, FC, B7 (tex, shader, geomode) + # print(format(command[0], '#04x') + ' at ' + hex(currentAddress)) + if command[0] == cmdToPositiveInt(f3d.G_TRI1): + try: + newVerts = interpretDrawTriangle( + command, + vertexBuffer, + faceSeq, + vertSeq, + uv_layer, + deform_layer, + groupIndex, + ) + vertList.extend(newVerts) + except TypeError: + print("Ignoring triangle from unloaded vertices.") + + elif command[0] == cmdToPositiveInt(f3d.G_VTX): + interpretLoadVertices( + romfile, vertexBuffer, transformMatrix, command, segmentData + ) + + # Note: size can usually be indicated in LoadTile / LoadBlock. + elif command[0] == cmdToPositiveInt(f3d.G_SETTILESIZE): + textureSize = interpretSetTileSize(int.from_bytes(command[4:8], "big")) + + elif command[0] == cmdToPositiveInt(f3d.G_DL): + if command[1] == 0: + jumps.append(currentAddress) + currentAddress = decodeSegmentedAddr(command[4:8], segmentData=segmentData) + romfile.seek(currentAddress) + command = romfile.read(8) + continue + + elif command[0] == cmdToPositiveInt(f3d.G_ENDDL): + currentAddress = jumps.pop() + + elif command[0] == cmdToPositiveInt(f3d.G_SETGEOMETRYMODE): + pass + elif command[0] == cmdToPositiveInt(f3d.G_SETCOMBINE): + pass + + elif command[0] == cmdToPositiveInt(f3d.G_SETTIMG): + currentTextureAddr = interpretSetTImage(command, segmentData) + + elif command[0] == cmdToPositiveInt(f3d.G_LOADBLOCK): + # for now only 16bit RGBA is supported. + interpretLoadBlock( + command, romfile, currentTextureAddr, textureSize, "RGBA", 16 + ) + + elif command[0] == cmdToPositiveInt(f3d.G_SETTILE): + interpretSetTile(int.from_bytes(command[4:8], "big"), None) + + else: + pass + # print(format(command[0], '#04x') + ' at ' + hex(currentAddress)) + + currentAddress += 8 + romfile.seek(currentAddress) + command = romfile.read(8) + + bmesh.ops.remove_doubles(bMesh, verts=vertList, dist=0.0001) + return vertexBuffer + def getPosition(vertexBuffer, index): - xStart = index * 16 + 0 - yStart = index * 16 + 2 - zStart = index * 16 + 4 + xStart = index * 16 + 0 + yStart = index * 16 + 2 + zStart = index * 16 + 4 + + xBytes = vertexBuffer[xStart : xStart + 2] + yBytes = vertexBuffer[yStart : yStart + 2] + zBytes = vertexBuffer[zStart : zStart + 2] + + x = ( + int.from_bytes(xBytes, "big", signed=True) + / bpy.context.scene.blenderToSM64Scale + ) + y = ( + int.from_bytes(yBytes, "big", signed=True) + / bpy.context.scene.blenderToSM64Scale + ) + z = ( + int.from_bytes(zBytes, "big", signed=True) + / bpy.context.scene.blenderToSM64Scale + ) + + return (x, y, z) - xBytes = vertexBuffer[xStart : xStart + 2] - yBytes = vertexBuffer[yStart : yStart + 2] - zBytes = vertexBuffer[zStart : zStart + 2] - x = int.from_bytes(xBytes, 'big', signed=True) / bpy.context.scene.blenderToSM64Scale - y = int.from_bytes(yBytes, 'big', signed=True) / bpy.context.scene.blenderToSM64Scale - z = int.from_bytes(zBytes, 'big', signed=True) / bpy.context.scene.blenderToSM64Scale +def getNormalorColor(vertexBuffer, index, isNormal=True): + xByte = bytes([vertexBuffer[index * 16 + 12]]) + yByte = bytes([vertexBuffer[index * 16 + 13]]) + zByte = bytes([vertexBuffer[index * 16 + 14]]) + wByte = bytes([vertexBuffer[index * 16 + 15]]) - return (x, y, z) + if isNormal: + x = int.from_bytes(xByte, "big", signed=True) + y = int.from_bytes(yByte, "big", signed=True) + z = int.from_bytes(zByte, "big", signed=True) + return (x, y, z) -def getNormalorColor(vertexBuffer, index, isNormal = True): - xByte = bytes([vertexBuffer[index * 16 + 12]]) - yByte = bytes([vertexBuffer[index * 16 + 13]]) - zByte = bytes([vertexBuffer[index * 16 + 14]]) - wByte = bytes([vertexBuffer[index * 16 + 15]]) + else: # vertex color + r = int.from_bytes(xByte, "big") / 255 + g = int.from_bytes(yByte, "big") / 255 + b = int.from_bytes(zByte, "big") / 255 + a = int.from_bytes(wByte, "big") / 255 + return (r, g, b, a) - if isNormal: - x = int.from_bytes(xByte, 'big', signed=True) - y = int.from_bytes(yByte, 'big', signed=True) - z = int.from_bytes(zByte, 'big', signed=True) - return (x,y,z) - else: # vertex color - r = int.from_bytes(xByte, 'big') / 255 - g = int.from_bytes(yByte, 'big') / 255 - b = int.from_bytes(zByte, 'big') / 255 - a = int.from_bytes(wByte, 'big') / 255 - return (r,g,b,a) +def getUV(vertexBuffer, index, textureDimensions=[32, 32]): + uStart = index * 16 + 8 + vStart = index * 16 + 10 -def getUV(vertexBuffer, index, textureDimensions = [32,32]): - uStart = index * 16 + 8 - vStart = index * 16 + 10 + uBytes = vertexBuffer[uStart : uStart + 2] + vBytes = vertexBuffer[vStart : vStart + 2] - uBytes = vertexBuffer[uStart : uStart + 2] - vBytes = vertexBuffer[vStart : vStart + 2] + u = int.from_bytes(uBytes, "big", signed=True) / 32 + v = int.from_bytes(vBytes, "big", signed=True) / 32 - u = int.from_bytes(uBytes, 'big', signed = True) / 32 - v = int.from_bytes(vBytes, 'big', signed = True) / 32 + # We don't know texture size, so assume 32x32. + u /= textureDimensions[0] + v /= textureDimensions[1] + v = 1 - v - # We don't know texture size, so assume 32x32. - u /= textureDimensions[0] - v /= textureDimensions[1] - v = 1 - v + return (u, v) - return (u,v) def interpretSetTile(data, texture): - clampMirrorFlags = bitMask(data, 18, 2) + clampMirrorFlags = bitMask(data, 18, 2) + def interpretSetTileSize(data): - hVal = bitMask(data, 0, 12) - wVal = bitMask(data, 12, 12) + hVal = bitMask(data, 0, 12) + wVal = bitMask(data, 12, 12) + + height = hVal >> 2 + 1 + width = wVal >> 2 + 1 - height = hVal >> 2 + 1 - width = wVal >> 2 + 1 + return (width, height) - return (width, height) -def interpretLoadVertices(romfile, vertexBuffer, transformMatrix, command, - segmentData = None): - command = int.from_bytes(command, 'big', signed=True) +def interpretLoadVertices( + romfile, vertexBuffer, transformMatrix, command, segmentData=None +): + command = int.from_bytes(command, "big", signed=True) - numVerts = bitMask(command, 52, 4) + 1 - startIndex = bitMask(command, 48, 4) - dataLength = bitMask(command, 32, 16) - segmentedAddr = bitMask(command, 0, 32) + numVerts = bitMask(command, 52, 4) + 1 + startIndex = bitMask(command, 48, 4) + dataLength = bitMask(command, 32, 16) + segmentedAddr = bitMask(command, 0, 32) - dataStartAddr = decodeSegmentedAddr(segmentedAddr.to_bytes(4, 'big'), - segmentData = segmentData) + dataStartAddr = decodeSegmentedAddr( + segmentedAddr.to_bytes(4, "big"), segmentData=segmentData + ) - romfile.seek(dataStartAddr) - data = romfile.read(dataLength) + romfile.seek(dataStartAddr) + data = romfile.read(dataLength) - for i in range(numVerts): - vert = mathutils.Vector(readVectorFromShorts(data, i * 16)) - vert = transformMatrix @ vert - transformedVert = bytearray(6) - writeVectorToShorts(transformedVert, 0, vert) - - start = (startIndex + i) * 16 - vertexBuffer[start: start + 6] = transformedVert - vertexBuffer[start + 6: start + 16] = data[i * 16 + 6: i * 16 + 16] + for i in range(numVerts): + vert = mathutils.Vector(readVectorFromShorts(data, i * 16)) + vert = transformMatrix @ vert + transformedVert = bytearray(6) + writeVectorToShorts(transformedVert, 0, vert) + + start = (startIndex + i) * 16 + vertexBuffer[start : start + 6] = transformedVert + vertexBuffer[start + 6 : start + 16] = data[i * 16 + 6 : i * 16 + 16] # Note the divided by 0x0A, which is due to the way BF command stores indices. # Without this the triangles are drawn incorrectly. -def interpretDrawTriangle(command, vertexBuffer, - faceSeq, vertSeq, uv_layer, deform_layer, groupIndex): +def interpretDrawTriangle( + command, vertexBuffer, faceSeq, vertSeq, uv_layer, deform_layer, groupIndex +): + + verts = [None, None, None] - verts = [None, None, None] + index0 = int(command[5] / 0x0A) + index1 = int(command[6] / 0x0A) + index2 = int(command[7] / 0x0A) - index0 = int(command[5] / 0x0A) - index1 = int(command[6] / 0x0A) - index2 = int(command[7] / 0x0A) + vert0 = mathutils.Vector(getPosition(vertexBuffer, index0)) + vert1 = mathutils.Vector(getPosition(vertexBuffer, index1)) + vert2 = mathutils.Vector(getPosition(vertexBuffer, index2)) - vert0 = mathutils.Vector(getPosition(vertexBuffer, index0)) - vert1 = mathutils.Vector(getPosition(vertexBuffer, index1)) - vert2 = mathutils.Vector(getPosition(vertexBuffer, index2)) + verts[0] = vertSeq.new(vert0) + verts[1] = vertSeq.new(vert1) + verts[2] = vertSeq.new(vert2) - verts[0] = vertSeq.new(vert0) - verts[1] = vertSeq.new(vert1) - verts[2] = vertSeq.new(vert2) + tri = faceSeq.new(verts) - tri = faceSeq.new(verts) + # Assign vertex group + for vert in tri.verts: + vert[deform_layer][groupIndex] = 1 - # Assign vertex group - for vert in tri.verts: - vert[deform_layer][groupIndex] = 1 + loopIndex = 0 + for loop in tri.loops: + loop[uv_layer].uv = mathutils.Vector( + getUV(vertexBuffer, int(command[5 + loopIndex] / 0x0A)) + ) + loopIndex += 1 + + return verts - loopIndex = 0 - for loop in tri.loops: - loop[uv_layer].uv = mathutils.Vector( - getUV(vertexBuffer, int(command[5 + loopIndex] / 0x0A))) - loopIndex += 1 - - return verts def interpretSetTImage(command, levelData): - segmentedAddr = command[4:8] - return decodeSegmentedAddr(segmentedAddr, levelData) + segmentedAddr = command[4:8] + return decodeSegmentedAddr(segmentedAddr, levelData) + -def interpretLoadBlock(command, romfile, textureStart, textureSize, colorFormat, colorDepth): - numTexels = ((int.from_bytes(command[6:8], 'big')) >> 12) + 1 +def interpretLoadBlock( + command, romfile, textureStart, textureSize, colorFormat, colorDepth +): + numTexels = ((int.from_bytes(command[6:8], "big")) >> 12) + 1 + + # This is currently broken. + # createNewTextureMaterial(romfile, textureStart, textureSize, numTexels, colorFormat, colorDepth, obj) - # This is currently broken. - #createNewTextureMaterial(romfile, textureStart, textureSize, numTexels, colorFormat, colorDepth, obj) def printvbuf(vertexBuffer): - for i in range(0, int(len(vertexBuffer) / 16)): - print(getPosition(vertexBuffer, i)) - print(getNormalorColor(vertexBuffer, i)) - print(getUV(vertexBuffer, i)) + for i in range(0, int(len(vertexBuffer) / 16)): + print(getPosition(vertexBuffer, i)) + print(getNormalorColor(vertexBuffer, i)) + print(getUV(vertexBuffer, i)) def createBlankMaterial(obj): - material = createF3DMat(obj) - material.f3d_preset = 'Shaded Solid' - update_preset_manual(material, bpy.context) - -def createNewTextureMaterial(romfile, textureStart, textureSize, texelCount, colorFormat, colorDepth, obj): - newMat = bpy.data.materials.new('f3d_material') - newTex = bpy.data.textures.new('f3d_texture', 'IMAGE') - newImg = bpy.data.images.new('f3d_texture', *textureSize, True, True) - - newTex.image = newImg - newSlot = newMat.texture_slots.add() - newSlot.texture = newTex - - obj.data.materials.append(newMat) - - romfile.seek(textureStart) - texelSize = int(colorDepth / 8) - dataLength = texelCount * texelSize - textureData = romfile.read(dataLength) - - if colorDepth != 16: - print("Warning: Only 16bit RGBA supported, input was " + \ - str(colorDepth) + 'bit ' + colorFormat) - else: - print(str(texelSize) + " " + str(colorDepth)) - for n in range(0, dataLength, texelSize): - oldPixel = textureData[n : n + texelSize] - newImg.pixels[n : n+4] = read16bitRGBA( - int.from_bytes(oldPixel, 'big')) + material = createF3DMat(obj) + material.f3d_preset = "Shaded Solid" + update_preset_manual(material, bpy.context) + + +def createNewTextureMaterial( + romfile, textureStart, textureSize, texelCount, colorFormat, colorDepth, obj +): + newMat = bpy.data.materials.new("f3d_material") + newTex = bpy.data.textures.new("f3d_texture", "IMAGE") + newImg = bpy.data.images.new("f3d_texture", *textureSize, True, True) + + newTex.image = newImg + newSlot = newMat.texture_slots.add() + newSlot.texture = newTex + + obj.data.materials.append(newMat) + + romfile.seek(textureStart) + texelSize = int(colorDepth / 8) + dataLength = texelCount * texelSize + textureData = romfile.read(dataLength) + + if colorDepth != 16: + print( + "Warning: Only 16bit RGBA supported, input was " + + str(colorDepth) + + "bit " + + colorFormat + ) + else: + print(str(texelSize) + " " + str(colorDepth)) + for n in range(0, dataLength, texelSize): + oldPixel = textureData[n : n + texelSize] + newImg.pixels[n : n + 4] = read16bitRGBA(int.from_bytes(oldPixel, "big")) + binOps = { - ast.Add: operator.add, - ast.Sub: operator.sub, - ast.Mult: operator.mul, - ast.Div: operator.truediv, - ast.Mod: operator.mod, - ast.LShift: operator.lshift, - ast.RShift: operator.rshift, - ast.RShift: operator.rshift, - ast.BitOr: operator.or_, - ast.BitAnd: operator.and_, - ast.BitXor: operator.xor, + ast.Add: operator.add, + ast.Sub: operator.sub, + ast.Mult: operator.mul, + ast.Div: operator.truediv, + ast.Mod: operator.mod, + ast.LShift: operator.lshift, + ast.RShift: operator.rshift, + ast.RShift: operator.rshift, + ast.BitOr: operator.or_, + ast.BitAnd: operator.and_, + ast.BitXor: operator.xor, } -def math_eval (s, f3d): - if isinstance(s, int): - return s - - s = s.strip() - node = ast.parse(s, mode='eval') - - def _eval(node): - if isinstance(node, ast.Expression): - return _eval(node.body) - elif isinstance(node, ast.Str): - return node.s - elif isinstance(node, ast.Name): - if hasattr(f3d, node.id): - return getattr(f3d, node.id) - else: - return node.id - elif isinstance(node, ast.Num): - return node.n - elif isinstance(node, ast.UnaryOp): - if isinstance(node.op, ast.USub): - return -1 * _eval(node.operand) - elif isinstance(node.op, ast.Invert): - return ~ _eval(node.operand) - else: - raise Exception('Unsupported type {}'.format(node.op)) - elif isinstance(node, ast.BinOp): - return binOps[type(node.op)](_eval(node.left), _eval(node.right)) - elif isinstance(node, ast.Call): - args = list(map(_eval, node.args)) - funcName = _eval(node.func) - return funcName(*args) - else: - raise Exception('Unsupported type {}'.format(node)) - - return _eval(node.body) + +def math_eval(s, f3d): + if isinstance(s, int): + return s + + s = s.strip() + node = ast.parse(s, mode="eval") + + def _eval(node): + if isinstance(node, ast.Expression): + return _eval(node.body) + elif isinstance(node, ast.Str): + return node.s + elif isinstance(node, ast.Name): + if hasattr(f3d, node.id): + return getattr(f3d, node.id) + else: + return node.id + elif isinstance(node, ast.Num): + return node.n + elif isinstance(node, ast.UnaryOp): + if isinstance(node.op, ast.USub): + return -1 * _eval(node.operand) + elif isinstance(node.op, ast.Invert): + return ~_eval(node.operand) + else: + raise Exception("Unsupported type {}".format(node.op)) + elif isinstance(node, ast.BinOp): + return binOps[type(node.op)](_eval(node.left), _eval(node.right)) + elif isinstance(node, ast.Call): + args = list(map(_eval, node.args)) + funcName = _eval(node.func) + return funcName(*args) + else: + raise Exception("Unsupported type {}".format(node)) + + return _eval(node.body) + def bytesToNormal(normal): - return [int.from_bytes([value], 'big', signed = True) / 128 if value > 0 else - value / 128 for value in normal] + return [ + int.from_bytes([value], "big", signed=True) / 128 if value > 0 else value / 128 + for value in normal + ] + def getTileFormat(value, f3d): - data = math_eval(value, f3d) - return ["G_IM_FMT_RGBA", "G_IM_FMT_YUV", "G_IM_FMT_CI", "G_IM_FMT_IA", "G_IM_FMT_I"][data] + data = math_eval(value, f3d) + return [ + "G_IM_FMT_RGBA", + "G_IM_FMT_YUV", + "G_IM_FMT_CI", + "G_IM_FMT_IA", + "G_IM_FMT_I", + ][data] + def getTileSize(value, f3d): - data = math_eval(value, f3d) - return ["G_IM_SIZ_4b", "G_IM_SIZ_8b", "G_IM_SIZ_16b", "G_IM_SIZ_32b", "G_IM_SIZ_32b", "G_IM_SIZ_DD"][data] + data = math_eval(value, f3d) + return [ + "G_IM_SIZ_4b", + "G_IM_SIZ_8b", + "G_IM_SIZ_16b", + "G_IM_SIZ_32b", + "G_IM_SIZ_32b", + "G_IM_SIZ_DD", + ][data] + def getTileClampMirror(value, f3d): - data = math_eval(value, f3d) - return [(data & f3d.G_TX_CLAMP) != 0, (data & f3d.G_TX_MIRROR) != 0] + data = math_eval(value, f3d) + return [(data & f3d.G_TX_CLAMP) != 0, (data & f3d.G_TX_MIRROR) != 0] + def getTileMask(value, f3d): - data = math_eval(value, f3d) - return data + data = math_eval(value, f3d) + return data + def getTileShift(value, f3d): - data = math_eval(value, f3d) - return data + data = math_eval(value, f3d) + return data + def renderModeMask(rendermode, cycle, blendOnly): - nonBlend = (((1 << 13) - 1) << 3) if not blendOnly else 0 - if cycle == 1: - return rendermode & (3 << 30 | 3 << 26 | 3 << 22 | 3 << 18 | nonBlend) - else: - return rendermode & (3 << 28 | 3 << 24 | 3 << 20 | 3 << 16 | nonBlend) + nonBlend = (((1 << 13) - 1) << 3) if not blendOnly else 0 + if cycle == 1: + return rendermode & (3 << 30 | 3 << 26 | 3 << 22 | 3 << 18 | nonBlend) + else: + return rendermode & (3 << 28 | 3 << 24 | 3 << 20 | 3 << 16 | nonBlend) + def convertF3DUV(value, maxSize): - try: - valueBytes = int.to_bytes(value, 2, 'big', signed = True) - except OverflowError: - valueBytes = int.to_bytes(value, 2, 'big', signed = False) - - return ((int.from_bytes(valueBytes, 'big', signed = True) / 32) + 0.5) / (maxSize if maxSize > 0 else 1) + try: + valueBytes = int.to_bytes(value, 2, "big", signed=True) + except OverflowError: + valueBytes = int.to_bytes(value, 2, "big", signed=False) + + return ((int.from_bytes(valueBytes, "big", signed=True) / 32) + 0.5) / ( + maxSize if maxSize > 0 else 1 + ) + class F3DParsedCommands: - def __init__(self, name, commands, index): - self.name = name - self.commands = commands - self.index = index + def __init__(self, name, commands, index): + self.name = name + self.commands = commands + self.index = index + + def currentCommand(self): + return self.commands[self.index] - def currentCommand(self): - return self.commands[self.index] class F3DContext: - def __init__(self, f3d, basePath, materialContext): - self.f3d = f3d - self.vertexBuffer = [None] * f3d.vert_load_size - self.basePath = basePath - self.materialContext = materialContext - - self.clearMaterial() - mat = self.mat() - mat.set_combiner = False - - self.materials = [] # saved materials - self.triMatIndices = [] # material indices per triangle - self.materialChanged = True - self.lastMaterialIndex = None - - self.vertexData = {} # c name : parsed data - self.textureData = {} # c name : blender texture - - self.tlutAppliedTextures = [] # c name - self.currentTextureName = None - - # This macro has all the tile setting properties, so we reuse it - self.tileSettings = [DPSetTile( - "G_IM_FMT_RGBA", "G_IM_SIZ_16b", 5, 0, i, 0, - [False, False], 0, 0, - [False, False], 0, 0) for i in range(8)] - self.tileSizes = [DPSetTileSize(i, 0, 0, 32, 32) for i in range(8)] - - # When a tile is loaded, store dict of tmem : texture - self.tmemDict = {} - - # This should be modified before parsing f3d - self.matrixData = {} # bone name : matrix - self.currentTransformName = None - self.limbToBoneName = {} # limb name (c variable) : bone name (blender vertex group) - - # data for Mesh.from_pydata, list of BufferVertex tuples - # use BufferVertex to also form uvs / normals / colors - self.verts = [] - self.limbGroups = {} # dict of groupName : vertex indices - - self.lights = Lights("lights_context") - self.lights.l = [ - Light([0,0,0],[0x28, 0x28, 0x28]), - Light([0,0,0],[0x28, 0x28, 0x28]), - Light([0,0,0],[0x28, 0x28, 0x28]), - Light([0,0,0],[0x28, 0x28, 0x28]), - Light([0,0,0],[0x28, 0x28, 0x28]), - Light([0,0,0],[0x28, 0x28, 0x28]), - Light([0,0,0],[0x28, 0x28, 0x28]),] - self.lights.a = Ambient([0,0,0]) - self.numLights = 0 - self.lightData = {} # (color, normal) : list of blender light objects - - # MAKE SURE TO CALL THIS BETWEEN parseF3D() CALLS - def clearMaterial(self): - mat = self.mat() - - mat.rdp_settings.sets_rendermode = False - mat.set_prim = False - mat.set_lights = False - mat.set_env = False - mat.set_blend = False - mat.set_key = False - mat.set_k0_5 = False - - mat.prim_color = [1,1,1,1] - mat.env_color = [1,1,1,1] - mat.blend_color = [1,1,1,1] - for i in range(1, 8): - setattr(mat, "f3d_light" + str(i), None) - mat.tex0.tex = None - mat.tex1.tex = None - mat.tex0.tex_set = False - mat.tex1.tex_set = False - - mat.tex0.tex_format = "RGBA16" - mat.tex1.tex_format = "RGBA16" - - self.tmemDict = {} - - self.tileSettings = [DPSetTile( - "G_IM_FMT_RGBA", "G_IM_SIZ_16b", 5, 0, i, 0, - [False, False], 0, 0, - [False, False], 0, 0) for i in range(8)] - - self.tileSizes = [DPSetTileSize(i, 0, 0, 32, 32) for i in range(8)] - - self.lights = Lights("lights_context") - self.lights.l = [ - Light([0,0,0],[0x28, 0x28, 0x28]), - Light([0,0,0],[0x28, 0x28, 0x28]), - Light([0,0,0],[0x28, 0x28, 0x28]), - Light([0,0,0],[0x28, 0x28, 0x28]), - Light([0,0,0],[0x28, 0x28, 0x28]), - Light([0,0,0],[0x28, 0x28, 0x28]), - Light([0,0,0],[0x28, 0x28, 0x28]),] - self.lights.a = Ambient([0,0,0]) - self.numLights = 0 - - mat.presetName = "Custom" - - def mat(self): - return self.materialContext.f3d_mat - - def vertexFormatPatterns(self, data): - # position, uv, color/normal - return [ - # decomp format - "\{\s*\{\s*" +\ - "\{([^,\}]*),([^,\}]*),([^,\}]*)\}\s*," + "[^,\}]*,\s*" +\ - "\{([^,\}]*),([^,\}]*)\}\s*,\s*" +\ - "\{([^,\}]*),([^,\}]*),([^,\}]*),([^,\}]*)\}\s*" +\ - "\}\s*\}", - - # nusys format - "\{\s*" +\ - "([^,\}]*),([^,\}]*),([^,\}]*)," + "[^,\}]*," +\ - "([^,\}]*),([^,\}]*)," +\ - "([^,\}]*),([^,\}]*),([^,\}]*),([^,\}]*)\s*" +\ - "\}", - ] - - # For game specific instance, override this to be able to identify which verts belong to which bone. - def setCurrentTransform(self, name): - self.currentTransformName = name - - def getTransformedVertex(self, index): - bufferVert = self.vertexBuffer[index] - - # NOTE: The groupIndex here does NOT correspond to a vertex group, but to the name of the limb (c variable) - matrixName = bufferVert.groupIndex - if matrixName in self.matrixData: - transform = self.matrixData[matrixName] - else: - print(self.matrixData) - raise PluginError("Transform matrix not specified for " + matrixName) - - mat = self.mat() - f3dVert = bufferVert.f3dVert - position = transform @ mathutils.Vector(f3dVert[0]) - if mat.tex0.tex is not None: - uv = [convertF3DUV(f3dVert[1][i], mat.tex0.tex.size[i]) for i in range(2)] - #uv = [1 - (f3dVert[1][i] / (self.materialContext.f3d_mat.tex0.tex.size[i] * 32)) for i in range(2)] - #uv = [((f3dVert[1][i] / 32) + 0.5) / mat.tex0.tex.size[i] for i in range(2)] - else: - uv = [convertF3DUV(f3dVert[1][i], 32) for i in range(2)] - #uv = [1 - (f3dVert[1][i] / (32 * 32)) for i in range(2)] - #uv = [((f3dVert[1][i] / 32) + 0.5) / 32 for i in range(2)] - uv[1] = 1 - uv[1] - - color = [value / 256 if value > 0 else - int.from_bytes(value.to_bytes(1, 'big', signed = True), 'big', signed = False) / 256 - for value in f3dVert[2]] - - normal = bytesToNormal(f3dVert[2][:3]) + [0] - normal = (transform.inverted().transposed() @ mathutils.Vector(normal)).normalized()[:3] - - # This is not usual format of f3dVert, but we need separate color/normal data. - # NOTE: The groupIndex here does NOT correspond to a vertex group, but to the name of the limb (c variable) - return BufferVertex([position, uv, color, normal], bufferVert.groupIndex, bufferVert.materialIndex) - - def addVertices(self, num, start, vertexDataName, vertexDataOffset): - vertexData = self.vertexData[vertexDataName] - - # TODO: material index not important? - count = math_eval(num, self.f3d) - start = math_eval(start, self.f3d) - - if start + count > len (self.vertexBuffer): - raise PluginError("Vertex buffer of size " + len(self.vertexBuffer) + " too small, attempting load into " +\ - str(start) + ", " + str(start + count)) - for i in range(count): - self.vertexBuffer[start + i] = \ - BufferVertex(vertexData[vertexDataOffset + i], self.currentTransformName, 0) - - def addTriangle(self, indices, dlData): - if self.materialChanged: - mat = self.mat() - region = None - - tileSettings = self.tileSettings[0] - tileSizeSettings = self.tileSizes[0] - if tileSettings.tmem in self.tmemDict: - textureName = self.tmemDict[tileSettings.tmem] - self.loadTexture(dlData, textureName, region, tileSettings, False) - self.applyTileToMaterial(0, tileSettings, tileSizeSettings) - - tileSettings = self.tileSettings[1] - tileSizeSettings = self.tileSizes[1] - if tileSettings.tmem in self.tmemDict: - textureName = self.tmemDict[tileSettings.tmem] - self.loadTexture(dlData, textureName, region, tileSettings, False) - self.applyTileToMaterial(1, tileSettings, tileSizeSettings) - - self.applyLights() - - self.lastMaterialIndex = self.getMaterialIndex() - self.materialChanged = False - - verts = [self.getTransformedVertex(math_eval(index, self.f3d)) for index in indices] - #if verts[0].groupIndex != verts[1].groupIndex or\ - # verts[0].groupIndex != verts[2].groupIndex or\ - # verts[2].groupIndex != verts[1].groupIndex: - # return - for i in range(len(verts)): - vert = verts[i] - - # NOTE: The groupIndex here does NOT correspond to a vertex group, but to the name of the limb (c variable) - if vert.groupIndex not in self.limbGroups: - self.limbGroups[vert.groupIndex] = [] - self.limbGroups[vert.groupIndex].append(len(self.verts) + i) - self.verts.extend([vert.f3dVert for vert in verts]) - - for i in range(int(len(indices) / 3)): - self.triMatIndices.append(self.lastMaterialIndex) - - def getMaterialIndex(self): - # We do this for now to update tile settings for S and T. - # Right now we don't handle those, so we need the auto-calculator to set it correctly. - overrideContext = bpy.context.copy() - overrideContext["material"] = self.materialContext - bpy.ops.material.update_f3d_nodes(overrideContext) - - for material in self.materials: - if propertyGroupEquals(self.materialContext.f3d_mat, material.f3d_mat): - return self.materials.index(material) - - self.addMaterial() - return len(self.materials) - 1 - - def getImageName(self, image): - for name, otherImage in self.textureData.items(): - if image == otherImage: - return name - return None - - def applyTLUTToIndex(self, index): - mat = self.mat() - texProp = getattr(mat, "tex" + str(index)) - combinerUses = all_combiner_uses(mat) - if combinerUses["Texture " + str(index)] and \ - (texProp.tex is not None or texProp.use_tex_reference) and \ - texProp.tex_set and texProp.tex_format[:2] == "CI" and\ - (texProp.tex not in self.tlutAppliedTextures or texProp.use_tex_reference): - - # Only handles TLUT at 256 - tlutName = self.tmemDict[256] - if 256 in self.tmemDict and tlutName is not None: - tlut = self.textureData[tlutName] - if isinstance(tlut, F3DTextureReference) or texProp.use_tex_reference: - if not texProp.use_tex_reference: - texProp.use_tex_reference = True - imageName = self.getImageName(texProp.tex) - if imageName is not None: - texProp.tex_reference = imageName - else: - print("Cannot find name of texture " + str(texProp.tex)) - - if isinstance(tlut, F3DTextureReference): - texProp.pal_reference = tlut.name - texProp.pal_reference_size = tlut.width - else: - texProp.pal_reference = tlutName - texProp.pal_reference_size = min(tlut.size[0] * tlut.size[1], 256) - - else: - self.applyTLUT(texProp.tex, tlut) - self.tlutAppliedTextures.append(texProp.tex) - else: - print("Ignoring TLUT.") - - def postMaterialChanged(self): - return - - def addMaterial(self): - mat = self.mat() - combinerUses = all_combiner_uses(self.mat()) - self.applyTLUTToIndex(0) - self.applyTLUTToIndex(1) - - material = self.materialContext.copy() - overrideContext = bpy.context.copy() - overrideContext["material"] = material - bpy.ops.material.update_f3d_nodes(overrideContext) - self.materials.append(material) - self.materialChanged = False - - self.postMaterialChanged() - - def getSizeMacro(self, size, suffix): - if hasattr(self.f3d, size): - return getattr(self.f3d, size + suffix) - else: - return getattr(self.f3d, self.f3d.IM_SIZ[size] + suffix) - - def getImagePathFromInclude(self, path): - if self.basePath is None: - raise PluginError("Cannot load texture from " + path + " without any provided base path.") - - imagePath = path[:-5] + 'png' - return os.path.join(self.basePath, imagePath) - - def getVTXPathFromInclude(self, path): - if self.basePath is None: - raise PluginError("Cannot load VTX from " + path + " without any provided base path.") - return os.path.join(self.basePath, path) - - def setGeoFlags(self, command, value): - mat = self.mat() - bitFlags = math_eval(command.params[0], self.f3d) - - if bitFlags & self.f3d.G_ZBUFFER: - mat.rdp_settings.g_zbuffer = value - if bitFlags & self.f3d.G_SHADE: - mat.rdp_settings.g_shade = value - if bitFlags & self.f3d.G_CULL_FRONT: - mat.rdp_settings.g_cull_front = value - if bitFlags & self.f3d.G_CULL_BACK: - mat.rdp_settings.g_cull_back = value - if bitFlags & self.f3d.G_FOG: - mat.rdp_settings.g_fog = value - if bitFlags & self.f3d.G_LIGHTING: - mat.rdp_settings.g_lighting = value - if bitFlags & self.f3d.G_TEXTURE_GEN: - mat.rdp_settings.g_tex_gen = value - if bitFlags & self.f3d.G_TEXTURE_GEN_LINEAR: - mat.rdp_settings.g_tex_gen_linear = value - if bitFlags & self.f3d.G_SHADING_SMOOTH: - mat.rdp_settings.g_shade_smooth = value - if bitFlags & self.f3d.G_CLIPPING: - mat.rdp_settings.g_clipping = value - - def loadGeoFlags(self, command): - mat = self.mat() - - bitFlags = math_eval(command.params[0], self.f3d) - - mat.rdp_settings.g_zbuffer = bitFlags & self.f3d.G_ZBUFFER != 0 - mat.rdp_settings.g_shade = bitFlags & self.f3d.G_SHADE != 0 - mat.rdp_settings.g_cull_front = bitFlags & self.f3d.G_CULL_FRONT != 0 - mat.rdp_settings.g_cull_back = bitFlags & self.f3d.G_CULL_BACK != 0 - mat.rdp_settings.g_fog = bitFlags & self.f3d.G_FOG != 0 - mat.rdp_settings.g_lighting = bitFlags & self.f3d.G_LIGHTING != 0 - mat.rdp_settings.g_tex_gen = bitFlags & self.f3d.G_TEXTURE_GEN != 0 - mat.rdp_settings.g_tex_gen_linear = bitFlags & self.f3d.G_TEXTURE_GEN_LINEAR != 0 - mat.rdp_settings.g_shade_smooth = bitFlags & self.f3d.G_SHADING_SMOOTH != 0 - mat.rdp_settings.g_clipping = bitFlags & self.f3d.G_CLIPPING != 0 - - def setCombineLerp(self, lerp0, lerp1): - mat = self.mat() - - if len(lerp0) < 8 or len(lerp1) < 8: - print("Incorrect combiner param count: " + str(lerp0) + " " + str(lerp1)) - return - - lerp0 = [value.strip() for value in lerp0] - lerp1 = [value.strip() for value in lerp1] - - # Padding since index can go up to 31 - combinerAList = ['COMBINED', 'TEXEL0', 'TEXEL1', 'PRIMITIVE', 'SHADE', 'ENVIRONMENT', '1', 'NOISE'] + ['0'] * 24 - combinerBList = ['COMBINED', 'TEXEL0', 'TEXEL1', 'PRIMITIVE', 'SHADE', 'ENVIRONMENT', 'CENTER', 'K4'] + ['0'] * 24 - combinerCList = ['COMBINED', 'TEXEL0', 'TEXEL1', 'PRIMITIVE', 'SHADE', 'ENVIRONMENT', 'SCALE', - 'COMBINED_ALPHA', 'TEXEL0_ALPHA', 'TEXEL1_ALPHA', 'PRIMITIVE_ALPHA', 'SHADE_ALPHA', 'ENV_ALPHA', - 'LOD_FRACTION', 'PRIM_LOD_FRAC', 'K5'] + ['0'] * 16 - combinerDList = ['COMBINED', 'TEXEL0', 'TEXEL1', 'PRIMITIVE', 'SHADE', 'ENVIRONMENT', '1', '0'] + ['0'] * 24 - - combinerAAlphaList = ['COMBINED', 'TEXEL0', 'TEXEL1', 'PRIMITIVE', 'SHADE', 'ENVIRONMENT', '1', '0'] - combinerBAlphaList = ['COMBINED', 'TEXEL0', 'TEXEL1', 'PRIMITIVE', 'SHADE', 'ENVIRONMENT', '1', '0'] - combinerCAlphaList = ['LOD_FRACTION', 'TEXEL0', 'TEXEL1', 'PRIMITIVE', 'SHADE', 'ENVIRONMENT', 'PRIM_LOD_FRAC', '0'] - combinerDAlphaList = ['COMBINED', 'TEXEL0', 'TEXEL1', 'PRIMITIVE', 'SHADE', 'ENVIRONMENT', '1', '0'] - - for i in range(0,4): - lerp0[i] = math_eval("G_CCMUX_" + lerp0[i], self.f3d) - lerp1[i] = math_eval("G_CCMUX_" + lerp1[i], self.f3d) - - for i in range(4,8): - lerp0[i] = math_eval("G_ACMUX_" + lerp0[i], self.f3d) - lerp1[i] = math_eval("G_ACMUX_" + lerp1[i], self.f3d) - - - mat.set_combiner = True - mat.combiner1.A = combinerAList[lerp0[0]] - mat.combiner1.B = combinerBList[lerp0[1]] - mat.combiner1.C = combinerCList[lerp0[2]] - mat.combiner1.D = combinerDList[lerp0[3]] - mat.combiner1.A_alpha = combinerAAlphaList[lerp0[4]] - mat.combiner1.B_alpha = combinerBAlphaList[lerp0[5]] - mat.combiner1.C_alpha = combinerCAlphaList[lerp0[6]] - mat.combiner1.D_alpha = combinerDAlphaList[lerp0[7]] - - mat.combiner2.A = combinerAList[lerp1[0]] - mat.combiner2.B = combinerBList[lerp1[1]] - mat.combiner2.C = combinerCList[lerp1[2]] - mat.combiner2.D = combinerDList[lerp1[3]] - mat.combiner2.A_alpha = combinerAAlphaList[lerp1[4]] - mat.combiner2.B_alpha = combinerBAlphaList[lerp1[5]] - mat.combiner2.C_alpha = combinerCAlphaList[lerp1[6]] - mat.combiner2.D_alpha = combinerDAlphaList[lerp1[7]] - - def setCombineMode(self, command): - if not hasattr(self.f3d, command.params[0]) or\ - not hasattr(self.f3d, command.params[1]): - print("Unhandled combiner mode: " + command.params[0] + ", " + command.params[1]) - return - lerp0 = getattr(self.f3d, command.params[0]) - lerp1 = getattr(self.f3d, command.params[1]) - - self.setCombineLerp(lerp0, lerp1) - - def setTLUTMode(self, index, value): - mat = self.mat() - texProp = getattr(mat, "tex" + str(index)) - bitData = math_eval(value, self.f3d) - if value == self.f3d.G_TT_NONE: - if texProp.tex_format[:2] == 'CI': - texProp.tex_format = 'RGBA16' - elif value == self.f3d.G_TT_IA16: - texProp.ci_format = "IA16" - else: - texProp.ci_format = "RGBA16" - - def setOtherModeFlags(self, command): - mat = self.mat() - mode = math_eval(command.params[0], self.f3d) - if mode == self.f3d.G_SETOTHERMODE_H: - self.setOtherModeFlagsH(command) - else: - self.setOtherModeFlagsL(command) - - def setOtherModeFlagsH(self, command): - - otherModeH = { - "G_MDSFT_ALPHADITHER" : ["G_AD_PATTERN", "G_AD_NOTPATTERN", "G_AD_NOISE", "G_AD_DISABLE"], - "G_MDSFT_RGBDITHER" : ["G_CD_MAGICSQ", "G_CD_BAYER", "NOISE"], - "G_MDSFT_COMBKEY" : ["G_CK_NONE", "G_CK_KEY"], - "G_MDSFT_TEXTCONV" : ["G_TC_CONV", "G_TC_CONV", "G_TC_CONV", "G_TC_CONV", "G_TC_CONV", "G_TC_FILTCONV", "G_TC_FILT"], - "G_MDSFT_TEXTFILT" : ["G_TF_POINT", "G_TF_POINT", "G_TF_BILERP", "G_TF_AVERAGE"], - "G_MDSFT_TEXTLOD" : ["G_TL_TILE", "G_TL_LOD"], - "G_MDSFT_TEXTDETAIL" : ["G_TD_CLAMP", "G_TD_SHARPEN", "G_TD_DETAIL"], - "G_MDSFT_TEXTPERSP" : ["G_TP_NONE", "G_TP_PERSP"], - "G_MDSFT_CYCLETYPE" : ["G_CYC_1CYCLE", "G_CYC_2CYCLE", "G_CYC_COPY", "G_CYC_FILL"], - "G_MDSFT_COLORDITHER" : ["G_CD_MAGICSQ", "G_CD_BAYER", "G_CD_NOISE"], - "G_MDSFT_PIPELINE" : ["G_PM_NPRIMITIVE", "G_PM_1PRIMITIVE"], - } - mat = self.mat() - flags = math_eval(command.params[3], self.f3d) - shift = math_eval(command.params[1], self.f3d) - mask = math_eval(command.params[2], self.f3d) - - for field, fieldData in otherModeH.items(): - fieldShift = getattr(self.f3d, field) - if fieldShift >= shift and fieldShift < shift + mask: - setattr(mat.rdp_settings, field.lower(), fieldData[(flags >> fieldShift) & \ - ((1 << int(ceil(math.log(len(fieldData), 2)))) - 1)]) - - - # This only handles commonly used render mode presets (with macros), - # and no render modes at all with raw bit data. - def setOtherModeFlagsL(self, command): - otherModeL = { - "G_MDSFT_ALPHACOMPARE" : ["G_AC_NONE", "G_AC_THRESHOLD", "G_AC_THRESHOLD", "G_AC_DITHER"], - "G_MDSFT_ZSRCSEL" : ["G_ZS_PIXEL", "G_ZS_PRIM"], - } - - mat = self.mat() - flags = math_eval(command.params[3], self.f3d) - shift = math_eval(command.params[1], self.f3d) - mask = math_eval(command.params[2], self.f3d) - - for field, fieldData in otherModeL.items(): - fieldShift = getattr(self.f3d, field) - if fieldShift >= shift and fieldShift < shift + mask: - setattr(mat.rdp_settings, field.lower(), fieldData[(flags >> fieldShift) & \ - ((1 << int(ceil(math.log(len(fieldData), 2)))) - 1)]) - - if self.f3d.G_MDSFT_RENDERMODE >= shift and self.f3d.G_MDSFT_RENDERMODE < shift + mask: - self.setRenderMode(flags) - - def setRenderMode(self, flags): - mat = self.mat() - rendermode1 = renderModeMask(flags, 1, False) - rendermode2 = renderModeMask(flags, 2, False) - - blend1 = renderModeMask(flags, 1, True) - - rendermodeName1 = None - rendermodeName2 = None - - #print("Render mode: " + hex(rendermode1) + ", " + hex(rendermode2)) - for name, value in vars(self.f3d).items(): - if name[:5] == "G_RM_": - #print(name + " " + hex(value)) - - if name in ["G_RM_FOG_SHADE_A", "G_RM_FOG_PRIM_A", "G_RM_PASS"]: - if blend1 == value: - rendermodeName1 = name - else: - if rendermode1 == value: - rendermodeName1 = name - if rendermode2 == value: - rendermodeName2 = name - if rendermodeName1 is not None and rendermodeName2 is not None: - break - - mat.rdp_settings.sets_rendermode = True - if rendermodeName1 is not None and rendermodeName2 is not None: - mat.rdp_settings.rendermode_advanced_enabled = False - mat.rdp_settings.rendermode_preset_cycle_1 = rendermodeName1 - mat.rdp_settings.rendermode_preset_cycle_2 = rendermodeName2 - else: - mat.rdp_settings.rendermode_advanced_enabled = True - - mat.rdp_settings.aa_en = rendermode1 & self.f3d.AA_EN != 0 - mat.rdp_settings.z_cmp = rendermode1 & self.f3d.Z_CMP != 0 - mat.rdp_settings.z_upd = rendermode1 & self.f3d.Z_UPD != 0 - mat.rdp_settings.im_rd = rendermode1 & self.f3d.IM_RD != 0 - mat.rdp_settings.clr_on_cvg = rendermode1 & self.f3d.CLR_ON_CVG != 0 - mat.rdp_settings.cvg_dst = self.f3d.cvgDstDict[rendermode1 & self.f3d.CVG_DST_SAVE] - mat.rdp_settings.zmode = self.f3d.zmodeDict[rendermode1 & self.f3d.ZMODE_DEC] - mat.rdp_settings.cvg_x_alpha = rendermode1 & self.f3d.CVG_X_ALPHA != 0 - mat.rdp_settings.alpha_cvg_sel = rendermode1 & self.f3d.ALPHA_CVG_SEL != 0 - mat.rdp_settings.force_bl = rendermode1 & self.f3d.FORCE_BL != 0 - - mat.rdp_settings.blend_p1 = self.f3d.blendColorDict[rendermode1 >> 30 & 3] - mat.rdp_settings.blend_a1 = self.f3d.blendAlphaDict[rendermode1 >> 26 & 3] - mat.rdp_settings.blend_m1 = self.f3d.blendColorDict[rendermode1 >> 22 & 3] - mat.rdp_settings.blend_b1 = self.f3d.blendMixDict[rendermode1 >> 18 & 3] - - mat.rdp_settings.blend_p2 = self.f3d.blendColorDict[rendermode2 >> 28 & 3] - mat.rdp_settings.blend_a2 = self.f3d.blendAlphaDict[rendermode2 >> 24 & 3] - mat.rdp_settings.blend_m2 = self.f3d.blendColorDict[rendermode2 >> 20 & 3] - mat.rdp_settings.blend_b2 = self.f3d.blendMixDict[rendermode2 >> 16 & 3] - - def gammaInverseParam(self, color): - return [gammaInverseValue(math_eval(value, self.f3d) / 255) for value in color[:3]] + [math_eval(color[3], self.f3d) / 255] - - def getLightIndex(self, lightIndexString): - return math_eval(lightIndexString, self.f3d) if "LIGHT_" not in lightIndexString else int(lightIndexString[-1:]) - - def getLightCount(self, lightCountString): - return math_eval(lightCountString, self.f3d) if "NUMLIGHTS_" not in lightCountString else int(lightCountString[-1:]) - - def getLightObj(self, light): - lightKey = (tuple(light.color), tuple(light.normal)) - if lightKey not in self.lightData: - lightName = "Light" - bLight = bpy.data.lights.new(lightName, "SUN") - lightObj = bpy.data.objects.new(lightName, bLight) - - lightObj.rotation_euler = (mathutils.Euler((0, 0, math.pi)).to_quaternion() @ \ - (mathutils.Euler((math.pi / 2, 0, 0)).to_quaternion() @ \ - mathutils.Vector(light.normal)).rotation_difference(mathutils.Vector((0,0,1)))).to_euler() - #lightObj.rotation_euler[0] *= 1 - bLight.color = light.color - - bpy.context.scene.collection.objects.link(lightObj) - self.lightData[lightKey] = lightObj - return self.lightData[lightKey] - - def applyLights(self): - mat = self.mat() - allCombinerUses = all_combiner_uses(mat) - if allCombinerUses["Shade"] and mat.rdp_settings.g_lighting and mat.set_lights: - mat.use_default_lighting = False - mat.ambient_light_color = self.lights.a.color + ([1] if len(self.lights.a.color) == 3 else []) - - for i in range(self.numLights): - lightObj = self.getLightObj(self.lights.l[i]) - setattr(mat, "f3d_light" + str(i + 1), lightObj.data) - - def setLightColor(self, data, command): - self.mat().set_lights = True - lightIndex = self.getLightIndex(command.params[0]) - colorData = math_eval(command.params[1], self.f3d) - color = [((colorData >> 24) & 0xFF) / 0xFF, ((colorData >> 16) & 0xFF) / 0xFF, ((colorData >> 8) & 0xFF) / 0xFF] - - if lightIndex != self.numLights + 1: - self.lights.l[lightIndex - 1].color = color - else: - self.lights.a.color = color - - # This is an assumption. - if self.numLights < lightIndex - 1: - self.numLights = lightIndex - 1 - - # Assumes that any SPLight references a Lights0-9n struct instead of specific Light structs. - def setLight(self, data, command): - mat = self.mat() - mat.set_lights = True - - lightReference = command.params[0] - lightIndex = self.getLightIndex(command.params[1]) - - match = re.search("([A-Za-z0-9\_]*)\.(l(\[([0-9])\])?)?(a)?", lightReference) - if match is None: - print("Could not handle parsing of light reference: " + lightReference + ". Currently only handling Lights0-9n structs (not Light)") - return - - lightsName = match.group(1) - lights = self.createLights(data, lightsName) - - if match.group(2) is not None: - if match.group(3) is not None: - lightIndex = math_eval(match.group(4), self.f3d) - else: - lightIndex = 0 - - # This is done as an assumption, to handle models that have numLights set beforehand - if self.numLights < lightIndex + 1: - self.numLights = lightIndex + 1 - self.lights.l[lightIndex] = lights.l[lightIndex] - else: - self.lights.a = lights.a - - def setLights(self, data, command): - mat = self.mat() - self.mat().set_lights = True - - numLights = self.getLightCount(command.name[13]) - self.numLights = numLights - - lightsName = command.params[0] - self.lights = self.createLights(data, lightsName) - - def createLights(self, data, lightsName): - numLights, lightValues = parseLightsData(data, lightsName, self) - ambientColor = gammaInverse([value / 255 for value in lightValues[0:3]]) - - lightList = [] - - for i in range(numLights): - color = gammaInverse([value / 255 for value in lightValues[3 + 6*i : 3 + 6*i + 3]]) - direction = bytesToNormal(lightValues[3 + 6*i + 3 : 3 + 6*i + 6]) - lightList.append(Light(color, direction)) - - while len(lightList) < 7: - lightList.append(Light([0,0,0],[0x28, 0x28, 0x28])) - - # normally a and l are Ambient and Light objects, - # but here they will be a color and blender light object array. - lights = Lights(lightsName) - lights.a = Ambient(ambientColor) - lights.l = lightList - - return lights - - def getTileIndex(self, value): - if value == "G_TX_RENDERTILE": - return self.f3d.G_TX_RENDERTILE - elif value == "G_TX_LOADTILE": - return self.f3d.G_TX_LOADTILE - else: - return math_eval(value, self.f3d) - - def getTileSettings(self, value): - return self.tileSettings[self.getTileIndex(value)] - - def getTileSizeSettings(self, value): - return self.tileSizes[self.getTileIndex(value)] - - def setTileSize(self, params): - mat = self.mat() - tileSizeSettings = self.getTileSizeSettings(params[0]) - tileSettings = self.getTileSettings(params[0]) - - dimensions = [0,0,0,0] - for i in range(1,5): - #match = None - #if not isinstance(params[i], int): - # match = re.search("\(([0-9]+)\s*\-\s*1\s*\)\s*<<\s*G\_TEXTURE\_IMAGE\_FRAC", params[i]) - #if match is not None: - # dimensions[i - 1] = (math_eval(match.group(1), self.f3d) - 1) << self.f3d.G_TEXTURE_IMAGE_FRAC - #else: - # dimensions[i - 1] = math_eval(params[i], self.f3d) - dimensions[i - 1] = math_eval(params[i], self.f3d) - - tileSizeSettings.uls = dimensions[0] - tileSizeSettings.ult = dimensions[1] - tileSizeSettings.lrs = dimensions[2] - tileSizeSettings.lrt = dimensions[3] - - def setTile(self, params, dlData): - tileIndex = self.getTileIndex(params[4]) - tileSettings = self.getTileSettings(params[4]) - tileSettings.fmt = getTileFormat(params[0], self.f3d) - tileSettings.siz = getTileSize(params[1], self.f3d) - tileSettings.line = math_eval(params[2], self.f3d) - tileSettings.tmem = math_eval(params[3], self.f3d) - tileSettings.palette = math_eval(params[5], self.f3d) - tileSettings.cmt = getTileClampMirror(params[6], self.f3d) - tileSettings.maskt = getTileMask(params[7], self.f3d) - tileSettings.shifts = getTileShift(params[8], self.f3d) - tileSettings.cms = getTileClampMirror(params[9], self.f3d) - tileSettings.masks = getTileMask(params[10], self.f3d) - tileSettings.shifts = getTileShift(params[11], self.f3d) - - tileSizeSettings = self.getTileSizeSettings(params[4]) - - def loadTile(self, params): - tileSettings = self.getTileSettings(params[0]) - # TODO: Region parsing too hard? - #region = [ - # math_eval(params[1], self.f3d) / 4, - # math_eval(params[2], self.f3d) / 4, - # math_eval(params[3], self.f3d) / 4, - # math_eval(params[4], self.f3d) / 4 - #] - region = None - - # Defer texture parsing until next set tile. - self.tmemDict[tileSettings.tmem] = self.currentTextureName - self.materialChanged = True - - def loadMultiBlock(self, params, dlData, is4bit): - width = math_eval(params[5], self.f3d) - height = math_eval(params[6], self.f3d) - siz = params[4] - line = ((width * self.getSizeMacro(siz, "_LINE_BYTES")) + 7) >> 3 if not is4bit else\ - ((width >> 1) + 7) >> 3 - tmem = params[1] - tile = params[2] - loadBlockSiz = self.getSizeMacro(siz, "_LOAD_BLOCK") if not is4bit else self.f3d.G_IM_SIZ_16b - self.currentTextureName = params[0] - self.setTile([params[3], loadBlockSiz, 0, tmem, "G_TX_LOADTILE", 0, - params[9], params[11], params[13], params[8], params[10], params[12], - ], dlData) - # TODO: Region is ignored for now - self.loadTile(["G_TX_LOADTILE", 0, 0, 0, 0]) - self.setTile([params[3], params[4], line, tmem, tile, 0, - params[9], params[11], params[13], params[8], params[10], params[12], - ], dlData) - self.setTileSize([tile, 0, 0, - (width - 1) << self.f3d.G_TEXTURE_IMAGE_FRAC, - (height - 1) << self.f3d.G_TEXTURE_IMAGE_FRAC]) - - def loadTLUTPal(self, name, dlData, count): - # TODO: Doesn't handle loading palettes into not tmem 256 - self.currentTextureName = name - self.setTile([0,0,0, 256, "G_TX_LOADTILE", 0,0,0,0,0,0,0], dlData) - self.loadTLUT(["G_TX_LOADTILE", count], dlData) - - def applyTileToMaterial(self, index, tileSettings, tileSizeSettings): - mat = self.mat() - - texProp = getattr(mat, "tex" + str(index)) - - name = self.tmemDict[tileSettings.tmem] - image = self.textureData[name] - if isinstance(image, F3DTextureReference): - texProp.tex = None - texProp.use_tex_reference = True - texProp.tex_reference = name - size = texProp.tex_reference_size - else: - texProp.tex = image - texProp.use_tex_reference = False - size = texProp.tex.size - texProp.tex_set = True - - # TODO: Handle low/high for image files? - if texProp.use_tex_reference: - #texProp.autoprop = False - #texProp.S.low = round(tileSizeSettings.uls / (2 ** self.f3d.G_TEXTURE_IMAGE_FRAC), 3) - #texProp.T.low = round(tileSizeSettings.ult / (2 ** self.f3d.G_TEXTURE_IMAGE_FRAC), 3) - #texProp.S.high = round(tileSizeSettings.lrs / (2 ** self.f3d.G_TEXTURE_IMAGE_FRAC), 3) - #texProp.T.high = round(tileSizeSettings.lrt / (2 ** self.f3d.G_TEXTURE_IMAGE_FRAC), 3) - - # WARNING: Inferring texture size from tile size. - texProp.tex_reference_size = [ - int(round(tileSizeSettings.lrs / (2 ** self.f3d.G_TEXTURE_IMAGE_FRAC) + 1)), - int(round(tileSizeSettings.lrt / (2 ** self.f3d.G_TEXTURE_IMAGE_FRAC) + 1))] - - #if texProp.S.low == 0 and texProp.T.low == 0 and \ - # texProp.S.high == size[0] - 1 and \ - # (texProp.use_tex_reference or texProp.T.high == size[1] - 1): - # texProp.autoProp = True - #else: - # print(str(texProp.S.low) + " " + str(texProp.T.low) + " " + str(texProp.S.high) + " " + str(texProp.T.high)) - # print(str(size[0]-1) + " " + str(size[1]-1)) - - texProp.tex_format = tileSettings.fmt[8:].replace("_", "") + tileSettings.siz[8:-1].replace("_", "") - - texProp.S.clamp = tileSettings.cms[0] - texProp.S.mirror = tileSettings.cms[1] - - texProp.T.clamp = tileSettings.cmt[0] - texProp.T.mirror = tileSettings.cmt[1] - - # TODO: Handle S and T properties - - # Override this to handle game specific references. - def handleTextureName(self, textureName): - return textureName - - def loadTexture(self, data, name, region, tileSettings, isLUT): - textureName = self.handleTextureName(name) - - if textureName in self.textureData: - return self.textureData[textureName] - - # region ignored? - if isLUT: - siz = "G_IM_SIZ_16b" - width = 16 - else: - siz = tileSettings.siz - if siz == "G_IM_SIZ_4b": - width = (tileSettings.line * 8) * 2 - else: - width = int(ceil((tileSettings.line * 8) / self.f3d.G_IM_SIZ_VARS[siz + '_LINE_BYTES'])) - - # TODO: Textures are sometimes loaded in with different dimensions than for rendering. - # This means width is incorrect? - image = parseTextureData(data, textureName, self, tileSettings.fmt, siz, width, self.basePath, isLUT, self.f3d) - - self.textureData[textureName] = image - return self.textureData[textureName] - - def loadTLUT(self, params, dlData): - tileSettings = self.getTileSettings(params[0]) - name = self.currentTextureName - textureName = self.handleTextureName(name) - self.tmemDict[tileSettings.tmem] = textureName - - tlut = self.loadTexture(dlData, textureName, [0,0, 16, 16], tileSettings, True) - self.materialChanged = True - - def applyTLUT(self, image, tlut): - for i in range(int(len(image.pixels) / 4)): - lutIndex = int(round(image.pixels[4*i] * 255)) - newValues = tlut.pixels[4 * lutIndex : 4 * (lutIndex + 1)] - if len(newValues) < 4: - print("Invalid lutIndex " + str(lutIndex)) - else: - image.pixels[4*i : 4*(i+1)] = newValues - - def processCommands(self, dlData, dlName, dlCommands): - callStack = [F3DParsedCommands(dlName, dlCommands, 0)] - while len(callStack) > 0: - currentCommandList = callStack[-1] - command = currentCommandList.currentCommand() - - if currentCommandList.index >= len(currentCommandList.commands): - raise PluginError("Cannot handle unterminated static display lists: " + currentCommandList.name) - elif len(callStack) > 2**16: - raise PluginError("DL call stack larger than 2**16, assuming infinite loop: " + currentCommandList.name) - - #print(command.name + " " + str(command.params)) - if command.name == 'gsSPVertex': - vertexDataName, vertexDataOffset = getVertexDataStart(command.params[0], self.f3d) - parseVertexData(dlData, vertexDataName, self) - self.addVertices(command.params[1], command.params[2], vertexDataName, vertexDataOffset) - elif command.name == 'gsSPMatrix': - self.setCurrentTransform(command.params[0]) - elif command.name == 'gsSPPopMatrix': - print("gsSPPopMatrix not handled.") - elif command.name == 'gsSP1Triangle': - self.addTriangle(command.params[0:3], dlData) - elif command.name == 'gsSP2Triangles': - self.addTriangle(command.params[0:3] + command.params[4:7], dlData) - elif command.name == 'gsSPDisplayList' or command.name[:10] == 'gsSPBranch': - newDLName = self.processDLName(command.params[0]) - if newDLName is not None: - newDLCommands = parseDLData(dlData, newDLName) - # Use -1 index so that it will be incremented to 0 at end of loop - parsedCommands = F3DParsedCommands(newDLName, newDLCommands, -1) - if command.name == 'gsSPDisplayList': - callStack.append(parsedCommands) - elif command.name[:10] == 'gsSPBranch': # TODO: Handle BranchZ? - callStack = callStack[:-1] - callStack.append(parsedCommands) - elif command.name == 'gsSPEndDisplayList': - callStack = callStack[:-1] - - # Material Specific Commands - prevMaterialChangedStatus = self.materialChanged - self.materialChanged = True - - # Should we parse commands into f3d_gbi classes? - # No, because some parsing involves reading C files, which is separate. - - # Assumes macros use variable names instead of values - mat = self.mat() - try: - if command.name == 'gsSPClipRatio': - mat.clip_ratio = math_eval(command.params[0], self.f3d) - elif command.name == 'gsSPNumLights': - self.numLights = self.getLightCount(command.name[1]) - elif command.name == 'gsSPLight': - self.setLight(dlData, command) - elif command.name == 'gsSPLightColor': - self.setLightColor(dlData, command) - elif command.name[:13] == 'gsSPSetLights': - self.setLights(dlData, command) - elif command.name == 'gsSPFogFactor': - pass - elif command.name == 'gsSPFogPosition': - mat.fog_position = [math_eval(command.params[0], self.f3d), math_eval(command.params[1], self.f3d)] - mat.set_fog = True - elif command.name == 'gsSPTexture' or command.name == 'gsSPTextureL': - mat.tex_scale = [math_eval(command.params[0], self.f3d) / (2**16), math_eval(command.params[1], self.f3d) / (2**16)] - elif command.name == 'gsSPSetGeometryMode': - self.setGeoFlags(command, True) - elif command.name == 'gsSPClearGeometryMode': - self.setGeoFlags(command, False) - elif command.name == 'gsSPLoadGeometryMode': - self.loadGeoFlags(command) - elif command.name == 'gsSPSetOtherMode': - self.setOtherModeFlags(command) - elif command.name == 'gsDPPipelineMode': - mat.rdp_settings.g_mdsft_pipeline = command.params[0] - elif command.name == 'gsDPSetCycleType': - mat.rdp_settings.g_mdsft_cycletype = command.params[0] - elif command.name == 'gsDPSetTexturePersp': - mat.rdp_settings.g_mdsft_textpersp = command.params[0] - elif command.name == 'gsDPSetTextureDetail': - mat.rdp_settings.g_mdsft_textdetail = command.params[0] - elif command.name == 'gsDPSetTextureLOD': - mat.rdp_settings.g_mdsft_textlod = command.params[0] - elif command.name == 'gsDPSetTextureLUT': - self.setTLUTMode(0, command.params[0]) - self.setTLUTMode(1, command.params[0]) - elif command.name == 'gsDPSetTextureFilter': - mat.rdp_settings.g_mdsft_text_filt = command.params[0] - elif command.name == 'gsDPSetTextureConvert': - mat.rdp_settings.g_mdsft_textconv = command.params[0] - elif command.name == 'gsDPSetCombineKey': - mat.rdp_settings.g_mdsft_combkey = command.params[0] - elif command.name == 'gsDPSetColorDither': - mat.rdp_settings.g_mdsft_color_dither = command.params[0] - elif command.name == 'gsDPSetAlphaDither': - mat.rdp_settings.g_mdsft_alpha_dither = command.params[0] - elif command.name == 'gsDPSetAlphaCompare': - mat.rdp_settings.g_mdsft_alpha_compare = command.params[0] - elif command.name == 'gsDPSetDepthSource': - mat.rdp_settings.g_mdsft_zsrcsel = command.params[0] - elif command.name == 'gsDPSetRenderMode': - flags = math_eval(command.params[0] + " | " + command.params[1], self.f3d) - self.setRenderMode(flags) - elif command.name == 'gsDPSetTextureImage': - # Are other params necessary? - # The params are set in SetTile commands. - self.currentTextureName = command.params[3] - elif command.name == 'gsDPSetCombineMode': - self.setCombineMode(command) - elif command.name == 'gsDPSetCombineLERP': - self.setCombineLerp(command.params[0:8], command.params[8:16]) - elif command.name == 'gsDPSetEnvColor': - mat.env_color = self.gammaInverseParam(command.params) - mat.set_env = True - elif command.name == 'gsDPSetBlendColor': - mat.blend_color = self.gammaInverseParam(command.params) - mat.set_blend = True - elif command.name == 'gsDPSetFogColor': - mat.fog_color = self.gammaInverseParam(command.params) - mat.set_fog = True - elif command.name == 'gsDPSetFillColor': - pass - elif command.name == 'gsDPSetPrimDepth': - pass - elif command.name == 'gsDPSetPrimColor': - mat.prim_lod_min = math_eval(command.params[0], self.f3d) / 255 - mat.prim_lod_frac = math_eval(command.params[1], self.f3d) / 255 - mat.prim_color = self.gammaInverseParam(command.params[2:6]) - mat.set_prim = True - elif command.name == 'gsDPSetOtherMode': - print("gsDPSetOtherMode not handled.") - elif command.name == 'DPSetConvert': - mat.set_k0_5 = True - for i in range(6): - setattr(mat, 'k' + str(i), gammaInverseValue(math_eval(command.params[i], self.f3d) / 255)) - elif command.name == 'DPSetKeyR': - mat.set_key = True - elif command.name == 'DPSetKeyGB': - mat.set_key = True - else: - self.materialChanged = prevMaterialChangedStatus - - # Texture Commands - # Assume file texture load - # SetTextureImage -> Load command -> Set Tile (0 or 1) - - if command.name == 'gsDPSetTileSize': - self.setTileSize(command.params) - elif command.name == 'gsDPLoadTile': - self.loadTile(command.params) - elif command.name == 'gsDPSetTile': - self.setTile(command.params, dlData) - elif command.name == 'gsDPLoadBlock': - self.loadTile(command.params) - elif command.name == 'gsDPLoadTLUTCmd': - self.loadTLUT(command.params, dlData) - - # This all ignores S/T high/low values - # This is pretty bad/confusing - elif command.name[:len("gsDPLoadTextureBlock")] == 'gsDPLoadTextureBlock': - is4bit = '4b' in command.name - if is4bit: - self.loadMultiBlock([command.params[0]] + [0, "G_TX_RENDERTILE"] + \ - [command.params[1], "G_IM_SIZ_4b"] + command.params[2:], dlData, True) - else: - self.loadMultiBlock([command.params[0]] + [0, "G_TX_RENDERTILE"] + \ - command.params[1:], dlData, False) - elif command.name[:len("gsDPLoadMultiBlock")] == 'gsDPLoadMultiBlock': - is4bit = '4b' in command.name - if is4bit: - self.loadMultiBlock(command.params[:4] + ["G_IM_SIZ_4b"] + command.params[4:], dlData, True) - else: - self.loadMultiBlock(command.params, dlData, False) - elif command.name[:len("gsDPLoadTextureTile")] == 'gsDPLoadTextureTile': - is4bit = '4b' in command.name - if is4bit: - self.loadMultiBlock([command.params[0]] + [0, "G_TX_RENDERTILE"] +\ - [command.params[1], "G_IM_SIZ_4b"] + command.params[2:4] + \ - command.params[9:], '4b', dlData, True) - else: - self.loadMultiBlock([command.params[0]] + [0, "G_TX_RENDERTILE"] +\ - command.params[1:5] + command.params[9:], '4b', dlData, False) - elif command.name[:len("gsDPLoadMultiTile")] == 'gsDPLoadMultiTile': - is4bit = '4b' in command.name - if is4bit: - self.loadMultiBlock(command.params[:4] + ["G_IM_SIZ_4b"] + command.params[4:6] +\ - command.params[10:], dlData, True) - else: - self.loadMultiBlock(command.params[:7] + command.params[11:], dlData, False) - - # TODO: Only handles palettes at tmem = 256 - elif command.name == "gsDPLoadTLUT_pal16": - self.loadTLUTPal(command.params[1], dlData, 15) - elif command.name == "gsDPLoadTLUT_pal256": - self.loadTLUTPal(command.params[0], dlData, 255) - else: - pass - - except TypeError as e: - print(traceback.format_exc()) - #raise Exception(e) - #print(e) - - # Don't use currentCommandList because some commands may change that - if len(callStack) > 0: - callStack[-1].index += 1 - - # override this to handle game specific DL calls. - # return None to indicate DL call should be skipped. - def processDLName(self, name): - return name - - def createMesh(self, obj, removeDoubles, importNormals): - mesh = obj.data - if len(self.verts) % 3 != 0: - print(len(self.verts)) - raise PluginError("Number of verts in mesh not divisible by 3, currently " + str(len(self.verts))) - - triangleCount = int(len(self.verts) / 3) - verts = [f3dVert[0] for f3dVert in self.verts] - faces = [[3 * i + j for j in range(3)] for i in range(triangleCount)] - print("Vertices: " + str(len(self.verts)) + ", Triangles: " + str(triangleCount)) - - mesh.from_pydata(vertices = verts, edges = [], faces = faces) - uv_layer = mesh.uv_layers.new().data - #if self.materialContext.f3d_mat.rdp_settings.g_lighting: - color_layer = mesh.vertex_colors.new(name = "Col").data - alpha_layer = mesh.vertex_colors.new(name = "Alpha").data - #else: - - if importNormals: - mesh.use_auto_smooth = True - mesh.normals_split_custom_set([f3dVert[3] for f3dVert in self.verts]) - - for groupName, indices in self.limbGroups.items(): - group = obj.vertex_groups.new(name = self.limbToBoneName[groupName]) - group.add(indices, 1, "REPLACE") - - for i in range(len(mesh.polygons)): - mesh.polygons[i].material_index = self.triMatIndices[i] - - for i in range(len(mesh.loops)): - # This should be okay, since we aren't trying to optimize vertices - # There will be one loop for every vertex - uv_layer[i].uv = self.verts[i][1] - - #if self.materialContext.f3d_mat.rdp_settings.g_lighting: - color_layer[i].color = self.verts[i][2] - alpha_layer[i].color = [self.verts[i][2][3]] * 3 + [1] - - if bpy.context.mode != "OBJECT": - bpy.ops.object.mode_set(mode = "OBJECT") - bpy.ops.object.select_all(action = "DESELECT") - obj.select_set(True) - bpy.context.view_layer.objects.active = obj - - for material in self.materials: - obj.data.materials.append(material) - if not importNormals: - bpy.ops.object.shade_smooth() - if removeDoubles: - bpy.ops.object.mode_set(mode = "EDIT") - bpy.ops.mesh.select_all(action = "SELECT") - bpy.ops.mesh.remove_doubles() - bpy.ops.object.mode_set(mode = "OBJECT") - - bpy.data.materials.remove(self.materialContext) - - obj.location = bpy.context.scene.cursor.location - - i = 0 - for key, lightObj in self.lightData.items(): - lightObj.location = bpy.context.scene.cursor.location + mathutils.Vector((i,0,0)) - i += 1 + def __init__(self, f3d, basePath, materialContext): + self.f3d = f3d + self.vertexBuffer = [None] * f3d.vert_load_size + self.basePath = basePath + self.materialContext = materialContext + + self.clearMaterial() + mat = self.mat() + mat.set_combiner = False + + self.materials = [] # saved materials + self.triMatIndices = [] # material indices per triangle + self.materialChanged = True + self.lastMaterialIndex = None + + self.vertexData = {} # c name : parsed data + self.textureData = {} # c name : blender texture + + self.tlutAppliedTextures = [] # c name + self.currentTextureName = None + + # This macro has all the tile setting properties, so we reuse it + self.tileSettings = [ + DPSetTile( + "G_IM_FMT_RGBA", + "G_IM_SIZ_16b", + 5, + 0, + i, + 0, + [False, False], + 0, + 0, + [False, False], + 0, + 0, + ) + for i in range(8) + ] + self.tileSizes = [DPSetTileSize(i, 0, 0, 32, 32) for i in range(8)] + + # When a tile is loaded, store dict of tmem : texture + self.tmemDict = {} + + # This should be modified before parsing f3d + self.matrixData = {} # bone name : matrix + self.currentTransformName = None + self.limbToBoneName = ( + {} + ) # limb name (c variable) : bone name (blender vertex group) + + # data for Mesh.from_pydata, list of BufferVertex tuples + # use BufferVertex to also form uvs / normals / colors + self.verts = [] + self.limbGroups = {} # dict of groupName : vertex indices + + self.lights = Lights("lights_context") + self.lights.l = [ + Light([0, 0, 0], [0x28, 0x28, 0x28]), + Light([0, 0, 0], [0x28, 0x28, 0x28]), + Light([0, 0, 0], [0x28, 0x28, 0x28]), + Light([0, 0, 0], [0x28, 0x28, 0x28]), + Light([0, 0, 0], [0x28, 0x28, 0x28]), + Light([0, 0, 0], [0x28, 0x28, 0x28]), + Light([0, 0, 0], [0x28, 0x28, 0x28]), + ] + self.lights.a = Ambient([0, 0, 0]) + self.numLights = 0 + self.lightData = {} # (color, normal) : list of blender light objects + + # MAKE SURE TO CALL THIS BETWEEN parseF3D() CALLS + def clearMaterial(self): + mat = self.mat() + + mat.rdp_settings.sets_rendermode = False + mat.set_prim = False + mat.set_lights = False + mat.set_env = False + mat.set_blend = False + mat.set_key = False + mat.set_k0_5 = False + + mat.prim_color = [1, 1, 1, 1] + mat.env_color = [1, 1, 1, 1] + mat.blend_color = [1, 1, 1, 1] + for i in range(1, 8): + setattr(mat, "f3d_light" + str(i), None) + mat.tex0.tex = None + mat.tex1.tex = None + mat.tex0.tex_set = False + mat.tex1.tex_set = False + + mat.tex0.tex_format = "RGBA16" + mat.tex1.tex_format = "RGBA16" + + self.tmemDict = {} + + self.tileSettings = [ + DPSetTile( + "G_IM_FMT_RGBA", + "G_IM_SIZ_16b", + 5, + 0, + i, + 0, + [False, False], + 0, + 0, + [False, False], + 0, + 0, + ) + for i in range(8) + ] + + self.tileSizes = [DPSetTileSize(i, 0, 0, 32, 32) for i in range(8)] + + self.lights = Lights("lights_context") + self.lights.l = [ + Light([0, 0, 0], [0x28, 0x28, 0x28]), + Light([0, 0, 0], [0x28, 0x28, 0x28]), + Light([0, 0, 0], [0x28, 0x28, 0x28]), + Light([0, 0, 0], [0x28, 0x28, 0x28]), + Light([0, 0, 0], [0x28, 0x28, 0x28]), + Light([0, 0, 0], [0x28, 0x28, 0x28]), + Light([0, 0, 0], [0x28, 0x28, 0x28]), + ] + self.lights.a = Ambient([0, 0, 0]) + self.numLights = 0 + + mat.presetName = "Custom" + + def mat(self): + return self.materialContext.f3d_mat + + def vertexFormatPatterns(self, data): + # position, uv, color/normal + return [ + # decomp format + "\{\s*\{\s*" + + "\{([^,\}]*),([^,\}]*),([^,\}]*)\}\s*," + + "[^,\}]*,\s*" + + "\{([^,\}]*),([^,\}]*)\}\s*,\s*" + + "\{([^,\}]*),([^,\}]*),([^,\}]*),([^,\}]*)\}\s*" + + "\}\s*\}", + # nusys format + "\{\s*" + + "([^,\}]*),([^,\}]*),([^,\}]*)," + + "[^,\}]*," + + "([^,\}]*),([^,\}]*)," + + "([^,\}]*),([^,\}]*),([^,\}]*),([^,\}]*)\s*" + + "\}", + ] + + # For game specific instance, override this to be able to identify which verts belong to which bone. + def setCurrentTransform(self, name): + self.currentTransformName = name + + def getTransformedVertex(self, index): + bufferVert = self.vertexBuffer[index] + + # NOTE: The groupIndex here does NOT correspond to a vertex group, but to the name of the limb (c variable) + matrixName = bufferVert.groupIndex + if matrixName in self.matrixData: + transform = self.matrixData[matrixName] + else: + print(self.matrixData) + raise PluginError("Transform matrix not specified for " + matrixName) + + mat = self.mat() + f3dVert = bufferVert.f3dVert + position = transform @ mathutils.Vector(f3dVert[0]) + if mat.tex0.tex is not None: + uv = [convertF3DUV(f3dVert[1][i], mat.tex0.tex.size[i]) for i in range(2)] + # uv = [1 - (f3dVert[1][i] / (self.materialContext.f3d_mat.tex0.tex.size[i] * 32)) for i in range(2)] + # uv = [((f3dVert[1][i] / 32) + 0.5) / mat.tex0.tex.size[i] for i in range(2)] + else: + uv = [convertF3DUV(f3dVert[1][i], 32) for i in range(2)] + # uv = [1 - (f3dVert[1][i] / (32 * 32)) for i in range(2)] + # uv = [((f3dVert[1][i] / 32) + 0.5) / 32 for i in range(2)] + uv[1] = 1 - uv[1] + + color = [ + value / 256 + if value > 0 + else int.from_bytes( + value.to_bytes(1, "big", signed=True), "big", signed=False + ) + / 256 + for value in f3dVert[2] + ] + + normal = bytesToNormal(f3dVert[2][:3]) + [0] + normal = ( + transform.inverted().transposed() @ mathutils.Vector(normal) + ).normalized()[:3] + + # This is not usual format of f3dVert, but we need separate color/normal data. + # NOTE: The groupIndex here does NOT correspond to a vertex group, but to the name of the limb (c variable) + return BufferVertex( + [position, uv, color, normal], + bufferVert.groupIndex, + bufferVert.materialIndex, + ) + + def addVertices(self, num, start, vertexDataName, vertexDataOffset): + vertexData = self.vertexData[vertexDataName] + + # TODO: material index not important? + count = math_eval(num, self.f3d) + start = math_eval(start, self.f3d) + + if start + count > len(self.vertexBuffer): + raise PluginError( + "Vertex buffer of size " + + len(self.vertexBuffer) + + " too small, attempting load into " + + str(start) + + ", " + + str(start + count) + ) + for i in range(count): + self.vertexBuffer[start + i] = BufferVertex( + vertexData[vertexDataOffset + i], self.currentTransformName, 0 + ) + + def addTriangle(self, indices, dlData): + if self.materialChanged: + mat = self.mat() + region = None + + tileSettings = self.tileSettings[0] + tileSizeSettings = self.tileSizes[0] + if tileSettings.tmem in self.tmemDict: + textureName = self.tmemDict[tileSettings.tmem] + self.loadTexture(dlData, textureName, region, tileSettings, False) + self.applyTileToMaterial(0, tileSettings, tileSizeSettings) + + tileSettings = self.tileSettings[1] + tileSizeSettings = self.tileSizes[1] + if tileSettings.tmem in self.tmemDict: + textureName = self.tmemDict[tileSettings.tmem] + self.loadTexture(dlData, textureName, region, tileSettings, False) + self.applyTileToMaterial(1, tileSettings, tileSizeSettings) + + self.applyLights() + + self.lastMaterialIndex = self.getMaterialIndex() + self.materialChanged = False + + verts = [ + self.getTransformedVertex(math_eval(index, self.f3d)) for index in indices + ] + # if verts[0].groupIndex != verts[1].groupIndex or\ + # verts[0].groupIndex != verts[2].groupIndex or\ + # verts[2].groupIndex != verts[1].groupIndex: + # return + for i in range(len(verts)): + vert = verts[i] + + # NOTE: The groupIndex here does NOT correspond to a vertex group, but to the name of the limb (c variable) + if vert.groupIndex not in self.limbGroups: + self.limbGroups[vert.groupIndex] = [] + self.limbGroups[vert.groupIndex].append(len(self.verts) + i) + self.verts.extend([vert.f3dVert for vert in verts]) + + for i in range(int(len(indices) / 3)): + self.triMatIndices.append(self.lastMaterialIndex) + + def getMaterialIndex(self): + # We do this for now to update tile settings for S and T. + # Right now we don't handle those, so we need the auto-calculator to set it correctly. + overrideContext = bpy.context.copy() + overrideContext["material"] = self.materialContext + bpy.ops.material.update_f3d_nodes(overrideContext) + + for material in self.materials: + if propertyGroupEquals(self.materialContext.f3d_mat, material.f3d_mat): + return self.materials.index(material) + + self.addMaterial() + return len(self.materials) - 1 + + def getImageName(self, image): + for name, otherImage in self.textureData.items(): + if image == otherImage: + return name + return None + + def applyTLUTToIndex(self, index): + mat = self.mat() + texProp = getattr(mat, "tex" + str(index)) + combinerUses = all_combiner_uses(mat) + if ( + combinerUses["Texture " + str(index)] + and (texProp.tex is not None or texProp.use_tex_reference) + and texProp.tex_set + and texProp.tex_format[:2] == "CI" + and ( + texProp.tex not in self.tlutAppliedTextures or texProp.use_tex_reference + ) + ): + + # Only handles TLUT at 256 + tlutName = self.tmemDict[256] + if 256 in self.tmemDict and tlutName is not None: + tlut = self.textureData[tlutName] + if isinstance(tlut, F3DTextureReference) or texProp.use_tex_reference: + if not texProp.use_tex_reference: + texProp.use_tex_reference = True + imageName = self.getImageName(texProp.tex) + if imageName is not None: + texProp.tex_reference = imageName + else: + print("Cannot find name of texture " + str(texProp.tex)) + + if isinstance(tlut, F3DTextureReference): + texProp.pal_reference = tlut.name + texProp.pal_reference_size = tlut.width + else: + texProp.pal_reference = tlutName + texProp.pal_reference_size = min( + tlut.size[0] * tlut.size[1], 256 + ) + + else: + self.applyTLUT(texProp.tex, tlut) + self.tlutAppliedTextures.append(texProp.tex) + else: + print("Ignoring TLUT.") + + def postMaterialChanged(self): + return + + def addMaterial(self): + mat = self.mat() + combinerUses = all_combiner_uses(self.mat()) + self.applyTLUTToIndex(0) + self.applyTLUTToIndex(1) + + material = self.materialContext.copy() + overrideContext = bpy.context.copy() + overrideContext["material"] = material + bpy.ops.material.update_f3d_nodes(overrideContext) + self.materials.append(material) + self.materialChanged = False + + self.postMaterialChanged() + + def getSizeMacro(self, size, suffix): + if hasattr(self.f3d, size): + return getattr(self.f3d, size + suffix) + else: + return getattr(self.f3d, self.f3d.IM_SIZ[size] + suffix) + + def getImagePathFromInclude(self, path): + if self.basePath is None: + raise PluginError( + "Cannot load texture from " + path + " without any provided base path." + ) + + imagePath = path[:-5] + "png" + return os.path.join(self.basePath, imagePath) + + def getVTXPathFromInclude(self, path): + if self.basePath is None: + raise PluginError( + "Cannot load VTX from " + path + " without any provided base path." + ) + return os.path.join(self.basePath, path) + + def setGeoFlags(self, command, value): + mat = self.mat() + bitFlags = math_eval(command.params[0], self.f3d) + + if bitFlags & self.f3d.G_ZBUFFER: + mat.rdp_settings.g_zbuffer = value + if bitFlags & self.f3d.G_SHADE: + mat.rdp_settings.g_shade = value + if bitFlags & self.f3d.G_CULL_FRONT: + mat.rdp_settings.g_cull_front = value + if bitFlags & self.f3d.G_CULL_BACK: + mat.rdp_settings.g_cull_back = value + if bitFlags & self.f3d.G_FOG: + mat.rdp_settings.g_fog = value + if bitFlags & self.f3d.G_LIGHTING: + mat.rdp_settings.g_lighting = value + if bitFlags & self.f3d.G_TEXTURE_GEN: + mat.rdp_settings.g_tex_gen = value + if bitFlags & self.f3d.G_TEXTURE_GEN_LINEAR: + mat.rdp_settings.g_tex_gen_linear = value + if bitFlags & self.f3d.G_SHADING_SMOOTH: + mat.rdp_settings.g_shade_smooth = value + if bitFlags & self.f3d.G_CLIPPING: + mat.rdp_settings.g_clipping = value + + def loadGeoFlags(self, command): + mat = self.mat() + + bitFlags = math_eval(command.params[0], self.f3d) + + mat.rdp_settings.g_zbuffer = bitFlags & self.f3d.G_ZBUFFER != 0 + mat.rdp_settings.g_shade = bitFlags & self.f3d.G_SHADE != 0 + mat.rdp_settings.g_cull_front = bitFlags & self.f3d.G_CULL_FRONT != 0 + mat.rdp_settings.g_cull_back = bitFlags & self.f3d.G_CULL_BACK != 0 + mat.rdp_settings.g_fog = bitFlags & self.f3d.G_FOG != 0 + mat.rdp_settings.g_lighting = bitFlags & self.f3d.G_LIGHTING != 0 + mat.rdp_settings.g_tex_gen = bitFlags & self.f3d.G_TEXTURE_GEN != 0 + mat.rdp_settings.g_tex_gen_linear = ( + bitFlags & self.f3d.G_TEXTURE_GEN_LINEAR != 0 + ) + mat.rdp_settings.g_shade_smooth = bitFlags & self.f3d.G_SHADING_SMOOTH != 0 + mat.rdp_settings.g_clipping = bitFlags & self.f3d.G_CLIPPING != 0 + + def setCombineLerp(self, lerp0, lerp1): + mat = self.mat() + + if len(lerp0) < 8 or len(lerp1) < 8: + print("Incorrect combiner param count: " + str(lerp0) + " " + str(lerp1)) + return + + lerp0 = [value.strip() for value in lerp0] + lerp1 = [value.strip() for value in lerp1] + + # Padding since index can go up to 31 + combinerAList = [ + "COMBINED", + "TEXEL0", + "TEXEL1", + "PRIMITIVE", + "SHADE", + "ENVIRONMENT", + "1", + "NOISE", + ] + ["0"] * 24 + combinerBList = [ + "COMBINED", + "TEXEL0", + "TEXEL1", + "PRIMITIVE", + "SHADE", + "ENVIRONMENT", + "CENTER", + "K4", + ] + ["0"] * 24 + combinerCList = [ + "COMBINED", + "TEXEL0", + "TEXEL1", + "PRIMITIVE", + "SHADE", + "ENVIRONMENT", + "SCALE", + "COMBINED_ALPHA", + "TEXEL0_ALPHA", + "TEXEL1_ALPHA", + "PRIMITIVE_ALPHA", + "SHADE_ALPHA", + "ENV_ALPHA", + "LOD_FRACTION", + "PRIM_LOD_FRAC", + "K5", + ] + ["0"] * 16 + combinerDList = [ + "COMBINED", + "TEXEL0", + "TEXEL1", + "PRIMITIVE", + "SHADE", + "ENVIRONMENT", + "1", + "0", + ] + ["0"] * 24 + + combinerAAlphaList = [ + "COMBINED", + "TEXEL0", + "TEXEL1", + "PRIMITIVE", + "SHADE", + "ENVIRONMENT", + "1", + "0", + ] + combinerBAlphaList = [ + "COMBINED", + "TEXEL0", + "TEXEL1", + "PRIMITIVE", + "SHADE", + "ENVIRONMENT", + "1", + "0", + ] + combinerCAlphaList = [ + "LOD_FRACTION", + "TEXEL0", + "TEXEL1", + "PRIMITIVE", + "SHADE", + "ENVIRONMENT", + "PRIM_LOD_FRAC", + "0", + ] + combinerDAlphaList = [ + "COMBINED", + "TEXEL0", + "TEXEL1", + "PRIMITIVE", + "SHADE", + "ENVIRONMENT", + "1", + "0", + ] + + for i in range(0, 4): + lerp0[i] = math_eval("G_CCMUX_" + lerp0[i], self.f3d) + lerp1[i] = math_eval("G_CCMUX_" + lerp1[i], self.f3d) + + for i in range(4, 8): + lerp0[i] = math_eval("G_ACMUX_" + lerp0[i], self.f3d) + lerp1[i] = math_eval("G_ACMUX_" + lerp1[i], self.f3d) + + mat.set_combiner = True + mat.combiner1.A = combinerAList[lerp0[0]] + mat.combiner1.B = combinerBList[lerp0[1]] + mat.combiner1.C = combinerCList[lerp0[2]] + mat.combiner1.D = combinerDList[lerp0[3]] + mat.combiner1.A_alpha = combinerAAlphaList[lerp0[4]] + mat.combiner1.B_alpha = combinerBAlphaList[lerp0[5]] + mat.combiner1.C_alpha = combinerCAlphaList[lerp0[6]] + mat.combiner1.D_alpha = combinerDAlphaList[lerp0[7]] + + mat.combiner2.A = combinerAList[lerp1[0]] + mat.combiner2.B = combinerBList[lerp1[1]] + mat.combiner2.C = combinerCList[lerp1[2]] + mat.combiner2.D = combinerDList[lerp1[3]] + mat.combiner2.A_alpha = combinerAAlphaList[lerp1[4]] + mat.combiner2.B_alpha = combinerBAlphaList[lerp1[5]] + mat.combiner2.C_alpha = combinerCAlphaList[lerp1[6]] + mat.combiner2.D_alpha = combinerDAlphaList[lerp1[7]] + + def setCombineMode(self, command): + if not hasattr(self.f3d, command.params[0]) or not hasattr( + self.f3d, command.params[1] + ): + print( + "Unhandled combiner mode: " + + command.params[0] + + ", " + + command.params[1] + ) + return + lerp0 = getattr(self.f3d, command.params[0]) + lerp1 = getattr(self.f3d, command.params[1]) + + self.setCombineLerp(lerp0, lerp1) + + def setTLUTMode(self, index, value): + mat = self.mat() + texProp = getattr(mat, "tex" + str(index)) + bitData = math_eval(value, self.f3d) + if value == self.f3d.G_TT_NONE: + if texProp.tex_format[:2] == "CI": + texProp.tex_format = "RGBA16" + elif value == self.f3d.G_TT_IA16: + texProp.ci_format = "IA16" + else: + texProp.ci_format = "RGBA16" + + def setOtherModeFlags(self, command): + mat = self.mat() + mode = math_eval(command.params[0], self.f3d) + if mode == self.f3d.G_SETOTHERMODE_H: + self.setOtherModeFlagsH(command) + else: + self.setOtherModeFlagsL(command) + + def setOtherModeFlagsH(self, command): + + otherModeH = { + "G_MDSFT_ALPHADITHER": [ + "G_AD_PATTERN", + "G_AD_NOTPATTERN", + "G_AD_NOISE", + "G_AD_DISABLE", + ], + "G_MDSFT_RGBDITHER": ["G_CD_MAGICSQ", "G_CD_BAYER", "NOISE"], + "G_MDSFT_COMBKEY": ["G_CK_NONE", "G_CK_KEY"], + "G_MDSFT_TEXTCONV": [ + "G_TC_CONV", + "G_TC_CONV", + "G_TC_CONV", + "G_TC_CONV", + "G_TC_CONV", + "G_TC_FILTCONV", + "G_TC_FILT", + ], + "G_MDSFT_TEXTFILT": [ + "G_TF_POINT", + "G_TF_POINT", + "G_TF_BILERP", + "G_TF_AVERAGE", + ], + "G_MDSFT_TEXTLOD": ["G_TL_TILE", "G_TL_LOD"], + "G_MDSFT_TEXTDETAIL": ["G_TD_CLAMP", "G_TD_SHARPEN", "G_TD_DETAIL"], + "G_MDSFT_TEXTPERSP": ["G_TP_NONE", "G_TP_PERSP"], + "G_MDSFT_CYCLETYPE": [ + "G_CYC_1CYCLE", + "G_CYC_2CYCLE", + "G_CYC_COPY", + "G_CYC_FILL", + ], + "G_MDSFT_COLORDITHER": ["G_CD_MAGICSQ", "G_CD_BAYER", "G_CD_NOISE"], + "G_MDSFT_PIPELINE": ["G_PM_NPRIMITIVE", "G_PM_1PRIMITIVE"], + } + mat = self.mat() + flags = math_eval(command.params[3], self.f3d) + shift = math_eval(command.params[1], self.f3d) + mask = math_eval(command.params[2], self.f3d) + + for field, fieldData in otherModeH.items(): + fieldShift = getattr(self.f3d, field) + if fieldShift >= shift and fieldShift < shift + mask: + setattr( + mat.rdp_settings, + field.lower(), + fieldData[ + (flags >> fieldShift) + & ((1 << int(ceil(math.log(len(fieldData), 2)))) - 1) + ], + ) + + # This only handles commonly used render mode presets (with macros), + # and no render modes at all with raw bit data. + def setOtherModeFlagsL(self, command): + otherModeL = { + "G_MDSFT_ALPHACOMPARE": [ + "G_AC_NONE", + "G_AC_THRESHOLD", + "G_AC_THRESHOLD", + "G_AC_DITHER", + ], + "G_MDSFT_ZSRCSEL": ["G_ZS_PIXEL", "G_ZS_PRIM"], + } + + mat = self.mat() + flags = math_eval(command.params[3], self.f3d) + shift = math_eval(command.params[1], self.f3d) + mask = math_eval(command.params[2], self.f3d) + + for field, fieldData in otherModeL.items(): + fieldShift = getattr(self.f3d, field) + if fieldShift >= shift and fieldShift < shift + mask: + setattr( + mat.rdp_settings, + field.lower(), + fieldData[ + (flags >> fieldShift) + & ((1 << int(ceil(math.log(len(fieldData), 2)))) - 1) + ], + ) + + if ( + self.f3d.G_MDSFT_RENDERMODE >= shift + and self.f3d.G_MDSFT_RENDERMODE < shift + mask + ): + self.setRenderMode(flags) + + def setRenderMode(self, flags): + mat = self.mat() + rendermode1 = renderModeMask(flags, 1, False) + rendermode2 = renderModeMask(flags, 2, False) + + blend1 = renderModeMask(flags, 1, True) + + rendermodeName1 = None + rendermodeName2 = None + + # print("Render mode: " + hex(rendermode1) + ", " + hex(rendermode2)) + for name, value in vars(self.f3d).items(): + if name[:5] == "G_RM_": + # print(name + " " + hex(value)) + + if name in ["G_RM_FOG_SHADE_A", "G_RM_FOG_PRIM_A", "G_RM_PASS"]: + if blend1 == value: + rendermodeName1 = name + else: + if rendermode1 == value: + rendermodeName1 = name + if rendermode2 == value: + rendermodeName2 = name + if rendermodeName1 is not None and rendermodeName2 is not None: + break + + mat.rdp_settings.sets_rendermode = True + if rendermodeName1 is not None and rendermodeName2 is not None: + mat.rdp_settings.rendermode_advanced_enabled = False + mat.rdp_settings.rendermode_preset_cycle_1 = rendermodeName1 + mat.rdp_settings.rendermode_preset_cycle_2 = rendermodeName2 + else: + mat.rdp_settings.rendermode_advanced_enabled = True + + mat.rdp_settings.aa_en = rendermode1 & self.f3d.AA_EN != 0 + mat.rdp_settings.z_cmp = rendermode1 & self.f3d.Z_CMP != 0 + mat.rdp_settings.z_upd = rendermode1 & self.f3d.Z_UPD != 0 + mat.rdp_settings.im_rd = rendermode1 & self.f3d.IM_RD != 0 + mat.rdp_settings.clr_on_cvg = rendermode1 & self.f3d.CLR_ON_CVG != 0 + mat.rdp_settings.cvg_dst = self.f3d.cvgDstDict[ + rendermode1 & self.f3d.CVG_DST_SAVE + ] + mat.rdp_settings.zmode = self.f3d.zmodeDict[rendermode1 & self.f3d.ZMODE_DEC] + mat.rdp_settings.cvg_x_alpha = rendermode1 & self.f3d.CVG_X_ALPHA != 0 + mat.rdp_settings.alpha_cvg_sel = rendermode1 & self.f3d.ALPHA_CVG_SEL != 0 + mat.rdp_settings.force_bl = rendermode1 & self.f3d.FORCE_BL != 0 + + mat.rdp_settings.blend_p1 = self.f3d.blendColorDict[rendermode1 >> 30 & 3] + mat.rdp_settings.blend_a1 = self.f3d.blendAlphaDict[rendermode1 >> 26 & 3] + mat.rdp_settings.blend_m1 = self.f3d.blendColorDict[rendermode1 >> 22 & 3] + mat.rdp_settings.blend_b1 = self.f3d.blendMixDict[rendermode1 >> 18 & 3] + + mat.rdp_settings.blend_p2 = self.f3d.blendColorDict[rendermode2 >> 28 & 3] + mat.rdp_settings.blend_a2 = self.f3d.blendAlphaDict[rendermode2 >> 24 & 3] + mat.rdp_settings.blend_m2 = self.f3d.blendColorDict[rendermode2 >> 20 & 3] + mat.rdp_settings.blend_b2 = self.f3d.blendMixDict[rendermode2 >> 16 & 3] + + def gammaInverseParam(self, color): + return [ + gammaInverseValue(math_eval(value, self.f3d) / 255) for value in color[:3] + ] + [math_eval(color[3], self.f3d) / 255] + + def getLightIndex(self, lightIndexString): + return ( + math_eval(lightIndexString, self.f3d) + if "LIGHT_" not in lightIndexString + else int(lightIndexString[-1:]) + ) + + def getLightCount(self, lightCountString): + return ( + math_eval(lightCountString, self.f3d) + if "NUMLIGHTS_" not in lightCountString + else int(lightCountString[-1:]) + ) + + def getLightObj(self, light): + lightKey = (tuple(light.color), tuple(light.normal)) + if lightKey not in self.lightData: + lightName = "Light" + bLight = bpy.data.lights.new(lightName, "SUN") + lightObj = bpy.data.objects.new(lightName, bLight) + + lightObj.rotation_euler = ( + mathutils.Euler((0, 0, math.pi)).to_quaternion() + @ ( + mathutils.Euler((math.pi / 2, 0, 0)).to_quaternion() + @ mathutils.Vector(light.normal) + ).rotation_difference(mathutils.Vector((0, 0, 1))) + ).to_euler() + # lightObj.rotation_euler[0] *= 1 + bLight.color = light.color + + bpy.context.scene.collection.objects.link(lightObj) + self.lightData[lightKey] = lightObj + return self.lightData[lightKey] + + def applyLights(self): + mat = self.mat() + allCombinerUses = all_combiner_uses(mat) + if allCombinerUses["Shade"] and mat.rdp_settings.g_lighting and mat.set_lights: + mat.use_default_lighting = False + mat.ambient_light_color = self.lights.a.color + ( + [1] if len(self.lights.a.color) == 3 else [] + ) + + for i in range(self.numLights): + lightObj = self.getLightObj(self.lights.l[i]) + setattr(mat, "f3d_light" + str(i + 1), lightObj.data) + + def setLightColor(self, data, command): + self.mat().set_lights = True + lightIndex = self.getLightIndex(command.params[0]) + colorData = math_eval(command.params[1], self.f3d) + color = [ + ((colorData >> 24) & 0xFF) / 0xFF, + ((colorData >> 16) & 0xFF) / 0xFF, + ((colorData >> 8) & 0xFF) / 0xFF, + ] + + if lightIndex != self.numLights + 1: + self.lights.l[lightIndex - 1].color = color + else: + self.lights.a.color = color + + # This is an assumption. + if self.numLights < lightIndex - 1: + self.numLights = lightIndex - 1 + + # Assumes that any SPLight references a Lights0-9n struct instead of specific Light structs. + def setLight(self, data, command): + mat = self.mat() + mat.set_lights = True + + lightReference = command.params[0] + lightIndex = self.getLightIndex(command.params[1]) + + match = re.search("([A-Za-z0-9\_]*)\.(l(\[([0-9])\])?)?(a)?", lightReference) + if match is None: + print( + "Could not handle parsing of light reference: " + + lightReference + + ". Currently only handling Lights0-9n structs (not Light)" + ) + return + + lightsName = match.group(1) + lights = self.createLights(data, lightsName) + + if match.group(2) is not None: + if match.group(3) is not None: + lightIndex = math_eval(match.group(4), self.f3d) + else: + lightIndex = 0 + + # This is done as an assumption, to handle models that have numLights set beforehand + if self.numLights < lightIndex + 1: + self.numLights = lightIndex + 1 + self.lights.l[lightIndex] = lights.l[lightIndex] + else: + self.lights.a = lights.a + + def setLights(self, data, command): + mat = self.mat() + self.mat().set_lights = True + + numLights = self.getLightCount(command.name[13]) + self.numLights = numLights + + lightsName = command.params[0] + self.lights = self.createLights(data, lightsName) + + def createLights(self, data, lightsName): + numLights, lightValues = parseLightsData(data, lightsName, self) + ambientColor = gammaInverse([value / 255 for value in lightValues[0:3]]) + + lightList = [] + + for i in range(numLights): + color = gammaInverse( + [value / 255 for value in lightValues[3 + 6 * i : 3 + 6 * i + 3]] + ) + direction = bytesToNormal(lightValues[3 + 6 * i + 3 : 3 + 6 * i + 6]) + lightList.append(Light(color, direction)) + + while len(lightList) < 7: + lightList.append(Light([0, 0, 0], [0x28, 0x28, 0x28])) + + # normally a and l are Ambient and Light objects, + # but here they will be a color and blender light object array. + lights = Lights(lightsName) + lights.a = Ambient(ambientColor) + lights.l = lightList + + return lights + + def getTileIndex(self, value): + if value == "G_TX_RENDERTILE": + return self.f3d.G_TX_RENDERTILE + elif value == "G_TX_LOADTILE": + return self.f3d.G_TX_LOADTILE + else: + return math_eval(value, self.f3d) + + def getTileSettings(self, value): + return self.tileSettings[self.getTileIndex(value)] + + def getTileSizeSettings(self, value): + return self.tileSizes[self.getTileIndex(value)] + + def setTileSize(self, params): + mat = self.mat() + tileSizeSettings = self.getTileSizeSettings(params[0]) + tileSettings = self.getTileSettings(params[0]) + + dimensions = [0, 0, 0, 0] + for i in range(1, 5): + # match = None + # if not isinstance(params[i], int): + # match = re.search("\(([0-9]+)\s*\-\s*1\s*\)\s*<<\s*G\_TEXTURE\_IMAGE\_FRAC", params[i]) + # if match is not None: + # dimensions[i - 1] = (math_eval(match.group(1), self.f3d) - 1) << self.f3d.G_TEXTURE_IMAGE_FRAC + # else: + # dimensions[i - 1] = math_eval(params[i], self.f3d) + dimensions[i - 1] = math_eval(params[i], self.f3d) + + tileSizeSettings.uls = dimensions[0] + tileSizeSettings.ult = dimensions[1] + tileSizeSettings.lrs = dimensions[2] + tileSizeSettings.lrt = dimensions[3] + + def setTile(self, params, dlData): + tileIndex = self.getTileIndex(params[4]) + tileSettings = self.getTileSettings(params[4]) + tileSettings.fmt = getTileFormat(params[0], self.f3d) + tileSettings.siz = getTileSize(params[1], self.f3d) + tileSettings.line = math_eval(params[2], self.f3d) + tileSettings.tmem = math_eval(params[3], self.f3d) + tileSettings.palette = math_eval(params[5], self.f3d) + tileSettings.cmt = getTileClampMirror(params[6], self.f3d) + tileSettings.maskt = getTileMask(params[7], self.f3d) + tileSettings.shifts = getTileShift(params[8], self.f3d) + tileSettings.cms = getTileClampMirror(params[9], self.f3d) + tileSettings.masks = getTileMask(params[10], self.f3d) + tileSettings.shifts = getTileShift(params[11], self.f3d) + + tileSizeSettings = self.getTileSizeSettings(params[4]) + + def loadTile(self, params): + tileSettings = self.getTileSettings(params[0]) + # TODO: Region parsing too hard? + # region = [ + # math_eval(params[1], self.f3d) / 4, + # math_eval(params[2], self.f3d) / 4, + # math_eval(params[3], self.f3d) / 4, + # math_eval(params[4], self.f3d) / 4 + # ] + region = None + + # Defer texture parsing until next set tile. + self.tmemDict[tileSettings.tmem] = self.currentTextureName + self.materialChanged = True + + def loadMultiBlock(self, params, dlData, is4bit): + width = math_eval(params[5], self.f3d) + height = math_eval(params[6], self.f3d) + siz = params[4] + line = ( + ((width * self.getSizeMacro(siz, "_LINE_BYTES")) + 7) >> 3 + if not is4bit + else ((width >> 1) + 7) >> 3 + ) + tmem = params[1] + tile = params[2] + loadBlockSiz = ( + self.getSizeMacro(siz, "_LOAD_BLOCK") + if not is4bit + else self.f3d.G_IM_SIZ_16b + ) + self.currentTextureName = params[0] + self.setTile( + [ + params[3], + loadBlockSiz, + 0, + tmem, + "G_TX_LOADTILE", + 0, + params[9], + params[11], + params[13], + params[8], + params[10], + params[12], + ], + dlData, + ) + # TODO: Region is ignored for now + self.loadTile(["G_TX_LOADTILE", 0, 0, 0, 0]) + self.setTile( + [ + params[3], + params[4], + line, + tmem, + tile, + 0, + params[9], + params[11], + params[13], + params[8], + params[10], + params[12], + ], + dlData, + ) + self.setTileSize( + [ + tile, + 0, + 0, + (width - 1) << self.f3d.G_TEXTURE_IMAGE_FRAC, + (height - 1) << self.f3d.G_TEXTURE_IMAGE_FRAC, + ] + ) + + def loadTLUTPal(self, name, dlData, count): + # TODO: Doesn't handle loading palettes into not tmem 256 + self.currentTextureName = name + self.setTile([0, 0, 0, 256, "G_TX_LOADTILE", 0, 0, 0, 0, 0, 0, 0], dlData) + self.loadTLUT(["G_TX_LOADTILE", count], dlData) + + def applyTileToMaterial(self, index, tileSettings, tileSizeSettings): + mat = self.mat() + + texProp = getattr(mat, "tex" + str(index)) + + name = self.tmemDict[tileSettings.tmem] + image = self.textureData[name] + if isinstance(image, F3DTextureReference): + texProp.tex = None + texProp.use_tex_reference = True + texProp.tex_reference = name + size = texProp.tex_reference_size + else: + texProp.tex = image + texProp.use_tex_reference = False + size = texProp.tex.size + texProp.tex_set = True + + # TODO: Handle low/high for image files? + if texProp.use_tex_reference: + # texProp.autoprop = False + # texProp.S.low = round(tileSizeSettings.uls / (2 ** self.f3d.G_TEXTURE_IMAGE_FRAC), 3) + # texProp.T.low = round(tileSizeSettings.ult / (2 ** self.f3d.G_TEXTURE_IMAGE_FRAC), 3) + # texProp.S.high = round(tileSizeSettings.lrs / (2 ** self.f3d.G_TEXTURE_IMAGE_FRAC), 3) + # texProp.T.high = round(tileSizeSettings.lrt / (2 ** self.f3d.G_TEXTURE_IMAGE_FRAC), 3) + + # WARNING: Inferring texture size from tile size. + texProp.tex_reference_size = [ + int( + round( + tileSizeSettings.lrs / (2 ** self.f3d.G_TEXTURE_IMAGE_FRAC) + 1 + ) + ), + int( + round( + tileSizeSettings.lrt / (2 ** self.f3d.G_TEXTURE_IMAGE_FRAC) + 1 + ) + ), + ] + + # if texProp.S.low == 0 and texProp.T.low == 0 and \ + # texProp.S.high == size[0] - 1 and \ + # (texProp.use_tex_reference or texProp.T.high == size[1] - 1): + # texProp.autoProp = True + # else: + # print(str(texProp.S.low) + " " + str(texProp.T.low) + " " + str(texProp.S.high) + " " + str(texProp.T.high)) + # print(str(size[0]-1) + " " + str(size[1]-1)) + + texProp.tex_format = tileSettings.fmt[8:].replace("_", "") + tileSettings.siz[ + 8:-1 + ].replace("_", "") + + texProp.S.clamp = tileSettings.cms[0] + texProp.S.mirror = tileSettings.cms[1] + + texProp.T.clamp = tileSettings.cmt[0] + texProp.T.mirror = tileSettings.cmt[1] + + # TODO: Handle S and T properties + + # Override this to handle game specific references. + def handleTextureName(self, textureName): + return textureName + + def loadTexture(self, data, name, region, tileSettings, isLUT): + textureName = self.handleTextureName(name) + + if textureName in self.textureData: + return self.textureData[textureName] + + # region ignored? + if isLUT: + siz = "G_IM_SIZ_16b" + width = 16 + else: + siz = tileSettings.siz + if siz == "G_IM_SIZ_4b": + width = (tileSettings.line * 8) * 2 + else: + width = int( + ceil( + (tileSettings.line * 8) + / self.f3d.G_IM_SIZ_VARS[siz + "_LINE_BYTES"] + ) + ) + + # TODO: Textures are sometimes loaded in with different dimensions than for rendering. + # This means width is incorrect? + image = parseTextureData( + data, + textureName, + self, + tileSettings.fmt, + siz, + width, + self.basePath, + isLUT, + self.f3d, + ) + + self.textureData[textureName] = image + return self.textureData[textureName] + + def loadTLUT(self, params, dlData): + tileSettings = self.getTileSettings(params[0]) + name = self.currentTextureName + textureName = self.handleTextureName(name) + self.tmemDict[tileSettings.tmem] = textureName + + tlut = self.loadTexture(dlData, textureName, [0, 0, 16, 16], tileSettings, True) + self.materialChanged = True + + def applyTLUT(self, image, tlut): + for i in range(int(len(image.pixels) / 4)): + lutIndex = int(round(image.pixels[4 * i] * 255)) + newValues = tlut.pixels[4 * lutIndex : 4 * (lutIndex + 1)] + if len(newValues) < 4: + print("Invalid lutIndex " + str(lutIndex)) + else: + image.pixels[4 * i : 4 * (i + 1)] = newValues + + def processCommands(self, dlData, dlName, dlCommands): + callStack = [F3DParsedCommands(dlName, dlCommands, 0)] + while len(callStack) > 0: + currentCommandList = callStack[-1] + command = currentCommandList.currentCommand() + + if currentCommandList.index >= len(currentCommandList.commands): + raise PluginError( + "Cannot handle unterminated static display lists: " + + currentCommandList.name + ) + elif len(callStack) > 2 ** 16: + raise PluginError( + "DL call stack larger than 2**16, assuming infinite loop: " + + currentCommandList.name + ) + + # print(command.name + " " + str(command.params)) + if command.name == "gsSPVertex": + vertexDataName, vertexDataOffset = getVertexDataStart( + command.params[0], self.f3d + ) + parseVertexData(dlData, vertexDataName, self) + self.addVertices( + command.params[1], + command.params[2], + vertexDataName, + vertexDataOffset, + ) + elif command.name == "gsSPMatrix": + self.setCurrentTransform(command.params[0]) + elif command.name == "gsSPPopMatrix": + print("gsSPPopMatrix not handled.") + elif command.name == "gsSP1Triangle": + self.addTriangle(command.params[0:3], dlData) + elif command.name == "gsSP2Triangles": + self.addTriangle(command.params[0:3] + command.params[4:7], dlData) + elif command.name == "gsSPDisplayList" or command.name[:10] == "gsSPBranch": + newDLName = self.processDLName(command.params[0]) + if newDLName is not None: + newDLCommands = parseDLData(dlData, newDLName) + # Use -1 index so that it will be incremented to 0 at end of loop + parsedCommands = F3DParsedCommands(newDLName, newDLCommands, -1) + if command.name == "gsSPDisplayList": + callStack.append(parsedCommands) + elif command.name[:10] == "gsSPBranch": # TODO: Handle BranchZ? + callStack = callStack[:-1] + callStack.append(parsedCommands) + elif command.name == "gsSPEndDisplayList": + callStack = callStack[:-1] + + # Material Specific Commands + prevMaterialChangedStatus = self.materialChanged + self.materialChanged = True + + # Should we parse commands into f3d_gbi classes? + # No, because some parsing involves reading C files, which is separate. + + # Assumes macros use variable names instead of values + mat = self.mat() + try: + if command.name == "gsSPClipRatio": + mat.clip_ratio = math_eval(command.params[0], self.f3d) + elif command.name == "gsSPNumLights": + self.numLights = self.getLightCount(command.name[1]) + elif command.name == "gsSPLight": + self.setLight(dlData, command) + elif command.name == "gsSPLightColor": + self.setLightColor(dlData, command) + elif command.name[:13] == "gsSPSetLights": + self.setLights(dlData, command) + elif command.name == "gsSPFogFactor": + pass + elif command.name == "gsSPFogPosition": + mat.fog_position = [ + math_eval(command.params[0], self.f3d), + math_eval(command.params[1], self.f3d), + ] + mat.set_fog = True + elif command.name == "gsSPTexture" or command.name == "gsSPTextureL": + mat.tex_scale = [ + math_eval(command.params[0], self.f3d) / (2 ** 16), + math_eval(command.params[1], self.f3d) / (2 ** 16), + ] + elif command.name == "gsSPSetGeometryMode": + self.setGeoFlags(command, True) + elif command.name == "gsSPClearGeometryMode": + self.setGeoFlags(command, False) + elif command.name == "gsSPLoadGeometryMode": + self.loadGeoFlags(command) + elif command.name == "gsSPSetOtherMode": + self.setOtherModeFlags(command) + elif command.name == "gsDPPipelineMode": + mat.rdp_settings.g_mdsft_pipeline = command.params[0] + elif command.name == "gsDPSetCycleType": + mat.rdp_settings.g_mdsft_cycletype = command.params[0] + elif command.name == "gsDPSetTexturePersp": + mat.rdp_settings.g_mdsft_textpersp = command.params[0] + elif command.name == "gsDPSetTextureDetail": + mat.rdp_settings.g_mdsft_textdetail = command.params[0] + elif command.name == "gsDPSetTextureLOD": + mat.rdp_settings.g_mdsft_textlod = command.params[0] + elif command.name == "gsDPSetTextureLUT": + self.setTLUTMode(0, command.params[0]) + self.setTLUTMode(1, command.params[0]) + elif command.name == "gsDPSetTextureFilter": + mat.rdp_settings.g_mdsft_text_filt = command.params[0] + elif command.name == "gsDPSetTextureConvert": + mat.rdp_settings.g_mdsft_textconv = command.params[0] + elif command.name == "gsDPSetCombineKey": + mat.rdp_settings.g_mdsft_combkey = command.params[0] + elif command.name == "gsDPSetColorDither": + mat.rdp_settings.g_mdsft_color_dither = command.params[0] + elif command.name == "gsDPSetAlphaDither": + mat.rdp_settings.g_mdsft_alpha_dither = command.params[0] + elif command.name == "gsDPSetAlphaCompare": + mat.rdp_settings.g_mdsft_alpha_compare = command.params[0] + elif command.name == "gsDPSetDepthSource": + mat.rdp_settings.g_mdsft_zsrcsel = command.params[0] + elif command.name == "gsDPSetRenderMode": + flags = math_eval( + command.params[0] + " | " + command.params[1], self.f3d + ) + self.setRenderMode(flags) + elif command.name == "gsDPSetTextureImage": + # Are other params necessary? + # The params are set in SetTile commands. + self.currentTextureName = command.params[3] + elif command.name == "gsDPSetCombineMode": + self.setCombineMode(command) + elif command.name == "gsDPSetCombineLERP": + self.setCombineLerp(command.params[0:8], command.params[8:16]) + elif command.name == "gsDPSetEnvColor": + mat.env_color = self.gammaInverseParam(command.params) + mat.set_env = True + elif command.name == "gsDPSetBlendColor": + mat.blend_color = self.gammaInverseParam(command.params) + mat.set_blend = True + elif command.name == "gsDPSetFogColor": + mat.fog_color = self.gammaInverseParam(command.params) + mat.set_fog = True + elif command.name == "gsDPSetFillColor": + pass + elif command.name == "gsDPSetPrimDepth": + pass + elif command.name == "gsDPSetPrimColor": + mat.prim_lod_min = math_eval(command.params[0], self.f3d) / 255 + mat.prim_lod_frac = math_eval(command.params[1], self.f3d) / 255 + mat.prim_color = self.gammaInverseParam(command.params[2:6]) + mat.set_prim = True + elif command.name == "gsDPSetOtherMode": + print("gsDPSetOtherMode not handled.") + elif command.name == "DPSetConvert": + mat.set_k0_5 = True + for i in range(6): + setattr( + mat, + "k" + str(i), + gammaInverseValue( + math_eval(command.params[i], self.f3d) / 255 + ), + ) + elif command.name == "DPSetKeyR": + mat.set_key = True + elif command.name == "DPSetKeyGB": + mat.set_key = True + else: + self.materialChanged = prevMaterialChangedStatus + + # Texture Commands + # Assume file texture load + # SetTextureImage -> Load command -> Set Tile (0 or 1) + + if command.name == "gsDPSetTileSize": + self.setTileSize(command.params) + elif command.name == "gsDPLoadTile": + self.loadTile(command.params) + elif command.name == "gsDPSetTile": + self.setTile(command.params, dlData) + elif command.name == "gsDPLoadBlock": + self.loadTile(command.params) + elif command.name == "gsDPLoadTLUTCmd": + self.loadTLUT(command.params, dlData) + + # This all ignores S/T high/low values + # This is pretty bad/confusing + elif ( + command.name[: len("gsDPLoadTextureBlock")] + == "gsDPLoadTextureBlock" + ): + is4bit = "4b" in command.name + if is4bit: + self.loadMultiBlock( + [command.params[0]] + + [0, "G_TX_RENDERTILE"] + + [command.params[1], "G_IM_SIZ_4b"] + + command.params[2:], + dlData, + True, + ) + else: + self.loadMultiBlock( + [command.params[0]] + + [0, "G_TX_RENDERTILE"] + + command.params[1:], + dlData, + False, + ) + elif command.name[: len("gsDPLoadMultiBlock")] == "gsDPLoadMultiBlock": + is4bit = "4b" in command.name + if is4bit: + self.loadMultiBlock( + command.params[:4] + ["G_IM_SIZ_4b"] + command.params[4:], + dlData, + True, + ) + else: + self.loadMultiBlock(command.params, dlData, False) + elif ( + command.name[: len("gsDPLoadTextureTile")] == "gsDPLoadTextureTile" + ): + is4bit = "4b" in command.name + if is4bit: + self.loadMultiBlock( + [command.params[0]] + + [0, "G_TX_RENDERTILE"] + + [command.params[1], "G_IM_SIZ_4b"] + + command.params[2:4] + + command.params[9:], + "4b", + dlData, + True, + ) + else: + self.loadMultiBlock( + [command.params[0]] + + [0, "G_TX_RENDERTILE"] + + command.params[1:5] + + command.params[9:], + "4b", + dlData, + False, + ) + elif command.name[: len("gsDPLoadMultiTile")] == "gsDPLoadMultiTile": + is4bit = "4b" in command.name + if is4bit: + self.loadMultiBlock( + command.params[:4] + + ["G_IM_SIZ_4b"] + + command.params[4:6] + + command.params[10:], + dlData, + True, + ) + else: + self.loadMultiBlock( + command.params[:7] + command.params[11:], dlData, False + ) + + # TODO: Only handles palettes at tmem = 256 + elif command.name == "gsDPLoadTLUT_pal16": + self.loadTLUTPal(command.params[1], dlData, 15) + elif command.name == "gsDPLoadTLUT_pal256": + self.loadTLUTPal(command.params[0], dlData, 255) + else: + pass + + except TypeError as e: + print(traceback.format_exc()) + # raise Exception(e) + # print(e) + + # Don't use currentCommandList because some commands may change that + if len(callStack) > 0: + callStack[-1].index += 1 + + # override this to handle game specific DL calls. + # return None to indicate DL call should be skipped. + def processDLName(self, name): + return name + + def createMesh(self, obj, removeDoubles, importNormals): + mesh = obj.data + if len(self.verts) % 3 != 0: + print(len(self.verts)) + raise PluginError( + "Number of verts in mesh not divisible by 3, currently " + + str(len(self.verts)) + ) + + triangleCount = int(len(self.verts) / 3) + verts = [f3dVert[0] for f3dVert in self.verts] + faces = [[3 * i + j for j in range(3)] for i in range(triangleCount)] + print( + "Vertices: " + str(len(self.verts)) + ", Triangles: " + str(triangleCount) + ) + + mesh.from_pydata(vertices=verts, edges=[], faces=faces) + uv_layer = mesh.uv_layers.new().data + # if self.materialContext.f3d_mat.rdp_settings.g_lighting: + color_layer = mesh.vertex_colors.new(name="Col").data + alpha_layer = mesh.vertex_colors.new(name="Alpha").data + # else: + + if importNormals: + mesh.use_auto_smooth = True + mesh.normals_split_custom_set([f3dVert[3] for f3dVert in self.verts]) + + for groupName, indices in self.limbGroups.items(): + group = obj.vertex_groups.new(name=self.limbToBoneName[groupName]) + group.add(indices, 1, "REPLACE") + + for i in range(len(mesh.polygons)): + mesh.polygons[i].material_index = self.triMatIndices[i] + + for i in range(len(mesh.loops)): + # This should be okay, since we aren't trying to optimize vertices + # There will be one loop for every vertex + uv_layer[i].uv = self.verts[i][1] + + # if self.materialContext.f3d_mat.rdp_settings.g_lighting: + color_layer[i].color = self.verts[i][2] + alpha_layer[i].color = [self.verts[i][2][3]] * 3 + [1] + + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + bpy.ops.object.select_all(action="DESELECT") + obj.select_set(True) + bpy.context.view_layer.objects.active = obj + + for material in self.materials: + obj.data.materials.append(material) + if not importNormals: + bpy.ops.object.shade_smooth() + if removeDoubles: + bpy.ops.object.mode_set(mode="EDIT") + bpy.ops.mesh.select_all(action="SELECT") + bpy.ops.mesh.remove_doubles() + bpy.ops.object.mode_set(mode="OBJECT") + + bpy.data.materials.remove(self.materialContext) + + obj.location = bpy.context.scene.cursor.location + + i = 0 + for key, lightObj in self.lightData.items(): + lightObj.location = bpy.context.scene.cursor.location + mathutils.Vector( + (i, 0, 0) + ) + i += 1 class ParsedMacro: - def __init__(self, name, params): - self.name = name - self.params = params + def __init__(self, name, params): + self.name = name + self.params = params + # Static DLs only @@ -1573,423 +2026,547 @@ def __init__(self, name, params): # we distinguish these because there is no guarantee of bone order in blender, # so we usually rely on alphabetical naming. # This means changing the c variable names. -def parseF3D(dlData, dlName, obj, transformMatrix, limbName, boneName, drawLayerPropName, drawLayer, f3dContext): - - f3dContext.matrixData[limbName] = transformMatrix - f3dContext.setCurrentTransform(limbName) - f3dContext.limbToBoneName[limbName] = boneName - setattr(f3dContext.mat().draw_layer, drawLayerPropName, drawLayer) - - #vertexGroup = getOrMakeVertexGroup(obj, boneName) - #groupIndex = vertexGroup.index +def parseF3D( + dlData, + dlName, + obj, + transformMatrix, + limbName, + boneName, + drawLayerPropName, + drawLayer, + f3dContext, +): + + f3dContext.matrixData[limbName] = transformMatrix + f3dContext.setCurrentTransform(limbName) + f3dContext.limbToBoneName[limbName] = boneName + setattr(f3dContext.mat().draw_layer, drawLayerPropName, drawLayer) + + # vertexGroup = getOrMakeVertexGroup(obj, boneName) + # groupIndex = vertexGroup.index + + dlCommands = parseDLData(dlData, dlName) + f3dContext.processCommands(dlData, dlName, dlCommands) - dlCommands = parseDLData(dlData, dlName) - f3dContext.processCommands(dlData, dlName, dlCommands) def parseDLData(dlData, dlName): - matchResult = re.search("Gfx\s*" + re.escape(dlName) + "\s*\[\s*\w*\s*\]\s*=\s*\{([^\}]*)\}", dlData) - if matchResult is None: - raise PluginError("Cannot find display list named " + dlName) + matchResult = re.search( + "Gfx\s*" + re.escape(dlName) + "\s*\[\s*\w*\s*\]\s*=\s*\{([^\}]*)\}", dlData + ) + if matchResult is None: + raise PluginError("Cannot find display list named " + dlName) + + dlCommandData = matchResult.group(1) - dlCommandData = matchResult.group(1) + # recursive regex not available in re + # dlCommands = [(match.group(1), [param.strip() for param in match.group(2).split(",")]) for match in \ + # re.findall('(gs[A-Za-z0-9\_]*)\(((?>[^()]|(?R))*)\)', dlCommandData, re.DOTALL)] - # recursive regex not available in re - #dlCommands = [(match.group(1), [param.strip() for param in match.group(2).split(",")]) for match in \ - # re.findall('(gs[A-Za-z0-9\_]*)\(((?>[^()]|(?R))*)\)', dlCommandData, re.DOTALL)] + dlCommands = parseMacroList(dlCommandData) + return dlCommands - dlCommands = parseMacroList(dlCommandData) - return dlCommands - def getVertexDataStart(vertexDataParam, f3d): - matchResult = re.search("\&?([A-Za-z0-9\_]*)\s*(\[([^\]]*)\])?\s*(\+(.*))?", vertexDataParam) - if matchResult is None: - raise PluginError("SPVertex param " + vertexDataParam + " is malformed.") + matchResult = re.search( + "\&?([A-Za-z0-9\_]*)\s*(\[([^\]]*)\])?\s*(\+(.*))?", vertexDataParam + ) + if matchResult is None: + raise PluginError("SPVertex param " + vertexDataParam + " is malformed.") - offset = 0 - if matchResult.group(3): - offset += math_eval(matchResult.group(3), f3d) - if matchResult.group(5): - offset += math_eval(matchResult.group(5), f3d) + offset = 0 + if matchResult.group(3): + offset += math_eval(matchResult.group(3), f3d) + if matchResult.group(5): + offset += math_eval(matchResult.group(5), f3d) + + return matchResult.group(1), offset - return matchResult.group(1), offset def parseVertexData(dlData, vertexDataName, f3dContext): - if vertexDataName in f3dContext.vertexData: - return f3dContext.vertexData[vertexDataName] - - matchResult = re.search("Vtx\s*" + re.escape(vertexDataName) + "\s*\[\s*[0-9x]*\s*\]\s*=\s*\{([^;]*);", dlData, re.DOTALL) - if matchResult is None: - raise PluginError("Cannot find vertex list named " + vertexDataName) - data = matchResult.group(1) - - pathMatch = re.search(r'\#include\s*"([^"]*)"', data) - if pathMatch is not None: - path = pathMatch.group(1) - data = readFile(f3dContext.getVTXPathFromInclude(path)) - - f3d = f3dContext.f3d - patterns = f3dContext.vertexFormatPatterns(data) - vertexData = [] - for pattern in patterns: - vertexData = [( - [math_eval(match.group(1), f3d), math_eval(match.group(2), f3d), math_eval(match.group(3), f3d)], - [math_eval(match.group(4), f3d), math_eval(match.group(5), f3d)], - [math_eval(match.group(6), f3d), math_eval(match.group(7), f3d), math_eval(match.group(8), f3d), math_eval(match.group(9), f3d)]) - for match in re.finditer(pattern, data, re.DOTALL)] - if len(vertexData) > 0: - break - f3dContext.vertexData[vertexDataName] = vertexData - - return f3dContext.vertexData[vertexDataName] + if vertexDataName in f3dContext.vertexData: + return f3dContext.vertexData[vertexDataName] + + matchResult = re.search( + "Vtx\s*" + re.escape(vertexDataName) + "\s*\[\s*[0-9x]*\s*\]\s*=\s*\{([^;]*);", + dlData, + re.DOTALL, + ) + if matchResult is None: + raise PluginError("Cannot find vertex list named " + vertexDataName) + data = matchResult.group(1) + + pathMatch = re.search(r'\#include\s*"([^"]*)"', data) + if pathMatch is not None: + path = pathMatch.group(1) + data = readFile(f3dContext.getVTXPathFromInclude(path)) + + f3d = f3dContext.f3d + patterns = f3dContext.vertexFormatPatterns(data) + vertexData = [] + for pattern in patterns: + vertexData = [ + ( + [ + math_eval(match.group(1), f3d), + math_eval(match.group(2), f3d), + math_eval(match.group(3), f3d), + ], + [math_eval(match.group(4), f3d), math_eval(match.group(5), f3d)], + [ + math_eval(match.group(6), f3d), + math_eval(match.group(7), f3d), + math_eval(match.group(8), f3d), + math_eval(match.group(9), f3d), + ], + ) + for match in re.finditer(pattern, data, re.DOTALL) + ] + if len(vertexData) > 0: + break + f3dContext.vertexData[vertexDataName] = vertexData + + return f3dContext.vertexData[vertexDataName] + def parseLightsData(lightsData, lightsName, f3dContext): - #if lightsName in f3dContext.lightData: - # return f3dContext.lightData[lightsName] + # if lightsName in f3dContext.lightData: + # return f3dContext.lightData[lightsName] - matchResult = re.search("Lights([0-9n])\s*" + re.escape(lightsName) + "\s*=\s*gdSPDefLights[0-9]\s*\(([^\)]*)\)\s*;\s*", lightsData, re.DOTALL) - if matchResult is None: - raise PluginError("Cannot find lights data named " + lightsName) - data = matchResult.group(2) + matchResult = re.search( + "Lights([0-9n])\s*" + + re.escape(lightsName) + + "\s*=\s*gdSPDefLights[0-9]\s*\(([^\)]*)\)\s*;\s*", + lightsData, + re.DOTALL, + ) + if matchResult is None: + raise PluginError("Cannot find lights data named " + lightsName) + data = matchResult.group(2) - values = [math_eval(value.strip(), f3dContext.f3d) for value in data.split(',')] - if values[-1] == "": - values = values[:-1] + values = [math_eval(value.strip(), f3dContext.f3d) for value in data.split(",")] + if values[-1] == "": + values = values[:-1] - lightCount = matchResult.group(1) - if lightCount == "n": - lightCount = "7" - return int(lightCount), values + lightCount = matchResult.group(1) + if lightCount == "n": + lightCount = "7" + return int(lightCount), values + + # return f3dContext.lightData[lightsName] - #return f3dContext.lightData[lightsName] def RGBA16toRGBA32(value): - return [((value >> 11) & 31) / 31, ((value >> 6) & 31) / 31, ((value >> 1) & 31) / 31, value & 1] + return [ + ((value >> 11) & 31) / 31, + ((value >> 6) & 31) / 31, + ((value >> 1) & 31) / 31, + value & 1, + ] + def IA16toRGBA32(value): - return [((value >> 8) & 255) / 255, ((value >> 8) & 255) / 255, ((value >> 8) & 255) / 255, (value & 255) / 255] + return [ + ((value >> 8) & 255) / 255, + ((value >> 8) & 255) / 255, + ((value >> 8) & 255) / 255, + (value & 255) / 255, + ] + def IA8toRGBA32(value): - return [((value >> 4) & 15) / 15, ((value >> 4) & 15) / 15, ((value >> 4) & 15) / 15, (value & 15) / 15] + return [ + ((value >> 4) & 15) / 15, + ((value >> 4) & 15) / 15, + ((value >> 4) & 15) / 15, + (value & 15) / 15, + ] + def IA4toRGBA32(value): - return [((value >> 1) & 7) / 7, ((value >> 1) & 7) / 7, ((value >> 1) & 7) / 7, value & 1] + return [ + ((value >> 1) & 7) / 7, + ((value >> 1) & 7) / 7, + ((value >> 1) & 7) / 7, + value & 1, + ] + def I8toRGBA32(value): - return [value / 255, value / 255, value / 255, 1] + return [value / 255, value / 255, value / 255, 1] + def I4toRGBA32(value): - return [value / 15, value / 15, value / 15, 1] + return [value / 15, value / 15, value / 15, 1] + def CI8toRGBA32(value): - return [value / 255, value / 255, value / 255, 1] + return [value / 255, value / 255, value / 255, 1] + def CI4toRGBA32(value): - return [value / 255, value / 255, value / 255, 1] + return [value / 255, value / 255, value / 255, 1] + class F3DTextureReference: - def __init__(self, name, width): - self.name = name - self.width = width - -def parseTextureData(dlData, textureName, f3dContext, imageFormat, imageSize, width, basePath, isLUT, f3d): - - matchResult = re.search("([A-Za-z0-9\_]+)\s*" + re.escape(textureName) + "\s*\[\s*[0-9x]*\s*\]\s*=\s*\{([^\}]*)\s\}\s*;\s*", dlData, re.DOTALL) - if matchResult is None: - print("Cannot find texture named " + textureName) - return F3DTextureReference(textureName, width) - data = matchResult.group(2) - valueSize = matchResult.group(1) - - pathMatch = re.search("\#include\s*\"([^\"]*)\"", data, re.DOTALL) - if pathMatch is not None: - path = pathMatch.group(1) - originalImage = bpy.data.images.load(f3dContext.getImagePathFromInclude(path)) - image = originalImage.copy() - image.pack() - image.filepath = "" - bpy.data.images.remove(originalImage) - - # Blender UV origin is bottom right, while N64 is top right, so we must flip LUT since we read it as data - if isLUT: - flippedValues = image.pixels[:] - width, height = image.size - for j in range(height): - image.pixels[width * j * 4 : width * (j+1) * 4] = flippedValues[width * (height - (j+1)) * 4 : width * (height - j) * 4] - else: - values = [value.strip() for value in data.split(',') if value.strip() != ""] - newValues = [] - for value in values: - intValue = math_eval(value, f3d) - if valueSize == 'u8' or valueSize == 's8' or valueSize == 'char' or valueSize == "Texture": - size = 1 - elif valueSize == 'u16' or valueSize == "s16" or valueSize == "short": - size = 2 - elif valueSize == 'u32' or valueSize == 's32' or valueSize == 'int': - size = 4 - else: - size = 8 - newValues.extend(int.to_bytes(intValue, size, 'big')[:]) - values = newValues - - if width == 0: - width = 16 - height = int(ceil(len(values) / (width * int(imageSize[9:-1]) / 8))) - #print("Texture: " + str(len(values)) + ", width = " + str(width) + ", height = " + str(height)) - image = bpy.data.images.new(textureName, width, height, alpha = True) - if imageFormat == "G_IM_FMT_RGBA": - if imageSize == 'G_IM_SIZ_16b': - for i in range(int(len(values) / 2)): - image.pixels[4*i:4 * (i+1)] = RGBA16toRGBA32(int.from_bytes(values[2*i:2*(i+1)], 'big')) - elif imageSize == 'G_IM_SIZ_32b': - image.pixels[:] = values - else: - print("Unhandled size for RGBA: " + str(imageSize)) - elif imageFormat == "G_IM_FMT_IA": - if imageSize == 'G_IM_SIZ_4b': - for i in range(len(values)): - image.pixels[8*i : 8*i+4] = IA4toRGBA32((values[i] >> 4) & 15) - image.pixels[8*i+4 : 8*i+8] = IA4toRGBA32(values[i] & 15) - elif imageSize == "G_IM_SIZ_8b": - for i in range(len(values)): - image.pixels[4*i:4 * (i+1)] = IA8toRGBA32(values[i]) - elif imageSize == "G_IM_SIZ_16b": - for i in range(int(len(values) / 2)): - image.pixels[4*i:4 * (i+1)] = IA16toRGBA32(int.from_bytes(values[2*i:2*(i+1)], 'big')) - else: - print("Unhandled size for IA: " + str(imageSize)) - elif imageFormat == "G_IM_FMT_I": - if imageSize == 'G_IM_SIZ_4b': - for i in range(len(values)): - image.pixels[8*i : 8*i+4] = I4toRGBA32((values[i] >> 4) & 15) - image.pixels[8*i+4 : 8*i+8] = I4toRGBA32(values[i] & 15) - elif imageSize == "G_IM_SIZ_8b": - for i in range(len(values)): - image.pixels[4*i:4 * (i+1)] = I8toRGBA32(values[i]) - else: - print("Unhandled size for I: " + str(imageSize)) - elif imageFormat == "G_IM_FMT_CI": - if imageSize == 'G_IM_SIZ_4b': - for i in range(len(values)): - image.pixels[8*i : 8*i+4] = CI4toRGBA32((values[i] >> 4) & 15) - image.pixels[8*i+4 : 8*i+8] = CI4toRGBA32(values[i] & 15) - elif imageSize == "G_IM_SIZ_8b": - for i in range(len(values)): - image.pixels[4*i:4 * (i+1)] = CI8toRGBA32(values[i]) - else: - print("Unhandled size for CI: " + str(imageSize)) - - # Blender UV origin is bottom right, while N64 is top right, so we must flip non LUT - if not isLUT: - flippedValues = image.pixels[:] - for j in range(height): - image.pixels[width * j * 4 : width * (j+1) * 4] = flippedValues[width * (height - (j+1)) * 4 : width * (height - j) * 4] - - return image + def __init__(self, name, width): + self.name = name + self.width = width + + +def parseTextureData( + dlData, textureName, f3dContext, imageFormat, imageSize, width, basePath, isLUT, f3d +): + + matchResult = re.search( + "([A-Za-z0-9\_]+)\s*" + + re.escape(textureName) + + "\s*\[\s*[0-9x]*\s*\]\s*=\s*\{([^\}]*)\s\}\s*;\s*", + dlData, + re.DOTALL, + ) + if matchResult is None: + print("Cannot find texture named " + textureName) + return F3DTextureReference(textureName, width) + data = matchResult.group(2) + valueSize = matchResult.group(1) + + pathMatch = re.search('\#include\s*"([^"]*)"', data, re.DOTALL) + if pathMatch is not None: + path = pathMatch.group(1) + originalImage = bpy.data.images.load(f3dContext.getImagePathFromInclude(path)) + image = originalImage.copy() + image.pack() + image.filepath = "" + bpy.data.images.remove(originalImage) + + # Blender UV origin is bottom right, while N64 is top right, so we must flip LUT since we read it as data + if isLUT: + flippedValues = image.pixels[:] + width, height = image.size + for j in range(height): + image.pixels[width * j * 4 : width * (j + 1) * 4] = flippedValues[ + width * (height - (j + 1)) * 4 : width * (height - j) * 4 + ] + else: + values = [value.strip() for value in data.split(",") if value.strip() != ""] + newValues = [] + for value in values: + intValue = math_eval(value, f3d) + if ( + valueSize == "u8" + or valueSize == "s8" + or valueSize == "char" + or valueSize == "Texture" + ): + size = 1 + elif valueSize == "u16" or valueSize == "s16" or valueSize == "short": + size = 2 + elif valueSize == "u32" or valueSize == "s32" or valueSize == "int": + size = 4 + else: + size = 8 + newValues.extend(int.to_bytes(intValue, size, "big")[:]) + values = newValues + + if width == 0: + width = 16 + height = int(ceil(len(values) / (width * int(imageSize[9:-1]) / 8))) + # print("Texture: " + str(len(values)) + ", width = " + str(width) + ", height = " + str(height)) + image = bpy.data.images.new(textureName, width, height, alpha=True) + if imageFormat == "G_IM_FMT_RGBA": + if imageSize == "G_IM_SIZ_16b": + for i in range(int(len(values) / 2)): + image.pixels[4 * i : 4 * (i + 1)] = RGBA16toRGBA32( + int.from_bytes(values[2 * i : 2 * (i + 1)], "big") + ) + elif imageSize == "G_IM_SIZ_32b": + image.pixels[:] = values + else: + print("Unhandled size for RGBA: " + str(imageSize)) + elif imageFormat == "G_IM_FMT_IA": + if imageSize == "G_IM_SIZ_4b": + for i in range(len(values)): + image.pixels[8 * i : 8 * i + 4] = IA4toRGBA32((values[i] >> 4) & 15) + image.pixels[8 * i + 4 : 8 * i + 8] = IA4toRGBA32(values[i] & 15) + elif imageSize == "G_IM_SIZ_8b": + for i in range(len(values)): + image.pixels[4 * i : 4 * (i + 1)] = IA8toRGBA32(values[i]) + elif imageSize == "G_IM_SIZ_16b": + for i in range(int(len(values) / 2)): + image.pixels[4 * i : 4 * (i + 1)] = IA16toRGBA32( + int.from_bytes(values[2 * i : 2 * (i + 1)], "big") + ) + else: + print("Unhandled size for IA: " + str(imageSize)) + elif imageFormat == "G_IM_FMT_I": + if imageSize == "G_IM_SIZ_4b": + for i in range(len(values)): + image.pixels[8 * i : 8 * i + 4] = I4toRGBA32((values[i] >> 4) & 15) + image.pixels[8 * i + 4 : 8 * i + 8] = I4toRGBA32(values[i] & 15) + elif imageSize == "G_IM_SIZ_8b": + for i in range(len(values)): + image.pixels[4 * i : 4 * (i + 1)] = I8toRGBA32(values[i]) + else: + print("Unhandled size for I: " + str(imageSize)) + elif imageFormat == "G_IM_FMT_CI": + if imageSize == "G_IM_SIZ_4b": + for i in range(len(values)): + image.pixels[8 * i : 8 * i + 4] = CI4toRGBA32((values[i] >> 4) & 15) + image.pixels[8 * i + 4 : 8 * i + 8] = CI4toRGBA32(values[i] & 15) + elif imageSize == "G_IM_SIZ_8b": + for i in range(len(values)): + image.pixels[4 * i : 4 * (i + 1)] = CI8toRGBA32(values[i]) + else: + print("Unhandled size for CI: " + str(imageSize)) + + # Blender UV origin is bottom right, while N64 is top right, so we must flip non LUT + if not isLUT: + flippedValues = image.pixels[:] + for j in range(height): + image.pixels[width * j * 4 : width * (j + 1) * 4] = flippedValues[ + width * (height - (j + 1)) * 4 : width * (height - j) * 4 + ] + + return image + def parseMacroList(data): - end = 0 - start = 0 - isCommand = True - commands = [] - parenthesesCount = 0 - - command = None - params = None - while end < len(data) - 1: - end += 1 - if data[end] == '(': - parenthesesCount += 1 - elif data[end] == ')': - parenthesesCount -= 1 - - if isCommand and parenthesesCount > 0: - command = data[start:end].strip() - if command[0] == ',': - command = command[1:].strip() - isCommand = False - start = end + 1 - - elif not isCommand and parenthesesCount == 0: - params = parseMacroArgs(data[start:end]) - commands.append(ParsedMacro(command, params)) - isCommand = True - start = end + 1 - - return commands + end = 0 + start = 0 + isCommand = True + commands = [] + parenthesesCount = 0 + + command = None + params = None + while end < len(data) - 1: + end += 1 + if data[end] == "(": + parenthesesCount += 1 + elif data[end] == ")": + parenthesesCount -= 1 + + if isCommand and parenthesesCount > 0: + command = data[start:end].strip() + if command[0] == ",": + command = command[1:].strip() + isCommand = False + start = end + 1 + + elif not isCommand and parenthesesCount == 0: + params = parseMacroArgs(data[start:end]) + commands.append(ParsedMacro(command, params)) + isCommand = True + start = end + 1 + + return commands + def parseMacroArgs(data): - end = 0 - start = 0 - params = [] - parenthesesCount = 0 - - while end < len(data) - 1: - end += 1 - if data[end] == '(': - parenthesesCount += 1 - elif data[end] == ')': - parenthesesCount -= 1 - - if (data[end] == ',' or end == len(data) -1) and parenthesesCount == 0: - if end == len(data)-1: - end += 1 - param = "".join(data[start:end].split()) - params.append(param) - start = end + 1 - - return params + end = 0 + start = 0 + params = [] + parenthesesCount = 0 + + while end < len(data) - 1: + end += 1 + if data[end] == "(": + parenthesesCount += 1 + elif data[end] == ")": + parenthesesCount -= 1 + + if (data[end] == "," or end == len(data) - 1) and parenthesesCount == 0: + if end == len(data) - 1: + end += 1 + param = "".join(data[start:end].split()) + params.append(param) + start = end + 1 + + return params + def getImportData(filepaths): - data = '' - for path in filepaths: - if os.path.exists(path): - data += readFile(path) + data = "" + for path in filepaths: + if os.path.exists(path): + data += readFile(path) + + return data + + +def importMeshC( + filepaths, name, scale, removeDoubles, importNormals, drawLayer, f3dContext +): + data = getImportData(filepaths) - return data + # Create new skinned mesh + mesh = bpy.data.meshes.new(name + "_mesh") + obj = bpy.data.objects.new(name + "_mesh", mesh) + bpy.context.scene.collection.objects.link(obj) -def importMeshC(filepaths, name, scale, removeDoubles, importNormals, drawLayer, f3dContext): - data = getImportData(filepaths) + f3dContext.mat().draw_layer.oot = drawLayer + transformMatrix = mathutils.Matrix.Scale(1 / scale, 4) - # Create new skinned mesh - mesh = bpy.data.meshes.new(name + '_mesh') - obj = bpy.data.objects.new(name + '_mesh', mesh) - bpy.context.scene.collection.objects.link(obj) + parseF3D(data, name, obj, transformMatrix, name, name, "oot", drawLayer, f3dContext) - f3dContext.mat().draw_layer.oot = drawLayer - transformMatrix = mathutils.Matrix.Scale(1 / scale, 4) + f3dContext.clearMaterial() + f3dContext.createMesh(obj, removeDoubles, importNormals) - parseF3D(data, name, obj, transformMatrix, - name, name, "oot", drawLayer, f3dContext) - - f3dContext.clearMaterial() - f3dContext.createMesh(obj, removeDoubles, importNormals) + applyRotation([obj], math.radians(-90), "X") - applyRotation([obj], math.radians(-90), 'X') class F3D_ImportDL(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.f3d_import_dl' - bl_label = "Import DL" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - obj = None - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = "OBJECT") - - try: - name = context.scene.DLImportName - importPath = bpy.path.abspath(context.scene.DLImportPath) - basePath = bpy.path.abspath(context.scene.DLImportBasePath) - scaleValue = bpy.context.scene.blenderF3DScale - - removeDoubles = context.scene.DLRemoveDoubles - importNormals = context.scene.DLImportNormals - drawLayer = context.scene.DLImportDrawLayer - f3dType = context.scene.f3d_type - isHWv1 = context.scene.isHWv1 - - importPaths = [importPath] - - importMeshC(importPaths, name, scaleValue, removeDoubles, importNormals, drawLayer, - F3DContext(F3D(f3dType, isHWv1), basePath, createF3DMat(None))) - - self.report({'INFO'}, 'Success!') - return {'FINISHED'} - - except Exception as e: - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - raisePluginError(self, e) - return {'CANCELLED'} # must return a set + # set bl_ properties + bl_idname = "object.f3d_import_dl" + bl_label = "Import DL" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + obj = None + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + + try: + name = context.scene.DLImportName + importPath = bpy.path.abspath(context.scene.DLImportPath) + basePath = bpy.path.abspath(context.scene.DLImportBasePath) + scaleValue = bpy.context.scene.blenderF3DScale + + removeDoubles = context.scene.DLRemoveDoubles + importNormals = context.scene.DLImportNormals + drawLayer = context.scene.DLImportDrawLayer + f3dType = context.scene.f3d_type + isHWv1 = context.scene.isHWv1 + + importPaths = [importPath] + + importMeshC( + importPaths, + name, + scaleValue, + removeDoubles, + importNormals, + drawLayer, + F3DContext(F3D(f3dType, isHWv1), basePath, createF3DMat(None)), + ) + + self.report({"INFO"}, "Success!") + return {"FINISHED"} + + except Exception as e: + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + raisePluginError(self, e) + return {"CANCELLED"} # must return a set class F3D_UL_ImportDLPathList(bpy.types.UIList): - def draw_item(self, context, layout, data, item, icon, active_data, active_propname): - scene = data - fileProperty = item - # draw_item must handle the three layout types... Usually 'DEFAULT' and 'COMPACT' can share the same code. - if self.layout_type in {'DEFAULT', 'COMPACT'}: - # You should always start your row layout by a label (icon + text), or a non-embossed text field, - # this will also make the row easily selectable in the list! The later also enables ctrl-click rename. - # We use icon_value of label, as our given icon is an integer value, not an enum ID. - # Note "data" names should never be translated! - if ma: - layout.prop(fileProperty, "Path", text="", emboss=False, icon_value=icon) - else: - layout.label(text="", translate=False, icon_value=icon) - # 'GRID' layout type should be as compact as possible (typically a single icon!). - elif self.layout_type in {'GRID'}: - layout.alignment = 'CENTER' - layout.label(text="", icon_value=icon) + def draw_item( + self, context, layout, data, item, icon, active_data, active_propname + ): + scene = data + fileProperty = item + # draw_item must handle the three layout types... Usually 'DEFAULT' and 'COMPACT' can share the same code. + if self.layout_type in {"DEFAULT", "COMPACT"}: + # You should always start your row layout by a label (icon + text), or a non-embossed text field, + # this will also make the row easily selectable in the list! The later also enables ctrl-click rename. + # We use icon_value of label, as our given icon is an integer value, not an enum ID. + # Note "data" names should never be translated! + if ma: + layout.prop( + fileProperty, "Path", text="", emboss=False, icon_value=icon + ) + else: + layout.label(text="", translate=False, icon_value=icon) + # 'GRID' layout type should be as compact as possible (typically a single icon!). + elif self.layout_type in {"GRID"}: + layout.alignment = "CENTER" + layout.label(text="", icon_value=icon) + class F3D_ImportDLPanel(bpy.types.Panel): - bl_idname = "F3D_PT_import_dl" - bl_label = "F3D Importer" - bl_space_type = 'VIEW_3D' - bl_region_type = 'UI' - bl_category = 'Fast64' - bl_options = {'DEFAULT_CLOSED'} - - @classmethod - def poll(cls, context): - return True - - # called every frame - def draw(self, context): - col = self.layout.column() - - col.operator(F3D_ImportDL.bl_idname) - prop_split(col, context.scene, "DLImportName", "Name") - prop_split(col, context.scene, "DLImportPath", "File") - prop_split(col, context.scene, "DLImportBasePath", "Base Path") - prop_split(col, context.scene, "blenderF3DScale", "Scale") - prop_split(col, context.scene, "DLImportDrawLayer", "Draw Layer") - col.prop(context.scene, "DLRemoveDoubles") - col.prop(context.scene, "DLImportNormals") - - box = col.box().column() - box.label(text = "All data must be contained within file.") - box.label(text = "The only exception are pngs converted to inc.c.") - - #col.template_list('F3D_UL_ImportDLPathList', '', context.scene, - # 'DLImportOtherFiles', context.scene, 'DLImportOtherFilesIndex') - -class ImportFileProperty (bpy.types.PropertyGroup): - path : bpy.props.StringProperty(name = "Path", subtype = "FILE_PATH") + bl_idname = "F3D_PT_import_dl" + bl_label = "F3D Importer" + bl_space_type = "VIEW_3D" + bl_region_type = "UI" + bl_category = "Fast64" + bl_options = {"DEFAULT_CLOSED"} + + @classmethod + def poll(cls, context): + return True + + # called every frame + def draw(self, context): + col = self.layout.column() + + col.operator(F3D_ImportDL.bl_idname) + prop_split(col, context.scene, "DLImportName", "Name") + prop_split(col, context.scene, "DLImportPath", "File") + prop_split(col, context.scene, "DLImportBasePath", "Base Path") + prop_split(col, context.scene, "blenderF3DScale", "Scale") + prop_split(col, context.scene, "DLImportDrawLayer", "Draw Layer") + col.prop(context.scene, "DLRemoveDoubles") + col.prop(context.scene, "DLImportNormals") + + box = col.box().column() + box.label(text="All data must be contained within file.") + box.label(text="The only exception are pngs converted to inc.c.") + + # col.template_list('F3D_UL_ImportDLPathList', '', context.scene, + # 'DLImportOtherFiles', context.scene, 'DLImportOtherFilesIndex') + + +class ImportFileProperty(bpy.types.PropertyGroup): + path: bpy.props.StringProperty(name="Path", subtype="FILE_PATH") + f3d_parser_classes = ( - F3D_ImportDL, - F3D_ImportDLPanel, - ImportFileProperty, - F3D_UL_ImportDLPathList, + F3D_ImportDL, + F3D_ImportDLPanel, + ImportFileProperty, + F3D_UL_ImportDLPathList, ) + def f3d_parser_register(): - for cls in f3d_parser_classes: - register_class(cls) - - bpy.types.Scene.DLImportName = bpy.props.StringProperty(name = "Name") - bpy.types.Scene.DLImportPath = bpy.props.StringProperty(name = 'Directory', subtype = 'FILE_PATH') - bpy.types.Scene.DLImportBasePath = bpy.props.StringProperty(name = 'Directory', subtype = 'FILE_PATH') - bpy.types.Scene.DLRemoveDoubles = bpy.props.BoolProperty(name = "Remove Doubles", default = True) - bpy.types.Scene.DLImportNormals = bpy.props.BoolProperty(name = "Import Normals", default = True) - bpy.types.Scene.DLImportDrawLayer = bpy.props.EnumProperty(name = "Draw Layer", items = ootEnumDrawLayers) - bpy.types.Scene.DLImportOtherFiles = bpy.props.CollectionProperty(type = ImportFileProperty) - bpy.types.Scene.DLImportOtherFilesIndex = bpy.props.IntProperty() + for cls in f3d_parser_classes: + register_class(cls) + + bpy.types.Scene.DLImportName = bpy.props.StringProperty(name="Name") + bpy.types.Scene.DLImportPath = bpy.props.StringProperty( + name="Directory", subtype="FILE_PATH" + ) + bpy.types.Scene.DLImportBasePath = bpy.props.StringProperty( + name="Directory", subtype="FILE_PATH" + ) + bpy.types.Scene.DLRemoveDoubles = bpy.props.BoolProperty( + name="Remove Doubles", default=True + ) + bpy.types.Scene.DLImportNormals = bpy.props.BoolProperty( + name="Import Normals", default=True + ) + bpy.types.Scene.DLImportDrawLayer = bpy.props.EnumProperty( + name="Draw Layer", items=ootEnumDrawLayers + ) + bpy.types.Scene.DLImportOtherFiles = bpy.props.CollectionProperty( + type=ImportFileProperty + ) + bpy.types.Scene.DLImportOtherFilesIndex = bpy.props.IntProperty() + def f3d_parser_unregister(): - for cls in reversed(f3d_parser_classes): - unregister_class(cls) - - del bpy.types.Scene.DLImportName - del bpy.types.Scene.DLImportPath - del bpy.types.Scene.DLRemoveDoubles - del bpy.types.Scene.DLImportNormals - del bpy.types.Scene.DLImportDrawLayer - del bpy.types.Scene.DLImportBasePath - del bpy.types.Scene.DLImportOtherFiles - del bpy.types.Scene.DLImportOtherFilesIndex + for cls in reversed(f3d_parser_classes): + unregister_class(cls) + + del bpy.types.Scene.DLImportName + del bpy.types.Scene.DLImportPath + del bpy.types.Scene.DLRemoveDoubles + del bpy.types.Scene.DLImportNormals + del bpy.types.Scene.DLImportDrawLayer + del bpy.types.Scene.DLImportBasePath + del bpy.types.Scene.DLImportOtherFiles + del bpy.types.Scene.DLImportOtherFilesIndex diff --git a/fast64_internal/f3d/f3d_render_engine.py b/fast64_internal/f3d/f3d_render_engine.py index f8a5910a2..e1ab79bd9 100644 --- a/fast64_internal/f3d/f3d_render_engine.py +++ b/fast64_internal/f3d/f3d_render_engine.py @@ -1,9 +1,9 @@ import bpy, math, time -from mathutils import * -from bgl import * +from mathutils import * +from bgl import * from bpy.utils import register_class, unregister_class -vertexShader = ''' +vertexShader = """ #version 330 core layout (location = 0) in vec3 pos; layout (location = 1) in vec2 uv; @@ -18,9 +18,9 @@ gl_Position = transform * vec4(pos, 1.0); // see how we directly give a vec3 to vec4's constructor vertexColor = vec4(0.5, 0.0, 0.0, 1.0); // set the output variable to a dark-red color } -''' +""" -fragmentShader = ''' +fragmentShader = """ #version 330 core out vec4 color; @@ -30,342 +30,376 @@ { color = vertexColor; } -''' +""" + class F3DRenderEngine(bpy.types.RenderEngine): - bl_idname = "f3d_renderer" - bl_label = "Fast3D" - use_preview = True - - # Init is called whenever a new render engine instance is created. Multiple - # instances may exist at the same time, for example for a viewport and final - # render. - def __init__(self): - self.draw_data = F3DDrawData() - self.first_time = False - - # When the render engine instance is destroy, this is called. Clean up any - # render engine data here, for example stopping running render threads. - def __del__(self): - pass - - # This is the method called by Blender for both final renders (F12) and - # small preview for materials, world and lights. - def render(self, depsgraph): - scene = depsgraph.scene - scale = scene.render.resolution_percentage / 100.0 - self.size_x = int(scene.render.resolution_x * scale) - self.size_y = int(scene.render.resolution_y * scale) - - # Fill the render result with a flat color. The framebuffer is - # defined as a list of pixels, each pixel itself being a list of - # R,G,B,A values. - if self.is_preview: - color = [0.1, 0.2, 0.1, 1.0] - else: - color = [0.2, 0.1, 0.1, 1.0] - - pixel_count = self.size_x * self.size_y - rect = [color] * pixel_count - - # Here we write the pixel values to the RenderResult - result = self.begin_result(0, 0, self.size_x, self.size_y) - layer = result.layers[0].passes["Combined"] - layer.rect = rect - self.end_result(result) - - # For viewport renders, this method gets called once at the start and - # whenever the scene or 3D viewport changes. This method is where data - # should be read from Blender in the same thread. Typically a render - # thread will be started to do the work while keeping Blender responsive. - - # Not called when viewport camera transform changes. - def view_update(self, context, depsgraph): - region = context.region - view3d = context.space_data - scene = depsgraph.scene - - # Get viewport dimensions - dimensions = region.width, region.height - - print("Start View Update: " + str(glGetError())) - if not self.first_time: - # First time initialization - self.first_time = True - for datablock in depsgraph.ids: - print(datablock) - if isinstance(datablock, bpy.types.Image): - self.draw_data.textures[datablock.name] = F3DRendererTexture(datablock) - print("Create Texture: " + str(glGetError())) - elif isinstance(datablock, bpy.types.Material): - self.draw_data.materials[datablock.name] = F3DRendererMaterial(datablock) - print("Create Material: " + str(glGetError())) - elif isinstance(datablock, bpy.types.Mesh): - pass - elif isinstance(datablock, bpy.types.Object) and isinstance(datablock.data, bpy.types.Mesh): - self.draw_data.objects[datablock.name] = F3DRendererObject(datablock, self.draw_data) - print("Create Object: " + str(glGetError())) - else: - # Test which datablocks changed - for update in depsgraph.updates: - print("Datablock updated: ", update.id.name) - #if isinstance(update.id, bpy.types.Scene): - # for self.draw_data - - # Test if any material was added, removed or changed. - if depsgraph.id_type_updated('MATERIAL'): - print("Materials updated") - - # Loop over all object instances in the scene. - if self.first_time or depsgraph.id_type_updated('OBJECT'): - print("Updated object.") - for instance in depsgraph.object_instances: - pass - - context.region_data.perspective_matrix - print("End View Update: " + str(glGetError())) - - # For viewport renders, this method is called whenever Blender redraws - # the 3D viewport. The renderer is expected to quickly draw the render - # with OpenGL, and not perform other expensive work. - # Blender will draw overlays for selection and editing on top of the - # rendered image automatically. - def view_draw(self, context, depsgraph): - region = context.region - scene = depsgraph.scene - - # Get viewport dimensions - dimensions = region.width, region.height - - print("Start View Draw: " + str(glGetError())) - glEnable(GL_BLEND) - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) - self.draw_data.draw() - glDisable(GL_BLEND) + bl_idname = "f3d_renderer" + bl_label = "Fast3D" + use_preview = True + + # Init is called whenever a new render engine instance is created. Multiple + # instances may exist at the same time, for example for a viewport and final + # render. + def __init__(self): + self.draw_data = F3DDrawData() + self.first_time = False + + # When the render engine instance is destroy, this is called. Clean up any + # render engine data here, for example stopping running render threads. + def __del__(self): + pass + + # This is the method called by Blender for both final renders (F12) and + # small preview for materials, world and lights. + def render(self, depsgraph): + scene = depsgraph.scene + scale = scene.render.resolution_percentage / 100.0 + self.size_x = int(scene.render.resolution_x * scale) + self.size_y = int(scene.render.resolution_y * scale) + + # Fill the render result with a flat color. The framebuffer is + # defined as a list of pixels, each pixel itself being a list of + # R,G,B,A values. + if self.is_preview: + color = [0.1, 0.2, 0.1, 1.0] + else: + color = [0.2, 0.1, 0.1, 1.0] + + pixel_count = self.size_x * self.size_y + rect = [color] * pixel_count + + # Here we write the pixel values to the RenderResult + result = self.begin_result(0, 0, self.size_x, self.size_y) + layer = result.layers[0].passes["Combined"] + layer.rect = rect + self.end_result(result) + + # For viewport renders, this method gets called once at the start and + # whenever the scene or 3D viewport changes. This method is where data + # should be read from Blender in the same thread. Typically a render + # thread will be started to do the work while keeping Blender responsive. + + # Not called when viewport camera transform changes. + def view_update(self, context, depsgraph): + region = context.region + view3d = context.space_data + scene = depsgraph.scene + + # Get viewport dimensions + dimensions = region.width, region.height + + print("Start View Update: " + str(glGetError())) + if not self.first_time: + # First time initialization + self.first_time = True + for datablock in depsgraph.ids: + print(datablock) + if isinstance(datablock, bpy.types.Image): + self.draw_data.textures[datablock.name] = F3DRendererTexture( + datablock + ) + print("Create Texture: " + str(glGetError())) + elif isinstance(datablock, bpy.types.Material): + self.draw_data.materials[datablock.name] = F3DRendererMaterial( + datablock + ) + print("Create Material: " + str(glGetError())) + elif isinstance(datablock, bpy.types.Mesh): + pass + elif isinstance(datablock, bpy.types.Object) and isinstance( + datablock.data, bpy.types.Mesh + ): + self.draw_data.objects[datablock.name] = F3DRendererObject( + datablock, self.draw_data + ) + print("Create Object: " + str(glGetError())) + else: + # Test which datablocks changed + for update in depsgraph.updates: + print("Datablock updated: ", update.id.name) + # if isinstance(update.id, bpy.types.Scene): + # for self.draw_data + + # Test if any material was added, removed or changed. + if depsgraph.id_type_updated("MATERIAL"): + print("Materials updated") + + # Loop over all object instances in the scene. + if self.first_time or depsgraph.id_type_updated("OBJECT"): + print("Updated object.") + for instance in depsgraph.object_instances: + pass + + context.region_data.perspective_matrix + print("End View Update: " + str(glGetError())) + + # For viewport renders, this method is called whenever Blender redraws + # the 3D viewport. The renderer is expected to quickly draw the render + # with OpenGL, and not perform other expensive work. + # Blender will draw overlays for selection and editing on top of the + # rendered image automatically. + def view_draw(self, context, depsgraph): + region = context.region + scene = depsgraph.scene + + # Get viewport dimensions + dimensions = region.width, region.height + + print("Start View Draw: " + str(glGetError())) + glEnable(GL_BLEND) + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) + self.draw_data.draw() + glDisable(GL_BLEND) + class F3DRendererTexture: - def __init__(self, image): - self.image = image - width, height = image.size - - self.texture_buffer = Buffer(GL_INT, 1) - image.gl_load() - self.texture_buffer[0] = image.bindcode - - #glGenTextures(1, self.texture) - glActiveTexture(GL_TEXTURE0) - glBindTexture(GL_TEXTURE_2D, self.texture_buffer[0]) - #glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_FLOAT, pixels) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) - glBindTexture(GL_TEXTURE_2D, 0) - - def __del__(self): - glBindTexture(GL_TEXTURE_2D, 0) - glDeleteTextures(1, self.texture_buffer) - - def bind(self): - glBindTexture(GL_TEXTURE_2D, self.texture_buffer[0]) + def __init__(self, image): + self.image = image + width, height = image.size + + self.texture_buffer = Buffer(GL_INT, 1) + image.gl_load() + self.texture_buffer[0] = image.bindcode + + # glGenTextures(1, self.texture) + glActiveTexture(GL_TEXTURE0) + glBindTexture(GL_TEXTURE_2D, self.texture_buffer[0]) + # glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_FLOAT, pixels) + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) + glBindTexture(GL_TEXTURE_2D, 0) + + def __del__(self): + glBindTexture(GL_TEXTURE_2D, 0) + glDeleteTextures(1, self.texture_buffer) + + def bind(self): + glBindTexture(GL_TEXTURE_2D, self.texture_buffer[0]) + class F3DRendererMaterial: - def __init__(self, material): - self.material = material - - def __del__(self): - pass + def __init__(self, material): + self.material = material + + def __del__(self): + pass - def update(self, viewport, projection, time): - pass + def update(self, viewport, projection, time): + pass + + def apply(self): + pass - def apply(self): - pass class F3DRendererObject: - def __init__(self, obj, render_data): - mesh = obj.data - self.submeshes = [] - facesByMat = {} - mesh.calc_loop_triangles() - for face in mesh.loop_triangles: - if face.material_index not in facesByMat: - facesByMat[face.material_index] = [] - facesByMat[face.material_index].append(face) - - for material_index, faces in facesByMat.items(): - material = mesh.materials[material_index] - # Material should always be added in view_update - #f3d_material = render_data.materials[material] - f3d_material = None - - self.submeshes.append(F3DRendererSubmesh(f3d_material, obj, faces, render_data)) - - def draw(self): - print("Draw Object: " + str(glGetError())) - for submesh in self.submeshes: - submesh.draw() + def __init__(self, obj, render_data): + mesh = obj.data + self.submeshes = [] + facesByMat = {} + mesh.calc_loop_triangles() + for face in mesh.loop_triangles: + if face.material_index not in facesByMat: + facesByMat[face.material_index] = [] + facesByMat[face.material_index].append(face) + + for material_index, faces in facesByMat.items(): + material = mesh.materials[material_index] + # Material should always be added in view_update + # f3d_material = render_data.materials[material] + f3d_material = None + + self.submeshes.append( + F3DRendererSubmesh(f3d_material, obj, faces, render_data) + ) + + def draw(self): + print("Draw Object: " + str(glGetError())) + for submesh in self.submeshes: + submesh.draw() + class F3DRendererSubmesh: - def __init__(self, f3d_material, obj, triangles, render_data): - print("Begin submesh: " + str(glGetError())) - mesh = obj.data - loopIndices = [] - for triangle in triangles: - for loopIndex in triangle.loops: - loopIndices.append(loopIndex) - - self.material = f3d_material - self.obj = obj - - self.vertex_array = Buffer(GL_INT, 1) - glGenVertexArrays(1, self.vertex_array) - glBindVertexArray(self.vertex_array[0]) - - print("Gen/Bind VAO: " + str(glGetError())) - - self.vertex_buffer = Buffer(GL_INT, 3) - self.size = len(loopIndices) - glGenBuffers(3, self.vertex_buffer) - - position = [] - for loopIndex in loopIndices: - position.extend(mesh.vertices[mesh.loops[loopIndex].vertex_index].co[0:3]) - self.position_buffer = Buffer(GL_FLOAT, len(position), position) - - uv = [] - if 'UVMap' in mesh.uv_layers: - uv = [0, 0] * len(loopIndices) - else: - for loopUV in mesh.uv_layers['UVMap'].data: - uv.extend(loopUV.uv[0:2]) - self.uv_buffer = Buffer(GL_FLOAT, len(uv), uv) - - colorOrNormal = [] - if True: # TODO: Choose normal or vertex color - for loopIndex in loopIndices: - colorOrNormal.extend(mesh.loops[loopIndex].normal[0:3]) - else: - if 'Col' in mesh.vertex_colors: - color_data = mesh.vertex_colors['Col'].data - else: - color_data = [0,0,0] * len(loopIndices) - - if 'Alpha' in mesh.vertex_colors: - alpha_data = mesh.vertex_colors['Alpha'].data - else: - alpha_data = [0,0,0] * len(loopIndices) - - for loopIndex in loopIndices: - # TODO: Fix Alpha - colorOrNormal.extend(color_data[loopIndex][0:3] + [alpha_data[loopIndex][0]]) - self.colorOrNormal_buffer = Buffer(GL_FLOAT, len(colorOrNormal), colorOrNormal) - - position_location = glGetAttribLocation(render_data.shaderProgram, "pos") - uv_location = glGetAttribLocation(render_data.shaderProgram, "uv") - colorOrNormal_location = glGetAttribLocation(render_data.shaderProgram, "colorOrNormal") - print("pos: " + str(position_location) + ', uv: ' + str(uv_location) +\ - ", colorOrNormal: " + str(colorOrNormal_location)) - print("Get Attribute Locations: " + str(glGetError())) - - # Floats and Ints are 4 bytes? - glBindBuffer(GL_ARRAY_BUFFER, self.vertex_buffer[0]) - print("Bind vertex buffer position: " + str(glGetError())) - glBufferData(GL_ARRAY_BUFFER, len(position) * 4, self.position_buffer, GL_STATIC_DRAW) - print("Buffer position data: " + str(glGetError())) - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, None) - glEnableVertexAttribArray(0) - print("Set Attribute Pointer: " + str(glGetError())) - - glBindBuffer(GL_ARRAY_BUFFER, self.vertex_buffer[1]) - glBufferData(GL_ARRAY_BUFFER, len(uv) * 4, self.uv_buffer, GL_STATIC_DRAW) - glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, None) - glEnableVertexAttribArray(0) - - glBindBuffer(GL_ARRAY_BUFFER, self.vertex_buffer[2]) - glBufferData(GL_ARRAY_BUFFER, len(colorOrNormal) * 4, self.colorOrNormal_buffer, GL_STATIC_DRAW) - glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, None) - glEnableVertexAttribArray(2) - - glBindBuffer(GL_ARRAY_BUFFER, 0) - glBindVertexArray(0) - - self.render_data = render_data - - print("End submesh: " + str(glGetError())) - - - def draw(self): - print("Draw Start Submesh: " + str(glGetError())) - #glActiveTexture(GL_TEXTURE0) - #glBindTexture(GL_TEXTURE_2D, self.texture[0]) - - # Ignore material for now - #self.material.apply() - - # Handle modifiers? armatures? - transformLocation = glGetUniformLocation(self.render_data.shaderProgram, "transform") - glUniformMatrix4fv(transformLocation, 1, GL_FALSE, self.obj.matrix_world) - glBindVertexArray(self.vertex_array[0]) - glDrawArrays(GL_TRIANGLES, 0, self.size) - glBindVertexArray(0) - glBindTexture(GL_TEXTURE_2D, 0) - print("Draw End Submesh: " + str(glGetError())) - - def __del__(self): - glDeleteBuffers(3, self.vertex_buffer) - - glDeleteBuffers(1, self.position_buffer) - glDeleteBuffers(1, self.uv_buffer) - glDeleteBuffers(1, self.colorOrNormal_buffer) - - glDeleteVertexArrays(1, self.vertex_array) - glBindTexture(GL_TEXTURE_2D, 0) - #glDeleteTextures(1, self.texture) + def __init__(self, f3d_material, obj, triangles, render_data): + print("Begin submesh: " + str(glGetError())) + mesh = obj.data + loopIndices = [] + for triangle in triangles: + for loopIndex in triangle.loops: + loopIndices.append(loopIndex) + + self.material = f3d_material + self.obj = obj + + self.vertex_array = Buffer(GL_INT, 1) + glGenVertexArrays(1, self.vertex_array) + glBindVertexArray(self.vertex_array[0]) + + print("Gen/Bind VAO: " + str(glGetError())) + + self.vertex_buffer = Buffer(GL_INT, 3) + self.size = len(loopIndices) + glGenBuffers(3, self.vertex_buffer) + + position = [] + for loopIndex in loopIndices: + position.extend(mesh.vertices[mesh.loops[loopIndex].vertex_index].co[0:3]) + self.position_buffer = Buffer(GL_FLOAT, len(position), position) + + uv = [] + if "UVMap" in mesh.uv_layers: + uv = [0, 0] * len(loopIndices) + else: + for loopUV in mesh.uv_layers["UVMap"].data: + uv.extend(loopUV.uv[0:2]) + self.uv_buffer = Buffer(GL_FLOAT, len(uv), uv) + + colorOrNormal = [] + if True: # TODO: Choose normal or vertex color + for loopIndex in loopIndices: + colorOrNormal.extend(mesh.loops[loopIndex].normal[0:3]) + else: + if "Col" in mesh.vertex_colors: + color_data = mesh.vertex_colors["Col"].data + else: + color_data = [0, 0, 0] * len(loopIndices) + + if "Alpha" in mesh.vertex_colors: + alpha_data = mesh.vertex_colors["Alpha"].data + else: + alpha_data = [0, 0, 0] * len(loopIndices) + + for loopIndex in loopIndices: + # TODO: Fix Alpha + colorOrNormal.extend( + color_data[loopIndex][0:3] + [alpha_data[loopIndex][0]] + ) + self.colorOrNormal_buffer = Buffer(GL_FLOAT, len(colorOrNormal), colorOrNormal) + + position_location = glGetAttribLocation(render_data.shaderProgram, "pos") + uv_location = glGetAttribLocation(render_data.shaderProgram, "uv") + colorOrNormal_location = glGetAttribLocation( + render_data.shaderProgram, "colorOrNormal" + ) + print( + "pos: " + + str(position_location) + + ", uv: " + + str(uv_location) + + ", colorOrNormal: " + + str(colorOrNormal_location) + ) + print("Get Attribute Locations: " + str(glGetError())) + + # Floats and Ints are 4 bytes? + glBindBuffer(GL_ARRAY_BUFFER, self.vertex_buffer[0]) + print("Bind vertex buffer position: " + str(glGetError())) + glBufferData( + GL_ARRAY_BUFFER, len(position) * 4, self.position_buffer, GL_STATIC_DRAW + ) + print("Buffer position data: " + str(glGetError())) + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, None) + glEnableVertexAttribArray(0) + print("Set Attribute Pointer: " + str(glGetError())) + + glBindBuffer(GL_ARRAY_BUFFER, self.vertex_buffer[1]) + glBufferData(GL_ARRAY_BUFFER, len(uv) * 4, self.uv_buffer, GL_STATIC_DRAW) + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, None) + glEnableVertexAttribArray(0) + + glBindBuffer(GL_ARRAY_BUFFER, self.vertex_buffer[2]) + glBufferData( + GL_ARRAY_BUFFER, + len(colorOrNormal) * 4, + self.colorOrNormal_buffer, + GL_STATIC_DRAW, + ) + glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, None) + glEnableVertexAttribArray(2) + + glBindBuffer(GL_ARRAY_BUFFER, 0) + glBindVertexArray(0) + + self.render_data = render_data + + print("End submesh: " + str(glGetError())) + + def draw(self): + print("Draw Start Submesh: " + str(glGetError())) + # glActiveTexture(GL_TEXTURE0) + # glBindTexture(GL_TEXTURE_2D, self.texture[0]) + + # Ignore material for now + # self.material.apply() + + # Handle modifiers? armatures? + transformLocation = glGetUniformLocation( + self.render_data.shaderProgram, "transform" + ) + glUniformMatrix4fv(transformLocation, 1, GL_FALSE, self.obj.matrix_world) + glBindVertexArray(self.vertex_array[0]) + glDrawArrays(GL_TRIANGLES, 0, self.size) + glBindVertexArray(0) + glBindTexture(GL_TEXTURE_2D, 0) + print("Draw End Submesh: " + str(glGetError())) + + def __del__(self): + glDeleteBuffers(3, self.vertex_buffer) + + glDeleteBuffers(1, self.position_buffer) + glDeleteBuffers(1, self.uv_buffer) + glDeleteBuffers(1, self.colorOrNormal_buffer) + + glDeleteVertexArrays(1, self.vertex_array) + glBindTexture(GL_TEXTURE_2D, 0) + # glDeleteTextures(1, self.texture) + class F3DDrawData: - def __init__(self): - self.textures = {} - self.materials = {} - self.objects = {} - print("Start: " + str(glGetError())) - - # Create shader program - vertexHandle = glCreateShader(GL_VERTEX_SHADER) - fragmentHandle = glCreateShader(GL_FRAGMENT_SHADER) - glShaderSource(vertexHandle, vertexShader) - glShaderSource(vertexHandle, fragmentShader) - glCompileShader(vertexHandle) - glCompileShader(fragmentHandle) - - print("Shader Created: " + str(glGetError())) - - self.shaderProgram = glCreateProgram() - glAttachShader(self.shaderProgram, vertexHandle) - glAttachShader(self.shaderProgram, fragmentHandle) - glLinkProgram(self.shaderProgram) - glDeleteShader(vertexHandle) - glDeleteShader(fragmentHandle) - - print("Program Created: " + str(glGetError())) - - #messageSize = Buffer(GL_INT, 1) - #message = Buffer(GL_BYTE, 1000) - #glGetShaderInfoLog(self.shaderProgram, 1000, messageSize, message) - print("End: " + str(glGetError())) - - def __del__(self): - for idName, f3dObject in self.objects.items(): - del f3dObject - - def draw(self): - print("Start Draw Data: " + str(glGetError())) - glClearColor(0.2, 0.3, 0.3, 1.0) - glClear(GL_COLOR_BUFFER_BIT) - - print("Before use program: " + str(glGetError())) - glUseProgram(self.shaderProgram) - for idName, f3dObject in self.objects.items(): - f3dObject.draw() + def __init__(self): + self.textures = {} + self.materials = {} + self.objects = {} + print("Start: " + str(glGetError())) + + # Create shader program + vertexHandle = glCreateShader(GL_VERTEX_SHADER) + fragmentHandle = glCreateShader(GL_FRAGMENT_SHADER) + glShaderSource(vertexHandle, vertexShader) + glShaderSource(vertexHandle, fragmentShader) + glCompileShader(vertexHandle) + glCompileShader(fragmentHandle) + + print("Shader Created: " + str(glGetError())) + + self.shaderProgram = glCreateProgram() + glAttachShader(self.shaderProgram, vertexHandle) + glAttachShader(self.shaderProgram, fragmentHandle) + glLinkProgram(self.shaderProgram) + glDeleteShader(vertexHandle) + glDeleteShader(fragmentHandle) + + print("Program Created: " + str(glGetError())) + + # messageSize = Buffer(GL_INT, 1) + # message = Buffer(GL_BYTE, 1000) + # glGetShaderInfoLog(self.shaderProgram, 1000, messageSize, message) + print("End: " + str(glGetError())) + + def __del__(self): + for idName, f3dObject in self.objects.items(): + del f3dObject + + def draw(self): + print("Start Draw Data: " + str(glGetError())) + glClearColor(0.2, 0.3, 0.3, 1.0) + glClear(GL_COLOR_BUFFER_BIT) + + print("Before use program: " + str(glGetError())) + glUseProgram(self.shaderProgram) + for idName, f3dObject in self.objects.items(): + f3dObject.draw() # RenderEngines also need to tell UI Panels that they are compatible with. @@ -373,40 +407,46 @@ def draw(self): # exclude any panels that are replaced by custom panels registered by the # render engine, or that are not supported. def get_panels(): - exclude_panels = { - 'VIEWLAYER_PT_filter', - 'VIEWLAYER_PT_layer_passes', - } + exclude_panels = { + "VIEWLAYER_PT_filter", + "VIEWLAYER_PT_layer_passes", + } + + panels = [] + for panel in bpy.types.Panel.__subclasses__(): + if ( + hasattr(panel, "COMPAT_ENGINES") + and "BLENDER_RENDER" in panel.COMPAT_ENGINES + ): + if panel.__name__ not in exclude_panels: + panels.append(panel) - panels = [] - for panel in bpy.types.Panel.__subclasses__(): - if hasattr(panel, 'COMPAT_ENGINES') and 'BLENDER_RENDER' in panel.COMPAT_ENGINES: - if panel.__name__ not in exclude_panels: - panels.append(panel) + return panels - return panels render_engine_classes = [ - #F3DRenderEngine, + # F3DRenderEngine, ] -def render_engine_register() : - for cls in render_engine_classes: - register_class(cls) - - for panel in get_panels(): - panel.COMPAT_ENGINES.add('CUSTOM') - #from bl_ui import (properties_render) - #properties_render.RENDER_PT_render.COMPAT_ENGINES.add(CustomRenderEngine.bl_idname) +def render_engine_register(): + for cls in render_engine_classes: + register_class(cls) + + for panel in get_panels(): + panel.COMPAT_ENGINES.add("CUSTOM") + + # from bl_ui import (properties_render) + # properties_render.RENDER_PT_render.COMPAT_ENGINES.add(CustomRenderEngine.bl_idname) + -def render_engine_unregister() : - for cls in render_engine_classes: - unregister_class(cls) +def render_engine_unregister(): + for cls in render_engine_classes: + unregister_class(cls) - for panel in get_panels(): - if 'CUSTOM' in panel.COMPAT_ENGINES: - panel.COMPAT_ENGINES.remove('CUSTOM') + for panel in get_panels(): + if "CUSTOM" in panel.COMPAT_ENGINES: + panel.COMPAT_ENGINES.remove("CUSTOM") - #from bl_ui import (properties_render) - #properties_render.RENDER_PT_render.COMPAT_ENGINES.remove(CustomRenderEngine.bl_idname) \ No newline at end of file + # from bl_ui import (properties_render) + # properties_render.RENDER_PT_render.COMPAT_ENGINES.remove(CustomRenderEngine.bl_idname) diff --git a/fast64_internal/f3d/f3d_writer.py b/fast64_internal/f3d/f3d_writer.py index 91a014cbe..a2e3edd0c 100644 --- a/fast64_internal/f3d/f3d_writer.py +++ b/fast64_internal/f3d/f3d_writer.py @@ -5,896 +5,1191 @@ from .f3d_enums import * from .f3d_constants import * -from .f3d_material import all_combiner_uses, getMaterialScrollDimensions, getTmemWordUsage, getTmemMax, bitSizeDict, texBitSizeOf, texFormatOf +from .f3d_material import ( + all_combiner_uses, + getMaterialScrollDimensions, + getTmemWordUsage, + getTmemMax, + bitSizeDict, + texBitSizeOf, + texFormatOf, +) from .f3d_gbi import * from .f3d_gbi import _DPLoadTextureBlock from ..utility import * + def getEdgeToFaceDict(mesh): - edgeDict = {} - for face in mesh.loop_triangles: - for edgeKey in face.edge_keys: - if edgeKey not in edgeDict: - edgeDict[edgeKey] = [] - if face not in edgeDict[edgeKey]: - edgeDict[edgeKey].append(face) - return edgeDict + edgeDict = {} + for face in mesh.loop_triangles: + for edgeKey in face.edge_keys: + if edgeKey not in edgeDict: + edgeDict[edgeKey] = [] + if face not in edgeDict[edgeKey]: + edgeDict[edgeKey].append(face) + return edgeDict + def getVertToFaceDict(mesh): - vertDict = {} - for face in mesh.loop_triangles: - for vertIndex in face.vertices: - if vertIndex not in vertDict: - vertDict[vertIndex] = [] - if face not in vertDict[vertIndex]: - vertDict[vertIndex].append(face) - return vertDict + vertDict = {} + for face in mesh.loop_triangles: + for vertIndex in face.vertices: + if vertIndex not in vertDict: + vertDict[vertIndex] = [] + if face not in vertDict[vertIndex]: + vertDict[vertIndex].append(face) + return vertDict -def getLoopFromVert(inputIndex, face): - for i in range(len(face.vertices)): - if face.vertices[i] == inputIndex: - return face.loops[i] -class VertexGroupInfo: - def __init__(self): - self.vertexGroups = {} # vertex index : vertex group - self.vertexGroupToLimb = {} - -class MeshInfo: - def __init__(self): - self.vert = {} # all faces connected to a vert - self.edge = {} # all faces connected to an edge - self.f3dVert = {} # f3d vertex of a given loop - self.edgeValid = {} # bool given two faces - self.validNeighbors = {} # all neighbors of a face with a valid connecting edge - self.texDimensions = {} # texture dimensions for each material +def getLoopFromVert(inputIndex, face): + for i in range(len(face.vertices)): + if face.vertices[i] == inputIndex: + return face.loops[i] - self.vertexGroupInfo = None -def getInfoDict(obj): - fixLargeUVs(obj) - obj.data.calc_loop_triangles() - obj.data.calc_normals_split() - if len(obj.data.materials) == 0: - raise PluginError("Mesh does not have any Fast3D materials.") - - infoDict = MeshInfo() - - vertDict = infoDict.vert - edgeDict = infoDict.edge - f3dVertDict = infoDict.f3dVert - edgeValidDict = infoDict.edgeValid - validNeighborDict = infoDict.validNeighbors - - mesh = obj.data - if len(obj.data.uv_layers) == 0: - uv_data = obj.data.uv_layers.new().data - else: - uv_data = None - for uv_layer in obj.data.uv_layers: - if uv_layer.name == 'UVMap': - uv_data = uv_layer.data - if uv_data is None: - raise PluginError("Object \'" + obj.name + "\' does not have a UV layer named \'UVMap.\'") - for face in mesh.loop_triangles: - validNeighborDict[face] = [] - material = obj.material_slots[face.material_index].material - if material is None: - raise PluginError("There are some faces on your mesh that are assigned to an empty material slot.") - for vertIndex in face.vertices: - if vertIndex not in vertDict: - vertDict[vertIndex] = [] - if face not in vertDict[vertIndex]: - vertDict[vertIndex].append(face) - for edgeKey in face.edge_keys: - if edgeKey not in edgeDict: - edgeDict[edgeKey] = [] - if face not in edgeDict[edgeKey]: - edgeDict[edgeKey].append(face) - - for loopIndex in face.loops: - convertInfo = LoopConvertInfo(uv_data, obj, - isLightingDisabled(obj.material_slots[face.material_index].material)) - f3dVertDict[loopIndex] = getF3DVert(mesh.loops[loopIndex], face, convertInfo, mesh) - for face in mesh.loop_triangles: - for edgeKey in face.edge_keys: - for otherFace in edgeDict[edgeKey]: - if otherFace == face: - continue - if (otherFace, face) not in edgeValidDict and \ - (face, otherFace) not in edgeValidDict: - edgeValid = \ - f3dVertDict[getLoopFromVert(edgeKey[0], face)] == \ - f3dVertDict[getLoopFromVert(edgeKey[0], otherFace)] and \ - f3dVertDict[getLoopFromVert(edgeKey[1], face)] == \ - f3dVertDict[getLoopFromVert(edgeKey[1], otherFace)] - edgeValidDict[(otherFace, face)] = edgeValid - if edgeValid: - validNeighborDict[face].append(otherFace) - validNeighborDict[otherFace].append(face) - return infoDict - -def fixLargeUVs(obj): - mesh = obj.data - if len(obj.data.uv_layers) == 0: - uv_data = obj.data.uv_layers.new().data - else: - uv_data = None - for uv_layer in obj.data.uv_layers: - if uv_layer.name == 'UVMap': - uv_data = uv_layer.data - if uv_data is None: - raise PluginError("Object \'" + obj.name + "\' does not have a UV layer named \'UVMap.\'") - - texSizeDict = {} - if len(obj.data.materials) == 0: - raise PluginError("This object needs an f3d material on it.") - - # Don't get tex dimensions here, as it also processes unused materials. - #texSizeDict[material] = getTexDimensions(material) - - for polygon in mesh.polygons: - material = obj.material_slots[polygon.material_index].material - if material is None: - raise PluginError("There are some faces on your mesh that are assigned to an empty material slot.") - - if material not in texSizeDict: - texSizeDict[material] = getTexDimensions(material) - if material.mat_ver > 3 and material.f3d_mat.use_large_textures: - continue +class VertexGroupInfo: + def __init__(self): + self.vertexGroups = {} # vertex index : vertex group + self.vertexGroupToLimb = {} - if material.mat_ver > 3: - f3dMat = material.f3d_mat - else: - f3dMat = material - UVinterval = [ - 2 if f3dMat.tex0.S.mirror or f3dMat.tex1.S.mirror else 1, - 2 if f3dMat.tex0.T.mirror or f3dMat.tex1.T.mirror else 1] +class MeshInfo: + def __init__(self): + self.vert = {} # all faces connected to a vert + self.edge = {} # all faces connected to an edge + self.f3dVert = {} # f3d vertex of a given loop + self.edgeValid = {} # bool given two faces + self.validNeighbors = {} # all neighbors of a face with a valid connecting edge + self.texDimensions = {} # texture dimensions for each material - size = texSizeDict[material] - if size[0] == 0 or size[1] == 0: - continue - cellSize = [1024 / size[0], 1024 / size[1]] - minUV, maxUV = findUVBounds(polygon, uv_data) - uvOffset = [0,0] + self.vertexGroupInfo = None - for i in range(2): - # Move any UVs close to or straddling edge - minDiff = (-cellSize[i]+2) - minUV[i] - if minDiff > 0: - applyOffset(minUV, maxUV, uvOffset, ceil(minDiff / UVinterval[i]) * UVinterval[i], i) +def getInfoDict(obj): + fixLargeUVs(obj) + obj.data.calc_loop_triangles() + obj.data.calc_normals_split() + if len(obj.data.materials) == 0: + raise PluginError("Mesh does not have any Fast3D materials.") + + infoDict = MeshInfo() + + vertDict = infoDict.vert + edgeDict = infoDict.edge + f3dVertDict = infoDict.f3dVert + edgeValidDict = infoDict.edgeValid + validNeighborDict = infoDict.validNeighbors + + mesh = obj.data + if len(obj.data.uv_layers) == 0: + uv_data = obj.data.uv_layers.new().data + else: + uv_data = None + for uv_layer in obj.data.uv_layers: + if uv_layer.name == "UVMap": + uv_data = uv_layer.data + if uv_data is None: + raise PluginError( + "Object '" + obj.name + "' does not have a UV layer named 'UVMap.'" + ) + for face in mesh.loop_triangles: + validNeighborDict[face] = [] + material = obj.material_slots[face.material_index].material + if material is None: + raise PluginError( + "There are some faces on your mesh that are assigned to an empty material slot." + ) + for vertIndex in face.vertices: + if vertIndex not in vertDict: + vertDict[vertIndex] = [] + if face not in vertDict[vertIndex]: + vertDict[vertIndex].append(face) + for edgeKey in face.edge_keys: + if edgeKey not in edgeDict: + edgeDict[edgeKey] = [] + if face not in edgeDict[edgeKey]: + edgeDict[edgeKey].append(face) + + for loopIndex in face.loops: + convertInfo = LoopConvertInfo( + uv_data, + obj, + isLightingDisabled(obj.material_slots[face.material_index].material), + ) + f3dVertDict[loopIndex] = getF3DVert( + mesh.loops[loopIndex], face, convertInfo, mesh + ) + for face in mesh.loop_triangles: + for edgeKey in face.edge_keys: + for otherFace in edgeDict[edgeKey]: + if otherFace == face: + continue + if (otherFace, face) not in edgeValidDict and ( + face, + otherFace, + ) not in edgeValidDict: + edgeValid = ( + f3dVertDict[getLoopFromVert(edgeKey[0], face)] + == f3dVertDict[getLoopFromVert(edgeKey[0], otherFace)] + and f3dVertDict[getLoopFromVert(edgeKey[1], face)] + == f3dVertDict[getLoopFromVert(edgeKey[1], otherFace)] + ) + edgeValidDict[(otherFace, face)] = edgeValid + if edgeValid: + validNeighborDict[face].append(otherFace) + validNeighborDict[otherFace].append(face) + return infoDict - maxDiff = maxUV[i] - (cellSize[i] - 1) - if maxDiff > 0: - applyOffset(minUV, maxUV, uvOffset, -ceil(maxDiff / UVinterval[i]) * UVinterval[i], i) - for loopIndex in polygon.loop_indices: - newUV = (uv_data[loopIndex].uv[0] + uvOffset[0], - uv_data[loopIndex].uv[1] + uvOffset[1]) - uv_data[loopIndex].uv = newUV +def fixLargeUVs(obj): + mesh = obj.data + if len(obj.data.uv_layers) == 0: + uv_data = obj.data.uv_layers.new().data + else: + uv_data = None + for uv_layer in obj.data.uv_layers: + if uv_layer.name == "UVMap": + uv_data = uv_layer.data + if uv_data is None: + raise PluginError( + "Object '" + obj.name + "' does not have a UV layer named 'UVMap.'" + ) + + texSizeDict = {} + if len(obj.data.materials) == 0: + raise PluginError("This object needs an f3d material on it.") + + # Don't get tex dimensions here, as it also processes unused materials. + # texSizeDict[material] = getTexDimensions(material) + + for polygon in mesh.polygons: + material = obj.material_slots[polygon.material_index].material + if material is None: + raise PluginError( + "There are some faces on your mesh that are assigned to an empty material slot." + ) + + if material not in texSizeDict: + texSizeDict[material] = getTexDimensions(material) + if material.mat_ver > 3 and material.f3d_mat.use_large_textures: + continue + + if material.mat_ver > 3: + f3dMat = material.f3d_mat + else: + f3dMat = material + + UVinterval = [ + 2 if f3dMat.tex0.S.mirror or f3dMat.tex1.S.mirror else 1, + 2 if f3dMat.tex0.T.mirror or f3dMat.tex1.T.mirror else 1, + ] + + size = texSizeDict[material] + if size[0] == 0 or size[1] == 0: + continue + cellSize = [1024 / size[0], 1024 / size[1]] + minUV, maxUV = findUVBounds(polygon, uv_data) + uvOffset = [0, 0] + + for i in range(2): + + # Move any UVs close to or straddling edge + minDiff = (-cellSize[i] + 2) - minUV[i] + if minDiff > 0: + applyOffset( + minUV, + maxUV, + uvOffset, + ceil(minDiff / UVinterval[i]) * UVinterval[i], + i, + ) + + maxDiff = maxUV[i] - (cellSize[i] - 1) + if maxDiff > 0: + applyOffset( + minUV, + maxUV, + uvOffset, + -ceil(maxDiff / UVinterval[i]) * UVinterval[i], + i, + ) + + for loopIndex in polygon.loop_indices: + newUV = ( + uv_data[loopIndex].uv[0] + uvOffset[0], + uv_data[loopIndex].uv[1] + uvOffset[1], + ) + uv_data[loopIndex].uv = newUV + + # if newUV[0] > cellSize[0] or \ + # newUV[1] > cellSize[1] or \ + # newUV[0] < -cellSize[0] or \ + # newUV[1] < -cellSize[1]: + # print("TOO BIG: " + str(newUV)) - #if newUV[0] > cellSize[0] or \ - # newUV[1] > cellSize[1] or \ - # newUV[0] < -cellSize[0] or \ - # newUV[1] < -cellSize[1]: - # print("TOO BIG: " + str(newUV)) def applyOffset(minUV, maxUV, uvOffset, offset, i): - minUV[i] += offset - maxUV[i] += offset - uvOffset[i] += offset + minUV[i] += offset + maxUV[i] += offset + uvOffset[i] += offset + def findUVBounds(polygon, uv_data): - minUV = [None, None] - maxUV = [None, None] - for loopIndex in polygon.loop_indices: - uv = uv_data[loopIndex].uv - for i in range(2): - minUV[i] = uv[i] if minUV[i] is None else min(minUV[i], uv[i]) - maxUV[i] = uv[i] if maxUV[i] is None else max(maxUV[i], uv[i]) - return minUV, maxUV + minUV = [None, None] + maxUV = [None, None] + for loopIndex in polygon.loop_indices: + uv = uv_data[loopIndex].uv + for i in range(2): + minUV[i] = uv[i] if minUV[i] is None else min(minUV[i], uv[i]) + maxUV[i] = uv[i] if maxUV[i] is None else max(maxUV[i], uv[i]) + return minUV, maxUV + class TileLoad: - def __init__(self, texFormat, twoTextures, texDimensions): - self.sl = None - self.sh = None - self.tl = None - self.th = None - - self.texFormat = texFormat - self.twoTextures = twoTextures - self.texDimensions = texDimensions - self.tmemMax = getTmemMax(texFormat) - - # offset by 1 pixel for filtering purposes - def getLow(self, value): - return int(max(math.floor(value - 1), 0)) - - def getHigh(self, value, field): - # 1024 wraps around to 0 - # -1 is because the high value is (max value - 1) - # ex. 32 pixel width -> high = 31 - return int(min(math.ceil(value + 1), min(self.texDimensions[field], 1024)) - 1) - - def tryAppend(self, other): - return self.appendTile(other.sl, other.sh, other.tl, other.th) - - def appendTile(self, sl, sh, tl, th): - new_sl = min(sl, self.sl) - new_sh = max(sh, self.sh) - new_tl = min(tl, self.tl) - new_th = max(th, self.th) - newWidth = abs(new_sl - new_sh) + 1 - newHeight = abs(new_tl - new_th) + 1 - - tmemUsage = getTmemWordUsage(self.texFormat, newWidth, newHeight) * 8 *\ - (2 if self.twoTextures else 1) - - if tmemUsage > self.tmemMax: - return False - else: - self.sl = new_sl - self.sh = new_sh - self.tl = new_tl - self.th = new_th - return True - - def tryAdd(self, points): - if len(points) == 0: - return True - - sl = self.getLow(points[0][0]) - sh = self.getHigh(points[0][0], 0) - tl = self.getLow(points[0][1]) - th = self.getHigh(points[0][1], 1) - - if self.sl is None: - self.sl = sl - self.sh = sh - self.tl = tl - self.th = th - - for point in points: - sl = min(self.getLow(point[0]), sl) - sh = max(self.getHigh(point[0], 0), sh) - tl = min(self.getLow(point[1]), tl) - th = max(self.getHigh(point[1], 1), th) - - return self.appendTile(sl, sh, tl, th) - - def getDimensions(self): - return [abs(self.sl - self.sh) + 1, - abs(self.tl - self.th) + 1] - -def saveMeshWithLargeTexturesByFaces(material, faces, fModel, fMesh, obj, drawLayer, - convertTextureData, currentGroupIndex, triConverterInfo, existingVertData, matRegionDict, - lastMaterialName): - ''' - lastMaterialName is for optimization; set it to None to disable optimization. - ''' - - if len(faces) == 0: - print('0 Faces Provided.') - return - - if material.mat_ver > 3: - f3dMat = material.f3d_mat - else: - f3dMat = material - - fMaterial, texDimensions = \ - saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData) - isPointSampled = isTexturePointSampled(material) - exportVertexColors = isLightingDisabled(material) - uv_data = obj.data.uv_layers['UVMap'].data - convertInfo = LoopConvertInfo(uv_data, obj, exportVertexColors) - - if fMaterial.largeTextureIndex == 0: - texFormat = f3dMat.tex0.tex_format - otherTex = f3dMat.tex1 - otherTextureIndex = 1 - else: - texFormat = f3dMat.tex1.tex_format - otherTex = f3dMat.tex0 - otherTextureIndex = 0 - - twoTextures = fMaterial.texturesLoaded[0] and fMaterial.texturesLoaded[1] - tileLoads = {} - faceTileLoads = {} - for face in faces: - uvs = [UVtoST(obj, loopIndex, uv_data, texDimensions, isPointSampled) for loopIndex in face.loops] - faceTileLoad = TileLoad(texFormat, twoTextures, texDimensions) - faceTileLoads[face] = faceTileLoad - if not faceTileLoad.tryAdd(uvs): - raise PluginError("Large texture material " + str(material.name) + " has a triangle that is too large to fit in a single tile load.") - - added = False - for tileLoad, sortedFaces in tileLoads.items(): - if tileLoad.tryAppend(faceTileLoad): - sortedFaces.append(face) - added = True - break - if not added: - tileLoads[faceTileLoad] = [face] - - tileLoads = list(tileLoads.items()) - - if material.name != lastMaterialName: - fMesh.add_material_call(fMaterial) - triGroup = fMesh.tri_group_new(fMaterial) - fMesh.draw.commands.append(SPDisplayList(triGroup.triList)) - - # For materials with tex0 and tex1, if the other texture can fit into a single tile load, - # we load it once at the beginning only. - otherTexSingleLoad = False - if fMaterial.texturesLoaded[otherTextureIndex]: - tmem = getTmemWordUsage(otherTex.tex_format, otherTex.tex.size[0], otherTex.tex.size[1]) * 8 - if tmem <= getTmemMax(otherTex.tex_format): - otherTexSingleLoad = True - #nextTmem = 0 - #revertCommands = GfxList("temp", GfxListTag.Draw, fModel.DLFormat) # Unhandled? - #texDimensions, nextTmem = \ - # saveTextureIndex(material.name, fModel, fMaterial, triGroup.triList, revertCommands, otherTex, 0, nextTmem, - # None, False, None, True, True) - - #saveGeometry(obj, triList, fMesh.vertexList, bFaces, - # bMesh, texDimensions, transformMatrix, isPointSampled, isFlatShaded, - # exportVertexColors, fModel.f3d) - currentGroupIndex = None - for tileLoad, tileFaces in tileLoads: - revertCommands = GfxList("temp", GfxListTag.Draw, fModel.DLFormat) - nextTmem = 0 - triGroup.triList.commands.append(DPPipeSync()) - if fMaterial.texturesLoaded[0] and not (otherTextureIndex == 0 and otherTexSingleLoad): - texDimensions0, nextTmem = \ - saveTextureIndex(material.name, fModel, fMaterial, triGroup.triList, revertCommands, f3dMat.tex0, 0, nextTmem, - None, False, [tileLoad, None], True, False) - if fMaterial.texturesLoaded[1] and not (otherTextureIndex == 1 and otherTexSingleLoad): - texDimensions1, nextTmem = saveTextureIndex(material.name, fModel, - fMaterial, triGroup.triList, revertCommands, f3dMat.tex1, 1, nextTmem, None, False, - [None, tileLoad], True, False) - - triConverter = TriangleConverter(triConverterInfo, texDimensions, material, currentGroupIndex, - triGroup.triList, triGroup.vertexList, - copy.deepcopy(existingVertData), copy.deepcopy(matRegionDict)) - - currentGroupIndex = saveTriangleStrip(triConverter, tileFaces, obj.data, False) - - if len(revertCommands.commands) > 0: - fMesh.draw.commands.extend(revertCommands.commands) - - triGroup.triList.commands.append(SPEndDisplayList()) - - if fMaterial.revert is not None: - fMesh.draw.commands.append(SPDisplayList(fMaterial.revert)) - - return currentGroupIndex + def __init__(self, texFormat, twoTextures, texDimensions): + self.sl = None + self.sh = None + self.tl = None + self.th = None + + self.texFormat = texFormat + self.twoTextures = twoTextures + self.texDimensions = texDimensions + self.tmemMax = getTmemMax(texFormat) + + # offset by 1 pixel for filtering purposes + def getLow(self, value): + return int(max(math.floor(value - 1), 0)) + + def getHigh(self, value, field): + # 1024 wraps around to 0 + # -1 is because the high value is (max value - 1) + # ex. 32 pixel width -> high = 31 + return int(min(math.ceil(value + 1), min(self.texDimensions[field], 1024)) - 1) + + def tryAppend(self, other): + return self.appendTile(other.sl, other.sh, other.tl, other.th) + + def appendTile(self, sl, sh, tl, th): + new_sl = min(sl, self.sl) + new_sh = max(sh, self.sh) + new_tl = min(tl, self.tl) + new_th = max(th, self.th) + newWidth = abs(new_sl - new_sh) + 1 + newHeight = abs(new_tl - new_th) + 1 + + tmemUsage = ( + getTmemWordUsage(self.texFormat, newWidth, newHeight) + * 8 + * (2 if self.twoTextures else 1) + ) + + if tmemUsage > self.tmemMax: + return False + else: + self.sl = new_sl + self.sh = new_sh + self.tl = new_tl + self.th = new_th + return True + + def tryAdd(self, points): + if len(points) == 0: + return True + + sl = self.getLow(points[0][0]) + sh = self.getHigh(points[0][0], 0) + tl = self.getLow(points[0][1]) + th = self.getHigh(points[0][1], 1) + + if self.sl is None: + self.sl = sl + self.sh = sh + self.tl = tl + self.th = th + + for point in points: + sl = min(self.getLow(point[0]), sl) + sh = max(self.getHigh(point[0], 0), sh) + tl = min(self.getLow(point[1]), tl) + th = max(self.getHigh(point[1], 1), th) + + return self.appendTile(sl, sh, tl, th) + + def getDimensions(self): + return [abs(self.sl - self.sh) + 1, abs(self.tl - self.th) + 1] + + +def saveMeshWithLargeTexturesByFaces( + material, + faces, + fModel, + fMesh, + obj, + drawLayer, + convertTextureData, + currentGroupIndex, + triConverterInfo, + existingVertData, + matRegionDict, + lastMaterialName, +): + """ + lastMaterialName is for optimization; set it to None to disable optimization. + """ + + if len(faces) == 0: + print("0 Faces Provided.") + return + + if material.mat_ver > 3: + f3dMat = material.f3d_mat + else: + f3dMat = material + + fMaterial, texDimensions = saveOrGetF3DMaterial( + material, fModel, obj, drawLayer, convertTextureData + ) + isPointSampled = isTexturePointSampled(material) + exportVertexColors = isLightingDisabled(material) + uv_data = obj.data.uv_layers["UVMap"].data + convertInfo = LoopConvertInfo(uv_data, obj, exportVertexColors) + + if fMaterial.largeTextureIndex == 0: + texFormat = f3dMat.tex0.tex_format + otherTex = f3dMat.tex1 + otherTextureIndex = 1 + else: + texFormat = f3dMat.tex1.tex_format + otherTex = f3dMat.tex0 + otherTextureIndex = 0 + + twoTextures = fMaterial.texturesLoaded[0] and fMaterial.texturesLoaded[1] + tileLoads = {} + faceTileLoads = {} + for face in faces: + uvs = [ + UVtoST(obj, loopIndex, uv_data, texDimensions, isPointSampled) + for loopIndex in face.loops + ] + faceTileLoad = TileLoad(texFormat, twoTextures, texDimensions) + faceTileLoads[face] = faceTileLoad + if not faceTileLoad.tryAdd(uvs): + raise PluginError( + "Large texture material " + + str(material.name) + + " has a triangle that is too large to fit in a single tile load." + ) + + added = False + for tileLoad, sortedFaces in tileLoads.items(): + if tileLoad.tryAppend(faceTileLoad): + sortedFaces.append(face) + added = True + break + if not added: + tileLoads[faceTileLoad] = [face] + + tileLoads = list(tileLoads.items()) + + if material.name != lastMaterialName: + fMesh.add_material_call(fMaterial) + triGroup = fMesh.tri_group_new(fMaterial) + fMesh.draw.commands.append(SPDisplayList(triGroup.triList)) + + # For materials with tex0 and tex1, if the other texture can fit into a single tile load, + # we load it once at the beginning only. + otherTexSingleLoad = False + if fMaterial.texturesLoaded[otherTextureIndex]: + tmem = ( + getTmemWordUsage( + otherTex.tex_format, otherTex.tex.size[0], otherTex.tex.size[1] + ) + * 8 + ) + if tmem <= getTmemMax(otherTex.tex_format): + otherTexSingleLoad = True + # nextTmem = 0 + # revertCommands = GfxList("temp", GfxListTag.Draw, fModel.DLFormat) # Unhandled? + # texDimensions, nextTmem = \ + # saveTextureIndex(material.name, fModel, fMaterial, triGroup.triList, revertCommands, otherTex, 0, nextTmem, + # None, False, None, True, True) + + # saveGeometry(obj, triList, fMesh.vertexList, bFaces, + # bMesh, texDimensions, transformMatrix, isPointSampled, isFlatShaded, + # exportVertexColors, fModel.f3d) + currentGroupIndex = None + for tileLoad, tileFaces in tileLoads: + revertCommands = GfxList("temp", GfxListTag.Draw, fModel.DLFormat) + nextTmem = 0 + triGroup.triList.commands.append(DPPipeSync()) + if fMaterial.texturesLoaded[0] and not ( + otherTextureIndex == 0 and otherTexSingleLoad + ): + texDimensions0, nextTmem = saveTextureIndex( + material.name, + fModel, + fMaterial, + triGroup.triList, + revertCommands, + f3dMat.tex0, + 0, + nextTmem, + None, + False, + [tileLoad, None], + True, + False, + ) + if fMaterial.texturesLoaded[1] and not ( + otherTextureIndex == 1 and otherTexSingleLoad + ): + texDimensions1, nextTmem = saveTextureIndex( + material.name, + fModel, + fMaterial, + triGroup.triList, + revertCommands, + f3dMat.tex1, + 1, + nextTmem, + None, + False, + [None, tileLoad], + True, + False, + ) + + triConverter = TriangleConverter( + triConverterInfo, + texDimensions, + material, + currentGroupIndex, + triGroup.triList, + triGroup.vertexList, + copy.deepcopy(existingVertData), + copy.deepcopy(matRegionDict), + ) + + currentGroupIndex = saveTriangleStrip(triConverter, tileFaces, obj.data, False) + + if len(revertCommands.commands) > 0: + fMesh.draw.commands.extend(revertCommands.commands) + + triGroup.triList.commands.append(SPEndDisplayList()) + + if fMaterial.revert is not None: + fMesh.draw.commands.append(SPDisplayList(fMaterial.revert)) + + return currentGroupIndex + # Make sure to set original_name before calling this # used when duplicating an object -def saveStaticModel(triConverterInfo, fModel, obj, transformMatrix, ownerName, convertTextureData, revertMatAtEnd, drawLayerField): - if len(obj.data.polygons) == 0: - return None +def saveStaticModel( + triConverterInfo, + fModel, + obj, + transformMatrix, + ownerName, + convertTextureData, + revertMatAtEnd, + drawLayerField, +): + if len(obj.data.polygons) == 0: + return None + + # checkForF3DMaterial(obj) + + facesByMat = {} + for face in obj.data.loop_triangles: + if face.material_index not in facesByMat: + facesByMat[face.material_index] = [] + facesByMat[face.material_index].append(face) + + fMeshes = {} + for material_index, faces in facesByMat.items(): + material = obj.material_slots[material_index].material + + if drawLayerField is not None and material.mat_ver > 3: + drawLayer = getattr(material.f3d_mat.draw_layer, drawLayerField) + drawLayerName = drawLayer + else: + drawLayer = fModel.getDrawLayerV3(obj) + drawLayerName = None + + if drawLayer not in fMeshes: + fMesh = fModel.addMesh( + obj.original_name, ownerName, drawLayerName, False, obj + ) + fMeshes[drawLayer] = fMesh + + if obj.use_f3d_culling and (fModel.f3d.F3DEX_GBI or fModel.f3d.F3DEX_GBI_2): + addCullCommand(obj, fMesh, transformMatrix, fModel.matWriteMethod) + else: + fMesh = fMeshes[drawLayer] + + checkForF3dMaterialInFaces(obj, material) + fMaterial, texDimensions = saveOrGetF3DMaterial( + material, fModel, obj, drawLayer, convertTextureData + ) + + if fMaterial.useLargeTextures: + saveMeshWithLargeTexturesByFaces( + material, + faces, + fModel, + fMesh, + obj, + drawLayer, + convertTextureData, + None, + triConverterInfo, + None, + None, + None, + ) + else: + saveMeshByFaces( + material, + faces, + fModel, + fMesh, + obj, + drawLayer, + convertTextureData, + None, + triConverterInfo, + None, + None, + None, + ) + + for drawLayer, fMesh in fMeshes.items(): + if revertMatAtEnd: + fModel.onEndDraw(fMesh, obj) + revertMatAndEndDraw(fMesh.draw, []) + else: + fModel.endDraw(fMesh, obj) + return fMeshes - #checkForF3DMaterial(obj) - - facesByMat = {} - for face in obj.data.loop_triangles: - if face.material_index not in facesByMat: - facesByMat[face.material_index] = [] - facesByMat[face.material_index].append(face) - - fMeshes = {} - for material_index, faces in facesByMat.items(): - material = obj.material_slots[material_index].material - - if drawLayerField is not None and material.mat_ver > 3: - drawLayer = getattr(material.f3d_mat.draw_layer, drawLayerField) - drawLayerName = drawLayer - else: - drawLayer = fModel.getDrawLayerV3(obj) - drawLayerName = None - - if drawLayer not in fMeshes: - fMesh = fModel.addMesh(obj.original_name, ownerName, drawLayerName, False, obj) - fMeshes[drawLayer] = fMesh - - if obj.use_f3d_culling and (fModel.f3d.F3DEX_GBI or fModel.f3d.F3DEX_GBI_2): - addCullCommand(obj, fMesh, transformMatrix, fModel.matWriteMethod) - else: - fMesh = fMeshes[drawLayer] - - checkForF3dMaterialInFaces(obj, material) - fMaterial, texDimensions = \ - saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData) - - if fMaterial.useLargeTextures: - saveMeshWithLargeTexturesByFaces(material, faces, fModel, fMesh, obj, drawLayer, convertTextureData, None, - triConverterInfo, None, None, None) - else: - saveMeshByFaces(material, faces, - fModel, fMesh, obj, drawLayer, convertTextureData, None, triConverterInfo, None, None, None) - - for drawLayer, fMesh in fMeshes.items(): - if revertMatAtEnd: - fModel.onEndDraw(fMesh, obj) - revertMatAndEndDraw(fMesh.draw, []) - else: - fModel.endDraw(fMesh, obj) - return fMeshes def addCullCommand(obj, fMesh, transformMatrix, matWriteMethod): - fMesh.add_cull_vtx() - # if the object has a specifically set culling bounds, use that instead - for vertexPos in obj.get('culling_bounds', obj.bound_box): - # Most other fields of convertVertexData are unnecessary for bounding box verts - fMesh.cullVertexList.vertices.append( - convertVertexData(obj.data, - mathutils.Vector(vertexPos), [0,0], - mathutils.Vector([0,0,0,0]), [32, 32], - transformMatrix, False, False)) - - if matWriteMethod == GfxMatWriteMethod.WriteDifferingAndRevert: - defaults = bpy.context.scene.world.rdp_defaults - if defaults.g_lighting: - cullCommands = [ - SPClearGeometryMode(['G_LIGHTING']), - SPVertex(fMesh.cullVertexList, 0, 8, 0), - SPSetGeometryMode(['G_LIGHTING']), - SPCullDisplayList(0, 7) - ] - else: - cullCommands = [ - SPVertex(fMesh.cullVertexList, 0, 8, 0), - SPCullDisplayList(0, 7) - ] - elif matWriteMethod == GfxMatWriteMethod.WriteAll: - cullCommands = [ - SPClearGeometryMode(['G_LIGHTING']), - SPVertex(fMesh.cullVertexList, 0, 8, 0), - SPCullDisplayList(0, 7) - ] - else: - raise PluginError("Unhandled material write method for f3d culling: " + str(matWriteMethod)) - fMesh.draw.commands = cullCommands + fMesh.draw.commands - -def exportF3DCommon(obj, fModel, transformMatrix, includeChildren, name, DLFormat, convertTextureData): - tempObj, meshList = combineObjects(obj, includeChildren, None, None) - try: - drawLayer = fModel.getDrawLayerV3(tempObj) - infoDict = getInfoDict(tempObj) - triConverterInfo = TriangleConverterInfo(tempObj, None, fModel.f3d, transformMatrix, infoDict) - fMesh = saveStaticModel(triConverterInfo, fModel, tempObj, - transformMatrix, name, convertTextureData, True, None)[drawLayer] - cleanupCombineObj(tempObj, meshList) - obj.select_set(True) - bpy.context.view_layer.objects.active = obj - except Exception as e: - cleanupCombineObj(tempObj, meshList) - obj.select_set(True) - bpy.context.view_layer.objects.active = obj - raise Exception(str(e)) - - return fMesh + fMesh.add_cull_vtx() + # if the object has a specifically set culling bounds, use that instead + for vertexPos in obj.get("culling_bounds", obj.bound_box): + # Most other fields of convertVertexData are unnecessary for bounding box verts + fMesh.cullVertexList.vertices.append( + convertVertexData( + obj.data, + mathutils.Vector(vertexPos), + [0, 0], + mathutils.Vector([0, 0, 0, 0]), + [32, 32], + transformMatrix, + False, + False, + ) + ) + + if matWriteMethod == GfxMatWriteMethod.WriteDifferingAndRevert: + defaults = bpy.context.scene.world.rdp_defaults + if defaults.g_lighting: + cullCommands = [ + SPClearGeometryMode(["G_LIGHTING"]), + SPVertex(fMesh.cullVertexList, 0, 8, 0), + SPSetGeometryMode(["G_LIGHTING"]), + SPCullDisplayList(0, 7), + ] + else: + cullCommands = [ + SPVertex(fMesh.cullVertexList, 0, 8, 0), + SPCullDisplayList(0, 7), + ] + elif matWriteMethod == GfxMatWriteMethod.WriteAll: + cullCommands = [ + SPClearGeometryMode(["G_LIGHTING"]), + SPVertex(fMesh.cullVertexList, 0, 8, 0), + SPCullDisplayList(0, 7), + ] + else: + raise PluginError( + "Unhandled material write method for f3d culling: " + str(matWriteMethod) + ) + fMesh.draw.commands = cullCommands + fMesh.draw.commands + + +def exportF3DCommon( + obj, fModel, transformMatrix, includeChildren, name, DLFormat, convertTextureData +): + tempObj, meshList = combineObjects(obj, includeChildren, None, None) + try: + drawLayer = fModel.getDrawLayerV3(tempObj) + infoDict = getInfoDict(tempObj) + triConverterInfo = TriangleConverterInfo( + tempObj, None, fModel.f3d, transformMatrix, infoDict + ) + fMesh = saveStaticModel( + triConverterInfo, + fModel, + tempObj, + transformMatrix, + name, + convertTextureData, + True, + None, + )[drawLayer] + cleanupCombineObj(tempObj, meshList) + obj.select_set(True) + bpy.context.view_layer.objects.active = obj + except Exception as e: + cleanupCombineObj(tempObj, meshList) + obj.select_set(True) + bpy.context.view_layer.objects.active = obj + raise Exception(str(e)) + + return fMesh def checkForF3dMaterialInFaces(obj, material): - if not material.is_f3d: - raise PluginError("Material '" + material.name + "' on object '" + obj.name +\ - "' is not a Fast3D material. Replace it with a Fast3D material.") + if not material.is_f3d: + raise PluginError( + "Material '" + + material.name + + "' on object '" + + obj.name + + "' is not a Fast3D material. Replace it with a Fast3D material." + ) + def checkForF3DMaterial(obj): - if len(obj.material_slots) == 0: - raise PluginError(obj.name + " has no Fast3D material. Make sure to add a Fast3D material to it.") - for materialSlot in obj.material_slots: - if materialSlot.material is None or \ - not materialSlot.material.is_f3d: - raise PluginError(obj.name + " has either empty material slots " +\ - 'or non-Fast3D materials. Remove any regular blender materials / empty slots.') + if len(obj.material_slots) == 0: + raise PluginError( + obj.name + + " has no Fast3D material. Make sure to add a Fast3D material to it." + ) + for materialSlot in obj.material_slots: + if materialSlot.material is None or not materialSlot.material.is_f3d: + raise PluginError( + obj.name + + " has either empty material slots " + + "or non-Fast3D materials. Remove any regular blender materials / empty slots." + ) + def revertMatAndEndDraw(gfxList, otherCommands): - gfxList.commands.extend([ - DPPipeSync(), - SPSetGeometryMode(['G_LIGHTING']), - SPClearGeometryMode(['G_TEXTURE_GEN']), - DPSetCombineMode(*S_SHADED_SOLID), - SPTexture(0xFFFF, 0xFFFF, 0, 0, 0)] +\ - otherCommands) + gfxList.commands.extend( + [ + DPPipeSync(), + SPSetGeometryMode(["G_LIGHTING"]), + SPClearGeometryMode(["G_TEXTURE_GEN"]), + DPSetCombineMode(*S_SHADED_SOLID), + SPTexture(0xFFFF, 0xFFFF, 0, 0, 0), + ] + + otherCommands + ) + + if gfxList.DLFormat != DLFormat.Dynamic: + gfxList.commands.append(SPEndDisplayList()) - if gfxList.DLFormat != DLFormat.Dynamic: - gfxList.commands.append(SPEndDisplayList()) def getCommonEdge(face1, face2, mesh): - for edgeKey1 in face1.edge_keys: - for edgeKey2 in face2.edge_keys: - if edgeKey1 == edgeKey2: - return edgeKey1 - raise PluginError("No common edge between faces " + str(face1.index) + \ - ' and ' + str(face2.index)) + for edgeKey1 in face1.edge_keys: + for edgeKey2 in face2.edge_keys: + if edgeKey1 == edgeKey2: + return edgeKey1 + raise PluginError( + "No common edge between faces " + str(face1.index) + " and " + str(face2.index) + ) + def edgeValid(edgeValidDict, face, otherFace): - if (face, otherFace) in edgeValidDict: - return edgeValidDict[(face, otherFace)] - else: - return edgeValidDict[(otherFace, face)] + if (face, otherFace) in edgeValidDict: + return edgeValidDict[(face, otherFace)] + else: + return edgeValidDict[(otherFace, face)] + def getLowestUnvisitedNeighborCountFace(unvisitedFaces, infoDict): - lowestNeighborFace = unvisitedFaces[0] - lowestNeighborCount = len(infoDict.validNeighbors[lowestNeighborFace]) - for face in unvisitedFaces: - neighborCount = len(infoDict.validNeighbors[face]) - if neighborCount < lowestNeighborCount: - lowestNeighborFace = face - lowestNeighborCount = neighborCount - return lowestNeighborFace - -def getNextNeighborFace(faces, face, lastEdgeKey, visitedFaces, possibleFaces, - infoDict): - - if lastEdgeKey is not None: - handledEdgeKeys = [lastEdgeKey] - nextEdgeKey = face.edge_keys[ - (face.edge_keys.index(lastEdgeKey) + 1) % 3] - else: - handledEdgeKeys = [] - nextEdgeKey = face.edge_keys[0] - - nextFaceAndEdge = (None, None) - while nextEdgeKey not in handledEdgeKeys: - for linkedFace in infoDict.edge[nextEdgeKey]: - if linkedFace == face or linkedFace not in faces: - continue - elif edgeValid(infoDict.edgeValid, linkedFace, face) and \ - linkedFace not in visitedFaces: - if nextFaceAndEdge[0] is None: - #print(nextLoop.face) - nextFaceAndEdge = (linkedFace, nextEdgeKey) - else: - # Move face to front of queue - if linkedFace in possibleFaces: - possibleFaces.remove(linkedFace) - possibleFaces.insert(0, linkedFace) - handledEdgeKeys.append(nextEdgeKey) - nextEdgeKey = face.edge_keys[ - (face.edge_keys.index(nextEdgeKey) + 1) % 3] - return nextFaceAndEdge + lowestNeighborFace = unvisitedFaces[0] + lowestNeighborCount = len(infoDict.validNeighbors[lowestNeighborFace]) + for face in unvisitedFaces: + neighborCount = len(infoDict.validNeighbors[face]) + if neighborCount < lowestNeighborCount: + lowestNeighborFace = face + lowestNeighborCount = neighborCount + return lowestNeighborFace + + +def getNextNeighborFace( + faces, face, lastEdgeKey, visitedFaces, possibleFaces, infoDict +): + + if lastEdgeKey is not None: + handledEdgeKeys = [lastEdgeKey] + nextEdgeKey = face.edge_keys[(face.edge_keys.index(lastEdgeKey) + 1) % 3] + else: + handledEdgeKeys = [] + nextEdgeKey = face.edge_keys[0] + + nextFaceAndEdge = (None, None) + while nextEdgeKey not in handledEdgeKeys: + for linkedFace in infoDict.edge[nextEdgeKey]: + if linkedFace == face or linkedFace not in faces: + continue + elif ( + edgeValid(infoDict.edgeValid, linkedFace, face) + and linkedFace not in visitedFaces + ): + if nextFaceAndEdge[0] is None: + # print(nextLoop.face) + nextFaceAndEdge = (linkedFace, nextEdgeKey) + else: + # Move face to front of queue + if linkedFace in possibleFaces: + possibleFaces.remove(linkedFace) + possibleFaces.insert(0, linkedFace) + handledEdgeKeys.append(nextEdgeKey) + nextEdgeKey = face.edge_keys[(face.edge_keys.index(nextEdgeKey) + 1) % 3] + return nextFaceAndEdge + def saveTriangleStrip(triConverter, faces, mesh, terminateDL): - visitedFaces = [] - unvisitedFaces = copy.copy(faces) - possibleFaces = [] - lastEdgeKey = None - infoDict = triConverter.triConverterInfo.infoDict - neighborFace = getLowestUnvisitedNeighborCountFace(unvisitedFaces, infoDict) - - while len(visitedFaces) < len(faces): - #print(str(len(visitedFaces)) + " " + str(len(bFaces))) - if neighborFace is None: - if len(possibleFaces) > 0: - #print("get neighbor from queue") - neighborFace = possibleFaces[0] - lastEdgeKey = None - possibleFaces = [] - else: - #print('get new neighbor') - neighborFace = getLowestUnvisitedNeighborCountFace( - unvisitedFaces, infoDict) - lastEdgeKey = None - - triConverter.addFace(neighborFace) - if neighborFace in visitedFaces: - raise PluginError("Repeated face") - visitedFaces.append(neighborFace) - unvisitedFaces.remove(neighborFace) - if neighborFace in possibleFaces: - possibleFaces.remove(neighborFace) - for otherFace in infoDict.validNeighbors[neighborFace]: - infoDict.validNeighbors[otherFace].remove(neighborFace) - - neighborFace, lastEdgeKey = getNextNeighborFace(faces, - neighborFace, lastEdgeKey, visitedFaces, possibleFaces, infoDict) - - triConverter.finish(terminateDL) - return triConverter.currentGroupIndex + visitedFaces = [] + unvisitedFaces = copy.copy(faces) + possibleFaces = [] + lastEdgeKey = None + infoDict = triConverter.triConverterInfo.infoDict + neighborFace = getLowestUnvisitedNeighborCountFace(unvisitedFaces, infoDict) + + while len(visitedFaces) < len(faces): + # print(str(len(visitedFaces)) + " " + str(len(bFaces))) + if neighborFace is None: + if len(possibleFaces) > 0: + # print("get neighbor from queue") + neighborFace = possibleFaces[0] + lastEdgeKey = None + possibleFaces = [] + else: + # print('get new neighbor') + neighborFace = getLowestUnvisitedNeighborCountFace( + unvisitedFaces, infoDict + ) + lastEdgeKey = None + + triConverter.addFace(neighborFace) + if neighborFace in visitedFaces: + raise PluginError("Repeated face") + visitedFaces.append(neighborFace) + unvisitedFaces.remove(neighborFace) + if neighborFace in possibleFaces: + possibleFaces.remove(neighborFace) + for otherFace in infoDict.validNeighbors[neighborFace]: + infoDict.validNeighbors[otherFace].remove(neighborFace) + + neighborFace, lastEdgeKey = getNextNeighborFace( + faces, neighborFace, lastEdgeKey, visitedFaces, possibleFaces, infoDict + ) + + triConverter.finish(terminateDL) + return triConverter.currentGroupIndex + # Necessary for UV half pixel offset (see 13.7.5.3) def isTexturePointSampled(material): - if material.mat_ver > 3: - f3dMat = material.f3d_mat - else: - f3dMat = material - return f3dMat.rdp_settings.g_mdsft_text_filt == 'G_TF_POINT' + if material.mat_ver > 3: + f3dMat = material.f3d_mat + else: + f3dMat = material + return f3dMat.rdp_settings.g_mdsft_text_filt == "G_TF_POINT" + def isLightingDisabled(material): - if material.mat_ver > 3: - f3dMat = material.f3d_mat - else: - f3dMat = material - return not f3dMat.rdp_settings.g_lighting + if material.mat_ver > 3: + f3dMat = material.f3d_mat + else: + f3dMat = material + return not f3dMat.rdp_settings.g_lighting + # Necessary as G_SHADE_SMOOTH actually does nothing def checkIfFlatShaded(material): - if material.mat_ver > 3: - f3dMat = material.f3d_mat - else: - f3dMat = material - return not f3dMat.rdp_settings.g_shade_smooth - -def saveMeshByFaces(material, faces, fModel, fMesh, obj, drawLayer, - convertTextureData, currentGroupIndex, triConverterInfo, - existingVertData, matRegionDict, lastMaterialName): - ''' - lastMaterialName is for optimization; set it to None to disable optimization. - ''' - - if len(faces) == 0: - print('0 Faces Provided.') - return - fMaterial, texDimensions = \ - saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData) - isPointSampled = isTexturePointSampled(material) - exportVertexColors = isLightingDisabled(material) - uv_data = obj.data.uv_layers['UVMap'].data - convertInfo = LoopConvertInfo(uv_data, obj, exportVertexColors) - - if material.name != lastMaterialName: - fMesh.add_material_call(fMaterial) - triGroup = fMesh.tri_group_new(fMaterial) - fMesh.draw.commands.append(SPDisplayList(triGroup.triList)) - - triConverter = TriangleConverter(triConverterInfo, texDimensions, material, - currentGroupIndex, triGroup.triList, triGroup.vertexList, - copy.deepcopy(existingVertData), copy.deepcopy(matRegionDict)) - - currentGroupIndex = saveTriangleStrip(triConverter, faces, obj.data, True) - - if fMaterial.revert is not None: - fMesh.draw.commands.append(SPDisplayList(fMaterial.revert)) - - return currentGroupIndex + if material.mat_ver > 3: + f3dMat = material.f3d_mat + else: + f3dMat = material + return not f3dMat.rdp_settings.g_shade_smooth + + +def saveMeshByFaces( + material, + faces, + fModel, + fMesh, + obj, + drawLayer, + convertTextureData, + currentGroupIndex, + triConverterInfo, + existingVertData, + matRegionDict, + lastMaterialName, +): + """ + lastMaterialName is for optimization; set it to None to disable optimization. + """ + + if len(faces) == 0: + print("0 Faces Provided.") + return + fMaterial, texDimensions = saveOrGetF3DMaterial( + material, fModel, obj, drawLayer, convertTextureData + ) + isPointSampled = isTexturePointSampled(material) + exportVertexColors = isLightingDisabled(material) + uv_data = obj.data.uv_layers["UVMap"].data + convertInfo = LoopConvertInfo(uv_data, obj, exportVertexColors) + + if material.name != lastMaterialName: + fMesh.add_material_call(fMaterial) + triGroup = fMesh.tri_group_new(fMaterial) + fMesh.draw.commands.append(SPDisplayList(triGroup.triList)) + + triConverter = TriangleConverter( + triConverterInfo, + texDimensions, + material, + currentGroupIndex, + triGroup.triList, + triGroup.vertexList, + copy.deepcopy(existingVertData), + copy.deepcopy(matRegionDict), + ) + + currentGroupIndex = saveTriangleStrip(triConverter, faces, obj.data, True) + + if fMaterial.revert is not None: + fMesh.draw.commands.append(SPDisplayList(fMaterial.revert)) + + return currentGroupIndex + def get8bitRoundedNormal(loop, mesh): - alpha_layer = mesh.vertex_colors['Alpha'].data if 'Alpha' in \ - mesh.vertex_colors else None - - if alpha_layer is not None: - normalizedAColor = alpha_layer[loop.index].color - normalizedA = mathutils.Color(normalizedAColor[0:3]).v - else: - normalizedA = 1 - - # Don't round, as this may move UV toward UV bounds. - return mathutils.Vector( - (int(loop.normal[0] * 128) / 128, - int(loop.normal[1] * 128) / 128, - int(loop.normal[2] * 128) / 128, - normalizedA) - ) + alpha_layer = ( + mesh.vertex_colors["Alpha"].data if "Alpha" in mesh.vertex_colors else None + ) + + if alpha_layer is not None: + normalizedAColor = alpha_layer[loop.index].color + normalizedA = mathutils.Color(normalizedAColor[0:3]).v + else: + normalizedA = 1 + + # Don't round, as this may move UV toward UV bounds. + return mathutils.Vector( + ( + int(loop.normal[0] * 128) / 128, + int(loop.normal[1] * 128) / 128, + int(loop.normal[2] * 128) / 128, + normalizedA, + ) + ) + class LoopConvertInfo: - def __init__(self, uv_data, obj, exportVertexColors): - self.uv_data = uv_data - self.obj = obj - self.exportVertexColors = exportVertexColors + def __init__(self, uv_data, obj, exportVertexColors): + self.uv_data = uv_data + self.obj = obj + self.exportVertexColors = exportVertexColors + def getNewIndices(existingIndices, bufferStart): - n = bufferStart - newIndices = [] - for index in existingIndices: - if index is None: - newIndices.append(n) - n += 1 - else: - newIndices.append(index) - return newIndices + n = bufferStart + newIndices = [] + for index in existingIndices: + if index is None: + newIndices.append(n) + n += 1 + else: + newIndices.append(index) + return newIndices + class BufferVertex: - def __init__(self, f3dVert, groupIndex, materialIndex): - self.f3dVert = f3dVert - self.groupIndex = groupIndex - self.materialIndex = materialIndex + def __init__(self, f3dVert, groupIndex, materialIndex): + self.f3dVert = f3dVert + self.groupIndex = groupIndex + self.materialIndex = materialIndex - def __eq__(self, other): - return self.f3dVert == other.f3dVert and \ - self.groupIndex == other.groupIndex and \ - self.materialIndex == other.materialIndex + def __eq__(self, other): + return ( + self.f3dVert == other.f3dVert + and self.groupIndex == other.groupIndex + and self.materialIndex == other.materialIndex + ) class TriangleConverterInfo: - def __init__(self, obj, armature, f3d, transformMatrix, infoDict): - self.infoDict = infoDict - self.vertexGroupInfo = self.infoDict.vertexGroupInfo - self.armature = armature - self.obj = obj - self.mesh = obj.data - self.f3d = f3d - self.transformMatrix = transformMatrix - - # Caching names - self.groupNames = {} - - def getMatrixAddrFromGroup(self, groupIndex): - raise PluginError("TriangleConverterInfo must be extended with getMatrixAddrFromGroup implemented for game specific uses.") - - def getTransformMatrix(self, groupIndex): - if self.armature is None or groupIndex is None: - groupMatrix = mathutils.Matrix.Identity(4) - else: - if groupIndex not in self.groupNames: - self.groupNames[groupIndex] = getGroupNameFromIndex(self.obj, groupIndex) - name = self.groupNames[groupIndex] - if name not in self.armature.bones: - print("Vertex group " + name + " not found in bones.") - groupMatrix = mathutils.Matrix.Identity(4) - else: - groupMatrix = self.armature.bones[name].matrix_local.inverted() - return self.transformMatrix @ groupMatrix + def __init__(self, obj, armature, f3d, transformMatrix, infoDict): + self.infoDict = infoDict + self.vertexGroupInfo = self.infoDict.vertexGroupInfo + self.armature = armature + self.obj = obj + self.mesh = obj.data + self.f3d = f3d + self.transformMatrix = transformMatrix + + # Caching names + self.groupNames = {} + + def getMatrixAddrFromGroup(self, groupIndex): + raise PluginError( + "TriangleConverterInfo must be extended with getMatrixAddrFromGroup implemented for game specific uses." + ) + + def getTransformMatrix(self, groupIndex): + if self.armature is None or groupIndex is None: + groupMatrix = mathutils.Matrix.Identity(4) + else: + if groupIndex not in self.groupNames: + self.groupNames[groupIndex] = getGroupNameFromIndex( + self.obj, groupIndex + ) + name = self.groupNames[groupIndex] + if name not in self.armature.bones: + print("Vertex group " + name + " not found in bones.") + groupMatrix = mathutils.Matrix.Identity(4) + else: + groupMatrix = self.armature.bones[name].matrix_local.inverted() + return self.transformMatrix @ groupMatrix + # existingVertexData is used for cases where we want to assume the presence of vertex data # loaded in from a previous matrix transform (ex. sm64 skinning) class TriangleConverter: - def __init__(self, triConverterInfo, texDimensions, material, currentGroupIndex, - triList, vtxList, existingVertexData, existingVertexMaterialRegions): - self.triConverterInfo = triConverterInfo - self.currentGroupIndex = currentGroupIndex - self.originalGroupIndex = currentGroupIndex - - # Existing data assumed to be already loaded in. - if existingVertexData is not None: - # [(position, uv, colorOrNormal)] - self.vertBuffer = existingVertexData - else: - self.vertBuffer = [] - self.existingVertexMaterialRegions = existingVertexMaterialRegions - self.bufferStart = len(self.vertBuffer) - self.vertexBufferTriangles = [] # [(index0, index1, index2)] - - self.triList = triList - self.vtxList = vtxList - - isPointSampled = isTexturePointSampled(material) - exportVertexColors = isLightingDisabled(material) - uv_data = triConverterInfo.obj.data.uv_layers['UVMap'].data - self.convertInfo = LoopConvertInfo(uv_data, triConverterInfo.obj, exportVertexColors) - self.texDimensions = texDimensions - self.isPointSampled = isPointSampled - self.exportVertexColors = exportVertexColors - - - - def vertInBuffer(self, bufferVert, material_index): - if self.existingVertexMaterialRegions is None: - return bufferVert in self.vertBuffer - else: - if material_index in self.existingVertexMaterialRegions: - matRegion = self.existingVertexMaterialRegions[material_index] - if bufferVert in self.vertBuffer[matRegion[0] : matRegion[1]]: - return True - - return bufferVert in self.vertBuffer[self.bufferStart : ] - - def getSortedBuffer(self): - limbVerts = {} - for bufferVert in self.vertBuffer[self.bufferStart:]: - if bufferVert.groupIndex not in limbVerts: - limbVerts[bufferVert.groupIndex] = [] - limbVerts[bufferVert.groupIndex].append(bufferVert) - - return limbVerts - - def processGeometry(self): - # Sort verts by limb index, then load current limb verts - bufferStart = self.bufferStart - bufferEnd = self.bufferStart - limbVerts = self.getSortedBuffer() - - if self.currentGroupIndex in limbVerts: - currentLimbVerts = limbVerts[self.currentGroupIndex] - self.vertBuffer = self.vertBuffer[:self.bufferStart] + currentLimbVerts - self.triList.commands.append( - SPVertex(self.vtxList, len(self.vtxList.vertices), - len(currentLimbVerts), self.bufferStart)) - bufferEnd += len(currentLimbVerts) - del limbVerts[self.currentGroupIndex] - - # Save vertices - for bufferVert in self.vertBuffer[bufferStart : bufferEnd]: - self.vtxList.vertices.append(convertVertexData(self.triConverterInfo.mesh, - bufferVert.f3dVert[0], bufferVert.f3dVert[1], bufferVert.f3dVert[2], self.texDimensions, - self.triConverterInfo.getTransformMatrix(bufferVert.groupIndex), self.isPointSampled, - self.exportVertexColors)) - - bufferStart = bufferEnd - else: - self.vertBuffer = self.vertBuffer[:self.bufferStart] - - # Load other limb verts - for groupIndex, bufferVerts in limbVerts.items(): - if groupIndex != self.currentGroupIndex: - self.triList.commands.append(SPMatrix(self.triConverterInfo.getMatrixAddrFromGroup(groupIndex), "G_MTX_LOAD")) - self.currentGroupIndex = groupIndex - self.triList.commands.append( - SPVertex(self.vtxList, len(self.vtxList.vertices), - len(bufferVerts), bufferStart)) - - self.vertBuffer += bufferVerts - bufferEnd += len(bufferVerts) - - # Save vertices - for bufferVert in self.vertBuffer[bufferStart : bufferEnd]: - self.vtxList.vertices.append(convertVertexData(self.triConverterInfo.mesh, - bufferVert.f3dVert[0], bufferVert.f3dVert[1], bufferVert.f3dVert[2], self.texDimensions, - self.triConverterInfo.getTransformMatrix(bufferVert.groupIndex), self.isPointSampled, - self.exportVertexColors)) - - bufferStart = bufferEnd - - # Load triangles - self.triList.commands.extend(createTriangleCommands( - self.vertexBufferTriangles, self.vertBuffer, self.triConverterInfo.f3d.F3DEX_GBI)) - - def addFace(self, face): - triIndices = [] - addedVerts = [] # verts added to existing vertexBuffer - allVerts = [] # all verts not in 'untouched' buffer region - - for loopIndex in face.loops: - loop = self.triConverterInfo.mesh.loops[loopIndex] - vertexGroup = self.triConverterInfo.vertexGroupInfo.vertexGroups[loop.vertex_index] if self.triConverterInfo.vertexGroupInfo is not None else None - bufferVert = BufferVertex(getF3DVert(loop, face, self.convertInfo, self.triConverterInfo.mesh), - vertexGroup, face.material_index) - triIndices.append(bufferVert) - if not self.vertInBuffer(bufferVert, face.material_index): - addedVerts.append(bufferVert) - - if bufferVert not in self.vertBuffer[:self.bufferStart]: - allVerts.append(bufferVert) - - # We care only about load size, since loading is what takes up time. - # Even if vert_buffer is larger, its still another load to fill it. - if len(self.vertBuffer) + len(addedVerts) > self.triConverterInfo.f3d.vert_load_size: - self.processGeometry() - self.vertBuffer = self.vertBuffer[:self.bufferStart] + allVerts - self.vertexBufferTriangles = [triIndices] - else: - self.vertBuffer.extend(addedVerts) - self.vertexBufferTriangles.append(triIndices) - - def finish(self, terminateDL): - if len(self.vertexBufferTriangles) > 0: - self.processGeometry() + def __init__( + self, + triConverterInfo, + texDimensions, + material, + currentGroupIndex, + triList, + vtxList, + existingVertexData, + existingVertexMaterialRegions, + ): + self.triConverterInfo = triConverterInfo + self.currentGroupIndex = currentGroupIndex + self.originalGroupIndex = currentGroupIndex + + # Existing data assumed to be already loaded in. + if existingVertexData is not None: + # [(position, uv, colorOrNormal)] + self.vertBuffer = existingVertexData + else: + self.vertBuffer = [] + self.existingVertexMaterialRegions = existingVertexMaterialRegions + self.bufferStart = len(self.vertBuffer) + self.vertexBufferTriangles = [] # [(index0, index1, index2)] + + self.triList = triList + self.vtxList = vtxList + + isPointSampled = isTexturePointSampled(material) + exportVertexColors = isLightingDisabled(material) + uv_data = triConverterInfo.obj.data.uv_layers["UVMap"].data + self.convertInfo = LoopConvertInfo( + uv_data, triConverterInfo.obj, exportVertexColors + ) + self.texDimensions = texDimensions + self.isPointSampled = isPointSampled + self.exportVertexColors = exportVertexColors + + def vertInBuffer(self, bufferVert, material_index): + if self.existingVertexMaterialRegions is None: + return bufferVert in self.vertBuffer + else: + if material_index in self.existingVertexMaterialRegions: + matRegion = self.existingVertexMaterialRegions[material_index] + if bufferVert in self.vertBuffer[matRegion[0] : matRegion[1]]: + return True + + return bufferVert in self.vertBuffer[self.bufferStart :] + + def getSortedBuffer(self): + limbVerts = {} + for bufferVert in self.vertBuffer[self.bufferStart :]: + if bufferVert.groupIndex not in limbVerts: + limbVerts[bufferVert.groupIndex] = [] + limbVerts[bufferVert.groupIndex].append(bufferVert) + + return limbVerts + + def processGeometry(self): + # Sort verts by limb index, then load current limb verts + bufferStart = self.bufferStart + bufferEnd = self.bufferStart + limbVerts = self.getSortedBuffer() + + if self.currentGroupIndex in limbVerts: + currentLimbVerts = limbVerts[self.currentGroupIndex] + self.vertBuffer = self.vertBuffer[: self.bufferStart] + currentLimbVerts + self.triList.commands.append( + SPVertex( + self.vtxList, + len(self.vtxList.vertices), + len(currentLimbVerts), + self.bufferStart, + ) + ) + bufferEnd += len(currentLimbVerts) + del limbVerts[self.currentGroupIndex] + + # Save vertices + for bufferVert in self.vertBuffer[bufferStart:bufferEnd]: + self.vtxList.vertices.append( + convertVertexData( + self.triConverterInfo.mesh, + bufferVert.f3dVert[0], + bufferVert.f3dVert[1], + bufferVert.f3dVert[2], + self.texDimensions, + self.triConverterInfo.getTransformMatrix(bufferVert.groupIndex), + self.isPointSampled, + self.exportVertexColors, + ) + ) + + bufferStart = bufferEnd + else: + self.vertBuffer = self.vertBuffer[: self.bufferStart] + + # Load other limb verts + for groupIndex, bufferVerts in limbVerts.items(): + if groupIndex != self.currentGroupIndex: + self.triList.commands.append( + SPMatrix( + self.triConverterInfo.getMatrixAddrFromGroup(groupIndex), + "G_MTX_LOAD", + ) + ) + self.currentGroupIndex = groupIndex + self.triList.commands.append( + SPVertex( + self.vtxList, + len(self.vtxList.vertices), + len(bufferVerts), + bufferStart, + ) + ) + + self.vertBuffer += bufferVerts + bufferEnd += len(bufferVerts) + + # Save vertices + for bufferVert in self.vertBuffer[bufferStart:bufferEnd]: + self.vtxList.vertices.append( + convertVertexData( + self.triConverterInfo.mesh, + bufferVert.f3dVert[0], + bufferVert.f3dVert[1], + bufferVert.f3dVert[2], + self.texDimensions, + self.triConverterInfo.getTransformMatrix(bufferVert.groupIndex), + self.isPointSampled, + self.exportVertexColors, + ) + ) + + bufferStart = bufferEnd + + # Load triangles + self.triList.commands.extend( + createTriangleCommands( + self.vertexBufferTriangles, + self.vertBuffer, + self.triConverterInfo.f3d.F3DEX_GBI, + ) + ) + + def addFace(self, face): + triIndices = [] + addedVerts = [] # verts added to existing vertexBuffer + allVerts = [] # all verts not in 'untouched' buffer region + + for loopIndex in face.loops: + loop = self.triConverterInfo.mesh.loops[loopIndex] + vertexGroup = ( + self.triConverterInfo.vertexGroupInfo.vertexGroups[loop.vertex_index] + if self.triConverterInfo.vertexGroupInfo is not None + else None + ) + bufferVert = BufferVertex( + getF3DVert(loop, face, self.convertInfo, self.triConverterInfo.mesh), + vertexGroup, + face.material_index, + ) + triIndices.append(bufferVert) + if not self.vertInBuffer(bufferVert, face.material_index): + addedVerts.append(bufferVert) + + if bufferVert not in self.vertBuffer[: self.bufferStart]: + allVerts.append(bufferVert) + + # We care only about load size, since loading is what takes up time. + # Even if vert_buffer is larger, its still another load to fill it. + if ( + len(self.vertBuffer) + len(addedVerts) + > self.triConverterInfo.f3d.vert_load_size + ): + self.processGeometry() + self.vertBuffer = self.vertBuffer[: self.bufferStart] + allVerts + self.vertexBufferTriangles = [triIndices] + else: + self.vertBuffer.extend(addedVerts) + self.vertexBufferTriangles.append(triIndices) + + def finish(self, terminateDL): + if len(self.vertexBufferTriangles) > 0: + self.processGeometry() + + # if self.originalGroupIndex != self.currentGroupIndex: + # self.triList.commands.append(SPMatrix(getMatrixAddrFromGroup(self.originalGroupIndex), "G_MTX_LOAD")) + if terminateDL: + self.triList.commands.append(SPEndDisplayList()) - #if self.originalGroupIndex != self.currentGroupIndex: - # self.triList.commands.append(SPMatrix(getMatrixAddrFromGroup(self.originalGroupIndex), "G_MTX_LOAD")) - if terminateDL: - self.triList.commands.append(SPEndDisplayList()) def getF3DVert(loop, face, convertInfo, mesh): - position = mesh.vertices[loop.vertex_index].co.copy().freeze() - # N64 is -Y, Blender is +Y - uv = convertInfo.uv_data[loop.index].uv.copy() - uv[:] = [field if not math.isnan(field) else 0 for field in uv] - uv[1] = 1 - uv[1] - uv = uv.freeze() - colorOrNormal = getLoopColorOrNormal(loop, face, - convertInfo.obj.data, convertInfo.obj, convertInfo.exportVertexColors) + position = mesh.vertices[loop.vertex_index].co.copy().freeze() + # N64 is -Y, Blender is +Y + uv = convertInfo.uv_data[loop.index].uv.copy() + uv[:] = [field if not math.isnan(field) else 0 for field in uv] + uv[1] = 1 - uv[1] + uv = uv.freeze() + colorOrNormal = getLoopColorOrNormal( + loop, + face, + convertInfo.obj.data, + convertInfo.obj, + convertInfo.exportVertexColors, + ) + + return (position, uv, colorOrNormal) - return (position, uv, colorOrNormal) def getLoopNormal(loop, face, mesh, isFlatShaded): - # This is a workaround for flat shading not working well. - # Since we support custom blender normals we can now ignore this. - #if isFlatShaded: - # normal = -face.normal #??? - #else: - # normal = -loop.normal #??? - #return get8bitRoundedNormal(normal).freeze() - return get8bitRoundedNormal(loop, mesh).freeze() - -''' + # This is a workaround for flat shading not working well. + # Since we support custom blender normals we can now ignore this. + # if isFlatShaded: + # normal = -face.normal #??? + # else: + # normal = -loop.normal #??? + # return get8bitRoundedNormal(normal).freeze() + return get8bitRoundedNormal(loop, mesh).freeze() + + +""" def getLoopNormalCreased(bLoop, obj): edges = obj.data.edges centerVert = bLoop.vert @@ -994,1494 +1289,2325 @@ def getHighestFaceWeight(faceWeights): if faceWeight.weight > highestFaceWeight.weight: highestFaceWeight = faceWeight return highestFaceWeight -''' +""" + def UVtoST(obj, loopIndex, uv_data, texDimensions, isPointSampled): - uv = uv_data[loopIndex].uv.copy() - uv[1] = 1 - uv[1] - loopUV = uv.freeze() - - pixelOffset = 0 if isPointSampled else 0.5 - return [ - convertFloatToFixed16(loopUV[0] * texDimensions[0] - pixelOffset) / 32, - convertFloatToFixed16(loopUV[1] * texDimensions[1] - pixelOffset) / 32 - ] - - -def convertVertexData(mesh, loopPos, loopUV, loopColorOrNormal, - texDimensions, transformMatrix, isPointSampled, exportVertexColors): - #uv_layer = mesh.uv_layers.active - #color_layer = mesh.vertex_colors['Col'] - #alpha_layer = mesh.vertex_colors['Alpha'] - - # Position (8 bytes) - position = [int(round(floatValue)) for \ - floatValue in (transformMatrix @ loopPos)] - - # UV (4 bytes) - # For F3D, Bilinear samples the point from the center of the pixel. - # However, Point samples from the corner. - # Thus we add 0.5 to the UV only if bilinear filtering. - # see section 13.7.5.3 in programming manual. - pixelOffset = 0 if isPointSampled else 0.5 - uv = [ - convertFloatToFixed16(loopUV[0] * texDimensions[0] - pixelOffset), - convertFloatToFixed16(loopUV[1] * texDimensions[1] - pixelOffset) - ] - - # Color/Normal (4 bytes) - if exportVertexColors: - colorOrNormal = [ - int(round(loopColorOrNormal[0] * 255)).to_bytes(1, 'big')[0], - int(round(loopColorOrNormal[1] * 255)).to_bytes(1, 'big')[0], - int(round(loopColorOrNormal[2] * 255)).to_bytes(1, 'big')[0], - int(round(loopColorOrNormal[3] * 255)).to_bytes(1, 'big')[0] - ] - else: - # normal transformed correctly. - normal = (transformMatrix.inverted().transposed() @ \ - loopColorOrNormal).normalized() - colorOrNormal = [ - int(round(normal[0] * 127)).to_bytes(1, 'big', signed = True)[0], - int(round(normal[1] * 127)).to_bytes(1, 'big', signed = True)[0], - int(round(normal[2] * 127)).to_bytes(1, 'big', signed = True)[0], - int(round(loopColorOrNormal[3] * 255)).to_bytes(1, 'big')[0], - ] - - return Vtx(position, uv, colorOrNormal) + uv = uv_data[loopIndex].uv.copy() + uv[1] = 1 - uv[1] + loopUV = uv.freeze() + + pixelOffset = 0 if isPointSampled else 0.5 + return [ + convertFloatToFixed16(loopUV[0] * texDimensions[0] - pixelOffset) / 32, + convertFloatToFixed16(loopUV[1] * texDimensions[1] - pixelOffset) / 32, + ] + + +def convertVertexData( + mesh, + loopPos, + loopUV, + loopColorOrNormal, + texDimensions, + transformMatrix, + isPointSampled, + exportVertexColors, +): + # uv_layer = mesh.uv_layers.active + # color_layer = mesh.vertex_colors['Col'] + # alpha_layer = mesh.vertex_colors['Alpha'] + + # Position (8 bytes) + position = [int(round(floatValue)) for floatValue in (transformMatrix @ loopPos)] + + # UV (4 bytes) + # For F3D, Bilinear samples the point from the center of the pixel. + # However, Point samples from the corner. + # Thus we add 0.5 to the UV only if bilinear filtering. + # see section 13.7.5.3 in programming manual. + pixelOffset = 0 if isPointSampled else 0.5 + uv = [ + convertFloatToFixed16(loopUV[0] * texDimensions[0] - pixelOffset), + convertFloatToFixed16(loopUV[1] * texDimensions[1] - pixelOffset), + ] + + # Color/Normal (4 bytes) + if exportVertexColors: + colorOrNormal = [ + int(round(loopColorOrNormal[0] * 255)).to_bytes(1, "big")[0], + int(round(loopColorOrNormal[1] * 255)).to_bytes(1, "big")[0], + int(round(loopColorOrNormal[2] * 255)).to_bytes(1, "big")[0], + int(round(loopColorOrNormal[3] * 255)).to_bytes(1, "big")[0], + ] + else: + # normal transformed correctly. + normal = ( + transformMatrix.inverted().transposed() @ loopColorOrNormal + ).normalized() + colorOrNormal = [ + int(round(normal[0] * 127)).to_bytes(1, "big", signed=True)[0], + int(round(normal[1] * 127)).to_bytes(1, "big", signed=True)[0], + int(round(normal[2] * 127)).to_bytes(1, "big", signed=True)[0], + int(round(loopColorOrNormal[3] * 255)).to_bytes(1, "big")[0], + ] + + return Vtx(position, uv, colorOrNormal) + def getLoopColor(loop, mesh, mat_ver): - color_layer = mesh.vertex_colors['Col'].data if 'Col' in \ - mesh.vertex_colors else None - alpha_layer = mesh.vertex_colors['Alpha'].data if 'Alpha' in \ - mesh.vertex_colors else None + color_layer = ( + mesh.vertex_colors["Col"].data if "Col" in mesh.vertex_colors else None + ) + alpha_layer = ( + mesh.vertex_colors["Alpha"].data if "Alpha" in mesh.vertex_colors else None + ) - if color_layer is not None: - normalizedRGB = color_layer[loop.index].color - else: - normalizedRGB = [1,1,1] - if alpha_layer is not None: - normalizedAColor = alpha_layer[loop.index].color - normalizedA = mathutils.Color(normalizedAColor[0:3]).v - else: - normalizedA = 1 + if color_layer is not None: + normalizedRGB = color_layer[loop.index].color + else: + normalizedRGB = [1, 1, 1] + if alpha_layer is not None: + normalizedAColor = alpha_layer[loop.index].color + normalizedA = mathutils.Color(normalizedAColor[0:3]).v + else: + normalizedA = 1 + + return (normalizedRGB[0], normalizedRGB[1], normalizedRGB[2], normalizedA) - return (normalizedRGB[0], normalizedRGB[1], normalizedRGB[2], normalizedA) def getLoopColorOrNormal(loop, face, mesh, obj, exportVertexColors): - material = obj.material_slots[face.material_index].material - isFlatShaded = checkIfFlatShaded(material) - if exportVertexColors: - return getLoopColor(loop, mesh, material.mat_ver) - else: - return getLoopNormal(loop, face, mesh, isFlatShaded) + material = obj.material_slots[face.material_index].material + isFlatShaded = checkIfFlatShaded(material) + if exportVertexColors: + return getLoopColor(loop, mesh, material.mat_ver) + else: + return getLoopNormal(loop, face, mesh, isFlatShaded) + def createTriangleCommands(triangles, vertexBuffer, useSP2Triangle): - triangles = copy.deepcopy(triangles) - commands = [] - if useSP2Triangle: - while len(triangles) > 0: - if len(triangles) >= 2: - commands.append(SP2Triangles( - vertexBuffer.index(triangles[0][0]), - vertexBuffer.index(triangles[0][1]), - vertexBuffer.index(triangles[0][2]), 0, - vertexBuffer.index(triangles[1][0]), - vertexBuffer.index(triangles[1][1]), - vertexBuffer.index(triangles[1][2]), 0)) - triangles = triangles[2:] - else: - commands.append(SP1Triangle( - vertexBuffer.index(triangles[0][0]), - vertexBuffer.index(triangles[0][1]), - vertexBuffer.index(triangles[0][2]), 0)) - triangles = [] - else: - while len(triangles) > 0: - commands.append(SP1Triangle( - vertexBuffer.index(triangles[0][0]), - vertexBuffer.index(triangles[0][1]), - vertexBuffer.index(triangles[0][2]), 0)) - triangles = triangles[1:] - - return commands + triangles = copy.deepcopy(triangles) + commands = [] + if useSP2Triangle: + while len(triangles) > 0: + if len(triangles) >= 2: + commands.append( + SP2Triangles( + vertexBuffer.index(triangles[0][0]), + vertexBuffer.index(triangles[0][1]), + vertexBuffer.index(triangles[0][2]), + 0, + vertexBuffer.index(triangles[1][0]), + vertexBuffer.index(triangles[1][1]), + vertexBuffer.index(triangles[1][2]), + 0, + ) + ) + triangles = triangles[2:] + else: + commands.append( + SP1Triangle( + vertexBuffer.index(triangles[0][0]), + vertexBuffer.index(triangles[0][1]), + vertexBuffer.index(triangles[0][2]), + 0, + ) + ) + triangles = [] + else: + while len(triangles) > 0: + commands.append( + SP1Triangle( + vertexBuffer.index(triangles[0][0]), + vertexBuffer.index(triangles[0][1]), + vertexBuffer.index(triangles[0][2]), + 0, + ) + ) + triangles = triangles[1:] + + return commands + # white diffuse, grey ambient, normal = (1,1,1) defaultLighting = [ - (mathutils.Vector((1,1,1)), mathutils.Vector((1, 1, 1)).normalized()), - (mathutils.Vector((0.5, 0.5, 0.5)), mathutils.Vector((1, 1, 1)).normalized())] + (mathutils.Vector((1, 1, 1)), mathutils.Vector((1, 1, 1)).normalized()), + (mathutils.Vector((0.5, 0.5, 0.5)), mathutils.Vector((1, 1, 1)).normalized()), +] + def getTexDimensions(material): - if material.mat_ver > 3: - f3dMat = material.f3d_mat - else: - f3dMat = material - texDimensions0 = None - texDimensions1 = None - useDict = all_combiner_uses(f3dMat) - if useDict['Texture 0'] and f3dMat.tex0.tex_set: - if f3dMat.tex0.use_tex_reference: - texDimensions0 = f3dMat.tex0.tex_reference_size - else: - if f3dMat.tex0.tex is None: - raise PluginError('In material \"' + material.name + '\", a texture has not been set.') - texDimensions0 = f3dMat.tex0.tex.size[0], f3dMat.tex0.tex.size[1] - if useDict['Texture 1'] and f3dMat.tex1.tex_set: - if f3dMat.tex1.use_tex_reference: - texDimensions1 = f3dMat.tex1.tex_reference_size - else: - if f3dMat.tex1.tex is None: - raise PluginError('In material \"' + material.name + '\", a texture has not been set.') - texDimensions1 = f3dMat.tex1.tex.size[0], f3dMat.tex1.tex.size[1] - - if texDimensions0 is not None and texDimensions1 is not None: - texDimensions = texDimensions0 if f3dMat.uv_basis == 'TEXEL0' \ - else texDimensions1 - elif texDimensions0 is not None: - texDimensions = texDimensions0 - elif texDimensions1 is not None: - texDimensions = texDimensions1 - else: - texDimensions = [32, 32] - return texDimensions + if material.mat_ver > 3: + f3dMat = material.f3d_mat + else: + f3dMat = material + texDimensions0 = None + texDimensions1 = None + useDict = all_combiner_uses(f3dMat) + if useDict["Texture 0"] and f3dMat.tex0.tex_set: + if f3dMat.tex0.use_tex_reference: + texDimensions0 = f3dMat.tex0.tex_reference_size + else: + if f3dMat.tex0.tex is None: + raise PluginError( + 'In material "' + material.name + '", a texture has not been set.' + ) + texDimensions0 = f3dMat.tex0.tex.size[0], f3dMat.tex0.tex.size[1] + if useDict["Texture 1"] and f3dMat.tex1.tex_set: + if f3dMat.tex1.use_tex_reference: + texDimensions1 = f3dMat.tex1.tex_reference_size + else: + if f3dMat.tex1.tex is None: + raise PluginError( + 'In material "' + material.name + '", a texture has not been set.' + ) + texDimensions1 = f3dMat.tex1.tex.size[0], f3dMat.tex1.tex.size[1] + + if texDimensions0 is not None and texDimensions1 is not None: + texDimensions = ( + texDimensions0 if f3dMat.uv_basis == "TEXEL0" else texDimensions1 + ) + elif texDimensions0 is not None: + texDimensions = texDimensions0 + elif texDimensions1 is not None: + texDimensions = texDimensions1 + else: + texDimensions = [32, 32] + return texDimensions + def saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData): - if material.mat_ver > 3: - f3dMat = material.f3d_mat - else: - f3dMat = material - - areaKey = fModel.global_data.getCurrentAreaKey(f3dMat) - areaIndex = fModel.global_data.current_area_index - - if f3dMat.rdp_settings.set_rendermode: - materialKey = (material, drawLayer, areaKey) - else: - materialKey = (material, None, areaKey) - - materialItem = fModel.getMaterialAndHandleShared(materialKey) - if materialItem is not None: - return materialItem - - if len(obj.data.materials) == 0: - raise PluginError("Mesh must have at least one material.") - materialName = fModel.name + "_" + toAlnum(material.name) + (('_layer' + str(drawLayer)) \ - if f3dMat.rdp_settings.set_rendermode and drawLayer is not None else '') +\ - (('_area' + str(areaIndex)) if \ - f3dMat.set_fog and f3dMat.use_global_fog and areaKey is not None else '') - fMaterial = FMaterial(materialName, fModel.DLFormat) - fMaterial.material.commands.append(DPPipeSync()) - fMaterial.revert.commands.append(DPPipeSync()) - - if not material.is_f3d: - raise PluginError("Material named " + material.name + \ - ' is not an F3D material.') - - fMaterial.getScrollData(material, getMaterialScrollDimensions(f3dMat)) - - if f3dMat.set_combiner: - if f3dMat.rdp_settings.g_mdsft_cycletype == 'G_CYC_2CYCLE': - fMaterial.material.commands.append( - DPSetCombineMode( - f3dMat.combiner1.A, - f3dMat.combiner1.B, - f3dMat.combiner1.C, - f3dMat.combiner1.D, - f3dMat.combiner1.A_alpha, - f3dMat.combiner1.B_alpha, - f3dMat.combiner1.C_alpha, - f3dMat.combiner1.D_alpha, - f3dMat.combiner2.A, - f3dMat.combiner2.B, - f3dMat.combiner2.C, - f3dMat.combiner2.D, - f3dMat.combiner2.A_alpha, - f3dMat.combiner2.B_alpha, - f3dMat.combiner2.C_alpha, - f3dMat.combiner2.D_alpha - )) - else: - fMaterial.material.commands.append( - DPSetCombineMode( - f3dMat.combiner1.A, - f3dMat.combiner1.B, - f3dMat.combiner1.C, - f3dMat.combiner1.D, - f3dMat.combiner1.A_alpha, - f3dMat.combiner1.B_alpha, - f3dMat.combiner1.C_alpha, - f3dMat.combiner1.D_alpha, - f3dMat.combiner1.A, - f3dMat.combiner1.B, - f3dMat.combiner1.C, - f3dMat.combiner1.D, - f3dMat.combiner1.A_alpha, - f3dMat.combiner1.B_alpha, - f3dMat.combiner1.C_alpha, - f3dMat.combiner1.D_alpha - )) - - if f3dMat.set_fog: - if f3dMat.use_global_fog and fModel.global_data.getCurrentAreaData() is not None: - fogData = fModel.global_data.getCurrentAreaData().fog_data - fog_position = fogData.position - fog_color = fogData.color - else: - fog_position = f3dMat.fog_position - fog_color = f3dMat.fog_color - fMaterial.material.commands.extend([ - DPSetFogColor( - int(round(fog_color[0] * 255)), - int(round(fog_color[1] * 255)), - int(round(fog_color[2] * 255)), - int(round(fog_color[3] * 255))), - SPFogPosition(fog_position[0], fog_position[1]) - ]) - - useDict = all_combiner_uses(f3dMat) - - if drawLayer is not None: - defaultRM = fModel.getRenderMode(drawLayer) - else: - defaultRM = None - - defaults = bpy.context.scene.world.rdp_defaults - if fModel.f3d.F3DEX_GBI_2: - saveGeoModeDefinitionF3DEX2(fMaterial, f3dMat.rdp_settings, defaults, fModel.matWriteMethod) - else: - saveGeoModeDefinition(fMaterial, f3dMat.rdp_settings, defaults, fModel.matWriteMethod) - saveOtherModeHDefinition(fMaterial, f3dMat.rdp_settings, defaults, fModel.f3d._HW_VERSION_1, fModel.matWriteMethod) - saveOtherModeLDefinition(fMaterial, f3dMat.rdp_settings, defaults, defaultRM, fModel.matWriteMethod) - saveOtherDefinition(fMaterial, f3dMat, defaults) - - # Set scale - s = int(f3dMat.tex_scale[0] * 0xFFFF) - t = int(f3dMat.tex_scale[1] * 0xFFFF) - fMaterial.material.commands.append( - SPTexture(s, t, 0, fModel.f3d.G_TX_RENDERTILE, 1)) - - # Save textures - texDimensions0 = None - texDimensions1 = None - nextTmem = 0 - loadTextures = not (material.mat_ver > 3 and f3dMat.use_large_textures) - if useDict['Texture 0'] and f3dMat.tex0.tex_set: - if f3dMat.tex0.tex is None and not f3dMat.tex0.use_tex_reference: - raise PluginError('In material \"' + material.name + '\", a texture has not been set.') - - fMaterial.useLargeTextures = not loadTextures - fMaterial.texturesLoaded[0] = True - fMaterial.saveLargeTextures[0] = f3dMat.tex0.save_large_texture - texDimensions0, nextTmem = saveTextureIndex(material.name, fModel, - fMaterial, fMaterial.material, fMaterial.revert, f3dMat.tex0, 0, nextTmem, None, convertTextureData, - None, loadTextures, True) - - # If the texture in both texels is the same then it can be rewritten to the same location in tmem - # This allows for a texture that fills tmem to still be used for both texel0 and texel1 - if f3dMat.tex0.tex == f3dMat.tex1.tex: - if nextTmem >= (512 if f3dMat.tex0.tex_format[:2] != 'CI' else 256): - nextTmem = 0 - - if useDict['Texture 1'] and f3dMat.tex1.tex_set: - if f3dMat.tex1.tex is None and not f3dMat.tex1.use_tex_reference: - raise PluginError('In material \"' + material.name + '\", a texture has not been set.') - - fMaterial.useLargeTextures = not loadTextures - fMaterial.texturesLoaded[1] = True - fMaterial.saveLargeTextures[1] = f3dMat.tex1.save_large_texture - texDimensions1, nextTmem = saveTextureIndex(material.name, fModel, - fMaterial, fMaterial.material, fMaterial.revert, f3dMat.tex1, 1, nextTmem, None, convertTextureData, - None, loadTextures, True) - - # Used so we know how to convert normalized UVs when saving verts. - if texDimensions0 is not None and texDimensions1 is not None: - if f3dMat.uv_basis == 'TEXEL0': - texDimensions = texDimensions0 - fMaterial.largeTextureIndex = 0 - else: - texDimensions = texDimensions1 - fMaterial.largeTextureIndex = 1 - - elif texDimensions0 is not None: - texDimensions = texDimensions0 - fMaterial.largeTextureIndex = 0 - elif texDimensions1 is not None: - texDimensions = texDimensions1 - fMaterial.largeTextureIndex = 1 - else: - texDimensions = [32, 32] - - nodes = material.node_tree.nodes - if useDict['Primitive'] and f3dMat.set_prim: - if material.mat_ver > 3: - color = f3dMat.prim_color - elif material.mat_ver == 3: - color = nodes['Primitive Color Output'].inputs[0].default_value - else: - color = nodes['Primitive Color'].outputs[0].default_value - color = gammaCorrect(color[0:3]) + [color[3]] - fMaterial.material.commands.append( - DPSetPrimColor( - int(f3dMat.prim_lod_min * 255), - int(f3dMat.prim_lod_frac * 255), - int(color[0] * 255), - int(color[1] * 255), - int(color[2] * 255), - int(color[3] * 255))) - - if useDict['Environment'] and f3dMat.set_env: - if material.mat_ver > 3: - color = f3dMat.env_color - elif material.mat_ver == 3: - color = nodes['Environment Color Output'].inputs[0].default_value - else: - color = nodes['Environment Color'].outputs[0].default_value - color = gammaCorrect(color[0:3]) + [color[3]] - fMaterial.material.commands.append( - DPSetEnvColor( - int(color[0] * 255), - int(color[1] * 255), - int(color[2] * 255), - int(color[3] * 255))) - - if useDict['Shade'] and f3dMat.set_lights: - fLights = saveLightsDefinition(fModel, fMaterial, f3dMat, - materialName + '_lights') - fMaterial.material.commands.extend([ - SPSetLights(fLights) # TODO: handle synching: NO NEED? - ]) - - if useDict['Key'] and f3dMat.set_key: - if material.mat_ver == 4: - center = f3dMat.key_center - else: - center = nodes['Chroma Key Center'].outputs[0].default_value - scale = f3dMat.key_scale - width = f3dMat.key_width - fMaterial.material.commands.extend([ - DPSetCombineKey('G_CK_KEY'), - # TODO: Add UI handling width - DPSetKeyR(int(center[0] * 255), int(scale[0] * 255), - int(width[0] * 2**8)), - DPSetKeyGB(int(center[1] * 255), int(scale[1] * 255), - int(width[1] * 2**8), - int(center[2] * 255), int(scale[2] * 255), - int(width[2] * 2**8)) - ]) - - # all k0-5 set at once - # make sure to handle this in node shader - # or don't, who cares - if useDict['Convert'] and f3dMat.set_k0_5: - fMaterial.material.commands.extend([ - DPSetTextureConvert('G_TC_FILTCONV'), # TODO: allow filter option - DPSetConvert( - int(f3dMat.k0 * 255), - int(f3dMat.k1 * 255), - int(f3dMat.k2 * 255), - int(f3dMat.k3 * 255), - int(f3dMat.k4 * 255), - int(f3dMat.k5 * 255)) - ]) - - fModel.onMaterialCommandsBuilt(fMaterial.material, fMaterial.revert, material, drawLayer) - - # End Display List - # For dynamic calls, materials will be called as functions and should not end the DL. - if fModel.DLFormat == DLFormat.Static: - fMaterial.material.commands.append(SPEndDisplayList()) - - #revertMatAndEndDraw(fMaterial.revert) - if len(fMaterial.revert.commands) > 1: # 1 being the pipe sync - if fMaterial.DLFormat == DLFormat.Static: - fMaterial.revert.commands.append(SPEndDisplayList()) - else: - fMaterial.revert = None - - materialKey = material, (drawLayer if f3dMat.rdp_settings.set_rendermode else None), \ - fModel.global_data.getCurrentAreaKey(f3dMat) - fModel.materials[materialKey] = (fMaterial, texDimensions) - - return fMaterial, texDimensions - -def saveTextureIndex(propName, fModel, fMaterial, loadTexGfx, revertTexGfx, texProp, index, tmem, - overrideName, convertTextureData, tileSettingsOverride, loadTextures, loadPalettes): - tex = texProp.tex - - if tex is not None and (tex.size[0] == 0 or tex.size[1] == 0): - raise PluginError("Image " + tex.name + " has either a 0 width or height; image may have been removed from original location.") - - if not texProp.use_tex_reference: - if tex is None: - raise PluginError('In ' + propName + ", no texture is selected.") - elif len(tex.pixels) == 0: - raise PluginError("Could not load missing texture: " + tex.name + ". Make sure this texture has not been deleted or moved on disk.") - - texFormat = texProp.tex_format - isCITexture = texFormat[:2] == 'CI' - palFormat = texProp.ci_format if isCITexture else '' - - if not texProp.use_tex_reference: - if tex.filepath == "": - name = tex.name - else: - name = tex.filepath - else: - name = texProp.tex_reference - texName = fModel.name + '_' + \ - (getNameFromPath(name, True) + '_' + texFormat.lower() if overrideName is None else overrideName) - - - if tileSettingsOverride is not None: - tileSettings = tileSettingsOverride[index] - width, height = tileSettings.getDimensions() - setTLUTMode = False - else: - tileSettings = None - if texProp.use_tex_reference: - width, height = texProp.tex_reference_size - else: - width, height = tex.size - setTLUTMode = fModel.matWriteMethod == GfxMatWriteMethod.WriteAll - - nextTmem = tmem + getTmemWordUsage(texFormat, width, height) - - if not bpy.context.scene.ignoreTextureRestrictions and loadTextures: - if nextTmem > (512 if texFormat[:2] != 'CI' else 256): - raise PluginError("Error in \"" + propName + "\": Textures are too big. Max TMEM size is 4k " + \ - "bytes, ex. 2 32x32 RGBA 16 bit textures.\nNote that texture width will be internally padded to 64 bit boundaries.") - if width > 1024 or height > 1024: - raise PluginError("Error in \"" + propName + "\": Any side of an image cannot be greater " +\ - "than 1024.") - - if tileSettings is None: - clamp_S = texProp.S.clamp - mirror_S = texProp.S.mirror - tex_SL = texProp.S.low - tex_SH = texProp.S.high - mask_S = texProp.S.mask - shift_S = texProp.S.shift - - clamp_T = texProp.T.clamp - mirror_T = texProp.T.mirror - tex_TL = texProp.T.low - tex_TH = texProp.T.high - mask_T = texProp.T.mask - shift_T = texProp.T.shift - - else: - clamp_S = True - mirror_S = False - tex_SL = tileSettings.sl - tex_SH = tileSettings.sh - mask_S = 0 - shift_S = 0 - - clamp_T = True - mirror_T = False - tex_TL = tileSettings.tl - tex_TH = tileSettings.th - mask_T = 0 - shift_T = 0 - - convertTextureData = convertTextureData and not (fMaterial.useLargeTextures and fMaterial.saveLargeTextures[index]) - if isCITexture: - if texProp.use_tex_reference: - fImage = FImage(texProp.tex_reference, None, None, width, height, None, False) - fPalette = FImage(texProp.pal_reference, None, None, 1, texProp.pal_reference_size, None, False) - else: - fImage, fPalette = saveOrGetPaletteDefinition( - fMaterial, fModel, tex, texName, texFormat, palFormat, convertTextureData) - - if loadPalettes: - savePaletteLoading(loadTexGfx, revertTexGfx, fPalette, - palFormat, 0, fPalette.height, fModel.f3d, fModel.matWriteMethod) - else: - if texProp.use_tex_reference: - fImage = FImage(texProp.tex_reference, None, None, width, height, None, False) - else: - fImage = saveOrGetTextureDefinition(fMaterial, fModel, tex, texName, - texFormat, convertTextureData) - - if setTLUTMode and not isCITexture: - loadTexGfx.commands.append(DPSetTextureLUT('G_TT_NONE')) - if loadTextures: - saveTextureLoading(fMaterial, fImage, loadTexGfx, clamp_S, - mirror_S, clamp_T, mirror_T, - mask_S, mask_T, shift_S, - shift_T, tex_SL, tex_TL, tex_SH, - tex_TH, texFormat, index, fModel.f3d, tmem) - texDimensions = fImage.width, fImage.height - #fImage = saveTextureDefinition(fModel, tex, texName, - # texFormatOf[texFormat], texBitSizeOf[texFormat]) - #fModel.textures[texName] = fImage - - return texDimensions, nextTmem + if material.mat_ver > 3: + f3dMat = material.f3d_mat + else: + f3dMat = material + + areaKey = fModel.global_data.getCurrentAreaKey(f3dMat) + areaIndex = fModel.global_data.current_area_index + + if f3dMat.rdp_settings.set_rendermode: + materialKey = (material, drawLayer, areaKey) + else: + materialKey = (material, None, areaKey) + + materialItem = fModel.getMaterialAndHandleShared(materialKey) + if materialItem is not None: + return materialItem + + if len(obj.data.materials) == 0: + raise PluginError("Mesh must have at least one material.") + materialName = ( + fModel.name + + "_" + + toAlnum(material.name) + + ( + ("_layer" + str(drawLayer)) + if f3dMat.rdp_settings.set_rendermode and drawLayer is not None + else "" + ) + + ( + ("_area" + str(areaIndex)) + if f3dMat.set_fog and f3dMat.use_global_fog and areaKey is not None + else "" + ) + ) + fMaterial = FMaterial(materialName, fModel.DLFormat) + fMaterial.material.commands.append(DPPipeSync()) + fMaterial.revert.commands.append(DPPipeSync()) + + if not material.is_f3d: + raise PluginError( + "Material named " + material.name + " is not an F3D material." + ) + + fMaterial.getScrollData(material, getMaterialScrollDimensions(f3dMat)) + + if f3dMat.set_combiner: + if f3dMat.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE": + fMaterial.material.commands.append( + DPSetCombineMode( + f3dMat.combiner1.A, + f3dMat.combiner1.B, + f3dMat.combiner1.C, + f3dMat.combiner1.D, + f3dMat.combiner1.A_alpha, + f3dMat.combiner1.B_alpha, + f3dMat.combiner1.C_alpha, + f3dMat.combiner1.D_alpha, + f3dMat.combiner2.A, + f3dMat.combiner2.B, + f3dMat.combiner2.C, + f3dMat.combiner2.D, + f3dMat.combiner2.A_alpha, + f3dMat.combiner2.B_alpha, + f3dMat.combiner2.C_alpha, + f3dMat.combiner2.D_alpha, + ) + ) + else: + fMaterial.material.commands.append( + DPSetCombineMode( + f3dMat.combiner1.A, + f3dMat.combiner1.B, + f3dMat.combiner1.C, + f3dMat.combiner1.D, + f3dMat.combiner1.A_alpha, + f3dMat.combiner1.B_alpha, + f3dMat.combiner1.C_alpha, + f3dMat.combiner1.D_alpha, + f3dMat.combiner1.A, + f3dMat.combiner1.B, + f3dMat.combiner1.C, + f3dMat.combiner1.D, + f3dMat.combiner1.A_alpha, + f3dMat.combiner1.B_alpha, + f3dMat.combiner1.C_alpha, + f3dMat.combiner1.D_alpha, + ) + ) + + if f3dMat.set_fog: + if ( + f3dMat.use_global_fog + and fModel.global_data.getCurrentAreaData() is not None + ): + fogData = fModel.global_data.getCurrentAreaData().fog_data + fog_position = fogData.position + fog_color = fogData.color + else: + fog_position = f3dMat.fog_position + fog_color = f3dMat.fog_color + fMaterial.material.commands.extend( + [ + DPSetFogColor( + int(round(fog_color[0] * 255)), + int(round(fog_color[1] * 255)), + int(round(fog_color[2] * 255)), + int(round(fog_color[3] * 255)), + ), + SPFogPosition(fog_position[0], fog_position[1]), + ] + ) + + useDict = all_combiner_uses(f3dMat) + + if drawLayer is not None: + defaultRM = fModel.getRenderMode(drawLayer) + else: + defaultRM = None + + defaults = bpy.context.scene.world.rdp_defaults + if fModel.f3d.F3DEX_GBI_2: + saveGeoModeDefinitionF3DEX2( + fMaterial, f3dMat.rdp_settings, defaults, fModel.matWriteMethod + ) + else: + saveGeoModeDefinition( + fMaterial, f3dMat.rdp_settings, defaults, fModel.matWriteMethod + ) + saveOtherModeHDefinition( + fMaterial, + f3dMat.rdp_settings, + defaults, + fModel.f3d._HW_VERSION_1, + fModel.matWriteMethod, + ) + saveOtherModeLDefinition( + fMaterial, f3dMat.rdp_settings, defaults, defaultRM, fModel.matWriteMethod + ) + saveOtherDefinition(fMaterial, f3dMat, defaults) + + # Set scale + s = int(f3dMat.tex_scale[0] * 0xFFFF) + t = int(f3dMat.tex_scale[1] * 0xFFFF) + fMaterial.material.commands.append( + SPTexture(s, t, 0, fModel.f3d.G_TX_RENDERTILE, 1) + ) + + # Save textures + texDimensions0 = None + texDimensions1 = None + nextTmem = 0 + loadTextures = not (material.mat_ver > 3 and f3dMat.use_large_textures) + if useDict["Texture 0"] and f3dMat.tex0.tex_set: + if f3dMat.tex0.tex is None and not f3dMat.tex0.use_tex_reference: + raise PluginError( + 'In material "' + material.name + '", a texture has not been set.' + ) + + fMaterial.useLargeTextures = not loadTextures + fMaterial.texturesLoaded[0] = True + fMaterial.saveLargeTextures[0] = f3dMat.tex0.save_large_texture + texDimensions0, nextTmem = saveTextureIndex( + material.name, + fModel, + fMaterial, + fMaterial.material, + fMaterial.revert, + f3dMat.tex0, + 0, + nextTmem, + None, + convertTextureData, + None, + loadTextures, + True, + ) + + # If the texture in both texels is the same then it can be rewritten to the same location in tmem + # This allows for a texture that fills tmem to still be used for both texel0 and texel1 + if f3dMat.tex0.tex == f3dMat.tex1.tex: + if nextTmem >= (512 if f3dMat.tex0.tex_format[:2] != "CI" else 256): + nextTmem = 0 + + if useDict["Texture 1"] and f3dMat.tex1.tex_set: + if f3dMat.tex1.tex is None and not f3dMat.tex1.use_tex_reference: + raise PluginError( + 'In material "' + material.name + '", a texture has not been set.' + ) + + fMaterial.useLargeTextures = not loadTextures + fMaterial.texturesLoaded[1] = True + fMaterial.saveLargeTextures[1] = f3dMat.tex1.save_large_texture + texDimensions1, nextTmem = saveTextureIndex( + material.name, + fModel, + fMaterial, + fMaterial.material, + fMaterial.revert, + f3dMat.tex1, + 1, + nextTmem, + None, + convertTextureData, + None, + loadTextures, + True, + ) + + # Used so we know how to convert normalized UVs when saving verts. + if texDimensions0 is not None and texDimensions1 is not None: + if f3dMat.uv_basis == "TEXEL0": + texDimensions = texDimensions0 + fMaterial.largeTextureIndex = 0 + else: + texDimensions = texDimensions1 + fMaterial.largeTextureIndex = 1 + + elif texDimensions0 is not None: + texDimensions = texDimensions0 + fMaterial.largeTextureIndex = 0 + elif texDimensions1 is not None: + texDimensions = texDimensions1 + fMaterial.largeTextureIndex = 1 + else: + texDimensions = [32, 32] + + nodes = material.node_tree.nodes + if useDict["Primitive"] and f3dMat.set_prim: + if material.mat_ver > 3: + color = f3dMat.prim_color + elif material.mat_ver == 3: + color = nodes["Primitive Color Output"].inputs[0].default_value + else: + color = nodes["Primitive Color"].outputs[0].default_value + color = gammaCorrect(color[0:3]) + [color[3]] + fMaterial.material.commands.append( + DPSetPrimColor( + int(f3dMat.prim_lod_min * 255), + int(f3dMat.prim_lod_frac * 255), + int(color[0] * 255), + int(color[1] * 255), + int(color[2] * 255), + int(color[3] * 255), + ) + ) + + if useDict["Environment"] and f3dMat.set_env: + if material.mat_ver > 3: + color = f3dMat.env_color + elif material.mat_ver == 3: + color = nodes["Environment Color Output"].inputs[0].default_value + else: + color = nodes["Environment Color"].outputs[0].default_value + color = gammaCorrect(color[0:3]) + [color[3]] + fMaterial.material.commands.append( + DPSetEnvColor( + int(color[0] * 255), + int(color[1] * 255), + int(color[2] * 255), + int(color[3] * 255), + ) + ) + + if useDict["Shade"] and f3dMat.set_lights: + fLights = saveLightsDefinition( + fModel, fMaterial, f3dMat, materialName + "_lights" + ) + fMaterial.material.commands.extend( + [SPSetLights(fLights)] # TODO: handle synching: NO NEED? + ) + + if useDict["Key"] and f3dMat.set_key: + if material.mat_ver == 4: + center = f3dMat.key_center + else: + center = nodes["Chroma Key Center"].outputs[0].default_value + scale = f3dMat.key_scale + width = f3dMat.key_width + fMaterial.material.commands.extend( + [ + DPSetCombineKey("G_CK_KEY"), + # TODO: Add UI handling width + DPSetKeyR( + int(center[0] * 255), int(scale[0] * 255), int(width[0] * 2 ** 8) + ), + DPSetKeyGB( + int(center[1] * 255), + int(scale[1] * 255), + int(width[1] * 2 ** 8), + int(center[2] * 255), + int(scale[2] * 255), + int(width[2] * 2 ** 8), + ), + ] + ) + + # all k0-5 set at once + # make sure to handle this in node shader + # or don't, who cares + if useDict["Convert"] and f3dMat.set_k0_5: + fMaterial.material.commands.extend( + [ + DPSetTextureConvert("G_TC_FILTCONV"), # TODO: allow filter option + DPSetConvert( + int(f3dMat.k0 * 255), + int(f3dMat.k1 * 255), + int(f3dMat.k2 * 255), + int(f3dMat.k3 * 255), + int(f3dMat.k4 * 255), + int(f3dMat.k5 * 255), + ), + ] + ) + + fModel.onMaterialCommandsBuilt( + fMaterial.material, fMaterial.revert, material, drawLayer + ) + + # End Display List + # For dynamic calls, materials will be called as functions and should not end the DL. + if fModel.DLFormat == DLFormat.Static: + fMaterial.material.commands.append(SPEndDisplayList()) + + # revertMatAndEndDraw(fMaterial.revert) + if len(fMaterial.revert.commands) > 1: # 1 being the pipe sync + if fMaterial.DLFormat == DLFormat.Static: + fMaterial.revert.commands.append(SPEndDisplayList()) + else: + fMaterial.revert = None + + materialKey = ( + material, + (drawLayer if f3dMat.rdp_settings.set_rendermode else None), + fModel.global_data.getCurrentAreaKey(f3dMat), + ) + fModel.materials[materialKey] = (fMaterial, texDimensions) + + return fMaterial, texDimensions + + +def saveTextureIndex( + propName, + fModel, + fMaterial, + loadTexGfx, + revertTexGfx, + texProp, + index, + tmem, + overrideName, + convertTextureData, + tileSettingsOverride, + loadTextures, + loadPalettes, +): + tex = texProp.tex + + if tex is not None and (tex.size[0] == 0 or tex.size[1] == 0): + raise PluginError( + "Image " + + tex.name + + " has either a 0 width or height; image may have been removed from original location." + ) + + if not texProp.use_tex_reference: + if tex is None: + raise PluginError("In " + propName + ", no texture is selected.") + elif len(tex.pixels) == 0: + raise PluginError( + "Could not load missing texture: " + + tex.name + + ". Make sure this texture has not been deleted or moved on disk." + ) + + texFormat = texProp.tex_format + isCITexture = texFormat[:2] == "CI" + palFormat = texProp.ci_format if isCITexture else "" + + if not texProp.use_tex_reference: + if tex.filepath == "": + name = tex.name + else: + name = tex.filepath + else: + name = texProp.tex_reference + texName = ( + fModel.name + + "_" + + ( + getNameFromPath(name, True) + "_" + texFormat.lower() + if overrideName is None + else overrideName + ) + ) + + if tileSettingsOverride is not None: + tileSettings = tileSettingsOverride[index] + width, height = tileSettings.getDimensions() + setTLUTMode = False + else: + tileSettings = None + if texProp.use_tex_reference: + width, height = texProp.tex_reference_size + else: + width, height = tex.size + setTLUTMode = fModel.matWriteMethod == GfxMatWriteMethod.WriteAll + + nextTmem = tmem + getTmemWordUsage(texFormat, width, height) + + if not bpy.context.scene.ignoreTextureRestrictions and loadTextures: + if nextTmem > (512 if texFormat[:2] != "CI" else 256): + raise PluginError( + 'Error in "' + + propName + + '": Textures are too big. Max TMEM size is 4k ' + + "bytes, ex. 2 32x32 RGBA 16 bit textures.\nNote that texture width will be internally padded to 64 bit boundaries." + ) + if width > 1024 or height > 1024: + raise PluginError( + 'Error in "' + + propName + + '": Any side of an image cannot be greater ' + + "than 1024." + ) + + if tileSettings is None: + clamp_S = texProp.S.clamp + mirror_S = texProp.S.mirror + tex_SL = texProp.S.low + tex_SH = texProp.S.high + mask_S = texProp.S.mask + shift_S = texProp.S.shift + + clamp_T = texProp.T.clamp + mirror_T = texProp.T.mirror + tex_TL = texProp.T.low + tex_TH = texProp.T.high + mask_T = texProp.T.mask + shift_T = texProp.T.shift + + else: + clamp_S = True + mirror_S = False + tex_SL = tileSettings.sl + tex_SH = tileSettings.sh + mask_S = 0 + shift_S = 0 + + clamp_T = True + mirror_T = False + tex_TL = tileSettings.tl + tex_TH = tileSettings.th + mask_T = 0 + shift_T = 0 + + convertTextureData = convertTextureData and not ( + fMaterial.useLargeTextures and fMaterial.saveLargeTextures[index] + ) + if isCITexture: + if texProp.use_tex_reference: + fImage = FImage( + texProp.tex_reference, None, None, width, height, None, False + ) + fPalette = FImage( + texProp.pal_reference, + None, + None, + 1, + texProp.pal_reference_size, + None, + False, + ) + else: + fImage, fPalette = saveOrGetPaletteDefinition( + fMaterial, + fModel, + tex, + texName, + texFormat, + palFormat, + convertTextureData, + ) + + if loadPalettes: + savePaletteLoading( + loadTexGfx, + revertTexGfx, + fPalette, + palFormat, + 0, + fPalette.height, + fModel.f3d, + fModel.matWriteMethod, + ) + else: + if texProp.use_tex_reference: + fImage = FImage( + texProp.tex_reference, None, None, width, height, None, False + ) + else: + fImage = saveOrGetTextureDefinition( + fMaterial, fModel, tex, texName, texFormat, convertTextureData + ) + + if setTLUTMode and not isCITexture: + loadTexGfx.commands.append(DPSetTextureLUT("G_TT_NONE")) + if loadTextures: + saveTextureLoading( + fMaterial, + fImage, + loadTexGfx, + clamp_S, + mirror_S, + clamp_T, + mirror_T, + mask_S, + mask_T, + shift_S, + shift_T, + tex_SL, + tex_TL, + tex_SH, + tex_TH, + texFormat, + index, + fModel.f3d, + tmem, + ) + texDimensions = fImage.width, fImage.height + # fImage = saveTextureDefinition(fModel, tex, texName, + # texFormatOf[texFormat], texBitSizeOf[texFormat]) + # fModel.textures[texName] = fImage + + return texDimensions, nextTmem + # texIndex: 0 for texture0, 1 for texture1 -def saveTextureLoading(fMaterial, fImage, loadTexGfx, clamp_S, mirror_S, clamp_T, - mirror_T, mask_S, mask_T, shift_S, shift_T, - SL, TL, SH, TH, tex_format, texIndex, f3d, tmem): - cms = [('G_TX_CLAMP' if clamp_S else 'G_TX_WRAP'), - ('G_TX_MIRROR' if mirror_S else 'G_TX_NOMIRROR')] - cmt = [('G_TX_CLAMP' if clamp_T else 'G_TX_WRAP'), - ('G_TX_MIRROR' if mirror_T else 'G_TX_NOMIRROR')] - masks = mask_S - maskt = mask_T - shifts = shift_S if shift_S >= 0 else (shift_S + 16) - shiftt = shift_T if shift_T >= 0 else (shift_T + 16) - - #print('Low ' + str(SL) + ' ' + str(TL)) - sl = int(SL * (2 ** f3d.G_TEXTURE_IMAGE_FRAC)) - tl = int(TL * (2 ** f3d.G_TEXTURE_IMAGE_FRAC)) - sh = int(SH * (2 ** f3d.G_TEXTURE_IMAGE_FRAC)) - th = int(TH * (2 ** f3d.G_TEXTURE_IMAGE_FRAC)) - - fmt = texFormatOf[tex_format] - siz = texBitSizeOf[tex_format] - pal = 0 if fmt[:2] != 'CI' else 0 # handle palettes - - #texelsPerWord = int(round(64 / bitSizeDict[siz])) - useLoadBlock = not fImage.isLargeTexture and \ - isPowerOf2(fImage.width) and isPowerOf2(fImage.height) - - # LoadTile will pad rows to 64 bit word alignment, while - # LoadBlock assumes this is already done. - - # These commands are basically DPLoadMultiBlock/Tile, - # except for the load tile index which will be 6 instead of 7 for render tile = 1. - # This may be unnecessary, but at this point DPLoadMultiBlock/Tile is not implemented yet - # so it would be extra work for the same outcome. - if siz == 'G_IM_SIZ_4b': - sl2 = int(SL * (2 ** (f3d.G_TEXTURE_IMAGE_FRAC - 1))) - sh2 = int(SH * (2 ** (f3d.G_TEXTURE_IMAGE_FRAC - 1))) - - dxt = f3d.CALC_DXT_4b(fImage.width) - line = (((int(SH - SL) + 1) >> 1) + 7) >> 3 - - if useLoadBlock: - loadTexGfx.commands.extend([ - DPTileSync(), # added in - DPSetTextureImage(fmt, 'G_IM_SIZ_16b', 1, fImage), - DPSetTile(fmt, 'G_IM_SIZ_16b', 0, tmem, f3d.G_TX_LOADTILE - texIndex, 0, - cmt, maskt, shiftt, cms, masks, shifts), - DPLoadSync(), - DPLoadBlock(f3d.G_TX_LOADTILE - texIndex, 0, 0, (((fImage.width)*(fImage.height)+3)>>2)-1, dxt)]) - else: - loadTexGfx.commands.extend([ - DPTileSync(), # added in - DPSetTextureImage(fmt, 'G_IM_SIZ_8b', fImage.width >> 1, fImage), - DPSetTile(fmt, 'G_IM_SIZ_8b', line, tmem, - f3d.G_TX_LOADTILE - texIndex, 0, cmt, maskt, shiftt, - cms, masks, shifts), - DPLoadSync(), - DPLoadTile(f3d.G_TX_LOADTILE - texIndex, sl2, tl, sh2, th),]) - - else: - dxt = f3d.CALC_DXT(fImage.width, f3d.G_IM_SIZ_VARS[siz + '_BYTES']) - # Note that _LINE_BYTES and _TILE_BYTES variables are the same. - line = (((int(SH - SL) + 1) * \ - f3d.G_IM_SIZ_VARS[siz + '_LINE_BYTES']) + 7) >> 3 - - if useLoadBlock: - loadTexGfx.commands.extend([ - DPTileSync(), # added in - - # Load Block version - DPSetTextureImage(fmt, siz + '_LOAD_BLOCK', 1, fImage), - DPSetTile(fmt, siz + '_LOAD_BLOCK', 0, tmem, - f3d.G_TX_LOADTILE - texIndex, 0, cmt, maskt, shiftt, - cms, masks, shifts), - DPLoadSync(), - DPLoadBlock(f3d.G_TX_LOADTILE - texIndex, 0, 0, \ - (((fImage.width)*(fImage.height) + \ - f3d.G_IM_SIZ_VARS[siz + '_INCR']) >> \ - f3d.G_IM_SIZ_VARS[siz + '_SHIFT'])-1, \ - dxt),]) - else: - loadTexGfx.commands.extend([ - DPTileSync(), # added in - - # Load Tile version - DPSetTextureImage(fmt, siz, fImage.width, fImage), - DPSetTile(fmt, siz, line, tmem, - f3d.G_TX_LOADTILE - texIndex, 0, cmt, maskt, shiftt, - cms, masks, shifts), - DPLoadSync(), - DPLoadTile(f3d.G_TX_LOADTILE - texIndex, sl, tl, sh, th),]) # added in - - tileSizeCommand = DPSetTileSize(f3d.G_TX_RENDERTILE + texIndex, sl, tl, sh, th) - loadTexGfx.commands.extend([ - DPPipeSync(), - DPSetTile(fmt, siz, line, tmem, \ - f3d.G_TX_RENDERTILE + texIndex, pal, cmt, maskt, \ - shiftt, cms, masks, shifts), - tileSizeCommand, - ]) # added in) - - # hasattr check for FTexRect - if hasattr(fMaterial, 'tileSizeCommands'): - fMaterial.tileSizeCommands[f3d.G_TX_RENDERTILE + texIndex] = tileSizeCommand +def saveTextureLoading( + fMaterial, + fImage, + loadTexGfx, + clamp_S, + mirror_S, + clamp_T, + mirror_T, + mask_S, + mask_T, + shift_S, + shift_T, + SL, + TL, + SH, + TH, + tex_format, + texIndex, + f3d, + tmem, +): + cms = [ + ("G_TX_CLAMP" if clamp_S else "G_TX_WRAP"), + ("G_TX_MIRROR" if mirror_S else "G_TX_NOMIRROR"), + ] + cmt = [ + ("G_TX_CLAMP" if clamp_T else "G_TX_WRAP"), + ("G_TX_MIRROR" if mirror_T else "G_TX_NOMIRROR"), + ] + masks = mask_S + maskt = mask_T + shifts = shift_S if shift_S >= 0 else (shift_S + 16) + shiftt = shift_T if shift_T >= 0 else (shift_T + 16) + + # print('Low ' + str(SL) + ' ' + str(TL)) + sl = int(SL * (2 ** f3d.G_TEXTURE_IMAGE_FRAC)) + tl = int(TL * (2 ** f3d.G_TEXTURE_IMAGE_FRAC)) + sh = int(SH * (2 ** f3d.G_TEXTURE_IMAGE_FRAC)) + th = int(TH * (2 ** f3d.G_TEXTURE_IMAGE_FRAC)) + + fmt = texFormatOf[tex_format] + siz = texBitSizeOf[tex_format] + pal = 0 if fmt[:2] != "CI" else 0 # handle palettes + + # texelsPerWord = int(round(64 / bitSizeDict[siz])) + useLoadBlock = ( + not fImage.isLargeTexture + and isPowerOf2(fImage.width) + and isPowerOf2(fImage.height) + ) + + # LoadTile will pad rows to 64 bit word alignment, while + # LoadBlock assumes this is already done. + + # These commands are basically DPLoadMultiBlock/Tile, + # except for the load tile index which will be 6 instead of 7 for render tile = 1. + # This may be unnecessary, but at this point DPLoadMultiBlock/Tile is not implemented yet + # so it would be extra work for the same outcome. + if siz == "G_IM_SIZ_4b": + sl2 = int(SL * (2 ** (f3d.G_TEXTURE_IMAGE_FRAC - 1))) + sh2 = int(SH * (2 ** (f3d.G_TEXTURE_IMAGE_FRAC - 1))) + + dxt = f3d.CALC_DXT_4b(fImage.width) + line = (((int(SH - SL) + 1) >> 1) + 7) >> 3 + + if useLoadBlock: + loadTexGfx.commands.extend( + [ + DPTileSync(), # added in + DPSetTextureImage(fmt, "G_IM_SIZ_16b", 1, fImage), + DPSetTile( + fmt, + "G_IM_SIZ_16b", + 0, + tmem, + f3d.G_TX_LOADTILE - texIndex, + 0, + cmt, + maskt, + shiftt, + cms, + masks, + shifts, + ), + DPLoadSync(), + DPLoadBlock( + f3d.G_TX_LOADTILE - texIndex, + 0, + 0, + (((fImage.width) * (fImage.height) + 3) >> 2) - 1, + dxt, + ), + ] + ) + else: + loadTexGfx.commands.extend( + [ + DPTileSync(), # added in + DPSetTextureImage(fmt, "G_IM_SIZ_8b", fImage.width >> 1, fImage), + DPSetTile( + fmt, + "G_IM_SIZ_8b", + line, + tmem, + f3d.G_TX_LOADTILE - texIndex, + 0, + cmt, + maskt, + shiftt, + cms, + masks, + shifts, + ), + DPLoadSync(), + DPLoadTile(f3d.G_TX_LOADTILE - texIndex, sl2, tl, sh2, th), + ] + ) + + else: + dxt = f3d.CALC_DXT(fImage.width, f3d.G_IM_SIZ_VARS[siz + "_BYTES"]) + # Note that _LINE_BYTES and _TILE_BYTES variables are the same. + line = (((int(SH - SL) + 1) * f3d.G_IM_SIZ_VARS[siz + "_LINE_BYTES"]) + 7) >> 3 + + if useLoadBlock: + loadTexGfx.commands.extend( + [ + DPTileSync(), # added in + # Load Block version + DPSetTextureImage(fmt, siz + "_LOAD_BLOCK", 1, fImage), + DPSetTile( + fmt, + siz + "_LOAD_BLOCK", + 0, + tmem, + f3d.G_TX_LOADTILE - texIndex, + 0, + cmt, + maskt, + shiftt, + cms, + masks, + shifts, + ), + DPLoadSync(), + DPLoadBlock( + f3d.G_TX_LOADTILE - texIndex, + 0, + 0, + ( + ( + (fImage.width) * (fImage.height) + + f3d.G_IM_SIZ_VARS[siz + "_INCR"] + ) + >> f3d.G_IM_SIZ_VARS[siz + "_SHIFT"] + ) + - 1, + dxt, + ), + ] + ) + else: + loadTexGfx.commands.extend( + [ + DPTileSync(), # added in + # Load Tile version + DPSetTextureImage(fmt, siz, fImage.width, fImage), + DPSetTile( + fmt, + siz, + line, + tmem, + f3d.G_TX_LOADTILE - texIndex, + 0, + cmt, + maskt, + shiftt, + cms, + masks, + shifts, + ), + DPLoadSync(), + DPLoadTile(f3d.G_TX_LOADTILE - texIndex, sl, tl, sh, th), + ] + ) # added in + + tileSizeCommand = DPSetTileSize(f3d.G_TX_RENDERTILE + texIndex, sl, tl, sh, th) + loadTexGfx.commands.extend( + [ + DPPipeSync(), + DPSetTile( + fmt, + siz, + line, + tmem, + f3d.G_TX_RENDERTILE + texIndex, + pal, + cmt, + maskt, + shiftt, + cms, + masks, + shifts, + ), + tileSizeCommand, + ] + ) # added in) + + # hasattr check for FTexRect + if hasattr(fMaterial, "tileSizeCommands"): + fMaterial.tileSizeCommands[f3d.G_TX_RENDERTILE + texIndex] = tileSizeCommand + # palette stored in upper half of TMEM (words 256-511) # pal is palette number (0-16), for CI8 always set to 0 -def savePaletteLoading(loadTexGfx, revertTexGfx, fPalette, palFormat, pal, - colorCount, f3d, matWriteMethod): - palFmt = texFormatOf[palFormat] - cms = ['G_TX_WRAP', 'G_TX_NOMIRROR'] - cmt = ['G_TX_WRAP', 'G_TX_NOMIRROR'] - - loadTexGfx.commands.append(DPSetTextureLUT( - 'G_TT_RGBA16' if palFmt == 'G_IM_FMT_RGBA' else 'G_TT_IA16')) - if matWriteMethod == GfxMatWriteMethod.WriteDifferingAndRevert: - revertTexGfx.commands.append(DPSetTextureLUT('G_TT_NONE')) - - if not f3d._HW_VERSION_1: - loadTexGfx.commands.extend([ - DPSetTextureImage(palFmt, 'G_IM_SIZ_16b', 1, fPalette), - DPTileSync(), - DPSetTile('0', '0', 0, (256+(((pal)&0xf)*16)),\ - f3d.G_TX_LOADTILE, 0, cmt, 0, 0, cms, 0, 0), - DPLoadSync(), - DPLoadTLUTCmd(f3d.G_TX_LOADTILE, colorCount - 1), - DPPipeSync()]) - else: - loadTexGfx.commands.extend([ - _DPLoadTextureBlock(fPalette, \ - (256+(((pal)&0xf)*16)), \ - palFmt, 'G_IM_SIZ_16b', 4*colorCount, 1, - pal, cms, cmt, 0, 0, 0, 0)]) - -def saveOrGetPaletteDefinition(fMaterial, fModelOrTexRect, image, imageName, texFmt, palFmt, convertTextureData): - texFormat = texFormatOf[texFmt] - palFormat = texFormatOf[palFmt] - bitSize = texBitSizeOf[texFmt] - # If image already loaded, return that data. - paletteName = toAlnum(imageName) + '_pal_' + palFmt.lower() - imageKey = (image, (texFmt, palFmt)) - paletteKey = (image, (palFmt, 'PAL')) - fImage, fPalette = fModelOrTexRect.getTextureAndHandleShared(imageKey) - if fImage is not None: - return fImage, fPalette - - palette = [] - texture = [] - maxColors = 16 if bitSize == 'G_IM_SIZ_4b' else 256 - if convertTextureData: - # N64 is -Y, Blender is +Y - for j in reversed(range(image.size[1])): - for i in range(image.size[0]): - color = [1,1,1,1] - for field in range(image.channels): - color[field] = image.pixels[ - (j * image.size[0] + i) * image.channels + field] - if palFormat == 'G_IM_FMT_RGBA': - pixelColor = getRGBA16Tuple(color) - elif palFormat == 'G_IM_FMT_IA': - pixelColor = getIA16Tuple(color) - else: - raise PluginError("Invalid combo: " + palFormat + ', ' + bitSize) - - if pixelColor not in palette: - palette.append(pixelColor) - if len(palette) > maxColors: - raise PluginError('Texture ' + imageName + ' has more than ' + \ - str(maxColors) + ' colors.') - texture.append(palette.index(pixelColor)) - - if image.filepath == "": - name = image.name - else: - name = image.filepath - filename = getNameFromPath(name, True) + '.' + \ - fModelOrTexRect.getTextureSuffixFromFormat(texFmt) + '.inc.c' - paletteFilename = getNameFromPath(name, True) + '.' + \ - fModelOrTexRect.getTextureSuffixFromFormat(texFmt) + '.pal' - #paletteFilename = getNameFromPath(name, True) + '.' + \ - # fModelOrTexRect.getTextureSuffixFromFormat(palFmt) + '.inc.c' - fImage = FImage(checkDuplicateTextureName(fModelOrTexRect, toAlnum(imageName)), texFormat, bitSize, - image.size[0], image.size[1], filename, convertTextureData) - - fPalette = FImage(checkDuplicateTextureName(fModelOrTexRect, paletteName), palFormat, 'G_IM_SIZ_16b', 1, - len(palette), paletteFilename, convertTextureData) - if fMaterial.useLargeTextures: - fImage.isLargeTexture = True - fPalette.isLargeTexture = True - fImage.paletteKey = paletteKey - - #paletteImage = bpy.data.images.new(paletteName, 1, len(palette)) - #paletteImage.pixels = palette - #paletteImage.filepath = paletteFilename - - if convertTextureData: - for color in palette: - fPalette.data.extend(color.to_bytes(2, 'big')) - - if bitSize == 'G_IM_SIZ_4b': - fImage.data = compactNibbleArray(texture, image.size[0], image.size[1]) - else: - fImage.data = bytearray(texture) - - fModelOrTexRect.addTexture((image, (texFmt, palFmt)), fImage, fMaterial) - fModelOrTexRect.addTexture((image, (palFmt, 'PAL')), fPalette, fMaterial) +def savePaletteLoading( + loadTexGfx, revertTexGfx, fPalette, palFormat, pal, colorCount, f3d, matWriteMethod +): + palFmt = texFormatOf[palFormat] + cms = ["G_TX_WRAP", "G_TX_NOMIRROR"] + cmt = ["G_TX_WRAP", "G_TX_NOMIRROR"] + + loadTexGfx.commands.append( + DPSetTextureLUT("G_TT_RGBA16" if palFmt == "G_IM_FMT_RGBA" else "G_TT_IA16") + ) + if matWriteMethod == GfxMatWriteMethod.WriteDifferingAndRevert: + revertTexGfx.commands.append(DPSetTextureLUT("G_TT_NONE")) + + if not f3d._HW_VERSION_1: + loadTexGfx.commands.extend( + [ + DPSetTextureImage(palFmt, "G_IM_SIZ_16b", 1, fPalette), + DPTileSync(), + DPSetTile( + "0", + "0", + 0, + (256 + (((pal) & 0xF) * 16)), + f3d.G_TX_LOADTILE, + 0, + cmt, + 0, + 0, + cms, + 0, + 0, + ), + DPLoadSync(), + DPLoadTLUTCmd(f3d.G_TX_LOADTILE, colorCount - 1), + DPPipeSync(), + ] + ) + else: + loadTexGfx.commands.extend( + [ + _DPLoadTextureBlock( + fPalette, + (256 + (((pal) & 0xF) * 16)), + palFmt, + "G_IM_SIZ_16b", + 4 * colorCount, + 1, + pal, + cms, + cmt, + 0, + 0, + 0, + 0, + ) + ] + ) + + +def saveOrGetPaletteDefinition( + fMaterial, fModelOrTexRect, image, imageName, texFmt, palFmt, convertTextureData +): + texFormat = texFormatOf[texFmt] + palFormat = texFormatOf[palFmt] + bitSize = texBitSizeOf[texFmt] + # If image already loaded, return that data. + paletteName = toAlnum(imageName) + "_pal_" + palFmt.lower() + imageKey = (image, (texFmt, palFmt)) + paletteKey = (image, (palFmt, "PAL")) + fImage, fPalette = fModelOrTexRect.getTextureAndHandleShared(imageKey) + if fImage is not None: + return fImage, fPalette + + palette = [] + texture = [] + maxColors = 16 if bitSize == "G_IM_SIZ_4b" else 256 + if convertTextureData: + # N64 is -Y, Blender is +Y + for j in reversed(range(image.size[1])): + for i in range(image.size[0]): + color = [1, 1, 1, 1] + for field in range(image.channels): + color[field] = image.pixels[ + (j * image.size[0] + i) * image.channels + field + ] + if palFormat == "G_IM_FMT_RGBA": + pixelColor = getRGBA16Tuple(color) + elif palFormat == "G_IM_FMT_IA": + pixelColor = getIA16Tuple(color) + else: + raise PluginError("Invalid combo: " + palFormat + ", " + bitSize) + + if pixelColor not in palette: + palette.append(pixelColor) + if len(palette) > maxColors: + raise PluginError( + "Texture " + + imageName + + " has more than " + + str(maxColors) + + " colors." + ) + texture.append(palette.index(pixelColor)) + + if image.filepath == "": + name = image.name + else: + name = image.filepath + filename = ( + getNameFromPath(name, True) + + "." + + fModelOrTexRect.getTextureSuffixFromFormat(texFmt) + + ".inc.c" + ) + paletteFilename = ( + getNameFromPath(name, True) + + "." + + fModelOrTexRect.getTextureSuffixFromFormat(texFmt) + + ".pal" + ) + # paletteFilename = getNameFromPath(name, True) + '.' + \ + # fModelOrTexRect.getTextureSuffixFromFormat(palFmt) + '.inc.c' + fImage = FImage( + checkDuplicateTextureName(fModelOrTexRect, toAlnum(imageName)), + texFormat, + bitSize, + image.size[0], + image.size[1], + filename, + convertTextureData, + ) + + fPalette = FImage( + checkDuplicateTextureName(fModelOrTexRect, paletteName), + palFormat, + "G_IM_SIZ_16b", + 1, + len(palette), + paletteFilename, + convertTextureData, + ) + if fMaterial.useLargeTextures: + fImage.isLargeTexture = True + fPalette.isLargeTexture = True + fImage.paletteKey = paletteKey + + # paletteImage = bpy.data.images.new(paletteName, 1, len(palette)) + # paletteImage.pixels = palette + # paletteImage.filepath = paletteFilename + + if convertTextureData: + for color in palette: + fPalette.data.extend(color.to_bytes(2, "big")) + + if bitSize == "G_IM_SIZ_4b": + fImage.data = compactNibbleArray(texture, image.size[0], image.size[1]) + else: + fImage.data = bytearray(texture) + + fModelOrTexRect.addTexture((image, (texFmt, palFmt)), fImage, fMaterial) + fModelOrTexRect.addTexture((image, (palFmt, "PAL")), fPalette, fMaterial) + + return fImage, fPalette # , paletteImage - return fImage, fPalette #, paletteImage def compactNibbleArray(texture, width, height): - nibbleData = bytearray(0) - dataSize = int(width * height / 2) + nibbleData = bytearray(0) + dataSize = int(width * height / 2) - nibbleData = [ - ((texture[i * 2] & 0xF) << 4) |\ - (texture[i * 2 + 1] & 0xF) for i in range(dataSize) - ] + nibbleData = [ + ((texture[i * 2] & 0xF) << 4) | (texture[i * 2 + 1] & 0xF) + for i in range(dataSize) + ] - if (width * height) % 2 == 1: - nibbleData.append((texture[-1] & 0xF) << 4) + if (width * height) % 2 == 1: + nibbleData.append((texture[-1] & 0xF) << 4) + + return bytearray(nibbleData) - return bytearray(nibbleData) def checkDuplicateTextureName(fModelOrTexRect, name): - names = [] - for info, texture in fModelOrTexRect.textures.items(): - names.append(texture.name) - while name in names: - name = name + '_copy' - return name - -def saveOrGetTextureDefinition(fMaterial, fModel, image, imageName, texFormat, convertTextureData): - fmt = texFormatOf[texFormat] - bitSize = texBitSizeOf[texFormat] - - # If image already loaded, return that data. - imageKey = (image, (texFormat, 'NONE')) - fImage, fPalette = fModel.getTextureAndHandleShared(imageKey) - if fImage is not None: - return fImage - - if image.filepath == "": - name = image.name - else: - name = image.filepath - filename = getNameFromPath(name, True) + '.' + \ - fModel.getTextureSuffixFromFormat(texFormat) + '.inc.c' - - fImage = FImage(checkDuplicateTextureName(fModel, toAlnum(imageName)), fmt, bitSize, - image.size[0], image.size[1], filename, convertTextureData) - if fMaterial.useLargeTextures: - fImage.isLargeTexture = True - - if convertTextureData: - print("Converting texture data.") - if fmt == 'G_IM_FMT_RGBA': - if bitSize == 'G_IM_SIZ_16b': - #fImage.data = bytearray([byteVal for doubleByte in [ - # (((int(image.pixels[(j * image.size[0] + i) * image.channels + 0] * 0x1F) & 0x1F) << 11) | \ - # ((int(image.pixels[(j * image.size[0] + i) * image.channels + 1] * 0x1F) & 0x1F) << 6) | \ - # ((int(image.pixels[(j * image.size[0] + i) * image.channels + 2] * 0x1F) & 0x1F) << 1) | \ - # (1 if image.pixels[(j * image.size[0] + i) * image.channels + 3] > 0.5 else 0) - # ).to_bytes(2, 'big') - # for j in reversed(range(image.size[1])) for i in range(image.size[0])] for byteVal in doubleByte]) - - fImage.data = bytearray([byteVal for doubleByte in [ - ((((int(round(image.pixels[(j * image.size[0] + i) * image.channels + 0] * 0x1F)) & 0x1F) << 3) | - ((int(round(image.pixels[(j * image.size[0] + i) * image.channels + 1] * 0x1F)) & 0x1F) >> 2)), - - (((int(round(image.pixels[(j * image.size[0] + i) * image.channels + 1] * 0x1F)) & 0x03) << 6) | \ - ((int(round(image.pixels[(j * image.size[0] + i) * image.channels + 2] * 0x1F)) & 0x1F) << 1) | \ - (1 if image.pixels[(j * image.size[0] + i) * image.channels + 3] > 0.5 else 0))) - - for j in reversed(range(image.size[1])) for i in range(image.size[0])] for byteVal in doubleByte]) - elif bitSize == 'G_IM_SIZ_32b': - fImage.data = bytearray([ - int(round(image.pixels[(j * image.size[0] + i) * image.channels + field] * 0xFF)) & 0xFF - for j in reversed(range(image.size[1])) for i in range(image.size[0]) for field in range(image.channels)]) - else: - raise PluginError("Invalid combo: " + fmt + ', ' + bitSize) - - elif fmt == 'G_IM_FMT_YUV': - raise PluginError("YUV not yet implemented.") - if bitSize == 'G_IM_SIZ_16b': - pass - else: - raise PluginError("Invalid combo: " + fmt + ', ' + bitSize) - - elif fmt == 'G_IM_FMT_CI': - raise PluginError("CI not yet implemented.") - - elif fmt == 'G_IM_FMT_IA': - if bitSize == 'G_IM_SIZ_4b': - fImage.data = bytearray([ - ((int(round(mathutils.Color( - image.pixels[ - (j * image.size[0] + i) * image.channels : - (j * image.size[0] + i) * image.channels + 3 - ]).v * 0x7)) & 0x7) << 1) | \ - (1 if image.pixels[(j * image.size[0] + i) * image.channels + 3] > 0.5 else 0) - for j in reversed(range(image.size[1])) for i in range(image.size[0])]) - elif bitSize == 'G_IM_SIZ_8b': - fImage.data = bytearray([ - ((int(round(mathutils.Color( - image.pixels[ - (j * image.size[0] + i) * image.channels : - (j * image.size[0] + i) * image.channels + 3 - ]).v * 0xF)) & 0xF) << 4) | \ - (int(round(image.pixels[(j * image.size[0] + i) * image.channels + 3] * 0xF)) & 0xF) - for j in reversed(range(image.size[1])) for i in range(image.size[0])]) - elif bitSize == 'G_IM_SIZ_16b': - fImage.data = bytearray([byteVal for doubleByte in [ - (int(round(mathutils.Color( - image.pixels[ - (j * image.size[0] + i) * image.channels : - (j * image.size[0] + i) * image.channels + 3 - ]).v * 0xFF)) & 0xFF, - int(round(image.pixels[(j * image.size[0] + i) * image.channels + 3] * 0xFF)) & 0xFF) - for j in reversed(range(image.size[1])) for i in range(image.size[0])] for byteVal in doubleByte]) - else: - raise PluginError("Invalid combo: " + fmt + ', ' + bitSize) - elif fmt == 'G_IM_FMT_I': - if bitSize == 'G_IM_SIZ_4b': - fImage.data = bytearray([ - int(round(mathutils.Color( - image.pixels[ - (j * image.size[0] + i) * image.channels : - (j * image.size[0] + i) * image.channels + 3 - ]).v * 0xF)) & 0xF - for j in reversed(range(image.size[1])) for i in range(image.size[0])]) - elif bitSize == 'G_IM_SIZ_8b': - fImage.data = bytearray([ - int(round(mathutils.Color( - image.pixels[ - (j * image.size[0] + i) * image.channels : - (j * image.size[0] + i) * image.channels + 3 - ]).v * 0xFF)) & 0xFF - for j in reversed(range(image.size[1])) for i in range(image.size[0])]) - else: - raise PluginError("Invalid combo: " + fmt + ', ' + bitSize) - else: - raise PluginError("Invalid image format " + fmt) - - # We stored 4bit values in byte arrays, now to convert - if bitSize == 'G_IM_SIZ_4b': - fImage.data = \ - compactNibbleArray(fImage.data, image.size[0], image.size[1]) - - print("Finished converting.") - fModel.addTexture((image, (texFormat, 'NONE')), fImage, fMaterial) - - return fImage - - # Ignore, old version not using list comprehension - # Warning, ints not rounded - #if convertTextureData: - # # N64 is -Y, Blender is +Y - # for j in reversed(range(image.size[1])): - # for i in range(image.size[0]): - # color = [1,1,1,1] - # for field in range(image.channels): - # color[field] = image.pixels[ - # (j * image.size[0] + i) * image.channels + field] - # if fmt == 'G_IM_FMT_RGBA': - # if bitSize == 'G_IM_SIZ_16b': - # words = \ - # ((int(color[0] * 0x1F) & 0x1F) << 11) | \ - # ((int(color[1] * 0x1F) & 0x1F) << 6) | \ - # ((int(color[2] * 0x1F) & 0x1F) << 1) | \ - # (1 if color[3] > 0.5 else 0) - # fImage.data.extend(bytearray(words.to_bytes(2, 'big'))) - # elif bitSize == 'G_IM_SIZ_32b': - # fImage.data.extend(bytearray([ - # int(value * 0xFF) & 0xFF for value in color])) - # else: - # raise PluginError("Invalid combo: " + fmt + ', ' + bitSize) + names = [] + for info, texture in fModelOrTexRect.textures.items(): + names.append(texture.name) + while name in names: + name = name + "_copy" + return name + + +def saveOrGetTextureDefinition( + fMaterial, fModel, image, imageName, texFormat, convertTextureData +): + fmt = texFormatOf[texFormat] + bitSize = texBitSizeOf[texFormat] + + # If image already loaded, return that data. + imageKey = (image, (texFormat, "NONE")) + fImage, fPalette = fModel.getTextureAndHandleShared(imageKey) + if fImage is not None: + return fImage + + if image.filepath == "": + name = image.name + else: + name = image.filepath + filename = ( + getNameFromPath(name, True) + + "." + + fModel.getTextureSuffixFromFormat(texFormat) + + ".inc.c" + ) + + fImage = FImage( + checkDuplicateTextureName(fModel, toAlnum(imageName)), + fmt, + bitSize, + image.size[0], + image.size[1], + filename, + convertTextureData, + ) + if fMaterial.useLargeTextures: + fImage.isLargeTexture = True + + if convertTextureData: + print("Converting texture data.") + if fmt == "G_IM_FMT_RGBA": + if bitSize == "G_IM_SIZ_16b": + # fImage.data = bytearray([byteVal for doubleByte in [ + # (((int(image.pixels[(j * image.size[0] + i) * image.channels + 0] * 0x1F) & 0x1F) << 11) | \ + # ((int(image.pixels[(j * image.size[0] + i) * image.channels + 1] * 0x1F) & 0x1F) << 6) | \ + # ((int(image.pixels[(j * image.size[0] + i) * image.channels + 2] * 0x1F) & 0x1F) << 1) | \ + # (1 if image.pixels[(j * image.size[0] + i) * image.channels + 3] > 0.5 else 0) + # ).to_bytes(2, 'big') + # for j in reversed(range(image.size[1])) for i in range(image.size[0])] for byteVal in doubleByte]) + + fImage.data = bytearray( + [ + byteVal + for doubleByte in [ + ( + ( + ( + ( + int( + round( + image.pixels[ + (j * image.size[0] + i) + * image.channels + + 0 + ] + * 0x1F + ) + ) + & 0x1F + ) + << 3 + ) + | ( + ( + int( + round( + image.pixels[ + (j * image.size[0] + i) + * image.channels + + 1 + ] + * 0x1F + ) + ) + & 0x1F + ) + >> 2 + ) + ), + ( + ( + ( + int( + round( + image.pixels[ + (j * image.size[0] + i) + * image.channels + + 1 + ] + * 0x1F + ) + ) + & 0x03 + ) + << 6 + ) + | ( + ( + int( + round( + image.pixels[ + (j * image.size[0] + i) + * image.channels + + 2 + ] + * 0x1F + ) + ) + & 0x1F + ) + << 1 + ) + | ( + 1 + if image.pixels[ + (j * image.size[0] + i) * image.channels + 3 + ] + > 0.5 + else 0 + ) + ), + ) + for j in reversed(range(image.size[1])) + for i in range(image.size[0]) + ] + for byteVal in doubleByte + ] + ) + elif bitSize == "G_IM_SIZ_32b": + fImage.data = bytearray( + [ + int( + round( + image.pixels[ + (j * image.size[0] + i) * image.channels + field + ] + * 0xFF + ) + ) + & 0xFF + for j in reversed(range(image.size[1])) + for i in range(image.size[0]) + for field in range(image.channels) + ] + ) + else: + raise PluginError("Invalid combo: " + fmt + ", " + bitSize) + + elif fmt == "G_IM_FMT_YUV": + raise PluginError("YUV not yet implemented.") + if bitSize == "G_IM_SIZ_16b": + pass + else: + raise PluginError("Invalid combo: " + fmt + ", " + bitSize) + + elif fmt == "G_IM_FMT_CI": + raise PluginError("CI not yet implemented.") + + elif fmt == "G_IM_FMT_IA": + if bitSize == "G_IM_SIZ_4b": + fImage.data = bytearray( + [ + ( + ( + int( + round( + mathutils.Color( + image.pixels[ + (j * image.size[0] + i) + * image.channels : ( + j * image.size[0] + i + ) + * image.channels + + 3 + ] + ).v + * 0x7 + ) + ) + & 0x7 + ) + << 1 + ) + | ( + 1 + if image.pixels[ + (j * image.size[0] + i) * image.channels + 3 + ] + > 0.5 + else 0 + ) + for j in reversed(range(image.size[1])) + for i in range(image.size[0]) + ] + ) + elif bitSize == "G_IM_SIZ_8b": + fImage.data = bytearray( + [ + ( + ( + int( + round( + mathutils.Color( + image.pixels[ + (j * image.size[0] + i) + * image.channels : ( + j * image.size[0] + i + ) + * image.channels + + 3 + ] + ).v + * 0xF + ) + ) + & 0xF + ) + << 4 + ) + | ( + int( + round( + image.pixels[ + (j * image.size[0] + i) * image.channels + 3 + ] + * 0xF + ) + ) + & 0xF + ) + for j in reversed(range(image.size[1])) + for i in range(image.size[0]) + ] + ) + elif bitSize == "G_IM_SIZ_16b": + fImage.data = bytearray( + [ + byteVal + for doubleByte in [ + ( + int( + round( + mathutils.Color( + image.pixels[ + (j * image.size[0] + i) + * image.channels : ( + j * image.size[0] + i + ) + * image.channels + + 3 + ] + ).v + * 0xFF + ) + ) + & 0xFF, + int( + round( + image.pixels[ + (j * image.size[0] + i) * image.channels + 3 + ] + * 0xFF + ) + ) + & 0xFF, + ) + for j in reversed(range(image.size[1])) + for i in range(image.size[0]) + ] + for byteVal in doubleByte + ] + ) + else: + raise PluginError("Invalid combo: " + fmt + ", " + bitSize) + elif fmt == "G_IM_FMT_I": + if bitSize == "G_IM_SIZ_4b": + fImage.data = bytearray( + [ + int( + round( + mathutils.Color( + image.pixels[ + (j * image.size[0] + i) + * image.channels : (j * image.size[0] + i) + * image.channels + + 3 + ] + ).v + * 0xF + ) + ) + & 0xF + for j in reversed(range(image.size[1])) + for i in range(image.size[0]) + ] + ) + elif bitSize == "G_IM_SIZ_8b": + fImage.data = bytearray( + [ + int( + round( + mathutils.Color( + image.pixels[ + (j * image.size[0] + i) + * image.channels : (j * image.size[0] + i) + * image.channels + + 3 + ] + ).v + * 0xFF + ) + ) + & 0xFF + for j in reversed(range(image.size[1])) + for i in range(image.size[0]) + ] + ) + else: + raise PluginError("Invalid combo: " + fmt + ", " + bitSize) + else: + raise PluginError("Invalid image format " + fmt) + + # We stored 4bit values in byte arrays, now to convert + if bitSize == "G_IM_SIZ_4b": + fImage.data = compactNibbleArray(fImage.data, image.size[0], image.size[1]) + + print("Finished converting.") + fModel.addTexture((image, (texFormat, "NONE")), fImage, fMaterial) + + return fImage + + # Ignore, old version not using list comprehension + # Warning, ints not rounded + # if convertTextureData: + # # N64 is -Y, Blender is +Y + # for j in reversed(range(image.size[1])): + # for i in range(image.size[0]): + # color = [1,1,1,1] + # for field in range(image.channels): + # color[field] = image.pixels[ + # (j * image.size[0] + i) * image.channels + field] + # if fmt == 'G_IM_FMT_RGBA': + # if bitSize == 'G_IM_SIZ_16b': + # words = \ + # ((int(color[0] * 0x1F) & 0x1F) << 11) | \ + # ((int(color[1] * 0x1F) & 0x1F) << 6) | \ + # ((int(color[2] * 0x1F) & 0x1F) << 1) | \ + # (1 if color[3] > 0.5 else 0) + # fImage.data.extend(bytearray(words.to_bytes(2, 'big'))) + # elif bitSize == 'G_IM_SIZ_32b': + # fImage.data.extend(bytearray([ + # int(value * 0xFF) & 0xFF for value in color])) + # else: + # raise PluginError("Invalid combo: " + fmt + ', ' + bitSize) + + # - # elif fmt == 'G_IM_FMT_YUV': - # raise PluginError("YUV not yet implemented.") - # if bitSize == 'G_IM_SIZ_16b': - # pass - # else: - # raise PluginError("Invalid combo: " + fmt + ', ' + bitSize) +# elif fmt == 'G_IM_FMT_YUV': +# raise PluginError("YUV not yet implemented.") +# if bitSize == 'G_IM_SIZ_16b': +# pass +# else: +# raise PluginError("Invalid combo: " + fmt + ', ' + bitSize) # - # elif fmt == 'G_IM_FMT_CI': - # raise PluginError("CI not yet implemented.") +# elif fmt == 'G_IM_FMT_CI': +# raise PluginError("CI not yet implemented.") # - # elif fmt == 'G_IM_FMT_IA': - # intensity = mathutils.Color(color[0:3]).v - # alpha = color[3] - # if bitSize == 'G_IM_SIZ_4b': - # fImage.data.append( - # ((int(intensity * 0x7) & 0x7) << 1) | \ - # (1 if alpha > 0.5 else 0)) - # elif bitSize == 'G_IM_SIZ_8b': - # fImage.data.append( - # ((int(intensity * 0xF) & 0xF) << 4) | \ - # (int(alpha * 0xF) & 0xF)) - # elif bitSize == 'G_IM_SIZ_16b': - # fImage.data.extend(bytearray( - # [int(intensity * 0xFF), int(alpha * 0xFF)])) - # else: - # raise PluginError("Invalid combo: " + fmt + ', ' + bitSize) - # elif fmt == 'G_IM_FMT_I': - # intensity = mathutils.Color(color[0:3]).v - # if bitSize == 'G_IM_SIZ_4b': - # fImage.data.append(int(intensity * 0xF)) - # elif bitSize == 'G_IM_SIZ_8b': - # fImage.data.append(int(intensity * 0xFF)) - # else: - # raise PluginError("Invalid combo: " + fmt + ', ' + bitSize) - # else: - # raise PluginError("Invalid image format " + fmt) - # - # # We stored 4bit values in byte arrays, now to convert - # if bitSize == 'G_IM_SIZ_4b': - # fImage.data = \ - # compactNibbleArray(fImage.data, image.size[0], image.size[1]) - # - #fModel.addTexture((image, (texFormat, 'NONE')), fImage, fMaterial) +# elif fmt == 'G_IM_FMT_IA': +# intensity = mathutils.Color(color[0:3]).v +# alpha = color[3] +# if bitSize == 'G_IM_SIZ_4b': +# fImage.data.append( +# ((int(intensity * 0x7) & 0x7) << 1) | \ +# (1 if alpha > 0.5 else 0)) +# elif bitSize == 'G_IM_SIZ_8b': +# fImage.data.append( +# ((int(intensity * 0xF) & 0xF) << 4) | \ +# (int(alpha * 0xF) & 0xF)) +# elif bitSize == 'G_IM_SIZ_16b': +# fImage.data.extend(bytearray( +# [int(intensity * 0xFF), int(alpha * 0xFF)])) +# else: +# raise PluginError("Invalid combo: " + fmt + ', ' + bitSize) +# elif fmt == 'G_IM_FMT_I': +# intensity = mathutils.Color(color[0:3]).v +# if bitSize == 'G_IM_SIZ_4b': +# fImage.data.append(int(intensity * 0xF)) +# elif bitSize == 'G_IM_SIZ_8b': +# fImage.data.append(int(intensity * 0xFF)) +# else: +# raise PluginError("Invalid combo: " + fmt + ', ' + bitSize) +# else: +# raise PluginError("Invalid image format " + fmt) # - #return fImage +# # We stored 4bit values in byte arrays, now to convert +# if bitSize == 'G_IM_SIZ_4b': +# fImage.data = \ +# compactNibbleArray(fImage.data, image.size[0], image.size[1]) +# +# fModel.addTexture((image, (texFormat, 'NONE')), fImage, fMaterial) +# +# return fImage + def saveLightsDefinition(fModel, fMaterial, material, lightsName): - lights = fModel.getLightAndHandleShared(lightsName) - if lights is not None: - return lights - - lights = Lights(toAlnum(lightsName)) - - if material.use_default_lighting: - color = gammaCorrect(material.default_light_color) - lights.a = Ambient( - [int(color[0] * 255 / 2), - int(color[1] * 255 / 2), - int(color[2] * 255 / 2)]) - lights.l.append(Light( - [int(color[0] * 255), - int(color[1] * 255), - int(color[2] * 255)], - [0x28, 0x28, 0x28])) - else: - ambientColor = gammaCorrect(material.ambient_light_color) - - lights.a = Ambient( - [int(ambientColor[0] * 255), - int(ambientColor[1] * 255), - int(ambientColor[2] * 255)]) - - if material.f3d_light1 is not None: - addLightDefinition(material, material.f3d_light1, lights) - if material.f3d_light2 is not None: - addLightDefinition(material, material.f3d_light2, lights) - if material.f3d_light3 is not None: - addLightDefinition(material, material.f3d_light3, lights) - if material.f3d_light4 is not None: - addLightDefinition(material, material.f3d_light4, lights) - if material.f3d_light5 is not None: - addLightDefinition(material, material.f3d_light5, lights) - if material.f3d_light6 is not None: - addLightDefinition(material, material.f3d_light6, lights) - if material.f3d_light7 is not None: - addLightDefinition(material, material.f3d_light7, lights) - - if lightsName in fModel.lights: - raise PluginError("Duplicate light name.") - fModel.addLight(lightsName, lights, fMaterial) - return lights + lights = fModel.getLightAndHandleShared(lightsName) + if lights is not None: + return lights + + lights = Lights(toAlnum(lightsName)) + + if material.use_default_lighting: + color = gammaCorrect(material.default_light_color) + lights.a = Ambient( + [int(color[0] * 255 / 2), int(color[1] * 255 / 2), int(color[2] * 255 / 2)] + ) + lights.l.append( + Light( + [int(color[0] * 255), int(color[1] * 255), int(color[2] * 255)], + [0x28, 0x28, 0x28], + ) + ) + else: + ambientColor = gammaCorrect(material.ambient_light_color) + + lights.a = Ambient( + [ + int(ambientColor[0] * 255), + int(ambientColor[1] * 255), + int(ambientColor[2] * 255), + ] + ) + + if material.f3d_light1 is not None: + addLightDefinition(material, material.f3d_light1, lights) + if material.f3d_light2 is not None: + addLightDefinition(material, material.f3d_light2, lights) + if material.f3d_light3 is not None: + addLightDefinition(material, material.f3d_light3, lights) + if material.f3d_light4 is not None: + addLightDefinition(material, material.f3d_light4, lights) + if material.f3d_light5 is not None: + addLightDefinition(material, material.f3d_light5, lights) + if material.f3d_light6 is not None: + addLightDefinition(material, material.f3d_light6, lights) + if material.f3d_light7 is not None: + addLightDefinition(material, material.f3d_light7, lights) + + if lightsName in fModel.lights: + raise PluginError("Duplicate light name.") + fModel.addLight(lightsName, lights, fMaterial) + return lights + def addLightDefinition(mat, f3d_light, fLights): - #lightObj = None - #for obj in bpy.context.scene.objects: - # if obj.data == f3d_light: - # lightObj = obj - # break - #if lightObj is None: - # raise PluginError( - # "The material \"" + mat.name + "\" is referencing a light that is no longer in the scene (i.e. has been deleted).") - - fLights.l.append(Light( - getLightColor(f3d_light.color), - getLightRotation(f3d_light), - )) + # lightObj = None + # for obj in bpy.context.scene.objects: + # if obj.data == f3d_light: + # lightObj = obj + # break + # if lightObj is None: + # raise PluginError( + # "The material \"" + mat.name + "\" is referencing a light that is no longer in the scene (i.e. has been deleted).") + + fLights.l.append( + Light( + getLightColor(f3d_light.color), + getLightRotation(f3d_light), + ) + ) + def getLightColor(lightColor): - return [int(round(value * 0xFF)) for value in gammaCorrect(lightColor)] + return [int(round(value * 0xFF)) for value in gammaCorrect(lightColor)] + def getLightRotation(lightData): - lightObj = None - for obj in bpy.context.scene.objects: - if obj.data == lightData: - lightObj = obj - break - if lightObj is None: - raise PluginError("A material is referencing a light that is no longer in the scene (i.e. has been deleted).") + lightObj = None + for obj in bpy.context.scene.objects: + if obj.data == lightData: + lightObj = obj + break + if lightObj is None: + raise PluginError( + "A material is referencing a light that is no longer in the scene (i.e. has been deleted)." + ) + + return getObjDirection(lightObj) - return getObjDirection(lightObj) def getObjDirection(obj): - spaceRot = mathutils.Euler((-pi / 2, 0, 0)).to_quaternion() - rotation = spaceRot @ getObjectQuaternion(obj) - normal = (rotation @ mathutils.Vector((0,0,1))).normalized() - return normToSigned8Vector(normal) + spaceRot = mathutils.Euler((-pi / 2, 0, 0)).to_quaternion() + rotation = spaceRot @ getObjectQuaternion(obj) + normal = (rotation @ mathutils.Vector((0, 0, 1))).normalized() + return normToSigned8Vector(normal) + def normToSigned8Vector(normal): - return [int.from_bytes(int(value * 127).to_bytes(1, 'big', - signed = True), 'big') for value in normal] + return [ + int.from_bytes(int(value * 127).to_bytes(1, "big", signed=True), "big") + for value in normal + ] + def saveBitGeoF3DEX2(value, defaultValue, flagName, geo, matWriteMethod): - if value != defaultValue or matWriteMethod == GfxMatWriteMethod.WriteAll: - if value: - geo.setFlagList.append(flagName) - else: - geo.clearFlagList.append(flagName) + if value != defaultValue or matWriteMethod == GfxMatWriteMethod.WriteAll: + if value: + geo.setFlagList.append(flagName) + else: + geo.clearFlagList.append(flagName) + def saveGeoModeDefinitionF3DEX2(fMaterial, settings, defaults, matWriteMethod): - geo = SPGeometryMode([],[]) - - saveBitGeoF3DEX2(settings.g_zbuffer, defaults.g_zbuffer, 'G_ZBUFFER', - geo, matWriteMethod) - saveBitGeoF3DEX2(settings.g_shade, defaults.g_shade, 'G_SHADE', - geo, matWriteMethod) - saveBitGeoF3DEX2(settings.g_cull_front, defaults.g_cull_front, 'G_CULL_FRONT', - geo, matWriteMethod) - saveBitGeoF3DEX2(settings.g_cull_back, defaults.g_cull_back, 'G_CULL_BACK', - geo, matWriteMethod) - saveBitGeoF3DEX2(settings.g_fog, defaults.g_fog, 'G_FOG', geo, matWriteMethod) - saveBitGeoF3DEX2(settings.g_lighting, defaults.g_lighting, 'G_LIGHTING', - geo, matWriteMethod) - - # make sure normals are saved correctly. - saveBitGeoF3DEX2(settings.g_tex_gen, defaults.g_tex_gen, 'G_TEXTURE_GEN', - geo, matWriteMethod) - saveBitGeoF3DEX2(settings.g_tex_gen_linear, defaults.g_tex_gen_linear, - 'G_TEXTURE_GEN_LINEAR', geo, matWriteMethod) - saveBitGeoF3DEX2(settings.g_shade_smooth, defaults.g_shade_smooth, - 'G_SHADING_SMOOTH', geo, matWriteMethod) - saveBitGeoF3DEX2(settings.g_clipping, defaults.g_clipping, 'G_CLIPPING', - geo, matWriteMethod) - - if len(geo.clearFlagList) != 0 or len(geo.setFlagList) != 0: - if len(geo.clearFlagList) == 0: - geo.clearFlagList.append('0') - elif len(geo.setFlagList) == 0: - geo.setFlagList.append('0') - - if matWriteMethod == GfxMatWriteMethod.WriteAll: - fMaterial.material.commands.append(SPLoadGeometryMode(geo.setFlagList)) - else: - fMaterial.material.commands.append(geo) - fMaterial.revert.commands.append(SPGeometryMode(geo.setFlagList, geo.clearFlagList)) + geo = SPGeometryMode([], []) + + saveBitGeoF3DEX2( + settings.g_zbuffer, defaults.g_zbuffer, "G_ZBUFFER", geo, matWriteMethod + ) + saveBitGeoF3DEX2(settings.g_shade, defaults.g_shade, "G_SHADE", geo, matWriteMethod) + saveBitGeoF3DEX2( + settings.g_cull_front, + defaults.g_cull_front, + "G_CULL_FRONT", + geo, + matWriteMethod, + ) + saveBitGeoF3DEX2( + settings.g_cull_back, defaults.g_cull_back, "G_CULL_BACK", geo, matWriteMethod + ) + saveBitGeoF3DEX2(settings.g_fog, defaults.g_fog, "G_FOG", geo, matWriteMethod) + saveBitGeoF3DEX2( + settings.g_lighting, defaults.g_lighting, "G_LIGHTING", geo, matWriteMethod + ) + + # make sure normals are saved correctly. + saveBitGeoF3DEX2( + settings.g_tex_gen, defaults.g_tex_gen, "G_TEXTURE_GEN", geo, matWriteMethod + ) + saveBitGeoF3DEX2( + settings.g_tex_gen_linear, + defaults.g_tex_gen_linear, + "G_TEXTURE_GEN_LINEAR", + geo, + matWriteMethod, + ) + saveBitGeoF3DEX2( + settings.g_shade_smooth, + defaults.g_shade_smooth, + "G_SHADING_SMOOTH", + geo, + matWriteMethod, + ) + saveBitGeoF3DEX2( + settings.g_clipping, defaults.g_clipping, "G_CLIPPING", geo, matWriteMethod + ) + + if len(geo.clearFlagList) != 0 or len(geo.setFlagList) != 0: + if len(geo.clearFlagList) == 0: + geo.clearFlagList.append("0") + elif len(geo.setFlagList) == 0: + geo.setFlagList.append("0") + + if matWriteMethod == GfxMatWriteMethod.WriteAll: + fMaterial.material.commands.append(SPLoadGeometryMode(geo.setFlagList)) + else: + fMaterial.material.commands.append(geo) + fMaterial.revert.commands.append( + SPGeometryMode(geo.setFlagList, geo.clearFlagList) + ) + def saveBitGeo(value, defaultValue, flagName, setGeo, clearGeo, matWriteMethod): - if value != defaultValue or matWriteMethod == GfxMatWriteMethod.WriteAll: - if value: - setGeo.flagList.append(flagName) - else: - clearGeo.flagList.append(flagName) + if value != defaultValue or matWriteMethod == GfxMatWriteMethod.WriteAll: + if value: + setGeo.flagList.append(flagName) + else: + clearGeo.flagList.append(flagName) + def saveGeoModeDefinition(fMaterial, settings, defaults, matWriteMethod): - setGeo = SPSetGeometryMode([]) - clearGeo = SPClearGeometryMode([]) - - saveBitGeo(settings.g_zbuffer, defaults.g_zbuffer, 'G_ZBUFFER', - setGeo, clearGeo, matWriteMethod) - saveBitGeo(settings.g_shade, defaults.g_shade, 'G_SHADE', - setGeo, clearGeo, matWriteMethod) - saveBitGeo(settings.g_cull_front, defaults.g_cull_front, 'G_CULL_FRONT', - setGeo, clearGeo, matWriteMethod) - saveBitGeo(settings.g_cull_back, defaults.g_cull_back, 'G_CULL_BACK', - setGeo, clearGeo, matWriteMethod) - saveBitGeo(settings.g_fog, defaults.g_fog, 'G_FOG', setGeo, clearGeo, matWriteMethod) - saveBitGeo(settings.g_lighting, defaults.g_lighting, 'G_LIGHTING', - setGeo, clearGeo, matWriteMethod) - - # make sure normals are saved correctly. - saveBitGeo(settings.g_tex_gen, defaults.g_tex_gen, 'G_TEXTURE_GEN', - setGeo, clearGeo, matWriteMethod) - saveBitGeo(settings.g_tex_gen_linear, defaults.g_tex_gen_linear, - 'G_TEXTURE_GEN_LINEAR', setGeo, clearGeo, matWriteMethod) - saveBitGeo(settings.g_shade_smooth, defaults.g_shade_smooth, - 'G_SHADING_SMOOTH', setGeo, clearGeo, matWriteMethod) - if bpy.context.scene.f3d_type == 'F3DEX_GBI_2' or \ - bpy.context.scene.f3d_type == 'F3DEX_GBI': - saveBitGeo(settings.g_clipping, defaults.g_clipping, 'G_CLIPPING', - setGeo, clearGeo, matWriteMethod) - - if len(setGeo.flagList) > 0: - fMaterial.material.commands.append(setGeo) - if matWriteMethod == GfxMatWriteMethod.WriteDifferingAndRevert: - fMaterial.revert.commands.append(SPClearGeometryMode(setGeo.flagList)) - if len(clearGeo.flagList) > 0: - fMaterial.material.commands.append(clearGeo) - if matWriteMethod == GfxMatWriteMethod.WriteDifferingAndRevert: - fMaterial.revert.commands.append(SPSetGeometryMode(clearGeo.flagList)) + setGeo = SPSetGeometryMode([]) + clearGeo = SPClearGeometryMode([]) + + saveBitGeo( + settings.g_zbuffer, + defaults.g_zbuffer, + "G_ZBUFFER", + setGeo, + clearGeo, + matWriteMethod, + ) + saveBitGeo( + settings.g_shade, defaults.g_shade, "G_SHADE", setGeo, clearGeo, matWriteMethod + ) + saveBitGeo( + settings.g_cull_front, + defaults.g_cull_front, + "G_CULL_FRONT", + setGeo, + clearGeo, + matWriteMethod, + ) + saveBitGeo( + settings.g_cull_back, + defaults.g_cull_back, + "G_CULL_BACK", + setGeo, + clearGeo, + matWriteMethod, + ) + saveBitGeo( + settings.g_fog, defaults.g_fog, "G_FOG", setGeo, clearGeo, matWriteMethod + ) + saveBitGeo( + settings.g_lighting, + defaults.g_lighting, + "G_LIGHTING", + setGeo, + clearGeo, + matWriteMethod, + ) + + # make sure normals are saved correctly. + saveBitGeo( + settings.g_tex_gen, + defaults.g_tex_gen, + "G_TEXTURE_GEN", + setGeo, + clearGeo, + matWriteMethod, + ) + saveBitGeo( + settings.g_tex_gen_linear, + defaults.g_tex_gen_linear, + "G_TEXTURE_GEN_LINEAR", + setGeo, + clearGeo, + matWriteMethod, + ) + saveBitGeo( + settings.g_shade_smooth, + defaults.g_shade_smooth, + "G_SHADING_SMOOTH", + setGeo, + clearGeo, + matWriteMethod, + ) + if ( + bpy.context.scene.f3d_type == "F3DEX_GBI_2" + or bpy.context.scene.f3d_type == "F3DEX_GBI" + ): + saveBitGeo( + settings.g_clipping, + defaults.g_clipping, + "G_CLIPPING", + setGeo, + clearGeo, + matWriteMethod, + ) + + if len(setGeo.flagList) > 0: + fMaterial.material.commands.append(setGeo) + if matWriteMethod == GfxMatWriteMethod.WriteDifferingAndRevert: + fMaterial.revert.commands.append(SPClearGeometryMode(setGeo.flagList)) + if len(clearGeo.flagList) > 0: + fMaterial.material.commands.append(clearGeo) + if matWriteMethod == GfxMatWriteMethod.WriteDifferingAndRevert: + fMaterial.revert.commands.append(SPSetGeometryMode(clearGeo.flagList)) -def saveModeSetting(fMaterial, value, defaultValue, cmdClass): - if value != defaultValue: - fMaterial.material.commands.append(cmdClass(value)) - fMaterial.revert.commands.append(cmdClass(defaultValue)) -def saveOtherModeHDefinition(fMaterial, settings, defaults, isHWv1, matWriteMethod): - if matWriteMethod == GfxMatWriteMethod.WriteAll: - saveOtherModeHDefinitionAll(fMaterial, settings, defaults, isHWv1) - elif matWriteMethod == GfxMatWriteMethod.WriteDifferingAndRevert: - saveOtherModeHDefinitionIndividual(fMaterial, settings, defaults, isHWv1) - else: - raise PluginError("Unhandled material write method: " + str(matWriteMethod)) - -def saveOtherModeHDefinitionAll(fMaterial, settings, defaults, isHWv1): - cmd = SPSetOtherMode("G_SETOTHERMODE_H", 4, 20, []) - cmd.flagList.append(settings.g_mdsft_alpha_dither) - if not isHWv1: - cmd.flagList.append(settings.g_mdsft_rgb_dither) - cmd.flagList.append(settings.g_mdsft_combkey) - cmd.flagList.append(settings.g_mdsft_textconv) - cmd.flagList.append(settings.g_mdsft_text_filt) - cmd.flagList.append(settings.g_mdsft_textlod) - cmd.flagList.append(settings.g_mdsft_textdetail) - cmd.flagList.append(settings.g_mdsft_textpersp) - cmd.flagList.append(settings.g_mdsft_cycletype) - if isHWv1: - cmd.flagList.append(settings.g_mdsft_color_dither) - cmd.flagList.append(settings.g_mdsft_pipeline) - - fMaterial.material.commands.append(cmd) +def saveModeSetting(fMaterial, value, defaultValue, cmdClass): + if value != defaultValue: + fMaterial.material.commands.append(cmdClass(value)) + fMaterial.revert.commands.append(cmdClass(defaultValue)) -def saveOtherModeHDefinitionIndividual(fMaterial, settings, defaults, isHWv1): - saveModeSetting(fMaterial, settings.g_mdsft_alpha_dither, - defaults.g_mdsft_alpha_dither, DPSetAlphaDither) - - if not isHWv1: - saveModeSetting(fMaterial, settings.g_mdsft_rgb_dither, - defaults.g_mdsft_rgb_dither, DPSetColorDither) - - saveModeSetting(fMaterial, settings.g_mdsft_combkey, - defaults.g_mdsft_combkey, DPSetCombineKey) - - saveModeSetting(fMaterial, settings.g_mdsft_textconv, - defaults.g_mdsft_textconv, DPSetTextureConvert) - - saveModeSetting(fMaterial, settings.g_mdsft_text_filt, - defaults.g_mdsft_text_filt, DPSetTextureFilter) - - #saveModeSetting(fMaterial, settings.g_mdsft_textlut, - # defaults.g_mdsft_textlut, DPSetTextureLUT) - - saveModeSetting(fMaterial, settings.g_mdsft_textlod, - defaults.g_mdsft_textlod, DPSetTextureLOD) - - saveModeSetting(fMaterial, settings.g_mdsft_textdetail, - defaults.g_mdsft_textdetail, DPSetTextureDetail) - - saveModeSetting(fMaterial, settings.g_mdsft_textpersp, - defaults.g_mdsft_textpersp, DPSetTexturePersp) - - saveModeSetting(fMaterial, settings.g_mdsft_cycletype, - defaults.g_mdsft_cycletype, DPSetCycleType) - - if isHWv1: - saveModeSetting(fMaterial, settings.g_mdsft_color_dither, - defaults.g_mdsft_color_dither, DPSetColorDither) - - saveModeSetting(fMaterial, settings.g_mdsft_pipeline, - defaults.g_mdsft_pipeline, DPPipelineMode) - -def saveOtherModeLDefinition(fMaterial, settings, defaults, defaultRenderMode, matWriteMethod): - if matWriteMethod == GfxMatWriteMethod.WriteAll: - saveOtherModeLDefinitionAll(fMaterial, settings, defaults, defaultRenderMode) - elif matWriteMethod == GfxMatWriteMethod.WriteDifferingAndRevert: - saveOtherModeLDefinitionIndividual(fMaterial, settings, defaults, defaultRenderMode) - else: - raise PluginError("Unhandled material write method: " + str(matWriteMethod)) - -def saveOtherModeLDefinitionAll(fMaterial: FMaterial, settings, defaults, defaultRenderMode): - if not settings.set_rendermode and defaultRenderMode is None: - cmd = SPSetOtherMode("G_SETOTHERMODE_L", 0, 3, []) - cmd.flagList.append(settings.g_mdsft_alpha_compare) - cmd.flagList.append(settings.g_mdsft_zsrcsel) - - else: - cmd = SPSetOtherMode("G_SETOTHERMODE_L", 0, 32, []) - cmd.flagList.append(settings.g_mdsft_alpha_compare) - cmd.flagList.append(settings.g_mdsft_zsrcsel) - - if settings.set_rendermode: - flagList, blendList = getRenderModeFlagList(settings, fMaterial) - cmd.flagList.extend(flagList) - if blendList is not None: - cmd.flagList.extend([ - "GBL_c1(" + blendList[0] + ", " + blendList[1] + ", " + blendList[2] + ", " + blendList[3] + ")", - "GBL_c2(" + blendList[4] + ", " + blendList[5] + ", " + blendList[6] + ", " + blendList[7] + ")", - ]) - else: - cmd.flagList.extend(defaultRenderMode) - fMaterial.material.commands.append(cmd) +def saveOtherModeHDefinition(fMaterial, settings, defaults, isHWv1, matWriteMethod): + if matWriteMethod == GfxMatWriteMethod.WriteAll: + saveOtherModeHDefinitionAll(fMaterial, settings, defaults, isHWv1) + elif matWriteMethod == GfxMatWriteMethod.WriteDifferingAndRevert: + saveOtherModeHDefinitionIndividual(fMaterial, settings, defaults, isHWv1) + else: + raise PluginError("Unhandled material write method: " + str(matWriteMethod)) - if settings.g_mdsft_zsrcsel == 'G_ZS_PRIM': - fMaterial.material.commands.append(DPSetPrimDepth(z=settings.prim_depth.z, dz=settings.prim_depth.dz)) - fMaterial.revert.commands.append(DPSetPrimDepth()) -def saveOtherModeLDefinitionIndividual(fMaterial, settings, defaults, defaultRenderMode): - saveModeSetting(fMaterial, settings.g_mdsft_alpha_compare, - defaults.g_mdsft_alpha_compare, DPSetAlphaCompare) +def saveOtherModeHDefinitionAll(fMaterial, settings, defaults, isHWv1): + cmd = SPSetOtherMode("G_SETOTHERMODE_H", 4, 20, []) + cmd.flagList.append(settings.g_mdsft_alpha_dither) + if not isHWv1: + cmd.flagList.append(settings.g_mdsft_rgb_dither) + cmd.flagList.append(settings.g_mdsft_combkey) + cmd.flagList.append(settings.g_mdsft_textconv) + cmd.flagList.append(settings.g_mdsft_text_filt) + cmd.flagList.append(settings.g_mdsft_textlod) + cmd.flagList.append(settings.g_mdsft_textdetail) + cmd.flagList.append(settings.g_mdsft_textpersp) + cmd.flagList.append(settings.g_mdsft_cycletype) + if isHWv1: + cmd.flagList.append(settings.g_mdsft_color_dither) + cmd.flagList.append(settings.g_mdsft_pipeline) + + fMaterial.material.commands.append(cmd) - saveModeSetting(fMaterial, settings.g_mdsft_zsrcsel, - defaults.g_mdsft_zsrcsel, DPSetDepthSource) - - if settings.g_mdsft_zsrcsel == 'G_ZS_PRIM': - fMaterial.material.commands.append(DPSetPrimDepth(z=settings.prim_depth.z, dz=settings.prim_depth.dz)) - fMaterial.revert.commands.append(DPSetPrimDepth()) - if settings.set_rendermode: - flagList, blendList = getRenderModeFlagList(settings, fMaterial) - renderModeSet = DPSetRenderMode(flagList, blendList) +def saveOtherModeHDefinitionIndividual(fMaterial, settings, defaults, isHWv1): + saveModeSetting( + fMaterial, + settings.g_mdsft_alpha_dither, + defaults.g_mdsft_alpha_dither, + DPSetAlphaDither, + ) + + if not isHWv1: + saveModeSetting( + fMaterial, + settings.g_mdsft_rgb_dither, + defaults.g_mdsft_rgb_dither, + DPSetColorDither, + ) + + saveModeSetting( + fMaterial, + settings.g_mdsft_combkey, + defaults.g_mdsft_combkey, + DPSetCombineKey, + ) + + saveModeSetting( + fMaterial, + settings.g_mdsft_textconv, + defaults.g_mdsft_textconv, + DPSetTextureConvert, + ) + + saveModeSetting( + fMaterial, + settings.g_mdsft_text_filt, + defaults.g_mdsft_text_filt, + DPSetTextureFilter, + ) + + # saveModeSetting(fMaterial, settings.g_mdsft_textlut, + # defaults.g_mdsft_textlut, DPSetTextureLUT) + + saveModeSetting( + fMaterial, settings.g_mdsft_textlod, defaults.g_mdsft_textlod, DPSetTextureLOD + ) + + saveModeSetting( + fMaterial, + settings.g_mdsft_textdetail, + defaults.g_mdsft_textdetail, + DPSetTextureDetail, + ) + + saveModeSetting( + fMaterial, + settings.g_mdsft_textpersp, + defaults.g_mdsft_textpersp, + DPSetTexturePersp, + ) + + saveModeSetting( + fMaterial, + settings.g_mdsft_cycletype, + defaults.g_mdsft_cycletype, + DPSetCycleType, + ) + + if isHWv1: + saveModeSetting( + fMaterial, + settings.g_mdsft_color_dither, + defaults.g_mdsft_color_dither, + DPSetColorDither, + ) + + saveModeSetting( + fMaterial, settings.g_mdsft_pipeline, defaults.g_mdsft_pipeline, DPPipelineMode + ) + + +def saveOtherModeLDefinition( + fMaterial, settings, defaults, defaultRenderMode, matWriteMethod +): + if matWriteMethod == GfxMatWriteMethod.WriteAll: + saveOtherModeLDefinitionAll(fMaterial, settings, defaults, defaultRenderMode) + elif matWriteMethod == GfxMatWriteMethod.WriteDifferingAndRevert: + saveOtherModeLDefinitionIndividual( + fMaterial, settings, defaults, defaultRenderMode + ) + else: + raise PluginError("Unhandled material write method: " + str(matWriteMethod)) + + +def saveOtherModeLDefinitionAll( + fMaterial: FMaterial, settings, defaults, defaultRenderMode +): + if not settings.set_rendermode and defaultRenderMode is None: + cmd = SPSetOtherMode("G_SETOTHERMODE_L", 0, 3, []) + cmd.flagList.append(settings.g_mdsft_alpha_compare) + cmd.flagList.append(settings.g_mdsft_zsrcsel) + + else: + cmd = SPSetOtherMode("G_SETOTHERMODE_L", 0, 32, []) + cmd.flagList.append(settings.g_mdsft_alpha_compare) + cmd.flagList.append(settings.g_mdsft_zsrcsel) + + if settings.set_rendermode: + flagList, blendList = getRenderModeFlagList(settings, fMaterial) + cmd.flagList.extend(flagList) + if blendList is not None: + cmd.flagList.extend( + [ + "GBL_c1(" + + blendList[0] + + ", " + + blendList[1] + + ", " + + blendList[2] + + ", " + + blendList[3] + + ")", + "GBL_c2(" + + blendList[4] + + ", " + + blendList[5] + + ", " + + blendList[6] + + ", " + + blendList[7] + + ")", + ] + ) + else: + cmd.flagList.extend(defaultRenderMode) + + fMaterial.material.commands.append(cmd) + + if settings.g_mdsft_zsrcsel == "G_ZS_PRIM": + fMaterial.material.commands.append( + DPSetPrimDepth(z=settings.prim_depth.z, dz=settings.prim_depth.dz) + ) + fMaterial.revert.commands.append(DPSetPrimDepth()) + + +def saveOtherModeLDefinitionIndividual( + fMaterial, settings, defaults, defaultRenderMode +): + saveModeSetting( + fMaterial, + settings.g_mdsft_alpha_compare, + defaults.g_mdsft_alpha_compare, + DPSetAlphaCompare, + ) + + saveModeSetting( + fMaterial, settings.g_mdsft_zsrcsel, defaults.g_mdsft_zsrcsel, DPSetDepthSource + ) + + if settings.g_mdsft_zsrcsel == "G_ZS_PRIM": + fMaterial.material.commands.append( + DPSetPrimDepth(z=settings.prim_depth.z, dz=settings.prim_depth.dz) + ) + fMaterial.revert.commands.append(DPSetPrimDepth()) + + if settings.set_rendermode: + flagList, blendList = getRenderModeFlagList(settings, fMaterial) + renderModeSet = DPSetRenderMode(flagList, blendList) + + fMaterial.material.commands.append(renderModeSet) + if defaultRenderMode is not None: + fMaterial.revert.commands.append(DPSetRenderMode(defaultRenderMode, None)) - fMaterial.material.commands.append(renderModeSet) - if defaultRenderMode is not None: - fMaterial.revert.commands.append(DPSetRenderMode(defaultRenderMode, None)) def getRenderModeFlagList(settings, fMaterial): - flagList = [] - blendList = None - # cycle independent - - if not settings.rendermode_advanced_enabled: - fMaterial.renderModeUseDrawLayer = [ - settings.rendermode_preset_cycle_1 == 'Use Draw Layer', - settings.rendermode_preset_cycle_2 == 'Use Draw Layer'] - - if settings.g_mdsft_cycletype == 'G_CYC_2CYCLE': - flagList = [ - settings.rendermode_preset_cycle_1, - settings.rendermode_preset_cycle_2] - else: - cycle2 = settings.rendermode_preset_cycle_1 + '2' - if cycle2 not in [value[0] for value in enumRenderModesCycle2]: - cycle2 = "G_RM_NOOP" - flagList = [ - settings.rendermode_preset_cycle_1, cycle2] - else: - if settings.g_mdsft_cycletype == 'G_CYC_2CYCLE': - blendList = \ - [settings.blend_p1, settings.blend_a1, - settings.blend_m1, settings.blend_b1, - settings.blend_p2, settings.blend_a2, - settings.blend_m2, settings.blend_b2] - else: - blendList = \ - [settings.blend_p1, settings.blend_a1, - settings.blend_m1, settings.blend_b1, - settings.blend_p1, settings.blend_a1, - settings.blend_m1, settings.blend_b1] - - if settings.aa_en: - flagList.append("AA_EN") - if settings.z_cmp: - flagList.append("Z_CMP") - if settings.z_upd: - flagList.append("Z_UPD") - if settings.im_rd: - flagList.append("IM_RD") - if settings.clr_on_cvg: - flagList.append("CLR_ON_CVG") - - flagList.append(settings.cvg_dst) - flagList.append(settings.zmode) - - if settings.cvg_x_alpha: - flagList.append("CVG_X_ALPHA") - if settings.alpha_cvg_sel: - flagList.append("ALPHA_CVG_SEL") - if settings.force_bl: - flagList.append("FORCE_BL") - - return flagList, blendList + flagList = [] + blendList = None + # cycle independent + + if not settings.rendermode_advanced_enabled: + fMaterial.renderModeUseDrawLayer = [ + settings.rendermode_preset_cycle_1 == "Use Draw Layer", + settings.rendermode_preset_cycle_2 == "Use Draw Layer", + ] + + if settings.g_mdsft_cycletype == "G_CYC_2CYCLE": + flagList = [ + settings.rendermode_preset_cycle_1, + settings.rendermode_preset_cycle_2, + ] + else: + cycle2 = settings.rendermode_preset_cycle_1 + "2" + if cycle2 not in [value[0] for value in enumRenderModesCycle2]: + cycle2 = "G_RM_NOOP" + flagList = [settings.rendermode_preset_cycle_1, cycle2] + else: + if settings.g_mdsft_cycletype == "G_CYC_2CYCLE": + blendList = [ + settings.blend_p1, + settings.blend_a1, + settings.blend_m1, + settings.blend_b1, + settings.blend_p2, + settings.blend_a2, + settings.blend_m2, + settings.blend_b2, + ] + else: + blendList = [ + settings.blend_p1, + settings.blend_a1, + settings.blend_m1, + settings.blend_b1, + settings.blend_p1, + settings.blend_a1, + settings.blend_m1, + settings.blend_b1, + ] + + if settings.aa_en: + flagList.append("AA_EN") + if settings.z_cmp: + flagList.append("Z_CMP") + if settings.z_upd: + flagList.append("Z_UPD") + if settings.im_rd: + flagList.append("IM_RD") + if settings.clr_on_cvg: + flagList.append("CLR_ON_CVG") + + flagList.append(settings.cvg_dst) + flagList.append(settings.zmode) + + if settings.cvg_x_alpha: + flagList.append("CVG_X_ALPHA") + if settings.alpha_cvg_sel: + flagList.append("ALPHA_CVG_SEL") + if settings.force_bl: + flagList.append("FORCE_BL") + + return flagList, blendList -def saveOtherDefinition(fMaterial, material, defaults): - settings = material.rdp_settings - if settings.clip_ratio != defaults.clip_ratio: - fMaterial.material.commands.append(SPClipRatio(settings.clip_ratio)) - fMaterial.revert.commands.append(SPClipRatio(defaults.clip_ratio)) - if material.set_blend: - fMaterial.material.commands.append( - DPSetBlendColor( - int(material.blend_color[0] * 255), - int(material.blend_color[1] * 255), - int(material.blend_color[2] * 255), - int(material.blend_color[3] * 255))) +def saveOtherDefinition(fMaterial, material, defaults): + settings = material.rdp_settings + if settings.clip_ratio != defaults.clip_ratio: + fMaterial.material.commands.append(SPClipRatio(settings.clip_ratio)) + fMaterial.revert.commands.append(SPClipRatio(defaults.clip_ratio)) + + if material.set_blend: + fMaterial.material.commands.append( + DPSetBlendColor( + int(material.blend_color[0] * 255), + int(material.blend_color[1] * 255), + int(material.blend_color[2] * 255), + int(material.blend_color[3] * 255), + ) + ) enumMatWriteMethod = [ - ("Differing", "Write Differing And Revert", "Write Differing And Revert"), - ("All", "Write All", "Write All") + ("Differing", "Write Differing And Revert", "Write Differing And Revert"), + ("All", "Write All", "Write All"), ] matWriteMethodEnumDict = { - "Differing" : GfxMatWriteMethod.WriteDifferingAndRevert, - "All" : GfxMatWriteMethod.WriteAll + "Differing": GfxMatWriteMethod.WriteDifferingAndRevert, + "All": GfxMatWriteMethod.WriteAll, } -def getWriteMethodFromEnum(enumVal): - if enumVal not in matWriteMethodEnumDict: - raise PluginError("Enum value " + str(enumVal) + " not found in material write method dict.") - else: - return matWriteMethodEnumDict[enumVal] - -def exportF3DtoC(dirPath, obj, DLFormat, transformMatrix, - f3dType, isHWv1, texDir, savePNG, texSeparate, name, matWriteMethod): - - fModel = FModel(f3dType, isHWv1, name, DLFormat, matWriteMethod) - fMesh = exportF3DCommon(obj, fModel, transformMatrix, - True, name, DLFormat, not savePNG) - - modelDirPath = os.path.join(dirPath, toAlnum(name)) - if not os.path.exists(modelDirPath): - os.makedirs(modelDirPath) - - gfxFormatter = GfxFormatter(ScrollMethod.Vertex, 64) - exportData = fModel.to_c(TextureExportSettings(texSeparate, savePNG, texDir, modelDirPath), gfxFormatter) - staticData = exportData.staticData - dynamicData = exportData.dynamicData - texC = exportData.textureData - - if DLFormat == DLFormat.Static: - staticData.append(dynamicData) - else: - geoString = writeMaterialFiles(dirPath, modelDirPath, - '#include "actors/' + toAlnum(name) + '/header.h"', - '#include "actors/' + toAlnum(name) + '/material.inc.h"', - dynamicData.header, dynamicData.source, '', True) - - if texSeparate: - texCFile = open(os.path.join(modelDirPath, 'texture.inc.c'), 'w', newline='\n') - texCFile.write(texC.source) - texCFile.close() +def getWriteMethodFromEnum(enumVal): + if enumVal not in matWriteMethodEnumDict: + raise PluginError( + "Enum value " + str(enumVal) + " not found in material write method dict." + ) + else: + return matWriteMethodEnumDict[enumVal] + + +def exportF3DtoC( + dirPath, + obj, + DLFormat, + transformMatrix, + f3dType, + isHWv1, + texDir, + savePNG, + texSeparate, + name, + matWriteMethod, +): + + fModel = FModel(f3dType, isHWv1, name, DLFormat, matWriteMethod) + fMesh = exportF3DCommon( + obj, fModel, transformMatrix, True, name, DLFormat, not savePNG + ) + + modelDirPath = os.path.join(dirPath, toAlnum(name)) + + if not os.path.exists(modelDirPath): + os.makedirs(modelDirPath) + + gfxFormatter = GfxFormatter(ScrollMethod.Vertex, 64) + exportData = fModel.to_c( + TextureExportSettings(texSeparate, savePNG, texDir, modelDirPath), gfxFormatter + ) + staticData = exportData.staticData + dynamicData = exportData.dynamicData + texC = exportData.textureData + + if DLFormat == DLFormat.Static: + staticData.append(dynamicData) + else: + geoString = writeMaterialFiles( + dirPath, + modelDirPath, + '#include "actors/' + toAlnum(name) + '/header.h"', + '#include "actors/' + toAlnum(name) + '/material.inc.h"', + dynamicData.header, + dynamicData.source, + "", + True, + ) + + if texSeparate: + texCFile = open(os.path.join(modelDirPath, "texture.inc.c"), "w", newline="\n") + texCFile.write(texC.source) + texCFile.close() + + writeCData( + staticData, + os.path.join(modelDirPath, "header.h"), + os.path.join(modelDirPath, "model.inc.c"), + ) - writeCData(staticData, os.path.join(modelDirPath, 'header.h'), - os.path.join(modelDirPath, 'model.inc.c')) def removeDL(sourcePath, headerPath, DLName): - DLDataC = readFile(sourcePath) - originalDataC = DLDataC + DLDataC = readFile(sourcePath) + originalDataC = DLDataC - DLDataH = readFile(headerPath) - originalDataH = DLDataH + DLDataH = readFile(headerPath) + originalDataH = DLDataH - matchResult = re.search("Gfx\s*" + re.escape(DLName) + "\s*\[\s*[0-9x]*\s*\]\s*=\s*\{([^}]*)}\s*;\s*", DLDataC, re.DOTALL) - if matchResult is not None: - DLDataC = DLDataC[:matchResult.start(0)] + DLDataC[matchResult.end(0):] + matchResult = re.search( + "Gfx\s*" + re.escape(DLName) + "\s*\[\s*[0-9x]*\s*\]\s*=\s*\{([^}]*)}\s*;\s*", + DLDataC, + re.DOTALL, + ) + if matchResult is not None: + DLDataC = DLDataC[: matchResult.start(0)] + DLDataC[matchResult.end(0) :] - headerMatch = getDeclaration(DLDataH, DLName) - if headerMatch is not None: - DLDataH = DLDataH[:headerMatch.start(0)] + DLDataH[headerMatch.end(0):] + headerMatch = getDeclaration(DLDataH, DLName) + if headerMatch is not None: + DLDataH = DLDataH[: headerMatch.start(0)] + DLDataH[headerMatch.end(0) :] - if DLDataC != originalDataC: - writeFile(sourcePath, DLDataC) + if DLDataC != originalDataC: + writeFile(sourcePath, DLDataC) + + if DLDataH != originalDataH: + writeFile(headerPath, DLDataH) - if DLDataH != originalDataH: - writeFile(headerPath, DLDataH) class F3D_ExportDL(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.f3d_export_dl' - bl_label = "Export Display List" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = "OBJECT") - try: - allObjs = context.selected_objects - if len(allObjs) == 0: - raise PluginError("No objects selected.") - obj = context.selected_objects[0] - if not isinstance(obj.data, bpy.types.Mesh): - raise PluginError("Object is not a mesh.") - - scaleValue = bpy.context.scene.blenderF3DScale - finalTransform = mathutils.Matrix.Diagonal(mathutils.Vector(( - scaleValue, scaleValue, scaleValue))).to_4x4() - - except Exception as e: - raisePluginError(self, e) - return {"CANCELLED"} - - try: - applyRotation([obj], math.radians(90), 'X') - - exportPath = bpy.path.abspath(context.scene.DLExportPath) - dlFormat = DLFormat.Static if context.scene.DLExportisStatic else DLFormat.Dynamic - f3dType = context.scene.f3d_type - isHWv1 = context.scene.isHWv1 - texDir = bpy.context.scene.DLTexDir - savePNG = bpy.context.scene.saveTextures or bpy.context.scene.ignoreTextureRestrictions - separateTexDef = bpy.context.scene.DLSeparateTextureDef - DLName = bpy.context.scene.DLName - matWriteMethod = getWriteMethodFromEnum(context.scene.matWriteMethod) - - exportF3DtoC(exportPath, obj, dlFormat, finalTransform, - f3dType, isHWv1, texDir, savePNG, separateTexDef, DLName, matWriteMethod) - - self.report({'INFO'}, 'Success!') - - applyRotation([obj], math.radians(-90), 'X') - return {'FINISHED'} # must return a set - - except Exception as e: - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - applyRotation([obj], math.radians(-90), 'X') - - raisePluginError(self, e) - return {'CANCELLED'} # must return a set + # set bl_ properties + bl_idname = "object.f3d_export_dl" + bl_label = "Export Display List" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + try: + allObjs = context.selected_objects + if len(allObjs) == 0: + raise PluginError("No objects selected.") + obj = context.selected_objects[0] + if not isinstance(obj.data, bpy.types.Mesh): + raise PluginError("Object is not a mesh.") + + scaleValue = bpy.context.scene.blenderF3DScale + finalTransform = mathutils.Matrix.Diagonal( + mathutils.Vector((scaleValue, scaleValue, scaleValue)) + ).to_4x4() + + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} + + try: + applyRotation([obj], math.radians(90), "X") + + exportPath = bpy.path.abspath(context.scene.DLExportPath) + dlFormat = ( + DLFormat.Static if context.scene.DLExportisStatic else DLFormat.Dynamic + ) + f3dType = context.scene.f3d_type + isHWv1 = context.scene.isHWv1 + texDir = bpy.context.scene.DLTexDir + savePNG = ( + bpy.context.scene.saveTextures + or bpy.context.scene.ignoreTextureRestrictions + ) + separateTexDef = bpy.context.scene.DLSeparateTextureDef + DLName = bpy.context.scene.DLName + matWriteMethod = getWriteMethodFromEnum(context.scene.matWriteMethod) + + exportF3DtoC( + exportPath, + obj, + dlFormat, + finalTransform, + f3dType, + isHWv1, + texDir, + savePNG, + separateTexDef, + DLName, + matWriteMethod, + ) + + self.report({"INFO"}, "Success!") + + applyRotation([obj], math.radians(-90), "X") + return {"FINISHED"} # must return a set + + except Exception as e: + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + applyRotation([obj], math.radians(-90), "X") + + raisePluginError(self, e) + return {"CANCELLED"} # must return a set + class F3D_ExportDLPanel(bpy.types.Panel): - bl_idname = "F3D_PT_export_dl" - bl_label = "F3D Exporter" - bl_space_type = 'VIEW_3D' - bl_region_type = 'UI' - bl_category = 'Fast64' - bl_options = {'DEFAULT_CLOSED'} - - @classmethod - def poll(cls, context): - return True - - # called every frame - def draw(self, context): - col = self.layout.column() - col.operator(F3D_ExportDL.bl_idname) - - prop_split(col, context.scene, 'DLName', 'Name') - prop_split(col, context.scene, 'DLExportPath', "Export Path") - prop_split(col, context.scene, "blenderF3DScale", "Scale") - prop_split(col, context.scene, 'matWriteMethod', "Material Write Method") - col.prop(context.scene, 'DLExportisStatic') - - if not bpy.context.scene.ignoreTextureRestrictions: - if context.scene.saveTextures: - prop_split(col, context.scene, 'DLTexDir', - 'Texture Include Path') - col.prop(context.scene, 'DLSeparateTextureDef') + bl_idname = "F3D_PT_export_dl" + bl_label = "F3D Exporter" + bl_space_type = "VIEW_3D" + bl_region_type = "UI" + bl_category = "Fast64" + bl_options = {"DEFAULT_CLOSED"} + + @classmethod + def poll(cls, context): + return True + + # called every frame + def draw(self, context): + col = self.layout.column() + col.operator(F3D_ExportDL.bl_idname) + + prop_split(col, context.scene, "DLName", "Name") + prop_split(col, context.scene, "DLExportPath", "Export Path") + prop_split(col, context.scene, "blenderF3DScale", "Scale") + prop_split(col, context.scene, "matWriteMethod", "Material Write Method") + col.prop(context.scene, "DLExportisStatic") + + if not bpy.context.scene.ignoreTextureRestrictions: + if context.scene.saveTextures: + prop_split(col, context.scene, "DLTexDir", "Texture Include Path") + col.prop(context.scene, "DLSeparateTextureDef") + f3d_writer_classes = ( - F3D_ExportDL, - F3D_ExportDLPanel, + F3D_ExportDL, + F3D_ExportDLPanel, ) def f3d_writer_register(): - for cls in f3d_writer_classes: - register_class(cls) + for cls in f3d_writer_classes: + register_class(cls) + + bpy.types.Scene.matWriteMethod = bpy.props.EnumProperty(items=enumMatWriteMethod) - bpy.types.Scene.matWriteMethod = bpy.props.EnumProperty(items = enumMatWriteMethod) def f3d_writer_unregister(): - for cls in reversed(f3d_writer_classes): - unregister_class(cls) + for cls in reversed(f3d_writer_classes): + unregister_class(cls) - del bpy.types.Scene.matWriteMethod + del bpy.types.Scene.matWriteMethod diff --git a/fast64_internal/f3d_material_converter.py b/fast64_internal/f3d_material_converter.py index e045ad40b..f32faf3a1 100644 --- a/fast64_internal/f3d_material_converter.py +++ b/fast64_internal/f3d_material_converter.py @@ -7,292 +7,342 @@ from .utility import * from bl_operators.presets import AddPresetBase + def upgradeF3DVersionAll(objs, armatures, version): - # Remove original v2 node groups so that they can be recreated. - deleteGroups = [] - for node_tree in bpy.data.node_groups: - if node_tree.name[-6:] == 'F3D v' + str(version): - deleteGroups.append(node_tree) - for deleteGroup in deleteGroups: - bpy.data.node_groups.remove(deleteGroup) - - # Dict of non-f3d materials : converted f3d materials - # handles cases where materials are used in multiple objects - materialDict = {} - for obj in objs: - upgradeF3DVersionOneObject(obj, materialDict, version) - - for armature in armatures: - for bone in armature.bones: - if bone.geo_cmd == "Switch": - for switchOption in bone.switch_options: - if switchOption.switchType == "Material": - if switchOption.materialOverride in materialDict: - switchOption.materialOverride = materialDict[switchOption.materialOverride] - for i in range(len(switchOption.specificOverrideArray)): - material = switchOption.specificOverrideArray[i].material - if material in materialDict: - switchOption.specificOverrideArray[i].material = materialDict[material] - for i in range(len(switchOption.specificIgnoreArray)): - material = switchOption.specificIgnoreArray[i].material - if material in materialDict: - switchOption.specificIgnoreArray[i].material = materialDict[material] + # Remove original v2 node groups so that they can be recreated. + deleteGroups = [] + for node_tree in bpy.data.node_groups: + if node_tree.name[-6:] == "F3D v" + str(version): + deleteGroups.append(node_tree) + for deleteGroup in deleteGroups: + bpy.data.node_groups.remove(deleteGroup) + + # Dict of non-f3d materials : converted f3d materials + # handles cases where materials are used in multiple objects + materialDict = {} + for obj in objs: + upgradeF3DVersionOneObject(obj, materialDict, version) + + for armature in armatures: + for bone in armature.bones: + if bone.geo_cmd == "Switch": + for switchOption in bone.switch_options: + if switchOption.switchType == "Material": + if switchOption.materialOverride in materialDict: + switchOption.materialOverride = materialDict[ + switchOption.materialOverride + ] + for i in range(len(switchOption.specificOverrideArray)): + material = switchOption.specificOverrideArray[i].material + if material in materialDict: + switchOption.specificOverrideArray[ + i + ].material = materialDict[material] + for i in range(len(switchOption.specificIgnoreArray)): + material = switchOption.specificIgnoreArray[i].material + if material in materialDict: + switchOption.specificIgnoreArray[ + i + ].material = materialDict[material] def upgradeF3DVersionOneObject(obj, materialDict, version): - for index in range(len(obj.material_slots)): - material = obj.material_slots[index].material - if material is not None and material.is_f3d: - if material in materialDict: - obj.material_slots[index].material = materialDict[material] - else: - convertF3DtoNewVersion(obj, index, material, materialDict, version) + for index in range(len(obj.material_slots)): + material = obj.material_slots[index].material + if material is not None and material.is_f3d: + if material in materialDict: + obj.material_slots[index].material = materialDict[material] + else: + convertF3DtoNewVersion(obj, index, material, materialDict, version) + V4PresetName = { - 'Unlit Texture' : "sm64_unlit_texture", - 'Unlit Texture Cutout' : "sm64_unlit_texture_cutout", - 'Shaded Solid' : "sm64_shaded_solid", - 'Shaded Texture' : "sm64_shaded_texture", - 'Shaded Texture Cutout' : "sm64_shaded_texture_cutout", - 'Shaded Texture Transparent' : "sm64_shaded_texture_transparent", - 'Environment Mapped' : "sm64_environment_map", - 'Decal On Shaded Solid' : "sm64_decal", - 'Vertex Colored Texture' : "sm64_vertex_colored_texture", - 'Fog Shaded Texture' : "sm64_fog_shaded_texture", - 'Fog Shaded Texture Cutout' : "sm64_fog_shaded_texture_cutout", - 'Fog Shaded Texture Transparent' : "sm64_fog_shaded_texture_transparent", - 'Vertex Colored Texture Transparent' : "sm64_vertex_colored_texture_transparent", - 'Shaded Noise' : "sm64_shaded_noise", + "Unlit Texture": "sm64_unlit_texture", + "Unlit Texture Cutout": "sm64_unlit_texture_cutout", + "Shaded Solid": "sm64_shaded_solid", + "Shaded Texture": "sm64_shaded_texture", + "Shaded Texture Cutout": "sm64_shaded_texture_cutout", + "Shaded Texture Transparent": "sm64_shaded_texture_transparent", + "Environment Mapped": "sm64_environment_map", + "Decal On Shaded Solid": "sm64_decal", + "Vertex Colored Texture": "sm64_vertex_colored_texture", + "Fog Shaded Texture": "sm64_fog_shaded_texture", + "Fog Shaded Texture Cutout": "sm64_fog_shaded_texture_cutout", + "Fog Shaded Texture Transparent": "sm64_fog_shaded_texture_transparent", + "Vertex Colored Texture Transparent": "sm64_vertex_colored_texture_transparent", + "Shaded Noise": "sm64_shaded_noise", } + def getV4PresetName(name): - newName = None - if name in V4PresetName: - newName = V4PresetName[name] - else: - newName = "Custom" - return newName + newName = None + if name in V4PresetName: + newName = V4PresetName[name] + else: + newName = "Custom" + return newName + def convertF3DtoNewVersion(obj, index, material, materialDict, version): - - if material.mat_ver > 3: - oldPreset = AddPresetBase.as_filename(material.f3d_mat.presetName) - else: - oldPreset = material.f3d_preset - - if version > 3: - newMat = createF3DMat(obj, preset = getV4PresetName(oldPreset), index = index) - if material.mat_ver > 3: - copyPropertyGroup(material.f3d_mat, newMat.f3d_mat) - else: - convertToNewMat(newMat, material) - if newMat.f3d_mat.draw_layer.sm64 != obj.draw_layer_static: - newMat.f3d_mat.draw_layer.sm64 = obj.draw_layer_static - else: - newMat = createF3DMat(obj, preset = oldPreset, index = index) - matSettings = F3DMaterialSettings() - matSettings.loadFromMaterial(material, True) - matSettings.applyToMaterial(newMat, True, update_node_values_of_material, bpy.context) - - copyPropertyGroup(material.ootMaterial, newMat.ootMaterial) - copyPropertyGroup(material.ootCollisionProperty, newMat.ootCollisionProperty) - - colSettings = CollisionSettings() - colSettings.load(material) - colSettings.apply(newMat) - - updateMatWithNewVersionName(newMat, material, materialDict, version) + + if material.mat_ver > 3: + oldPreset = AddPresetBase.as_filename(material.f3d_mat.presetName) + else: + oldPreset = material.f3d_preset + + if version > 3: + newMat = createF3DMat(obj, preset=getV4PresetName(oldPreset), index=index) + if material.mat_ver > 3: + copyPropertyGroup(material.f3d_mat, newMat.f3d_mat) + else: + convertToNewMat(newMat, material) + if newMat.f3d_mat.draw_layer.sm64 != obj.draw_layer_static: + newMat.f3d_mat.draw_layer.sm64 = obj.draw_layer_static + else: + newMat = createF3DMat(obj, preset=oldPreset, index=index) + matSettings = F3DMaterialSettings() + matSettings.loadFromMaterial(material, True) + matSettings.applyToMaterial( + newMat, True, update_node_values_of_material, bpy.context + ) + + copyPropertyGroup(material.ootMaterial, newMat.ootMaterial) + copyPropertyGroup(material.ootCollisionProperty, newMat.ootCollisionProperty) + + colSettings = CollisionSettings() + colSettings.load(material) + colSettings.apply(newMat) + + updateMatWithNewVersionName(newMat, material, materialDict, version) + def convertAllBSDFtoF3D(objs, renameUV): - # Dict of non-f3d materials : converted f3d materials - # handles cases where materials are used in multiple objects - materialDict = {} - for obj in objs: - if renameUV: - for uv_layer in obj.data.uv_layers: - uv_layer.name = "UVMap" - for index in range(len(obj.material_slots)): - material = obj.material_slots[index].material - if material is not None and not material.is_f3d: - if material in materialDict: - print("Existing material") - obj.material_slots[index].material = materialDict[material] - else: - print("New material") - convertBSDFtoF3D(obj, index, material, materialDict) + # Dict of non-f3d materials : converted f3d materials + # handles cases where materials are used in multiple objects + materialDict = {} + for obj in objs: + if renameUV: + for uv_layer in obj.data.uv_layers: + uv_layer.name = "UVMap" + for index in range(len(obj.material_slots)): + material = obj.material_slots[index].material + if material is not None and not material.is_f3d: + if material in materialDict: + print("Existing material") + obj.material_slots[index].material = materialDict[material] + else: + print("New material") + convertBSDFtoF3D(obj, index, material, materialDict) + def convertBSDFtoF3D(obj, index, material, materialDict): - if not material.use_nodes: - newMaterial = createF3DMat(obj, preset = 'Shaded Solid', index = index) - f3dMat = newMaterial.f3d_mat if newMaterial.mat_ver > 3 else newMaterial - f3dMat.default_light_color = material.diffuse_color - updateMatWithName(newMaterial, material, materialDict) - - elif "Principled BSDF" in material.node_tree.nodes: - tex0Node = material.node_tree.nodes['Principled BSDF'].inputs['Base Color'] - tex1Node = material.node_tree.nodes['Principled BSDF'].inputs['Subsurface Color'] - if len(tex0Node.links) == 0: - newMaterial = createF3DMat(obj, preset = getDefaultMaterialPreset("Shaded Solid"), index = index) - f3dMat = newMaterial.f3d_mat if newMaterial.mat_ver > 3 else newMaterial - f3dMat.default_light_color = tex0Node.default_value - updateMatWithName(newMaterial, material, materialDict) - else: - if isinstance(tex0Node.links[0].from_node, bpy.types.ShaderNodeTexImage): - if 'convert_preset' in material: - presetName = material['convert_preset'] - if presetName not in [enumValue[0] for enumValue in enumMaterialPresets]: - raise PluginError('During BSDF to F3D conversion, for material \'' + material.name + '\',' + \ - ' enum \'' + presetName + '\' was not found in material preset enum list.') - else: - presetName = getDefaultMaterialPreset('Shaded Texture') - newMaterial = createF3DMat(obj, preset = presetName, index = index) - f3dMat = newMaterial.f3d_mat if newMaterial.mat_ver > 3 else newMaterial - f3dMat.tex0.tex = tex0Node.links[0].from_node.image - if len(tex1Node.links) > 0 and \ - isinstance(tex1Node.links[0].from_node, bpy.types.ShaderNodeTexImage): - f3dMat.tex1.tex = tex1Node.links[0].from_node.image - updateMatWithName(newMaterial, material, materialDict) - else: - print("Principled BSDF material does not have an Image Node attached to its Base Color.") - else: - print("Material is not a Principled BSDF or non-node material.") + if not material.use_nodes: + newMaterial = createF3DMat(obj, preset="Shaded Solid", index=index) + f3dMat = newMaterial.f3d_mat if newMaterial.mat_ver > 3 else newMaterial + f3dMat.default_light_color = material.diffuse_color + updateMatWithName(newMaterial, material, materialDict) + + elif "Principled BSDF" in material.node_tree.nodes: + tex0Node = material.node_tree.nodes["Principled BSDF"].inputs["Base Color"] + tex1Node = material.node_tree.nodes["Principled BSDF"].inputs[ + "Subsurface Color" + ] + if len(tex0Node.links) == 0: + newMaterial = createF3DMat( + obj, preset=getDefaultMaterialPreset("Shaded Solid"), index=index + ) + f3dMat = newMaterial.f3d_mat if newMaterial.mat_ver > 3 else newMaterial + f3dMat.default_light_color = tex0Node.default_value + updateMatWithName(newMaterial, material, materialDict) + else: + if isinstance(tex0Node.links[0].from_node, bpy.types.ShaderNodeTexImage): + if "convert_preset" in material: + presetName = material["convert_preset"] + if presetName not in [ + enumValue[0] for enumValue in enumMaterialPresets + ]: + raise PluginError( + "During BSDF to F3D conversion, for material '" + + material.name + + "'," + + " enum '" + + presetName + + "' was not found in material preset enum list." + ) + else: + presetName = getDefaultMaterialPreset("Shaded Texture") + newMaterial = createF3DMat(obj, preset=presetName, index=index) + f3dMat = newMaterial.f3d_mat if newMaterial.mat_ver > 3 else newMaterial + f3dMat.tex0.tex = tex0Node.links[0].from_node.image + if len(tex1Node.links) > 0 and isinstance( + tex1Node.links[0].from_node, bpy.types.ShaderNodeTexImage + ): + f3dMat.tex1.tex = tex1Node.links[0].from_node.image + updateMatWithName(newMaterial, material, materialDict) + else: + print( + "Principled BSDF material does not have an Image Node attached to its Base Color." + ) + else: + print("Material is not a Principled BSDF or non-node material.") + def updateMatWithName(f3dMat, oldMat, materialDict): - f3dMat.name = oldMat.name + "_f3d" - update_preset_manual(f3dMat, bpy.context) - materialDict[oldMat] = f3dMat + f3dMat.name = oldMat.name + "_f3d" + update_preset_manual(f3dMat, bpy.context) + materialDict[oldMat] = f3dMat + def updateMatWithNewVersionName(f3dMat, oldMat, materialDict, version): - name = oldMat.name - if oldMat.name[-3:-1] == '_v': - name = oldMat.name[:-3] - f3dMat.name = name + "_v" + str(version) - update_preset_manual(f3dMat, bpy.context) - materialDict[oldMat] = f3dMat + name = oldMat.name + if oldMat.name[-3:-1] == "_v": + name = oldMat.name[:-3] + f3dMat.name = name + "_v" + str(version) + update_preset_manual(f3dMat, bpy.context) + materialDict[oldMat] = f3dMat + class BSDFConvert(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.convert_bsdf' - bl_label = "Principled BSDF to F3D Converter" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - try: - if context.mode != 'OBJECT': - raise PluginError("Operator can only be used in object mode.") - - if context.scene.bsdf_conv_all: - convertAllBSDFtoF3D([obj for obj in bpy.data.objects if isinstance(obj.data, bpy.types.Mesh)], - context.scene.rename_uv_maps) - else: - if len(context.selected_objects) == 0: - raise PluginError("Mesh not selected.") - elif type(context.selected_objects[0].data) is not\ - bpy.types.Mesh: - raise PluginError("Mesh not selected.") - - obj = context.selected_objects[0] - convertAllBSDFtoF3D([obj], context.scene.rename_uv_maps) - - except Exception as e: - raisePluginError(self, e) - return {"CANCELLED"} - - self.report({'INFO'}, 'Created F3D material.') - return {'FINISHED'} # must return a set + # set bl_ properties + bl_idname = "object.convert_bsdf" + bl_label = "Principled BSDF to F3D Converter" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + try: + if context.mode != "OBJECT": + raise PluginError("Operator can only be used in object mode.") + + if context.scene.bsdf_conv_all: + convertAllBSDFtoF3D( + [ + obj + for obj in bpy.data.objects + if isinstance(obj.data, bpy.types.Mesh) + ], + context.scene.rename_uv_maps, + ) + else: + if len(context.selected_objects) == 0: + raise PluginError("Mesh not selected.") + elif type(context.selected_objects[0].data) is not bpy.types.Mesh: + raise PluginError("Mesh not selected.") + + obj = context.selected_objects[0] + convertAllBSDFtoF3D([obj], context.scene.rename_uv_maps) + + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} + + self.report({"INFO"}, "Created F3D material.") + return {"FINISHED"} # must return a set + class MatUpdateConvert(bpy.types.Operator): - # set bl_ properties - version = 4 - bl_idname = 'object.convert_f3d_update' - bl_label = "Recreate F3D Materials As v" + str(version) - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - try: - if context.mode != 'OBJECT': - raise PluginError("Operator can only be used in object mode.") - - if context.scene.update_conv_all: - upgradeF3DVersionAll([obj for obj in bpy.data.objects if isinstance(obj.data, bpy.types.Mesh)], - bpy.data.armatures, self.version) - else: - if len(context.selected_objects) == 0: - raise PluginError("Mesh not selected.") - elif type(context.selected_objects[0].data) is not\ - bpy.types.Mesh: - raise PluginError("Mesh not selected.") - - obj = context.selected_objects[0] - upgradeF3DVersionOneObject(obj, {}, self.version) - - except Exception as e: - raisePluginError(self, e) - return {"CANCELLED"} - - self.report({'INFO'}, 'Created F3D material.') - return {'FINISHED'} # must return a set + # set bl_ properties + version = 4 + bl_idname = "object.convert_f3d_update" + bl_label = "Recreate F3D Materials As v" + str(version) + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + try: + if context.mode != "OBJECT": + raise PluginError("Operator can only be used in object mode.") + + if context.scene.update_conv_all: + upgradeF3DVersionAll( + [ + obj + for obj in bpy.data.objects + if isinstance(obj.data, bpy.types.Mesh) + ], + bpy.data.armatures, + self.version, + ) + else: + if len(context.selected_objects) == 0: + raise PluginError("Mesh not selected.") + elif type(context.selected_objects[0].data) is not bpy.types.Mesh: + raise PluginError("Mesh not selected.") + + obj = context.selected_objects[0] + upgradeF3DVersionOneObject(obj, {}, self.version) + + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} + + self.report({"INFO"}, "Created F3D material.") + return {"FINISHED"} # must return a set + class F3DMaterialConverterPanel(bpy.types.Panel): - bl_label = "F3D Material Converter" - bl_idname = "MATERIAL_PT_F3D_Material_Converter" - bl_space_type = 'VIEW_3D' - bl_region_type = 'UI' - bl_category = 'Fast64' - - @classmethod - def poll(cls, context): - return True - #return hasattr(context, 'object') and context.object is not None and \ - # isinstance(context.object.data, bpy.types.Mesh) - - def draw(self, context): - #mesh = context.object.data - self.layout.operator(BSDFConvert.bl_idname) - self.layout.prop(context.scene, 'bsdf_conv_all') - self.layout.prop(context.scene, 'rename_uv_maps') - self.layout.operator(MatUpdateConvert.bl_idname) - self.layout.prop(context.scene, 'update_conv_all') - self.layout.operator(ReloadDefaultF3DPresets.bl_idname) + bl_label = "F3D Material Converter" + bl_idname = "MATERIAL_PT_F3D_Material_Converter" + bl_space_type = "VIEW_3D" + bl_region_type = "UI" + bl_category = "Fast64" + + @classmethod + def poll(cls, context): + return True + # return hasattr(context, 'object') and context.object is not None and \ + # isinstance(context.object.data, bpy.types.Mesh) + + def draw(self, context): + # mesh = context.object.data + self.layout.operator(BSDFConvert.bl_idname) + self.layout.prop(context.scene, "bsdf_conv_all") + self.layout.prop(context.scene, "rename_uv_maps") + self.layout.operator(MatUpdateConvert.bl_idname) + self.layout.prop(context.scene, "update_conv_all") + self.layout.operator(ReloadDefaultF3DPresets.bl_idname) bsdf_conv_classes = ( - BSDFConvert, - MatUpdateConvert, + BSDFConvert, + MatUpdateConvert, ) -bsdf_conv_panel_classes = ( - F3DMaterialConverterPanel, -) +bsdf_conv_panel_classes = (F3DMaterialConverterPanel,) + def bsdf_conv_panel_regsiter(): - for cls in bsdf_conv_panel_classes: - register_class(cls) + for cls in bsdf_conv_panel_classes: + register_class(cls) + def bsdf_conv_panel_unregsiter(): - for cls in bsdf_conv_panel_classes: - unregister_class(cls) + for cls in bsdf_conv_panel_classes: + unregister_class(cls) + def bsdf_conv_register(): - for cls in bsdf_conv_classes: - register_class(cls) + for cls in bsdf_conv_classes: + register_class(cls) + + # Moved to Level Root + bpy.types.Scene.bsdf_conv_all = bpy.props.BoolProperty( + name="Convert all objects", default=True + ) + bpy.types.Scene.update_conv_all = bpy.props.BoolProperty( + name="Convert all objects", default=True + ) + bpy.types.Scene.rename_uv_maps = bpy.props.BoolProperty( + name="Rename UV maps", default=True + ) - # Moved to Level Root - bpy.types.Scene.bsdf_conv_all = bpy.props.BoolProperty( - name = 'Convert all objects', default = True) - bpy.types.Scene.update_conv_all = bpy.props.BoolProperty( - name = 'Convert all objects', default = True) - bpy.types.Scene.rename_uv_maps = bpy.props.BoolProperty( - name = 'Rename UV maps', default = True) def bsdf_conv_unregister(): - for cls in bsdf_conv_classes: - unregister_class(cls) + for cls in bsdf_conv_classes: + unregister_class(cls) - del bpy.types.Scene.bsdf_conv_all - del bpy.types.Scene.update_conv_all - del bpy.types.Scene.rename_uv_maps \ No newline at end of file + del bpy.types.Scene.bsdf_conv_all + del bpy.types.Scene.update_conv_all + del bpy.types.Scene.rename_uv_maps diff --git a/fast64_internal/oot/__init__.py b/fast64_internal/oot/__init__.py index 3169c107d..d86ae4801 100644 --- a/fast64_internal/oot/__init__.py +++ b/fast64_internal/oot/__init__.py @@ -1,10 +1,12 @@ from ..panels import OOT_Panel from .oot_f3d_writer import * -#from .oot_geolayout_writer import * -#from .oot_geolayout_parser import * + +# from .oot_geolayout_writer import * +# from .oot_geolayout_parser import * from .oot_constants import * -#from .oot_anim import * -#from .oot_geolayout_bone import * + +# from .oot_anim import * +# from .oot_geolayout_bone import * from .oot_collision import * from .oot_level import * from .oot_level_writer import * @@ -14,126 +16,141 @@ from .oot_skeleton import * from .oot_cutscene import * from .oot_operators import * -#from .oot_f3d_parser import * + +# from .oot_f3d_parser import * import bpy from bpy.utils import register_class, unregister_class ootEnumRefreshVer = [ - ("Refresh 3", "Refresh 3", "Refresh 3"), + ("Refresh 3", "Refresh 3", "Refresh 3"), ] + class OOT_FileSettingsPanel(OOT_Panel): - bl_idname = "OOT_PT_file_settings" - bl_label = "OOT File Settings" - bl_options = set() # default to being open - - # called every frame - def draw(self, context): - col = self.layout.column() - col.scale_y = 1.1 # extra padding, makes it easier to see these main settings - prop_split(col, context.scene, 'ootBlenderScale', 'OOT Scene Scale') - prop_split(col, context.scene, 'ootActorBlenderScale', 'OOT Actor Scale') - - #col.prop(context.scene, 'ootDisableScroll') - #col.prop(context.scene, 'ootSaveTextures') - prop_split(col, context.scene, 'ootDecompPath', "Decomp Path") - - #prop_split(col, context.scene, 'ootRefreshVer', 'Decomp Func Map') + bl_idname = "OOT_PT_file_settings" + bl_label = "OOT File Settings" + bl_options = set() # default to being open + + # called every frame + def draw(self, context): + col = self.layout.column() + col.scale_y = 1.1 # extra padding, makes it easier to see these main settings + prop_split(col, context.scene, "ootBlenderScale", "OOT Scene Scale") + prop_split(col, context.scene, "ootActorBlenderScale", "OOT Actor Scale") + + # col.prop(context.scene, 'ootDisableScroll') + # col.prop(context.scene, 'ootSaveTextures') + prop_split(col, context.scene, "ootDecompPath", "Decomp Path") + + # prop_split(col, context.scene, 'ootRefreshVer', 'Decomp Func Map') + class OOT_Properties(bpy.types.PropertyGroup): - '''Global OOT Scene Properties found under scene.fast64.oot''' - version: bpy.props.IntProperty(name="OOT_Properties Version", default=0) + """Global OOT Scene Properties found under scene.fast64.oot""" + + version: bpy.props.IntProperty(name="OOT_Properties Version", default=0) + oot_classes = ( - OOT_FileSettingsPanel, - OOT_Properties, + OOT_FileSettingsPanel, + OOT_Properties, ) + def oot_panel_register(): - oot_operator_panel_register() - oot_dl_writer_panel_register() - oot_col_panel_register() - #oot_bone_panel_register() - oot_obj_panel_register() - #oot_geo_parser_panel_register() - #oot_geo_writer_panel_register() - oot_level_panel_register() - oot_spline_panel_register() - #oot_dl_parser_panel_register() - oot_anim_panel_register() - oot_skeleton_panel_register() - oot_cutscene_panel_register() + oot_operator_panel_register() + oot_dl_writer_panel_register() + oot_col_panel_register() + # oot_bone_panel_register() + oot_obj_panel_register() + # oot_geo_parser_panel_register() + # oot_geo_writer_panel_register() + oot_level_panel_register() + oot_spline_panel_register() + # oot_dl_parser_panel_register() + oot_anim_panel_register() + oot_skeleton_panel_register() + oot_cutscene_panel_register() + def oot_panel_unregister(): - oot_operator_panel_unregister() - oot_col_panel_unregister() - #oot_bone_panel_unregister() - oot_obj_panel_unregister() - #oot_geo_parser_panel_unregister() - #oot_geo_writer_panel_unregister() - oot_level_panel_unregister() - oot_spline_panel_unregister() - oot_dl_writer_panel_unregister() - #oot_dl_parser_panel_unregister() - oot_anim_panel_unregister() - oot_skeleton_panel_unregister() - oot_cutscene_panel_unregister() + oot_operator_panel_unregister() + oot_col_panel_unregister() + # oot_bone_panel_unregister() + oot_obj_panel_unregister() + # oot_geo_parser_panel_unregister() + # oot_geo_writer_panel_unregister() + oot_level_panel_unregister() + oot_spline_panel_unregister() + oot_dl_writer_panel_unregister() + # oot_dl_parser_panel_unregister() + oot_anim_panel_unregister() + oot_skeleton_panel_unregister() + oot_cutscene_panel_unregister() + def oot_register(registerPanels): - for cls in oot_classes: - register_class(cls) - - oot_operator_register() - oot_utility_register() - oot_col_register() # register first, so panel goes above mat panel - #oot_bone_register() - oot_obj_register() - #oot_geo_parser_register() - #oot_geo_writer_register() - oot_level_register() - oot_spline_register() - oot_dl_writer_register() - #oot_dl_parser_register() - oot_anim_register() - oot_skeleton_register() - oot_cutscene_register() - - if registerPanels: - oot_panel_register() - - bpy.types.Scene.ootBlenderScale = bpy.props.FloatProperty(name = 'Blender To OOT Scale', default = 10) - bpy.types.Scene.ootActorBlenderScale = bpy.props.FloatProperty(name = 'Blender To OOT Actor Scale', default = 1000) - bpy.types.Scene.ootRefreshVer = bpy.props.EnumProperty( - items = ootEnumRefreshVer, name = 'Refresh', default = 'Refresh 3') - bpy.types.Scene.ootDecompPath = bpy.props.StringProperty( - name ='Decomp Folder', subtype = 'FILE_PATH') - #bpy.types.Scene.ootDisableScroll = bpy.props.BoolProperty(name = "Disable Scrolling Textures") - #bpy.types.Scene.ootSaveTextures = bpy.props.BoolProperty(name = "Save Texture Files As Images") + for cls in oot_classes: + register_class(cls) + + oot_operator_register() + oot_utility_register() + oot_col_register() # register first, so panel goes above mat panel + # oot_bone_register() + oot_obj_register() + # oot_geo_parser_register() + # oot_geo_writer_register() + oot_level_register() + oot_spline_register() + oot_dl_writer_register() + # oot_dl_parser_register() + oot_anim_register() + oot_skeleton_register() + oot_cutscene_register() + + if registerPanels: + oot_panel_register() + + bpy.types.Scene.ootBlenderScale = bpy.props.FloatProperty( + name="Blender To OOT Scale", default=10 + ) + bpy.types.Scene.ootActorBlenderScale = bpy.props.FloatProperty( + name="Blender To OOT Actor Scale", default=1000 + ) + bpy.types.Scene.ootRefreshVer = bpy.props.EnumProperty( + items=ootEnumRefreshVer, name="Refresh", default="Refresh 3" + ) + bpy.types.Scene.ootDecompPath = bpy.props.StringProperty( + name="Decomp Folder", subtype="FILE_PATH" + ) + # bpy.types.Scene.ootDisableScroll = bpy.props.BoolProperty(name = "Disable Scrolling Textures") + # bpy.types.Scene.ootSaveTextures = bpy.props.BoolProperty(name = "Save Texture Files As Images") + def oot_unregister(unregisterPanels): - for cls in reversed(oot_classes): - unregister_class(cls) - - oot_operator_unregister() - oot_utility_unregister() - oot_col_unregister() # register first, so panel goes above mat panel - #oot_bone_unregister() - oot_obj_unregister() - #oot_geo_parser_unregister() - #oot_geo_writer_unregister() - oot_level_unregister() - oot_spline_unregister() - oot_dl_writer_unregister() - #oot_dl_parser_unregister() - oot_anim_unregister() - oot_skeleton_unregister() - oot_cutscene_unregister() - - if unregisterPanels: - oot_panel_unregister() - - del bpy.types.Scene.ootRefreshVer - del bpy.types.Scene.ootBlenderScale - del bpy.types.Scene.ootActorBlenderScale - del bpy.types.Scene.ootDecompPath + for cls in reversed(oot_classes): + unregister_class(cls) + + oot_operator_unregister() + oot_utility_unregister() + oot_col_unregister() # register first, so panel goes above mat panel + # oot_bone_unregister() + oot_obj_unregister() + # oot_geo_parser_unregister() + # oot_geo_writer_unregister() + oot_level_unregister() + oot_spline_unregister() + oot_dl_writer_unregister() + # oot_dl_parser_unregister() + oot_anim_unregister() + oot_skeleton_unregister() + oot_cutscene_unregister() + + if unregisterPanels: + oot_panel_unregister() + + del bpy.types.Scene.ootRefreshVer + del bpy.types.Scene.ootBlenderScale + del bpy.types.Scene.ootActorBlenderScale + del bpy.types.Scene.ootDecompPath diff --git a/fast64_internal/oot/c_writer/__init__.py b/fast64_internal/oot/c_writer/__init__.py index d08e21b43..b7ae98f34 100644 --- a/fast64_internal/oot/c_writer/__init__.py +++ b/fast64_internal/oot/c_writer/__init__.py @@ -3,4 +3,4 @@ from .oot_scene_table_c import * from .oot_segment_symbols_c import * from .oot_spec import * -from .oot_scene_folder import * \ No newline at end of file +from .oot_scene_folder import * diff --git a/fast64_internal/oot/c_writer/oot_level_c.py b/fast64_internal/oot/c_writer/oot_level_c.py index 03ff69765..c8cb10003 100644 --- a/fast64_internal/oot/c_writer/oot_level_c.py +++ b/fast64_internal/oot/c_writer/oot_level_c.py @@ -4,644 +4,1035 @@ from ..oot_collision import * from ..oot_cutscene import * + def cmdName(name, header, index): - return name + "_header" + format(header, '02') + "_cmd" + format(index, '02') + return name + "_header" + format(header, "02") + "_cmd" + format(index, "02") + # Scene Commands def cmdSoundSettings(scene, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_SOUND_SETTINGS(" + str(scene.audioSessionPreset) + ", " + str(scene.nightSeq) + \ - ", " + str(scene.musicSeq) + "),\n" - return cmd + cmd = CData() + cmd.source = ( + "\tSCENE_CMD_SOUND_SETTINGS(" + + str(scene.audioSessionPreset) + + ", " + + str(scene.nightSeq) + + ", " + + str(scene.musicSeq) + + "),\n" + ) + return cmd + def cmdRoomList(scene, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_ROOM_LIST(" + str(len(scene.rooms)) + ", &" + scene.roomListName() + "),\n" - return cmd + cmd = CData() + cmd.source = ( + "\tSCENE_CMD_ROOM_LIST(" + + str(len(scene.rooms)) + + ", &" + + scene.roomListName() + + "),\n" + ) + return cmd + def cmdTransiActorList(scene, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_TRANSITION_ACTOR_LIST(" + str(len(scene.transitionActorList)) + ", &" + \ - scene.transitionActorListName(header) + "),\n" - return cmd + cmd = CData() + cmd.source = ( + "\tSCENE_CMD_TRANSITION_ACTOR_LIST(" + + str(len(scene.transitionActorList)) + + ", &" + + scene.transitionActorListName(header) + + "),\n" + ) + return cmd + def cmdMiscSettings(scene, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_MISC_SETTINGS(" + str(scene.cameraMode) + ", " + str(scene.mapLocation) + "),\n" - return cmd + cmd = CData() + cmd.source = ( + "\tSCENE_CMD_MISC_SETTINGS(" + + str(scene.cameraMode) + + ", " + + str(scene.mapLocation) + + "),\n" + ) + return cmd + def cmdColHeader(scene, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_COL_HEADER(&" + scene.collision.headerName() + "),\n" - return cmd + cmd = CData() + cmd.source = "\tSCENE_CMD_COL_HEADER(&" + scene.collision.headerName() + "),\n" + return cmd + def cmdEntranceList(scene, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_ENTRANCE_LIST(" + (('&' + scene.entranceListName(header)) if len(scene.entranceList) > 0 else "NULL") + "),\n" - return cmd + cmd = CData() + cmd.source = ( + "\tSCENE_CMD_ENTRANCE_LIST(" + + ( + ("&" + scene.entranceListName(header)) + if len(scene.entranceList) > 0 + else "NULL" + ) + + "),\n" + ) + return cmd + def cmdSpecialFiles(scene, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_SPECIAL_FILES(" + str(scene.naviCup) + ", " + str(scene.globalObject) + "),\n" - return cmd + cmd = CData() + cmd.source = ( + "\tSCENE_CMD_SPECIAL_FILES(" + + str(scene.naviCup) + + ", " + + str(scene.globalObject) + + "),\n" + ) + return cmd + def cmdPathList(scene, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_PATH_LIST(&" + scene.pathListName() + "),\n" - return cmd + cmd = CData() + cmd.source = "\tSCENE_CMD_PATH_LIST(&" + scene.pathListName() + "),\n" + return cmd + def cmdSpawnList(scene, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_SPAWN_LIST(" + str(len(scene.startPositions)) + ", " + \ - (('&' + scene.startPositionsName(header)) if len(scene.startPositions) > 0 else 'NULL') + "),\n" - return cmd + cmd = CData() + cmd.source = ( + "\tSCENE_CMD_SPAWN_LIST(" + + str(len(scene.startPositions)) + + ", " + + ( + ("&" + scene.startPositionsName(header)) + if len(scene.startPositions) > 0 + else "NULL" + ) + + "),\n" + ) + return cmd + def cmdSkyboxSettings(scene, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_SKYBOX_SETTINGS(" + str(scene.skyboxID) + ", " + str(scene.skyboxCloudiness) \ - + ", " + str(scene.skyboxLighting) + "),\n" - return cmd - + cmd = CData() + cmd.source = ( + "\tSCENE_CMD_SKYBOX_SETTINGS(" + + str(scene.skyboxID) + + ", " + + str(scene.skyboxCloudiness) + + ", " + + str(scene.skyboxLighting) + + "),\n" + ) + return cmd + + def cmdExitList(scene, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_EXIT_LIST(&" + scene.exitListName(header) + "),\n" - return cmd + cmd = CData() + cmd.source = "\tSCENE_CMD_EXIT_LIST(&" + scene.exitListName(header) + "),\n" + return cmd + def cmdLightSettingList(scene, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_ENV_LIGHT_SETTINGS(" + str(len(scene.lights)) + ", " + \ - (('&' + scene.lightListName(header)) if len(scene.lights) > 0 else 'NULL') + "),\n" - return cmd + cmd = CData() + cmd.source = ( + "\tSCENE_CMD_ENV_LIGHT_SETTINGS(" + + str(len(scene.lights)) + + ", " + + (("&" + scene.lightListName(header)) if len(scene.lights) > 0 else "NULL") + + "),\n" + ) + return cmd + def cmdCutsceneData(scene, header, cmdCount): - cmd = CData() - if scene.csWriteType == "Embedded": - csname = scene.cutsceneDataName(header) - elif scene.csWriteType == "Object": - csname = scene.csWriteObject.name - elif scene.csWriteType == "Custom": - csname = scene.csWriteCustom - cmd.source = "\tSCENE_CMD_CUTSCENE_DATA(&" + csname + "),\n" - return cmd + cmd = CData() + if scene.csWriteType == "Embedded": + csname = scene.cutsceneDataName(header) + elif scene.csWriteType == "Object": + csname = scene.csWriteObject.name + elif scene.csWriteType == "Custom": + csname = scene.csWriteCustom + cmd.source = "\tSCENE_CMD_CUTSCENE_DATA(&" + csname + "),\n" + return cmd + def cmdEndMarker(name, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_END(),\n" - return cmd + cmd = CData() + cmd.source = "\tSCENE_CMD_END(),\n" + return cmd + # Room Commands def cmdAltHeaders(name, altName, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_ALTERNATE_HEADER_LIST(&" + altName + "),\n" - return cmd + cmd = CData() + cmd.source = "\tSCENE_CMD_ALTERNATE_HEADER_LIST(&" + altName + "),\n" + return cmd + def cmdEchoSettings(room, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_ECHO_SETTINGS(" + str(room.echo) + "),\n" - return cmd + cmd = CData() + cmd.source = "\tSCENE_CMD_ECHO_SETTINGS(" + str(room.echo) + "),\n" + return cmd + def cmdRoomBehaviour(room, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_ROOM_BEHAVIOR(" + str(room.roomBehaviour) + ", " + str(room.linkIdleMode) + ", " + \ - ("true" if room.showInvisibleActors else "false") + ", " + \ - ("true" if room.disableWarpSongs else "false") + "),\n" - return cmd + cmd = CData() + cmd.source = ( + "\tSCENE_CMD_ROOM_BEHAVIOR(" + + str(room.roomBehaviour) + + ", " + + str(room.linkIdleMode) + + ", " + + ("true" if room.showInvisibleActors else "false") + + ", " + + ("true" if room.disableWarpSongs else "false") + + "),\n" + ) + return cmd + def cmdSkyboxDisables(room, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_SKYBOX_DISABLES(" + ("true" if room.disableSkybox else "false") + ", " + \ - ("true" if room.disableSunMoon else "false") + "),\n" - return cmd + cmd = CData() + cmd.source = ( + "\tSCENE_CMD_SKYBOX_DISABLES(" + + ("true" if room.disableSkybox else "false") + + ", " + + ("true" if room.disableSunMoon else "false") + + "),\n" + ) + return cmd + def cmdTimeSettings(room, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_TIME_SETTINGS(" + str(room.timeHours) + ", " + str(room.timeMinutes) + ", " + \ - str(room.timeSpeed) + "),\n" - return cmd + cmd = CData() + cmd.source = ( + "\tSCENE_CMD_TIME_SETTINGS(" + + str(room.timeHours) + + ", " + + str(room.timeMinutes) + + ", " + + str(room.timeSpeed) + + "),\n" + ) + return cmd + def cmdWindSettings(room, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_WIND_SETTINGS(" + str(room.windVector[0]) + ", " + \ - str(room.windVector[1]) + ", " + \ - str(room.windVector[2]) + ", " + \ - str(room.windStrength) + "),\n" - return cmd + cmd = CData() + cmd.source = ( + "\tSCENE_CMD_WIND_SETTINGS(" + + str(room.windVector[0]) + + ", " + + str(room.windVector[1]) + + ", " + + str(room.windVector[2]) + + ", " + + str(room.windStrength) + + "),\n" + ) + return cmd + def cmdMesh(room, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_MESH(&" + room.mesh.headerName() + "),\n" - return cmd + cmd = CData() + cmd.source = "\tSCENE_CMD_MESH(&" + room.mesh.headerName() + "),\n" + return cmd + def cmdObjectList(room, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_OBJECT_LIST(" + str(len(room.objectList)) + ", &" + str(room.objectListName(header)) + "),\n" - return cmd + cmd = CData() + cmd.source = ( + "\tSCENE_CMD_OBJECT_LIST(" + + str(len(room.objectList)) + + ", &" + + str(room.objectListName(header)) + + "),\n" + ) + return cmd + def cmdActorList(room, header, cmdCount): - cmd = CData() - cmd.source = "\tSCENE_CMD_ACTOR_LIST(" + str(len(room.actorList)) + ", &" + str(room.actorListName(header)) + "),\n" - return cmd + cmd = CData() + cmd.source = ( + "\tSCENE_CMD_ACTOR_LIST(" + + str(len(room.actorList)) + + ", &" + + str(room.actorListName(header)) + + "),\n" + ) + return cmd + def ootObjectListToC(room, headerIndex): - data = CData() - data.header = "extern s16 " + room.objectListName(headerIndex) + "[" + str(len(room.objectList)) + "];\n" - data.source = "s16 " + room.objectListName(headerIndex) + "[" + str(len(room.objectList)) + "] = {\n" - for objectItem in room.objectList: - data.source += '\t' + objectItem + ',\n' - data.source += '};\n\n' - return data + data = CData() + data.header = ( + "extern s16 " + + room.objectListName(headerIndex) + + "[" + + str(len(room.objectList)) + + "];\n" + ) + data.source = ( + "s16 " + + room.objectListName(headerIndex) + + "[" + + str(len(room.objectList)) + + "] = {\n" + ) + for objectItem in room.objectList: + data.source += "\t" + objectItem + ",\n" + data.source += "};\n\n" + return data + def ootActorToC(actor): - return '{ ' + str(actor.actorID) + ', ' + \ - str(int(round(actor.position[0]))) + ', ' + \ - str(int(round(actor.position[1]))) + ', ' + \ - str(int(round(actor.position[2]))) + ', ' + \ - (( - actor.rotOverride[0] + ', ' + - actor.rotOverride[1] + ', ' + - actor.rotOverride[2] + ', ' - ) if actor.rotOverride is not None else ( - str(int(round(actor.rotation[0]))) + ', ' + - str(int(round(actor.rotation[1]))) + ', ' + - str(int(round(actor.rotation[2]))) + ', ' - )) + \ - str(actor.actorParam) + ' },\n' + return ( + "{ " + + str(actor.actorID) + + ", " + + str(int(round(actor.position[0]))) + + ", " + + str(int(round(actor.position[1]))) + + ", " + + str(int(round(actor.position[2]))) + + ", " + + ( + ( + actor.rotOverride[0] + + ", " + + actor.rotOverride[1] + + ", " + + actor.rotOverride[2] + + ", " + ) + if actor.rotOverride is not None + else ( + str(int(round(actor.rotation[0]))) + + ", " + + str(int(round(actor.rotation[1]))) + + ", " + + str(int(round(actor.rotation[2]))) + + ", " + ) + ) + + str(actor.actorParam) + + " },\n" + ) + def ootActorListToC(room, headerIndex): - data = CData() - data.header = "extern ActorEntry " + room.actorListName(headerIndex) + "[" + str(len(room.actorList)) + "];\n" - data.source = "ActorEntry " + room.actorListName(headerIndex) + "[" + str(len(room.actorList)) + "] = {\n" - for actor in room.actorList: - data.source += '\t' + ootActorToC(actor) - data.source += "};\n\n" - return data + data = CData() + data.header = ( + "extern ActorEntry " + + room.actorListName(headerIndex) + + "[" + + str(len(room.actorList)) + + "];\n" + ) + data.source = ( + "ActorEntry " + + room.actorListName(headerIndex) + + "[" + + str(len(room.actorList)) + + "] = {\n" + ) + for actor in room.actorList: + data.source += "\t" + ootActorToC(actor) + data.source += "};\n\n" + return data + def ootMeshEntryToC(meshEntry, meshType): - opaqueName = meshEntry.DLGroup.opaque.name if meshEntry.DLGroup.opaque is not None else "0" - transparentName = meshEntry.DLGroup.transparent.name if meshEntry.DLGroup.transparent is not None else "0" - data = "{ " - if meshType == "1": - raise PluginError("MeshHeader1 not supported.") - elif meshType == "2": - data += str(meshEntry.cullGroup.position[0]) + ", " + str(meshEntry.cullGroup.position[1]) + ", " - data += str(meshEntry.cullGroup.position[2]) + ", " + str(meshEntry.cullGroup.cullDepth) + ", " - data += "(u32)" + opaqueName + ", (u32)" + transparentName + ' },\n' - - return data + opaqueName = ( + meshEntry.DLGroup.opaque.name if meshEntry.DLGroup.opaque is not None else "0" + ) + transparentName = ( + meshEntry.DLGroup.transparent.name + if meshEntry.DLGroup.transparent is not None + else "0" + ) + data = "{ " + if meshType == "1": + raise PluginError("MeshHeader1 not supported.") + elif meshType == "2": + data += ( + str(meshEntry.cullGroup.position[0]) + + ", " + + str(meshEntry.cullGroup.position[1]) + + ", " + ) + data += ( + str(meshEntry.cullGroup.position[2]) + + ", " + + str(meshEntry.cullGroup.cullDepth) + + ", " + ) + data += "(u32)" + opaqueName + ", (u32)" + transparentName + " },\n" + + return data + def ootRoomMeshToC(room, textureExportSettings): - mesh = room.mesh - if len(mesh.meshEntries) == 0: - raise PluginError("Error: Room " + str(room.index) + " has no mesh children.") - - meshHeader = CData() - meshHeader.header = "extern MeshHeader" + str(mesh.meshType) + " " + mesh.headerName() + ';\n' - meshHeader.source = "MeshHeader" + str(mesh.meshType) + " " + mesh.headerName() + ' = ' +\ - "{ {" + str(mesh.meshType) + "}, " + str(len(mesh.meshEntries)) + ", " +\ - "(u32)&" + mesh.entriesName() + ", (u32)&(" + mesh.entriesName() + ") + " +\ - "sizeof(" + mesh.entriesName() + ") };\n\n" - - meshEntries = CData() - meshEntries.header = "extern MeshEntry" + str(mesh.meshType) + " " + mesh.entriesName() + "[" + str(len(mesh.meshEntries)) + "];\n" - meshEntries.source = "MeshEntry" + str(mesh.meshType) + " " + mesh.entriesName() + "[" + str(len(mesh.meshEntries)) + "] = {\n" - meshData = CData() - for entry in mesh.meshEntries: - meshEntries.source += '\t' + ootMeshEntryToC(entry, str(mesh.meshType)) - if entry.DLGroup.opaque is not None: - meshData.append(entry.DLGroup.opaque.to_c(mesh.model.f3d)) - if entry.DLGroup.transparent is not None: - meshData.append(entry.DLGroup.transparent.to_c(mesh.model.f3d)) - meshEntries.source += '};\n\n' - exportData = mesh.model.to_c(textureExportSettings, OOTGfxFormatter(ScrollMethod.Vertex)) - - meshData.append(exportData.all()) - meshHeader.append(meshEntries) - #meshHeader.append(meshData) - - return meshHeader, meshData + mesh = room.mesh + if len(mesh.meshEntries) == 0: + raise PluginError("Error: Room " + str(room.index) + " has no mesh children.") + + meshHeader = CData() + meshHeader.header = ( + "extern MeshHeader" + str(mesh.meshType) + " " + mesh.headerName() + ";\n" + ) + meshHeader.source = ( + "MeshHeader" + + str(mesh.meshType) + + " " + + mesh.headerName() + + " = " + + "{ {" + + str(mesh.meshType) + + "}, " + + str(len(mesh.meshEntries)) + + ", " + + "(u32)&" + + mesh.entriesName() + + ", (u32)&(" + + mesh.entriesName() + + ") + " + + "sizeof(" + + mesh.entriesName() + + ") };\n\n" + ) + + meshEntries = CData() + meshEntries.header = ( + "extern MeshEntry" + + str(mesh.meshType) + + " " + + mesh.entriesName() + + "[" + + str(len(mesh.meshEntries)) + + "];\n" + ) + meshEntries.source = ( + "MeshEntry" + + str(mesh.meshType) + + " " + + mesh.entriesName() + + "[" + + str(len(mesh.meshEntries)) + + "] = {\n" + ) + meshData = CData() + for entry in mesh.meshEntries: + meshEntries.source += "\t" + ootMeshEntryToC(entry, str(mesh.meshType)) + if entry.DLGroup.opaque is not None: + meshData.append(entry.DLGroup.opaque.to_c(mesh.model.f3d)) + if entry.DLGroup.transparent is not None: + meshData.append(entry.DLGroup.transparent.to_c(mesh.model.f3d)) + meshEntries.source += "};\n\n" + exportData = mesh.model.to_c( + textureExportSettings, OOTGfxFormatter(ScrollMethod.Vertex) + ) + + meshData.append(exportData.all()) + meshHeader.append(meshEntries) + # meshHeader.append(meshData) + + return meshHeader, meshData + def ootRoomCommandsToC(room, headerIndex): - commands = [] - if room.hasAlternateHeaders(): - commands.append(cmdAltHeaders(room.roomName(), room.alternateHeadersName(), headerIndex, len(commands))) - commands.append(cmdEchoSettings(room, headerIndex, len(commands))) - commands.append(cmdRoomBehaviour(room, headerIndex, len(commands))) - commands.append(cmdSkyboxDisables(room, headerIndex, len(commands))) - commands.append(cmdTimeSettings(room, headerIndex, len(commands))) - if room.setWind: - commands.append(cmdWindSettings(room, headerIndex, len(commands))) - commands.append(cmdMesh(room, headerIndex, len(commands))) - if len(room.objectList) > 0: - commands.append(cmdObjectList(room, headerIndex, len(commands))) - if len(room.actorList) > 0: - commands.append(cmdActorList(room, headerIndex, len(commands))) - commands.append(cmdEndMarker(room.roomName(), headerIndex, len(commands))) - - data = CData() - - # data.header = ''.join([command.header for command in commands]) +'\n' - data.header = "extern SCmdBase " + room.roomName() + "_header" + format(headerIndex, '02') + "[];\n" - - data.source = "SCmdBase " + room.roomName() + "_header" + format(headerIndex, '02') + "[] = {\n" - data.source += ''.join([command.source for command in commands]) - data.source += "};\n\n" - - return data + commands = [] + if room.hasAlternateHeaders(): + commands.append( + cmdAltHeaders( + room.roomName(), room.alternateHeadersName(), headerIndex, len(commands) + ) + ) + commands.append(cmdEchoSettings(room, headerIndex, len(commands))) + commands.append(cmdRoomBehaviour(room, headerIndex, len(commands))) + commands.append(cmdSkyboxDisables(room, headerIndex, len(commands))) + commands.append(cmdTimeSettings(room, headerIndex, len(commands))) + if room.setWind: + commands.append(cmdWindSettings(room, headerIndex, len(commands))) + commands.append(cmdMesh(room, headerIndex, len(commands))) + if len(room.objectList) > 0: + commands.append(cmdObjectList(room, headerIndex, len(commands))) + if len(room.actorList) > 0: + commands.append(cmdActorList(room, headerIndex, len(commands))) + commands.append(cmdEndMarker(room.roomName(), headerIndex, len(commands))) + + data = CData() + + # data.header = ''.join([command.header for command in commands]) +'\n' + data.header = ( + "extern SCmdBase " + + room.roomName() + + "_header" + + format(headerIndex, "02") + + "[];\n" + ) + + data.source = ( + "SCmdBase " + + room.roomName() + + "_header" + + format(headerIndex, "02") + + "[] = {\n" + ) + data.source += "".join([command.source for command in commands]) + data.source += "};\n\n" + + return data + def ootAlternateRoomMainToC(scene, room): - altHeader = CData() - altData = CData() - - altHeader.header = "extern SCmdBase* " + room.alternateHeadersName() + "[];\n" - altHeader.source = "SCmdBase* " + room.alternateHeadersName() + "[] = {\n" - - if room.childNightHeader is not None: - altHeader.source += "\t" + room.roomName() + "_header" + format(1, '02') + ",\n" - altData.append(ootRoomMainToC(scene, room.childNightHeader, 1)) - else: - altHeader.source += "\t0,\n" - - if room.adultDayHeader is not None: - altHeader.source += "\t" + room.roomName() + "_header" + format(2, '02') + ",\n" - altData.append(ootRoomMainToC(scene, room.adultDayHeader, 2)) - else: - altHeader.source += "\t0,\n" - - if room.adultNightHeader is not None: - altHeader.source += "\t" + room.roomName() + "_header" + format(3, '02') + ",\n" - altData.append(ootRoomMainToC(scene, room.adultNightHeader, 3)) - else: - altHeader.source += "\t0,\n" - - for i in range(len(room.cutsceneHeaders)): - altHeader.source += "\t" + room.roomName() + "_header" + format(i + 4, '02') + ",\n" - altData.append(ootRoomMainToC(scene, room.cutsceneHeaders[i], i + 4)) - - altHeader.source += '};\n\n' - - return altHeader, altData + altHeader = CData() + altData = CData() + + altHeader.header = "extern SCmdBase* " + room.alternateHeadersName() + "[];\n" + altHeader.source = "SCmdBase* " + room.alternateHeadersName() + "[] = {\n" + + if room.childNightHeader is not None: + altHeader.source += "\t" + room.roomName() + "_header" + format(1, "02") + ",\n" + altData.append(ootRoomMainToC(scene, room.childNightHeader, 1)) + else: + altHeader.source += "\t0,\n" + + if room.adultDayHeader is not None: + altHeader.source += "\t" + room.roomName() + "_header" + format(2, "02") + ",\n" + altData.append(ootRoomMainToC(scene, room.adultDayHeader, 2)) + else: + altHeader.source += "\t0,\n" + + if room.adultNightHeader is not None: + altHeader.source += "\t" + room.roomName() + "_header" + format(3, "02") + ",\n" + altData.append(ootRoomMainToC(scene, room.adultNightHeader, 3)) + else: + altHeader.source += "\t0,\n" + + for i in range(len(room.cutsceneHeaders)): + altHeader.source += ( + "\t" + room.roomName() + "_header" + format(i + 4, "02") + ",\n" + ) + altData.append(ootRoomMainToC(scene, room.cutsceneHeaders[i], i + 4)) + + altHeader.source += "};\n\n" + + return altHeader, altData + def ootRoomMainToC(scene, room, headerIndex): - roomMainC = CData() - - if room.hasAlternateHeaders(): - altHeader, altData = ootAlternateRoomMainToC(scene, room) - else: - altHeader = CData() - altData = CData() - - roomMainC.append(ootRoomCommandsToC(room, headerIndex)) - roomMainC.append(altHeader) - if len(room.objectList) > 0: - roomMainC.append(ootObjectListToC(room, headerIndex)) - if len(room.actorList) > 0: - roomMainC.append(ootActorListToC(room, headerIndex)) - roomMainC.append(altData) - - return roomMainC + roomMainC = CData() + + if room.hasAlternateHeaders(): + altHeader, altData = ootAlternateRoomMainToC(scene, room) + else: + altHeader = CData() + altData = CData() + + roomMainC.append(ootRoomCommandsToC(room, headerIndex)) + roomMainC.append(altHeader) + if len(room.objectList) > 0: + roomMainC.append(ootObjectListToC(room, headerIndex)) + if len(room.actorList) > 0: + roomMainC.append(ootActorListToC(room, headerIndex)) + roomMainC.append(altData) + + return roomMainC + def ootSceneCommandsToC(scene, headerIndex): - commands = [] - if scene.hasAlternateHeaders(): - commands.append(cmdAltHeaders(scene.sceneName(), scene.alternateHeadersName(), headerIndex, len(commands))) - commands.append(cmdSoundSettings(scene, headerIndex, len(commands))) - commands.append(cmdRoomList(scene, headerIndex, len(commands))) - if len(scene.transitionActorList) > 0: - commands.append(cmdTransiActorList(scene, headerIndex, len(commands))) - commands.append(cmdMiscSettings(scene, headerIndex, len(commands))) - commands.append(cmdColHeader(scene, headerIndex, len(commands))) - commands.append(cmdEntranceList(scene, headerIndex, len(commands))) - commands.append(cmdSpecialFiles(scene, headerIndex, len(commands))) - if len(scene.pathList) > 0: - commands.append(cmdPathList(scene, headerIndex, len(commands))) - commands.append(cmdSpawnList(scene, headerIndex, len(commands))) - commands.append(cmdSkyboxSettings(scene, headerIndex, len(commands))) - if len(scene.exitList) > 0: - commands.append(cmdExitList(scene, headerIndex, len(commands))) - commands.append(cmdLightSettingList(scene, headerIndex, len(commands))) - if scene.writeCutscene: - commands.append(cmdCutsceneData(scene, headerIndex, len(commands))) - commands.append(cmdEndMarker(scene.sceneName(), headerIndex, len(commands))) - - data = CData() - - # data.header = ''.join([command.header for command in commands]) +'\n' - data.header = "extern SCmdBase " + scene.sceneName() + "_header" + format(headerIndex, '02') + "[];\n" - - data.source = "SCmdBase " + scene.sceneName() + "_header" + format(headerIndex, '02') + "[] = {\n" - data.source += ''.join([command.source for command in commands]) - data.source += "};\n\n" - - return data + commands = [] + if scene.hasAlternateHeaders(): + commands.append( + cmdAltHeaders( + scene.sceneName(), + scene.alternateHeadersName(), + headerIndex, + len(commands), + ) + ) + commands.append(cmdSoundSettings(scene, headerIndex, len(commands))) + commands.append(cmdRoomList(scene, headerIndex, len(commands))) + if len(scene.transitionActorList) > 0: + commands.append(cmdTransiActorList(scene, headerIndex, len(commands))) + commands.append(cmdMiscSettings(scene, headerIndex, len(commands))) + commands.append(cmdColHeader(scene, headerIndex, len(commands))) + commands.append(cmdEntranceList(scene, headerIndex, len(commands))) + commands.append(cmdSpecialFiles(scene, headerIndex, len(commands))) + if len(scene.pathList) > 0: + commands.append(cmdPathList(scene, headerIndex, len(commands))) + commands.append(cmdSpawnList(scene, headerIndex, len(commands))) + commands.append(cmdSkyboxSettings(scene, headerIndex, len(commands))) + if len(scene.exitList) > 0: + commands.append(cmdExitList(scene, headerIndex, len(commands))) + commands.append(cmdLightSettingList(scene, headerIndex, len(commands))) + if scene.writeCutscene: + commands.append(cmdCutsceneData(scene, headerIndex, len(commands))) + commands.append(cmdEndMarker(scene.sceneName(), headerIndex, len(commands))) + + data = CData() + + # data.header = ''.join([command.header for command in commands]) +'\n' + data.header = ( + "extern SCmdBase " + + scene.sceneName() + + "_header" + + format(headerIndex, "02") + + "[];\n" + ) + + data.source = ( + "SCmdBase " + + scene.sceneName() + + "_header" + + format(headerIndex, "02") + + "[] = {\n" + ) + data.source += "".join([command.source for command in commands]) + data.source += "};\n\n" + + return data + def ootStartPositionListToC(scene, headerIndex): - data = CData() - data.header = "extern ActorEntry " + scene.startPositionsName(headerIndex) + "[];\n" - data.source = "ActorEntry " + scene.startPositionsName(headerIndex) + "[] = {\n" - for i in range(len(scene.startPositions)): - data.source += '\t' + ootActorToC(scene.startPositions[i]) - data.source += '};\n\n' - return data + data = CData() + data.header = "extern ActorEntry " + scene.startPositionsName(headerIndex) + "[];\n" + data.source = "ActorEntry " + scene.startPositionsName(headerIndex) + "[] = {\n" + for i in range(len(scene.startPositions)): + data.source += "\t" + ootActorToC(scene.startPositions[i]) + data.source += "};\n\n" + return data + def ootTransitionActorToC(transActor): - return '{ ' + str(transActor.frontRoom) + ', ' + \ - str(transActor.frontCam) + ', ' + \ - str(transActor.backRoom) + ', ' + \ - str(transActor.backCam) + ', ' + \ - str(transActor.actorID) + ', ' + \ - str(int(round(transActor.position[0]))) + ', ' + \ - str(int(round(transActor.position[1]))) + ', ' + \ - str(int(round(transActor.position[2]))) + ', ' + \ - str(int(round(transActor.rotationY))) + ', ' + \ - str(transActor.actorParam) + ' },\n' + return ( + "{ " + + str(transActor.frontRoom) + + ", " + + str(transActor.frontCam) + + ", " + + str(transActor.backRoom) + + ", " + + str(transActor.backCam) + + ", " + + str(transActor.actorID) + + ", " + + str(int(round(transActor.position[0]))) + + ", " + + str(int(round(transActor.position[1]))) + + ", " + + str(int(round(transActor.position[2]))) + + ", " + + str(int(round(transActor.rotationY))) + + ", " + + str(transActor.actorParam) + + " },\n" + ) + def ootTransitionActorListToC(scene, headerIndex): - data = CData() - data.header = "extern TransitionActorEntry " + scene.transitionActorListName(headerIndex) + "[" + str(len(scene.transitionActorList)) + "];\n" - data.source = "TransitionActorEntry " + scene.transitionActorListName(headerIndex) + "[" + str(len(scene.transitionActorList)) + "] = {\n" - for transActor in scene.transitionActorList: - data.source += '\t' + ootTransitionActorToC(transActor) - data.source += '};\n\n' - return data + data = CData() + data.header = ( + "extern TransitionActorEntry " + + scene.transitionActorListName(headerIndex) + + "[" + + str(len(scene.transitionActorList)) + + "];\n" + ) + data.source = ( + "TransitionActorEntry " + + scene.transitionActorListName(headerIndex) + + "[" + + str(len(scene.transitionActorList)) + + "] = {\n" + ) + for transActor in scene.transitionActorList: + data.source += "\t" + ootTransitionActorToC(transActor) + data.source += "};\n\n" + return data + def ootRoomExternToC(room): - return "extern u8 _" + room.roomName() + "SegmentRomStart[];\n" + \ - "extern u8 _" + room.roomName() + "SegmentRomEnd[];\n" + return ( + "extern u8 _" + + room.roomName() + + "SegmentRomStart[];\n" + + "extern u8 _" + + room.roomName() + + "SegmentRomEnd[];\n" + ) + def ootRoomListEntryToC(room): - return "{ (u32)_" + room.roomName() + "SegmentRomStart, (u32)_" + room.roomName() + "SegmentRomEnd },\n" + return ( + "{ (u32)_" + + room.roomName() + + "SegmentRomStart, (u32)_" + + room.roomName() + + "SegmentRomEnd },\n" + ) + def ootRoomListHeaderToC(scene): - data = CData() + data = CData() - data.header += "extern RomFile " + scene.roomListName() + "[];\n" + data.header += "extern RomFile " + scene.roomListName() + "[];\n" - if scene.write_dummy_room_list: - data.source += "// Dummy room list\n" - data.source += "RomFile " + scene.roomListName() + "[] = {\n" - data.source += "\t{0, 0},\n" * len(scene.rooms) - data.source += "};\n\n" - else: - # Write externs for rom segments - for i in range(len(scene.rooms)): - data.source += ootRoomExternToC(scene.rooms[i]) - data.source += "\n" + if scene.write_dummy_room_list: + data.source += "// Dummy room list\n" + data.source += "RomFile " + scene.roomListName() + "[] = {\n" + data.source += "\t{0, 0},\n" * len(scene.rooms) + data.source += "};\n\n" + else: + # Write externs for rom segments + for i in range(len(scene.rooms)): + data.source += ootRoomExternToC(scene.rooms[i]) + data.source += "\n" - data.source += "RomFile " + scene.roomListName() + "[] = {\n" - - for i in range(len(scene.rooms)): - data.source += '\t' + ootRoomListEntryToC(scene.rooms[i]) - data.source += '};\n\n' + data.source += "RomFile " + scene.roomListName() + "[] = {\n" + + for i in range(len(scene.rooms)): + data.source += "\t" + ootRoomListEntryToC(scene.rooms[i]) + data.source += "};\n\n" + + return data - return data def ootEntranceToC(entrance): - return "{ " + str(entrance.startPositionIndex) + ', ' + str(entrance.roomIndex) + ' },\n' + return ( + "{ " + + str(entrance.startPositionIndex) + + ", " + + str(entrance.roomIndex) + + " },\n" + ) + def ootEntranceListToC(scene, headerIndex): - data = CData() - data.header = "extern EntranceEntry " + scene.entranceListName(headerIndex) + "[];\n" - data.source = "EntranceEntry " + scene.entranceListName(headerIndex) + "[] = {\n" - for entrance in scene.entranceList: - data.source += '\t' + ootEntranceToC(entrance) - data.source += '};\n\n' - return data + data = CData() + data.header = ( + "extern EntranceEntry " + scene.entranceListName(headerIndex) + "[];\n" + ) + data.source = "EntranceEntry " + scene.entranceListName(headerIndex) + "[] = {\n" + for entrance in scene.entranceList: + data.source += "\t" + ootEntranceToC(entrance) + data.source += "};\n\n" + return data + def ootExitListToC(scene, headerIndex): - data = CData() - data.header = "extern u16 " + scene.exitListName(headerIndex) + "[" + str(len(scene.exitList)) + "];\n" - data.source = "u16 " + scene.exitListName(headerIndex) + "[" + str(len(scene.exitList)) + "] = {\n" - for exitEntry in scene.exitList: - data.source += '\t' + str(exitEntry.index) + ',\n' - data.source += '};\n\n' - return data + data = CData() + data.header = ( + "extern u16 " + + scene.exitListName(headerIndex) + + "[" + + str(len(scene.exitList)) + + "];\n" + ) + data.source = ( + "u16 " + + scene.exitListName(headerIndex) + + "[" + + str(len(scene.exitList)) + + "] = {\n" + ) + for exitEntry in scene.exitList: + data.source += "\t" + str(exitEntry.index) + ",\n" + data.source += "};\n\n" + return data + def ootVectorToC(vector): - return "0x{:02X}, 0x{:02X}, 0x{:02X}".format(vector[0], vector[1], vector[2]) + return "0x{:02X}, 0x{:02X}, 0x{:02X}".format(vector[0], vector[1], vector[2]) + def ootLightToC(light): - return "\t{ " + \ - ootVectorToC(light.ambient) + ', ' +\ - ootVectorToC(light.diffuseDir0) + ', ' +\ - ootVectorToC(light.diffuse0) + ', ' +\ - ootVectorToC(light.diffuseDir1) + ', ' +\ - ootVectorToC(light.diffuse1) + ', ' +\ - ootVectorToC(light.fogColor) + ', ' +\ - light.getBlendFogShort() + ', ' +\ - "0x{:04X}".format(light.fogFar) + ' },\n' + return ( + "\t{ " + + ootVectorToC(light.ambient) + + ", " + + ootVectorToC(light.diffuseDir0) + + ", " + + ootVectorToC(light.diffuse0) + + ", " + + ootVectorToC(light.diffuseDir1) + + ", " + + ootVectorToC(light.diffuse1) + + ", " + + ootVectorToC(light.fogColor) + + ", " + + light.getBlendFogShort() + + ", " + + "0x{:04X}".format(light.fogFar) + + " },\n" + ) + def ootLightSettingsToC(scene, useIndoorLighting, headerIndex): - data = CData() - lightArraySize = len(scene.lights) - data.header = "extern LightSettings " + scene.lightListName(headerIndex) + "[" + str(lightArraySize) + "];\n" - data.source = "LightSettings " + scene.lightListName(headerIndex) + "[" + str(lightArraySize) + "] = {\n" - for light in scene.lights: - data.source += ootLightToC(light) - data.source += '};\n\n' - return data + data = CData() + lightArraySize = len(scene.lights) + data.header = ( + "extern LightSettings " + + scene.lightListName(headerIndex) + + "[" + + str(lightArraySize) + + "];\n" + ) + data.source = ( + "LightSettings " + + scene.lightListName(headerIndex) + + "[" + + str(lightArraySize) + + "] = {\n" + ) + for light in scene.lights: + data.source += ootLightToC(light) + data.source += "};\n\n" + return data + def ootPathToC(path): - data = CData() - data.header = "extern Vec3s " + path.pathName() + '[];\n' - data.source = "Vec3s " + path.pathName() + '[] = {\n' - for point in path.points: - data.source += '\t' + "{ " +\ - str(int(round(point[0]))) + ', ' +\ - str(int(round(point[1]))) + ', ' +\ - str(int(round(point[2]))) + ' },\n' - data.source += '};\n\n' - - return data - + data = CData() + data.header = "extern Vec3s " + path.pathName() + "[];\n" + data.source = "Vec3s " + path.pathName() + "[] = {\n" + for point in path.points: + data.source += ( + "\t" + + "{ " + + str(int(round(point[0]))) + + ", " + + str(int(round(point[1]))) + + ", " + + str(int(round(point[2]))) + + " },\n" + ) + data.source += "};\n\n" + + return data + + def ootPathListToC(scene): - data = CData() - data.header = "extern Path " + scene.pathListName() + "[" + str(len(scene.pathList)) + "];\n" - data.source = "Path " + scene.pathListName() + "[" + str(len(scene.pathList)) + "] = {\n" - pathData = CData() - for i in range(len(scene.pathList)): - path = scene.pathList[i] - data.source += '\t' + "{ " + str(len(path.points)) + ', (u32)' + path.pathName() + " },\n" - pathData.append(ootPathToC(path)) - data.source += '};\n\n' - pathData.append(data) - return pathData + data = CData() + data.header = ( + "extern Path " + scene.pathListName() + "[" + str(len(scene.pathList)) + "];\n" + ) + data.source = ( + "Path " + scene.pathListName() + "[" + str(len(scene.pathList)) + "] = {\n" + ) + pathData = CData() + for i in range(len(scene.pathList)): + path = scene.pathList[i] + data.source += ( + "\t" + "{ " + str(len(path.points)) + ", (u32)" + path.pathName() + " },\n" + ) + pathData.append(ootPathToC(path)) + data.source += "};\n\n" + pathData.append(data) + return pathData + def ootSceneMeshToC(scene, textureExportSettings): - exportData = scene.model.to_c(textureExportSettings, OOTGfxFormatter(ScrollMethod.Vertex)) - return exportData.all() + exportData = scene.model.to_c( + textureExportSettings, OOTGfxFormatter(ScrollMethod.Vertex) + ) + return exportData.all() + def ootSceneIncludes(scene): - data = CData() - data.source += '#include "ultra64.h"\n' - data.source += '#include "z64.h"\n' - data.source += '#include "macros.h"\n' - data.source += '#include "' + scene.sceneName() + '.h"\n\n' - data.source += '#include "segment_symbols.h"\n' - data.source += '#include "command_macros_base.h"\n' - data.source += '#include "z64cutscene_commands.h"\n' - data.source += '#include "variables.h"\n' - data.source += '\n' - return data + data = CData() + data.source += '#include "ultra64.h"\n' + data.source += '#include "z64.h"\n' + data.source += '#include "macros.h"\n' + data.source += '#include "' + scene.sceneName() + '.h"\n\n' + data.source += '#include "segment_symbols.h"\n' + data.source += '#include "command_macros_base.h"\n' + data.source += '#include "z64cutscene_commands.h"\n' + data.source += '#include "variables.h"\n' + data.source += "\n" + return data + def ootAlternateSceneMainToC(scene): - altHeader = CData() - altData = CData() - - altHeader.header = "extern SCmdBase* " + scene.alternateHeadersName() + "[];\n" - altHeader.source = "SCmdBase* " + scene.alternateHeadersName() + "[] = {\n" - - if scene.childNightHeader is not None: - altHeader.source += "\t" + scene.sceneName() + "_header" + format(1, '02') + ",\n" - altData.append(ootSceneMainToC(scene.childNightHeader, 1)) - else: - altHeader.source += "\t0,\n" - - if scene.adultDayHeader is not None: - altHeader.source += "\t" + scene.sceneName() + "_header" + format(2, '02') + ",\n" - altData.append(ootSceneMainToC(scene.adultDayHeader, 2)) - else: - altHeader.source += "\t0,\n" - - if scene.adultNightHeader is not None: - altHeader.source += "\t" + scene.sceneName() + "_header" + format(3, '02') + ",\n" - altData.append(ootSceneMainToC(scene.adultNightHeader, 3)) - else: - altHeader.source += "\t0,\n" - - for i in range(len(scene.cutsceneHeaders)): - altHeader.source += "\t" + scene.sceneName() + "_header" + format(i + 4, '02') + ",\n" - altData.append(ootSceneMainToC(scene.cutsceneHeaders[i], i + 4)) - - altHeader.source += '};\n\n' - - return altHeader, altData + altHeader = CData() + altData = CData() + + altHeader.header = "extern SCmdBase* " + scene.alternateHeadersName() + "[];\n" + altHeader.source = "SCmdBase* " + scene.alternateHeadersName() + "[] = {\n" + + if scene.childNightHeader is not None: + altHeader.source += ( + "\t" + scene.sceneName() + "_header" + format(1, "02") + ",\n" + ) + altData.append(ootSceneMainToC(scene.childNightHeader, 1)) + else: + altHeader.source += "\t0,\n" + + if scene.adultDayHeader is not None: + altHeader.source += ( + "\t" + scene.sceneName() + "_header" + format(2, "02") + ",\n" + ) + altData.append(ootSceneMainToC(scene.adultDayHeader, 2)) + else: + altHeader.source += "\t0,\n" + + if scene.adultNightHeader is not None: + altHeader.source += ( + "\t" + scene.sceneName() + "_header" + format(3, "02") + ",\n" + ) + altData.append(ootSceneMainToC(scene.adultNightHeader, 3)) + else: + altHeader.source += "\t0,\n" + + for i in range(len(scene.cutsceneHeaders)): + altHeader.source += ( + "\t" + scene.sceneName() + "_header" + format(i + 4, "02") + ",\n" + ) + altData.append(ootSceneMainToC(scene.cutsceneHeaders[i], i + 4)) + + altHeader.source += "};\n\n" + + return altHeader, altData + def ootSceneMainToC(scene, headerIndex): - sceneMainC = CData() - - if headerIndex == 0: - # Check if this is the first time the function is being called, we do not want to write this data multiple times - roomHeaderData = ootRoomListHeaderToC(scene) - if len(scene.pathList) > 0: - pathData = ootPathListToC(scene) - else: - pathData = CData() - else: - # The function has already been called (and is being called for another scene header), so we can make this data be a blank string - roomHeaderData = CData() - pathData = CData() - - if scene.hasAlternateHeaders(): - # Gets the alternate data for the scene's main c file - altHeader, altData = ootAlternateSceneMainToC(scene) - else: - # Since the scene does not use alternate headers, this data can just be a blank string - altHeader = CData() - altData = CData() - - # Write the scene header - sceneMainC.append(ootSceneCommandsToC(scene, headerIndex)) - - # Write alternate scene headers - sceneMainC.append(altHeader) - - # Write the spawn position list data - if len(scene.startPositions) > 0: - sceneMainC.append(ootStartPositionListToC(scene, headerIndex)) - - # Write the transition actor list data - if len(scene.transitionActorList) > 0: - sceneMainC.append(ootTransitionActorListToC(scene, headerIndex)) - - # Write the room segment list - sceneMainC.append(roomHeaderData) - - # Write the entrance list - if len(scene.entranceList) > 0: - sceneMainC.append(ootEntranceListToC(scene, headerIndex)) - - # Write the exit list - if len(scene.exitList) > 0: - sceneMainC.append(ootExitListToC(scene, headerIndex)) - - # Write the light data - if len(scene.lights) > 0: - sceneMainC.append(ootLightSettingsToC(scene, scene.skyboxLighting == '0x01', headerIndex)) - - # Write the path data, if used - sceneMainC.append(pathData) - - # Write the data from alternate headers - sceneMainC.append(altData) - - return sceneMainC + sceneMainC = CData() + + if headerIndex == 0: + # Check if this is the first time the function is being called, we do not want to write this data multiple times + roomHeaderData = ootRoomListHeaderToC(scene) + if len(scene.pathList) > 0: + pathData = ootPathListToC(scene) + else: + pathData = CData() + else: + # The function has already been called (and is being called for another scene header), so we can make this data be a blank string + roomHeaderData = CData() + pathData = CData() + + if scene.hasAlternateHeaders(): + # Gets the alternate data for the scene's main c file + altHeader, altData = ootAlternateSceneMainToC(scene) + else: + # Since the scene does not use alternate headers, this data can just be a blank string + altHeader = CData() + altData = CData() + + # Write the scene header + sceneMainC.append(ootSceneCommandsToC(scene, headerIndex)) + + # Write alternate scene headers + sceneMainC.append(altHeader) + + # Write the spawn position list data + if len(scene.startPositions) > 0: + sceneMainC.append(ootStartPositionListToC(scene, headerIndex)) + + # Write the transition actor list data + if len(scene.transitionActorList) > 0: + sceneMainC.append(ootTransitionActorListToC(scene, headerIndex)) + + # Write the room segment list + sceneMainC.append(roomHeaderData) + + # Write the entrance list + if len(scene.entranceList) > 0: + sceneMainC.append(ootEntranceListToC(scene, headerIndex)) + + # Write the exit list + if len(scene.exitList) > 0: + sceneMainC.append(ootExitListToC(scene, headerIndex)) + + # Write the light data + if len(scene.lights) > 0: + sceneMainC.append( + ootLightSettingsToC(scene, scene.skyboxLighting == "0x01", headerIndex) + ) + + # Write the path data, if used + sceneMainC.append(pathData) + + # Write the data from alternate headers + sceneMainC.append(altData) + + return sceneMainC + # Writes the textures and material setup displaylists that are shared between multiple rooms (is written to the scene) def ootSceneTexturesToC(scene, textureExportSettings): - sceneTextures = CData() - sceneTextures.append(ootSceneMeshToC(scene, textureExportSettings)) - return sceneTextures + sceneTextures = CData() + sceneTextures.append(ootSceneMeshToC(scene, textureExportSettings)) + return sceneTextures + # Writes the collision data for a scene def ootSceneCollisionToC(scene): - sceneCollisionC = CData() - sceneCollisionC.append(ootCollisionToC(scene.collision)) - return sceneCollisionC + sceneCollisionC = CData() + sceneCollisionC.append(ootCollisionToC(scene.collision)) + return sceneCollisionC + # scene is either None or an OOTScene. This can either be the main scene itself, # or one of the alternate / cutscene headers. def ootGetCutsceneC(scene, headerIndex): - if scene is not None and scene.writeCutscene: - if scene.csWriteType == 'Embedded': - return [ootCutsceneDataToC(scene, scene.cutsceneDataName(headerIndex))] - elif scene.csWriteType == 'Object': - return [ootCutsceneDataToC(scene.csWriteObject, scene.csWriteObject.name)] - return [] + if scene is not None and scene.writeCutscene: + if scene.csWriteType == "Embedded": + return [ootCutsceneDataToC(scene, scene.cutsceneDataName(headerIndex))] + elif scene.csWriteType == "Object": + return [ootCutsceneDataToC(scene.csWriteObject, scene.csWriteObject.name)] + return [] + def ootSceneCutscenesToC(scene): - sceneCutscenes = ootGetCutsceneC(scene, 0) - sceneCutscenes.extend(ootGetCutsceneC(scene.childNightHeader, 1)) - sceneCutscenes.extend(ootGetCutsceneC(scene.adultDayHeader, 2)) - sceneCutscenes.extend(ootGetCutsceneC(scene.adultNightHeader, 3)) - - for i in range(len(scene.cutsceneHeaders)): - sceneCutscenes.extend(ootGetCutsceneC(scene.cutsceneHeaders[i], i + 4)) - for ec in scene.extraCutscenes: - sceneCutscenes.append(ootCutsceneDataToC(ec, ec.name)) - - return sceneCutscenes + sceneCutscenes = ootGetCutsceneC(scene, 0) + sceneCutscenes.extend(ootGetCutsceneC(scene.childNightHeader, 1)) + sceneCutscenes.extend(ootGetCutsceneC(scene.adultDayHeader, 2)) + sceneCutscenes.extend(ootGetCutsceneC(scene.adultNightHeader, 3)) + + for i in range(len(scene.cutsceneHeaders)): + sceneCutscenes.extend(ootGetCutsceneC(scene.cutsceneHeaders[i], i + 4)) + for ec in scene.extraCutscenes: + sceneCutscenes.append(ootCutsceneDataToC(ec, ec.name)) + + return sceneCutscenes + def ootLevelToC(scene, textureExportSettings): - levelC = OOTLevelC() - - levelC.sceneMainC = ootSceneMainToC(scene, 0) - levelC.sceneTexturesC = ootSceneTexturesToC(scene, textureExportSettings) - levelC.sceneCollisionC = ootSceneCollisionToC(scene) - levelC.sceneCutscenesC = ootSceneCutscenesToC(scene) - - for i in range(len(scene.rooms)): - levelC.roomMainC[scene.rooms[i].roomName()] = ootRoomMainToC(scene, scene.rooms[i], 0) - meshHeader, meshData = ootRoomMeshToC(scene.rooms[i], textureExportSettings) - levelC.roomMeshInfoC[scene.rooms[i].roomName()] = meshHeader - levelC.roomMeshC[scene.rooms[i].roomName()] = meshData - return levelC + levelC = OOTLevelC() + + levelC.sceneMainC = ootSceneMainToC(scene, 0) + levelC.sceneTexturesC = ootSceneTexturesToC(scene, textureExportSettings) + levelC.sceneCollisionC = ootSceneCollisionToC(scene) + levelC.sceneCutscenesC = ootSceneCutscenesToC(scene) + + for i in range(len(scene.rooms)): + levelC.roomMainC[scene.rooms[i].roomName()] = ootRoomMainToC( + scene, scene.rooms[i], 0 + ) + meshHeader, meshData = ootRoomMeshToC(scene.rooms[i], textureExportSettings) + levelC.roomMeshInfoC[scene.rooms[i].roomName()] = meshHeader + levelC.roomMeshC[scene.rooms[i].roomName()] = meshData + return levelC + class OOTLevelC: - def sceneTexturesIsUsed(self): - return len(self.sceneTexturesC.source) > 0 - - def sceneCutscenesIsUsed(self): - return len(self.sceneCutscenesC) > 0 - - def __init__(self): - # Main header file for both the scene and room(s) - self.header = CData() - # Files for the scene segment - self.sceneMainC = CData() - self.sceneTexturesC = CData() - self.sceneCollisionC = CData() - self.sceneCutscenesC = [] - # Files for room segments - self.roomMainC = {} - self.roomMeshInfoC = {} - self.roomMeshC = {} + def sceneTexturesIsUsed(self): + return len(self.sceneTexturesC.source) > 0 + + def sceneCutscenesIsUsed(self): + return len(self.sceneCutscenesC) > 0 + + def __init__(self): + # Main header file for both the scene and room(s) + self.header = CData() + # Files for the scene segment + self.sceneMainC = CData() + self.sceneTexturesC = CData() + self.sceneCollisionC = CData() + self.sceneCutscenesC = [] + # Files for room segments + self.roomMainC = {} + self.roomMeshInfoC = {} + self.roomMeshC = {} diff --git a/fast64_internal/oot/c_writer/oot_scene_folder.py b/fast64_internal/oot/c_writer/oot_scene_folder.py index 2a9d1ddb2..5fedaa733 100644 --- a/fast64_internal/oot/c_writer/oot_scene_folder.py +++ b/fast64_internal/oot/c_writer/oot_scene_folder.py @@ -2,26 +2,28 @@ from ...utility import * from ..oot_utility import * + def modifySceneFiles(scene, exportInfo): - exportPath = exportInfo.exportPath - if exportInfo.customSubPath is not None: - sceneDir = exportInfo.customSubPath + exportInfo.name - else: - sceneDir = getSceneDirFromLevelName(scene.name) - scenePath = os.path.join(exportPath, sceneDir) - for filename in os.listdir(scenePath): - filepath = os.path.join(scenePath, filename) - if os.path.isfile(filepath): - match = re.match(scene.name + "\_room\_(\d+)\.[ch]", filename) - if match is not None and int(match.group(1)) >= len(scene.rooms): - os.remove(filepath) + exportPath = exportInfo.exportPath + if exportInfo.customSubPath is not None: + sceneDir = exportInfo.customSubPath + exportInfo.name + else: + sceneDir = getSceneDirFromLevelName(scene.name) + scenePath = os.path.join(exportPath, sceneDir) + for filename in os.listdir(scenePath): + filepath = os.path.join(scenePath, filename) + if os.path.isfile(filepath): + match = re.match(scene.name + "\_room\_(\d+)\.[ch]", filename) + if match is not None and int(match.group(1)) >= len(scene.rooms): + os.remove(filepath) + def deleteSceneFiles(exportInfo): - exportPath = exportInfo.exportPath - if exportInfo.customSubPath is not None: - sceneDir = exportInfo.customSubPath + exportInfo.name - else: - sceneDir = getSceneDirFromLevelName(exportInfo.name) - scenePath = os.path.join(exportPath, sceneDir) - if os.path.exists(scenePath): - shutil.rmtree(scenePath) + exportPath = exportInfo.exportPath + if exportInfo.customSubPath is not None: + sceneDir = exportInfo.customSubPath + exportInfo.name + else: + sceneDir = getSceneDirFromLevelName(exportInfo.name) + scenePath = os.path.join(exportPath, sceneDir) + if os.path.exists(scenePath): + shutil.rmtree(scenePath) diff --git a/fast64_internal/oot/c_writer/oot_scene_id_c.py b/fast64_internal/oot/c_writer/oot_scene_id_c.py index 4ec8d135f..628210b00 100644 --- a/fast64_internal/oot/c_writer/oot_scene_id_c.py +++ b/fast64_internal/oot/c_writer/oot_scene_id_c.py @@ -1,56 +1,65 @@ import os, re from ...utility import * + def getSceneIDEntriesBySceneName(sceneIDs, sceneName): - return [entry for entry in sceneIDs if \ - entry.name[6:] == sceneName.upper()] + return [entry for entry in sceneIDs if entry.name[6:] == sceneName.upper()] + def readSceneIDs(exportPath): - fileData = readFile(os.path.join(exportPath, 'include/z64scene.h')) + fileData = readFile(os.path.join(exportPath, "include/z64scene.h")) - matchResult = re.search('typedef\s*enum\s*\{([^\}]*)\}\s*SceneID\s*;', fileData, re.DOTALL) - if matchResult is None: - raise PluginError("z64scene.h does not have the SceneID enum in it.") - sceneIDs = parseSceneIDs(matchResult.group(1)) + matchResult = re.search( + "typedef\s*enum\s*\{([^\}]*)\}\s*SceneID\s*;", fileData, re.DOTALL + ) + if matchResult is None: + raise PluginError("z64scene.h does not have the SceneID enum in it.") + sceneIDs = parseSceneIDs(matchResult.group(1)) + + return sceneIDs, fileData, matchResult.start(1), matchResult.end(1) - return sceneIDs, fileData, matchResult.start(1), matchResult.end(1) def parseSceneIDs(data): - sceneIDs = [] - for match in re.finditer('([^\s\/]*)\s*,', data): - name = match.group(1).strip() - if name != "SCENE_ID_MAX": - sceneIDs.append(name) + sceneIDs = [] + for match in re.finditer("([^\s\/]*)\s*,", data): + name = match.group(1).strip() + if name != "SCENE_ID_MAX": + sceneIDs.append(name) + + return sceneIDs - return sceneIDs def sceneIDsToString(sceneIDs): - data = '\n' - index = 0 - for entry in sceneIDs: - data += "\t/* " + format(index, '#04x') + " */ " + entry + ',\n' - index += 1 + data = "\n" + index = 0 + for entry in sceneIDs: + data += "\t/* " + format(index, "#04x") + " */ " + entry + ",\n" + index += 1 + + data += "\t/* " + format(index, "#04x") + " */ SCENE_ID_MAX\n" + return data - data += "\t/* " + format(index, '#04x') + " */ SCENE_ID_MAX\n" - return data def writeSceneIDs(sceneIDs, fileData, start, end, exportPath): - sceneIDsData = sceneIDsToString(sceneIDs) - newFileData = fileData[:start] + sceneIDsData + fileData[end:] + sceneIDsData = sceneIDsToString(sceneIDs) + newFileData = fileData[:start] + sceneIDsData + fileData[end:] + + if newFileData != fileData: + writeFile(os.path.join(exportPath, "include/z64scene.h"), newFileData) - if newFileData != fileData: - writeFile(os.path.join(exportPath, 'include/z64scene.h'), newFileData) def modifySceneIDs(scene, exportInfo): - exportPath = exportInfo.exportPath - sceneID = 'SCENE_' + (scene.name.upper() if scene is not None else exportInfo.name.upper()) - sceneIDs, fileData, start, end = readSceneIDs(exportPath) - - if scene is not None: - if sceneID not in sceneIDs: - sceneIDs.append(sceneID) - else: - if sceneID in sceneIDs: - sceneIDs.remove(sceneID) - - writeSceneIDs(sceneIDs, fileData, start, end, exportPath) \ No newline at end of file + exportPath = exportInfo.exportPath + sceneID = "SCENE_" + ( + scene.name.upper() if scene is not None else exportInfo.name.upper() + ) + sceneIDs, fileData, start, end = readSceneIDs(exportPath) + + if scene is not None: + if sceneID not in sceneIDs: + sceneIDs.append(sceneID) + else: + if sceneID in sceneIDs: + sceneIDs.remove(sceneID) + + writeSceneIDs(sceneIDs, fileData, start, end, exportPath) diff --git a/fast64_internal/oot/c_writer/oot_scene_table_c.py b/fast64_internal/oot/c_writer/oot_scene_table_c.py index b479dd0a2..067dd566f 100644 --- a/fast64_internal/oot/c_writer/oot_scene_table_c.py +++ b/fast64_internal/oot/c_writer/oot_scene_table_c.py @@ -1,75 +1,126 @@ import os, re from ...utility import * + class SceneTableEntry: - def __init__(self, sceneType, name, title, unk10, config, unk12): - self.sceneType = sceneType - self.name = name - self.title = title - self.unk10 = unk10 - self.config = config - self.unk12 = unk12 - - def toC(self): - return "\t" + self.sceneType + "(" + self.name + ", " + \ - ((self.title + ", ") if self.title is not None else "") +\ - self.unk10 + ", " + self.config + ", " + self.unk12 + "),\n" + def __init__(self, sceneType, name, title, unk10, config, unk12): + self.sceneType = sceneType + self.name = name + self.title = title + self.unk10 = unk10 + self.config = config + self.unk12 = unk12 + + def toC(self): + return ( + "\t" + + self.sceneType + + "(" + + self.name + + ", " + + ((self.title + ", ") if self.title is not None else "") + + self.unk10 + + ", " + + self.config + + ", " + + self.unk12 + + "),\n" + ) + def getSceneTableEntryBySceneName(sceneTable, sceneName): - for entry in sceneTable: - if entry.name[:-6] == sceneName: - return entry - return None + for entry in sceneTable: + if entry.name[:-6] == sceneName: + return entry + return None + def readSceneTable(exportPath): - fileData = readFile(os.path.join(exportPath, 'src/code/z_scene_table.c')) + fileData = readFile(os.path.join(exportPath, "src/code/z_scene_table.c")) + + matchResult = re.search( + "SceneTableEntry\s*gSceneTable\[\]\s*=\s*\{([^\}]*)\}", fileData, re.DOTALL + ) + if matchResult is None: + raise PluginError("z_scene_table.c does not have gSceneTable in it.") + sceneTable = parseSceneTableData(matchResult.group(1)) - matchResult = re.search('SceneTableEntry\s*gSceneTable\[\]\s*=\s*\{([^\}]*)\}', fileData, re.DOTALL) - if matchResult is None: - raise PluginError("z_scene_table.c does not have gSceneTable in it.") - sceneTable = parseSceneTableData(matchResult.group(1)) + return sceneTable, fileData, matchResult.start(0), matchResult.end(0) - return sceneTable, fileData, matchResult.start(0), matchResult.end(0) def parseSceneTableData(data): - table = [] - for match in re.finditer('([^,]*)\s*\(([^,]*),\s*([^,]*),\s*([^,]*),\s*([^,]*)(,\s*([^,]*))?\)\s*,', data): - name = match.group(2) - sceneType = match.group(1).strip() - if sceneType == "UNTITLED_SCENE": - table.append(SceneTableEntry(sceneType, name, None, match.group(3), match.group(4), match.group(5))) - elif sceneType == "TITLED_SCENE": - table.append(SceneTableEntry(sceneType, name, match.group(3), match.group(4), match.group(5), match.group(7))) - else: - raise PluginError("Unhandled scene entry type: " + str(sceneType)) - return table + table = [] + for match in re.finditer( + "([^,]*)\s*\(([^,]*),\s*([^,]*),\s*([^,]*),\s*([^,]*)(,\s*([^,]*))?\)\s*,", data + ): + name = match.group(2) + sceneType = match.group(1).strip() + if sceneType == "UNTITLED_SCENE": + table.append( + SceneTableEntry( + sceneType, + name, + None, + match.group(3), + match.group(4), + match.group(5), + ) + ) + elif sceneType == "TITLED_SCENE": + table.append( + SceneTableEntry( + sceneType, + name, + match.group(3), + match.group(4), + match.group(5), + match.group(7), + ) + ) + else: + raise PluginError("Unhandled scene entry type: " + str(sceneType)) + return table + def sceneTableToString(sceneTable): - data = 'SceneTableEntry gSceneTable[] = {\n' - for entry in sceneTable: - data += entry.toC() - data += '}' - return data + data = "SceneTableEntry gSceneTable[] = {\n" + for entry in sceneTable: + data += entry.toC() + data += "}" + return data + def writeSceneTable(sceneTable, fileData, start, end, exportPath): - sceneTableData = sceneTableToString(sceneTable) - newFileData = fileData[:start] + sceneTableData + fileData[end:] + sceneTableData = sceneTableToString(sceneTable) + newFileData = fileData[:start] + sceneTableData + fileData[end:] + + if newFileData != fileData: + writeFile(os.path.join(exportPath, "src/code/z_scene_table.c"), newFileData) - if newFileData != fileData: - writeFile(os.path.join(exportPath, 'src/code/z_scene_table.c'), newFileData) def modifySceneTable(scene, exportInfo): - exportPath = exportInfo.exportPath - sceneTable, sceneFileData, start, end = readSceneTable(exportPath) - entry = getSceneTableEntryBySceneName(sceneTable, scene.name if scene is not None else exportInfo.name) - - if scene is not None: - if entry is None: - sceneTable.append(SceneTableEntry("UNTITLED_SCENE", scene.name + "_scene", None, '0', str(scene.sceneTableEntry.drawConfig), '0')) - else: - entry.sceneType = entry.sceneType - entry.config = str(scene.sceneTableEntry.drawConfig) - else: - if entry is not None: - sceneTable.remove(entry) - writeSceneTable(sceneTable, sceneFileData, start, end, exportPath) \ No newline at end of file + exportPath = exportInfo.exportPath + sceneTable, sceneFileData, start, end = readSceneTable(exportPath) + entry = getSceneTableEntryBySceneName( + sceneTable, scene.name if scene is not None else exportInfo.name + ) + + if scene is not None: + if entry is None: + sceneTable.append( + SceneTableEntry( + "UNTITLED_SCENE", + scene.name + "_scene", + None, + "0", + str(scene.sceneTableEntry.drawConfig), + "0", + ) + ) + else: + entry.sceneType = entry.sceneType + entry.config = str(scene.sceneTableEntry.drawConfig) + else: + if entry is not None: + sceneTable.remove(entry) + writeSceneTable(sceneTable, sceneFileData, start, end, exportPath) diff --git a/fast64_internal/oot/c_writer/oot_segment_symbols_c.py b/fast64_internal/oot/c_writer/oot_segment_symbols_c.py index 1d077c2e1..85aa43d7a 100644 --- a/fast64_internal/oot/c_writer/oot_segment_symbols_c.py +++ b/fast64_internal/oot/c_writer/oot_segment_symbols_c.py @@ -1,65 +1,84 @@ import os, re from ...utility import * -class SegmentSymbolEntry(): - def __init__(self, segmentType, name): - self.segmentType = segmentType - self.name = name - def toC(self): - return self.segmentType + "(" + self.name + ")\n" +class SegmentSymbolEntry: + def __init__(self, segmentType, name): + self.segmentType = segmentType + self.name = name + + def toC(self): + return self.segmentType + "(" + self.name + ")\n" + def getSegmentSymbolEntriesBySceneName(segmentSymbols, sceneName): - return [entry for entry in segmentSymbols if \ - re.match(sceneName + "\_scene", entry.name) or re.match(sceneName + "\_room\_(\d)+", entry.name)] + return [ + entry + for entry in segmentSymbols + if re.match(sceneName + "\_scene", entry.name) + or re.match(sceneName + "\_room\_(\d)+", entry.name) + ] + def readSegmentSymbols(exportPath): - fileData = readFile(os.path.join(exportPath, 'include/segment_symbols.h')) + fileData = readFile(os.path.join(exportPath, "include/segment_symbols.h")) + + matchResult = re.search( + "(DECLARE_SEGMENT\s*\(\s*boot\s*\).*)\#endif", fileData, re.DOTALL + ) + if matchResult is None: + raise PluginError( + "segment_symbols.h does not have DECLARE_SEGMENT(boot) in it." + ) + segmentSymbols = parseSegmentSymbols(matchResult.group(1)) - matchResult = re.search('(DECLARE_SEGMENT\s*\(\s*boot\s*\).*)\#endif', fileData, re.DOTALL) - if matchResult is None: - raise PluginError("segment_symbols.h does not have DECLARE_SEGMENT(boot) in it.") - segmentSymbols = parseSegmentSymbols(matchResult.group(1)) + return segmentSymbols, fileData, matchResult.start(1), matchResult.end(1) - return segmentSymbols, fileData, matchResult.start(1), matchResult.end(1) def parseSegmentSymbols(data): - segmentSymbols = [] - for match in re.finditer('([^\(]*)\(([^\s]*)\)', data): - segmentType = match.group(1).strip() - name = match.group(2).strip() + segmentSymbols = [] + for match in re.finditer("([^\(]*)\(([^\s]*)\)", data): + segmentType = match.group(1).strip() + name = match.group(2).strip() - segmentSymbols.append(SegmentSymbolEntry(segmentType, name)) + segmentSymbols.append(SegmentSymbolEntry(segmentType, name)) + + return segmentSymbols - return segmentSymbols def segmentSymbolsToString(segmentSymbols): - data = '' - for entry in segmentSymbols: - data += entry.toC() - return data + data = "" + for entry in segmentSymbols: + data += entry.toC() + return data + def writeSegmentSymbols(segmentSymbols, fileData, start, end, exportPath): - segmentSymbolsData = segmentSymbolsToString(segmentSymbols) + "\n" - newFileData = fileData[:start] + segmentSymbolsData + fileData[end:] + segmentSymbolsData = segmentSymbolsToString(segmentSymbols) + "\n" + newFileData = fileData[:start] + segmentSymbolsData + fileData[end:] + + if newFileData != fileData: + writeFile(os.path.join(exportPath, "include/segment_symbols.h"), newFileData) - if newFileData != fileData: - writeFile(os.path.join(exportPath, 'include/segment_symbols.h'), newFileData) def modifySegmentSymbols(scene, exportInfo): - exportPath = exportInfo.exportPath - segmentSymbols, fileData, start, end = readSegmentSymbols(exportPath) - entries = getSegmentSymbolEntriesBySceneName(segmentSymbols, scene.name if scene is not None else exportInfo.name) - - if len(entries) > 0: - firstIndex = segmentSymbols.index(entries[0]) - for entry in entries: - segmentSymbols.remove(entry) - else: - firstIndex = len(segmentSymbols) - - if scene is not None: - segmentSymbols.insert(firstIndex, SegmentSymbolEntry("DECLARE_ROM_SEGMENT", scene.name + "_scene")) - firstIndex += 1 - - writeSegmentSymbols(segmentSymbols, fileData, start, end, exportPath) \ No newline at end of file + exportPath = exportInfo.exportPath + segmentSymbols, fileData, start, end = readSegmentSymbols(exportPath) + entries = getSegmentSymbolEntriesBySceneName( + segmentSymbols, scene.name if scene is not None else exportInfo.name + ) + + if len(entries) > 0: + firstIndex = segmentSymbols.index(entries[0]) + for entry in entries: + segmentSymbols.remove(entry) + else: + firstIndex = len(segmentSymbols) + + if scene is not None: + segmentSymbols.insert( + firstIndex, SegmentSymbolEntry("DECLARE_ROM_SEGMENT", scene.name + "_scene") + ) + firstIndex += 1 + + writeSegmentSymbols(segmentSymbols, fileData, start, end, exportPath) diff --git a/fast64_internal/oot/c_writer/oot_spec.py b/fast64_internal/oot/c_writer/oot_spec.py index 544996409..e02592962 100644 --- a/fast64_internal/oot/c_writer/oot_spec.py +++ b/fast64_internal/oot/c_writer/oot_spec.py @@ -2,103 +2,147 @@ from ...utility import * from ..oot_utility import * + def getSegmentDefinitionEntryBySceneName(segmentDefinition, sceneName): - entries = [] - for entry in segmentDefinition: - matchText = "\s*name\s*\"" + sceneName + "\_" - if re.match(matchText + "scene\"", entry) or re.match(matchText + "room\_\d+\"", entry): - entries.append(entry) - return entries + entries = [] + for entry in segmentDefinition: + matchText = '\s*name\s*"' + sceneName + "\_" + if re.match(matchText + 'scene"', entry) or re.match( + matchText + 'room\_\d+"', entry + ): + entries.append(entry) + return entries + def readSegmentDefinition(exportPath): - fileData = readFile(os.path.join(exportPath, 'spec')) - segmentDefinition = parseSegmentDefinitionData(fileData) + fileData = readFile(os.path.join(exportPath, "spec")) + segmentDefinition = parseSegmentDefinitionData(fileData) + + return segmentDefinition, fileData - return segmentDefinition, fileData def parseSegmentDefinitionData(data): - table = [] - for match in re.finditer('beginseg(((?!endseg).)*)endseg', data, re.DOTALL): - segData = match.group(1) - table.append(segData) + table = [] + for match in re.finditer("beginseg(((?!endseg).)*)endseg", data, re.DOTALL): + segData = match.group(1) + table.append(segData) + + return table - return table def segmentDefinitionToString(segmentDefinitions): - data = '/*\n * ROM spec file\n */\n\n' - for entry in segmentDefinitions: - data += "beginseg" + entry + "endseg\n\n" - return data + data = "/*\n * ROM spec file\n */\n\n" + for entry in segmentDefinitions: + data += "beginseg" + entry + "endseg\n\n" + return data + def writeSegmentDefinition(segmentDefinition, fileData, exportPath): - newFileData = segmentDefinitionToString(segmentDefinition) + newFileData = segmentDefinitionToString(segmentDefinition) + + if newFileData != fileData: + writeFile(os.path.join(exportPath, "spec"), newFileData) - if newFileData != fileData: - writeFile(os.path.join(exportPath, 'spec'), newFileData) def modifySegmentDefinition(scene, exportInfo, levelC): - exportPath = exportInfo.exportPath - segmentDefinitions, fileData = readSegmentDefinition(exportPath) - sceneName = scene.name if scene is not None else exportInfo.name - entries = getSegmentDefinitionEntryBySceneName(segmentDefinitions, sceneName) - - if exportInfo.customSubPath is not None: - includeDir = 'build/' + exportInfo.customSubPath + sceneName + '/' + sceneName - else: - includeDir = 'build/' + getSceneDirFromLevelName(sceneName) + '/' + sceneName - - if len(entries) > 0: - firstIndex = segmentDefinitions.index(entries[0]) - for entry in entries: - segmentDefinitions.remove(entry) - else: - firstIndex = len(segmentDefinitions) - - if scene is not None: - if bpy.context.scene.ootSceneSingleFile: - segmentDefinitions.insert(firstIndex, - '\n\tname "' + scene.name + '_scene"\n' +\ - "\tromalign 0x1000\n" +\ - '\tinclude "' + includeDir + '_scene.o"\n' +\ - "\tnumber 2\n") - firstIndex += 1 - - for i in range(len(scene.rooms)): - roomSuffix = "_room_" + str(i) - segmentDefinitions.insert(firstIndex, - '\n\tname "' + scene.name + roomSuffix + '"\n' +\ - "\tromalign 0x1000\n" +\ - '\tinclude "' + includeDir + roomSuffix + '.o"\n' +\ - "\tnumber 3\n") - firstIndex += 1 - else: - sceneSegInclude = '\n\tname "' + scene.name + '_scene"\n' +\ - "\tromalign 0x1000\n" +\ - '\tinclude "' + includeDir + '_scene_main.o"\n' +\ - '\tinclude "' + includeDir + '_scene_col.o"\n' - - if (levelC.sceneTexturesIsUsed()): - sceneSegInclude += '\tinclude "' + includeDir + '_scene_tex.o"\n' - - if (levelC.sceneCutscenesIsUsed()): - for i in range(len(levelC.sceneCutscenesC)): - sceneSegInclude += includeDir + '_cs_' + str(i) + '.o' - - sceneSegInclude += "\tnumber 2\n" - - segmentDefinitions.insert(firstIndex, sceneSegInclude) - - firstIndex += 1 - - for i in range(len(scene.rooms)): - roomSuffix = "_room_" + str(i) - segmentDefinitions.insert(firstIndex, - '\n\tname "' + scene.name + roomSuffix + '"\n' +\ - "\tromalign 0x1000\n" +\ - '\tinclude "' + includeDir + roomSuffix + '_main.o"\n' +\ - '\tinclude "' + includeDir + roomSuffix + '_model_info.o"\n' +\ - '\tinclude "' + includeDir + roomSuffix + '_model.o"\n' +\ - "\tnumber 3\n") - firstIndex += 1 - - writeSegmentDefinition(segmentDefinitions, fileData, exportPath) + exportPath = exportInfo.exportPath + segmentDefinitions, fileData = readSegmentDefinition(exportPath) + sceneName = scene.name if scene is not None else exportInfo.name + entries = getSegmentDefinitionEntryBySceneName(segmentDefinitions, sceneName) + + if exportInfo.customSubPath is not None: + includeDir = "build/" + exportInfo.customSubPath + sceneName + "/" + sceneName + else: + includeDir = "build/" + getSceneDirFromLevelName(sceneName) + "/" + sceneName + + if len(entries) > 0: + firstIndex = segmentDefinitions.index(entries[0]) + for entry in entries: + segmentDefinitions.remove(entry) + else: + firstIndex = len(segmentDefinitions) + + if scene is not None: + if bpy.context.scene.ootSceneSingleFile: + segmentDefinitions.insert( + firstIndex, + '\n\tname "' + + scene.name + + '_scene"\n' + + "\tromalign 0x1000\n" + + '\tinclude "' + + includeDir + + '_scene.o"\n' + + "\tnumber 2\n", + ) + firstIndex += 1 + + for i in range(len(scene.rooms)): + roomSuffix = "_room_" + str(i) + segmentDefinitions.insert( + firstIndex, + '\n\tname "' + + scene.name + + roomSuffix + + '"\n' + + "\tromalign 0x1000\n" + + '\tinclude "' + + includeDir + + roomSuffix + + '.o"\n' + + "\tnumber 3\n", + ) + firstIndex += 1 + else: + sceneSegInclude = ( + '\n\tname "' + + scene.name + + '_scene"\n' + + "\tromalign 0x1000\n" + + '\tinclude "' + + includeDir + + '_scene_main.o"\n' + + '\tinclude "' + + includeDir + + '_scene_col.o"\n' + ) + + if levelC.sceneTexturesIsUsed(): + sceneSegInclude += '\tinclude "' + includeDir + '_scene_tex.o"\n' + + if levelC.sceneCutscenesIsUsed(): + for i in range(len(levelC.sceneCutscenesC)): + sceneSegInclude += includeDir + "_cs_" + str(i) + ".o" + + sceneSegInclude += "\tnumber 2\n" + + segmentDefinitions.insert(firstIndex, sceneSegInclude) + + firstIndex += 1 + + for i in range(len(scene.rooms)): + roomSuffix = "_room_" + str(i) + segmentDefinitions.insert( + firstIndex, + '\n\tname "' + + scene.name + + roomSuffix + + '"\n' + + "\tromalign 0x1000\n" + + '\tinclude "' + + includeDir + + roomSuffix + + '_main.o"\n' + + '\tinclude "' + + includeDir + + roomSuffix + + '_model_info.o"\n' + + '\tinclude "' + + includeDir + + roomSuffix + + '_model.o"\n' + + "\tnumber 3\n", + ) + firstIndex += 1 + + writeSegmentDefinition(segmentDefinitions, fileData, exportPath) diff --git a/fast64_internal/oot/oot_actor.py b/fast64_internal/oot/oot_actor.py index 0caf2e5b6..8269c568e 100644 --- a/fast64_internal/oot/oot_actor.py +++ b/fast64_internal/oot/oot_actor.py @@ -1,4 +1,3 @@ - import math, os, bpy, bmesh, mathutils from bpy.utils import register_class, unregister_class from io import BytesIO @@ -9,193 +8,263 @@ from ..utility import * + class OOT_SearchActorIDEnumOperator(bpy.types.Operator): - bl_idname = "object.oot_search_actor_id_enum_operator" - bl_label = "Select Actor ID" - bl_property = "actorID" - bl_options = {'REGISTER', 'UNDO'} - - actorID : bpy.props.EnumProperty(items = ootEnumActorID, default = "ACTOR_PLAYER") - actorUser : bpy.props.StringProperty(default = "Actor") - objName : bpy.props.StringProperty() - - def execute(self, context): - obj = bpy.data.objects[self.objName] - if self.actorUser == "Transition Actor": - obj.ootTransitionActorProperty.actor.actorID = self.actorID - elif self.actorUser == "Actor": - obj.ootActorProperty.actorID = self.actorID - elif self.actorUser == "Entrance": - obj.ootEntranceProperty.actor.actorID = self.actorID - else: - raise PluginError("Invalid actor user for search: " + str(self.actorUser)) - - bpy.context.region.tag_redraw() - self.report({'INFO'}, "Selected: " + self.actorID) - return {'FINISHED'} - - def invoke(self, context, event): - context.window_manager.invoke_search_popup(self) - return {'RUNNING_MODAL'} + bl_idname = "object.oot_search_actor_id_enum_operator" + bl_label = "Select Actor ID" + bl_property = "actorID" + bl_options = {"REGISTER", "UNDO"} + + actorID: bpy.props.EnumProperty(items=ootEnumActorID, default="ACTOR_PLAYER") + actorUser: bpy.props.StringProperty(default="Actor") + objName: bpy.props.StringProperty() + + def execute(self, context): + obj = bpy.data.objects[self.objName] + if self.actorUser == "Transition Actor": + obj.ootTransitionActorProperty.actor.actorID = self.actorID + elif self.actorUser == "Actor": + obj.ootActorProperty.actorID = self.actorID + elif self.actorUser == "Entrance": + obj.ootEntranceProperty.actor.actorID = self.actorID + else: + raise PluginError("Invalid actor user for search: " + str(self.actorUser)) + + bpy.context.region.tag_redraw() + self.report({"INFO"}, "Selected: " + self.actorID) + return {"FINISHED"} + + def invoke(self, context, event): + context.window_manager.invoke_search_popup(self) + return {"RUNNING_MODAL"} + class OOTActorHeaderItemProperty(bpy.types.PropertyGroup): - headerIndex : bpy.props.IntProperty(name = "Scene Setup", min = 4, default = 4) - expandTab : bpy.props.BoolProperty(name = "Expand Tab") + headerIndex: bpy.props.IntProperty(name="Scene Setup", min=4, default=4) + expandTab: bpy.props.BoolProperty(name="Expand Tab") + class OOTActorHeaderProperty(bpy.types.PropertyGroup): - sceneSetupPreset : bpy.props.EnumProperty(name = "Scene Setup Preset", items = ootEnumSceneSetupPreset, default = "All Scene Setups") - childDayHeader : bpy.props.BoolProperty(name = "Child Day Header", default = True) - childNightHeader : bpy.props.BoolProperty(name = "Child Night Header", default = True) - adultDayHeader : bpy.props.BoolProperty(name = "Adult Day Header", default = True) - adultNightHeader : bpy.props.BoolProperty(name = "Adult Night Header", default = True) - cutsceneHeaders : bpy.props.CollectionProperty(type = OOTActorHeaderItemProperty) + sceneSetupPreset: bpy.props.EnumProperty( + name="Scene Setup Preset", + items=ootEnumSceneSetupPreset, + default="All Scene Setups", + ) + childDayHeader: bpy.props.BoolProperty(name="Child Day Header", default=True) + childNightHeader: bpy.props.BoolProperty(name="Child Night Header", default=True) + adultDayHeader: bpy.props.BoolProperty(name="Adult Day Header", default=True) + adultNightHeader: bpy.props.BoolProperty(name="Adult Night Header", default=True) + cutsceneHeaders: bpy.props.CollectionProperty(type=OOTActorHeaderItemProperty) + def drawActorHeaderProperty(layout, headerProp, propUser, altProp, objName): - headerSetup = layout.column() - #headerSetup.box().label(text = "Alternate Headers") - prop_split(headerSetup, headerProp, "sceneSetupPreset", "Scene Setup Preset") - if headerProp.sceneSetupPreset == "Custom": - headerSetupBox = headerSetup.column() - headerSetupBox.prop(headerProp, 'childDayHeader', text = "Child Day") - prevHeaderName = 'childDayHeader' - childNightRow = headerSetupBox.row() - if altProp is None or altProp.childNightHeader.usePreviousHeader: - # Draw previous header checkbox (so get previous state), but labeled - # as current one and grayed out - childNightRow.prop(headerProp, prevHeaderName, text = "Child Night") - childNightRow.enabled = False - else: - childNightRow.prop(headerProp, 'childNightHeader', text = "Child Night") - prevHeaderName = 'childNightHeader' - adultDayRow = headerSetupBox.row() - if altProp is None or altProp.adultDayHeader.usePreviousHeader: - adultDayRow.prop(headerProp, prevHeaderName, text = "Adult Day") - adultDayRow.enabled = False - else: - adultDayRow.prop(headerProp, 'adultDayHeader', text = "Adult Day") - prevHeaderName = 'adultDayHeader' - adultNightRow = headerSetupBox.row() - if altProp is None or altProp.adultNightHeader.usePreviousHeader: - adultNightRow.prop(headerProp, prevHeaderName, text = "Adult Night") - adultNightRow.enabled = False - else: - adultNightRow.prop(headerProp, 'adultNightHeader', text = "Adult Night") - - headerSetupBox.row().label(text = 'Cutscene headers to include this actor in:') - for i in range(len(headerProp.cutsceneHeaders)): - drawActorHeaderItemProperty(headerSetup, propUser, headerProp.cutsceneHeaders[i], i, altProp, objName) - drawAddButton(headerSetup, len(headerProp.cutsceneHeaders), propUser, None, objName) - -def drawActorHeaderItemProperty(layout, propUser, headerItemProp, index, altProp, objName): - box = layout.box() - box.prop(headerItemProp, 'expandTab', text = 'Header ' + \ - str(headerItemProp.headerIndex), icon = 'TRIA_DOWN' if headerItemProp.expandTab else \ - 'TRIA_RIGHT') - - if headerItemProp.expandTab: - drawCollectionOps(box, index, propUser, None, objName) - prop_split(box, headerItemProp, 'headerIndex', 'Header Index') - if altProp is not None and headerItemProp.headerIndex >= len(altProp.cutsceneHeaders) + 4: - box.label(text = "Header does not exist.", icon = 'QUESTION') - + headerSetup = layout.column() + # headerSetup.box().label(text = "Alternate Headers") + prop_split(headerSetup, headerProp, "sceneSetupPreset", "Scene Setup Preset") + if headerProp.sceneSetupPreset == "Custom": + headerSetupBox = headerSetup.column() + headerSetupBox.prop(headerProp, "childDayHeader", text="Child Day") + prevHeaderName = "childDayHeader" + childNightRow = headerSetupBox.row() + if altProp is None or altProp.childNightHeader.usePreviousHeader: + # Draw previous header checkbox (so get previous state), but labeled + # as current one and grayed out + childNightRow.prop(headerProp, prevHeaderName, text="Child Night") + childNightRow.enabled = False + else: + childNightRow.prop(headerProp, "childNightHeader", text="Child Night") + prevHeaderName = "childNightHeader" + adultDayRow = headerSetupBox.row() + if altProp is None or altProp.adultDayHeader.usePreviousHeader: + adultDayRow.prop(headerProp, prevHeaderName, text="Adult Day") + adultDayRow.enabled = False + else: + adultDayRow.prop(headerProp, "adultDayHeader", text="Adult Day") + prevHeaderName = "adultDayHeader" + adultNightRow = headerSetupBox.row() + if altProp is None or altProp.adultNightHeader.usePreviousHeader: + adultNightRow.prop(headerProp, prevHeaderName, text="Adult Night") + adultNightRow.enabled = False + else: + adultNightRow.prop(headerProp, "adultNightHeader", text="Adult Night") + + headerSetupBox.row().label(text="Cutscene headers to include this actor in:") + for i in range(len(headerProp.cutsceneHeaders)): + drawActorHeaderItemProperty( + headerSetup, + propUser, + headerProp.cutsceneHeaders[i], + i, + altProp, + objName, + ) + drawAddButton( + headerSetup, len(headerProp.cutsceneHeaders), propUser, None, objName + ) + + +def drawActorHeaderItemProperty( + layout, propUser, headerItemProp, index, altProp, objName +): + box = layout.box() + box.prop( + headerItemProp, + "expandTab", + text="Header " + str(headerItemProp.headerIndex), + icon="TRIA_DOWN" if headerItemProp.expandTab else "TRIA_RIGHT", + ) + + if headerItemProp.expandTab: + drawCollectionOps(box, index, propUser, None, objName) + prop_split(box, headerItemProp, "headerIndex", "Header Index") + if ( + altProp is not None + and headerItemProp.headerIndex >= len(altProp.cutsceneHeaders) + 4 + ): + box.label(text="Header does not exist.", icon="QUESTION") + + class OOTActorProperty(bpy.types.PropertyGroup): - actorID : bpy.props.EnumProperty(name = 'Actor', items = ootEnumActorID, default = 'ACTOR_PLAYER') - actorIDCustom : bpy.props.StringProperty(name = 'Actor ID', default = 'ACTOR_PLAYER') - actorParam : bpy.props.StringProperty(name = 'Actor Parameter', default = '0x0000') - rotOverride : bpy.props.BoolProperty(name = 'Override Rotation', default = False) - rotOverrideX : bpy.props.StringProperty(name = 'Rot X', default = '0') - rotOverrideY : bpy.props.StringProperty(name = 'Rot Y', default = '0') - rotOverrideZ : bpy.props.StringProperty(name = 'Rot Z', default = '0') - headerSettings : bpy.props.PointerProperty(type = OOTActorHeaderProperty) + actorID: bpy.props.EnumProperty( + name="Actor", items=ootEnumActorID, default="ACTOR_PLAYER" + ) + actorIDCustom: bpy.props.StringProperty(name="Actor ID", default="ACTOR_PLAYER") + actorParam: bpy.props.StringProperty(name="Actor Parameter", default="0x0000") + rotOverride: bpy.props.BoolProperty(name="Override Rotation", default=False) + rotOverrideX: bpy.props.StringProperty(name="Rot X", default="0") + rotOverrideY: bpy.props.StringProperty(name="Rot Y", default="0") + rotOverrideZ: bpy.props.StringProperty(name="Rot Z", default="0") + headerSettings: bpy.props.PointerProperty(type=OOTActorHeaderProperty) + def drawActorProperty(layout, actorProp, altRoomProp, objName): - #prop_split(layout, actorProp, 'actorID', 'Actor') - actorIDBox = layout.column() - #actorIDBox.box().label(text = "Settings") - searchOp = actorIDBox.operator(OOT_SearchActorIDEnumOperator.bl_idname, icon = 'VIEWZOOM') - searchOp.actorUser = "Actor" - searchOp.objName = objName - - split = actorIDBox.split(factor = 0.5) - split.label(text = "Actor ID") - split.label(text = getEnumName(ootEnumActorID, actorProp.actorID)) - - if actorProp.actorID == 'Custom': - #actorIDBox.prop(actorProp, 'actorIDCustom', text = 'Actor ID') - prop_split(actorIDBox, actorProp, 'actorIDCustom', '') - - #layout.box().label(text = 'Actor IDs defined in include/z64actors.h.') - prop_split(actorIDBox, actorProp, "actorParam", 'Actor Parameter') - - actorIDBox.prop(actorProp, 'rotOverride', text = 'Override Rotation (ignore Blender rot)') - if actorProp.rotOverride: - prop_split(actorIDBox, actorProp, 'rotOverrideX', 'Rot X') - prop_split(actorIDBox, actorProp, 'rotOverrideY', 'Rot Y') - prop_split(actorIDBox, actorProp, 'rotOverrideZ', 'Rot Z') - - drawActorHeaderProperty(actorIDBox, actorProp.headerSettings, "Actor", altRoomProp, objName) + # prop_split(layout, actorProp, 'actorID', 'Actor') + actorIDBox = layout.column() + # actorIDBox.box().label(text = "Settings") + searchOp = actorIDBox.operator( + OOT_SearchActorIDEnumOperator.bl_idname, icon="VIEWZOOM" + ) + searchOp.actorUser = "Actor" + searchOp.objName = objName + + split = actorIDBox.split(factor=0.5) + split.label(text="Actor ID") + split.label(text=getEnumName(ootEnumActorID, actorProp.actorID)) + + if actorProp.actorID == "Custom": + # actorIDBox.prop(actorProp, 'actorIDCustom', text = 'Actor ID') + prop_split(actorIDBox, actorProp, "actorIDCustom", "") + + # layout.box().label(text = 'Actor IDs defined in include/z64actors.h.') + prop_split(actorIDBox, actorProp, "actorParam", "Actor Parameter") + + actorIDBox.prop( + actorProp, "rotOverride", text="Override Rotation (ignore Blender rot)" + ) + if actorProp.rotOverride: + prop_split(actorIDBox, actorProp, "rotOverrideX", "Rot X") + prop_split(actorIDBox, actorProp, "rotOverrideY", "Rot Y") + prop_split(actorIDBox, actorProp, "rotOverrideZ", "Rot Z") + + drawActorHeaderProperty( + actorIDBox, actorProp.headerSettings, "Actor", altRoomProp, objName + ) + class OOTTransitionActorProperty(bpy.types.PropertyGroup): - roomIndex : bpy.props.IntProperty(min = 0) - cameraTransitionFront : bpy.props.EnumProperty(items = ootEnumCamTransition, default = '0x00') - cameraTransitionFrontCustom : bpy.props.StringProperty(default = '0x00') - cameraTransitionBack : bpy.props.EnumProperty(items = ootEnumCamTransition, default = '0x00') - cameraTransitionBackCustom : bpy.props.StringProperty(default = '0x00') - - actor : bpy.props.PointerProperty(type = OOTActorProperty) + roomIndex: bpy.props.IntProperty(min=0) + cameraTransitionFront: bpy.props.EnumProperty( + items=ootEnumCamTransition, default="0x00" + ) + cameraTransitionFrontCustom: bpy.props.StringProperty(default="0x00") + cameraTransitionBack: bpy.props.EnumProperty( + items=ootEnumCamTransition, default="0x00" + ) + cameraTransitionBackCustom: bpy.props.StringProperty(default="0x00") + + actor: bpy.props.PointerProperty(type=OOTActorProperty) + def drawTransitionActorProperty(layout, transActorProp, altSceneProp, roomObj, objName): - actorIDBox = layout.column() - #actorIDBox.box().label(text = "Properties") - #prop_split(actorIDBox, transActorProp, 'actorID', 'Actor') - #actorIDBox.box().label(text = "Actor ID: " + getEnumName(ootEnumActorID, transActorProp.actor.actorID)) - searchOp = actorIDBox.operator(OOT_SearchActorIDEnumOperator.bl_idname, icon = 'VIEWZOOM') - searchOp.actorUser = "Transition Actor" - searchOp.objName = objName - - split = actorIDBox.split(factor = 0.5) - split.label(text = "Actor ID") - split.label(text = getEnumName(ootEnumActorID, transActorProp.actor.actorID)) - - if transActorProp.actor.actorID == 'Custom': - prop_split(actorIDBox, transActorProp.actor, 'actorIDCustom', '') - - #layout.box().label(text = 'Actor IDs defined in include/z64actors.h.') - prop_split(actorIDBox, transActorProp.actor, "actorParam", 'Actor Parameter') - - if roomObj is None: - actorIDBox.label(text = "This must be part of a Room empty's hierarchy.", icon = 'OUTLINER') - else: - label_split(actorIDBox, "Room To Transition From", str(roomObj.ootRoomHeader.roomIndex)) - prop_split(actorIDBox, transActorProp, "roomIndex", "Room To Transition To") - actorIDBox.label(text = "Y+ side of door faces toward the \"from\" room.", icon = 'ORIENTATION_NORMAL') - drawEnumWithCustom(actorIDBox, transActorProp, "cameraTransitionFront", "Camera Transition Front", "") - drawEnumWithCustom(actorIDBox, transActorProp, "cameraTransitionBack", "Camera Transition Back", "") - - drawActorHeaderProperty(actorIDBox, transActorProp.actor.headerSettings, "Transition Actor", altSceneProp, objName) - + actorIDBox = layout.column() + # actorIDBox.box().label(text = "Properties") + # prop_split(actorIDBox, transActorProp, 'actorID', 'Actor') + # actorIDBox.box().label(text = "Actor ID: " + getEnumName(ootEnumActorID, transActorProp.actor.actorID)) + searchOp = actorIDBox.operator( + OOT_SearchActorIDEnumOperator.bl_idname, icon="VIEWZOOM" + ) + searchOp.actorUser = "Transition Actor" + searchOp.objName = objName + + split = actorIDBox.split(factor=0.5) + split.label(text="Actor ID") + split.label(text=getEnumName(ootEnumActorID, transActorProp.actor.actorID)) + + if transActorProp.actor.actorID == "Custom": + prop_split(actorIDBox, transActorProp.actor, "actorIDCustom", "") + + # layout.box().label(text = 'Actor IDs defined in include/z64actors.h.') + prop_split(actorIDBox, transActorProp.actor, "actorParam", "Actor Parameter") + + if roomObj is None: + actorIDBox.label( + text="This must be part of a Room empty's hierarchy.", icon="OUTLINER" + ) + else: + label_split( + actorIDBox, "Room To Transition From", str(roomObj.ootRoomHeader.roomIndex) + ) + prop_split(actorIDBox, transActorProp, "roomIndex", "Room To Transition To") + actorIDBox.label( + text='Y+ side of door faces toward the "from" room.', icon="ORIENTATION_NORMAL" + ) + drawEnumWithCustom( + actorIDBox, + transActorProp, + "cameraTransitionFront", + "Camera Transition Front", + "", + ) + drawEnumWithCustom( + actorIDBox, transActorProp, "cameraTransitionBack", "Camera Transition Back", "" + ) + + drawActorHeaderProperty( + actorIDBox, + transActorProp.actor.headerSettings, + "Transition Actor", + altSceneProp, + objName, + ) + + class OOTEntranceProperty(bpy.types.PropertyGroup): - # This is also used in entrance list, and roomIndex is obtained from the room this empty is parented to. - spawnIndex : bpy.props.IntProperty(min = 0) - customActor : bpy.props.BoolProperty(name = "Use Custom Actor") - actor : bpy.props.PointerProperty(type = OOTActorProperty) + # This is also used in entrance list, and roomIndex is obtained from the room this empty is parented to. + spawnIndex: bpy.props.IntProperty(min=0) + customActor: bpy.props.BoolProperty(name="Use Custom Actor") + actor: bpy.props.PointerProperty(type=OOTActorProperty) + def drawEntranceProperty(layout, obj, altSceneProp, objName): - box = layout.column() - #box.box().label(text = "Properties") - roomObj = getRoomObj(obj) - if roomObj is not None: - split = box.split(factor = 0.5) - split.label(text = "Room Index") - split.label(text = str(roomObj.ootRoomHeader.roomIndex)) - else: - box.label(text = "This must be part of a Room empty's hierarchy.", icon = 'OUTLINER') - - entranceProp = obj.ootEntranceProperty - prop_split(box, entranceProp, "spawnIndex", "Spawn Index") - prop_split(box, entranceProp.actor, "actorParam", "Actor Param") - box.prop(entranceProp, "customActor") - if entranceProp.customActor: - prop_split(box, entranceProp.actor, "actorIDCustom", "Actor ID Custom") - - drawActorHeaderProperty(box, entranceProp.actor.headerSettings, "Entrance", altSceneProp, objName) + box = layout.column() + # box.box().label(text = "Properties") + roomObj = getRoomObj(obj) + if roomObj is not None: + split = box.split(factor=0.5) + split.label(text="Room Index") + split.label(text=str(roomObj.ootRoomHeader.roomIndex)) + else: + box.label( + text="This must be part of a Room empty's hierarchy.", icon="OUTLINER" + ) + + entranceProp = obj.ootEntranceProperty + prop_split(box, entranceProp, "spawnIndex", "Spawn Index") + prop_split(box, entranceProp.actor, "actorParam", "Actor Param") + box.prop(entranceProp, "customActor") + if entranceProp.customActor: + prop_split(box, entranceProp.actor, "actorIDCustom", "Actor ID Custom") + + drawActorHeaderProperty( + box, entranceProp.actor.headerSettings, "Entrance", altSceneProp, objName + ) diff --git a/fast64_internal/oot/oot_anim.py b/fast64_internal/oot/oot_anim.py index be1b643ee..69f84bf50 100644 --- a/fast64_internal/oot/oot_anim.py +++ b/fast64_internal/oot/oot_anim.py @@ -7,469 +7,597 @@ from ..utility import * from ..panels import OOT_Panel + class OOTAnimation: - def __init__(self, name): - self.name = toAlnum(name) - self.segmentID = None - self.indices = {} - self.values = [] - self.frameCount = None - self.limit = None - - def valuesName(self): - return self.name + "FrameData" - - def indicesName(self): - return self.name + "JointIndices" - - def toC(self): - data = CData() - data.source += '#include "ultra64.h"\n#include "global.h"\n\n' - - # values - data.source += "s16 " + self.valuesName() + "[" + str(len(self.values)) + "] = {\n" - counter = 0 - for value in self.values: - if counter == 0: - data.source += '\t' - data.source += format(value, '#06x') + ", " - counter += 1 - if counter >= 16: # round number for finding/counting data - counter = 0 - data.source += '\n' - data.source += '};\n\n' - - # indices (index -1 => translation) - data.source += "JointIndex " + self.indicesName() + "[" + str(len(self.indices)) + "] = {\n" - for index in range(-1, len(self.indices) - 1): - data.source += '\t{ ' - for field in range(3): - data.source += format(self.indices[index][field], '#06x') + ", " - data.source += '},\n' - data.source += "};\n\n" - - # header - data.header += "extern AnimationHeader " + self.name + ';\n' - data.source += "AnimationHeader " + self.name + " = { { " + str(self.frameCount) + " }, " +\ - self.valuesName() + ", " + self.indicesName() + ", " + str(self.limit) + " };\n\n" - - return data + def __init__(self, name): + self.name = toAlnum(name) + self.segmentID = None + self.indices = {} + self.values = [] + self.frameCount = None + self.limit = None + + def valuesName(self): + return self.name + "FrameData" + + def indicesName(self): + return self.name + "JointIndices" + + def toC(self): + data = CData() + data.source += '#include "ultra64.h"\n#include "global.h"\n\n' + + # values + data.source += ( + "s16 " + self.valuesName() + "[" + str(len(self.values)) + "] = {\n" + ) + counter = 0 + for value in self.values: + if counter == 0: + data.source += "\t" + data.source += format(value, "#06x") + ", " + counter += 1 + if counter >= 16: # round number for finding/counting data + counter = 0 + data.source += "\n" + data.source += "};\n\n" + + # indices (index -1 => translation) + data.source += ( + "JointIndex " + + self.indicesName() + + "[" + + str(len(self.indices)) + + "] = {\n" + ) + for index in range(-1, len(self.indices) - 1): + data.source += "\t{ " + for field in range(3): + data.source += format(self.indices[index][field], "#06x") + ", " + data.source += "},\n" + data.source += "};\n\n" + + # header + data.header += "extern AnimationHeader " + self.name + ";\n" + data.source += ( + "AnimationHeader " + + self.name + + " = { { " + + str(self.frameCount) + + " }, " + + self.valuesName() + + ", " + + self.indicesName() + + ", " + + str(self.limit) + + " };\n\n" + ) + + return data + def ootGetAnimBoneRot(bone, poseBone, convertTransformMatrix, isRoot): - # OoT draws limbs like this: - # limbMatrix = parentLimbMatrix @ limbFixedTranslationMatrix @ animRotMatrix - # There is no separate rest position rotation; an animation rotation of 0 - # in all three axes simply means draw the dlist as it is (assuming no - # parent or translation). - # We could encode a rest position into the dlists at export time, but the - # vanilla skeletons don't do this, instead they seem to usually have each - # dlist along its bone. For example, a forearm limb would normally be - # modeled along a forearm bone, so when the bone is set to 0 rotation - # (sticking up), the forearm mesh also sticks up. - # - # poseBone.matrix is the final bone matrix in object space after constraints - # and drivers, which is ultimately the transformation we want to encode. - # bone.matrix_local is the edit-mode bone matrix in object space, - # effectively the rest position. - # Limbs are exported with a transformation of bone.matrix_local.inverted() - # (in TriangleConverterInfo.getTransformMatrix). - # To directly put the limb back to its rest position, apply bone.matrix_local. - # Similarly, to directly put the limb into its pose position, apply - # poseBone.matrix. If SkelAnime saved 4x4 matrices for each bone each frame, - # we'd simply write this matrix and that's it: - # limbMatrix = poseBone.matrix - # Of course it does not, so we have to "undo" the game transforms like: - # limbMatrix = parentLimbMatrix - # @ limbFixedTranslationMatrix - # @ limbFixedTranslationMatrix.inverted() - # @ parentLimbMatrix.inverted() - # @ poseBone.matrix - # The product of the final three is what we want to return here. - # The translation is computed in ootProcessBone as - # (scaleMtx @ bone.parent.matrix_local.inverted() @ bone.matrix_local).decompose() - # (convertTransformMatrix is just the global scale and armature scale). - # However, the translation components of parentLimbMatrix and poseBone.matrix - # are not in the scaled (100x / 1000x / whatever), but in the normal Blender - # space. So we don't apply this scale here. - origTranslationMatrix = (#convertTransformMatrix @ - (bone.parent.matrix_local.inverted() if bone.parent is not None else mathutils.Matrix.Identity(4)) - @ bone.matrix_local) - origTranslation = origTranslationMatrix.decompose()[0] - inverseTranslationMatrix = mathutils.Matrix.Translation(origTranslation).inverted() - animMatrix = (inverseTranslationMatrix - @ (poseBone.parent.matrix.inverted() if poseBone.parent is not None else mathutils.Matrix.Identity(4)) - @ poseBone.matrix) - finalTranslation, finalRotation, finalScale = animMatrix.decompose() - if isRoot: - # 90 degree offset because of coordinate system difference. - zUpToYUp = mathutils.Quaternion((1, 0, 0), math.radians(-90.0)) - finalRotation.rotate(zUpToYUp) - # This should be very close to only a rotation, or if root, only a rotation - # and translation. - finalScale = [finalScale.x, finalScale.y, finalScale.z] - if max(finalScale) >= 1.01 or min(finalScale) <= 0.99: - raise RuntimeError('Animation contains bones with animated scale. OoT SkelAnime does not support this.') - finalTranslation = [finalTranslation.x, finalTranslation.y, finalTranslation.z] - if not isRoot and (max(finalTranslation) >= 1.0 or min(finalTranslation) <= -1.0): - raise RuntimeError('Animation contains non-root bones with animated translation. OoT SkelAnime only supports animated translation on the root bone.') - return finalRotation + # OoT draws limbs like this: + # limbMatrix = parentLimbMatrix @ limbFixedTranslationMatrix @ animRotMatrix + # There is no separate rest position rotation; an animation rotation of 0 + # in all three axes simply means draw the dlist as it is (assuming no + # parent or translation). + # We could encode a rest position into the dlists at export time, but the + # vanilla skeletons don't do this, instead they seem to usually have each + # dlist along its bone. For example, a forearm limb would normally be + # modeled along a forearm bone, so when the bone is set to 0 rotation + # (sticking up), the forearm mesh also sticks up. + # + # poseBone.matrix is the final bone matrix in object space after constraints + # and drivers, which is ultimately the transformation we want to encode. + # bone.matrix_local is the edit-mode bone matrix in object space, + # effectively the rest position. + # Limbs are exported with a transformation of bone.matrix_local.inverted() + # (in TriangleConverterInfo.getTransformMatrix). + # To directly put the limb back to its rest position, apply bone.matrix_local. + # Similarly, to directly put the limb into its pose position, apply + # poseBone.matrix. If SkelAnime saved 4x4 matrices for each bone each frame, + # we'd simply write this matrix and that's it: + # limbMatrix = poseBone.matrix + # Of course it does not, so we have to "undo" the game transforms like: + # limbMatrix = parentLimbMatrix + # @ limbFixedTranslationMatrix + # @ limbFixedTranslationMatrix.inverted() + # @ parentLimbMatrix.inverted() + # @ poseBone.matrix + # The product of the final three is what we want to return here. + # The translation is computed in ootProcessBone as + # (scaleMtx @ bone.parent.matrix_local.inverted() @ bone.matrix_local).decompose() + # (convertTransformMatrix is just the global scale and armature scale). + # However, the translation components of parentLimbMatrix and poseBone.matrix + # are not in the scaled (100x / 1000x / whatever), but in the normal Blender + # space. So we don't apply this scale here. + origTranslationMatrix = ( # convertTransformMatrix @ + bone.parent.matrix_local.inverted() + if bone.parent is not None + else mathutils.Matrix.Identity(4) + ) @ bone.matrix_local + origTranslation = origTranslationMatrix.decompose()[0] + inverseTranslationMatrix = mathutils.Matrix.Translation(origTranslation).inverted() + animMatrix = ( + inverseTranslationMatrix + @ ( + poseBone.parent.matrix.inverted() + if poseBone.parent is not None + else mathutils.Matrix.Identity(4) + ) + @ poseBone.matrix + ) + finalTranslation, finalRotation, finalScale = animMatrix.decompose() + if isRoot: + # 90 degree offset because of coordinate system difference. + zUpToYUp = mathutils.Quaternion((1, 0, 0), math.radians(-90.0)) + finalRotation.rotate(zUpToYUp) + # This should be very close to only a rotation, or if root, only a rotation + # and translation. + finalScale = [finalScale.x, finalScale.y, finalScale.z] + if max(finalScale) >= 1.01 or min(finalScale) <= 0.99: + raise RuntimeError( + "Animation contains bones with animated scale. OoT SkelAnime does not support this." + ) + finalTranslation = [finalTranslation.x, finalTranslation.y, finalTranslation.z] + if not isRoot and (max(finalTranslation) >= 1.0 or min(finalTranslation) <= -1.0): + raise RuntimeError( + "Animation contains non-root bones with animated translation. OoT SkelAnime only supports animated translation on the root bone." + ) + return finalRotation + def ootConvertAnimationData(anim, armatureObj, frameInterval, convertTransformMatrix): - checkForStartBone(armatureObj) - bonesToProcess = [getStartBone(armatureObj)] - currentBone = armatureObj.data.bones[bonesToProcess[0]] - animBones = [] - - # Get animation bones in order - # must be SAME order as ootProcessBone - while len(bonesToProcess) > 0: - boneName = bonesToProcess[0] - currentBone = armatureObj.data.bones[boneName] - bonesToProcess = bonesToProcess[1:] - - animBones.append(boneName) - - childrenNames = getSortedChildren(armatureObj, currentBone) - bonesToProcess = childrenNames + bonesToProcess - - # list of boneFrameData, which is [[x frames], [y frames], [z frames]] - # boneIndex is index in animBones in ootConvertAnimationData. - # since we are processing the bones in the same order as ootProcessBone, - # they should be the same as the limb indices. - - # index -1 => translation - translationData = [ValueFrameData(-1, i, []) for i in range(3)] - rotationData = [[ - ValueFrameData(i, 0, []), - ValueFrameData(i, 1, []), - ValueFrameData(i, 2, [])] for i in range(len(animBones))] - - currentFrame = bpy.context.scene.frame_current - for frame in range(frameInterval[0], frameInterval[1]): - bpy.context.scene.frame_set(frame) - rootBone = armatureObj.data.bones[animBones[0]] - rootPoseBone = armatureObj.pose.bones[animBones[0]] - - # Convert Z-up to Y-up for root translation animation - translation = mathutils.Quaternion((1, 0, 0), math.radians(-90.0)) @ \ - (convertTransformMatrix @ rootPoseBone.matrix).decompose()[0] - saveTranslationFrame(translationData, translation) - - for boneIndex in range(len(animBones)): - boneName = animBones[boneIndex] - currentBone = armatureObj.data.bones[boneName] - currentPoseBone = armatureObj.pose.bones[boneName] - - saveQuaternionFrame(rotationData[boneIndex], ootGetAnimBoneRot( - currentBone, currentPoseBone, convertTransformMatrix, boneIndex == 0)) - - bpy.context.scene.frame_set(currentFrame) - squashFramesIfAllSame(translationData) - for frameData in rotationData: - squashFramesIfAllSame(frameData) - - # need to deepcopy? - armatureFrameData = translationData - for frameDataGroup in rotationData: - for i in range(3): - armatureFrameData.append(frameDataGroup[i]) - - return armatureFrameData + checkForStartBone(armatureObj) + bonesToProcess = [getStartBone(armatureObj)] + currentBone = armatureObj.data.bones[bonesToProcess[0]] + animBones = [] + + # Get animation bones in order + # must be SAME order as ootProcessBone + while len(bonesToProcess) > 0: + boneName = bonesToProcess[0] + currentBone = armatureObj.data.bones[boneName] + bonesToProcess = bonesToProcess[1:] + + animBones.append(boneName) + + childrenNames = getSortedChildren(armatureObj, currentBone) + bonesToProcess = childrenNames + bonesToProcess + + # list of boneFrameData, which is [[x frames], [y frames], [z frames]] + # boneIndex is index in animBones in ootConvertAnimationData. + # since we are processing the bones in the same order as ootProcessBone, + # they should be the same as the limb indices. + + # index -1 => translation + translationData = [ValueFrameData(-1, i, []) for i in range(3)] + rotationData = [ + [ValueFrameData(i, 0, []), ValueFrameData(i, 1, []), ValueFrameData(i, 2, [])] + for i in range(len(animBones)) + ] + + currentFrame = bpy.context.scene.frame_current + for frame in range(frameInterval[0], frameInterval[1]): + bpy.context.scene.frame_set(frame) + rootBone = armatureObj.data.bones[animBones[0]] + rootPoseBone = armatureObj.pose.bones[animBones[0]] + + # Convert Z-up to Y-up for root translation animation + translation = ( + mathutils.Quaternion((1, 0, 0), math.radians(-90.0)) + @ (convertTransformMatrix @ rootPoseBone.matrix).decompose()[0] + ) + saveTranslationFrame(translationData, translation) + + for boneIndex in range(len(animBones)): + boneName = animBones[boneIndex] + currentBone = armatureObj.data.bones[boneName] + currentPoseBone = armatureObj.pose.bones[boneName] + + saveQuaternionFrame( + rotationData[boneIndex], + ootGetAnimBoneRot( + currentBone, currentPoseBone, convertTransformMatrix, boneIndex == 0 + ), + ) + + bpy.context.scene.frame_set(currentFrame) + squashFramesIfAllSame(translationData) + for frameData in rotationData: + squashFramesIfAllSame(frameData) + + # need to deepcopy? + armatureFrameData = translationData + for frameDataGroup in rotationData: + for i in range(3): + armatureFrameData.append(frameDataGroup[i]) + + return armatureFrameData + def ootExportAnimationCommon(armatureObj, convertTransformMatrix, skeletonName): - if armatureObj.animation_data is None or \ - armatureObj.animation_data.action is None: - raise PluginError("No active animation selected.") - anim = armatureObj.animation_data.action - ootAnim = OOTAnimation(toAlnum(skeletonName + anim.name.capitalize() + "Anim")) - - skeleton = ootConvertArmatureToSkeletonWithoutMesh(armatureObj, convertTransformMatrix, skeletonName) - - frameInterval = getFrameInterval(anim) - ootAnim.frameCount = frameInterval[1] - frameInterval[0] - armatureFrameData = ootConvertAnimationData(anim, armatureObj, frameInterval, convertTransformMatrix) - - singleFrameData = [] - multiFrameData = [] - for frameData in armatureFrameData: - if len(frameData.frames) == 1: - singleFrameData.append(frameData) - else: - multiFrameData.append(frameData) - - for frameData in singleFrameData: - frame = frameData.frames[0] - if frameData.boneIndex not in ootAnim.indices: - ootAnim.indices[frameData.boneIndex] = [None, None, None] - if frame in ootAnim.values: - ootAnim.indices[frameData.boneIndex][frameData.field] = ootAnim.values.index(frame) - else: - ootAnim.indices[frameData.boneIndex][frameData.field] = len(ootAnim.values) - ootAnim.values.extend(frameData.frames) - - ootAnim.limit = len(ootAnim.values) - for frameData in multiFrameData: - if frameData.boneIndex not in ootAnim.indices: - ootAnim.indices[frameData.boneIndex] = [None, None, None] - ootAnim.indices[frameData.boneIndex][frameData.field] = len(ootAnim.values) - ootAnim.values.extend(frameData.frames) - - return ootAnim + if armatureObj.animation_data is None or armatureObj.animation_data.action is None: + raise PluginError("No active animation selected.") + anim = armatureObj.animation_data.action + ootAnim = OOTAnimation(toAlnum(skeletonName + anim.name.capitalize() + "Anim")) + + skeleton = ootConvertArmatureToSkeletonWithoutMesh( + armatureObj, convertTransformMatrix, skeletonName + ) + + frameInterval = getFrameInterval(anim) + ootAnim.frameCount = frameInterval[1] - frameInterval[0] + armatureFrameData = ootConvertAnimationData( + anim, armatureObj, frameInterval, convertTransformMatrix + ) + + singleFrameData = [] + multiFrameData = [] + for frameData in armatureFrameData: + if len(frameData.frames) == 1: + singleFrameData.append(frameData) + else: + multiFrameData.append(frameData) + + for frameData in singleFrameData: + frame = frameData.frames[0] + if frameData.boneIndex not in ootAnim.indices: + ootAnim.indices[frameData.boneIndex] = [None, None, None] + if frame in ootAnim.values: + ootAnim.indices[frameData.boneIndex][ + frameData.field + ] = ootAnim.values.index(frame) + else: + ootAnim.indices[frameData.boneIndex][frameData.field] = len(ootAnim.values) + ootAnim.values.extend(frameData.frames) + + ootAnim.limit = len(ootAnim.values) + for frameData in multiFrameData: + if frameData.boneIndex not in ootAnim.indices: + ootAnim.indices[frameData.boneIndex] = [None, None, None] + ootAnim.indices[frameData.boneIndex][frameData.field] = len(ootAnim.values) + ootAnim.values.extend(frameData.frames) + + return ootAnim -def exportAnimationC(armatureObj, exportPath, isCustomExport, folderName, skeletonName): - checkEmptyName(folderName) - checkEmptyName(skeletonName) - convertTransformMatrix = mathutils.Matrix.Scale(bpy.context.scene.ootActorBlenderScale, 4) \ - @ mathutils.Matrix.Diagonal(armatureObj.scale).to_4x4() - ootAnim = ootExportAnimationCommon(armatureObj, convertTransformMatrix, skeletonName) - ootAnimC = ootAnim.toC() - path = ootGetPath(exportPath, isCustomExport, 'assets/objects/', folderName, False, False) - writeCData(ootAnimC, - os.path.join(path, ootAnim.name + '.h'), - os.path.join(path, ootAnim.name + '.c')) +def exportAnimationC(armatureObj, exportPath, isCustomExport, folderName, skeletonName): + checkEmptyName(folderName) + checkEmptyName(skeletonName) + convertTransformMatrix = ( + mathutils.Matrix.Scale(bpy.context.scene.ootActorBlenderScale, 4) + @ mathutils.Matrix.Diagonal(armatureObj.scale).to_4x4() + ) + ootAnim = ootExportAnimationCommon( + armatureObj, convertTransformMatrix, skeletonName + ) + + ootAnimC = ootAnim.toC() + path = ootGetPath( + exportPath, isCustomExport, "assets/objects/", folderName, False, False + ) + writeCData( + ootAnimC, + os.path.join(path, ootAnim.name + ".h"), + os.path.join(path, ootAnim.name + ".c"), + ) + + if not isCustomExport: + addIncludeFiles(folderName, path, ootAnim.name) - if not isCustomExport: - addIncludeFiles(folderName, path, ootAnim.name) def getNextBone(boneStack, armatureObj): - if len(boneStack) == 0: - raise PluginError("More bones in animation than on armature.") - bone = armatureObj.data.bones[boneStack[0]] - boneStack = boneStack[1:] - boneStack = getSortedChildren(armatureObj, bone) + boneStack - return bone, boneStack + if len(boneStack) == 0: + raise PluginError("More bones in animation than on armature.") + bone = armatureObj.data.bones[boneStack[0]] + boneStack = boneStack[1:] + boneStack = getSortedChildren(armatureObj, bone) + boneStack + return bone, boneStack + def ootImportAnimationC(armatureObj, filepath, animName, actorScale): - animData = readFile(filepath) - - matchResult = re.search(re.escape(animName) + "\s*=\s*\{\s*\{\s*([^,\s]*)\s*\}*\s*,\s*([^,\s]*)\s*,\s*([^,\s]*)\s*,\s*([^,\s]*)\s*\}\s*;", animData) - if matchResult is None: - raise PluginError("Cannot find animation named " + animName + " in " + filepath) - frameCount = hexOrDecInt(matchResult.group(1).strip()) - frameDataName = matchResult.group(2).strip() - jointIndicesName = matchResult.group(3).strip() - staticIndexMax = hexOrDecInt(matchResult.group(4).strip()) - - frameData = getFrameData(filepath, animData, frameDataName) - jointIndices = getJointIndices(filepath, animData, jointIndicesName) - - #print(frameDataName + " " + jointIndicesName) - #print(str(frameData) + "\n" + str(jointIndices)) - - bpy.context.scene.frame_end = frameCount - anim = bpy.data.actions.new(animName) - - startBoneName = getStartBone(armatureObj) - boneStack = [startBoneName] - - isRootTranslation = True - # boneFrameData = [[x keyframes], [y keyframes], [z keyframes]] - # len(armatureFrameData) should be = number of bones - # property index = 0,1,2 (aka x,y,z) - for jointIndex in jointIndices: - if isRootTranslation: - for propertyIndex in range(3): - fcurve = anim.fcurves.new( - data_path = 'pose.bones["' + startBoneName + '"].location', - index = propertyIndex, - action_group = startBoneName) - if jointIndex[propertyIndex] < staticIndexMax: - value = frameData[jointIndex[propertyIndex]] / actorScale - fcurve.keyframe_points.insert(0, value) - else: - for frame in range(frameCount): - value = frameData[jointIndex[propertyIndex] + frame] / actorScale - fcurve.keyframe_points.insert(frame, value) - isRootTranslation = False - else: - # WARNING: This assumes the order bones are processed are in alphabetical order. - # If this changes in the future, then this won't work. - bone, boneStack = getNextBone(boneStack, armatureObj) - for propertyIndex in range(3): - fcurve = anim.fcurves.new( - data_path = 'pose.bones["' + bone.name + '"].rotation_euler', - index = propertyIndex, - action_group = bone.name) - if jointIndex[propertyIndex] < staticIndexMax: - value = math.radians(frameData[jointIndex[propertyIndex]] * 360 / (2**16)) - fcurve.keyframe_points.insert(0, value) - else: - for frame in range(frameCount): - value = math.radians(frameData[jointIndex[propertyIndex] + frame] * 360 / (2**16)) - fcurve.keyframe_points.insert(frame, value) - - if armatureObj.animation_data is None: - armatureObj.animation_data_create() - armatureObj.animation_data.action = anim + animData = readFile(filepath) + + matchResult = re.search( + re.escape(animName) + + "\s*=\s*\{\s*\{\s*([^,\s]*)\s*\}*\s*,\s*([^,\s]*)\s*,\s*([^,\s]*)\s*,\s*([^,\s]*)\s*\}\s*;", + animData, + ) + if matchResult is None: + raise PluginError("Cannot find animation named " + animName + " in " + filepath) + frameCount = hexOrDecInt(matchResult.group(1).strip()) + frameDataName = matchResult.group(2).strip() + jointIndicesName = matchResult.group(3).strip() + staticIndexMax = hexOrDecInt(matchResult.group(4).strip()) + + frameData = getFrameData(filepath, animData, frameDataName) + jointIndices = getJointIndices(filepath, animData, jointIndicesName) + + # print(frameDataName + " " + jointIndicesName) + # print(str(frameData) + "\n" + str(jointIndices)) + + bpy.context.scene.frame_end = frameCount + anim = bpy.data.actions.new(animName) + + startBoneName = getStartBone(armatureObj) + boneStack = [startBoneName] + + isRootTranslation = True + # boneFrameData = [[x keyframes], [y keyframes], [z keyframes]] + # len(armatureFrameData) should be = number of bones + # property index = 0,1,2 (aka x,y,z) + for jointIndex in jointIndices: + if isRootTranslation: + for propertyIndex in range(3): + fcurve = anim.fcurves.new( + data_path='pose.bones["' + startBoneName + '"].location', + index=propertyIndex, + action_group=startBoneName, + ) + if jointIndex[propertyIndex] < staticIndexMax: + value = frameData[jointIndex[propertyIndex]] / actorScale + fcurve.keyframe_points.insert(0, value) + else: + for frame in range(frameCount): + value = ( + frameData[jointIndex[propertyIndex] + frame] / actorScale + ) + fcurve.keyframe_points.insert(frame, value) + isRootTranslation = False + else: + # WARNING: This assumes the order bones are processed are in alphabetical order. + # If this changes in the future, then this won't work. + bone, boneStack = getNextBone(boneStack, armatureObj) + for propertyIndex in range(3): + fcurve = anim.fcurves.new( + data_path='pose.bones["' + bone.name + '"].rotation_euler', + index=propertyIndex, + action_group=bone.name, + ) + if jointIndex[propertyIndex] < staticIndexMax: + value = math.radians( + frameData[jointIndex[propertyIndex]] * 360 / (2 ** 16) + ) + fcurve.keyframe_points.insert(0, value) + else: + for frame in range(frameCount): + value = math.radians( + frameData[jointIndex[propertyIndex] + frame] + * 360 + / (2 ** 16) + ) + fcurve.keyframe_points.insert(frame, value) + + if armatureObj.animation_data is None: + armatureObj.animation_data_create() + armatureObj.animation_data.action = anim + def getFrameData(filepath, animData, frameDataName): - matchResult = re.search(re.escape(frameDataName) + "\s*\[\s*[0-9]*\s*\]\s*=\s*\{([^\}]*)\}", animData, re.DOTALL) - if matchResult is None: - raise PluginError("Cannot find animation frame data named " + frameDataName + " in " + filepath) - data = matchResult.group(1) - frameData = [int.from_bytes([int(value.strip()[2:4], 16), int(value.strip()[4:6], 16)], - 'big', signed = True) for value in data.split(",") if value.strip() != ""] + matchResult = re.search( + re.escape(frameDataName) + "\s*\[\s*[0-9]*\s*\]\s*=\s*\{([^\}]*)\}", + animData, + re.DOTALL, + ) + if matchResult is None: + raise PluginError( + "Cannot find animation frame data named " + + frameDataName + + " in " + + filepath + ) + data = matchResult.group(1) + frameData = [ + int.from_bytes( + [int(value.strip()[2:4], 16), int(value.strip()[4:6], 16)], + "big", + signed=True, + ) + for value in data.split(",") + if value.strip() != "" + ] + + return frameData - return frameData def getJointIndices(filepath, animData, jointIndicesName): - matchResult = re.search(re.escape(jointIndicesName) + "\s*\[\s*[0-9]*\s*\]\s*=\s*\{([^;]*);", animData, re.DOTALL) - if matchResult is None: - raise PluginError("Cannot find animation joint indices data named " + jointIndicesName + " in " + filepath) - data = matchResult.group(1) - jointIndicesData = [[hexOrDecInt(match.group(i)) for i in range(1,4)] for match in re.finditer("\{([^,\}]*),([^,\}]*),([^,\}]*)\s*,?\s*\}", data, re.DOTALL)] + matchResult = re.search( + re.escape(jointIndicesName) + "\s*\[\s*[0-9]*\s*\]\s*=\s*\{([^;]*);", + animData, + re.DOTALL, + ) + if matchResult is None: + raise PluginError( + "Cannot find animation joint indices data named " + + jointIndicesName + + " in " + + filepath + ) + data = matchResult.group(1) + jointIndicesData = [ + [hexOrDecInt(match.group(i)) for i in range(1, 4)] + for match in re.finditer( + "\{([^,\}]*),([^,\}]*),([^,\}]*)\s*,?\s*\}", data, re.DOTALL + ) + ] + + return jointIndicesData - return jointIndicesData class OOT_ExportAnim(bpy.types.Operator): - bl_idname = 'object.oot_export_anim' - bl_label = "Export Animation" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - try: - if len(context.selected_objects) == 0 or not \ - isinstance(context.selected_objects[0].data, bpy.types.Armature): - raise PluginError("Armature not selected.") - if len(context.selected_objects) > 1 : - raise PluginError("Multiple objects selected, make sure to select only one.") - armatureObj = context.selected_objects[0] - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = "OBJECT") - except Exception as e: - raisePluginError(self, e) - return {"CANCELLED"} - - try: - isCustomExport = context.scene.ootAnimIsCustomExport - exportPath = bpy.path.abspath(context.scene.ootAnimExportCustomPath) - folderName = context.scene.ootAnimExportFolderName - skeletonName = context.scene.ootAnimSkeletonName - - path = ootGetObjectPath(isCustomExport, exportPath, folderName) - - exportAnimationC(armatureObj, path, isCustomExport, folderName, skeletonName) - self.report({'INFO'}, 'Success!') - - except Exception as e: - raisePluginError(self, e) - return {'CANCELLED'} # must return a set - - return {'FINISHED'} # must return a set + bl_idname = "object.oot_export_anim" + bl_label = "Export Animation" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + try: + if len(context.selected_objects) == 0 or not isinstance( + context.selected_objects[0].data, bpy.types.Armature + ): + raise PluginError("Armature not selected.") + if len(context.selected_objects) > 1: + raise PluginError( + "Multiple objects selected, make sure to select only one." + ) + armatureObj = context.selected_objects[0] + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} + + try: + isCustomExport = context.scene.ootAnimIsCustomExport + exportPath = bpy.path.abspath(context.scene.ootAnimExportCustomPath) + folderName = context.scene.ootAnimExportFolderName + skeletonName = context.scene.ootAnimSkeletonName + + path = ootGetObjectPath(isCustomExport, exportPath, folderName) + + exportAnimationC( + armatureObj, path, isCustomExport, folderName, skeletonName + ) + self.report({"INFO"}, "Success!") + + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} # must return a set + + return {"FINISHED"} # must return a set + class OOT_ImportAnim(bpy.types.Operator): - bl_idname = 'object.oot_import_anim' - bl_label = "Import Animation" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - try: - if len(context.selected_objects) == 0 or not \ - isinstance(context.selected_objects[0].data, bpy.types.Armature): - raise PluginError("Armature not selected.") - if len(context.selected_objects) > 1 : - raise PluginError("Multiple objects selected, make sure to select only one.") - armatureObj = context.selected_objects[0] - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = "OBJECT") - except Exception as e: - raisePluginError(self, e) - return {"CANCELLED"} - - try: - isCustomImport = context.scene.ootAnimIsCustomImport - folderName = context.scene.ootAnimImportFolderName - importPath = bpy.path.abspath(context.scene.ootAnimImportCustomPath) - animName = context.scene.ootAnimName - actorScale = context.scene.ootActorBlenderScale - - path = ootGetObjectPath(isCustomImport, importPath, folderName) - - ootImportAnimationC(armatureObj, path, animName, actorScale) - self.report({'INFO'}, 'Success!') - - except Exception as e: - raisePluginError(self, e) - return {'CANCELLED'} # must return a set - - return {'FINISHED'} # must return a set + bl_idname = "object.oot_import_anim" + bl_label = "Import Animation" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + try: + if len(context.selected_objects) == 0 or not isinstance( + context.selected_objects[0].data, bpy.types.Armature + ): + raise PluginError("Armature not selected.") + if len(context.selected_objects) > 1: + raise PluginError( + "Multiple objects selected, make sure to select only one." + ) + armatureObj = context.selected_objects[0] + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} + + try: + isCustomImport = context.scene.ootAnimIsCustomImport + folderName = context.scene.ootAnimImportFolderName + importPath = bpy.path.abspath(context.scene.ootAnimImportCustomPath) + animName = context.scene.ootAnimName + actorScale = context.scene.ootActorBlenderScale + + path = ootGetObjectPath(isCustomImport, importPath, folderName) + + ootImportAnimationC(armatureObj, path, animName, actorScale) + self.report({"INFO"}, "Success!") + + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} # must return a set + + return {"FINISHED"} # must return a set + class OOT_ExportAnimPanel(OOT_Panel): - bl_idname = "OOT_PT_export_anim" - bl_label = "OOT Animation Exporter" + bl_idname = "OOT_PT_export_anim" + bl_label = "OOT Animation Exporter" - # called every frame - def draw(self, context): - col = self.layout.column() + # called every frame + def draw(self, context): + col = self.layout.column() - col.operator(OOT_ExportAnim.bl_idname) - prop_split(col, context.scene, 'ootAnimSkeletonName', 'Skeleton Name') - if context.scene.ootAnimIsCustomExport: - prop_split(col, context.scene, 'ootAnimExportCustomPath', "Folder") - else: - prop_split(col, context.scene, 'ootAnimExportFolderName', 'Object') - col.prop(context.scene, 'ootAnimIsCustomExport') + col.operator(OOT_ExportAnim.bl_idname) + prop_split(col, context.scene, "ootAnimSkeletonName", "Skeleton Name") + if context.scene.ootAnimIsCustomExport: + prop_split(col, context.scene, "ootAnimExportCustomPath", "Folder") + else: + prop_split(col, context.scene, "ootAnimExportFolderName", "Object") + col.prop(context.scene, "ootAnimIsCustomExport") + col.operator(OOT_ImportAnim.bl_idname) + prop_split(col, context.scene, "ootAnimName", "Anim Name") - col.operator(OOT_ImportAnim.bl_idname) - prop_split(col, context.scene, 'ootAnimName', 'Anim Name') - - if context.scene.ootAnimIsCustomImport: - prop_split(col, context.scene, 'ootAnimImportCustomPath', "File") - else: - prop_split(col, context.scene, 'ootAnimImportFolderName', 'Object') - col.prop(context.scene, 'ootAnimIsCustomImport') - + if context.scene.ootAnimIsCustomImport: + prop_split(col, context.scene, "ootAnimImportCustomPath", "File") + else: + prop_split(col, context.scene, "ootAnimImportFolderName", "Object") + col.prop(context.scene, "ootAnimIsCustomImport") oot_anim_classes = ( - OOT_ExportAnim, - OOT_ImportAnim, + OOT_ExportAnim, + OOT_ImportAnim, ) -oot_anim_panels = ( - OOT_ExportAnimPanel, -) +oot_anim_panels = (OOT_ExportAnimPanel,) + def oot_anim_panel_register(): - for cls in oot_anim_panels: - register_class(cls) + for cls in oot_anim_panels: + register_class(cls) + def oot_anim_panel_unregister(): - for cls in oot_anim_panels: - unregister_class(cls) + for cls in oot_anim_panels: + unregister_class(cls) -def oot_anim_register(): - bpy.types.Scene.ootAnimIsCustomExport = bpy.props.BoolProperty(name = "Use Custom Path") - bpy.types.Scene.ootAnimExportCustomPath = bpy.props.StringProperty( - name ='Folder', subtype = 'FILE_PATH') - bpy.types.Scene.ootAnimExportFolderName = bpy.props.StringProperty(name = "Animation Folder", default = "object_geldb") - bpy.types.Scene.ootAnimIsCustomImport = bpy.props.BoolProperty(name = "Use Custom Path") - bpy.types.Scene.ootAnimImportCustomPath = bpy.props.StringProperty( - name ='Folder', subtype = 'FILE_PATH') - bpy.types.Scene.ootAnimImportFolderName = bpy.props.StringProperty(name = "Animation Folder", default = "object_geldb") +def oot_anim_register(): + bpy.types.Scene.ootAnimIsCustomExport = bpy.props.BoolProperty( + name="Use Custom Path" + ) + bpy.types.Scene.ootAnimExportCustomPath = bpy.props.StringProperty( + name="Folder", subtype="FILE_PATH" + ) + bpy.types.Scene.ootAnimExportFolderName = bpy.props.StringProperty( + name="Animation Folder", default="object_geldb" + ) + + bpy.types.Scene.ootAnimIsCustomImport = bpy.props.BoolProperty( + name="Use Custom Path" + ) + bpy.types.Scene.ootAnimImportCustomPath = bpy.props.StringProperty( + name="Folder", subtype="FILE_PATH" + ) + bpy.types.Scene.ootAnimImportFolderName = bpy.props.StringProperty( + name="Animation Folder", default="object_geldb" + ) + + bpy.types.Scene.ootAnimSkeletonName = bpy.props.StringProperty( + name="Skeleton Name", default="gGerudoRedSkel" + ) + bpy.types.Scene.ootAnimName = bpy.props.StringProperty( + name="Anim Name", default="gGerudoRedSpinAttackAnim" + ) + for cls in oot_anim_classes: + register_class(cls) - bpy.types.Scene.ootAnimSkeletonName = bpy.props.StringProperty(name = "Skeleton Name", default = "gGerudoRedSkel") - bpy.types.Scene.ootAnimName = bpy.props.StringProperty(name = "Anim Name", default = "gGerudoRedSpinAttackAnim") - for cls in oot_anim_classes: - register_class(cls) def oot_anim_unregister(): - del bpy.types.Scene.ootAnimIsCustomExport - del bpy.types.Scene.ootAnimExportCustomPath - del bpy.types.Scene.ootAnimExportFolderName - - del bpy.types.Scene.ootAnimIsCustomImport - del bpy.types.Scene.ootAnimImportCustomPath - del bpy.types.Scene.ootAnimImportFolderName - - del bpy.types.Scene.ootAnimSkeletonName - del bpy.types.Scene.ootAnimName - for cls in reversed(oot_anim_classes): - unregister_class(cls) + del bpy.types.Scene.ootAnimIsCustomExport + del bpy.types.Scene.ootAnimExportCustomPath + del bpy.types.Scene.ootAnimExportFolderName + + del bpy.types.Scene.ootAnimIsCustomImport + del bpy.types.Scene.ootAnimImportCustomPath + del bpy.types.Scene.ootAnimImportFolderName + + del bpy.types.Scene.ootAnimSkeletonName + del bpy.types.Scene.ootAnimName + for cls in reversed(oot_anim_classes): + unregister_class(cls) diff --git a/fast64_internal/oot/oot_collision.py b/fast64_internal/oot/oot_collision.py index 164cd7a28..f03e8c57b 100644 --- a/fast64_internal/oot/oot_collision.py +++ b/fast64_internal/oot/oot_collision.py @@ -10,545 +10,735 @@ from .oot_collision_classes import * from .oot_scene_room import * + class OOTCameraPositionProperty(bpy.types.PropertyGroup): - index : bpy.props.IntProperty(min = 0) - jfifID : bpy.props.StringProperty(default = "-1") - camSType : bpy.props.EnumProperty(items = ootEnumCameraSType, default = 'CAM_SET_NONE') - camSTypeCustom : bpy.props.StringProperty(default = "CAM_SET_NONE") - hasPositionData : bpy.props.BoolProperty(default = True, name = "Has Position Data") + index: bpy.props.IntProperty(min=0) + jfifID: bpy.props.StringProperty(default="-1") + camSType: bpy.props.EnumProperty(items=ootEnumCameraSType, default="CAM_SET_NONE") + camSTypeCustom: bpy.props.StringProperty(default="CAM_SET_NONE") + hasPositionData: bpy.props.BoolProperty(default=True, name="Has Position Data") + class OOTCameraPositionPropertyRef(bpy.types.PropertyGroup): - camera : bpy.props.PointerProperty(type = bpy.types.Camera) + camera: bpy.props.PointerProperty(type=bpy.types.Camera) + class OOTMaterialCollisionProperty(bpy.types.PropertyGroup): - expandTab : bpy.props.BoolProperty() - - ignoreCameraCollision : bpy.props.BoolProperty() - ignoreActorCollision : bpy.props.BoolProperty() - ignoreProjectileCollision : bpy.props.BoolProperty() - - eponaBlock : bpy.props.BoolProperty() - decreaseHeight : bpy.props.BoolProperty() - floorSettingCustom : bpy.props.StringProperty(default = '0x00') - floorSetting : bpy.props.EnumProperty(items = ootEnumFloorSetting, default = "0x00") - wallSettingCustom : bpy.props.StringProperty(default = '0x00') - wallSetting : bpy.props.EnumProperty(items = ootEnumWallSetting, default = "0x00") - floorPropertyCustom : bpy.props.StringProperty(default = '0x00') - floorProperty : bpy.props.EnumProperty(items = ootEnumFloorProperty, default = "0x00") - exitID : bpy.props.IntProperty(default = 0, min = 0) - cameraID : bpy.props.IntProperty(default = 0, min = 0) - isWallDamage : bpy.props.BoolProperty() - conveyorOption : bpy.props.EnumProperty(items = ootEnumConveyer) - conveyorRotation : bpy.props.FloatProperty(min = 0, max = 2 * math.pi, subtype = "ANGLE") - conveyorSpeed : bpy.props.EnumProperty(items = ootEnumConveyorSpeed, default = "0x00") - conveyorSpeedCustom : bpy.props.StringProperty(default = "0x00") - conveyorKeepMomentum : bpy.props.BoolProperty() - hookshotable : bpy.props.BoolProperty() - echo : bpy.props.StringProperty(default = "0x00") - lightingSetting : bpy.props.IntProperty(default = 0, min = 0) - terrainCustom : bpy.props.StringProperty(default = '0x00') - terrain : bpy.props.EnumProperty(items = ootEnumCollisionTerrain, default = "0x00") - soundCustom : bpy.props.StringProperty(default = '0x00') - sound : bpy.props.EnumProperty(items = ootEnumCollisionSound, default = "0x00") + expandTab: bpy.props.BoolProperty() + + ignoreCameraCollision: bpy.props.BoolProperty() + ignoreActorCollision: bpy.props.BoolProperty() + ignoreProjectileCollision: bpy.props.BoolProperty() + + eponaBlock: bpy.props.BoolProperty() + decreaseHeight: bpy.props.BoolProperty() + floorSettingCustom: bpy.props.StringProperty(default="0x00") + floorSetting: bpy.props.EnumProperty(items=ootEnumFloorSetting, default="0x00") + wallSettingCustom: bpy.props.StringProperty(default="0x00") + wallSetting: bpy.props.EnumProperty(items=ootEnumWallSetting, default="0x00") + floorPropertyCustom: bpy.props.StringProperty(default="0x00") + floorProperty: bpy.props.EnumProperty(items=ootEnumFloorProperty, default="0x00") + exitID: bpy.props.IntProperty(default=0, min=0) + cameraID: bpy.props.IntProperty(default=0, min=0) + isWallDamage: bpy.props.BoolProperty() + conveyorOption: bpy.props.EnumProperty(items=ootEnumConveyer) + conveyorRotation: bpy.props.FloatProperty(min=0, max=2 * math.pi, subtype="ANGLE") + conveyorSpeed: bpy.props.EnumProperty(items=ootEnumConveyorSpeed, default="0x00") + conveyorSpeedCustom: bpy.props.StringProperty(default="0x00") + conveyorKeepMomentum: bpy.props.BoolProperty() + hookshotable: bpy.props.BoolProperty() + echo: bpy.props.StringProperty(default="0x00") + lightingSetting: bpy.props.IntProperty(default=0, min=0) + terrainCustom: bpy.props.StringProperty(default="0x00") + terrain: bpy.props.EnumProperty(items=ootEnumCollisionTerrain, default="0x00") + soundCustom: bpy.props.StringProperty(default="0x00") + sound: bpy.props.EnumProperty(items=ootEnumCollisionSound, default="0x00") + class OOTWaterBoxProperty(bpy.types.PropertyGroup): - lighting : bpy.props.IntProperty(name = 'Lighting', min = 0) - camera: bpy.props.IntProperty(name = "Camera", min = 0) + lighting: bpy.props.IntProperty(name="Lighting", min=0) + camera: bpy.props.IntProperty(name="Camera", min=0) + def drawWaterBoxProperty(layout, waterBoxProp): - box = layout.column() - #box.box().label(text = "Properties") - prop_split(box, waterBoxProp, 'lighting', "Lighting") - prop_split(box, waterBoxProp, 'camera', "Camera") - box.label(text = "Defined by top face of box empty.") - box.label(text = "No rotation allowed.") + box = layout.column() + # box.box().label(text = "Properties") + prop_split(box, waterBoxProp, "lighting", "Lighting") + prop_split(box, waterBoxProp, "camera", "Camera") + box.label(text="Defined by top face of box empty.") + box.label(text="No rotation allowed.") + def drawCameraPosProperty(layout, cameraRefProp, index, headerIndex, objName): - camBox = layout.box() - prop_split(camBox, cameraRefProp, "camera", "Camera " + str(index)) - drawCollectionOps(camBox, index, "Camera Position", headerIndex, objName) + camBox = layout.box() + prop_split(camBox, cameraRefProp, "camera", "Camera " + str(index)) + drawCollectionOps(camBox, index, "Camera Position", headerIndex, objName) + class OOT_CameraPosPanel(bpy.types.Panel): - bl_label = "Camera Position Inspector" - bl_idname = "OBJECT_PT_OOT_Camera_Position_Inspector" - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "object" - bl_options = {'HIDE_HEADER'} - - @classmethod - def poll(cls, context): - return (context.scene.gameEditorMode == "OOT" and isinstance(context.object.data, bpy.types.Camera)) - - def draw(self, context): - box = self.layout.box() - obj = context.object - - box.box().label(text = "Camera Data") - drawEnumWithCustom(box, obj.ootCameraPositionProperty, "camSType", "Camera S Type", "") - prop_split(box, obj.ootCameraPositionProperty, "index", "Camera Index") - if obj.ootCameraPositionProperty.hasPositionData: - prop_split(box, obj.data, "angle", "Field Of View") - prop_split(box, obj.ootCameraPositionProperty, "jfifID", "JFIF ID") - box.prop(obj.ootCameraPositionProperty, 'hasPositionData') - - #drawParentSceneRoom(box, context.object) - + bl_label = "Camera Position Inspector" + bl_idname = "OBJECT_PT_OOT_Camera_Position_Inspector" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "object" + bl_options = {"HIDE_HEADER"} + + @classmethod + def poll(cls, context): + return context.scene.gameEditorMode == "OOT" and isinstance( + context.object.data, bpy.types.Camera + ) + + def draw(self, context): + box = self.layout.box() + obj = context.object + + box.box().label(text="Camera Data") + drawEnumWithCustom( + box, obj.ootCameraPositionProperty, "camSType", "Camera S Type", "" + ) + prop_split(box, obj.ootCameraPositionProperty, "index", "Camera Index") + if obj.ootCameraPositionProperty.hasPositionData: + prop_split(box, obj.data, "angle", "Field Of View") + prop_split(box, obj.ootCameraPositionProperty, "jfifID", "JFIF ID") + box.prop(obj.ootCameraPositionProperty, "hasPositionData") + + # drawParentSceneRoom(box, context.object) + class OOT_CollisionPanel(bpy.types.Panel): - bl_label = "Collision Inspector" - bl_idname = "MATERIAL_PT_OOT_Collision_Inspector" - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "material" - bl_options = {'HIDE_HEADER'} - - @classmethod - def poll(cls, context): - return (context.scene.gameEditorMode == "OOT" and context.material is not None) - - def draw(self, context): - box = self.layout.box().column() - collisionProp = context.material.ootCollisionProperty - - box.prop(collisionProp, 'expandTab', text = "OOT Collision Properties", - icon = 'TRIA_DOWN' if collisionProp.expandTab else \ - 'TRIA_RIGHT') - if collisionProp.expandTab: - prop_split(box, collisionProp, "exitID", "Exit ID") - prop_split(box, collisionProp, "cameraID", "Camera ID") - prop_split(box, collisionProp, "echo", "Echo") - prop_split(box, collisionProp, "lightingSetting", "Lighting") - drawEnumWithCustom(box, collisionProp, "terrain", "Terrain", "") - drawEnumWithCustom(box, collisionProp, "sound", "Sound", "") - - box.prop(collisionProp, "eponaBlock", text = "Blocks Epona") - box.prop(collisionProp, "decreaseHeight", text = "Decrease Height 1 Unit") - box.prop(collisionProp, "isWallDamage", text = "Is Wall Damage") - box.prop(collisionProp, "hookshotable", text = "Hookshotable") - - drawEnumWithCustom(box, collisionProp, "floorSetting", "Floor Setting", "") - drawEnumWithCustom(box, collisionProp, "wallSetting", "Wall Setting", "") - drawEnumWithCustom(box, collisionProp, "floorProperty", "Floor Property", "") - - box.prop(collisionProp, "ignoreCameraCollision", text = "Ignore Camera Collision") - box.prop(collisionProp, "ignoreActorCollision", text = "Ignore Actor Collision") - box.prop(collisionProp, "ignoreProjectileCollision", text = "Ignore Projectile Collision") - prop_split(box, collisionProp, "conveyorOption", "Conveyor Option") - if collisionProp.conveyorOption != "None": - prop_split(box, collisionProp, "conveyorRotation", "Conveyor Rotation") - drawEnumWithCustom(box, collisionProp, 'conveyorSpeed', "Conveyor Speed", "") - if collisionProp.conveyorSpeed != "Custom": - box.prop(collisionProp, "conveyorKeepMomentum", text = "Keep Momentum") - -# water boxes handled by level writer + bl_label = "Collision Inspector" + bl_idname = "MATERIAL_PT_OOT_Collision_Inspector" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "material" + bl_options = {"HIDE_HEADER"} + + @classmethod + def poll(cls, context): + return context.scene.gameEditorMode == "OOT" and context.material is not None + + def draw(self, context): + box = self.layout.box().column() + collisionProp = context.material.ootCollisionProperty + + box.prop( + collisionProp, + "expandTab", + text="OOT Collision Properties", + icon="TRIA_DOWN" if collisionProp.expandTab else "TRIA_RIGHT", + ) + if collisionProp.expandTab: + prop_split(box, collisionProp, "exitID", "Exit ID") + prop_split(box, collisionProp, "cameraID", "Camera ID") + prop_split(box, collisionProp, "echo", "Echo") + prop_split(box, collisionProp, "lightingSetting", "Lighting") + drawEnumWithCustom(box, collisionProp, "terrain", "Terrain", "") + drawEnumWithCustom(box, collisionProp, "sound", "Sound", "") + + box.prop(collisionProp, "eponaBlock", text="Blocks Epona") + box.prop(collisionProp, "decreaseHeight", text="Decrease Height 1 Unit") + box.prop(collisionProp, "isWallDamage", text="Is Wall Damage") + box.prop(collisionProp, "hookshotable", text="Hookshotable") + + drawEnumWithCustom(box, collisionProp, "floorSetting", "Floor Setting", "") + drawEnumWithCustom(box, collisionProp, "wallSetting", "Wall Setting", "") + drawEnumWithCustom( + box, collisionProp, "floorProperty", "Floor Property", "" + ) + + box.prop( + collisionProp, "ignoreCameraCollision", text="Ignore Camera Collision" + ) + box.prop( + collisionProp, "ignoreActorCollision", text="Ignore Actor Collision" + ) + box.prop( + collisionProp, + "ignoreProjectileCollision", + text="Ignore Projectile Collision", + ) + prop_split(box, collisionProp, "conveyorOption", "Conveyor Option") + if collisionProp.conveyorOption != "None": + prop_split(box, collisionProp, "conveyorRotation", "Conveyor Rotation") + drawEnumWithCustom( + box, collisionProp, "conveyorSpeed", "Conveyor Speed", "" + ) + if collisionProp.conveyorSpeed != "Custom": + box.prop( + collisionProp, "conveyorKeepMomentum", text="Keep Momentum" + ) + + +# water boxes handled by level writer def exportCollisionCommon(collision, obj, transformMatrix, includeChildren, name): - bpy.ops.object.select_all(action = 'DESELECT') - obj.select_set(True) - - # dict of collisionType : faces - collisionDict = {} - - addCollisionTriangles(obj, collisionDict, includeChildren, transformMatrix, collision.bounds) - for polygonType, faces in collisionDict.items(): - collision.polygonGroups[polygonType] = [] - for (faceVerts, normal, distance) in faces: - indices = [] - for roundedPosition in faceVerts: - index = collisionVertIndex(roundedPosition, collision.vertices) - if index is None: - collision.vertices.append(OOTCollisionVertex(roundedPosition)) - indices.append(len(collision.vertices) - 1) - else: - indices.append(index) - collision.polygonGroups[polygonType].append(OOTCollisionPolygon(indices, normal, distance)) - -def exportCollisionToC(originalObj, transformMatrix, includeChildren, name, isCustomExport, folderName, - exportPath): - collision = OOTCollision(name) - collision.cameraData = OOTCameraData(name) - - if bpy.context.scene.exportHiddenGeometry: - hiddenObjs = unhideAllAndGetHiddenList(bpy.context.scene) - - # Don't remove ignore_render, as we want to resuse this for collision - obj, allObjs = \ - ootDuplicateHierarchy(originalObj, None, True, OOTObjectCategorizer()) - - if bpy.context.scene.exportHiddenGeometry: - hideObjsInList(hiddenObjs) - - try: - exportCollisionCommon(collision, obj, transformMatrix, includeChildren, name) - ootCleanupScene(originalObj, allObjs) - except Exception as e: - ootCleanupScene(originalObj, allObjs) - raise Exception(str(e)) - - collisionC = ootCollisionToC(collision) - - data = CData() - data.source += '#include "ultra64.h"\n#include "z64.h"\n#include "macros.h"\n' - if not isCustomExport: - data.source += '#include "' + folderName + '.h"\n\n' - else: - data.source += '\n' - - data.append(collisionC) - - path = ootGetPath(exportPath, isCustomExport, 'assets/objects/', folderName, False, False) - writeCData(data, - os.path.join(path, name + '.h'), - os.path.join(path, name + '.c')) - - if not isCustomExport: - addIncludeFiles(folderName, path, name) + bpy.ops.object.select_all(action="DESELECT") + obj.select_set(True) + + # dict of collisionType : faces + collisionDict = {} + + addCollisionTriangles( + obj, collisionDict, includeChildren, transformMatrix, collision.bounds + ) + for polygonType, faces in collisionDict.items(): + collision.polygonGroups[polygonType] = [] + for (faceVerts, normal, distance) in faces: + indices = [] + for roundedPosition in faceVerts: + index = collisionVertIndex(roundedPosition, collision.vertices) + if index is None: + collision.vertices.append(OOTCollisionVertex(roundedPosition)) + indices.append(len(collision.vertices) - 1) + else: + indices.append(index) + collision.polygonGroups[polygonType].append( + OOTCollisionPolygon(indices, normal, distance) + ) + + +def exportCollisionToC( + originalObj, + transformMatrix, + includeChildren, + name, + isCustomExport, + folderName, + exportPath, +): + collision = OOTCollision(name) + collision.cameraData = OOTCameraData(name) + + if bpy.context.scene.exportHiddenGeometry: + hiddenObjs = unhideAllAndGetHiddenList(bpy.context.scene) + + # Don't remove ignore_render, as we want to resuse this for collision + obj, allObjs = ootDuplicateHierarchy( + originalObj, None, True, OOTObjectCategorizer() + ) + + if bpy.context.scene.exportHiddenGeometry: + hideObjsInList(hiddenObjs) + + try: + exportCollisionCommon(collision, obj, transformMatrix, includeChildren, name) + ootCleanupScene(originalObj, allObjs) + except Exception as e: + ootCleanupScene(originalObj, allObjs) + raise Exception(str(e)) + + collisionC = ootCollisionToC(collision) + + data = CData() + data.source += '#include "ultra64.h"\n#include "z64.h"\n#include "macros.h"\n' + if not isCustomExport: + data.source += '#include "' + folderName + '.h"\n\n' + else: + data.source += "\n" + + data.append(collisionC) + + path = ootGetPath( + exportPath, isCustomExport, "assets/objects/", folderName, False, False + ) + writeCData(data, os.path.join(path, name + ".h"), os.path.join(path, name + ".c")) + + if not isCustomExport: + addIncludeFiles(folderName, path, name) + def updateBounds(position, bounds): - if len(bounds) == 0: - bounds.append([position[0], position[1], position[2]]) - bounds.append([position[0], position[1], position[2]]) - return - - minBounds = bounds[0] - maxBounds = bounds[1] - for i in range(3): - if position[i] < minBounds[i]: - minBounds[i] = position[i] - if position[i] > maxBounds[i]: - maxBounds[i] = position[i] + if len(bounds) == 0: + bounds.append([position[0], position[1], position[2]]) + bounds.append([position[0], position[1], position[2]]) + return + + minBounds = bounds[0] + maxBounds = bounds[1] + for i in range(3): + if position[i] < minBounds[i]: + minBounds[i] = position[i] + if position[i] > maxBounds[i]: + maxBounds[i] = position[i] + def addCollisionTriangles(obj, collisionDict, includeChildren, transformMatrix, bounds): - if isinstance(obj.data, bpy.types.Mesh) and not obj.ignore_collision: - if len(obj.data.materials) == 0: - raise PluginError(obj.name + " must have a material associated with it.") - obj.data.calc_loop_triangles() - for face in obj.data.loop_triangles: - material = obj.material_slots[face.material_index].material - polygonType = getPolygonType(material.ootCollisionProperty) - - planePoint = transformMatrix @ obj.data.vertices[face.vertices[0]].co - (x1, y1, z1) = roundPosition(planePoint) - (x2, y2, z2) = roundPosition(transformMatrix @ obj.data.vertices[face.vertices[1]].co) - (x3, y3, z3) = roundPosition(transformMatrix @ obj.data.vertices[face.vertices[2]].co) - - updateBounds((x1, y1, z1), bounds) - updateBounds((x2, y2, z2), bounds) - updateBounds((x3, y3, z3), bounds) - - faceNormal = (transformMatrix.inverted().transposed() @ face.normal).normalized() - normal = convertNormalizedVectorToShort(faceNormal) - distance = int(round(-1 * ( - faceNormal[0] * planePoint[0] + \ - faceNormal[1] * planePoint[1] + \ - faceNormal[2] * planePoint[2]))) - distance = convertIntTo2sComplement(distance, 2, True) - - nx = (y2 - y1) * (z3 - z2) - (z2 - z1) * (y3 - y2) - ny = (z2 - z1) * (x3 - x2) - (x2 - x1) * (z3 - z2) - nz = (x2 - x1) * (y3 - y2) - (y2 - y1) * (x3 - x2) - magSqr = nx * nx + ny * ny + nz * nz - - if magSqr <= 0: - print("Ignore denormalized triangle.") - continue - - if polygonType not in collisionDict: - collisionDict[polygonType] = [] - - positions = sorted(( - (x1, y1, z1), - (x2, y2, z2), - (x3, y3, z3)), key=lambda x: x[1]) # sort by min y to avoid minY bug - - collisionDict[polygonType].append((positions, normal, distance)) - - if includeChildren: - for child in obj.children: - addCollisionTriangles(child, collisionDict, includeChildren, transformMatrix @ child.matrix_local, bounds) + if isinstance(obj.data, bpy.types.Mesh) and not obj.ignore_collision: + if len(obj.data.materials) == 0: + raise PluginError(obj.name + " must have a material associated with it.") + obj.data.calc_loop_triangles() + for face in obj.data.loop_triangles: + material = obj.material_slots[face.material_index].material + polygonType = getPolygonType(material.ootCollisionProperty) + + planePoint = transformMatrix @ obj.data.vertices[face.vertices[0]].co + (x1, y1, z1) = roundPosition(planePoint) + (x2, y2, z2) = roundPosition( + transformMatrix @ obj.data.vertices[face.vertices[1]].co + ) + (x3, y3, z3) = roundPosition( + transformMatrix @ obj.data.vertices[face.vertices[2]].co + ) + + updateBounds((x1, y1, z1), bounds) + updateBounds((x2, y2, z2), bounds) + updateBounds((x3, y3, z3), bounds) + + faceNormal = ( + transformMatrix.inverted().transposed() @ face.normal + ).normalized() + normal = convertNormalizedVectorToShort(faceNormal) + distance = int( + round( + -1 + * ( + faceNormal[0] * planePoint[0] + + faceNormal[1] * planePoint[1] + + faceNormal[2] * planePoint[2] + ) + ) + ) + distance = convertIntTo2sComplement(distance, 2, True) + + nx = (y2 - y1) * (z3 - z2) - (z2 - z1) * (y3 - y2) + ny = (z2 - z1) * (x3 - x2) - (x2 - x1) * (z3 - z2) + nz = (x2 - x1) * (y3 - y2) - (y2 - y1) * (x3 - x2) + magSqr = nx * nx + ny * ny + nz * nz + + if magSqr <= 0: + print("Ignore denormalized triangle.") + continue + + if polygonType not in collisionDict: + collisionDict[polygonType] = [] + + positions = sorted( + ((x1, y1, z1), (x2, y2, z2), (x3, y3, z3)), key=lambda x: x[1] + ) # sort by min y to avoid minY bug + + collisionDict[polygonType].append((positions, normal, distance)) + + if includeChildren: + for child in obj.children: + addCollisionTriangles( + child, + collisionDict, + includeChildren, + transformMatrix @ child.matrix_local, + bounds, + ) -def roundPosition(position): - #return [int.from_bytes(int(round(value)).to_bytes(2, 'big', signed = True), 'big') for value in position] - return (int(round(position[0])), - int(round(position[1])), - int(round(position[2]))) -def collisionVertIndex(vert, vertArray): - for i in range(len(vertArray)): - colVert = vertArray[i] - if colVert.position == vert: - return i - return None +def roundPosition(position): + # return [int.from_bytes(int(round(value)).to_bytes(2, 'big', signed = True), 'big') for value in position] + return (int(round(position[0])), int(round(position[1])), int(round(position[2]))) +def collisionVertIndex(vert, vertArray): + for i in range(len(vertArray)): + colVert = vertArray[i] + if colVert.position == vert: + return i + return None def ootCollisionVertexToC(vertex): - return "{ " + str(vertex.position[0]) + ", " +\ - str(vertex.position[1]) + ", " +\ - str(vertex.position[2]) + " },\n" - -def ootCollisionPolygonToC(polygon, ignoreCamera, ignoreActor, ignoreProjectile, enableConveyor, polygonTypeIndex): - return "{ " + format(polygonTypeIndex, "#06x") + ', ' +\ - format(polygon.convertShort02(ignoreCamera, ignoreActor, ignoreProjectile), "#06x") + ', ' +\ - format(polygon.convertShort04(enableConveyor), "#06x") + ', ' +\ - format(polygon.convertShort06(), "#06x") + ', ' +\ - format(polygon.normal[0], "#06x") + ', ' +\ - format(polygon.normal[1], "#06x") + ', ' +\ - format(polygon.normal[2], "#06x") + ', ' +\ - format(polygon.distance, "#06x") + ' },\n' + return ( + "{ " + + str(vertex.position[0]) + + ", " + + str(vertex.position[1]) + + ", " + + str(vertex.position[2]) + + " },\n" + ) + + +def ootCollisionPolygonToC( + polygon, + ignoreCamera, + ignoreActor, + ignoreProjectile, + enableConveyor, + polygonTypeIndex, +): + return ( + "{ " + + format(polygonTypeIndex, "#06x") + + ", " + + format( + polygon.convertShort02(ignoreCamera, ignoreActor, ignoreProjectile), "#06x" + ) + + ", " + + format(polygon.convertShort04(enableConveyor), "#06x") + + ", " + + format(polygon.convertShort06(), "#06x") + + ", " + + format(polygon.normal[0], "#06x") + + ", " + + format(polygon.normal[1], "#06x") + + ", " + + format(polygon.normal[2], "#06x") + + ", " + + format(polygon.distance, "#06x") + + " },\n" + ) + def ootPolygonTypeToC(polygonType): - return "{ " + format(polygonType.convertHigh(), "#010x") + ', ' +\ - format(polygonType.convertLow(), "#010x") + ' },\n' + return ( + "{ " + + format(polygonType.convertHigh(), "#010x") + + ", " + + format(polygonType.convertLow(), "#010x") + + " },\n" + ) + def ootWaterBoxToC(waterBox): - return "{ " + str(waterBox.low[0]) + ", " +\ - str(waterBox.height) + ", " +\ - str(waterBox.low[1]) + ", " +\ - str(waterBox.high[0] - waterBox.low[0]) + ", " +\ - str(waterBox.high[1] - waterBox.low[1]) + ", " +\ - format(waterBox.propertyData(), "#010x") + ' },\n' + return ( + "{ " + + str(waterBox.low[0]) + + ", " + + str(waterBox.height) + + ", " + + str(waterBox.low[1]) + + ", " + + str(waterBox.high[0] - waterBox.low[0]) + + ", " + + str(waterBox.high[1] - waterBox.low[1]) + + ", " + + format(waterBox.propertyData(), "#010x") + + " },\n" + ) + def ootCameraDataToC(camData): - posC = CData() - camC = CData() - if len(camData.camPosDict) > 0: - - camDataName = "CamData " + camData.camDataName() + "[" + str(len(camData.camPosDict)) + "]" - - camC.source = camDataName + ' = {\n' - camC.header = "extern " + camDataName + ';\n' - - camPosIndex = 0 - for i in range(len(camData.camPosDict)): - camC.source += '\t' + ootCameraEntryToC(camData.camPosDict[i], camData, camPosIndex) - if camData.camPosDict[i].hasPositionData: - posC.source += ootCameraPosToC(camData.camPosDict[i]) - camPosIndex += 3 - posC.source += '};\n\n' - camC.source += '};\n\n' - - posDataName = "Vec3s " + camData.camPositionsName() + '[' + str(camPosIndex) + ']' - posC.header = "extern " + posDataName + ';\n' - posC.source = posDataName + " = {\n" + posC.source - - posC.append(camC) - return posC + posC = CData() + camC = CData() + if len(camData.camPosDict) > 0: + + camDataName = ( + "CamData " + + camData.camDataName() + + "[" + + str(len(camData.camPosDict)) + + "]" + ) + + camC.source = camDataName + " = {\n" + camC.header = "extern " + camDataName + ";\n" + + camPosIndex = 0 + for i in range(len(camData.camPosDict)): + camC.source += "\t" + ootCameraEntryToC( + camData.camPosDict[i], camData, camPosIndex + ) + if camData.camPosDict[i].hasPositionData: + posC.source += ootCameraPosToC(camData.camPosDict[i]) + camPosIndex += 3 + posC.source += "};\n\n" + camC.source += "};\n\n" + + posDataName = ( + "Vec3s " + camData.camPositionsName() + "[" + str(camPosIndex) + "]" + ) + posC.header = "extern " + posDataName + ";\n" + posC.source = posDataName + " = {\n" + posC.source + + posC.append(camC) + return posC + def ootCameraPosToC(camPos): - return "\t{ " +\ - str(camPos.position[0]) + ', ' +\ - str(camPos.position[1]) + ', ' +\ - str(camPos.position[2]) + ' },\n\t{ ' +\ - str(camPos.rotation[0]) + ', ' +\ - str(camPos.rotation[1]) + ', ' +\ - str(camPos.rotation[2]) + ' },\n\t{ ' +\ - str(camPos.fov) + ', ' +\ - str(camPos.jfifID) + ', ' +\ - str(camPos.unknown) + ' },\n' + return ( + "\t{ " + + str(camPos.position[0]) + + ", " + + str(camPos.position[1]) + + ", " + + str(camPos.position[2]) + + " },\n\t{ " + + str(camPos.rotation[0]) + + ", " + + str(camPos.rotation[1]) + + ", " + + str(camPos.rotation[2]) + + " },\n\t{ " + + str(camPos.fov) + + ", " + + str(camPos.jfifID) + + ", " + + str(camPos.unknown) + + " },\n" + ) + def ootCameraEntryToC(camPos, camData, camPosIndex): - return "{ " +\ - str(camPos.camSType) + ', ' +\ - ('3' if camPos.hasPositionData else '0') + ', ' +\ - (("&" + camData.camPositionsName() + '[' + str(camPosIndex) + ']') - if camPos.hasPositionData else "0") + ' },\n' + return ( + "{ " + + str(camPos.camSType) + + ", " + + ("3" if camPos.hasPositionData else "0") + + ", " + + ( + ("&" + camData.camPositionsName() + "[" + str(camPosIndex) + "]") + if camPos.hasPositionData + else "0" + ) + + " },\n" + ) + def ootCollisionToC(collision): - data = CData() - - data.append(ootCameraDataToC(collision.cameraData)) - - if len(collision.polygonGroups) > 0: - data.header += "extern SurfaceType " + collision.polygonTypesName() + "[];\n" - data.header += "extern CollisionPoly " + collision.polygonsName() + "[];\n" - polygonTypeC = "SurfaceType " + collision.polygonTypesName() + "[] = {\n" - polygonC = "CollisionPoly " + collision.polygonsName() + "[] = {\n" - polygonIndex = 0 - for polygonType, polygons in collision.polygonGroups.items(): - polygonTypeC += '\t' + ootPolygonTypeToC(polygonType) - for polygon in polygons: - polygonC += '\t' + ootCollisionPolygonToC(polygon, - polygonType.ignoreCameraCollision, - polygonType.ignoreActorCollision, - polygonType.ignoreProjectileCollision, - polygonType.enableConveyor, - polygonIndex) - polygonIndex += 1 - polygonTypeC += '};\n\n' - polygonC += '};\n\n' - - data.source += polygonTypeC + polygonC - polygonTypesName = collision.polygonTypesName() - polygonsName = collision.polygonsName() - else: - polygonTypesName = '0' - polygonsName = '0' - - if len(collision.vertices) > 0: - data.header += "extern Vec3s " + collision.verticesName() + "[" + str(len(collision.vertices)) + "];\n" - data.source += "Vec3s " + collision.verticesName() + "[" + str(len(collision.vertices)) + "] = {\n" - for vertex in collision.vertices: - data.source += '\t' + ootCollisionVertexToC(vertex) - data.source += '};\n\n' - collisionVerticesName = collision.verticesName() - else: - collisionVerticesName = '0' - - if len(collision.waterBoxes) > 0: - data.header += "extern WaterBox " + collision.waterBoxesName() + "[];\n" - data.source += "WaterBox " + collision.waterBoxesName() + "[] = {\n" - for waterBox in collision.waterBoxes: - data.source += '\t' + ootWaterBoxToC(waterBox) - data.source += '};\n\n' - waterBoxesName = collision.waterBoxesName() - else: - waterBoxesName = '0' - - if len(collision.cameraData.camPosDict) > 0: - camDataName = "&" + collision.camDataName() - else: - camDataName = '0' - - data.header += "extern CollisionHeader " + collision.headerName() + ';\n' - data.source += "CollisionHeader " + collision.headerName() + ' = {\n' - - if len(collision.bounds) == 2: - for bound in range(2): # min, max bound - for field in range(3): # x, y, z - data.source += '\t' + str(collision.bounds[bound][field]) + ',\n' - else: - data.source += '0, 0, 0, 0, 0, 0, ' - - data.source += \ - '\t' + str(len(collision.vertices)) + ',\n' +\ - '\t' + collisionVerticesName + ',\n' +\ - '\t' + str(collision.polygonCount()) + ',\n' +\ - '\t' + polygonsName + ',\n' +\ - '\t' + polygonTypesName + ',\n' +\ - '\t' + camDataName + ',\n' +\ - '\t' + str(len(collision.waterBoxes)) + ',\n' +\ - '\t' + waterBoxesName + '\n' +\ - '};\n\n' - - return data + data = CData() + + data.append(ootCameraDataToC(collision.cameraData)) + + if len(collision.polygonGroups) > 0: + data.header += "extern SurfaceType " + collision.polygonTypesName() + "[];\n" + data.header += "extern CollisionPoly " + collision.polygonsName() + "[];\n" + polygonTypeC = "SurfaceType " + collision.polygonTypesName() + "[] = {\n" + polygonC = "CollisionPoly " + collision.polygonsName() + "[] = {\n" + polygonIndex = 0 + for polygonType, polygons in collision.polygonGroups.items(): + polygonTypeC += "\t" + ootPolygonTypeToC(polygonType) + for polygon in polygons: + polygonC += "\t" + ootCollisionPolygonToC( + polygon, + polygonType.ignoreCameraCollision, + polygonType.ignoreActorCollision, + polygonType.ignoreProjectileCollision, + polygonType.enableConveyor, + polygonIndex, + ) + polygonIndex += 1 + polygonTypeC += "};\n\n" + polygonC += "};\n\n" + + data.source += polygonTypeC + polygonC + polygonTypesName = collision.polygonTypesName() + polygonsName = collision.polygonsName() + else: + polygonTypesName = "0" + polygonsName = "0" + + if len(collision.vertices) > 0: + data.header += ( + "extern Vec3s " + + collision.verticesName() + + "[" + + str(len(collision.vertices)) + + "];\n" + ) + data.source += ( + "Vec3s " + + collision.verticesName() + + "[" + + str(len(collision.vertices)) + + "] = {\n" + ) + for vertex in collision.vertices: + data.source += "\t" + ootCollisionVertexToC(vertex) + data.source += "};\n\n" + collisionVerticesName = collision.verticesName() + else: + collisionVerticesName = "0" + + if len(collision.waterBoxes) > 0: + data.header += "extern WaterBox " + collision.waterBoxesName() + "[];\n" + data.source += "WaterBox " + collision.waterBoxesName() + "[] = {\n" + for waterBox in collision.waterBoxes: + data.source += "\t" + ootWaterBoxToC(waterBox) + data.source += "};\n\n" + waterBoxesName = collision.waterBoxesName() + else: + waterBoxesName = "0" + + if len(collision.cameraData.camPosDict) > 0: + camDataName = "&" + collision.camDataName() + else: + camDataName = "0" + + data.header += "extern CollisionHeader " + collision.headerName() + ";\n" + data.source += "CollisionHeader " + collision.headerName() + " = {\n" + + if len(collision.bounds) == 2: + for bound in range(2): # min, max bound + for field in range(3): # x, y, z + data.source += "\t" + str(collision.bounds[bound][field]) + ",\n" + else: + data.source += "0, 0, 0, 0, 0, 0, " + + data.source += ( + "\t" + + str(len(collision.vertices)) + + ",\n" + + "\t" + + collisionVerticesName + + ",\n" + + "\t" + + str(collision.polygonCount()) + + ",\n" + + "\t" + + polygonsName + + ",\n" + + "\t" + + polygonTypesName + + ",\n" + + "\t" + + camDataName + + ",\n" + + "\t" + + str(len(collision.waterBoxes)) + + ",\n" + + "\t" + + waterBoxesName + + "\n" + + "};\n\n" + ) + + return data class OOT_ExportCollision(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.oot_export_collision' - bl_label = "Export Collision" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - def execute(self, context): - obj = None - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = "OBJECT") - if len(context.selected_objects) == 0: - raise PluginError("No object selected.") - obj = context.active_object - if type(obj.data) is not bpy.types.Mesh: - raise PluginError("No mesh object selected.") - - finalTransform = mathutils.Matrix.Scale(context.scene.ootActorBlenderScale, 4) - - try: - scaleValue = bpy.context.scene.ootBlenderScale - finalTransform = mathutils.Matrix.Diagonal(mathutils.Vector(( - scaleValue, scaleValue, scaleValue))).to_4x4() - - includeChildren = context.scene.ootColIncludeChildren - name = context.scene.ootColName - isCustomExport = context.scene.ootColCustomExport - folderName = context.scene.ootColFolder - exportPath = bpy.path.abspath(context.scene.ootColExportPath) - - filepath = ootGetObjectPath(isCustomExport, exportPath, folderName) - exportCollisionToC(obj, finalTransform, includeChildren, name, isCustomExport, folderName, - filepath) - - self.report({'INFO'}, 'Success!') - return {'FINISHED'} - - except Exception as e: - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - raisePluginError(self, e) - return {'CANCELLED'} # must return a set + # set bl_ properties + bl_idname = "object.oot_export_collision" + bl_label = "Export Collision" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + def execute(self, context): + obj = None + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + if len(context.selected_objects) == 0: + raise PluginError("No object selected.") + obj = context.active_object + if type(obj.data) is not bpy.types.Mesh: + raise PluginError("No mesh object selected.") + + finalTransform = mathutils.Matrix.Scale(context.scene.ootActorBlenderScale, 4) + + try: + scaleValue = bpy.context.scene.ootBlenderScale + finalTransform = mathutils.Matrix.Diagonal( + mathutils.Vector((scaleValue, scaleValue, scaleValue)) + ).to_4x4() + + includeChildren = context.scene.ootColIncludeChildren + name = context.scene.ootColName + isCustomExport = context.scene.ootColCustomExport + folderName = context.scene.ootColFolder + exportPath = bpy.path.abspath(context.scene.ootColExportPath) + + filepath = ootGetObjectPath(isCustomExport, exportPath, folderName) + exportCollisionToC( + obj, + finalTransform, + includeChildren, + name, + isCustomExport, + folderName, + filepath, + ) + + self.report({"INFO"}, "Success!") + return {"FINISHED"} + + except Exception as e: + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + raisePluginError(self, e) + return {"CANCELLED"} # must return a set + class OOT_ExportCollisionPanel(OOT_Panel): - bl_idname = "OOT_PT_export_collision" - bl_label = "OOT Collision Exporter" + bl_idname = "OOT_PT_export_collision" + bl_label = "OOT Collision Exporter" - # called every frame - def draw(self, context): - col = self.layout.column() - col.operator(OOT_ExportCollision.bl_idname) + # called every frame + def draw(self, context): + col = self.layout.column() + col.operator(OOT_ExportCollision.bl_idname) - prop_split(col, context.scene, 'ootColName', 'Name') - if context.scene.ootColCustomExport: - prop_split(col, context.scene, 'ootColExportPath', "Custom Folder") - else: - prop_split(col, context.scene, 'ootColFolder', 'Object') - col.prop(context.scene, 'ootColCustomExport') - col.prop(context.scene, 'ootColIncludeChildren') + prop_split(col, context.scene, "ootColName", "Name") + if context.scene.ootColCustomExport: + prop_split(col, context.scene, "ootColExportPath", "Custom Folder") + else: + prop_split(col, context.scene, "ootColFolder", "Object") + col.prop(context.scene, "ootColCustomExport") + col.prop(context.scene, "ootColIncludeChildren") oot_col_classes = ( - OOT_ExportCollision, - OOTWaterBoxProperty, - OOTCameraPositionPropertyRef, - OOTCameraPositionProperty, - OOTMaterialCollisionProperty, + OOT_ExportCollision, + OOTWaterBoxProperty, + OOTCameraPositionPropertyRef, + OOTCameraPositionProperty, + OOTMaterialCollisionProperty, ) oot_col_panel_classes = ( - OOT_CollisionPanel, - OOT_CameraPosPanel, - OOT_ExportCollisionPanel, + OOT_CollisionPanel, + OOT_CameraPosPanel, + OOT_ExportCollisionPanel, ) + def oot_col_panel_register(): - for cls in oot_col_panel_classes: - register_class(cls) + for cls in oot_col_panel_classes: + register_class(cls) + def oot_col_panel_unregister(): - for cls in oot_col_panel_classes: - unregister_class(cls) + for cls in oot_col_panel_classes: + unregister_class(cls) + def oot_col_register(): - for cls in oot_col_classes: - register_class(cls) - - # Collision - bpy.types.Scene.ootColExportPath = bpy.props.StringProperty( - name = 'Directory', subtype = 'FILE_PATH') - bpy.types.Scene.ootColExportLevel = bpy.props.EnumProperty(items = ootEnumSceneID, - name = 'Level Used By Collision', default = 'SCENE_YDAN') - bpy.types.Scene.ootColIncludeChildren = bpy.props.BoolProperty( - name = 'Include child objects', default = True) - bpy.types.Scene.ootColName = bpy.props.StringProperty( - name = 'Name', default = 'collision') - bpy.types.Scene.ootColLevelName = bpy.props.StringProperty( - name = 'Name', default = 'SCENE_YDAN') - bpy.types.Scene.ootColCustomExport = bpy.props.BoolProperty( - name = 'Custom Export Path') - bpy.types.Scene.ootColFolder = bpy.props.StringProperty( - name = 'Object Name', default = "gameplay_keep") - - bpy.types.Object.ootCameraPositionProperty = bpy.props.PointerProperty(type = OOTCameraPositionProperty) - bpy.types.Material.ootCollisionProperty = bpy.props.PointerProperty(type = OOTMaterialCollisionProperty) + for cls in oot_col_classes: + register_class(cls) + + # Collision + bpy.types.Scene.ootColExportPath = bpy.props.StringProperty( + name="Directory", subtype="FILE_PATH" + ) + bpy.types.Scene.ootColExportLevel = bpy.props.EnumProperty( + items=ootEnumSceneID, name="Level Used By Collision", default="SCENE_YDAN" + ) + bpy.types.Scene.ootColIncludeChildren = bpy.props.BoolProperty( + name="Include child objects", default=True + ) + bpy.types.Scene.ootColName = bpy.props.StringProperty( + name="Name", default="collision" + ) + bpy.types.Scene.ootColLevelName = bpy.props.StringProperty( + name="Name", default="SCENE_YDAN" + ) + bpy.types.Scene.ootColCustomExport = bpy.props.BoolProperty( + name="Custom Export Path" + ) + bpy.types.Scene.ootColFolder = bpy.props.StringProperty( + name="Object Name", default="gameplay_keep" + ) + + bpy.types.Object.ootCameraPositionProperty = bpy.props.PointerProperty( + type=OOTCameraPositionProperty + ) + bpy.types.Material.ootCollisionProperty = bpy.props.PointerProperty( + type=OOTMaterialCollisionProperty + ) + def oot_col_unregister(): - # Collision - del bpy.types.Scene.ootColExportPath - del bpy.types.Scene.ootColExportLevel - del bpy.types.Scene.ootColName - del bpy.types.Scene.ootColLevelName - del bpy.types.Scene.ootColIncludeChildren - del bpy.types.Scene.ootColCustomExport - del bpy.types.Scene.ootColFolder - - for cls in reversed(oot_col_classes): - unregister_class(cls) + # Collision + del bpy.types.Scene.ootColExportPath + del bpy.types.Scene.ootColExportLevel + del bpy.types.Scene.ootColName + del bpy.types.Scene.ootColLevelName + del bpy.types.Scene.ootColIncludeChildren + del bpy.types.Scene.ootColCustomExport + del bpy.types.Scene.ootColFolder + + for cls in reversed(oot_col_classes): + unregister_class(cls) diff --git a/fast64_internal/oot/oot_collision_classes.py b/fast64_internal/oot/oot_collision_classes.py index fa4596248..73a6f9e8e 100644 --- a/fast64_internal/oot/oot_collision_classes.py +++ b/fast64_internal/oot/oot_collision_classes.py @@ -7,87 +7,95 @@ from .oot_constants import * ootEnumConveyer = [ - ("None", "None", "None"), - ("Land", "Land", "Land"), - ("Water", "Water", "Water"), + ("None", "None", "None"), + ("Land", "Land", "Land"), + ("Water", "Water", "Water"), ] ootEnumFloorSetting = [ - ("Custom", "Custom", "Custom"), - ("0x00", "Default", "Default"), - ("0x05", "Void (Small)", "Void (Small)"), - ("0x06", "Grab Wall", "Grab Wall"), - ("0x08", "Stop Air Momentum", "Stop Air Momentum"), - ("0x09", "Fall Instead Of Jumping", "Fall Instead Of Jumping"), - ("0x0B", "Dive", "Dive"), - ("0x0C", "Void (Large)", "Void (Large)"), + ("Custom", "Custom", "Custom"), + ("0x00", "Default", "Default"), + ("0x05", "Void (Small)", "Void (Small)"), + ("0x06", "Grab Wall", "Grab Wall"), + ("0x08", "Stop Air Momentum", "Stop Air Momentum"), + ("0x09", "Fall Instead Of Jumping", "Fall Instead Of Jumping"), + ("0x0B", "Dive", "Dive"), + ("0x0C", "Void (Large)", "Void (Large)"), ] ootEnumWallSetting = [ - ("Custom", "Custom", "Custom"), - ("0x00", "None", "None"), - ("0x01", "No Ledge Grab", "No Ledge Grab"), - ("0x02", "Ladder", "Ladder"), - ("0x03", "Ladder Top", "Ladder Top"), - ("0x04", "Vines", "Vines"), - ("0x05", "Crawl Space", "Crawl Space"), - ("0x06", "Crawl Space 2", "Crawl Space 2"), - ("0x07", "Push Block", "Push Block"), + ("Custom", "Custom", "Custom"), + ("0x00", "None", "None"), + ("0x01", "No Ledge Grab", "No Ledge Grab"), + ("0x02", "Ladder", "Ladder"), + ("0x03", "Ladder Top", "Ladder Top"), + ("0x04", "Vines", "Vines"), + ("0x05", "Crawl Space", "Crawl Space"), + ("0x06", "Crawl Space 2", "Crawl Space 2"), + ("0x07", "Push Block", "Push Block"), ] ootEnumFloorProperty = [ - ("Custom", "Custom", "Custom"), - ("0x00", "None", "None"), - ("0x01", "Haunted Wasteland Camera", "Haunted Wasteland Camera"), - ("0x02", "Hurt Floor (Spikes)", "Hurt Floor (Spikes)"), - ("0x03", "Hurt Floor (Lava)", "Hurt Floor (Lava)"), - ("0x04", "Shallow Sand", "Shallow Sand"), - ("0x05", "Slippery", "Slippery"), - ("0x06", "No Fall Damage", "No Fall Damage"), - ("0x07", "Quicksand Crossing (Epona Uncrossable)", "Quicksand Crossing (Epona Uncrossable)"), - ("0x08", "Jabu Jabu's Belly", "Jabu Jabu's Belly"), - ("0x09", "Void", "Void"), - ("0x0A", "Link Looks Up", "Link Looks Up"), - ("0x0B", "Quicksand Crossing (Epona Crossable)", "Quicksand Crossing (Epona Crossable)") + ("Custom", "Custom", "Custom"), + ("0x00", "None", "None"), + ("0x01", "Haunted Wasteland Camera", "Haunted Wasteland Camera"), + ("0x02", "Hurt Floor (Spikes)", "Hurt Floor (Spikes)"), + ("0x03", "Hurt Floor (Lava)", "Hurt Floor (Lava)"), + ("0x04", "Shallow Sand", "Shallow Sand"), + ("0x05", "Slippery", "Slippery"), + ("0x06", "No Fall Damage", "No Fall Damage"), + ( + "0x07", + "Quicksand Crossing (Epona Uncrossable)", + "Quicksand Crossing (Epona Uncrossable)", + ), + ("0x08", "Jabu Jabu's Belly", "Jabu Jabu's Belly"), + ("0x09", "Void", "Void"), + ("0x0A", "Link Looks Up", "Link Looks Up"), + ( + "0x0B", + "Quicksand Crossing (Epona Crossable)", + "Quicksand Crossing (Epona Crossable)", + ), ] ootEnumCollisionTerrain = [ - ("Custom", "Custom", "Custom"), - ("0x00", "Walkable", "Walkable"), - ("0x01", "Steep", "Steep"), - ("0x02", "Walkable (Preserves Exit Flags)", "Walkable (Preserves Exit Flags)"), - ("0x03", "Walkable (?)", "Walkable (?)"), + ("Custom", "Custom", "Custom"), + ("0x00", "Walkable", "Walkable"), + ("0x01", "Steep", "Steep"), + ("0x02", "Walkable (Preserves Exit Flags)", "Walkable (Preserves Exit Flags)"), + ("0x03", "Walkable (?)", "Walkable (?)"), ] ootEnumCollisionSound = [ - ("Custom", "Custom", "Custom"), - ("0x00", "Earth", "Earth"), - ("0x01", "Sand", "Sand"), - ("0x02", "Stone", "Stone"), - ("0x03", "Wet Stone", "Wet Stone"), - ("0x04", "Shallow Water", "Shallow Water"), - ("0x05", "Water", "Water"), - ("0x06", "Grass", "Grass"), - ("0x07", "Lava/Goo", "Lava/Goo"), - ("0x08", "Earth", "Earth"), - ("0x09", "Wooden Plank", "Wooden Plank"), - ("0x0A", "Packed Earth/Wood", "Packed Earth/Wood"), - ("0x0B", "Earth", "Earth"), - ("0x0C", "Ceramic/Ice", "Ceramic/Ice"), - ("0x0D", "Loose Earth", "Loose Earth"), + ("Custom", "Custom", "Custom"), + ("0x00", "Earth", "Earth"), + ("0x01", "Sand", "Sand"), + ("0x02", "Stone", "Stone"), + ("0x03", "Wet Stone", "Wet Stone"), + ("0x04", "Shallow Water", "Shallow Water"), + ("0x05", "Water", "Water"), + ("0x06", "Grass", "Grass"), + ("0x07", "Lava/Goo", "Lava/Goo"), + ("0x08", "Earth", "Earth"), + ("0x09", "Wooden Plank", "Wooden Plank"), + ("0x0A", "Packed Earth/Wood", "Packed Earth/Wood"), + ("0x0B", "Earth", "Earth"), + ("0x0C", "Ceramic/Ice", "Ceramic/Ice"), + ("0x0D", "Loose Earth", "Loose Earth"), ] ootEnumConveyorSpeed = [ - ("Custom", "Custom", "Custom"), - ("0x00", "None", "None"), - ("0x01", "Slow", "Slow"), - ("0x02", "Medium", "Medium"), - ("0x03", "Fast", "Fast"), + ("Custom", "Custom", "Custom"), + ("0x00", "None", "None"), + ("0x01", "Slow", "Slow"), + ("0x02", "Medium", "Medium"), + ("0x03", "Fast", "Fast"), ] ootEnumCameraSType = [ - ("Custom", "Custom", "Custom"), - ("CAM_SET_NONE", "None", "None"), + ("Custom", "Custom", "Custom"), + ("CAM_SET_NONE", "None", "None"), ("CAM_SET_NORMAL0", "Normal0", "Normal0"), ("CAM_SET_NORMAL1", "Normal1", "Normal1"), ("CAM_SET_DUNGEON0", "Dungeon0", "Dungeon0"), @@ -155,244 +163,274 @@ ("CAM_SET_NORMAL4", "Normal4", "Normal4"), ] + class OOTCollisionVertex: - def __init__(self, position): - self.position = position + def __init__(self, position): + self.position = position + class OOTCollisionPolygon: - def __init__(self, indices, normal, distance): - self.indices = indices - self.normal = normal - self.distance = distance + def __init__(self, indices, normal, distance): + self.indices = indices + self.normal = normal + self.distance = distance - def convertShort02(self, ignoreCamera, ignoreActor, ignoreProjectile): - vertPart = self.indices[0] & 0x1FFF - colPart = (1 if ignoreCamera else 0) +\ - (2 if ignoreActor else 0) +\ - (4 if ignoreProjectile else 0) + def convertShort02(self, ignoreCamera, ignoreActor, ignoreProjectile): + vertPart = self.indices[0] & 0x1FFF + colPart = ( + (1 if ignoreCamera else 0) + + (2 if ignoreActor else 0) + + (4 if ignoreProjectile else 0) + ) - return vertPart | (colPart << 13) + return vertPart | (colPart << 13) - def convertShort04(self, enableConveyor): - vertPart = self.indices[1] & 0x1FFF - conveyorPart = 1 if enableConveyor else 0 + def convertShort04(self, enableConveyor): + vertPart = self.indices[1] & 0x1FFF + conveyorPart = 1 if enableConveyor else 0 - return vertPart | (conveyorPart << 13) + return vertPart | (conveyorPart << 13) + + def convertShort06(self): + return self.indices[2] & 0x1FFF - def convertShort06(self): - return self.indices[2] & 0x1FFF class OOTPolygonType: - def __eq__(self, other): - return \ - self.eponaBlock == other.eponaBlock and\ - self.decreaseHeight == other.decreaseHeight and\ - self.floorSetting == other.floorSetting and\ - self.wallSetting == other.wallSetting and\ - self.floorProperty == other.floorProperty and\ - self.exitID == other.exitID and\ - self.cameraID == other.cameraID and\ - self.isWallDamage == other.isWallDamage and\ - self.enableConveyor == other.enableConveyor and\ - self.conveyorRotation == other.conveyorRotation and\ - self.conveyorSpeed == other.conveyorSpeed and\ - self.hookshotable == other.hookshotable and\ - self.echo == other.echo and\ - self.lightingSetting == other.lightingSetting and\ - self.terrain == other.terrain and\ - self.sound == other.sound and\ - self.ignoreCameraCollision == other.ignoreCameraCollision and\ - self.ignoreActorCollision == other.ignoreActorCollision and\ - self.ignoreProjectileCollision == other.ignoreProjectileCollision - - def __ne__(self, other): - return \ - self.eponaBlock != other.eponaBlock or\ - self.decreaseHeight != other.decreaseHeight or\ - self.floorSetting != other.floorSetting or\ - self.wallSetting != other.wallSetting or\ - self.floorProperty != other.floorProperty or\ - self.exitID != other.exitID or\ - self.cameraID != other.cameraID or\ - self.isWallDamage != other.isWallDamage or\ - self.enableConveyor != other.enableConveyor or\ - self.conveyorRotation != other.conveyorRotation or\ - self.conveyorSpeed != other.conveyorSpeed or\ - self.hookshotable != other.hookshotable or\ - self.echo != other.echo or\ - self.lightingSetting != other.lightingSetting or\ - self.terrain != other.terrain or\ - self.sound != other.sound or\ - self.ignoreCameraCollision != other.ignoreCameraCollision or\ - self.ignoreActorCollision != other.ignoreActorCollision or\ - self.ignoreProjectileCollision != other.ignoreProjectileCollision - - def __hash__(self): - return hash((self.eponaBlock, - self.decreaseHeight, - self.floorSetting, - self.wallSetting, - self.floorProperty, - self.exitID, - self.cameraID, - self.isWallDamage, - self.enableConveyor, - self.conveyorRotation, - self.conveyorSpeed, - self.hookshotable, - self.echo, - self.lightingSetting, - self.terrain, - self.sound, - self.ignoreCameraCollision, - self.ignoreActorCollision, - self.ignoreProjectileCollision)) - - def __init__(self): - self.eponaBlock = None #eponaBlock - self.decreaseHeight = None #decreaseHeight - self.floorSetting = None #floorSetting - self.wallSetting = None #wallSetting - self.floorProperty = None #floorProperty - self.exitID = None #exitID - self.cameraID = None #cameraID - self.isWallDamage = None #isWallDamage - self.enableConveyor = None - self.conveyorRotation = None #conveyorDirection - self.conveyorSpeed = None #conveyorSpeed - self.hookshotable = None #hookshotable - self.echo = None #echo - self.lightingSetting = None #lightingSetting - self.terrain = None #terrain - self.sound = None #sound - self.ignoreCameraCollision = None - self.ignoreActorCollision = None - self.ignoreProjectileCollision = None - - def convertHigh(self): - value = ((1 if self.eponaBlock else 0) << 31) |\ - ((1 if self.decreaseHeight else 0) << 30) |\ - (int(self.floorSetting, 16) << 26) |\ - (int(self.wallSetting, 16) << 21) |\ - (int(self.floorProperty, 16) << 13) |\ - (self.exitID << 8) |\ - (self.cameraID << 0) - - return convertIntTo2sComplement(value, 4, False) - - def convertLow(self): - value = ((1 if self.isWallDamage else 0) << 27) |\ - (self.conveyorRotation << 21) |\ - (self.conveyorSpeed << 18) |\ - ((1 if self.hookshotable else 0) << 17) |\ - (int(self.echo, 16) << 11) |\ - (self.lightingSetting << 6) |\ - (int(self.terrain, 16) << 4) |\ - (int(self.sound, 16) << 0) - - return convertIntTo2sComplement(value, 4, False) + def __eq__(self, other): + return ( + self.eponaBlock == other.eponaBlock + and self.decreaseHeight == other.decreaseHeight + and self.floorSetting == other.floorSetting + and self.wallSetting == other.wallSetting + and self.floorProperty == other.floorProperty + and self.exitID == other.exitID + and self.cameraID == other.cameraID + and self.isWallDamage == other.isWallDamage + and self.enableConveyor == other.enableConveyor + and self.conveyorRotation == other.conveyorRotation + and self.conveyorSpeed == other.conveyorSpeed + and self.hookshotable == other.hookshotable + and self.echo == other.echo + and self.lightingSetting == other.lightingSetting + and self.terrain == other.terrain + and self.sound == other.sound + and self.ignoreCameraCollision == other.ignoreCameraCollision + and self.ignoreActorCollision == other.ignoreActorCollision + and self.ignoreProjectileCollision == other.ignoreProjectileCollision + ) + + def __ne__(self, other): + return ( + self.eponaBlock != other.eponaBlock + or self.decreaseHeight != other.decreaseHeight + or self.floorSetting != other.floorSetting + or self.wallSetting != other.wallSetting + or self.floorProperty != other.floorProperty + or self.exitID != other.exitID + or self.cameraID != other.cameraID + or self.isWallDamage != other.isWallDamage + or self.enableConveyor != other.enableConveyor + or self.conveyorRotation != other.conveyorRotation + or self.conveyorSpeed != other.conveyorSpeed + or self.hookshotable != other.hookshotable + or self.echo != other.echo + or self.lightingSetting != other.lightingSetting + or self.terrain != other.terrain + or self.sound != other.sound + or self.ignoreCameraCollision != other.ignoreCameraCollision + or self.ignoreActorCollision != other.ignoreActorCollision + or self.ignoreProjectileCollision != other.ignoreProjectileCollision + ) + + def __hash__(self): + return hash( + ( + self.eponaBlock, + self.decreaseHeight, + self.floorSetting, + self.wallSetting, + self.floorProperty, + self.exitID, + self.cameraID, + self.isWallDamage, + self.enableConveyor, + self.conveyorRotation, + self.conveyorSpeed, + self.hookshotable, + self.echo, + self.lightingSetting, + self.terrain, + self.sound, + self.ignoreCameraCollision, + self.ignoreActorCollision, + self.ignoreProjectileCollision, + ) + ) + + def __init__(self): + self.eponaBlock = None # eponaBlock + self.decreaseHeight = None # decreaseHeight + self.floorSetting = None # floorSetting + self.wallSetting = None # wallSetting + self.floorProperty = None # floorProperty + self.exitID = None # exitID + self.cameraID = None # cameraID + self.isWallDamage = None # isWallDamage + self.enableConveyor = None + self.conveyorRotation = None # conveyorDirection + self.conveyorSpeed = None # conveyorSpeed + self.hookshotable = None # hookshotable + self.echo = None # echo + self.lightingSetting = None # lightingSetting + self.terrain = None # terrain + self.sound = None # sound + self.ignoreCameraCollision = None + self.ignoreActorCollision = None + self.ignoreProjectileCollision = None + + def convertHigh(self): + value = ( + ((1 if self.eponaBlock else 0) << 31) + | ((1 if self.decreaseHeight else 0) << 30) + | (int(self.floorSetting, 16) << 26) + | (int(self.wallSetting, 16) << 21) + | (int(self.floorProperty, 16) << 13) + | (self.exitID << 8) + | (self.cameraID << 0) + ) + + return convertIntTo2sComplement(value, 4, False) + + def convertLow(self): + value = ( + ((1 if self.isWallDamage else 0) << 27) + | (self.conveyorRotation << 21) + | (self.conveyorSpeed << 18) + | ((1 if self.hookshotable else 0) << 17) + | (int(self.echo, 16) << 11) + | (self.lightingSetting << 6) + | (int(self.terrain, 16) << 4) + | (int(self.sound, 16) << 0) + ) + + return convertIntTo2sComplement(value, 4, False) + class OOTCollision: - def __init__(self, ownerName): - self.ownerName = ownerName - self.bounds = [] - self.vertices = [] - # dict of polygon type : polygon list - self.polygonGroups = {} - self.cameraData = None - self.waterBoxes = [] - - def polygonCount(self): - count = 0 - for polygonType, polygons in self.polygonGroups.items(): - count += len(polygons) - return count - - def headerName(self): - return self.ownerName + "_collisionHeader" - - def verticesName(self): - return self.ownerName + "_vertices" - - def polygonsName(self): - return self.ownerName + "_polygons" - - def polygonTypesName(self): - return self.ownerName + "_polygonTypes" - - def camDataName(self): - return self.ownerName + "_camData" - - def waterBoxesName(self): - return self.ownerName + "_waterBoxes" + def __init__(self, ownerName): + self.ownerName = ownerName + self.bounds = [] + self.vertices = [] + # dict of polygon type : polygon list + self.polygonGroups = {} + self.cameraData = None + self.waterBoxes = [] + + def polygonCount(self): + count = 0 + for polygonType, polygons in self.polygonGroups.items(): + count += len(polygons) + return count + + def headerName(self): + return self.ownerName + "_collisionHeader" + + def verticesName(self): + return self.ownerName + "_vertices" + + def polygonsName(self): + return self.ownerName + "_polygons" + + def polygonTypesName(self): + return self.ownerName + "_polygonTypes" + + def camDataName(self): + return self.ownerName + "_camData" + + def waterBoxesName(self): + return self.ownerName + "_waterBoxes" + def getPolygonType(collisionProp): - polygonType = OOTPolygonType() - polygonType.ignoreCameraCollision = collisionProp.ignoreCameraCollision - polygonType.ignoreActorCollision = collisionProp.ignoreActorCollision - polygonType.ignoreProjectileCollision = collisionProp.ignoreProjectileCollision - polygonType.eponaBlock = collisionProp.eponaBlock - polygonType.decreaseHeight = collisionProp.decreaseHeight - polygonType.floorSetting = getCustomProperty(collisionProp, 'floorSetting') - polygonType.wallSetting = getCustomProperty(collisionProp, 'wallSetting') - polygonType.floorProperty = getCustomProperty(collisionProp, 'floorProperty') - polygonType.exitID = collisionProp.exitID - polygonType.cameraID = collisionProp.cameraID - polygonType.isWallDamage = collisionProp.isWallDamage - polygonType.enableConveyor = collisionProp.conveyorOption == "Land" - if collisionProp.conveyorOption != "None": - polygonType.conveyorRotation = int(collisionProp.conveyorRotation / (2 * math.pi) * 0x3F) - polygonType.conveyorSpeed = int(getCustomProperty(collisionProp, 'conveyorSpeed'), 16) + \ - (4 if collisionProp.conveyorKeepMomentum else 0) - else: - polygonType.conveyorRotation = 0 - polygonType.conveyorSpeed = 0 - - polygonType.hookshotable = collisionProp.hookshotable - polygonType.echo = collisionProp.echo - polygonType.lightingSetting = collisionProp.lightingSetting - polygonType.terrain = getCustomProperty(collisionProp, "terrain") - polygonType.sound = getCustomProperty(collisionProp, "sound") - return polygonType + polygonType = OOTPolygonType() + polygonType.ignoreCameraCollision = collisionProp.ignoreCameraCollision + polygonType.ignoreActorCollision = collisionProp.ignoreActorCollision + polygonType.ignoreProjectileCollision = collisionProp.ignoreProjectileCollision + polygonType.eponaBlock = collisionProp.eponaBlock + polygonType.decreaseHeight = collisionProp.decreaseHeight + polygonType.floorSetting = getCustomProperty(collisionProp, "floorSetting") + polygonType.wallSetting = getCustomProperty(collisionProp, "wallSetting") + polygonType.floorProperty = getCustomProperty(collisionProp, "floorProperty") + polygonType.exitID = collisionProp.exitID + polygonType.cameraID = collisionProp.cameraID + polygonType.isWallDamage = collisionProp.isWallDamage + polygonType.enableConveyor = collisionProp.conveyorOption == "Land" + if collisionProp.conveyorOption != "None": + polygonType.conveyorRotation = int( + collisionProp.conveyorRotation / (2 * math.pi) * 0x3F + ) + polygonType.conveyorSpeed = int( + getCustomProperty(collisionProp, "conveyorSpeed"), 16 + ) + (4 if collisionProp.conveyorKeepMomentum else 0) + else: + polygonType.conveyorRotation = 0 + polygonType.conveyorSpeed = 0 + + polygonType.hookshotable = collisionProp.hookshotable + polygonType.echo = collisionProp.echo + polygonType.lightingSetting = collisionProp.lightingSetting + polygonType.terrain = getCustomProperty(collisionProp, "terrain") + polygonType.sound = getCustomProperty(collisionProp, "sound") + return polygonType + class OOTWaterBox(BoxEmpty): - def __init__(self, roomIndex, lightingSetting, cameraSetting, position, scale, emptyScale): - self.roomIndex = roomIndex - self.lightingSetting = lightingSetting - self.cameraSetting = cameraSetting - BoxEmpty.__init__(self, position, scale, emptyScale) - - def propertyData(self): - value = (int(self.roomIndex) << 13) |\ - (self.lightingSetting << 8) |\ - (self.cameraSetting << 0) - return convertIntTo2sComplement(value, 4, False) + def __init__( + self, roomIndex, lightingSetting, cameraSetting, position, scale, emptyScale + ): + self.roomIndex = roomIndex + self.lightingSetting = lightingSetting + self.cameraSetting = cameraSetting + BoxEmpty.__init__(self, position, scale, emptyScale) + + def propertyData(self): + value = ( + (int(self.roomIndex) << 13) + | (self.lightingSetting << 8) + | (self.cameraSetting << 0) + ) + return convertIntTo2sComplement(value, 4, False) + class OOTCameraData: - def __init__(self, ownerName): - self.ownerName = ownerName - self.camPosDict = {} + def __init__(self, ownerName): + self.ownerName = ownerName + self.camPosDict = {} + + def camDataName(self): + return self.ownerName + "_camData" - def camDataName(self): - return self.ownerName + "_camData" + def camPositionsName(self): + return self.ownerName + "_camPosData" - def camPositionsName(self): - return self.ownerName + "_camPosData" + def validateCamPositions(self): + count = 0 + while count < len(self.camPosDict): + if count not in self.camPosDict: + raise PluginError( + "Error: Camera positions do not have a consecutive list of indices.\n" + + "Missing index: " + + str(count) + ) + count = count + 1 - def validateCamPositions(self): - count = 0 - while count < len(self.camPosDict): - if count not in self.camPosDict: - raise PluginError("Error: Camera positions do not have a consecutive list of indices.\n" +\ - "Missing index: " + str(count)) - count = count + 1 class OOTCameraPosData: - def __init__(self, camSType, hasPositionData, position, rotation, fov, jfifID): - self.camSType = camSType - self.position = position - self.rotation = rotation - self.fov = fov - self.jfifID = jfifID - self.unknown = -1 - self.hasPositionData = hasPositionData + def __init__(self, camSType, hasPositionData, position, rotation, fov, jfifID): + self.camSType = camSType + self.position = position + self.rotation = rotation + self.fov = fov + self.jfifID = jfifID + self.unknown = -1 + self.hasPositionData = hasPositionData diff --git a/fast64_internal/oot/oot_constants.py b/fast64_internal/oot/oot_constants.py index 66b0732d7..5439bfa15 100644 --- a/fast64_internal/oot/oot_constants.py +++ b/fast64_internal/oot/oot_constants.py @@ -1,1496 +1,1610 @@ ootEnumMeshType = [ - #("Custom", "Custom", "Custom"), - ("0", "Type 0 (Simple)", "Type 0 (Simple)"), - ("1", "Type 1 (Prerendered)", "Type 1 (Prerendered)"), - ("2", "Type 2 (Distance Culling)", "Type 2 (Distance Culling)"), + # ("Custom", "Custom", "Custom"), + ("0", "Type 0 (Simple)", "Type 0 (Simple)"), + ("1", "Type 1 (Prerendered)", "Type 1 (Prerendered)"), + ("2", "Type 2 (Distance Culling)", "Type 2 (Distance Culling)"), ] ootEnumSceneMenu = [ - ("General", "General", "General"), - ("Lighting", "Lighting", "Lighting"), - ("Cutscene", "Cutscene", "Cutscene"), - ("Exits", "Exits", "Exits"), - ("Alternate", "Alternate", "Alternate"), + ("General", "General", "General"), + ("Lighting", "Lighting", "Lighting"), + ("Cutscene", "Cutscene", "Cutscene"), + ("Exits", "Exits", "Exits"), + ("Alternate", "Alternate", "Alternate"), ] ootEnumSceneMenuAlternate = [ - ("General", "General", "General"), - ("Lighting", "Lighting", "Lighting"), - ("Cutscene", "Cutscene", "Cutscene") + ("General", "General", "General"), + ("Lighting", "Lighting", "Lighting"), + ("Cutscene", "Cutscene", "Cutscene"), ] ootEnumRoomMenu = [ - ("General", "General", "General"), - ("Objects", "Objects", "Objects"), - ("Alternate", "Alternate", "Alternate"), + ("General", "General", "General"), + ("Objects", "Objects", "Objects"), + ("Alternate", "Alternate", "Alternate"), ] ootEnumRoomMenuAlternate = [ - ("General", "General", "General"), - ("Objects", "Objects", "Objects"), + ("General", "General", "General"), + ("Objects", "Objects", "Objects"), ] ootEnumHeaderMenu = [ - ("Child Night", "Child Night", "Child Night"), - ("Adult Day", "Adult Day", "Adult Day"), - ("Adult Night", "Adult Night", "Adult Night"), - ("Cutscene", "Cutscene", "Cutscene") + ("Child Night", "Child Night", "Child Night"), + ("Adult Day", "Adult Day", "Adult Day"), + ("Adult Night", "Adult Night", "Adult Night"), + ("Cutscene", "Cutscene", "Cutscene"), ] ootEnumLightGroupMenu = [ - ("Dawn", "Dawn", "Dawn"), - ("Day", "Day", "Day"), - ("Dusk", "Dusk", "Dusk"), - ("Night", "Night", "Night") + ("Dawn", "Dawn", "Dawn"), + ("Day", "Day", "Day"), + ("Dusk", "Dusk", "Dusk"), + ("Night", "Night", "Night"), ] ootEnumTransitionActorID = [ - ("Custom", "Custom", "Custom"), - ("ACTOR_EN_DOOR", "EN_DOOR", "EN_DOOR"), - ("ACTOR_DOOR_SHUTTER", "DOOR_SHUTTER", "DOOR_SHUTTER"), - ("ACTOR_DOOR_WARP1", "DOOR_WARP1", "DOOR_WARP1"), - ("ACTOR_DOOR_TOKI", "DOOR_TOKI", "DOOR_TOKI"), - ("ACTOR_DOOR_ANA", "DOOR_ANA", "DOOR_ANA"), - ("ACTOR_DOOR_GERUDO", "DOOR_GERUDO", "DOOR_GERUDO"), - ("ACTOR_DOOR_KILLER", "DOOR_KILLER", "DOOR_KILLER"), + ("Custom", "Custom", "Custom"), + ("ACTOR_EN_DOOR", "EN_DOOR", "EN_DOOR"), + ("ACTOR_DOOR_SHUTTER", "DOOR_SHUTTER", "DOOR_SHUTTER"), + ("ACTOR_DOOR_WARP1", "DOOR_WARP1", "DOOR_WARP1"), + ("ACTOR_DOOR_TOKI", "DOOR_TOKI", "DOOR_TOKI"), + ("ACTOR_DOOR_ANA", "DOOR_ANA", "DOOR_ANA"), + ("ACTOR_DOOR_GERUDO", "DOOR_GERUDO", "DOOR_GERUDO"), + ("ACTOR_DOOR_KILLER", "DOOR_KILLER", "DOOR_KILLER"), ] ootEnumActorID = [ - ("Custom", "Custom", "Custom"), - ("ACTOR_PLAYER", "PLAYER", "PLAYER"), - ("ACTOR_EN_TEST", "EN_TEST", "EN_TEST"), - ("ACTOR_EN_GIRLA", "EN_GIRLA", "EN_GIRLA"), - ("ACTOR_EN_PART", "EN_PART", "EN_PART"), - ("ACTOR_EN_LIGHT", "EN_LIGHT", "EN_LIGHT"), - ("ACTOR_EN_DOOR", "EN_DOOR", "EN_DOOR"), - ("ACTOR_EN_BOX", "EN_BOX", "EN_BOX"), - ("ACTOR_BG_DY_YOSEIZO", "BG_DY_YOSEIZO", "BG_DY_YOSEIZO"), - ("ACTOR_BG_HIDAN_FIREWALL", "BG_HIDAN_FIREWALL", "BG_HIDAN_FIREWALL"), - ("ACTOR_EN_POH", "EN_POH", "EN_POH"), - ("ACTOR_EN_OKUTA", "EN_OKUTA", "EN_OKUTA"), - ("ACTOR_BG_YDAN_SP", "BG_YDAN_SP", "BG_YDAN_SP"), - ("ACTOR_EN_BOM", "EN_BOM", "EN_BOM"), - ("ACTOR_EN_WALLMAS", "EN_WALLMAS", "EN_WALLMAS"), - ("ACTOR_EN_DODONGO", "EN_DODONGO", "EN_DODONGO"), - ("ACTOR_EN_FIREFLY", "EN_FIREFLY", "EN_FIREFLY"), - ("ACTOR_EN_HORSE", "EN_HORSE", "EN_HORSE"), - ("ACTOR_EN_ITEM00", "EN_ITEM00", "EN_ITEM00"), - ("ACTOR_EN_ARROW", "EN_ARROW", "EN_ARROW"), - ("ACTOR_EN_ELF", "EN_ELF", "EN_ELF"), - ("ACTOR_EN_NIW", "EN_NIW", "EN_NIW"), - ("ACTOR_EN_TITE", "EN_TITE", "EN_TITE"), - ("ACTOR_EN_REEBA", "EN_REEBA", "EN_REEBA"), - ("ACTOR_EN_PEEHAT", "EN_PEEHAT", "EN_PEEHAT"), - ("ACTOR_EN_BUTTE", "EN_BUTTE", "EN_BUTTE"), - ("ACTOR_EN_INSECT", "EN_INSECT", "EN_INSECT"), - ("ACTOR_EN_FISH", "EN_FISH", "EN_FISH"), - ("ACTOR_EN_HOLL", "EN_HOLL", "EN_HOLL"), - ("ACTOR_EN_SCENE_CHANGE", "EN_SCENE_CHANGE", "EN_SCENE_CHANGE"), - ("ACTOR_EN_ZF", "EN_ZF", "EN_ZF"), - ("ACTOR_EN_HATA", "EN_HATA", "EN_HATA"), - ("ACTOR_BOSS_DODONGO", "BOSS_DODONGO", "BOSS_DODONGO"), - ("ACTOR_BOSS_GOMA", "BOSS_GOMA", "BOSS_GOMA"), - ("ACTOR_EN_ZL1", "EN_ZL1", "EN_ZL1"), - ("ACTOR_EN_VIEWER", "EN_VIEWER", "EN_VIEWER"), - ("ACTOR_EN_GOMA", "EN_GOMA", "EN_GOMA"), - ("ACTOR_BG_PUSHBOX", "BG_PUSHBOX", "BG_PUSHBOX"), - ("ACTOR_EN_BUBBLE", "EN_BUBBLE", "EN_BUBBLE"), - ("ACTOR_DOOR_SHUTTER", "DOOR_SHUTTER", "DOOR_SHUTTER"), - ("ACTOR_EN_DODOJR", "EN_DODOJR", "EN_DODOJR"), - ("ACTOR_EN_BDFIRE", "EN_BDFIRE", "EN_BDFIRE"), - ("ACTOR_EN_BOOM", "EN_BOOM", "EN_BOOM"), - ("ACTOR_EN_TORCH2", "EN_TORCH2", "EN_TORCH2"), - ("ACTOR_EN_BILI", "EN_BILI", "EN_BILI"), - ("ACTOR_EN_TP", "EN_TP", "EN_TP"), - ("ACTOR_EN_ST", "EN_ST", "EN_ST"), - ("ACTOR_EN_BW", "EN_BW", "EN_BW"), - ("ACTOR_EN_A_OBJ", "EN_A_OBJ", "EN_A_OBJ"), - ("ACTOR_EN_EIYER", "EN_EIYER", "EN_EIYER"), - ("ACTOR_EN_RIVER_SOUND", "EN_RIVER_SOUND", "EN_RIVER_SOUND"), - ("ACTOR_EN_HORSE_NORMAL", "EN_HORSE_NORMAL", "EN_HORSE_NORMAL"), - ("ACTOR_EN_OSSAN", "EN_OSSAN", "EN_OSSAN"), - ("ACTOR_BG_TREEMOUTH", "BG_TREEMOUTH", "BG_TREEMOUTH"), - ("ACTOR_BG_DODOAGO", "BG_DODOAGO", "BG_DODOAGO"), - ("ACTOR_BG_HIDAN_DALM", "BG_HIDAN_DALM", "BG_HIDAN_DALM"), - ("ACTOR_BG_HIDAN_HROCK", "BG_HIDAN_HROCK", "BG_HIDAN_HROCK"), - ("ACTOR_EN_HORSE_GANON", "EN_HORSE_GANON", "EN_HORSE_GANON"), - ("ACTOR_BG_HIDAN_ROCK", "BG_HIDAN_ROCK", "BG_HIDAN_ROCK"), - ("ACTOR_BG_HIDAN_RSEKIZOU", "BG_HIDAN_RSEKIZOU", "BG_HIDAN_RSEKIZOU"), - ("ACTOR_BG_HIDAN_SEKIZOU", "BG_HIDAN_SEKIZOU", "BG_HIDAN_SEKIZOU"), - ("ACTOR_BG_HIDAN_SIMA", "BG_HIDAN_SIMA", "BG_HIDAN_SIMA"), - ("ACTOR_BG_HIDAN_SYOKU", "BG_HIDAN_SYOKU", "BG_HIDAN_SYOKU"), - ("ACTOR_EN_XC", "EN_XC", "EN_XC"), - ("ACTOR_BG_HIDAN_CURTAIN", "BG_HIDAN_CURTAIN", "BG_HIDAN_CURTAIN"), - ("ACTOR_BG_SPOT00_HANEBASI", "BG_SPOT00_HANEBASI", "BG_SPOT00_HANEBASI"), - ("ACTOR_EN_MB", "EN_MB", "EN_MB"), - ("ACTOR_EN_BOMBF", "EN_BOMBF", "EN_BOMBF"), - ("ACTOR_EN_ZL2", "EN_ZL2", "EN_ZL2"), - ("ACTOR_BG_HIDAN_FSLIFT", "BG_HIDAN_FSLIFT", "BG_HIDAN_FSLIFT"), - ("ACTOR_EN_OE2", "EN_OE2", "EN_OE2"), - ("ACTOR_BG_YDAN_HASI", "BG_YDAN_HASI", "BG_YDAN_HASI"), - ("ACTOR_BG_YDAN_MARUTA", "BG_YDAN_MARUTA", "BG_YDAN_MARUTA"), - ("ACTOR_BOSS_GANONDROF", "BOSS_GANONDROF", "BOSS_GANONDROF"), - ("ACTOR_EN_AM", "EN_AM", "EN_AM"), - ("ACTOR_EN_DEKUBABA", "EN_DEKUBABA", "EN_DEKUBABA"), - ("ACTOR_EN_M_FIRE1", "EN_M_FIRE1", "EN_M_FIRE1"), - ("ACTOR_EN_M_THUNDER", "EN_M_THUNDER", "EN_M_THUNDER"), - ("ACTOR_BG_DDAN_JD", "BG_DDAN_JD", "BG_DDAN_JD"), - ("ACTOR_BG_BREAKWALL", "BG_BREAKWALL", "BG_BREAKWALL"), - ("ACTOR_EN_JJ", "EN_JJ", "EN_JJ"), - ("ACTOR_EN_HORSE_ZELDA", "EN_HORSE_ZELDA", "EN_HORSE_ZELDA"), - ("ACTOR_BG_DDAN_KD", "BG_DDAN_KD", "BG_DDAN_KD"), - ("ACTOR_DOOR_WARP1", "DOOR_WARP1", "DOOR_WARP1"), - ("ACTOR_OBJ_SYOKUDAI", "OBJ_SYOKUDAI", "OBJ_SYOKUDAI"), - ("ACTOR_ITEM_B_HEART", "ITEM_B_HEART", "ITEM_B_HEART"), - ("ACTOR_EN_DEKUNUTS", "EN_DEKUNUTS", "EN_DEKUNUTS"), - ("ACTOR_BG_MENKURI_KAITEN", "BG_MENKURI_KAITEN", "BG_MENKURI_KAITEN"), - ("ACTOR_BG_MENKURI_EYE", "BG_MENKURI_EYE", "BG_MENKURI_EYE"), - ("ACTOR_EN_VALI", "EN_VALI", "EN_VALI"), - ("ACTOR_BG_MIZU_MOVEBG", "BG_MIZU_MOVEBG", "BG_MIZU_MOVEBG"), - ("ACTOR_BG_MIZU_WATER", "BG_MIZU_WATER", "BG_MIZU_WATER"), - ("ACTOR_ARMS_HOOK", "ARMS_HOOK", "ARMS_HOOK"), - ("ACTOR_EN_FHG", "EN_FHG", "EN_FHG"), - ("ACTOR_BG_MORI_HINERI", "BG_MORI_HINERI", "BG_MORI_HINERI"), - ("ACTOR_EN_BB", "EN_BB", "EN_BB"), - ("ACTOR_BG_TOKI_HIKARI", "BG_TOKI_HIKARI", "BG_TOKI_HIKARI"), - ("ACTOR_EN_YUKABYUN", "EN_YUKABYUN", "EN_YUKABYUN"), - ("ACTOR_BG_TOKI_SWD", "BG_TOKI_SWD", "BG_TOKI_SWD"), - ("ACTOR_EN_FHG_FIRE", "EN_FHG_FIRE", "EN_FHG_FIRE"), - ("ACTOR_BG_MJIN", "BG_MJIN", "BG_MJIN"), - ("ACTOR_BG_HIDAN_KOUSI", "BG_HIDAN_KOUSI", "BG_HIDAN_KOUSI"), - ("ACTOR_DOOR_TOKI", "DOOR_TOKI", "DOOR_TOKI"), - ("ACTOR_BG_HIDAN_HAMSTEP", "BG_HIDAN_HAMSTEP", "BG_HIDAN_HAMSTEP"), - ("ACTOR_EN_BIRD", "EN_BIRD", "EN_BIRD"), - ("ACTOR_EN_WOOD02", "EN_WOOD02", "EN_WOOD02"), - ("ACTOR_EN_LIGHTBOX", "EN_LIGHTBOX", "EN_LIGHTBOX"), - ("ACTOR_EN_PU_BOX", "EN_PU_BOX", "EN_PU_BOX"), - ("ACTOR_EN_TRAP", "EN_TRAP", "EN_TRAP"), - ("ACTOR_EN_AROW_TRAP", "EN_AROW_TRAP", "EN_AROW_TRAP"), - ("ACTOR_EN_VASE", "EN_VASE", "EN_VASE"), - ("ACTOR_EN_TA", "EN_TA", "EN_TA"), - ("ACTOR_EN_TK", "EN_TK", "EN_TK"), - ("ACTOR_BG_MORI_BIGST", "BG_MORI_BIGST", "BG_MORI_BIGST"), - ("ACTOR_BG_MORI_ELEVATOR", "BG_MORI_ELEVATOR", "BG_MORI_ELEVATOR"), - ("ACTOR_BG_MORI_KAITENKABE", "BG_MORI_KAITENKABE", "BG_MORI_KAITENKABE"), - ("ACTOR_BG_MORI_RAKKATENJO", "BG_MORI_RAKKATENJO", "BG_MORI_RAKKATENJO"), - ("ACTOR_EN_VM", "EN_VM", "EN_VM"), - ("ACTOR_DEMO_EFFECT", "DEMO_EFFECT", "DEMO_EFFECT"), - ("ACTOR_DEMO_KANKYO", "DEMO_KANKYO", "DEMO_KANKYO"), - ("ACTOR_BG_HIDAN_FWBIG", "BG_HIDAN_FWBIG", "BG_HIDAN_FWBIG"), - ("ACTOR_EN_FLOORMAS", "EN_FLOORMAS", "EN_FLOORMAS"), - ("ACTOR_EN_HEISHI1", "EN_HEISHI1", "EN_HEISHI1"), - ("ACTOR_EN_RD", "EN_RD", "EN_RD"), - ("ACTOR_EN_PO_SISTERS", "EN_PO_SISTERS", "EN_PO_SISTERS"), - ("ACTOR_BG_HEAVY_BLOCK", "BG_HEAVY_BLOCK", "BG_HEAVY_BLOCK"), - ("ACTOR_BG_PO_EVENT", "BG_PO_EVENT", "BG_PO_EVENT"), - ("ACTOR_OBJ_MURE", "OBJ_MURE", "OBJ_MURE"), - ("ACTOR_EN_SW", "EN_SW", "EN_SW"), - ("ACTOR_BOSS_FD", "BOSS_FD", "BOSS_FD"), - ("ACTOR_OBJECT_KANKYO", "OBJECT_KANKYO", "OBJECT_KANKYO"), - ("ACTOR_EN_DU", "EN_DU", "EN_DU"), - ("ACTOR_EN_FD", "EN_FD", "EN_FD"), - ("ACTOR_EN_HORSE_LINK_CHILD", "EN_HORSE_LINK_CHILD", "EN_HORSE_LINK_CHILD"), - ("ACTOR_DOOR_ANA", "DOOR_ANA", "DOOR_ANA"), - ("ACTOR_BG_SPOT02_OBJECTS", "BG_SPOT02_OBJECTS", "BG_SPOT02_OBJECTS"), - ("ACTOR_BG_HAKA", "BG_HAKA", "BG_HAKA"), - ("ACTOR_MAGIC_WIND", "MAGIC_WIND", "MAGIC_WIND"), - ("ACTOR_MAGIC_FIRE", "MAGIC_FIRE", "MAGIC_FIRE"), - ("ACTOR_EN_RU1", "EN_RU1", "EN_RU1"), - ("ACTOR_BOSS_FD2", "BOSS_FD2", "BOSS_FD2"), - ("ACTOR_EN_FD_FIRE", "EN_FD_FIRE", "EN_FD_FIRE"), - ("ACTOR_EN_DH", "EN_DH", "EN_DH"), - ("ACTOR_EN_DHA", "EN_DHA", "EN_DHA"), - ("ACTOR_EN_RL", "EN_RL", "EN_RL"), - ("ACTOR_EN_ENCOUNT1", "EN_ENCOUNT1", "EN_ENCOUNT1"), - ("ACTOR_DEMO_DU", "DEMO_DU", "DEMO_DU"), - ("ACTOR_DEMO_IM", "DEMO_IM", "DEMO_IM"), - ("ACTOR_DEMO_TRE_LGT", "DEMO_TRE_LGT", "DEMO_TRE_LGT"), - ("ACTOR_EN_FW", "EN_FW", "EN_FW"), - ("ACTOR_BG_VB_SIMA", "BG_VB_SIMA", "BG_VB_SIMA"), - ("ACTOR_EN_VB_BALL", "EN_VB_BALL", "EN_VB_BALL"), - ("ACTOR_BG_HAKA_MEGANE", "BG_HAKA_MEGANE", "BG_HAKA_MEGANE"), - ("ACTOR_BG_HAKA_MEGANEBG", "BG_HAKA_MEGANEBG", "BG_HAKA_MEGANEBG"), - ("ACTOR_BG_HAKA_SHIP", "BG_HAKA_SHIP", "BG_HAKA_SHIP"), - ("ACTOR_BG_HAKA_SGAMI", "BG_HAKA_SGAMI", "BG_HAKA_SGAMI"), - ("ACTOR_EN_HEISHI2", "EN_HEISHI2", "EN_HEISHI2"), - ("ACTOR_EN_ENCOUNT2", "EN_ENCOUNT2", "EN_ENCOUNT2"), - ("ACTOR_EN_FIRE_ROCK", "EN_FIRE_ROCK", "EN_FIRE_ROCK"), - ("ACTOR_EN_BROB", "EN_BROB", "EN_BROB"), - ("ACTOR_MIR_RAY", "MIR_RAY", "MIR_RAY"), - ("ACTOR_BG_SPOT09_OBJ", "BG_SPOT09_OBJ", "BG_SPOT09_OBJ"), - ("ACTOR_BG_SPOT18_OBJ", "BG_SPOT18_OBJ", "BG_SPOT18_OBJ"), - ("ACTOR_BOSS_VA", "BOSS_VA", "BOSS_VA"), - ("ACTOR_BG_HAKA_TUBO", "BG_HAKA_TUBO", "BG_HAKA_TUBO"), - ("ACTOR_BG_HAKA_TRAP", "BG_HAKA_TRAP", "BG_HAKA_TRAP"), - ("ACTOR_BG_HAKA_HUTA", "BG_HAKA_HUTA", "BG_HAKA_HUTA"), - ("ACTOR_BG_HAKA_ZOU", "BG_HAKA_ZOU", "BG_HAKA_ZOU"), - ("ACTOR_BG_SPOT17_FUNEN", "BG_SPOT17_FUNEN", "BG_SPOT17_FUNEN"), - ("ACTOR_EN_SYATEKI_ITM", "EN_SYATEKI_ITM", "EN_SYATEKI_ITM"), - ("ACTOR_EN_SYATEKI_MAN", "EN_SYATEKI_MAN", "EN_SYATEKI_MAN"), - ("ACTOR_EN_TANA", "EN_TANA", "EN_TANA"), - ("ACTOR_EN_NB", "EN_NB", "EN_NB"), - ("ACTOR_BOSS_MO", "BOSS_MO", "BOSS_MO"), - ("ACTOR_EN_SB", "EN_SB", "EN_SB"), - ("ACTOR_EN_BIGOKUTA", "EN_BIGOKUTA", "EN_BIGOKUTA"), - ("ACTOR_EN_KAREBABA", "EN_KAREBABA", "EN_KAREBABA"), - ("ACTOR_BG_BDAN_OBJECTS", "BG_BDAN_OBJECTS", "BG_BDAN_OBJECTS"), - ("ACTOR_DEMO_SA", "DEMO_SA", "DEMO_SA"), - ("ACTOR_DEMO_GO", "DEMO_GO", "DEMO_GO"), - ("ACTOR_EN_IN", "EN_IN", "EN_IN"), - ("ACTOR_EN_TR", "EN_TR", "EN_TR"), - ("ACTOR_BG_SPOT16_BOMBSTONE", "BG_SPOT16_BOMBSTONE", "BG_SPOT16_BOMBSTONE"), - ("ACTOR_BG_HIDAN_KOWARERUKABE", "BG_HIDAN_KOWARERUKABE", "BG_HIDAN_KOWARERUKABE"), - ("ACTOR_BG_BOMBWALL", "BG_BOMBWALL", "BG_BOMBWALL"), - ("ACTOR_BG_SPOT08_ICEBLOCK", "BG_SPOT08_ICEBLOCK", "BG_SPOT08_ICEBLOCK"), - ("ACTOR_EN_RU2", "EN_RU2", "EN_RU2"), - ("ACTOR_OBJ_DEKUJR", "OBJ_DEKUJR", "OBJ_DEKUJR"), - ("ACTOR_BG_MIZU_UZU", "BG_MIZU_UZU", "BG_MIZU_UZU"), - ("ACTOR_BG_SPOT06_OBJECTS", "BG_SPOT06_OBJECTS", "BG_SPOT06_OBJECTS"), - ("ACTOR_BG_ICE_OBJECTS", "BG_ICE_OBJECTS", "BG_ICE_OBJECTS"), - ("ACTOR_BG_HAKA_WATER", "BG_HAKA_WATER", "BG_HAKA_WATER"), - ("ACTOR_EN_MA2", "EN_MA2", "EN_MA2"), - ("ACTOR_EN_BOM_CHU", "EN_BOM_CHU", "EN_BOM_CHU"), - ("ACTOR_EN_HORSE_GAME_CHECK", "EN_HORSE_GAME_CHECK", "EN_HORSE_GAME_CHECK"), - ("ACTOR_BOSS_TW", "BOSS_TW", "BOSS_TW"), - ("ACTOR_EN_RR", "EN_RR", "EN_RR"), - ("ACTOR_EN_BA", "EN_BA", "EN_BA"), - ("ACTOR_EN_BX", "EN_BX", "EN_BX"), - ("ACTOR_EN_ANUBICE", "EN_ANUBICE", "EN_ANUBICE"), - ("ACTOR_EN_ANUBICE_FIRE", "EN_ANUBICE_FIRE", "EN_ANUBICE_FIRE"), - ("ACTOR_BG_MORI_HASHIGO", "BG_MORI_HASHIGO", "BG_MORI_HASHIGO"), - ("ACTOR_BG_MORI_HASHIRA4", "BG_MORI_HASHIRA4", "BG_MORI_HASHIRA4"), - ("ACTOR_BG_MORI_IDOMIZU", "BG_MORI_IDOMIZU", "BG_MORI_IDOMIZU"), - ("ACTOR_BG_SPOT16_DOUGHNUT", "BG_SPOT16_DOUGHNUT", "BG_SPOT16_DOUGHNUT"), - ("ACTOR_BG_BDAN_SWITCH", "BG_BDAN_SWITCH", "BG_BDAN_SWITCH"), - ("ACTOR_EN_MA1", "EN_MA1", "EN_MA1"), - ("ACTOR_BOSS_GANON", "BOSS_GANON", "BOSS_GANON"), - ("ACTOR_BOSS_SST", "BOSS_SST", "BOSS_SST"), - ("ACTOR_EN_NY", "EN_NY", "EN_NY"), - ("ACTOR_EN_FR", "EN_FR", "EN_FR"), - ("ACTOR_ITEM_SHIELD", "ITEM_SHIELD", "ITEM_SHIELD"), - ("ACTOR_BG_ICE_SHELTER", "BG_ICE_SHELTER", "BG_ICE_SHELTER"), - ("ACTOR_EN_ICE_HONO", "EN_ICE_HONO", "EN_ICE_HONO"), - ("ACTOR_ITEM_OCARINA", "ITEM_OCARINA", "ITEM_OCARINA"), - ("ACTOR_MAGIC_DARK", "MAGIC_DARK", "MAGIC_DARK"), - ("ACTOR_DEMO_6K", "DEMO_6K", "DEMO_6K"), - ("ACTOR_EN_ANUBICE_TAG", "EN_ANUBICE_TAG", "EN_ANUBICE_TAG"), - ("ACTOR_BG_HAKA_GATE", "BG_HAKA_GATE", "BG_HAKA_GATE"), - ("ACTOR_BG_SPOT15_SAKU", "BG_SPOT15_SAKU", "BG_SPOT15_SAKU"), - ("ACTOR_BG_JYA_GOROIWA", "BG_JYA_GOROIWA", "BG_JYA_GOROIWA"), - ("ACTOR_BG_JYA_ZURERUKABE", "BG_JYA_ZURERUKABE", "BG_JYA_ZURERUKABE"), - ("ACTOR_BG_JYA_COBRA", "BG_JYA_COBRA", "BG_JYA_COBRA"), - ("ACTOR_BG_JYA_KANAAMI", "BG_JYA_KANAAMI", "BG_JYA_KANAAMI"), - ("ACTOR_FISHING", "FISHING", "FISHING"), - ("ACTOR_OBJ_OSHIHIKI", "OBJ_OSHIHIKI", "OBJ_OSHIHIKI"), - ("ACTOR_BG_GATE_SHUTTER", "BG_GATE_SHUTTER", "BG_GATE_SHUTTER"), - ("ACTOR_EFF_DUST", "EFF_DUST", "EFF_DUST"), - ("ACTOR_BG_SPOT01_FUSYA", "BG_SPOT01_FUSYA", "BG_SPOT01_FUSYA"), - ("ACTOR_BG_SPOT01_IDOHASHIRA", "BG_SPOT01_IDOHASHIRA", "BG_SPOT01_IDOHASHIRA"), - ("ACTOR_BG_SPOT01_IDOMIZU", "BG_SPOT01_IDOMIZU", "BG_SPOT01_IDOMIZU"), - ("ACTOR_BG_PO_SYOKUDAI", "BG_PO_SYOKUDAI", "BG_PO_SYOKUDAI"), - ("ACTOR_BG_GANON_OTYUKA", "BG_GANON_OTYUKA", "BG_GANON_OTYUKA"), - ("ACTOR_BG_SPOT15_RRBOX", "BG_SPOT15_RRBOX", "BG_SPOT15_RRBOX"), - ("ACTOR_BG_UMAJUMP", "BG_UMAJUMP", "BG_UMAJUMP"), - ("ACTOR_ARROW_FIRE", "ARROW_FIRE", "ARROW_FIRE"), - ("ACTOR_ARROW_ICE", "ARROW_ICE", "ARROW_ICE"), - ("ACTOR_ARROW_LIGHT", "ARROW_LIGHT", "ARROW_LIGHT"), - ("ACTOR_ITEM_ETCETERA", "ITEM_ETCETERA", "ITEM_ETCETERA"), - ("ACTOR_OBJ_KIBAKO", "OBJ_KIBAKO", "OBJ_KIBAKO"), - ("ACTOR_OBJ_TSUBO", "OBJ_TSUBO", "OBJ_TSUBO"), - ("ACTOR_EN_WONDER_ITEM", "EN_WONDER_ITEM", "EN_WONDER_ITEM"), - ("ACTOR_EN_IK", "EN_IK", "EN_IK"), - ("ACTOR_DEMO_IK", "DEMO_IK", "DEMO_IK"), - ("ACTOR_EN_SKJ", "EN_SKJ", "EN_SKJ"), - ("ACTOR_EN_SKJNEEDLE", "EN_SKJNEEDLE", "EN_SKJNEEDLE"), - ("ACTOR_EN_G_SWITCH", "EN_G_SWITCH", "EN_G_SWITCH"), - ("ACTOR_DEMO_EXT", "DEMO_EXT", "DEMO_EXT"), - ("ACTOR_DEMO_SHD", "DEMO_SHD", "DEMO_SHD"), - ("ACTOR_EN_DNS", "EN_DNS", "EN_DNS"), - ("ACTOR_ELF_MSG", "ELF_MSG", "ELF_MSG"), - ("ACTOR_EN_HONOTRAP", "EN_HONOTRAP", "EN_HONOTRAP"), - ("ACTOR_EN_TUBO_TRAP", "EN_TUBO_TRAP", "EN_TUBO_TRAP"), - ("ACTOR_OBJ_ICE_POLY", "OBJ_ICE_POLY", "OBJ_ICE_POLY"), - ("ACTOR_BG_SPOT03_TAKI", "BG_SPOT03_TAKI", "BG_SPOT03_TAKI"), - ("ACTOR_BG_SPOT07_TAKI", "BG_SPOT07_TAKI", "BG_SPOT07_TAKI"), - ("ACTOR_EN_FZ", "EN_FZ", "EN_FZ"), - ("ACTOR_EN_PO_RELAY", "EN_PO_RELAY", "EN_PO_RELAY"), - ("ACTOR_BG_RELAY_OBJECTS", "BG_RELAY_OBJECTS", "BG_RELAY_OBJECTS"), - ("ACTOR_EN_DIVING_GAME", "EN_DIVING_GAME", "EN_DIVING_GAME"), - ("ACTOR_EN_KUSA", "EN_KUSA", "EN_KUSA"), - ("ACTOR_OBJ_BEAN", "OBJ_BEAN", "OBJ_BEAN"), - ("ACTOR_OBJ_BOMBIWA", "OBJ_BOMBIWA", "OBJ_BOMBIWA"), - ("ACTOR_OBJ_SWITCH", "OBJ_SWITCH", "OBJ_SWITCH"), - ("ACTOR_OBJ_ELEVATOR", "OBJ_ELEVATOR", "OBJ_ELEVATOR"), - ("ACTOR_OBJ_LIFT", "OBJ_LIFT", "OBJ_LIFT"), - ("ACTOR_OBJ_HSBLOCK", "OBJ_HSBLOCK", "OBJ_HSBLOCK"), - ("ACTOR_EN_OKARINA_TAG", "EN_OKARINA_TAG", "EN_OKARINA_TAG"), - ("ACTOR_EN_YABUSAME_MARK", "EN_YABUSAME_MARK", "EN_YABUSAME_MARK"), - ("ACTOR_EN_GOROIWA", "EN_GOROIWA", "EN_GOROIWA"), - ("ACTOR_EN_EX_RUPPY", "EN_EX_RUPPY", "EN_EX_RUPPY"), - ("ACTOR_EN_TORYO", "EN_TORYO", "EN_TORYO"), - ("ACTOR_EN_DAIKU", "EN_DAIKU", "EN_DAIKU"), - ("ACTOR_EN_NWC", "EN_NWC", "EN_NWC"), - ("ACTOR_EN_BLKOBJ", "EN_BLKOBJ", "EN_BLKOBJ"), - ("ACTOR_ITEM_INBOX", "ITEM_INBOX", "ITEM_INBOX"), - ("ACTOR_EN_GE1", "EN_GE1", "EN_GE1"), - ("ACTOR_OBJ_BLOCKSTOP", "OBJ_BLOCKSTOP", "OBJ_BLOCKSTOP"), - ("ACTOR_EN_SDA", "EN_SDA", "EN_SDA"), - ("ACTOR_EN_CLEAR_TAG", "EN_CLEAR_TAG", "EN_CLEAR_TAG"), - ("ACTOR_EN_NIW_LADY", "EN_NIW_LADY", "EN_NIW_LADY"), - ("ACTOR_EN_GM", "EN_GM", "EN_GM"), - ("ACTOR_EN_MS", "EN_MS", "EN_MS"), - ("ACTOR_EN_HS", "EN_HS", "EN_HS"), - ("ACTOR_BG_INGATE", "BG_INGATE", "BG_INGATE"), - ("ACTOR_EN_KANBAN", "EN_KANBAN", "EN_KANBAN"), - ("ACTOR_EN_HEISHI3", "EN_HEISHI3", "EN_HEISHI3"), - ("ACTOR_EN_SYATEKI_NIW", "EN_SYATEKI_NIW", "EN_SYATEKI_NIW"), - ("ACTOR_EN_ATTACK_NIW", "EN_ATTACK_NIW", "EN_ATTACK_NIW"), - ("ACTOR_BG_SPOT01_IDOSOKO", "BG_SPOT01_IDOSOKO", "BG_SPOT01_IDOSOKO"), - ("ACTOR_EN_SA", "EN_SA", "EN_SA"), - ("ACTOR_EN_WONDER_TALK", "EN_WONDER_TALK", "EN_WONDER_TALK"), - ("ACTOR_BG_GJYO_BRIDGE", "BG_GJYO_BRIDGE", "BG_GJYO_BRIDGE"), - ("ACTOR_EN_DS", "EN_DS", "EN_DS"), - ("ACTOR_EN_MK", "EN_MK", "EN_MK"), - ("ACTOR_EN_BOM_BOWL_MAN", "EN_BOM_BOWL_MAN", "EN_BOM_BOWL_MAN"), - ("ACTOR_EN_BOM_BOWL_PIT", "EN_BOM_BOWL_PIT", "EN_BOM_BOWL_PIT"), - ("ACTOR_EN_OWL", "EN_OWL", "EN_OWL"), - ("ACTOR_EN_ISHI", "EN_ISHI", "EN_ISHI"), - ("ACTOR_OBJ_HANA", "OBJ_HANA", "OBJ_HANA"), - ("ACTOR_OBJ_LIGHTSWITCH", "OBJ_LIGHTSWITCH", "OBJ_LIGHTSWITCH"), - ("ACTOR_OBJ_MURE2", "OBJ_MURE2", "OBJ_MURE2"), - ("ACTOR_EN_GO", "EN_GO", "EN_GO"), - ("ACTOR_EN_FU", "EN_FU", "EN_FU"), - ("ACTOR_EN_CHANGER", "EN_CHANGER", "EN_CHANGER"), - ("ACTOR_BG_JYA_MEGAMI", "BG_JYA_MEGAMI", "BG_JYA_MEGAMI"), - ("ACTOR_BG_JYA_LIFT", "BG_JYA_LIFT", "BG_JYA_LIFT"), - ("ACTOR_BG_JYA_BIGMIRROR", "BG_JYA_BIGMIRROR", "BG_JYA_BIGMIRROR"), - ("ACTOR_BG_JYA_BOMBCHUIWA", "BG_JYA_BOMBCHUIWA", "BG_JYA_BOMBCHUIWA"), - ("ACTOR_BG_JYA_AMISHUTTER", "BG_JYA_AMISHUTTER", "BG_JYA_AMISHUTTER"), - ("ACTOR_BG_JYA_BOMBIWA", "BG_JYA_BOMBIWA", "BG_JYA_BOMBIWA"), - ("ACTOR_BG_SPOT18_BASKET", "BG_SPOT18_BASKET", "BG_SPOT18_BASKET"), - ("ACTOR_EN_GANON_ORGAN", "EN_GANON_ORGAN", "EN_GANON_ORGAN"), - ("ACTOR_EN_SIOFUKI", "EN_SIOFUKI", "EN_SIOFUKI"), - ("ACTOR_EN_STREAM", "EN_STREAM", "EN_STREAM"), - ("ACTOR_EN_MM", "EN_MM", "EN_MM"), - ("ACTOR_EN_KO", "EN_KO", "EN_KO"), - ("ACTOR_EN_KZ", "EN_KZ", "EN_KZ"), - ("ACTOR_EN_WEATHER_TAG", "EN_WEATHER_TAG", "EN_WEATHER_TAG"), - ("ACTOR_BG_SST_FLOOR", "BG_SST_FLOOR", "BG_SST_FLOOR"), - ("ACTOR_EN_ANI", "EN_ANI", "EN_ANI"), - ("ACTOR_EN_EX_ITEM", "EN_EX_ITEM", "EN_EX_ITEM"), - ("ACTOR_BG_JYA_IRONOBJ", "BG_JYA_IRONOBJ", "BG_JYA_IRONOBJ"), - ("ACTOR_EN_JS", "EN_JS", "EN_JS"), - ("ACTOR_EN_JSJUTAN", "EN_JSJUTAN", "EN_JSJUTAN"), - ("ACTOR_EN_CS", "EN_CS", "EN_CS"), - ("ACTOR_EN_MD", "EN_MD", "EN_MD"), - ("ACTOR_EN_HY", "EN_HY", "EN_HY"), - ("ACTOR_EN_GANON_MANT", "EN_GANON_MANT", "EN_GANON_MANT"), - ("ACTOR_EN_OKARINA_EFFECT", "EN_OKARINA_EFFECT", "EN_OKARINA_EFFECT"), - ("ACTOR_EN_MAG", "EN_MAG", "EN_MAG"), - ("ACTOR_DOOR_GERUDO", "DOOR_GERUDO", "DOOR_GERUDO"), - ("ACTOR_ELF_MSG2", "ELF_MSG2", "ELF_MSG2"), - ("ACTOR_DEMO_GT", "DEMO_GT", "DEMO_GT"), - ("ACTOR_EN_PO_FIELD", "EN_PO_FIELD", "EN_PO_FIELD"), - ("ACTOR_EFC_ERUPC", "EFC_ERUPC", "EFC_ERUPC"), - ("ACTOR_BG_ZG", "BG_ZG", "BG_ZG"), - ("ACTOR_EN_HEISHI4", "EN_HEISHI4", "EN_HEISHI4"), - ("ACTOR_EN_ZL3", "EN_ZL3", "EN_ZL3"), - ("ACTOR_BOSS_GANON2", "BOSS_GANON2", "BOSS_GANON2"), - ("ACTOR_EN_KAKASI", "EN_KAKASI", "EN_KAKASI"), - ("ACTOR_EN_TAKARA_MAN", "EN_TAKARA_MAN", "EN_TAKARA_MAN"), - ("ACTOR_OBJ_MAKEOSHIHIKI", "OBJ_MAKEOSHIHIKI", "OBJ_MAKEOSHIHIKI"), - ("ACTOR_OCEFF_SPOT", "OCEFF_SPOT", "OCEFF_SPOT"), - ("ACTOR_END_TITLE", "END_TITLE", "END_TITLE"), - ("ACTOR_EN_TORCH", "EN_TORCH", "EN_TORCH"), - ("ACTOR_DEMO_EC", "DEMO_EC", "DEMO_EC"), - ("ACTOR_SHOT_SUN", "SHOT_SUN", "SHOT_SUN"), - ("ACTOR_EN_DY_EXTRA", "EN_DY_EXTRA", "EN_DY_EXTRA"), - ("ACTOR_EN_WONDER_TALK2", "EN_WONDER_TALK2", "EN_WONDER_TALK2"), - ("ACTOR_EN_GE2", "EN_GE2", "EN_GE2"), - ("ACTOR_OBJ_ROOMTIMER", "OBJ_ROOMTIMER", "OBJ_ROOMTIMER"), - ("ACTOR_EN_SSH", "EN_SSH", "EN_SSH"), - ("ACTOR_EN_STH", "EN_STH", "EN_STH"), - ("ACTOR_OCEFF_WIPE", "OCEFF_WIPE", "OCEFF_WIPE"), - ("ACTOR_OCEFF_STORM", "OCEFF_STORM", "OCEFF_STORM"), - ("ACTOR_EN_WEIYER", "EN_WEIYER", "EN_WEIYER"), - ("ACTOR_BG_SPOT05_SOKO", "BG_SPOT05_SOKO", "BG_SPOT05_SOKO"), - ("ACTOR_BG_JYA_1FLIFT", "BG_JYA_1FLIFT", "BG_JYA_1FLIFT"), - ("ACTOR_BG_JYA_HAHENIRON", "BG_JYA_HAHENIRON", "BG_JYA_HAHENIRON"), - ("ACTOR_BG_SPOT12_GATE", "BG_SPOT12_GATE", "BG_SPOT12_GATE"), - ("ACTOR_BG_SPOT12_SAKU", "BG_SPOT12_SAKU", "BG_SPOT12_SAKU"), - ("ACTOR_EN_HINTNUTS", "EN_HINTNUTS", "EN_HINTNUTS"), - ("ACTOR_EN_NUTSBALL", "EN_NUTSBALL", "EN_NUTSBALL"), - ("ACTOR_BG_SPOT00_BREAK", "BG_SPOT00_BREAK", "BG_SPOT00_BREAK"), - ("ACTOR_EN_SHOPNUTS", "EN_SHOPNUTS", "EN_SHOPNUTS"), - ("ACTOR_EN_IT", "EN_IT", "EN_IT"), - ("ACTOR_EN_GELDB", "EN_GELDB", "EN_GELDB"), - ("ACTOR_OCEFF_WIPE2", "OCEFF_WIPE2", "OCEFF_WIPE2"), - ("ACTOR_OCEFF_WIPE3", "OCEFF_WIPE3", "OCEFF_WIPE3"), - ("ACTOR_EN_NIW_GIRL", "EN_NIW_GIRL", "EN_NIW_GIRL"), - ("ACTOR_EN_DOG", "EN_DOG", "EN_DOG"), - ("ACTOR_EN_SI", "EN_SI", "EN_SI"), - ("ACTOR_BG_SPOT01_OBJECTS2", "BG_SPOT01_OBJECTS2", "BG_SPOT01_OBJECTS2"), - ("ACTOR_OBJ_COMB", "OBJ_COMB", "OBJ_COMB"), - ("ACTOR_BG_SPOT11_BAKUDANKABE", "BG_SPOT11_BAKUDANKABE", "BG_SPOT11_BAKUDANKABE"), - ("ACTOR_OBJ_KIBAKO2", "OBJ_KIBAKO2", "OBJ_KIBAKO2"), - ("ACTOR_EN_DNT_DEMO", "EN_DNT_DEMO", "EN_DNT_DEMO"), - ("ACTOR_EN_DNT_JIJI", "EN_DNT_JIJI", "EN_DNT_JIJI"), - ("ACTOR_EN_DNT_NOMAL", "EN_DNT_NOMAL", "EN_DNT_NOMAL"), - ("ACTOR_EN_GUEST", "EN_GUEST", "EN_GUEST"), - ("ACTOR_BG_BOM_GUARD", "BG_BOM_GUARD", "BG_BOM_GUARD"), - ("ACTOR_EN_HS2", "EN_HS2", "EN_HS2"), - ("ACTOR_DEMO_KEKKAI", "DEMO_KEKKAI", "DEMO_KEKKAI"), - ("ACTOR_BG_SPOT08_BAKUDANKABE", "BG_SPOT08_BAKUDANKABE", "BG_SPOT08_BAKUDANKABE"), - ("ACTOR_BG_SPOT17_BAKUDANKABE", "BG_SPOT17_BAKUDANKABE", "BG_SPOT17_BAKUDANKABE"), - ("ACTOR_OBJ_MURE3", "OBJ_MURE3", "OBJ_MURE3"), - ("ACTOR_EN_TG", "EN_TG", "EN_TG"), - ("ACTOR_EN_MU", "EN_MU", "EN_MU"), - ("ACTOR_EN_GO2", "EN_GO2", "EN_GO2"), - ("ACTOR_EN_WF", "EN_WF", "EN_WF"), - ("ACTOR_EN_SKB", "EN_SKB", "EN_SKB"), - ("ACTOR_DEMO_GJ", "DEMO_GJ", "DEMO_GJ"), - ("ACTOR_DEMO_GEFF", "DEMO_GEFF", "DEMO_GEFF"), - ("ACTOR_BG_GND_FIREMEIRO", "BG_GND_FIREMEIRO", "BG_GND_FIREMEIRO"), - ("ACTOR_BG_GND_DARKMEIRO", "BG_GND_DARKMEIRO", "BG_GND_DARKMEIRO"), - ("ACTOR_BG_GND_SOULMEIRO", "BG_GND_SOULMEIRO", "BG_GND_SOULMEIRO"), - ("ACTOR_BG_GND_NISEKABE", "BG_GND_NISEKABE", "BG_GND_NISEKABE"), - ("ACTOR_BG_GND_ICEBLOCK", "BG_GND_ICEBLOCK", "BG_GND_ICEBLOCK"), - ("ACTOR_EN_GB", "EN_GB", "EN_GB"), - ("ACTOR_EN_GS", "EN_GS", "EN_GS"), - ("ACTOR_BG_MIZU_BWALL", "BG_MIZU_BWALL", "BG_MIZU_BWALL"), - ("ACTOR_BG_MIZU_SHUTTER", "BG_MIZU_SHUTTER", "BG_MIZU_SHUTTER"), - ("ACTOR_EN_DAIKU_KAKARIKO", "EN_DAIKU_KAKARIKO", "EN_DAIKU_KAKARIKO"), - ("ACTOR_BG_BOWL_WALL", "BG_BOWL_WALL", "BG_BOWL_WALL"), - ("ACTOR_EN_WALL_TUBO", "EN_WALL_TUBO", "EN_WALL_TUBO"), - ("ACTOR_EN_PO_DESERT", "EN_PO_DESERT", "EN_PO_DESERT"), - ("ACTOR_EN_CROW", "EN_CROW", "EN_CROW"), - ("ACTOR_DOOR_KILLER", "DOOR_KILLER", "DOOR_KILLER"), - ("ACTOR_BG_SPOT11_OASIS", "BG_SPOT11_OASIS", "BG_SPOT11_OASIS"), - ("ACTOR_BG_SPOT18_FUTA", "BG_SPOT18_FUTA", "BG_SPOT18_FUTA"), - ("ACTOR_BG_SPOT18_SHUTTER", "BG_SPOT18_SHUTTER", "BG_SPOT18_SHUTTER"), - ("ACTOR_EN_MA3", "EN_MA3", "EN_MA3"), - ("ACTOR_EN_COW", "EN_COW", "EN_COW"), - ("ACTOR_BG_ICE_TURARA", "BG_ICE_TURARA", "BG_ICE_TURARA"), - ("ACTOR_BG_ICE_SHUTTER", "BG_ICE_SHUTTER", "BG_ICE_SHUTTER"), - ("ACTOR_EN_KAKASI2", "EN_KAKASI2", "EN_KAKASI2"), - ("ACTOR_EN_KAKASI3", "EN_KAKASI3", "EN_KAKASI3"), - ("ACTOR_OCEFF_WIPE4", "OCEFF_WIPE4", "OCEFF_WIPE4"), - ("ACTOR_EN_EG", "EN_EG", "EN_EG"), - ("ACTOR_BG_MENKURI_NISEKABE", "BG_MENKURI_NISEKABE", "BG_MENKURI_NISEKABE"), - ("ACTOR_EN_ZO", "EN_ZO", "EN_ZO"), - ("ACTOR_OBJ_MAKEKINSUTA", "OBJ_MAKEKINSUTA", "OBJ_MAKEKINSUTA"), - ("ACTOR_EN_GE3", "EN_GE3", "EN_GE3"), - ("ACTOR_OBJ_TIMEBLOCK", "OBJ_TIMEBLOCK", "OBJ_TIMEBLOCK"), - ("ACTOR_OBJ_HAMISHI", "OBJ_HAMISHI", "OBJ_HAMISHI"), - ("ACTOR_EN_ZL4", "EN_ZL4", "EN_ZL4"), - ("ACTOR_EN_MM2", "EN_MM2", "EN_MM2"), - ("ACTOR_BG_JYA_BLOCK", "BG_JYA_BLOCK", "BG_JYA_BLOCK"), - ("ACTOR_OBJ_WARP2BLOCK", "OBJ_WARP2BLOCK", "OBJ_WARP2BLOCK"), + ("Custom", "Custom", "Custom"), + ("ACTOR_PLAYER", "PLAYER", "PLAYER"), + ("ACTOR_EN_TEST", "EN_TEST", "EN_TEST"), + ("ACTOR_EN_GIRLA", "EN_GIRLA", "EN_GIRLA"), + ("ACTOR_EN_PART", "EN_PART", "EN_PART"), + ("ACTOR_EN_LIGHT", "EN_LIGHT", "EN_LIGHT"), + ("ACTOR_EN_DOOR", "EN_DOOR", "EN_DOOR"), + ("ACTOR_EN_BOX", "EN_BOX", "EN_BOX"), + ("ACTOR_BG_DY_YOSEIZO", "BG_DY_YOSEIZO", "BG_DY_YOSEIZO"), + ("ACTOR_BG_HIDAN_FIREWALL", "BG_HIDAN_FIREWALL", "BG_HIDAN_FIREWALL"), + ("ACTOR_EN_POH", "EN_POH", "EN_POH"), + ("ACTOR_EN_OKUTA", "EN_OKUTA", "EN_OKUTA"), + ("ACTOR_BG_YDAN_SP", "BG_YDAN_SP", "BG_YDAN_SP"), + ("ACTOR_EN_BOM", "EN_BOM", "EN_BOM"), + ("ACTOR_EN_WALLMAS", "EN_WALLMAS", "EN_WALLMAS"), + ("ACTOR_EN_DODONGO", "EN_DODONGO", "EN_DODONGO"), + ("ACTOR_EN_FIREFLY", "EN_FIREFLY", "EN_FIREFLY"), + ("ACTOR_EN_HORSE", "EN_HORSE", "EN_HORSE"), + ("ACTOR_EN_ITEM00", "EN_ITEM00", "EN_ITEM00"), + ("ACTOR_EN_ARROW", "EN_ARROW", "EN_ARROW"), + ("ACTOR_EN_ELF", "EN_ELF", "EN_ELF"), + ("ACTOR_EN_NIW", "EN_NIW", "EN_NIW"), + ("ACTOR_EN_TITE", "EN_TITE", "EN_TITE"), + ("ACTOR_EN_REEBA", "EN_REEBA", "EN_REEBA"), + ("ACTOR_EN_PEEHAT", "EN_PEEHAT", "EN_PEEHAT"), + ("ACTOR_EN_BUTTE", "EN_BUTTE", "EN_BUTTE"), + ("ACTOR_EN_INSECT", "EN_INSECT", "EN_INSECT"), + ("ACTOR_EN_FISH", "EN_FISH", "EN_FISH"), + ("ACTOR_EN_HOLL", "EN_HOLL", "EN_HOLL"), + ("ACTOR_EN_SCENE_CHANGE", "EN_SCENE_CHANGE", "EN_SCENE_CHANGE"), + ("ACTOR_EN_ZF", "EN_ZF", "EN_ZF"), + ("ACTOR_EN_HATA", "EN_HATA", "EN_HATA"), + ("ACTOR_BOSS_DODONGO", "BOSS_DODONGO", "BOSS_DODONGO"), + ("ACTOR_BOSS_GOMA", "BOSS_GOMA", "BOSS_GOMA"), + ("ACTOR_EN_ZL1", "EN_ZL1", "EN_ZL1"), + ("ACTOR_EN_VIEWER", "EN_VIEWER", "EN_VIEWER"), + ("ACTOR_EN_GOMA", "EN_GOMA", "EN_GOMA"), + ("ACTOR_BG_PUSHBOX", "BG_PUSHBOX", "BG_PUSHBOX"), + ("ACTOR_EN_BUBBLE", "EN_BUBBLE", "EN_BUBBLE"), + ("ACTOR_DOOR_SHUTTER", "DOOR_SHUTTER", "DOOR_SHUTTER"), + ("ACTOR_EN_DODOJR", "EN_DODOJR", "EN_DODOJR"), + ("ACTOR_EN_BDFIRE", "EN_BDFIRE", "EN_BDFIRE"), + ("ACTOR_EN_BOOM", "EN_BOOM", "EN_BOOM"), + ("ACTOR_EN_TORCH2", "EN_TORCH2", "EN_TORCH2"), + ("ACTOR_EN_BILI", "EN_BILI", "EN_BILI"), + ("ACTOR_EN_TP", "EN_TP", "EN_TP"), + ("ACTOR_EN_ST", "EN_ST", "EN_ST"), + ("ACTOR_EN_BW", "EN_BW", "EN_BW"), + ("ACTOR_EN_A_OBJ", "EN_A_OBJ", "EN_A_OBJ"), + ("ACTOR_EN_EIYER", "EN_EIYER", "EN_EIYER"), + ("ACTOR_EN_RIVER_SOUND", "EN_RIVER_SOUND", "EN_RIVER_SOUND"), + ("ACTOR_EN_HORSE_NORMAL", "EN_HORSE_NORMAL", "EN_HORSE_NORMAL"), + ("ACTOR_EN_OSSAN", "EN_OSSAN", "EN_OSSAN"), + ("ACTOR_BG_TREEMOUTH", "BG_TREEMOUTH", "BG_TREEMOUTH"), + ("ACTOR_BG_DODOAGO", "BG_DODOAGO", "BG_DODOAGO"), + ("ACTOR_BG_HIDAN_DALM", "BG_HIDAN_DALM", "BG_HIDAN_DALM"), + ("ACTOR_BG_HIDAN_HROCK", "BG_HIDAN_HROCK", "BG_HIDAN_HROCK"), + ("ACTOR_EN_HORSE_GANON", "EN_HORSE_GANON", "EN_HORSE_GANON"), + ("ACTOR_BG_HIDAN_ROCK", "BG_HIDAN_ROCK", "BG_HIDAN_ROCK"), + ("ACTOR_BG_HIDAN_RSEKIZOU", "BG_HIDAN_RSEKIZOU", "BG_HIDAN_RSEKIZOU"), + ("ACTOR_BG_HIDAN_SEKIZOU", "BG_HIDAN_SEKIZOU", "BG_HIDAN_SEKIZOU"), + ("ACTOR_BG_HIDAN_SIMA", "BG_HIDAN_SIMA", "BG_HIDAN_SIMA"), + ("ACTOR_BG_HIDAN_SYOKU", "BG_HIDAN_SYOKU", "BG_HIDAN_SYOKU"), + ("ACTOR_EN_XC", "EN_XC", "EN_XC"), + ("ACTOR_BG_HIDAN_CURTAIN", "BG_HIDAN_CURTAIN", "BG_HIDAN_CURTAIN"), + ("ACTOR_BG_SPOT00_HANEBASI", "BG_SPOT00_HANEBASI", "BG_SPOT00_HANEBASI"), + ("ACTOR_EN_MB", "EN_MB", "EN_MB"), + ("ACTOR_EN_BOMBF", "EN_BOMBF", "EN_BOMBF"), + ("ACTOR_EN_ZL2", "EN_ZL2", "EN_ZL2"), + ("ACTOR_BG_HIDAN_FSLIFT", "BG_HIDAN_FSLIFT", "BG_HIDAN_FSLIFT"), + ("ACTOR_EN_OE2", "EN_OE2", "EN_OE2"), + ("ACTOR_BG_YDAN_HASI", "BG_YDAN_HASI", "BG_YDAN_HASI"), + ("ACTOR_BG_YDAN_MARUTA", "BG_YDAN_MARUTA", "BG_YDAN_MARUTA"), + ("ACTOR_BOSS_GANONDROF", "BOSS_GANONDROF", "BOSS_GANONDROF"), + ("ACTOR_EN_AM", "EN_AM", "EN_AM"), + ("ACTOR_EN_DEKUBABA", "EN_DEKUBABA", "EN_DEKUBABA"), + ("ACTOR_EN_M_FIRE1", "EN_M_FIRE1", "EN_M_FIRE1"), + ("ACTOR_EN_M_THUNDER", "EN_M_THUNDER", "EN_M_THUNDER"), + ("ACTOR_BG_DDAN_JD", "BG_DDAN_JD", "BG_DDAN_JD"), + ("ACTOR_BG_BREAKWALL", "BG_BREAKWALL", "BG_BREAKWALL"), + ("ACTOR_EN_JJ", "EN_JJ", "EN_JJ"), + ("ACTOR_EN_HORSE_ZELDA", "EN_HORSE_ZELDA", "EN_HORSE_ZELDA"), + ("ACTOR_BG_DDAN_KD", "BG_DDAN_KD", "BG_DDAN_KD"), + ("ACTOR_DOOR_WARP1", "DOOR_WARP1", "DOOR_WARP1"), + ("ACTOR_OBJ_SYOKUDAI", "OBJ_SYOKUDAI", "OBJ_SYOKUDAI"), + ("ACTOR_ITEM_B_HEART", "ITEM_B_HEART", "ITEM_B_HEART"), + ("ACTOR_EN_DEKUNUTS", "EN_DEKUNUTS", "EN_DEKUNUTS"), + ("ACTOR_BG_MENKURI_KAITEN", "BG_MENKURI_KAITEN", "BG_MENKURI_KAITEN"), + ("ACTOR_BG_MENKURI_EYE", "BG_MENKURI_EYE", "BG_MENKURI_EYE"), + ("ACTOR_EN_VALI", "EN_VALI", "EN_VALI"), + ("ACTOR_BG_MIZU_MOVEBG", "BG_MIZU_MOVEBG", "BG_MIZU_MOVEBG"), + ("ACTOR_BG_MIZU_WATER", "BG_MIZU_WATER", "BG_MIZU_WATER"), + ("ACTOR_ARMS_HOOK", "ARMS_HOOK", "ARMS_HOOK"), + ("ACTOR_EN_FHG", "EN_FHG", "EN_FHG"), + ("ACTOR_BG_MORI_HINERI", "BG_MORI_HINERI", "BG_MORI_HINERI"), + ("ACTOR_EN_BB", "EN_BB", "EN_BB"), + ("ACTOR_BG_TOKI_HIKARI", "BG_TOKI_HIKARI", "BG_TOKI_HIKARI"), + ("ACTOR_EN_YUKABYUN", "EN_YUKABYUN", "EN_YUKABYUN"), + ("ACTOR_BG_TOKI_SWD", "BG_TOKI_SWD", "BG_TOKI_SWD"), + ("ACTOR_EN_FHG_FIRE", "EN_FHG_FIRE", "EN_FHG_FIRE"), + ("ACTOR_BG_MJIN", "BG_MJIN", "BG_MJIN"), + ("ACTOR_BG_HIDAN_KOUSI", "BG_HIDAN_KOUSI", "BG_HIDAN_KOUSI"), + ("ACTOR_DOOR_TOKI", "DOOR_TOKI", "DOOR_TOKI"), + ("ACTOR_BG_HIDAN_HAMSTEP", "BG_HIDAN_HAMSTEP", "BG_HIDAN_HAMSTEP"), + ("ACTOR_EN_BIRD", "EN_BIRD", "EN_BIRD"), + ("ACTOR_EN_WOOD02", "EN_WOOD02", "EN_WOOD02"), + ("ACTOR_EN_LIGHTBOX", "EN_LIGHTBOX", "EN_LIGHTBOX"), + ("ACTOR_EN_PU_BOX", "EN_PU_BOX", "EN_PU_BOX"), + ("ACTOR_EN_TRAP", "EN_TRAP", "EN_TRAP"), + ("ACTOR_EN_AROW_TRAP", "EN_AROW_TRAP", "EN_AROW_TRAP"), + ("ACTOR_EN_VASE", "EN_VASE", "EN_VASE"), + ("ACTOR_EN_TA", "EN_TA", "EN_TA"), + ("ACTOR_EN_TK", "EN_TK", "EN_TK"), + ("ACTOR_BG_MORI_BIGST", "BG_MORI_BIGST", "BG_MORI_BIGST"), + ("ACTOR_BG_MORI_ELEVATOR", "BG_MORI_ELEVATOR", "BG_MORI_ELEVATOR"), + ("ACTOR_BG_MORI_KAITENKABE", "BG_MORI_KAITENKABE", "BG_MORI_KAITENKABE"), + ("ACTOR_BG_MORI_RAKKATENJO", "BG_MORI_RAKKATENJO", "BG_MORI_RAKKATENJO"), + ("ACTOR_EN_VM", "EN_VM", "EN_VM"), + ("ACTOR_DEMO_EFFECT", "DEMO_EFFECT", "DEMO_EFFECT"), + ("ACTOR_DEMO_KANKYO", "DEMO_KANKYO", "DEMO_KANKYO"), + ("ACTOR_BG_HIDAN_FWBIG", "BG_HIDAN_FWBIG", "BG_HIDAN_FWBIG"), + ("ACTOR_EN_FLOORMAS", "EN_FLOORMAS", "EN_FLOORMAS"), + ("ACTOR_EN_HEISHI1", "EN_HEISHI1", "EN_HEISHI1"), + ("ACTOR_EN_RD", "EN_RD", "EN_RD"), + ("ACTOR_EN_PO_SISTERS", "EN_PO_SISTERS", "EN_PO_SISTERS"), + ("ACTOR_BG_HEAVY_BLOCK", "BG_HEAVY_BLOCK", "BG_HEAVY_BLOCK"), + ("ACTOR_BG_PO_EVENT", "BG_PO_EVENT", "BG_PO_EVENT"), + ("ACTOR_OBJ_MURE", "OBJ_MURE", "OBJ_MURE"), + ("ACTOR_EN_SW", "EN_SW", "EN_SW"), + ("ACTOR_BOSS_FD", "BOSS_FD", "BOSS_FD"), + ("ACTOR_OBJECT_KANKYO", "OBJECT_KANKYO", "OBJECT_KANKYO"), + ("ACTOR_EN_DU", "EN_DU", "EN_DU"), + ("ACTOR_EN_FD", "EN_FD", "EN_FD"), + ("ACTOR_EN_HORSE_LINK_CHILD", "EN_HORSE_LINK_CHILD", "EN_HORSE_LINK_CHILD"), + ("ACTOR_DOOR_ANA", "DOOR_ANA", "DOOR_ANA"), + ("ACTOR_BG_SPOT02_OBJECTS", "BG_SPOT02_OBJECTS", "BG_SPOT02_OBJECTS"), + ("ACTOR_BG_HAKA", "BG_HAKA", "BG_HAKA"), + ("ACTOR_MAGIC_WIND", "MAGIC_WIND", "MAGIC_WIND"), + ("ACTOR_MAGIC_FIRE", "MAGIC_FIRE", "MAGIC_FIRE"), + ("ACTOR_EN_RU1", "EN_RU1", "EN_RU1"), + ("ACTOR_BOSS_FD2", "BOSS_FD2", "BOSS_FD2"), + ("ACTOR_EN_FD_FIRE", "EN_FD_FIRE", "EN_FD_FIRE"), + ("ACTOR_EN_DH", "EN_DH", "EN_DH"), + ("ACTOR_EN_DHA", "EN_DHA", "EN_DHA"), + ("ACTOR_EN_RL", "EN_RL", "EN_RL"), + ("ACTOR_EN_ENCOUNT1", "EN_ENCOUNT1", "EN_ENCOUNT1"), + ("ACTOR_DEMO_DU", "DEMO_DU", "DEMO_DU"), + ("ACTOR_DEMO_IM", "DEMO_IM", "DEMO_IM"), + ("ACTOR_DEMO_TRE_LGT", "DEMO_TRE_LGT", "DEMO_TRE_LGT"), + ("ACTOR_EN_FW", "EN_FW", "EN_FW"), + ("ACTOR_BG_VB_SIMA", "BG_VB_SIMA", "BG_VB_SIMA"), + ("ACTOR_EN_VB_BALL", "EN_VB_BALL", "EN_VB_BALL"), + ("ACTOR_BG_HAKA_MEGANE", "BG_HAKA_MEGANE", "BG_HAKA_MEGANE"), + ("ACTOR_BG_HAKA_MEGANEBG", "BG_HAKA_MEGANEBG", "BG_HAKA_MEGANEBG"), + ("ACTOR_BG_HAKA_SHIP", "BG_HAKA_SHIP", "BG_HAKA_SHIP"), + ("ACTOR_BG_HAKA_SGAMI", "BG_HAKA_SGAMI", "BG_HAKA_SGAMI"), + ("ACTOR_EN_HEISHI2", "EN_HEISHI2", "EN_HEISHI2"), + ("ACTOR_EN_ENCOUNT2", "EN_ENCOUNT2", "EN_ENCOUNT2"), + ("ACTOR_EN_FIRE_ROCK", "EN_FIRE_ROCK", "EN_FIRE_ROCK"), + ("ACTOR_EN_BROB", "EN_BROB", "EN_BROB"), + ("ACTOR_MIR_RAY", "MIR_RAY", "MIR_RAY"), + ("ACTOR_BG_SPOT09_OBJ", "BG_SPOT09_OBJ", "BG_SPOT09_OBJ"), + ("ACTOR_BG_SPOT18_OBJ", "BG_SPOT18_OBJ", "BG_SPOT18_OBJ"), + ("ACTOR_BOSS_VA", "BOSS_VA", "BOSS_VA"), + ("ACTOR_BG_HAKA_TUBO", "BG_HAKA_TUBO", "BG_HAKA_TUBO"), + ("ACTOR_BG_HAKA_TRAP", "BG_HAKA_TRAP", "BG_HAKA_TRAP"), + ("ACTOR_BG_HAKA_HUTA", "BG_HAKA_HUTA", "BG_HAKA_HUTA"), + ("ACTOR_BG_HAKA_ZOU", "BG_HAKA_ZOU", "BG_HAKA_ZOU"), + ("ACTOR_BG_SPOT17_FUNEN", "BG_SPOT17_FUNEN", "BG_SPOT17_FUNEN"), + ("ACTOR_EN_SYATEKI_ITM", "EN_SYATEKI_ITM", "EN_SYATEKI_ITM"), + ("ACTOR_EN_SYATEKI_MAN", "EN_SYATEKI_MAN", "EN_SYATEKI_MAN"), + ("ACTOR_EN_TANA", "EN_TANA", "EN_TANA"), + ("ACTOR_EN_NB", "EN_NB", "EN_NB"), + ("ACTOR_BOSS_MO", "BOSS_MO", "BOSS_MO"), + ("ACTOR_EN_SB", "EN_SB", "EN_SB"), + ("ACTOR_EN_BIGOKUTA", "EN_BIGOKUTA", "EN_BIGOKUTA"), + ("ACTOR_EN_KAREBABA", "EN_KAREBABA", "EN_KAREBABA"), + ("ACTOR_BG_BDAN_OBJECTS", "BG_BDAN_OBJECTS", "BG_BDAN_OBJECTS"), + ("ACTOR_DEMO_SA", "DEMO_SA", "DEMO_SA"), + ("ACTOR_DEMO_GO", "DEMO_GO", "DEMO_GO"), + ("ACTOR_EN_IN", "EN_IN", "EN_IN"), + ("ACTOR_EN_TR", "EN_TR", "EN_TR"), + ("ACTOR_BG_SPOT16_BOMBSTONE", "BG_SPOT16_BOMBSTONE", "BG_SPOT16_BOMBSTONE"), + ("ACTOR_BG_HIDAN_KOWARERUKABE", "BG_HIDAN_KOWARERUKABE", "BG_HIDAN_KOWARERUKABE"), + ("ACTOR_BG_BOMBWALL", "BG_BOMBWALL", "BG_BOMBWALL"), + ("ACTOR_BG_SPOT08_ICEBLOCK", "BG_SPOT08_ICEBLOCK", "BG_SPOT08_ICEBLOCK"), + ("ACTOR_EN_RU2", "EN_RU2", "EN_RU2"), + ("ACTOR_OBJ_DEKUJR", "OBJ_DEKUJR", "OBJ_DEKUJR"), + ("ACTOR_BG_MIZU_UZU", "BG_MIZU_UZU", "BG_MIZU_UZU"), + ("ACTOR_BG_SPOT06_OBJECTS", "BG_SPOT06_OBJECTS", "BG_SPOT06_OBJECTS"), + ("ACTOR_BG_ICE_OBJECTS", "BG_ICE_OBJECTS", "BG_ICE_OBJECTS"), + ("ACTOR_BG_HAKA_WATER", "BG_HAKA_WATER", "BG_HAKA_WATER"), + ("ACTOR_EN_MA2", "EN_MA2", "EN_MA2"), + ("ACTOR_EN_BOM_CHU", "EN_BOM_CHU", "EN_BOM_CHU"), + ("ACTOR_EN_HORSE_GAME_CHECK", "EN_HORSE_GAME_CHECK", "EN_HORSE_GAME_CHECK"), + ("ACTOR_BOSS_TW", "BOSS_TW", "BOSS_TW"), + ("ACTOR_EN_RR", "EN_RR", "EN_RR"), + ("ACTOR_EN_BA", "EN_BA", "EN_BA"), + ("ACTOR_EN_BX", "EN_BX", "EN_BX"), + ("ACTOR_EN_ANUBICE", "EN_ANUBICE", "EN_ANUBICE"), + ("ACTOR_EN_ANUBICE_FIRE", "EN_ANUBICE_FIRE", "EN_ANUBICE_FIRE"), + ("ACTOR_BG_MORI_HASHIGO", "BG_MORI_HASHIGO", "BG_MORI_HASHIGO"), + ("ACTOR_BG_MORI_HASHIRA4", "BG_MORI_HASHIRA4", "BG_MORI_HASHIRA4"), + ("ACTOR_BG_MORI_IDOMIZU", "BG_MORI_IDOMIZU", "BG_MORI_IDOMIZU"), + ("ACTOR_BG_SPOT16_DOUGHNUT", "BG_SPOT16_DOUGHNUT", "BG_SPOT16_DOUGHNUT"), + ("ACTOR_BG_BDAN_SWITCH", "BG_BDAN_SWITCH", "BG_BDAN_SWITCH"), + ("ACTOR_EN_MA1", "EN_MA1", "EN_MA1"), + ("ACTOR_BOSS_GANON", "BOSS_GANON", "BOSS_GANON"), + ("ACTOR_BOSS_SST", "BOSS_SST", "BOSS_SST"), + ("ACTOR_EN_NY", "EN_NY", "EN_NY"), + ("ACTOR_EN_FR", "EN_FR", "EN_FR"), + ("ACTOR_ITEM_SHIELD", "ITEM_SHIELD", "ITEM_SHIELD"), + ("ACTOR_BG_ICE_SHELTER", "BG_ICE_SHELTER", "BG_ICE_SHELTER"), + ("ACTOR_EN_ICE_HONO", "EN_ICE_HONO", "EN_ICE_HONO"), + ("ACTOR_ITEM_OCARINA", "ITEM_OCARINA", "ITEM_OCARINA"), + ("ACTOR_MAGIC_DARK", "MAGIC_DARK", "MAGIC_DARK"), + ("ACTOR_DEMO_6K", "DEMO_6K", "DEMO_6K"), + ("ACTOR_EN_ANUBICE_TAG", "EN_ANUBICE_TAG", "EN_ANUBICE_TAG"), + ("ACTOR_BG_HAKA_GATE", "BG_HAKA_GATE", "BG_HAKA_GATE"), + ("ACTOR_BG_SPOT15_SAKU", "BG_SPOT15_SAKU", "BG_SPOT15_SAKU"), + ("ACTOR_BG_JYA_GOROIWA", "BG_JYA_GOROIWA", "BG_JYA_GOROIWA"), + ("ACTOR_BG_JYA_ZURERUKABE", "BG_JYA_ZURERUKABE", "BG_JYA_ZURERUKABE"), + ("ACTOR_BG_JYA_COBRA", "BG_JYA_COBRA", "BG_JYA_COBRA"), + ("ACTOR_BG_JYA_KANAAMI", "BG_JYA_KANAAMI", "BG_JYA_KANAAMI"), + ("ACTOR_FISHING", "FISHING", "FISHING"), + ("ACTOR_OBJ_OSHIHIKI", "OBJ_OSHIHIKI", "OBJ_OSHIHIKI"), + ("ACTOR_BG_GATE_SHUTTER", "BG_GATE_SHUTTER", "BG_GATE_SHUTTER"), + ("ACTOR_EFF_DUST", "EFF_DUST", "EFF_DUST"), + ("ACTOR_BG_SPOT01_FUSYA", "BG_SPOT01_FUSYA", "BG_SPOT01_FUSYA"), + ("ACTOR_BG_SPOT01_IDOHASHIRA", "BG_SPOT01_IDOHASHIRA", "BG_SPOT01_IDOHASHIRA"), + ("ACTOR_BG_SPOT01_IDOMIZU", "BG_SPOT01_IDOMIZU", "BG_SPOT01_IDOMIZU"), + ("ACTOR_BG_PO_SYOKUDAI", "BG_PO_SYOKUDAI", "BG_PO_SYOKUDAI"), + ("ACTOR_BG_GANON_OTYUKA", "BG_GANON_OTYUKA", "BG_GANON_OTYUKA"), + ("ACTOR_BG_SPOT15_RRBOX", "BG_SPOT15_RRBOX", "BG_SPOT15_RRBOX"), + ("ACTOR_BG_UMAJUMP", "BG_UMAJUMP", "BG_UMAJUMP"), + ("ACTOR_ARROW_FIRE", "ARROW_FIRE", "ARROW_FIRE"), + ("ACTOR_ARROW_ICE", "ARROW_ICE", "ARROW_ICE"), + ("ACTOR_ARROW_LIGHT", "ARROW_LIGHT", "ARROW_LIGHT"), + ("ACTOR_ITEM_ETCETERA", "ITEM_ETCETERA", "ITEM_ETCETERA"), + ("ACTOR_OBJ_KIBAKO", "OBJ_KIBAKO", "OBJ_KIBAKO"), + ("ACTOR_OBJ_TSUBO", "OBJ_TSUBO", "OBJ_TSUBO"), + ("ACTOR_EN_WONDER_ITEM", "EN_WONDER_ITEM", "EN_WONDER_ITEM"), + ("ACTOR_EN_IK", "EN_IK", "EN_IK"), + ("ACTOR_DEMO_IK", "DEMO_IK", "DEMO_IK"), + ("ACTOR_EN_SKJ", "EN_SKJ", "EN_SKJ"), + ("ACTOR_EN_SKJNEEDLE", "EN_SKJNEEDLE", "EN_SKJNEEDLE"), + ("ACTOR_EN_G_SWITCH", "EN_G_SWITCH", "EN_G_SWITCH"), + ("ACTOR_DEMO_EXT", "DEMO_EXT", "DEMO_EXT"), + ("ACTOR_DEMO_SHD", "DEMO_SHD", "DEMO_SHD"), + ("ACTOR_EN_DNS", "EN_DNS", "EN_DNS"), + ("ACTOR_ELF_MSG", "ELF_MSG", "ELF_MSG"), + ("ACTOR_EN_HONOTRAP", "EN_HONOTRAP", "EN_HONOTRAP"), + ("ACTOR_EN_TUBO_TRAP", "EN_TUBO_TRAP", "EN_TUBO_TRAP"), + ("ACTOR_OBJ_ICE_POLY", "OBJ_ICE_POLY", "OBJ_ICE_POLY"), + ("ACTOR_BG_SPOT03_TAKI", "BG_SPOT03_TAKI", "BG_SPOT03_TAKI"), + ("ACTOR_BG_SPOT07_TAKI", "BG_SPOT07_TAKI", "BG_SPOT07_TAKI"), + ("ACTOR_EN_FZ", "EN_FZ", "EN_FZ"), + ("ACTOR_EN_PO_RELAY", "EN_PO_RELAY", "EN_PO_RELAY"), + ("ACTOR_BG_RELAY_OBJECTS", "BG_RELAY_OBJECTS", "BG_RELAY_OBJECTS"), + ("ACTOR_EN_DIVING_GAME", "EN_DIVING_GAME", "EN_DIVING_GAME"), + ("ACTOR_EN_KUSA", "EN_KUSA", "EN_KUSA"), + ("ACTOR_OBJ_BEAN", "OBJ_BEAN", "OBJ_BEAN"), + ("ACTOR_OBJ_BOMBIWA", "OBJ_BOMBIWA", "OBJ_BOMBIWA"), + ("ACTOR_OBJ_SWITCH", "OBJ_SWITCH", "OBJ_SWITCH"), + ("ACTOR_OBJ_ELEVATOR", "OBJ_ELEVATOR", "OBJ_ELEVATOR"), + ("ACTOR_OBJ_LIFT", "OBJ_LIFT", "OBJ_LIFT"), + ("ACTOR_OBJ_HSBLOCK", "OBJ_HSBLOCK", "OBJ_HSBLOCK"), + ("ACTOR_EN_OKARINA_TAG", "EN_OKARINA_TAG", "EN_OKARINA_TAG"), + ("ACTOR_EN_YABUSAME_MARK", "EN_YABUSAME_MARK", "EN_YABUSAME_MARK"), + ("ACTOR_EN_GOROIWA", "EN_GOROIWA", "EN_GOROIWA"), + ("ACTOR_EN_EX_RUPPY", "EN_EX_RUPPY", "EN_EX_RUPPY"), + ("ACTOR_EN_TORYO", "EN_TORYO", "EN_TORYO"), + ("ACTOR_EN_DAIKU", "EN_DAIKU", "EN_DAIKU"), + ("ACTOR_EN_NWC", "EN_NWC", "EN_NWC"), + ("ACTOR_EN_BLKOBJ", "EN_BLKOBJ", "EN_BLKOBJ"), + ("ACTOR_ITEM_INBOX", "ITEM_INBOX", "ITEM_INBOX"), + ("ACTOR_EN_GE1", "EN_GE1", "EN_GE1"), + ("ACTOR_OBJ_BLOCKSTOP", "OBJ_BLOCKSTOP", "OBJ_BLOCKSTOP"), + ("ACTOR_EN_SDA", "EN_SDA", "EN_SDA"), + ("ACTOR_EN_CLEAR_TAG", "EN_CLEAR_TAG", "EN_CLEAR_TAG"), + ("ACTOR_EN_NIW_LADY", "EN_NIW_LADY", "EN_NIW_LADY"), + ("ACTOR_EN_GM", "EN_GM", "EN_GM"), + ("ACTOR_EN_MS", "EN_MS", "EN_MS"), + ("ACTOR_EN_HS", "EN_HS", "EN_HS"), + ("ACTOR_BG_INGATE", "BG_INGATE", "BG_INGATE"), + ("ACTOR_EN_KANBAN", "EN_KANBAN", "EN_KANBAN"), + ("ACTOR_EN_HEISHI3", "EN_HEISHI3", "EN_HEISHI3"), + ("ACTOR_EN_SYATEKI_NIW", "EN_SYATEKI_NIW", "EN_SYATEKI_NIW"), + ("ACTOR_EN_ATTACK_NIW", "EN_ATTACK_NIW", "EN_ATTACK_NIW"), + ("ACTOR_BG_SPOT01_IDOSOKO", "BG_SPOT01_IDOSOKO", "BG_SPOT01_IDOSOKO"), + ("ACTOR_EN_SA", "EN_SA", "EN_SA"), + ("ACTOR_EN_WONDER_TALK", "EN_WONDER_TALK", "EN_WONDER_TALK"), + ("ACTOR_BG_GJYO_BRIDGE", "BG_GJYO_BRIDGE", "BG_GJYO_BRIDGE"), + ("ACTOR_EN_DS", "EN_DS", "EN_DS"), + ("ACTOR_EN_MK", "EN_MK", "EN_MK"), + ("ACTOR_EN_BOM_BOWL_MAN", "EN_BOM_BOWL_MAN", "EN_BOM_BOWL_MAN"), + ("ACTOR_EN_BOM_BOWL_PIT", "EN_BOM_BOWL_PIT", "EN_BOM_BOWL_PIT"), + ("ACTOR_EN_OWL", "EN_OWL", "EN_OWL"), + ("ACTOR_EN_ISHI", "EN_ISHI", "EN_ISHI"), + ("ACTOR_OBJ_HANA", "OBJ_HANA", "OBJ_HANA"), + ("ACTOR_OBJ_LIGHTSWITCH", "OBJ_LIGHTSWITCH", "OBJ_LIGHTSWITCH"), + ("ACTOR_OBJ_MURE2", "OBJ_MURE2", "OBJ_MURE2"), + ("ACTOR_EN_GO", "EN_GO", "EN_GO"), + ("ACTOR_EN_FU", "EN_FU", "EN_FU"), + ("ACTOR_EN_CHANGER", "EN_CHANGER", "EN_CHANGER"), + ("ACTOR_BG_JYA_MEGAMI", "BG_JYA_MEGAMI", "BG_JYA_MEGAMI"), + ("ACTOR_BG_JYA_LIFT", "BG_JYA_LIFT", "BG_JYA_LIFT"), + ("ACTOR_BG_JYA_BIGMIRROR", "BG_JYA_BIGMIRROR", "BG_JYA_BIGMIRROR"), + ("ACTOR_BG_JYA_BOMBCHUIWA", "BG_JYA_BOMBCHUIWA", "BG_JYA_BOMBCHUIWA"), + ("ACTOR_BG_JYA_AMISHUTTER", "BG_JYA_AMISHUTTER", "BG_JYA_AMISHUTTER"), + ("ACTOR_BG_JYA_BOMBIWA", "BG_JYA_BOMBIWA", "BG_JYA_BOMBIWA"), + ("ACTOR_BG_SPOT18_BASKET", "BG_SPOT18_BASKET", "BG_SPOT18_BASKET"), + ("ACTOR_EN_GANON_ORGAN", "EN_GANON_ORGAN", "EN_GANON_ORGAN"), + ("ACTOR_EN_SIOFUKI", "EN_SIOFUKI", "EN_SIOFUKI"), + ("ACTOR_EN_STREAM", "EN_STREAM", "EN_STREAM"), + ("ACTOR_EN_MM", "EN_MM", "EN_MM"), + ("ACTOR_EN_KO", "EN_KO", "EN_KO"), + ("ACTOR_EN_KZ", "EN_KZ", "EN_KZ"), + ("ACTOR_EN_WEATHER_TAG", "EN_WEATHER_TAG", "EN_WEATHER_TAG"), + ("ACTOR_BG_SST_FLOOR", "BG_SST_FLOOR", "BG_SST_FLOOR"), + ("ACTOR_EN_ANI", "EN_ANI", "EN_ANI"), + ("ACTOR_EN_EX_ITEM", "EN_EX_ITEM", "EN_EX_ITEM"), + ("ACTOR_BG_JYA_IRONOBJ", "BG_JYA_IRONOBJ", "BG_JYA_IRONOBJ"), + ("ACTOR_EN_JS", "EN_JS", "EN_JS"), + ("ACTOR_EN_JSJUTAN", "EN_JSJUTAN", "EN_JSJUTAN"), + ("ACTOR_EN_CS", "EN_CS", "EN_CS"), + ("ACTOR_EN_MD", "EN_MD", "EN_MD"), + ("ACTOR_EN_HY", "EN_HY", "EN_HY"), + ("ACTOR_EN_GANON_MANT", "EN_GANON_MANT", "EN_GANON_MANT"), + ("ACTOR_EN_OKARINA_EFFECT", "EN_OKARINA_EFFECT", "EN_OKARINA_EFFECT"), + ("ACTOR_EN_MAG", "EN_MAG", "EN_MAG"), + ("ACTOR_DOOR_GERUDO", "DOOR_GERUDO", "DOOR_GERUDO"), + ("ACTOR_ELF_MSG2", "ELF_MSG2", "ELF_MSG2"), + ("ACTOR_DEMO_GT", "DEMO_GT", "DEMO_GT"), + ("ACTOR_EN_PO_FIELD", "EN_PO_FIELD", "EN_PO_FIELD"), + ("ACTOR_EFC_ERUPC", "EFC_ERUPC", "EFC_ERUPC"), + ("ACTOR_BG_ZG", "BG_ZG", "BG_ZG"), + ("ACTOR_EN_HEISHI4", "EN_HEISHI4", "EN_HEISHI4"), + ("ACTOR_EN_ZL3", "EN_ZL3", "EN_ZL3"), + ("ACTOR_BOSS_GANON2", "BOSS_GANON2", "BOSS_GANON2"), + ("ACTOR_EN_KAKASI", "EN_KAKASI", "EN_KAKASI"), + ("ACTOR_EN_TAKARA_MAN", "EN_TAKARA_MAN", "EN_TAKARA_MAN"), + ("ACTOR_OBJ_MAKEOSHIHIKI", "OBJ_MAKEOSHIHIKI", "OBJ_MAKEOSHIHIKI"), + ("ACTOR_OCEFF_SPOT", "OCEFF_SPOT", "OCEFF_SPOT"), + ("ACTOR_END_TITLE", "END_TITLE", "END_TITLE"), + ("ACTOR_EN_TORCH", "EN_TORCH", "EN_TORCH"), + ("ACTOR_DEMO_EC", "DEMO_EC", "DEMO_EC"), + ("ACTOR_SHOT_SUN", "SHOT_SUN", "SHOT_SUN"), + ("ACTOR_EN_DY_EXTRA", "EN_DY_EXTRA", "EN_DY_EXTRA"), + ("ACTOR_EN_WONDER_TALK2", "EN_WONDER_TALK2", "EN_WONDER_TALK2"), + ("ACTOR_EN_GE2", "EN_GE2", "EN_GE2"), + ("ACTOR_OBJ_ROOMTIMER", "OBJ_ROOMTIMER", "OBJ_ROOMTIMER"), + ("ACTOR_EN_SSH", "EN_SSH", "EN_SSH"), + ("ACTOR_EN_STH", "EN_STH", "EN_STH"), + ("ACTOR_OCEFF_WIPE", "OCEFF_WIPE", "OCEFF_WIPE"), + ("ACTOR_OCEFF_STORM", "OCEFF_STORM", "OCEFF_STORM"), + ("ACTOR_EN_WEIYER", "EN_WEIYER", "EN_WEIYER"), + ("ACTOR_BG_SPOT05_SOKO", "BG_SPOT05_SOKO", "BG_SPOT05_SOKO"), + ("ACTOR_BG_JYA_1FLIFT", "BG_JYA_1FLIFT", "BG_JYA_1FLIFT"), + ("ACTOR_BG_JYA_HAHENIRON", "BG_JYA_HAHENIRON", "BG_JYA_HAHENIRON"), + ("ACTOR_BG_SPOT12_GATE", "BG_SPOT12_GATE", "BG_SPOT12_GATE"), + ("ACTOR_BG_SPOT12_SAKU", "BG_SPOT12_SAKU", "BG_SPOT12_SAKU"), + ("ACTOR_EN_HINTNUTS", "EN_HINTNUTS", "EN_HINTNUTS"), + ("ACTOR_EN_NUTSBALL", "EN_NUTSBALL", "EN_NUTSBALL"), + ("ACTOR_BG_SPOT00_BREAK", "BG_SPOT00_BREAK", "BG_SPOT00_BREAK"), + ("ACTOR_EN_SHOPNUTS", "EN_SHOPNUTS", "EN_SHOPNUTS"), + ("ACTOR_EN_IT", "EN_IT", "EN_IT"), + ("ACTOR_EN_GELDB", "EN_GELDB", "EN_GELDB"), + ("ACTOR_OCEFF_WIPE2", "OCEFF_WIPE2", "OCEFF_WIPE2"), + ("ACTOR_OCEFF_WIPE3", "OCEFF_WIPE3", "OCEFF_WIPE3"), + ("ACTOR_EN_NIW_GIRL", "EN_NIW_GIRL", "EN_NIW_GIRL"), + ("ACTOR_EN_DOG", "EN_DOG", "EN_DOG"), + ("ACTOR_EN_SI", "EN_SI", "EN_SI"), + ("ACTOR_BG_SPOT01_OBJECTS2", "BG_SPOT01_OBJECTS2", "BG_SPOT01_OBJECTS2"), + ("ACTOR_OBJ_COMB", "OBJ_COMB", "OBJ_COMB"), + ("ACTOR_BG_SPOT11_BAKUDANKABE", "BG_SPOT11_BAKUDANKABE", "BG_SPOT11_BAKUDANKABE"), + ("ACTOR_OBJ_KIBAKO2", "OBJ_KIBAKO2", "OBJ_KIBAKO2"), + ("ACTOR_EN_DNT_DEMO", "EN_DNT_DEMO", "EN_DNT_DEMO"), + ("ACTOR_EN_DNT_JIJI", "EN_DNT_JIJI", "EN_DNT_JIJI"), + ("ACTOR_EN_DNT_NOMAL", "EN_DNT_NOMAL", "EN_DNT_NOMAL"), + ("ACTOR_EN_GUEST", "EN_GUEST", "EN_GUEST"), + ("ACTOR_BG_BOM_GUARD", "BG_BOM_GUARD", "BG_BOM_GUARD"), + ("ACTOR_EN_HS2", "EN_HS2", "EN_HS2"), + ("ACTOR_DEMO_KEKKAI", "DEMO_KEKKAI", "DEMO_KEKKAI"), + ("ACTOR_BG_SPOT08_BAKUDANKABE", "BG_SPOT08_BAKUDANKABE", "BG_SPOT08_BAKUDANKABE"), + ("ACTOR_BG_SPOT17_BAKUDANKABE", "BG_SPOT17_BAKUDANKABE", "BG_SPOT17_BAKUDANKABE"), + ("ACTOR_OBJ_MURE3", "OBJ_MURE3", "OBJ_MURE3"), + ("ACTOR_EN_TG", "EN_TG", "EN_TG"), + ("ACTOR_EN_MU", "EN_MU", "EN_MU"), + ("ACTOR_EN_GO2", "EN_GO2", "EN_GO2"), + ("ACTOR_EN_WF", "EN_WF", "EN_WF"), + ("ACTOR_EN_SKB", "EN_SKB", "EN_SKB"), + ("ACTOR_DEMO_GJ", "DEMO_GJ", "DEMO_GJ"), + ("ACTOR_DEMO_GEFF", "DEMO_GEFF", "DEMO_GEFF"), + ("ACTOR_BG_GND_FIREMEIRO", "BG_GND_FIREMEIRO", "BG_GND_FIREMEIRO"), + ("ACTOR_BG_GND_DARKMEIRO", "BG_GND_DARKMEIRO", "BG_GND_DARKMEIRO"), + ("ACTOR_BG_GND_SOULMEIRO", "BG_GND_SOULMEIRO", "BG_GND_SOULMEIRO"), + ("ACTOR_BG_GND_NISEKABE", "BG_GND_NISEKABE", "BG_GND_NISEKABE"), + ("ACTOR_BG_GND_ICEBLOCK", "BG_GND_ICEBLOCK", "BG_GND_ICEBLOCK"), + ("ACTOR_EN_GB", "EN_GB", "EN_GB"), + ("ACTOR_EN_GS", "EN_GS", "EN_GS"), + ("ACTOR_BG_MIZU_BWALL", "BG_MIZU_BWALL", "BG_MIZU_BWALL"), + ("ACTOR_BG_MIZU_SHUTTER", "BG_MIZU_SHUTTER", "BG_MIZU_SHUTTER"), + ("ACTOR_EN_DAIKU_KAKARIKO", "EN_DAIKU_KAKARIKO", "EN_DAIKU_KAKARIKO"), + ("ACTOR_BG_BOWL_WALL", "BG_BOWL_WALL", "BG_BOWL_WALL"), + ("ACTOR_EN_WALL_TUBO", "EN_WALL_TUBO", "EN_WALL_TUBO"), + ("ACTOR_EN_PO_DESERT", "EN_PO_DESERT", "EN_PO_DESERT"), + ("ACTOR_EN_CROW", "EN_CROW", "EN_CROW"), + ("ACTOR_DOOR_KILLER", "DOOR_KILLER", "DOOR_KILLER"), + ("ACTOR_BG_SPOT11_OASIS", "BG_SPOT11_OASIS", "BG_SPOT11_OASIS"), + ("ACTOR_BG_SPOT18_FUTA", "BG_SPOT18_FUTA", "BG_SPOT18_FUTA"), + ("ACTOR_BG_SPOT18_SHUTTER", "BG_SPOT18_SHUTTER", "BG_SPOT18_SHUTTER"), + ("ACTOR_EN_MA3", "EN_MA3", "EN_MA3"), + ("ACTOR_EN_COW", "EN_COW", "EN_COW"), + ("ACTOR_BG_ICE_TURARA", "BG_ICE_TURARA", "BG_ICE_TURARA"), + ("ACTOR_BG_ICE_SHUTTER", "BG_ICE_SHUTTER", "BG_ICE_SHUTTER"), + ("ACTOR_EN_KAKASI2", "EN_KAKASI2", "EN_KAKASI2"), + ("ACTOR_EN_KAKASI3", "EN_KAKASI3", "EN_KAKASI3"), + ("ACTOR_OCEFF_WIPE4", "OCEFF_WIPE4", "OCEFF_WIPE4"), + ("ACTOR_EN_EG", "EN_EG", "EN_EG"), + ("ACTOR_BG_MENKURI_NISEKABE", "BG_MENKURI_NISEKABE", "BG_MENKURI_NISEKABE"), + ("ACTOR_EN_ZO", "EN_ZO", "EN_ZO"), + ("ACTOR_OBJ_MAKEKINSUTA", "OBJ_MAKEKINSUTA", "OBJ_MAKEKINSUTA"), + ("ACTOR_EN_GE3", "EN_GE3", "EN_GE3"), + ("ACTOR_OBJ_TIMEBLOCK", "OBJ_TIMEBLOCK", "OBJ_TIMEBLOCK"), + ("ACTOR_OBJ_HAMISHI", "OBJ_HAMISHI", "OBJ_HAMISHI"), + ("ACTOR_EN_ZL4", "EN_ZL4", "EN_ZL4"), + ("ACTOR_EN_MM2", "EN_MM2", "EN_MM2"), + ("ACTOR_BG_JYA_BLOCK", "BG_JYA_BLOCK", "BG_JYA_BLOCK"), + ("ACTOR_OBJ_WARP2BLOCK", "OBJ_WARP2BLOCK", "OBJ_WARP2BLOCK"), ] ootEnumLinkIdle = [ - ("Custom", "Custom", "Custom"), - ("0x00", "Default", "Default"), - ("0x01", "Sneezing", "Sneezing"), - ("0x02", "Wiping Forehead", "Wiping Forehead"), - ("0x03", "Too Hot", "Too Hot (Triggers Heat Timer)"), - ("0x04", "Yawning", "Yawning"), - ("0x07", "Gasping For Breath", "Gasping For Breath"), - ("0x09", "Brandish Sword", "Brandish Sword"), - ("0x0A", "Adjust Tunic", "Adjust Tunic"), - ("0xFF", "Hops On Epona", "Hops On Epona"), + ("Custom", "Custom", "Custom"), + ("0x00", "Default", "Default"), + ("0x01", "Sneezing", "Sneezing"), + ("0x02", "Wiping Forehead", "Wiping Forehead"), + ("0x03", "Too Hot", "Too Hot (Triggers Heat Timer)"), + ("0x04", "Yawning", "Yawning"), + ("0x07", "Gasping For Breath", "Gasping For Breath"), + ("0x09", "Brandish Sword", "Brandish Sword"), + ("0x0A", "Adjust Tunic", "Adjust Tunic"), + ("0xFF", "Hops On Epona", "Hops On Epona"), ] # Make sure to add exceptions in utility.py - selectMeshChildrenOnly ootEnumEmptyType = [ - ('None', 'None', 'None'), - ('Scene', 'Scene', 'Scene'), - ('Room', 'Room', 'Room'), - ('Actor', 'Actor', 'Actor'), - ('Transition Actor', 'Transition Actor', 'Transition Actor'), - ('Entrance', 'Entrance', 'Entrance'), - ('Water Box', 'Water Box', 'Water Box'), - ('Cull Group', 'Cull Group', 'Cull Group'), - ('LOD', 'LOD Group', 'LOD Group'), - ('Cutscene', 'Cutscene', 'Cutscene'), - #('Camera Volume', 'Camera Volume', 'Camera Volume'), + ("None", "None", "None"), + ("Scene", "Scene", "Scene"), + ("Room", "Room", "Room"), + ("Actor", "Actor", "Actor"), + ("Transition Actor", "Transition Actor", "Transition Actor"), + ("Entrance", "Entrance", "Entrance"), + ("Water Box", "Water Box", "Water Box"), + ("Cull Group", "Cull Group", "Cull Group"), + ("LOD", "LOD Group", "LOD Group"), + ("Cutscene", "Cutscene", "Cutscene"), + # ('Camera Volume', 'Camera Volume', 'Camera Volume'), ] ootEnumCloudiness = [ - ("Custom", "Custom", "Custom"), - ("0x00", "Sunny", "Sunny"), - ("0x01", "Cloudy", "Cloudy"), + ("Custom", "Custom", "Custom"), + ("0x00", "Sunny", "Sunny"), + ("0x01", "Cloudy", "Cloudy"), ] ootEnumCameraMode = [ - ("Custom", "Custom", "Custom"), - ("0x00", "Default", "Default"), - ("0x10", "Two Views, No C-Up", "Two Views, No C-Up"), - ("0x20", "Rotating Background, Bird's Eye C-Up", "Rotating Background, Bird's Eye C-Up"), - ("0x30", "Fixed Background, No C-Up", "Fixed Background, No C-Up"), - ("0x40", "Rotating Background, No C-Up", "Rotating Background, No C-Up"), - ("0x50", "Shooting Gallery", "Shooting Gallery"), + ("Custom", "Custom", "Custom"), + ("0x00", "Default", "Default"), + ("0x10", "Two Views, No C-Up", "Two Views, No C-Up"), + ( + "0x20", + "Rotating Background, Bird's Eye C-Up", + "Rotating Background, Bird's Eye C-Up", + ), + ("0x30", "Fixed Background, No C-Up", "Fixed Background, No C-Up"), + ("0x40", "Rotating Background, No C-Up", "Rotating Background, No C-Up"), + ("0x50", "Shooting Gallery", "Shooting Gallery"), ] ootEnumMapLocation = [ - ("Custom", "Custom", "Custom"), - ("0x00", "Hyrule Field", "Hyrule Field"), - ("0x01", "Kakariko Village", "Kakariko Village"), - ("0x02", "Graveyard", "Graveyard"), - ("0x03", "Zora's River", "Zora's River"), - ("0x04", "Kokiri Forest", "Kokiri Forest"), - ("0x05", "Sacred Forest Meadow", "Sacred Forest Meadow"), - ("0x06", "Lake Hylia", "Lake Hylia"), - ("0x07", "Zora's Domain", "Zora's Domain"), - ("0x08", "Zora's Fountain", "Zora's Fountain"), - ("0x09", "Gerudo Valley", "Gerudo Valley"), - ("0x0A", "Lost Woods", "Lost Woods"), - ("0x0B", "Desert Colossus", "Desert Colossus"), - ("0x0C", "Gerudo's Fortress", "Gerudo's Fortress"), - ("0x0D", "Haunted Wasteland", "Haunted Wasteland"), - ("0x0E", "Market", "Market"), - ("0x0F", "Hyrule Castle", "Hyrule Castle"), - ("0x10", "Death Mountain Trail", "Death Mountain Trail"), - ("0x11", "Death Mountain Crater", "Death Mountain Crater"), - ("0x12", "Goron City", "Goron City"), - ("0x13", "Lon Lon Ranch", "Lon Lon Ranch"), - ("0x14", "Dampe's Grave & Windmill", "Dampe's Grave & Windmill"), - ("0x15", "Ganon's Castle", "Ganon's Castle"), - ("0x16", "Grottos & Fairy Fountains", "Grottos & Fairy Fountains"), + ("Custom", "Custom", "Custom"), + ("0x00", "Hyrule Field", "Hyrule Field"), + ("0x01", "Kakariko Village", "Kakariko Village"), + ("0x02", "Graveyard", "Graveyard"), + ("0x03", "Zora's River", "Zora's River"), + ("0x04", "Kokiri Forest", "Kokiri Forest"), + ("0x05", "Sacred Forest Meadow", "Sacred Forest Meadow"), + ("0x06", "Lake Hylia", "Lake Hylia"), + ("0x07", "Zora's Domain", "Zora's Domain"), + ("0x08", "Zora's Fountain", "Zora's Fountain"), + ("0x09", "Gerudo Valley", "Gerudo Valley"), + ("0x0A", "Lost Woods", "Lost Woods"), + ("0x0B", "Desert Colossus", "Desert Colossus"), + ("0x0C", "Gerudo's Fortress", "Gerudo's Fortress"), + ("0x0D", "Haunted Wasteland", "Haunted Wasteland"), + ("0x0E", "Market", "Market"), + ("0x0F", "Hyrule Castle", "Hyrule Castle"), + ("0x10", "Death Mountain Trail", "Death Mountain Trail"), + ("0x11", "Death Mountain Crater", "Death Mountain Crater"), + ("0x12", "Goron City", "Goron City"), + ("0x13", "Lon Lon Ranch", "Lon Lon Ranch"), + ("0x14", "Dampe's Grave & Windmill", "Dampe's Grave & Windmill"), + ("0x15", "Ganon's Castle", "Ganon's Castle"), + ("0x16", "Grottos & Fairy Fountains", "Grottos & Fairy Fountains"), ] ootEnumSkybox = [ - ("Custom", "Custom", "Custom"), - ("0x00", "None", "None"), - ("0x01", "Standard Sky", "Standard Sky"), - ("0x02", "Hylian Bazaar", "Hylian Bazaar"), - ("0x03", "Brown Cloudy Sky", "Brown Cloudy Sky"), - ("0x04", "Market Ruins", "Market Ruins"), - ("0x05", "Black Cloudy Night", "Black Cloudy Night"), - ("0x07", "Link's House", "Link's House"), - ("0x09", "Market (Main Square, Day)", "Market (Main Square, Day)"), - ("0x0A", "Market (Main Square, Night)", "Market (Main Square, Night)"), - ("0x0B", "Happy Mask Shop", "Happy Mask Shop"), - ("0x0C", "Know-It-All Brothers' House", "Know-It-All Brothers' House"), - ("0x0E", "Kokiri Twins' House", "Kokiri Twins' House"), - ("0x0F", "Stable", "Stable"), - ("0x10", "Stew Lady's House", "Stew Lady's House"), - ("0x11", "Kokiri Shop", "Kokiri Shop"), - ("0x13", "Goron Shop", "Goron Shop"), - ("0x14", "Zora Shop", "Zora Shop"), - ("0x16", "Kakariko Potions Shop", "Kakariko Potions Shop"), - ("0x17", "Hylian Potions Shop", "Hylian Potions Shop"), - ("0x18", "Bomb Shop", "Bomb Shop"), - ("0x1A", "Dog Lady's House", "Dog Lady's House"), - ("0x1B", "Impa's House", "Impa's House"), - ("0x1C", "Gerudo Tent", "Gerudo Tent"), - ("0x1D", "Environment Color", "Environment Color"), - ("0x20", "Mido's House", "Mido's House"), - ("0x21", "Saria's House", "Saria's House"), - ("0x22", "Dog Guy's House", "Dog Guy's House"), + ("Custom", "Custom", "Custom"), + ("0x00", "None", "None"), + ("0x01", "Standard Sky", "Standard Sky"), + ("0x02", "Hylian Bazaar", "Hylian Bazaar"), + ("0x03", "Brown Cloudy Sky", "Brown Cloudy Sky"), + ("0x04", "Market Ruins", "Market Ruins"), + ("0x05", "Black Cloudy Night", "Black Cloudy Night"), + ("0x07", "Link's House", "Link's House"), + ("0x09", "Market (Main Square, Day)", "Market (Main Square, Day)"), + ("0x0A", "Market (Main Square, Night)", "Market (Main Square, Night)"), + ("0x0B", "Happy Mask Shop", "Happy Mask Shop"), + ("0x0C", "Know-It-All Brothers' House", "Know-It-All Brothers' House"), + ("0x0E", "Kokiri Twins' House", "Kokiri Twins' House"), + ("0x0F", "Stable", "Stable"), + ("0x10", "Stew Lady's House", "Stew Lady's House"), + ("0x11", "Kokiri Shop", "Kokiri Shop"), + ("0x13", "Goron Shop", "Goron Shop"), + ("0x14", "Zora Shop", "Zora Shop"), + ("0x16", "Kakariko Potions Shop", "Kakariko Potions Shop"), + ("0x17", "Hylian Potions Shop", "Hylian Potions Shop"), + ("0x18", "Bomb Shop", "Bomb Shop"), + ("0x1A", "Dog Lady's House", "Dog Lady's House"), + ("0x1B", "Impa's House", "Impa's House"), + ("0x1C", "Gerudo Tent", "Gerudo Tent"), + ("0x1D", "Environment Color", "Environment Color"), + ("0x20", "Mido's House", "Mido's House"), + ("0x21", "Saria's House", "Saria's House"), + ("0x22", "Dog Guy's House", "Dog Guy's House"), ] ootEnumSkyboxLighting = [ - ("Custom", "Custom", "Custom"), - ("0x00", "Time Of Day", "Time Of Day"), - ("0x01", "Indoor", "Indoor"), + ("Custom", "Custom", "Custom"), + ("0x00", "Time Of Day", "Time Of Day"), + ("0x01", "Indoor", "Indoor"), ] ootEnumAudioSessionPreset = [ - ("Custom", "Custom", "Custom"), - ("0x00", "0x00", "0x00"), + ("Custom", "Custom", "Custom"), + ("0x00", "0x00", "0x00"), ] -ootEnumMusicSeq = [ - ("Custom", "Custom", "Custom"), - ("0x02", "Hyrule Field", "Hyrule Field"), - ("0x03", "Hyrule Field (Initial Segment From Loading Area)", "Hyrule Field (Initial Segment From Loading Area)"), - ("0x04", "Hyrule Field (Moving Segment 1)", "Hyrule Field (Moving Segment 1)"), - ("0x05", "Hyrule Field (Moving Segment 2)", "Hyrule Field (Moving Segment 2)"), - ("0x06", "Hyrule Field (Moving Segment 3)", "Hyrule Field (Moving Segment 3)"), - ("0x07", "Hyrule Field (Moving Segment 4)", "Hyrule Field (Moving Segment 4)"), - ("0x08", "Hyrule Field (Moving Segment 5)", "Hyrule Field (Moving Segment 5)"), - ("0x09", "Hyrule Field (Moving Segment 6)", "Hyrule Field (Moving Segment 6)"), - ("0x0A", "Hyrule Field (Moving Segment 7)", "Hyrule Field (Moving Segment 7)"), - ("0x0B", "Hyrule Field (Moving Segment 8)", "Hyrule Field (Moving Segment 8)"), - ("0x0C", "Hyrule Field (Moving Segment 9)", "Hyrule Field (Moving Segment 9)"), - ("0x0D", "Hyrule Field (Moving Segment 10)", "Hyrule Field (Moving Segment 10)"), - ("0x0E", "Hyrule Field (Moving Segment 11)", "Hyrule Field (Moving Segment 11)"), - ("0x0F", "Hyrule Field (Enemy Approaches)", "Hyrule Field (Enemy Approaches)"), - ("0x10", "Hyrule Field (Enemy Near Segment 1)", "Hyrule Field (Enemy Near Segment 1)"), - ("0x11", "Hyrule Field (Enemy Near Segment 2)", "Hyrule Field (Enemy Near Segment 2)"), - ("0x12", "Hyrule Field (Enemy Near Segment 3)", "Hyrule Field (Enemy Near Segment 3)"), - ("0x13", "Hyrule Field (Enemy Near Segment 4)", "Hyrule Field (Enemy Near Segment 4)"), - ("0x14", "Hyrule Field (Standing Still Segment 1)", "Hyrule Field (Standing Still Segment 1)"), - ("0x15", "Hyrule Field (Standing Still Segment 2)", "Hyrule Field (Standing Still Segment 2)"), - ("0x16", "Hyrule Field (Standing Still Segment 3)", "Hyrule Field (Standing Still Segment 3)"), - ("0x17", "Hyrule Field (Standing Still Segment 4)", "Hyrule Field (Standing Still Segment 4)"), - ("0x18", "Dodongo's Cavern", "Dodongo's Cavern"), - ("0x19", "Kakariko Village (Adult)", "Kakariko Village (Adult)"), - ("0x1A", "Enemy Battle", "Enemy Battle"), - ("0x1B", "Boss Battle 00", "Boss Battle 00"), - ("0x1C", "Inside the Deku Tree", "Inside the Deku Tree"), - ("0x1D", "Market", "Market"), - ("0x1E", "Title Theme", "Title Theme"), - ("0x1F", "Link's House", "Link's House"), - ("0x20", "Game Over", "Game Over"), - ("0x21", "Boss Clear", "Boss Clear"), - ("0x22", "Item Get", "Item Get"), - ("0x23", "Opening Ganon", "Opening Ganon"), - ("0x24", "Heart Get", "Heart Get"), - ("0x25", "Prelude Of Light", "Prelude Of Light"), - ("0x26", "Inside Jabu-Jabu's Belly", "Inside Jabu-Jabu's Belly"), - ("0x27", "Kakariko Village (Child)", "Kakariko Village (Child)"), - ("0x28", "Great Fairy's Fountain", "Great Fairy's Fountain"), - ("0x29", "Zelda's Theme", "Zelda's Theme"), - ("0x2A", "Fire Temple", "Fire Temple"), - ("0x2B", "Open Treasure Chest", "Open Treasure Chest"), - ("0x2C", "Forest Temple", "Forest Temple"), - ("0x2D", "Hyrule Castle Courtyard", "Hyrule Castle Courtyard"), - ("0x2E", "Ganondorf's Theme", "Ganondorf's Theme"), - ("0x2F", "Lon Lon Ranch", "Lon Lon Ranch"), - ("0x30", "Goron City", "Goron City "), - ("0x31", "Hyrule Field Morning Theme", "Hyrule Field Morning Theme"), - ("0x32", "Spiritual Stone Get", "Spiritual Stone Get"), - ("0x33", "Bolero of Fire", "Bolero of Fire"), - ("0x34", "Minuet of Woods", "Minuet of Woods"), - ("0x35", "Serenade of Water", "Serenade of Water"), - ("0x36", "Requiem of Spirit", "Requiem of Spirit"), - ("0x37", "Nocturne of Shadow", "Nocturne of Shadow"), - ("0x38", "Mini-Boss Battle", "Mini-Boss Battle"), - ("0x39", "Obtain Small Item", "Obtain Small Item"), - ("0x3A", "Temple of Time", "Temple of Time"), - ("0x3B", "Escape from Lon Lon Ranch", "Escape from Lon Lon Ranch"), - ("0x3C", "Kokiri Forest", "Kokiri Forest"), - ("0x3D", "Obtain Fairy Ocarina", "Obtain Fairy Ocarina"), - ("0x3E", "Lost Woods", "Lost Woods"), - ("0x3F", "Spirit Temple", "Spirit Temple"), - ("0x40", "Horse Race", "Horse Race"), - ("0x41", "Horse Race Goal", "Horse Race Goal"), - ("0x42", "Ingo's Theme", "Ingo's Theme"), - ("0x43", "Obtain Medallion", "Obtain Medallion"), - ("0x44", "Ocarina Saria's Song", "Ocarina Saria's Song"), - ("0x45", "Ocarina Epona's Song", "Ocarina Epona's Song"), - ("0x46", "Ocarina Zelda's Lullaby", "Ocarina Zelda's Lullaby"), - ("0x47", "Sun's Song", "Sun's Song"), - ("0x48", "Song of Time", "Song of Time"), - ("0x49", "Song of Storms", "Song of Storms"), - ("0x4A", "Fairy Flying", "Fairy Flying"), - ("0x4B", "Deku Tree", "Deku Tree"), - ("0x4C", "Windmill Hut", "Windmill Hut"), - ("0x4D", "Legend of Hyrule", "Legend of Hyrule"), - ("0x4E", "Shooting Gallery", "Shooting Gallery"), - ("0x4F", "Sheik's Theme", "Sheik's Theme"), - ("0x50", "Zora's Domain", "Zora's Domain"), - ("0x51", "Enter Zelda", "Enter Zelda"), - ("0x52", "Goodbye to Zelda", "Goodbye to Zelda"), - ("0x53", "Master Sword", "Master Sword"), - ("0x54", "Ganon Intro", "Ganon Intro"), - ("0x55", "Shop", "Shop"), - ("0x56", "Chamber of the Sages", "Chamber of the Sages"), - ("0x57", "File Select", "File Select"), - ("0x58", "Ice Cavern", "Ice Cavern"), - ("0x59", "Open Door of Temple of Time", "Open Door of Temple of Time"), - ("0x5A", "Kaepora Gaebora's Theme", "Kaepora Gaebora's Theme"), - ("0x5B", "Shadow Temple", "Shadow Temple"), - ("0x5C", "Water Temple", "Water Temple"), - ("0x5D", "Ganon's Castle Bridge", "Ganon's Castle Bridge"), - ("0x5E", "Ocarina of Time", "Ocarina of Time"), - ("0x5F", "Gerudo Valley", "Gerudo Valley"), - ("0x60", "Potion Shop", "Potion Shop"), - ("0x61", "Kotake & Koume's Theme", "Kotake & Koume's Theme"), - ("0x62", "Escape from Ganon's Castle", "Escape from Ganon's Castle"), - ("0x63", "Ganon's Castle Under Ground", "Ganon's Castle Under Ground"), - ("0x64", "Ganondorf Battle", "Ganondorf Battle"), - ("0x65", "Ganon Battle", "Ganon Battle"), - ("0x66", "Seal of Six Sages", "Seal of Six Sages"), - ("0x67", "End Credits I", "End Credits I"), - ("0x68", "End Credits II", "End Credits II"), - ("0x69", "End Credits III", "End Credits III"), - ("0x6A", "End Credits IV", "End Credits IV"), - ("0x6B", "King Dodongo & Volvagia Boss Battle", "King Dodongo & Volvagia Boss Battle"), - ("0x6C", "Mini-Game", "Mini-Game"), +ootEnumMusicSeq = [ + ("Custom", "Custom", "Custom"), + ("0x02", "Hyrule Field", "Hyrule Field"), + ( + "0x03", + "Hyrule Field (Initial Segment From Loading Area)", + "Hyrule Field (Initial Segment From Loading Area)", + ), + ("0x04", "Hyrule Field (Moving Segment 1)", "Hyrule Field (Moving Segment 1)"), + ("0x05", "Hyrule Field (Moving Segment 2)", "Hyrule Field (Moving Segment 2)"), + ("0x06", "Hyrule Field (Moving Segment 3)", "Hyrule Field (Moving Segment 3)"), + ("0x07", "Hyrule Field (Moving Segment 4)", "Hyrule Field (Moving Segment 4)"), + ("0x08", "Hyrule Field (Moving Segment 5)", "Hyrule Field (Moving Segment 5)"), + ("0x09", "Hyrule Field (Moving Segment 6)", "Hyrule Field (Moving Segment 6)"), + ("0x0A", "Hyrule Field (Moving Segment 7)", "Hyrule Field (Moving Segment 7)"), + ("0x0B", "Hyrule Field (Moving Segment 8)", "Hyrule Field (Moving Segment 8)"), + ("0x0C", "Hyrule Field (Moving Segment 9)", "Hyrule Field (Moving Segment 9)"), + ("0x0D", "Hyrule Field (Moving Segment 10)", "Hyrule Field (Moving Segment 10)"), + ("0x0E", "Hyrule Field (Moving Segment 11)", "Hyrule Field (Moving Segment 11)"), + ("0x0F", "Hyrule Field (Enemy Approaches)", "Hyrule Field (Enemy Approaches)"), + ( + "0x10", + "Hyrule Field (Enemy Near Segment 1)", + "Hyrule Field (Enemy Near Segment 1)", + ), + ( + "0x11", + "Hyrule Field (Enemy Near Segment 2)", + "Hyrule Field (Enemy Near Segment 2)", + ), + ( + "0x12", + "Hyrule Field (Enemy Near Segment 3)", + "Hyrule Field (Enemy Near Segment 3)", + ), + ( + "0x13", + "Hyrule Field (Enemy Near Segment 4)", + "Hyrule Field (Enemy Near Segment 4)", + ), + ( + "0x14", + "Hyrule Field (Standing Still Segment 1)", + "Hyrule Field (Standing Still Segment 1)", + ), + ( + "0x15", + "Hyrule Field (Standing Still Segment 2)", + "Hyrule Field (Standing Still Segment 2)", + ), + ( + "0x16", + "Hyrule Field (Standing Still Segment 3)", + "Hyrule Field (Standing Still Segment 3)", + ), + ( + "0x17", + "Hyrule Field (Standing Still Segment 4)", + "Hyrule Field (Standing Still Segment 4)", + ), + ("0x18", "Dodongo's Cavern", "Dodongo's Cavern"), + ("0x19", "Kakariko Village (Adult)", "Kakariko Village (Adult)"), + ("0x1A", "Enemy Battle", "Enemy Battle"), + ("0x1B", "Boss Battle 00", "Boss Battle 00"), + ("0x1C", "Inside the Deku Tree", "Inside the Deku Tree"), + ("0x1D", "Market", "Market"), + ("0x1E", "Title Theme", "Title Theme"), + ("0x1F", "Link's House", "Link's House"), + ("0x20", "Game Over", "Game Over"), + ("0x21", "Boss Clear", "Boss Clear"), + ("0x22", "Item Get", "Item Get"), + ("0x23", "Opening Ganon", "Opening Ganon"), + ("0x24", "Heart Get", "Heart Get"), + ("0x25", "Prelude Of Light", "Prelude Of Light"), + ("0x26", "Inside Jabu-Jabu's Belly", "Inside Jabu-Jabu's Belly"), + ("0x27", "Kakariko Village (Child)", "Kakariko Village (Child)"), + ("0x28", "Great Fairy's Fountain", "Great Fairy's Fountain"), + ("0x29", "Zelda's Theme", "Zelda's Theme"), + ("0x2A", "Fire Temple", "Fire Temple"), + ("0x2B", "Open Treasure Chest", "Open Treasure Chest"), + ("0x2C", "Forest Temple", "Forest Temple"), + ("0x2D", "Hyrule Castle Courtyard", "Hyrule Castle Courtyard"), + ("0x2E", "Ganondorf's Theme", "Ganondorf's Theme"), + ("0x2F", "Lon Lon Ranch", "Lon Lon Ranch"), + ("0x30", "Goron City", "Goron City "), + ("0x31", "Hyrule Field Morning Theme", "Hyrule Field Morning Theme"), + ("0x32", "Spiritual Stone Get", "Spiritual Stone Get"), + ("0x33", "Bolero of Fire", "Bolero of Fire"), + ("0x34", "Minuet of Woods", "Minuet of Woods"), + ("0x35", "Serenade of Water", "Serenade of Water"), + ("0x36", "Requiem of Spirit", "Requiem of Spirit"), + ("0x37", "Nocturne of Shadow", "Nocturne of Shadow"), + ("0x38", "Mini-Boss Battle", "Mini-Boss Battle"), + ("0x39", "Obtain Small Item", "Obtain Small Item"), + ("0x3A", "Temple of Time", "Temple of Time"), + ("0x3B", "Escape from Lon Lon Ranch", "Escape from Lon Lon Ranch"), + ("0x3C", "Kokiri Forest", "Kokiri Forest"), + ("0x3D", "Obtain Fairy Ocarina", "Obtain Fairy Ocarina"), + ("0x3E", "Lost Woods", "Lost Woods"), + ("0x3F", "Spirit Temple", "Spirit Temple"), + ("0x40", "Horse Race", "Horse Race"), + ("0x41", "Horse Race Goal", "Horse Race Goal"), + ("0x42", "Ingo's Theme", "Ingo's Theme"), + ("0x43", "Obtain Medallion", "Obtain Medallion"), + ("0x44", "Ocarina Saria's Song", "Ocarina Saria's Song"), + ("0x45", "Ocarina Epona's Song", "Ocarina Epona's Song"), + ("0x46", "Ocarina Zelda's Lullaby", "Ocarina Zelda's Lullaby"), + ("0x47", "Sun's Song", "Sun's Song"), + ("0x48", "Song of Time", "Song of Time"), + ("0x49", "Song of Storms", "Song of Storms"), + ("0x4A", "Fairy Flying", "Fairy Flying"), + ("0x4B", "Deku Tree", "Deku Tree"), + ("0x4C", "Windmill Hut", "Windmill Hut"), + ("0x4D", "Legend of Hyrule", "Legend of Hyrule"), + ("0x4E", "Shooting Gallery", "Shooting Gallery"), + ("0x4F", "Sheik's Theme", "Sheik's Theme"), + ("0x50", "Zora's Domain", "Zora's Domain"), + ("0x51", "Enter Zelda", "Enter Zelda"), + ("0x52", "Goodbye to Zelda", "Goodbye to Zelda"), + ("0x53", "Master Sword", "Master Sword"), + ("0x54", "Ganon Intro", "Ganon Intro"), + ("0x55", "Shop", "Shop"), + ("0x56", "Chamber of the Sages", "Chamber of the Sages"), + ("0x57", "File Select", "File Select"), + ("0x58", "Ice Cavern", "Ice Cavern"), + ("0x59", "Open Door of Temple of Time", "Open Door of Temple of Time"), + ("0x5A", "Kaepora Gaebora's Theme", "Kaepora Gaebora's Theme"), + ("0x5B", "Shadow Temple", "Shadow Temple"), + ("0x5C", "Water Temple", "Water Temple"), + ("0x5D", "Ganon's Castle Bridge", "Ganon's Castle Bridge"), + ("0x5E", "Ocarina of Time", "Ocarina of Time"), + ("0x5F", "Gerudo Valley", "Gerudo Valley"), + ("0x60", "Potion Shop", "Potion Shop"), + ("0x61", "Kotake & Koume's Theme", "Kotake & Koume's Theme"), + ("0x62", "Escape from Ganon's Castle", "Escape from Ganon's Castle"), + ("0x63", "Ganon's Castle Under Ground", "Ganon's Castle Under Ground"), + ("0x64", "Ganondorf Battle", "Ganondorf Battle"), + ("0x65", "Ganon Battle", "Ganon Battle"), + ("0x66", "Seal of Six Sages", "Seal of Six Sages"), + ("0x67", "End Credits I", "End Credits I"), + ("0x68", "End Credits II", "End Credits II"), + ("0x69", "End Credits III", "End Credits III"), + ("0x6A", "End Credits IV", "End Credits IV"), + ( + "0x6B", + "King Dodongo & Volvagia Boss Battle", + "King Dodongo & Volvagia Boss Battle", + ), + ("0x6C", "Mini-Game", "Mini-Game"), ] ootEnumNightSeq = [ - ("Custom", "Custom", "Custom"), - ("0x00", "Standard night [day and night cycle]", "0x00"), - ("0x01", "Standard night [Kakariko]", "0x01"), - ("0x02", "Distant storm [Graveyard]", "0x02"), - ("0x03", "Howling wind and cawing [Ganon's Castle]", "0x03"), - ("0x04", "Wind + night birds [Kokiri]", "0x04"), - ("0x05", "Wind + crickets", "0x05"), - ("0x06", "Wind", "0x06"), - ("0x07", "Howling wind", "0x07"), - ("0x08", "Wind + crickets", "0x08"), - ("0x09", "Wind + crickets", "0x09"), - ("0x0A", "Tubed howling wind [Wasteland]", "0x0A"), - ("0x0B", "Tubed howling wind [Colossus]", "0x0B"), - ("0x0C", "Wind", "0x0C"), - ("0x0D", "Wind + crickets", "0x0D"), - ("0x0E", "Wind + crickets", "0x0E"), - ("0x0F", "Wind + birds", "0x0F"), - ("0x10", "Wind + crickets", "0x10"), - ("0x11", "?", "0x11"), - ("0x12", "Wind + crickets", "0x12"), - ("0x13", "Day music always playing", "0x13"), - ("0x14", "Silence", "0x14"), - ("0x16", "Silence", "0x16"), - ("0x17", "High tubed wind + rain", "0x17"), - ("0x18", "Silence", "0x18"), - ("0x19", "Silence", "0x19"), - ("0x1A", "High tubed wind + rain", "0x1A"), - ("0x1B", "Silence", "0x1B"), - ("0x1C", "Rain", "0x1C"), - ("0x1D", "High tubed wind + rain", "0x1D"), - ("0x1E", "Silence", "0x1E"), - ("0x1F", "High tubed wind + rain ", "0x1F"), + ("Custom", "Custom", "Custom"), + ("0x00", "Standard night [day and night cycle]", "0x00"), + ("0x01", "Standard night [Kakariko]", "0x01"), + ("0x02", "Distant storm [Graveyard]", "0x02"), + ("0x03", "Howling wind and cawing [Ganon's Castle]", "0x03"), + ("0x04", "Wind + night birds [Kokiri]", "0x04"), + ("0x05", "Wind + crickets", "0x05"), + ("0x06", "Wind", "0x06"), + ("0x07", "Howling wind", "0x07"), + ("0x08", "Wind + crickets", "0x08"), + ("0x09", "Wind + crickets", "0x09"), + ("0x0A", "Tubed howling wind [Wasteland]", "0x0A"), + ("0x0B", "Tubed howling wind [Colossus]", "0x0B"), + ("0x0C", "Wind", "0x0C"), + ("0x0D", "Wind + crickets", "0x0D"), + ("0x0E", "Wind + crickets", "0x0E"), + ("0x0F", "Wind + birds", "0x0F"), + ("0x10", "Wind + crickets", "0x10"), + ("0x11", "?", "0x11"), + ("0x12", "Wind + crickets", "0x12"), + ("0x13", "Day music always playing", "0x13"), + ("0x14", "Silence", "0x14"), + ("0x16", "Silence", "0x16"), + ("0x17", "High tubed wind + rain", "0x17"), + ("0x18", "Silence", "0x18"), + ("0x19", "Silence", "0x19"), + ("0x1A", "High tubed wind + rain", "0x1A"), + ("0x1B", "Silence", "0x1B"), + ("0x1C", "Rain", "0x1C"), + ("0x1D", "High tubed wind + rain", "0x1D"), + ("0x1E", "Silence", "0x1E"), + ("0x1F", "High tubed wind + rain ", "0x1F"), ] ootEnumObjectID = [ - ("Custom", "Custom", "Custom"), - ("OBJECT_HUMAN", "Human", "Human"), - ("OBJECT_OKUTA", "Okuta", "Okuta"), - ("OBJECT_CROW", "Crow", "Crow"), - ("OBJECT_POH", "Poh", "Poh"), - ("OBJECT_DY_OBJ", "Dy Obj", "Dy Obj"), - ("OBJECT_WALLMASTER", "Wallmaster", "Wallmaster"), - ("OBJECT_DODONGO", "Dodongo", "Dodongo"), - ("OBJECT_FIREFLY", "Firefly", "Firefly"), - ("OBJECT_BOX", "Box", "Box"), - ("OBJECT_FIRE", "Fire", "Fire"), - ("OBJECT_BUBBLE", "Bubble", "Bubble"), - ("OBJECT_NIW", "Niw", "Niw"), - ("OBJECT_TITE", "Tite", "Tite"), - ("OBJECT_REEBA", "Reeba", "Reeba"), - ("OBJECT_PEEHAT", "Peehat", "Peehat"), - ("OBJECT_KINGDODONGO", "Kingdodongo", "Kingdodongo"), - ("OBJECT_HORSE", "Horse", "Horse"), - ("OBJECT_ZF", "Zf", "Zf"), - ("OBJECT_GOMA", "Goma", "Goma"), - ("OBJECT_ZL1", "Zl1", "Zl1"), - ("OBJECT_GOL", "Gol", "Gol"), - ("OBJECT_DODOJR", "Dodojr", "Dodojr"), - ("OBJECT_TORCH2", "Torch2", "Torch2"), - ("OBJECT_BL", "Bl", "Bl"), - ("OBJECT_TP", "Tp", "Tp"), - ("OBJECT_OA1", "Oa1", "Oa1"), - ("OBJECT_ST", "St", "St"), - ("OBJECT_BW", "Bw", "Bw"), - ("OBJECT_EI", "Ei", "Ei"), - ("OBJECT_HORSE_NORMAL", "Horse Normal", "Horse Normal"), - ("OBJECT_OB1", "Ob1", "Ob1"), - ("OBJECT_O_ANIME", "O Anime", "O Anime"), - ("OBJECT_SPOT04_OBJECTS", "Spot04 Objects", "Spot04 Objects"), - ("OBJECT_DDAN_OBJECTS", "Ddan Objects", "Ddan Objects"), - ("OBJECT_HIDAN_OBJECTS", "Hidan Objects", "Hidan Objects"), - ("OBJECT_HORSE_GANON", "Horse Ganon", "Horse Ganon"), - ("OBJECT_OA2", "Oa2", "Oa2"), - ("OBJECT_SPOT00_OBJECTS", "Spot00 Objects", "Spot00 Objects"), - ("OBJECT_MB", "Mb", "Mb"), - ("OBJECT_BOMBF", "Bombf", "Bombf"), - ("OBJECT_SK2", "Sk2", "Sk2"), - ("OBJECT_OE1", "Oe1", "Oe1"), - ("OBJECT_OE_ANIME", "Oe Anime", "Oe Anime"), - ("OBJECT_OE2", "Oe2", "Oe2"), - ("OBJECT_YDAN_OBJECTS", "Ydan Objects", "Ydan Objects"), - ("OBJECT_GND", "Gnd", "Gnd"), - ("OBJECT_AM", "Am", "Am"), - ("OBJECT_DEKUBABA", "Dekubaba", "Dekubaba"), - ("OBJECT_OA3", "Oa3", "Oa3"), - ("OBJECT_OA4", "Oa4", "Oa4"), - ("OBJECT_OA5", "Oa5", "Oa5"), - ("OBJECT_OA6", "Oa6", "Oa6"), - ("OBJECT_OA7", "Oa7", "Oa7"), - ("OBJECT_JJ", "Jj", "Jj"), - ("OBJECT_OA8", "Oa8", "Oa8"), - ("OBJECT_OA9", "Oa9", "Oa9"), - ("OBJECT_OB2", "Ob2", "Ob2"), - ("OBJECT_OB3", "Ob3", "Ob3"), - ("OBJECT_OB4", "Ob4", "Ob4"), - ("OBJECT_HORSE_ZELDA", "Horse Zelda", "Horse Zelda"), - ("OBJECT_OPENING_DEMO1", "Opening Demo1", "Opening Demo1"), - ("OBJECT_WARP1", "Warp1", "Warp1"), - ("OBJECT_B_HEART", "B Heart", "B Heart"), - ("OBJECT_DEKUNUTS", "Dekunuts", "Dekunuts"), - ("OBJECT_OE3", "Oe3", "Oe3"), - ("OBJECT_OE4", "Oe4", "Oe4"), - ("OBJECT_MENKURI_OBJECTS", "Menkuri Objects", "Menkuri Objects"), - ("OBJECT_OE5", "Oe5", "Oe5"), - ("OBJECT_OE6", "Oe6", "Oe6"), - ("OBJECT_OE7", "Oe7", "Oe7"), - ("OBJECT_OE8", "Oe8", "Oe8"), - ("OBJECT_OE9", "Oe9", "Oe9"), - ("OBJECT_OE10", "Oe10", "Oe10"), - ("OBJECT_OE11", "Oe11", "Oe11"), - ("OBJECT_OE12", "Oe12", "Oe12"), - ("OBJECT_VALI", "Vali", "Vali"), - ("OBJECT_OA10", "Oa10", "Oa10"), - ("OBJECT_OA11", "Oa11", "Oa11"), - ("OBJECT_MIZU_OBJECTS", "Mizu Objects", "Mizu Objects"), - ("OBJECT_FHG", "Fhg", "Fhg"), - ("OBJECT_OSSAN", "Ossan", "Ossan"), - ("OBJECT_MORI_HINERI1", "Mori Hineri1", "Mori Hineri1"), - ("OBJECT_BB", "Bb", "Bb"), - ("OBJECT_TOKI_OBJECTS", "Toki Objects", "Toki Objects"), - ("OBJECT_YUKABYUN", "Yukabyun", "Yukabyun"), - ("OBJECT_ZL2", "Zl2", "Zl2"), - ("OBJECT_MJIN", "Mjin", "Mjin"), - ("OBJECT_MJIN_FLASH", "Mjin Flash", "Mjin Flash"), - ("OBJECT_MJIN_DARK", "Mjin Dark", "Mjin Dark"), - ("OBJECT_MJIN_FLAME", "Mjin Flame", "Mjin Flame"), - ("OBJECT_MJIN_ICE", "Mjin Ice", "Mjin Ice"), - ("OBJECT_MJIN_SOUL", "Mjin Soul", "Mjin Soul"), - ("OBJECT_MJIN_WIND", "Mjin Wind", "Mjin Wind"), - ("OBJECT_MJIN_OKA", "Mjin Oka", "Mjin Oka"), - ("OBJECT_HAKA_OBJECTS", "Haka Objects", "Haka Objects"), - ("OBJECT_SPOT06_OBJECTS", "Spot06 Objects", "Spot06 Objects"), - ("OBJECT_ICE_OBJECTS", "Ice Objects", "Ice Objects"), - ("OBJECT_RELAY_OBJECTS", "Relay Objects", "Relay Objects"), - ("OBJECT_PO_FIELD", "Po Field", "Po Field"), - ("OBJECT_PO_COMPOSER", "Po Composer", "Po Composer"), - ("OBJECT_MORI_HINERI1A", "Mori Hineri1a", "Mori Hineri1a"), - ("OBJECT_MORI_HINERI2", "Mori Hineri2", "Mori Hineri2"), - ("OBJECT_MORI_HINERI2A", "Mori Hineri2a", "Mori Hineri2a"), - ("OBJECT_MORI_OBJECTS", "Mori Objects", "Mori Objects"), - ("OBJECT_MORI_TEX", "Mori Tex", "Mori Tex"), - ("OBJECT_SPOT08_OBJ", "Spot08 Obj", "Spot08 Obj"), - ("OBJECT_WARP2", "Warp2", "Warp2"), - ("OBJECT_HATA", "Hata", "Hata"), - ("OBJECT_BIRD", "Bird", "Bird"), - ("OBJECT_WOOD02", "Wood02", "Wood02"), - ("OBJECT_LIGHTBOX", "Lightbox", "Lightbox"), - ("OBJECT_PU_BOX", "Pu Box", "Pu Box"), - ("OBJECT_TRAP", "Trap", "Trap"), - ("OBJECT_VASE", "Vase", "Vase"), - ("OBJECT_IM", "Im", "Im"), - ("OBJECT_TA", "Ta", "Ta"), - ("OBJECT_TK", "Tk", "Tk"), - ("OBJECT_XC", "Xc", "Xc"), - ("OBJECT_VM", "Vm", "Vm"), - ("OBJECT_BV", "Bv", "Bv"), - ("OBJECT_HAKACH_OBJECTS", "Hakach Objects", "Hakach Objects"), - ("OBJECT_EFC_CRYSTAL_LIGHT", "Efc Crystal Light", "Efc Crystal Light"), - ("OBJECT_EFC_FIRE_BALL", "Efc Fire Ball", "Efc Fire Ball"), - ("OBJECT_EFC_FLASH", "Efc Flash", "Efc Flash"), - ("OBJECT_EFC_LGT_SHOWER", "Efc Lgt Shower", "Efc Lgt Shower"), - ("OBJECT_EFC_STAR_FIELD", "Efc Star Field", "Efc Star Field"), - ("OBJECT_GOD_LGT", "God Lgt", "God Lgt"), - ("OBJECT_LIGHT_RING", "Light Ring", "Light Ring"), - ("OBJECT_TRIFORCE_SPOT", "Triforce Spot", "Triforce Spot"), - ("OBJECT_BDAN_OBJECTS", "Bdan Objects", "Bdan Objects"), - ("OBJECT_SD", "Sd", "Sd"), - ("OBJECT_RD", "Rd", "Rd"), - ("OBJECT_PO_SISTERS", "Po Sisters", "Po Sisters"), - ("OBJECT_HEAVY_OBJECT", "Heavy Object", "Heavy Object"), - ("OBJECT_GNDD", "Gndd", "Gndd"), - ("OBJECT_FD", "Fd", "Fd"), - ("OBJECT_DU", "Du", "Du"), - ("OBJECT_FW", "Fw", "Fw"), - ("OBJECT_MEDAL", "Medal", "Medal"), - ("OBJECT_HORSE_LINK_CHILD", "Horse Link Child", "Horse Link Child"), - ("OBJECT_SPOT02_OBJECTS", "Spot02 Objects", "Spot02 Objects"), - ("OBJECT_HAKA", "Haka", "Haka"), - ("OBJECT_RU1", "Ru1", "Ru1"), - ("OBJECT_SYOKUDAI", "Syokudai", "Syokudai"), - ("OBJECT_FD2", "Fd2", "Fd2"), - ("OBJECT_DH", "Dh", "Dh"), - ("OBJECT_RL", "Rl", "Rl"), - ("OBJECT_EFC_TW", "Efc Tw", "Efc Tw"), - ("OBJECT_DEMO_TRE_LGT", "Demo Tre Lgt", "Demo Tre Lgt"), - ("OBJECT_GI_KEY", "Gi Key", "Gi Key"), - ("OBJECT_MIR_RAY", "Mir Ray", "Mir Ray"), - ("OBJECT_BROB", "Brob", "Brob"), - ("OBJECT_GI_JEWEL", "Gi Jewel", "Gi Jewel"), - ("OBJECT_SPOT09_OBJ", "Spot09 Obj", "Spot09 Obj"), - ("OBJECT_SPOT18_OBJ", "Spot18 Obj", "Spot18 Obj"), - ("OBJECT_BDOOR", "Bdoor", "Bdoor"), - ("OBJECT_SPOT17_OBJ", "Spot17 Obj", "Spot17 Obj"), - ("OBJECT_SHOP_DUNGEN", "Shop Dungen", "Shop Dungen"), - ("OBJECT_NB", "Nb", "Nb"), - ("OBJECT_MO", "Mo", "Mo"), - ("OBJECT_SB", "Sb", "Sb"), - ("OBJECT_GI_MELODY", "Gi Melody", "Gi Melody"), - ("OBJECT_GI_HEART", "Gi Heart", "Gi Heart"), - ("OBJECT_GI_COMPASS", "Gi Compass", "Gi Compass"), - ("OBJECT_GI_BOSSKEY", "Gi Bosskey", "Gi Bosskey"), - ("OBJECT_GI_MEDAL", "Gi Medal", "Gi Medal"), - ("OBJECT_GI_NUTS", "Gi Nuts", "Gi Nuts"), - ("OBJECT_SA", "Sa", "Sa"), - ("OBJECT_GI_HEARTS", "Gi Hearts", "Gi Hearts"), - ("OBJECT_GI_ARROWCASE", "Gi Arrowcase", "Gi Arrowcase"), - ("OBJECT_GI_BOMBPOUCH", "Gi Bombpouch", "Gi Bombpouch"), - ("OBJECT_IN", "In", "In"), - ("OBJECT_TR", "Tr", "Tr"), - ("OBJECT_SPOT16_OBJ", "Spot16 Obj", "Spot16 Obj"), - ("OBJECT_OE1S", "Oe1s", "Oe1s"), - ("OBJECT_OE4S", "Oe4s", "Oe4s"), - ("OBJECT_OS_ANIME", "Os Anime", "Os Anime"), - ("OBJECT_GI_BOTTLE", "Gi Bottle", "Gi Bottle"), - ("OBJECT_GI_STICK", "Gi Stick", "Gi Stick"), - ("OBJECT_GI_MAP", "Gi Map", "Gi Map"), - ("OBJECT_OF1D_MAP", "Of1d Map", "Of1d Map"), - ("OBJECT_RU2", "Ru2", "Ru2"), - ("OBJECT_GI_SHIELD_1", "Gi Shield 1", "Gi Shield 1"), - ("OBJECT_DEKUJR", "Dekujr", "Dekujr"), - ("OBJECT_GI_MAGICPOT", "Gi Magicpot", "Gi Magicpot"), - ("OBJECT_GI_BOMB_1", "Gi Bomb 1", "Gi Bomb 1"), - ("OBJECT_OF1S", "Of1s", "Of1s"), - ("OBJECT_MA2", "Ma2", "Ma2"), - ("OBJECT_GI_PURSE", "Gi Purse", "Gi Purse"), - ("OBJECT_HNI", "Hni", "Hni"), - ("OBJECT_TW", "Tw", "Tw"), - ("OBJECT_RR", "Rr", "Rr"), - ("OBJECT_BXA", "Bxa", "Bxa"), - ("OBJECT_ANUBICE", "Anubice", "Anubice"), - ("OBJECT_GI_GERUDO", "Gi Gerudo", "Gi Gerudo"), - ("OBJECT_GI_ARROW", "Gi Arrow", "Gi Arrow"), - ("OBJECT_GI_BOMB_2", "Gi Bomb 2", "Gi Bomb 2"), - ("OBJECT_GI_EGG", "Gi Egg", "Gi Egg"), - ("OBJECT_GI_SCALE", "Gi Scale", "Gi Scale"), - ("OBJECT_GI_SHIELD_2", "Gi Shield 2", "Gi Shield 2"), - ("OBJECT_GI_HOOKSHOT", "Gi Hookshot", "Gi Hookshot"), - ("OBJECT_GI_OCARINA", "Gi Ocarina", "Gi Ocarina"), - ("OBJECT_GI_MILK", "Gi Milk", "Gi Milk"), - ("OBJECT_MA1", "Ma1", "Ma1"), - ("OBJECT_GANON", "Ganon", "Ganon"), - ("OBJECT_SST", "Sst", "Sst"), - ("OBJECT_NY_UNUSED", "Ny Unused", "Ny Unused"), - ("OBJECT_NY", "Ny", "Ny"), - ("OBJECT_FR", "Fr", "Fr"), - ("OBJECT_GI_PACHINKO", "Gi Pachinko", "Gi Pachinko"), - ("OBJECT_GI_BOOMERANG", "Gi Boomerang", "Gi Boomerang"), - ("OBJECT_GI_BOW", "Gi Bow", "Gi Bow"), - ("OBJECT_GI_GLASSES", "Gi Glasses", "Gi Glasses"), - ("OBJECT_GI_LIQUID", "Gi Liquid", "Gi Liquid"), - ("OBJECT_ANI", "Ani", "Ani"), - ("OBJECT_DEMO_6K", "Demo 6k", "Demo 6k"), - ("OBJECT_GI_SHIELD_3", "Gi Shield 3", "Gi Shield 3"), - ("OBJECT_GI_LETTER", "Gi Letter", "Gi Letter"), - ("OBJECT_SPOT15_OBJ", "Spot15 Obj", "Spot15 Obj"), - ("OBJECT_JYA_OBJ", "Jya Obj", "Jya Obj"), - ("OBJECT_GI_CLOTHES", "Gi Clothes", "Gi Clothes"), - ("OBJECT_GI_BEAN", "Gi Bean", "Gi Bean"), - ("OBJECT_GI_FISH", "Gi Fish", "Gi Fish"), - ("OBJECT_GI_SAW", "Gi Saw", "Gi Saw"), - ("OBJECT_GI_HAMMER", "Gi Hammer", "Gi Hammer"), - ("OBJECT_GI_GRASS", "Gi Grass", "Gi Grass"), - ("OBJECT_GI_LONGSWORD", "Gi Longsword", "Gi Longsword"), - ("OBJECT_SPOT01_OBJECTS", "Spot01 Objects", "Spot01 Objects"), - ("OBJECT_MD_UNUSED", "Md Unused", "Md Unused"), - ("OBJECT_MD", "Md", "Md"), - ("OBJECT_KM1", "Km1", "Km1"), - ("OBJECT_KW1", "Kw1", "Kw1"), - ("OBJECT_ZO", "Zo", "Zo"), - ("OBJECT_KZ", "Kz", "Kz"), - ("OBJECT_UMAJUMP", "Umajump", "Umajump"), - ("OBJECT_MASTERKOKIRI", "Masterkokiri", "Masterkokiri"), - ("OBJECT_MASTERKOKIRIHEAD", "Masterkokirihead", "Masterkokirihead"), - ("OBJECT_MASTERGOLON", "Mastergolon", "Mastergolon"), - ("OBJECT_MASTERZOORA", "Masterzoora", "Masterzoora"), - ("OBJECT_AOB", "Aob", "Aob"), - ("OBJECT_IK", "Ik", "Ik"), - ("OBJECT_AHG", "Ahg", "Ahg"), - ("OBJECT_CNE", "Cne", "Cne"), - ("OBJECT_GI_NIWATORI", "Gi Niwatori", "Gi Niwatori"), - ("OBJECT_SKJ", "Skj", "Skj"), - ("OBJECT_GI_BOTTLE_LETTER", "Gi Bottle Letter", "Gi Bottle Letter"), - ("OBJECT_BJI", "Bji", "Bji"), - ("OBJECT_BBA", "Bba", "Bba"), - ("OBJECT_GI_OCARINA_0", "Gi Ocarina 0", "Gi Ocarina 0"), - ("OBJECT_DS", "Ds", "Ds"), - ("OBJECT_ANE", "Ane", "Ane"), - ("OBJECT_BOJ", "Boj", "Boj"), - ("OBJECT_SPOT03_OBJECT", "Spot03 Object", "Spot03 Object"), - ("OBJECT_SPOT07_OBJECT", "Spot07 Object", "Spot07 Object"), - ("OBJECT_FZ", "Fz", "Fz"), - ("OBJECT_BOB", "Bob", "Bob"), - ("OBJECT_GE1", "Ge1", "Ge1"), - ("OBJECT_YABUSAME_POINT", "Yabusame Point", "Yabusame Point"), - ("OBJECT_GI_BOOTS_2", "Gi Boots 2", "Gi Boots 2"), - ("OBJECT_GI_SEED", "Gi Seed", "Gi Seed"), - ("OBJECT_GND_MAGIC", "Gnd Magic", "Gnd Magic"), - ("OBJECT_D_ELEVATOR", "D Elevator", "D Elevator"), - ("OBJECT_D_HSBLOCK", "D Hsblock", "D Hsblock"), - ("OBJECT_D_LIFT", "D Lift", "D Lift"), - ("OBJECT_MAMENOKI", "Mamenoki", "Mamenoki"), - ("OBJECT_GOROIWA", "Goroiwa", "Goroiwa"), - ("OBJECT_TORYO", "Toryo", "Toryo"), - ("OBJECT_DAIKU", "Daiku", "Daiku"), - ("OBJECT_NWC", "Nwc", "Nwc"), - ("OBJECT_BLKOBJ", "Blkobj", "Blkobj"), - ("OBJECT_GM", "Gm", "Gm"), - ("OBJECT_MS", "Ms", "Ms"), - ("OBJECT_HS", "Hs", "Hs"), - ("OBJECT_INGATE", "Ingate", "Ingate"), - ("OBJECT_LIGHTSWITCH", "Lightswitch", "Lightswitch"), - ("OBJECT_KUSA", "Kusa", "Kusa"), - ("OBJECT_TSUBO", "Tsubo", "Tsubo"), - ("OBJECT_GI_GLOVES", "Gi Gloves", "Gi Gloves"), - ("OBJECT_GI_COIN", "Gi Coin", "Gi Coin"), - ("OBJECT_KANBAN", "Kanban", "Kanban"), - ("OBJECT_GJYO_OBJECTS", "Gjyo Objects", "Gjyo Objects"), - ("OBJECT_OWL", "Owl", "Owl"), - ("OBJECT_MK", "Mk", "Mk"), - ("OBJECT_FU", "Fu", "Fu"), - ("OBJECT_GI_KI_TAN_MASK", "Gi Ki Tan Mask", "Gi Ki Tan Mask"), - ("OBJECT_GI_REDEAD_MASK", "Gi Redead Mask", "Gi Redead Mask"), - ("OBJECT_GI_SKJ_MASK", "Gi Skj Mask", "Gi Skj Mask"), - ("OBJECT_GI_RABIT_MASK", "Gi Rabit Mask", "Gi Rabit Mask"), - ("OBJECT_GI_TRUTH_MASK", "Gi Truth Mask", "Gi Truth Mask"), - ("OBJECT_GANON_OBJECTS", "Ganon Objects", "Ganon Objects"), - ("OBJECT_SIOFUKI", "Siofuki", "Siofuki"), - ("OBJECT_STREAM", "Stream", "Stream"), - ("OBJECT_MM", "Mm", "Mm"), - ("OBJECT_FA", "Fa", "Fa"), - ("OBJECT_OS", "Os", "Os"), - ("OBJECT_GI_EYE_LOTION", "Gi Eye Lotion", "Gi Eye Lotion"), - ("OBJECT_GI_POWDER", "Gi Powder", "Gi Powder"), - ("OBJECT_GI_MUSHROOM", "Gi Mushroom", "Gi Mushroom"), - ("OBJECT_GI_TICKETSTONE", "Gi Ticketstone", "Gi Ticketstone"), - ("OBJECT_GI_BROKENSWORD", "Gi Brokensword", "Gi Brokensword"), - ("OBJECT_JS", "Js", "Js"), - ("OBJECT_CS", "Cs", "Cs"), - ("OBJECT_GI_PRESCRIPTION", "Gi Prescription", "Gi Prescription"), - ("OBJECT_GI_BRACELET", "Gi Bracelet", "Gi Bracelet"), - ("OBJECT_GI_SOLDOUT", "Gi Soldout", "Gi Soldout"), - ("OBJECT_GI_FROG", "Gi Frog", "Gi Frog"), - ("OBJECT_MAG", "Mag", "Mag"), - ("OBJECT_DOOR_GERUDO", "Door Gerudo", "Door Gerudo"), - ("OBJECT_GT", "Gt", "Gt"), - ("OBJECT_EFC_ERUPC", "Efc Erupc", "Efc Erupc"), - ("OBJECT_ZL2_ANIME1", "Zl2 Anime1", "Zl2 Anime1"), - ("OBJECT_ZL2_ANIME2", "Zl2 Anime2", "Zl2 Anime2"), - ("OBJECT_GI_GOLONMASK", "Gi Golonmask", "Gi Golonmask"), - ("OBJECT_GI_ZORAMASK", "Gi Zoramask", "Gi Zoramask"), - ("OBJECT_GI_GERUDOMASK", "Gi Gerudomask", "Gi Gerudomask"), - ("OBJECT_GANON2", "Ganon2", "Ganon2"), - ("OBJECT_KA", "Ka", "Ka"), - ("OBJECT_TS", "Ts", "Ts"), - ("OBJECT_ZG", "Zg", "Zg"), - ("OBJECT_GI_HOVERBOOTS", "Gi Hoverboots", "Gi Hoverboots"), - ("OBJECT_GI_M_ARROW", "Gi M Arrow", "Gi M Arrow"), - ("OBJECT_DS2", "Ds2", "Ds2"), - ("OBJECT_EC", "Ec", "Ec"), - ("OBJECT_FISH", "Fish", "Fish"), - ("OBJECT_GI_SUTARU", "Gi Sutaru", "Gi Sutaru"), - ("OBJECT_GI_GODDESS", "Gi Goddess", "Gi Goddess"), - ("OBJECT_SSH", "Ssh", "Ssh"), - ("OBJECT_BIGOKUTA", "Bigokuta", "Bigokuta"), - ("OBJECT_BG", "Bg", "Bg"), - ("OBJECT_SPOT05_OBJECTS", "Spot05 Objects", "Spot05 Objects"), - ("OBJECT_SPOT12_OBJ", "Spot12 Obj", "Spot12 Obj"), - ("OBJECT_BOMBIWA", "Bombiwa", "Bombiwa"), - ("OBJECT_HINTNUTS", "Hintnuts", "Hintnuts"), - ("OBJECT_RS", "Rs", "Rs"), - ("OBJECT_SPOT00_BREAK", "Spot00 Break", "Spot00 Break"), - ("OBJECT_GLA", "Gla", "Gla"), - ("OBJECT_SHOPNUTS", "Shopnuts", "Shopnuts"), - ("OBJECT_GELDB", "Geldb", "Geldb"), - ("OBJECT_GR", "Gr", "Gr"), - ("OBJECT_DOG", "Dog", "Dog"), - ("OBJECT_JYA_IRON", "Jya Iron", "Jya Iron"), - ("OBJECT_JYA_DOOR", "Jya Door", "Jya Door"), - ("OBJECT_SPOT11_OBJ", "Spot11 Obj", "Spot11 Obj"), - ("OBJECT_KIBAKO2", "Kibako2", "Kibako2"), - ("OBJECT_DNS", "Dns", "Dns"), - ("OBJECT_DNK", "Dnk", "Dnk"), - ("OBJECT_GI_FIRE", "Gi Fire", "Gi Fire"), - ("OBJECT_GI_INSECT", "Gi Insect", "Gi Insect"), - ("OBJECT_GI_BUTTERFLY", "Gi Butterfly", "Gi Butterfly"), - ("OBJECT_GI_GHOST", "Gi Ghost", "Gi Ghost"), - ("OBJECT_GI_SOUL", "Gi Soul", "Gi Soul"), - ("OBJECT_BOWL", "Bowl", "Bowl"), - ("OBJECT_DEMO_KEKKAI", "Demo Kekkai", "Demo Kekkai"), - ("OBJECT_EFC_DOUGHNUT", "Efc Doughnut", "Efc Doughnut"), - ("OBJECT_GI_DEKUPOUCH", "Gi Dekupouch", "Gi Dekupouch"), - ("OBJECT_GANON_ANIME1", "Ganon Anime1", "Ganon Anime1"), - ("OBJECT_GANON_ANIME2", "Ganon Anime2", "Ganon Anime2"), - ("OBJECT_GANON_ANIME3", "Ganon Anime3", "Ganon Anime3"), - ("OBJECT_GI_RUPY", "Gi Rupy", "Gi Rupy"), - ("OBJECT_SPOT01_MATOYA", "Spot01 Matoya", "Spot01 Matoya"), - ("OBJECT_SPOT01_MATOYAB", "Spot01 Matoyab", "Spot01 Matoyab"), - ("OBJECT_MU", "Mu", "Mu"), - ("OBJECT_WF", "Wf", "Wf"), - ("OBJECT_SKB", "Skb", "Skb"), - ("OBJECT_GJ", "Gj", "Gj"), - ("OBJECT_GEFF", "Geff", "Geff"), - ("OBJECT_HAKA_DOOR", "Haka Door", "Haka Door"), - ("OBJECT_GS", "Gs", "Gs"), - ("OBJECT_PS", "Ps", "Ps"), - ("OBJECT_BWALL", "Bwall", "Bwall"), - ("OBJECT_COW", "Cow", "Cow"), - ("OBJECT_COB", "Cob", "Cob"), - ("OBJECT_GI_SWORD_1", "Gi Sword 1", "Gi Sword 1"), - ("OBJECT_DOOR_KILLER", "Door Killer", "Door Killer"), - ("OBJECT_OUKE_HAKA", "Ouke Haka", "Ouke Haka"), - ("OBJECT_TIMEBLOCK", "Timeblock", "Timeblock"), + ("Custom", "Custom", "Custom"), + ("OBJECT_HUMAN", "Human", "Human"), + ("OBJECT_OKUTA", "Okuta", "Okuta"), + ("OBJECT_CROW", "Crow", "Crow"), + ("OBJECT_POH", "Poh", "Poh"), + ("OBJECT_DY_OBJ", "Dy Obj", "Dy Obj"), + ("OBJECT_WALLMASTER", "Wallmaster", "Wallmaster"), + ("OBJECT_DODONGO", "Dodongo", "Dodongo"), + ("OBJECT_FIREFLY", "Firefly", "Firefly"), + ("OBJECT_BOX", "Box", "Box"), + ("OBJECT_FIRE", "Fire", "Fire"), + ("OBJECT_BUBBLE", "Bubble", "Bubble"), + ("OBJECT_NIW", "Niw", "Niw"), + ("OBJECT_TITE", "Tite", "Tite"), + ("OBJECT_REEBA", "Reeba", "Reeba"), + ("OBJECT_PEEHAT", "Peehat", "Peehat"), + ("OBJECT_KINGDODONGO", "Kingdodongo", "Kingdodongo"), + ("OBJECT_HORSE", "Horse", "Horse"), + ("OBJECT_ZF", "Zf", "Zf"), + ("OBJECT_GOMA", "Goma", "Goma"), + ("OBJECT_ZL1", "Zl1", "Zl1"), + ("OBJECT_GOL", "Gol", "Gol"), + ("OBJECT_DODOJR", "Dodojr", "Dodojr"), + ("OBJECT_TORCH2", "Torch2", "Torch2"), + ("OBJECT_BL", "Bl", "Bl"), + ("OBJECT_TP", "Tp", "Tp"), + ("OBJECT_OA1", "Oa1", "Oa1"), + ("OBJECT_ST", "St", "St"), + ("OBJECT_BW", "Bw", "Bw"), + ("OBJECT_EI", "Ei", "Ei"), + ("OBJECT_HORSE_NORMAL", "Horse Normal", "Horse Normal"), + ("OBJECT_OB1", "Ob1", "Ob1"), + ("OBJECT_O_ANIME", "O Anime", "O Anime"), + ("OBJECT_SPOT04_OBJECTS", "Spot04 Objects", "Spot04 Objects"), + ("OBJECT_DDAN_OBJECTS", "Ddan Objects", "Ddan Objects"), + ("OBJECT_HIDAN_OBJECTS", "Hidan Objects", "Hidan Objects"), + ("OBJECT_HORSE_GANON", "Horse Ganon", "Horse Ganon"), + ("OBJECT_OA2", "Oa2", "Oa2"), + ("OBJECT_SPOT00_OBJECTS", "Spot00 Objects", "Spot00 Objects"), + ("OBJECT_MB", "Mb", "Mb"), + ("OBJECT_BOMBF", "Bombf", "Bombf"), + ("OBJECT_SK2", "Sk2", "Sk2"), + ("OBJECT_OE1", "Oe1", "Oe1"), + ("OBJECT_OE_ANIME", "Oe Anime", "Oe Anime"), + ("OBJECT_OE2", "Oe2", "Oe2"), + ("OBJECT_YDAN_OBJECTS", "Ydan Objects", "Ydan Objects"), + ("OBJECT_GND", "Gnd", "Gnd"), + ("OBJECT_AM", "Am", "Am"), + ("OBJECT_DEKUBABA", "Dekubaba", "Dekubaba"), + ("OBJECT_OA3", "Oa3", "Oa3"), + ("OBJECT_OA4", "Oa4", "Oa4"), + ("OBJECT_OA5", "Oa5", "Oa5"), + ("OBJECT_OA6", "Oa6", "Oa6"), + ("OBJECT_OA7", "Oa7", "Oa7"), + ("OBJECT_JJ", "Jj", "Jj"), + ("OBJECT_OA8", "Oa8", "Oa8"), + ("OBJECT_OA9", "Oa9", "Oa9"), + ("OBJECT_OB2", "Ob2", "Ob2"), + ("OBJECT_OB3", "Ob3", "Ob3"), + ("OBJECT_OB4", "Ob4", "Ob4"), + ("OBJECT_HORSE_ZELDA", "Horse Zelda", "Horse Zelda"), + ("OBJECT_OPENING_DEMO1", "Opening Demo1", "Opening Demo1"), + ("OBJECT_WARP1", "Warp1", "Warp1"), + ("OBJECT_B_HEART", "B Heart", "B Heart"), + ("OBJECT_DEKUNUTS", "Dekunuts", "Dekunuts"), + ("OBJECT_OE3", "Oe3", "Oe3"), + ("OBJECT_OE4", "Oe4", "Oe4"), + ("OBJECT_MENKURI_OBJECTS", "Menkuri Objects", "Menkuri Objects"), + ("OBJECT_OE5", "Oe5", "Oe5"), + ("OBJECT_OE6", "Oe6", "Oe6"), + ("OBJECT_OE7", "Oe7", "Oe7"), + ("OBJECT_OE8", "Oe8", "Oe8"), + ("OBJECT_OE9", "Oe9", "Oe9"), + ("OBJECT_OE10", "Oe10", "Oe10"), + ("OBJECT_OE11", "Oe11", "Oe11"), + ("OBJECT_OE12", "Oe12", "Oe12"), + ("OBJECT_VALI", "Vali", "Vali"), + ("OBJECT_OA10", "Oa10", "Oa10"), + ("OBJECT_OA11", "Oa11", "Oa11"), + ("OBJECT_MIZU_OBJECTS", "Mizu Objects", "Mizu Objects"), + ("OBJECT_FHG", "Fhg", "Fhg"), + ("OBJECT_OSSAN", "Ossan", "Ossan"), + ("OBJECT_MORI_HINERI1", "Mori Hineri1", "Mori Hineri1"), + ("OBJECT_BB", "Bb", "Bb"), + ("OBJECT_TOKI_OBJECTS", "Toki Objects", "Toki Objects"), + ("OBJECT_YUKABYUN", "Yukabyun", "Yukabyun"), + ("OBJECT_ZL2", "Zl2", "Zl2"), + ("OBJECT_MJIN", "Mjin", "Mjin"), + ("OBJECT_MJIN_FLASH", "Mjin Flash", "Mjin Flash"), + ("OBJECT_MJIN_DARK", "Mjin Dark", "Mjin Dark"), + ("OBJECT_MJIN_FLAME", "Mjin Flame", "Mjin Flame"), + ("OBJECT_MJIN_ICE", "Mjin Ice", "Mjin Ice"), + ("OBJECT_MJIN_SOUL", "Mjin Soul", "Mjin Soul"), + ("OBJECT_MJIN_WIND", "Mjin Wind", "Mjin Wind"), + ("OBJECT_MJIN_OKA", "Mjin Oka", "Mjin Oka"), + ("OBJECT_HAKA_OBJECTS", "Haka Objects", "Haka Objects"), + ("OBJECT_SPOT06_OBJECTS", "Spot06 Objects", "Spot06 Objects"), + ("OBJECT_ICE_OBJECTS", "Ice Objects", "Ice Objects"), + ("OBJECT_RELAY_OBJECTS", "Relay Objects", "Relay Objects"), + ("OBJECT_PO_FIELD", "Po Field", "Po Field"), + ("OBJECT_PO_COMPOSER", "Po Composer", "Po Composer"), + ("OBJECT_MORI_HINERI1A", "Mori Hineri1a", "Mori Hineri1a"), + ("OBJECT_MORI_HINERI2", "Mori Hineri2", "Mori Hineri2"), + ("OBJECT_MORI_HINERI2A", "Mori Hineri2a", "Mori Hineri2a"), + ("OBJECT_MORI_OBJECTS", "Mori Objects", "Mori Objects"), + ("OBJECT_MORI_TEX", "Mori Tex", "Mori Tex"), + ("OBJECT_SPOT08_OBJ", "Spot08 Obj", "Spot08 Obj"), + ("OBJECT_WARP2", "Warp2", "Warp2"), + ("OBJECT_HATA", "Hata", "Hata"), + ("OBJECT_BIRD", "Bird", "Bird"), + ("OBJECT_WOOD02", "Wood02", "Wood02"), + ("OBJECT_LIGHTBOX", "Lightbox", "Lightbox"), + ("OBJECT_PU_BOX", "Pu Box", "Pu Box"), + ("OBJECT_TRAP", "Trap", "Trap"), + ("OBJECT_VASE", "Vase", "Vase"), + ("OBJECT_IM", "Im", "Im"), + ("OBJECT_TA", "Ta", "Ta"), + ("OBJECT_TK", "Tk", "Tk"), + ("OBJECT_XC", "Xc", "Xc"), + ("OBJECT_VM", "Vm", "Vm"), + ("OBJECT_BV", "Bv", "Bv"), + ("OBJECT_HAKACH_OBJECTS", "Hakach Objects", "Hakach Objects"), + ("OBJECT_EFC_CRYSTAL_LIGHT", "Efc Crystal Light", "Efc Crystal Light"), + ("OBJECT_EFC_FIRE_BALL", "Efc Fire Ball", "Efc Fire Ball"), + ("OBJECT_EFC_FLASH", "Efc Flash", "Efc Flash"), + ("OBJECT_EFC_LGT_SHOWER", "Efc Lgt Shower", "Efc Lgt Shower"), + ("OBJECT_EFC_STAR_FIELD", "Efc Star Field", "Efc Star Field"), + ("OBJECT_GOD_LGT", "God Lgt", "God Lgt"), + ("OBJECT_LIGHT_RING", "Light Ring", "Light Ring"), + ("OBJECT_TRIFORCE_SPOT", "Triforce Spot", "Triforce Spot"), + ("OBJECT_BDAN_OBJECTS", "Bdan Objects", "Bdan Objects"), + ("OBJECT_SD", "Sd", "Sd"), + ("OBJECT_RD", "Rd", "Rd"), + ("OBJECT_PO_SISTERS", "Po Sisters", "Po Sisters"), + ("OBJECT_HEAVY_OBJECT", "Heavy Object", "Heavy Object"), + ("OBJECT_GNDD", "Gndd", "Gndd"), + ("OBJECT_FD", "Fd", "Fd"), + ("OBJECT_DU", "Du", "Du"), + ("OBJECT_FW", "Fw", "Fw"), + ("OBJECT_MEDAL", "Medal", "Medal"), + ("OBJECT_HORSE_LINK_CHILD", "Horse Link Child", "Horse Link Child"), + ("OBJECT_SPOT02_OBJECTS", "Spot02 Objects", "Spot02 Objects"), + ("OBJECT_HAKA", "Haka", "Haka"), + ("OBJECT_RU1", "Ru1", "Ru1"), + ("OBJECT_SYOKUDAI", "Syokudai", "Syokudai"), + ("OBJECT_FD2", "Fd2", "Fd2"), + ("OBJECT_DH", "Dh", "Dh"), + ("OBJECT_RL", "Rl", "Rl"), + ("OBJECT_EFC_TW", "Efc Tw", "Efc Tw"), + ("OBJECT_DEMO_TRE_LGT", "Demo Tre Lgt", "Demo Tre Lgt"), + ("OBJECT_GI_KEY", "Gi Key", "Gi Key"), + ("OBJECT_MIR_RAY", "Mir Ray", "Mir Ray"), + ("OBJECT_BROB", "Brob", "Brob"), + ("OBJECT_GI_JEWEL", "Gi Jewel", "Gi Jewel"), + ("OBJECT_SPOT09_OBJ", "Spot09 Obj", "Spot09 Obj"), + ("OBJECT_SPOT18_OBJ", "Spot18 Obj", "Spot18 Obj"), + ("OBJECT_BDOOR", "Bdoor", "Bdoor"), + ("OBJECT_SPOT17_OBJ", "Spot17 Obj", "Spot17 Obj"), + ("OBJECT_SHOP_DUNGEN", "Shop Dungen", "Shop Dungen"), + ("OBJECT_NB", "Nb", "Nb"), + ("OBJECT_MO", "Mo", "Mo"), + ("OBJECT_SB", "Sb", "Sb"), + ("OBJECT_GI_MELODY", "Gi Melody", "Gi Melody"), + ("OBJECT_GI_HEART", "Gi Heart", "Gi Heart"), + ("OBJECT_GI_COMPASS", "Gi Compass", "Gi Compass"), + ("OBJECT_GI_BOSSKEY", "Gi Bosskey", "Gi Bosskey"), + ("OBJECT_GI_MEDAL", "Gi Medal", "Gi Medal"), + ("OBJECT_GI_NUTS", "Gi Nuts", "Gi Nuts"), + ("OBJECT_SA", "Sa", "Sa"), + ("OBJECT_GI_HEARTS", "Gi Hearts", "Gi Hearts"), + ("OBJECT_GI_ARROWCASE", "Gi Arrowcase", "Gi Arrowcase"), + ("OBJECT_GI_BOMBPOUCH", "Gi Bombpouch", "Gi Bombpouch"), + ("OBJECT_IN", "In", "In"), + ("OBJECT_TR", "Tr", "Tr"), + ("OBJECT_SPOT16_OBJ", "Spot16 Obj", "Spot16 Obj"), + ("OBJECT_OE1S", "Oe1s", "Oe1s"), + ("OBJECT_OE4S", "Oe4s", "Oe4s"), + ("OBJECT_OS_ANIME", "Os Anime", "Os Anime"), + ("OBJECT_GI_BOTTLE", "Gi Bottle", "Gi Bottle"), + ("OBJECT_GI_STICK", "Gi Stick", "Gi Stick"), + ("OBJECT_GI_MAP", "Gi Map", "Gi Map"), + ("OBJECT_OF1D_MAP", "Of1d Map", "Of1d Map"), + ("OBJECT_RU2", "Ru2", "Ru2"), + ("OBJECT_GI_SHIELD_1", "Gi Shield 1", "Gi Shield 1"), + ("OBJECT_DEKUJR", "Dekujr", "Dekujr"), + ("OBJECT_GI_MAGICPOT", "Gi Magicpot", "Gi Magicpot"), + ("OBJECT_GI_BOMB_1", "Gi Bomb 1", "Gi Bomb 1"), + ("OBJECT_OF1S", "Of1s", "Of1s"), + ("OBJECT_MA2", "Ma2", "Ma2"), + ("OBJECT_GI_PURSE", "Gi Purse", "Gi Purse"), + ("OBJECT_HNI", "Hni", "Hni"), + ("OBJECT_TW", "Tw", "Tw"), + ("OBJECT_RR", "Rr", "Rr"), + ("OBJECT_BXA", "Bxa", "Bxa"), + ("OBJECT_ANUBICE", "Anubice", "Anubice"), + ("OBJECT_GI_GERUDO", "Gi Gerudo", "Gi Gerudo"), + ("OBJECT_GI_ARROW", "Gi Arrow", "Gi Arrow"), + ("OBJECT_GI_BOMB_2", "Gi Bomb 2", "Gi Bomb 2"), + ("OBJECT_GI_EGG", "Gi Egg", "Gi Egg"), + ("OBJECT_GI_SCALE", "Gi Scale", "Gi Scale"), + ("OBJECT_GI_SHIELD_2", "Gi Shield 2", "Gi Shield 2"), + ("OBJECT_GI_HOOKSHOT", "Gi Hookshot", "Gi Hookshot"), + ("OBJECT_GI_OCARINA", "Gi Ocarina", "Gi Ocarina"), + ("OBJECT_GI_MILK", "Gi Milk", "Gi Milk"), + ("OBJECT_MA1", "Ma1", "Ma1"), + ("OBJECT_GANON", "Ganon", "Ganon"), + ("OBJECT_SST", "Sst", "Sst"), + ("OBJECT_NY_UNUSED", "Ny Unused", "Ny Unused"), + ("OBJECT_NY", "Ny", "Ny"), + ("OBJECT_FR", "Fr", "Fr"), + ("OBJECT_GI_PACHINKO", "Gi Pachinko", "Gi Pachinko"), + ("OBJECT_GI_BOOMERANG", "Gi Boomerang", "Gi Boomerang"), + ("OBJECT_GI_BOW", "Gi Bow", "Gi Bow"), + ("OBJECT_GI_GLASSES", "Gi Glasses", "Gi Glasses"), + ("OBJECT_GI_LIQUID", "Gi Liquid", "Gi Liquid"), + ("OBJECT_ANI", "Ani", "Ani"), + ("OBJECT_DEMO_6K", "Demo 6k", "Demo 6k"), + ("OBJECT_GI_SHIELD_3", "Gi Shield 3", "Gi Shield 3"), + ("OBJECT_GI_LETTER", "Gi Letter", "Gi Letter"), + ("OBJECT_SPOT15_OBJ", "Spot15 Obj", "Spot15 Obj"), + ("OBJECT_JYA_OBJ", "Jya Obj", "Jya Obj"), + ("OBJECT_GI_CLOTHES", "Gi Clothes", "Gi Clothes"), + ("OBJECT_GI_BEAN", "Gi Bean", "Gi Bean"), + ("OBJECT_GI_FISH", "Gi Fish", "Gi Fish"), + ("OBJECT_GI_SAW", "Gi Saw", "Gi Saw"), + ("OBJECT_GI_HAMMER", "Gi Hammer", "Gi Hammer"), + ("OBJECT_GI_GRASS", "Gi Grass", "Gi Grass"), + ("OBJECT_GI_LONGSWORD", "Gi Longsword", "Gi Longsword"), + ("OBJECT_SPOT01_OBJECTS", "Spot01 Objects", "Spot01 Objects"), + ("OBJECT_MD_UNUSED", "Md Unused", "Md Unused"), + ("OBJECT_MD", "Md", "Md"), + ("OBJECT_KM1", "Km1", "Km1"), + ("OBJECT_KW1", "Kw1", "Kw1"), + ("OBJECT_ZO", "Zo", "Zo"), + ("OBJECT_KZ", "Kz", "Kz"), + ("OBJECT_UMAJUMP", "Umajump", "Umajump"), + ("OBJECT_MASTERKOKIRI", "Masterkokiri", "Masterkokiri"), + ("OBJECT_MASTERKOKIRIHEAD", "Masterkokirihead", "Masterkokirihead"), + ("OBJECT_MASTERGOLON", "Mastergolon", "Mastergolon"), + ("OBJECT_MASTERZOORA", "Masterzoora", "Masterzoora"), + ("OBJECT_AOB", "Aob", "Aob"), + ("OBJECT_IK", "Ik", "Ik"), + ("OBJECT_AHG", "Ahg", "Ahg"), + ("OBJECT_CNE", "Cne", "Cne"), + ("OBJECT_GI_NIWATORI", "Gi Niwatori", "Gi Niwatori"), + ("OBJECT_SKJ", "Skj", "Skj"), + ("OBJECT_GI_BOTTLE_LETTER", "Gi Bottle Letter", "Gi Bottle Letter"), + ("OBJECT_BJI", "Bji", "Bji"), + ("OBJECT_BBA", "Bba", "Bba"), + ("OBJECT_GI_OCARINA_0", "Gi Ocarina 0", "Gi Ocarina 0"), + ("OBJECT_DS", "Ds", "Ds"), + ("OBJECT_ANE", "Ane", "Ane"), + ("OBJECT_BOJ", "Boj", "Boj"), + ("OBJECT_SPOT03_OBJECT", "Spot03 Object", "Spot03 Object"), + ("OBJECT_SPOT07_OBJECT", "Spot07 Object", "Spot07 Object"), + ("OBJECT_FZ", "Fz", "Fz"), + ("OBJECT_BOB", "Bob", "Bob"), + ("OBJECT_GE1", "Ge1", "Ge1"), + ("OBJECT_YABUSAME_POINT", "Yabusame Point", "Yabusame Point"), + ("OBJECT_GI_BOOTS_2", "Gi Boots 2", "Gi Boots 2"), + ("OBJECT_GI_SEED", "Gi Seed", "Gi Seed"), + ("OBJECT_GND_MAGIC", "Gnd Magic", "Gnd Magic"), + ("OBJECT_D_ELEVATOR", "D Elevator", "D Elevator"), + ("OBJECT_D_HSBLOCK", "D Hsblock", "D Hsblock"), + ("OBJECT_D_LIFT", "D Lift", "D Lift"), + ("OBJECT_MAMENOKI", "Mamenoki", "Mamenoki"), + ("OBJECT_GOROIWA", "Goroiwa", "Goroiwa"), + ("OBJECT_TORYO", "Toryo", "Toryo"), + ("OBJECT_DAIKU", "Daiku", "Daiku"), + ("OBJECT_NWC", "Nwc", "Nwc"), + ("OBJECT_BLKOBJ", "Blkobj", "Blkobj"), + ("OBJECT_GM", "Gm", "Gm"), + ("OBJECT_MS", "Ms", "Ms"), + ("OBJECT_HS", "Hs", "Hs"), + ("OBJECT_INGATE", "Ingate", "Ingate"), + ("OBJECT_LIGHTSWITCH", "Lightswitch", "Lightswitch"), + ("OBJECT_KUSA", "Kusa", "Kusa"), + ("OBJECT_TSUBO", "Tsubo", "Tsubo"), + ("OBJECT_GI_GLOVES", "Gi Gloves", "Gi Gloves"), + ("OBJECT_GI_COIN", "Gi Coin", "Gi Coin"), + ("OBJECT_KANBAN", "Kanban", "Kanban"), + ("OBJECT_GJYO_OBJECTS", "Gjyo Objects", "Gjyo Objects"), + ("OBJECT_OWL", "Owl", "Owl"), + ("OBJECT_MK", "Mk", "Mk"), + ("OBJECT_FU", "Fu", "Fu"), + ("OBJECT_GI_KI_TAN_MASK", "Gi Ki Tan Mask", "Gi Ki Tan Mask"), + ("OBJECT_GI_REDEAD_MASK", "Gi Redead Mask", "Gi Redead Mask"), + ("OBJECT_GI_SKJ_MASK", "Gi Skj Mask", "Gi Skj Mask"), + ("OBJECT_GI_RABIT_MASK", "Gi Rabit Mask", "Gi Rabit Mask"), + ("OBJECT_GI_TRUTH_MASK", "Gi Truth Mask", "Gi Truth Mask"), + ("OBJECT_GANON_OBJECTS", "Ganon Objects", "Ganon Objects"), + ("OBJECT_SIOFUKI", "Siofuki", "Siofuki"), + ("OBJECT_STREAM", "Stream", "Stream"), + ("OBJECT_MM", "Mm", "Mm"), + ("OBJECT_FA", "Fa", "Fa"), + ("OBJECT_OS", "Os", "Os"), + ("OBJECT_GI_EYE_LOTION", "Gi Eye Lotion", "Gi Eye Lotion"), + ("OBJECT_GI_POWDER", "Gi Powder", "Gi Powder"), + ("OBJECT_GI_MUSHROOM", "Gi Mushroom", "Gi Mushroom"), + ("OBJECT_GI_TICKETSTONE", "Gi Ticketstone", "Gi Ticketstone"), + ("OBJECT_GI_BROKENSWORD", "Gi Brokensword", "Gi Brokensword"), + ("OBJECT_JS", "Js", "Js"), + ("OBJECT_CS", "Cs", "Cs"), + ("OBJECT_GI_PRESCRIPTION", "Gi Prescription", "Gi Prescription"), + ("OBJECT_GI_BRACELET", "Gi Bracelet", "Gi Bracelet"), + ("OBJECT_GI_SOLDOUT", "Gi Soldout", "Gi Soldout"), + ("OBJECT_GI_FROG", "Gi Frog", "Gi Frog"), + ("OBJECT_MAG", "Mag", "Mag"), + ("OBJECT_DOOR_GERUDO", "Door Gerudo", "Door Gerudo"), + ("OBJECT_GT", "Gt", "Gt"), + ("OBJECT_EFC_ERUPC", "Efc Erupc", "Efc Erupc"), + ("OBJECT_ZL2_ANIME1", "Zl2 Anime1", "Zl2 Anime1"), + ("OBJECT_ZL2_ANIME2", "Zl2 Anime2", "Zl2 Anime2"), + ("OBJECT_GI_GOLONMASK", "Gi Golonmask", "Gi Golonmask"), + ("OBJECT_GI_ZORAMASK", "Gi Zoramask", "Gi Zoramask"), + ("OBJECT_GI_GERUDOMASK", "Gi Gerudomask", "Gi Gerudomask"), + ("OBJECT_GANON2", "Ganon2", "Ganon2"), + ("OBJECT_KA", "Ka", "Ka"), + ("OBJECT_TS", "Ts", "Ts"), + ("OBJECT_ZG", "Zg", "Zg"), + ("OBJECT_GI_HOVERBOOTS", "Gi Hoverboots", "Gi Hoverboots"), + ("OBJECT_GI_M_ARROW", "Gi M Arrow", "Gi M Arrow"), + ("OBJECT_DS2", "Ds2", "Ds2"), + ("OBJECT_EC", "Ec", "Ec"), + ("OBJECT_FISH", "Fish", "Fish"), + ("OBJECT_GI_SUTARU", "Gi Sutaru", "Gi Sutaru"), + ("OBJECT_GI_GODDESS", "Gi Goddess", "Gi Goddess"), + ("OBJECT_SSH", "Ssh", "Ssh"), + ("OBJECT_BIGOKUTA", "Bigokuta", "Bigokuta"), + ("OBJECT_BG", "Bg", "Bg"), + ("OBJECT_SPOT05_OBJECTS", "Spot05 Objects", "Spot05 Objects"), + ("OBJECT_SPOT12_OBJ", "Spot12 Obj", "Spot12 Obj"), + ("OBJECT_BOMBIWA", "Bombiwa", "Bombiwa"), + ("OBJECT_HINTNUTS", "Hintnuts", "Hintnuts"), + ("OBJECT_RS", "Rs", "Rs"), + ("OBJECT_SPOT00_BREAK", "Spot00 Break", "Spot00 Break"), + ("OBJECT_GLA", "Gla", "Gla"), + ("OBJECT_SHOPNUTS", "Shopnuts", "Shopnuts"), + ("OBJECT_GELDB", "Geldb", "Geldb"), + ("OBJECT_GR", "Gr", "Gr"), + ("OBJECT_DOG", "Dog", "Dog"), + ("OBJECT_JYA_IRON", "Jya Iron", "Jya Iron"), + ("OBJECT_JYA_DOOR", "Jya Door", "Jya Door"), + ("OBJECT_SPOT11_OBJ", "Spot11 Obj", "Spot11 Obj"), + ("OBJECT_KIBAKO2", "Kibako2", "Kibako2"), + ("OBJECT_DNS", "Dns", "Dns"), + ("OBJECT_DNK", "Dnk", "Dnk"), + ("OBJECT_GI_FIRE", "Gi Fire", "Gi Fire"), + ("OBJECT_GI_INSECT", "Gi Insect", "Gi Insect"), + ("OBJECT_GI_BUTTERFLY", "Gi Butterfly", "Gi Butterfly"), + ("OBJECT_GI_GHOST", "Gi Ghost", "Gi Ghost"), + ("OBJECT_GI_SOUL", "Gi Soul", "Gi Soul"), + ("OBJECT_BOWL", "Bowl", "Bowl"), + ("OBJECT_DEMO_KEKKAI", "Demo Kekkai", "Demo Kekkai"), + ("OBJECT_EFC_DOUGHNUT", "Efc Doughnut", "Efc Doughnut"), + ("OBJECT_GI_DEKUPOUCH", "Gi Dekupouch", "Gi Dekupouch"), + ("OBJECT_GANON_ANIME1", "Ganon Anime1", "Ganon Anime1"), + ("OBJECT_GANON_ANIME2", "Ganon Anime2", "Ganon Anime2"), + ("OBJECT_GANON_ANIME3", "Ganon Anime3", "Ganon Anime3"), + ("OBJECT_GI_RUPY", "Gi Rupy", "Gi Rupy"), + ("OBJECT_SPOT01_MATOYA", "Spot01 Matoya", "Spot01 Matoya"), + ("OBJECT_SPOT01_MATOYAB", "Spot01 Matoyab", "Spot01 Matoyab"), + ("OBJECT_MU", "Mu", "Mu"), + ("OBJECT_WF", "Wf", "Wf"), + ("OBJECT_SKB", "Skb", "Skb"), + ("OBJECT_GJ", "Gj", "Gj"), + ("OBJECT_GEFF", "Geff", "Geff"), + ("OBJECT_HAKA_DOOR", "Haka Door", "Haka Door"), + ("OBJECT_GS", "Gs", "Gs"), + ("OBJECT_PS", "Ps", "Ps"), + ("OBJECT_BWALL", "Bwall", "Bwall"), + ("OBJECT_COW", "Cow", "Cow"), + ("OBJECT_COB", "Cob", "Cob"), + ("OBJECT_GI_SWORD_1", "Gi Sword 1", "Gi Sword 1"), + ("OBJECT_DOOR_KILLER", "Door Killer", "Door Killer"), + ("OBJECT_OUKE_HAKA", "Ouke Haka", "Ouke Haka"), + ("OBJECT_TIMEBLOCK", "Timeblock", "Timeblock"), ] ootEnumGlobalObject = [ - ("Custom", "Custom", "Custom"), - ("0x0000", "None", "None"), - ("0x0002", "Overworld", "gameplay_field_keep"), - ("0x0003", "Dungeon", "gameplay_dangeon_keep"), + ("Custom", "Custom", "Custom"), + ("0x0000", "None", "None"), + ("0x0002", "Overworld", "gameplay_field_keep"), + ("0x0003", "Dungeon", "gameplay_dangeon_keep"), ] ootEnumNaviHints = [ - ("Custom", "Custom", "Custom"), - ("0x00", "None", "None"), - ("0x01", "Overworld", "elf_message_field"), - ("0x02", "Dungeon", "elf_message_ydan"), + ("Custom", "Custom", "Custom"), + ("0x00", "None", "None"), + ("0x01", "Overworld", "elf_message_field"), + ("0x02", "Dungeon", "elf_message_ydan"), ] ootEnumTransitionAnims = [ - ("Custom", "Custom", "Custom"), - ("0x00", "Spiky", "Spiky"), - ("0x01", "Triforce", "Triforce"), - ("0x02", "Slow Black Fade", "Slow Black Fade"), - ("0x03", "Slow Day/White, Slow Night/Black Fade", "Slow Day/White, Slow Night/Black Fade"), - ("0x04", "Fast Day/Black, Slow Night/Black Fade", "Fast Day/Black, Slow Night/Black Fade"), - ("0x05", "Fast Day/White, Slow Night/Black Fade", "Fast Day/White, Slow Night/Black Fade"), - ("0x06", "Very Slow Day/White, Slow Night/Black Fade", "Very Slow Day/White, Slow Night/Black Fade"), - ("0x07", "Very Slow Day/White, Slow Night/Black Fade", "Very Slow Day/White, Slow Night/Black Fade"), - ("0x0E", "Slow Sandstorm Fade", "Slow Sandstorm Fade"), - ("0x0F", "Fast Sandstorm Fade", "Fast Sandstorm Fade"), - ("0x20", "Iris Fade", "Iris Fade"), - ("0x2C", "Shortcut Transition", "Shortcut Transition"), + ("Custom", "Custom", "Custom"), + ("0x00", "Spiky", "Spiky"), + ("0x01", "Triforce", "Triforce"), + ("0x02", "Slow Black Fade", "Slow Black Fade"), + ( + "0x03", + "Slow Day/White, Slow Night/Black Fade", + "Slow Day/White, Slow Night/Black Fade", + ), + ( + "0x04", + "Fast Day/Black, Slow Night/Black Fade", + "Fast Day/Black, Slow Night/Black Fade", + ), + ( + "0x05", + "Fast Day/White, Slow Night/Black Fade", + "Fast Day/White, Slow Night/Black Fade", + ), + ( + "0x06", + "Very Slow Day/White, Slow Night/Black Fade", + "Very Slow Day/White, Slow Night/Black Fade", + ), + ( + "0x07", + "Very Slow Day/White, Slow Night/Black Fade", + "Very Slow Day/White, Slow Night/Black Fade", + ), + ("0x0E", "Slow Sandstorm Fade", "Slow Sandstorm Fade"), + ("0x0F", "Fast Sandstorm Fade", "Fast Sandstorm Fade"), + ("0x20", "Iris Fade", "Iris Fade"), + ("0x2C", "Shortcut Transition", "Shortcut Transition"), ] ootEnumSceneID = [ - ("Custom", "Custom", "Custom"), - ("SCENE_YDAN", "Inside the Deku Tree (Ydan)", "Ydan"), - ("SCENE_DDAN", "Dodongo's Cavern (Ddan)", "Ddan"), - ("SCENE_BDAN", "Inside Jabu Jabu's Belly (Bdan)", "Bdan"), - ("SCENE_BMORI1", "Forest Temple (Bmori1)", "Bmori1"), - ("SCENE_HIDAN", "Fire Temple (Hidan)", "Hidan"), - ("SCENE_MIZUSIN", "Water Temple (Mizusin)", "Mizusin"), - ("SCENE_JYASINZOU", "Spirit Temple (Jyasinzou)", "Jyasinzou"), - ("SCENE_HAKADAN", "Shadow Temple (Hakadan)", "Hakadan"), - ("SCENE_HAKADANCH", "Bottom of the Well (Hakadanch)", "Hakadanch"), - ("SCENE_ICE_DOUKUTO", "Ice Cavern (Ice Doukuto)", "Ice Doukuto"), - ("SCENE_GANON", "Ganon's Tower (Ganon)", "Ganon"), - ("SCENE_MEN", "Gerudo Training Ground (Men)", "Men"), - ("SCENE_GERUDOWAY", "Thieves' Hideout (Gerudoway)", "Gerudoway"), - ("SCENE_GANONTIKA", "Inside Ganon's Castle (Ganontika)", "Ganontika"), - ("SCENE_GANON_SONOGO", "Ganon's Tower (Collapsing) (Ganon Sonogo)", "Ganon Sonogo"), - ("SCENE_GANONTIKA_SONOGO", "Inside Ganon's Castle (Collapsing) (Ganontika Sonogo)", "Ganontika Sonogo"), - ("SCENE_TAKARAYA", "Treasure Chest Shop (Takaraya)", "Takaraya"), - ("SCENE_YDAN_BOSS", "Gohma's Lair (Ydan Boss)", "Ydan Boss"), - ("SCENE_DDAN_BOSS", "King Dodongo's Lair (Ddan Boss)", "Ddan Boss"), - ("SCENE_BDAN_BOSS", "Barinade's Lair (Bdan Boss)", "Bdan Boss"), - ("SCENE_MORIBOSSROOM", "Phantom Ganon's Lair (Moribossroom)", "Moribossroom"), - ("SCENE_FIRE_BS", "Volvagia's Lair (Fire Bs)", "Fire Bs"), - ("SCENE_MIZUSIN_BS", "Morpha's Lair (Mizusin Bs)", "Mizusin Bs"), - ("SCENE_JYASINBOSS", "Twinrova's Lair & Iron Knuckle Mini-Boss Room (Jyasinboss)", "Jyasinboss"), - ("SCENE_HAKADAN_BS", "Bongo Bongo's Lair (Hakadan Bs)", "Hakadan Bs"), - ("SCENE_GANON_BOSS", "Ganondorf's Lair (Ganon Boss)", "Ganon Boss"), - ("SCENE_GANON_FINAL", "Ganondorf's Death Scene (Tower Escape Exterior) (Ganon Final)", "Ganon Final"), - ("SCENE_ENTRA", "Market Entrance (Child - Day) (Entra)", "Entra"), - ("SCENE_ENTRA_N", "Market Entrance (Child - Night) (Entra N)", "Entra N"), - ("SCENE_ENRUI", "Market Entrance (Ruins) (Enrui)", "Enrui"), - ("SCENE_MARKET_ALLEY", "Back Alley (Day) (Market Alley)", "Market Alley"), - ("SCENE_MARKET_ALLEY_N", "Back Alley (Night) (Market Alley N)", "Market Alley N"), - ("SCENE_MARKET_DAY", "Market (Child - Day) (Market Day)", "Market Day"), - ("SCENE_MARKET_NIGHT", "Market (Child - Night) (Market Night)", "Market Night"), - ("SCENE_MARKET_RUINS", "Market (Ruins) (Market Ruins)", "Market Ruins"), - ("SCENE_SHRINE", "Temple of Time Exterior (Day) (Shrine)", "Shrine"), - ("SCENE_SHRINE_N", "Temple of Time Exterior (Night) (Shrine N)", "Shrine N"), - ("SCENE_SHRINE_R", "Temple of Time Exterior (Ruins) (Shrine R)", "Shrine R"), - ("SCENE_KOKIRI_HOME", "Know-It-All Brothers' House (Kokiri Home)", "Kokiri Home"), - ("SCENE_KOKIRI_HOME3", "Twins' House (Kokiri Home3)", "Kokiri Home3"), - ("SCENE_KOKIRI_HOME4", "Mido's House (Kokiri Home4)", "Kokiri Home4"), - ("SCENE_KOKIRI_HOME5", "Saria's House (Kokiri Home5)", "Kokiri Home5"), - ("SCENE_KAKARIKO", "Carpenter Boss's House (Kakariko)", "Kakariko"), - ("SCENE_KAKARIKO3", "Back Alley House (Man in Green) (Kakariko3)", "Kakariko3"), - ("SCENE_SHOP1", "Bazaar (Shop1)", "Shop1"), - ("SCENE_KOKIRI_SHOP", "Kokiri Shop (Kokiri Shop)", "Kokiri Shop"), - ("SCENE_GOLON", "Goron Shop (Golon)", "Golon"), - ("SCENE_ZOORA", "Zora Shop (Zoora)", "Zoora"), - ("SCENE_DRAG", "Kakariko Potion Shop (Drag)", "Drag"), - ("SCENE_ALLEY_SHOP", "Market Potion Shop (Alley Shop)", "Alley Shop"), - ("SCENE_NIGHT_SHOP", "Bombchu Shop (Night Shop)", "Night Shop"), - ("SCENE_FACE_SHOP", "Happy Mask Shop (Face Shop)", "Face Shop"), - ("SCENE_LINK_HOME", "Link's House (Link Home)", "Link Home"), - ("SCENE_IMPA", "Back Alley House (Dog Lady) (Impa)", "Impa"), - ("SCENE_MALON_STABLE", "Stable (Malon Stable)", "Malon Stable"), - ("SCENE_LABO", "Impa's House (Labo)", "Labo"), - ("SCENE_HYLIA_LABO", "Lakeside Laboratory (Hylia Labo)", "Hylia Labo"), - ("SCENE_TENT", "Carpenters' Tent (Tent)", "Tent"), - ("SCENE_HUT", "Gravekeeper's Hut (Hut)", "Hut"), - ("SCENE_DAIYOUSEI_IZUMI", "Great Fairy's Fountain (Upgrades) (Daiyousei Izumi)", "Daiyousei Izumi"), - ("SCENE_YOUSEI_IZUMI_TATE", "Fairy's Fountain (Healing Fairies) (Yousei Izumi Tate)", "Yousei Izumi Tate"), - ("SCENE_YOUSEI_IZUMI_YOKO", "Great Fairy's Fountain (Spells) (Yousei Izumi Yoko)", "Yousei Izumi Yoko"), - ("SCENE_KAKUSIANA", "Grottos (Kakusiana)", "Kakusiana"), - ("SCENE_HAKAANA", "Grave (Redead) (Hakaana)", "Hakaana"), - ("SCENE_HAKAANA2", "Grave (Fairy's Fountain) (Hakaana2)", "Hakaana2"), - ("SCENE_HAKAANA_OUKE", "Royal Family's Tomb (Hakaana Ouke)", "Hakaana Ouke"), - ("SCENE_SYATEKIJYOU", "Shooting Gallery (Syatekijyou)", "Syatekijyou"), - ("SCENE_TOKINOMA", "Temple of Time (Tokinoma)", "Tokinoma"), - ("SCENE_KENJYANOMA", "Chamber of the Sages (Kenjyanoma)", "Kenjyanoma"), - ("SCENE_HAIRAL_NIWA", "Castle Hedge Maze (Day) (Hairal Niwa)", "Hairal Niwa"), - ("SCENE_HAIRAL_NIWA_N", "Castle Hedge Maze (Night) (Hairal Niwa N)", "Hairal Niwa N"), - ("SCENE_HIRAL_DEMO", "Cutscene Map (Hiral Demo)", "Hiral Demo"), - ("SCENE_HAKASITARELAY", "Dampé's Grave & Windmill (Hakasitarelay)", "Hakasitarelay"), - ("SCENE_TURIBORI", "Fishing Pond (Turibori)", "Turibori"), - ("SCENE_NAKANIWA", "Castle Courtyard (Nakaniwa)", "Nakaniwa"), - ("SCENE_BOWLING", "Bombchu Bowling Alley (Bowling)", "Bowling"), - ("SCENE_SOUKO", "Lon Lon Ranch House & Tower (Souko)", "Souko"), - ("SCENE_MIHARIGOYA", "Guard House (Miharigoya)", "Miharigoya"), - ("SCENE_MAHOUYA", "Granny's Potion Shop (Mahouya)", "Mahouya"), - ("SCENE_GANON_DEMO", "Ganon's Tower Collapse & Battle Arena (Ganon Demo)", "Ganon Demo"), - ("SCENE_KINSUTA", "House of Skulltula (Kinsuta)", "Kinsuta"), - ("SCENE_SPOT00", "Hyrule Field (Spot00)", "Spot00"), - ("SCENE_SPOT01", "Kakariko Village (Spot01)", "Spot01"), - ("SCENE_SPOT02", "Graveyard (Spot02)", "Spot02"), - ("SCENE_SPOT03", "Zora's River (Spot03)", "Spot03"), - ("SCENE_SPOT04", "Kokiri Forest (Spot04)", "Spot04"), - ("SCENE_SPOT05", "Sacred Forest Meadow (Spot05)", "Spot05"), - ("SCENE_SPOT06", "Lake Hylia (Spot06)", "Spot06"), - ("SCENE_SPOT07", "Zora's Domain (Spot07)", "Spot07"), - ("SCENE_SPOT08", "Zora's Fountain (Spot08)", "Spot08"), - ("SCENE_SPOT09", "Gerudo Valley (Spot09)", "Spot09"), - ("SCENE_SPOT10", "Lost Woods (Spot10)", "Spot10"), - ("SCENE_SPOT11", "Desert Colossus (Spot11)", "Spot11"), - ("SCENE_SPOT12", "Gerudo's Fortress (Spot12)", "Spot12"), - ("SCENE_SPOT13", "Haunted Wasteland (Spot13)", "Spot13"), - ("SCENE_SPOT15", "Hyrule Castle (Spot15)", "Spot15"), - ("SCENE_SPOT16", "Death Mountain Trail (Spot16)", "Spot16"), - ("SCENE_SPOT17", "Death Mountain Crater (Spot17)", "Spot17"), - ("SCENE_SPOT18", "Goron City (Spot18)", "Spot18"), - ("SCENE_SPOT20", "Lon Lon Ranch (Spot20)", "Spot20"), - ("SCENE_GANON_TOU", "Ganon's Castle Exterior (Ganon Tou)", "Ganon Tou"), - ("SCENE_TEST01", "Jungle Gym (Test01)", "Test01"), - ("SCENE_BESITU", "Ganandorf Test Room (Besitu)", "Besitu"), - ("SCENE_DEPTH_TEST", "Depth Test (Depth Test)", "Depth Test"), - ("SCENE_SYOTES", "Stalfos Mini-Boss Room (Syotes)", "Syotes"), - ("SCENE_SYOTES2", "Stalfos Boss ROom (Syotes2)", "Syotes2"), - ("SCENE_SUTARU", "Sutaru (Sutaru)", "Sutaru"), - ("SCENE_HAIRAL_NIWA2", "Castle Hedge Maze (Early) (Hairal Niwa2)", "Hairal Niwa2"), - ("SCENE_SASATEST", "Sasatest (Sasatest)", "Sasatest"), - ("SCENE_TESTROOM", "Treasure Chest Room (Testroom)", "Testroom"), + ("Custom", "Custom", "Custom"), + ("SCENE_YDAN", "Inside the Deku Tree (Ydan)", "Ydan"), + ("SCENE_DDAN", "Dodongo's Cavern (Ddan)", "Ddan"), + ("SCENE_BDAN", "Inside Jabu Jabu's Belly (Bdan)", "Bdan"), + ("SCENE_BMORI1", "Forest Temple (Bmori1)", "Bmori1"), + ("SCENE_HIDAN", "Fire Temple (Hidan)", "Hidan"), + ("SCENE_MIZUSIN", "Water Temple (Mizusin)", "Mizusin"), + ("SCENE_JYASINZOU", "Spirit Temple (Jyasinzou)", "Jyasinzou"), + ("SCENE_HAKADAN", "Shadow Temple (Hakadan)", "Hakadan"), + ("SCENE_HAKADANCH", "Bottom of the Well (Hakadanch)", "Hakadanch"), + ("SCENE_ICE_DOUKUTO", "Ice Cavern (Ice Doukuto)", "Ice Doukuto"), + ("SCENE_GANON", "Ganon's Tower (Ganon)", "Ganon"), + ("SCENE_MEN", "Gerudo Training Ground (Men)", "Men"), + ("SCENE_GERUDOWAY", "Thieves' Hideout (Gerudoway)", "Gerudoway"), + ("SCENE_GANONTIKA", "Inside Ganon's Castle (Ganontika)", "Ganontika"), + ("SCENE_GANON_SONOGO", "Ganon's Tower (Collapsing) (Ganon Sonogo)", "Ganon Sonogo"), + ( + "SCENE_GANONTIKA_SONOGO", + "Inside Ganon's Castle (Collapsing) (Ganontika Sonogo)", + "Ganontika Sonogo", + ), + ("SCENE_TAKARAYA", "Treasure Chest Shop (Takaraya)", "Takaraya"), + ("SCENE_YDAN_BOSS", "Gohma's Lair (Ydan Boss)", "Ydan Boss"), + ("SCENE_DDAN_BOSS", "King Dodongo's Lair (Ddan Boss)", "Ddan Boss"), + ("SCENE_BDAN_BOSS", "Barinade's Lair (Bdan Boss)", "Bdan Boss"), + ("SCENE_MORIBOSSROOM", "Phantom Ganon's Lair (Moribossroom)", "Moribossroom"), + ("SCENE_FIRE_BS", "Volvagia's Lair (Fire Bs)", "Fire Bs"), + ("SCENE_MIZUSIN_BS", "Morpha's Lair (Mizusin Bs)", "Mizusin Bs"), + ( + "SCENE_JYASINBOSS", + "Twinrova's Lair & Iron Knuckle Mini-Boss Room (Jyasinboss)", + "Jyasinboss", + ), + ("SCENE_HAKADAN_BS", "Bongo Bongo's Lair (Hakadan Bs)", "Hakadan Bs"), + ("SCENE_GANON_BOSS", "Ganondorf's Lair (Ganon Boss)", "Ganon Boss"), + ( + "SCENE_GANON_FINAL", + "Ganondorf's Death Scene (Tower Escape Exterior) (Ganon Final)", + "Ganon Final", + ), + ("SCENE_ENTRA", "Market Entrance (Child - Day) (Entra)", "Entra"), + ("SCENE_ENTRA_N", "Market Entrance (Child - Night) (Entra N)", "Entra N"), + ("SCENE_ENRUI", "Market Entrance (Ruins) (Enrui)", "Enrui"), + ("SCENE_MARKET_ALLEY", "Back Alley (Day) (Market Alley)", "Market Alley"), + ("SCENE_MARKET_ALLEY_N", "Back Alley (Night) (Market Alley N)", "Market Alley N"), + ("SCENE_MARKET_DAY", "Market (Child - Day) (Market Day)", "Market Day"), + ("SCENE_MARKET_NIGHT", "Market (Child - Night) (Market Night)", "Market Night"), + ("SCENE_MARKET_RUINS", "Market (Ruins) (Market Ruins)", "Market Ruins"), + ("SCENE_SHRINE", "Temple of Time Exterior (Day) (Shrine)", "Shrine"), + ("SCENE_SHRINE_N", "Temple of Time Exterior (Night) (Shrine N)", "Shrine N"), + ("SCENE_SHRINE_R", "Temple of Time Exterior (Ruins) (Shrine R)", "Shrine R"), + ("SCENE_KOKIRI_HOME", "Know-It-All Brothers' House (Kokiri Home)", "Kokiri Home"), + ("SCENE_KOKIRI_HOME3", "Twins' House (Kokiri Home3)", "Kokiri Home3"), + ("SCENE_KOKIRI_HOME4", "Mido's House (Kokiri Home4)", "Kokiri Home4"), + ("SCENE_KOKIRI_HOME5", "Saria's House (Kokiri Home5)", "Kokiri Home5"), + ("SCENE_KAKARIKO", "Carpenter Boss's House (Kakariko)", "Kakariko"), + ("SCENE_KAKARIKO3", "Back Alley House (Man in Green) (Kakariko3)", "Kakariko3"), + ("SCENE_SHOP1", "Bazaar (Shop1)", "Shop1"), + ("SCENE_KOKIRI_SHOP", "Kokiri Shop (Kokiri Shop)", "Kokiri Shop"), + ("SCENE_GOLON", "Goron Shop (Golon)", "Golon"), + ("SCENE_ZOORA", "Zora Shop (Zoora)", "Zoora"), + ("SCENE_DRAG", "Kakariko Potion Shop (Drag)", "Drag"), + ("SCENE_ALLEY_SHOP", "Market Potion Shop (Alley Shop)", "Alley Shop"), + ("SCENE_NIGHT_SHOP", "Bombchu Shop (Night Shop)", "Night Shop"), + ("SCENE_FACE_SHOP", "Happy Mask Shop (Face Shop)", "Face Shop"), + ("SCENE_LINK_HOME", "Link's House (Link Home)", "Link Home"), + ("SCENE_IMPA", "Back Alley House (Dog Lady) (Impa)", "Impa"), + ("SCENE_MALON_STABLE", "Stable (Malon Stable)", "Malon Stable"), + ("SCENE_LABO", "Impa's House (Labo)", "Labo"), + ("SCENE_HYLIA_LABO", "Lakeside Laboratory (Hylia Labo)", "Hylia Labo"), + ("SCENE_TENT", "Carpenters' Tent (Tent)", "Tent"), + ("SCENE_HUT", "Gravekeeper's Hut (Hut)", "Hut"), + ( + "SCENE_DAIYOUSEI_IZUMI", + "Great Fairy's Fountain (Upgrades) (Daiyousei Izumi)", + "Daiyousei Izumi", + ), + ( + "SCENE_YOUSEI_IZUMI_TATE", + "Fairy's Fountain (Healing Fairies) (Yousei Izumi Tate)", + "Yousei Izumi Tate", + ), + ( + "SCENE_YOUSEI_IZUMI_YOKO", + "Great Fairy's Fountain (Spells) (Yousei Izumi Yoko)", + "Yousei Izumi Yoko", + ), + ("SCENE_KAKUSIANA", "Grottos (Kakusiana)", "Kakusiana"), + ("SCENE_HAKAANA", "Grave (Redead) (Hakaana)", "Hakaana"), + ("SCENE_HAKAANA2", "Grave (Fairy's Fountain) (Hakaana2)", "Hakaana2"), + ("SCENE_HAKAANA_OUKE", "Royal Family's Tomb (Hakaana Ouke)", "Hakaana Ouke"), + ("SCENE_SYATEKIJYOU", "Shooting Gallery (Syatekijyou)", "Syatekijyou"), + ("SCENE_TOKINOMA", "Temple of Time (Tokinoma)", "Tokinoma"), + ("SCENE_KENJYANOMA", "Chamber of the Sages (Kenjyanoma)", "Kenjyanoma"), + ("SCENE_HAIRAL_NIWA", "Castle Hedge Maze (Day) (Hairal Niwa)", "Hairal Niwa"), + ( + "SCENE_HAIRAL_NIWA_N", + "Castle Hedge Maze (Night) (Hairal Niwa N)", + "Hairal Niwa N", + ), + ("SCENE_HIRAL_DEMO", "Cutscene Map (Hiral Demo)", "Hiral Demo"), + ( + "SCENE_HAKASITARELAY", + "Dampé's Grave & Windmill (Hakasitarelay)", + "Hakasitarelay", + ), + ("SCENE_TURIBORI", "Fishing Pond (Turibori)", "Turibori"), + ("SCENE_NAKANIWA", "Castle Courtyard (Nakaniwa)", "Nakaniwa"), + ("SCENE_BOWLING", "Bombchu Bowling Alley (Bowling)", "Bowling"), + ("SCENE_SOUKO", "Lon Lon Ranch House & Tower (Souko)", "Souko"), + ("SCENE_MIHARIGOYA", "Guard House (Miharigoya)", "Miharigoya"), + ("SCENE_MAHOUYA", "Granny's Potion Shop (Mahouya)", "Mahouya"), + ( + "SCENE_GANON_DEMO", + "Ganon's Tower Collapse & Battle Arena (Ganon Demo)", + "Ganon Demo", + ), + ("SCENE_KINSUTA", "House of Skulltula (Kinsuta)", "Kinsuta"), + ("SCENE_SPOT00", "Hyrule Field (Spot00)", "Spot00"), + ("SCENE_SPOT01", "Kakariko Village (Spot01)", "Spot01"), + ("SCENE_SPOT02", "Graveyard (Spot02)", "Spot02"), + ("SCENE_SPOT03", "Zora's River (Spot03)", "Spot03"), + ("SCENE_SPOT04", "Kokiri Forest (Spot04)", "Spot04"), + ("SCENE_SPOT05", "Sacred Forest Meadow (Spot05)", "Spot05"), + ("SCENE_SPOT06", "Lake Hylia (Spot06)", "Spot06"), + ("SCENE_SPOT07", "Zora's Domain (Spot07)", "Spot07"), + ("SCENE_SPOT08", "Zora's Fountain (Spot08)", "Spot08"), + ("SCENE_SPOT09", "Gerudo Valley (Spot09)", "Spot09"), + ("SCENE_SPOT10", "Lost Woods (Spot10)", "Spot10"), + ("SCENE_SPOT11", "Desert Colossus (Spot11)", "Spot11"), + ("SCENE_SPOT12", "Gerudo's Fortress (Spot12)", "Spot12"), + ("SCENE_SPOT13", "Haunted Wasteland (Spot13)", "Spot13"), + ("SCENE_SPOT15", "Hyrule Castle (Spot15)", "Spot15"), + ("SCENE_SPOT16", "Death Mountain Trail (Spot16)", "Spot16"), + ("SCENE_SPOT17", "Death Mountain Crater (Spot17)", "Spot17"), + ("SCENE_SPOT18", "Goron City (Spot18)", "Spot18"), + ("SCENE_SPOT20", "Lon Lon Ranch (Spot20)", "Spot20"), + ("SCENE_GANON_TOU", "Ganon's Castle Exterior (Ganon Tou)", "Ganon Tou"), + ("SCENE_TEST01", "Jungle Gym (Test01)", "Test01"), + ("SCENE_BESITU", "Ganandorf Test Room (Besitu)", "Besitu"), + ("SCENE_DEPTH_TEST", "Depth Test (Depth Test)", "Depth Test"), + ("SCENE_SYOTES", "Stalfos Mini-Boss Room (Syotes)", "Syotes"), + ("SCENE_SYOTES2", "Stalfos Boss ROom (Syotes2)", "Syotes2"), + ("SCENE_SUTARU", "Sutaru (Sutaru)", "Sutaru"), + ("SCENE_HAIRAL_NIWA2", "Castle Hedge Maze (Early) (Hairal Niwa2)", "Hairal Niwa2"), + ("SCENE_SASATEST", "Sasatest (Sasatest)", "Sasatest"), + ("SCENE_TESTROOM", "Treasure Chest Room (Testroom)", "Testroom"), ] ootSceneIDToName = { - "SCENE_BDAN" : "bdan", - "SCENE_BDAN_BOSS" : "bdan_boss", - "SCENE_BMORI1" : "Bmori1", - "SCENE_DDAN" : "ddan", - "SCENE_DDAN_BOSS" : "ddan_boss", - "SCENE_FIRE_BS" : "FIRE_bs", - "SCENE_GANON" : "ganon", - "SCENE_GANONTIKA" : "ganontika", - "SCENE_GANONTIKASONOGO" : "ganontikasonogo", - "SCENE_GANON_BOSS" : "ganon_boss", - "SCENE_GANON_DEMO" : "ganon_demo", - "SCENE_GANON_FINAL" : "ganon_final", - "SCENE_GANON_SONOGO" : "ganon_sonogo", - "SCENE_GANON_TOU" : "ganon_tou", - "SCENE_GERUDOWAY" : "gerudoway", - "SCENE_HAKADAN" : "HAKAdan", - "SCENE_HAKADANCH" : "HAKAdanCH", - "SCENE_HAKADAN_BS" : "HAKAdan_bs", - "SCENE_HIDAN" : "HIDAN", - "SCENE_ICE_DOUKUTU" : "ice_doukutu", - "SCENE_JYASINBOSS" : "jyasinboss", - "SCENE_JYASINZOU" : "jyasinzou", - "SCENE_MEN" : "men", - "SCENE_MIZUSIN" : "MIZUsin", - "SCENE_MIZUSIN_BS" : "MIZUsin_bs", - "SCENE_MORIBOSSROOM" : "moribossroom", - "SCENE_YDAN" : "ydan", - "SCENE_YDAN_BOSS" : "ydan_boss", - "SCENE_BOWLING" : "bowling", - "SCENE_DAIYOUSEI_IZUMI" : "daiyousei_izumi", - "SCENE_HAIRAL_NIWA" : "hairal_niwa", - "SCENE_HAIRAL_NIWA2" : "hairal_niwa2", - "SCENE_HAIRAL_NIWA_N" : "hairal_niwa_n", - "SCENE_HAKASITARELAY" : "hakasitarelay", - "SCENE_HUT" : "hut", - "SCENE_HYLIA_LABO" : "hylia_labo", - "SCENE_IMPA" : "impa", - "SCENE_KAKARIKO" : "kakariko", - "SCENE_KENJYANOMA" : "kenjyanoma", - "SCENE_KOKIRI_HOME" : "kokiri_home", - "SCENE_KOKIRI_HOME3" : "kokiri_home3", - "SCENE_KOKIRI_HOME4" : "kokiri_home4", - "SCENE_KOKIRI_HOME5" : "kokiri_home5", - "SCENE_LABO" : "labo", - "SCENE_LINK_HOME" : "link_home", - "SCENE_MAHOUYA" : "mahouya", - "SCENE_MALON_STABLE" : "malon_stable", - "SCENE_MIHARIGOYA" : "miharigoya", - "SCENE_NAKANIWA" : "nakaniwa", - "SCENE_SYATEKIJYOU" : "syatekijyou", - "SCENE_TAKARAYA" : "takaraya", - "SCENE_TENT" : "tent", - "SCENE_TOKINOMA" : "tokinoma", - "SCENE_YOUSEI_IZUMI_TATE" : "yousei_izumi_tate", - "SCENE_YOUSEI_IZUMI_YOKO" : "yousei_izumi_yoko", - "SCENE_ENRUI" : "enrui", - "SCENE_ENTRA_N" : "entra_n", - "SCENE_HAKAANA" : "hakaana", - "SCENE_HAKAANA2" : "hakaana2", - "SCENE_HAKAANA_OUKE" : "hakaana_ouke", - "SCENE_HIRAL_DEMO" : "hiral_demo", - "SCENE_KAKARIKO3" : "kakariko3", - "SCENE_KAKUSIANA" : "kakusiana", - "SCENE_KINSUTA" : "kinsuta", - "SCENE_MARKET_ALLEY" : "market_alley", - "SCENE_MARKET_ALLEY_N" : "market_alley_n", - "SCENE_MARKET_DAY" : "market_day", - "SCENE_MARKET_NIGHT" : "market_night", - "SCENE_MARKET_RUINS" : "market_ruins", - "SCENE_SHRINE" : "shrine", - "SCENE_SHRINE_N" : "shrine_n", - "SCENE_SHRINE_R" : "shrine_r", - "SCENE_TURIBORI" : "turibori", - "SCENE_ENTRA" : "entra", - "SCENE_SOUKO" : "souko", - "SCENE_SPOT00" : "spot00", - "SCENE_SPOT01" : "spot01", - "SCENE_SPOT02" : "spot02", - "SCENE_SPOT03" : "spot03", - "SCENE_SPOT04" : "spot04", - "SCENE_SPOT05" : "spot05", - "SCENE_SPOT06" : "spot06", - "SCENE_SPOT07" : "spot07", - "SCENE_SPOT08" : "spot08", - "SCENE_SPOT09" : "spot09", - "SCENE_SPOT10" : "spot10", - "SCENE_SPOT11" : "spot11", - "SCENE_SPOT12" : "spot12", - "SCENE_SPOT13" : "spot13", - "SCENE_SPOT15" : "spot15", - "SCENE_SPOT16" : "spot16", - "SCENE_SPOT17" : "spot17", - "SCENE_SPOT18" : "spot18", - "SCENE_SPOT20" : "spot20", - "SCENE_ALLEY_SHOP" : "alley_shop", - "SCENE_DRAG" : "drag", - "SCENE_FACE_SHOP" : "face_shop", - "SCENE_GOLON" : "golon", - "SCENE_KOKIRI_SHOP" : "kokiri_shop", - "SCENE_NIGHT_SHOP" : "night_shop", - "SCENE_SHOP1" : "shop1", - "SCENE_ZOORA" : "zoora", - "SCENE_BESITU" : "besitu", - "SCENE_DEPTH_TEST" : "depth_test", - "SCENE_SASATEST" : "sasatest", - "SCENE_SUTARU" : "sutaru", - "SCENE_SYOTES" : "syotes", - "SCENE_SYOTES2" : "syotes2", - "SCENE_TEST01" : "test01", - "SCENE_TESTROOM" : "testroom", + "SCENE_BDAN": "bdan", + "SCENE_BDAN_BOSS": "bdan_boss", + "SCENE_BMORI1": "Bmori1", + "SCENE_DDAN": "ddan", + "SCENE_DDAN_BOSS": "ddan_boss", + "SCENE_FIRE_BS": "FIRE_bs", + "SCENE_GANON": "ganon", + "SCENE_GANONTIKA": "ganontika", + "SCENE_GANONTIKASONOGO": "ganontikasonogo", + "SCENE_GANON_BOSS": "ganon_boss", + "SCENE_GANON_DEMO": "ganon_demo", + "SCENE_GANON_FINAL": "ganon_final", + "SCENE_GANON_SONOGO": "ganon_sonogo", + "SCENE_GANON_TOU": "ganon_tou", + "SCENE_GERUDOWAY": "gerudoway", + "SCENE_HAKADAN": "HAKAdan", + "SCENE_HAKADANCH": "HAKAdanCH", + "SCENE_HAKADAN_BS": "HAKAdan_bs", + "SCENE_HIDAN": "HIDAN", + "SCENE_ICE_DOUKUTU": "ice_doukutu", + "SCENE_JYASINBOSS": "jyasinboss", + "SCENE_JYASINZOU": "jyasinzou", + "SCENE_MEN": "men", + "SCENE_MIZUSIN": "MIZUsin", + "SCENE_MIZUSIN_BS": "MIZUsin_bs", + "SCENE_MORIBOSSROOM": "moribossroom", + "SCENE_YDAN": "ydan", + "SCENE_YDAN_BOSS": "ydan_boss", + "SCENE_BOWLING": "bowling", + "SCENE_DAIYOUSEI_IZUMI": "daiyousei_izumi", + "SCENE_HAIRAL_NIWA": "hairal_niwa", + "SCENE_HAIRAL_NIWA2": "hairal_niwa2", + "SCENE_HAIRAL_NIWA_N": "hairal_niwa_n", + "SCENE_HAKASITARELAY": "hakasitarelay", + "SCENE_HUT": "hut", + "SCENE_HYLIA_LABO": "hylia_labo", + "SCENE_IMPA": "impa", + "SCENE_KAKARIKO": "kakariko", + "SCENE_KENJYANOMA": "kenjyanoma", + "SCENE_KOKIRI_HOME": "kokiri_home", + "SCENE_KOKIRI_HOME3": "kokiri_home3", + "SCENE_KOKIRI_HOME4": "kokiri_home4", + "SCENE_KOKIRI_HOME5": "kokiri_home5", + "SCENE_LABO": "labo", + "SCENE_LINK_HOME": "link_home", + "SCENE_MAHOUYA": "mahouya", + "SCENE_MALON_STABLE": "malon_stable", + "SCENE_MIHARIGOYA": "miharigoya", + "SCENE_NAKANIWA": "nakaniwa", + "SCENE_SYATEKIJYOU": "syatekijyou", + "SCENE_TAKARAYA": "takaraya", + "SCENE_TENT": "tent", + "SCENE_TOKINOMA": "tokinoma", + "SCENE_YOUSEI_IZUMI_TATE": "yousei_izumi_tate", + "SCENE_YOUSEI_IZUMI_YOKO": "yousei_izumi_yoko", + "SCENE_ENRUI": "enrui", + "SCENE_ENTRA_N": "entra_n", + "SCENE_HAKAANA": "hakaana", + "SCENE_HAKAANA2": "hakaana2", + "SCENE_HAKAANA_OUKE": "hakaana_ouke", + "SCENE_HIRAL_DEMO": "hiral_demo", + "SCENE_KAKARIKO3": "kakariko3", + "SCENE_KAKUSIANA": "kakusiana", + "SCENE_KINSUTA": "kinsuta", + "SCENE_MARKET_ALLEY": "market_alley", + "SCENE_MARKET_ALLEY_N": "market_alley_n", + "SCENE_MARKET_DAY": "market_day", + "SCENE_MARKET_NIGHT": "market_night", + "SCENE_MARKET_RUINS": "market_ruins", + "SCENE_SHRINE": "shrine", + "SCENE_SHRINE_N": "shrine_n", + "SCENE_SHRINE_R": "shrine_r", + "SCENE_TURIBORI": "turibori", + "SCENE_ENTRA": "entra", + "SCENE_SOUKO": "souko", + "SCENE_SPOT00": "spot00", + "SCENE_SPOT01": "spot01", + "SCENE_SPOT02": "spot02", + "SCENE_SPOT03": "spot03", + "SCENE_SPOT04": "spot04", + "SCENE_SPOT05": "spot05", + "SCENE_SPOT06": "spot06", + "SCENE_SPOT07": "spot07", + "SCENE_SPOT08": "spot08", + "SCENE_SPOT09": "spot09", + "SCENE_SPOT10": "spot10", + "SCENE_SPOT11": "spot11", + "SCENE_SPOT12": "spot12", + "SCENE_SPOT13": "spot13", + "SCENE_SPOT15": "spot15", + "SCENE_SPOT16": "spot16", + "SCENE_SPOT17": "spot17", + "SCENE_SPOT18": "spot18", + "SCENE_SPOT20": "spot20", + "SCENE_ALLEY_SHOP": "alley_shop", + "SCENE_DRAG": "drag", + "SCENE_FACE_SHOP": "face_shop", + "SCENE_GOLON": "golon", + "SCENE_KOKIRI_SHOP": "kokiri_shop", + "SCENE_NIGHT_SHOP": "night_shop", + "SCENE_SHOP1": "shop1", + "SCENE_ZOORA": "zoora", + "SCENE_BESITU": "besitu", + "SCENE_DEPTH_TEST": "depth_test", + "SCENE_SASATEST": "sasatest", + "SCENE_SUTARU": "sutaru", + "SCENE_SYOTES": "syotes", + "SCENE_SYOTES2": "syotes2", + "SCENE_TEST01": "test01", + "SCENE_TESTROOM": "testroom", } ootEnumCamTransition = [ - ("Custom", "Custom", "Custom"), - ("0x00", "0x00", "0x00"), - #("0x0F", "0x0F", "0x0F"), - #("0xFF", "0xFF", "0xFF"), + ("Custom", "Custom", "Custom"), + ("0x00", "0x00", "0x00"), + # ("0x0F", "0x0F", "0x0F"), + # ("0xFF", "0xFF", "0xFF"), ] # see curRoom.unk_03 ootEnumRoomBehaviour = [ - ("Custom", "Custom", "Custom"), - ("0x00", "None", "None"), - ("0x01", "Disable Sun Song Effect", "Disable Sun Song Effect"), - ("0x02", "Disable Action Button Jumping", "Disable Action Button Jumping"), - ("0x03", "(?) Disable Color Dither", "(?) Disable Color Dither"), - ("0x04", "(?) Horse Camera Related", "(?) Horse Camera Related"), - ("0x05", "(?) Nayru's Love Light Dim", "(?) Nayru's Love Light Dim"), + ("Custom", "Custom", "Custom"), + ("0x00", "None", "None"), + ("0x01", "Disable Sun Song Effect", "Disable Sun Song Effect"), + ("0x02", "Disable Action Button Jumping", "Disable Action Button Jumping"), + ("0x03", "(?) Disable Color Dither", "(?) Disable Color Dither"), + ("0x04", "(?) Horse Camera Related", "(?) Horse Camera Related"), + ("0x05", "(?) Nayru's Love Light Dim", "(?) Nayru's Love Light Dim"), ] ootEnumExitIndex = [ - ("Custom", "Custom", "Custom"), - ("Default", "Default", "Default"), + ("Custom", "Custom", "Custom"), + ("Default", "Default", "Default"), ] ootEnumSceneSetupPreset = [ - ("Custom", "Custom", "Custom"), - ("All Scene Setups", "All Scene Setups", "All Scene Setups"), - ("All Non-Cutscene Scene Setups", "All Non-Cutscene Scene Setups", "All Non-Cutscene Scene Setups"), + ("Custom", "Custom", "Custom"), + ("All Scene Setups", "All Scene Setups", "All Scene Setups"), + ( + "All Non-Cutscene Scene Setups", + "All Non-Cutscene Scene Setups", + "All Non-Cutscene Scene Setups", + ), ] ootEnumCSWriteType = [ - ("Custom", "Custom", "Provide the name of a cutscene header variable"), - ("Embedded", "Embedded", "Cutscene data is within scene header (deprecated)"), - ("Object", "Object", "Reference to Blender object representing cutscene") + ("Custom", "Custom", "Provide the name of a cutscene header variable"), + ("Embedded", "Embedded", "Cutscene data is within scene header (deprecated)"), + ("Object", "Object", "Reference to Blender object representing cutscene"), ] ootEnumCSListType = [ - ("Textbox", "Textbox", "Textbox"), - ("FX", "Scene Trans FX", "Scene Trans FX"), - ("Lighting", "Lighting", "Lighting"), - ("Time", "Time", "Time"), - ("PlayBGM", "Play BGM", "Play BGM"), - ("StopBGM", "Stop BGM", "Stop BGM"), - ("FadeBGM", "Fade BGM", "Fade BGM"), - ("Misc", "Misc", "Misc"), - ("0x09", "Cmd 09", "Cmd 09"), - ("Unk", "Unknown Data", "Unknown Data") + ("Textbox", "Textbox", "Textbox"), + ("FX", "Scene Trans FX", "Scene Trans FX"), + ("Lighting", "Lighting", "Lighting"), + ("Time", "Time", "Time"), + ("PlayBGM", "Play BGM", "Play BGM"), + ("StopBGM", "Stop BGM", "Stop BGM"), + ("FadeBGM", "Fade BGM", "Fade BGM"), + ("Misc", "Misc", "Misc"), + ("0x09", "Cmd 09", "Cmd 09"), + ("Unk", "Unknown Data", "Unknown Data"), ] ootEnumCSListTypeIcons = [ - 'ALIGN_BOTTOM', 'COLORSET_10_VEC', 'LIGHT_SUN', 'TIME', 'PLAY', 'SNAP_FACE', 'IPO_EASE_IN_OUT', - 'OPTIONS', 'EVENT_F9', 'QUESTION' + "ALIGN_BOTTOM", + "COLORSET_10_VEC", + "LIGHT_SUN", + "TIME", + "PLAY", + "SNAP_FACE", + "IPO_EASE_IN_OUT", + "OPTIONS", + "EVENT_F9", + "QUESTION", ] ootEnumCSListTypeListC = { - "Textbox": 'CS_TEXT_LIST', - "FX": 'CS_SCENE_TRANS_FX', - "Lighting": 'CS_LIGHTING_LIST', - "Time": 'CS_TIME_LIST', - "PlayBGM": 'CS_PLAY_BGM_LIST', - "StopBGM": 'CS_STOP_BGM_LIST', - "FadeBGM": 'CS_FADE_BGM_LIST', - "Misc": 'CS_MISC_LIST', - "0x09": 'CS_CMD_09_LIST', - "Unk": 'CS_UNK_DATA_LIST' + "Textbox": "CS_TEXT_LIST", + "FX": "CS_SCENE_TRANS_FX", + "Lighting": "CS_LIGHTING_LIST", + "Time": "CS_TIME_LIST", + "PlayBGM": "CS_PLAY_BGM_LIST", + "StopBGM": "CS_STOP_BGM_LIST", + "FadeBGM": "CS_FADE_BGM_LIST", + "Misc": "CS_MISC_LIST", + "0x09": "CS_CMD_09_LIST", + "Unk": "CS_UNK_DATA_LIST", } ootEnumCSListTypeEntryC = { - "Textbox": None, # special case - "FX": None, # no list entries - "Lighting": 'CS_LIGHTING', - "Time": 'CS_TIME', - "PlayBGM": 'CS_PLAY_BGM', - "StopBGM": 'CS_STOP_BGM', - "FadeBGM": 'CS_FADE_BGM', - "Misc": 'CS_MISC', - "0x09": 'CS_CMD_09', - "Unk": 'CS_UNK_DATA' + "Textbox": None, # special case + "FX": None, # no list entries + "Lighting": "CS_LIGHTING", + "Time": "CS_TIME", + "PlayBGM": "CS_PLAY_BGM", + "StopBGM": "CS_STOP_BGM", + "FadeBGM": "CS_FADE_BGM", + "Misc": "CS_MISC", + "0x09": "CS_CMD_09", + "Unk": "CS_UNK_DATA", } ootEnumCSTextboxType = [ - ("Text", "Text", "Text"), - ("None", "None", "None"), - ("LearnSong", "Learn Song", "Learn Song") + ("Text", "Text", "Text"), + ("None", "None", "None"), + ("LearnSong", "Learn Song", "Learn Song"), ] -ootEnumCSTextboxTypeIcons = [ - 'FILE_TEXT', 'HIDE_ON', 'FILE_SOUND' -] +ootEnumCSTextboxTypeIcons = ["FILE_TEXT", "HIDE_ON", "FILE_SOUND"] ootEnumCSTextboxTypeEntryC = { - "Text": 'CS_TEXT_DISPLAY_TEXTBOX', - "None": 'CS_TEXT_NONE', - "LearnSong": 'CS_TEXT_LEARN_SONG', + "Text": "CS_TEXT_DISPLAY_TEXTBOX", + "None": "CS_TEXT_NONE", + "LearnSong": "CS_TEXT_LEARN_SONG", } ootEnumCSTransitionType = [ - ('1', 'To White +', 'Also plays whiteout sound for certain scenes/entrances'), - ('2', 'To Blue', 'To Blue'), - ('3', 'From Red', 'From Red'), - ('4', 'From Green', 'From Green'), - ('5', 'From White', 'From White'), - ('6', 'From Blue', 'From Blue'), - ('7', 'To Red', 'To Red'), - ('8', 'To Green', 'To Green'), - ('9', 'Set Unk', 'gSaveContext.unk_1410 = 1, works with scene xn 11/17'), - ('10', 'From Black', 'From Black'), - ('11', 'To Black', 'To Black'), - ('12', 'To Dim Unk', 'Fade gSaveContext.unk_1410 255>100, works with scene xn 11/17'), - ('13', 'From Dim', 'Alpha 100>255') + ("1", "To White +", "Also plays whiteout sound for certain scenes/entrances"), + ("2", "To Blue", "To Blue"), + ("3", "From Red", "From Red"), + ("4", "From Green", "From Green"), + ("5", "From White", "From White"), + ("6", "From Blue", "From Blue"), + ("7", "To Red", "To Red"), + ("8", "To Green", "To Green"), + ("9", "Set Unk", "gSaveContext.unk_1410 = 1, works with scene xn 11/17"), + ("10", "From Black", "From Black"), + ("11", "To Black", "To Black"), + ( + "12", + "To Dim Unk", + "Fade gSaveContext.unk_1410 255>100, works with scene xn 11/17", + ), + ("13", "From Dim", "Alpha 100>255"), ] diff --git a/fast64_internal/oot/oot_cutscene.py b/fast64_internal/oot/oot_cutscene.py index 21f1e62a5..17fb4b9ba 100644 --- a/fast64_internal/oot/oot_cutscene.py +++ b/fast64_internal/oot/oot_cutscene.py @@ -11,540 +11,720 @@ # Perhaps this should have been called something like OOTCSParentPropertyType, # but now it needs to keep the same name to not break existing scenes which use # the cutscene system. -class OOTCSProperty(): - propName = None - attrName = None - subprops = ["startFrame", "endFrame"] - expandTab : bpy.props.BoolProperty(default = True) - startFrame : bpy.props.IntProperty(name = '', default = 0, min = 0) - endFrame : bpy.props.IntProperty(name = '', default = 1, min = 0) - - def getName(self): - return self.propName - - def filterProp(self, name, listProp): - return True - - def filterName(self, name, listProp): - return name - - def draw(self, layout, listProp, listIndex, cmdIndex, objName, collectionType): - layout.prop(self, 'expandTab', text = self.getName() + " " + str(cmdIndex), - icon = 'TRIA_DOWN' if self.expandTab else 'TRIA_RIGHT') - if not self.expandTab: return - box = layout.box().column() - drawCollectionOps(box, cmdIndex, collectionType + "." + self.attrName, - listIndex, objName) - for p in self.subprops: - if self.filterProp(p, listProp): - prop_split(box, self, p, self.filterName(p, listProp)) +class OOTCSProperty: + propName = None + attrName = None + subprops = ["startFrame", "endFrame"] + expandTab: bpy.props.BoolProperty(default=True) + startFrame: bpy.props.IntProperty(name="", default=0, min=0) + endFrame: bpy.props.IntProperty(name="", default=1, min=0) + + def getName(self): + return self.propName + + def filterProp(self, name, listProp): + return True + + def filterName(self, name, listProp): + return name + + def draw(self, layout, listProp, listIndex, cmdIndex, objName, collectionType): + layout.prop( + self, + "expandTab", + text=self.getName() + " " + str(cmdIndex), + icon="TRIA_DOWN" if self.expandTab else "TRIA_RIGHT", + ) + if not self.expandTab: + return + box = layout.box().column() + drawCollectionOps( + box, cmdIndex, collectionType + "." + self.attrName, listIndex, objName + ) + for p in self.subprops: + if self.filterProp(p, listProp): + prop_split(box, self, p, self.filterName(p, listProp)) + class OOTCSTextboxProperty(OOTCSProperty, bpy.types.PropertyGroup): - propName = "Textbox" - attrName = "textbox" - subprops = ["messageId", "ocarinaSongAction", "startFrame", "endFrame", - "type", "topOptionBranch", "bottomOptionBranch", "ocarinaMessageId"] - textboxType : bpy.props.EnumProperty(items = ootEnumCSTextboxType) - messageId : bpy.props.StringProperty(name = '', default = '0x0000') - ocarinaSongAction : bpy.props.StringProperty(name = '', default = '0x0000') - type : bpy.props.StringProperty(name = '', default = '0x0000') - topOptionBranch : bpy.props.StringProperty(name = '', default = '0x0000') - bottomOptionBranch : bpy.props.StringProperty(name = '', default = '0x0000') - ocarinaMessageId : bpy.props.StringProperty(name = '', default = '0x0000') - - def getName(self): - return self.textboxType - - def filterProp(self, name, listProp): - if self.textboxType == "Text": - return name not in ["ocarinaSongAction", "ocarinaMessageId"] - elif self.textboxType == "None": - return name in ["startFrame", "endFrame"] - elif self.textboxType == "LearnSong": - return name in ["ocarinaSongAction", "startFrame", "endFrame", "ocarinaMessageId"] - else: - raise PluginError("Invalid property name for OOTCSTextboxProperty") + propName = "Textbox" + attrName = "textbox" + subprops = [ + "messageId", + "ocarinaSongAction", + "startFrame", + "endFrame", + "type", + "topOptionBranch", + "bottomOptionBranch", + "ocarinaMessageId", + ] + textboxType: bpy.props.EnumProperty(items=ootEnumCSTextboxType) + messageId: bpy.props.StringProperty(name="", default="0x0000") + ocarinaSongAction: bpy.props.StringProperty(name="", default="0x0000") + type: bpy.props.StringProperty(name="", default="0x0000") + topOptionBranch: bpy.props.StringProperty(name="", default="0x0000") + bottomOptionBranch: bpy.props.StringProperty(name="", default="0x0000") + ocarinaMessageId: bpy.props.StringProperty(name="", default="0x0000") + + def getName(self): + return self.textboxType + + def filterProp(self, name, listProp): + if self.textboxType == "Text": + return name not in ["ocarinaSongAction", "ocarinaMessageId"] + elif self.textboxType == "None": + return name in ["startFrame", "endFrame"] + elif self.textboxType == "LearnSong": + return name in [ + "ocarinaSongAction", + "startFrame", + "endFrame", + "ocarinaMessageId", + ] + else: + raise PluginError("Invalid property name for OOTCSTextboxProperty") + class OOTCSTextboxAdd(bpy.types.Operator): - bl_idname = 'object.oot_cstextbox_add' - bl_label = 'Add CS Textbox' - bl_options = {'REGISTER', 'UNDO'} + bl_idname = "object.oot_cstextbox_add" + bl_label = "Add CS Textbox" + bl_options = {"REGISTER", "UNDO"} + + collectionType: bpy.props.StringProperty() + textboxType: bpy.props.EnumProperty(items=ootEnumCSTextboxType) + listIndex: bpy.props.IntProperty() + objName: bpy.props.StringProperty() - collectionType : bpy.props.StringProperty() - textboxType : bpy.props.EnumProperty(items = ootEnumCSTextboxType) - listIndex : bpy.props.IntProperty() - objName : bpy.props.StringProperty() + def execute(self, context): + collection = getCollection(self.objName, self.collectionType, self.listIndex) + newTextboxElement = collection.add() + newTextboxElement.textboxType = self.textboxType + return {"FINISHED"} - def execute(self, context): - collection = getCollection(self.objName, self.collectionType, self.listIndex) - newTextboxElement = collection.add() - newTextboxElement.textboxType = self.textboxType - return {'FINISHED'} class OOTCSLightingProperty(OOTCSProperty, bpy.types.PropertyGroup): - propName = "Lighting" - attrName = "lighting" - subprops = ["index", "startFrame"] - index : bpy.props.IntProperty(name = '', default = 1, min = 1) - + propName = "Lighting" + attrName = "lighting" + subprops = ["index", "startFrame"] + index: bpy.props.IntProperty(name="", default=1, min=1) + + class OOTCSTimeProperty(OOTCSProperty, bpy.types.PropertyGroup): - propName = "Time" - attrName = "time" - subprops = ["startFrame", "hour", "minute"] - hour : bpy.props.IntProperty(name = '', default = 23, min = 0, max = 23) - minute : bpy.props.IntProperty(name = '', default = 59, min = 0, max = 59) - + propName = "Time" + attrName = "time" + subprops = ["startFrame", "hour", "minute"] + hour: bpy.props.IntProperty(name="", default=23, min=0, max=23) + minute: bpy.props.IntProperty(name="", default=59, min=0, max=59) + + class OOTCSBGMProperty(OOTCSProperty, bpy.types.PropertyGroup): - propName = "BGM" - attrName = "bgm" - subprops = ["value", "startFrame", "endFrame"] - value : bpy.props.StringProperty(name = '', default = '0x0000') - - def filterProp(self, name, listProp): - return name != "endFrame" or listProp.listType == "FadeBGM" - - def filterName(self, name, listProp): - if name == 'value': - return "Fade Type" if listProp.listType == "FadeBGM" else "Sequence" - return name + propName = "BGM" + attrName = "bgm" + subprops = ["value", "startFrame", "endFrame"] + value: bpy.props.StringProperty(name="", default="0x0000") + + def filterProp(self, name, listProp): + return name != "endFrame" or listProp.listType == "FadeBGM" + + def filterName(self, name, listProp): + if name == "value": + return "Fade Type" if listProp.listType == "FadeBGM" else "Sequence" + return name + class OOTCSMiscProperty(OOTCSProperty, bpy.types.PropertyGroup): - propName = "Misc" - attrName = "misc" - subprops = ["operation", "startFrame", "endFrame"] - operation : bpy.props.IntProperty(name = '', default = 1, min = 1, max = 35) + propName = "Misc" + attrName = "misc" + subprops = ["operation", "startFrame", "endFrame"] + operation: bpy.props.IntProperty(name="", default=1, min=1, max=35) + class OOTCS0x09Property(OOTCSProperty, bpy.types.PropertyGroup): - propName = "0x09" - attrName = "nine" - subprops = ["startFrame", "unk2", "unk3", "unk4"] - unk2 : bpy.props.StringProperty(name = '', default = '0x00') - unk3 : bpy.props.StringProperty(name = '', default = '0x00') - unk4 : bpy.props.StringProperty(name = '', default = '0x00') + propName = "0x09" + attrName = "nine" + subprops = ["startFrame", "unk2", "unk3", "unk4"] + unk2: bpy.props.StringProperty(name="", default="0x00") + unk3: bpy.props.StringProperty(name="", default="0x00") + unk4: bpy.props.StringProperty(name="", default="0x00") + class OOTCSUnkProperty(OOTCSProperty, bpy.types.PropertyGroup): - propName = "Unk" - attrName = "unk" - subprops = ["unk1", "unk2", "unk3", "unk4", "unk5", "unk6", "unk7", - "unk8", "unk9", "unk10", "unk11", "unk12"] - unk1 : bpy.props.StringProperty(name = '', default = '0x00000000') - unk2 : bpy.props.StringProperty(name = '', default = '0x00000000') - unk3 : bpy.props.StringProperty(name = '', default = '0x00000000') - unk4 : bpy.props.StringProperty(name = '', default = '0x00000000') - unk5 : bpy.props.StringProperty(name = '', default = '0x00000000') - unk6 : bpy.props.StringProperty(name = '', default = '0x00000000') - unk7 : bpy.props.StringProperty(name = '', default = '0x00000000') - unk8 : bpy.props.StringProperty(name = '', default = '0x00000000') - unk9 : bpy.props.StringProperty(name = '', default = '0x00000000') - unk10 : bpy.props.StringProperty(name = '', default = '0x00000000') - unk11 : bpy.props.StringProperty(name = '', default = '0x00000000') - unk12 : bpy.props.StringProperty(name = '', default = '0x00000000') - - + propName = "Unk" + attrName = "unk" + subprops = [ + "unk1", + "unk2", + "unk3", + "unk4", + "unk5", + "unk6", + "unk7", + "unk8", + "unk9", + "unk10", + "unk11", + "unk12", + ] + unk1: bpy.props.StringProperty(name="", default="0x00000000") + unk2: bpy.props.StringProperty(name="", default="0x00000000") + unk3: bpy.props.StringProperty(name="", default="0x00000000") + unk4: bpy.props.StringProperty(name="", default="0x00000000") + unk5: bpy.props.StringProperty(name="", default="0x00000000") + unk6: bpy.props.StringProperty(name="", default="0x00000000") + unk7: bpy.props.StringProperty(name="", default="0x00000000") + unk8: bpy.props.StringProperty(name="", default="0x00000000") + unk9: bpy.props.StringProperty(name="", default="0x00000000") + unk10: bpy.props.StringProperty(name="", default="0x00000000") + unk11: bpy.props.StringProperty(name="", default="0x00000000") + unk12: bpy.props.StringProperty(name="", default="0x00000000") + + class OOTCSListProperty(bpy.types.PropertyGroup): - expandTab : bpy.props.BoolProperty(default = True) - - listType : bpy.props.EnumProperty(items = ootEnumCSListType) - textbox : bpy.props.CollectionProperty(type = OOTCSTextboxProperty) - lighting: bpy.props.CollectionProperty(type = OOTCSLightingProperty) - time : bpy.props.CollectionProperty(type = OOTCSTimeProperty) - bgm : bpy.props.CollectionProperty(type = OOTCSBGMProperty) - misc : bpy.props.CollectionProperty(type = OOTCSMiscProperty) - nine : bpy.props.CollectionProperty(type = OOTCS0x09Property) - unk : bpy.props.CollectionProperty(type = OOTCSUnkProperty) - - unkType : bpy.props.StringProperty(name = '', default = '0x0001') - fxType : bpy.props.EnumProperty(items = ootEnumCSTransitionType) - fxStartFrame : bpy.props.IntProperty(name = '', default = 0, min = 0) - fxEndFrame : bpy.props.IntProperty(name = '', default = 1, min = 0) + expandTab: bpy.props.BoolProperty(default=True) + + listType: bpy.props.EnumProperty(items=ootEnumCSListType) + textbox: bpy.props.CollectionProperty(type=OOTCSTextboxProperty) + lighting: bpy.props.CollectionProperty(type=OOTCSLightingProperty) + time: bpy.props.CollectionProperty(type=OOTCSTimeProperty) + bgm: bpy.props.CollectionProperty(type=OOTCSBGMProperty) + misc: bpy.props.CollectionProperty(type=OOTCSMiscProperty) + nine: bpy.props.CollectionProperty(type=OOTCS0x09Property) + unk: bpy.props.CollectionProperty(type=OOTCSUnkProperty) + + unkType: bpy.props.StringProperty(name="", default="0x0001") + fxType: bpy.props.EnumProperty(items=ootEnumCSTransitionType) + fxStartFrame: bpy.props.IntProperty(name="", default=0, min=0) + fxEndFrame: bpy.props.IntProperty(name="", default=1, min=0) + def drawCSListProperty(layout, listProp, listIndex, objName, collectionType): - layout.prop(listProp, 'expandTab', - text = listProp.listType + ' List' if listProp.listType != 'FX' else 'Scene Trans FX', - icon = 'TRIA_DOWN' if listProp.expandTab else 'TRIA_RIGHT') - if not listProp.expandTab: return - box = layout.box().column() - drawCollectionOps(box, listIndex, collectionType, None, objName, False) - - if listProp.listType == "Textbox": - attrName = "textbox" - elif listProp.listType == "FX": - prop_split(box, listProp, 'fxType', 'Transition') - prop_split(box, listProp, 'fxStartFrame', 'Start Frame') - prop_split(box, listProp, 'fxEndFrame', 'End Frame') - return - elif listProp.listType == "Lighting": - attrName = "lighting" - elif listProp.listType == "Time": - attrName = "time" - elif listProp.listType in ["PlayBGM", "StopBGM", "FadeBGM"]: - attrName = "bgm" - elif listProp.listType == "Misc": - attrName = "misc" - elif listProp.listType == "0x09": - attrName = "nine" - elif listProp.listType == "Unk": - prop_split(box, listProp, 'unkType', 'Unk List Type') - attrName = "unk" - else: - raise PluginError("Internal error: invalid listType " + listProp.listType) - - dat = getattr(listProp, attrName) - for i, p in enumerate(dat): - p.draw(box, listProp, listIndex, i, objName, collectionType) - if len(dat) == 0: - box.label(text = "No items in " + listProp.listType + " List.") - if listProp.listType == "Textbox": - row = box.row(align=True) - for l in range(3): - addOp = row.operator(OOTCSTextboxAdd.bl_idname, text = 'Add ' + ootEnumCSTextboxType[l][1], icon = ootEnumCSTextboxTypeIcons[l]) - addOp.collectionType = collectionType + '.textbox' - addOp.textboxType = ootEnumCSTextboxType[l][0] - addOp.listIndex = listIndex - addOp.objName = objName - else: - addOp = box.operator(OOTCollectionAdd.bl_idname, text = 'Add item to ' + listProp.listType + ' List') - addOp.option = len(dat) - addOp.collectionType = collectionType + '.' + attrName - addOp.subIndex = listIndex - addOp.objName = objName + layout.prop( + listProp, + "expandTab", + text=listProp.listType + " List" + if listProp.listType != "FX" + else "Scene Trans FX", + icon="TRIA_DOWN" if listProp.expandTab else "TRIA_RIGHT", + ) + if not listProp.expandTab: + return + box = layout.box().column() + drawCollectionOps(box, listIndex, collectionType, None, objName, False) + + if listProp.listType == "Textbox": + attrName = "textbox" + elif listProp.listType == "FX": + prop_split(box, listProp, "fxType", "Transition") + prop_split(box, listProp, "fxStartFrame", "Start Frame") + prop_split(box, listProp, "fxEndFrame", "End Frame") + return + elif listProp.listType == "Lighting": + attrName = "lighting" + elif listProp.listType == "Time": + attrName = "time" + elif listProp.listType in ["PlayBGM", "StopBGM", "FadeBGM"]: + attrName = "bgm" + elif listProp.listType == "Misc": + attrName = "misc" + elif listProp.listType == "0x09": + attrName = "nine" + elif listProp.listType == "Unk": + prop_split(box, listProp, "unkType", "Unk List Type") + attrName = "unk" + else: + raise PluginError("Internal error: invalid listType " + listProp.listType) + + dat = getattr(listProp, attrName) + for i, p in enumerate(dat): + p.draw(box, listProp, listIndex, i, objName, collectionType) + if len(dat) == 0: + box.label(text="No items in " + listProp.listType + " List.") + if listProp.listType == "Textbox": + row = box.row(align=True) + for l in range(3): + addOp = row.operator( + OOTCSTextboxAdd.bl_idname, + text="Add " + ootEnumCSTextboxType[l][1], + icon=ootEnumCSTextboxTypeIcons[l], + ) + addOp.collectionType = collectionType + ".textbox" + addOp.textboxType = ootEnumCSTextboxType[l][0] + addOp.listIndex = listIndex + addOp.objName = objName + else: + addOp = box.operator( + OOTCollectionAdd.bl_idname, + text="Add item to " + listProp.listType + " List", + ) + addOp.option = len(dat) + addOp.collectionType = collectionType + "." + attrName + addOp.subIndex = listIndex + addOp.objName = objName class OOTCSListAdd(bpy.types.Operator): - bl_idname = 'object.oot_cslist_add' - bl_label = 'Add CS List' - bl_options = {'REGISTER', 'UNDO'} + bl_idname = "object.oot_cslist_add" + bl_label = "Add CS List" + bl_options = {"REGISTER", "UNDO"} - collectionType : bpy.props.StringProperty() - listType : bpy.props.EnumProperty(items = ootEnumCSListType) - objName : bpy.props.StringProperty() + collectionType: bpy.props.StringProperty() + listType: bpy.props.EnumProperty(items=ootEnumCSListType) + objName: bpy.props.StringProperty() + + def execute(self, context): + collection = getCollection(self.objName, self.collectionType, None) + newList = collection.add() + newList.listType = self.listType + return {"FINISHED"} - def execute(self, context): - collection = getCollection(self.objName, self.collectionType, None) - newList = collection.add() - newList.listType = self.listType - return {'FINISHED'} def drawCSAddButtons(layout, objName, collectionType): - def addButton(row): - nonlocal l - op = row.operator(OOTCSListAdd.bl_idname, text = ootEnumCSListType[l][1], icon = ootEnumCSListTypeIcons[l]) - op.collectionType = collectionType - op.listType = ootEnumCSListType[l][0] - op.objName = objName - l += 1 - box = layout.column(align=True) - l = 0 - row = box.row(align=True) - row.label(text = 'Add:') - addButton(row) - for _ in range(3): - row = box.row(align=True) - for _ in range(3): - addButton(row) - box.label(text = 'Install zcamedit for camera/actor motion.') + def addButton(row): + nonlocal l + op = row.operator( + OOTCSListAdd.bl_idname, + text=ootEnumCSListType[l][1], + icon=ootEnumCSListTypeIcons[l], + ) + op.collectionType = collectionType + op.listType = ootEnumCSListType[l][0] + op.objName = objName + l += 1 + + box = layout.column(align=True) + l = 0 + row = box.row(align=True) + row.label(text="Add:") + addButton(row) + for _ in range(3): + row = box.row(align=True) + for _ in range(3): + addButton(row) + box.label(text="Install zcamedit for camera/actor motion.") class OOTCutsceneProperty(bpy.types.PropertyGroup): - csEndFrame : bpy.props.IntProperty(name = "End Frame", min = 0, default = 100) - csWriteTerminator : bpy.props.BoolProperty(name = "Write Terminator (Code Execution)") - csTermIdx : bpy.props.IntProperty(name = "Index", min = 0) - csTermStart : bpy.props.IntProperty(name = "Start Frm", min = 0, default = 99) - csTermEnd : bpy.props.IntProperty(name = "End Frm", min = 0, default = 100) - csLists : bpy.props.CollectionProperty(type = OOTCSListProperty, name = 'Cutscene Lists') + csEndFrame: bpy.props.IntProperty(name="End Frame", min=0, default=100) + csWriteTerminator: bpy.props.BoolProperty(name="Write Terminator (Code Execution)") + csTermIdx: bpy.props.IntProperty(name="Index", min=0) + csTermStart: bpy.props.IntProperty(name="Start Frm", min=0, default=99) + csTermEnd: bpy.props.IntProperty(name="End Frm", min=0, default=100) + csLists: bpy.props.CollectionProperty(type=OOTCSListProperty, name="Cutscene Lists") + def drawCutsceneProperty(box, obj): - prop = obj.ootCutsceneProperty - box.prop(prop, "csEndFrame") - box.prop(prop, "csWriteTerminator") - if prop.csWriteTerminator: - r = box.row() - r.prop(prop, "csTermIdx") - r.prop(prop, "csTermStart") - r.prop(prop, "csTermEnd") - for i, p in enumerate(prop.csLists): - drawCSListProperty(box, p, i, obj.name, 'Cutscene') - drawCSAddButtons(box, obj.name, 'Cutscene') + prop = obj.ootCutsceneProperty + box.prop(prop, "csEndFrame") + box.prop(prop, "csWriteTerminator") + if prop.csWriteTerminator: + r = box.row() + r.prop(prop, "csTermIdx") + r.prop(prop, "csTermStart") + r.prop(prop, "csTermEnd") + for i, p in enumerate(prop.csLists): + drawCSListProperty(box, p, i, obj.name, "Cutscene") + drawCSAddButtons(box, obj.name, "Cutscene") ################################################################################ # Properties to level classes ################################################################################ + def readCutsceneData(csParentOut, csParentIn): - for listIn in csParentIn.csLists: - listOut = OOTCSList() - listOut.listType = listIn.listType - listOut.unkType, listOut.fxType, listOut.fxStartFrame, listOut.fxEndFrame \ - = listIn.unkType, listIn.fxType, listIn.fxStartFrame, listIn.fxEndFrame - listData = [] - if listOut.listType == 'Textbox': - for entryIn in listIn.textbox: - entryOut = OOTCSTextbox() - entryOut.textboxType = entryIn.textboxType - entryOut.messageId = entryIn.messageId - entryOut.ocarinaSongAction = entryIn.ocarinaSongAction - entryOut.startFrame = entryIn.startFrame - entryOut.endFrame = entryIn.endFrame - entryOut.type = entryIn.type - entryOut.topOptionBranch = entryIn.topOptionBranch - entryOut.bottomOptionBranch = entryIn.bottomOptionBranch - entryOut.ocarinaMessageId = entryIn.ocarinaMessageId - listOut.entries.append(entryOut) - elif listOut.listType == 'Lighting': - for entryIn in listIn.lighting: - entryOut = OOTCSLighting() - entryOut.index = entryIn.index - entryOut.startFrame = entryIn.startFrame - listOut.entries.append(entryOut) - elif listOut.listType == 'Time': - for entryIn in listIn.time: - entryOut = OOTCSTime() - entryOut.startFrame = entryIn.startFrame - entryOut.hour = entryIn.hour - entryOut.minute = entryIn.minute - listOut.entries.append(entryOut) - elif listOut.listType in {'PlayBGM', 'StopBGM', 'FadeBGM'}: - for entryIn in listIn.bgm: - entryOut = OOTCSBGM() - entryOut.value = entryIn.value - entryOut.startFrame = entryIn.startFrame - entryOut.endFrame = entryIn.endFrame - listOut.entries.append(entryOut) - elif listOut.listType == 'Misc': - for entryIn in listIn.misc: - entryOut = OOTCSMisc() - entryOut.operation = entryIn.operation - entryOut.startFrame = entryIn.startFrame - entryOut.endFrame = entryIn.endFrame - listOut.entries.append(entryOut) - elif listOut.listType == '0x09': - for entryIn in listIn.nine: - entryOut = OOTCS0x09() - entryOut.startFrame = entryIn.startFrame - entryOut.unk2 = entryIn.unk2 - entryOut.unk3 = entryIn.unk3 - entryOut.unk4 = entryIn.unk4 - listOut.entries.append(entryOut) - elif listOut.listType == 'Unk': - for entryIn in listIn.unk: - entryOut = OOTCSUnk() - entryOut.unk1 = entryIn.unk1 - entryOut.unk2 = entryIn.unk2 - entryOut.unk3 = entryIn.unk3 - entryOut.unk4 = entryIn.unk4 - entryOut.unk5 = entryIn.unk5 - entryOut.unk6 = entryIn.unk6 - entryOut.unk7 = entryIn.unk7 - entryOut.unk8 = entryIn.unk8 - entryOut.unk9 = entryIn.unk9 - entryOut.unk10 = entryIn.unk10 - entryOut.unk11 = entryIn.unk11 - entryOut.unk12 = entryIn.unk12 - listOut.entries.append(entryOut) - csParentOut.csLists.append(listOut) + for listIn in csParentIn.csLists: + listOut = OOTCSList() + listOut.listType = listIn.listType + listOut.unkType, listOut.fxType, listOut.fxStartFrame, listOut.fxEndFrame = ( + listIn.unkType, + listIn.fxType, + listIn.fxStartFrame, + listIn.fxEndFrame, + ) + listData = [] + if listOut.listType == "Textbox": + for entryIn in listIn.textbox: + entryOut = OOTCSTextbox() + entryOut.textboxType = entryIn.textboxType + entryOut.messageId = entryIn.messageId + entryOut.ocarinaSongAction = entryIn.ocarinaSongAction + entryOut.startFrame = entryIn.startFrame + entryOut.endFrame = entryIn.endFrame + entryOut.type = entryIn.type + entryOut.topOptionBranch = entryIn.topOptionBranch + entryOut.bottomOptionBranch = entryIn.bottomOptionBranch + entryOut.ocarinaMessageId = entryIn.ocarinaMessageId + listOut.entries.append(entryOut) + elif listOut.listType == "Lighting": + for entryIn in listIn.lighting: + entryOut = OOTCSLighting() + entryOut.index = entryIn.index + entryOut.startFrame = entryIn.startFrame + listOut.entries.append(entryOut) + elif listOut.listType == "Time": + for entryIn in listIn.time: + entryOut = OOTCSTime() + entryOut.startFrame = entryIn.startFrame + entryOut.hour = entryIn.hour + entryOut.minute = entryIn.minute + listOut.entries.append(entryOut) + elif listOut.listType in {"PlayBGM", "StopBGM", "FadeBGM"}: + for entryIn in listIn.bgm: + entryOut = OOTCSBGM() + entryOut.value = entryIn.value + entryOut.startFrame = entryIn.startFrame + entryOut.endFrame = entryIn.endFrame + listOut.entries.append(entryOut) + elif listOut.listType == "Misc": + for entryIn in listIn.misc: + entryOut = OOTCSMisc() + entryOut.operation = entryIn.operation + entryOut.startFrame = entryIn.startFrame + entryOut.endFrame = entryIn.endFrame + listOut.entries.append(entryOut) + elif listOut.listType == "0x09": + for entryIn in listIn.nine: + entryOut = OOTCS0x09() + entryOut.startFrame = entryIn.startFrame + entryOut.unk2 = entryIn.unk2 + entryOut.unk3 = entryIn.unk3 + entryOut.unk4 = entryIn.unk4 + listOut.entries.append(entryOut) + elif listOut.listType == "Unk": + for entryIn in listIn.unk: + entryOut = OOTCSUnk() + entryOut.unk1 = entryIn.unk1 + entryOut.unk2 = entryIn.unk2 + entryOut.unk3 = entryIn.unk3 + entryOut.unk4 = entryIn.unk4 + entryOut.unk5 = entryIn.unk5 + entryOut.unk6 = entryIn.unk6 + entryOut.unk7 = entryIn.unk7 + entryOut.unk8 = entryIn.unk8 + entryOut.unk9 = entryIn.unk9 + entryOut.unk10 = entryIn.unk10 + entryOut.unk11 = entryIn.unk11 + entryOut.unk12 = entryIn.unk12 + listOut.entries.append(entryOut) + csParentOut.csLists.append(listOut) + def convertCutsceneObject(obj): - cs = OOTCutscene() - cs.name = getCutsceneName(obj) - csprop = obj.ootCutsceneProperty - cs.csEndFrame = getCustomProperty(csprop, "csEndFrame") - cs.csWriteTerminator = getCustomProperty(csprop, "csWriteTerminator") - cs.csTermIdx = getCustomProperty(csprop, "csTermIdx") - cs.csTermStart = getCustomProperty(csprop, "csTermStart") - cs.csTermEnd = getCustomProperty(csprop, "csTermEnd") - readCutsceneData(cs, csprop) - return cs + cs = OOTCutscene() + cs.name = getCutsceneName(obj) + csprop = obj.ootCutsceneProperty + cs.csEndFrame = getCustomProperty(csprop, "csEndFrame") + cs.csWriteTerminator = getCustomProperty(csprop, "csWriteTerminator") + cs.csTermIdx = getCustomProperty(csprop, "csTermIdx") + cs.csTermStart = getCustomProperty(csprop, "csTermStart") + cs.csTermEnd = getCustomProperty(csprop, "csTermEnd") + readCutsceneData(cs, csprop) + return cs ################################################################################ # Level classes to C ################################################################################ + def ootCutsceneIncludes(headerfilename): - ret = CData() - ret.source = ( - '#include "ultra64.h"\n' - + '#include "z64.h"\n' - + '#include "macros.h"\n' - + '#include "command_macros_base.h"\n' - + '#include "z64cutscene_commands.h"\n\n' - + '#include "' + headerfilename + '"\n\n' - ) - return ret + ret = CData() + ret.source = ( + '#include "ultra64.h"\n' + + '#include "z64.h"\n' + + '#include "macros.h"\n' + + '#include "command_macros_base.h"\n' + + '#include "z64cutscene_commands.h"\n\n' + + '#include "' + + headerfilename + + '"\n\n' + ) + return ret + def ootCutsceneDataToC(csParent, csName): - # csParent can be OOTCutscene or OOTScene - data = CData() - data.header = "extern s32 " + csName + "[];\n" - data.source = "s32 " + csName + "[] = {\n" - nentries = len(csParent.csLists) + (1 if csParent.csWriteTerminator else 0) - data.source += "\tCS_BEGIN_CUTSCENE(" + str(nentries) + ", " + str(csParent.csEndFrame) + "),\n" - if csParent.csWriteTerminator: - data.source += "\tCS_TERMINATOR(" + str(csParent.csTermIdx) + ", " + str(csParent.csTermStart) + ", " + str(csParent.csTermEnd) + "),\n" - for list in csParent.csLists: - data.source += "\t" + ootEnumCSListTypeListC[list.listType] + "(" - if list.listType == "Unk": - data.source += list.unkType + ", " - if list.listType == "FX": - data.source += list.fxType + ", " + str(list.fxStartFrame) + ", " + str(list.fxEndFrame) - else: - data.source += str(len(list.entries)) - data.source += "),\n" - for e in list.entries: - data.source += "\t\t" - if list.listType == "Textbox": - data.source += ootEnumCSTextboxTypeEntryC[e.textboxType] - else: - data.source += ootEnumCSListTypeEntryC[list.listType] - data.source += "(" - if list.listType == "Textbox": - if e.textboxType == "Text": - data.source += e.messageId + ", " + str(e.startFrame) + ", " \ - + str(e.endFrame) + ", " + e.type + ", " + e.topOptionBranch \ - + ", " + e.bottomOptionBranch - elif e.textboxType == "None": - data.source += str(e.startFrame) + ", " + str(e.endFrame) - elif e.textboxType == "LearnSong": - data.source += e.ocarinaSongAction + ", " + str(e.startFrame) \ - + ", " + str(e.endFrame) + ", " + e.ocarinaMessageId - elif list.listType == "Lighting": - data.source += str(e.index) + ", " + str(e.startFrame) + ", " \ - + str(e.startFrame + 1) + ", 0, 0, 0, 0, 0, 0, 0, 0" - elif list.listType == "Time": - data.source += "1, " + str(e.startFrame) + ", " + str(e.startFrame + 1) \ - + ", " + str(e.hour) + ", " + str(e.minute) + ", 0" - elif list.listType in ["PlayBGM", "StopBGM", "FadeBGM"]: - data.source += e.value - if list.listType != "FadeBGM": - data.source += " + 1" # Game subtracts 1 to get actual seq - data.source += ", " + str(e.startFrame) + ", " + str(e.endFrame) \ - + ", 0, 0, 0, 0, 0, 0, 0, 0" - elif list.listType == "Misc": - data.source += str(e.operation) + ", " + str(e.startFrame) + ", " \ - + str(e.endFrame) + ", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0" - elif list.listType == "0x09": - data.source += "0, " + str(e.startFrame) + ", " + str(e.startFrame + 1) + ", " \ - + e.unk2 + ", " + e.unk3 + ", " + e.unk4 + ", 0, 0" - elif list.listType == "Unk": - data.source += e.unk1 + ", " + e.unk2 + ", " + e.unk3 + ", " \ - + e.unk4 + ", " + e.unk5 + ", " + e.unk6 + ", " \ - + e.unk7 + ", " + e.unk8 + ", " + e.unk9 + ", " \ - + e.unk10 + ", " + e.unk11 + ", " + e.unk12 - else: - raise PluginError("Internal error: invalid cutscene list type " + list.listType) - data.source += "),\n" - data.source += "\tCS_END(),\n" - data.source += "};\n\n" - return data + # csParent can be OOTCutscene or OOTScene + data = CData() + data.header = "extern s32 " + csName + "[];\n" + data.source = "s32 " + csName + "[] = {\n" + nentries = len(csParent.csLists) + (1 if csParent.csWriteTerminator else 0) + data.source += ( + "\tCS_BEGIN_CUTSCENE(" + + str(nentries) + + ", " + + str(csParent.csEndFrame) + + "),\n" + ) + if csParent.csWriteTerminator: + data.source += ( + "\tCS_TERMINATOR(" + + str(csParent.csTermIdx) + + ", " + + str(csParent.csTermStart) + + ", " + + str(csParent.csTermEnd) + + "),\n" + ) + for list in csParent.csLists: + data.source += "\t" + ootEnumCSListTypeListC[list.listType] + "(" + if list.listType == "Unk": + data.source += list.unkType + ", " + if list.listType == "FX": + data.source += ( + list.fxType + + ", " + + str(list.fxStartFrame) + + ", " + + str(list.fxEndFrame) + ) + else: + data.source += str(len(list.entries)) + data.source += "),\n" + for e in list.entries: + data.source += "\t\t" + if list.listType == "Textbox": + data.source += ootEnumCSTextboxTypeEntryC[e.textboxType] + else: + data.source += ootEnumCSListTypeEntryC[list.listType] + data.source += "(" + if list.listType == "Textbox": + if e.textboxType == "Text": + data.source += ( + e.messageId + + ", " + + str(e.startFrame) + + ", " + + str(e.endFrame) + + ", " + + e.type + + ", " + + e.topOptionBranch + + ", " + + e.bottomOptionBranch + ) + elif e.textboxType == "None": + data.source += str(e.startFrame) + ", " + str(e.endFrame) + elif e.textboxType == "LearnSong": + data.source += ( + e.ocarinaSongAction + + ", " + + str(e.startFrame) + + ", " + + str(e.endFrame) + + ", " + + e.ocarinaMessageId + ) + elif list.listType == "Lighting": + data.source += ( + str(e.index) + + ", " + + str(e.startFrame) + + ", " + + str(e.startFrame + 1) + + ", 0, 0, 0, 0, 0, 0, 0, 0" + ) + elif list.listType == "Time": + data.source += ( + "1, " + + str(e.startFrame) + + ", " + + str(e.startFrame + 1) + + ", " + + str(e.hour) + + ", " + + str(e.minute) + + ", 0" + ) + elif list.listType in ["PlayBGM", "StopBGM", "FadeBGM"]: + data.source += e.value + if list.listType != "FadeBGM": + data.source += " + 1" # Game subtracts 1 to get actual seq + data.source += ( + ", " + + str(e.startFrame) + + ", " + + str(e.endFrame) + + ", 0, 0, 0, 0, 0, 0, 0, 0" + ) + elif list.listType == "Misc": + data.source += ( + str(e.operation) + + ", " + + str(e.startFrame) + + ", " + + str(e.endFrame) + + ", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0" + ) + elif list.listType == "0x09": + data.source += ( + "0, " + + str(e.startFrame) + + ", " + + str(e.startFrame + 1) + + ", " + + e.unk2 + + ", " + + e.unk3 + + ", " + + e.unk4 + + ", 0, 0" + ) + elif list.listType == "Unk": + data.source += ( + e.unk1 + + ", " + + e.unk2 + + ", " + + e.unk3 + + ", " + + e.unk4 + + ", " + + e.unk5 + + ", " + + e.unk6 + + ", " + + e.unk7 + + ", " + + e.unk8 + + ", " + + e.unk9 + + ", " + + e.unk10 + + ", " + + e.unk11 + + ", " + + e.unk12 + ) + else: + raise PluginError( + "Internal error: invalid cutscene list type " + list.listType + ) + data.source += "),\n" + data.source += "\tCS_END(),\n" + data.source += "};\n\n" + return data ################################################################################ # Operators and panel ################################################################################ + def checkGetFilePaths(context): - cpath = bpy.path.abspath(context.scene.ootCutsceneExportPath) - if not cpath.endswith('.c'): - raise PluginError('Output file must end with .c') - hpath = cpath[:-1] + 'h' - headerfilename = os.path.basename(hpath) - return cpath, hpath, headerfilename + cpath = bpy.path.abspath(context.scene.ootCutsceneExportPath) + if not cpath.endswith(".c"): + raise PluginError("Output file must end with .c") + hpath = cpath[:-1] + "h" + headerfilename = os.path.basename(hpath) + return cpath, hpath, headerfilename + class OOT_ExportCutscene(bpy.types.Operator): - bl_idname = 'object.oot_export_cutscene' - bl_label = "Export Cutscene" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - def execute(self, context): - try: - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = "OBJECT") - activeObj = context.view_layer.objects.active - if activeObj is None or activeObj.data is not None or activeObj.ootEmptyType != 'Cutscene': - raise PluginError('You must select a cutscene object') - if activeObj.parent is not None: - raise PluginError('Cutscene object must not be parented to anything') - cpath, hpath, headerfilename = checkGetFilePaths(context) - csdata = ootCutsceneIncludes(headerfilename) - converted = convertCutsceneObject(activeObj) - csdata.append(ootCutsceneDataToC(converted, converted.name)) - writeCData(csdata, hpath, cpath) - self.report({'INFO'}, 'Successfully exported cutscene') - return {'FINISHED'} - except Exception as e: - raisePluginError(self, e) - return {'CANCELLED'} + bl_idname = "object.oot_export_cutscene" + bl_label = "Export Cutscene" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + def execute(self, context): + try: + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + activeObj = context.view_layer.objects.active + if ( + activeObj is None + or activeObj.data is not None + or activeObj.ootEmptyType != "Cutscene" + ): + raise PluginError("You must select a cutscene object") + if activeObj.parent is not None: + raise PluginError("Cutscene object must not be parented to anything") + cpath, hpath, headerfilename = checkGetFilePaths(context) + csdata = ootCutsceneIncludes(headerfilename) + converted = convertCutsceneObject(activeObj) + csdata.append(ootCutsceneDataToC(converted, converted.name)) + writeCData(csdata, hpath, cpath) + self.report({"INFO"}, "Successfully exported cutscene") + return {"FINISHED"} + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} + class OOT_ExportAllCutscenes(bpy.types.Operator): - bl_idname = 'object.oot_export_all_cutscenes' - bl_label = "Export All Cutscenes" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - def execute(self, context): - try: - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = "OBJECT") - cpath, hpath, headerfilename = checkGetFilePaths(context) - csdata = ootCutsceneIncludes(headerfilename) - count = 0 - for obj in context.view_layer.objects: - if obj.data is not None or obj.ootEmptyType != 'Cutscene': - continue - if obj.parent is not None: - raise PluginError('Cutscene object must not be parented to anything') - converted = convertCutsceneObject(obj) - csdata.append(ootCutsceneDataToC(converted, converted.name)) - count += 1 - if count == 0: - raise PluginError('Could not find any cutscenes to export') - writeCData(csdata, hpath, cpath) - self.report({'INFO'}, 'Successfully exported ' + str(count) + ' cutscenes') - return {'FINISHED'} - except Exception as e: - raisePluginError(self, e) - return {'CANCELLED'} + bl_idname = "object.oot_export_all_cutscenes" + bl_label = "Export All Cutscenes" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + def execute(self, context): + try: + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + cpath, hpath, headerfilename = checkGetFilePaths(context) + csdata = ootCutsceneIncludes(headerfilename) + count = 0 + for obj in context.view_layer.objects: + if obj.data is not None or obj.ootEmptyType != "Cutscene": + continue + if obj.parent is not None: + raise PluginError( + "Cutscene object must not be parented to anything" + ) + converted = convertCutsceneObject(obj) + csdata.append(ootCutsceneDataToC(converted, converted.name)) + count += 1 + if count == 0: + raise PluginError("Could not find any cutscenes to export") + writeCData(csdata, hpath, cpath) + self.report({"INFO"}, "Successfully exported " + str(count) + " cutscenes") + return {"FINISHED"} + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} + class OOT_ExportCutscenePanel(OOT_Panel): - bl_idname = "OOT_PT_export_cutscene" - bl_label = "OOT Cutscene Exporter" - bl_space_type = 'VIEW_3D' - bl_region_type = 'UI' - bl_category = 'OOT' - - def draw(self, context): - col = self.layout.column() - col.operator(OOT_ExportCutscene.bl_idname) - col.operator(OOT_ExportAllCutscenes.bl_idname) - prop_split(col, context.scene, 'ootCutsceneExportPath', 'File') - + bl_idname = "OOT_PT_export_cutscene" + bl_label = "OOT Cutscene Exporter" + bl_space_type = "VIEW_3D" + bl_region_type = "UI" + bl_category = "OOT" + + def draw(self, context): + col = self.layout.column() + col.operator(OOT_ExportCutscene.bl_idname) + col.operator(OOT_ExportAllCutscenes.bl_idname) + prop_split(col, context.scene, "ootCutsceneExportPath", "File") + oot_cutscene_classes = ( - OOT_ExportCutscene, - OOT_ExportAllCutscenes, + OOT_ExportCutscene, + OOT_ExportAllCutscenes, ) -oot_cutscene_panel_classes = ( - OOT_ExportCutscenePanel, -) +oot_cutscene_panel_classes = (OOT_ExportCutscenePanel,) + def oot_cutscene_panel_register(): - for cls in oot_cutscene_panel_classes: - register_class(cls) - + for cls in oot_cutscene_panel_classes: + register_class(cls) + + def oot_cutscene_panel_unregister(): - for cls in oot_cutscene_panel_classes: - unregister_class(cls) + for cls in oot_cutscene_panel_classes: + unregister_class(cls) + def oot_cutscene_register(): - for cls in oot_cutscene_classes: - register_class(cls) - - bpy.types.Scene.ootCutsceneExportPath = bpy.props.StringProperty( - name = 'File', subtype='FILE_PATH') - + for cls in oot_cutscene_classes: + register_class(cls) + + bpy.types.Scene.ootCutsceneExportPath = bpy.props.StringProperty( + name="File", subtype="FILE_PATH" + ) + + def oot_cutscene_unregister(): - for cls in reversed(oot_cutscene_classes): - unregister_class(cls) - - del bpy.types.Scene.ootCutsceneExportPath + for cls in reversed(oot_cutscene_classes): + unregister_class(cls) + + del bpy.types.Scene.ootCutsceneExportPath diff --git a/fast64_internal/oot/oot_f3d_writer.py b/fast64_internal/oot/oot_f3d_writer.py index 16239213c..cf7596ec4 100644 --- a/fast64_internal/oot/oot_f3d_writer.py +++ b/fast64_internal/oot/oot_f3d_writer.py @@ -11,519 +11,684 @@ from .oot_model_classes import * from .oot_scene_room import * -# returns: -# mesh, +# returns: +# mesh, # anySkinnedFaces (to determine if skeleton should be flex) -def ootProcessVertexGroup(fModel, meshObj, vertexGroup, convertTransformMatrix, armatureObj, namePrefix, - meshInfo, drawLayerOverride, convertTextureData, lastMaterialName): - - optimize = bpy.context.scene.ootSkeletonExportOptimize - if not optimize: - lastMaterialName = None - - mesh = meshObj.data - currentGroupIndex = getGroupIndexFromname(meshObj, vertexGroup) - nextDLIndex = len(meshInfo.vertexGroupInfo.vertexGroupToMatrixIndex) - vertIndices = [vert.index for vert in meshObj.data.vertices if\ - meshInfo.vertexGroupInfo.vertexGroups[vert.index] == currentGroupIndex] - - if len(vertIndices) == 0: - print("No vert indices in " + vertexGroup) - return None, False, lastMaterialName - - bone = armatureObj.data.bones[vertexGroup] - - # dict of material_index keys to face array values - groupFaces = {} - - hasSkinnedFaces = False - - handledFaces = [] - anyConnectedToUnhandledBone = False - for vertIndex in vertIndices: - if vertIndex not in meshInfo.vert: - continue - for face in meshInfo.vert[vertIndex]: - # Ignore repeat faces - if face in handledFaces: - continue - - connectedToUnhandledBone = False - - # A Blender loop is interpreted as face + loop index - for i in range(3): - faceVertIndex = face.vertices[i] - vertGroupIndex = meshInfo.vertexGroupInfo.vertexGroups[faceVertIndex] - if vertGroupIndex != currentGroupIndex: - hasSkinnedFaces = True - if vertGroupIndex not in meshInfo.vertexGroupInfo.vertexGroupToLimb: - # Connected to a bone not processed yet - # These skinned faces will be handled by that limb - connectedToUnhandledBone = True - anyConnectedToUnhandledBone = True - break - - if connectedToUnhandledBone: - continue - - if face.material_index not in groupFaces: - groupFaces[face.material_index] = [] - groupFaces[face.material_index].append(face) - - handledFaces.append(face) - - if len(groupFaces) == 0: - print("No faces in " + vertexGroup) - - # OOT will only allocate matrix if DL exists. - # This doesn't handle case where vertices belong to a limb, but not triangles. - # Therefore we create a dummy DL - if anyConnectedToUnhandledBone: - fMesh = fModel.addMesh(vertexGroup, namePrefix, drawLayerOverride, False, bone) - fModel.endDraw(fMesh, bone) - meshInfo.vertexGroupInfo.vertexGroupToMatrixIndex[currentGroupIndex] = nextDLIndex - return fMesh, False, lastMaterialName - else: - return None, False, lastMaterialName - - meshInfo.vertexGroupInfo.vertexGroupToMatrixIndex[currentGroupIndex] = nextDLIndex - triConverterInfo = OOTTriangleConverterInfo(meshObj, armatureObj.data, fModel.f3d, convertTransformMatrix, meshInfo) - - if optimize: - # If one of the materials we need to draw is the currently loaded material, - # do this one first. - newGroupFaces = { - material_index: faces for material_index, faces in groupFaces.items() - if meshObj.material_slots[material_index].material.name == lastMaterialName - } - newGroupFaces.update(groupFaces) - groupFaces = newGroupFaces - - # Usually we would separate DLs into different draw layers. - # however it seems like OOT skeletons don't have this ability. - # Therefore we always use the drawLayerOverride as the draw layer key. - # This means everything will be saved to one mesh. - fMesh = fModel.addMesh(vertexGroup, namePrefix, drawLayerOverride, False, bone) - - for material_index, faces in groupFaces.items(): - material = meshObj.material_slots[material_index].material - checkForF3dMaterialInFaces(meshObj, material) - fMaterial, texDimensions = \ - saveOrGetF3DMaterial(material, fModel, meshObj, drawLayerOverride, convertTextureData) - - if fMaterial.useLargeTextures: - currentGroupIndex = saveMeshWithLargeTexturesByFaces(material, faces, - fModel, fMesh, meshObj, drawLayerOverride, convertTextureData, - currentGroupIndex, triConverterInfo, None, None, lastMaterialName) - else: - currentGroupIndex = saveMeshByFaces(material, faces, fModel, fMesh, - meshObj, drawLayerOverride, convertTextureData, currentGroupIndex, - triConverterInfo, None, None, lastMaterialName) - - lastMaterialName = material.name if optimize else None - - fModel.endDraw(fMesh, bone) - - return fMesh, hasSkinnedFaces, lastMaterialName +def ootProcessVertexGroup( + fModel, + meshObj, + vertexGroup, + convertTransformMatrix, + armatureObj, + namePrefix, + meshInfo, + drawLayerOverride, + convertTextureData, + lastMaterialName, +): + + optimize = bpy.context.scene.ootSkeletonExportOptimize + if not optimize: + lastMaterialName = None + + mesh = meshObj.data + currentGroupIndex = getGroupIndexFromname(meshObj, vertexGroup) + nextDLIndex = len(meshInfo.vertexGroupInfo.vertexGroupToMatrixIndex) + vertIndices = [ + vert.index + for vert in meshObj.data.vertices + if meshInfo.vertexGroupInfo.vertexGroups[vert.index] == currentGroupIndex + ] + + if len(vertIndices) == 0: + print("No vert indices in " + vertexGroup) + return None, False, lastMaterialName + + bone = armatureObj.data.bones[vertexGroup] + + # dict of material_index keys to face array values + groupFaces = {} + + hasSkinnedFaces = False + + handledFaces = [] + anyConnectedToUnhandledBone = False + for vertIndex in vertIndices: + if vertIndex not in meshInfo.vert: + continue + for face in meshInfo.vert[vertIndex]: + # Ignore repeat faces + if face in handledFaces: + continue + + connectedToUnhandledBone = False + + # A Blender loop is interpreted as face + loop index + for i in range(3): + faceVertIndex = face.vertices[i] + vertGroupIndex = meshInfo.vertexGroupInfo.vertexGroups[faceVertIndex] + if vertGroupIndex != currentGroupIndex: + hasSkinnedFaces = True + if vertGroupIndex not in meshInfo.vertexGroupInfo.vertexGroupToLimb: + # Connected to a bone not processed yet + # These skinned faces will be handled by that limb + connectedToUnhandledBone = True + anyConnectedToUnhandledBone = True + break + + if connectedToUnhandledBone: + continue + + if face.material_index not in groupFaces: + groupFaces[face.material_index] = [] + groupFaces[face.material_index].append(face) + + handledFaces.append(face) + + if len(groupFaces) == 0: + print("No faces in " + vertexGroup) + + # OOT will only allocate matrix if DL exists. + # This doesn't handle case where vertices belong to a limb, but not triangles. + # Therefore we create a dummy DL + if anyConnectedToUnhandledBone: + fMesh = fModel.addMesh( + vertexGroup, namePrefix, drawLayerOverride, False, bone + ) + fModel.endDraw(fMesh, bone) + meshInfo.vertexGroupInfo.vertexGroupToMatrixIndex[ + currentGroupIndex + ] = nextDLIndex + return fMesh, False, lastMaterialName + else: + return None, False, lastMaterialName + + meshInfo.vertexGroupInfo.vertexGroupToMatrixIndex[currentGroupIndex] = nextDLIndex + triConverterInfo = OOTTriangleConverterInfo( + meshObj, armatureObj.data, fModel.f3d, convertTransformMatrix, meshInfo + ) + + if optimize: + # If one of the materials we need to draw is the currently loaded material, + # do this one first. + newGroupFaces = { + material_index: faces + for material_index, faces in groupFaces.items() + if meshObj.material_slots[material_index].material.name == lastMaterialName + } + newGroupFaces.update(groupFaces) + groupFaces = newGroupFaces + + # Usually we would separate DLs into different draw layers. + # however it seems like OOT skeletons don't have this ability. + # Therefore we always use the drawLayerOverride as the draw layer key. + # This means everything will be saved to one mesh. + fMesh = fModel.addMesh(vertexGroup, namePrefix, drawLayerOverride, False, bone) + + for material_index, faces in groupFaces.items(): + material = meshObj.material_slots[material_index].material + checkForF3dMaterialInFaces(meshObj, material) + fMaterial, texDimensions = saveOrGetF3DMaterial( + material, fModel, meshObj, drawLayerOverride, convertTextureData + ) + + if fMaterial.useLargeTextures: + currentGroupIndex = saveMeshWithLargeTexturesByFaces( + material, + faces, + fModel, + fMesh, + meshObj, + drawLayerOverride, + convertTextureData, + currentGroupIndex, + triConverterInfo, + None, + None, + lastMaterialName, + ) + else: + currentGroupIndex = saveMeshByFaces( + material, + faces, + fModel, + fMesh, + meshObj, + drawLayerOverride, + convertTextureData, + currentGroupIndex, + triConverterInfo, + None, + None, + lastMaterialName, + ) + + lastMaterialName = material.name if optimize else None + + fModel.endDraw(fMesh, bone) + + return fMesh, hasSkinnedFaces, lastMaterialName ootEnumObjectMenu = [ - ("Scene", "Parent Scene Settings", "Scene"), - ("Room", "Parent Room Settings", "Room"), + ("Scene", "Parent Scene Settings", "Scene"), + ("Room", "Parent Room Settings", "Room"), ] -def ootConvertMeshToC(originalObj, finalTransform, f3dType, isHWv1, name, folderName, DLFormat, saveTextures, - exportPath, isCustomExport, drawLayer, removeVanillaData): - name = toAlnum(name) - try: - obj, allObjs = ootDuplicateHierarchy(originalObj, None, False, OOTObjectCategorizer()) +def ootConvertMeshToC( + originalObj, + finalTransform, + f3dType, + isHWv1, + name, + folderName, + DLFormat, + saveTextures, + exportPath, + isCustomExport, + drawLayer, + removeVanillaData, +): + name = toAlnum(name) + + try: + obj, allObjs = ootDuplicateHierarchy( + originalObj, None, False, OOTObjectCategorizer() + ) + + fModel = OOTModel(f3dType, isHWv1, name, DLFormat, drawLayer) + triConverterInfo = TriangleConverterInfo( + obj, None, fModel.f3d, finalTransform, getInfoDict(obj) + ) + fMeshes = saveStaticModel( + triConverterInfo, + fModel, + obj, + finalTransform, + fModel.name, + not saveTextures, + False, + "oot", + ) + + # Since we provide a draw layer override, there should only be one fMesh. + for drawLayer, fMesh in fMeshes.items(): + fMesh.draw.name = name + + ootCleanupScene(originalObj, allObjs) + + except Exception as e: + ootCleanupScene(originalObj, allObjs) + raise Exception(str(e)) + + data = CData() + data.source += '#include "ultra64.h"\n#include "global.h"\n' + if not isCustomExport: + data.source += '#include "' + folderName + '.h"\n\n' + else: + data.source += "\n" + + exportData = fModel.to_c( + TextureExportSettings(False, saveTextures, "test"), + OOTGfxFormatter(ScrollMethod.Vertex), + ) + + data.append(exportData.all()) + + path = ootGetPath( + exportPath, isCustomExport, "assets/objects/", folderName, False, False + ) + writeCData(data, os.path.join(path, name + ".h"), os.path.join(path, name + ".c")) + + if not isCustomExport: + addIncludeFiles(folderName, path, name) + if removeVanillaData: + headerPath = os.path.join(path, folderName + ".h") + sourcePath = os.path.join(path, folderName + ".c") + removeDL(sourcePath, headerPath, name) - fModel = OOTModel(f3dType, isHWv1, name, DLFormat, drawLayer) - triConverterInfo = TriangleConverterInfo(obj, None, fModel.f3d, finalTransform, getInfoDict(obj)) - fMeshes = saveStaticModel(triConverterInfo, fModel, obj, finalTransform, fModel.name, - not saveTextures, False, 'oot') - # Since we provide a draw layer override, there should only be one fMesh. - for drawLayer, fMesh in fMeshes.items(): - fMesh.draw.name = name +class OOT_DisplayListPanel(bpy.types.Panel): + bl_label = "Display List Inspector" + bl_idname = "OBJECT_PT_OOT_DL_Inspector" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "object" + bl_options = {"HIDE_HEADER"} - ootCleanupScene(originalObj, allObjs) + @classmethod + def poll(cls, context): + return context.scene.gameEditorMode == "OOT" and ( + context.object is not None + and isinstance(context.object.data, bpy.types.Mesh) + ) - except Exception as e: - ootCleanupScene(originalObj, allObjs) - raise Exception(str(e)) + def draw(self, context): + box = self.layout.box() + box.box().label(text="OOT DL Inspector") + obj = context.object - data = CData() - data.source += '#include "ultra64.h"\n#include "global.h"\n' - if not isCustomExport: - data.source += '#include "' + folderName + '.h"\n\n' - else: - data.source += '\n' + # prop_split(box, obj, "ootDrawLayer", "Draw Layer") + box.prop(obj, "ignore_render") + box.prop(obj, "ignore_collision") - exportData = fModel.to_c( - TextureExportSettings(False, saveTextures, "test"), OOTGfxFormatter(ScrollMethod.Vertex)) + # Doesn't work since all static meshes are pre-transformed + # box.prop(obj.ootDynamicTransform, "billboard") - data.append(exportData.all()) + # drawParentSceneRoom(box, obj) - path = ootGetPath(exportPath, isCustomExport, 'assets/objects/', folderName, False, False) - writeCData(data, - os.path.join(path, name + '.h'), - os.path.join(path, name + '.c')) - if not isCustomExport: - addIncludeFiles(folderName, path, name) - if removeVanillaData: - headerPath = os.path.join(path, folderName + '.h') - sourcePath = os.path.join(path, folderName + '.c') - removeDL(sourcePath, headerPath, name) - - +class OOT_ImportDL(bpy.types.Operator): + # set bl_ properties + bl_idname = "object.oot_import_dl" + bl_label = "Import DL" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + obj = None + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + + try: + name = context.scene.ootDLImportName + folderName = context.scene.ootDLImportFolderName + importPath = bpy.path.abspath(context.scene.ootDLImportCustomPath) + isCustomImport = context.scene.ootDLImportUseCustomPath + scale = context.scene.ootActorBlenderScale + basePath = bpy.path.abspath(context.scene.ootDecompPath) + removeDoubles = context.scene.ootDLRemoveDoubles + importNormals = context.scene.ootDLImportNormals + drawLayer = bpy.context.scene.ootDLImportDrawLayer + + filepaths = [ootGetObjectPath(isCustomImport, importPath, folderName)] + if not isCustomImport: + filepaths.append( + os.path.join( + bpy.context.scene.ootDecompPath, + "assets/objects/gameplay_keep/gameplay_keep.c", + ) + ) + + importMeshC( + filepaths, + name, + scale, + removeDoubles, + importNormals, + drawLayer, + OOTF3DContext(F3D("F3DEX2/LX2", False), [name], basePath), + ) + + self.report({"INFO"}, "Success!") + return {"FINISHED"} + + except Exception as e: + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + raisePluginError(self, e) + return {"CANCELLED"} # must return a set -class OOT_DisplayListPanel(bpy.types.Panel): - bl_label = "Display List Inspector" - bl_idname = "OBJECT_PT_OOT_DL_Inspector" - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "object" - bl_options = {'HIDE_HEADER'} - @classmethod - def poll(cls, context): - return context.scene.gameEditorMode == "OOT" and \ - (context.object is not None and isinstance(context.object.data, bpy.types.Mesh)) +class OOT_ExportDL(bpy.types.Operator): + # set bl_ properties + bl_idname = "object.oot_export_dl" + bl_label = "Export DL" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + obj = None + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + if len(context.selected_objects) == 0: + raise PluginError("Mesh not selected.") + obj = context.active_object + if type(obj.data) is not bpy.types.Mesh: + raise PluginError("Mesh not selected.") + + finalTransform = mathutils.Matrix.Scale(context.scene.ootActorBlenderScale, 4) + + try: + # exportPath, levelName = getPathAndLevel(context.scene.geoCustomExport, + # context.scene.geoExportPath, context.scene.geoLevelName, + # context.scene.geoLevelOption) + + saveTextures = ( + bpy.context.scene.saveTextures + or bpy.context.scene.ignoreTextureRestrictions + ) + isHWv1 = context.scene.isHWv1 + f3dType = context.scene.f3d_type + + name = context.scene.ootDLExportName + folderName = context.scene.ootDLExportFolderName + exportPath = bpy.path.abspath(context.scene.ootDLExportCustomPath) + isCustomExport = context.scene.ootDLExportUseCustomPath + drawLayer = context.scene.ootDLExportDrawLayer + removeVanillaData = context.scene.ootDLRemoveVanillaData + + ootConvertMeshToC( + obj, + finalTransform, + f3dType, + isHWv1, + name, + folderName, + DLFormat.Static, + saveTextures, + exportPath, + isCustomExport, + drawLayer, + removeVanillaData, + ) + + self.report({"INFO"}, "Success!") + return {"FINISHED"} + + except Exception as e: + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + raisePluginError(self, e) + return {"CANCELLED"} # must return a set - def draw(self, context): - box = self.layout.box() - box.box().label(text = 'OOT DL Inspector') - obj = context.object - #prop_split(box, obj, "ootDrawLayer", "Draw Layer") - box.prop(obj, "ignore_render") - box.prop(obj, "ignore_collision") +class OOT_ExportDLPanel(OOT_Panel): + bl_idname = "OOT_PT_export_dl" + bl_label = "OOT DL Exporter" - # Doesn't work since all static meshes are pre-transformed - #box.prop(obj.ootDynamicTransform, "billboard") + # called every frame + def draw(self, context): + col = self.layout.column() + col.operator(OOT_ExportDL.bl_idname) - #drawParentSceneRoom(box, obj) + prop_split(col, context.scene, "ootDLExportName", "DL") + if context.scene.ootDLExportUseCustomPath: + prop_split(col, context.scene, "ootDLExportCustomPath", "Folder") + else: + prop_split(col, context.scene, "ootDLExportFolderName", "Object") + prop_split(col, context.scene, "ootDLExportDrawLayer", "Export Draw Layer") + col.prop(context.scene, "ootDLExportUseCustomPath") + col.prop(context.scene, "ootDLRemoveVanillaData") -class OOT_ImportDL(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.oot_import_dl' - bl_label = "Import DL" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - obj = None - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = "OBJECT") - - try: - name = context.scene.ootDLImportName - folderName = context.scene.ootDLImportFolderName - importPath = bpy.path.abspath(context.scene.ootDLImportCustomPath) - isCustomImport = context.scene.ootDLImportUseCustomPath - scale = context.scene.ootActorBlenderScale - basePath = bpy.path.abspath(context.scene.ootDecompPath) - removeDoubles = context.scene.ootDLRemoveDoubles - importNormals = context.scene.ootDLImportNormals - drawLayer = bpy.context.scene.ootDLImportDrawLayer - - filepaths = [ootGetObjectPath(isCustomImport, importPath, folderName)] - if not isCustomImport: - filepaths.append(os.path.join(bpy.context.scene.ootDecompPath, "assets/objects/gameplay_keep/gameplay_keep.c")) - - importMeshC(filepaths, name, scale, removeDoubles, importNormals, drawLayer, - OOTF3DContext(F3D("F3DEX2/LX2", False), [name], basePath)) - - self.report({'INFO'}, 'Success!') - return {'FINISHED'} - - except Exception as e: - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - raisePluginError(self, e) - return {'CANCELLED'} # must return a set + col.operator(OOT_ImportDL.bl_idname) -class OOT_ExportDL(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.oot_export_dl' - bl_label = "Export DL" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - obj = None - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = "OBJECT") - if len(context.selected_objects) == 0: - raise PluginError("Mesh not selected.") - obj = context.active_object - if type(obj.data) is not bpy.types.Mesh: - raise PluginError("Mesh not selected.") - - finalTransform = mathutils.Matrix.Scale(context.scene.ootActorBlenderScale, 4) - - try: - #exportPath, levelName = getPathAndLevel(context.scene.geoCustomExport, - # context.scene.geoExportPath, context.scene.geoLevelName, - # context.scene.geoLevelOption) - - saveTextures = bpy.context.scene.saveTextures or bpy.context.scene.ignoreTextureRestrictions - isHWv1 = context.scene.isHWv1 - f3dType = context.scene.f3d_type - - name = context.scene.ootDLExportName - folderName = context.scene.ootDLExportFolderName - exportPath = bpy.path.abspath(context.scene.ootDLExportCustomPath) - isCustomExport = context.scene.ootDLExportUseCustomPath - drawLayer = context.scene.ootDLExportDrawLayer - removeVanillaData = context.scene.ootDLRemoveVanillaData - - ootConvertMeshToC(obj, finalTransform, - f3dType, isHWv1, name, folderName, DLFormat.Static, saveTextures, - exportPath, isCustomExport, drawLayer, removeVanillaData) - - self.report({'INFO'}, 'Success!') - return {'FINISHED'} - - except Exception as e: - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - raisePluginError(self, e) - return {'CANCELLED'} # must return a set + prop_split(col, context.scene, "ootDLImportName", "DL") + if context.scene.ootDLImportUseCustomPath: + prop_split(col, context.scene, "ootDLImportCustomPath", "File") + else: + prop_split(col, context.scene, "ootDLImportFolderName", "Object") + prop_split(col, context.scene, "ootDLImportDrawLayer", "Import Draw Layer") + + col.prop(context.scene, "ootDLImportUseCustomPath") + col.prop(context.scene, "ootDLRemoveDoubles") + col.prop(context.scene, "ootDLImportNormals") -class OOT_ExportDLPanel(OOT_Panel): - bl_idname = "OOT_PT_export_dl" - bl_label = "OOT DL Exporter" - - # called every frame - def draw(self, context): - col = self.layout.column() - col.operator(OOT_ExportDL.bl_idname) - - prop_split(col, context.scene, 'ootDLExportName', "DL") - if context.scene.ootDLExportUseCustomPath: - prop_split(col, context.scene, 'ootDLExportCustomPath', "Folder") - else: - prop_split(col, context.scene, 'ootDLExportFolderName', "Object") - prop_split(col, context.scene, "ootDLExportDrawLayer", "Export Draw Layer") - col.prop(context.scene, "ootDLExportUseCustomPath") - col.prop(context.scene, "ootDLRemoveVanillaData") - - col.operator(OOT_ImportDL.bl_idname) - - prop_split(col, context.scene, 'ootDLImportName', "DL") - if context.scene.ootDLImportUseCustomPath: - prop_split(col, context.scene, 'ootDLImportCustomPath', "File") - else: - prop_split(col, context.scene, 'ootDLImportFolderName', "Object") - prop_split(col, context.scene, "ootDLImportDrawLayer", "Import Draw Layer") - - col.prop(context.scene, "ootDLImportUseCustomPath") - col.prop(context.scene, "ootDLRemoveDoubles") - col.prop(context.scene, "ootDLImportNormals") class OOTDefaultRenderModesProperty(bpy.types.PropertyGroup): - expandTab : bpy.props.BoolProperty() - opaqueCycle1 : bpy.props.StringProperty(default = "G_RM_AA_ZB_OPA_SURF") - opaqueCycle2 : bpy.props.StringProperty(default = "G_RM_AA_ZB_OPA_SURF2") - transparentCycle1 : bpy.props.StringProperty(default = "G_RM_AA_ZB_XLU_SURF") - transparentCycle2 : bpy.props.StringProperty(default = "G_RM_AA_ZB_XLU_SURF2") - overlayCycle1 : bpy.props.StringProperty(default = "G_RM_AA_ZB_OPA_SURF") - overlayCycle2 : bpy.props.StringProperty(default = "G_RM_AA_ZB_OPA_SURF2") + expandTab: bpy.props.BoolProperty() + opaqueCycle1: bpy.props.StringProperty(default="G_RM_AA_ZB_OPA_SURF") + opaqueCycle2: bpy.props.StringProperty(default="G_RM_AA_ZB_OPA_SURF2") + transparentCycle1: bpy.props.StringProperty(default="G_RM_AA_ZB_XLU_SURF") + transparentCycle2: bpy.props.StringProperty(default="G_RM_AA_ZB_XLU_SURF2") + overlayCycle1: bpy.props.StringProperty(default="G_RM_AA_ZB_OPA_SURF") + overlayCycle2: bpy.props.StringProperty(default="G_RM_AA_ZB_OPA_SURF2") + class OOT_DrawLayersPanel(bpy.types.Panel): - bl_label = "OOT Draw Layers" - bl_idname = "WORLD_PT_OOT_Draw_Layers_Panel" - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "world" - bl_options = {'HIDE_HEADER'} - - @classmethod - def poll(cls, context): - return context.scene.gameEditorMode == "OOT" - - def draw(self, context): - ootDefaultRenderModeProp = context.scene.world.ootDefaultRenderModes - layout = self.layout - - inputGroup = layout.column() - inputGroup.prop(ootDefaultRenderModeProp, 'expandTab', - text = 'Default Render Modes', - icon = 'TRIA_DOWN' if ootDefaultRenderModeProp.expandTab else 'TRIA_RIGHT') - if ootDefaultRenderModeProp.expandTab: - prop_split(inputGroup, ootDefaultRenderModeProp, "opaqueCycle1", "Opaque Cycle 1") - prop_split(inputGroup, ootDefaultRenderModeProp, "opaqueCycle2", "Opaque Cycle 2") - prop_split(inputGroup, ootDefaultRenderModeProp, "transparentCycle1", "Transparent Cycle 1") - prop_split(inputGroup, ootDefaultRenderModeProp, "transparentCycle2", "Transparent Cycle 2") - prop_split(inputGroup, ootDefaultRenderModeProp, "overlayCycle1", "Overlay Cycle 1") - prop_split(inputGroup, ootDefaultRenderModeProp, "overlayCycle2", "Overlay Cycle 2") + bl_label = "OOT Draw Layers" + bl_idname = "WORLD_PT_OOT_Draw_Layers_Panel" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "world" + bl_options = {"HIDE_HEADER"} + + @classmethod + def poll(cls, context): + return context.scene.gameEditorMode == "OOT" + + def draw(self, context): + ootDefaultRenderModeProp = context.scene.world.ootDefaultRenderModes + layout = self.layout + + inputGroup = layout.column() + inputGroup.prop( + ootDefaultRenderModeProp, + "expandTab", + text="Default Render Modes", + icon="TRIA_DOWN" if ootDefaultRenderModeProp.expandTab else "TRIA_RIGHT", + ) + if ootDefaultRenderModeProp.expandTab: + prop_split( + inputGroup, ootDefaultRenderModeProp, "opaqueCycle1", "Opaque Cycle 1" + ) + prop_split( + inputGroup, ootDefaultRenderModeProp, "opaqueCycle2", "Opaque Cycle 2" + ) + prop_split( + inputGroup, + ootDefaultRenderModeProp, + "transparentCycle1", + "Transparent Cycle 1", + ) + prop_split( + inputGroup, + ootDefaultRenderModeProp, + "transparentCycle2", + "Transparent Cycle 2", + ) + prop_split( + inputGroup, ootDefaultRenderModeProp, "overlayCycle1", "Overlay Cycle 1" + ) + prop_split( + inputGroup, ootDefaultRenderModeProp, "overlayCycle2", "Overlay Cycle 2" + ) + class OOT_MaterialPanel(bpy.types.Panel): - bl_label = "OOT Material" - bl_idname = "MATERIAL_PT_OOT_Material_Inspector" - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "material" - bl_options = {'HIDE_HEADER'} - - @classmethod - def poll(cls, context): - return context.material is not None and context.scene.gameEditorMode == "OOT" - - def draw(self, context): - layout = self.layout - mat = context.material - col = layout.column() - - if hasattr(context, "object") and context.object is not None and \ - context.object.parent is not None and isinstance(context.object.parent.data, bpy.types.Armature): - drawLayer = context.object.parent.ootDrawLayer - if drawLayer != mat.f3d_mat.draw_layer.oot: - col.label(text = "Draw layer is being overriden by skeleton.", icon = 'OUTLINER_DATA_ARMATURE') - else: - drawLayer = mat.f3d_mat.draw_layer.oot - - drawOOTMaterialProperty(col.box().column(), mat.ootMaterial, drawLayer) + bl_label = "OOT Material" + bl_idname = "MATERIAL_PT_OOT_Material_Inspector" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "material" + bl_options = {"HIDE_HEADER"} + + @classmethod + def poll(cls, context): + return context.material is not None and context.scene.gameEditorMode == "OOT" + + def draw(self, context): + layout = self.layout + mat = context.material + col = layout.column() + + if ( + hasattr(context, "object") + and context.object is not None + and context.object.parent is not None + and isinstance(context.object.parent.data, bpy.types.Armature) + ): + drawLayer = context.object.parent.ootDrawLayer + if drawLayer != mat.f3d_mat.draw_layer.oot: + col.label( + text="Draw layer is being overriden by skeleton.", + icon="OUTLINER_DATA_ARMATURE", + ) + else: + drawLayer = mat.f3d_mat.draw_layer.oot + + drawOOTMaterialProperty(col.box().column(), mat.ootMaterial, drawLayer) + def drawOOTMaterialDrawLayerProperty(layout, matDrawLayerProp, suffix): - #layout.box().row().label(text = title) - row = layout.row() - for colIndex in range(2): - col = row.column() - for rowIndex in range(3): - i = 8 + colIndex * 3 + rowIndex - name = "Segment " + format(i, 'X') + " " + suffix - col.prop(matDrawLayerProp, "segment" + format(i, 'X'), text = name) - name = "Custom call (" + str(colIndex + 1) + ") " + suffix - p = "customCall" + str(colIndex) - col.prop(matDrawLayerProp, p, text = name) - if getattr(matDrawLayerProp, p): - col.prop(matDrawLayerProp, p + "_seg", text = "") - -drawLayerSuffix = { - "Opaque" : "OPA", - "Transparent" : 'XLU', - "Overlay" : "OVL" -} + # layout.box().row().label(text = title) + row = layout.row() + for colIndex in range(2): + col = row.column() + for rowIndex in range(3): + i = 8 + colIndex * 3 + rowIndex + name = "Segment " + format(i, "X") + " " + suffix + col.prop(matDrawLayerProp, "segment" + format(i, "X"), text=name) + name = "Custom call (" + str(colIndex + 1) + ") " + suffix + p = "customCall" + str(colIndex) + col.prop(matDrawLayerProp, p, text=name) + if getattr(matDrawLayerProp, p): + col.prop(matDrawLayerProp, p + "_seg", text="") + + +drawLayerSuffix = {"Opaque": "OPA", "Transparent": "XLU", "Overlay": "OVL"} + def drawOOTMaterialProperty(layout, matProp, drawLayer): - if drawLayer == "Overlay": - return - suffix = "(" + drawLayerSuffix[drawLayer] + ")" - layout.box().column().label(text = "OOT Dynamic Material Properties " + suffix) - layout.label(text = "See gSPSegment calls in z_scene_table.c.") - layout.label(text = "Based off draw config index in gSceneTable.") - drawOOTMaterialDrawLayerProperty(layout.column(), getattr(matProp, drawLayer.lower()), suffix) - + if drawLayer == "Overlay": + return + suffix = "(" + drawLayerSuffix[drawLayer] + ")" + layout.box().column().label(text="OOT Dynamic Material Properties " + suffix) + layout.label(text="See gSPSegment calls in z_scene_table.c.") + layout.label(text="Based off draw config index in gSceneTable.") + drawOOTMaterialDrawLayerProperty( + layout.column(), getattr(matProp, drawLayer.lower()), suffix + ) + class OOTDynamicMaterialDrawLayerProperty(bpy.types.PropertyGroup): - segment8 : bpy.props.BoolProperty() - segment9 : bpy.props.BoolProperty() - segmentA : bpy.props.BoolProperty() - segmentB : bpy.props.BoolProperty() - segmentC : bpy.props.BoolProperty() - segmentD : bpy.props.BoolProperty() - customCall0 : bpy.props.BoolProperty() - customCall0_seg : bpy.props.StringProperty(description="Segment address of a display list to call, e.g. 0x08000010") - customCall1 : bpy.props.BoolProperty() - customCall1_seg : bpy.props.StringProperty(description="Segment address of a display list to call, e.g. 0x08000010") - -# The reason these are separate is for the case when the user changes the material draw layer, but not the + segment8: bpy.props.BoolProperty() + segment9: bpy.props.BoolProperty() + segmentA: bpy.props.BoolProperty() + segmentB: bpy.props.BoolProperty() + segmentC: bpy.props.BoolProperty() + segmentD: bpy.props.BoolProperty() + customCall0: bpy.props.BoolProperty() + customCall0_seg: bpy.props.StringProperty( + description="Segment address of a display list to call, e.g. 0x08000010" + ) + customCall1: bpy.props.BoolProperty() + customCall1_seg: bpy.props.StringProperty( + description="Segment address of a display list to call, e.g. 0x08000010" + ) + + +# The reason these are separate is for the case when the user changes the material draw layer, but not the # dynamic material calls. This could cause crashes which would be hard to detect. class OOTDynamicMaterialProperty(bpy.types.PropertyGroup): - opaque : bpy.props.PointerProperty(type = OOTDynamicMaterialDrawLayerProperty) - transparent : bpy.props.PointerProperty(type = OOTDynamicMaterialDrawLayerProperty) + opaque: bpy.props.PointerProperty(type=OOTDynamicMaterialDrawLayerProperty) + transparent: bpy.props.PointerProperty(type=OOTDynamicMaterialDrawLayerProperty) + oot_dl_writer_classes = ( - OOTDefaultRenderModesProperty, - OOTDynamicMaterialDrawLayerProperty, - OOTDynamicMaterialProperty, - OOTDynamicTransformProperty, - OOT_ExportDL, - OOT_ImportDL, + OOTDefaultRenderModesProperty, + OOTDynamicMaterialDrawLayerProperty, + OOTDynamicMaterialProperty, + OOTDynamicTransformProperty, + OOT_ExportDL, + OOT_ImportDL, ) oot_dl_writer_panel_classes = ( - #OOT_ExportDLPanel, - OOT_DisplayListPanel, - OOT_DrawLayersPanel, - OOT_MaterialPanel, - OOT_ExportDLPanel, + # OOT_ExportDLPanel, + OOT_DisplayListPanel, + OOT_DrawLayersPanel, + OOT_MaterialPanel, + OOT_ExportDLPanel, ) + def oot_dl_writer_panel_register(): - for cls in oot_dl_writer_panel_classes: - register_class(cls) + for cls in oot_dl_writer_panel_classes: + register_class(cls) + def oot_dl_writer_panel_unregister(): - for cls in oot_dl_writer_panel_classes: - unregister_class(cls) + for cls in oot_dl_writer_panel_classes: + unregister_class(cls) + def oot_dl_writer_register(): - for cls in oot_dl_writer_classes: - register_class(cls) - - bpy.types.Object.ootDrawLayer = bpy.props.EnumProperty(items = ootEnumDrawLayers, default = 'Opaque') - - # Doesn't work since all static meshes are pre-transformed - #bpy.types.Object.ootDynamicTransform = bpy.props.PointerProperty(type = OOTDynamicTransformProperty) - bpy.types.World.ootDefaultRenderModes = bpy.props.PointerProperty(type = OOTDefaultRenderModesProperty) - - bpy.types.Scene.ootDLExportName = bpy.props.StringProperty( - name = "DL Name", default = "gBoulderFragmentsDL") - bpy.types.Scene.ootDLExportFolderName = bpy.props.StringProperty( - name = "DL Folder", default = "gameplay_keep") - bpy.types.Scene.ootDLExportCustomPath = bpy.props.StringProperty( - name ='Custom DL Path', subtype = 'FILE_PATH') - bpy.types.Scene.ootDLExportUseCustomPath = bpy.props.BoolProperty( - name = "Use Custom Path") - bpy.types.Scene.ootDLRemoveVanillaData = bpy.props.BoolProperty( - name = "Replace Vanilla DLs") - - bpy.types.Scene.ootDLImportName = bpy.props.StringProperty( - name = "DL Name", default = "gBoulderFragmentsDL") - bpy.types.Scene.ootDLImportFolderName = bpy.props.StringProperty( - name = "DL Folder", default = "gameplay_keep") - bpy.types.Scene.ootDLImportCustomPath = bpy.props.StringProperty( - name ='Custom DL Path', subtype = 'FILE_PATH') - bpy.types.Scene.ootDLImportUseCustomPath = bpy.props.BoolProperty( - name = "Use Custom Path") - - bpy.types.Scene.ootDLRemoveDoubles = bpy.props.BoolProperty(name = "Remove Doubles", default = True) - bpy.types.Scene.ootDLImportNormals = bpy.props.BoolProperty(name = "Import Normals", default = True) - bpy.types.Scene.ootDLImportDrawLayer = bpy.props.EnumProperty(name = "Draw Layer", items = ootEnumDrawLayers) - - bpy.types.Scene.ootDLExportDrawLayer = bpy.props.EnumProperty(name = "Draw Layer", items = ootEnumDrawLayers) - - bpy.types.Material.ootMaterial = bpy.props.PointerProperty(type = OOTDynamicMaterialProperty) - bpy.types.Object.ootObjectMenu = bpy.props.EnumProperty(items = ootEnumObjectMenu) + for cls in oot_dl_writer_classes: + register_class(cls) + + bpy.types.Object.ootDrawLayer = bpy.props.EnumProperty( + items=ootEnumDrawLayers, default="Opaque" + ) + + # Doesn't work since all static meshes are pre-transformed + # bpy.types.Object.ootDynamicTransform = bpy.props.PointerProperty(type = OOTDynamicTransformProperty) + bpy.types.World.ootDefaultRenderModes = bpy.props.PointerProperty( + type=OOTDefaultRenderModesProperty + ) + + bpy.types.Scene.ootDLExportName = bpy.props.StringProperty( + name="DL Name", default="gBoulderFragmentsDL" + ) + bpy.types.Scene.ootDLExportFolderName = bpy.props.StringProperty( + name="DL Folder", default="gameplay_keep" + ) + bpy.types.Scene.ootDLExportCustomPath = bpy.props.StringProperty( + name="Custom DL Path", subtype="FILE_PATH" + ) + bpy.types.Scene.ootDLExportUseCustomPath = bpy.props.BoolProperty( + name="Use Custom Path" + ) + bpy.types.Scene.ootDLRemoveVanillaData = bpy.props.BoolProperty( + name="Replace Vanilla DLs" + ) + + bpy.types.Scene.ootDLImportName = bpy.props.StringProperty( + name="DL Name", default="gBoulderFragmentsDL" + ) + bpy.types.Scene.ootDLImportFolderName = bpy.props.StringProperty( + name="DL Folder", default="gameplay_keep" + ) + bpy.types.Scene.ootDLImportCustomPath = bpy.props.StringProperty( + name="Custom DL Path", subtype="FILE_PATH" + ) + bpy.types.Scene.ootDLImportUseCustomPath = bpy.props.BoolProperty( + name="Use Custom Path" + ) + + bpy.types.Scene.ootDLRemoveDoubles = bpy.props.BoolProperty( + name="Remove Doubles", default=True + ) + bpy.types.Scene.ootDLImportNormals = bpy.props.BoolProperty( + name="Import Normals", default=True + ) + bpy.types.Scene.ootDLImportDrawLayer = bpy.props.EnumProperty( + name="Draw Layer", items=ootEnumDrawLayers + ) + + bpy.types.Scene.ootDLExportDrawLayer = bpy.props.EnumProperty( + name="Draw Layer", items=ootEnumDrawLayers + ) + + bpy.types.Material.ootMaterial = bpy.props.PointerProperty( + type=OOTDynamicMaterialProperty + ) + bpy.types.Object.ootObjectMenu = bpy.props.EnumProperty(items=ootEnumObjectMenu) + def oot_dl_writer_unregister(): - for cls in reversed(oot_dl_writer_classes): - unregister_class(cls) + for cls in reversed(oot_dl_writer_classes): + unregister_class(cls) - del bpy.types.Scene.ootDLExportName - del bpy.types.Scene.ootDLExportFolderName - del bpy.types.Scene.ootDLExportCustomPath - del bpy.types.Scene.ootDLExportUseCustomPath - del bpy.types.Scene.ootDLRemoveVanillaData + del bpy.types.Scene.ootDLExportName + del bpy.types.Scene.ootDLExportFolderName + del bpy.types.Scene.ootDLExportCustomPath + del bpy.types.Scene.ootDLExportUseCustomPath + del bpy.types.Scene.ootDLRemoveVanillaData - del bpy.types.Scene.ootDLImportName - del bpy.types.Scene.ootDLImportFolderName - del bpy.types.Scene.ootDLImportCustomPath - del bpy.types.Scene.ootDLImportUseCustomPath + del bpy.types.Scene.ootDLImportName + del bpy.types.Scene.ootDLImportFolderName + del bpy.types.Scene.ootDLImportCustomPath + del bpy.types.Scene.ootDLImportUseCustomPath - del bpy.types.Scene.ootDLRemoveDoubles - del bpy.types.Scene.ootDLImportNormals - del bpy.types.Scene.ootDLImportDrawLayer + del bpy.types.Scene.ootDLRemoveDoubles + del bpy.types.Scene.ootDLImportNormals + del bpy.types.Scene.ootDLImportDrawLayer - del bpy.types.Scene.ootDLExportDrawLayer + del bpy.types.Scene.ootDLExportDrawLayer - del bpy.types.Material.ootMaterial - del bpy.types.Object.ootObjectMenu + del bpy.types.Material.ootMaterial + del bpy.types.Object.ootObjectMenu diff --git a/fast64_internal/oot/oot_level.py b/fast64_internal/oot/oot_level.py index 3a524779b..1ebbea736 100644 --- a/fast64_internal/oot/oot_level.py +++ b/fast64_internal/oot/oot_level.py @@ -9,255 +9,323 @@ from .oot_actor import * from .oot_collision import * from .oot_spline import * -#from .oot_function_map import func_map + +# from .oot_function_map import func_map from ..utility import * + def headerSettingsToIndices(headerSettings): - headers = set() - if headerSettings.childDayHeader: - headers.add(0) - if headerSettings.childNightHeader: - headers.add(1) - if headerSettings.adultDayHeader: - headers.add(2) - if headerSettings.adultNightHeader: - headers.add(3) - for cutsceneHeader in headerSettings.cutsceneHeaders: - headers.add(cutsceneHeader.headerIndex) - - return headers + headers = set() + if headerSettings.childDayHeader: + headers.add(0) + if headerSettings.childNightHeader: + headers.add(1) + if headerSettings.adultDayHeader: + headers.add(2) + if headerSettings.adultNightHeader: + headers.add(3) + for cutsceneHeader in headerSettings.cutsceneHeaders: + headers.add(cutsceneHeader.headerIndex) + + return headers + # These are all done in reference to refresh 8 def handleRefreshDiffModelIDs(modelID): - if bpy.context.scene.refreshVer == 'Refresh 8' or \ - bpy.context.scene.refreshVer == 'Refresh 7': - pass - elif bpy.context.scene.refreshVer == 'Refresh 6': - if modelID == 'MODEL_TWEESTER': - modelID = 'MODEL_TORNADO' - elif bpy.context.scene.refreshVer == 'Refresh 5' or \ - bpy.context.scene.refreshVer == 'Refresh 4' or \ - bpy.context.scene.refreshVer == 'Refresh 3': - if modelID == 'MODEL_TWEESTER': - modelID = 'MODEL_TORNADO' - elif modelID == 'MODEL_WAVE_TRAIL': - modelID = "MODEL_WATER_WAVES" - elif modelID == 'MODEL_IDLE_WATER_WAVE': - modelID = 'MODEL_WATER_WAVES_SURF' - elif modelID == 'MODEL_SMALL_WATER_SPLASH': - modelID = 'MODEL_SPOT_ON_GROUND' - - return modelID + if ( + bpy.context.scene.refreshVer == "Refresh 8" + or bpy.context.scene.refreshVer == "Refresh 7" + ): + pass + elif bpy.context.scene.refreshVer == "Refresh 6": + if modelID == "MODEL_TWEESTER": + modelID = "MODEL_TORNADO" + elif ( + bpy.context.scene.refreshVer == "Refresh 5" + or bpy.context.scene.refreshVer == "Refresh 4" + or bpy.context.scene.refreshVer == "Refresh 3" + ): + if modelID == "MODEL_TWEESTER": + modelID = "MODEL_TORNADO" + elif modelID == "MODEL_WAVE_TRAIL": + modelID = "MODEL_WATER_WAVES" + elif modelID == "MODEL_IDLE_WATER_WAVE": + modelID = "MODEL_WATER_WAVES_SURF" + elif modelID == "MODEL_SMALL_WATER_SPLASH": + modelID = "MODEL_SPOT_ON_GROUND" + + return modelID + class OOTObjectPanel(bpy.types.Panel): - bl_label = "Object Inspector" - bl_idname = "OBJECT_PT_OOT_Object_Inspector" - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "object" - bl_options = {'HIDE_HEADER'} - - @classmethod - def poll(cls, context): - return context.scene.gameEditorMode == "OOT" and (context.object is not None and context.object.data is None) - - def draw(self, context): - prop_split(self.layout, context.scene, "gameEditorMode", "Game") - box = self.layout.box() - box.box().label(text = 'OOT Object Inspector') - obj = context.object - objName = obj.name - prop_split(box, obj, 'ootEmptyType', 'Object Type') - - sceneObj = getSceneObj(obj) - roomObj = getRoomObj(obj) - - altSceneProp = sceneObj.ootAlternateSceneHeaders if sceneObj is not None else None - altRoomProp = roomObj.ootAlternateRoomHeaders if roomObj is not None else None - - if obj.ootEmptyType == 'Actor': - drawActorProperty(box, obj.ootActorProperty, altRoomProp, objName) - - elif obj.ootEmptyType == 'Transition Actor': - drawTransitionActorProperty(box, obj.ootTransitionActorProperty, altSceneProp, roomObj, objName) - - elif obj.ootEmptyType == 'Water Box': - drawWaterBoxProperty(box, obj.ootWaterBoxProperty) - - elif obj.ootEmptyType == 'Scene': - drawSceneHeaderProperty(box, obj.ootSceneHeader, None, None, objName) - if obj.ootSceneHeader.menuTab == 'Alternate': - drawAlternateSceneHeaderProperty(box, obj.ootAlternateSceneHeaders, objName) - box.prop(obj.fast64.oot.scene, "write_dummy_room_list") - - elif obj.ootEmptyType == 'Room': - drawRoomHeaderProperty(box, obj.ootRoomHeader, None, None, objName) - if obj.ootRoomHeader.menuTab == 'Alternate': - drawAlternateRoomHeaderProperty(box, obj.ootAlternateRoomHeaders, objName) - - elif obj.ootEmptyType == 'Entrance': - drawEntranceProperty(box, obj, altSceneProp, objName) - - elif obj.ootEmptyType == "Cull Group": - drawCullGroupProperty(box, obj) - - elif obj.ootEmptyType == 'LOD': - drawLODProperty(box, obj) - - elif obj.ootEmptyType == 'Cutscene': - drawCutsceneProperty(box, obj) - - elif obj.ootEmptyType == 'None': - box.label(text = 'Geometry can be parented to this.') - - #if obj.ootEmptyType != "Scene" and obj.ootEmptyType != "Room": - # drawParentSceneRoom(box, context.object) + bl_label = "Object Inspector" + bl_idname = "OBJECT_PT_OOT_Object_Inspector" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "object" + bl_options = {"HIDE_HEADER"} + + @classmethod + def poll(cls, context): + return context.scene.gameEditorMode == "OOT" and ( + context.object is not None and context.object.data is None + ) + + def draw(self, context): + prop_split(self.layout, context.scene, "gameEditorMode", "Game") + box = self.layout.box() + box.box().label(text="OOT Object Inspector") + obj = context.object + objName = obj.name + prop_split(box, obj, "ootEmptyType", "Object Type") + + sceneObj = getSceneObj(obj) + roomObj = getRoomObj(obj) + + altSceneProp = ( + sceneObj.ootAlternateSceneHeaders if sceneObj is not None else None + ) + altRoomProp = roomObj.ootAlternateRoomHeaders if roomObj is not None else None + + if obj.ootEmptyType == "Actor": + drawActorProperty(box, obj.ootActorProperty, altRoomProp, objName) + + elif obj.ootEmptyType == "Transition Actor": + drawTransitionActorProperty( + box, obj.ootTransitionActorProperty, altSceneProp, roomObj, objName + ) + + elif obj.ootEmptyType == "Water Box": + drawWaterBoxProperty(box, obj.ootWaterBoxProperty) + + elif obj.ootEmptyType == "Scene": + drawSceneHeaderProperty(box, obj.ootSceneHeader, None, None, objName) + if obj.ootSceneHeader.menuTab == "Alternate": + drawAlternateSceneHeaderProperty( + box, obj.ootAlternateSceneHeaders, objName + ) + box.prop(obj.fast64.oot.scene, "write_dummy_room_list") + + elif obj.ootEmptyType == "Room": + drawRoomHeaderProperty(box, obj.ootRoomHeader, None, None, objName) + if obj.ootRoomHeader.menuTab == "Alternate": + drawAlternateRoomHeaderProperty( + box, obj.ootAlternateRoomHeaders, objName + ) + + elif obj.ootEmptyType == "Entrance": + drawEntranceProperty(box, obj, altSceneProp, objName) + + elif obj.ootEmptyType == "Cull Group": + drawCullGroupProperty(box, obj) + + elif obj.ootEmptyType == "LOD": + drawLODProperty(box, obj) + + elif obj.ootEmptyType == "Cutscene": + drawCutsceneProperty(box, obj) + + elif obj.ootEmptyType == "None": + box.label(text="Geometry can be parented to this.") + + # if obj.ootEmptyType != "Scene" and obj.ootEmptyType != "Room": + # drawParentSceneRoom(box, context.object) + def drawLODProperty(box, obj): - col = box.column() - col.box().label(text = "LOD Settings (Blender Units)") - #if bpy.context.scene.exportHiddenGeometry: - # for otherObj in bpy.data.objects: - # if otherObj.parent == obj: - # prop_split(col, otherObj, "f3d_lod_z", otherObj.name) - #else: - # for otherObj in obj.children: - # prop_split(col, otherObj, "f3d_lod_z", otherObj.name) - for otherObj in obj.children: - if bpy.context.scene.exportHiddenGeometry or not otherObj.hide_get(): - prop_split(col, otherObj, "f3d_lod_z", otherObj.name) - col.prop(obj, "f3d_lod_always_render_farthest") + col = box.column() + col.box().label(text="LOD Settings (Blender Units)") + # if bpy.context.scene.exportHiddenGeometry: + # for otherObj in bpy.data.objects: + # if otherObj.parent == obj: + # prop_split(col, otherObj, "f3d_lod_z", otherObj.name) + # else: + # for otherObj in obj.children: + # prop_split(col, otherObj, "f3d_lod_z", otherObj.name) + for otherObj in obj.children: + if bpy.context.scene.exportHiddenGeometry or not otherObj.hide_get(): + prop_split(col, otherObj, "f3d_lod_z", otherObj.name) + col.prop(obj, "f3d_lod_always_render_farthest") + def drawCullGroupProperty(box, obj): - col = box.column() - #prop_split(col, obj, 'ootCullDepth', "Cull Depth") - #col.label(text = "Depth behind the camera at which point culling happens.") - col.label(text = "Use Options -> Transform -> Affect Only -> Parent ") - col.label(text = "to move object without affecting children.") + col = box.column() + # prop_split(col, obj, 'ootCullDepth', "Cull Depth") + # col.label(text = "Depth behind the camera at which point culling happens.") + col.label(text="Use Options -> Transform -> Affect Only -> Parent ") + col.label(text="to move object without affecting children.") + def setLightPropertyValues(lightProp, ambient, diffuse0, diffuse1, fogColor, fogNear): - lightProp.ambient = gammaInverse([value / 255 for value in ambient]) + [1] - lightProp.diffuse0 = gammaInverse([value / 255 for value in diffuse0]) + [1] - lightProp.diffuse1 = gammaInverse([value / 255 for value in diffuse1]) + [1] - lightProp.fogColor = gammaInverse([value / 255 for value in fogColor]) + [1] - lightProp.fogNear = fogNear - + lightProp.ambient = gammaInverse([value / 255 for value in ambient]) + [1] + lightProp.diffuse0 = gammaInverse([value / 255 for value in diffuse0]) + [1] + lightProp.diffuse1 = gammaInverse([value / 255 for value in diffuse1]) + [1] + lightProp.fogColor = gammaInverse([value / 255 for value in fogColor]) + [1] + lightProp.fogNear = fogNear + + def onUpdateOOTEmptyType(self, context): - isNoneEmpty = self.ootEmptyType == "None" - isBoxEmpty = self.ootEmptyType == 'Water Box' - isSphereEmpty = self.ootEmptyType == "Cull Group" - self.show_name = not (isBoxEmpty or isNoneEmpty or isSphereEmpty) - self.show_axis = not (isBoxEmpty or isNoneEmpty or isSphereEmpty) - - if isBoxEmpty: - self.empty_display_type = "CUBE" - - if isSphereEmpty: - self.empty_display_type = "SPHERE" - - if self.ootEmptyType == "Scene": - if len(self.ootSceneHeader.lightList) == 0: - light = self.ootSceneHeader.lightList.add() - if not self.ootSceneHeader.timeOfDayLights.defaultsSet: - self.ootSceneHeader.timeOfDayLights.defaultsSet = True - timeOfDayLights = self.ootSceneHeader.timeOfDayLights - setLightPropertyValues(timeOfDayLights.dawn, [70, 45, 57], [180, 154, 138], [20, 20, 60], [140, 120, 100], 0x3E1) - setLightPropertyValues(timeOfDayLights.day, [105, 90, 90], [255, 255, 240], [50, 50, 90], [100, 100, 120], 0x3E4) - setLightPropertyValues(timeOfDayLights.dusk, [120, 90, 0], [250, 135, 50], [30, 30, 60], [120, 70, 50], 0x3E3) - setLightPropertyValues(timeOfDayLights.night, [40, 70, 100], [20, 20, 35], [50, 50, 100], [0, 0, 30], 0x3E0) + isNoneEmpty = self.ootEmptyType == "None" + isBoxEmpty = self.ootEmptyType == "Water Box" + isSphereEmpty = self.ootEmptyType == "Cull Group" + self.show_name = not (isBoxEmpty or isNoneEmpty or isSphereEmpty) + self.show_axis = not (isBoxEmpty or isNoneEmpty or isSphereEmpty) + + if isBoxEmpty: + self.empty_display_type = "CUBE" + + if isSphereEmpty: + self.empty_display_type = "SPHERE" + + if self.ootEmptyType == "Scene": + if len(self.ootSceneHeader.lightList) == 0: + light = self.ootSceneHeader.lightList.add() + if not self.ootSceneHeader.timeOfDayLights.defaultsSet: + self.ootSceneHeader.timeOfDayLights.defaultsSet = True + timeOfDayLights = self.ootSceneHeader.timeOfDayLights + setLightPropertyValues( + timeOfDayLights.dawn, + [70, 45, 57], + [180, 154, 138], + [20, 20, 60], + [140, 120, 100], + 0x3E1, + ) + setLightPropertyValues( + timeOfDayLights.day, + [105, 90, 90], + [255, 255, 240], + [50, 50, 90], + [100, 100, 120], + 0x3E4, + ) + setLightPropertyValues( + timeOfDayLights.dusk, + [120, 90, 0], + [250, 135, 50], + [30, 30, 60], + [120, 70, 50], + 0x3E3, + ) + setLightPropertyValues( + timeOfDayLights.night, + [40, 70, 100], + [20, 20, 35], + [50, 50, 100], + [0, 0, 30], + 0x3E0, + ) + class OOT_ObjectProperties(bpy.types.PropertyGroup): - version: bpy.props.IntProperty(name="OOT_ObjectProperties Version", default=0) - cur_version = 0 # version after property migration + version: bpy.props.IntProperty(name="OOT_ObjectProperties Version", default=0) + cur_version = 0 # version after property migration + + scene: bpy.props.PointerProperty(type=OOTSceneProperties) - scene: bpy.props.PointerProperty(type=OOTSceneProperties) oot_obj_classes = ( - OOTSceneProperties, - OOT_ObjectProperties, - - OOT_SearchActorIDEnumOperator, - OOT_SearchMusicSeqEnumOperator, - OOT_SearchObjectEnumOperator, - OOT_SearchSceneEnumOperator, - OOTLightProperty, - OOTLightGroupProperty, - OOTObjectProperty, - OOTExitProperty, - OOTSceneTableEntryProperty, - - OOTCSTextboxProperty, - OOTCSTextboxAdd, - OOTCSLightingProperty, - OOTCSTimeProperty, - OOTCSBGMProperty, - OOTCSMiscProperty, - OOTCS0x09Property, - OOTCSUnkProperty, - OOTCSListProperty, - OOTCSListAdd, - OOTCutsceneProperty, - OOTExtraCutsceneProperty, - - OOTActorHeaderItemProperty, - OOTActorHeaderProperty, - OOTActorProperty, - OOTTransitionActorProperty, - OOTEntranceProperty, - - OOTSceneHeaderProperty, - OOTAlternateSceneHeaderProperty, - - OOTRoomHeaderProperty, - OOTAlternateRoomHeaderProperty, + OOTSceneProperties, + OOT_ObjectProperties, + OOT_SearchActorIDEnumOperator, + OOT_SearchMusicSeqEnumOperator, + OOT_SearchObjectEnumOperator, + OOT_SearchSceneEnumOperator, + OOTLightProperty, + OOTLightGroupProperty, + OOTObjectProperty, + OOTExitProperty, + OOTSceneTableEntryProperty, + OOTCSTextboxProperty, + OOTCSTextboxAdd, + OOTCSLightingProperty, + OOTCSTimeProperty, + OOTCSBGMProperty, + OOTCSMiscProperty, + OOTCS0x09Property, + OOTCSUnkProperty, + OOTCSListProperty, + OOTCSListAdd, + OOTCutsceneProperty, + OOTExtraCutsceneProperty, + OOTActorHeaderItemProperty, + OOTActorHeaderProperty, + OOTActorProperty, + OOTTransitionActorProperty, + OOTEntranceProperty, + OOTSceneHeaderProperty, + OOTAlternateSceneHeaderProperty, + OOTRoomHeaderProperty, + OOTAlternateRoomHeaderProperty, ) -oot_obj_panel_classes = ( - OOTObjectPanel, -) +oot_obj_panel_classes = (OOTObjectPanel,) + def oot_obj_panel_register(): - for cls in oot_obj_panel_classes: - register_class(cls) + for cls in oot_obj_panel_classes: + register_class(cls) + def oot_obj_panel_unregister(): - for cls in oot_obj_panel_classes: - unregister_class(cls) + for cls in oot_obj_panel_classes: + unregister_class(cls) + def oot_obj_register(): - for cls in oot_obj_classes: - register_class(cls) - - bpy.types.Object.ootEmptyType = bpy.props.EnumProperty( - name = 'OOT Object Type', items = ootEnumEmptyType, default = 'None', update = onUpdateOOTEmptyType) - - bpy.types.Object.ootActorProperty = bpy.props.PointerProperty(type = OOTActorProperty) - bpy.types.Object.ootTransitionActorProperty = bpy.props.PointerProperty(type = OOTTransitionActorProperty) - bpy.types.Object.ootWaterBoxProperty = bpy.props.PointerProperty(type = OOTWaterBoxProperty) - bpy.types.Object.ootRoomHeader = bpy.props.PointerProperty(type = OOTRoomHeaderProperty) - bpy.types.Object.ootSceneHeader = bpy.props.PointerProperty(type = OOTSceneHeaderProperty) - bpy.types.Object.ootAlternateSceneHeaders = bpy.props.PointerProperty(type = OOTAlternateSceneHeaderProperty) - bpy.types.Object.ootAlternateRoomHeaders = bpy.props.PointerProperty(type = OOTAlternateRoomHeaderProperty) - bpy.types.Object.ootEntranceProperty = bpy.props.PointerProperty(type = OOTEntranceProperty) - bpy.types.Object.ootCutsceneProperty = bpy.props.PointerProperty(type = OOTCutsceneProperty) - #bpy.types.Object.ootCullDepth = bpy.props.IntProperty(name = "Cull Depth", min = 1, default = 400) + for cls in oot_obj_classes: + register_class(cls) + + bpy.types.Object.ootEmptyType = bpy.props.EnumProperty( + name="OOT Object Type", + items=ootEnumEmptyType, + default="None", + update=onUpdateOOTEmptyType, + ) + + bpy.types.Object.ootActorProperty = bpy.props.PointerProperty(type=OOTActorProperty) + bpy.types.Object.ootTransitionActorProperty = bpy.props.PointerProperty( + type=OOTTransitionActorProperty + ) + bpy.types.Object.ootWaterBoxProperty = bpy.props.PointerProperty( + type=OOTWaterBoxProperty + ) + bpy.types.Object.ootRoomHeader = bpy.props.PointerProperty( + type=OOTRoomHeaderProperty + ) + bpy.types.Object.ootSceneHeader = bpy.props.PointerProperty( + type=OOTSceneHeaderProperty + ) + bpy.types.Object.ootAlternateSceneHeaders = bpy.props.PointerProperty( + type=OOTAlternateSceneHeaderProperty + ) + bpy.types.Object.ootAlternateRoomHeaders = bpy.props.PointerProperty( + type=OOTAlternateRoomHeaderProperty + ) + bpy.types.Object.ootEntranceProperty = bpy.props.PointerProperty( + type=OOTEntranceProperty + ) + bpy.types.Object.ootCutsceneProperty = bpy.props.PointerProperty( + type=OOTCutsceneProperty + ) + # bpy.types.Object.ootCullDepth = bpy.props.IntProperty(name = "Cull Depth", min = 1, default = 400) def oot_obj_unregister(): - - del bpy.types.Object.ootEmptyType - - del bpy.types.Object.ootActorProperty - del bpy.types.Object.ootTransitionActorProperty - del bpy.types.Object.ootWaterBoxProperty - del bpy.types.Object.ootRoomHeader - del bpy.types.Object.ootSceneHeader - del bpy.types.Object.ootAlternateSceneHeaders - del bpy.types.Object.ootAlternateRoomHeaders - del bpy.types.Object.ootEntranceProperty - del bpy.types.Object.ootCutsceneProperty - #del bpy.types.Object.ootCullDepth - - for cls in reversed(oot_obj_classes): - unregister_class(cls) + + del bpy.types.Object.ootEmptyType + + del bpy.types.Object.ootActorProperty + del bpy.types.Object.ootTransitionActorProperty + del bpy.types.Object.ootWaterBoxProperty + del bpy.types.Object.ootRoomHeader + del bpy.types.Object.ootSceneHeader + del bpy.types.Object.ootAlternateSceneHeaders + del bpy.types.Object.ootAlternateRoomHeaders + del bpy.types.Object.ootEntranceProperty + del bpy.types.Object.ootCutsceneProperty + # del bpy.types.Object.ootCullDepth + + for cls in reversed(oot_obj_classes): + unregister_class(cls) diff --git a/fast64_internal/oot/oot_level_classes.py b/fast64_internal/oot/oot_level_classes.py index 9ebc7179c..b7d3792e5 100644 --- a/fast64_internal/oot/oot_level_classes.py +++ b/fast64_internal/oot/oot_level_classes.py @@ -9,460 +9,567 @@ from .oot_collision_classes import * from .oot_model_classes import * + class OOTActor: - def __init__(self, actorID, position, rotation, actorParam, rotOverride): - self.actorID = actorID - self.actorParam = actorParam - self.rotOverride = rotOverride - self.position = position - self.rotation = rotation + def __init__(self, actorID, position, rotation, actorParam, rotOverride): + self.actorID = actorID + self.actorParam = actorParam + self.rotOverride = rotOverride + self.position = position + self.rotation = rotation + class OOTTransitionActor: - def __init__(self, actorID, frontRoom, backRoom, frontCam, backCam, position, rotationY, actorParam): - self.actorID = actorID - self.actorParam = actorParam - self.frontRoom = frontRoom - self.backRoom = backRoom - self.frontCam = frontCam - self.backCam = backCam - self.position = position - self.rotationY = rotationY + def __init__( + self, + actorID, + frontRoom, + backRoom, + frontCam, + backCam, + position, + rotationY, + actorParam, + ): + self.actorID = actorID + self.actorParam = actorParam + self.frontRoom = frontRoom + self.backRoom = backRoom + self.frontCam = frontCam + self.backCam = backCam + self.position = position + self.rotationY = rotationY + class OOTExit: - def __init__(self, index): - self.index = index + def __init__(self, index): + self.index = index + class OOTEntrance: - def __init__(self, roomIndex, startPositionIndex): - self.roomIndex = roomIndex - self.startPositionIndex = startPositionIndex + def __init__(self, roomIndex, startPositionIndex): + self.roomIndex = roomIndex + self.startPositionIndex = startPositionIndex + class OOTLight: - def __init__(self): - self.ambient = (0,0,0) - self.diffuse0 = (0,0,0) - self.diffuseDir0 = (0,0,0) - self.diffuse1 = (0,0,0) - self.diffuseDir1 = (0,0,0) - self.fogColor = (0,0,0) - self.fogNear = 0 - self.fogFar = 0 - self.transitionSpeed = 0 - - def getBlendFogShort(self): - return "0x{:04X}".format((self.transitionSpeed << 10) | self.fogNear) + def __init__(self): + self.ambient = (0, 0, 0) + self.diffuse0 = (0, 0, 0) + self.diffuseDir0 = (0, 0, 0) + self.diffuse1 = (0, 0, 0) + self.diffuseDir1 = (0, 0, 0) + self.fogColor = (0, 0, 0) + self.fogNear = 0 + self.fogFar = 0 + self.transitionSpeed = 0 + + def getBlendFogShort(self): + return "0x{:04X}".format((self.transitionSpeed << 10) | self.fogNear) + class OOTCSTextbox: - def __init__(self): - self.textboxType = None - self.messageId = '0x0000' - self.ocarinaSongAction = '0x0000' - self.startFrame = 0 - self.endFrame = 1 - self.type = '0x0000' - self.topOptionBranch = '0x0000' - self.bottomOptionBranch = '0x0000' - self.ocarinaMessageId = '0x0000' - + def __init__(self): + self.textboxType = None + self.messageId = "0x0000" + self.ocarinaSongAction = "0x0000" + self.startFrame = 0 + self.endFrame = 1 + self.type = "0x0000" + self.topOptionBranch = "0x0000" + self.bottomOptionBranch = "0x0000" + self.ocarinaMessageId = "0x0000" + + class OOTCSLighting: - def __init__(self): - self.index = 1 - self.startFrame = 0 - + def __init__(self): + self.index = 1 + self.startFrame = 0 + + class OOTCSTime: - def __init__(self): - self.startFrame = 0 - self.hour = 23 - self.minute = 59 + def __init__(self): + self.startFrame = 0 + self.hour = 23 + self.minute = 59 + class OOTCSBGM: - def __init__(self): - self.value = '0x0000' - self.startFrame = 0 - self.endFrame = 1 - + def __init__(self): + self.value = "0x0000" + self.startFrame = 0 + self.endFrame = 1 + + class OOTCSMisc: - def __init__(self): - self.operation = 1 - self.startFrame = 0 - self.endFrame = 1 + def __init__(self): + self.operation = 1 + self.startFrame = 0 + self.endFrame = 1 + class OOTCS0x09: - def __init__(self): - self.startFrame = 0 - self.unk2 = '0x00' - self.unk3 = '0x00' - self.unk4 = '0x00' - + def __init__(self): + self.startFrame = 0 + self.unk2 = "0x00" + self.unk3 = "0x00" + self.unk4 = "0x00" + + class OOTCSUnk: - def __unk__(self): - self.unk1 = self.unk2 = self.unk3 = self.unk4 = self.unk5 = self.unk6 = \ - self.unk7 = self.unk8 = self.unk9 = self.unk10 = self.unk11 = \ - self.unk12 = '0x00000000' - + def __unk__(self): + self.unk1 = ( + self.unk2 + ) = ( + self.unk3 + ) = ( + self.unk4 + ) = ( + self.unk5 + ) = ( + self.unk6 + ) = ( + self.unk7 + ) = self.unk8 = self.unk9 = self.unk10 = self.unk11 = self.unk12 = "0x00000000" + + class OOTCSList: - def __init__(self): - self.listType = None - self.entries = [] - self.unkType = '0x0001' - self.fxType = '1' - self.fxStartFrame = 0 - self.fxEndFrame = 0 + def __init__(self): + self.listType = None + self.entries = [] + self.unkType = "0x0001" + self.fxType = "1" + self.fxStartFrame = 0 + self.fxEndFrame = 0 + class OOTCutscene: - def __init__(self): - self.name = "" - self.csEndFrame = 100 - self.csWriteTerminator = False - self.csTermIdx = 0 - self.csTermStart = 99 - self.csTermEnd = 100 - self.csLists = [] + def __init__(self): + self.name = "" + self.csEndFrame = 100 + self.csWriteTerminator = False + self.csTermIdx = 0 + self.csTermStart = 99 + self.csTermEnd = 100 + self.csLists = [] + class OOTSceneTableEntry: - def __init__(self): - self.drawConfig = 0 + def __init__(self): + self.drawConfig = 0 + class OOTScene: - def __init__(self, name, model): - self.name = toAlnum(name) - self.write_dummy_room_list = False - self.rooms = {} - self.transitionActorList = set() - self.entranceList = set() - self.startPositions = {} - self.lights = [] - self.model = model - self.collision = OOTCollision(self.name) - - self.globalObject = None - self.naviCup = None - - # Skybox - self.skyboxID = None - self.skyboxCloudiness = None - self.skyboxLighting = None - - # Camera - self.mapLocation = None - self.cameraMode = None - - self.musicSeq = None - self.nightSeq = None - - self.childNightHeader = None - self.adultDayHeader = None - self.adultNightHeader = None - self.cutsceneHeaders = [] - - self.exitList = [] - self.pathList = {} - self.cameraList = [] - - self.writeCutscene = False - self.csWriteType = "Embedded" - self.csWriteCustom = "" - self.csWriteObject = None - self.csEndFrame = 100 - self.csWriteTerminator = False - self.csTermIdx = 0 - self.csTermStart = 99 - self.csTermEnd = 100 - self.csLists = [] - self.extraCutscenes = [] - - self.sceneTableEntry = OOTSceneTableEntry() - - def getAlternateHeaderScene(self, name): - scene = OOTScene(name, self.model) - scene.write_dummy_room_list = self.write_dummy_room_list - scene.rooms = self.rooms - scene.collision = self.collision - scene.exitList = self.exitList - scene.pathList = self.pathList - scene.cameraList = self.cameraList - return scene - - def sceneName(self): - return self.name + "_scene" - - def roomListName(self): - return self.sceneName() + "_roomList" - - def entranceListName(self, headerIndex): - return self.sceneName() + "_header" + format(headerIndex, '02') + "_entranceList" - - def startPositionsName(self, headerIndex): - return self.sceneName() + "_header" + format(headerIndex, '02') + "_startPositionList" - - def exitListName(self, headerIndex): - return self.sceneName() + "_header" + format(headerIndex, '02') + "_exitList" - - def lightListName(self, headerIndex): - return self.sceneName() + "_header" + format(headerIndex, '02') + "_lightSettings" - - def transitionActorListName(self, headerIndex): - return self.sceneName() + "_header" + format(headerIndex, '02') + "_transitionActors" - - def pathListName(self): - return self.sceneName() + "_pathway" - - def cameraListName(self): - return self.sceneName() + "_cameraList" - - def cutsceneDataName(self, headerIndex): - return self.sceneName() + "_header" + format(headerIndex, '02') + "_cutscene" - - def alternateHeadersName(self): - return self.sceneName() + "_alternateHeaders" - - def hasAlternateHeaders(self): - return not (self.childNightHeader == None and \ - self.adultDayHeader == None and \ - self.adultNightHeader == None and \ - len(self.cutsceneHeaders) == 0) - - def validateIndices(self): - self.collision.cameraData.validateCamPositions() - self.validateStartPositions() - self.validateRoomIndices() - self.validatePathIndices() - - def validateStartPositions(self): - count = 0 - while count < len(self.startPositions): - if count not in self.startPositions: - raise PluginError("Error: Entrances (start positions) do not have a consecutive list of indices. " +\ - "Missing index: " + str(count)) - count = count + 1 - - def validateRoomIndices(self): - count = 0 - while count < len(self.rooms): - if count not in self.rooms: - raise PluginError("Error: Room indices do not have a consecutive list of indices. " +\ - "Missing index: " + str(count)) - count = count + 1 - - def validatePathIndices(self): - count = 0 - while count < len(self.pathList): - if count not in self.pathList: - raise PluginError("Error: Path list does not have a consecutive list of indices.\n" +\ - "Missing index: " + str(count)) - count = count + 1 - - def addRoom(self, roomIndex, roomName, meshType): - roomModel = self.model.addSubModel( - OOTModel(self.model.f3d.F3D_VER, self.model.f3d._HW_VERSION_1, roomName + '_dl', self.model.DLFormat, None)) - room = OOTRoom(roomIndex, roomName, roomModel, meshType) - if roomIndex in self.rooms: - raise PluginError("Repeat room index " + str(roomIndex) + " for " + str(roomName)) - self.rooms[roomIndex] = room - return room + def __init__(self, name, model): + self.name = toAlnum(name) + self.write_dummy_room_list = False + self.rooms = {} + self.transitionActorList = set() + self.entranceList = set() + self.startPositions = {} + self.lights = [] + self.model = model + self.collision = OOTCollision(self.name) + + self.globalObject = None + self.naviCup = None + + # Skybox + self.skyboxID = None + self.skyboxCloudiness = None + self.skyboxLighting = None + + # Camera + self.mapLocation = None + self.cameraMode = None + + self.musicSeq = None + self.nightSeq = None + + self.childNightHeader = None + self.adultDayHeader = None + self.adultNightHeader = None + self.cutsceneHeaders = [] + + self.exitList = [] + self.pathList = {} + self.cameraList = [] + + self.writeCutscene = False + self.csWriteType = "Embedded" + self.csWriteCustom = "" + self.csWriteObject = None + self.csEndFrame = 100 + self.csWriteTerminator = False + self.csTermIdx = 0 + self.csTermStart = 99 + self.csTermEnd = 100 + self.csLists = [] + self.extraCutscenes = [] + + self.sceneTableEntry = OOTSceneTableEntry() + + def getAlternateHeaderScene(self, name): + scene = OOTScene(name, self.model) + scene.write_dummy_room_list = self.write_dummy_room_list + scene.rooms = self.rooms + scene.collision = self.collision + scene.exitList = self.exitList + scene.pathList = self.pathList + scene.cameraList = self.cameraList + return scene + + def sceneName(self): + return self.name + "_scene" + + def roomListName(self): + return self.sceneName() + "_roomList" + + def entranceListName(self, headerIndex): + return ( + self.sceneName() + "_header" + format(headerIndex, "02") + "_entranceList" + ) + + def startPositionsName(self, headerIndex): + return ( + self.sceneName() + + "_header" + + format(headerIndex, "02") + + "_startPositionList" + ) + + def exitListName(self, headerIndex): + return self.sceneName() + "_header" + format(headerIndex, "02") + "_exitList" + + def lightListName(self, headerIndex): + return ( + self.sceneName() + "_header" + format(headerIndex, "02") + "_lightSettings" + ) + + def transitionActorListName(self, headerIndex): + return ( + self.sceneName() + + "_header" + + format(headerIndex, "02") + + "_transitionActors" + ) + + def pathListName(self): + return self.sceneName() + "_pathway" + + def cameraListName(self): + return self.sceneName() + "_cameraList" + + def cutsceneDataName(self, headerIndex): + return self.sceneName() + "_header" + format(headerIndex, "02") + "_cutscene" + + def alternateHeadersName(self): + return self.sceneName() + "_alternateHeaders" + + def hasAlternateHeaders(self): + return not ( + self.childNightHeader == None + and self.adultDayHeader == None + and self.adultNightHeader == None + and len(self.cutsceneHeaders) == 0 + ) + + def validateIndices(self): + self.collision.cameraData.validateCamPositions() + self.validateStartPositions() + self.validateRoomIndices() + self.validatePathIndices() + + def validateStartPositions(self): + count = 0 + while count < len(self.startPositions): + if count not in self.startPositions: + raise PluginError( + "Error: Entrances (start positions) do not have a consecutive list of indices. " + + "Missing index: " + + str(count) + ) + count = count + 1 + + def validateRoomIndices(self): + count = 0 + while count < len(self.rooms): + if count not in self.rooms: + raise PluginError( + "Error: Room indices do not have a consecutive list of indices. " + + "Missing index: " + + str(count) + ) + count = count + 1 + + def validatePathIndices(self): + count = 0 + while count < len(self.pathList): + if count not in self.pathList: + raise PluginError( + "Error: Path list does not have a consecutive list of indices.\n" + + "Missing index: " + + str(count) + ) + count = count + 1 + + def addRoom(self, roomIndex, roomName, meshType): + roomModel = self.model.addSubModel( + OOTModel( + self.model.f3d.F3D_VER, + self.model.f3d._HW_VERSION_1, + roomName + "_dl", + self.model.DLFormat, + None, + ) + ) + room = OOTRoom(roomIndex, roomName, roomModel, meshType) + if roomIndex in self.rooms: + raise PluginError( + "Repeat room index " + str(roomIndex) + " for " + str(roomName) + ) + self.rooms[roomIndex] = room + return room + class OOTRoomMesh: - def __init__(self, roomName, meshType, model): - self.roomName = roomName - self.meshType = meshType - self.meshEntries = [] - self.model = model - - def terminateDLs(self): - for entry in self.meshEntries: - entry.DLGroup.terminateDLs() - - def headerName(self): - return str(self.roomName) + "_meshHeader" - - def entriesName(self): - return str(self.roomName) + "_meshDListEntry" - - def addMeshGroup(self, cullGroup): - meshGroup = OOTRoomMeshGroup(cullGroup, self.model.DLFormat, self.roomName, len(self.meshEntries)) - self.meshEntries.append(meshGroup) - return meshGroup - - def currentMeshGroup(self): - return self.meshEntries[-1] - - def removeUnusedEntries(self): - newList = [] - for meshEntry in self.meshEntries: - if not meshEntry.DLGroup.isEmpty(): - newList.append(meshEntry) - self.meshEntries = newList + def __init__(self, roomName, meshType, model): + self.roomName = roomName + self.meshType = meshType + self.meshEntries = [] + self.model = model + + def terminateDLs(self): + for entry in self.meshEntries: + entry.DLGroup.terminateDLs() + + def headerName(self): + return str(self.roomName) + "_meshHeader" + + def entriesName(self): + return str(self.roomName) + "_meshDListEntry" + + def addMeshGroup(self, cullGroup): + meshGroup = OOTRoomMeshGroup( + cullGroup, self.model.DLFormat, self.roomName, len(self.meshEntries) + ) + self.meshEntries.append(meshGroup) + return meshGroup + + def currentMeshGroup(self): + return self.meshEntries[-1] + + def removeUnusedEntries(self): + newList = [] + for meshEntry in self.meshEntries: + if not meshEntry.DLGroup.isEmpty(): + newList.append(meshEntry) + self.meshEntries = newList + class OOTDLGroup: - def __init__(self, name, DLFormat): - self.opaque = None - self.transparent = None - self.DLFormat = DLFormat - self.name = toAlnum(name) - - def addDLCall(self, displayList, drawLayer): - if drawLayer == 'Opaque': - if self.opaque is None: - self.opaque = GfxList(self.name + '_opaque', GfxListTag.Draw, self.DLFormat) - self.opaque.commands.append(SPDisplayList(displayList)) - elif drawLayer == "Transparent": - if self.transparent is None: - self.transparent = GfxList(self.name + '_transparent', GfxListTag.Draw, self.DLFormat) - self.transparent.commands.append(SPDisplayList(displayList)) - else: - raise PluginError("Unhandled draw layer: " + str(drawLayer)) - - def terminateDLs(self): - if self.opaque is not None: - self.opaque.commands.append(SPEndDisplayList()) - - if self.transparent is not None: - self.transparent.commands.append(SPEndDisplayList()) - - def createDLs(self): - if self.opaque is None: - self.opaque = GfxList(self.name + '_opaque', GfxListTag.Draw, self.DLFormat) - if self.transparent is None: - self.transparent = GfxList(self.name + '_transparent', GfxListTag.Draw, self.DLFormat) - - def isEmpty(self): - return self.opaque is None and self.transparent is None + def __init__(self, name, DLFormat): + self.opaque = None + self.transparent = None + self.DLFormat = DLFormat + self.name = toAlnum(name) + + def addDLCall(self, displayList, drawLayer): + if drawLayer == "Opaque": + if self.opaque is None: + self.opaque = GfxList( + self.name + "_opaque", GfxListTag.Draw, self.DLFormat + ) + self.opaque.commands.append(SPDisplayList(displayList)) + elif drawLayer == "Transparent": + if self.transparent is None: + self.transparent = GfxList( + self.name + "_transparent", GfxListTag.Draw, self.DLFormat + ) + self.transparent.commands.append(SPDisplayList(displayList)) + else: + raise PluginError("Unhandled draw layer: " + str(drawLayer)) + + def terminateDLs(self): + if self.opaque is not None: + self.opaque.commands.append(SPEndDisplayList()) + + if self.transparent is not None: + self.transparent.commands.append(SPEndDisplayList()) + + def createDLs(self): + if self.opaque is None: + self.opaque = GfxList(self.name + "_opaque", GfxListTag.Draw, self.DLFormat) + if self.transparent is None: + self.transparent = GfxList( + self.name + "_transparent", GfxListTag.Draw, self.DLFormat + ) + + def isEmpty(self): + return self.opaque is None and self.transparent is None + class OOTRoomMeshGroup: - def __init__(self, cullGroup, DLFormat, roomName, entryIndex): - self.cullGroup = cullGroup - self.roomName = roomName - self.entryIndex = entryIndex + def __init__(self, cullGroup, DLFormat, roomName, entryIndex): + self.cullGroup = cullGroup + self.roomName = roomName + self.entryIndex = entryIndex - self.DLGroup = OOTDLGroup(self.entryName(), DLFormat) + self.DLGroup = OOTDLGroup(self.entryName(), DLFormat) + + def entryName(self): + return self.roomName + "_entry_" + str(self.entryIndex) - def entryName(self): - return self.roomName + "_entry_" + str(self.entryIndex) class OOTRoom: - def __init__(self, index, name, model, meshType): - self.ownerName = toAlnum(name) - self.index = index - self.actorList = set() - self.mesh = OOTRoomMesh(self.roomName(), meshType, model) + def __init__(self, index, name, model, meshType): + self.ownerName = toAlnum(name) + self.index = index + self.actorList = set() + self.mesh = OOTRoomMesh(self.roomName(), meshType, model) + + # Room behaviour + self.roomBehaviour = None + self.disableWarpSongs = False + self.showInvisibleActors = False + self.linkIdleMode = None - # Room behaviour - self.roomBehaviour = None - self.disableWarpSongs = False - self.showInvisibleActors = False - self.linkIdleMode = None + self.customBehaviourX = None + self.customBehaviourY = None - self.customBehaviourX = None - self.customBehaviourY = None + # Wind + self.setWind = False + self.windVector = [0, 0, 0] + self.windStrength = 0 - # Wind - self.setWind = False - self.windVector = [0,0,0] - self.windStrength = 0 + # Time + self.timeHours = 0x00 + self.timeMinutes = 0x00 + self.timeSpeed = 0xA - # Time - self.timeHours = 0x00 - self.timeMinutes = 0x00 - self.timeSpeed = 0xA + # Skybox + self.disableSkybox = False + self.disableSunMoon = False - # Skybox - self.disableSkybox = False - self.disableSunMoon = False + # Echo + self.echo = 0x00 - # Echo - self.echo = 0x00 + self.objectList = [] - self.objectList = [] + self.childNightHeader = None + self.adultDayHeader = None + self.adultNightHeader = None + self.cutsceneHeaders = [] - self.childNightHeader = None - self.adultDayHeader = None - self.adultNightHeader = None - self.cutsceneHeaders = [] + def getAlternateHeaderRoom(self, name): + room = OOTRoom(self.index, name, self.mesh.model, self.mesh.meshType) + room.mesh = self.mesh + return room - def getAlternateHeaderRoom(self, name): - room = OOTRoom(self.index, name, self.mesh.model, self.mesh.meshType) - room.mesh = self.mesh - return room + def roomName(self): + return self.ownerName + "_room_" + str(self.index) - def roomName(self): - return self.ownerName + "_room_" + str(self.index) + def objectListName(self, headerIndex): + return self.roomName() + "_header" + format(headerIndex, "02") + "_objectList" - def objectListName(self, headerIndex): - return self.roomName() + "_header" + format(headerIndex, '02') + "_objectList" + def actorListName(self, headerIndex): + return self.roomName() + "_header" + format(headerIndex, "02") + "_actorList" - def actorListName(self, headerIndex): - return self.roomName() + "_header" + format(headerIndex, '02') + "_actorList" + def alternateHeadersName(self): + return self.roomName() + "_alternateHeaders" - def alternateHeadersName(self): - return self.roomName() + "_alternateHeaders" + def hasAlternateHeaders(self): + return not ( + self.childNightHeader == None + and self.adultDayHeader == None + and self.adultNightHeader == None + and len(self.cutsceneHeaders) == 0 + ) - def hasAlternateHeaders(self): - return not (self.childNightHeader == None and \ - self.adultDayHeader == None and \ - self.adultNightHeader == None and \ - len(self.cutsceneHeaders) == 0) def addActor(owner, actor, actorProp, propName, actorObjName): - sceneSetup = actorProp.headerSettings - if sceneSetup.sceneSetupPreset == 'All Scene Setups' or\ - sceneSetup.sceneSetupPreset == "All Non-Cutscene Scene Setups": - getattr(owner, propName).add(actor) - if owner.childNightHeader is not None: - getattr(owner.childNightHeader, propName).add(actor) - if owner.adultDayHeader is not None: - getattr(owner.adultDayHeader, propName).add(actor) - if owner.adultNightHeader is not None: - getattr(owner.adultNightHeader, propName).add(actor) - if sceneSetup.sceneSetupPreset == 'All Scene Setups': - for cutsceneHeader in owner.cutsceneHeaders: - getattr(cutsceneHeader, propName).add(actor) - elif sceneSetup.sceneSetupPreset == "Custom": - if sceneSetup.childDayHeader and owner is not None: - getattr(owner, propName).add(actor) - if sceneSetup.childNightHeader and owner.childNightHeader is not None: - getattr(owner.childNightHeader, propName).add(actor) - if sceneSetup.adultDayHeader and owner.adultDayHeader is not None: - getattr(owner.adultDayHeader, propName).add(actor) - if sceneSetup.adultNightHeader and owner.adultNightHeader is not None: - getattr(owner.adultNightHeader, propName).add(actor) - for cutsceneHeader in sceneSetup.cutsceneHeaders: - if cutsceneHeader.headerIndex >= len(owner.cutsceneHeaders) + 4: - raise PluginError(actorObjName + " uses a cutscene header index that is outside the range of the current number of cutscene headers.") - getattr(owner.cutsceneHeaders[cutsceneHeader.headerIndex - 4], propName).add(actor) - else: - raise PluginError("Unhandled scene setup preset: " + str(sceneSetup.sceneSetupPreset)) + sceneSetup = actorProp.headerSettings + if ( + sceneSetup.sceneSetupPreset == "All Scene Setups" + or sceneSetup.sceneSetupPreset == "All Non-Cutscene Scene Setups" + ): + getattr(owner, propName).add(actor) + if owner.childNightHeader is not None: + getattr(owner.childNightHeader, propName).add(actor) + if owner.adultDayHeader is not None: + getattr(owner.adultDayHeader, propName).add(actor) + if owner.adultNightHeader is not None: + getattr(owner.adultNightHeader, propName).add(actor) + if sceneSetup.sceneSetupPreset == "All Scene Setups": + for cutsceneHeader in owner.cutsceneHeaders: + getattr(cutsceneHeader, propName).add(actor) + elif sceneSetup.sceneSetupPreset == "Custom": + if sceneSetup.childDayHeader and owner is not None: + getattr(owner, propName).add(actor) + if sceneSetup.childNightHeader and owner.childNightHeader is not None: + getattr(owner.childNightHeader, propName).add(actor) + if sceneSetup.adultDayHeader and owner.adultDayHeader is not None: + getattr(owner.adultDayHeader, propName).add(actor) + if sceneSetup.adultNightHeader and owner.adultNightHeader is not None: + getattr(owner.adultNightHeader, propName).add(actor) + for cutsceneHeader in sceneSetup.cutsceneHeaders: + if cutsceneHeader.headerIndex >= len(owner.cutsceneHeaders) + 4: + raise PluginError( + actorObjName + + " uses a cutscene header index that is outside the range of the current number of cutscene headers." + ) + getattr( + owner.cutsceneHeaders[cutsceneHeader.headerIndex - 4], propName + ).add(actor) + else: + raise PluginError( + "Unhandled scene setup preset: " + str(sceneSetup.sceneSetupPreset) + ) + def addStartPosition(scene, index, actor, actorProp, actorObjName): - sceneSetup = actorProp.headerSettings - if sceneSetup.sceneSetupPreset == 'All Scene Setups' or\ - sceneSetup.sceneSetupPreset == "All Non-Cutscene Scene Setups": - addStartPosAtIndex(scene.startPositions, index, actor) - if scene.childNightHeader is not None: - addStartPosAtIndex(scene.childNightHeader.startPositions, index, actor) - if scene.adultDayHeader is not None: - addStartPosAtIndex(scene.adultDayHeader.startPositions, index, actor) - if scene.adultNightHeader is not None: - addStartPosAtIndex(scene.adultNightHeader.startPositions, index, actor) - if sceneSetup.sceneSetupPreset == 'All Scene Setups': - for cutsceneHeader in scene.cutsceneHeaders: - addStartPosAtIndex(cutsceneHeader.startPositions, index, actor) - elif sceneSetup.sceneSetupPreset == "Custom": - if sceneSetup.childDayHeader and scene is not None: - addStartPosAtIndex(scene.startPositions, index, actor) - if sceneSetup.childNightHeader and scene.childNightHeader is not None: - addStartPosAtIndex(scene.childNightHeader.startPositions, index, actor) - if sceneSetup.adultDayHeader and scene.adultDayHeader is not None: - addStartPosAtIndex(scene.adultDayHeader.startPositions, index, actor) - if sceneSetup.adultNightHeader and scene.adultNightHeader is not None: - addStartPosAtIndex(scene.adultNightHeader.startPositions, index, actor) - for cutsceneHeader in sceneSetup.cutsceneHeaders: - if cutsceneHeader.headerIndex >= len(scene.cutsceneHeaders) + 4: - raise PluginError(actorObjName + " uses a cutscene header index that is outside the range of the current number of cutscene headers.") - addAtStartPosIndex(scene.cutsceneHeaders[cutsceneHeader.headerIndex - 4].startPositions, index, actor) - else: - raise PluginError("Unhandled scene setup preset: " + str(sceneSetup.sceneSetupPreset)) + sceneSetup = actorProp.headerSettings + if ( + sceneSetup.sceneSetupPreset == "All Scene Setups" + or sceneSetup.sceneSetupPreset == "All Non-Cutscene Scene Setups" + ): + addStartPosAtIndex(scene.startPositions, index, actor) + if scene.childNightHeader is not None: + addStartPosAtIndex(scene.childNightHeader.startPositions, index, actor) + if scene.adultDayHeader is not None: + addStartPosAtIndex(scene.adultDayHeader.startPositions, index, actor) + if scene.adultNightHeader is not None: + addStartPosAtIndex(scene.adultNightHeader.startPositions, index, actor) + if sceneSetup.sceneSetupPreset == "All Scene Setups": + for cutsceneHeader in scene.cutsceneHeaders: + addStartPosAtIndex(cutsceneHeader.startPositions, index, actor) + elif sceneSetup.sceneSetupPreset == "Custom": + if sceneSetup.childDayHeader and scene is not None: + addStartPosAtIndex(scene.startPositions, index, actor) + if sceneSetup.childNightHeader and scene.childNightHeader is not None: + addStartPosAtIndex(scene.childNightHeader.startPositions, index, actor) + if sceneSetup.adultDayHeader and scene.adultDayHeader is not None: + addStartPosAtIndex(scene.adultDayHeader.startPositions, index, actor) + if sceneSetup.adultNightHeader and scene.adultNightHeader is not None: + addStartPosAtIndex(scene.adultNightHeader.startPositions, index, actor) + for cutsceneHeader in sceneSetup.cutsceneHeaders: + if cutsceneHeader.headerIndex >= len(scene.cutsceneHeaders) + 4: + raise PluginError( + actorObjName + + " uses a cutscene header index that is outside the range of the current number of cutscene headers." + ) + addAtStartPosIndex( + scene.cutsceneHeaders[cutsceneHeader.headerIndex - 4].startPositions, + index, + actor, + ) + else: + raise PluginError( + "Unhandled scene setup preset: " + str(sceneSetup.sceneSetupPreset) + ) + def addStartPosAtIndex(startPosDict, index, value): - if index in startPosDict: - raise PluginError("Error: Repeated start position spawn index: " + str(index)) - startPosDict[index] = value + if index in startPosDict: + raise PluginError("Error: Repeated start position spawn index: " + str(index)) + startPosDict[index] = value diff --git a/fast64_internal/oot/oot_level_writer.py b/fast64_internal/oot/oot_level_writer.py index 8782c9adc..d26558820 100644 --- a/fast64_internal/oot/oot_level_writer.py +++ b/fast64_internal/oot/oot_level_writer.py @@ -18,670 +18,1016 @@ from .oot_cutscene import * from .c_writer import * + def sceneNameFromID(sceneID): - if sceneID in ootSceneIDToName: - return ootSceneIDToName[sceneID] - else: - raise PluginError("Cannot find scene ID " + str(sceneID)) + if sceneID in ootSceneIDToName: + return ootSceneIDToName[sceneID] + else: + raise PluginError("Cannot find scene ID " + str(sceneID)) + def ootPreprendSceneIncludes(scene, file): - exportFile = ootSceneIncludes(scene) - exportFile.append(file) - return exportFile + exportFile = ootSceneIncludes(scene) + exportFile.append(file) + return exportFile + def ootCreateSceneHeader(levelC): - sceneHeader = CData() - - sceneHeader.append(levelC.sceneMainC) - if levelC.sceneTexturesIsUsed(): - sceneHeader.append(levelC.sceneTexturesC) - sceneHeader.append(levelC.sceneCollisionC) - if levelC.sceneCutscenesIsUsed(): - for i in range(len(levelC.sceneCutscenesC)): - sceneHeader.append(levelC.sceneCutscenesC[i]) - for roomName, roomMainC in levelC.roomMainC.items(): - sceneHeader.append(roomMainC) - for roomName, roomMeshInfoC in levelC.roomMeshInfoC.items(): - sceneHeader.append(roomMeshInfoC) - for roomName, roomMeshC in levelC.roomMeshC.items(): - sceneHeader.append(roomMeshC) - - return sceneHeader + sceneHeader = CData() + + sceneHeader.append(levelC.sceneMainC) + if levelC.sceneTexturesIsUsed(): + sceneHeader.append(levelC.sceneTexturesC) + sceneHeader.append(levelC.sceneCollisionC) + if levelC.sceneCutscenesIsUsed(): + for i in range(len(levelC.sceneCutscenesC)): + sceneHeader.append(levelC.sceneCutscenesC[i]) + for roomName, roomMainC in levelC.roomMainC.items(): + sceneHeader.append(roomMainC) + for roomName, roomMeshInfoC in levelC.roomMeshInfoC.items(): + sceneHeader.append(roomMeshInfoC) + for roomName, roomMeshC in levelC.roomMeshC.items(): + sceneHeader.append(roomMeshC) + + return sceneHeader + def ootCombineSceneFiles(levelC): - sceneC = CData() - - sceneC.append(levelC.sceneMainC) - if levelC.sceneTexturesIsUsed(): - sceneC.append(levelC.sceneTexturesC) - sceneC.append(levelC.sceneCollisionC) - if levelC.sceneCutscenesIsUsed(): - for i in range(len(levelC.sceneCutscenesC)): - sceneC.append(levelC.sceneCutscenesC[i]) - return sceneC - -def ootExportSceneToC(originalSceneObj, transformMatrix, - f3dType, isHWv1, sceneName, DLFormat, savePNG, exportInfo): - - checkObjectReference(originalSceneObj, "Scene object") - isCustomExport = exportInfo.isCustomExportPath - exportPath = exportInfo.exportPath - - scene = ootConvertScene(originalSceneObj, transformMatrix, - f3dType, isHWv1, sceneName, DLFormat, not savePNG) - - exportSubdir = '' - if exportInfo.customSubPath is not None: - exportSubdir = exportInfo.customSubPath - if not isCustomExport and exportInfo.customSubPath is None: - for sceneSubdir, sceneNames in ootSceneDirs.items(): - if sceneName in sceneNames: - exportSubdir = sceneSubdir - break - if exportSubdir == "": - raise PluginError("Scene folder " + sceneName + " cannot be found in the ootSceneDirs list.") - - levelPath = ootGetPath(exportPath, isCustomExport, exportSubdir, sceneName, True, True) - levelC = ootLevelToC(scene, TextureExportSettings(False, savePNG, exportSubdir + sceneName, levelPath)) - - if bpy.context.scene.ootSceneSingleFile: - writeCDataSourceOnly(ootPreprendSceneIncludes(scene, ootCombineSceneFiles(levelC)), - os.path.join(levelPath, scene.sceneName() + '.c')) - for i in range(len(scene.rooms)): - roomC = CData() - roomC.append(levelC.roomMainC[scene.rooms[i].roomName()]) - roomC.append(levelC.roomMeshInfoC[scene.rooms[i].roomName()]) - roomC.append(levelC.roomMeshC[scene.rooms[i].roomName()]) - writeCDataSourceOnly(ootPreprendSceneIncludes(scene, roomC), - os.path.join(levelPath, scene.rooms[i].roomName() + '.c')) - else: - # Export the scene segment .c files - writeCDataSourceOnly(ootPreprendSceneIncludes(scene, levelC.sceneMainC), - os.path.join(levelPath, scene.sceneName() + '_main.c')) - if levelC.sceneTexturesIsUsed(): - writeCDataSourceOnly(ootPreprendSceneIncludes(scene, levelC.sceneTexturesC), - os.path.join(levelPath, scene.sceneName() + '_tex.c')) - writeCDataSourceOnly(ootPreprendSceneIncludes(scene, levelC.sceneCollisionC), - os.path.join(levelPath, scene.sceneName() + '_col.c')) - if levelC.sceneCutscenesIsUsed(): - for i in range(len(levelC.sceneCutscenesC)): - writeCDataSourceOnly(ootPreprendSceneIncludes(scene, levelC.sceneCutscenesC[i]), - os.path.join(levelPath, scene.sceneName() + '_cs_' + str(i) + '.c')) - - # Export the room segment .c files - for roomName, roomMainC in levelC.roomMainC.items(): - writeCDataSourceOnly(ootPreprendSceneIncludes(scene, roomMainC), - os.path.join(levelPath, roomName + '_main.c')) - for roomName, roomMeshInfoC in levelC.roomMeshInfoC.items(): - writeCDataSourceOnly(ootPreprendSceneIncludes(scene, roomMeshInfoC), - os.path.join(levelPath, roomName + '_model_info.c')) - for roomName, roomMeshC in levelC.roomMeshC.items(): - writeCDataSourceOnly(ootPreprendSceneIncludes(scene, roomMeshC), - os.path.join(levelPath, roomName + '_model.c')) - - # Export the scene .h file - writeCDataHeaderOnly(ootCreateSceneHeader(levelC), - os.path.join(levelPath, scene.sceneName() + '.h')) - - if not isCustomExport: - writeOtherSceneProperties(scene, exportInfo, levelC) + sceneC = CData() + + sceneC.append(levelC.sceneMainC) + if levelC.sceneTexturesIsUsed(): + sceneC.append(levelC.sceneTexturesC) + sceneC.append(levelC.sceneCollisionC) + if levelC.sceneCutscenesIsUsed(): + for i in range(len(levelC.sceneCutscenesC)): + sceneC.append(levelC.sceneCutscenesC[i]) + return sceneC + + +def ootExportSceneToC( + originalSceneObj, + transformMatrix, + f3dType, + isHWv1, + sceneName, + DLFormat, + savePNG, + exportInfo, +): + + checkObjectReference(originalSceneObj, "Scene object") + isCustomExport = exportInfo.isCustomExportPath + exportPath = exportInfo.exportPath + + scene = ootConvertScene( + originalSceneObj, + transformMatrix, + f3dType, + isHWv1, + sceneName, + DLFormat, + not savePNG, + ) + + exportSubdir = "" + if exportInfo.customSubPath is not None: + exportSubdir = exportInfo.customSubPath + if not isCustomExport and exportInfo.customSubPath is None: + for sceneSubdir, sceneNames in ootSceneDirs.items(): + if sceneName in sceneNames: + exportSubdir = sceneSubdir + break + if exportSubdir == "": + raise PluginError( + "Scene folder " + + sceneName + + " cannot be found in the ootSceneDirs list." + ) + + levelPath = ootGetPath( + exportPath, isCustomExport, exportSubdir, sceneName, True, True + ) + levelC = ootLevelToC( + scene, + TextureExportSettings(False, savePNG, exportSubdir + sceneName, levelPath), + ) + + if bpy.context.scene.ootSceneSingleFile: + writeCDataSourceOnly( + ootPreprendSceneIncludes(scene, ootCombineSceneFiles(levelC)), + os.path.join(levelPath, scene.sceneName() + ".c"), + ) + for i in range(len(scene.rooms)): + roomC = CData() + roomC.append(levelC.roomMainC[scene.rooms[i].roomName()]) + roomC.append(levelC.roomMeshInfoC[scene.rooms[i].roomName()]) + roomC.append(levelC.roomMeshC[scene.rooms[i].roomName()]) + writeCDataSourceOnly( + ootPreprendSceneIncludes(scene, roomC), + os.path.join(levelPath, scene.rooms[i].roomName() + ".c"), + ) + else: + # Export the scene segment .c files + writeCDataSourceOnly( + ootPreprendSceneIncludes(scene, levelC.sceneMainC), + os.path.join(levelPath, scene.sceneName() + "_main.c"), + ) + if levelC.sceneTexturesIsUsed(): + writeCDataSourceOnly( + ootPreprendSceneIncludes(scene, levelC.sceneTexturesC), + os.path.join(levelPath, scene.sceneName() + "_tex.c"), + ) + writeCDataSourceOnly( + ootPreprendSceneIncludes(scene, levelC.sceneCollisionC), + os.path.join(levelPath, scene.sceneName() + "_col.c"), + ) + if levelC.sceneCutscenesIsUsed(): + for i in range(len(levelC.sceneCutscenesC)): + writeCDataSourceOnly( + ootPreprendSceneIncludes(scene, levelC.sceneCutscenesC[i]), + os.path.join(levelPath, scene.sceneName() + "_cs_" + str(i) + ".c"), + ) + + # Export the room segment .c files + for roomName, roomMainC in levelC.roomMainC.items(): + writeCDataSourceOnly( + ootPreprendSceneIncludes(scene, roomMainC), + os.path.join(levelPath, roomName + "_main.c"), + ) + for roomName, roomMeshInfoC in levelC.roomMeshInfoC.items(): + writeCDataSourceOnly( + ootPreprendSceneIncludes(scene, roomMeshInfoC), + os.path.join(levelPath, roomName + "_model_info.c"), + ) + for roomName, roomMeshC in levelC.roomMeshC.items(): + writeCDataSourceOnly( + ootPreprendSceneIncludes(scene, roomMeshC), + os.path.join(levelPath, roomName + "_model.c"), + ) + + # Export the scene .h file + writeCDataHeaderOnly( + ootCreateSceneHeader(levelC), os.path.join(levelPath, scene.sceneName() + ".h") + ) + + if not isCustomExport: + writeOtherSceneProperties(scene, exportInfo, levelC) + def writeOtherSceneProperties(scene, exportInfo, levelC): - modifySceneTable(scene, exportInfo) - modifySegmentSymbols(scene, exportInfo) - modifySceneIDs(scene, exportInfo) - modifySegmentDefinition(scene, exportInfo, levelC) - modifySceneFiles(scene, exportInfo) + modifySceneTable(scene, exportInfo) + modifySegmentSymbols(scene, exportInfo) + modifySceneIDs(scene, exportInfo) + modifySegmentDefinition(scene, exportInfo, levelC) + modifySceneFiles(scene, exportInfo) + def readSceneData(scene, scene_properties, sceneHeader, alternateSceneHeaders): - scene.write_dummy_room_list = scene_properties.write_dummy_room_list - scene.sceneTableEntry.drawConfig = sceneHeader.sceneTableEntry.drawConfig - scene.globalObject = getCustomProperty(sceneHeader, "globalObject") - scene.naviCup = getCustomProperty(sceneHeader, "naviCup") - scene.skyboxID = getCustomProperty(sceneHeader, "skyboxID") - scene.skyboxCloudiness = getCustomProperty(sceneHeader, "skyboxCloudiness") - scene.skyboxLighting = getCustomProperty(sceneHeader, "skyboxLighting") - scene.mapLocation = getCustomProperty(sceneHeader, "mapLocation") - scene.cameraMode = getCustomProperty(sceneHeader, "cameraMode") - scene.musicSeq = getCustomProperty(sceneHeader, "musicSeq") - scene.nightSeq = getCustomProperty(sceneHeader, "nightSeq") - scene.audioSessionPreset = getCustomProperty(sceneHeader, "audioSessionPreset") - - if sceneHeader.skyboxLighting == '0x00': # Time of Day - scene.lights.append(getLightData(sceneHeader.timeOfDayLights.dawn)) - scene.lights.append(getLightData(sceneHeader.timeOfDayLights.day)) - scene.lights.append(getLightData(sceneHeader.timeOfDayLights.dusk)) - scene.lights.append(getLightData(sceneHeader.timeOfDayLights.night)) - else: - for lightProp in sceneHeader.lightList: - scene.lights.append(getLightData(lightProp)) - - for exitProp in sceneHeader.exitList: - scene.exitList.append(getExitData(exitProp)) - - scene.writeCutscene = getCustomProperty(sceneHeader, "writeCutscene") - if scene.writeCutscene: - scene.csWriteType = getattr(sceneHeader, "csWriteType") - if scene.csWriteType == "Embedded": - scene.csEndFrame = getCustomProperty(sceneHeader, "csEndFrame") - scene.csWriteTerminator = getCustomProperty(sceneHeader, "csWriteTerminator") - scene.csTermIdx = getCustomProperty(sceneHeader, "csTermIdx") - scene.csTermStart = getCustomProperty(sceneHeader, "csTermStart") - scene.csTermEnd = getCustomProperty(sceneHeader, "csTermEnd") - readCutsceneData(scene, sceneHeader) - elif scene.csWriteType == "Custom": - scene.csWriteCustom = getCustomProperty(sceneHeader, "csWriteCustom") - elif scene.csWriteType == "Object": - if sceneHeader.csWriteObject is None: - raise PluginError('No object selected for cutscene reference') - elif sceneHeader.csWriteObject.ootEmptyType != 'Cutscene': - raise PluginError('Object selected as cutscene is wrong type, must be empty with Cutscene type') - elif sceneHeader.csWriteObject.parent is not None: - raise PluginError('Cutscene empty object should not be parented to anything') - else: - scene.csWriteObject = convertCutsceneObject(sceneHeader.csWriteObject) - - if alternateSceneHeaders is not None: - for ec in sceneHeader.extraCutscenes: - scene.extraCutscenes.append(convertCutsceneObject(ec.csObject)) - - scene.collision.cameraData = OOTCameraData(scene.name) - - if not alternateSceneHeaders.childNightHeader.usePreviousHeader: - scene.childNightHeader = scene.getAlternateHeaderScene(scene.name) - readSceneData(scene.childNightHeader, scene_properties, alternateSceneHeaders.childNightHeader, None) - - if not alternateSceneHeaders.adultDayHeader.usePreviousHeader: - scene.adultDayHeader = scene.getAlternateHeaderScene(scene.name) - readSceneData(scene.adultDayHeader, scene_properties, alternateSceneHeaders.adultDayHeader, None) - - if not alternateSceneHeaders.adultNightHeader.usePreviousHeader: - scene.adultNightHeader = scene.getAlternateHeaderScene(scene.name) - readSceneData(scene.adultNightHeader, scene_properties, alternateSceneHeaders.adultNightHeader, None) - - for i in range(len(alternateSceneHeaders.cutsceneHeaders)): - cutsceneHeaderProp = alternateSceneHeaders.cutsceneHeaders[i] - cutsceneHeader = scene.getAlternateHeaderScene(scene.name) - readSceneData(cutsceneHeader, scene_properties, cutsceneHeaderProp, None) - scene.cutsceneHeaders.append(cutsceneHeader) - else: - if len(sceneHeader.extraCutscenes) > 0: - raise PluginError("Extra cutscenes (not in any header) only belong in the main scene, not alternate headers") + scene.write_dummy_room_list = scene_properties.write_dummy_room_list + scene.sceneTableEntry.drawConfig = sceneHeader.sceneTableEntry.drawConfig + scene.globalObject = getCustomProperty(sceneHeader, "globalObject") + scene.naviCup = getCustomProperty(sceneHeader, "naviCup") + scene.skyboxID = getCustomProperty(sceneHeader, "skyboxID") + scene.skyboxCloudiness = getCustomProperty(sceneHeader, "skyboxCloudiness") + scene.skyboxLighting = getCustomProperty(sceneHeader, "skyboxLighting") + scene.mapLocation = getCustomProperty(sceneHeader, "mapLocation") + scene.cameraMode = getCustomProperty(sceneHeader, "cameraMode") + scene.musicSeq = getCustomProperty(sceneHeader, "musicSeq") + scene.nightSeq = getCustomProperty(sceneHeader, "nightSeq") + scene.audioSessionPreset = getCustomProperty(sceneHeader, "audioSessionPreset") + + if sceneHeader.skyboxLighting == "0x00": # Time of Day + scene.lights.append(getLightData(sceneHeader.timeOfDayLights.dawn)) + scene.lights.append(getLightData(sceneHeader.timeOfDayLights.day)) + scene.lights.append(getLightData(sceneHeader.timeOfDayLights.dusk)) + scene.lights.append(getLightData(sceneHeader.timeOfDayLights.night)) + else: + for lightProp in sceneHeader.lightList: + scene.lights.append(getLightData(lightProp)) + + for exitProp in sceneHeader.exitList: + scene.exitList.append(getExitData(exitProp)) + + scene.writeCutscene = getCustomProperty(sceneHeader, "writeCutscene") + if scene.writeCutscene: + scene.csWriteType = getattr(sceneHeader, "csWriteType") + if scene.csWriteType == "Embedded": + scene.csEndFrame = getCustomProperty(sceneHeader, "csEndFrame") + scene.csWriteTerminator = getCustomProperty( + sceneHeader, "csWriteTerminator" + ) + scene.csTermIdx = getCustomProperty(sceneHeader, "csTermIdx") + scene.csTermStart = getCustomProperty(sceneHeader, "csTermStart") + scene.csTermEnd = getCustomProperty(sceneHeader, "csTermEnd") + readCutsceneData(scene, sceneHeader) + elif scene.csWriteType == "Custom": + scene.csWriteCustom = getCustomProperty(sceneHeader, "csWriteCustom") + elif scene.csWriteType == "Object": + if sceneHeader.csWriteObject is None: + raise PluginError("No object selected for cutscene reference") + elif sceneHeader.csWriteObject.ootEmptyType != "Cutscene": + raise PluginError( + "Object selected as cutscene is wrong type, must be empty with Cutscene type" + ) + elif sceneHeader.csWriteObject.parent is not None: + raise PluginError( + "Cutscene empty object should not be parented to anything" + ) + else: + scene.csWriteObject = convertCutsceneObject(sceneHeader.csWriteObject) + + if alternateSceneHeaders is not None: + for ec in sceneHeader.extraCutscenes: + scene.extraCutscenes.append(convertCutsceneObject(ec.csObject)) + + scene.collision.cameraData = OOTCameraData(scene.name) + + if not alternateSceneHeaders.childNightHeader.usePreviousHeader: + scene.childNightHeader = scene.getAlternateHeaderScene(scene.name) + readSceneData( + scene.childNightHeader, + scene_properties, + alternateSceneHeaders.childNightHeader, + None, + ) + + if not alternateSceneHeaders.adultDayHeader.usePreviousHeader: + scene.adultDayHeader = scene.getAlternateHeaderScene(scene.name) + readSceneData( + scene.adultDayHeader, + scene_properties, + alternateSceneHeaders.adultDayHeader, + None, + ) + + if not alternateSceneHeaders.adultNightHeader.usePreviousHeader: + scene.adultNightHeader = scene.getAlternateHeaderScene(scene.name) + readSceneData( + scene.adultNightHeader, + scene_properties, + alternateSceneHeaders.adultNightHeader, + None, + ) + + for i in range(len(alternateSceneHeaders.cutsceneHeaders)): + cutsceneHeaderProp = alternateSceneHeaders.cutsceneHeaders[i] + cutsceneHeader = scene.getAlternateHeaderScene(scene.name) + readSceneData(cutsceneHeader, scene_properties, cutsceneHeaderProp, None) + scene.cutsceneHeaders.append(cutsceneHeader) + else: + if len(sceneHeader.extraCutscenes) > 0: + raise PluginError( + "Extra cutscenes (not in any header) only belong in the main scene, not alternate headers" + ) + def getConvertedTransform(transformMatrix, sceneObj, obj, handleOrientation): - - # Hacky solution to handle Z-up to Y-up conversion - # We cannot apply rotation to empty, as that modifies scale - if handleOrientation: - orientation = mathutils.Quaternion((1, 0, 0), math.radians(90.0)) - else: - orientation = mathutils.Matrix.Identity(4) - return getConvertedTransformWithOrientation(transformMatrix, sceneObj, obj, orientation) + + # Hacky solution to handle Z-up to Y-up conversion + # We cannot apply rotation to empty, as that modifies scale + if handleOrientation: + orientation = mathutils.Quaternion((1, 0, 0), math.radians(90.0)) + else: + orientation = mathutils.Matrix.Identity(4) + return getConvertedTransformWithOrientation( + transformMatrix, sceneObj, obj, orientation + ) + def getConvertedTransformWithOrientation(transformMatrix, sceneObj, obj, orientation): - relativeTransform = transformMatrix @ sceneObj.matrix_world.inverted() @ obj.matrix_world - blenderTranslation, blenderRotation, scale = relativeTransform.decompose() - rotation = blenderRotation @ orientation - convertedTranslation = ootConvertTranslation(blenderTranslation) - convertedRotation = ootConvertRotation(rotation) - - return convertedTranslation, convertedRotation, scale, rotation - + relativeTransform = ( + transformMatrix @ sceneObj.matrix_world.inverted() @ obj.matrix_world + ) + blenderTranslation, blenderRotation, scale = relativeTransform.decompose() + rotation = blenderRotation @ orientation + convertedTranslation = ootConvertTranslation(blenderTranslation) + convertedRotation = ootConvertRotation(rotation) + + return convertedTranslation, convertedRotation, scale, rotation + + def getExitData(exitProp): - if exitProp.exitIndex != "Custom": - raise PluginError("Exit index enums not implemented yet.") - return OOTExit(exitProp.exitIndexCustom) + if exitProp.exitIndex != "Custom": + raise PluginError("Exit index enums not implemented yet.") + return OOTExit(exitProp.exitIndexCustom) + def getLightData(lightProp): - light = OOTLight() - light.ambient = getLightColor(lightProp.ambient) - if lightProp.useCustomDiffuse0: - if lightProp.diffuse0Custom is None: - raise PluginError("Error: Diffuse 0 light object not set in a scene lighting property.") - light.diffuse0 = getLightColor(lightProp.diffuse0Custom.color) - light.diffuseDir0 = getLightRotation(lightProp.diffuse0Custom) - else: - light.diffuse0 = getLightColor(lightProp.diffuse0) - light.diffuseDir0 = [0x49, 0x49, 0x49] - - if lightProp.useCustomDiffuse1: - if lightProp.diffuse1Custom is None: - raise PluginError("Error: Diffuse 1 light object not set in a scene lighting property.") - light.diffuse1 = getLightColor(lightProp.diffuse1Custom.color) - light.diffuseDir1 = getLightRotation(lightProp.diffuse1Custom) - else: - light.diffuse1 = getLightColor(lightProp.diffuse1) - light.diffuseDir1 = [0xB7, 0xB7, 0xB7] - - light.fogColor = getLightColor(lightProp.fogColor) - light.fogNear = lightProp.fogNear - light.transitionSpeed = lightProp.transitionSpeed - light.fogFar = lightProp.fogFar - return light + light = OOTLight() + light.ambient = getLightColor(lightProp.ambient) + if lightProp.useCustomDiffuse0: + if lightProp.diffuse0Custom is None: + raise PluginError( + "Error: Diffuse 0 light object not set in a scene lighting property." + ) + light.diffuse0 = getLightColor(lightProp.diffuse0Custom.color) + light.diffuseDir0 = getLightRotation(lightProp.diffuse0Custom) + else: + light.diffuse0 = getLightColor(lightProp.diffuse0) + light.diffuseDir0 = [0x49, 0x49, 0x49] + + if lightProp.useCustomDiffuse1: + if lightProp.diffuse1Custom is None: + raise PluginError( + "Error: Diffuse 1 light object not set in a scene lighting property." + ) + light.diffuse1 = getLightColor(lightProp.diffuse1Custom.color) + light.diffuseDir1 = getLightRotation(lightProp.diffuse1Custom) + else: + light.diffuse1 = getLightColor(lightProp.diffuse1) + light.diffuseDir1 = [0xB7, 0xB7, 0xB7] + + light.fogColor = getLightColor(lightProp.fogColor) + light.fogNear = lightProp.fogNear + light.transitionSpeed = lightProp.transitionSpeed + light.fogFar = lightProp.fogFar + return light + def readRoomData(room, roomHeader, alternateRoomHeaders): - room.roomIndex = roomHeader.roomIndex - room.roomBehaviour = getCustomProperty(roomHeader, "roomBehaviour") - room.disableWarpSongs = roomHeader.disableWarpSongs - room.showInvisibleActors = roomHeader.showInvisibleActors - room.linkIdleMode = getCustomProperty(roomHeader, "linkIdleMode") - room.linkIdleModeCustom = roomHeader.linkIdleModeCustom - room.setWind = roomHeader.setWind - room.windVector = normToSigned8Vector(mathutils.Vector(roomHeader.windVector).normalized()) - room.windStrength = int(0xFF * max(mathutils.Vector(roomHeader.windVector).length, 1)) - if roomHeader.leaveTimeUnchanged: - room.timeHours = "0xFF" - room.timeMinutes = "0xFF" - else: - room.timeHours = roomHeader.timeHours - room.timeMinutes = roomHeader.timeMinutes - room.timeSpeed = max(-128, min(127, int(round(roomHeader.timeSpeed * 0xA)))) - room.disableSkybox = roomHeader.disableSkybox - room.disableSunMoon = roomHeader.disableSunMoon - room.echo = roomHeader.echo - room.objectList.extend([getCustomProperty(item, "objectID") for item in roomHeader.objectList]) - if len(room.objectList) > 15: - raise PluginError("Error: A scene can only have a maximum of 15 objects (OOT, not blender objects).") - - if alternateRoomHeaders is not None: - if not alternateRoomHeaders.childNightHeader.usePreviousHeader: - room.childNightHeader = room.getAlternateHeaderRoom(room.ownerName) - readRoomData(room.childNightHeader, alternateRoomHeaders.childNightHeader, None) - - if not alternateRoomHeaders.adultDayHeader.usePreviousHeader: - room.adultDayHeader = room.getAlternateHeaderRoom(room.ownerName) - readRoomData(room.adultDayHeader, alternateRoomHeaders.adultDayHeader, None) - - if not alternateRoomHeaders.adultNightHeader.usePreviousHeader: - room.adultNightHeader = room.getAlternateHeaderRoom(room.ownerName) - readRoomData(room.adultNightHeader, alternateRoomHeaders.adultNightHeader, None) - - for i in range(len(alternateRoomHeaders.cutsceneHeaders)): - cutsceneHeaderProp = alternateRoomHeaders.cutsceneHeaders[i] - cutsceneHeader = room.getAlternateHeaderRoom(room.ownerName) - readRoomData(cutsceneHeader, cutsceneHeaderProp, None) - room.cutsceneHeaders.append(cutsceneHeader) + room.roomIndex = roomHeader.roomIndex + room.roomBehaviour = getCustomProperty(roomHeader, "roomBehaviour") + room.disableWarpSongs = roomHeader.disableWarpSongs + room.showInvisibleActors = roomHeader.showInvisibleActors + room.linkIdleMode = getCustomProperty(roomHeader, "linkIdleMode") + room.linkIdleModeCustom = roomHeader.linkIdleModeCustom + room.setWind = roomHeader.setWind + room.windVector = normToSigned8Vector( + mathutils.Vector(roomHeader.windVector).normalized() + ) + room.windStrength = int( + 0xFF * max(mathutils.Vector(roomHeader.windVector).length, 1) + ) + if roomHeader.leaveTimeUnchanged: + room.timeHours = "0xFF" + room.timeMinutes = "0xFF" + else: + room.timeHours = roomHeader.timeHours + room.timeMinutes = roomHeader.timeMinutes + room.timeSpeed = max(-128, min(127, int(round(roomHeader.timeSpeed * 0xA)))) + room.disableSkybox = roomHeader.disableSkybox + room.disableSunMoon = roomHeader.disableSunMoon + room.echo = roomHeader.echo + room.objectList.extend( + [getCustomProperty(item, "objectID") for item in roomHeader.objectList] + ) + if len(room.objectList) > 15: + raise PluginError( + "Error: A scene can only have a maximum of 15 objects (OOT, not blender objects)." + ) + + if alternateRoomHeaders is not None: + if not alternateRoomHeaders.childNightHeader.usePreviousHeader: + room.childNightHeader = room.getAlternateHeaderRoom(room.ownerName) + readRoomData( + room.childNightHeader, alternateRoomHeaders.childNightHeader, None + ) + + if not alternateRoomHeaders.adultDayHeader.usePreviousHeader: + room.adultDayHeader = room.getAlternateHeaderRoom(room.ownerName) + readRoomData(room.adultDayHeader, alternateRoomHeaders.adultDayHeader, None) + + if not alternateRoomHeaders.adultNightHeader.usePreviousHeader: + room.adultNightHeader = room.getAlternateHeaderRoom(room.ownerName) + readRoomData( + room.adultNightHeader, alternateRoomHeaders.adultNightHeader, None + ) + + for i in range(len(alternateRoomHeaders.cutsceneHeaders)): + cutsceneHeaderProp = alternateRoomHeaders.cutsceneHeaders[i] + cutsceneHeader = room.getAlternateHeaderRoom(room.ownerName) + readRoomData(cutsceneHeader, cutsceneHeaderProp, None) + room.cutsceneHeaders.append(cutsceneHeader) + def readCamPos(camPosProp, obj, scene, sceneObj, transformMatrix): - # Camera faces opposite direction - orientation = mathutils.Quaternion((0, 1, 0), math.radians(180.0)) - translation, rotation, scale, orientedRotation = \ - getConvertedTransformWithOrientation(transformMatrix, sceneObj, obj, orientation) - camPosProp = obj.ootCameraPositionProperty - index = camPosProp.index - # TODO: FOV conversion? - if index in scene.collision.cameraData.camPosDict: - raise PluginError("Error: Repeated camera position index: " + str(index)) - scene.collision.cameraData.camPosDict[index] = OOTCameraPosData( - getCustomProperty(camPosProp, 'camSType'), camPosProp.hasPositionData, - translation, rotation, int(round(math.degrees(obj.data.angle))), camPosProp.jfifID) + # Camera faces opposite direction + orientation = mathutils.Quaternion((0, 1, 0), math.radians(180.0)) + ( + translation, + rotation, + scale, + orientedRotation, + ) = getConvertedTransformWithOrientation( + transformMatrix, sceneObj, obj, orientation + ) + camPosProp = obj.ootCameraPositionProperty + index = camPosProp.index + # TODO: FOV conversion? + if index in scene.collision.cameraData.camPosDict: + raise PluginError("Error: Repeated camera position index: " + str(index)) + scene.collision.cameraData.camPosDict[index] = OOTCameraPosData( + getCustomProperty(camPosProp, "camSType"), + camPosProp.hasPositionData, + translation, + rotation, + int(round(math.degrees(obj.data.angle))), + camPosProp.jfifID, + ) + def readPathProp(pathProp, obj, scene, sceneObj, sceneName, transformMatrix): - relativeTransform = transformMatrix @ sceneObj.matrix_world.inverted() @ obj.matrix_world - index = obj.ootSplineProperty.index - if index in scene.pathList: - raise PluginError("Error: " + obj.name + "has a repeated spline index: " + str(index)) - scene.pathList[index] = ootConvertPath(sceneName, index, obj, relativeTransform) - -def ootConvertScene(originalSceneObj, transformMatrix, - f3dType, isHWv1, sceneName, DLFormat, convertTextureData): - - if originalSceneObj.data is not None or originalSceneObj.ootEmptyType != "Scene": - raise PluginError(originalSceneObj.name + " is not an empty with the \"Scene\" empty type.") - - if bpy.context.scene.exportHiddenGeometry: - hiddenObjs = unhideAllAndGetHiddenList(bpy.context.scene) - - # Don't remove ignore_render, as we want to reuse this for collision - sceneObj, allObjs = \ - ootDuplicateHierarchy(originalSceneObj, None, True, OOTObjectCategorizer()) - - if bpy.context.scene.exportHiddenGeometry: - hideObjsInList(hiddenObjs) - - roomObjs = [child for child in sceneObj.children if child.data is None and child.ootEmptyType == 'Room'] - if len(roomObjs) == 0: - raise PluginError("The scene has no child empties with the 'Room' empty type.") - - try: - scene = OOTScene(sceneName, OOTModel(f3dType, isHWv1, sceneName + '_dl', DLFormat, None)) - readSceneData(scene, sceneObj.fast64.oot.scene, sceneObj.ootSceneHeader, sceneObj.ootAlternateSceneHeaders) - processedRooms = set() - - for obj in sceneObj.children: - translation, rotation, scale, orientedRotation = \ - getConvertedTransform(transformMatrix, sceneObj, obj, True) - - if obj.data is None and obj.ootEmptyType == 'Room': - roomObj = obj - roomIndex = roomObj.ootRoomHeader.roomIndex - if roomIndex in processedRooms: - raise PluginError("Error: room index " + str(roomIndex) + " is used more than once.") - processedRooms.add(roomIndex) - room = scene.addRoom(roomIndex, sceneName, roomObj.ootRoomHeader.meshType) - readRoomData(room, roomObj.ootRoomHeader, roomObj.ootAlternateRoomHeaders) - - DLGroup = room.mesh.addMeshGroup(CullGroup( - translation, scale, obj.ootRoomHeader.defaultCullDistance)).DLGroup - ootProcessMesh(room.mesh, DLGroup, sceneObj, roomObj, transformMatrix, convertTextureData, None) - room.mesh.terminateDLs() - room.mesh.removeUnusedEntries() - ootProcessEmpties(scene, room, sceneObj, roomObj, transformMatrix) - elif obj.data is None and obj.ootEmptyType == "Water Box": - ootProcessWaterBox(sceneObj, obj, transformMatrix, scene, 0x3F) - elif isinstance(obj.data, bpy.types.Camera): - camPosProp = obj.ootCameraPositionProperty - readCamPos(camPosProp, obj, scene, sceneObj, transformMatrix) - elif isinstance(obj.data, bpy.types.Curve) and assertCurveValid(obj): - readPathProp(obj.ootSplineProperty, obj, scene, sceneObj, sceneName, transformMatrix) - - scene.validateIndices() - scene.entranceList = sorted(scene.entranceList, key=lambda x: x.startPositionIndex) - exportCollisionCommon(scene.collision, sceneObj, transformMatrix, True, sceneName) - - ootCleanupScene(originalSceneObj, allObjs) - - except Exception as e: - ootCleanupScene(originalSceneObj, allObjs) - raise Exception(str(e)) - - return scene + relativeTransform = ( + transformMatrix @ sceneObj.matrix_world.inverted() @ obj.matrix_world + ) + index = obj.ootSplineProperty.index + if index in scene.pathList: + raise PluginError( + "Error: " + obj.name + "has a repeated spline index: " + str(index) + ) + scene.pathList[index] = ootConvertPath(sceneName, index, obj, relativeTransform) + + +def ootConvertScene( + originalSceneObj, + transformMatrix, + f3dType, + isHWv1, + sceneName, + DLFormat, + convertTextureData, +): + + if originalSceneObj.data is not None or originalSceneObj.ootEmptyType != "Scene": + raise PluginError( + originalSceneObj.name + ' is not an empty with the "Scene" empty type.' + ) + + if bpy.context.scene.exportHiddenGeometry: + hiddenObjs = unhideAllAndGetHiddenList(bpy.context.scene) + + # Don't remove ignore_render, as we want to reuse this for collision + sceneObj, allObjs = ootDuplicateHierarchy( + originalSceneObj, None, True, OOTObjectCategorizer() + ) + + if bpy.context.scene.exportHiddenGeometry: + hideObjsInList(hiddenObjs) + + roomObjs = [ + child + for child in sceneObj.children + if child.data is None and child.ootEmptyType == "Room" + ] + if len(roomObjs) == 0: + raise PluginError("The scene has no child empties with the 'Room' empty type.") + + try: + scene = OOTScene( + sceneName, OOTModel(f3dType, isHWv1, sceneName + "_dl", DLFormat, None) + ) + readSceneData( + scene, + sceneObj.fast64.oot.scene, + sceneObj.ootSceneHeader, + sceneObj.ootAlternateSceneHeaders, + ) + processedRooms = set() + + for obj in sceneObj.children: + translation, rotation, scale, orientedRotation = getConvertedTransform( + transformMatrix, sceneObj, obj, True + ) + + if obj.data is None and obj.ootEmptyType == "Room": + roomObj = obj + roomIndex = roomObj.ootRoomHeader.roomIndex + if roomIndex in processedRooms: + raise PluginError( + "Error: room index " + + str(roomIndex) + + " is used more than once." + ) + processedRooms.add(roomIndex) + room = scene.addRoom( + roomIndex, sceneName, roomObj.ootRoomHeader.meshType + ) + readRoomData( + room, roomObj.ootRoomHeader, roomObj.ootAlternateRoomHeaders + ) + + DLGroup = room.mesh.addMeshGroup( + CullGroup(translation, scale, obj.ootRoomHeader.defaultCullDistance) + ).DLGroup + ootProcessMesh( + room.mesh, + DLGroup, + sceneObj, + roomObj, + transformMatrix, + convertTextureData, + None, + ) + room.mesh.terminateDLs() + room.mesh.removeUnusedEntries() + ootProcessEmpties(scene, room, sceneObj, roomObj, transformMatrix) + elif obj.data is None and obj.ootEmptyType == "Water Box": + ootProcessWaterBox(sceneObj, obj, transformMatrix, scene, 0x3F) + elif isinstance(obj.data, bpy.types.Camera): + camPosProp = obj.ootCameraPositionProperty + readCamPos(camPosProp, obj, scene, sceneObj, transformMatrix) + elif isinstance(obj.data, bpy.types.Curve) and assertCurveValid(obj): + readPathProp( + obj.ootSplineProperty, + obj, + scene, + sceneObj, + sceneName, + transformMatrix, + ) + + scene.validateIndices() + scene.entranceList = sorted( + scene.entranceList, key=lambda x: x.startPositionIndex + ) + exportCollisionCommon( + scene.collision, sceneObj, transformMatrix, True, sceneName + ) + + ootCleanupScene(originalSceneObj, allObjs) + + except Exception as e: + ootCleanupScene(originalSceneObj, allObjs) + raise Exception(str(e)) + + return scene + # This function should be called on a copy of an object # The copy will have modifiers / scale applied and will be made single user # When we duplicated obj hierarchy we stripped all ignore_renders from hierarchy. -def ootProcessMesh(roomMesh, DLGroup, sceneObj, obj, transformMatrix, convertTextureData, LODHierarchyObject): - - relativeTransform = transformMatrix @ sceneObj.matrix_world.inverted() @ obj.matrix_world - translation, rotation, scale = relativeTransform.decompose() - - if obj.data is None and obj.ootEmptyType == "Cull Group": - if LODHierarchyObject is not None: - raise PluginError(obj.name + " cannot be used as a cull group because it is " +\ - "in the sub-hierarchy of the LOD group empty " + LODHierarchyObject.name) - - checkUniformScale(scale, obj) - DLGroup = roomMesh.addMeshGroup(CullGroup( - ootConvertTranslation(translation), scale, obj.empty_display_size)).DLGroup - - elif isinstance(obj.data, bpy.types.Mesh) and not obj.ignore_render: - triConverterInfo = TriangleConverterInfo(obj, None, roomMesh.model.f3d, relativeTransform, getInfoDict(obj)) - fMeshes = saveStaticModel(triConverterInfo, roomMesh.model, obj, relativeTransform, roomMesh.model.name, - convertTextureData, False, 'oot') - if fMeshes is not None: - for drawLayer, fMesh in fMeshes.items(): - DLGroup.addDLCall(fMesh.draw, drawLayer) - - alphabeticalChildren = sorted(obj.children, key = lambda childObj: childObj.original_name.lower()) - for childObj in alphabeticalChildren: - if childObj.data is None and childObj.ootEmptyType == "LOD": - ootProcessLOD(roomMesh, DLGroup, sceneObj, childObj, transformMatrix, convertTextureData, LODHierarchyObject) - else: - ootProcessMesh(roomMesh, DLGroup, sceneObj, childObj, transformMatrix, convertTextureData, LODHierarchyObject) - -def ootProcessLOD(roomMesh, DLGroup, sceneObj, obj, transformMatrix, convertTextureData, LODHierarchyObject): - - relativeTransform = transformMatrix @ sceneObj.matrix_world.inverted() @ obj.matrix_world - translation, rotation, scale = relativeTransform.decompose() - ootTranslation = ootConvertTranslation(translation) - - LODHierarchyObject = obj - name = toAlnum(roomMesh.model.name + "_" + obj.name + "_lod") - opaqueLOD = roomMesh.model.addLODGroup(name + "_opaque", ootTranslation, obj.f3d_lod_always_render_farthest) - transparentLOD = roomMesh.model.addLODGroup(name + "_transparent", ootTranslation, obj.f3d_lod_always_render_farthest) - - index = 0 - for childObj in obj.children: - # This group will not be converted to C directly, but its display lists will be converted through the FLODGroup. - childDLGroup = OOTDLGroup(name + str(index), roomMesh.model.DLFormat) - index += 1 - - if childObj.data is None and childObj.ootEmptyType == "LOD": - ootProcessLOD(roomMesh, childDLGroup, sceneObj, childObj, transformMatrix, convertTextureData, LODHierarchyObject) - else: - ootProcessMesh(roomMesh, childDLGroup, sceneObj, childObj, transformMatrix, convertTextureData, LODHierarchyObject) - - # We handle case with no geometry, for the cases where we have "gaps" in the LOD hierarchy. - # This can happen if a LOD does not use transparency while the levels above and below it does. - childDLGroup.createDLs() - childDLGroup.terminateDLs() - - # Add lod AFTER processing hierarchy, so that DLs will be built by then - opaqueLOD.add_lod(childDLGroup.opaque, childObj.f3d_lod_z * bpy.context.scene.ootBlenderScale) - transparentLOD.add_lod(childDLGroup.transparent, childObj.f3d_lod_z * bpy.context.scene.ootBlenderScale) - - opaqueLOD.create_data() - transparentLOD.create_data() - - DLGroup.addDLCall(opaqueLOD.draw, "Opaque") - DLGroup.addDLCall(transparentLOD.draw, "Transparent") +def ootProcessMesh( + roomMesh, + DLGroup, + sceneObj, + obj, + transformMatrix, + convertTextureData, + LODHierarchyObject, +): + + relativeTransform = ( + transformMatrix @ sceneObj.matrix_world.inverted() @ obj.matrix_world + ) + translation, rotation, scale = relativeTransform.decompose() + + if obj.data is None and obj.ootEmptyType == "Cull Group": + if LODHierarchyObject is not None: + raise PluginError( + obj.name + + " cannot be used as a cull group because it is " + + "in the sub-hierarchy of the LOD group empty " + + LODHierarchyObject.name + ) + + checkUniformScale(scale, obj) + DLGroup = roomMesh.addMeshGroup( + CullGroup(ootConvertTranslation(translation), scale, obj.empty_display_size) + ).DLGroup + + elif isinstance(obj.data, bpy.types.Mesh) and not obj.ignore_render: + triConverterInfo = TriangleConverterInfo( + obj, None, roomMesh.model.f3d, relativeTransform, getInfoDict(obj) + ) + fMeshes = saveStaticModel( + triConverterInfo, + roomMesh.model, + obj, + relativeTransform, + roomMesh.model.name, + convertTextureData, + False, + "oot", + ) + if fMeshes is not None: + for drawLayer, fMesh in fMeshes.items(): + DLGroup.addDLCall(fMesh.draw, drawLayer) + + alphabeticalChildren = sorted( + obj.children, key=lambda childObj: childObj.original_name.lower() + ) + for childObj in alphabeticalChildren: + if childObj.data is None and childObj.ootEmptyType == "LOD": + ootProcessLOD( + roomMesh, + DLGroup, + sceneObj, + childObj, + transformMatrix, + convertTextureData, + LODHierarchyObject, + ) + else: + ootProcessMesh( + roomMesh, + DLGroup, + sceneObj, + childObj, + transformMatrix, + convertTextureData, + LODHierarchyObject, + ) + + +def ootProcessLOD( + roomMesh, + DLGroup, + sceneObj, + obj, + transformMatrix, + convertTextureData, + LODHierarchyObject, +): + + relativeTransform = ( + transformMatrix @ sceneObj.matrix_world.inverted() @ obj.matrix_world + ) + translation, rotation, scale = relativeTransform.decompose() + ootTranslation = ootConvertTranslation(translation) + + LODHierarchyObject = obj + name = toAlnum(roomMesh.model.name + "_" + obj.name + "_lod") + opaqueLOD = roomMesh.model.addLODGroup( + name + "_opaque", ootTranslation, obj.f3d_lod_always_render_farthest + ) + transparentLOD = roomMesh.model.addLODGroup( + name + "_transparent", ootTranslation, obj.f3d_lod_always_render_farthest + ) + + index = 0 + for childObj in obj.children: + # This group will not be converted to C directly, but its display lists will be converted through the FLODGroup. + childDLGroup = OOTDLGroup(name + str(index), roomMesh.model.DLFormat) + index += 1 + + if childObj.data is None and childObj.ootEmptyType == "LOD": + ootProcessLOD( + roomMesh, + childDLGroup, + sceneObj, + childObj, + transformMatrix, + convertTextureData, + LODHierarchyObject, + ) + else: + ootProcessMesh( + roomMesh, + childDLGroup, + sceneObj, + childObj, + transformMatrix, + convertTextureData, + LODHierarchyObject, + ) + + # We handle case with no geometry, for the cases where we have "gaps" in the LOD hierarchy. + # This can happen if a LOD does not use transparency while the levels above and below it does. + childDLGroup.createDLs() + childDLGroup.terminateDLs() + + # Add lod AFTER processing hierarchy, so that DLs will be built by then + opaqueLOD.add_lod( + childDLGroup.opaque, childObj.f3d_lod_z * bpy.context.scene.ootBlenderScale + ) + transparentLOD.add_lod( + childDLGroup.transparent, + childObj.f3d_lod_z * bpy.context.scene.ootBlenderScale, + ) + + opaqueLOD.create_data() + transparentLOD.create_data() + + DLGroup.addDLCall(opaqueLOD.draw, "Opaque") + DLGroup.addDLCall(transparentLOD.draw, "Transparent") + def ootProcessEmpties(scene, room, sceneObj, obj, transformMatrix): - translation, rotation, scale, orientedRotation = getConvertedTransform(transformMatrix, sceneObj, obj, True) - - if obj.data is None: - if obj.ootEmptyType == "Actor": - actorProp = obj.ootActorProperty - addActor(room, OOTActor(getCustomProperty(actorProp, 'actorID'), - translation, rotation, actorProp.actorParam, - None if not actorProp.rotOverride else (actorProp.rotOverrideX, actorProp.rotOverrideY, actorProp.rotOverrideZ)), - actorProp, "actorList", obj.name) - elif obj.ootEmptyType == "Transition Actor": - transActorProp = obj.ootTransitionActorProperty - addActor(scene, OOTTransitionActor( - getCustomProperty(transActorProp.actor, "actorID"), - room.roomIndex, transActorProp.roomIndex, - getCustomProperty(transActorProp, "cameraTransitionFront"), - getCustomProperty(transActorProp, "cameraTransitionBack"), - translation, rotation[1], # TODO: Correct axis? - transActorProp.actor.actorParam), transActorProp.actor, "transitionActorList", obj.name) - #scene.transitionActorList.append(OOTTransitionActor( - # getCustomProperty(transActorProp.actor, "actorID"), - # room.roomIndex, transActorProp.roomIndex, - # getCustomProperty(transActorProp, "cameraTransitionFront"), - # getCustomProperty(transActorProp, "cameraTransitionBack"), - # translation, rotation[1], # TODO: Correct axis? - # transActorProp.actor.actorParam)) - elif obj.ootEmptyType == "Entrance": - entranceProp = obj.ootEntranceProperty - spawnIndex = obj.ootEntranceProperty.spawnIndex - addActor(scene, OOTEntrance(room.roomIndex, spawnIndex), entranceProp.actor, "entranceList", obj.name) - #scene.entranceList.append(OOTEntrance(room.roomIndex, spawnIndex)) - addStartPosition(scene, spawnIndex, OOTActor( - "ACTOR_PLAYER" if not entranceProp.customActor else entranceProp.actor.actorIDCustom, - translation, rotation, entranceProp.actor.actorParam, None), entranceProp.actor, obj.name) - elif obj.ootEmptyType == "Water Box": - ootProcessWaterBox(sceneObj, obj, transformMatrix, scene, room.roomIndex) - elif isinstance(obj.data, bpy.types.Camera): - camPosProp = obj.ootCameraPositionProperty - readCamPos(camPosProp, obj, scene, sceneObj, transformMatrix) - elif isinstance(obj.data, bpy.types.Curve) and assertCurveValid(obj): - readPathProp(obj.ootSplineProperty, obj, scene, sceneObj, scene.name, transformMatrix) - - for childObj in obj.children: - ootProcessEmpties(scene, room, sceneObj, childObj, transformMatrix) - + translation, rotation, scale, orientedRotation = getConvertedTransform( + transformMatrix, sceneObj, obj, True + ) + + if obj.data is None: + if obj.ootEmptyType == "Actor": + actorProp = obj.ootActorProperty + addActor( + room, + OOTActor( + getCustomProperty(actorProp, "actorID"), + translation, + rotation, + actorProp.actorParam, + None + if not actorProp.rotOverride + else ( + actorProp.rotOverrideX, + actorProp.rotOverrideY, + actorProp.rotOverrideZ, + ), + ), + actorProp, + "actorList", + obj.name, + ) + elif obj.ootEmptyType == "Transition Actor": + transActorProp = obj.ootTransitionActorProperty + addActor( + scene, + OOTTransitionActor( + getCustomProperty(transActorProp.actor, "actorID"), + room.roomIndex, + transActorProp.roomIndex, + getCustomProperty(transActorProp, "cameraTransitionFront"), + getCustomProperty(transActorProp, "cameraTransitionBack"), + translation, + rotation[1], # TODO: Correct axis? + transActorProp.actor.actorParam, + ), + transActorProp.actor, + "transitionActorList", + obj.name, + ) + # scene.transitionActorList.append(OOTTransitionActor( + # getCustomProperty(transActorProp.actor, "actorID"), + # room.roomIndex, transActorProp.roomIndex, + # getCustomProperty(transActorProp, "cameraTransitionFront"), + # getCustomProperty(transActorProp, "cameraTransitionBack"), + # translation, rotation[1], # TODO: Correct axis? + # transActorProp.actor.actorParam)) + elif obj.ootEmptyType == "Entrance": + entranceProp = obj.ootEntranceProperty + spawnIndex = obj.ootEntranceProperty.spawnIndex + addActor( + scene, + OOTEntrance(room.roomIndex, spawnIndex), + entranceProp.actor, + "entranceList", + obj.name, + ) + # scene.entranceList.append(OOTEntrance(room.roomIndex, spawnIndex)) + addStartPosition( + scene, + spawnIndex, + OOTActor( + "ACTOR_PLAYER" + if not entranceProp.customActor + else entranceProp.actor.actorIDCustom, + translation, + rotation, + entranceProp.actor.actorParam, + None, + ), + entranceProp.actor, + obj.name, + ) + elif obj.ootEmptyType == "Water Box": + ootProcessWaterBox(sceneObj, obj, transformMatrix, scene, room.roomIndex) + elif isinstance(obj.data, bpy.types.Camera): + camPosProp = obj.ootCameraPositionProperty + readCamPos(camPosProp, obj, scene, sceneObj, transformMatrix) + elif isinstance(obj.data, bpy.types.Curve) and assertCurveValid(obj): + readPathProp( + obj.ootSplineProperty, obj, scene, sceneObj, scene.name, transformMatrix + ) + + for childObj in obj.children: + ootProcessEmpties(scene, room, sceneObj, childObj, transformMatrix) + + def ootProcessWaterBox(sceneObj, obj, transformMatrix, scene, roomIndex): - translation, rotation, scale, orientedRotation = getConvertedTransform(transformMatrix, sceneObj, obj, True) + translation, rotation, scale, orientedRotation = getConvertedTransform( + transformMatrix, sceneObj, obj, True + ) + + checkIdentityRotation(obj, orientedRotation, False) + waterBoxProp = obj.ootWaterBoxProperty + scene.collision.waterBoxes.append( + OOTWaterBox( + roomIndex, + getCustomProperty(waterBoxProp, "lighting"), + getCustomProperty(waterBoxProp, "camera"), + translation, + scale, + obj.empty_display_size, + ) + ) - checkIdentityRotation(obj, orientedRotation, False) - waterBoxProp = obj.ootWaterBoxProperty - scene.collision.waterBoxes.append(OOTWaterBox( - roomIndex, - getCustomProperty(waterBoxProp, "lighting"), - getCustomProperty(waterBoxProp, "camera"), - translation, scale, obj.empty_display_size)) class OOT_ExportScene(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.oot_export_level' - bl_label = "Export Scene" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - def execute(self, context): - activeObj = None - try: - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = "OBJECT") - activeObj = context.view_layer.objects.active - - obj = context.scene.ootSceneExportObj - if obj is None: - raise PluginError("Scene object input not set.") - elif obj.data is not None or obj.ootEmptyType != 'Scene': - raise PluginError("The input object is not an empty with the Scene type.") - - #obj = context.active_object - - scaleValue = bpy.context.scene.ootBlenderScale - finalTransform = mathutils.Matrix.Diagonal(mathutils.Vector(( - scaleValue, scaleValue, scaleValue))).to_4x4() - - except Exception as e: - raisePluginError(self, e) - return {'CANCELLED'} # must return a set - try: - levelName = context.scene.ootSceneName - if context.scene.ootSceneCustomExport: - exportInfo = ExportInfo(True, bpy.path.abspath(context.scene.ootSceneExportPath), None, levelName) - else: - if context.scene.ootSceneOption == 'Custom': - subfolder = 'assets/scenes/' + context.scene.ootSceneSubFolder + '/' - else: - levelName = sceneNameFromID(context.scene.ootSceneOption) - subfolder = None - exportInfo = ExportInfo(False, bpy.path.abspath(context.scene.ootDecompPath), subfolder, levelName) - #if not context.scene.ootSceneCustomExport: - # applyBasicTweaks(exportPath) - - ootExportSceneToC(obj, finalTransform, - context.scene.f3d_type, context.scene.isHWv1, levelName, DLFormat.Static, - context.scene.saveTextures or bpy.context.scene.ignoreTextureRestrictions, exportInfo) - - #ootExportScene(obj, finalTransform, - # context.scene.f3d_type, context.scene.isHWv1, levelName, exportPath, - # context.scene.saveTextures or bpy.context.scene.ignoreTextureRestrictions, - # context.scene.ootSceneCustomExport, DLFormat.Dynamic) - self.report({'INFO'}, 'Success!') - - context.view_layer.objects.active = activeObj - if activeObj is not None: - activeObj.select_set(True) - - #applyRotation(obj.children, math.radians(0), 'X') - return {'FINISHED'} # must return a set - - except Exception as e: - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - context.view_layer.objects.active = activeObj - if activeObj is not None: - activeObj.select_set(True) - raisePluginError(self, e) - return {'CANCELLED'} # must return a set + # set bl_ properties + bl_idname = "object.oot_export_level" + bl_label = "Export Scene" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + def execute(self, context): + activeObj = None + try: + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + activeObj = context.view_layer.objects.active + + obj = context.scene.ootSceneExportObj + if obj is None: + raise PluginError("Scene object input not set.") + elif obj.data is not None or obj.ootEmptyType != "Scene": + raise PluginError( + "The input object is not an empty with the Scene type." + ) + + # obj = context.active_object + + scaleValue = bpy.context.scene.ootBlenderScale + finalTransform = mathutils.Matrix.Diagonal( + mathutils.Vector((scaleValue, scaleValue, scaleValue)) + ).to_4x4() + + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} # must return a set + try: + levelName = context.scene.ootSceneName + if context.scene.ootSceneCustomExport: + exportInfo = ExportInfo( + True, + bpy.path.abspath(context.scene.ootSceneExportPath), + None, + levelName, + ) + else: + if context.scene.ootSceneOption == "Custom": + subfolder = "assets/scenes/" + context.scene.ootSceneSubFolder + "/" + else: + levelName = sceneNameFromID(context.scene.ootSceneOption) + subfolder = None + exportInfo = ExportInfo( + False, + bpy.path.abspath(context.scene.ootDecompPath), + subfolder, + levelName, + ) + # if not context.scene.ootSceneCustomExport: + # applyBasicTweaks(exportPath) + + ootExportSceneToC( + obj, + finalTransform, + context.scene.f3d_type, + context.scene.isHWv1, + levelName, + DLFormat.Static, + context.scene.saveTextures + or bpy.context.scene.ignoreTextureRestrictions, + exportInfo, + ) + + # ootExportScene(obj, finalTransform, + # context.scene.f3d_type, context.scene.isHWv1, levelName, exportPath, + # context.scene.saveTextures or bpy.context.scene.ignoreTextureRestrictions, + # context.scene.ootSceneCustomExport, DLFormat.Dynamic) + self.report({"INFO"}, "Success!") + + context.view_layer.objects.active = activeObj + if activeObj is not None: + activeObj.select_set(True) + + # applyRotation(obj.children, math.radians(0), 'X') + return {"FINISHED"} # must return a set + + except Exception as e: + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + context.view_layer.objects.active = activeObj + if activeObj is not None: + activeObj.select_set(True) + raisePluginError(self, e) + return {"CANCELLED"} # must return a set + def ootRemoveSceneC(exportInfo): - modifySceneTable(None, exportInfo) - modifySegmentSymbols(None, exportInfo) - modifySceneIDs(None, exportInfo) - modifySegmentDefinition(None, exportInfo) - deleteSceneFiles(exportInfo) + modifySceneTable(None, exportInfo) + modifySegmentSymbols(None, exportInfo) + modifySceneIDs(None, exportInfo) + modifySegmentDefinition(None, exportInfo) + deleteSceneFiles(exportInfo) + class OOT_RemoveScene(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.oot_remove_level' - bl_label = "Remove Scene" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - def execute(self, context): - levelName = context.scene.ootSceneName - if context.scene.ootSceneCustomExport: - operator.report({'ERROR'}, "You can only remove scenes from your decomp path.") - return {"FINISHED"} - - if context.scene.ootSceneOption == 'Custom': - subfolder = 'assets/scenes/' + context.scene.ootSceneSubFolder + '/' - else: - levelName = sceneNameFromID(context.scene.ootSceneOption) - subfolder = None - exportInfo = ExportInfo(False, bpy.path.abspath(context.scene.ootDecompPath), subfolder, levelName) - - ootRemoveSceneC(exportInfo) - - self.report({'INFO'}, 'Success!') - return {'FINISHED'} # must return a set + # set bl_ properties + bl_idname = "object.oot_remove_level" + bl_label = "Remove Scene" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + def execute(self, context): + levelName = context.scene.ootSceneName + if context.scene.ootSceneCustomExport: + operator.report( + {"ERROR"}, "You can only remove scenes from your decomp path." + ) + return {"FINISHED"} + + if context.scene.ootSceneOption == "Custom": + subfolder = "assets/scenes/" + context.scene.ootSceneSubFolder + "/" + else: + levelName = sceneNameFromID(context.scene.ootSceneOption) + subfolder = None + exportInfo = ExportInfo( + False, bpy.path.abspath(context.scene.ootDecompPath), subfolder, levelName + ) + + ootRemoveSceneC(exportInfo) + + self.report({"INFO"}, "Success!") + return {"FINISHED"} # must return a set + class OOT_ExportScenePanel(OOT_Panel): - bl_idname = "OOT_PT_export_level" - bl_label = "OOT Scene Exporter" - - # called every frame - def draw(self, context): - col = self.layout.column() - col.operator(OOT_ExportScene.bl_idname) - #if not bpy.context.scene.ignoreTextureRestrictions: - # col.prop(context.scene, 'saveTextures') - prop_split(col, context.scene, 'ootSceneExportObj', "Scene Object") - col.prop(context.scene, 'ootSceneSingleFile') - col.prop(context.scene, 'ootSceneCustomExport') - if context.scene.ootSceneCustomExport: - prop_split(col, context.scene, 'ootSceneExportPath', 'Directory') - prop_split(col, context.scene, 'ootSceneName', 'Name') - customExportWarning(col) - else: - col.operator(OOT_SearchSceneEnumOperator.bl_idname, icon = 'VIEWZOOM') - col.box().column().label(text = getEnumName(ootEnumSceneID, context.scene.ootSceneOption)) - #col.prop(context.scene, 'ootSceneOption') - if context.scene.ootSceneOption == 'Custom': - prop_split(col, context.scene, 'ootSceneSubFolder', 'Subfolder') - prop_split(col, context.scene, 'ootSceneName', 'Name') - col.operator(OOT_RemoveScene.bl_idname) + bl_idname = "OOT_PT_export_level" + bl_label = "OOT Scene Exporter" + + # called every frame + def draw(self, context): + col = self.layout.column() + col.operator(OOT_ExportScene.bl_idname) + # if not bpy.context.scene.ignoreTextureRestrictions: + # col.prop(context.scene, 'saveTextures') + prop_split(col, context.scene, "ootSceneExportObj", "Scene Object") + col.prop(context.scene, "ootSceneSingleFile") + col.prop(context.scene, "ootSceneCustomExport") + if context.scene.ootSceneCustomExport: + prop_split(col, context.scene, "ootSceneExportPath", "Directory") + prop_split(col, context.scene, "ootSceneName", "Name") + customExportWarning(col) + else: + col.operator(OOT_SearchSceneEnumOperator.bl_idname, icon="VIEWZOOM") + col.box().column().label( + text=getEnumName(ootEnumSceneID, context.scene.ootSceneOption) + ) + # col.prop(context.scene, 'ootSceneOption') + if context.scene.ootSceneOption == "Custom": + prop_split(col, context.scene, "ootSceneSubFolder", "Subfolder") + prop_split(col, context.scene, "ootSceneName", "Name") + col.operator(OOT_RemoveScene.bl_idname) + def isSceneObj(self, obj): - return obj.data is None and obj.ootEmptyType == "Scene" + return obj.data is None and obj.ootEmptyType == "Scene" + oot_level_classes = ( - OOT_ExportScene, - OOT_RemoveScene, + OOT_ExportScene, + OOT_RemoveScene, ) -oot_level_panel_classes = ( - OOT_ExportScenePanel, -) +oot_level_panel_classes = (OOT_ExportScenePanel,) + def oot_level_panel_register(): - for cls in oot_level_panel_classes: - register_class(cls) + for cls in oot_level_panel_classes: + register_class(cls) + def oot_level_panel_unregister(): - for cls in oot_level_panel_classes: - unregister_class(cls) + for cls in oot_level_panel_classes: + unregister_class(cls) + def oot_level_register(): - for cls in oot_level_classes: - register_class(cls) - - bpy.types.Scene.ootSceneName = bpy.props.StringProperty(name = 'Name', default = 'spot03') - bpy.types.Scene.ootSceneSubFolder = bpy.props.StringProperty(name = "Subfolder", default = 'overworld') - bpy.types.Scene.ootSceneOption = bpy.props.EnumProperty(name = "Scene", items = ootEnumSceneID, default = 'SCENE_YDAN') - bpy.types.Scene.ootSceneExportPath = bpy.props.StringProperty( - name = 'Directory', subtype = 'FILE_PATH') - bpy.types.Scene.ootSceneCustomExport = bpy.props.BoolProperty( - name = 'Custom Export Path') - bpy.types.Scene.ootSceneExportObj = bpy.props.PointerProperty(type = bpy.types.Object, poll = isSceneObj) - bpy.types.Scene.ootSceneSingleFile = bpy.props.BoolProperty( - name = "Export as Single File", - default = False, - description = "Does not split the scene and rooms into multiple files.") + for cls in oot_level_classes: + register_class(cls) + + bpy.types.Scene.ootSceneName = bpy.props.StringProperty( + name="Name", default="spot03" + ) + bpy.types.Scene.ootSceneSubFolder = bpy.props.StringProperty( + name="Subfolder", default="overworld" + ) + bpy.types.Scene.ootSceneOption = bpy.props.EnumProperty( + name="Scene", items=ootEnumSceneID, default="SCENE_YDAN" + ) + bpy.types.Scene.ootSceneExportPath = bpy.props.StringProperty( + name="Directory", subtype="FILE_PATH" + ) + bpy.types.Scene.ootSceneCustomExport = bpy.props.BoolProperty( + name="Custom Export Path" + ) + bpy.types.Scene.ootSceneExportObj = bpy.props.PointerProperty( + type=bpy.types.Object, poll=isSceneObj + ) + bpy.types.Scene.ootSceneSingleFile = bpy.props.BoolProperty( + name="Export as Single File", + default=False, + description="Does not split the scene and rooms into multiple files.", + ) def oot_level_unregister(): - for cls in reversed(oot_level_classes): - unregister_class(cls) - - del bpy.types.Scene.ootSceneName - del bpy.types.Scene.ootSceneExportPath - del bpy.types.Scene.ootSceneCustomExport - del bpy.types.Scene.ootSceneOption - del bpy.types.Scene.ootSceneSubFolder - del bpy.types.Scene.ootSceneSingleFile + for cls in reversed(oot_level_classes): + unregister_class(cls) + + del bpy.types.Scene.ootSceneName + del bpy.types.Scene.ootSceneExportPath + del bpy.types.Scene.ootSceneCustomExport + del bpy.types.Scene.ootSceneOption + del bpy.types.Scene.ootSceneSubFolder + del bpy.types.Scene.ootSceneSingleFile diff --git a/fast64_internal/oot/oot_model_classes.py b/fast64_internal/oot/oot_model_classes.py index 8621ed878..1b2ec0edb 100644 --- a/fast64_internal/oot/oot_model_classes.py +++ b/fast64_internal/oot/oot_model_classes.py @@ -7,185 +7,236 @@ from ..f3d.f3d_material import * from ..f3d.f3d_parser import * + class OOTModel(FModel): - def __init__(self, f3dType, isHWv1, name, DLFormat, drawLayerOverride): - self.drawLayerOverride = drawLayerOverride - FModel.__init__(self, f3dType, isHWv1, name, DLFormat, GfxMatWriteMethod.WriteAll) - - def getDrawLayerV3(self, obj): - return obj.ootDrawLayer - - def getRenderMode(self, drawLayer): - if self.drawLayerOverride: - drawLayerUsed = self.drawLayerOverride - else: - drawLayerUsed = drawLayer - defaultRenderModes = bpy.context.scene.world.ootDefaultRenderModes - cycle1 = getattr(defaultRenderModes, drawLayerUsed.lower() + "Cycle1") - cycle2 = getattr(defaultRenderModes, drawLayerUsed.lower() + "Cycle2") - return [cycle1, cycle2] - - def getTextureSuffixFromFormat(self, texFmt): - if texFmt == 'RGBA16': - return 'rgb5a1' - else: - return texFmt.lower() - - def onMaterialCommandsBuilt(self, gfxList, revertList, material, drawLayer): - matDrawLayer = getattr(material.ootMaterial, drawLayer.lower()) - for i in range(8, 14): - if getattr(matDrawLayer, "segment" + format(i, 'X')): - gfxList.commands.append(SPDisplayList( - GfxList("0x" + format(i,'X') + '000000', GfxListTag.Material, DLFormat.Static))) - for i in range(0, 2): - p = "customCall" + str(i) - if getattr(matDrawLayer, p): - gfxList.commands.append(SPDisplayList( - GfxList(getattr(matDrawLayer, p + "_seg"), GfxListTag.Material, DLFormat.Static))) - - def onAddMesh(self, fMesh, contextObj): - if contextObj is not None and hasattr(contextObj, 'ootDynamicTransform'): - if contextObj.ootDynamicTransform.billboard: - fMesh.draw.commands.append(SPMatrix("0x01000000", "G_MTX_MODELVIEW | G_MTX_NOPUSH | G_MTX_MUL")) + def __init__(self, f3dType, isHWv1, name, DLFormat, drawLayerOverride): + self.drawLayerOverride = drawLayerOverride + FModel.__init__( + self, f3dType, isHWv1, name, DLFormat, GfxMatWriteMethod.WriteAll + ) + + def getDrawLayerV3(self, obj): + return obj.ootDrawLayer + + def getRenderMode(self, drawLayer): + if self.drawLayerOverride: + drawLayerUsed = self.drawLayerOverride + else: + drawLayerUsed = drawLayer + defaultRenderModes = bpy.context.scene.world.ootDefaultRenderModes + cycle1 = getattr(defaultRenderModes, drawLayerUsed.lower() + "Cycle1") + cycle2 = getattr(defaultRenderModes, drawLayerUsed.lower() + "Cycle2") + return [cycle1, cycle2] + + def getTextureSuffixFromFormat(self, texFmt): + if texFmt == "RGBA16": + return "rgb5a1" + else: + return texFmt.lower() + + def onMaterialCommandsBuilt(self, gfxList, revertList, material, drawLayer): + matDrawLayer = getattr(material.ootMaterial, drawLayer.lower()) + for i in range(8, 14): + if getattr(matDrawLayer, "segment" + format(i, "X")): + gfxList.commands.append( + SPDisplayList( + GfxList( + "0x" + format(i, "X") + "000000", + GfxListTag.Material, + DLFormat.Static, + ) + ) + ) + for i in range(0, 2): + p = "customCall" + str(i) + if getattr(matDrawLayer, p): + gfxList.commands.append( + SPDisplayList( + GfxList( + getattr(matDrawLayer, p + "_seg"), + GfxListTag.Material, + DLFormat.Static, + ) + ) + ) + + def onAddMesh(self, fMesh, contextObj): + if contextObj is not None and hasattr(contextObj, "ootDynamicTransform"): + if contextObj.ootDynamicTransform.billboard: + fMesh.draw.commands.append( + SPMatrix("0x01000000", "G_MTX_MODELVIEW | G_MTX_NOPUSH | G_MTX_MUL") + ) class OOTDynamicMaterialDrawLayer: - def __init__(self, opaque, transparent): - self.opaque = opaque - self.transparent = transparent + def __init__(self, opaque, transparent): + self.opaque = opaque + self.transparent = transparent + class OOTGfxFormatter(GfxFormatter): - def __init__(self, scrollMethod): - GfxFormatter.__init__(self, scrollMethod, 64) - - # This code is not functional, only used for an example - def drawToC(self, f3d, gfxList): - return gfxList.to_c(f3d) - - # This code is not functional, only used for an example - def tileScrollMaterialToC(self, f3d, fMaterial): - materialGfx = fMaterial.material - scrollDataFields = fMaterial.scrollData.fields - - # Set tile scrolling - for texIndex in range(2): # for each texture - for axisIndex in range(2): # for each axis - scrollField = scrollDataFields[texIndex][axisIndex] - if scrollField.animType != "None": - if scrollField.animType == "Linear": - if axisIndex == 0: - fMaterial.tileSizeCommands[texIndex].uls = str(fMaterial.tileSizeCommands[0].uls) + \ - " + s * " + str(scrollField.speed) - else: - fMaterial.tileSizeCommands[texIndex].ult = str(fMaterial.tileSizeCommands[0].ult) + \ - " + s * " + str(scrollField.speed) - - # Build commands - data = CData() - data.header = 'Gfx* ' + fMaterial.material.name + '(Gfx* glistp, int s, int t);\n' - data.source = 'Gfx* ' + materialGfx.name + '(Gfx* glistp, int s, int t) {\n' - for command in materialGfx.commands: - data.source += '\t' + command.to_c(False) + ';\n' - data.source += '\treturn glistp;\n}' + '\n\n' - - if fMaterial.revert is not None: - data.append(fMaterial.revert.to_c(f3d)) - return data + def __init__(self, scrollMethod): + GfxFormatter.__init__(self, scrollMethod, 64) + + # This code is not functional, only used for an example + def drawToC(self, f3d, gfxList): + return gfxList.to_c(f3d) + + # This code is not functional, only used for an example + def tileScrollMaterialToC(self, f3d, fMaterial): + materialGfx = fMaterial.material + scrollDataFields = fMaterial.scrollData.fields + + # Set tile scrolling + for texIndex in range(2): # for each texture + for axisIndex in range(2): # for each axis + scrollField = scrollDataFields[texIndex][axisIndex] + if scrollField.animType != "None": + if scrollField.animType == "Linear": + if axisIndex == 0: + fMaterial.tileSizeCommands[texIndex].uls = ( + str(fMaterial.tileSizeCommands[0].uls) + + " + s * " + + str(scrollField.speed) + ) + else: + fMaterial.tileSizeCommands[texIndex].ult = ( + str(fMaterial.tileSizeCommands[0].ult) + + " + s * " + + str(scrollField.speed) + ) + + # Build commands + data = CData() + data.header = ( + "Gfx* " + fMaterial.material.name + "(Gfx* glistp, int s, int t);\n" + ) + data.source = "Gfx* " + materialGfx.name + "(Gfx* glistp, int s, int t) {\n" + for command in materialGfx.commands: + data.source += "\t" + command.to_c(False) + ";\n" + data.source += "\treturn glistp;\n}" + "\n\n" + + if fMaterial.revert is not None: + data.append(fMaterial.revert.to_c(f3d)) + return data + class OOTTriangleConverterInfo(TriangleConverterInfo): - def __init__(self, obj, armature, f3d, transformMatrix, infoDict): - TriangleConverterInfo.__init__(self, obj, armature, f3d, transformMatrix, infoDict) + def __init__(self, obj, armature, f3d, transformMatrix, infoDict): + TriangleConverterInfo.__init__( + self, obj, armature, f3d, transformMatrix, infoDict + ) + + def getMatrixAddrFromGroup(self, groupIndex): + return format( + (0x0D << 24) + + MTX_SIZE * self.vertexGroupInfo.vertexGroupToMatrixIndex[groupIndex], + "#010x", + ) - def getMatrixAddrFromGroup(self, groupIndex): - return format((0x0D << 24) + MTX_SIZE * self.vertexGroupInfo.vertexGroupToMatrixIndex[groupIndex], "#010x") class OOTVertexGroupInfo(VertexGroupInfo): - def __init__(self): - self.vertexGroupToMatrixIndex = {} - VertexGroupInfo.__init__(self) + def __init__(self): + self.vertexGroupToMatrixIndex = {} + VertexGroupInfo.__init__(self) + + +# class OOTBox: +# def __init__(self): +# self.minBounds = [-2**8, -2**8] +# self.maxBounds = [2**8 - 1, 2**8 - 1] -#class OOTBox: -# def __init__(self): -# self.minBounds = [-2**8, -2**8] -# self.maxBounds = [2**8 - 1, 2**8 - 1] class OOTF3DContext(F3DContext): - def __init__(self, f3d, limbList, basePath): - self.limbList = limbList - self.dlList = [] # in the order they are rendered - self.isBillboard = False - materialContext = createF3DMat(None, preset = 'oot_shaded_solid') - #materialContext.f3d_mat.rdp_settings.g_mdsft_cycletype = "G_CYC_1CYCLE" - F3DContext.__init__(self, f3d, basePath, materialContext) - - def getLimbName(self, index): - return self.limbList[index] - - def getBoneName(self, index): - return "bone" + format(index, "03") + "_" + self.getLimbName(index) - - def vertexFormatPatterns(self, data): - # position, uv, color/normal - if "VTX" in data: - return ["VTX\s*\(([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*)\)"] - else: - return F3DContext.vertexFormatPatterns(self, data) - - # For game specific instance, override this to be able to identify which verts belong to which bone. - def setCurrentTransform(self, name): - if name[:4].lower() == "0x0d": - self.currentTransformName = self.getLimbName(self.dlList[int(int(name[4:], 16) / MTX_SIZE)].limbIndex) - else: - try: - pointer = hexOrDecInt(name) - except: - self.currentTransformName = name - else: - if pointer >> 24 == 0x01: - self.isBillboard = True - else: - print("Unhandled matrix: " + name) - - def processDLName(self, name): - # Commands loaded to 0x0C are material related only. - try: - pointer = hexOrDecInt(name) - except: - return name - else: - segment = pointer >> 24 - print("POINTER") - if segment >= 0x08 and segment <= 0x0D: - print("SETTING " + str(segment)) - setattr(self.materialContext.ootMaterial.opaque, "segment" + format(segment, "1X"), True) - setattr(self.materialContext.ootMaterial.transparent, "segment" + format(segment, "1X"), True) - return None - return name - - def processTextureName(self, textureName): - try: - pointer = hexOrDecInt(textureName) - except: - return textureName - else: - return textureName - #if (pointer >> 24) == 0x08: - # print("Unhandled OOT pointer: " + textureName) - - def clearMaterial(self): - self.isBillboard = False - clearOOTMaterialDrawLayerProperty(self.materialContext.ootMaterial.opaque) - clearOOTMaterialDrawLayerProperty(self.materialContext.ootMaterial.transparent) - F3DContext.clearMaterial(self) - - def postMaterialChanged(self): - clearOOTMaterialDrawLayerProperty(self.materialContext.ootMaterial.opaque) - clearOOTMaterialDrawLayerProperty(self.materialContext.ootMaterial.transparent) + def __init__(self, f3d, limbList, basePath): + self.limbList = limbList + self.dlList = [] # in the order they are rendered + self.isBillboard = False + materialContext = createF3DMat(None, preset="oot_shaded_solid") + # materialContext.f3d_mat.rdp_settings.g_mdsft_cycletype = "G_CYC_1CYCLE" + F3DContext.__init__(self, f3d, basePath, materialContext) + + def getLimbName(self, index): + return self.limbList[index] + + def getBoneName(self, index): + return "bone" + format(index, "03") + "_" + self.getLimbName(index) + + def vertexFormatPatterns(self, data): + # position, uv, color/normal + if "VTX" in data: + return [ + "VTX\s*\(([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*)\)" + ] + else: + return F3DContext.vertexFormatPatterns(self, data) + + # For game specific instance, override this to be able to identify which verts belong to which bone. + def setCurrentTransform(self, name): + if name[:4].lower() == "0x0d": + self.currentTransformName = self.getLimbName( + self.dlList[int(int(name[4:], 16) / MTX_SIZE)].limbIndex + ) + else: + try: + pointer = hexOrDecInt(name) + except: + self.currentTransformName = name + else: + if pointer >> 24 == 0x01: + self.isBillboard = True + else: + print("Unhandled matrix: " + name) + + def processDLName(self, name): + # Commands loaded to 0x0C are material related only. + try: + pointer = hexOrDecInt(name) + except: + return name + else: + segment = pointer >> 24 + print("POINTER") + if segment >= 0x08 and segment <= 0x0D: + print("SETTING " + str(segment)) + setattr( + self.materialContext.ootMaterial.opaque, + "segment" + format(segment, "1X"), + True, + ) + setattr( + self.materialContext.ootMaterial.transparent, + "segment" + format(segment, "1X"), + True, + ) + return None + return name + + def processTextureName(self, textureName): + try: + pointer = hexOrDecInt(textureName) + except: + return textureName + else: + return textureName + # if (pointer >> 24) == 0x08: + # print("Unhandled OOT pointer: " + textureName) + + def clearMaterial(self): + self.isBillboard = False + clearOOTMaterialDrawLayerProperty(self.materialContext.ootMaterial.opaque) + clearOOTMaterialDrawLayerProperty(self.materialContext.ootMaterial.transparent) + F3DContext.clearMaterial(self) + + def postMaterialChanged(self): + clearOOTMaterialDrawLayerProperty(self.materialContext.ootMaterial.opaque) + clearOOTMaterialDrawLayerProperty(self.materialContext.ootMaterial.transparent) def clearOOTMaterialDrawLayerProperty(matDrawLayerProp): - for i in range(0x08, 0x0E): - setattr(matDrawLayerProp, "segment" + format(i, 'X'), False) + for i in range(0x08, 0x0E): + setattr(matDrawLayerProp, "segment" + format(i, "X"), False) + class OOTDynamicTransformProperty(bpy.types.PropertyGroup): - billboard : bpy.props.BoolProperty(name = "Billboard") + billboard: bpy.props.BoolProperty(name="Billboard") diff --git a/fast64_internal/oot/oot_operators.py b/fast64_internal/oot/oot_operators.py index 35c132625..beff8749a 100644 --- a/fast64_internal/oot/oot_operators.py +++ b/fast64_internal/oot/oot_operators.py @@ -5,199 +5,224 @@ from ..operators import * from ..panels import OOT_Panel + class OOT_AddWaterBox(AddWaterBox): - bl_idname = 'object.oot_add_water_box' + bl_idname = "object.oot_add_water_box" + + scale: bpy.props.FloatProperty(default=10) + preset: bpy.props.StringProperty(default="oot_shaded_texture_transparent") + matName: bpy.props.StringProperty(default="oot_water_mat") + + def setEmptyType(self, emptyObj): + emptyObj.ootEmptyType = "Water Box" - scale : bpy.props.FloatProperty(default = 10) - preset : bpy.props.StringProperty(default = "oot_shaded_texture_transparent") - matName : bpy.props.StringProperty(default = "oot_water_mat") - - def setEmptyType(self, emptyObj): - emptyObj.ootEmptyType = "Water Box" class OOT_AddDoor(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.oot_add_door' - bl_label = "Add Door" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - scale : bpy.props.FloatProperty(default = 2) - preset : bpy.props.StringProperty(default = "oot_shaded_solid") - matName : bpy.props.StringProperty(default = "unused_mat") - - def execute(self, context): - if context.mode != "OBJECT": - bpy.ops.object.mode_set(mode = "OBJECT") - bpy.ops.object.select_all(action = "DESELECT") - - objScale = (3 * self.scale, 1 * self.scale, 5 * self.scale) - - location = mathutils.Vector(bpy.context.scene.cursor.location) +\ - mathutils.Vector([0,0, 0.5 * objScale[2]]) - - bpy.ops.mesh.primitive_cube_add(align='WORLD', location=location[:], scale = objScale) - cubeObj = context.view_layer.objects.active - cubeObj.ignore_render = True - cubeObj.show_axis = True - cubeObj.name = "Door Collision" - - addMaterialByName(cubeObj, self.matName, self.preset) - - location += mathutils.Vector([0,0, - 0.5 * objScale[2]]) - bpy.ops.object.empty_add(type='CUBE', radius = 1, align='WORLD', location=location[:]) - emptyObj = context.view_layer.objects.active - emptyObj.ootEmptyType = "Transition Actor" - emptyObj.name = "Door Actor" - emptyObj.ootTransitionActorProperty.actor.actorID = "ACTOR_DOOR_SHUTTER" - emptyObj.ootTransitionActorProperty.actor.actorParam = "0x0000" - - parentObject(cubeObj, emptyObj) - - setOrigin(emptyObj, cubeObj) - - return {"FINISHED"} + # set bl_ properties + bl_idname = "object.oot_add_door" + bl_label = "Add Door" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + scale: bpy.props.FloatProperty(default=2) + preset: bpy.props.StringProperty(default="oot_shaded_solid") + matName: bpy.props.StringProperty(default="unused_mat") + + def execute(self, context): + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + bpy.ops.object.select_all(action="DESELECT") + + objScale = (3 * self.scale, 1 * self.scale, 5 * self.scale) + + location = mathutils.Vector( + bpy.context.scene.cursor.location + ) + mathutils.Vector([0, 0, 0.5 * objScale[2]]) + + bpy.ops.mesh.primitive_cube_add( + align="WORLD", location=location[:], scale=objScale + ) + cubeObj = context.view_layer.objects.active + cubeObj.ignore_render = True + cubeObj.show_axis = True + cubeObj.name = "Door Collision" + + addMaterialByName(cubeObj, self.matName, self.preset) + + location += mathutils.Vector([0, 0, -0.5 * objScale[2]]) + bpy.ops.object.empty_add( + type="CUBE", radius=1, align="WORLD", location=location[:] + ) + emptyObj = context.view_layer.objects.active + emptyObj.ootEmptyType = "Transition Actor" + emptyObj.name = "Door Actor" + emptyObj.ootTransitionActorProperty.actor.actorID = "ACTOR_DOOR_SHUTTER" + emptyObj.ootTransitionActorProperty.actor.actorParam = "0x0000" + + parentObject(cubeObj, emptyObj) + + setOrigin(emptyObj, cubeObj) + + return {"FINISHED"} + class OOT_AddScene(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.oot_add_scene' - bl_label = "Add Scene" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - scale : bpy.props.FloatProperty(default = 30) - preset : bpy.props.StringProperty(default = "oot_shaded_solid") - matName : bpy.props.StringProperty(default = "floor_mat") - - def execute(self, context): - if context.mode != "OBJECT": - bpy.ops.object.mode_set(mode = "OBJECT") - bpy.ops.object.select_all(action = "DESELECT") - - location = mathutils.Vector(bpy.context.scene.cursor.location) - bpy.ops.mesh.primitive_plane_add(size=2 * self.scale, enter_editmode=False, align='WORLD', location=location[:]) - planeObj = context.view_layer.objects.active - planeObj.name = "Floor" - addMaterialByName(planeObj, self.matName, self.preset) - - bpy.ops.object.empty_add(type='CONE', radius = 1, align='WORLD', location=location[:]) - entranceObj = context.view_layer.objects.active - entranceObj.ootEmptyType = "Entrance" - entranceObj.name = "Entrance" - entranceObj.ootEntranceProperty.actor.actorParam = "0x0FFF" - parentObject(planeObj, entranceObj) - - location += mathutils.Vector([0,0, 10]) - bpy.ops.object.empty_add(type='SPHERE', radius = 1, align='WORLD', location=location[:]) - roomObj = context.view_layer.objects.active - roomObj.ootEmptyType = "Room" - roomObj.name = "Room" - parentObject(roomObj, planeObj) - - location += mathutils.Vector([0,0, 2]) - bpy.ops.object.empty_add(type='SPHERE', radius = 1, align='WORLD', location=location[:]) - sceneObj = context.view_layer.objects.active - sceneObj.ootEmptyType = "Scene" - sceneObj.name = "Scene" - parentObject(sceneObj, roomObj) - - bpy.context.scene.ootSceneExportObj = sceneObj - - #setOrigin(emptyObj, cubeObj) - - return {"FINISHED"} + # set bl_ properties + bl_idname = "object.oot_add_scene" + bl_label = "Add Scene" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + scale: bpy.props.FloatProperty(default=30) + preset: bpy.props.StringProperty(default="oot_shaded_solid") + matName: bpy.props.StringProperty(default="floor_mat") + + def execute(self, context): + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + bpy.ops.object.select_all(action="DESELECT") + + location = mathutils.Vector(bpy.context.scene.cursor.location) + bpy.ops.mesh.primitive_plane_add( + size=2 * self.scale, + enter_editmode=False, + align="WORLD", + location=location[:], + ) + planeObj = context.view_layer.objects.active + planeObj.name = "Floor" + addMaterialByName(planeObj, self.matName, self.preset) + + bpy.ops.object.empty_add( + type="CONE", radius=1, align="WORLD", location=location[:] + ) + entranceObj = context.view_layer.objects.active + entranceObj.ootEmptyType = "Entrance" + entranceObj.name = "Entrance" + entranceObj.ootEntranceProperty.actor.actorParam = "0x0FFF" + parentObject(planeObj, entranceObj) + + location += mathutils.Vector([0, 0, 10]) + bpy.ops.object.empty_add( + type="SPHERE", radius=1, align="WORLD", location=location[:] + ) + roomObj = context.view_layer.objects.active + roomObj.ootEmptyType = "Room" + roomObj.name = "Room" + parentObject(roomObj, planeObj) + + location += mathutils.Vector([0, 0, 2]) + bpy.ops.object.empty_add( + type="SPHERE", radius=1, align="WORLD", location=location[:] + ) + sceneObj = context.view_layer.objects.active + sceneObj.ootEmptyType = "Scene" + sceneObj.name = "Scene" + parentObject(sceneObj, roomObj) + + bpy.context.scene.ootSceneExportObj = sceneObj + + # setOrigin(emptyObj, cubeObj) + + return {"FINISHED"} + class OOT_AddRoom(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.oot_add_room' - bl_label = "Add Room" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - def execute(self, context): - if context.mode != "OBJECT": - bpy.ops.object.mode_set(mode = "OBJECT") - bpy.ops.object.select_all(action = "DESELECT") - - location = mathutils.Vector(bpy.context.scene.cursor.location) - bpy.ops.object.empty_add(type='SPHERE', radius = 1, align='WORLD', location=location[:]) - roomObj = context.view_layer.objects.active - roomObj.ootEmptyType = "Room" - roomObj.name = "Room" - sceneObj = bpy.context.scene.ootSceneExportObj - if sceneObj is not None: - indices = [] - for sceneChild in sceneObj.children: - if sceneChild.ootEmptyType == "Room": - indices.append(sceneChild.ootRoomHeader.roomIndex) - nextIndex = 0 - while nextIndex in indices: - nextIndex += 1 - roomObj.ootRoomHeader.roomIndex = nextIndex - parentObject(sceneObj, roomObj) - - bpy.ops.object.select_all(action = "DESELECT") - roomObj.select_set(True) - context.view_layer.objects.active = roomObj - return {"FINISHED"} + # set bl_ properties + bl_idname = "object.oot_add_room" + bl_label = "Add Room" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + def execute(self, context): + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + bpy.ops.object.select_all(action="DESELECT") + + location = mathutils.Vector(bpy.context.scene.cursor.location) + bpy.ops.object.empty_add( + type="SPHERE", radius=1, align="WORLD", location=location[:] + ) + roomObj = context.view_layer.objects.active + roomObj.ootEmptyType = "Room" + roomObj.name = "Room" + sceneObj = bpy.context.scene.ootSceneExportObj + if sceneObj is not None: + indices = [] + for sceneChild in sceneObj.children: + if sceneChild.ootEmptyType == "Room": + indices.append(sceneChild.ootRoomHeader.roomIndex) + nextIndex = 0 + while nextIndex in indices: + nextIndex += 1 + roomObj.ootRoomHeader.roomIndex = nextIndex + parentObject(sceneObj, roomObj) + + bpy.ops.object.select_all(action="DESELECT") + roomObj.select_set(True) + context.view_layer.objects.active = roomObj + return {"FINISHED"} + class OOT_AddCutscene(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.oot_add_cutscene' - bl_label = "Add Cutscene" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - def execute(self, context): - if context.mode != "OBJECT": - bpy.ops.object.mode_set(mode = "OBJECT") - bpy.ops.object.select_all(action = "DESELECT") - - bpy.ops.object.empty_add(type='ARROWS', radius = 1, align='WORLD') - csObj = context.view_layer.objects.active - csObj.ootEmptyType = "Cutscene" - csObj.name = "Cutscene.Something" - - bpy.ops.object.select_all(action = "DESELECT") - csObj.select_set(True) - context.view_layer.objects.active = csObj - return {"FINISHED"} - + # set bl_ properties + bl_idname = "object.oot_add_cutscene" + bl_label = "Add Cutscene" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + def execute(self, context): + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + bpy.ops.object.select_all(action="DESELECT") + + bpy.ops.object.empty_add(type="ARROWS", radius=1, align="WORLD") + csObj = context.view_layer.objects.active + csObj.ootEmptyType = "Cutscene" + csObj.name = "Cutscene.Something" + + bpy.ops.object.select_all(action="DESELECT") + csObj.select_set(True) + context.view_layer.objects.active = csObj + return {"FINISHED"} + class OOT_OperatorsPanel(OOT_Panel): - bl_idname = "OOT_PT_operators" - bl_label = "OOT Tools" - - # called every frame - def draw(self, context): - col = self.layout.column() - col.operator(OOT_AddScene.bl_idname) - col.operator(OOT_AddRoom.bl_idname) - col.operator(OOT_AddWaterBox.bl_idname) - col.operator(OOT_AddDoor.bl_idname) - col.operator(OOT_AddCutscene.bl_idname) + bl_idname = "OOT_PT_operators" + bl_label = "OOT Tools" + + # called every frame + def draw(self, context): + col = self.layout.column() + col.operator(OOT_AddScene.bl_idname) + col.operator(OOT_AddRoom.bl_idname) + col.operator(OOT_AddWaterBox.bl_idname) + col.operator(OOT_AddDoor.bl_idname) + col.operator(OOT_AddCutscene.bl_idname) + oot_operator_classes = ( - OOT_AddWaterBox, - OOT_AddDoor, - OOT_AddScene, - OOT_AddRoom, - OOT_AddCutscene, + OOT_AddWaterBox, + OOT_AddDoor, + OOT_AddScene, + OOT_AddRoom, + OOT_AddCutscene, ) -oot_operator_panel_classes = ( - OOT_OperatorsPanel, -) +oot_operator_panel_classes = (OOT_OperatorsPanel,) + def oot_operator_panel_register(): - for cls in oot_operator_panel_classes: - register_class(cls) + for cls in oot_operator_panel_classes: + register_class(cls) + def oot_operator_panel_unregister(): - for cls in oot_operator_panel_classes: - unregister_class(cls) + for cls in oot_operator_panel_classes: + unregister_class(cls) + def oot_operator_register(): - for cls in oot_operator_classes: - register_class(cls) - + for cls in oot_operator_classes: + register_class(cls) + def oot_operator_unregister(): - for cls in reversed(oot_operator_classes): - unregister_class(cls) + for cls in reversed(oot_operator_classes): + unregister_class(cls) diff --git a/fast64_internal/oot/oot_parse.py b/fast64_internal/oot/oot_parse.py index 20b955cd2..9cf4581c2 100644 --- a/fast64_internal/oot/oot_parse.py +++ b/fast64_internal/oot/oot_parse.py @@ -1,59 +1,72 @@ import re from ..utility import * + class BlenderEnumItem: - def __init__(self, key, name, description): - self.key = key - self.name = name - self.description = description - - def toC(self): - return '\t("' + self.key + '", "' + self.name + '", "' + self.description + '"),\n' + def __init__(self, key, name, description): + self.key = key + self.name = name + self.description = description + + def toC(self): + return ( + '\t("' + self.key + '", "' + self.name + '", "' + self.description + '"),\n' + ) + def createEnum(enumName, enumList): - enumData = enumName + ' = [\n' - for item in enumList: - enumData += item.toC() - enumData += ']' - return enumData + enumData = enumName + " = [\n" + for item in enumList: + enumData += item.toC() + enumData += "]" + return enumData + def parseEnumFile(data, enumName, enumPrefix, ignoreList, includeCustom): - if includeCustom: - enumList = [BlenderEnumItem("Custom", "Custom", "Custom")] - else: - enumList = [] - - checkResult = re.search('typedef enum \{([^\}]*)\} ' + enumName, data, re.DOTALL) - if checkResult is None: - raise ValueError("Cannot find enum by name: " + str(enumName)) - enumData = checkResult.group(1) - - for matchResult in re.finditer(enumPrefix + '\_(.*),*', enumData): - oldName = matchResult.group(1) - if oldName[:5] == "UNSET" or oldName in ignoreList: - continue - spacedName = oldName.replace("_", " ") - words = spacedName.split(" ") - capitalizedWords = [word.capitalize() for word in words] - newName = " ".join(capitalizedWords) - enumList.append(BlenderEnumItem(enumPrefix + "_" + oldName, newName, newName)) - - return enumList + if includeCustom: + enumList = [BlenderEnumItem("Custom", "Custom", "Custom")] + else: + enumList = [] + + checkResult = re.search("typedef enum \{([^\}]*)\} " + enumName, data, re.DOTALL) + if checkResult is None: + raise ValueError("Cannot find enum by name: " + str(enumName)) + enumData = checkResult.group(1) + + for matchResult in re.finditer(enumPrefix + "\_(.*),*", enumData): + oldName = matchResult.group(1) + if oldName[:5] == "UNSET" or oldName in ignoreList: + continue + spacedName = oldName.replace("_", " ") + words = spacedName.split(" ") + capitalizedWords = [word.capitalize() for word in words] + newName = " ".join(capitalizedWords) + enumList.append(BlenderEnumItem(enumPrefix + "_" + oldName, newName, newName)) + + return enumList + def parseObjectID(): - data = readFile("z64object.h") - enumList = parseEnumFile(data, "ObjectID", "OBJECT", [ - 'GAMEPLAY_KEEP', - 'GAMEPLAY_DANGEON_KEEP', - 'GAMEPLAY_FIELD_KEEP', - 'LINK_BOY', - 'LINK_CHILD', - ], True) - pythonEnum = createEnum('ootEnumObjectID', enumList) - writeFile("oot_obj_enum.py", pythonEnum) + data = readFile("z64object.h") + enumList = parseEnumFile( + data, + "ObjectID", + "OBJECT", + [ + "GAMEPLAY_KEEP", + "GAMEPLAY_DANGEON_KEEP", + "GAMEPLAY_FIELD_KEEP", + "LINK_BOY", + "LINK_CHILD", + ], + True, + ) + pythonEnum = createEnum("ootEnumObjectID", enumList) + writeFile("oot_obj_enum.py", pythonEnum) + def parseSceneID(): - data = readFile("z64scene.h") - enumList = parseEnumFile(data, "SceneID", "SCENE", [], True) - pythonEnum = createEnum('ootEnumSceneID', enumList) - writeFile("oot_scene_enum.py", pythonEnum) + data = readFile("z64scene.h") + enumList = parseEnumFile(data, "SceneID", "SCENE", [], True) + pythonEnum = createEnum("ootEnumSceneID", enumList) + writeFile("oot_scene_enum.py", pythonEnum) diff --git a/fast64_internal/oot/oot_scene_room.py b/fast64_internal/oot/oot_scene_room.py index e5a82c0e6..d16f91947 100644 --- a/fast64_internal/oot/oot_scene_room.py +++ b/fast64_internal/oot/oot_scene_room.py @@ -8,620 +8,844 @@ from ..f3d.f3d_gbi import * from .oot_actor import * -#from .oot_collision import * + +# from .oot_collision import * from .oot_cutscene import * + class OOTSceneProperties(bpy.types.PropertyGroup): - write_dummy_room_list: bpy.props.BoolProperty( - name = "Dummy Room List", - default = False, - description = ( - "When exporting the scene to C, use NULL for the pointers to room " - "start/end offsets, instead of the appropriate symbols" - ), - ) + write_dummy_room_list: bpy.props.BoolProperty( + name="Dummy Room List", + default=False, + description=( + "When exporting the scene to C, use NULL for the pointers to room " + "start/end offsets, instead of the appropriate symbols" + ), + ) + class OOT_SearchMusicSeqEnumOperator(bpy.types.Operator): - bl_idname = "object.oot_search_music_seq_enum_operator" - bl_label = "Search Music Sequence" - bl_property = "ootMusicSeq" - bl_options = {'REGISTER', 'UNDO'} - - ootMusicSeq : bpy.props.EnumProperty(items = ootEnumMusicSeq, default = "0x02") - headerIndex : bpy.props.IntProperty(default = 0, min = 0) - objName : bpy.props.StringProperty() - - def execute(self, context): - obj = bpy.data.objects[self.objName] - if self.headerIndex == 0: - sceneHeader = obj.ootSceneHeader - elif self.headerIndex == 1: - sceneHeader = obj.ootAlternateSceneHeaders.childNightHeader - elif self.headerIndex == 2: - sceneHeader = obj.ootAlternateSceneHeaders.adultDayHeader - elif self.headerIndex == 3: - sceneHeader = obj.ootAlternateSceneHeaders.adultNightHeader - else: - sceneHeader = obj.ootAlternateSceneHeaders.cutsceneHeaders[self.headerIndex - 4] - - sceneHeader.musicSeq = self.ootMusicSeq - bpy.context.region.tag_redraw() - self.report({'INFO'}, "Selected: " + self.ootMusicSeq) - return {'FINISHED'} - - def invoke(self, context, event): - context.window_manager.invoke_search_popup(self) - return {'RUNNING_MODAL'} + bl_idname = "object.oot_search_music_seq_enum_operator" + bl_label = "Search Music Sequence" + bl_property = "ootMusicSeq" + bl_options = {"REGISTER", "UNDO"} + + ootMusicSeq: bpy.props.EnumProperty(items=ootEnumMusicSeq, default="0x02") + headerIndex: bpy.props.IntProperty(default=0, min=0) + objName: bpy.props.StringProperty() + + def execute(self, context): + obj = bpy.data.objects[self.objName] + if self.headerIndex == 0: + sceneHeader = obj.ootSceneHeader + elif self.headerIndex == 1: + sceneHeader = obj.ootAlternateSceneHeaders.childNightHeader + elif self.headerIndex == 2: + sceneHeader = obj.ootAlternateSceneHeaders.adultDayHeader + elif self.headerIndex == 3: + sceneHeader = obj.ootAlternateSceneHeaders.adultNightHeader + else: + sceneHeader = obj.ootAlternateSceneHeaders.cutsceneHeaders[ + self.headerIndex - 4 + ] + + sceneHeader.musicSeq = self.ootMusicSeq + bpy.context.region.tag_redraw() + self.report({"INFO"}, "Selected: " + self.ootMusicSeq) + return {"FINISHED"} + + def invoke(self, context, event): + context.window_manager.invoke_search_popup(self) + return {"RUNNING_MODAL"} + class OOT_SearchObjectEnumOperator(bpy.types.Operator): - bl_idname = "object.oot_search_object_enum_operator" - bl_label = "Search Object ID" - bl_property = "ootObjectID" - bl_options = {'REGISTER', 'UNDO'} - - ootObjectID : bpy.props.EnumProperty(items = ootEnumObjectID, default = "OBJECT_HUMAN") - headerIndex : bpy.props.IntProperty(default = 0, min = 0) - index : bpy.props.IntProperty(default = 0, min = 0) - objName : bpy.props.StringProperty() - - def execute(self, context): - obj = bpy.data.objects[self.objName] - if self.headerIndex == 0: - roomHeader = obj.ootRoomHeader - elif self.headerIndex == 1: - roomHeader = obj.ootAlternateRoomHeaders.childNightHeader - elif self.headerIndex == 2: - roomHeader = obj.ootAlternateRoomHeaders.adultDayHeader - elif self.headerIndex == 3: - roomHeader = obj.ootAlternateRoomHeaders.adultNightHeader - else: - roomHeader = obj.ootAlternateRoomHeaders.cutsceneHeaders[self.headerIndex - 4] - - roomHeader.objectList[self.index].objectID = self.ootObjectID - bpy.context.region.tag_redraw() - self.report({'INFO'}, "Selected: " + self.ootObjectID) - return {'FINISHED'} - - def invoke(self, context, event): - context.window_manager.invoke_search_popup(self) - return {'RUNNING_MODAL'} + bl_idname = "object.oot_search_object_enum_operator" + bl_label = "Search Object ID" + bl_property = "ootObjectID" + bl_options = {"REGISTER", "UNDO"} + + ootObjectID: bpy.props.EnumProperty(items=ootEnumObjectID, default="OBJECT_HUMAN") + headerIndex: bpy.props.IntProperty(default=0, min=0) + index: bpy.props.IntProperty(default=0, min=0) + objName: bpy.props.StringProperty() + + def execute(self, context): + obj = bpy.data.objects[self.objName] + if self.headerIndex == 0: + roomHeader = obj.ootRoomHeader + elif self.headerIndex == 1: + roomHeader = obj.ootAlternateRoomHeaders.childNightHeader + elif self.headerIndex == 2: + roomHeader = obj.ootAlternateRoomHeaders.adultDayHeader + elif self.headerIndex == 3: + roomHeader = obj.ootAlternateRoomHeaders.adultNightHeader + else: + roomHeader = obj.ootAlternateRoomHeaders.cutsceneHeaders[ + self.headerIndex - 4 + ] + + roomHeader.objectList[self.index].objectID = self.ootObjectID + bpy.context.region.tag_redraw() + self.report({"INFO"}, "Selected: " + self.ootObjectID) + return {"FINISHED"} + + def invoke(self, context, event): + context.window_manager.invoke_search_popup(self) + return {"RUNNING_MODAL"} + class OOT_SearchSceneEnumOperator(bpy.types.Operator): - bl_idname = "object.oot_search_scene_enum_operator" - bl_label = "Choose Scene" - bl_property = "ootSceneID" - bl_options = {'REGISTER', 'UNDO'} - - ootSceneID : bpy.props.EnumProperty(items = ootEnumSceneID, default = "SCENE_YDAN") - headerIndex : bpy.props.IntProperty(default = -1, min = -1) - index : bpy.props.IntProperty(default = 0, min = 0) - objName : bpy.props.StringProperty() - - def execute(self, context): - if self.objName != "": - obj = bpy.data.objects[self.objName] - else: - obj = None - - if self.headerIndex == -1: - pass - elif self.headerIndex == 0: - sceneHeader = obj.ootSceneHeader - elif self.headerIndex == 1: - sceneHeader = obj.ootAlternateSceneHeaders.childNightHeader - elif self.headerIndex == 2: - sceneHeader = obj.ootAlternateSceneHeaders.adultDayHeader - elif self.headerIndex == 3: - sceneHeader = obj.ootAlternateSceneHeaders.adultNightHeader - else: - sceneHeader = obj.ootAlternateSceneHeaders.cutsceneHeaders[self.headerIndex - 4] - - if self.headerIndex == -1: - context.scene.ootSceneOption = self.ootSceneID - else: - sceneHeader.exitList[self.index].sceneID = self.sceneID - bpy.context.region.tag_redraw() - self.report({'INFO'}, "Selected: " + self.ootSceneID) - return {'FINISHED'} - - def invoke(self, context, event): - context.window_manager.invoke_search_popup(self) - return {'RUNNING_MODAL'} + bl_idname = "object.oot_search_scene_enum_operator" + bl_label = "Choose Scene" + bl_property = "ootSceneID" + bl_options = {"REGISTER", "UNDO"} + + ootSceneID: bpy.props.EnumProperty(items=ootEnumSceneID, default="SCENE_YDAN") + headerIndex: bpy.props.IntProperty(default=-1, min=-1) + index: bpy.props.IntProperty(default=0, min=0) + objName: bpy.props.StringProperty() + + def execute(self, context): + if self.objName != "": + obj = bpy.data.objects[self.objName] + else: + obj = None + + if self.headerIndex == -1: + pass + elif self.headerIndex == 0: + sceneHeader = obj.ootSceneHeader + elif self.headerIndex == 1: + sceneHeader = obj.ootAlternateSceneHeaders.childNightHeader + elif self.headerIndex == 2: + sceneHeader = obj.ootAlternateSceneHeaders.adultDayHeader + elif self.headerIndex == 3: + sceneHeader = obj.ootAlternateSceneHeaders.adultNightHeader + else: + sceneHeader = obj.ootAlternateSceneHeaders.cutsceneHeaders[ + self.headerIndex - 4 + ] + + if self.headerIndex == -1: + context.scene.ootSceneOption = self.ootSceneID + else: + sceneHeader.exitList[self.index].sceneID = self.sceneID + bpy.context.region.tag_redraw() + self.report({"INFO"}, "Selected: " + self.ootSceneID) + return {"FINISHED"} + + def invoke(self, context, event): + context.window_manager.invoke_search_popup(self) + return {"RUNNING_MODAL"} + def drawAlternateRoomHeaderProperty(layout, headerProp, objName): - headerSetup = layout.column() - #headerSetup.box().label(text = "Alternate Headers") - headerSetupBox = headerSetup.column() - - headerSetupBox.row().prop(headerProp, "headerMenuTab", expand = True) - if headerProp.headerMenuTab == "Child Night": - drawRoomHeaderProperty(headerSetupBox, headerProp.childNightHeader, None, 1, objName) - elif headerProp.headerMenuTab == "Adult Day": - drawRoomHeaderProperty(headerSetupBox, headerProp.adultDayHeader, None, 2, objName) - elif headerProp.headerMenuTab == "Adult Night": - drawRoomHeaderProperty(headerSetupBox, headerProp.adultNightHeader, None, 3, objName) - elif headerProp.headerMenuTab == "Cutscene": - prop_split(headerSetup, headerProp, 'currentCutsceneIndex', "Cutscene Index") - drawAddButton(headerSetup, len(headerProp.cutsceneHeaders), "Room", None, objName) - index = headerProp.currentCutsceneIndex - if index - 4 < len(headerProp.cutsceneHeaders): - drawRoomHeaderProperty(headerSetup, headerProp.cutsceneHeaders[index - 4], None, index, objName) - else: - headerSetup.label(text = "No cutscene header for this index.", icon = 'QUESTION') + headerSetup = layout.column() + # headerSetup.box().label(text = "Alternate Headers") + headerSetupBox = headerSetup.column() + + headerSetupBox.row().prop(headerProp, "headerMenuTab", expand=True) + if headerProp.headerMenuTab == "Child Night": + drawRoomHeaderProperty( + headerSetupBox, headerProp.childNightHeader, None, 1, objName + ) + elif headerProp.headerMenuTab == "Adult Day": + drawRoomHeaderProperty( + headerSetupBox, headerProp.adultDayHeader, None, 2, objName + ) + elif headerProp.headerMenuTab == "Adult Night": + drawRoomHeaderProperty( + headerSetupBox, headerProp.adultNightHeader, None, 3, objName + ) + elif headerProp.headerMenuTab == "Cutscene": + prop_split(headerSetup, headerProp, "currentCutsceneIndex", "Cutscene Index") + drawAddButton( + headerSetup, len(headerProp.cutsceneHeaders), "Room", None, objName + ) + index = headerProp.currentCutsceneIndex + if index - 4 < len(headerProp.cutsceneHeaders): + drawRoomHeaderProperty( + headerSetup, headerProp.cutsceneHeaders[index - 4], None, index, objName + ) + else: + headerSetup.label( + text="No cutscene header for this index.", icon="QUESTION" + ) + class OOTExitProperty(bpy.types.PropertyGroup): - expandTab : bpy.props.BoolProperty(name = "Expand Tab") + expandTab: bpy.props.BoolProperty(name="Expand Tab") + + exitIndex: bpy.props.EnumProperty(items=ootEnumExitIndex, default="Default") + exitIndexCustom: bpy.props.StringProperty(default="0x0000") - exitIndex : bpy.props.EnumProperty(items = ootEnumExitIndex, default = "Default") - exitIndexCustom : bpy.props.StringProperty(default = '0x0000') + # These are used when adding an entry to gEntranceTable + scene: bpy.props.EnumProperty(items=ootEnumSceneID, default="SCENE_YDAN") + sceneCustom: bpy.props.StringProperty(default="SCENE_YDAN") - # These are used when adding an entry to gEntranceTable - scene : bpy.props.EnumProperty(items = ootEnumSceneID, default = "SCENE_YDAN") - sceneCustom : bpy.props.StringProperty(default = "SCENE_YDAN") + # These are used when adding an entry to gEntranceTable + continueBGM: bpy.props.BoolProperty(default=False) + displayTitleCard: bpy.props.BoolProperty(default=True) + fadeInAnim: bpy.props.EnumProperty(items=ootEnumTransitionAnims, default="0x02") + fadeInAnimCustom: bpy.props.StringProperty(default="0x02") + fadeOutAnim: bpy.props.EnumProperty(items=ootEnumTransitionAnims, default="0x02") + fadeOutAnimCustom: bpy.props.StringProperty(default="0x02") - # These are used when adding an entry to gEntranceTable - continueBGM : bpy.props.BoolProperty(default = False) - displayTitleCard : bpy.props.BoolProperty(default = True) - fadeInAnim : bpy.props.EnumProperty(items = ootEnumTransitionAnims, default = '0x02') - fadeInAnimCustom : bpy.props.StringProperty(default = '0x02') - fadeOutAnim : bpy.props.EnumProperty(items = ootEnumTransitionAnims, default = '0x02') - fadeOutAnimCustom : bpy.props.StringProperty(default = '0x02') def drawExitProperty(layout, exitProp, index, headerIndex, objName): - box = layout.box() - box.prop(exitProp, 'expandTab', text = 'Exit ' + \ - str(index + 1), icon = 'TRIA_DOWN' if exitProp.expandTab else \ - 'TRIA_RIGHT') - if exitProp.expandTab: - drawCollectionOps(box, index, "Exit", headerIndex, objName) - drawEnumWithCustom(box, exitProp, "exitIndex", "Exit Index", "") - if exitProp.exitIndex != "Custom": - box.label(text = "This is unfinished, use \"Custom\".") - exitGroup = box.column() - exitGroup.enabled = False - drawEnumWithCustom(exitGroup, exitProp, "scene", "Scene", "") - exitGroup.prop(exitProp, "continueBGM", text = "Continue BGM") - exitGroup.prop(exitProp, "displayTitleCard", text = "Display Title Card") - drawEnumWithCustom(exitGroup, exitProp, "fadeInAnim", "Fade In Animation", "") - drawEnumWithCustom(exitGroup, exitProp, "fadeOutAnim", "Fade Out Animation", "") + box = layout.box() + box.prop( + exitProp, + "expandTab", + text="Exit " + str(index + 1), + icon="TRIA_DOWN" if exitProp.expandTab else "TRIA_RIGHT", + ) + if exitProp.expandTab: + drawCollectionOps(box, index, "Exit", headerIndex, objName) + drawEnumWithCustom(box, exitProp, "exitIndex", "Exit Index", "") + if exitProp.exitIndex != "Custom": + box.label(text='This is unfinished, use "Custom".') + exitGroup = box.column() + exitGroup.enabled = False + drawEnumWithCustom(exitGroup, exitProp, "scene", "Scene", "") + exitGroup.prop(exitProp, "continueBGM", text="Continue BGM") + exitGroup.prop(exitProp, "displayTitleCard", text="Display Title Card") + drawEnumWithCustom( + exitGroup, exitProp, "fadeInAnim", "Fade In Animation", "" + ) + drawEnumWithCustom( + exitGroup, exitProp, "fadeOutAnim", "Fade Out Animation", "" + ) class OOTObjectProperty(bpy.types.PropertyGroup): - expandTab : bpy.props.BoolProperty(name = "Expand Tab") - objectID : bpy.props.EnumProperty(items = ootEnumObjectID, default = 'OBJECT_HUMAN') - objectIDCustom : bpy.props.StringProperty(default = 'OBJECT_HUMAN') + expandTab: bpy.props.BoolProperty(name="Expand Tab") + objectID: bpy.props.EnumProperty(items=ootEnumObjectID, default="OBJECT_HUMAN") + objectIDCustom: bpy.props.StringProperty(default="OBJECT_HUMAN") + def drawObjectProperty(layout, objectProp, headerIndex, index, objName): - objItemBox = layout.box() - objectName = getEnumName(ootEnumObjectID, objectProp.objectID) - objItemBox.prop(objectProp, 'expandTab', text = objectName, - icon = 'TRIA_DOWN' if objectProp.expandTab else \ - 'TRIA_RIGHT') - if objectProp.expandTab: - drawCollectionOps(objItemBox, index, "Object", headerIndex, objName) - - objSearch = objItemBox.operator(OOT_SearchObjectEnumOperator.bl_idname, icon = 'VIEWZOOM') - objSearch.objName = objName - objItemBox.column().label(text = "ID: " + objectName) - #prop_split(objItemBox, objectProp, "objectID", name = "ID") - if objectProp.objectID == "Custom": - prop_split(objItemBox, objectProp, "objectIDCustom", "Object ID Custom") - objSearch.headerIndex = headerIndex if headerIndex is not None else 0 - objSearch.index = index + objItemBox = layout.box() + objectName = getEnumName(ootEnumObjectID, objectProp.objectID) + objItemBox.prop( + objectProp, + "expandTab", + text=objectName, + icon="TRIA_DOWN" if objectProp.expandTab else "TRIA_RIGHT", + ) + if objectProp.expandTab: + drawCollectionOps(objItemBox, index, "Object", headerIndex, objName) + + objSearch = objItemBox.operator( + OOT_SearchObjectEnumOperator.bl_idname, icon="VIEWZOOM" + ) + objSearch.objName = objName + objItemBox.column().label(text="ID: " + objectName) + # prop_split(objItemBox, objectProp, "objectID", name = "ID") + if objectProp.objectID == "Custom": + prop_split(objItemBox, objectProp, "objectIDCustom", "Object ID Custom") + objSearch.headerIndex = headerIndex if headerIndex is not None else 0 + objSearch.index = index + class OOTLightProperty(bpy.types.PropertyGroup): - ambient : bpy.props.FloatVectorProperty(name = "Ambient Color", size = 4, min = 0, max = 1, default = (70/255, 40/255, 57/255 ,1), subtype = 'COLOR') - useCustomDiffuse0 : bpy.props.BoolProperty(name = 'Use Custom Diffuse 0 Light Object') - useCustomDiffuse1 : bpy.props.BoolProperty(name = 'Use Custom Diffuse 1 Light Object') - diffuse0 : bpy.props.FloatVectorProperty(name = "", size = 4, min = 0, max = 1, default = (180/255, 154/255, 138/255 ,1), subtype = 'COLOR') - diffuse1 : bpy.props.FloatVectorProperty(name = "", size = 4, min = 0, max = 1, default = (20/255, 20/255, 60/255 ,1), subtype = 'COLOR') - diffuse0Custom : bpy.props.PointerProperty(name = "Diffuse 0", type = bpy.types.Light) - diffuse1Custom : bpy.props.PointerProperty(name = "Diffuse 1", type = bpy.types.Light) - fogColor : bpy.props.FloatVectorProperty(name = "", size = 4, min = 0, max = 1, default = (140/255, 120/255, 110/255 ,1), subtype = 'COLOR') - fogNear : bpy.props.IntProperty(name = "", default = 993, min = 0, max = 2**10 - 1) - transitionSpeed : bpy.props.IntProperty(name = "", default = 1, min = 0, max = 63) - fogFar : bpy.props.IntProperty(name = "", default = 0x3200, min = 0, max = 2**16 - 1) - expandTab : bpy.props.BoolProperty(name = "Expand Tab") + ambient: bpy.props.FloatVectorProperty( + name="Ambient Color", + size=4, + min=0, + max=1, + default=(70 / 255, 40 / 255, 57 / 255, 1), + subtype="COLOR", + ) + useCustomDiffuse0: bpy.props.BoolProperty(name="Use Custom Diffuse 0 Light Object") + useCustomDiffuse1: bpy.props.BoolProperty(name="Use Custom Diffuse 1 Light Object") + diffuse0: bpy.props.FloatVectorProperty( + name="", + size=4, + min=0, + max=1, + default=(180 / 255, 154 / 255, 138 / 255, 1), + subtype="COLOR", + ) + diffuse1: bpy.props.FloatVectorProperty( + name="", + size=4, + min=0, + max=1, + default=(20 / 255, 20 / 255, 60 / 255, 1), + subtype="COLOR", + ) + diffuse0Custom: bpy.props.PointerProperty(name="Diffuse 0", type=bpy.types.Light) + diffuse1Custom: bpy.props.PointerProperty(name="Diffuse 1", type=bpy.types.Light) + fogColor: bpy.props.FloatVectorProperty( + name="", + size=4, + min=0, + max=1, + default=(140 / 255, 120 / 255, 110 / 255, 1), + subtype="COLOR", + ) + fogNear: bpy.props.IntProperty(name="", default=993, min=0, max=2 ** 10 - 1) + transitionSpeed: bpy.props.IntProperty(name="", default=1, min=0, max=63) + fogFar: bpy.props.IntProperty(name="", default=0x3200, min=0, max=2 ** 16 - 1) + expandTab: bpy.props.BoolProperty(name="Expand Tab") + class OOTLightGroupProperty(bpy.types.PropertyGroup): - expandTab : bpy.props.BoolProperty() - menuTab : bpy.props.EnumProperty(items = ootEnumLightGroupMenu) - dawn : bpy.props.PointerProperty(type = OOTLightProperty) - day : bpy.props.PointerProperty(type = OOTLightProperty) - dusk : bpy.props.PointerProperty(type = OOTLightProperty) - night : bpy.props.PointerProperty(type = OOTLightProperty) - defaultsSet : bpy.props.BoolProperty() + expandTab: bpy.props.BoolProperty() + menuTab: bpy.props.EnumProperty(items=ootEnumLightGroupMenu) + dawn: bpy.props.PointerProperty(type=OOTLightProperty) + day: bpy.props.PointerProperty(type=OOTLightProperty) + dusk: bpy.props.PointerProperty(type=OOTLightProperty) + night: bpy.props.PointerProperty(type=OOTLightProperty) + defaultsSet: bpy.props.BoolProperty() + def drawLightGroupProperty(layout, lightGroupProp): - box = layout.column() - box.row().prop(lightGroupProp, 'menuTab', expand = True) - if lightGroupProp.menuTab == "Dawn": - drawLightProperty(box, lightGroupProp.dawn, "Dawn", False, None, None, None) - if lightGroupProp.menuTab == "Day": - drawLightProperty(box, lightGroupProp.day, "Day", False, None, None, None) - if lightGroupProp.menuTab == "Dusk": - drawLightProperty(box, lightGroupProp.dusk, "Dusk", False, None, None, None) - if lightGroupProp.menuTab == "Night": - drawLightProperty(box, lightGroupProp.night, "Night", False, None, None, None) - - -def drawLightProperty(layout, lightProp, name, showExpandTab, index, sceneHeaderIndex, objName): - if showExpandTab: - box = layout.box().column() - box.prop(lightProp, 'expandTab', text = name, - icon = 'TRIA_DOWN' if lightProp.expandTab else \ - 'TRIA_RIGHT') - expandTab = lightProp.expandTab - else: - box = layout - expandTab = True - - if expandTab: - if index is not None: - drawCollectionOps(box, index, "Light", sceneHeaderIndex, objName) - prop_split(box, lightProp, 'ambient', 'Ambient Color') - - if lightProp.useCustomDiffuse0: - prop_split(box, lightProp, 'diffuse0Custom', 'Diffuse 0') - box.label(text = "Make sure light is not part of scene hierarchy.", icon = 'FILE_PARENT') - else: - prop_split(box, lightProp, 'diffuse0', 'Diffuse 0') - box.prop(lightProp, "useCustomDiffuse0") - - if lightProp.useCustomDiffuse1: - prop_split(box, lightProp, 'diffuse1Custom', 'Diffuse 1') - box.label(text = "Make sure light is not part of scene hierarchy.", icon = 'FILE_PARENT') - else: - prop_split(box, lightProp, 'diffuse1', 'Diffuse 1') - box.prop(lightProp, "useCustomDiffuse1") - - prop_split(box, lightProp, 'fogColor', 'Fog Color') - prop_split(box, lightProp, 'fogNear', 'Fog Near') - prop_split(box, lightProp, 'fogFar', 'Fog Far') - prop_split(box, lightProp, 'transitionSpeed', 'Transition Speed') + box = layout.column() + box.row().prop(lightGroupProp, "menuTab", expand=True) + if lightGroupProp.menuTab == "Dawn": + drawLightProperty(box, lightGroupProp.dawn, "Dawn", False, None, None, None) + if lightGroupProp.menuTab == "Day": + drawLightProperty(box, lightGroupProp.day, "Day", False, None, None, None) + if lightGroupProp.menuTab == "Dusk": + drawLightProperty(box, lightGroupProp.dusk, "Dusk", False, None, None, None) + if lightGroupProp.menuTab == "Night": + drawLightProperty(box, lightGroupProp.night, "Night", False, None, None, None) + + +def drawLightProperty( + layout, lightProp, name, showExpandTab, index, sceneHeaderIndex, objName +): + if showExpandTab: + box = layout.box().column() + box.prop( + lightProp, + "expandTab", + text=name, + icon="TRIA_DOWN" if lightProp.expandTab else "TRIA_RIGHT", + ) + expandTab = lightProp.expandTab + else: + box = layout + expandTab = True + + if expandTab: + if index is not None: + drawCollectionOps(box, index, "Light", sceneHeaderIndex, objName) + prop_split(box, lightProp, "ambient", "Ambient Color") + + if lightProp.useCustomDiffuse0: + prop_split(box, lightProp, "diffuse0Custom", "Diffuse 0") + box.label( + text="Make sure light is not part of scene hierarchy.", + icon="FILE_PARENT", + ) + else: + prop_split(box, lightProp, "diffuse0", "Diffuse 0") + box.prop(lightProp, "useCustomDiffuse0") + + if lightProp.useCustomDiffuse1: + prop_split(box, lightProp, "diffuse1Custom", "Diffuse 1") + box.label( + text="Make sure light is not part of scene hierarchy.", + icon="FILE_PARENT", + ) + else: + prop_split(box, lightProp, "diffuse1", "Diffuse 1") + box.prop(lightProp, "useCustomDiffuse1") + + prop_split(box, lightProp, "fogColor", "Fog Color") + prop_split(box, lightProp, "fogNear", "Fog Near") + prop_split(box, lightProp, "fogFar", "Fog Far") + prop_split(box, lightProp, "transitionSpeed", "Transition Speed") class OOTSceneTableEntryProperty(bpy.types.PropertyGroup): - drawConfig : bpy.props.IntProperty(name = "Scene Draw Config", min = 0) - hasTitle : bpy.props.BoolProperty(default = True) + drawConfig: bpy.props.IntProperty(name="Scene Draw Config", min=0) + hasTitle: bpy.props.BoolProperty(default=True) -class OOTExtraCutsceneProperty(bpy.types.PropertyGroup): - csObject : bpy.props.PointerProperty(name = "Cutscene Object", type = bpy.types.Object) - -class OOTSceneHeaderProperty(bpy.types.PropertyGroup): - expandTab : bpy.props.BoolProperty(name = "Expand Tab") - usePreviousHeader : bpy.props.BoolProperty(name = "Use Previous Header", default = True) - - globalObject : bpy.props.EnumProperty(name = "Global Object", default = "0x0002", items = ootEnumGlobalObject) - globalObjectCustom : bpy.props.StringProperty(name = "Global Object Custom", default = "0x00") - naviCup : bpy.props.EnumProperty(name = "Navi Hints", default = '0x00', items = ootEnumNaviHints) - naviCupCustom : bpy.props.StringProperty(name = "Navi Hints Custom", default = '0x00') - - skyboxID : bpy.props.EnumProperty(name = "Skybox", items = ootEnumSkybox, default = "0x01") - skyboxIDCustom : bpy.props.StringProperty(name = "Skybox ID", default = '0') - skyboxCloudiness : bpy.props.EnumProperty(name = "Cloudiness", items = ootEnumCloudiness, default = "0x00") - skyboxCloudinessCustom : bpy.props.StringProperty(name = "Cloudiness ID", default = '0x00') - skyboxLighting : bpy.props.EnumProperty(name = "Skybox Lighting", items = ootEnumSkyboxLighting, default = "0x00") - skyboxLightingCustom : bpy.props.StringProperty(name = "Skybox Lighting Custom", default = '0x00') - - mapLocation : bpy.props.EnumProperty(name = "Map Location", items = ootEnumMapLocation, default = "0x00") - mapLocationCustom : bpy.props.StringProperty(name = "Skybox Lighting Custom", default = '0x00') - cameraMode : bpy.props.EnumProperty(name = "Camera Mode", items = ootEnumCameraMode, default = "0x00") - cameraModeCustom : bpy.props.StringProperty(name = "Camera Mode Custom", default = '0x00') - - musicSeq : bpy.props.EnumProperty(name = "Music Sequence", items = ootEnumMusicSeq, default = '0x02') - musicSeqCustom : bpy.props.StringProperty(name = "Music Sequence ID", default = '0x00') - nightSeq : bpy.props.EnumProperty(name = "Nighttime SFX", items = ootEnumNightSeq, default = "0x00") - nightSeqCustom : bpy.props.StringProperty(name = "Nighttime SFX ID", default = '0x00') - audioSessionPreset : bpy.props.EnumProperty(name = "Audio Session Preset", items = ootEnumAudioSessionPreset, default = "0x00") - audioSessionPresetCustom : bpy.props.StringProperty(name = "Audio Session Preset", default = "0x00") - - timeOfDayLights : bpy.props.PointerProperty(type = OOTLightGroupProperty, name = "Time Of Day Lighting") - lightList : bpy.props.CollectionProperty(type = OOTLightProperty, name = 'Lighting List') - exitList : bpy.props.CollectionProperty(type = OOTExitProperty, name = "Exit List") - - writeCutscene : bpy.props.BoolProperty(name = "Write Cutscene") - csWriteType : bpy.props.EnumProperty(name = "Cutscene Data Type", items = ootEnumCSWriteType, default = "Embedded") - csWriteCustom : bpy.props.StringProperty(name = "CS hdr var:", default = "") - csWriteObject : bpy.props.PointerProperty(name = "Cutscene Object", type = bpy.types.Object) - - # These properties are for the deprecated "Embedded" cutscene type. They have - # not been removed as doing so would break any existing scenes made with this - # type of cutscene data. - csEndFrame : bpy.props.IntProperty(name = "End Frame", min = 0, default = 100) - csWriteTerminator : bpy.props.BoolProperty(name = "Write Terminator (Code Execution)") - csTermIdx : bpy.props.IntProperty(name = "Index", min = 0) - csTermStart : bpy.props.IntProperty(name = "Start Frm", min = 0, default = 99) - csTermEnd : bpy.props.IntProperty(name = "End Frm", min = 0, default = 100) - csLists : bpy.props.CollectionProperty(type = OOTCSListProperty, name = 'Cutscene Lists') - - extraCutscenes : bpy.props.CollectionProperty(type = OOTExtraCutsceneProperty, name = "Extra Cutscenes") - - sceneTableEntry : bpy.props.PointerProperty(type = OOTSceneTableEntryProperty) - - menuTab : bpy.props.EnumProperty(name = "Menu", items = ootEnumSceneMenu) - altMenuTab : bpy.props.EnumProperty(name = "Menu", items = ootEnumSceneMenuAlternate) -def drawSceneTableEntryProperty(layout, sceneTableEntryProp): - prop_split(layout, sceneTableEntryProp, "drawConfig", "Draw Config") - -def drawSceneHeaderProperty(layout, sceneProp, dropdownLabel, headerIndex, objName): - if dropdownLabel is not None: - layout.prop(sceneProp, 'expandTab', text = dropdownLabel, - icon = 'TRIA_DOWN' if sceneProp.expandTab else 'TRIA_RIGHT') - if not sceneProp.expandTab: - return - if headerIndex is not None and headerIndex > 3: - drawCollectionOps(layout, headerIndex - 4, "Scene", None, objName) - - if headerIndex is not None and headerIndex > 0 and headerIndex < 4: - layout.prop(sceneProp, "usePreviousHeader", text = "Use Previous Header") - if sceneProp.usePreviousHeader: - return - - if headerIndex is None or headerIndex == 0: - layout.row().prop(sceneProp, "menuTab", expand = True) - menuTab = sceneProp.menuTab - else: - layout.row().prop(sceneProp, "altMenuTab", expand = True) - menuTab = sceneProp.altMenuTab - - if menuTab == 'General': - general = layout.column() - general.box().label(text = "General") - if headerIndex is None or headerIndex == 0: - drawSceneTableEntryProperty(layout, sceneProp.sceneTableEntry) - drawEnumWithCustom(general, sceneProp, 'globalObject', "Global Object", "") - drawEnumWithCustom(general, sceneProp, 'naviCup', "Navi Hints", "") - - skyboxAndSound = layout.column() - skyboxAndSound.box().label(text = "Skybox And Sound") - drawEnumWithCustom(skyboxAndSound, sceneProp, 'skyboxID', "Skybox", "") - drawEnumWithCustom(skyboxAndSound, sceneProp, 'skyboxCloudiness', "Cloudiness", "") - drawEnumWithCustom(skyboxAndSound, sceneProp, 'musicSeq', "Music Sequence", "") - musicSearch = skyboxAndSound.operator(OOT_SearchMusicSeqEnumOperator.bl_idname, icon = 'VIEWZOOM') - musicSearch.objName = objName - musicSearch.headerIndex = headerIndex if headerIndex is not None else 0 - drawEnumWithCustom(skyboxAndSound, sceneProp, 'nightSeq', "Nighttime SFX", "") - drawEnumWithCustom(skyboxAndSound, sceneProp, 'audioSessionPreset', "Audio Session Preset", "") - - cameraAndWorldMap = layout.column() - cameraAndWorldMap.box().label(text = "Camera And World Map") - drawEnumWithCustom(cameraAndWorldMap, sceneProp, 'mapLocation', "Map Location", "") - drawEnumWithCustom(cameraAndWorldMap, sceneProp, 'cameraMode', "Camera Mode", "") - - elif menuTab == 'Lighting': - lighting = layout.column() - lighting.box().label(text = "Lighting List") - drawEnumWithCustom(lighting, sceneProp, 'skyboxLighting', "Lighting Mode", "") - if sceneProp.skyboxLighting == '0x00': # Time of Day - drawLightGroupProperty(lighting, sceneProp.timeOfDayLights) - else: - for i in range(len(sceneProp.lightList)): - drawLightProperty(lighting, sceneProp.lightList[i], "Lighting " + str(i), True, i, headerIndex, objName) - drawAddButton(lighting, len(sceneProp.lightList), "Light", headerIndex, objName) - - elif menuTab == 'Cutscene': - cutscene = layout.column() - r = cutscene.row() - r.prop(sceneProp, "writeCutscene", text = "Write Cutscene") - if sceneProp.writeCutscene: - r.prop(sceneProp, "csWriteType", text = "Data") - if sceneProp.csWriteType == "Custom": - cutscene.prop(sceneProp, "csWriteCustom") - elif sceneProp.csWriteType == "Object": - cutscene.prop(sceneProp, "csWriteObject") - else: - # This is the GUI setup / drawing for the properties for the - # deprecated "Embedded" cutscene type. They have not been removed - # as doing so would break any existing scenes made with this type - # of cutscene data. - cutscene.label(text = "Embedded cutscenes are deprecated. Please use \"Object\" instead.") - cutscene.prop(sceneProp, "csEndFrame", text = "End Frame") - cutscene.prop(sceneProp, "csWriteTerminator", text = "Write Terminator (Code Execution)") - if sceneProp.csWriteTerminator: - r = cutscene.row() - r.prop(sceneProp, "csTermIdx", text = "Index") - r.prop(sceneProp, "csTermStart", text = "Start Frm") - r.prop(sceneProp, "csTermEnd", text = "End Frm") - collectionType = 'CSHdr.' + str(0 if headerIndex is None else headerIndex) - for i, p in enumerate(sceneProp.csLists): - drawCSListProperty(cutscene, p, i, objName, collectionType) - drawCSAddButtons(cutscene, objName, collectionType) - if headerIndex is None or headerIndex == 0: - cutscene.label(text = "Extra cutscenes (not in any header):") - for i in range(len(sceneProp.extraCutscenes)): - box = cutscene.box().column() - drawCollectionOps(box, i, "extraCutscenes", None, objName, True) - box.prop(sceneProp.extraCutscenes[i], "csObject", text = "CS obj") - if len(sceneProp.extraCutscenes) == 0: - drawAddButton(cutscene, 0, "extraCutscenes", 0, objName) - - elif menuTab == 'Exits': - if headerIndex is None or headerIndex == 0: - exitBox = layout.column() - exitBox.box().label(text = "Exit List") - for i in range(len(sceneProp.exitList)): - drawExitProperty(exitBox, sceneProp.exitList[i], i, headerIndex, objName) - - drawAddButton(exitBox, len(sceneProp.exitList), "Exit", headerIndex, objName) - else: - layout.label(text = "Exits are edited in main header.") - -class OOTRoomHeaderProperty(bpy.types.PropertyGroup): - expandTab : bpy.props.BoolProperty(name = "Expand Tab") - menuTab : bpy.props.EnumProperty(items = ootEnumRoomMenu) - altMenuTab : bpy.props.EnumProperty(items = ootEnumRoomMenuAlternate) - usePreviousHeader : bpy.props.BoolProperty(name = "Use Previous Header", default = True) - - roomIndex : bpy.props.IntProperty(name = 'Room Index', default = 0, min = 0) - roomBehaviour : bpy.props.EnumProperty(items = ootEnumRoomBehaviour, default = "0x00") - roomBehaviourCustom : bpy.props.StringProperty(default = "0x00") - disableWarpSongs : bpy.props.BoolProperty(name = "Disable Warp Songs") - showInvisibleActors : bpy.props.BoolProperty(name = "Show Invisible Actors") - linkIdleMode : bpy.props.EnumProperty(name = "Link Idle Mode",items = ootEnumLinkIdle, default = "0x00") - linkIdleModeCustom : bpy.props.StringProperty(name = "Link Idle Mode Custom", default = '0x00') +class OOTExtraCutsceneProperty(bpy.types.PropertyGroup): + csObject: bpy.props.PointerProperty(name="Cutscene Object", type=bpy.types.Object) - useCustomBehaviourX : bpy.props.BoolProperty(name = "Use Custom Behaviour X") - useCustomBehaviourY : bpy.props.BoolProperty(name = "Use Custom Behaviour Y") - customBehaviourX : bpy.props.StringProperty(name = 'Custom Behaviour X', default = '0x00') +class OOTSceneHeaderProperty(bpy.types.PropertyGroup): + expandTab: bpy.props.BoolProperty(name="Expand Tab") + usePreviousHeader: bpy.props.BoolProperty(name="Use Previous Header", default=True) + + globalObject: bpy.props.EnumProperty( + name="Global Object", default="0x0002", items=ootEnumGlobalObject + ) + globalObjectCustom: bpy.props.StringProperty( + name="Global Object Custom", default="0x00" + ) + naviCup: bpy.props.EnumProperty( + name="Navi Hints", default="0x00", items=ootEnumNaviHints + ) + naviCupCustom: bpy.props.StringProperty(name="Navi Hints Custom", default="0x00") + + skyboxID: bpy.props.EnumProperty(name="Skybox", items=ootEnumSkybox, default="0x01") + skyboxIDCustom: bpy.props.StringProperty(name="Skybox ID", default="0") + skyboxCloudiness: bpy.props.EnumProperty( + name="Cloudiness", items=ootEnumCloudiness, default="0x00" + ) + skyboxCloudinessCustom: bpy.props.StringProperty( + name="Cloudiness ID", default="0x00" + ) + skyboxLighting: bpy.props.EnumProperty( + name="Skybox Lighting", items=ootEnumSkyboxLighting, default="0x00" + ) + skyboxLightingCustom: bpy.props.StringProperty( + name="Skybox Lighting Custom", default="0x00" + ) + + mapLocation: bpy.props.EnumProperty( + name="Map Location", items=ootEnumMapLocation, default="0x00" + ) + mapLocationCustom: bpy.props.StringProperty( + name="Skybox Lighting Custom", default="0x00" + ) + cameraMode: bpy.props.EnumProperty( + name="Camera Mode", items=ootEnumCameraMode, default="0x00" + ) + cameraModeCustom: bpy.props.StringProperty( + name="Camera Mode Custom", default="0x00" + ) + + musicSeq: bpy.props.EnumProperty( + name="Music Sequence", items=ootEnumMusicSeq, default="0x02" + ) + musicSeqCustom: bpy.props.StringProperty(name="Music Sequence ID", default="0x00") + nightSeq: bpy.props.EnumProperty( + name="Nighttime SFX", items=ootEnumNightSeq, default="0x00" + ) + nightSeqCustom: bpy.props.StringProperty(name="Nighttime SFX ID", default="0x00") + audioSessionPreset: bpy.props.EnumProperty( + name="Audio Session Preset", items=ootEnumAudioSessionPreset, default="0x00" + ) + audioSessionPresetCustom: bpy.props.StringProperty( + name="Audio Session Preset", default="0x00" + ) + + timeOfDayLights: bpy.props.PointerProperty( + type=OOTLightGroupProperty, name="Time Of Day Lighting" + ) + lightList: bpy.props.CollectionProperty(type=OOTLightProperty, name="Lighting List") + exitList: bpy.props.CollectionProperty(type=OOTExitProperty, name="Exit List") + + writeCutscene: bpy.props.BoolProperty(name="Write Cutscene") + csWriteType: bpy.props.EnumProperty( + name="Cutscene Data Type", items=ootEnumCSWriteType, default="Embedded" + ) + csWriteCustom: bpy.props.StringProperty(name="CS hdr var:", default="") + csWriteObject: bpy.props.PointerProperty( + name="Cutscene Object", type=bpy.types.Object + ) + + # These properties are for the deprecated "Embedded" cutscene type. They have + # not been removed as doing so would break any existing scenes made with this + # type of cutscene data. + csEndFrame: bpy.props.IntProperty(name="End Frame", min=0, default=100) + csWriteTerminator: bpy.props.BoolProperty(name="Write Terminator (Code Execution)") + csTermIdx: bpy.props.IntProperty(name="Index", min=0) + csTermStart: bpy.props.IntProperty(name="Start Frm", min=0, default=99) + csTermEnd: bpy.props.IntProperty(name="End Frm", min=0, default=100) + csLists: bpy.props.CollectionProperty(type=OOTCSListProperty, name="Cutscene Lists") + + extraCutscenes: bpy.props.CollectionProperty( + type=OOTExtraCutsceneProperty, name="Extra Cutscenes" + ) + + sceneTableEntry: bpy.props.PointerProperty(type=OOTSceneTableEntryProperty) + + menuTab: bpy.props.EnumProperty(name="Menu", items=ootEnumSceneMenu) + altMenuTab: bpy.props.EnumProperty(name="Menu", items=ootEnumSceneMenuAlternate) - customBehaviourY : bpy.props.StringProperty(name = 'Custom Behaviour Y', default = '0x00') - setWind : bpy.props.BoolProperty(name = "Set Wind") - windVector : bpy.props.FloatVectorProperty(name = "Wind Vector", size = 3) +def drawSceneTableEntryProperty(layout, sceneTableEntryProp): + prop_split(layout, sceneTableEntryProp, "drawConfig", "Draw Config") - leaveTimeUnchanged : bpy.props.BoolProperty(name = "Leave Time Unchanged", default = True) - timeHours : bpy.props.IntProperty(name = "Hours", default = 0, min = 0, max = 23) #0xFFFE - timeMinutes : bpy.props.IntProperty(name = "Minutes", default = 0, min = 0, max = 59) - timeSpeed : bpy.props.FloatProperty(name = "Time Speed", default = 1, min = -13, max = 13) #0xA - disableSkybox : bpy.props.BoolProperty(name = "Disable Skybox") - disableSunMoon : bpy.props.BoolProperty(name = "Disable Sun/Moon") +def drawSceneHeaderProperty(layout, sceneProp, dropdownLabel, headerIndex, objName): + if dropdownLabel is not None: + layout.prop( + sceneProp, + "expandTab", + text=dropdownLabel, + icon="TRIA_DOWN" if sceneProp.expandTab else "TRIA_RIGHT", + ) + if not sceneProp.expandTab: + return + if headerIndex is not None and headerIndex > 3: + drawCollectionOps(layout, headerIndex - 4, "Scene", None, objName) + + if headerIndex is not None and headerIndex > 0 and headerIndex < 4: + layout.prop(sceneProp, "usePreviousHeader", text="Use Previous Header") + if sceneProp.usePreviousHeader: + return + + if headerIndex is None or headerIndex == 0: + layout.row().prop(sceneProp, "menuTab", expand=True) + menuTab = sceneProp.menuTab + else: + layout.row().prop(sceneProp, "altMenuTab", expand=True) + menuTab = sceneProp.altMenuTab + + if menuTab == "General": + general = layout.column() + general.box().label(text="General") + if headerIndex is None or headerIndex == 0: + drawSceneTableEntryProperty(layout, sceneProp.sceneTableEntry) + drawEnumWithCustom(general, sceneProp, "globalObject", "Global Object", "") + drawEnumWithCustom(general, sceneProp, "naviCup", "Navi Hints", "") + + skyboxAndSound = layout.column() + skyboxAndSound.box().label(text="Skybox And Sound") + drawEnumWithCustom(skyboxAndSound, sceneProp, "skyboxID", "Skybox", "") + drawEnumWithCustom( + skyboxAndSound, sceneProp, "skyboxCloudiness", "Cloudiness", "" + ) + drawEnumWithCustom(skyboxAndSound, sceneProp, "musicSeq", "Music Sequence", "") + musicSearch = skyboxAndSound.operator( + OOT_SearchMusicSeqEnumOperator.bl_idname, icon="VIEWZOOM" + ) + musicSearch.objName = objName + musicSearch.headerIndex = headerIndex if headerIndex is not None else 0 + drawEnumWithCustom(skyboxAndSound, sceneProp, "nightSeq", "Nighttime SFX", "") + drawEnumWithCustom( + skyboxAndSound, sceneProp, "audioSessionPreset", "Audio Session Preset", "" + ) + + cameraAndWorldMap = layout.column() + cameraAndWorldMap.box().label(text="Camera And World Map") + drawEnumWithCustom( + cameraAndWorldMap, sceneProp, "mapLocation", "Map Location", "" + ) + drawEnumWithCustom( + cameraAndWorldMap, sceneProp, "cameraMode", "Camera Mode", "" + ) + + elif menuTab == "Lighting": + lighting = layout.column() + lighting.box().label(text="Lighting List") + drawEnumWithCustom(lighting, sceneProp, "skyboxLighting", "Lighting Mode", "") + if sceneProp.skyboxLighting == "0x00": # Time of Day + drawLightGroupProperty(lighting, sceneProp.timeOfDayLights) + else: + for i in range(len(sceneProp.lightList)): + drawLightProperty( + lighting, + sceneProp.lightList[i], + "Lighting " + str(i), + True, + i, + headerIndex, + objName, + ) + drawAddButton( + lighting, len(sceneProp.lightList), "Light", headerIndex, objName + ) + + elif menuTab == "Cutscene": + cutscene = layout.column() + r = cutscene.row() + r.prop(sceneProp, "writeCutscene", text="Write Cutscene") + if sceneProp.writeCutscene: + r.prop(sceneProp, "csWriteType", text="Data") + if sceneProp.csWriteType == "Custom": + cutscene.prop(sceneProp, "csWriteCustom") + elif sceneProp.csWriteType == "Object": + cutscene.prop(sceneProp, "csWriteObject") + else: + # This is the GUI setup / drawing for the properties for the + # deprecated "Embedded" cutscene type. They have not been removed + # as doing so would break any existing scenes made with this type + # of cutscene data. + cutscene.label( + text='Embedded cutscenes are deprecated. Please use "Object" instead.' + ) + cutscene.prop(sceneProp, "csEndFrame", text="End Frame") + cutscene.prop( + sceneProp, + "csWriteTerminator", + text="Write Terminator (Code Execution)", + ) + if sceneProp.csWriteTerminator: + r = cutscene.row() + r.prop(sceneProp, "csTermIdx", text="Index") + r.prop(sceneProp, "csTermStart", text="Start Frm") + r.prop(sceneProp, "csTermEnd", text="End Frm") + collectionType = "CSHdr." + str( + 0 if headerIndex is None else headerIndex + ) + for i, p in enumerate(sceneProp.csLists): + drawCSListProperty(cutscene, p, i, objName, collectionType) + drawCSAddButtons(cutscene, objName, collectionType) + if headerIndex is None or headerIndex == 0: + cutscene.label(text="Extra cutscenes (not in any header):") + for i in range(len(sceneProp.extraCutscenes)): + box = cutscene.box().column() + drawCollectionOps(box, i, "extraCutscenes", None, objName, True) + box.prop(sceneProp.extraCutscenes[i], "csObject", text="CS obj") + if len(sceneProp.extraCutscenes) == 0: + drawAddButton(cutscene, 0, "extraCutscenes", 0, objName) + + elif menuTab == "Exits": + if headerIndex is None or headerIndex == 0: + exitBox = layout.column() + exitBox.box().label(text="Exit List") + for i in range(len(sceneProp.exitList)): + drawExitProperty( + exitBox, sceneProp.exitList[i], i, headerIndex, objName + ) + + drawAddButton( + exitBox, len(sceneProp.exitList), "Exit", headerIndex, objName + ) + else: + layout.label(text="Exits are edited in main header.") - echo : bpy.props.StringProperty(name = "Echo", default = '0x00') - objectList : bpy.props.CollectionProperty(type = OOTObjectProperty) +class OOTRoomHeaderProperty(bpy.types.PropertyGroup): + expandTab: bpy.props.BoolProperty(name="Expand Tab") + menuTab: bpy.props.EnumProperty(items=ootEnumRoomMenu) + altMenuTab: bpy.props.EnumProperty(items=ootEnumRoomMenuAlternate) + usePreviousHeader: bpy.props.BoolProperty(name="Use Previous Header", default=True) + + roomIndex: bpy.props.IntProperty(name="Room Index", default=0, min=0) + roomBehaviour: bpy.props.EnumProperty(items=ootEnumRoomBehaviour, default="0x00") + roomBehaviourCustom: bpy.props.StringProperty(default="0x00") + disableWarpSongs: bpy.props.BoolProperty(name="Disable Warp Songs") + showInvisibleActors: bpy.props.BoolProperty(name="Show Invisible Actors") + linkIdleMode: bpy.props.EnumProperty( + name="Link Idle Mode", items=ootEnumLinkIdle, default="0x00" + ) + linkIdleModeCustom: bpy.props.StringProperty( + name="Link Idle Mode Custom", default="0x00" + ) + + useCustomBehaviourX: bpy.props.BoolProperty(name="Use Custom Behaviour X") + useCustomBehaviourY: bpy.props.BoolProperty(name="Use Custom Behaviour Y") + + customBehaviourX: bpy.props.StringProperty( + name="Custom Behaviour X", default="0x00" + ) + + customBehaviourY: bpy.props.StringProperty( + name="Custom Behaviour Y", default="0x00" + ) + + setWind: bpy.props.BoolProperty(name="Set Wind") + windVector: bpy.props.FloatVectorProperty(name="Wind Vector", size=3) + + leaveTimeUnchanged: bpy.props.BoolProperty( + name="Leave Time Unchanged", default=True + ) + timeHours: bpy.props.IntProperty(name="Hours", default=0, min=0, max=23) # 0xFFFE + timeMinutes: bpy.props.IntProperty(name="Minutes", default=0, min=0, max=59) + timeSpeed: bpy.props.FloatProperty( + name="Time Speed", default=1, min=-13, max=13 + ) # 0xA + + disableSkybox: bpy.props.BoolProperty(name="Disable Skybox") + disableSunMoon: bpy.props.BoolProperty(name="Disable Sun/Moon") + + echo: bpy.props.StringProperty(name="Echo", default="0x00") + + objectList: bpy.props.CollectionProperty(type=OOTObjectProperty) + + meshType: bpy.props.EnumProperty(items=ootEnumMeshType, default="0") + defaultCullDistance: bpy.props.IntProperty( + name="Default Cull Distance", min=1, default=100 + ) - meshType : bpy.props.EnumProperty(items = ootEnumMeshType, default = '0') - defaultCullDistance : bpy.props.IntProperty(name = "Default Cull Distance", min = 1, default = 100) def drawRoomHeaderProperty(layout, roomProp, dropdownLabel, headerIndex, objName): - if dropdownLabel is not None: - layout.prop(roomProp, 'expandTab', text = dropdownLabel, - icon = 'TRIA_DOWN' if roomProp.expandTab else 'TRIA_RIGHT') - if not roomProp.expandTab: - return - if headerIndex is not None and headerIndex > 3: - drawCollectionOps(layout, headerIndex - 4, "Room", None, objName) - - if headerIndex is not None and headerIndex > 0 and headerIndex < 4: - layout.prop(roomProp, "usePreviousHeader", text = "Use Previous Header") - if roomProp.usePreviousHeader: - return - - if headerIndex is None or headerIndex == 0: - layout.row().prop(roomProp, "menuTab", expand = True) - menuTab = roomProp.menuTab - else: - layout.row().prop(roomProp, "altMenuTab", expand = True) - menuTab = roomProp.altMenuTab - - if menuTab == "General": - if headerIndex is None or headerIndex == 0: - general = layout.column() - general.box().label(text = "General") - prop_split(general, roomProp, 'roomIndex', 'Room Index') - prop_split(general, roomProp, 'meshType', "Mesh Type") - if roomProp.meshType == '1': - general.box().label(text = "Mesh Type 1 not supported at this time.") - if roomProp.meshType == '2': - prop_split(general, roomProp, 'defaultCullDistance', 'Default Cull (Blender Units)') - - # Behaviour - behaviourBox = layout.column() - behaviourBox.box().label(text = 'Behaviour') - drawEnumWithCustom(behaviourBox, roomProp, "roomBehaviour", "Room Behaviour", "") - drawEnumWithCustom(behaviourBox, roomProp, 'linkIdleMode', "Link Idle Mode", "") - behaviourBox.prop(roomProp, "disableWarpSongs", text = "Disable Warp Songs") - behaviourBox.prop(roomProp, "showInvisibleActors", text = "Show Invisible Actors") - - # Time - skyboxAndTime = layout.column() - skyboxAndTime.box().label(text = "Skybox And Time") - - # Skybox - skyboxAndTime.prop(roomProp, "disableSkybox", text = "Disable Skybox") - skyboxAndTime.prop(roomProp, "disableSunMoon", text = "Disable Sun/Moon") - skyboxAndTime.prop(roomProp, "leaveTimeUnchanged", text = "Leave Time Unchanged") - if not roomProp.leaveTimeUnchanged: - skyboxAndTime.label(text = "Time") - timeRow = skyboxAndTime.row() - timeRow.prop(roomProp, 'timeHours', text = 'Hours') - timeRow.prop(roomProp, 'timeMinutes', text = 'Minutes') - #prop_split(skyboxAndTime, roomProp, "timeValue", "Time Of Day") - prop_split(skyboxAndTime, roomProp, "timeSpeed", "Time Speed") - - # Echo - prop_split(skyboxAndTime, roomProp, "echo", "Echo") - - # Wind - windBox = layout.column() - windBox.box().label(text = 'Wind') - windBox.prop(roomProp, "setWind", text = "Set Wind") - if roomProp.setWind: - windBox.row().prop(roomProp, "windVector", text = '') - #prop_split(windBox, roomProp, "windVector", "Wind Vector") - - elif menuTab == "Objects": - objBox = layout.column() - objBox.box().label(text = "Objects") - for i in range(len(roomProp.objectList)): - drawObjectProperty(objBox, roomProp.objectList[i], headerIndex, i, objName) - drawAddButton(objBox, len(roomProp.objectList), "Object", headerIndex, objName) + if dropdownLabel is not None: + layout.prop( + roomProp, + "expandTab", + text=dropdownLabel, + icon="TRIA_DOWN" if roomProp.expandTab else "TRIA_RIGHT", + ) + if not roomProp.expandTab: + return + if headerIndex is not None and headerIndex > 3: + drawCollectionOps(layout, headerIndex - 4, "Room", None, objName) + + if headerIndex is not None and headerIndex > 0 and headerIndex < 4: + layout.prop(roomProp, "usePreviousHeader", text="Use Previous Header") + if roomProp.usePreviousHeader: + return + + if headerIndex is None or headerIndex == 0: + layout.row().prop(roomProp, "menuTab", expand=True) + menuTab = roomProp.menuTab + else: + layout.row().prop(roomProp, "altMenuTab", expand=True) + menuTab = roomProp.altMenuTab + + if menuTab == "General": + if headerIndex is None or headerIndex == 0: + general = layout.column() + general.box().label(text="General") + prop_split(general, roomProp, "roomIndex", "Room Index") + prop_split(general, roomProp, "meshType", "Mesh Type") + if roomProp.meshType == "1": + general.box().label(text="Mesh Type 1 not supported at this time.") + if roomProp.meshType == "2": + prop_split( + general, + roomProp, + "defaultCullDistance", + "Default Cull (Blender Units)", + ) + + # Behaviour + behaviourBox = layout.column() + behaviourBox.box().label(text="Behaviour") + drawEnumWithCustom( + behaviourBox, roomProp, "roomBehaviour", "Room Behaviour", "" + ) + drawEnumWithCustom(behaviourBox, roomProp, "linkIdleMode", "Link Idle Mode", "") + behaviourBox.prop(roomProp, "disableWarpSongs", text="Disable Warp Songs") + behaviourBox.prop(roomProp, "showInvisibleActors", text="Show Invisible Actors") + + # Time + skyboxAndTime = layout.column() + skyboxAndTime.box().label(text="Skybox And Time") + + # Skybox + skyboxAndTime.prop(roomProp, "disableSkybox", text="Disable Skybox") + skyboxAndTime.prop(roomProp, "disableSunMoon", text="Disable Sun/Moon") + skyboxAndTime.prop(roomProp, "leaveTimeUnchanged", text="Leave Time Unchanged") + if not roomProp.leaveTimeUnchanged: + skyboxAndTime.label(text="Time") + timeRow = skyboxAndTime.row() + timeRow.prop(roomProp, "timeHours", text="Hours") + timeRow.prop(roomProp, "timeMinutes", text="Minutes") + # prop_split(skyboxAndTime, roomProp, "timeValue", "Time Of Day") + prop_split(skyboxAndTime, roomProp, "timeSpeed", "Time Speed") + + # Echo + prop_split(skyboxAndTime, roomProp, "echo", "Echo") + + # Wind + windBox = layout.column() + windBox.box().label(text="Wind") + windBox.prop(roomProp, "setWind", text="Set Wind") + if roomProp.setWind: + windBox.row().prop(roomProp, "windVector", text="") + # prop_split(windBox, roomProp, "windVector", "Wind Vector") + + elif menuTab == "Objects": + objBox = layout.column() + objBox.box().label(text="Objects") + for i in range(len(roomProp.objectList)): + drawObjectProperty(objBox, roomProp.objectList[i], headerIndex, i, objName) + drawAddButton(objBox, len(roomProp.objectList), "Object", headerIndex, objName) + class OOTAlternateSceneHeaderProperty(bpy.types.PropertyGroup): - childNightHeader : bpy.props.PointerProperty(name = "Child Night Header", type = OOTSceneHeaderProperty) - adultDayHeader : bpy.props.PointerProperty(name = "Adult Day Header", type = OOTSceneHeaderProperty) - adultNightHeader : bpy.props.PointerProperty(name = "Adult Night Header", type = OOTSceneHeaderProperty) - cutsceneHeaders : bpy.props.CollectionProperty(type = OOTSceneHeaderProperty) + childNightHeader: bpy.props.PointerProperty( + name="Child Night Header", type=OOTSceneHeaderProperty + ) + adultDayHeader: bpy.props.PointerProperty( + name="Adult Day Header", type=OOTSceneHeaderProperty + ) + adultNightHeader: bpy.props.PointerProperty( + name="Adult Night Header", type=OOTSceneHeaderProperty + ) + cutsceneHeaders: bpy.props.CollectionProperty(type=OOTSceneHeaderProperty) + + headerMenuTab: bpy.props.EnumProperty(name="Header Menu", items=ootEnumHeaderMenu) + currentCutsceneIndex: bpy.props.IntProperty(min=4, default=4) - headerMenuTab : bpy.props.EnumProperty(name = "Header Menu", items = ootEnumHeaderMenu) - currentCutsceneIndex : bpy.props.IntProperty(min = 4, default = 4) def drawAlternateSceneHeaderProperty(layout, headerProp, objName): - headerSetup = layout.column() - #headerSetup.box().label(text = "Alternate Headers") - headerSetupBox = headerSetup.column() - - headerSetupBox.row().prop(headerProp, "headerMenuTab", expand = True) - if headerProp.headerMenuTab == "Child Night": - drawSceneHeaderProperty(headerSetupBox, headerProp.childNightHeader, None, 1, objName) - elif headerProp.headerMenuTab == "Adult Day": - drawSceneHeaderProperty(headerSetupBox, headerProp.adultDayHeader, None, 2, objName) - elif headerProp.headerMenuTab == "Adult Night": - drawSceneHeaderProperty(headerSetupBox, headerProp.adultNightHeader, None, 3, objName) - elif headerProp.headerMenuTab == "Cutscene": - prop_split(headerSetup, headerProp, 'currentCutsceneIndex', "Cutscene Index") - drawAddButton(headerSetup, len(headerProp.cutsceneHeaders), "Scene", None, objName) - index = headerProp.currentCutsceneIndex - if index - 4 < len(headerProp.cutsceneHeaders): - drawSceneHeaderProperty(headerSetup, headerProp.cutsceneHeaders[index - 4], None, index, objName) - else: - headerSetup.label(text = "No cutscene header for this index.", icon = 'QUESTION') + headerSetup = layout.column() + # headerSetup.box().label(text = "Alternate Headers") + headerSetupBox = headerSetup.column() + + headerSetupBox.row().prop(headerProp, "headerMenuTab", expand=True) + if headerProp.headerMenuTab == "Child Night": + drawSceneHeaderProperty( + headerSetupBox, headerProp.childNightHeader, None, 1, objName + ) + elif headerProp.headerMenuTab == "Adult Day": + drawSceneHeaderProperty( + headerSetupBox, headerProp.adultDayHeader, None, 2, objName + ) + elif headerProp.headerMenuTab == "Adult Night": + drawSceneHeaderProperty( + headerSetupBox, headerProp.adultNightHeader, None, 3, objName + ) + elif headerProp.headerMenuTab == "Cutscene": + prop_split(headerSetup, headerProp, "currentCutsceneIndex", "Cutscene Index") + drawAddButton( + headerSetup, len(headerProp.cutsceneHeaders), "Scene", None, objName + ) + index = headerProp.currentCutsceneIndex + if index - 4 < len(headerProp.cutsceneHeaders): + drawSceneHeaderProperty( + headerSetup, headerProp.cutsceneHeaders[index - 4], None, index, objName + ) + else: + headerSetup.label( + text="No cutscene header for this index.", icon="QUESTION" + ) + class OOTAlternateRoomHeaderProperty(bpy.types.PropertyGroup): - childNightHeader : bpy.props.PointerProperty(name = "Child Night Header", type = OOTRoomHeaderProperty) - adultDayHeader : bpy.props.PointerProperty(name = "Adult Day Header", type = OOTRoomHeaderProperty) - adultNightHeader : bpy.props.PointerProperty(name = "Adult Night Header", type = OOTRoomHeaderProperty) - cutsceneHeaders : bpy.props.CollectionProperty(type = OOTRoomHeaderProperty) + childNightHeader: bpy.props.PointerProperty( + name="Child Night Header", type=OOTRoomHeaderProperty + ) + adultDayHeader: bpy.props.PointerProperty( + name="Adult Day Header", type=OOTRoomHeaderProperty + ) + adultNightHeader: bpy.props.PointerProperty( + name="Adult Night Header", type=OOTRoomHeaderProperty + ) + cutsceneHeaders: bpy.props.CollectionProperty(type=OOTRoomHeaderProperty) + + headerMenuTab: bpy.props.EnumProperty(name="Header Menu", items=ootEnumHeaderMenu) + currentCutsceneIndex: bpy.props.IntProperty(min=4, default=4) - headerMenuTab : bpy.props.EnumProperty(name = "Header Menu", items = ootEnumHeaderMenu) - currentCutsceneIndex : bpy.props.IntProperty(min = 4, default = 4) def drawParentSceneRoom(box, obj): - sceneObj = getSceneObj(obj) - roomObj = getRoomObj(obj) - - #box = layout.box().column() - box.box().column().label(text = "Parent Scene/Room Settings") - box.row().prop(obj, 'ootObjectMenu', expand = True) - - if obj.ootObjectMenu == "Scene": - if sceneObj is not None: - drawSceneHeaderProperty(box, sceneObj.ootSceneHeader, None, None, sceneObj.name) - if sceneObj.ootSceneHeader.menuTab == 'Alternate': - drawAlternateSceneHeaderProperty(box, sceneObj.ootAlternateSceneHeaders, sceneObj.name) - else: - box.label(text = "This object is not part of any Scene hierarchy.", icon = 'OUTLINER') - - elif obj.ootObjectMenu == "Room": - if roomObj is not None: - drawRoomHeaderProperty(box, roomObj.ootRoomHeader, None, None, roomObj.name) - if roomObj.ootRoomHeader.menuTab == 'Alternate': - drawAlternateRoomHeaderProperty(box, roomObj.ootAlternateRoomHeaders, roomObj.name) - else: - box.label(text = "This object is not part of any Room hierarchy.", icon = 'OUTLINER') + sceneObj = getSceneObj(obj) + roomObj = getRoomObj(obj) + + # box = layout.box().column() + box.box().column().label(text="Parent Scene/Room Settings") + box.row().prop(obj, "ootObjectMenu", expand=True) + + if obj.ootObjectMenu == "Scene": + if sceneObj is not None: + drawSceneHeaderProperty( + box, sceneObj.ootSceneHeader, None, None, sceneObj.name + ) + if sceneObj.ootSceneHeader.menuTab == "Alternate": + drawAlternateSceneHeaderProperty( + box, sceneObj.ootAlternateSceneHeaders, sceneObj.name + ) + else: + box.label( + text="This object is not part of any Scene hierarchy.", icon="OUTLINER" + ) + + elif obj.ootObjectMenu == "Room": + if roomObj is not None: + drawRoomHeaderProperty(box, roomObj.ootRoomHeader, None, None, roomObj.name) + if roomObj.ootRoomHeader.menuTab == "Alternate": + drawAlternateRoomHeaderProperty( + box, roomObj.ootAlternateRoomHeaders, roomObj.name + ) + else: + box.label( + text="This object is not part of any Room hierarchy.", icon="OUTLINER" + ) diff --git a/fast64_internal/oot/oot_skeleton.py b/fast64_internal/oot/oot_skeleton.py index f6279fd80..71e1bb2e3 100644 --- a/fast64_internal/oot/oot_skeleton.py +++ b/fast64_internal/oot/oot_skeleton.py @@ -13,927 +13,1303 @@ from .oot_f3d_writer import * ootEnumBoneType = [ - ("Default", "Default", "Default"), - ("Custom DL", "Custom DL", "Custom DL"), - ("Ignore", "Ignore", "Ignore"), + ("Default", "Default", "Default"), + ("Custom DL", "Custom DL", "Custom DL"), + ("Ignore", "Ignore", "Ignore"), ] -class OOTSkeleton(): - def __init__(self, name): - self.name = name - self.segmentID = None - self.limbRoot = None - self.hasLOD = False - - def createLimbList(self): - if self.limbRoot is None: - return [] - - limbList = [] - self.limbRoot.getList(limbList) - self.limbRoot.setLinks() - return limbList - - def getNumDLs(self): - if self.limbRoot is not None: - return self.limbRoot.getNumDLs() - else: - return 0 - - def getNumLimbs(self): - if self.limbRoot is not None: - return self.limbRoot.getNumLimbs() - else: - return 0 - - def isFlexSkeleton(self): - if self.limbRoot is not None: - return self.limbRoot.isFlexSkeleton() - else: - return False - - def limbsName(self): - return self.name + "Limbs" - - def toC(self): - limbData = CData() - data = CData() - - if self.limbRoot is None: - return data - - limbList = self.createLimbList() - isFlex = self.isFlexSkeleton() - - data.source += "void* " + self.limbsName() + "[" + str(self.getNumLimbs()) + "] = {\n" - for limb in limbList: - limbData.source += limb.toC(self.hasLOD) - data.source += '\t&' + limb.name() + ',\n' - limbData.source += '\n' - data.source += "};\n\n" - - if isFlex: - data.source += "FlexSkeletonHeader " + self.name + " = { " + self.limbsName() + ", " +\ - str(self.getNumLimbs()) + ", " + str(self.getNumDLs()) + " };\n\n" - data.header = "extern FlexSkeletonHeader " + self.name + ";\n" - else: - data.source += "SkeletonHeader " + self.name + " = { " + self.limbsName() + ", " +\ - str(self.getNumLimbs()) + " };\n\n" - data.header = "extern SkeletonHeader " + self.name + ";\n" - - for limb in limbList: - name = (self.name + "_" + toAlnum(limb.boneName)).upper() - if limb.index == 0: - data.header += "#define " + name + "_POS_LIMB 0\n" - data.header += "#define " + name + "_ROT_LIMB 1\n" - else: - data.header += "#define " + name + "_LIMB " + str(limb.index+1) + "\n" - data.header += "#define " + self.name.upper() + "_NUM_LIMBS " + str(len(limbList)+1) + "\n" - - limbData.append(data) - - return limbData - -class OOTLimb(): - def __init__(self, skeletonName, boneName, index, translation, DL, lodDL): - self.skeletonName = skeletonName - self.boneName = boneName - self.translation = translation - self.firstChildIndex = 0xFF - self.nextSiblingIndex = 0xFF - self.DL = DL - self.lodDL = lodDL - - self.isFlex = False - self.index = index - self.children = [] - self.inverseRotation = None - - def toC(self, isLOD): - if not isLOD: - data = "StandardLimb " - else: - data = "LodLimb " - - data += self.name() + " = { " +\ - "{ " + str(int(round(self.translation[0]))) + ", " + \ - str(int(round(self.translation[1]))) + ", " + \ - str(int(round(self.translation[2]))) + " }, " + \ - str(self.firstChildIndex) + ", " +\ - str(self.nextSiblingIndex) + ", " - - if not isLOD: - data += (self.DL.name if self.DL is not None else "NULL") - else: - data += "{ " + (self.DL.name if self.DL is not None else "NULL") + ", " +\ - (self.lodDL.name if self.lodDL is not None else "NULL") + " }" - - data += " };\n" - - return data - - def name(self): - return self.skeletonName + "Limb_" + format(self.index, '03') - - def getNumLimbs(self): - numLimbs = 1 - for child in self.children: - numLimbs += child.getNumLimbs() - return numLimbs - - def getNumDLs(self): - numDLs = 0 - if self.DL is not None or self.lodDL is not None: - numDLs += 1 - - for child in self.children: - numDLs += child.getNumDLs() - - return numDLs - - def isFlexSkeleton(self): - if self.isFlex: - return True - else: - for child in self.children: - if child.isFlexSkeleton(): - return True - return False - - def getList(self, limbList): - # Like ootProcessBone, this must be in depth-first order to match the - # OoT SkelAnime draw code, so the bones are listed in the file in the - # same order as they are drawn. This is needed to enable the programmer - # to get the limb indices and to enable optimization between limbs. - limbList.append(self) - for child in self.children: - child.getList(limbList) - - def setLinks(self): - if len(self.children) > 0: - self.firstChildIndex = self.children[0].index - for i in range(len(self.children)): - if i < len(self.children) - 1: - self.children[i].nextSiblingIndex = self.children[i + 1].index - self.children[i].setLinks() - # self -> child -> sibling + +class OOTSkeleton: + def __init__(self, name): + self.name = name + self.segmentID = None + self.limbRoot = None + self.hasLOD = False + + def createLimbList(self): + if self.limbRoot is None: + return [] + + limbList = [] + self.limbRoot.getList(limbList) + self.limbRoot.setLinks() + return limbList + + def getNumDLs(self): + if self.limbRoot is not None: + return self.limbRoot.getNumDLs() + else: + return 0 + + def getNumLimbs(self): + if self.limbRoot is not None: + return self.limbRoot.getNumLimbs() + else: + return 0 + + def isFlexSkeleton(self): + if self.limbRoot is not None: + return self.limbRoot.isFlexSkeleton() + else: + return False + + def limbsName(self): + return self.name + "Limbs" + + def toC(self): + limbData = CData() + data = CData() + + if self.limbRoot is None: + return data + + limbList = self.createLimbList() + isFlex = self.isFlexSkeleton() + + data.source += ( + "void* " + self.limbsName() + "[" + str(self.getNumLimbs()) + "] = {\n" + ) + for limb in limbList: + limbData.source += limb.toC(self.hasLOD) + data.source += "\t&" + limb.name() + ",\n" + limbData.source += "\n" + data.source += "};\n\n" + + if isFlex: + data.source += ( + "FlexSkeletonHeader " + + self.name + + " = { " + + self.limbsName() + + ", " + + str(self.getNumLimbs()) + + ", " + + str(self.getNumDLs()) + + " };\n\n" + ) + data.header = "extern FlexSkeletonHeader " + self.name + ";\n" + else: + data.source += ( + "SkeletonHeader " + + self.name + + " = { " + + self.limbsName() + + ", " + + str(self.getNumLimbs()) + + " };\n\n" + ) + data.header = "extern SkeletonHeader " + self.name + ";\n" + + for limb in limbList: + name = (self.name + "_" + toAlnum(limb.boneName)).upper() + if limb.index == 0: + data.header += "#define " + name + "_POS_LIMB 0\n" + data.header += "#define " + name + "_ROT_LIMB 1\n" + else: + data.header += "#define " + name + "_LIMB " + str(limb.index + 1) + "\n" + data.header += ( + "#define " + + self.name.upper() + + "_NUM_LIMBS " + + str(len(limbList) + 1) + + "\n" + ) + + limbData.append(data) + + return limbData + + +class OOTLimb: + def __init__(self, skeletonName, boneName, index, translation, DL, lodDL): + self.skeletonName = skeletonName + self.boneName = boneName + self.translation = translation + self.firstChildIndex = 0xFF + self.nextSiblingIndex = 0xFF + self.DL = DL + self.lodDL = lodDL + + self.isFlex = False + self.index = index + self.children = [] + self.inverseRotation = None + + def toC(self, isLOD): + if not isLOD: + data = "StandardLimb " + else: + data = "LodLimb " + + data += ( + self.name() + + " = { " + + "{ " + + str(int(round(self.translation[0]))) + + ", " + + str(int(round(self.translation[1]))) + + ", " + + str(int(round(self.translation[2]))) + + " }, " + + str(self.firstChildIndex) + + ", " + + str(self.nextSiblingIndex) + + ", " + ) + + if not isLOD: + data += self.DL.name if self.DL is not None else "NULL" + else: + data += ( + "{ " + + (self.DL.name if self.DL is not None else "NULL") + + ", " + + (self.lodDL.name if self.lodDL is not None else "NULL") + + " }" + ) + + data += " };\n" + + return data + + def name(self): + return self.skeletonName + "Limb_" + format(self.index, "03") + + def getNumLimbs(self): + numLimbs = 1 + for child in self.children: + numLimbs += child.getNumLimbs() + return numLimbs + + def getNumDLs(self): + numDLs = 0 + if self.DL is not None or self.lodDL is not None: + numDLs += 1 + + for child in self.children: + numDLs += child.getNumDLs() + + return numDLs + + def isFlexSkeleton(self): + if self.isFlex: + return True + else: + for child in self.children: + if child.isFlexSkeleton(): + return True + return False + + def getList(self, limbList): + # Like ootProcessBone, this must be in depth-first order to match the + # OoT SkelAnime draw code, so the bones are listed in the file in the + # same order as they are drawn. This is needed to enable the programmer + # to get the limb indices and to enable optimization between limbs. + limbList.append(self) + for child in self.children: + child.getList(limbList) + + def setLinks(self): + if len(self.children) > 0: + self.firstChildIndex = self.children[0].index + for i in range(len(self.children)): + if i < len(self.children) - 1: + self.children[i].nextSiblingIndex = self.children[i + 1].index + self.children[i].setLinks() + # self -> child -> sibling + def getGroupIndices(meshInfo, armatureObj, meshObj, rootGroupIndex): - meshInfo.vertexGroupInfo = OOTVertexGroupInfo() - for vertex in meshObj.data.vertices: - meshInfo.vertexGroupInfo.vertexGroups[vertex.index] = getGroupIndexOfVert(vertex, armatureObj, meshObj, rootGroupIndex) + meshInfo.vertexGroupInfo = OOTVertexGroupInfo() + for vertex in meshObj.data.vertices: + meshInfo.vertexGroupInfo.vertexGroups[vertex.index] = getGroupIndexOfVert( + vertex, armatureObj, meshObj, rootGroupIndex + ) + def getGroupIndexOfVert(vert, armatureObj, obj, rootGroupIndex): - actualGroups = [] - nonBoneGroups = [] - for group in vert.groups: - groupName = getGroupNameFromIndex(obj, group.group) - if groupName is not None: - if groupName in armatureObj.data.bones: - actualGroups.append(group) - else: - nonBoneGroups.append(groupName) - - if len(actualGroups) == 0: - return rootGroupIndex - #highlightWeightErrors(obj, [vert], "VERT") - #raise VertexWeightError("All vertices must be part of a vertex group that corresponds to a bone in the armature.\n" +\ - # "Groups of the bad vert that don't correspond to a bone: " + str(nonBoneGroups) + '. If a vert is supposed to belong to this group then either a bone is missing or you have the wrong group.') - - vertGroup = actualGroups[0] - for group in actualGroups: - if group.weight > vertGroup.weight: - vertGroup = group - #if vertGroup not in actualGroups: - #raise VertexWeightError("A vertex was found that was primarily weighted to a group that does not correspond to a bone in #the armature. (" + getGroupNameFromIndex(obj, vertGroup.group) + ') Either decrease the weights of this vertex group or remove it. If you think this group should correspond to a bone, make sure to check your spelling.') - return vertGroup.group + actualGroups = [] + nonBoneGroups = [] + for group in vert.groups: + groupName = getGroupNameFromIndex(obj, group.group) + if groupName is not None: + if groupName in armatureObj.data.bones: + actualGroups.append(group) + else: + nonBoneGroups.append(groupName) + + if len(actualGroups) == 0: + return rootGroupIndex + # highlightWeightErrors(obj, [vert], "VERT") + # raise VertexWeightError("All vertices must be part of a vertex group that corresponds to a bone in the armature.\n" +\ + # "Groups of the bad vert that don't correspond to a bone: " + str(nonBoneGroups) + '. If a vert is supposed to belong to this group then either a bone is missing or you have the wrong group.') + + vertGroup = actualGroups[0] + for group in actualGroups: + if group.weight > vertGroup.weight: + vertGroup = group + # if vertGroup not in actualGroups: + # raise VertexWeightError("A vertex was found that was primarily weighted to a group that does not correspond to a bone in #the armature. (" + getGroupNameFromIndex(obj, vertGroup.group) + ') Either decrease the weights of this vertex group or remove it. If you think this group should correspond to a bone, make sure to check your spelling.') + return vertGroup.group + def ootDuplicateArmature(originalArmatureObj): - # Duplicate objects to apply scale / modifiers / linked data - bpy.ops.object.select_all(action = 'DESELECT') - - for originalMeshObj in [obj for obj in originalArmatureObj.children if isinstance(obj.data, bpy.types.Mesh)]: - originalMeshObj.select_set(True) - originalMeshObj.original_name = originalMeshObj.name - - originalArmatureObj.select_set(True) - originalArmatureObj.original_name = originalArmatureObj.name - bpy.context.view_layer.objects.active = originalArmatureObj - bpy.ops.object.duplicate() - - armatureObj = bpy.context.view_layer.objects.active - meshObjs = [obj for obj in bpy.context.selected_objects if obj is not armatureObj] - - try: - for obj in meshObjs: - setOrigin(armatureObj, obj) - - bpy.ops.object.select_all(action = "DESELECT") - armatureObj.select_set(True) - bpy.context.view_layer.objects.active = armatureObj - bpy.ops.object.transform_apply(location = False, rotation = False, - scale = True, properties = False) - - # Apply modifiers/data to mesh objs - bpy.ops.object.select_all(action = 'DESELECT') - for obj in meshObjs: - obj.select_set(True) - bpy.context.view_layer.objects.active = obj - - bpy.ops.object.make_single_user(obdata = True) - bpy.ops.object.transform_apply(location = False, - rotation = True, scale = True, properties = False) - for selectedObj in meshObjs: - bpy.ops.object.select_all(action = 'DESELECT') - selectedObj.select_set(True) - bpy.context.view_layer.objects.active = selectedObj - - for modifier in selectedObj.modifiers: - attemptModifierApply(modifier) - - # Apply new armature rest pose - bpy.ops.object.select_all(action = "DESELECT") - bpy.context.view_layer.objects.active = armatureObj - bpy.ops.object.mode_set(mode = "POSE") - bpy.ops.pose.armature_apply() - bpy.ops.object.mode_set(mode = "OBJECT") - - return armatureObj, meshObjs - except Exception as e: - cleanupDuplicatedObjects(meshObjs + [armatureObj]) - originalArmatureObj.select_set(True) - bpy.context.view_layer.objects.active = originalArmatureObj - raise Exception(str(e)) - -def ootConvertArmatureToSkeletonWithoutMesh(originalArmatureObj, convertTransformMatrix, name): - skeleton, fModel = ootConvertArmatureToSkeleton(originalArmatureObj, convertTransformMatrix, - None, name, False, True, "Opaque") - return skeleton - -def ootConvertArmatureToSkeletonWithMesh(originalArmatureObj, convertTransformMatrix, fModel, name, convertTextureData, drawLayer): - return ootConvertArmatureToSkeleton(originalArmatureObj, convertTransformMatrix, - fModel, name, convertTextureData, False, drawLayer) - -def ootConvertArmatureToSkeleton(originalArmatureObj, convertTransformMatrix, - fModel, name, convertTextureData, skeletonOnly, drawLayer): - checkEmptyName(name) - - armatureObj, meshObjs = ootDuplicateArmature(originalArmatureObj) - - try: - skeleton = OOTSkeleton(name) - - if len(armatureObj.children) == 0: - raise PluginError("No mesh parented to armature.") - - #startBoneNames = sorted([bone.name for bone in armatureObj.data.bones if bone.parent is None]) - #startBoneName = startBoneNames[0] - checkForStartBone(armatureObj) - startBoneName = getStartBone(armatureObj) - meshObj = meshObjs[0] - - meshInfo = getInfoDict(meshObj) - getGroupIndices(meshInfo, armatureObj, meshObj, getGroupIndexFromname(meshObj, startBoneName)) - - convertTransformMatrix = convertTransformMatrix @ \ - mathutils.Matrix.Diagonal(armatureObj.scale).to_4x4() - - #for i in range(len(startBoneNames)): - # startBoneName = startBoneNames[i] - ootProcessBone(fModel, startBoneName, skeleton, 0, - meshObj, armatureObj, convertTransformMatrix, meshInfo, convertTextureData, - name, skeletonOnly, drawLayer, None) - - cleanupDuplicatedObjects(meshObjs + [armatureObj]) - originalArmatureObj.select_set(True) - bpy.context.view_layer.objects.active = originalArmatureObj - - return skeleton, fModel - except Exception as e: - cleanupDuplicatedObjects(meshObjs + [armatureObj]) - originalArmatureObj.select_set(True) - bpy.context.view_layer.objects.active = originalArmatureObj - raise Exception(str(e)) - -def ootProcessBone(fModel, boneName, parentLimb, nextIndex, meshObj, armatureObj, - convertTransformMatrix, meshInfo, convertTextureData, namePrefix, skeletonOnly, - drawLayer, lastMaterialName): - bone = armatureObj.data.bones[boneName] - if bone.parent is not None: - transform = convertTransformMatrix @ bone.parent.matrix_local.inverted() @ bone.matrix_local - else: - transform = convertTransformMatrix @ bone.matrix_local - - translate, rotate, scale = transform.decompose() - - groupIndex = getGroupIndexFromname(meshObj, boneName) - - meshInfo.vertexGroupInfo.vertexGroupToLimb[groupIndex] = nextIndex - - if skeletonOnly: - mesh = None - hasSkinnedFaces = None - else: - mesh, hasSkinnedFaces, lastMaterialName = ootProcessVertexGroup( - fModel, meshObj, boneName, - convertTransformMatrix, armatureObj, namePrefix, - meshInfo, drawLayer, convertTextureData, lastMaterialName) - - if bone.ootBoneType == "Custom DL": - if mesh is not None: - raise PluginError(bone.name + " is set to use a custom DL but still has geometry assigned to it. Remove this geometry from this bone.") - else: - # Dummy data, only used so that name is set correctly - mesh = FMesh(bone.ootCustomDLName, DLFormat.Static) - - DL = None - if mesh is not None: - if not bone.use_deform: - raise PluginError(bone.name + " has vertices in its vertex group but is not set to deformable. Make sure to enable deform on this bone.") - DL = mesh.draw - - if isinstance(parentLimb, OOTSkeleton): - skeleton = parentLimb - limb = OOTLimb(skeleton.name, boneName, nextIndex, translate, DL, None) - skeleton.limbRoot = limb - else: - limb = OOTLimb(parentLimb.skeletonName, boneName, nextIndex, translate, DL, None) - parentLimb.children.append(limb) - - limb.isFlex = hasSkinnedFaces - nextIndex += 1 - - # This must be in depth-first order to match the OoT SkelAnime draw code, so - # the bones are listed in the file in the same order as they are drawn. This - # is needed to enable the programmer to get the limb indices and to enable - # optimization between limbs. - childrenNames = getSortedChildren(armatureObj, bone) - for childName in childrenNames: - nextIndex, lastMaterialName = ootProcessBone(fModel, childName, limb, nextIndex, meshObj, - armatureObj, convertTransformMatrix, meshInfo, convertTextureData, - namePrefix, skeletonOnly, drawLayer, lastMaterialName) - - return nextIndex, lastMaterialName - -def ootConvertArmatureToC(originalArmatureObj, convertTransformMatrix, - f3dType, isHWv1, skeletonName, folderName, DLFormat, savePNG, exportPath, isCustomExport, drawLayer, removeVanillaData): - skeletonName = toAlnum(skeletonName) - - fModel = OOTModel(f3dType, isHWv1, skeletonName, DLFormat, drawLayer) - skeleton, fModel = ootConvertArmatureToSkeletonWithMesh(originalArmatureObj, convertTransformMatrix, - fModel, skeletonName, not savePNG, drawLayer) - - if originalArmatureObj.ootFarLOD is not None: - lodSkeleton, fModel = ootConvertArmatureToSkeletonWithMesh(originalArmatureObj.ootFarLOD, convertTransformMatrix, - fModel, skeletonName + "_lod", not savePNG, drawLayer) - else: - lodSkeleton = None - - if lodSkeleton is not None: - skeleton.hasLOD = True - limbList = skeleton.createLimbList() - lodLimbList = lodSkeleton.createLimbList() - - if len(limbList) != len(lodLimbList): - raise PluginError(originalArmatureObj.name + " cannot use " + originalArmatureObj.ootFarLOD.name + \ - "as LOD because they do not have the same bone structure.") - - for i in range(len(limbList)): - limbList[i].lodDL = lodLimbList[i].DL - limbList[i].isFlex |= lodLimbList[i].isFlex - - - data = CData() - data.source += '#include "ultra64.h"\n#include "global.h"\n' - if not isCustomExport: - data.source += '#include "' + folderName + '.h"\n\n' - else: - data.source += '\n' - - exportData = fModel.to_c( - TextureExportSettings(False, savePNG, "test"), OOTGfxFormatter(ScrollMethod.Vertex)) - skeletonC = skeleton.toC() - - data.append(exportData.all()) - data.append(skeletonC) - - path = ootGetPath(exportPath, isCustomExport, 'assets/objects/', folderName, False, False) - writeCData(data, - os.path.join(path, skeletonName + '.h'), - os.path.join(path, skeletonName + '.c')) - - if not isCustomExport: - addIncludeFiles(folderName, path, skeletonName) - if removeVanillaData: - ootRemoveSkeleton(path, folderName, skeletonName) + # Duplicate objects to apply scale / modifiers / linked data + bpy.ops.object.select_all(action="DESELECT") + + for originalMeshObj in [ + obj + for obj in originalArmatureObj.children + if isinstance(obj.data, bpy.types.Mesh) + ]: + originalMeshObj.select_set(True) + originalMeshObj.original_name = originalMeshObj.name + + originalArmatureObj.select_set(True) + originalArmatureObj.original_name = originalArmatureObj.name + bpy.context.view_layer.objects.active = originalArmatureObj + bpy.ops.object.duplicate() + + armatureObj = bpy.context.view_layer.objects.active + meshObjs = [obj for obj in bpy.context.selected_objects if obj is not armatureObj] + + try: + for obj in meshObjs: + setOrigin(armatureObj, obj) + + bpy.ops.object.select_all(action="DESELECT") + armatureObj.select_set(True) + bpy.context.view_layer.objects.active = armatureObj + bpy.ops.object.transform_apply( + location=False, rotation=False, scale=True, properties=False + ) + + # Apply modifiers/data to mesh objs + bpy.ops.object.select_all(action="DESELECT") + for obj in meshObjs: + obj.select_set(True) + bpy.context.view_layer.objects.active = obj + + bpy.ops.object.make_single_user(obdata=True) + bpy.ops.object.transform_apply( + location=False, rotation=True, scale=True, properties=False + ) + for selectedObj in meshObjs: + bpy.ops.object.select_all(action="DESELECT") + selectedObj.select_set(True) + bpy.context.view_layer.objects.active = selectedObj + + for modifier in selectedObj.modifiers: + attemptModifierApply(modifier) + + # Apply new armature rest pose + bpy.ops.object.select_all(action="DESELECT") + bpy.context.view_layer.objects.active = armatureObj + bpy.ops.object.mode_set(mode="POSE") + bpy.ops.pose.armature_apply() + bpy.ops.object.mode_set(mode="OBJECT") + + return armatureObj, meshObjs + except Exception as e: + cleanupDuplicatedObjects(meshObjs + [armatureObj]) + originalArmatureObj.select_set(True) + bpy.context.view_layer.objects.active = originalArmatureObj + raise Exception(str(e)) + + +def ootConvertArmatureToSkeletonWithoutMesh( + originalArmatureObj, convertTransformMatrix, name +): + skeleton, fModel = ootConvertArmatureToSkeleton( + originalArmatureObj, convertTransformMatrix, None, name, False, True, "Opaque" + ) + return skeleton + + +def ootConvertArmatureToSkeletonWithMesh( + originalArmatureObj, + convertTransformMatrix, + fModel, + name, + convertTextureData, + drawLayer, +): + return ootConvertArmatureToSkeleton( + originalArmatureObj, + convertTransformMatrix, + fModel, + name, + convertTextureData, + False, + drawLayer, + ) + + +def ootConvertArmatureToSkeleton( + originalArmatureObj, + convertTransformMatrix, + fModel, + name, + convertTextureData, + skeletonOnly, + drawLayer, +): + checkEmptyName(name) + + armatureObj, meshObjs = ootDuplicateArmature(originalArmatureObj) + + try: + skeleton = OOTSkeleton(name) + + if len(armatureObj.children) == 0: + raise PluginError("No mesh parented to armature.") + + # startBoneNames = sorted([bone.name for bone in armatureObj.data.bones if bone.parent is None]) + # startBoneName = startBoneNames[0] + checkForStartBone(armatureObj) + startBoneName = getStartBone(armatureObj) + meshObj = meshObjs[0] + + meshInfo = getInfoDict(meshObj) + getGroupIndices( + meshInfo, + armatureObj, + meshObj, + getGroupIndexFromname(meshObj, startBoneName), + ) + + convertTransformMatrix = ( + convertTransformMatrix + @ mathutils.Matrix.Diagonal(armatureObj.scale).to_4x4() + ) + + # for i in range(len(startBoneNames)): + # startBoneName = startBoneNames[i] + ootProcessBone( + fModel, + startBoneName, + skeleton, + 0, + meshObj, + armatureObj, + convertTransformMatrix, + meshInfo, + convertTextureData, + name, + skeletonOnly, + drawLayer, + None, + ) + + cleanupDuplicatedObjects(meshObjs + [armatureObj]) + originalArmatureObj.select_set(True) + bpy.context.view_layer.objects.active = originalArmatureObj + + return skeleton, fModel + except Exception as e: + cleanupDuplicatedObjects(meshObjs + [armatureObj]) + originalArmatureObj.select_set(True) + bpy.context.view_layer.objects.active = originalArmatureObj + raise Exception(str(e)) + + +def ootProcessBone( + fModel, + boneName, + parentLimb, + nextIndex, + meshObj, + armatureObj, + convertTransformMatrix, + meshInfo, + convertTextureData, + namePrefix, + skeletonOnly, + drawLayer, + lastMaterialName, +): + bone = armatureObj.data.bones[boneName] + if bone.parent is not None: + transform = ( + convertTransformMatrix + @ bone.parent.matrix_local.inverted() + @ bone.matrix_local + ) + else: + transform = convertTransformMatrix @ bone.matrix_local + + translate, rotate, scale = transform.decompose() + + groupIndex = getGroupIndexFromname(meshObj, boneName) + + meshInfo.vertexGroupInfo.vertexGroupToLimb[groupIndex] = nextIndex + + if skeletonOnly: + mesh = None + hasSkinnedFaces = None + else: + mesh, hasSkinnedFaces, lastMaterialName = ootProcessVertexGroup( + fModel, + meshObj, + boneName, + convertTransformMatrix, + armatureObj, + namePrefix, + meshInfo, + drawLayer, + convertTextureData, + lastMaterialName, + ) + + if bone.ootBoneType == "Custom DL": + if mesh is not None: + raise PluginError( + bone.name + + " is set to use a custom DL but still has geometry assigned to it. Remove this geometry from this bone." + ) + else: + # Dummy data, only used so that name is set correctly + mesh = FMesh(bone.ootCustomDLName, DLFormat.Static) + + DL = None + if mesh is not None: + if not bone.use_deform: + raise PluginError( + bone.name + + " has vertices in its vertex group but is not set to deformable. Make sure to enable deform on this bone." + ) + DL = mesh.draw + + if isinstance(parentLimb, OOTSkeleton): + skeleton = parentLimb + limb = OOTLimb(skeleton.name, boneName, nextIndex, translate, DL, None) + skeleton.limbRoot = limb + else: + limb = OOTLimb( + parentLimb.skeletonName, boneName, nextIndex, translate, DL, None + ) + parentLimb.children.append(limb) + + limb.isFlex = hasSkinnedFaces + nextIndex += 1 + + # This must be in depth-first order to match the OoT SkelAnime draw code, so + # the bones are listed in the file in the same order as they are drawn. This + # is needed to enable the programmer to get the limb indices and to enable + # optimization between limbs. + childrenNames = getSortedChildren(armatureObj, bone) + for childName in childrenNames: + nextIndex, lastMaterialName = ootProcessBone( + fModel, + childName, + limb, + nextIndex, + meshObj, + armatureObj, + convertTransformMatrix, + meshInfo, + convertTextureData, + namePrefix, + skeletonOnly, + drawLayer, + lastMaterialName, + ) + + return nextIndex, lastMaterialName + + +def ootConvertArmatureToC( + originalArmatureObj, + convertTransformMatrix, + f3dType, + isHWv1, + skeletonName, + folderName, + DLFormat, + savePNG, + exportPath, + isCustomExport, + drawLayer, + removeVanillaData, +): + skeletonName = toAlnum(skeletonName) + + fModel = OOTModel(f3dType, isHWv1, skeletonName, DLFormat, drawLayer) + skeleton, fModel = ootConvertArmatureToSkeletonWithMesh( + originalArmatureObj, + convertTransformMatrix, + fModel, + skeletonName, + not savePNG, + drawLayer, + ) + + if originalArmatureObj.ootFarLOD is not None: + lodSkeleton, fModel = ootConvertArmatureToSkeletonWithMesh( + originalArmatureObj.ootFarLOD, + convertTransformMatrix, + fModel, + skeletonName + "_lod", + not savePNG, + drawLayer, + ) + else: + lodSkeleton = None + + if lodSkeleton is not None: + skeleton.hasLOD = True + limbList = skeleton.createLimbList() + lodLimbList = lodSkeleton.createLimbList() + + if len(limbList) != len(lodLimbList): + raise PluginError( + originalArmatureObj.name + + " cannot use " + + originalArmatureObj.ootFarLOD.name + + "as LOD because they do not have the same bone structure." + ) + + for i in range(len(limbList)): + limbList[i].lodDL = lodLimbList[i].DL + limbList[i].isFlex |= lodLimbList[i].isFlex + + data = CData() + data.source += '#include "ultra64.h"\n#include "global.h"\n' + if not isCustomExport: + data.source += '#include "' + folderName + '.h"\n\n' + else: + data.source += "\n" + + exportData = fModel.to_c( + TextureExportSettings(False, savePNG, "test"), + OOTGfxFormatter(ScrollMethod.Vertex), + ) + skeletonC = skeleton.toC() + + data.append(exportData.all()) + data.append(skeletonC) + + path = ootGetPath( + exportPath, isCustomExport, "assets/objects/", folderName, False, False + ) + writeCData( + data, + os.path.join(path, skeletonName + ".h"), + os.path.join(path, skeletonName + ".c"), + ) + + if not isCustomExport: + addIncludeFiles(folderName, path, skeletonName) + if removeVanillaData: + ootRemoveSkeleton(path, folderName, skeletonName) + class OOTDLEntry: - def __init__(self, dlName, limbIndex): - self.dlName = dlName - self.limbIndex = limbIndex + def __init__(self, dlName, limbIndex): + self.dlName = dlName + self.limbIndex = limbIndex + def ootGetSkeleton(skeletonData, skeletonName, continueOnError): - # TODO: Does this handle non flex skeleton? - matchResult = re.search("(Flex)?SkeletonHeader\s*" + re.escape(skeletonName) + \ - "\s*=\s*\{\s*\{?\s*([^,\s]*)\s*,\s*([^,\s\}]*)\s*\}?\s*(,\s*([^,\s]*))?\s*\}\s*;\s*", skeletonData) - if matchResult is None: - if continueOnError: - return None - else: - raise PluginError("Cannot find skeleton named " + skeletonName) - return matchResult + # TODO: Does this handle non flex skeleton? + matchResult = re.search( + "(Flex)?SkeletonHeader\s*" + + re.escape(skeletonName) + + "\s*=\s*\{\s*\{?\s*([^,\s]*)\s*,\s*([^,\s\}]*)\s*\}?\s*(,\s*([^,\s]*))?\s*\}\s*;\s*", + skeletonData, + ) + if matchResult is None: + if continueOnError: + return None + else: + raise PluginError("Cannot find skeleton named " + skeletonName) + return matchResult + def ootGetLimbs(skeletonData, limbsName, continueOnError): - matchResult = re.search("(static\s*)?void\s*\*\s*" + re.escape(limbsName) + \ - "\s*\[\s*[0-9]*\s*\]\s*=\s*\{([^\}]*)\}\s*;\s*", skeletonData, re.DOTALL) - if matchResult is None: - if continueOnError: - return None - else: - raise PluginError("Cannot find skeleton limbs named " + limbsName) - return matchResult + matchResult = re.search( + "(static\s*)?void\s*\*\s*" + + re.escape(limbsName) + + "\s*\[\s*[0-9]*\s*\]\s*=\s*\{([^\}]*)\}\s*;\s*", + skeletonData, + re.DOTALL, + ) + if matchResult is None: + if continueOnError: + return None + else: + raise PluginError("Cannot find skeleton limbs named " + limbsName) + return matchResult + def ootGetLimb(skeletonData, limbName, continueOnError): - matchResult = re.search("([A-Za-z0-9\_]*)Limb\s*" + re.escape(limbName), skeletonData) - - if matchResult is None: - if continueOnError: - return None - else: - raise PluginError("Cannot find skeleton limb named " + limbName) - - limbType = matchResult.group(1) - if limbType == "Lod": - dlRegex = "\{\s*([^,\s]*)\s*,\s*([^,\s]*)\s*\}" - else: - dlRegex = "([^,\s]*)" - - matchResult = re.search("[A-Za-z0-9\_]*Limb\s*" + re.escape(limbName) + \ - "\s*=\s*\{\s*\{\s*([^,\s]*)\s*,\s*([^,\s]*)\s*,\s*([^,\s]*)\s*\},\s*([^, ]*)\s*,\s*([^, ]*)\s*,\s*" +\ - dlRegex + "\s*\}\s*;\s*", skeletonData, re.DOTALL) - - if matchResult is None: - if continueOnError: - return None - else: - raise PluginError("Cannot handle skeleton limb named " + limbName + " of type " + limbType) - return matchResult - -def ootImportSkeletonC(filepaths, skeletonName, actorScale, removeDoubles, importNormals, basePath, drawLayer): - skeletonData = getImportData(filepaths) - - matchResult = ootGetSkeleton(skeletonData, skeletonName, False) - limbsName = matchResult.group(2) - - matchResult = ootGetLimbs(skeletonData, limbsName, False) - limbsData = matchResult.group(2) - limbList = [entry.strip()[1:] for entry in limbsData.split(',')] - - #print(limbList) - isLOD, armatureObj = ootBuildSkeleton(skeletonName, skeletonData, limbList, - actorScale, removeDoubles, importNormals, False, basePath, drawLayer) - if isLOD: - isLOD, LODArmatureObj = ootBuildSkeleton(skeletonName, skeletonData, limbList, - actorScale, removeDoubles, importNormals, True, basePath, drawLayer) - armatureObj.ootFarLOD = LODArmatureObj - - -def ootBuildSkeleton(skeletonName, skeletonData, limbList, actorScale, removeDoubles, - importNormals, useFarLOD, basePath, drawLayer): - lodString = "_lod" if useFarLOD else "" - - # Create new skinned mesh - mesh = bpy.data.meshes.new(skeletonName + '_mesh' + lodString) - obj = bpy.data.objects.new(skeletonName + '_mesh' + lodString, mesh) - bpy.context.scene.collection.objects.link(obj) - - # Create new armature - armature = bpy.data.armatures.new(skeletonName + lodString) - armatureObj = bpy.data.objects.new(skeletonName + lodString, armature) - armatureObj.show_in_front = True - armatureObj.ootDrawLayer = drawLayer - #armature.show_names = True - - bpy.context.scene.collection.objects.link(armatureObj) - bpy.context.view_layer.objects.active = armatureObj - #bpy.ops.object.mode_set(mode = 'EDIT') - - f3dContext = OOTF3DContext(F3D("F3DEX2/LX2", False), limbList, basePath) - f3dContext.mat().draw_layer.oot = armatureObj.ootDrawLayer - transformMatrix = mathutils.Matrix.Scale(1 / actorScale, 4) - isLOD = ootAddLimbRecursively(0, skeletonData, obj, armatureObj, transformMatrix, None, f3dContext, useFarLOD) - for dlEntry in f3dContext.dlList: - limbName = f3dContext.getLimbName(dlEntry.limbIndex) - boneName = f3dContext.getBoneName(dlEntry.limbIndex) - parseF3D(skeletonData, dlEntry.dlName, obj, f3dContext.matrixData[limbName], - limbName, boneName, "oot", drawLayer, f3dContext) - if f3dContext.isBillboard: - armatureObj.data.bones[boneName].ootDynamicTransform.billboard = True - f3dContext.clearMaterial() # THIS IS IMPORTANT - f3dContext.createMesh(obj, removeDoubles, importNormals) - armatureObj.location = bpy.context.scene.cursor.location - - # Set bone rotation mode. - bpy.ops.object.select_all(action = "DESELECT") - armatureObj.select_set(True) - bpy.context.view_layer.objects.active = armatureObj - bpy.ops.object.mode_set(mode = 'POSE') - for bone in armatureObj.pose.bones: - bone.rotation_mode = 'XYZ' - - # Apply mesh to armature. - if bpy.context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - bpy.ops.object.select_all(action = 'DESELECT') - obj.select_set(True) - armatureObj.select_set(True) - bpy.context.view_layer.objects.active = armatureObj - bpy.ops.object.parent_set(type = "ARMATURE") - - applyRotation([armatureObj], math.radians(-90), 'X') - - return isLOD, armatureObj + matchResult = re.search( + "([A-Za-z0-9\_]*)Limb\s*" + re.escape(limbName), skeletonData + ) + + if matchResult is None: + if continueOnError: + return None + else: + raise PluginError("Cannot find skeleton limb named " + limbName) + + limbType = matchResult.group(1) + if limbType == "Lod": + dlRegex = "\{\s*([^,\s]*)\s*,\s*([^,\s]*)\s*\}" + else: + dlRegex = "([^,\s]*)" + + matchResult = re.search( + "[A-Za-z0-9\_]*Limb\s*" + + re.escape(limbName) + + "\s*=\s*\{\s*\{\s*([^,\s]*)\s*,\s*([^,\s]*)\s*,\s*([^,\s]*)\s*\},\s*([^, ]*)\s*,\s*([^, ]*)\s*,\s*" + + dlRegex + + "\s*\}\s*;\s*", + skeletonData, + re.DOTALL, + ) + + if matchResult is None: + if continueOnError: + return None + else: + raise PluginError( + "Cannot handle skeleton limb named " + limbName + " of type " + limbType + ) + return matchResult + + +def ootImportSkeletonC( + filepaths, + skeletonName, + actorScale, + removeDoubles, + importNormals, + basePath, + drawLayer, +): + skeletonData = getImportData(filepaths) + + matchResult = ootGetSkeleton(skeletonData, skeletonName, False) + limbsName = matchResult.group(2) + + matchResult = ootGetLimbs(skeletonData, limbsName, False) + limbsData = matchResult.group(2) + limbList = [entry.strip()[1:] for entry in limbsData.split(",")] + + # print(limbList) + isLOD, armatureObj = ootBuildSkeleton( + skeletonName, + skeletonData, + limbList, + actorScale, + removeDoubles, + importNormals, + False, + basePath, + drawLayer, + ) + if isLOD: + isLOD, LODArmatureObj = ootBuildSkeleton( + skeletonName, + skeletonData, + limbList, + actorScale, + removeDoubles, + importNormals, + True, + basePath, + drawLayer, + ) + armatureObj.ootFarLOD = LODArmatureObj + + +def ootBuildSkeleton( + skeletonName, + skeletonData, + limbList, + actorScale, + removeDoubles, + importNormals, + useFarLOD, + basePath, + drawLayer, +): + lodString = "_lod" if useFarLOD else "" + + # Create new skinned mesh + mesh = bpy.data.meshes.new(skeletonName + "_mesh" + lodString) + obj = bpy.data.objects.new(skeletonName + "_mesh" + lodString, mesh) + bpy.context.scene.collection.objects.link(obj) + + # Create new armature + armature = bpy.data.armatures.new(skeletonName + lodString) + armatureObj = bpy.data.objects.new(skeletonName + lodString, armature) + armatureObj.show_in_front = True + armatureObj.ootDrawLayer = drawLayer + # armature.show_names = True + + bpy.context.scene.collection.objects.link(armatureObj) + bpy.context.view_layer.objects.active = armatureObj + # bpy.ops.object.mode_set(mode = 'EDIT') + + f3dContext = OOTF3DContext(F3D("F3DEX2/LX2", False), limbList, basePath) + f3dContext.mat().draw_layer.oot = armatureObj.ootDrawLayer + transformMatrix = mathutils.Matrix.Scale(1 / actorScale, 4) + isLOD = ootAddLimbRecursively( + 0, skeletonData, obj, armatureObj, transformMatrix, None, f3dContext, useFarLOD + ) + for dlEntry in f3dContext.dlList: + limbName = f3dContext.getLimbName(dlEntry.limbIndex) + boneName = f3dContext.getBoneName(dlEntry.limbIndex) + parseF3D( + skeletonData, + dlEntry.dlName, + obj, + f3dContext.matrixData[limbName], + limbName, + boneName, + "oot", + drawLayer, + f3dContext, + ) + if f3dContext.isBillboard: + armatureObj.data.bones[boneName].ootDynamicTransform.billboard = True + f3dContext.clearMaterial() # THIS IS IMPORTANT + f3dContext.createMesh(obj, removeDoubles, importNormals) + armatureObj.location = bpy.context.scene.cursor.location + + # Set bone rotation mode. + bpy.ops.object.select_all(action="DESELECT") + armatureObj.select_set(True) + bpy.context.view_layer.objects.active = armatureObj + bpy.ops.object.mode_set(mode="POSE") + for bone in armatureObj.pose.bones: + bone.rotation_mode = "XYZ" + + # Apply mesh to armature. + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + bpy.ops.object.select_all(action="DESELECT") + obj.select_set(True) + armatureObj.select_set(True) + bpy.context.view_layer.objects.active = armatureObj + bpy.ops.object.parent_set(type="ARMATURE") + + applyRotation([armatureObj], math.radians(-90), "X") + + return isLOD, armatureObj + def ootAddBone(armatureObj, boneName, parentBoneName, currentTransform, loadDL): - if bpy.context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode="OBJECT") - bpy.ops.object.select_all(action = 'DESELECT') - bpy.context.view_layer.objects.active = armatureObj - bpy.ops.object.mode_set(mode="EDIT") - bone = armatureObj.data.edit_bones.new(boneName) - bone.use_connect = False - if parentBoneName is not None: - bone.parent = armatureObj.data.edit_bones[parentBoneName] - bone.head = currentTransform @ mathutils.Vector((0,0,0)) - bone.tail = bone.head + (currentTransform.to_quaternion() @ \ - mathutils.Vector((0,0.3,0))) - - # Connect bone to parent if it is possible without changing parent direction. - - if parentBoneName is not None: - nodeOffsetVector = mathutils.Vector(bone.head - bone.parent.head) - # set fallback to nonzero to avoid creating zero length bones - if(nodeOffsetVector.angle(bone.parent.tail - bone.parent.head, 1) \ - < 0.0001 and loadDL): - for child in bone.parent.children: - if child != bone: - child.use_connect = False - bone.parent.tail = bone.head - bone.use_connect = True - elif bone.head == bone.parent.head and bone.tail == bone.parent.tail: - bone.tail += currentTransform.to_quaternion() @ mathutils.Vector((0,0.2,0)) - - if bpy.context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode="OBJECT") - -def ootAddLimbRecursively(limbIndex, skeletonData, obj, armatureObj, parentTransform, parentBoneName, f3dContext, useFarLOD): - - limbName = f3dContext.getLimbName(limbIndex) - boneName = f3dContext.getBoneName(limbIndex) - matchResult = ootGetLimb(skeletonData, limbName, False) - - isLOD = matchResult.lastindex > 6 - - if isLOD and useFarLOD: - dlName = matchResult.group(7) - else: - dlName = matchResult.group(6) - - # Animations override the root translation, so we just ignore importing them as well. - if limbIndex == 0: - translation = [0,0,0] - else: - translation = [hexOrDecInt(matchResult.group(1)), hexOrDecInt(matchResult.group(2)), hexOrDecInt(matchResult.group(3))] - nextChildIndex = hexOrDecInt(matchResult.group(4)) - nextSiblingIndex = hexOrDecInt(matchResult.group(5)) - - #str(limbIndex) + " " + str(translation) + " " + str(nextChildIndex) + " " + \ - # str(nextSiblingIndex) + " " + str(dlName)) - - currentTransform = parentTransform @ mathutils.Matrix.Translation(mathutils.Vector(translation)) - f3dContext.matrixData[limbName] = currentTransform - loadDL = dlName != "NULL" - - ootAddBone(armatureObj, boneName, parentBoneName, currentTransform, loadDL) - - # DLs can access bone transforms not yet processed. - # Therefore were delay F3D parsing until after skeleton is processed. - if loadDL: - f3dContext.dlList.append(OOTDLEntry(dlName, limbIndex)) - #parseF3D(skeletonData, dlName, obj, transformMatrix, boneName, f3dContext) - - if nextChildIndex != 255: - isLOD |= ootAddLimbRecursively(nextChildIndex, skeletonData, obj, armatureObj, currentTransform, boneName, f3dContext, useFarLOD) - - if nextSiblingIndex != 255: - isLOD |= ootAddLimbRecursively(nextSiblingIndex, skeletonData, obj, armatureObj, parentTransform, parentBoneName, f3dContext, useFarLOD) - - return isLOD + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + bpy.ops.object.select_all(action="DESELECT") + bpy.context.view_layer.objects.active = armatureObj + bpy.ops.object.mode_set(mode="EDIT") + bone = armatureObj.data.edit_bones.new(boneName) + bone.use_connect = False + if parentBoneName is not None: + bone.parent = armatureObj.data.edit_bones[parentBoneName] + bone.head = currentTransform @ mathutils.Vector((0, 0, 0)) + bone.tail = bone.head + ( + currentTransform.to_quaternion() @ mathutils.Vector((0, 0.3, 0)) + ) + + # Connect bone to parent if it is possible without changing parent direction. + + if parentBoneName is not None: + nodeOffsetVector = mathutils.Vector(bone.head - bone.parent.head) + # set fallback to nonzero to avoid creating zero length bones + if ( + nodeOffsetVector.angle(bone.parent.tail - bone.parent.head, 1) < 0.0001 + and loadDL + ): + for child in bone.parent.children: + if child != bone: + child.use_connect = False + bone.parent.tail = bone.head + bone.use_connect = True + elif bone.head == bone.parent.head and bone.tail == bone.parent.tail: + bone.tail += currentTransform.to_quaternion() @ mathutils.Vector( + (0, 0.2, 0) + ) + + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + + +def ootAddLimbRecursively( + limbIndex, + skeletonData, + obj, + armatureObj, + parentTransform, + parentBoneName, + f3dContext, + useFarLOD, +): + + limbName = f3dContext.getLimbName(limbIndex) + boneName = f3dContext.getBoneName(limbIndex) + matchResult = ootGetLimb(skeletonData, limbName, False) + + isLOD = matchResult.lastindex > 6 + + if isLOD and useFarLOD: + dlName = matchResult.group(7) + else: + dlName = matchResult.group(6) + + # Animations override the root translation, so we just ignore importing them as well. + if limbIndex == 0: + translation = [0, 0, 0] + else: + translation = [ + hexOrDecInt(matchResult.group(1)), + hexOrDecInt(matchResult.group(2)), + hexOrDecInt(matchResult.group(3)), + ] + nextChildIndex = hexOrDecInt(matchResult.group(4)) + nextSiblingIndex = hexOrDecInt(matchResult.group(5)) + + # str(limbIndex) + " " + str(translation) + " " + str(nextChildIndex) + " " + \ + # str(nextSiblingIndex) + " " + str(dlName)) + + currentTransform = parentTransform @ mathutils.Matrix.Translation( + mathutils.Vector(translation) + ) + f3dContext.matrixData[limbName] = currentTransform + loadDL = dlName != "NULL" + + ootAddBone(armatureObj, boneName, parentBoneName, currentTransform, loadDL) + + # DLs can access bone transforms not yet processed. + # Therefore were delay F3D parsing until after skeleton is processed. + if loadDL: + f3dContext.dlList.append(OOTDLEntry(dlName, limbIndex)) + # parseF3D(skeletonData, dlName, obj, transformMatrix, boneName, f3dContext) + + if nextChildIndex != 255: + isLOD |= ootAddLimbRecursively( + nextChildIndex, + skeletonData, + obj, + armatureObj, + currentTransform, + boneName, + f3dContext, + useFarLOD, + ) + + if nextSiblingIndex != 255: + isLOD |= ootAddLimbRecursively( + nextSiblingIndex, + skeletonData, + obj, + armatureObj, + parentTransform, + parentBoneName, + f3dContext, + useFarLOD, + ) + + return isLOD + def ootRemoveSkeleton(filepath, objectName, skeletonName): - headerPath = os.path.join(filepath, objectName + '.h') - sourcePath = os.path.join(filepath, objectName + '.c') - - skeletonDataC = readFile(sourcePath) - originalDataC = skeletonDataC - - skeletonDataH = readFile(headerPath) - originalDataH = skeletonDataH - - matchResult = ootGetSkeleton(skeletonDataC, skeletonName, True) - if matchResult is None: - return - skeletonDataC = skeletonDataC[:matchResult.start(0)] + skeletonDataC[matchResult.end(0):] - limbsName = matchResult.group(2) - - headerMatch = getDeclaration(skeletonDataH, skeletonName) - if headerMatch is not None: - skeletonDataH = skeletonDataH[:headerMatch.start(0)] + skeletonDataH[headerMatch.end(0):] - - matchResult = ootGetLimbs(skeletonDataC, limbsName, True) - if matchResult is None: - return - skeletonDataC = skeletonDataC[:matchResult.start(0)] + skeletonDataC[matchResult.end(0):] - limbsData = matchResult.group(2) - limbList = [entry.strip()[1:] for entry in limbsData.split(',')] - - headerMatch = getDeclaration(skeletonDataH, limbsName) - if headerMatch is not None: - skeletonDataH = skeletonDataH[:headerMatch.start(0)] + skeletonDataH[headerMatch.end(0):] - - for limb in limbList: - matchResult = ootGetLimb(skeletonDataC, limb, True) - if matchResult is not None: - skeletonDataC = skeletonDataC[:matchResult.start(0)] + skeletonDataC[matchResult.end(0):] - headerMatch = getDeclaration(skeletonDataH, limb) - if headerMatch is not None: - skeletonDataH = skeletonDataH[:headerMatch.start(0)] + skeletonDataH[headerMatch.end(0):] - - if skeletonDataC != originalDataC: - writeFile(sourcePath, skeletonDataC) - - if skeletonDataH != originalDataH: - writeFile(headerPath, skeletonDataH) + headerPath = os.path.join(filepath, objectName + ".h") + sourcePath = os.path.join(filepath, objectName + ".c") + + skeletonDataC = readFile(sourcePath) + originalDataC = skeletonDataC + + skeletonDataH = readFile(headerPath) + originalDataH = skeletonDataH + + matchResult = ootGetSkeleton(skeletonDataC, skeletonName, True) + if matchResult is None: + return + skeletonDataC = ( + skeletonDataC[: matchResult.start(0)] + skeletonDataC[matchResult.end(0) :] + ) + limbsName = matchResult.group(2) + + headerMatch = getDeclaration(skeletonDataH, skeletonName) + if headerMatch is not None: + skeletonDataH = ( + skeletonDataH[: headerMatch.start(0)] + skeletonDataH[headerMatch.end(0) :] + ) + + matchResult = ootGetLimbs(skeletonDataC, limbsName, True) + if matchResult is None: + return + skeletonDataC = ( + skeletonDataC[: matchResult.start(0)] + skeletonDataC[matchResult.end(0) :] + ) + limbsData = matchResult.group(2) + limbList = [entry.strip()[1:] for entry in limbsData.split(",")] + + headerMatch = getDeclaration(skeletonDataH, limbsName) + if headerMatch is not None: + skeletonDataH = ( + skeletonDataH[: headerMatch.start(0)] + skeletonDataH[headerMatch.end(0) :] + ) + + for limb in limbList: + matchResult = ootGetLimb(skeletonDataC, limb, True) + if matchResult is not None: + skeletonDataC = ( + skeletonDataC[: matchResult.start(0)] + + skeletonDataC[matchResult.end(0) :] + ) + headerMatch = getDeclaration(skeletonDataH, limb) + if headerMatch is not None: + skeletonDataH = ( + skeletonDataH[: headerMatch.start(0)] + + skeletonDataH[headerMatch.end(0) :] + ) + + if skeletonDataC != originalDataC: + writeFile(sourcePath, skeletonDataC) + + if skeletonDataH != originalDataH: + writeFile(headerPath, skeletonDataH) + class OOT_ImportSkeleton(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.oot_import_skeleton' - bl_label = "Import Skeleton" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - armatureObj = None - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = "OBJECT") - - try: - importPath = bpy.path.abspath(context.scene.ootSkeletonImportCustomPath) - isCustomImport = context.scene.ootSkeletonImportUseCustomPath - folderName = context.scene.ootSkeletonImportFolderName - skeletonName = context.scene.ootSkeletonImportName - scale = context.scene.ootActorBlenderScale - removeDoubles = context.scene.ootActorRemoveDoubles - importNormals = context.scene.ootActorImportNormals - decompPath = bpy.path.abspath(bpy.context.scene.ootDecompPath) - drawLayer = bpy.context.scene.ootActorImportDrawLayer - - filepaths = [ootGetObjectPath(isCustomImport, importPath, folderName)] - if not isCustomImport: - filepaths.append(os.path.join(bpy.context.scene.ootDecompPath, "assets/objects/gameplay_keep/gameplay_keep.c")) - - ootImportSkeletonC(filepaths, skeletonName, scale, removeDoubles, importNormals, decompPath, drawLayer) - - self.report({'INFO'}, 'Success!') - return {'FINISHED'} - - except Exception as e: - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - raisePluginError(self, e) - return {'CANCELLED'} # must return a set + # set bl_ properties + bl_idname = "object.oot_import_skeleton" + bl_label = "Import Skeleton" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + armatureObj = None + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + + try: + importPath = bpy.path.abspath(context.scene.ootSkeletonImportCustomPath) + isCustomImport = context.scene.ootSkeletonImportUseCustomPath + folderName = context.scene.ootSkeletonImportFolderName + skeletonName = context.scene.ootSkeletonImportName + scale = context.scene.ootActorBlenderScale + removeDoubles = context.scene.ootActorRemoveDoubles + importNormals = context.scene.ootActorImportNormals + decompPath = bpy.path.abspath(bpy.context.scene.ootDecompPath) + drawLayer = bpy.context.scene.ootActorImportDrawLayer + + filepaths = [ootGetObjectPath(isCustomImport, importPath, folderName)] + if not isCustomImport: + filepaths.append( + os.path.join( + bpy.context.scene.ootDecompPath, + "assets/objects/gameplay_keep/gameplay_keep.c", + ) + ) + + ootImportSkeletonC( + filepaths, + skeletonName, + scale, + removeDoubles, + importNormals, + decompPath, + drawLayer, + ) + + self.report({"INFO"}, "Success!") + return {"FINISHED"} + + except Exception as e: + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + raisePluginError(self, e) + return {"CANCELLED"} # must return a set + class OOT_ExportSkeleton(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.oot_export_skeleton' - bl_label = "Export Skeleton" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - armatureObj = None - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = "OBJECT") - if len(context.selected_objects) == 0: - raise PluginError("Armature not selected.") - armatureObj = context.active_object - if type(armatureObj.data) is not bpy.types.Armature: - raise PluginError("Armature not selected.") - - if len(armatureObj.children) == 0 or \ - not isinstance(armatureObj.children[0].data, bpy.types.Mesh): - raise PluginError("Armature does not have any mesh children, or " +\ - 'has a non-mesh child.') - - obj = armatureObj.children[0] - finalTransform = mathutils.Matrix.Scale(context.scene.ootActorBlenderScale, 4) - - try: - #exportPath, levelName = getPathAndLevel(context.scene.geoCustomExport, - # context.scene.geoExportPath, context.scene.geoLevelName, - # context.scene.geoLevelOption) - - saveTextures = bpy.context.scene.saveTextures or bpy.context.scene.ignoreTextureRestrictions - isHWv1 = context.scene.isHWv1 - f3dType = context.scene.f3d_type - skeletonName = context.scene.ootSkeletonExportName - folderName = context.scene.ootSkeletonExportFolderName - exportPath = bpy.path.abspath(context.scene.ootSkeletonExportCustomPath) - isCustomExport = context.scene.ootSkeletonExportUseCustomPath - drawLayer = armatureObj.ootDrawLayer - removeVanillaData = context.scene.ootSkeletonRemoveVanillaData - - ootConvertArmatureToC(armatureObj, finalTransform, - f3dType, isHWv1, skeletonName, folderName, DLFormat.Static, saveTextures, - exportPath, isCustomExport, drawLayer, removeVanillaData) - - self.report({'INFO'}, 'Success!') - return {'FINISHED'} - - except Exception as e: - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - raisePluginError(self, e) - return {'CANCELLED'} # must return a set + # set bl_ properties + bl_idname = "object.oot_export_skeleton" + bl_label = "Export Skeleton" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + armatureObj = None + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + if len(context.selected_objects) == 0: + raise PluginError("Armature not selected.") + armatureObj = context.active_object + if type(armatureObj.data) is not bpy.types.Armature: + raise PluginError("Armature not selected.") + + if len(armatureObj.children) == 0 or not isinstance( + armatureObj.children[0].data, bpy.types.Mesh + ): + raise PluginError( + "Armature does not have any mesh children, or " + + "has a non-mesh child." + ) + + obj = armatureObj.children[0] + finalTransform = mathutils.Matrix.Scale(context.scene.ootActorBlenderScale, 4) + + try: + # exportPath, levelName = getPathAndLevel(context.scene.geoCustomExport, + # context.scene.geoExportPath, context.scene.geoLevelName, + # context.scene.geoLevelOption) + + saveTextures = ( + bpy.context.scene.saveTextures + or bpy.context.scene.ignoreTextureRestrictions + ) + isHWv1 = context.scene.isHWv1 + f3dType = context.scene.f3d_type + skeletonName = context.scene.ootSkeletonExportName + folderName = context.scene.ootSkeletonExportFolderName + exportPath = bpy.path.abspath(context.scene.ootSkeletonExportCustomPath) + isCustomExport = context.scene.ootSkeletonExportUseCustomPath + drawLayer = armatureObj.ootDrawLayer + removeVanillaData = context.scene.ootSkeletonRemoveVanillaData + + ootConvertArmatureToC( + armatureObj, + finalTransform, + f3dType, + isHWv1, + skeletonName, + folderName, + DLFormat.Static, + saveTextures, + exportPath, + isCustomExport, + drawLayer, + removeVanillaData, + ) + + self.report({"INFO"}, "Success!") + return {"FINISHED"} + + except Exception as e: + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + raisePluginError(self, e) + return {"CANCELLED"} # must return a set + class OOT_ExportSkeletonPanel(OOT_Panel): - bl_idname = "OOT_PT_export_skeleton" - bl_label = "OOT Skeleton Exporter" - - # called every frame - def draw(self, context): - col = self.layout.column() - col.operator(OOT_ExportSkeleton.bl_idname) - - prop_split(col, context.scene, 'ootSkeletonExportName', "Skeleton") - if context.scene.ootSkeletonExportUseCustomPath: - prop_split(col, context.scene, 'ootSkeletonExportCustomPath', "Folder") - else: - prop_split(col, context.scene, 'ootSkeletonExportFolderName', "Object") - col.prop(context.scene, "ootSkeletonExportUseCustomPath") - col.prop(context.scene, "ootSkeletonExportOptimize") - if context.scene.ootSkeletonExportOptimize: - b = col.box().column() - b.label(icon = 'LIBRARY_DATA_BROKEN', text = "Do not draw anything in SkelAnime") - b.label(text = "callbacks or cull limbs, will be corrupted.") - - col.operator(OOT_ImportSkeleton.bl_idname) - - prop_split(col, context.scene, 'ootSkeletonImportName', "Skeleton") - if context.scene.ootSkeletonImportUseCustomPath: - prop_split(col, context.scene, 'ootSkeletonImportCustomPath', "File") - else: - prop_split(col, context.scene, 'ootSkeletonImportFolderName', "Object") - prop_split(col, context.scene, "ootActorImportDrawLayer", "Import Draw Layer") - - col.prop(context.scene, "ootSkeletonImportUseCustomPath") - col.prop(context.scene, "ootActorRemoveDoubles") - col.prop(context.scene, "ootActorImportNormals") - col.prop(context.scene, "ootSkeletonRemoveVanillaData") - + bl_idname = "OOT_PT_export_skeleton" + bl_label = "OOT Skeleton Exporter" + + # called every frame + def draw(self, context): + col = self.layout.column() + col.operator(OOT_ExportSkeleton.bl_idname) + + prop_split(col, context.scene, "ootSkeletonExportName", "Skeleton") + if context.scene.ootSkeletonExportUseCustomPath: + prop_split(col, context.scene, "ootSkeletonExportCustomPath", "Folder") + else: + prop_split(col, context.scene, "ootSkeletonExportFolderName", "Object") + col.prop(context.scene, "ootSkeletonExportUseCustomPath") + col.prop(context.scene, "ootSkeletonExportOptimize") + if context.scene.ootSkeletonExportOptimize: + b = col.box().column() + b.label( + icon="LIBRARY_DATA_BROKEN", text="Do not draw anything in SkelAnime" + ) + b.label(text="callbacks or cull limbs, will be corrupted.") + + col.operator(OOT_ImportSkeleton.bl_idname) + + prop_split(col, context.scene, "ootSkeletonImportName", "Skeleton") + if context.scene.ootSkeletonImportUseCustomPath: + prop_split(col, context.scene, "ootSkeletonImportCustomPath", "File") + else: + prop_split(col, context.scene, "ootSkeletonImportFolderName", "Object") + prop_split(col, context.scene, "ootActorImportDrawLayer", "Import Draw Layer") + + col.prop(context.scene, "ootSkeletonImportUseCustomPath") + col.prop(context.scene, "ootActorRemoveDoubles") + col.prop(context.scene, "ootActorImportNormals") + col.prop(context.scene, "ootSkeletonRemoveVanillaData") + class OOT_SkeletonPanel(bpy.types.Panel): - bl_idname = "OOT_PT_skeleton" - bl_label = "OOT Skeleton Properties" - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "object" - bl_options = {'HIDE_HEADER'} - - @classmethod - def poll(cls, context): - return context.scene.gameEditorMode == "OOT" and \ - hasattr(context, "object") and context.object is not None and isinstance(context.object.data, bpy.types.Armature) - - # called every frame - def draw(self, context): - col = self.layout.box().column() - col.box().label(text = "OOT Skeleton Inspector") - prop_split(col, context.object, "ootDrawLayer", "Draw Layer") - prop_split(col, context.object, "ootFarLOD", "LOD Skeleton") - if context.object.ootFarLOD is not None: - col.label(text = "Make sure LOD has same bone structure.", icon = 'BONE_DATA') + bl_idname = "OOT_PT_skeleton" + bl_label = "OOT Skeleton Properties" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "object" + bl_options = {"HIDE_HEADER"} + + @classmethod + def poll(cls, context): + return ( + context.scene.gameEditorMode == "OOT" + and hasattr(context, "object") + and context.object is not None + and isinstance(context.object.data, bpy.types.Armature) + ) + + # called every frame + def draw(self, context): + col = self.layout.box().column() + col.box().label(text="OOT Skeleton Inspector") + prop_split(col, context.object, "ootDrawLayer", "Draw Layer") + prop_split(col, context.object, "ootFarLOD", "LOD Skeleton") + if context.object.ootFarLOD is not None: + col.label(text="Make sure LOD has same bone structure.", icon="BONE_DATA") + class OOT_BonePanel(bpy.types.Panel): - bl_idname = "OOT_PT_bone" - bl_label = "OOT Bone Properties" - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "bone" - bl_options = {'HIDE_HEADER'} - - @classmethod - def poll(cls, context): - return context.scene.gameEditorMode == "OOT" and context.bone is not None - - # called every frame - def draw(self, context): - col = self.layout.box().column() - col.box().label(text = "OOT Bone Inspector") - prop_split(col, context.bone, "ootBoneType", "Bone Type") - if context.bone.ootBoneType == "Custom DL": - prop_split(col, context.bone, "ootCustomDLName", "DL Name") - if context.bone.ootBoneType == "Custom DL" or\ - context.bone.ootBoneType == "Ignore": - col.label(text = "Make sure no geometry is skinned to this bone.", icon = 'BONE_DATA') - - if context.bone.ootBoneType != "Ignore": - col.prop(context.bone.ootDynamicTransform, 'billboard') + bl_idname = "OOT_PT_bone" + bl_label = "OOT Bone Properties" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "bone" + bl_options = {"HIDE_HEADER"} + + @classmethod + def poll(cls, context): + return context.scene.gameEditorMode == "OOT" and context.bone is not None + + # called every frame + def draw(self, context): + col = self.layout.box().column() + col.box().label(text="OOT Bone Inspector") + prop_split(col, context.bone, "ootBoneType", "Bone Type") + if context.bone.ootBoneType == "Custom DL": + prop_split(col, context.bone, "ootCustomDLName", "DL Name") + if ( + context.bone.ootBoneType == "Custom DL" + or context.bone.ootBoneType == "Ignore" + ): + col.label( + text="Make sure no geometry is skinned to this bone.", icon="BONE_DATA" + ) + + if context.bone.ootBoneType != "Ignore": + col.prop(context.bone.ootDynamicTransform, "billboard") + def pollArmature(self, obj): - return isinstance(obj.data, bpy.types.Armature) + return isinstance(obj.data, bpy.types.Armature) + oot_skeleton_classes = ( - OOT_ExportSkeleton, - OOT_ImportSkeleton, + OOT_ExportSkeleton, + OOT_ImportSkeleton, ) oot_skeleton_panels = ( - OOT_ExportSkeletonPanel, - OOT_SkeletonPanel, - OOT_BonePanel, + OOT_ExportSkeletonPanel, + OOT_SkeletonPanel, + OOT_BonePanel, ) + def oot_skeleton_panel_register(): - for cls in oot_skeleton_panels: - register_class(cls) + for cls in oot_skeleton_panels: + register_class(cls) + def oot_skeleton_panel_unregister(): - for cls in oot_skeleton_panels: - unregister_class(cls) + for cls in oot_skeleton_panels: + unregister_class(cls) + def oot_skeleton_register(): - bpy.types.Scene.ootSkeletonExportName = bpy.props.StringProperty( - name = "Skeleton Name", default = "gGerudoRedSkel") - bpy.types.Scene.ootSkeletonExportFolderName = bpy.props.StringProperty( - name = "Skeleton Folder", default = "object_geldb") - bpy.types.Scene.ootSkeletonExportCustomPath = bpy.props.StringProperty( - name ='Custom Skeleton Path', subtype = 'FILE_PATH') - bpy.types.Scene.ootSkeletonExportUseCustomPath = bpy.props.BoolProperty( - name = "Use Custom Path") - bpy.types.Scene.ootSkeletonExportOptimize = bpy.props.BoolProperty( - name = "Optimize", - description = "Applies various optimizations between the limbs in a skeleton. " - + "If enabled, the skeleton limbs must be drawn in their normal order, " - + "with nothing in between and no culling, otherwise the mesh will be corrupted.") - - bpy.types.Scene.ootSkeletonImportName = bpy.props.StringProperty( - name = "Skeleton Name", default = "gGerudoRedSkel") - bpy.types.Scene.ootSkeletonImportFolderName = bpy.props.StringProperty( - name = "Skeleton Folder", default = "object_geldb") - bpy.types.Scene.ootSkeletonImportCustomPath = bpy.props.StringProperty( - name ='Custom Skeleton Path', subtype = 'FILE_PATH') - bpy.types.Scene.ootSkeletonImportUseCustomPath = bpy.props.BoolProperty( - name = "Use Custom Path") - - bpy.types.Scene.ootActorRemoveDoubles = bpy.props.BoolProperty(name = "Remove Doubles On Import", default = True) - bpy.types.Scene.ootActorImportNormals = bpy.props.BoolProperty(name = "Import Normals", default = True) - bpy.types.Scene.ootSkeletonRemoveVanillaData = bpy.props.BoolProperty(name = "Replace Vanilla Headers On Export", default = True) - bpy.types.Scene.ootActorImportDrawLayer = bpy.props.EnumProperty(name = "Import Draw Layer", items = ootEnumDrawLayers) - - bpy.types.Object.ootFarLOD = bpy.props.PointerProperty(type = bpy.types.Object, poll = pollArmature) - - bpy.types.Bone.ootBoneType = bpy.props.EnumProperty(name = 'Bone Type', items = ootEnumBoneType) - bpy.types.Bone.ootDynamicTransform = bpy.props.PointerProperty(type = OOTDynamicTransformProperty) - bpy.types.Bone.ootCustomDLName = bpy.props.StringProperty(name = 'Custom DL', default = "gEmptyDL") - - for cls in oot_skeleton_classes: - register_class(cls) + bpy.types.Scene.ootSkeletonExportName = bpy.props.StringProperty( + name="Skeleton Name", default="gGerudoRedSkel" + ) + bpy.types.Scene.ootSkeletonExportFolderName = bpy.props.StringProperty( + name="Skeleton Folder", default="object_geldb" + ) + bpy.types.Scene.ootSkeletonExportCustomPath = bpy.props.StringProperty( + name="Custom Skeleton Path", subtype="FILE_PATH" + ) + bpy.types.Scene.ootSkeletonExportUseCustomPath = bpy.props.BoolProperty( + name="Use Custom Path" + ) + bpy.types.Scene.ootSkeletonExportOptimize = bpy.props.BoolProperty( + name="Optimize", + description="Applies various optimizations between the limbs in a skeleton. " + + "If enabled, the skeleton limbs must be drawn in their normal order, " + + "with nothing in between and no culling, otherwise the mesh will be corrupted.", + ) + + bpy.types.Scene.ootSkeletonImportName = bpy.props.StringProperty( + name="Skeleton Name", default="gGerudoRedSkel" + ) + bpy.types.Scene.ootSkeletonImportFolderName = bpy.props.StringProperty( + name="Skeleton Folder", default="object_geldb" + ) + bpy.types.Scene.ootSkeletonImportCustomPath = bpy.props.StringProperty( + name="Custom Skeleton Path", subtype="FILE_PATH" + ) + bpy.types.Scene.ootSkeletonImportUseCustomPath = bpy.props.BoolProperty( + name="Use Custom Path" + ) + + bpy.types.Scene.ootActorRemoveDoubles = bpy.props.BoolProperty( + name="Remove Doubles On Import", default=True + ) + bpy.types.Scene.ootActorImportNormals = bpy.props.BoolProperty( + name="Import Normals", default=True + ) + bpy.types.Scene.ootSkeletonRemoveVanillaData = bpy.props.BoolProperty( + name="Replace Vanilla Headers On Export", default=True + ) + bpy.types.Scene.ootActorImportDrawLayer = bpy.props.EnumProperty( + name="Import Draw Layer", items=ootEnumDrawLayers + ) + + bpy.types.Object.ootFarLOD = bpy.props.PointerProperty( + type=bpy.types.Object, poll=pollArmature + ) + + bpy.types.Bone.ootBoneType = bpy.props.EnumProperty( + name="Bone Type", items=ootEnumBoneType + ) + bpy.types.Bone.ootDynamicTransform = bpy.props.PointerProperty( + type=OOTDynamicTransformProperty + ) + bpy.types.Bone.ootCustomDLName = bpy.props.StringProperty( + name="Custom DL", default="gEmptyDL" + ) + + for cls in oot_skeleton_classes: + register_class(cls) + def oot_skeleton_unregister(): - del bpy.types.Scene.ootSkeletonExportName - del bpy.types.Scene.ootSkeletonExportFolderName - del bpy.types.Scene.ootSkeletonExportCustomPath - del bpy.types.Scene.ootSkeletonExportUseCustomPath - del bpy.types.Scene.ootSkeletonExportOptimize - - del bpy.types.Scene.ootSkeletonImportName - del bpy.types.Scene.ootSkeletonImportFolderName - del bpy.types.Scene.ootSkeletonImportCustomPath - del bpy.types.Scene.ootSkeletonImportUseCustomPath - - del bpy.types.Scene.ootActorRemoveDoubles - del bpy.types.Scene.ootActorImportNormals - del bpy.types.Scene.ootSkeletonRemoveVanillaData - del bpy.types.Scene.ootActorImportDrawLayer - - del bpy.types.Object.ootFarLOD - - del bpy.types.Bone.ootBoneType - del bpy.types.Bone.ootDynamicTransform - del bpy.types.Bone.ootCustomDLName - - for cls in reversed(oot_skeleton_classes): - unregister_class(cls) + del bpy.types.Scene.ootSkeletonExportName + del bpy.types.Scene.ootSkeletonExportFolderName + del bpy.types.Scene.ootSkeletonExportCustomPath + del bpy.types.Scene.ootSkeletonExportUseCustomPath + del bpy.types.Scene.ootSkeletonExportOptimize + + del bpy.types.Scene.ootSkeletonImportName + del bpy.types.Scene.ootSkeletonImportFolderName + del bpy.types.Scene.ootSkeletonImportCustomPath + del bpy.types.Scene.ootSkeletonImportUseCustomPath + + del bpy.types.Scene.ootActorRemoveDoubles + del bpy.types.Scene.ootActorImportNormals + del bpy.types.Scene.ootSkeletonRemoveVanillaData + del bpy.types.Scene.ootActorImportDrawLayer + + del bpy.types.Object.ootFarLOD + + del bpy.types.Bone.ootBoneType + del bpy.types.Bone.ootDynamicTransform + del bpy.types.Bone.ootCustomDLName + + for cls in reversed(oot_skeleton_classes): + unregister_class(cls) diff --git a/fast64_internal/oot/oot_spline.py b/fast64_internal/oot/oot_spline.py index 9d125048b..bb313ba45 100644 --- a/fast64_internal/oot/oot_spline.py +++ b/fast64_internal/oot/oot_spline.py @@ -5,93 +5,105 @@ from .oot_utility import * from .oot_scene_room import * + class OOTPath: - def __init__(self, ownerName, splineIndex): - self.ownerName = toAlnum(ownerName) - self.splineIndex = splineIndex - self.points = [] - - def pathName(self): - return self.ownerName + "_pathwayList_" + str(self.splineIndex) + def __init__(self, ownerName, splineIndex): + self.ownerName = toAlnum(ownerName) + self.splineIndex = splineIndex + self.points = [] + + def pathName(self): + return self.ownerName + "_pathwayList_" + str(self.splineIndex) + def ootConvertPath(name, index, obj, transformMatrix): - path = OOTPath(name, index) + path = OOTPath(name, index) + + spline = obj.data.splines[0] + for point in spline.points: + position = transformMatrix @ point.co + path.points.append(position) + # path.speeds.append(int(round(point.radius))) + + return path - spline = obj.data.splines[0] - for point in spline.points: - position = transformMatrix @ point.co - path.points.append(position) - #path.speeds.append(int(round(point.radius))) - - return path def onSplineTypeSet(self, context): - self.splines.active.order_u = 1 + self.splines.active.order_u = 1 + class OOTSplinePanel(bpy.types.Panel): - bl_label = "Spline Inspector" - bl_idname = "OBJECT_PT_OOT_Spline_Inspector" - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "object" - bl_options = {'HIDE_HEADER'} - - @classmethod - def poll(cls, context): - return context.scene.gameEditorMode == "OOT" and (context.object is not None and \ - type(context.object.data) == bpy.types.Curve) - - def draw(self, context): - box = self.layout.box() - box.box().label(text = 'OOT Spline Inspector') - curve = context.object.data - if curve.splines[0].type != 'NURBS': - box.label(text = 'Only NURBS curves are compatible.') - else: - prop_split(box, context.object.ootSplineProperty, "index", "Index") - - #drawParentSceneRoom(box, context.object) + bl_label = "Spline Inspector" + bl_idname = "OBJECT_PT_OOT_Spline_Inspector" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "object" + bl_options = {"HIDE_HEADER"} + + @classmethod + def poll(cls, context): + return context.scene.gameEditorMode == "OOT" and ( + context.object is not None and type(context.object.data) == bpy.types.Curve + ) + + def draw(self, context): + box = self.layout.box() + box.box().label(text="OOT Spline Inspector") + curve = context.object.data + if curve.splines[0].type != "NURBS": + box.label(text="Only NURBS curves are compatible.") + else: + prop_split(box, context.object.ootSplineProperty, "index", "Index") + + # drawParentSceneRoom(box, context.object) + class OOTSplineProperty(bpy.types.PropertyGroup): - index : bpy.props.IntProperty(default = 0, min = 0) + index: bpy.props.IntProperty(default=0, min=0) + def assertCurveValid(obj): - curve = obj.data - if not isinstance(curve, bpy.types.Curve) or curve.splines[0].type != 'NURBS': - # Curve was likely not intended to be exported - return False - if len(curve.splines) != 1: - # Curve was intended to be exported but has multiple disconnected segments - raise PluginError('Exported curves should have only one single segment, found ' + str(len(curve.splines))) - return True + curve = obj.data + if not isinstance(curve, bpy.types.Curve) or curve.splines[0].type != "NURBS": + # Curve was likely not intended to be exported + return False + if len(curve.splines) != 1: + # Curve was intended to be exported but has multiple disconnected segments + raise PluginError( + "Exported curves should have only one single segment, found " + + str(len(curve.splines)) + ) + return True + + +oot_spline_classes = (OOTSplineProperty,) -oot_spline_classes = ( - OOTSplineProperty, -) +oot_spline_panel_classes = (OOTSplinePanel,) -oot_spline_panel_classes = ( - OOTSplinePanel, -) def oot_spline_panel_register(): - for cls in oot_spline_panel_classes: - register_class(cls) + for cls in oot_spline_panel_classes: + register_class(cls) + def oot_spline_panel_unregister(): - for cls in oot_spline_panel_classes: - unregister_class(cls) + for cls in oot_spline_panel_classes: + unregister_class(cls) def oot_spline_register(): - for cls in oot_spline_classes: - register_class(cls) - - bpy.types.Object.ootSplineProperty = bpy.props.PointerProperty(type = OOTSplineProperty) + for cls in oot_spline_classes: + register_class(cls) + + bpy.types.Object.ootSplineProperty = bpy.props.PointerProperty( + type=OOTSplineProperty + ) + def oot_spline_unregister(): - for cls in reversed(oot_spline_classes): - unregister_class(cls) + for cls in reversed(oot_spline_classes): + unregister_class(cls) - del bpy.types.Object.ootSplineProperty \ No newline at end of file + del bpy.types.Object.ootSplineProperty diff --git a/fast64_internal/oot/oot_utility.py b/fast64_internal/oot/oot_utility.py index 65b9293df..cb0caaa11 100644 --- a/fast64_internal/oot/oot_utility.py +++ b/fast64_internal/oot/oot_utility.py @@ -3,599 +3,695 @@ from bpy.utils import register_class, unregister_class ootSceneDungeons = [ - "bdan", - "bdan_boss", - "Bmori1", - "ddan", - "ddan_boss", - "FIRE_bs", - "ganon", - "ganontika", - "ganontikasonogo", - "ganon_boss", - "ganon_demo", - "ganon_final", - "ganon_sonogo", - "ganon_tou", - "gerudoway", - "HAKAdan", - "HAKAdanCH", - "HAKAdan_bs", - "HIDAN", - "ice_doukutu", - "jyasinboss", - "jyasinzou", - "men", - "MIZUsin", - "MIZUsin_bs", - "moribossroom", - "ydan", - "ydan_boss", + "bdan", + "bdan_boss", + "Bmori1", + "ddan", + "ddan_boss", + "FIRE_bs", + "ganon", + "ganontika", + "ganontikasonogo", + "ganon_boss", + "ganon_demo", + "ganon_final", + "ganon_sonogo", + "ganon_tou", + "gerudoway", + "HAKAdan", + "HAKAdanCH", + "HAKAdan_bs", + "HIDAN", + "ice_doukutu", + "jyasinboss", + "jyasinzou", + "men", + "MIZUsin", + "MIZUsin_bs", + "moribossroom", + "ydan", + "ydan_boss", ] ootSceneIndoors = [ - "bowling", - "daiyousei_izumi", - "hairal_niwa", - "hairal_niwa2", - "hairal_niwa_n", - "hakasitarelay", - "hut", - "hylia_labo", - "impa", - "kakariko", - "kenjyanoma", - "kokiri_home", - "kokiri_home3", - "kokiri_home4", - "kokiri_home5", - "labo", - "link_home", - "mahouya", - "malon_stable", - "miharigoya", - "nakaniwa", - "syatekijyou", - "takaraya", - "tent", - "tokinoma", - "yousei_izumi_tate", - "yousei_izumi_yoko", + "bowling", + "daiyousei_izumi", + "hairal_niwa", + "hairal_niwa2", + "hairal_niwa_n", + "hakasitarelay", + "hut", + "hylia_labo", + "impa", + "kakariko", + "kenjyanoma", + "kokiri_home", + "kokiri_home3", + "kokiri_home4", + "kokiri_home5", + "labo", + "link_home", + "mahouya", + "malon_stable", + "miharigoya", + "nakaniwa", + "syatekijyou", + "takaraya", + "tent", + "tokinoma", + "yousei_izumi_tate", + "yousei_izumi_yoko", ] ootSceneMisc = [ - "enrui", - "entra_n", - "hakaana", - "hakaana2", - "hakaana_ouke", - "hiral_demo", - "kakariko3", - "kakusiana", - "kinsuta", - "market_alley", - "market_alley_n", - "market_day", - "market_night", - "market_ruins", - "shrine", - "shrine_n", - "shrine_r", - "turibori", + "enrui", + "entra_n", + "hakaana", + "hakaana2", + "hakaana_ouke", + "hiral_demo", + "kakariko3", + "kakusiana", + "kinsuta", + "market_alley", + "market_alley_n", + "market_day", + "market_night", + "market_ruins", + "shrine", + "shrine_n", + "shrine_r", + "turibori", ] ootSceneOverworld = [ - "entra", - "souko", - "spot00", - "spot01", - "spot02", - "spot03", - "spot04", - "spot05", - "spot06", - "spot07", - "spot08", - "spot09", - "spot10", - "spot11", - "spot12", - "spot13", - "spot15", - "spot16", - "spot17", - "spot18", - "spot20", + "entra", + "souko", + "spot00", + "spot01", + "spot02", + "spot03", + "spot04", + "spot05", + "spot06", + "spot07", + "spot08", + "spot09", + "spot10", + "spot11", + "spot12", + "spot13", + "spot15", + "spot16", + "spot17", + "spot18", + "spot20", ] ootSceneShops = [ - "alley_shop", - "drag", - "face_shop", - "golon", - "kokiri_shop", - "night_shop", - "shop1", - "zoora", + "alley_shop", + "drag", + "face_shop", + "golon", + "kokiri_shop", + "night_shop", + "shop1", + "zoora", ] ootSceneTest_levels = [ - "besitu", - "depth_test", - "sasatest", - "sutaru", - "syotes", - "syotes2", - "test01", - "testroom", + "besitu", + "depth_test", + "sasatest", + "sutaru", + "syotes", + "syotes2", + "test01", + "testroom", ] ootSceneDirs = { - 'assets/scenes/dungeons/' : ootSceneDungeons, - 'assets/scenes/indoors/' : ootSceneIndoors, - 'assets/scenes/misc/' : ootSceneMisc, - 'assets/scenes/overworld/' : ootSceneOverworld, - 'assets/scenes/shops/' : ootSceneShops, - 'assets/scenes/test_levels/' : ootSceneTest_levels, + "assets/scenes/dungeons/": ootSceneDungeons, + "assets/scenes/indoors/": ootSceneIndoors, + "assets/scenes/misc/": ootSceneMisc, + "assets/scenes/overworld/": ootSceneOverworld, + "assets/scenes/shops/": ootSceneShops, + "assets/scenes/test_levels/": ootSceneTest_levels, } + def addIncludeFiles(objectName, objectPath, assetName): - addIncludeFilesExtension(objectName, objectPath, assetName, 'h') - addIncludeFilesExtension(objectName, objectPath, assetName, 'c') + addIncludeFilesExtension(objectName, objectPath, assetName, "h") + addIncludeFilesExtension(objectName, objectPath, assetName, "c") + def addIncludeFilesExtension(objectName, objectPath, assetName, extension): - include = "#include \"" + assetName + "." + extension + "\"\n" - if not os.path.exists(objectPath): - raise PluginError(objectPath + " does not exist.") - path = os.path.join(objectPath, objectName + '.' + extension) - data = getDataFromFile(path) - - if include not in data: - data += '\n' + include - - # Save this regardless of modification so it will be recompiled. - saveDataToFile(path, data) - + include = '#include "' + assetName + "." + extension + '"\n' + if not os.path.exists(objectPath): + raise PluginError(objectPath + " does not exist.") + path = os.path.join(objectPath, objectName + "." + extension) + data = getDataFromFile(path) + + if include not in data: + data += "\n" + include + + # Save this regardless of modification so it will be recompiled. + saveDataToFile(path, data) + def getSceneDirFromLevelName(name): - for sceneDir, dirLevels in ootSceneDirs.items(): - if name in dirLevels: - return sceneDir + name - return None + for sceneDir, dirLevels in ootSceneDirs.items(): + if name in dirLevels: + return sceneDir + name + return None + class ExportInfo: - def __init__(self, isCustomExport, exportPath, customSubPath, name): - self.isCustomExportPath = isCustomExport - self.exportPath = exportPath - self.customSubPath = customSubPath - self.name = name + def __init__(self, isCustomExport, exportPath, customSubPath, name): + self.isCustomExportPath = isCustomExport + self.exportPath = exportPath + self.customSubPath = customSubPath + self.name = name + class OOTObjectCategorizer: - def __init__(self): - self.sceneObj = None - self.roomObjs = [] - self.actors = [] - self.transitionActors = [] - self.meshes = [] - self.entrances = [] - self.waterBoxes = [] - - def sortObjects(self, allObjs): - for obj in allObjs: - if obj.data is None: - if obj.ootEmptyType == "Actor": - self.actors.append(obj) - elif obj.ootEmptyType == "Transition Actor": - self.transitionActors.append(obj) - elif obj.ootEmptyType == "Entrance": - self.entrances.append(obj) - elif obj.ootEmptyType == "Water Box": - self.waterBoxes.append(obj) - elif obj.ootEmptyType == "Room": - self.roomObjs.append(obj) - elif obj.ootEmptyType == "Scene": - self.sceneObj = obj - elif isinstance(obj.data, bpy.types.Mesh): - self.meshes.append(obj) + def __init__(self): + self.sceneObj = None + self.roomObjs = [] + self.actors = [] + self.transitionActors = [] + self.meshes = [] + self.entrances = [] + self.waterBoxes = [] + + def sortObjects(self, allObjs): + for obj in allObjs: + if obj.data is None: + if obj.ootEmptyType == "Actor": + self.actors.append(obj) + elif obj.ootEmptyType == "Transition Actor": + self.transitionActors.append(obj) + elif obj.ootEmptyType == "Entrance": + self.entrances.append(obj) + elif obj.ootEmptyType == "Water Box": + self.waterBoxes.append(obj) + elif obj.ootEmptyType == "Room": + self.roomObjs.append(obj) + elif obj.ootEmptyType == "Scene": + self.sceneObj = obj + elif isinstance(obj.data, bpy.types.Mesh): + self.meshes.append(obj) + # This also sets all origins relative to the scene object. def ootDuplicateHierarchy(obj, ignoreAttr, includeEmpties, objectCategorizer): - # Duplicate objects to apply scale / modifiers / linked data - bpy.ops.object.select_all(action = 'DESELECT') - ootSelectMeshChildrenOnly(obj, includeEmpties) - obj.select_set(True) - bpy.context.view_layer.objects.active = obj - bpy.ops.object.duplicate() - try: - tempObj = bpy.context.view_layer.objects.active - allObjs = bpy.context.selected_objects - bpy.ops.object.make_single_user(obdata = True) - - objectCategorizer.sortObjects(allObjs) - meshObjs = objectCategorizer.meshes - bpy.ops.object.select_all(action = 'DESELECT') - for selectedObj in meshObjs: - selectedObj.select_set(True) - bpy.ops.object.transform_apply(location = False, - rotation = True, scale = True, properties = False) - - for selectedObj in meshObjs: - bpy.ops.object.select_all(action = 'DESELECT') - selectedObj.select_set(True) - bpy.context.view_layer.objects.active = selectedObj - for modifier in selectedObj.modifiers: - attemptModifierApply(modifier) - for selectedObj in meshObjs: - setOrigin(obj, selectedObj) - if ignoreAttr is not None: - for selectedObj in meshObjs: - if getattr(selectedObj, ignoreAttr): - for child in selectedObj.children: - bpy.ops.object.select_all(action = 'DESELECT') - child.select_set(True) - bpy.ops.object.parent_clear(type='CLEAR_KEEP_TRANSFORM') - selectedObj.parent.select_set(True) - bpy.ops.object.parent_set(keep_transform = True) - selectedObj.parent = None - - # Assume objects with these types of constraints are parented, and are - # intended to be parented in-game, i.e. rendered as an extra DL alongside - # a skeletal mesh, e.g. for a character to be wearing or holding it. - # In this case we purely want the transformation of the object relative - # to whatever it's parented to. Getting rid of the constraint and then - # doing transform_apply() sets up this transformation. - hasConstraint = False - for constraint in tempObj.constraints: - if constraint.type in {'COPY_LOCATION', 'COPY_ROTATION', 'COPY_SCALE', - 'COPY_TRANSFORMS', 'TRANSFORM', 'CHILD_OF', 'CLAMP_TO', 'DAMPED_TRACK', - 'LOCKED_TRACK', 'TRACK_TO'} and not constraint.mute: - hasConstraint = True - tempObj.constraints.remove(constraint) - if not hasConstraint: - # For normal objects, the game's coordinate system is 90 degrees - # away from Blender's. - applyRotation([tempObj], math.radians(90), 'X') - else: - # This is a relative transform we care about so the 90 degrees - # doesn't matter (since they're both right-handed). - print('Applying transform') - bpy.ops.object.select_all(action = "DESELECT") - tempObj.select_set(True) - bpy.context.view_layer.objects.active = tempObj - bpy.ops.object.transform_apply() - - return tempObj, allObjs - except Exception as e: - cleanupDuplicatedObjects(allObjs) - obj.select_set(True) - bpy.context.view_layer.objects.active = obj - raise Exception(str(e)) + # Duplicate objects to apply scale / modifiers / linked data + bpy.ops.object.select_all(action="DESELECT") + ootSelectMeshChildrenOnly(obj, includeEmpties) + obj.select_set(True) + bpy.context.view_layer.objects.active = obj + bpy.ops.object.duplicate() + try: + tempObj = bpy.context.view_layer.objects.active + allObjs = bpy.context.selected_objects + bpy.ops.object.make_single_user(obdata=True) + + objectCategorizer.sortObjects(allObjs) + meshObjs = objectCategorizer.meshes + bpy.ops.object.select_all(action="DESELECT") + for selectedObj in meshObjs: + selectedObj.select_set(True) + bpy.ops.object.transform_apply( + location=False, rotation=True, scale=True, properties=False + ) + + for selectedObj in meshObjs: + bpy.ops.object.select_all(action="DESELECT") + selectedObj.select_set(True) + bpy.context.view_layer.objects.active = selectedObj + for modifier in selectedObj.modifiers: + attemptModifierApply(modifier) + for selectedObj in meshObjs: + setOrigin(obj, selectedObj) + if ignoreAttr is not None: + for selectedObj in meshObjs: + if getattr(selectedObj, ignoreAttr): + for child in selectedObj.children: + bpy.ops.object.select_all(action="DESELECT") + child.select_set(True) + bpy.ops.object.parent_clear(type="CLEAR_KEEP_TRANSFORM") + selectedObj.parent.select_set(True) + bpy.ops.object.parent_set(keep_transform=True) + selectedObj.parent = None + + # Assume objects with these types of constraints are parented, and are + # intended to be parented in-game, i.e. rendered as an extra DL alongside + # a skeletal mesh, e.g. for a character to be wearing or holding it. + # In this case we purely want the transformation of the object relative + # to whatever it's parented to. Getting rid of the constraint and then + # doing transform_apply() sets up this transformation. + hasConstraint = False + for constraint in tempObj.constraints: + if ( + constraint.type + in { + "COPY_LOCATION", + "COPY_ROTATION", + "COPY_SCALE", + "COPY_TRANSFORMS", + "TRANSFORM", + "CHILD_OF", + "CLAMP_TO", + "DAMPED_TRACK", + "LOCKED_TRACK", + "TRACK_TO", + } + and not constraint.mute + ): + hasConstraint = True + tempObj.constraints.remove(constraint) + if not hasConstraint: + # For normal objects, the game's coordinate system is 90 degrees + # away from Blender's. + applyRotation([tempObj], math.radians(90), "X") + else: + # This is a relative transform we care about so the 90 degrees + # doesn't matter (since they're both right-handed). + print("Applying transform") + bpy.ops.object.select_all(action="DESELECT") + tempObj.select_set(True) + bpy.context.view_layer.objects.active = tempObj + bpy.ops.object.transform_apply() + + return tempObj, allObjs + except Exception as e: + cleanupDuplicatedObjects(allObjs) + obj.select_set(True) + bpy.context.view_layer.objects.active = obj + raise Exception(str(e)) + def ootSelectMeshChildrenOnly(obj, includeEmpties): - isMesh = isinstance(obj.data, bpy.types.Mesh) - isEmpty = (obj.data is None or \ - isinstance(obj.data, bpy.types.Camera) or\ - isinstance(obj.data, bpy.types.Curve)) and includeEmpties - if (isMesh or isEmpty): - obj.select_set(True) - obj.original_name = obj.name - for child in obj.children: - ootSelectMeshChildrenOnly(child, includeEmpties) + isMesh = isinstance(obj.data, bpy.types.Mesh) + isEmpty = ( + obj.data is None + or isinstance(obj.data, bpy.types.Camera) + or isinstance(obj.data, bpy.types.Curve) + ) and includeEmpties + if isMesh or isEmpty: + obj.select_set(True) + obj.original_name = obj.name + for child in obj.children: + ootSelectMeshChildrenOnly(child, includeEmpties) + def ootCleanupScene(originalSceneObj, allObjs): - cleanupDuplicatedObjects(allObjs) - originalSceneObj.select_set(True) - bpy.context.view_layer.objects.active = originalSceneObj + cleanupDuplicatedObjects(allObjs) + originalSceneObj.select_set(True) + bpy.context.view_layer.objects.active = originalSceneObj + def getSceneObj(obj): - while not (obj is None or (obj is not None and obj.data is None and obj.ootEmptyType == "Scene")): - obj = obj.parent - if obj is None: - return None - else: - return obj + while not ( + obj is None + or (obj is not None and obj.data is None and obj.ootEmptyType == "Scene") + ): + obj = obj.parent + if obj is None: + return None + else: + return obj + def getRoomObj(obj): - while not (obj is None or (obj is not None and obj.data is None and obj.ootEmptyType == "Room")): - obj = obj.parent - if obj is None: - return None - else: - return obj + while not ( + obj is None + or (obj is not None and obj.data is None and obj.ootEmptyType == "Room") + ): + obj = obj.parent + if obj is None: + return None + else: + return obj + def checkEmptyName(name): - if name == "": - raise PluginError("No name entered for the exporter.") + if name == "": + raise PluginError("No name entered for the exporter.") + def ootGetObjectPath(isCustomExport, exportPath, folderName): - if isCustomExport: - filepath = exportPath - else: - filepath = os.path.join(ootGetPath(exportPath, isCustomExport, 'assets/objects/', - folderName, False, False), folderName + '.c') - return filepath - - -def ootGetPath(exportPath, isCustomExport, subPath, folderName, makeIfNotExists, useFolderForCustom): - if isCustomExport: - path = bpy.path.abspath(os.path.join(exportPath, (folderName if useFolderForCustom else ''))) - else: - if bpy.context.scene.ootDecompPath == "": - raise PluginError("Decomp base path is empty.") - path = bpy.path.abspath(os.path.join(bpy.context.scene.ootDecompPath, subPath + folderName)) - - if not os.path.exists(path): - if isCustomExport or makeIfNotExists: - os.makedirs(path) - else: - raise PluginError(path + " does not exist.") - - return path + if isCustomExport: + filepath = exportPath + else: + filepath = os.path.join( + ootGetPath( + exportPath, isCustomExport, "assets/objects/", folderName, False, False + ), + folderName + ".c", + ) + return filepath + + +def ootGetPath( + exportPath, isCustomExport, subPath, folderName, makeIfNotExists, useFolderForCustom +): + if isCustomExport: + path = bpy.path.abspath( + os.path.join(exportPath, (folderName if useFolderForCustom else "")) + ) + else: + if bpy.context.scene.ootDecompPath == "": + raise PluginError("Decomp base path is empty.") + path = bpy.path.abspath( + os.path.join(bpy.context.scene.ootDecompPath, subPath + folderName) + ) + + if not os.path.exists(path): + if isCustomExport or makeIfNotExists: + os.makedirs(path) + else: + raise PluginError(path + " does not exist.") + + return path + def getSortedChildren(armatureObj, bone): - return sorted([child.name for child in bone.children if child.ootBoneType != "Ignore"], key = lambda childName : childName.lower()) + return sorted( + [child.name for child in bone.children if child.ootBoneType != "Ignore"], + key=lambda childName: childName.lower(), + ) + def getStartBone(armatureObj): - startBoneNames = [bone.name for bone in armatureObj.data.bones if \ - bone.parent is None and bone.ootBoneType != "Ignore"] - if len(startBoneNames) == 0: - raise PluginError(armatureObj.name + " does not have any root bones that are not of the \"Ignore\" type.") - startBoneName = startBoneNames[0] - return startBoneName - #return 'root' + startBoneNames = [ + bone.name + for bone in armatureObj.data.bones + if bone.parent is None and bone.ootBoneType != "Ignore" + ] + if len(startBoneNames) == 0: + raise PluginError( + armatureObj.name + + ' does not have any root bones that are not of the "Ignore" type.' + ) + startBoneName = startBoneNames[0] + return startBoneName + # return 'root' + def checkForStartBone(armatureObj): - pass - #if "root" not in armatureObj.data.bones: - # raise PluginError("Skeleton must have a bone named 'root' where the skeleton starts from.") + pass + # if "root" not in armatureObj.data.bones: + # raise PluginError("Skeleton must have a bone named 'root' where the skeleton starts from.") + class BoxEmpty: - def __init__(self, position, scale, emptyScale): - # The scale ordering is due to the fact that scaling happens AFTER rotation. - # Thus the translation uses Y-up, while the scale uses Z-up. - self.low = (position[0] - scale[0] * emptyScale, position[2] - scale[1] * emptyScale) - self.high = (position[0] + scale[0] * emptyScale, position[2] + scale[1] * emptyScale) - self.height = position[1] + scale[2] * emptyScale + def __init__(self, position, scale, emptyScale): + # The scale ordering is due to the fact that scaling happens AFTER rotation. + # Thus the translation uses Y-up, while the scale uses Z-up. + self.low = ( + position[0] - scale[0] * emptyScale, + position[2] - scale[1] * emptyScale, + ) + self.high = ( + position[0] + scale[0] * emptyScale, + position[2] + scale[1] * emptyScale, + ) + self.height = position[1] + scale[2] * emptyScale + + self.low = [int(round(value)) for value in self.low] + self.high = [int(round(value)) for value in self.high] + self.height = int(round(self.height)) - self.low = [int(round(value)) for value in self.low] - self.high = [int(round(value)) for value in self.high] - self.height = int(round(self.height)) def checkUniformScale(scale, obj): - if abs(scale[0] - scale[1]) > 0.01 or\ - abs(scale[1] - scale[2]) > 0.01 or\ - abs(scale[0] - scale[2]) > 0.01: - raise PluginError("Cull group " + obj.name + " must have a uniform scale.") + if ( + abs(scale[0] - scale[1]) > 0.01 + or abs(scale[1] - scale[2]) > 0.01 + or abs(scale[0] - scale[2]) > 0.01 + ): + raise PluginError("Cull group " + obj.name + " must have a uniform scale.") + class CullGroup: - def __init__(self, position, scale, emptyScale): - self.position = [int(round(field)) for field in position] - self.cullDepth = abs(int(round(scale[0] * emptyScale))) + def __init__(self, position, scale, emptyScale): + self.position = [int(round(field)) for field in position] + self.cullDepth = abs(int(round(scale[0] * emptyScale))) + def getCustomProperty(data, prop): - value = getattr(data, prop) - return value if value != "Custom" else getattr(data, prop + str("Custom")) + value = getattr(data, prop) + return value if value != "Custom" else getattr(data, prop + str("Custom")) + def convertIntTo2sComplement(value, length, signed): - return int.from_bytes(int(round(value)).to_bytes(length, 'big', signed = signed), 'big') + return int.from_bytes( + int(round(value)).to_bytes(length, "big", signed=signed), "big" + ) + def drawEnumWithCustom(panel, data, attribute, name, customName): - prop_split(panel, data, attribute, name) - if getattr(data, attribute) == "Custom": - prop_split(panel, data, attribute + "Custom", customName) + prop_split(panel, data, attribute, name) + if getattr(data, attribute) == "Custom": + prop_split(panel, data, attribute + "Custom", customName) + def clampShort(value): - return min(max(round(value), -2**15), 2**15 - 1) + return min(max(round(value), -(2 ** 15)), 2 ** 15 - 1) + def convertNormalizedFloatToShort(value): - value *= 2**15 - value = clampShort(value) - - return int.from_bytes(int(value).to_bytes(2, 'big', signed = True), 'big') + value *= 2 ** 15 + value = clampShort(value) + + return int.from_bytes(int(value).to_bytes(2, "big", signed=True), "big") + def convertNormalizedVectorToShort(value): - return ( - convertNormalizedFloatToShort(value[0]), - convertNormalizedFloatToShort(value[1]), - convertNormalizedFloatToShort(value[2]), - ) + return ( + convertNormalizedFloatToShort(value[0]), + convertNormalizedFloatToShort(value[1]), + convertNormalizedFloatToShort(value[2]), + ) + def getEnumName(enumItems, value): - for enumTuple in enumItems: - if enumTuple[0] == value: - return enumTuple[1] - raise PluginError("Could not find enum value " + str(value)) + for enumTuple in enumItems: + if enumTuple[0] == value: + return enumTuple[1] + raise PluginError("Could not find enum value " + str(value)) + def ootConvertTranslation(translation): - return [int(round(value)) for value in translation] + return [int(round(value)) for value in translation] + def ootConvertRotation(rotation): - # see BINANG_TO_DEGF - return [int(round((math.degrees(value) % 360) / 360 * (2**16))) % (2**16) for value in rotation.to_euler()] + # see BINANG_TO_DEGF + return [ + int(round((math.degrees(value) % 360) / 360 * (2 ** 16))) % (2 ** 16) + for value in rotation.to_euler() + ] + def getCutsceneName(obj): - name = obj.name - if name.startswith('Cutscene.'): - name = name[9:] - name = name.replace('.', '_') - return name + name = obj.name + if name.startswith("Cutscene."): + name = name[9:] + name = name.replace(".", "_") + return name + def getCollectionFromIndex(obj, prop, subIndex, isRoom): - if not isRoom: - header0 = obj.ootSceneHeader - header1 = obj.ootAlternateSceneHeaders.childNightHeader - header2 = obj.ootAlternateSceneHeaders.adultDayHeader - header3 = obj.ootAlternateSceneHeaders.adultNightHeader - cutsceneHeaders = obj.ootAlternateSceneHeaders.cutsceneHeaders - else: - header0 = obj.ootRoomHeader - header1 = obj.ootAlternateRoomHeaders.childNightHeader - header2 = obj.ootAlternateRoomHeaders.adultDayHeader - header3 = obj.ootAlternateRoomHeaders.adultNightHeader - cutsceneHeaders = obj.ootAlternateRoomHeaders.cutsceneHeaders - - if subIndex < 0: - raise PluginError("Alternate scene header index too low: " + str(subIndex)) - elif subIndex == 0: - collection = getattr(header0, prop) - elif subIndex == 1: - collection = getattr(header1, prop) - elif subIndex == 2: - collection = getattr(header2, prop) - elif subIndex == 3: - collection = getattr(header3, prop) - else: - collection = getattr(cutsceneHeaders[subIndex - 4], prop) - return collection + if not isRoom: + header0 = obj.ootSceneHeader + header1 = obj.ootAlternateSceneHeaders.childNightHeader + header2 = obj.ootAlternateSceneHeaders.adultDayHeader + header3 = obj.ootAlternateSceneHeaders.adultNightHeader + cutsceneHeaders = obj.ootAlternateSceneHeaders.cutsceneHeaders + else: + header0 = obj.ootRoomHeader + header1 = obj.ootAlternateRoomHeaders.childNightHeader + header2 = obj.ootAlternateRoomHeaders.adultDayHeader + header3 = obj.ootAlternateRoomHeaders.adultNightHeader + cutsceneHeaders = obj.ootAlternateRoomHeaders.cutsceneHeaders + + if subIndex < 0: + raise PluginError("Alternate scene header index too low: " + str(subIndex)) + elif subIndex == 0: + collection = getattr(header0, prop) + elif subIndex == 1: + collection = getattr(header1, prop) + elif subIndex == 2: + collection = getattr(header2, prop) + elif subIndex == 3: + collection = getattr(header3, prop) + else: + collection = getattr(cutsceneHeaders[subIndex - 4], prop) + return collection + # Operators cannot store mutable references (?), so to reuse PropertyCollection modification code we do this. # Save a string identifier in the operator, then choose the member variable based on that. # subIndex is for a collection within a collection element def getCollection(objName, collectionType, subIndex): - obj = bpy.data.objects[objName] - if collectionType == "Actor": - collection = obj.ootActorProperty.headerSettings.cutsceneHeaders - elif collectionType == "Transition Actor": - collection = obj.ootTransitionActorProperty.actor.headerSettings.cutsceneHeaders - elif collectionType == "Entrance": - collection = obj.ootEntranceProperty.actor.headerSettings.cutsceneHeaders - elif collectionType == "Room": - collection = obj.ootAlternateRoomHeaders.cutsceneHeaders - elif collectionType == "Scene": - collection = obj.ootAlternateSceneHeaders.cutsceneHeaders - elif collectionType == "Light": - collection = getCollectionFromIndex(obj, 'lightList', subIndex, False) - elif collectionType == "Exit": - collection = getCollectionFromIndex(obj, 'exitList', subIndex, False) - elif collectionType == "Object": - collection = getCollectionFromIndex(obj, 'objectList', subIndex, True) - elif collectionType.startswith("CSHdr."): - # CSHdr.HeaderNumber[.ListType] - # Specifying ListType means uses subIndex - toks = collectionType.split('.') - assert len(toks) in [2, 3] - hdrnum = int(toks[1]) - collection = getCollectionFromIndex(obj, 'csLists', hdrnum, False) - if len(toks) == 3: - collection = getattr(collection[subIndex], toks[2]) - elif collectionType.startswith("Cutscene."): - # Cutscene.ListType - toks = collectionType.split('.') - assert len(toks) == 2 - collection = obj.ootCutsceneProperty.csLists - collection = getattr(collection[subIndex], toks[1]) - elif collectionType == "Cutscene": - collection = obj.ootCutsceneProperty.csLists - elif collectionType == "extraCutscenes": - collection = obj.ootSceneHeader.extraCutscenes - else: - raise PluginError("Invalid collection type: " + collectionType) - - return collection + obj = bpy.data.objects[objName] + if collectionType == "Actor": + collection = obj.ootActorProperty.headerSettings.cutsceneHeaders + elif collectionType == "Transition Actor": + collection = obj.ootTransitionActorProperty.actor.headerSettings.cutsceneHeaders + elif collectionType == "Entrance": + collection = obj.ootEntranceProperty.actor.headerSettings.cutsceneHeaders + elif collectionType == "Room": + collection = obj.ootAlternateRoomHeaders.cutsceneHeaders + elif collectionType == "Scene": + collection = obj.ootAlternateSceneHeaders.cutsceneHeaders + elif collectionType == "Light": + collection = getCollectionFromIndex(obj, "lightList", subIndex, False) + elif collectionType == "Exit": + collection = getCollectionFromIndex(obj, "exitList", subIndex, False) + elif collectionType == "Object": + collection = getCollectionFromIndex(obj, "objectList", subIndex, True) + elif collectionType.startswith("CSHdr."): + # CSHdr.HeaderNumber[.ListType] + # Specifying ListType means uses subIndex + toks = collectionType.split(".") + assert len(toks) in [2, 3] + hdrnum = int(toks[1]) + collection = getCollectionFromIndex(obj, "csLists", hdrnum, False) + if len(toks) == 3: + collection = getattr(collection[subIndex], toks[2]) + elif collectionType.startswith("Cutscene."): + # Cutscene.ListType + toks = collectionType.split(".") + assert len(toks) == 2 + collection = obj.ootCutsceneProperty.csLists + collection = getattr(collection[subIndex], toks[1]) + elif collectionType == "Cutscene": + collection = obj.ootCutsceneProperty.csLists + elif collectionType == "extraCutscenes": + collection = obj.ootSceneHeader.extraCutscenes + else: + raise PluginError("Invalid collection type: " + collectionType) + + return collection + def drawAddButton(layout, index, collectionType, subIndex, objName): - if subIndex is None: - subIndex = 0 - addOp = layout.operator(OOTCollectionAdd.bl_idname) - addOp.option = index - addOp.collectionType = collectionType - addOp.subIndex = subIndex - addOp.objName = objName + if subIndex is None: + subIndex = 0 + addOp = layout.operator(OOTCollectionAdd.bl_idname) + addOp.option = index + addOp.collectionType = collectionType + addOp.subIndex = subIndex + addOp.objName = objName + def drawCollectionOps(layout, index, collectionType, subIndex, objName, allowAdd=True): - if subIndex is None: - subIndex = 0 - - buttons = layout.row(align = True) - - if allowAdd: - addOp = buttons.operator(OOTCollectionAdd.bl_idname, text = 'Add', icon = "ADD") - addOp.option = index + 1 - addOp.collectionType = collectionType - addOp.subIndex = subIndex - addOp.objName = objName - - removeOp = buttons.operator(OOTCollectionRemove.bl_idname, text = 'Delete', icon = "REMOVE") - removeOp.option = index - removeOp.collectionType = collectionType - removeOp.subIndex = subIndex - removeOp.objName = objName - - moveUp = buttons.operator(OOTCollectionMove.bl_idname, text = 'Up', icon = "TRIA_UP") - moveUp.option = index - moveUp.offset = -1 - moveUp.collectionType = collectionType - moveUp.subIndex = subIndex - moveUp.objName = objName - - moveDown = buttons.operator(OOTCollectionMove.bl_idname, text = 'Down', icon = "TRIA_DOWN") - moveDown.option = index - moveDown.offset = 1 - moveDown.collectionType = collectionType - moveDown.subIndex = subIndex - moveDown.objName = objName + if subIndex is None: + subIndex = 0 + + buttons = layout.row(align=True) + + if allowAdd: + addOp = buttons.operator(OOTCollectionAdd.bl_idname, text="Add", icon="ADD") + addOp.option = index + 1 + addOp.collectionType = collectionType + addOp.subIndex = subIndex + addOp.objName = objName + + removeOp = buttons.operator( + OOTCollectionRemove.bl_idname, text="Delete", icon="REMOVE" + ) + removeOp.option = index + removeOp.collectionType = collectionType + removeOp.subIndex = subIndex + removeOp.objName = objName + + moveUp = buttons.operator(OOTCollectionMove.bl_idname, text="Up", icon="TRIA_UP") + moveUp.option = index + moveUp.offset = -1 + moveUp.collectionType = collectionType + moveUp.subIndex = subIndex + moveUp.objName = objName + + moveDown = buttons.operator( + OOTCollectionMove.bl_idname, text="Down", icon="TRIA_DOWN" + ) + moveDown.option = index + moveDown.offset = 1 + moveDown.collectionType = collectionType + moveDown.subIndex = subIndex + moveDown.objName = objName + class OOTCollectionAdd(bpy.types.Operator): - bl_idname = 'object.oot_collection_add' - bl_label = 'Add Item' - bl_options = {'REGISTER', 'UNDO'} + bl_idname = "object.oot_collection_add" + bl_label = "Add Item" + bl_options = {"REGISTER", "UNDO"} + + option: bpy.props.IntProperty() + collectionType: bpy.props.StringProperty(default="Actor") + subIndex: bpy.props.IntProperty(default=0) + objName: bpy.props.StringProperty() - option : bpy.props.IntProperty() - collectionType : bpy.props.StringProperty(default = "Actor") - subIndex : bpy.props.IntProperty(default = 0) - objName : bpy.props.StringProperty() + def execute(self, context): + collection = getCollection(self.objName, self.collectionType, self.subIndex) - def execute(self, context): - collection = getCollection(self.objName, self.collectionType, self.subIndex) + collection.add() + collection.move(len(collection) - 1, self.option) + # self.report({'INFO'}, 'Success!') + return {"FINISHED"} - collection.add() - collection.move(len(collection)-1, self.option) - #self.report({'INFO'}, 'Success!') - return {'FINISHED'} class OOTCollectionRemove(bpy.types.Operator): - bl_idname = 'object.oot_collection_remove' - bl_label = 'Remove Item' - bl_options = {'REGISTER', 'UNDO'} + bl_idname = "object.oot_collection_remove" + bl_label = "Remove Item" + bl_options = {"REGISTER", "UNDO"} - option : bpy.props.IntProperty() - collectionType : bpy.props.StringProperty(default = "Actor") - subIndex : bpy.props.IntProperty(default = 0) - objName : bpy.props.StringProperty() + option: bpy.props.IntProperty() + collectionType: bpy.props.StringProperty(default="Actor") + subIndex: bpy.props.IntProperty(default=0) + objName: bpy.props.StringProperty() + + def execute(self, context): + collection = getCollection(self.objName, self.collectionType, self.subIndex) + collection.remove(self.option) + # self.report({'INFO'}, 'Success!') + return {"FINISHED"} - def execute(self, context): - collection = getCollection(self.objName, self.collectionType, self.subIndex) - collection.remove(self.option) - #self.report({'INFO'}, 'Success!') - return {'FINISHED'} class OOTCollectionMove(bpy.types.Operator): - bl_idname = 'object.oot_collection_move' - bl_label = 'Move Item' - bl_options = {'REGISTER', 'UNDO'} - - option : bpy.props.IntProperty() - offset : bpy.props.IntProperty() - subIndex : bpy.props.IntProperty(default = 0) - objName : bpy.props.StringProperty() - - collectionType : bpy.props.StringProperty(default = "Actor") - def execute(self, context): - collection = getCollection(self.objName, self.collectionType, self.subIndex) - collection.move(self.option, self.option + self.offset) - #self.report({'INFO'}, 'Success!') - return {'FINISHED'} + bl_idname = "object.oot_collection_move" + bl_label = "Move Item" + bl_options = {"REGISTER", "UNDO"} + + option: bpy.props.IntProperty() + offset: bpy.props.IntProperty() + subIndex: bpy.props.IntProperty(default=0) + objName: bpy.props.StringProperty() + + collectionType: bpy.props.StringProperty(default="Actor") + + def execute(self, context): + collection = getCollection(self.objName, self.collectionType, self.subIndex) + collection.move(self.option, self.option + self.offset) + # self.report({'INFO'}, 'Success!') + return {"FINISHED"} + oot_utility_classes = ( - OOTCollectionAdd, - OOTCollectionRemove, - OOTCollectionMove, + OOTCollectionAdd, + OOTCollectionRemove, + OOTCollectionMove, ) + def oot_utility_register(): - for cls in oot_utility_classes: - register_class(cls) + for cls in oot_utility_classes: + register_class(cls) + def oot_utility_unregister(): - for cls in reversed(oot_utility_classes): - unregister_class(cls) + for cls in reversed(oot_utility_classes): + unregister_class(cls) diff --git a/fast64_internal/oot/sceneDirectoryParser.py b/fast64_internal/oot/sceneDirectoryParser.py index f5140260a..47f8092fb 100644 --- a/fast64_internal/oot/sceneDirectoryParser.py +++ b/fast64_internal/oot/sceneDirectoryParser.py @@ -1,32 +1,34 @@ import os - + # Open a file path = r"E:\oot\assets\scenes" - -data = '' + +data = "" for subdir in os.listdir(path): - subPath = os.path.join(path, subdir) - if os.path.isdir(subPath): - data += 'ootScene' + subdir.capitalize() + ' = [\n' - for sceneFolder in os.listdir(subPath): - if os.path.isdir(os.path.join(subPath, sceneFolder)): - data += '\t"' + sceneFolder + '",\n' - data += ']\n\n' + subPath = os.path.join(path, subdir) + if os.path.isdir(subPath): + data += "ootScene" + subdir.capitalize() + " = [\n" + for sceneFolder in os.listdir(subPath): + if os.path.isdir(os.path.join(subPath, sceneFolder)): + data += '\t"' + sceneFolder + '",\n' + data += "]\n\n" -exportFile = open("sceneDirectoryLists.py", 'w') +exportFile = open("sceneDirectoryLists.py", "w") exportFile.write(data) exportFile.close() data = "ootSceneIDToName = {\n" for subdir in os.listdir(path): - subPath = os.path.join(path, subdir) - if os.path.isdir(subPath): - for sceneFolder in os.listdir(subPath): - if os.path.isdir(os.path.join(subPath, sceneFolder)): - data += '\t"SCENE_' + sceneFolder.upper() + '" : "' + sceneFolder + '",\n' -data += '}\n\n' + subPath = os.path.join(path, subdir) + if os.path.isdir(subPath): + for sceneFolder in os.listdir(subPath): + if os.path.isdir(os.path.join(subPath, sceneFolder)): + data += ( + '\t"SCENE_' + sceneFolder.upper() + '" : "' + sceneFolder + '",\n' + ) +data += "}\n\n" -exportFile = open("sceneNameToID.py", 'w') +exportFile = open("sceneNameToID.py", "w") exportFile.write(data) -exportFile.close() \ No newline at end of file +exportFile.close() diff --git a/fast64_internal/operators.py b/fast64_internal/operators.py index 366441cdd..fc63c071c 100644 --- a/fast64_internal/operators.py +++ b/fast64_internal/operators.py @@ -3,74 +3,86 @@ from .utility import * from .f3d.f3d_material import * + def addMaterialByName(obj, matName, preset): - if matName in bpy.data.materials: - bpy.ops.object.material_slot_add() - obj.material_slots[0].material = bpy.data.materials[matName] - else: - material = createF3DMat(obj, preset = preset) - material.name = matName + if matName in bpy.data.materials: + bpy.ops.object.material_slot_add() + obj.material_slots[0].material = bpy.data.materials[matName] + else: + material = createF3DMat(obj, preset=preset) + material.name = matName + class AddWaterBox(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.add_water_box' - bl_label = "Add Water Box" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} + # set bl_ properties + bl_idname = "object.add_water_box" + bl_label = "Add Water Box" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + scale: bpy.props.FloatProperty(default=10) + preset: bpy.props.StringProperty(default="Shaded Solid") + matName: bpy.props.StringProperty(default="water_mat") - scale : bpy.props.FloatProperty(default = 10) - preset : bpy.props.StringProperty(default = "Shaded Solid") - matName : bpy.props.StringProperty(default = "water_mat") + def setEmptyType(self, emptyObj): + return None - def setEmptyType(self, emptyObj): - return None + def execute(self, context): + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") - def execute(self, context): - if context.mode != "OBJECT": - bpy.ops.object.mode_set(mode = "OBJECT") + bpy.ops.object.select_all(action="DESELECT") - bpy.ops.object.select_all(action = "DESELECT") + location = mathutils.Vector(bpy.context.scene.cursor.location) + bpy.ops.mesh.primitive_plane_add( + size=2 * self.scale, + enter_editmode=False, + align="WORLD", + location=location[:], + ) + planeObj = context.view_layer.objects.active + planeObj.ignore_collision = True + planeObj.name = "Water Box Mesh" - location = mathutils.Vector(bpy.context.scene.cursor.location) - bpy.ops.mesh.primitive_plane_add(size=2 * self.scale, enter_editmode=False, align='WORLD', location=location[:]) - planeObj = context.view_layer.objects.active - planeObj.ignore_collision = True - planeObj.name = "Water Box Mesh" + addMaterialByName(planeObj, self.matName, self.preset) - addMaterialByName(planeObj, self.matName, self.preset) + location += mathutils.Vector([0, 0, -self.scale]) + bpy.ops.object.empty_add( + type="CUBE", radius=self.scale, align="WORLD", location=location[:] + ) + emptyObj = context.view_layer.objects.active + emptyObj.name = "Water Box" + self.setEmptyType(emptyObj) - location += mathutils.Vector([0,0,-self.scale]) - bpy.ops.object.empty_add(type='CUBE', radius = self.scale, align='WORLD', location=location[:]) - emptyObj = context.view_layer.objects.active - emptyObj.name = "Water Box" - self.setEmptyType(emptyObj) + parentObject(planeObj, emptyObj) - parentObject(planeObj, emptyObj) + return {"FINISHED"} - return {"FINISHED"} class WarningOperator(bpy.types.Operator): - '''Extension of Operator that allows collecting and displaying warnings''' - warnings = set() + """Extension of Operator that allows collecting and displaying warnings""" + + warnings = set() + + def reset_warnings(self): + self.warnings.clear() - def reset_warnings(self): - self.warnings.clear() + def add_warning(self, warning: str): + self.warnings.add(warning) - def add_warning(self, warning: str): - self.warnings.add(warning) + def show_warnings(self): + if len(self.warnings): + self.report({"WARNING"}, "Operator completed with warnings:") + for warning in self.warnings: + self.report({"WARNING"}, warning) + self.reset_warnings() - def show_warnings(self): - if len(self.warnings): - self.report({'WARNING'}, 'Operator completed with warnings:') - for warning in self.warnings: - self.report({'WARNING'}, warning) - self.reset_warnings() class ObjectDataExporter(WarningOperator): - '''Operator that uses warnings and can store original matrixes and meshes for use in exporting''' - def store_object_data(self): - store_original_mtx() - store_original_meshes(self.add_warning) + """Operator that uses warnings and can store original matrixes and meshes for use in exporting""" - def cleanup_temp_object_data(self): - cleanupTempMeshes() + def store_object_data(self): + store_original_mtx() + store_original_meshes(self.add_warning) + def cleanup_temp_object_data(self): + cleanupTempMeshes() diff --git a/fast64_internal/panels.py b/fast64_internal/panels.py index 6c598a488..400c0f90f 100644 --- a/fast64_internal/panels.py +++ b/fast64_internal/panels.py @@ -1,20 +1,24 @@ - import bpy -sm64GoalImport = 'Import' # Not in enum, separate UI option +sm64GoalImport = "Import" # Not in enum, separate UI option sm64GoalTypeEnum = [ - ('All', 'All', 'All'), - ('Export Object/Actor/Anim', 'Export Object/Actor/Anim', 'Export Object/Actor/Anim'), - ('Export Level', 'Export Level', 'Export Level'), - ('Export Displaylist', 'Export Displaylist', 'Export Displaylist'), - ('Export UI Image', 'Export UI Image', 'Export UI Image'), + ("All", "All", "All"), + ( + "Export Object/Actor/Anim", + "Export Object/Actor/Anim", + "Export Object/Actor/Anim", + ), + ("Export Level", "Export Level", "Export Level"), + ("Export Displaylist", "Export Displaylist", "Export Displaylist"), + ("Export UI Image", "Export UI Image", "Export UI Image"), ] + class SM64_Panel(bpy.types.Panel): - bl_space_type = 'VIEW_3D' - bl_region_type = 'UI' - bl_category = 'SM64' - bl_options = {'DEFAULT_CLOSED'} + bl_space_type = "VIEW_3D" + bl_region_type = "UI" + bl_category = "SM64" + bl_options = {"DEFAULT_CLOSED"} # goal refers to the selected sm64GoalTypeEnum, a different selection than this goal will filter this panel out goal = None # if this is True, the panel is hidden whenever the scene's exportType is not 'C' @@ -23,25 +27,26 @@ class SM64_Panel(bpy.types.Panel): @classmethod def poll(cls, context): sm64Props = bpy.context.scene.fast64.sm64 - if context.scene.gameEditorMode != 'SM64': + if context.scene.gameEditorMode != "SM64": return False elif not cls.goal: - return True # Panel should always be shown + return True # Panel should always be shown elif cls.goal == sm64GoalImport: # Only show if importing is enabled return sm64Props.showImportingMenus - elif cls.decomp_only and sm64Props.exportType != 'C': + elif cls.decomp_only and sm64Props.exportType != "C": return False sceneGoal = sm64Props.goal - return sceneGoal == 'All' or sceneGoal == cls.goal + return sceneGoal == "All" or sceneGoal == cls.goal + class OOT_Panel(bpy.types.Panel): - bl_space_type = 'VIEW_3D' - bl_region_type = 'UI' - bl_category = 'OOT' - bl_options = {'DEFAULT_CLOSED'} + bl_space_type = "VIEW_3D" + bl_region_type = "UI" + bl_category = "OOT" + bl_options = {"DEFAULT_CLOSED"} @classmethod def poll(cls, context): - return context.scene.gameEditorMode == 'OOT' + return context.scene.gameEditorMode == "OOT" diff --git a/fast64_internal/sm64/__init__.py b/fast64_internal/sm64/__init__.py index 1b04aded5..1e67ae4de 100644 --- a/fast64_internal/sm64/__init__.py +++ b/fast64_internal/sm64/__init__.py @@ -18,277 +18,310 @@ from bpy.utils import register_class, unregister_class enumRefreshVer = [ - ("Refresh 3", "Refresh 3", "Refresh 3"), - ("Refresh 4", "Refresh 4", "Refresh 4"), - ("Refresh 5", "Refresh 5", "Refresh 5"), - ("Refresh 6", "Refresh 6", "Refresh 6"), - ("Refresh 7", "Refresh 7", "Refresh 7"), - ("Refresh 8", "Refresh 8", "Refresh 8"), - ("Refresh 10", "Refresh 10", "Refresh 10"), - ("Refresh 11", "Refresh 11", "Refresh 11"), - ("Refresh 12", "Refresh 12", "Refresh 12"), - ("Refresh 13", "Refresh 13", "Refresh 13"), + ("Refresh 3", "Refresh 3", "Refresh 3"), + ("Refresh 4", "Refresh 4", "Refresh 4"), + ("Refresh 5", "Refresh 5", "Refresh 5"), + ("Refresh 6", "Refresh 6", "Refresh 6"), + ("Refresh 7", "Refresh 7", "Refresh 7"), + ("Refresh 8", "Refresh 8", "Refresh 8"), + ("Refresh 10", "Refresh 10", "Refresh 10"), + ("Refresh 11", "Refresh 11", "Refresh 11"), + ("Refresh 12", "Refresh 12", "Refresh 12"), + ("Refresh 13", "Refresh 13", "Refresh 13"), ] + class SM64_AddrConv(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.addr_conv' - bl_label = "Convert Address" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - segToVirt : bpy.props.BoolProperty() - - def execute(self, context): - romfileSrc = None - try: - address = int(context.scene.convertibleAddr, 16) - importRom = context.scene.importRom - romfileSrc = open(bpy.path.abspath(importRom), 'rb') - checkExpanded(bpy.path.abspath(importRom)) - levelParsed = parseLevelAtPointer(romfileSrc, - level_pointers[context.scene.levelConvert]) - segmentData = levelParsed.segmentData - if self.segToVirt: - ptr = decodeSegmentedAddr( - address.to_bytes(4, 'big'), segmentData) - self.report({'INFO'}, - 'Virtual pointer is 0x' + format(ptr, '08X')) - else: - ptr = int.from_bytes( - encodeSegmentedAddr(address, segmentData), 'big') - self.report({'INFO'}, - 'Segmented pointer is 0x' + format(ptr, '08X')) - romfileSrc.close() - return {'FINISHED'} - except Exception as e: - if romfileSrc is not None: - romfileSrc.close() - raisePluginError(self, e) - return {'CANCELLED'} # must return a set + # set bl_ properties + bl_idname = "object.addr_conv" + bl_label = "Convert Address" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + segToVirt: bpy.props.BoolProperty() + + def execute(self, context): + romfileSrc = None + try: + address = int(context.scene.convertibleAddr, 16) + importRom = context.scene.importRom + romfileSrc = open(bpy.path.abspath(importRom), "rb") + checkExpanded(bpy.path.abspath(importRom)) + levelParsed = parseLevelAtPointer( + romfileSrc, level_pointers[context.scene.levelConvert] + ) + segmentData = levelParsed.segmentData + if self.segToVirt: + ptr = decodeSegmentedAddr(address.to_bytes(4, "big"), segmentData) + self.report({"INFO"}, "Virtual pointer is 0x" + format(ptr, "08X")) + else: + ptr = int.from_bytes(encodeSegmentedAddr(address, segmentData), "big") + self.report({"INFO"}, "Segmented pointer is 0x" + format(ptr, "08X")) + romfileSrc.close() + return {"FINISHED"} + except Exception as e: + if romfileSrc is not None: + romfileSrc.close() + raisePluginError(self, e) + return {"CANCELLED"} # must return a set + class SM64_MenuVisibilityPanel(SM64_Panel): - bl_idname = "SM64_PT_menu_visibility_settings" - bl_label = "SM64 Menu Visibility Settings" - bl_options = set() # default to open - bl_order = 0 # force to front + bl_idname = "SM64_PT_menu_visibility_settings" + bl_label = "SM64 Menu Visibility Settings" + bl_options = set() # default to open + bl_order = 0 # force to front - def draw(self, context): - col = self.layout.column() - col.scale_y = 1.1 # extra padding - sm64Props: SM64_Properties = context.scene.fast64.sm64 + def draw(self, context): + col = self.layout.column() + col.scale_y = 1.1 # extra padding + sm64Props: SM64_Properties = context.scene.fast64.sm64 + + prop_split(col, sm64Props, "goal", "Export goal") + prop_split(col, sm64Props, "showImportingMenus", "Show Importing Options") - prop_split(col, sm64Props, 'goal', 'Export goal') - prop_split(col, sm64Props, 'showImportingMenus', 'Show Importing Options') class SM64_FileSettingsPanel(SM64_Panel): - bl_idname = "SM64_PT_file_settings" - bl_label = "SM64 File Settings" - bl_options = set() - - def draw(self, context): - col = self.layout.column() - col.scale_y = 1.1 # extra padding - sm64Props: SM64_Properties = context.scene.fast64.sm64 - - prop_split(col, sm64Props, 'exportType', 'Export type') - prop_split(col, context.scene, 'blenderToSM64Scale', 'Blender To SM64 Scale') - - if sm64Props.showImportingMenus: - col.prop(context.scene, 'importRom') - - if sm64Props.exportType == 'Binary': - col.prop(context.scene, 'exportRom') - col.prop(context.scene, 'outputRom') - col.prop(context.scene, 'extendBank4') - elif sm64Props.exportType == 'C': - col.prop(context.scene, 'disableScroll') - col.prop(context.scene, 'decompPath') - prop_split(col, context.scene, 'refreshVer', 'Decomp Func Map') - prop_split(col, context.scene, 'compressionFormat', 'Compression Format') + bl_idname = "SM64_PT_file_settings" + bl_label = "SM64 File Settings" + bl_options = set() + + def draw(self, context): + col = self.layout.column() + col.scale_y = 1.1 # extra padding + sm64Props: SM64_Properties = context.scene.fast64.sm64 + + prop_split(col, sm64Props, "exportType", "Export type") + prop_split(col, context.scene, "blenderToSM64Scale", "Blender To SM64 Scale") + + if sm64Props.showImportingMenus: + col.prop(context.scene, "importRom") + + if sm64Props.exportType == "Binary": + col.prop(context.scene, "exportRom") + col.prop(context.scene, "outputRom") + col.prop(context.scene, "extendBank4") + elif sm64Props.exportType == "C": + col.prop(context.scene, "disableScroll") + col.prop(context.scene, "decompPath") + prop_split(col, context.scene, "refreshVer", "Decomp Func Map") + prop_split(col, context.scene, "compressionFormat", "Compression Format") + class SM64_AddressConvertPanel(SM64_Panel): - bl_idname = "SM64_PT_addr_conv" - bl_label = "SM64 Address Converter" - goal = sm64GoalImport - - def draw(self, context): - col = self.layout.column() - segToVirtOp = col.operator(SM64_AddrConv.bl_idname, - text = "Convert Segmented To Virtual") - segToVirtOp.segToVirt = True - virtToSegOp = col.operator(SM64_AddrConv.bl_idname, - text = "Convert Virtual To Segmented") - virtToSegOp.segToVirt = False - prop_split(col, context.scene, 'convertibleAddr', 'Address') - col.prop(context.scene, 'levelConvert') + bl_idname = "SM64_PT_addr_conv" + bl_label = "SM64 Address Converter" + goal = sm64GoalImport + + def draw(self, context): + col = self.layout.column() + segToVirtOp = col.operator( + SM64_AddrConv.bl_idname, text="Convert Segmented To Virtual" + ) + segToVirtOp.segToVirt = True + virtToSegOp = col.operator( + SM64_AddrConv.bl_idname, text="Convert Virtual To Segmented" + ) + virtToSegOp.segToVirt = False + prop_split(col, context.scene, "convertibleAddr", "Address") + col.prop(context.scene, "levelConvert") + def get_legacy_export_type(): - legacy_export_types = ('C', 'Binary', 'Insertable Binary') - scene = bpy.context.scene + legacy_export_types = ("C", "Binary", "Insertable Binary") + scene = bpy.context.scene - for exportKey in ['animExportType', 'colExportType', 'DLExportType', 'geoExportType']: - eType = scene.pop(exportKey, None) - if eType is not None and legacy_export_types[eType] != 'C': - return legacy_export_types[eType] + for exportKey in [ + "animExportType", + "colExportType", + "DLExportType", + "geoExportType", + ]: + eType = scene.pop(exportKey, None) + if eType is not None and legacy_export_types[eType] != "C": + return legacy_export_types[eType] + + return "C" - return 'C' class SM64_Properties(bpy.types.PropertyGroup): - '''Global SM64 Scene Properties found under scene.fast64.sm64''' - version: bpy.props.IntProperty(name="SM64_Properties Version", default=0) - cur_version = 1 # version after property migration - - # UI Selection - showImportingMenus: bpy.props.BoolProperty(name='Show Importing Menus', default=False) - exportType: bpy.props.EnumProperty(items = enumExportType, name = 'Export Type', default = 'C') - goal: bpy.props.EnumProperty(items=sm64GoalTypeEnum, name = 'Export Goal', default = 'All') - - # TODO: Utilize these across all exports - # C exporting - # useCustomExportLocation = bpy.props.BoolProperty(name = 'Use Custom Export Path') - # customExportPath: bpy.props.StringProperty(name = 'Custom Export Path', subtype = 'FILE_PATH') - # exportLocation: bpy.props.EnumProperty(items = enumExportHeaderType, name = 'Export Location', default = 'Actor') - # useSelectedObjectName = bpy.props.BoolProperty(name = 'Use Name From Selected Object', default=False) - # exportName: bpy.props.StringProperty(name='Name', default='mario') - # exportGeolayoutName: bpy.props.StringProperty(name='Name', default='mario_geo') - - # Actor exports - # exportGroup: bpy.props.StringProperty(name='Group', default='group0') - - # Level exports - # exportLevelName: bpy.props.StringProperty(name = 'Level', default = 'bob') - # exportLevelOption: bpy.props.EnumProperty(items = enumLevelNames, name = 'Level', default = 'bob') - - # Insertable Binary - # exportInsertableBinaryPath: bpy.props.StringProperty(name = 'Filepath', subtype = 'FILE_PATH') - - @staticmethod - def upgrade_changed_props(): - if bpy.context.scene.fast64.sm64.version != SM64_Properties.cur_version: - bpy.context.scene.fast64.sm64.exportType = get_legacy_export_type() - bpy.context.scene.fast64.sm64.version = SM64_Properties.cur_version + """Global SM64 Scene Properties found under scene.fast64.sm64""" + + version: bpy.props.IntProperty(name="SM64_Properties Version", default=0) + cur_version = 1 # version after property migration + + # UI Selection + showImportingMenus: bpy.props.BoolProperty( + name="Show Importing Menus", default=False + ) + exportType: bpy.props.EnumProperty( + items=enumExportType, name="Export Type", default="C" + ) + goal: bpy.props.EnumProperty( + items=sm64GoalTypeEnum, name="Export Goal", default="All" + ) + + # TODO: Utilize these across all exports + # C exporting + # useCustomExportLocation = bpy.props.BoolProperty(name = 'Use Custom Export Path') + # customExportPath: bpy.props.StringProperty(name = 'Custom Export Path', subtype = 'FILE_PATH') + # exportLocation: bpy.props.EnumProperty(items = enumExportHeaderType, name = 'Export Location', default = 'Actor') + # useSelectedObjectName = bpy.props.BoolProperty(name = 'Use Name From Selected Object', default=False) + # exportName: bpy.props.StringProperty(name='Name', default='mario') + # exportGeolayoutName: bpy.props.StringProperty(name='Name', default='mario_geo') + + # Actor exports + # exportGroup: bpy.props.StringProperty(name='Group', default='group0') + + # Level exports + # exportLevelName: bpy.props.StringProperty(name = 'Level', default = 'bob') + # exportLevelOption: bpy.props.EnumProperty(items = enumLevelNames, name = 'Level', default = 'bob') + + # Insertable Binary + # exportInsertableBinaryPath: bpy.props.StringProperty(name = 'Filepath', subtype = 'FILE_PATH') + + @staticmethod + def upgrade_changed_props(): + if bpy.context.scene.fast64.sm64.version != SM64_Properties.cur_version: + bpy.context.scene.fast64.sm64.exportType = get_legacy_export_type() + bpy.context.scene.fast64.sm64.version = SM64_Properties.cur_version sm64_classes = ( - SM64_AddrConv, - SM64_Properties, + SM64_AddrConv, + SM64_Properties, ) sm64_panel_classes = ( - SM64_MenuVisibilityPanel, - SM64_FileSettingsPanel, - SM64_AddressConvertPanel, + SM64_MenuVisibilityPanel, + SM64_FileSettingsPanel, + SM64_AddressConvertPanel, ) + def sm64_panel_register(): - for cls in sm64_panel_classes: - register_class(cls) - - sm64_col_panel_register() - sm64_bone_panel_register() - sm64_cam_panel_register() - sm64_obj_panel_register() - sm64_geo_parser_panel_register() - sm64_geo_writer_panel_register() - sm64_level_panel_register() - sm64_spline_panel_register() - sm64_dl_writer_panel_register() - sm64_dl_parser_panel_register() - sm64_anim_panel_register() + for cls in sm64_panel_classes: + register_class(cls) + + sm64_col_panel_register() + sm64_bone_panel_register() + sm64_cam_panel_register() + sm64_obj_panel_register() + sm64_geo_parser_panel_register() + sm64_geo_writer_panel_register() + sm64_level_panel_register() + sm64_spline_panel_register() + sm64_dl_writer_panel_register() + sm64_dl_parser_panel_register() + sm64_anim_panel_register() + def sm64_panel_unregister(): - for cls in sm64_panel_classes: - unregister_class(cls) - - sm64_col_panel_unregister() - sm64_bone_panel_unregister() - sm64_cam_panel_unregister() - sm64_obj_panel_unregister() - sm64_geo_parser_panel_unregister() - sm64_geo_writer_panel_unregister() - sm64_level_panel_unregister() - sm64_spline_panel_unregister() - sm64_dl_writer_panel_unregister() - sm64_dl_parser_panel_unregister() - sm64_anim_panel_unregister() + for cls in sm64_panel_classes: + unregister_class(cls) + + sm64_col_panel_unregister() + sm64_bone_panel_unregister() + sm64_cam_panel_unregister() + sm64_obj_panel_unregister() + sm64_geo_parser_panel_unregister() + sm64_geo_writer_panel_unregister() + sm64_level_panel_unregister() + sm64_spline_panel_unregister() + sm64_dl_writer_panel_unregister() + sm64_dl_parser_panel_unregister() + sm64_anim_panel_unregister() + def sm64_register(registerPanels): - for cls in sm64_classes: - register_class(cls) - - sm64_col_register() # register first, so panel goes above mat panel - sm64_bone_register() - sm64_cam_register() - sm64_obj_register() - sm64_geo_parser_register() - sm64_geo_writer_register() - sm64_level_register() - sm64_spline_register() - sm64_dl_writer_register() - sm64_dl_parser_register() - sm64_anim_register() - - if registerPanels: - sm64_panel_register() - - bpy.types.Scene.importRom = bpy.props.StringProperty( - name ='Import ROM', subtype = 'FILE_PATH') - bpy.types.Scene.exportRom = bpy.props.StringProperty( - name ='Export ROM', subtype = 'FILE_PATH') - bpy.types.Scene.outputRom = bpy.props.StringProperty( - name ='Output ROM', subtype = 'FILE_PATH') - bpy.types.Scene.extendBank4 = bpy.props.BoolProperty( - name = 'Extend Bank 4 on Export?', default = True, - description = 'Sets bank 4 range to (' +\ - hex(defaultExtendSegment4[0]) + ', ' + \ - hex(defaultExtendSegment4[1]) + ') and copies data from old bank') - bpy.types.Scene.convertibleAddr = bpy.props.StringProperty( - name = 'Address') - bpy.types.Scene.levelConvert = bpy.props.EnumProperty( - items = level_enums, name = 'Level', default = 'IC') - bpy.types.Scene.refreshVer = bpy.props.EnumProperty( - items = enumRefreshVer, name = 'Refresh', default = 'Refresh 13') - bpy.types.Scene.disableScroll = bpy.props.BoolProperty( - name = 'Disable Scrolling Textures') - - bpy.types.Scene.blenderToSM64Scale = bpy.props.FloatProperty( - name = 'Blender To SM64 Scale', default = 100) # 212.766 - bpy.types.Scene.decompPath = bpy.props.StringProperty( - name ='Decomp Folder', subtype = 'FILE_PATH') - - bpy.types.Scene.compressionFormat = bpy.props.EnumProperty( - items = enumCompressionFormat, name = 'Compression', default = 'mio0') + for cls in sm64_classes: + register_class(cls) + + sm64_col_register() # register first, so panel goes above mat panel + sm64_bone_register() + sm64_cam_register() + sm64_obj_register() + sm64_geo_parser_register() + sm64_geo_writer_register() + sm64_level_register() + sm64_spline_register() + sm64_dl_writer_register() + sm64_dl_parser_register() + sm64_anim_register() + + if registerPanels: + sm64_panel_register() + + bpy.types.Scene.importRom = bpy.props.StringProperty( + name="Import ROM", subtype="FILE_PATH" + ) + bpy.types.Scene.exportRom = bpy.props.StringProperty( + name="Export ROM", subtype="FILE_PATH" + ) + bpy.types.Scene.outputRom = bpy.props.StringProperty( + name="Output ROM", subtype="FILE_PATH" + ) + bpy.types.Scene.extendBank4 = bpy.props.BoolProperty( + name="Extend Bank 4 on Export?", + default=True, + description="Sets bank 4 range to (" + + hex(defaultExtendSegment4[0]) + + ", " + + hex(defaultExtendSegment4[1]) + + ") and copies data from old bank", + ) + bpy.types.Scene.convertibleAddr = bpy.props.StringProperty(name="Address") + bpy.types.Scene.levelConvert = bpy.props.EnumProperty( + items=level_enums, name="Level", default="IC" + ) + bpy.types.Scene.refreshVer = bpy.props.EnumProperty( + items=enumRefreshVer, name="Refresh", default="Refresh 13" + ) + bpy.types.Scene.disableScroll = bpy.props.BoolProperty( + name="Disable Scrolling Textures" + ) + + bpy.types.Scene.blenderToSM64Scale = bpy.props.FloatProperty( + name="Blender To SM64 Scale", default=100 + ) # 212.766 + bpy.types.Scene.decompPath = bpy.props.StringProperty( + name="Decomp Folder", subtype="FILE_PATH" + ) + + bpy.types.Scene.compressionFormat = bpy.props.EnumProperty( + items=enumCompressionFormat, name="Compression", default="mio0" + ) + def sm64_unregister(unregisterPanels): - for cls in reversed(sm64_classes): - unregister_class(cls) - - sm64_col_unregister() # register first, so panel goes above mat panel - sm64_bone_unregister() - sm64_cam_unregister() - sm64_obj_unregister() - sm64_geo_parser_unregister() - sm64_geo_writer_unregister() - sm64_level_unregister() - sm64_spline_unregister() - sm64_dl_writer_unregister() - sm64_dl_parser_unregister() - sm64_anim_unregister() - - if unregisterPanels: - sm64_panel_unregister() - - del bpy.types.Scene.importRom - del bpy.types.Scene.exportRom - del bpy.types.Scene.outputRom - del bpy.types.Scene.extendBank4 - - del bpy.types.Scene.convertibleAddr - del bpy.types.Scene.levelConvert - del bpy.types.Scene.refreshVer - - del bpy.types.Scene.disableScroll - - del bpy.types.Scene.blenderToSM64Scale - del bpy.types.Scene.decompPath - del bpy.types.Scene.compressionFormat + for cls in reversed(sm64_classes): + unregister_class(cls) + + sm64_col_unregister() # register first, so panel goes above mat panel + sm64_bone_unregister() + sm64_cam_unregister() + sm64_obj_unregister() + sm64_geo_parser_unregister() + sm64_geo_writer_unregister() + sm64_level_unregister() + sm64_spline_unregister() + sm64_dl_writer_unregister() + sm64_dl_parser_unregister() + sm64_anim_unregister() + + if unregisterPanels: + sm64_panel_unregister() + + del bpy.types.Scene.importRom + del bpy.types.Scene.exportRom + del bpy.types.Scene.outputRom + del bpy.types.Scene.extendBank4 + + del bpy.types.Scene.convertibleAddr + del bpy.types.Scene.levelConvert + del bpy.types.Scene.refreshVer + + del bpy.types.Scene.disableScroll + + del bpy.types.Scene.blenderToSM64Scale + del bpy.types.Scene.decompPath + del bpy.types.Scene.compressionFormat diff --git a/fast64_internal/sm64/c_templates/tile_scroll.py b/fast64_internal/sm64/c_templates/tile_scroll.py index 90eb5c27f..6fa1adb69 100644 --- a/fast64_internal/sm64/c_templates/tile_scroll.py +++ b/fast64_internal/sm64/c_templates/tile_scroll.py @@ -1,4 +1,4 @@ -tile_scroll_c = '''#include +tile_scroll_c = """#include #include "game/memory.h" #include "game/tile_scroll.h" @@ -40,9 +40,9 @@ tile->v += t; } -''' +""" -tile_scroll_h = '''#include "types.h" +tile_scroll_h = """#include "types.h" #define PACK_TILESIZE(w, d) ((w << 2) + d) @@ -61,4 +61,4 @@ void shift_s_down(Gfx *dl, u32 cmd, u16 s); void shift_t_down(Gfx *dl, u32 cmd, u16 t); -''' \ No newline at end of file +""" diff --git a/fast64_internal/sm64/parse_function_map.py b/fast64_internal/sm64/parse_function_map.py index e52158c15..7e78f9858 100644 --- a/fast64_internal/sm64/parse_function_map.py +++ b/fast64_internal/sm64/parse_function_map.py @@ -1,26 +1,29 @@ import re -refresh_name = 'Refresh 13' -function_map_path = './sm64.us.map' -output_map_path = './sm64_function_map_output.py' +refresh_name = "Refresh 13" +function_map_path = "./sm64.us.map" +output_map_path = "./sm64_function_map_output.py" + def parse_func_map(): - mapfile = open(function_map_path, 'r') - outfile = open(output_map_path, 'w') + mapfile = open(function_map_path, "r") + outfile = open(output_map_path, "w") outfile.write('\t"' + refresh_name + '" : {\n') nextLine = mapfile.readline() - while nextLine != '' and nextLine != 'Linker script and memory map\n': + while nextLine != "" and nextLine != "Linker script and memory map\n": nextLine = mapfile.readline() - while nextLine != '' and nextLine != ' build/us/src/menu/level_select_menu.o(.text)\n': - if nextLine[:17] == ' ' * 16 + '0': + while ( + nextLine != "" and nextLine != " build/us/src/menu/level_select_menu.o(.text)\n" + ): + if nextLine[:17] == " " * 16 + "0": outfile.write('\t\t"' + nextLine[26:34] + '" : ') searchName = nextLine[34:] - searchResult = re.search(r'\s*(\S*).*', searchName) + searchResult = re.search(r"\s*(\S*).*", searchName) outfile.write('"' + searchResult.group(1) + '",\n') nextLine = mapfile.readline() outfile.write("\t}\n") mapfile.close() - outfile.close() \ No newline at end of file + outfile.close() diff --git a/fast64_internal/sm64/sm64_anim.py b/fast64_internal/sm64/sm64_anim.py index 267efef71..7aa831e81 100644 --- a/fast64_internal/sm64/sm64_anim.py +++ b/fast64_internal/sm64/sm64_anim.py @@ -9,931 +9,1215 @@ from ..utility import * from ..panels import SM64_Panel, sm64GoalImport -sm64_anim_types = {'ROTATE', 'TRANSLATE'} +sm64_anim_types = {"ROTATE", "TRANSLATE"} + class SM64_Animation: - def __init__(self, name): - self.name = name - self.header = None - self.indices = SM64_ShortArray(name + '_indices', False) - self.values = SM64_ShortArray(name + '_values', True) - - def get_ptr_offsets(self, isDMA): - return [12, 16] if not isDMA else [] - - def to_binary(self, segmentData, isDMA, startAddress): - return self.header.to_binary(segmentData, isDMA, startAddress) + \ - self.indices.to_binary() + \ - self.values.to_binary() - - def to_c(self): - data = CData() - data.header = "extern const struct Animation *const " + self.name + '[];\n' - data.source = self.values.to_c() + '\n' +\ - self.indices.to_c() + '\n' +\ - self.header.to_c() + '\n' - return data + def __init__(self, name): + self.name = name + self.header = None + self.indices = SM64_ShortArray(name + "_indices", False) + self.values = SM64_ShortArray(name + "_values", True) + + def get_ptr_offsets(self, isDMA): + return [12, 16] if not isDMA else [] + + def to_binary(self, segmentData, isDMA, startAddress): + return ( + self.header.to_binary(segmentData, isDMA, startAddress) + + self.indices.to_binary() + + self.values.to_binary() + ) + + def to_c(self): + data = CData() + data.header = "extern const struct Animation *const " + self.name + "[];\n" + data.source = ( + self.values.to_c() + + "\n" + + self.indices.to_c() + + "\n" + + self.header.to_c() + + "\n" + ) + return data + class SM64_ShortArray: - def __init__(self, name, signed): - self.name = name - self.shortData = [] - self.signed = signed - - def to_binary(self): - data = bytearray(0) - for short in self.shortData: - # All euler values have been pre-converted to positive values, so don't care about signed. - data += short.to_bytes(2, 'big', signed = False) - return data - - def to_c(self): - data = 'static const ' + ('s' if self.signed else 'u') + \ - '16 ' + self.name + '[] = {\n\t' - wrapCounter = 0 - for short in self.shortData: - data += '0x' + format(short, '04X') + ', ' - wrapCounter += 1 - if wrapCounter > 8: - data += '\n\t' - wrapCounter = 0 - data += '\n};\n' - return data + def __init__(self, name, signed): + self.name = name + self.shortData = [] + self.signed = signed + + def to_binary(self): + data = bytearray(0) + for short in self.shortData: + # All euler values have been pre-converted to positive values, so don't care about signed. + data += short.to_bytes(2, "big", signed=False) + return data + + def to_c(self): + data = ( + "static const " + + ("s" if self.signed else "u") + + "16 " + + self.name + + "[] = {\n\t" + ) + wrapCounter = 0 + for short in self.shortData: + data += "0x" + format(short, "04X") + ", " + wrapCounter += 1 + if wrapCounter > 8: + data += "\n\t" + wrapCounter = 0 + data += "\n};\n" + return data + class SM64_AnimationHeader: - def __init__(self, name, repetitions, marioYOffset, frameInterval, - nodeCount, transformValuesStart, transformIndicesStart, animSize): - self.name = name - self.repetitions = repetitions - self.marioYOffset = marioYOffset - self.frameInterval = frameInterval - self.nodeCount = nodeCount - self.transformValuesStart = transformValuesStart - self.transformIndicesStart = transformIndicesStart - self.animSize = animSize # DMA animations only - - self.transformIndices = [] - - # presence of segmentData indicates DMA. - def to_binary(self, segmentData, isDMA, startAddress): - if isDMA: - transformValuesStart = self.transformValuesStart - transformIndicesStart = self.transformIndicesStart - else: - transformValuesStart = self.transformValuesStart + startAddress - transformIndicesStart = self.transformIndicesStart + startAddress - - data = bytearray(0) - data.extend(self.repetitions.to_bytes(2, byteorder='big')) - data.extend(self.marioYOffset.to_bytes(2, byteorder='big')) # y offset, only used for mario - data.extend([0x00, 0x00]) # unknown, common with secondary anims, variable length animations? - data.extend(int(round(self.frameInterval[0])).to_bytes(2, byteorder='big')) - data.extend(int(round(self.frameInterval[1] - 1)).to_bytes(2, byteorder='big')) - data.extend(self.nodeCount.to_bytes(2, byteorder='big')) - if not isDMA: - data.extend(encodeSegmentedAddr(transformValuesStart, segmentData)) - data.extend(encodeSegmentedAddr(transformIndicesStart, segmentData)) - data.extend(bytearray([0x00] * 6)) - else: - data.extend(transformValuesStart.to_bytes(4, byteorder='big')) - data.extend(transformIndicesStart.to_bytes(4, byteorder='big')) - data.extend(self.animSize.to_bytes(4, byteorder='big')) - data.extend(bytearray([0x00] * 2)) - return data - - def to_c(self): - data = 'static const struct Animation ' + self.name + ' = {\n' +\ - '\t' + str(self.repetitions) + ',\n' + \ - '\t' + str(self.marioYOffset) + ',\n' + \ - '\t0,\n' + \ - '\t' + str(int(round(self.frameInterval[0]))) + ',\n' + \ - '\t' + str(int(round(self.frameInterval[1] - 1))) + ',\n' + \ - '\tANIMINDEX_NUMPARTS(' + self.name + '_indices),\n' + \ - '\t' + self.name + '_values,\n' + \ - '\t' + self.name + '_indices,\n' + \ - '\t0,\n' + \ - '};\n' - return data + def __init__( + self, + name, + repetitions, + marioYOffset, + frameInterval, + nodeCount, + transformValuesStart, + transformIndicesStart, + animSize, + ): + self.name = name + self.repetitions = repetitions + self.marioYOffset = marioYOffset + self.frameInterval = frameInterval + self.nodeCount = nodeCount + self.transformValuesStart = transformValuesStart + self.transformIndicesStart = transformIndicesStart + self.animSize = animSize # DMA animations only + + self.transformIndices = [] + + # presence of segmentData indicates DMA. + def to_binary(self, segmentData, isDMA, startAddress): + if isDMA: + transformValuesStart = self.transformValuesStart + transformIndicesStart = self.transformIndicesStart + else: + transformValuesStart = self.transformValuesStart + startAddress + transformIndicesStart = self.transformIndicesStart + startAddress + + data = bytearray(0) + data.extend(self.repetitions.to_bytes(2, byteorder="big")) + data.extend( + self.marioYOffset.to_bytes(2, byteorder="big") + ) # y offset, only used for mario + data.extend( + [0x00, 0x00] + ) # unknown, common with secondary anims, variable length animations? + data.extend(int(round(self.frameInterval[0])).to_bytes(2, byteorder="big")) + data.extend(int(round(self.frameInterval[1] - 1)).to_bytes(2, byteorder="big")) + data.extend(self.nodeCount.to_bytes(2, byteorder="big")) + if not isDMA: + data.extend(encodeSegmentedAddr(transformValuesStart, segmentData)) + data.extend(encodeSegmentedAddr(transformIndicesStart, segmentData)) + data.extend(bytearray([0x00] * 6)) + else: + data.extend(transformValuesStart.to_bytes(4, byteorder="big")) + data.extend(transformIndicesStart.to_bytes(4, byteorder="big")) + data.extend(self.animSize.to_bytes(4, byteorder="big")) + data.extend(bytearray([0x00] * 2)) + return data + + def to_c(self): + data = ( + "static const struct Animation " + + self.name + + " = {\n" + + "\t" + + str(self.repetitions) + + ",\n" + + "\t" + + str(self.marioYOffset) + + ",\n" + + "\t0,\n" + + "\t" + + str(int(round(self.frameInterval[0]))) + + ",\n" + + "\t" + + str(int(round(self.frameInterval[1] - 1))) + + ",\n" + + "\tANIMINDEX_NUMPARTS(" + + self.name + + "_indices),\n" + + "\t" + + self.name + + "_values,\n" + + "\t" + + self.name + + "_indices,\n" + + "\t0,\n" + + "};\n" + ) + return data + class SM64_AnimIndexNode: - def __init__(self, x, y, z): - self.x = x - self.y = y - self.z = z + def __init__(self, x, y, z): + self.x = x + self.y = y + self.z = z + class SM64_AnimIndex: - def __init__(self, numFrames, startOffset): - self.startOffset = startOffset - self.numFrames = numFrames + def __init__(self, numFrames, startOffset): + self.startOffset = startOffset + self.numFrames = numFrames + def getLastKeyframeTime(keyframes): - last = keyframes[0].co[0] - for keyframe in keyframes: - if keyframe.co[0] > last: - last = keyframe.co[0] - return last + last = keyframes[0].co[0] + for keyframe in keyframes: + if keyframe.co[0] > last: + last = keyframe.co[0] + return last # add definition to groupN.h # add data/table includes to groupN.c (bin_id?) # add data/table files -def exportAnimationC(armatureObj, loopAnim, dirPath, dirName, groupName, - customExport, headerType, levelName): - dirPath, texDir = getExportDir(customExport, dirPath, headerType, - levelName, '', dirName) - - sm64_anim = exportAnimationCommon(armatureObj, loopAnim, dirName + "_anim") - animName = armatureObj.animation_data.action.name - - geoDirPath = os.path.join(dirPath, toAlnum(dirName)) - if not os.path.exists(geoDirPath): - os.mkdir(geoDirPath) - - animDirPath = os.path.join(geoDirPath, 'anims') - if not os.path.exists(animDirPath): - os.mkdir(animDirPath) - - animsName = dirName + '_anims' - animFileName = 'anim_' + toAlnum(animName) + '.inc.c' - animPath = os.path.join(animDirPath, animFileName) - - data = sm64_anim.to_c() - outFile = open(animPath, 'w', newline='\n') - outFile.write(data.source) - outFile.close() - - headerPath = os.path.join(geoDirPath, 'anim_header.h') - headerFile = open(headerPath, 'w', newline='\n') - headerFile.write('extern const struct Animation *const ' + animsName + '[];\n') - headerFile.close() - - # write to data.inc.c - dataFilePath = os.path.join(animDirPath, 'data.inc.c') - if not os.path.exists(dataFilePath): - dataFile = open(dataFilePath, 'w', newline='\n') - dataFile.close() - writeIfNotFound(dataFilePath, '#include "' + animFileName + '"\n', '') - - # write to table.inc.c - tableFilePath = os.path.join(animDirPath, 'table.inc.c') - if not os.path.exists(tableFilePath): - tableFile = open(tableFilePath, 'w', newline='\n') - tableFile.write('const struct Animation *const ' + \ - animsName + '[] = {\n\tNULL,\n};\n') - tableFile.close() - writeIfNotFound(tableFilePath, '\t&' + sm64_anim.header.name + ',\n', '\tNULL,\n};') - - if not customExport: - if headerType == 'Actor': - groupPathC = os.path.join(dirPath, groupName + ".c") - groupPathH = os.path.join(dirPath, groupName + ".h") - - writeIfNotFound(groupPathC, '\n#include "' + dirName + '/anims/data.inc.c"', '') - writeIfNotFound(groupPathC, '\n#include "' + dirName + '/anims/table.inc.c"', '') - writeIfNotFound(groupPathH, '\n#include "' + dirName + '/anim_header.h"', '#endif') - elif headerType == 'Level': - groupPathC = os.path.join(dirPath, "leveldata.c") - groupPathH = os.path.join(dirPath, "header.h") - - writeIfNotFound(groupPathC, '\n#include "levels/' + levelName + '/' + dirName + '/anims/data.inc.c"', '') - writeIfNotFound(groupPathC, '\n#include "levels/' + levelName + '/' + dirName + '/anims/table.inc.c"', '') - writeIfNotFound(groupPathH, '\n#include "levels/' + levelName + '/' + dirName + '/anim_header.h"', '\n#endif') - -def exportAnimationBinary(romfile, exportRange, armatureObj, DMAAddresses, - segmentData, isDMA, loopAnim): - - startAddress = get64bitAlignedAddr(exportRange[0]) - sm64_anim = exportAnimationCommon(armatureObj, loopAnim, armatureObj.name) - - animData = sm64_anim.to_binary(segmentData, isDMA, startAddress) - - if startAddress + len(animData) > exportRange[1]: - raise PluginError('Size too big: Data ends at ' + \ - hex(startAddress + len(animData)) +\ - ', which is larger than the specified range.') - - romfile.seek(startAddress) - romfile.write(animData) - - addrRange = (startAddress, startAddress + len(animData)) - - if not isDMA: - animTablePointer = get64bitAlignedAddr(startAddress + len(animData)) - romfile.seek(animTablePointer) - romfile.write(encodeSegmentedAddr(startAddress, segmentData)) - return addrRange, animTablePointer - else: - if DMAAddresses is not None: - romfile.seek(DMAAddresses['entry']) - romfile.write((startAddress - DMAAddresses['start']).to_bytes( - 4, byteorder = 'big')) - romfile.seek(DMAAddresses['entry'] + 4) - romfile.write(len(animData).to_bytes(4, byteorder='big')) - return addrRange, None +def exportAnimationC( + armatureObj, + loopAnim, + dirPath, + dirName, + groupName, + customExport, + headerType, + levelName, +): + dirPath, texDir = getExportDir( + customExport, dirPath, headerType, levelName, "", dirName + ) + + sm64_anim = exportAnimationCommon(armatureObj, loopAnim, dirName + "_anim") + animName = armatureObj.animation_data.action.name + + geoDirPath = os.path.join(dirPath, toAlnum(dirName)) + if not os.path.exists(geoDirPath): + os.mkdir(geoDirPath) + + animDirPath = os.path.join(geoDirPath, "anims") + if not os.path.exists(animDirPath): + os.mkdir(animDirPath) + + animsName = dirName + "_anims" + animFileName = "anim_" + toAlnum(animName) + ".inc.c" + animPath = os.path.join(animDirPath, animFileName) + + data = sm64_anim.to_c() + outFile = open(animPath, "w", newline="\n") + outFile.write(data.source) + outFile.close() + + headerPath = os.path.join(geoDirPath, "anim_header.h") + headerFile = open(headerPath, "w", newline="\n") + headerFile.write("extern const struct Animation *const " + animsName + "[];\n") + headerFile.close() + + # write to data.inc.c + dataFilePath = os.path.join(animDirPath, "data.inc.c") + if not os.path.exists(dataFilePath): + dataFile = open(dataFilePath, "w", newline="\n") + dataFile.close() + writeIfNotFound(dataFilePath, '#include "' + animFileName + '"\n', "") + + # write to table.inc.c + tableFilePath = os.path.join(animDirPath, "table.inc.c") + if not os.path.exists(tableFilePath): + tableFile = open(tableFilePath, "w", newline="\n") + tableFile.write( + "const struct Animation *const " + animsName + "[] = {\n\tNULL,\n};\n" + ) + tableFile.close() + writeIfNotFound(tableFilePath, "\t&" + sm64_anim.header.name + ",\n", "\tNULL,\n};") + + if not customExport: + if headerType == "Actor": + groupPathC = os.path.join(dirPath, groupName + ".c") + groupPathH = os.path.join(dirPath, groupName + ".h") + + writeIfNotFound( + groupPathC, '\n#include "' + dirName + '/anims/data.inc.c"', "" + ) + writeIfNotFound( + groupPathC, '\n#include "' + dirName + '/anims/table.inc.c"', "" + ) + writeIfNotFound( + groupPathH, '\n#include "' + dirName + '/anim_header.h"', "#endif" + ) + elif headerType == "Level": + groupPathC = os.path.join(dirPath, "leveldata.c") + groupPathH = os.path.join(dirPath, "header.h") + + writeIfNotFound( + groupPathC, + '\n#include "levels/' + + levelName + + "/" + + dirName + + '/anims/data.inc.c"', + "", + ) + writeIfNotFound( + groupPathC, + '\n#include "levels/' + + levelName + + "/" + + dirName + + '/anims/table.inc.c"', + "", + ) + writeIfNotFound( + groupPathH, + '\n#include "levels/' + levelName + "/" + dirName + '/anim_header.h"', + "\n#endif", + ) + + +def exportAnimationBinary( + romfile, exportRange, armatureObj, DMAAddresses, segmentData, isDMA, loopAnim +): + + startAddress = get64bitAlignedAddr(exportRange[0]) + sm64_anim = exportAnimationCommon(armatureObj, loopAnim, armatureObj.name) + + animData = sm64_anim.to_binary(segmentData, isDMA, startAddress) + + if startAddress + len(animData) > exportRange[1]: + raise PluginError( + "Size too big: Data ends at " + + hex(startAddress + len(animData)) + + ", which is larger than the specified range." + ) + + romfile.seek(startAddress) + romfile.write(animData) + + addrRange = (startAddress, startAddress + len(animData)) + + if not isDMA: + animTablePointer = get64bitAlignedAddr(startAddress + len(animData)) + romfile.seek(animTablePointer) + romfile.write(encodeSegmentedAddr(startAddress, segmentData)) + return addrRange, animTablePointer + else: + if DMAAddresses is not None: + romfile.seek(DMAAddresses["entry"]) + romfile.write( + (startAddress - DMAAddresses["start"]).to_bytes(4, byteorder="big") + ) + romfile.seek(DMAAddresses["entry"] + 4) + romfile.write(len(animData).to_bytes(4, byteorder="big")) + return addrRange, None + def exportAnimationInsertableBinary(filepath, armatureObj, isDMA, loopAnim): - startAddress = get64bitAlignedAddr(0) - sm64_anim = exportAnimationCommon(armatureObj, loopAnim, armatureObj.name) - segmentData = copy.copy(bank0Segment) - - animData = sm64_anim.to_binary(segmentData, isDMA, startAddress) - - if startAddress + len(animData) > 0xFFFFFF: - raise PluginError('Size too big: Data ends at ' + \ - hex(startAddress + len(animData)) +\ - ', which is larger than the specified range.') - - writeInsertableFile(filepath, insertableBinaryTypes['Animation'], - sm64_anim.get_ptr_offsets(isDMA), startAddress, animData) - + startAddress = get64bitAlignedAddr(0) + sm64_anim = exportAnimationCommon(armatureObj, loopAnim, armatureObj.name) + segmentData = copy.copy(bank0Segment) -def exportAnimationCommon(armatureObj, loopAnim, name): - if armatureObj.animation_data is None or \ - armatureObj.animation_data.action is None: - raise PluginError("No active animation selected.") - anim = armatureObj.animation_data.action - sm64_anim = SM64_Animation(toAlnum(name + "_" + anim.name)) - - nodeCount = len(armatureObj.data.bones) - - frameInterval = [0,0] - - # frame_start is minimum 0 - frameInterval[0] = max(bpy.context.scene.frame_start, - int(round(anim.frame_range[0]))) - - frameInterval[1] = \ - max(min(bpy.context.scene.frame_end, - int(round(anim.frame_range[1]))), frameInterval[0]) + 1 - translationData, armatureFrameData = convertAnimationData(anim, armatureObj, frameInterval[1]) - - repetitions = 0 if loopAnim else 1 - marioYOffset = 0x00 # ??? Seems to be this value for most animations - - transformValuesOffset = 0 - headerSize = 0x1A - transformIndicesStart = headerSize #0x18 if including animSize? - - # all node rotations + root translation - # *3 for each property (xyz) and *4 for entry size - # each keyframe stored as 2 bytes - # transformValuesStart = transformIndicesStart + (nodeCount + 1) * 3 * 4 - transformValuesStart = transformIndicesStart - - for translationFrameProperty in translationData: - frameCount = len(translationFrameProperty.frames) - sm64_anim.indices.shortData.append(frameCount) - sm64_anim.indices.shortData.append(transformValuesOffset) - if(transformValuesOffset) > 2**16 - 1: - raise PluginError('Animation is too large.') - transformValuesOffset += frameCount - transformValuesStart += 4 - for value in translationFrameProperty.frames: - sm64_anim.values.shortData.append(int.from_bytes(value.to_bytes(2,'big', signed = True), byteorder = 'big', signed = False)) - - for boneFrameData in armatureFrameData: - for boneFrameDataProperty in boneFrameData: - frameCount = len(boneFrameDataProperty.frames) - sm64_anim.indices.shortData.append(frameCount) - sm64_anim.indices.shortData.append(transformValuesOffset) - if(transformValuesOffset) > 2**16 - 1: - raise PluginError('Animation is too large.') - transformValuesOffset += frameCount - transformValuesStart += 4 - for value in boneFrameDataProperty.frames: - sm64_anim.values.shortData.append(value) - - animSize = headerSize + len(sm64_anim.indices.shortData) * 2 + \ - len(sm64_anim.values.shortData) * 2 - - sm64_anim.header = SM64_AnimationHeader(sm64_anim.name, repetitions, - marioYOffset, frameInterval, nodeCount, transformValuesStart, - transformIndicesStart, animSize) - - return sm64_anim - -def convertAnimationData(anim, armatureObj, frameEnd): - bonesToProcess = findStartBones(armatureObj) - currentBone = armatureObj.data.bones[bonesToProcess[0]] - animBones = [] - - # Get animation bones in order - while len(bonesToProcess) > 0: - boneName = bonesToProcess[0] - currentBone = armatureObj.data.bones[boneName] - currentPoseBone = armatureObj.pose.bones[boneName] - bonesToProcess = bonesToProcess[1:] - - # Only handle 0x13 bones for animation - if currentBone.geo_cmd in animatableBoneTypes: - animBones.append(boneName) - - # Traverse children in alphabetical order. - childrenNames = sorted([bone.name for bone in currentBone.children]) - bonesToProcess = childrenNames + bonesToProcess - - # list of boneFrameData, which is [[x frames], [y frames], [z frames]] - translationData = [ValueFrameData(0, i, []) for i in range(3)] - armatureFrameData = [[ - ValueFrameData(i, 0, []), - ValueFrameData(i, 1, []), - ValueFrameData(i, 2, [])] for i in range(len(animBones))] - - currentFrame = bpy.context.scene.frame_current - for frame in range(frameEnd): - bpy.context.scene.frame_set(frame) - rootBone = armatureObj.data.bones[animBones[0]] - rootPoseBone = armatureObj.pose.bones[animBones[0]] - - # Hacky solution to handle Z-up to Y-up conversion - translation = \ - (rootBone.matrix.to_4x4().inverted() @\ - mathutils.Matrix.Scale(bpy.context.scene.blenderToSM64Scale, 4) @ rootPoseBone.matrix).decompose()[0] - saveTranslationFrame(translationData, translation) - - for boneIndex in range(len(animBones)): - boneName = animBones[boneIndex] - currentBone = armatureObj.data.bones[boneName] - currentPoseBone = armatureObj.pose.bones[boneName] - - rotationValue = \ - (currentBone.matrix.to_4x4().inverted() @ \ - currentPoseBone.matrix).to_quaternion() - if currentBone.parent is not None: - rotationValue = ( - currentBone.matrix.to_4x4().inverted() @ currentPoseBone.parent.matrix.inverted() @ \ - currentPoseBone.matrix).to_quaternion() - - # rest pose local, compared to current pose local - - saveQuaternionFrame(armatureFrameData[boneIndex], rotationValue) - - bpy.context.scene.frame_set(currentFrame) - removeTrailingFrames(translationData) - for frameData in armatureFrameData: - removeTrailingFrames(frameData) - - return translationData, armatureFrameData + animData = sm64_anim.to_binary(segmentData, isDMA, startAddress) -def getNextBone(boneStack, armatureObj): - if len(boneStack) == 0: - raise PluginError("More bones in animation than on armature.") - bone = armatureObj.data.bones[boneStack[0]] - boneStack = boneStack[1:] - boneStack = sorted([child.name for child in bone.children]) + boneStack - - # Only return 0x13 bone - while armatureObj.data.bones[bone.name].geo_cmd not in animatableBoneTypes: - if len(boneStack) == 0: - raise PluginError("More bones in animation than on armature.") - bone = armatureObj.data.bones[boneStack[0]] - boneStack = boneStack[1:] - boneStack = sorted([child.name for child in bone.children]) + boneStack - - return bone, boneStack + if startAddress + len(animData) > 0xFFFFFF: + raise PluginError( + "Size too big: Data ends at " + + hex(startAddress + len(animData)) + + ", which is larger than the specified range." + ) -def importAnimationToBlender(romfile, startAddress, armatureObj, segmentData, isDMA): - boneStack = findStartBones(armatureObj) - startBoneName = boneStack[0] - if armatureObj.data.bones[startBoneName].geo_cmd not in animatableBoneTypes: - startBone, boneStack = getNextBone(boneStack, armatureObj) - startBoneName = startBone.name - boneStack = [startBoneName] + boneStack - - animationHeader, armatureFrameData = \ - readAnimation('sm64_anim', romfile, startAddress, segmentData, isDMA) - - if len(armatureFrameData) > len(armatureObj.data.bones) + 1: - raise PluginError('More bones in animation than on armature.') - - #bpy.context.scene.render.fps = 30 - bpy.context.scene.frame_end = animationHeader.frameInterval[1] - anim = bpy.data.actions.new("sm64_anim") - - isRootTranslation = True - # boneFrameData = [[x keyframes], [y keyframes], [z keyframes]] - # len(armatureFrameData) should be = number of bones - # property index = 0,1,2 (aka x,y,z) - for boneFrameData in armatureFrameData: - if isRootTranslation: - for propertyIndex in range(3): - fcurve = anim.fcurves.new( - data_path = 'pose.bones["' + startBoneName + '"].location', - index = propertyIndex, - action_group = startBoneName) - for frame in range(len(boneFrameData[propertyIndex])): - fcurve.keyframe_points.insert(frame, boneFrameData[propertyIndex][frame]) - isRootTranslation = False - else: - bone, boneStack = getNextBone(boneStack, armatureObj) - for propertyIndex in range(3): - fcurve = anim.fcurves.new( - data_path = 'pose.bones["' + bone.name + '"].rotation_euler', - index = propertyIndex, - action_group = bone.name) - for frame in range(len(boneFrameData[propertyIndex])): - fcurve.keyframe_points.insert(frame, boneFrameData[propertyIndex][frame]) - - if armatureObj.animation_data is None: - armatureObj.animation_data_create() - armatureObj.animation_data.action = anim - -def readAnimation(name, romfile, startAddress, segmentData, isDMA): - animationHeader = readAnimHeader(name, romfile, startAddress, segmentData, isDMA) - - print("Frames: " + str(animationHeader.frameInterval[1]) + " / Nodes: " + str(animationHeader.nodeCount)) - - animationHeader.transformIndices = readAnimIndices( - romfile, animationHeader.transformIndicesStart, animationHeader.nodeCount) + writeInsertableFile( + filepath, + insertableBinaryTypes["Animation"], + sm64_anim.get_ptr_offsets(isDMA), + startAddress, + animData, + ) - armatureFrameData = [] #list of list of frames - # sm64 space -> blender space -> pose space - # BlenderToSM64: YZX (set rotation mode of bones) - # SM64toBlender: ZXY (set anim keyframes and model armature) - # new bones should extrude in +Y direction +def exportAnimationCommon(armatureObj, loopAnim, name): + if armatureObj.animation_data is None or armatureObj.animation_data.action is None: + raise PluginError("No active animation selected.") + anim = armatureObj.animation_data.action + sm64_anim = SM64_Animation(toAlnum(name + "_" + anim.name)) + + nodeCount = len(armatureObj.data.bones) + + frameInterval = [0, 0] + + # frame_start is minimum 0 + frameInterval[0] = max( + bpy.context.scene.frame_start, int(round(anim.frame_range[0])) + ) + + frameInterval[1] = ( + max( + min(bpy.context.scene.frame_end, int(round(anim.frame_range[1]))), + frameInterval[0], + ) + + 1 + ) + translationData, armatureFrameData = convertAnimationData( + anim, armatureObj, frameInterval[1] + ) + + repetitions = 0 if loopAnim else 1 + marioYOffset = 0x00 # ??? Seems to be this value for most animations + + transformValuesOffset = 0 + headerSize = 0x1A + transformIndicesStart = headerSize # 0x18 if including animSize? + + # all node rotations + root translation + # *3 for each property (xyz) and *4 for entry size + # each keyframe stored as 2 bytes + # transformValuesStart = transformIndicesStart + (nodeCount + 1) * 3 * 4 + transformValuesStart = transformIndicesStart + + for translationFrameProperty in translationData: + frameCount = len(translationFrameProperty.frames) + sm64_anim.indices.shortData.append(frameCount) + sm64_anim.indices.shortData.append(transformValuesOffset) + if (transformValuesOffset) > 2 ** 16 - 1: + raise PluginError("Animation is too large.") + transformValuesOffset += frameCount + transformValuesStart += 4 + for value in translationFrameProperty.frames: + sm64_anim.values.shortData.append( + int.from_bytes( + value.to_bytes(2, "big", signed=True), byteorder="big", signed=False + ) + ) + + for boneFrameData in armatureFrameData: + for boneFrameDataProperty in boneFrameData: + frameCount = len(boneFrameDataProperty.frames) + sm64_anim.indices.shortData.append(frameCount) + sm64_anim.indices.shortData.append(transformValuesOffset) + if (transformValuesOffset) > 2 ** 16 - 1: + raise PluginError("Animation is too large.") + transformValuesOffset += frameCount + transformValuesStart += 4 + for value in boneFrameDataProperty.frames: + sm64_anim.values.shortData.append(value) + + animSize = ( + headerSize + + len(sm64_anim.indices.shortData) * 2 + + len(sm64_anim.values.shortData) * 2 + ) + + sm64_anim.header = SM64_AnimationHeader( + sm64_anim.name, + repetitions, + marioYOffset, + frameInterval, + nodeCount, + transformValuesStart, + transformIndicesStart, + animSize, + ) + + return sm64_anim - # handle root translation - boneFrameData = [[],[],[]] - rootIndexNode = animationHeader.transformIndices[0] - boneFrameData[0] = [n for n in getKeyFramesTranslation(romfile, animationHeader.transformValuesStart, rootIndexNode.x)] - boneFrameData[1] = [n for n in getKeyFramesTranslation(romfile, animationHeader.transformValuesStart, rootIndexNode.y)] - boneFrameData[2] = [n for n in getKeyFramesTranslation(romfile, animationHeader.transformValuesStart, rootIndexNode.z)] - armatureFrameData.append(boneFrameData) - # handle rotations - for boneIndexNode in animationHeader.transformIndices[1:]: - boneFrameData = [[],[],[]] +def convertAnimationData(anim, armatureObj, frameEnd): + bonesToProcess = findStartBones(armatureObj) + currentBone = armatureObj.data.bones[bonesToProcess[0]] + animBones = [] + + # Get animation bones in order + while len(bonesToProcess) > 0: + boneName = bonesToProcess[0] + currentBone = armatureObj.data.bones[boneName] + currentPoseBone = armatureObj.pose.bones[boneName] + bonesToProcess = bonesToProcess[1:] + + # Only handle 0x13 bones for animation + if currentBone.geo_cmd in animatableBoneTypes: + animBones.append(boneName) + + # Traverse children in alphabetical order. + childrenNames = sorted([bone.name for bone in currentBone.children]) + bonesToProcess = childrenNames + bonesToProcess + + # list of boneFrameData, which is [[x frames], [y frames], [z frames]] + translationData = [ValueFrameData(0, i, []) for i in range(3)] + armatureFrameData = [ + [ValueFrameData(i, 0, []), ValueFrameData(i, 1, []), ValueFrameData(i, 2, [])] + for i in range(len(animBones)) + ] + + currentFrame = bpy.context.scene.frame_current + for frame in range(frameEnd): + bpy.context.scene.frame_set(frame) + rootBone = armatureObj.data.bones[animBones[0]] + rootPoseBone = armatureObj.pose.bones[animBones[0]] + + # Hacky solution to handle Z-up to Y-up conversion + translation = ( + rootBone.matrix.to_4x4().inverted() + @ mathutils.Matrix.Scale(bpy.context.scene.blenderToSM64Scale, 4) + @ rootPoseBone.matrix + ).decompose()[0] + saveTranslationFrame(translationData, translation) + + for boneIndex in range(len(animBones)): + boneName = animBones[boneIndex] + currentBone = armatureObj.data.bones[boneName] + currentPoseBone = armatureObj.pose.bones[boneName] + + rotationValue = ( + currentBone.matrix.to_4x4().inverted() @ currentPoseBone.matrix + ).to_quaternion() + if currentBone.parent is not None: + rotationValue = ( + currentBone.matrix.to_4x4().inverted() + @ currentPoseBone.parent.matrix.inverted() + @ currentPoseBone.matrix + ).to_quaternion() + + # rest pose local, compared to current pose local + + saveQuaternionFrame(armatureFrameData[boneIndex], rotationValue) + + bpy.context.scene.frame_set(currentFrame) + removeTrailingFrames(translationData) + for frameData in armatureFrameData: + removeTrailingFrames(frameData) + + return translationData, armatureFrameData - # Transforming SM64 space to Blender space - boneFrameData[0] = [n for n in \ - getKeyFramesRotation(romfile, animationHeader.transformValuesStart, boneIndexNode.x)] - boneFrameData[1] = [n for n in \ - getKeyFramesRotation(romfile, animationHeader.transformValuesStart, boneIndexNode.y)] - boneFrameData[2] = [n for n in \ - getKeyFramesRotation(romfile, animationHeader.transformValuesStart, boneIndexNode.z)] - armatureFrameData.append(boneFrameData) +def getNextBone(boneStack, armatureObj): + if len(boneStack) == 0: + raise PluginError("More bones in animation than on armature.") + bone = armatureObj.data.bones[boneStack[0]] + boneStack = boneStack[1:] + boneStack = sorted([child.name for child in bone.children]) + boneStack - return (animationHeader, armatureFrameData) + # Only return 0x13 bone + while armatureObj.data.bones[bone.name].geo_cmd not in animatableBoneTypes: + if len(boneStack) == 0: + raise PluginError("More bones in animation than on armature.") + bone = armatureObj.data.bones[boneStack[0]] + boneStack = boneStack[1:] + boneStack = sorted([child.name for child in bone.children]) + boneStack -def getKeyFramesRotation(romfile, transformValuesStart, boneIndex): - ptrToValue = transformValuesStart + boneIndex.startOffset - romfile.seek(ptrToValue) + return bone, boneStack - keyframes = [] - for frame in range(boneIndex.numFrames): - romfile.seek(ptrToValue + frame * 2) - value = int.from_bytes(romfile.read(2), 'big') * 360 / (2**16) - keyframes.append(math.radians(value)) - return keyframes +def importAnimationToBlender(romfile, startAddress, armatureObj, segmentData, isDMA): + boneStack = findStartBones(armatureObj) + startBoneName = boneStack[0] + if armatureObj.data.bones[startBoneName].geo_cmd not in animatableBoneTypes: + startBone, boneStack = getNextBone(boneStack, armatureObj) + startBoneName = startBone.name + boneStack = [startBoneName] + boneStack + + animationHeader, armatureFrameData = readAnimation( + "sm64_anim", romfile, startAddress, segmentData, isDMA + ) + + if len(armatureFrameData) > len(armatureObj.data.bones) + 1: + raise PluginError("More bones in animation than on armature.") + + # bpy.context.scene.render.fps = 30 + bpy.context.scene.frame_end = animationHeader.frameInterval[1] + anim = bpy.data.actions.new("sm64_anim") + + isRootTranslation = True + # boneFrameData = [[x keyframes], [y keyframes], [z keyframes]] + # len(armatureFrameData) should be = number of bones + # property index = 0,1,2 (aka x,y,z) + for boneFrameData in armatureFrameData: + if isRootTranslation: + for propertyIndex in range(3): + fcurve = anim.fcurves.new( + data_path='pose.bones["' + startBoneName + '"].location', + index=propertyIndex, + action_group=startBoneName, + ) + for frame in range(len(boneFrameData[propertyIndex])): + fcurve.keyframe_points.insert( + frame, boneFrameData[propertyIndex][frame] + ) + isRootTranslation = False + else: + bone, boneStack = getNextBone(boneStack, armatureObj) + for propertyIndex in range(3): + fcurve = anim.fcurves.new( + data_path='pose.bones["' + bone.name + '"].rotation_euler', + index=propertyIndex, + action_group=bone.name, + ) + for frame in range(len(boneFrameData[propertyIndex])): + fcurve.keyframe_points.insert( + frame, boneFrameData[propertyIndex][frame] + ) + + if armatureObj.animation_data is None: + armatureObj.animation_data_create() + armatureObj.animation_data.action = anim -def getKeyFramesTranslation(romfile, transformValuesStart, boneIndex): - ptrToValue = transformValuesStart + boneIndex.startOffset - romfile.seek(ptrToValue) - keyframes = [] - for frame in range(boneIndex.numFrames): - romfile.seek(ptrToValue + frame * 2) - keyframes.append(int.from_bytes(romfile.read(2), 'big', signed = True) /\ - bpy.context.scene.blenderToSM64Scale) +def readAnimation(name, romfile, startAddress, segmentData, isDMA): + animationHeader = readAnimHeader(name, romfile, startAddress, segmentData, isDMA) + + print( + "Frames: " + + str(animationHeader.frameInterval[1]) + + " / Nodes: " + + str(animationHeader.nodeCount) + ) + + animationHeader.transformIndices = readAnimIndices( + romfile, animationHeader.transformIndicesStart, animationHeader.nodeCount + ) + + armatureFrameData = [] # list of list of frames + + # sm64 space -> blender space -> pose space + # BlenderToSM64: YZX (set rotation mode of bones) + # SM64toBlender: ZXY (set anim keyframes and model armature) + # new bones should extrude in +Y direction + + # handle root translation + boneFrameData = [[], [], []] + rootIndexNode = animationHeader.transformIndices[0] + boneFrameData[0] = [ + n + for n in getKeyFramesTranslation( + romfile, animationHeader.transformValuesStart, rootIndexNode.x + ) + ] + boneFrameData[1] = [ + n + for n in getKeyFramesTranslation( + romfile, animationHeader.transformValuesStart, rootIndexNode.y + ) + ] + boneFrameData[2] = [ + n + for n in getKeyFramesTranslation( + romfile, animationHeader.transformValuesStart, rootIndexNode.z + ) + ] + armatureFrameData.append(boneFrameData) + + # handle rotations + for boneIndexNode in animationHeader.transformIndices[1:]: + boneFrameData = [[], [], []] + + # Transforming SM64 space to Blender space + boneFrameData[0] = [ + n + for n in getKeyFramesRotation( + romfile, animationHeader.transformValuesStart, boneIndexNode.x + ) + ] + boneFrameData[1] = [ + n + for n in getKeyFramesRotation( + romfile, animationHeader.transformValuesStart, boneIndexNode.y + ) + ] + boneFrameData[2] = [ + n + for n in getKeyFramesRotation( + romfile, animationHeader.transformValuesStart, boneIndexNode.z + ) + ] + + armatureFrameData.append(boneFrameData) + + return (animationHeader, armatureFrameData) - return keyframes -def readAnimHeader(name, romfile, startAddress, segmentData, isDMA): - frameInterval = [0,0] +def getKeyFramesRotation(romfile, transformValuesStart, boneIndex): + ptrToValue = transformValuesStart + boneIndex.startOffset + romfile.seek(ptrToValue) - romfile.seek(startAddress + 0x00) - numRepeats = int.from_bytes(romfile.read(2), 'big') + keyframes = [] + for frame in range(boneIndex.numFrames): + romfile.seek(ptrToValue + frame * 2) + value = int.from_bytes(romfile.read(2), "big") * 360 / (2 ** 16) + keyframes.append(math.radians(value)) - romfile.seek(startAddress + 0x02) - marioYOffset = int.from_bytes(romfile.read(2), 'big') + return keyframes - romfile.seek(startAddress + 0x06) - frameInterval[0] = int.from_bytes(romfile.read(2), 'big') - romfile.seek(startAddress + 0x08) - frameInterval[1] = int.from_bytes(romfile.read(2), 'big') +def getKeyFramesTranslation(romfile, transformValuesStart, boneIndex): + ptrToValue = transformValuesStart + boneIndex.startOffset + romfile.seek(ptrToValue) - romfile.seek(startAddress + 0x0A) - numNodes = int.from_bytes(romfile.read(2), 'big') + keyframes = [] + for frame in range(boneIndex.numFrames): + romfile.seek(ptrToValue + frame * 2) + keyframes.append( + int.from_bytes(romfile.read(2), "big", signed=True) + / bpy.context.scene.blenderToSM64Scale + ) - romfile.seek(startAddress + 0x0C) - transformValuesOffset = int.from_bytes(romfile.read(4), 'big') - if isDMA: - transformValuesStart = startAddress + transformValuesOffset - else: - transformValuesStart = decodeSegmentedAddr( - transformValuesOffset.to_bytes(4, byteorder='big'), segmentData) + return keyframes - romfile.seek(startAddress + 0x10) - transformIndicesOffset = int.from_bytes(romfile.read(4), 'big') - if isDMA: - transformIndicesStart = startAddress + transformIndicesOffset - else: - transformIndicesStart = decodeSegmentedAddr( - transformIndicesOffset.to_bytes(4, byteorder='big'), segmentData) - romfile.seek(startAddress + 0x14) - animSize = int.from_bytes(romfile.read(4), 'big') +def readAnimHeader(name, romfile, startAddress, segmentData, isDMA): + frameInterval = [0, 0] + + romfile.seek(startAddress + 0x00) + numRepeats = int.from_bytes(romfile.read(2), "big") + + romfile.seek(startAddress + 0x02) + marioYOffset = int.from_bytes(romfile.read(2), "big") + + romfile.seek(startAddress + 0x06) + frameInterval[0] = int.from_bytes(romfile.read(2), "big") + + romfile.seek(startAddress + 0x08) + frameInterval[1] = int.from_bytes(romfile.read(2), "big") + + romfile.seek(startAddress + 0x0A) + numNodes = int.from_bytes(romfile.read(2), "big") + + romfile.seek(startAddress + 0x0C) + transformValuesOffset = int.from_bytes(romfile.read(4), "big") + if isDMA: + transformValuesStart = startAddress + transformValuesOffset + else: + transformValuesStart = decodeSegmentedAddr( + transformValuesOffset.to_bytes(4, byteorder="big"), segmentData + ) + + romfile.seek(startAddress + 0x10) + transformIndicesOffset = int.from_bytes(romfile.read(4), "big") + if isDMA: + transformIndicesStart = startAddress + transformIndicesOffset + else: + transformIndicesStart = decodeSegmentedAddr( + transformIndicesOffset.to_bytes(4, byteorder="big"), segmentData + ) + + romfile.seek(startAddress + 0x14) + animSize = int.from_bytes(romfile.read(4), "big") + + return SM64_AnimationHeader( + name, + numRepeats, + marioYOffset, + frameInterval, + numNodes, + transformValuesStart, + transformIndicesStart, + animSize, + ) - return SM64_AnimationHeader(name, numRepeats, marioYOffset, frameInterval, numNodes, - transformValuesStart, transformIndicesStart, animSize) def readAnimIndices(romfile, ptrAddress, nodeCount): - indices = [] + indices = [] - # Handle root transform - rootPosIndex = readTransformIndex(romfile, ptrAddress) - indices.append(rootPosIndex) + # Handle root transform + rootPosIndex = readTransformIndex(romfile, ptrAddress) + indices.append(rootPosIndex) - # Handle rotations - for i in range(nodeCount): - rotationIndex = readTransformIndex(romfile, ptrAddress + (i+1) * 12) - indices.append(rotationIndex) + # Handle rotations + for i in range(nodeCount): + rotationIndex = readTransformIndex(romfile, ptrAddress + (i + 1) * 12) + indices.append(rotationIndex) + + return indices - return indices def readTransformIndex(romfile, startAddress): - x = readValueIndex(romfile, startAddress + 0) - y = readValueIndex(romfile, startAddress + 4) - z = readValueIndex(romfile, startAddress + 8) + x = readValueIndex(romfile, startAddress + 0) + y = readValueIndex(romfile, startAddress + 4) + z = readValueIndex(romfile, startAddress + 8) + + return SM64_AnimIndexNode(x, y, z) - return SM64_AnimIndexNode(x, y, z) def readValueIndex(romfile, startAddress): - romfile.seek(startAddress) - numFrames = int.from_bytes(romfile.read(2), 'big') - romfile.seek(startAddress + 2) + romfile.seek(startAddress) + numFrames = int.from_bytes(romfile.read(2), "big") + romfile.seek(startAddress + 2) + + # multiply 2 because value is the index in array of shorts (???) + startOffset = int.from_bytes(romfile.read(2), "big") * 2 + print(str(hex(startAddress)) + ": " + str(numFrames) + " " + str(startOffset)) + return SM64_AnimIndex(numFrames, startOffset) - # multiply 2 because value is the index in array of shorts (???) - startOffset = int.from_bytes(romfile.read(2), 'big') * 2 - print(str(hex(startAddress)) + ": " + str(numFrames) + " " + str(startOffset)) - return SM64_AnimIndex(numFrames, startOffset) def writeAnimation(romfile, startAddress, segmentData): - pass + pass + def writeAnimHeader(romfile, startAddress, segmentData): - pass + pass + class SM64_ExportAnimMario(bpy.types.Operator): - bl_idname = 'object.sm64_export_anim' - bl_label = "Export Animation" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - romfileOutput = None - tempROM = None - try: - if len(context.selected_objects) == 0 or not \ - isinstance(context.selected_objects[0].data, bpy.types.Armature): - raise PluginError("Armature not selected.") - if len(context.selected_objects) > 1 : - raise PluginError("Multiple objects selected, make sure to select only one.") - armatureObj = context.selected_objects[0] - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = "OBJECT") - except Exception as e: - raisePluginError(self, e) - return {"CANCELLED"} - - try: - # Rotate all armatures 90 degrees - applyRotation([armatureObj], - math.radians(90), 'X') - - if context.scene.fast64.sm64.exportType == 'C': - exportPath, levelName = getPathAndLevel(context.scene.animCustomExport, - context.scene.animExportPath, context.scene.animLevelName, - context.scene.animLevelOption) - if not context.scene.animCustomExport: - applyBasicTweaks(exportPath) - exportAnimationC(armatureObj, context.scene.loopAnimation, - exportPath, bpy.context.scene.animName, - bpy.context.scene.animGroupName, - context.scene.animCustomExport, context.scene.animExportHeaderType, levelName) - self.report({'INFO'}, 'Success!') - elif context.scene.fast64.sm64.exportType == 'Insertable Binary': - exportAnimationInsertableBinary( - bpy.path.abspath(context.scene.animInsertableBinaryPath), - armatureObj, context.scene.isDMAExport, - context.scene.loopAnimation) - self.report({'INFO'}, 'Success! Animation at ' +\ - context.scene.animInsertableBinaryPath) - else: - checkExpanded(bpy.path.abspath(context.scene.exportRom)) - tempROM = tempName(context.scene.outputRom) - romfileExport = \ - open(bpy.path.abspath(context.scene.exportRom), 'rb') - shutil.copy(bpy.path.abspath(context.scene.exportRom), - bpy.path.abspath(tempROM)) - romfileExport.close() - romfileOutput = open(bpy.path.abspath(tempROM), 'rb+') - - # Note actual level doesn't matter for Mario, since he is in all of them - levelParsed = parseLevelAtPointer(romfileOutput, level_pointers [context.scene.levelAnimExport]) - segmentData = levelParsed.segmentData - if context.scene.extendBank4: - ExtendBank0x04(romfileOutput, segmentData, - defaultExtendSegment4) - - DMAAddresses = None - if context.scene.animOverwriteDMAEntry: - DMAAddresses = {} - DMAAddresses['start'] = \ - int(context.scene.DMAStartAddress, 16) - DMAAddresses['entry'] = \ - int(context.scene.DMAEntryAddress, 16) - - addrRange, nonDMAListPtr = exportAnimationBinary( - romfileOutput, [int(context.scene.animExportStart, 16), - int(context.scene.animExportEnd, 16)], - bpy.context.active_object, - DMAAddresses, segmentData, context.scene.isDMAExport, - context.scene.loopAnimation) - - if not context.scene.isDMAExport: - segmentedPtr = encodeSegmentedAddr(addrRange[0], segmentData) - if context.scene.setAnimListIndex: - romfileOutput.seek(int(context.scene.addr_0x27, 16) + 4) - segAnimPtr = romfileOutput.read(4) - virtAnimPtr = decodeSegmentedAddr(segAnimPtr, segmentData) - romfileOutput.seek(virtAnimPtr + 4 * context.scene.animListIndexExport) - romfileOutput.write(segmentedPtr) - if context.scene.overwrite_0x28: - romfileOutput.seek(int(context.scene.addr_0x28, 16) + 1) - romfileOutput.write(bytearray([context.scene.animListIndexExport])) - else: - segmentedPtr = None - - romfileOutput.close() - if os.path.exists(bpy.path.abspath(context.scene.outputRom)): - os.remove(bpy.path.abspath(context.scene.outputRom)) - os.rename(bpy.path.abspath(tempROM), - bpy.path.abspath(context.scene.outputRom)) - - if not context.scene.isDMAExport: - if context.scene.setAnimListIndex: - self.report({'INFO'}, 'Sucess! Animation table at ' + \ - hex(virtAnimPtr) + ', animation at (' + \ - hex(addrRange[0]) + ', ' + hex(addrRange[1]) + ') ' +\ - '(Seg. ' + bytesToHex(segmentedPtr) + ').') - else: - self.report({'INFO'}, 'Sucess! Animation at (' + \ - hex(addrRange[0]) + ', ' + hex(addrRange[1]) + ') ' +\ - '(Seg. ' + bytesToHex(segmentedPtr) + ').') - else: - self.report({'INFO'}, 'Success! Animation at (' + \ - hex(addrRange[0]) + ', ' + hex(addrRange[1]) + ').') - - applyRotation([armatureObj], - math.radians(-90), 'X') - except Exception as e: - applyRotation([armatureObj], - math.radians(-90), 'X') - - if romfileOutput is not None: - romfileOutput.close() - if tempROM is not None and os.path.exists(bpy.path.abspath(tempROM)): - os.remove(bpy.path.abspath(tempROM)) - raisePluginError(self, e) - return {'CANCELLED'} # must return a set - - return {'FINISHED'} # must return a set + bl_idname = "object.sm64_export_anim" + bl_label = "Export Animation" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + romfileOutput = None + tempROM = None + try: + if len(context.selected_objects) == 0 or not isinstance( + context.selected_objects[0].data, bpy.types.Armature + ): + raise PluginError("Armature not selected.") + if len(context.selected_objects) > 1: + raise PluginError( + "Multiple objects selected, make sure to select only one." + ) + armatureObj = context.selected_objects[0] + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} + + try: + # Rotate all armatures 90 degrees + applyRotation([armatureObj], math.radians(90), "X") + + if context.scene.fast64.sm64.exportType == "C": + exportPath, levelName = getPathAndLevel( + context.scene.animCustomExport, + context.scene.animExportPath, + context.scene.animLevelName, + context.scene.animLevelOption, + ) + if not context.scene.animCustomExport: + applyBasicTweaks(exportPath) + exportAnimationC( + armatureObj, + context.scene.loopAnimation, + exportPath, + bpy.context.scene.animName, + bpy.context.scene.animGroupName, + context.scene.animCustomExport, + context.scene.animExportHeaderType, + levelName, + ) + self.report({"INFO"}, "Success!") + elif context.scene.fast64.sm64.exportType == "Insertable Binary": + exportAnimationInsertableBinary( + bpy.path.abspath(context.scene.animInsertableBinaryPath), + armatureObj, + context.scene.isDMAExport, + context.scene.loopAnimation, + ) + self.report( + {"INFO"}, + "Success! Animation at " + context.scene.animInsertableBinaryPath, + ) + else: + checkExpanded(bpy.path.abspath(context.scene.exportRom)) + tempROM = tempName(context.scene.outputRom) + romfileExport = open(bpy.path.abspath(context.scene.exportRom), "rb") + shutil.copy( + bpy.path.abspath(context.scene.exportRom), bpy.path.abspath(tempROM) + ) + romfileExport.close() + romfileOutput = open(bpy.path.abspath(tempROM), "rb+") + + # Note actual level doesn't matter for Mario, since he is in all of them + levelParsed = parseLevelAtPointer( + romfileOutput, level_pointers[context.scene.levelAnimExport] + ) + segmentData = levelParsed.segmentData + if context.scene.extendBank4: + ExtendBank0x04(romfileOutput, segmentData, defaultExtendSegment4) + + DMAAddresses = None + if context.scene.animOverwriteDMAEntry: + DMAAddresses = {} + DMAAddresses["start"] = int(context.scene.DMAStartAddress, 16) + DMAAddresses["entry"] = int(context.scene.DMAEntryAddress, 16) + + addrRange, nonDMAListPtr = exportAnimationBinary( + romfileOutput, + [ + int(context.scene.animExportStart, 16), + int(context.scene.animExportEnd, 16), + ], + bpy.context.active_object, + DMAAddresses, + segmentData, + context.scene.isDMAExport, + context.scene.loopAnimation, + ) + + if not context.scene.isDMAExport: + segmentedPtr = encodeSegmentedAddr(addrRange[0], segmentData) + if context.scene.setAnimListIndex: + romfileOutput.seek(int(context.scene.addr_0x27, 16) + 4) + segAnimPtr = romfileOutput.read(4) + virtAnimPtr = decodeSegmentedAddr(segAnimPtr, segmentData) + romfileOutput.seek( + virtAnimPtr + 4 * context.scene.animListIndexExport + ) + romfileOutput.write(segmentedPtr) + if context.scene.overwrite_0x28: + romfileOutput.seek(int(context.scene.addr_0x28, 16) + 1) + romfileOutput.write( + bytearray([context.scene.animListIndexExport]) + ) + else: + segmentedPtr = None + + romfileOutput.close() + if os.path.exists(bpy.path.abspath(context.scene.outputRom)): + os.remove(bpy.path.abspath(context.scene.outputRom)) + os.rename( + bpy.path.abspath(tempROM), bpy.path.abspath(context.scene.outputRom) + ) + + if not context.scene.isDMAExport: + if context.scene.setAnimListIndex: + self.report( + {"INFO"}, + "Sucess! Animation table at " + + hex(virtAnimPtr) + + ", animation at (" + + hex(addrRange[0]) + + ", " + + hex(addrRange[1]) + + ") " + + "(Seg. " + + bytesToHex(segmentedPtr) + + ").", + ) + else: + self.report( + {"INFO"}, + "Sucess! Animation at (" + + hex(addrRange[0]) + + ", " + + hex(addrRange[1]) + + ") " + + "(Seg. " + + bytesToHex(segmentedPtr) + + ").", + ) + else: + self.report( + {"INFO"}, + "Success! Animation at (" + + hex(addrRange[0]) + + ", " + + hex(addrRange[1]) + + ").", + ) + + applyRotation([armatureObj], math.radians(-90), "X") + except Exception as e: + applyRotation([armatureObj], math.radians(-90), "X") + + if romfileOutput is not None: + romfileOutput.close() + if tempROM is not None and os.path.exists(bpy.path.abspath(tempROM)): + os.remove(bpy.path.abspath(tempROM)) + raisePluginError(self, e) + return {"CANCELLED"} # must return a set + + return {"FINISHED"} # must return a set + class SM64_ExportAnimPanel(SM64_Panel): - bl_idname = "SM64_PT_export_anim" - bl_label = "SM64 Animation Exporter" - goal = "Export Object/Actor/Anim" - - # called every frame - def draw(self, context): - col = self.layout.column() - propsAnimExport = col.operator(SM64_ExportAnimMario.bl_idname) - - col.prop(context.scene, 'loopAnimation') - if context.scene.fast64.sm64.exportType == 'C': - col.prop(context.scene, 'animCustomExport') - if context.scene.animCustomExport: - col.prop(context.scene, 'animExportPath') - prop_split(col, context.scene, 'animName', 'Name') - customExportWarning(col) - else: - prop_split(col, context.scene, 'animExportHeaderType', 'Export Type') - prop_split(col, context.scene, 'animName', 'Name') - if context.scene.animExportHeaderType == 'Actor': - prop_split(col, context.scene, 'animGroupName', 'Group Name') - elif context.scene.animExportHeaderType == 'Level': - prop_split(col, context.scene, 'animLevelOption', 'Level') - if context.scene.animLevelOption == 'custom': - prop_split(col, context.scene, 'animLevelName', 'Level Name') - - decompFolderMessage(col) - writeBox = makeWriteInfoBox(col) - writeBoxExportType(writeBox, context.scene.animExportHeaderType, - context.scene.animName, context.scene.animLevelName, - context.scene.animLevelOption) - - elif context.scene.fast64.sm64.exportType == 'Insertable Binary': - col.prop(context.scene, 'isDMAExport') - col.prop(context.scene, 'animInsertableBinaryPath') - else: - col.prop(context.scene, 'isDMAExport') - if context.scene.isDMAExport: - col.prop(context.scene, 'animOverwriteDMAEntry') - if context.scene.animOverwriteDMAEntry: - prop_split(col, context.scene, 'DMAStartAddress', - 'DMA Start Address') - prop_split(col, context.scene, 'DMAEntryAddress', - 'DMA Entry Address') - else: - col.prop(context.scene, 'setAnimListIndex') - if context.scene.setAnimListIndex: - prop_split(col, context.scene, 'addr_0x27', - '27 Command Address') - prop_split(col, context.scene, 'animListIndexExport', - 'Anim List Index') - col.prop(context.scene, 'overwrite_0x28') - if context.scene.overwrite_0x28: - prop_split(col, context.scene, 'addr_0x28', - '28 Command Address') - col.prop(context.scene, 'levelAnimExport') - col.separator() - prop_split(col, context.scene, 'animExportStart', 'Start Address') - prop_split(col, context.scene, 'animExportEnd', 'End Address') - + bl_idname = "SM64_PT_export_anim" + bl_label = "SM64 Animation Exporter" + goal = "Export Object/Actor/Anim" + + # called every frame + def draw(self, context): + col = self.layout.column() + propsAnimExport = col.operator(SM64_ExportAnimMario.bl_idname) + + col.prop(context.scene, "loopAnimation") + if context.scene.fast64.sm64.exportType == "C": + col.prop(context.scene, "animCustomExport") + if context.scene.animCustomExport: + col.prop(context.scene, "animExportPath") + prop_split(col, context.scene, "animName", "Name") + customExportWarning(col) + else: + prop_split(col, context.scene, "animExportHeaderType", "Export Type") + prop_split(col, context.scene, "animName", "Name") + if context.scene.animExportHeaderType == "Actor": + prop_split(col, context.scene, "animGroupName", "Group Name") + elif context.scene.animExportHeaderType == "Level": + prop_split(col, context.scene, "animLevelOption", "Level") + if context.scene.animLevelOption == "custom": + prop_split(col, context.scene, "animLevelName", "Level Name") + + decompFolderMessage(col) + writeBox = makeWriteInfoBox(col) + writeBoxExportType( + writeBox, + context.scene.animExportHeaderType, + context.scene.animName, + context.scene.animLevelName, + context.scene.animLevelOption, + ) + + elif context.scene.fast64.sm64.exportType == "Insertable Binary": + col.prop(context.scene, "isDMAExport") + col.prop(context.scene, "animInsertableBinaryPath") + else: + col.prop(context.scene, "isDMAExport") + if context.scene.isDMAExport: + col.prop(context.scene, "animOverwriteDMAEntry") + if context.scene.animOverwriteDMAEntry: + prop_split( + col, context.scene, "DMAStartAddress", "DMA Start Address" + ) + prop_split( + col, context.scene, "DMAEntryAddress", "DMA Entry Address" + ) + else: + col.prop(context.scene, "setAnimListIndex") + if context.scene.setAnimListIndex: + prop_split(col, context.scene, "addr_0x27", "27 Command Address") + prop_split( + col, context.scene, "animListIndexExport", "Anim List Index" + ) + col.prop(context.scene, "overwrite_0x28") + if context.scene.overwrite_0x28: + prop_split( + col, context.scene, "addr_0x28", "28 Command Address" + ) + col.prop(context.scene, "levelAnimExport") + col.separator() + prop_split(col, context.scene, "animExportStart", "Start Address") + prop_split(col, context.scene, "animExportEnd", "End Address") + + class SM64_ImportAnimMario(bpy.types.Operator): - bl_idname = 'object.sm64_import_anim' - bl_label = "Import Animation" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - romfileSrc = None - try: - checkExpanded(bpy.path.abspath(context.scene.importRom)) - romfileSrc = open(bpy.path.abspath(context.scene.importRom), 'rb') - except Exception as e: - raisePluginError(self, e) - return {'CANCELLED'} - try: - levelParsed = parseLevelAtPointer(romfileSrc, - level_pointers[context.scene.levelAnimImport]) - segmentData = levelParsed.segmentData - - animStart = int(context.scene.animStartImport, 16) - if context.scene.animIsSegPtr: - animStart = decodeSegmentedAddr( - animStart.to_bytes(4, 'big'), segmentData) - - if not context.scene.isDMAImport and context.scene.animIsAnimList: - romfileSrc.seek(animStart + 4 * context.scene.animListIndexImport) - actualPtr = romfileSrc.read(4) - animStart = decodeSegmentedAddr(actualPtr, segmentData) - - if len(context.selected_objects) == 0: - raise PluginError("Armature not selected.") - armatureObj = context.active_object - if type(armatureObj.data) is not bpy.types.Armature: - raise PluginError("Armature not selected.") - - importAnimationToBlender(romfileSrc, - animStart, armatureObj, - segmentData, context.scene.isDMAImport) - romfileSrc.close() - self.report({'INFO'}, 'Success!') - except Exception as e: - if romfileSrc is not None: - romfileSrc.close() - raisePluginError(self, e) - return {'CANCELLED'} # must return a set - - return {'FINISHED'} # must return a set + bl_idname = "object.sm64_import_anim" + bl_label = "Import Animation" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + romfileSrc = None + try: + checkExpanded(bpy.path.abspath(context.scene.importRom)) + romfileSrc = open(bpy.path.abspath(context.scene.importRom), "rb") + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} + try: + levelParsed = parseLevelAtPointer( + romfileSrc, level_pointers[context.scene.levelAnimImport] + ) + segmentData = levelParsed.segmentData + + animStart = int(context.scene.animStartImport, 16) + if context.scene.animIsSegPtr: + animStart = decodeSegmentedAddr( + animStart.to_bytes(4, "big"), segmentData + ) + + if not context.scene.isDMAImport and context.scene.animIsAnimList: + romfileSrc.seek(animStart + 4 * context.scene.animListIndexImport) + actualPtr = romfileSrc.read(4) + animStart = decodeSegmentedAddr(actualPtr, segmentData) + + if len(context.selected_objects) == 0: + raise PluginError("Armature not selected.") + armatureObj = context.active_object + if type(armatureObj.data) is not bpy.types.Armature: + raise PluginError("Armature not selected.") + + importAnimationToBlender( + romfileSrc, + animStart, + armatureObj, + segmentData, + context.scene.isDMAImport, + ) + romfileSrc.close() + self.report({"INFO"}, "Success!") + except Exception as e: + if romfileSrc is not None: + romfileSrc.close() + raisePluginError(self, e) + return {"CANCELLED"} # must return a set + + return {"FINISHED"} # must return a set + class SM64_ImportAnimPanel(SM64_Panel): - bl_idname = "SM64_PT_import_anim" - bl_label = "SM64 Animation Importer" - goal = sm64GoalImport - - # called every frame - def draw(self, context): - col = self.layout.column() - propsAnimImport = col.operator(SM64_ImportAnimMario.bl_idname) - col.prop(context.scene, 'isDMAImport') - if not context.scene.isDMAImport: - col.prop(context.scene, 'animIsAnimList') - if context.scene.animIsAnimList: - prop_split(col, context.scene, 'animListIndexImport', - 'Anim List Index') - - prop_split(col, context.scene, 'animStartImport', 'Start Address') - col.prop(context.scene, 'animIsSegPtr') - col.prop(context.scene, 'levelAnimImport') - + bl_idname = "SM64_PT_import_anim" + bl_label = "SM64 Animation Importer" + goal = sm64GoalImport + + # called every frame + def draw(self, context): + col = self.layout.column() + propsAnimImport = col.operator(SM64_ImportAnimMario.bl_idname) + col.prop(context.scene, "isDMAImport") + if not context.scene.isDMAImport: + col.prop(context.scene, "animIsAnimList") + if context.scene.animIsAnimList: + prop_split(col, context.scene, "animListIndexImport", "Anim List Index") + + prop_split(col, context.scene, "animStartImport", "Start Address") + col.prop(context.scene, "animIsSegPtr") + col.prop(context.scene, "levelAnimImport") + + sm64_anim_classes = ( - SM64_ExportAnimMario, - SM64_ImportAnimMario, + SM64_ExportAnimMario, + SM64_ImportAnimMario, ) sm64_anim_panels = ( - SM64_ImportAnimPanel, - SM64_ExportAnimPanel, + SM64_ImportAnimPanel, + SM64_ExportAnimPanel, ) + def sm64_anim_panel_register(): - for cls in sm64_anim_panels: - register_class(cls) + for cls in sm64_anim_panels: + register_class(cls) + def sm64_anim_panel_unregister(): - for cls in sm64_anim_panels: - unregister_class(cls) + for cls in sm64_anim_panels: + unregister_class(cls) + def sm64_anim_register(): - for cls in sm64_anim_classes: - register_class(cls) - - bpy.types.Scene.animStartImport = bpy.props.StringProperty( - name ='Import Start', default = '4EC690') - bpy.types.Scene.animExportStart = bpy.props.StringProperty( - name ='Start', default = '11D8930') - bpy.types.Scene.animExportEnd = bpy.props.StringProperty( - name ='End', default = '11FFF00') - bpy.types.Scene.isDMAImport = bpy.props.BoolProperty(name = 'Is DMA Animation', default = True) - bpy.types.Scene.isDMAExport = bpy.props.BoolProperty(name = 'Is DMA Animation') - bpy.types.Scene.DMAEntryAddress = bpy.props.StringProperty(name = 'DMA Entry Address', default = '4EC008') - bpy.types.Scene.DMAStartAddress = bpy.props.StringProperty(name = 'DMA Start Address', default = '4EC000') - bpy.types.Scene.levelAnimImport = bpy.props.EnumProperty(items = level_enums, name = 'Level', default = 'IC') - bpy.types.Scene.levelAnimExport = bpy.props.EnumProperty(items = level_enums, name = 'Level', default = 'IC') - bpy.types.Scene.loopAnimation = bpy.props.BoolProperty(name = 'Loop Animation', default = True) - bpy.types.Scene.setAnimListIndex = bpy.props.BoolProperty(name = 'Set Anim List Entry', default = True) - bpy.types.Scene.overwrite_0x28 = bpy.props.BoolProperty(name = 'Overwrite 0x28 behaviour command', default = True) - bpy.types.Scene.addr_0x27 = bpy.props.StringProperty( - name = '0x27 Command Address', default = '21CD00') - bpy.types.Scene.addr_0x28 = bpy.props.StringProperty( - name = '0x28 Command Address', default = '21CD08') - bpy.types.Scene.animExportPath = bpy.props.StringProperty( - name = 'Directory', subtype = 'FILE_PATH') - bpy.types.Scene.animOverwriteDMAEntry = bpy.props.BoolProperty( - name = 'Overwrite DMA Entry') - bpy.types.Scene.animInsertableBinaryPath = bpy.props.StringProperty( - name = 'Filepath', subtype = 'FILE_PATH') - bpy.types.Scene.animIsSegPtr = bpy.props.BoolProperty( - name = 'Is Segmented Address', default = False) - bpy.types.Scene.animIsAnimList = bpy.props.BoolProperty( - name = 'Is Anim List', default = True) - bpy.types.Scene.animListIndexImport = bpy.props.IntProperty( - name = 'Anim List Index', min = 0, max = 255) - bpy.types.Scene.animListIndexExport = bpy.props.IntProperty( - name = "Anim List Index", min = 0, max = 255) - bpy.types.Scene.animName = bpy.props.StringProperty( - name = 'Name', default = 'mario') - bpy.types.Scene.animGroupName = bpy.props.StringProperty( - name = 'Group Name', default = 'group0') - bpy.types.Scene.animWriteHeaders = bpy.props.BoolProperty( - name = 'Write Headers For Actor', default = True) - bpy.types.Scene.animCustomExport = bpy.props.BoolProperty( - name = 'Custom Export Path') - bpy.types.Scene.animExportHeaderType = bpy.props.EnumProperty( - items = enumExportHeaderType, name = 'Header Export', default = 'Actor') - bpy.types.Scene.animLevelName = bpy.props.StringProperty(name = 'Level', - default = 'bob') - bpy.types.Scene.animLevelOption = bpy.props.EnumProperty( - items = enumLevelNames, name = 'Level', default = 'bob') + for cls in sm64_anim_classes: + register_class(cls) + + bpy.types.Scene.animStartImport = bpy.props.StringProperty( + name="Import Start", default="4EC690" + ) + bpy.types.Scene.animExportStart = bpy.props.StringProperty( + name="Start", default="11D8930" + ) + bpy.types.Scene.animExportEnd = bpy.props.StringProperty( + name="End", default="11FFF00" + ) + bpy.types.Scene.isDMAImport = bpy.props.BoolProperty( + name="Is DMA Animation", default=True + ) + bpy.types.Scene.isDMAExport = bpy.props.BoolProperty(name="Is DMA Animation") + bpy.types.Scene.DMAEntryAddress = bpy.props.StringProperty( + name="DMA Entry Address", default="4EC008" + ) + bpy.types.Scene.DMAStartAddress = bpy.props.StringProperty( + name="DMA Start Address", default="4EC000" + ) + bpy.types.Scene.levelAnimImport = bpy.props.EnumProperty( + items=level_enums, name="Level", default="IC" + ) + bpy.types.Scene.levelAnimExport = bpy.props.EnumProperty( + items=level_enums, name="Level", default="IC" + ) + bpy.types.Scene.loopAnimation = bpy.props.BoolProperty( + name="Loop Animation", default=True + ) + bpy.types.Scene.setAnimListIndex = bpy.props.BoolProperty( + name="Set Anim List Entry", default=True + ) + bpy.types.Scene.overwrite_0x28 = bpy.props.BoolProperty( + name="Overwrite 0x28 behaviour command", default=True + ) + bpy.types.Scene.addr_0x27 = bpy.props.StringProperty( + name="0x27 Command Address", default="21CD00" + ) + bpy.types.Scene.addr_0x28 = bpy.props.StringProperty( + name="0x28 Command Address", default="21CD08" + ) + bpy.types.Scene.animExportPath = bpy.props.StringProperty( + name="Directory", subtype="FILE_PATH" + ) + bpy.types.Scene.animOverwriteDMAEntry = bpy.props.BoolProperty( + name="Overwrite DMA Entry" + ) + bpy.types.Scene.animInsertableBinaryPath = bpy.props.StringProperty( + name="Filepath", subtype="FILE_PATH" + ) + bpy.types.Scene.animIsSegPtr = bpy.props.BoolProperty( + name="Is Segmented Address", default=False + ) + bpy.types.Scene.animIsAnimList = bpy.props.BoolProperty( + name="Is Anim List", default=True + ) + bpy.types.Scene.animListIndexImport = bpy.props.IntProperty( + name="Anim List Index", min=0, max=255 + ) + bpy.types.Scene.animListIndexExport = bpy.props.IntProperty( + name="Anim List Index", min=0, max=255 + ) + bpy.types.Scene.animName = bpy.props.StringProperty(name="Name", default="mario") + bpy.types.Scene.animGroupName = bpy.props.StringProperty( + name="Group Name", default="group0" + ) + bpy.types.Scene.animWriteHeaders = bpy.props.BoolProperty( + name="Write Headers For Actor", default=True + ) + bpy.types.Scene.animCustomExport = bpy.props.BoolProperty(name="Custom Export Path") + bpy.types.Scene.animExportHeaderType = bpy.props.EnumProperty( + items=enumExportHeaderType, name="Header Export", default="Actor" + ) + bpy.types.Scene.animLevelName = bpy.props.StringProperty( + name="Level", default="bob" + ) + bpy.types.Scene.animLevelOption = bpy.props.EnumProperty( + items=enumLevelNames, name="Level", default="bob" + ) + def sm64_anim_unregister(): - for cls in reversed(sm64_anim_classes): - unregister_class(cls) - - del bpy.types.Scene.animStartImport - del bpy.types.Scene.animExportStart - del bpy.types.Scene.animExportEnd - del bpy.types.Scene.levelAnimImport - del bpy.types.Scene.levelAnimExport - del bpy.types.Scene.isDMAImport - del bpy.types.Scene.isDMAExport - del bpy.types.Scene.DMAStartAddress - del bpy.types.Scene.DMAEntryAddress - del bpy.types.Scene.loopAnimation - del bpy.types.Scene.setAnimListIndex - del bpy.types.Scene.overwrite_0x28 - del bpy.types.Scene.addr_0x27 - del bpy.types.Scene.addr_0x28 - del bpy.types.Scene.animExportPath - del bpy.types.Scene.animOverwriteDMAEntry - del bpy.types.Scene.animInsertableBinaryPath - del bpy.types.Scene.animIsSegPtr - del bpy.types.Scene.animIsAnimList - del bpy.types.Scene.animListIndexImport - del bpy.types.Scene.animListIndexExport - del bpy.types.Scene.animName - del bpy.types.Scene.animGroupName - del bpy.types.Scene.animWriteHeaders - del bpy.types.Scene.animCustomExport - del bpy.types.Scene.animExportHeaderType - del bpy.types.Scene.animLevelName - del bpy.types.Scene.animLevelOption + for cls in reversed(sm64_anim_classes): + unregister_class(cls) + + del bpy.types.Scene.animStartImport + del bpy.types.Scene.animExportStart + del bpy.types.Scene.animExportEnd + del bpy.types.Scene.levelAnimImport + del bpy.types.Scene.levelAnimExport + del bpy.types.Scene.isDMAImport + del bpy.types.Scene.isDMAExport + del bpy.types.Scene.DMAStartAddress + del bpy.types.Scene.DMAEntryAddress + del bpy.types.Scene.loopAnimation + del bpy.types.Scene.setAnimListIndex + del bpy.types.Scene.overwrite_0x28 + del bpy.types.Scene.addr_0x27 + del bpy.types.Scene.addr_0x28 + del bpy.types.Scene.animExportPath + del bpy.types.Scene.animOverwriteDMAEntry + del bpy.types.Scene.animInsertableBinaryPath + del bpy.types.Scene.animIsSegPtr + del bpy.types.Scene.animIsAnimList + del bpy.types.Scene.animListIndexImport + del bpy.types.Scene.animListIndexExport + del bpy.types.Scene.animName + del bpy.types.Scene.animGroupName + del bpy.types.Scene.animWriteHeaders + del bpy.types.Scene.animCustomExport + del bpy.types.Scene.animExportHeaderType + del bpy.types.Scene.animLevelName + del bpy.types.Scene.animLevelOption diff --git a/fast64_internal/sm64/sm64_camera.py b/fast64_internal/sm64/sm64_camera.py index 3cf0e2216..b20169900 100644 --- a/fast64_internal/sm64/sm64_camera.py +++ b/fast64_internal/sm64/sm64_camera.py @@ -5,211 +5,235 @@ from ..utility import * enumBackgroundType = [ - ('OCEAN_SKY', 'Ocean Sky', 'Ocean Sky'), - ('FLAMING_SKY', 'Flaming Sky', 'Flaming Sky'), - ('UNDERWATER_CITY', 'Underwater City', 'Underwater City'), - ('BELOW_CLOUDS', 'Below Clouds', 'Below Clouds'), - ('SNOW_MOUNTAINS', 'Snow Mountains', 'Snow Mountains'), - ('DESERT', 'Desert', 'Desert'), - ('HAUNTED', 'Haunted', 'Haunted'), - ('GREEN_SKY', 'Green Sky', 'Green Sky'), - ('ABOVE_CLOUDS', 'Above Clouds', 'Above Clouds'), - ('PURPLE_SKY', 'Purple Sky', 'Purple Sky'), + ("OCEAN_SKY", "Ocean Sky", "Ocean Sky"), + ("FLAMING_SKY", "Flaming Sky", "Flaming Sky"), + ("UNDERWATER_CITY", "Underwater City", "Underwater City"), + ("BELOW_CLOUDS", "Below Clouds", "Below Clouds"), + ("SNOW_MOUNTAINS", "Snow Mountains", "Snow Mountains"), + ("DESERT", "Desert", "Desert"), + ("HAUNTED", "Haunted", "Haunted"), + ("GREEN_SKY", "Green Sky", "Green Sky"), + ("ABOVE_CLOUDS", "Above Clouds", "Above Clouds"), + ("PURPLE_SKY", "Purple Sky", "Purple Sky"), ] backgroundValues = { - 'OCEAN_SKY' : 0, - 'FLAMING_SKY' : 1, - 'UNDERWATER_CITY' : 2, - 'BELOW_CLOUDS' : 3, - 'SNOW_MOUNTAINS' : 4, - 'DESERT' : 5, - 'HAUNTED' : 6, - 'GREEN_SKY' : 7, - 'ABOVE_CLOUDS' : 8, - 'PURPLE_SKY' : 9, + "OCEAN_SKY": 0, + "FLAMING_SKY": 1, + "UNDERWATER_CITY": 2, + "BELOW_CLOUDS": 3, + "SNOW_MOUNTAINS": 4, + "DESERT": 5, + "HAUNTED": 6, + "GREEN_SKY": 7, + "ABOVE_CLOUDS": 8, + "PURPLE_SKY": 9, } + class CameraSettingsPanel(bpy.types.Panel): - bl_label = "Camera Settings" - bl_idname = "Camera_Inspector" - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "data" - bl_options = {'HIDE_HEADER'} - - @classmethod - def poll(cls, context): - return hasattr(context, 'object') and \ - isinstance(context.object.data, bpy.types.Camera) - - def draw(self, context): - camera = context.object.data - layout = self.layout.box() - layout.box().label(text = 'SM64 Camera Settings') - #layout.prop(camera, 'useBackgroundColor') - #if camera.useBackgroundColor: - # prop_split(layout, camera, 'backgroundColor', 'Background Color') - #else: - # prop_split(layout, camera, 'backgroundID', 'Background ID') - # layout.box().label(text = 'Background IDs defined in include/geo_commands.h.') - #layout.prop(camera, 'dynamicFOV') - #if not camera.dynamicFOV: - # prop_split(layout, camera, 'fov', 'Field Of View') - #layout.prop(camera, 'useDefaultScreenRect') - #if not camera.useDefaultScreenRect: - # prop_split(layout, camera, 'screenPos', 'Screen Position') - # prop_split(layout, camera, 'screenSize', 'Screen Size') - - - #prop_split(layout, camera, 'clipPlanes', 'Clip Planes') - #prop_split(layout, camera, 'camType', 'Camera Type') - #prop_split(layout, camera, 'envType', 'Environment Type') + bl_label = "Camera Settings" + bl_idname = "Camera_Inspector" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "data" + bl_options = {"HIDE_HEADER"} + + @classmethod + def poll(cls, context): + return hasattr(context, "object") and isinstance( + context.object.data, bpy.types.Camera + ) + + def draw(self, context): + camera = context.object.data + layout = self.layout.box() + layout.box().label(text="SM64 Camera Settings") + # layout.prop(camera, 'useBackgroundColor') + # if camera.useBackgroundColor: + # prop_split(layout, camera, 'backgroundColor', 'Background Color') + # else: + # prop_split(layout, camera, 'backgroundID', 'Background ID') + # layout.box().label(text = 'Background IDs defined in include/geo_commands.h.') + # layout.prop(camera, 'dynamicFOV') + # if not camera.dynamicFOV: + # prop_split(layout, camera, 'fov', 'Field Of View') + # layout.prop(camera, 'useDefaultScreenRect') + # if not camera.useDefaultScreenRect: + # prop_split(layout, camera, 'screenPos', 'Screen Position') + # prop_split(layout, camera, 'screenSize', 'Screen Size') + + # prop_split(layout, camera, 'clipPlanes', 'Clip Planes') + # prop_split(layout, camera, 'camType', 'Camera Type') + # prop_split(layout, camera, 'envType', 'Environment Type') + def saveCameraSettingsToGeolayout(geolayoutGraph, areaObj, rootObj, meshGeolayoutName): - geolayout = geolayoutGraph.startGeolayout - screenAreaNode = TransformNode(ScreenAreaNode( - areaObj.useDefaultScreenRect, 0xA, areaObj.screenPos, areaObj.screenSize)) - geolayout.nodes.insert(0, screenAreaNode) - - if not areaObj.fast64.sm64.area.disable_background: - zBufferDisable = TransformNode(ZBufferNode(False)) - screenAreaNode.children.append(zBufferDisable) - - orthoNode = TransformNode(OrthoNode(0x64)) - zBufferDisable.children.append(orthoNode) - - # Uses Level Root here - bgColor = colorTo16bitRGBA(gammaCorrect(areaObj.areaBGColor if \ - areaObj.areaOverrideBG else rootObj.backgroundColor) + [1]) - if areaObj.areaOverrideBG: - bgNode = TransformNode(BackgroundNode( - True, bgColor)) - else: - background = '' - if rootObj.useBackgroundColor: - background = bgColor - else: - if rootObj.background == 'CUSTOM': - background = rootObj.fast64.sm64.level.backgroundID - else: - background = 'BACKGROUND_' + rootObj.background - - bgNode = TransformNode(BackgroundNode( - rootObj.useBackgroundColor, background)) - orthoNode.children.append(bgNode) - - zBufferEnable = TransformNode(ZBufferNode(True)) - screenAreaNode.children.append(zBufferEnable) - - #frustumNode = TransformNode(FrustumNode( - # math.degrees(camera.angle), camera.clip_start, camera.clip_end)) - frustumNode = TransformNode(FrustumNode( - areaObj.fov, - areaObj.clipPlanes[0], - areaObj.clipPlanes[1])) - zBufferEnable.children.append(frustumNode) - - relativeTransform = rootObj.matrix_world.inverted() @ areaObj.matrix_world - relativePosition = relativeTransform.decompose()[0] - relativeRotation = relativeTransform.decompose()[1] - cameraNode = TransformNode(CameraNode( - areaObj.camOption if areaObj.camOption != "Custom" else areaObj.camType, - relativePosition, relativePosition + relativeRotation @ mathutils.Vector((0,0,-1)))) - frustumNode.children.append(cameraNode) - - startDLNode = TransformNode(StartNode()) - meshGeolayout = geolayoutGraph.addGeolayout(rootObj, meshGeolayoutName) - meshGeolayout.nodes.append(startDLNode) - geolayoutGraph.addJumpNode(cameraNode, geolayout, meshGeolayout) - - # Moving textures here - - cameraNode.children.append(TransformNode(RenderObjNode())) - - # corresponds to geo_enfvx_main - cameraNode.children.append(TransformNode( - FunctionNode('802761D0', areaObj.envOption if areaObj.envOption != 'Custom' else areaObj.envType))) - - return meshGeolayout + geolayout = geolayoutGraph.startGeolayout + screenAreaNode = TransformNode( + ScreenAreaNode( + areaObj.useDefaultScreenRect, 0xA, areaObj.screenPos, areaObj.screenSize + ) + ) + geolayout.nodes.insert(0, screenAreaNode) + + if not areaObj.fast64.sm64.area.disable_background: + zBufferDisable = TransformNode(ZBufferNode(False)) + screenAreaNode.children.append(zBufferDisable) + + orthoNode = TransformNode(OrthoNode(0x64)) + zBufferDisable.children.append(orthoNode) + + # Uses Level Root here + bgColor = colorTo16bitRGBA( + gammaCorrect( + areaObj.areaBGColor + if areaObj.areaOverrideBG + else rootObj.backgroundColor + ) + + [1] + ) + if areaObj.areaOverrideBG: + bgNode = TransformNode(BackgroundNode(True, bgColor)) + else: + background = "" + if rootObj.useBackgroundColor: + background = bgColor + else: + if rootObj.background == "CUSTOM": + background = rootObj.fast64.sm64.level.backgroundID + else: + background = "BACKGROUND_" + rootObj.background + + bgNode = TransformNode( + BackgroundNode(rootObj.useBackgroundColor, background) + ) + orthoNode.children.append(bgNode) + + zBufferEnable = TransformNode(ZBufferNode(True)) + screenAreaNode.children.append(zBufferEnable) + + # frustumNode = TransformNode(FrustumNode( + # math.degrees(camera.angle), camera.clip_start, camera.clip_end)) + frustumNode = TransformNode( + FrustumNode(areaObj.fov, areaObj.clipPlanes[0], areaObj.clipPlanes[1]) + ) + zBufferEnable.children.append(frustumNode) + + relativeTransform = rootObj.matrix_world.inverted() @ areaObj.matrix_world + relativePosition = relativeTransform.decompose()[0] + relativeRotation = relativeTransform.decompose()[1] + cameraNode = TransformNode( + CameraNode( + areaObj.camOption if areaObj.camOption != "Custom" else areaObj.camType, + relativePosition, + relativePosition + relativeRotation @ mathutils.Vector((0, 0, -1)), + ) + ) + frustumNode.children.append(cameraNode) + + startDLNode = TransformNode(StartNode()) + meshGeolayout = geolayoutGraph.addGeolayout(rootObj, meshGeolayoutName) + meshGeolayout.nodes.append(startDLNode) + geolayoutGraph.addJumpNode(cameraNode, geolayout, meshGeolayout) + + # Moving textures here + + cameraNode.children.append(TransformNode(RenderObjNode())) + + # corresponds to geo_enfvx_main + cameraNode.children.append( + TransformNode( + FunctionNode( + "802761D0", + areaObj.envOption if areaObj.envOption != "Custom" else areaObj.envType, + ) + ) + ) + + return meshGeolayout + sm64_cam_classes = ( - #CameraSettingsPanel, + # CameraSettingsPanel, ) -sm64_cam_panel_classes = ( +sm64_cam_panel_classes = () -) def sm64_cam_panel_register(): - for cls in sm64_cam_panel_classes: - register_class(cls) + for cls in sm64_cam_panel_classes: + register_class(cls) + def sm64_cam_panel_unregister(): - for cls in sm64_cam_panel_classes: - unregister_class(cls) + for cls in sm64_cam_panel_classes: + unregister_class(cls) + # 802763D4 - ASM function for background # 8029AA3C - ASM function for camera frustum + def sm64_cam_register(): - for cls in sm64_cam_classes: - register_class(cls) - - # Moved to Level Root - #bpy.types.Camera.useBackgroundColor = bpy.props.BoolProperty( - # name = 'Use Solid Color For Background', default = False) - - #bpy.types.Camera.backgroundID = bpy.props.StringProperty( - # name = 'Background ID', default = 'BACKGROUND_OCEAN_SKY') - # - #bpy.types.Camera.backgroundColor = bpy.props.FloatVectorProperty( - # name = 'Background Color', subtype='COLOR', size = 4, - # min = 0, max = 1, default = (0,0,0,1)) - - #bpy.types.Camera.dynamicFOV = bpy.props.BoolProperty( - # name = 'Dynamic FOV', default = True) - - # Moved to Area Root - #bpy.types.Camera.screenPos = bpy.props.IntVectorProperty( - # name = 'Screen Position', size = 2, default = (160, 120), - # min = -2**15, max = 2**15 - 1) - - #bpy.types.Camera.screenSize = bpy.props.IntVectorProperty( - # name = 'Screen Size', size = 2, default = (160, 120), - # min = -2**15, max = 2**15 - 1) - - #bpy.types.Camera.camType = bpy.props.StringProperty( - # name = 'Camera Type', default = '1') - - #bpy.types.Camera.envType = bpy.props.StringProperty( - # name = 'Environment Type', default = '0') - - # Moved to Area Root - #bpy.types.Camera.useDefaultScreenRect = bpy.props.BoolProperty( - # name = 'Use Default Screen Rect', default = True) - - #bpy.types.Camera.clipPlanes = bpy.props.IntVectorProperty( - # name = 'Clip Planes', size = 2, min = 0, default = (100, 30000) - #) - - #bpy.types.Camera.fov = bpy.props.FloatProperty( - # name = 'Field Of View', min = 0, max = 180, default = 45 - #) + for cls in sm64_cam_classes: + register_class(cls) + + # Moved to Level Root + # bpy.types.Camera.useBackgroundColor = bpy.props.BoolProperty( + # name = 'Use Solid Color For Background', default = False) + + # bpy.types.Camera.backgroundID = bpy.props.StringProperty( + # name = 'Background ID', default = 'BACKGROUND_OCEAN_SKY') + # + # bpy.types.Camera.backgroundColor = bpy.props.FloatVectorProperty( + # name = 'Background Color', subtype='COLOR', size = 4, + # min = 0, max = 1, default = (0,0,0,1)) + + # bpy.types.Camera.dynamicFOV = bpy.props.BoolProperty( + # name = 'Dynamic FOV', default = True) + + # Moved to Area Root + # bpy.types.Camera.screenPos = bpy.props.IntVectorProperty( + # name = 'Screen Position', size = 2, default = (160, 120), + # min = -2**15, max = 2**15 - 1) + + # bpy.types.Camera.screenSize = bpy.props.IntVectorProperty( + # name = 'Screen Size', size = 2, default = (160, 120), + # min = -2**15, max = 2**15 - 1) + + # bpy.types.Camera.camType = bpy.props.StringProperty( + # name = 'Camera Type', default = '1') + + # bpy.types.Camera.envType = bpy.props.StringProperty( + # name = 'Environment Type', default = '0') + + # Moved to Area Root + # bpy.types.Camera.useDefaultScreenRect = bpy.props.BoolProperty( + # name = 'Use Default Screen Rect', default = True) + + # bpy.types.Camera.clipPlanes = bpy.props.IntVectorProperty( + # name = 'Clip Planes', size = 2, min = 0, default = (100, 30000) + # ) + + # bpy.types.Camera.fov = bpy.props.FloatProperty( + # name = 'Field Of View', min = 0, max = 180, default = 45 + # ) + def sm64_cam_unregister(): - #del bpy.types.Camera.useBackgroundColor - #del bpy.types.Camera.backgroundID - #del bpy.types.Camera.backgroundColor - #del bpy.types.Camera.dynamicFOV - #del bpy.types.Camera.orthoScale - #del bpy.types.Camera.screenPos - #del bpy.types.Camera.screenSize - #del bpy.types.Camera.camType - #del bpy.types.Camera.envType - #del bpy.types.Camera.useDefaultScreenRect - #del bpy.types.Camera.clipPlanes - #del bpy.types.Camera.fov - - for cls in sm64_cam_classes: - unregister_class(cls) + # del bpy.types.Camera.useBackgroundColor + # del bpy.types.Camera.backgroundID + # del bpy.types.Camera.backgroundColor + # del bpy.types.Camera.dynamicFOV + # del bpy.types.Camera.orthoScale + # del bpy.types.Camera.screenPos + # del bpy.types.Camera.screenSize + # del bpy.types.Camera.camType + # del bpy.types.Camera.envType + # del bpy.types.Camera.useDefaultScreenRect + # del bpy.types.Camera.clipPlanes + # del bpy.types.Camera.fov + + for cls in sm64_cam_classes: + unregister_class(cls) diff --git a/fast64_internal/sm64/sm64_collision.py b/fast64_internal/sm64/sm64_collision.py index 1c1abb23f..7a63b4a1b 100644 --- a/fast64_internal/sm64/sm64_collision.py +++ b/fast64_internal/sm64/sm64_collision.py @@ -8,204 +8,235 @@ from ..utility import * from ..panels import SM64_Panel + class CollisionVertex: - def __init__(self, position): - self.position = position - - def to_binary(self): - data = bytearray(0) - if len(self.position) > 3: - raise PluginError("Vertex position should not be " + \ - str(len(self.position) + ' fields long.')) - for field in self.position: - data.extend(int(round(field)).to_bytes(2, 'big', signed = True)) - return data - - def to_c(self): - return 'COL_VERTEX(' + \ - str(int(round(self.position[0]))) + ', ' + \ - str(int(round(self.position[1]))) + ', ' + \ - str(int(round(self.position[2]))) + '),\n' + def __init__(self, position): + self.position = position + + def to_binary(self): + data = bytearray(0) + if len(self.position) > 3: + raise PluginError( + "Vertex position should not be " + + str(len(self.position) + " fields long.") + ) + for field in self.position: + data.extend(int(round(field)).to_bytes(2, "big", signed=True)) + return data + + def to_c(self): + return ( + "COL_VERTEX(" + + str(int(round(self.position[0]))) + + ", " + + str(int(round(self.position[1]))) + + ", " + + str(int(round(self.position[2]))) + + "),\n" + ) + class CollisionTriangle: - def __init__(self, indices, specialParam, room): - self.indices = indices - self.specialParam = specialParam - self.room = room - - def to_binary(self): - data = bytearray(0) - if len(self.indices) > 3: - raise PluginError("Triangle indices should not be " + \ - str(len(self.indices) + ' fields long.')) - for index in self.indices: - data.extend(int(round(index)).to_bytes(2, 'big', signed = False)) - if self.specialParam is not None: - data.extend(int(self.specialParam, 16).to_bytes(2, 'big', signed=False)) - return data - - def to_c(self): - if self.specialParam is None: - return 'COL_TRI(' + \ - str(int(round(self.indices[0]))) + ', ' + \ - str(int(round(self.indices[1]))) + ', ' + \ - str(int(round(self.indices[2]))) + '),\n' - else: - return 'COL_TRI_SPECIAL(' + \ - str(int(round(self.indices[0]))) + ', ' + \ - str(int(round(self.indices[1]))) + ', ' + \ - str(int(round(self.indices[2]))) + ', ' + \ - str(self.specialParam) + '),\n' + def __init__(self, indices, specialParam, room): + self.indices = indices + self.specialParam = specialParam + self.room = room + + def to_binary(self): + data = bytearray(0) + if len(self.indices) > 3: + raise PluginError( + "Triangle indices should not be " + + str(len(self.indices) + " fields long.") + ) + for index in self.indices: + data.extend(int(round(index)).to_bytes(2, "big", signed=False)) + if self.specialParam is not None: + data.extend(int(self.specialParam, 16).to_bytes(2, "big", signed=False)) + return data + + def to_c(self): + if self.specialParam is None: + return ( + "COL_TRI(" + + str(int(round(self.indices[0]))) + + ", " + + str(int(round(self.indices[1]))) + + ", " + + str(int(round(self.indices[2]))) + + "),\n" + ) + else: + return ( + "COL_TRI_SPECIAL(" + + str(int(round(self.indices[0]))) + + ", " + + str(int(round(self.indices[1]))) + + ", " + + str(int(round(self.indices[2]))) + + ", " + + str(self.specialParam) + + "),\n" + ) -class Collision: - def __init__(self, name): - self.name = name - self.startAddress = 0 - self.vertices = [] - # dict of collision type : triangle list - self.triangles = {} - self.specials = [] - self.water_boxes = [] - - def set_addr(self, startAddress): - startAddress = get64bitAlignedAddr(startAddress) - self.startAddress = startAddress - print('Collision ' + self.name + ': ' + str(startAddress) + \ - ', ' + str(self.size())) - return startAddress, startAddress + self.size() - - def save_binary(self, romfile): - romfile.seek(self.startAddress) - romfile.write(self.to_binary()) - - def size(self): - return len(self.to_binary()) - - def to_c(self): - data = CData() - data.header = 'extern const Collision ' + self.name + '[];\n' - data.source = 'const Collision ' + self.name + '[] = {\n' - data.source += '\tCOL_INIT(),\n' - data.source += '\tCOL_VERTEX_INIT(' + str(len(self.vertices)) + '),\n' - for vertex in self.vertices: - data.source += '\t' + vertex.to_c() - for collisionType, triangles in self.triangles.items(): - data.source += '\tCOL_TRI_INIT(' + collisionType + ', ' +\ - str(len(triangles)) + '),\n' - for triangle in triangles: - data.source += '\t' + triangle.to_c() - data.source += '\tCOL_TRI_STOP(),\n' - if len(self.specials) > 0: - data.source += '\tCOL_SPECIAL_INIT(' + str(len(self.specials)) + '),\n' - for special in self.specials: - data.source += '\t' + special.to_c() - if len(self.water_boxes) > 0: - data.source += '\tCOL_WATER_BOX_INIT(' + str(len(self.water_boxes)) + '),\n' - for waterBox in self.water_boxes: - data.source += '\t' + waterBox.to_c() - data.source += '\tCOL_END()\n' + '};\n' - return data - - def rooms_name(self): - return self.name + '_rooms' - - def to_c_rooms(self): - data = CData() - data.header = 'extern const u8 ' + self.rooms_name() + '[];\n' - data.source = 'const u8 ' + self.rooms_name() + '[] = {\n\t' - newlineCount = 0 - for collisionType, triangles, in self.triangles.items(): - for triangle in triangles: - data.source += str(triangle.room) + ', ' - newlineCount += 1 - if newlineCount >= 8: - newlineCount = 0 - data.source += '\n\t' - data.source += '\n};\n' - return data - - def to_binary(self): - colTypeDef = CollisionTypeDefinition() - data = bytearray([0x00, 0x40]) - data += len(self.vertices).to_bytes(2, 'big') - for vertex in self.vertices: - data += vertex.to_binary() - for collisionType, triangles in self.triangles.items(): - data += getattr(colTypeDef, collisionType).to_bytes(2, 'big') - data += len(triangles).to_bytes(2, 'big') - for triangle in triangles: - data += triangle.to_binary() - data += bytearray([0x00, 0x41]) - if len(self.specials) > 0: - data += bytearray([0x00, 0x43]) - data += len(self.specials).to_bytes(2, 'big') - for special in self.specials: - data += special.to_binary() - if len(self.water_boxes) > 0: - data += bytearray([0x00, 0x44]) - data += len(self.water_boxes).to_bytes(2, 'big') - for waterBox in self.water_boxes: - data += waterBox.to_binary() - data += bytearray([0x00, 0x42]) - return data -class SM64CollisionPanel(bpy.types.Panel): - bl_label = "Collision Inspector" - bl_idname = "MATERIAL_PT_SM64_Collision_Inspector" - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "material" - bl_options = {'HIDE_HEADER'} +class Collision: + def __init__(self, name): + self.name = name + self.startAddress = 0 + self.vertices = [] + # dict of collision type : triangle list + self.triangles = {} + self.specials = [] + self.water_boxes = [] + + def set_addr(self, startAddress): + startAddress = get64bitAlignedAddr(startAddress) + self.startAddress = startAddress + print( + "Collision " + + self.name + + ": " + + str(startAddress) + + ", " + + str(self.size()) + ) + return startAddress, startAddress + self.size() + + def save_binary(self, romfile): + romfile.seek(self.startAddress) + romfile.write(self.to_binary()) + + def size(self): + return len(self.to_binary()) + + def to_c(self): + data = CData() + data.header = "extern const Collision " + self.name + "[];\n" + data.source = "const Collision " + self.name + "[] = {\n" + data.source += "\tCOL_INIT(),\n" + data.source += "\tCOL_VERTEX_INIT(" + str(len(self.vertices)) + "),\n" + for vertex in self.vertices: + data.source += "\t" + vertex.to_c() + for collisionType, triangles in self.triangles.items(): + data.source += ( + "\tCOL_TRI_INIT(" + collisionType + ", " + str(len(triangles)) + "),\n" + ) + for triangle in triangles: + data.source += "\t" + triangle.to_c() + data.source += "\tCOL_TRI_STOP(),\n" + if len(self.specials) > 0: + data.source += "\tCOL_SPECIAL_INIT(" + str(len(self.specials)) + "),\n" + for special in self.specials: + data.source += "\t" + special.to_c() + if len(self.water_boxes) > 0: + data.source += "\tCOL_WATER_BOX_INIT(" + str(len(self.water_boxes)) + "),\n" + for waterBox in self.water_boxes: + data.source += "\t" + waterBox.to_c() + data.source += "\tCOL_END()\n" + "};\n" + return data + + def rooms_name(self): + return self.name + "_rooms" + + def to_c_rooms(self): + data = CData() + data.header = "extern const u8 " + self.rooms_name() + "[];\n" + data.source = "const u8 " + self.rooms_name() + "[] = {\n\t" + newlineCount = 0 + for ( + collisionType, + triangles, + ) in self.triangles.items(): + for triangle in triangles: + data.source += str(triangle.room) + ", " + newlineCount += 1 + if newlineCount >= 8: + newlineCount = 0 + data.source += "\n\t" + data.source += "\n};\n" + return data + + def to_binary(self): + colTypeDef = CollisionTypeDefinition() + data = bytearray([0x00, 0x40]) + data += len(self.vertices).to_bytes(2, "big") + for vertex in self.vertices: + data += vertex.to_binary() + for collisionType, triangles in self.triangles.items(): + data += getattr(colTypeDef, collisionType).to_bytes(2, "big") + data += len(triangles).to_bytes(2, "big") + for triangle in triangles: + data += triangle.to_binary() + data += bytearray([0x00, 0x41]) + if len(self.specials) > 0: + data += bytearray([0x00, 0x43]) + data += len(self.specials).to_bytes(2, "big") + for special in self.specials: + data += special.to_binary() + if len(self.water_boxes) > 0: + data += bytearray([0x00, 0x44]) + data += len(self.water_boxes).to_bytes(2, "big") + for waterBox in self.water_boxes: + data += waterBox.to_binary() + data += bytearray([0x00, 0x42]) + return data - @classmethod - def poll(cls, context): - return (context.scene.gameEditorMode == "SM64" and context.material is not None) - - def paramInfo(self, layout): - box = layout.box() - box.label(text = "Parameter is two bytes.") - box.label(text = "First byte is an index into an array of speed values.") - box.label(text = "(See: sMovingSandSpeeds, sWaterCurrentSpeeds)") - box.label(text = "Second byte is a rotation value.") - def draw(self, context): - box = self.layout.box() - #box.label(text = 'Collision Inspector') - material = context.material - if not material.collision_all_options: - prop_split(box, material, 'collision_type_simple', - 'SM64 Collision Type') - if material.collision_type_simple == "Custom": - prop_split(box, material, 'collision_custom', - 'Collision Value') - #if material.collision_type_simple in specialSurfaces: - # prop_split(box, material, 'collision_param', 'Parameter') - # self.paramInfo(box) - else: - prop_split(box, material, 'collision_type', - 'SM64 Collision Type All') - if material.collision_type == "Custom": - prop_split(box, material, 'collision_custom', - 'Collision Value') - #if material.collision_type in specialSurfaces: - # prop_split(box, material, 'collision_param', 'Parameter') - # self.paramInfo(box) - - split = box.split(factor = 0.5) - split.label(text = '') - split.prop(material, 'collision_all_options') - - box.prop(material, 'use_collision_param') - if material.use_collision_param: - prop_split(box, material, 'collision_param', 'Parameter') - self.paramInfo(box) - - #infoBox = box.box() - #infoBox.label(text = \ - # 'For special params, make a vert color layer named "Collision."') - #infoBox.label(text = 'The red value 0-1 will be converted to 0-65535.') - -''' +class SM64CollisionPanel(bpy.types.Panel): + bl_label = "Collision Inspector" + bl_idname = "MATERIAL_PT_SM64_Collision_Inspector" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "material" + bl_options = {"HIDE_HEADER"} + + @classmethod + def poll(cls, context): + return context.scene.gameEditorMode == "SM64" and context.material is not None + + def paramInfo(self, layout): + box = layout.box() + box.label(text="Parameter is two bytes.") + box.label(text="First byte is an index into an array of speed values.") + box.label(text="(See: sMovingSandSpeeds, sWaterCurrentSpeeds)") + box.label(text="Second byte is a rotation value.") + + def draw(self, context): + box = self.layout.box() + # box.label(text = 'Collision Inspector') + material = context.material + if not material.collision_all_options: + prop_split(box, material, "collision_type_simple", "SM64 Collision Type") + if material.collision_type_simple == "Custom": + prop_split(box, material, "collision_custom", "Collision Value") + # if material.collision_type_simple in specialSurfaces: + # prop_split(box, material, 'collision_param', 'Parameter') + # self.paramInfo(box) + else: + prop_split(box, material, "collision_type", "SM64 Collision Type All") + if material.collision_type == "Custom": + prop_split(box, material, "collision_custom", "Collision Value") + # if material.collision_type in specialSurfaces: + # prop_split(box, material, 'collision_param', 'Parameter') + # self.paramInfo(box) + + split = box.split(factor=0.5) + split.label(text="") + split.prop(material, "collision_all_options") + + box.prop(material, "use_collision_param") + if material.use_collision_param: + prop_split(box, material, "collision_param", "Parameter") + self.paramInfo(box) + + # infoBox = box.box() + # infoBox.label(text = \ + # 'For special params, make a vert color layer named "Collision."') + # infoBox.label(text = 'The red value 0-1 will be converted to 0-65535.') + + +""" class SM64ObjectPanel(bpy.types.Panel): bl_label = "Object Inspector" bl_idname = "SM64_Object_Inspector" @@ -227,1069 +258,1264 @@ def draw(self, context): prop_split(box, obj, 'sm64_special_preset', 'Special Preset') elif obj.sm64_obj_type == 'Water Box': prop_split(box, obj, 'sm64_water_box', 'Water Box Type') -''' - -def exportCollisionBinary(obj, transformMatrix, romfile, startAddress, - endAddress, includeSpecials, includeChildren): - collision = exportCollisionCommon(obj, transformMatrix, includeSpecials, - includeChildren, obj.name, None) - start, end = collision.set_addr(startAddress) - if end > endAddress: - raise PluginError('Size too big: Data ends at ' + hex(end) +\ - ', which is larger than the specified range.') - collision.save_binary(romfile) - return start, end - -def exportCollisionC(obj, transformMatrix, dirPath, includeSpecials, - includeChildren, name, customExport, writeRoomsFile, headerType, - groupName, levelName): - - dirPath, texDir = getExportDir(customExport, dirPath, headerType, - levelName, '', name) - - name = toAlnum(name) - colDirPath = os.path.join(dirPath, toAlnum(name)) - - if not os.path.exists(colDirPath): - os.mkdir(colDirPath) - - colPath = os.path.join(colDirPath, 'collision.inc.c') - - fileObj = open(colPath, 'w', newline='\n') - collision = exportCollisionCommon(obj, transformMatrix, includeSpecials, - includeChildren, name, None) - collisionC = collision.to_c() - fileObj.write(collisionC.source) - fileObj.close() - - cDefine = collisionC.header - if writeRoomsFile: - roomsData = collision.to_c_rooms() - cDefine += roomsData.header - roomsPath = os.path.join(colDirPath, 'rooms.inc.c') - roomsFile = open(roomsPath, 'w', newline='\n') - roomsFile.write(roomsData.source) - roomsFile.close() - - headerPath = os.path.join(colDirPath, 'collision_header.h') - cDefFile = open(headerPath, 'w', newline='\n') - cDefFile.write(cDefine) - cDefFile.close() - - if not customExport: - if headerType == 'Actor': - # Write to group files - if groupName == '' or groupName is None: - raise PluginError("Actor header type chosen but group name not provided.") - - groupPathC = os.path.join(dirPath, groupName + ".c") - groupPathH = os.path.join(dirPath, groupName + ".h") - - writeIfNotFound(groupPathC, '\n#include "' + name + '/collision.inc.c"', '') - if writeRoomsFile: - writeIfNotFound(groupPathC, '\n#include "' + name + '/rooms.inc.c"', '') - else: - deleteIfFound(groupPathC, '\n#include "' + name + '/rooms.inc.c"') - writeIfNotFound(groupPathH, '\n#include "' + name + '/collision_header.h"', '\n#endif') - - elif headerType == 'Level': - groupPathC = os.path.join(dirPath, "leveldata.c") - groupPathH = os.path.join(dirPath, "header.h") - - writeIfNotFound(groupPathC, '\n#include "levels/' + levelName + '/' + name + '/collision.inc.c"', '') - if writeRoomsFile: - writeIfNotFound(groupPathC, '\n#include "levels/' + levelName + '/' + name + '/rooms.inc.c"', '') - else: - deleteIfFound(groupPathC, '\n#include "levels/' + levelName + '/' + name + '/rooms.inc.c"') - writeIfNotFound(groupPathH, '\n#include "levels/' + levelName + '/' + name + '/collision_header.h"', '\n#endif') - - return cDefine - -def exportCollisionInsertableBinary(obj, transformMatrix, filepath, - includeSpecials, includeChildren): - collision = exportCollisionCommon(obj, transformMatrix, includeSpecials, - includeChildren, obj.name, None) - start, end = collision.set_addr(0) - if end > 0xFFFFFF: - raise PluginError('Size too big: Data ends at ' + hex(end) +\ - ', which is larger than the specified range.') - - bytesIO = BytesIO() - collision.save_binary(bytesIO) - data = bytesIO.getvalue()[start:] - bytesIO.close() - - writeInsertableFile(filepath, insertableBinaryTypes['Collision'], - [], collision.startAddress, data) - - return data - -def exportCollisionCommon(obj, transformMatrix, includeSpecials, includeChildren, - name, areaIndex): - bpy.ops.object.select_all(action = 'DESELECT') - obj.select_set(True) - - # dict of collisionType : faces - collisionDict = {} - #addCollisionTriangles(obj, collisionDict, includeChildren, transformMatrix, areaIndex) - tempObj, allObjs = \ - duplicateHierarchy(obj, None, True, areaIndex) - try: - addCollisionTriangles(tempObj, collisionDict, includeChildren, transformMatrix, areaIndex) - cleanupDuplicatedObjects(allObjs) - obj.select_set(True) - bpy.context.view_layer.objects.active = obj - except Exception as e: - cleanupDuplicatedObjects(allObjs) - obj.select_set(True) - bpy.context.view_layer.objects.active = obj - raise Exception(str(e)) - - collision = Collision(toAlnum(name) + '_collision') - for collisionType, faces in collisionDict.items(): - collision.triangles[collisionType] = [] - for (faceVerts, specialParam, room) in faces: - indices = [] - for roundedPosition in faceVerts: - index = collisionVertIndex(roundedPosition, collision.vertices) - if index is None: - collision.vertices.append(CollisionVertex(roundedPosition)) - indices.append(len(collision.vertices) - 1) - else: - indices.append(index) - collision.triangles[collisionType].append(CollisionTriangle(indices, specialParam, room)) - if includeSpecials: - area = SM64_Area(areaIndex, '', '', '', None, None, [], name, None) - # This assumes that only levels will export with included specials, - # And that the collision exporter never will. - start_process_sm64_objects(obj, area, transformMatrix, True) - collision.specials = area.specials - collision.water_boxes = area.water_boxes - - return collision - -def addCollisionTriangles(obj, collisionDict, includeChildren, transformMatrix, areaIndex): - if isinstance(obj.data, bpy.types.Mesh) and not obj.ignore_collision: - if len(obj.data.materials) == 0: - raise PluginError(obj.name + " must have a material associated with it.") - obj.data.calc_loop_triangles() - for face in obj.data.loop_triangles: - material = obj.material_slots[face.material_index].material - colType = material.collision_type if material.collision_all_options\ - else material.collision_type_simple - if colType == 'Custom': - colType = material.collision_custom - specialParam = material.collision_param if material.use_collision_param else None - - (x1, y1, z1) = roundPosition(transformMatrix @ obj.data.vertices[face.vertices[0]].co) - (x2, y2, z2) = roundPosition(transformMatrix @ obj.data.vertices[face.vertices[1]].co) - (x3, y3, z3) = roundPosition(transformMatrix @ obj.data.vertices[face.vertices[2]].co) - - nx = (y2 - y1) * (z3 - z2) - (z2 - z1) * (y3 - y2) - ny = (z2 - z1) * (x3 - x2) - (x2 - x1) * (z3 - z2) - nz = (x2 - x1) * (y3 - y2) - (y2 - y1) * (x3 - x2) - magSqr = nx * nx + ny * ny + nz * nz - - if magSqr <= 0: - print("Ignore denormalized triangle.") - continue - - if colType not in collisionDict: - collisionDict[colType] = [] - collisionDict[colType].append((( - (x1, y1, z1), - (x2, y2, z2), - (x3, y3, z3)), specialParam, obj.room_num)) - - if includeChildren: - for child in obj.children: - addCollisionTriangles(child, collisionDict, includeChildren, transformMatrix @ child.matrix_local, areaIndex) +""" + + +def exportCollisionBinary( + obj, + transformMatrix, + romfile, + startAddress, + endAddress, + includeSpecials, + includeChildren, +): + collision = exportCollisionCommon( + obj, transformMatrix, includeSpecials, includeChildren, obj.name, None + ) + start, end = collision.set_addr(startAddress) + if end > endAddress: + raise PluginError( + "Size too big: Data ends at " + + hex(end) + + ", which is larger than the specified range." + ) + collision.save_binary(romfile) + return start, end + + +def exportCollisionC( + obj, + transformMatrix, + dirPath, + includeSpecials, + includeChildren, + name, + customExport, + writeRoomsFile, + headerType, + groupName, + levelName, +): + + dirPath, texDir = getExportDir( + customExport, dirPath, headerType, levelName, "", name + ) + + name = toAlnum(name) + colDirPath = os.path.join(dirPath, toAlnum(name)) + + if not os.path.exists(colDirPath): + os.mkdir(colDirPath) + + colPath = os.path.join(colDirPath, "collision.inc.c") + + fileObj = open(colPath, "w", newline="\n") + collision = exportCollisionCommon( + obj, transformMatrix, includeSpecials, includeChildren, name, None + ) + collisionC = collision.to_c() + fileObj.write(collisionC.source) + fileObj.close() + + cDefine = collisionC.header + if writeRoomsFile: + roomsData = collision.to_c_rooms() + cDefine += roomsData.header + roomsPath = os.path.join(colDirPath, "rooms.inc.c") + roomsFile = open(roomsPath, "w", newline="\n") + roomsFile.write(roomsData.source) + roomsFile.close() + + headerPath = os.path.join(colDirPath, "collision_header.h") + cDefFile = open(headerPath, "w", newline="\n") + cDefFile.write(cDefine) + cDefFile.close() + + if not customExport: + if headerType == "Actor": + # Write to group files + if groupName == "" or groupName is None: + raise PluginError( + "Actor header type chosen but group name not provided." + ) + + groupPathC = os.path.join(dirPath, groupName + ".c") + groupPathH = os.path.join(dirPath, groupName + ".h") + + writeIfNotFound(groupPathC, '\n#include "' + name + '/collision.inc.c"', "") + if writeRoomsFile: + writeIfNotFound(groupPathC, '\n#include "' + name + '/rooms.inc.c"', "") + else: + deleteIfFound(groupPathC, '\n#include "' + name + '/rooms.inc.c"') + writeIfNotFound( + groupPathH, '\n#include "' + name + '/collision_header.h"', "\n#endif" + ) + + elif headerType == "Level": + groupPathC = os.path.join(dirPath, "leveldata.c") + groupPathH = os.path.join(dirPath, "header.h") + + writeIfNotFound( + groupPathC, + '\n#include "levels/' + levelName + "/" + name + '/collision.inc.c"', + "", + ) + if writeRoomsFile: + writeIfNotFound( + groupPathC, + '\n#include "levels/' + levelName + "/" + name + '/rooms.inc.c"', + "", + ) + else: + deleteIfFound( + groupPathC, + '\n#include "levels/' + levelName + "/" + name + '/rooms.inc.c"', + ) + writeIfNotFound( + groupPathH, + '\n#include "levels/' + levelName + "/" + name + '/collision_header.h"', + "\n#endif", + ) + + return cDefine + + +def exportCollisionInsertableBinary( + obj, transformMatrix, filepath, includeSpecials, includeChildren +): + collision = exportCollisionCommon( + obj, transformMatrix, includeSpecials, includeChildren, obj.name, None + ) + start, end = collision.set_addr(0) + if end > 0xFFFFFF: + raise PluginError( + "Size too big: Data ends at " + + hex(end) + + ", which is larger than the specified range." + ) + + bytesIO = BytesIO() + collision.save_binary(bytesIO) + data = bytesIO.getvalue()[start:] + bytesIO.close() + + writeInsertableFile( + filepath, insertableBinaryTypes["Collision"], [], collision.startAddress, data + ) + + return data + + +def exportCollisionCommon( + obj, transformMatrix, includeSpecials, includeChildren, name, areaIndex +): + bpy.ops.object.select_all(action="DESELECT") + obj.select_set(True) + + # dict of collisionType : faces + collisionDict = {} + # addCollisionTriangles(obj, collisionDict, includeChildren, transformMatrix, areaIndex) + tempObj, allObjs = duplicateHierarchy(obj, None, True, areaIndex) + try: + addCollisionTriangles( + tempObj, collisionDict, includeChildren, transformMatrix, areaIndex + ) + cleanupDuplicatedObjects(allObjs) + obj.select_set(True) + bpy.context.view_layer.objects.active = obj + except Exception as e: + cleanupDuplicatedObjects(allObjs) + obj.select_set(True) + bpy.context.view_layer.objects.active = obj + raise Exception(str(e)) + + collision = Collision(toAlnum(name) + "_collision") + for collisionType, faces in collisionDict.items(): + collision.triangles[collisionType] = [] + for (faceVerts, specialParam, room) in faces: + indices = [] + for roundedPosition in faceVerts: + index = collisionVertIndex(roundedPosition, collision.vertices) + if index is None: + collision.vertices.append(CollisionVertex(roundedPosition)) + indices.append(len(collision.vertices) - 1) + else: + indices.append(index) + collision.triangles[collisionType].append( + CollisionTriangle(indices, specialParam, room) + ) + if includeSpecials: + area = SM64_Area(areaIndex, "", "", "", None, None, [], name, None) + # This assumes that only levels will export with included specials, + # And that the collision exporter never will. + start_process_sm64_objects(obj, area, transformMatrix, True) + collision.specials = area.specials + collision.water_boxes = area.water_boxes + + return collision + + +def addCollisionTriangles( + obj, collisionDict, includeChildren, transformMatrix, areaIndex +): + if isinstance(obj.data, bpy.types.Mesh) and not obj.ignore_collision: + if len(obj.data.materials) == 0: + raise PluginError(obj.name + " must have a material associated with it.") + obj.data.calc_loop_triangles() + for face in obj.data.loop_triangles: + material = obj.material_slots[face.material_index].material + colType = ( + material.collision_type + if material.collision_all_options + else material.collision_type_simple + ) + if colType == "Custom": + colType = material.collision_custom + specialParam = ( + material.collision_param if material.use_collision_param else None + ) + + (x1, y1, z1) = roundPosition( + transformMatrix @ obj.data.vertices[face.vertices[0]].co + ) + (x2, y2, z2) = roundPosition( + transformMatrix @ obj.data.vertices[face.vertices[1]].co + ) + (x3, y3, z3) = roundPosition( + transformMatrix @ obj.data.vertices[face.vertices[2]].co + ) + + nx = (y2 - y1) * (z3 - z2) - (z2 - z1) * (y3 - y2) + ny = (z2 - z1) * (x3 - x2) - (x2 - x1) * (z3 - z2) + nz = (x2 - x1) * (y3 - y2) - (y2 - y1) * (x3 - x2) + magSqr = nx * nx + ny * ny + nz * nz + + if magSqr <= 0: + print("Ignore denormalized triangle.") + continue + + if colType not in collisionDict: + collisionDict[colType] = [] + collisionDict[colType].append( + (((x1, y1, z1), (x2, y2, z2), (x3, y3, z3)), specialParam, obj.room_num) + ) + + if includeChildren: + for child in obj.children: + addCollisionTriangles( + child, + collisionDict, + includeChildren, + transformMatrix @ child.matrix_local, + areaIndex, + ) def roundPosition(position): - return (int(round(position[0])), - int(round(position[1])), - int(round(position[2]))) + return (int(round(position[0])), int(round(position[1])), int(round(position[2]))) + def collisionVertIndex(vert, vertArray): - for i in range(len(vertArray)): - colVert = vertArray[i] - if colVert.position == vert: - return i - return None + for i in range(len(vertArray)): + colVert = vertArray[i] + if colVert.position == vert: + return i + return None + class CollisionSettings: - def __init__(self): - self.collision_type = "SURFACE_DEFAULT" - self.collision_type_simple = "SURFACE_DEFAULT" - self.collision_custom = "SURFACE_DEFAULT" - self.collision_all_options = False - self.use_collision_param = False - self.collision_param = "0x0000" - - def load(self, material): - self.collision_type = material.collision_type - self.collision_type_simple = material.collision_type_simple - self.collision_custom = material.collision_custom - self.collision_all_options = material.collision_all_options - self.use_collision_param = material.use_collision_param - self.collision_param = material.collision_param - - def apply(self, material): - material.collision_type = self.collision_type - material.collision_type_simple = self.collision_type_simple - material.collision_custom = self.collision_custom - material.collision_all_options = self.collision_all_options - material.use_collision_param = self.use_collision_param - material.collision_param = self.collision_param + def __init__(self): + self.collision_type = "SURFACE_DEFAULT" + self.collision_type_simple = "SURFACE_DEFAULT" + self.collision_custom = "SURFACE_DEFAULT" + self.collision_all_options = False + self.use_collision_param = False + self.collision_param = "0x0000" + + def load(self, material): + self.collision_type = material.collision_type + self.collision_type_simple = material.collision_type_simple + self.collision_custom = material.collision_custom + self.collision_all_options = material.collision_all_options + self.use_collision_param = material.use_collision_param + self.collision_param = material.collision_param + + def apply(self, material): + material.collision_type = self.collision_type + material.collision_type_simple = self.collision_type_simple + material.collision_custom = self.collision_custom + material.collision_all_options = self.collision_all_options + material.use_collision_param = self.use_collision_param + material.collision_param = self.collision_param + class SM64_ExportCollision(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.sm64_export_collision' - bl_label = "Export Collision" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - def execute(self, context): - romfileOutput = None - tempROM = None - try: - obj = None - if context.mode != 'OBJECT': - raise PluginError("Operator can only be used in object mode.") - if len(context.selected_objects) == 0: - raise PluginError("Object not selected.") - obj = context.active_object - #if type(obj.data) is not bpy.types.Mesh: - # raise PluginError("Mesh not selected.") - - #T, R, S = obj.matrix_world.decompose() - #objTransform = R.to_matrix().to_4x4() @ \ - # mathutils.Matrix.Diagonal(S).to_4x4() - #finalTransform = (blenderToSM64Rotation * \ - # (bpy.context.scene.blenderToSM64Scale)).to_4x4() - #finalTransform = mathutils.Matrix.Identity(4) - - scaleValue = bpy.context.scene.blenderToSM64Scale - finalTransform = mathutils.Matrix.Diagonal(mathutils.Vector(( - scaleValue, scaleValue, scaleValue))).to_4x4() - except Exception as e: - raisePluginError(self, e) - return {"CANCELLED"} - - try: - applyRotation([obj], math.radians(90), 'X') - if context.scene.fast64.sm64.exportType == 'C': - exportPath, levelName = getPathAndLevel(context.scene.colCustomExport, - context.scene.colExportPath, context.scene.colLevelName, - context.scene.colLevelOption) - if not context.scene.colCustomExport: - applyBasicTweaks(exportPath) - exportCollisionC(obj, finalTransform, - exportPath, False, - context.scene.colIncludeChildren, - bpy.context.scene.colName, context.scene.colCustomExport, context.scene.colExportRooms, - context.scene.colExportHeaderType, context.scene.colGroupName, levelName) - self.report({'INFO'}, 'Success!') - elif context.scene.fast64.sm64.exportType == 'Insertable Binary': - exportCollisionInsertableBinary(obj, finalTransform, - bpy.path.abspath(context.scene.colInsertableBinaryPath), - False, context.scene.colIncludeChildren) - self.report({'INFO'}, 'Success! Collision at ' + \ - context.scene.colInsertableBinaryPath) - else: - tempROM = tempName(context.scene.outputRom) - checkExpanded(bpy.path.abspath(context.scene.exportRom)) - romfileExport = \ - open(bpy.path.abspath(context.scene.exportRom), 'rb') - shutil.copy(bpy.path.abspath(context.scene.exportRom), - bpy.path.abspath(tempROM)) - romfileExport.close() - romfileOutput = open(bpy.path.abspath(tempROM), 'rb+') - - levelParsed = parseLevelAtPointer(romfileOutput, - level_pointers[context.scene.colExportLevel]) - segmentData = levelParsed.segmentData - - if context.scene.extendBank4: - ExtendBank0x04(romfileOutput, segmentData, - defaultExtendSegment4) - - addrRange = \ - exportCollisionBinary(obj, finalTransform, romfileOutput, - int(context.scene.colStartAddr, 16), - int(context.scene.colEndAddr, 16), - False, context.scene.colIncludeChildren) - - segAddress = encodeSegmentedAddr(addrRange[0], segmentData) - if context.scene.set_addr_0x2A: - romfileOutput.seek(int(context.scene.addr_0x2A, 16) + 4) - romfileOutput.write(segAddress) - segPointer = bytesToHex(segAddress) - - romfileOutput.close() - - if os.path.exists(bpy.path.abspath(context.scene.outputRom)): - os.remove(bpy.path.abspath(context.scene.outputRom)) - os.rename(bpy.path.abspath(tempROM), - bpy.path.abspath(context.scene.outputRom)) - - self.report({'INFO'}, 'Success! Collision at (' + \ - hex(addrRange[0]) + ', ' + hex(addrRange[1]) + \ - ') (Seg. ' + segPointer + ').') - - applyRotation([obj], math.radians(-90), 'X') - return {'FINISHED'} # must return a set - - except Exception as e: - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - - applyRotation([obj], math.radians(-90), 'X') - - if context.scene.fast64.sm64.exportType == 'Binary': - if romfileOutput is not None: - romfileOutput.close() - if tempROM is not None and os.path.exists(bpy.path.abspath(tempROM)): - os.remove(bpy.path.abspath(tempROM)) - obj.select_set(True) - context.view_layer.objects.active = obj - raisePluginError(self, e) - return {'CANCELLED'} # must return a set + # set bl_ properties + bl_idname = "object.sm64_export_collision" + bl_label = "Export Collision" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + def execute(self, context): + romfileOutput = None + tempROM = None + try: + obj = None + if context.mode != "OBJECT": + raise PluginError("Operator can only be used in object mode.") + if len(context.selected_objects) == 0: + raise PluginError("Object not selected.") + obj = context.active_object + # if type(obj.data) is not bpy.types.Mesh: + # raise PluginError("Mesh not selected.") + + # T, R, S = obj.matrix_world.decompose() + # objTransform = R.to_matrix().to_4x4() @ \ + # mathutils.Matrix.Diagonal(S).to_4x4() + # finalTransform = (blenderToSM64Rotation * \ + # (bpy.context.scene.blenderToSM64Scale)).to_4x4() + # finalTransform = mathutils.Matrix.Identity(4) + + scaleValue = bpy.context.scene.blenderToSM64Scale + finalTransform = mathutils.Matrix.Diagonal( + mathutils.Vector((scaleValue, scaleValue, scaleValue)) + ).to_4x4() + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} + + try: + applyRotation([obj], math.radians(90), "X") + if context.scene.fast64.sm64.exportType == "C": + exportPath, levelName = getPathAndLevel( + context.scene.colCustomExport, + context.scene.colExportPath, + context.scene.colLevelName, + context.scene.colLevelOption, + ) + if not context.scene.colCustomExport: + applyBasicTweaks(exportPath) + exportCollisionC( + obj, + finalTransform, + exportPath, + False, + context.scene.colIncludeChildren, + bpy.context.scene.colName, + context.scene.colCustomExport, + context.scene.colExportRooms, + context.scene.colExportHeaderType, + context.scene.colGroupName, + levelName, + ) + self.report({"INFO"}, "Success!") + elif context.scene.fast64.sm64.exportType == "Insertable Binary": + exportCollisionInsertableBinary( + obj, + finalTransform, + bpy.path.abspath(context.scene.colInsertableBinaryPath), + False, + context.scene.colIncludeChildren, + ) + self.report( + {"INFO"}, + "Success! Collision at " + context.scene.colInsertableBinaryPath, + ) + else: + tempROM = tempName(context.scene.outputRom) + checkExpanded(bpy.path.abspath(context.scene.exportRom)) + romfileExport = open(bpy.path.abspath(context.scene.exportRom), "rb") + shutil.copy( + bpy.path.abspath(context.scene.exportRom), bpy.path.abspath(tempROM) + ) + romfileExport.close() + romfileOutput = open(bpy.path.abspath(tempROM), "rb+") + + levelParsed = parseLevelAtPointer( + romfileOutput, level_pointers[context.scene.colExportLevel] + ) + segmentData = levelParsed.segmentData + + if context.scene.extendBank4: + ExtendBank0x04(romfileOutput, segmentData, defaultExtendSegment4) + + addrRange = exportCollisionBinary( + obj, + finalTransform, + romfileOutput, + int(context.scene.colStartAddr, 16), + int(context.scene.colEndAddr, 16), + False, + context.scene.colIncludeChildren, + ) + + segAddress = encodeSegmentedAddr(addrRange[0], segmentData) + if context.scene.set_addr_0x2A: + romfileOutput.seek(int(context.scene.addr_0x2A, 16) + 4) + romfileOutput.write(segAddress) + segPointer = bytesToHex(segAddress) + + romfileOutput.close() + + if os.path.exists(bpy.path.abspath(context.scene.outputRom)): + os.remove(bpy.path.abspath(context.scene.outputRom)) + os.rename( + bpy.path.abspath(tempROM), bpy.path.abspath(context.scene.outputRom) + ) + + self.report( + {"INFO"}, + "Success! Collision at (" + + hex(addrRange[0]) + + ", " + + hex(addrRange[1]) + + ") (Seg. " + + segPointer + + ").", + ) + + applyRotation([obj], math.radians(-90), "X") + return {"FINISHED"} # must return a set + + except Exception as e: + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + + applyRotation([obj], math.radians(-90), "X") + + if context.scene.fast64.sm64.exportType == "Binary": + if romfileOutput is not None: + romfileOutput.close() + if tempROM is not None and os.path.exists(bpy.path.abspath(tempROM)): + os.remove(bpy.path.abspath(tempROM)) + obj.select_set(True) + context.view_layer.objects.active = obj + raisePluginError(self, e) + return {"CANCELLED"} # must return a set -class SM64_ExportCollisionPanel(SM64_Panel): - bl_idname = "SM64_PT_export_collision" - bl_label = "SM64 Collision Exporter" - goal = "Export Object/Actor/Anim" - # called every frame - def draw(self, context): - col = self.layout.column() - propsColE = col.operator(SM64_ExportCollision.bl_idname) - - col.prop(context.scene, 'colIncludeChildren') - - if context.scene.fast64.sm64.exportType == 'C': - col.prop(context.scene, 'colExportRooms') - col.prop(context.scene, 'colCustomExport') - if context.scene.colCustomExport: - col.prop(context.scene, 'colExportPath') - prop_split(col, context.scene, 'colName', 'Name') - customExportWarning(col) - else: - prop_split(col, context.scene, 'colExportHeaderType', 'Export Type') - prop_split(col, context.scene, 'colName', 'Name') - if context.scene.colExportHeaderType == 'Actor': - prop_split(col, context.scene, 'colGroupName', 'Group Name') - elif context.scene.colExportHeaderType == 'Level': - prop_split(col, context.scene, 'colLevelOption', 'Level') - if context.scene.colLevelOption == 'custom': - prop_split(col, context.scene, 'colLevelName', 'Level Name') - - decompFolderMessage(col) - writeBox = makeWriteInfoBox(col) - writeBoxExportType(writeBox, context.scene.colExportHeaderType, - context.scene.colName, context.scene.colLevelName, context.scene.colLevelOption) - - elif context.scene.fast64.sm64.exportType == 'Insertable Binary': - col.prop(context.scene, 'colInsertableBinaryPath') - else: - prop_split(col, context.scene, 'colStartAddr', 'Start Address') - prop_split(col, context.scene, 'colEndAddr', 'End Address') - prop_split(col, context.scene, 'colExportLevel', - 'Level Used By Collision') - col.prop(context.scene, 'set_addr_0x2A') - if context.scene.set_addr_0x2A: - prop_split(col, context.scene, 'addr_0x2A', - '0x2A Behaviour Command Address') - - -sm64_col_classes = ( - SM64_ExportCollision, -) +class SM64_ExportCollisionPanel(SM64_Panel): + bl_idname = "SM64_PT_export_collision" + bl_label = "SM64 Collision Exporter" + goal = "Export Object/Actor/Anim" + + # called every frame + def draw(self, context): + col = self.layout.column() + propsColE = col.operator(SM64_ExportCollision.bl_idname) + + col.prop(context.scene, "colIncludeChildren") + + if context.scene.fast64.sm64.exportType == "C": + col.prop(context.scene, "colExportRooms") + col.prop(context.scene, "colCustomExport") + if context.scene.colCustomExport: + col.prop(context.scene, "colExportPath") + prop_split(col, context.scene, "colName", "Name") + customExportWarning(col) + else: + prop_split(col, context.scene, "colExportHeaderType", "Export Type") + prop_split(col, context.scene, "colName", "Name") + if context.scene.colExportHeaderType == "Actor": + prop_split(col, context.scene, "colGroupName", "Group Name") + elif context.scene.colExportHeaderType == "Level": + prop_split(col, context.scene, "colLevelOption", "Level") + if context.scene.colLevelOption == "custom": + prop_split(col, context.scene, "colLevelName", "Level Name") + + decompFolderMessage(col) + writeBox = makeWriteInfoBox(col) + writeBoxExportType( + writeBox, + context.scene.colExportHeaderType, + context.scene.colName, + context.scene.colLevelName, + context.scene.colLevelOption, + ) + + elif context.scene.fast64.sm64.exportType == "Insertable Binary": + col.prop(context.scene, "colInsertableBinaryPath") + else: + prop_split(col, context.scene, "colStartAddr", "Start Address") + prop_split(col, context.scene, "colEndAddr", "End Address") + prop_split(col, context.scene, "colExportLevel", "Level Used By Collision") + col.prop(context.scene, "set_addr_0x2A") + if context.scene.set_addr_0x2A: + prop_split( + col, context.scene, "addr_0x2A", "0x2A Behaviour Command Address" + ) + + +sm64_col_classes = (SM64_ExportCollision,) sm64_col_panel_classes = ( - SM64CollisionPanel, - SM64_ExportCollisionPanel, + SM64CollisionPanel, + SM64_ExportCollisionPanel, ) + def sm64_col_panel_register(): - for cls in sm64_col_panel_classes: - register_class(cls) + for cls in sm64_col_panel_classes: + register_class(cls) + def sm64_col_panel_unregister(): - for cls in sm64_col_panel_classes: - unregister_class(cls) + for cls in sm64_col_panel_classes: + unregister_class(cls) + def sm64_col_register(): - for cls in sm64_col_classes: - register_class(cls) - - # Collision - bpy.types.Scene.colExportPath = bpy.props.StringProperty( - name = 'Directory', subtype = 'FILE_PATH') - bpy.types.Scene.colExportLevel = bpy.props.EnumProperty(items = level_enums, - name = 'Level Used By Collision', default = 'WF') - bpy.types.Scene.addr_0x2A = bpy.props.StringProperty( - name = '0x2A Behaviour Command Address', default = '21A9CC') - bpy.types.Scene.set_addr_0x2A = bpy.props.BoolProperty( - name = 'Overwrite 0x2A Behaviour Command') - bpy.types.Scene.colStartAddr = bpy.props.StringProperty(name ='Start Address', - default = '11D8930') - bpy.types.Scene.colEndAddr = bpy.props.StringProperty(name ='Start Address', - default = '11FFF00') - bpy.types.Scene.colIncludeChildren = bpy.props.BoolProperty( - name = 'Include child objects', default = True) - bpy.types.Scene.colInsertableBinaryPath = bpy.props.StringProperty( - name = 'Filepath', subtype = 'FILE_PATH') - bpy.types.Scene.colExportRooms = bpy.props.BoolProperty( - name = 'Export Rooms', default = False) - bpy.types.Scene.colName = bpy.props.StringProperty( - name = 'Name', default = 'mario') - bpy.types.Scene.colCustomExport = bpy.props.BoolProperty( - name = 'Custom Export Path') - bpy.types.Scene.colExportHeaderType = bpy.props.EnumProperty( - items = enumExportHeaderType, name = 'Header Export', default = 'Actor') - bpy.types.Scene.colGroupName = bpy.props.StringProperty(name = 'Group Name', - default = 'group0') - bpy.types.Scene.colLevelName = bpy.props.StringProperty(name = 'Level', - default = 'bob') - bpy.types.Scene.colLevelOption = bpy.props.EnumProperty( - items = enumLevelNames, name = 'Level', default = 'bob') - - bpy.types.Material.collision_type = bpy.props.EnumProperty( - name = 'Collision Type', items = enumCollisionType, - default = 'SURFACE_DEFAULT') - bpy.types.Material.collision_type_simple = bpy.props.EnumProperty( - name = 'Collision Type', items = enumCollisionTypeSimple, - default = 'SURFACE_DEFAULT') - bpy.types.Material.collision_custom = bpy.props.StringProperty( - name = 'Collision Value', default = 'SURFACE_DEFAULT') - bpy.types.Material.collision_all_options = bpy.props.BoolProperty( - name = 'Show All Options') - bpy.types.Material.use_collision_param = bpy.props.BoolProperty( - name = 'Use Collision Parameter') - bpy.types.Material.collision_param = bpy.props.StringProperty( - name = "Parameter", default = '0x0000') - bpy.types.Object.sm64_water_box = bpy.props.EnumProperty( - name = 'SM64 Water Box', items = enumWaterBoxType, default = 'Water') - bpy.types.Object.sm64_special_preset = bpy.props.EnumProperty( - name = 'SM64 Special', items = enumSpecialType, - default = 'special_yellow_coin') - bpy.types.Object.room_num = bpy.props.IntProperty( - name = 'Room', default = 0, min = 0) + for cls in sm64_col_classes: + register_class(cls) + + # Collision + bpy.types.Scene.colExportPath = bpy.props.StringProperty( + name="Directory", subtype="FILE_PATH" + ) + bpy.types.Scene.colExportLevel = bpy.props.EnumProperty( + items=level_enums, name="Level Used By Collision", default="WF" + ) + bpy.types.Scene.addr_0x2A = bpy.props.StringProperty( + name="0x2A Behaviour Command Address", default="21A9CC" + ) + bpy.types.Scene.set_addr_0x2A = bpy.props.BoolProperty( + name="Overwrite 0x2A Behaviour Command" + ) + bpy.types.Scene.colStartAddr = bpy.props.StringProperty( + name="Start Address", default="11D8930" + ) + bpy.types.Scene.colEndAddr = bpy.props.StringProperty( + name="Start Address", default="11FFF00" + ) + bpy.types.Scene.colIncludeChildren = bpy.props.BoolProperty( + name="Include child objects", default=True + ) + bpy.types.Scene.colInsertableBinaryPath = bpy.props.StringProperty( + name="Filepath", subtype="FILE_PATH" + ) + bpy.types.Scene.colExportRooms = bpy.props.BoolProperty( + name="Export Rooms", default=False + ) + bpy.types.Scene.colName = bpy.props.StringProperty(name="Name", default="mario") + bpy.types.Scene.colCustomExport = bpy.props.BoolProperty(name="Custom Export Path") + bpy.types.Scene.colExportHeaderType = bpy.props.EnumProperty( + items=enumExportHeaderType, name="Header Export", default="Actor" + ) + bpy.types.Scene.colGroupName = bpy.props.StringProperty( + name="Group Name", default="group0" + ) + bpy.types.Scene.colLevelName = bpy.props.StringProperty(name="Level", default="bob") + bpy.types.Scene.colLevelOption = bpy.props.EnumProperty( + items=enumLevelNames, name="Level", default="bob" + ) + + bpy.types.Material.collision_type = bpy.props.EnumProperty( + name="Collision Type", items=enumCollisionType, default="SURFACE_DEFAULT" + ) + bpy.types.Material.collision_type_simple = bpy.props.EnumProperty( + name="Collision Type", items=enumCollisionTypeSimple, default="SURFACE_DEFAULT" + ) + bpy.types.Material.collision_custom = bpy.props.StringProperty( + name="Collision Value", default="SURFACE_DEFAULT" + ) + bpy.types.Material.collision_all_options = bpy.props.BoolProperty( + name="Show All Options" + ) + bpy.types.Material.use_collision_param = bpy.props.BoolProperty( + name="Use Collision Parameter" + ) + bpy.types.Material.collision_param = bpy.props.StringProperty( + name="Parameter", default="0x0000" + ) + bpy.types.Object.sm64_water_box = bpy.props.EnumProperty( + name="SM64 Water Box", items=enumWaterBoxType, default="Water" + ) + bpy.types.Object.sm64_special_preset = bpy.props.EnumProperty( + name="SM64 Special", items=enumSpecialType, default="special_yellow_coin" + ) + bpy.types.Object.room_num = bpy.props.IntProperty(name="Room", default=0, min=0) + def sm64_col_unregister(): - # Collision - del bpy.types.Scene.colExportPath - del bpy.types.Scene.colExportLevel - del bpy.types.Scene.addr_0x2A - del bpy.types.Scene.set_addr_0x2A - del bpy.types.Scene.colStartAddr - del bpy.types.Scene.colEndAddr - del bpy.types.Scene.colInsertableBinaryPath - del bpy.types.Scene.colExportRooms - del bpy.types.Scene.colName - del bpy.types.Scene.colCustomExport - del bpy.types.Scene.colExportHeaderType - del bpy.types.Scene.colGroupName - del bpy.types.Scene.colLevelName - del bpy.types.Scene.colLevelOption - - del bpy.types.Material.collision_type - del bpy.types.Material.collision_type_simple - del bpy.types.Material.collision_all_options - del bpy.types.Material.collision_param - del bpy.types.Material.collision_custom - - del bpy.types.Object.sm64_water_box - del bpy.types.Object.sm64_special_preset - - del bpy.types.Object.room_num - - for cls in reversed(sm64_col_classes): - unregister_class(cls) + # Collision + del bpy.types.Scene.colExportPath + del bpy.types.Scene.colExportLevel + del bpy.types.Scene.addr_0x2A + del bpy.types.Scene.set_addr_0x2A + del bpy.types.Scene.colStartAddr + del bpy.types.Scene.colEndAddr + del bpy.types.Scene.colInsertableBinaryPath + del bpy.types.Scene.colExportRooms + del bpy.types.Scene.colName + del bpy.types.Scene.colCustomExport + del bpy.types.Scene.colExportHeaderType + del bpy.types.Scene.colGroupName + del bpy.types.Scene.colLevelName + del bpy.types.Scene.colLevelOption + + del bpy.types.Material.collision_type + del bpy.types.Material.collision_type_simple + del bpy.types.Material.collision_all_options + del bpy.types.Material.collision_param + del bpy.types.Material.collision_custom + + del bpy.types.Object.sm64_water_box + del bpy.types.Object.sm64_special_preset + + del bpy.types.Object.room_num + + for cls in reversed(sm64_col_classes): + unregister_class(cls) + enumWaterBoxType = [ - ("Water", 'Water', "Water"), - ('Toxic Haze', 'Toxic Haze', 'Toxic Haze') + ("Water", "Water", "Water"), + ("Toxic Haze", "Toxic Haze", "Toxic Haze"), ] specialSurfaces = [ - 'SURFACE_0004', - 'SURFACE_FLOWING_WATER', - 'SURFACE_DEEP_MOVING_QUICKSAND', - 'SURFACE_SHALLOW_MOVING_QUICKSAND', - 'SURFACE_MOVING_QUICKSAND', - 'SURFACE_HORIZONTAL_WIND', - 'SURFACE_INSTANT_MOVING_QUICKSAND', + "SURFACE_0004", + "SURFACE_FLOWING_WATER", + "SURFACE_DEEP_MOVING_QUICKSAND", + "SURFACE_SHALLOW_MOVING_QUICKSAND", + "SURFACE_MOVING_QUICKSAND", + "SURFACE_HORIZONTAL_WIND", + "SURFACE_INSTANT_MOVING_QUICKSAND", ] + class CollisionTypeDefinition: - def __init__(self): - self.SURFACE_DEFAULT = 0x0000 - self.SURFACE_BURNING = 0x0001 - self.SURFACE_0004 = 0x0004 - self.SURFACE_HANGABLE = 0x0005 - self.SURFACE_SLOW = 0x0009 - self.SURFACE_DEATH_PLANE = 0x000A - self.SURFACE_CLOSE_CAMERA = 0x000B - self.SURFACE_WATER = 0x000D - self.SURFACE_FLOWING_WATER = 0x000E - self.SURFACE_INTANGIBLE = 0x0012 - self.SURFACE_VERY_SLIPPERY = 0x0013 - self.SURFACE_SLIPPERY = 0x0014 - self.SURFACE_NOT_SLIPPERY = 0x0015 - self.SURFACE_TTM_VINES = 0x0016 - self.SURFACE_MGR_MUSIC = 0x001A - self.SURFACE_INSTANT_WARP_1B = 0x001B - self.SURFACE_INSTANT_WARP_1C = 0x001C - self.SURFACE_INSTANT_WARP_1D = 0x001D - self.SURFACE_INSTANT_WARP_1E = 0x001E - self.SURFACE_SHALLOW_QUICKSAND = 0x0021 - self.SURFACE_DEEP_QUICKSAND = 0x0022 - self.SURFACE_INSTANT_QUICKSAND = 0x0023 - self.SURFACE_DEEP_MOVING_QUICKSAND = 0x0024 - self.SURFACE_SHALLOW_MOVING_QUICKSAND = 0x0025 - self.SURFACE_QUICKSAND = 0x0026 - self.SURFACE_MOVING_QUICKSAND = 0x0027 - self.SURFACE_WALL_MISC = 0x0028 - self.SURFACE_NOISE_DEFAULT = 0x0029 - self.SURFACE_NOISE_SLIPPERY = 0x002A - self.SURFACE_HORIZONTAL_WIND = 0x002C - self.SURFACE_INSTANT_MOVING_QUICKSAND = 0x002D - self.SURFACE_ICE = 0x002E - self.SURFACE_LOOK_UP_WARP = 0x002F - self.SURFACE_HARD = 0x0030 - self.SURFACE_WARP = 0x0032 - self.SURFACE_TIMER_START = 0x0033 - self.SURFACE_TIMER_END = 0x0034 - self.SURFACE_HARD_SLIPPERY = 0x0035 - self.SURFACE_HARD_VERY_SLIPPERY = 0x0036 - self.SURFACE_HARD_NOT_SLIPPERY = 0x0037 - self.SURFACE_VERTICAL_WIND = 0x0038 - self.SURFACE_BOSS_FIGHT_CAMERA = 0x0065 - self.SURFACE_CAMERA_FREE_ROAM = 0x0066 - self.SURFACE_THI3_WALLKICK = 0x0068 - self.SURFACE_CAMERA_PLATFORM = 0x0069 - self.SURFACE_CAMERA_MIDDLE = 0x006E - self.SURFACE_CAMERA_ROTATE_RIGHT = 0x006F - self.SURFACE_CAMERA_ROTATE_LEFT = 0x0070 - self.SURFACE_CAMERA_BOUNDARY = 0x0072 - self.SURFACE_NOISE_VERY_SLIPPERY_73 = 0x0073 - self.SURFACE_NOISE_VERY_SLIPPERY_74 = 0x0074 - self.SURFACE_NOISE_VERY_SLIPPERY = 0x0075 - self.SURFACE_NO_CAM_COLLISION = 0x0076 - self.SURFACE_NO_CAM_COLLISION_77 = 0x0077 - self.SURFACE_NO_CAM_COL_VERY_SLIPPERY = 0x0078 - self.SURFACE_NO_CAM_COL_SLIPPERY = 0x0079 - self.SURFACE_SWITCH = 0x007A - self.SURFACE_VANISH_CAP_WALLS = 0x007B - self.SURFACE_PAINTING_WOBBLE_A6 = 0x00A6 - self.SURFACE_PAINTING_WOBBLE_A7 = 0x00A7 - self.SURFACE_PAINTING_WOBBLE_A8 = 0x00A8 - self.SURFACE_PAINTING_WOBBLE_A9 = 0x00A9 - self.SURFACE_PAINTING_WOBBLE_AA = 0x00AA - self.SURFACE_PAINTING_WOBBLE_AB = 0x00AB - self.SURFACE_PAINTING_WOBBLE_AC = 0x00AC - self.SURFACE_PAINTING_WOBBLE_AD = 0x00AD - self.SURFACE_PAINTING_WOBBLE_AE = 0x00AE - self.SURFACE_PAINTING_WOBBLE_AF = 0x00AF - self.SURFACE_PAINTING_WOBBLE_B0 = 0x00B0 - self.SURFACE_PAINTING_WOBBLE_B1 = 0x00B1 - self.SURFACE_PAINTING_WOBBLE_B2 = 0x00B2 - self.SURFACE_PAINTING_WOBBLE_B3 = 0x00B3 - self.SURFACE_PAINTING_WOBBLE_B4 = 0x00B4 - self.SURFACE_PAINTING_WOBBLE_B5 = 0x00B5 - self.SURFACE_PAINTING_WOBBLE_B6 = 0x00B6 - self.SURFACE_PAINTING_WOBBLE_B7 = 0x00B7 - self.SURFACE_PAINTING_WOBBLE_B8 = 0x00B8 - self.SURFACE_PAINTING_WOBBLE_B9 = 0x00B9 - self.SURFACE_PAINTING_WOBBLE_BA = 0x00BA - self.SURFACE_PAINTING_WOBBLE_BB = 0x00BB - self.SURFACE_PAINTING_WOBBLE_BC = 0x00BC - self.SURFACE_PAINTING_WOBBLE_BD = 0x00BD - self.SURFACE_PAINTING_WOBBLE_BE = 0x00BE - self.SURFACE_PAINTING_WOBBLE_BF = 0x00BF - self.SURFACE_PAINTING_WOBBLE_C0 = 0x00C0 - self.SURFACE_PAINTING_WOBBLE_C1 = 0x00C1 - self.SURFACE_PAINTING_WOBBLE_C2 = 0x00C2 - self.SURFACE_PAINTING_WOBBLE_C3 = 0x00C3 - self.SURFACE_PAINTING_WOBBLE_C4 = 0x00C4 - self.SURFACE_PAINTING_WOBBLE_C5 = 0x00C5 - self.SURFACE_PAINTING_WOBBLE_C6 = 0x00C6 - self.SURFACE_PAINTING_WOBBLE_C7 = 0x00C7 - self.SURFACE_PAINTING_WOBBLE_C8 = 0x00C8 - self.SURFACE_PAINTING_WOBBLE_C9 = 0x00C9 - self.SURFACE_PAINTING_WOBBLE_CA = 0x00CA - self.SURFACE_PAINTING_WOBBLE_CB = 0x00CB - self.SURFACE_PAINTING_WOBBLE_CC = 0x00CC - self.SURFACE_PAINTING_WOBBLE_CD = 0x00CD - self.SURFACE_PAINTING_WOBBLE_CE = 0x00CE - self.SURFACE_PAINTING_WOBBLE_CF = 0x00CF - self.SURFACE_PAINTING_WOBBLE_D0 = 0x00D0 - self.SURFACE_PAINTING_WOBBLE_D1 = 0x00D1 - self.SURFACE_PAINTING_WOBBLE_D2 = 0x00D2 - self.SURFACE_PAINTING_WARP_D3 = 0x00D3 - self.SURFACE_PAINTING_WARP_D4 = 0x00D4 - self.SURFACE_PAINTING_WARP_D5 = 0x00D5 - self.SURFACE_PAINTING_WARP_D6 = 0x00D6 - self.SURFACE_PAINTING_WARP_D7 = 0x00D7 - self.SURFACE_PAINTING_WARP_D8 = 0x00D8 - self.SURFACE_PAINTING_WARP_D9 = 0x00D9 - self.SURFACE_PAINTING_WARP_DA = 0x00DA - self.SURFACE_PAINTING_WARP_DB = 0x00DB - self.SURFACE_PAINTING_WARP_DC = 0x00DC - self.SURFACE_PAINTING_WARP_DD = 0x00DD - self.SURFACE_PAINTING_WARP_DE = 0x00DE - self.SURFACE_PAINTING_WARP_DF = 0x00DF - self.SURFACE_PAINTING_WARP_E0 = 0x00E0 - self.SURFACE_PAINTING_WARP_E1 = 0x00E1 - self.SURFACE_PAINTING_WARP_E2 = 0x00E2 - self.SURFACE_PAINTING_WARP_E3 = 0x00E3 - self.SURFACE_PAINTING_WARP_E4 = 0x00E4 - self.SURFACE_PAINTING_WARP_E5 = 0x00E5 - self.SURFACE_PAINTING_WARP_E6 = 0x00E6 - self.SURFACE_PAINTING_WARP_E7 = 0x00E7 - self.SURFACE_PAINTING_WARP_E8 = 0x00E8 - self.SURFACE_PAINTING_WARP_E9 = 0x00E9 - self.SURFACE_PAINTING_WARP_EA = 0x00EA - self.SURFACE_PAINTING_WARP_EB = 0x00EB - self.SURFACE_PAINTING_WARP_EC = 0x00EC - self.SURFACE_PAINTING_WARP_ED = 0x00ED - self.SURFACE_PAINTING_WARP_EE = 0x00EE - self.SURFACE_PAINTING_WARP_EF = 0x00EF - self.SURFACE_PAINTING_WARP_F0 = 0x00F0 - self.SURFACE_PAINTING_WARP_F1 = 0x00F1 - self.SURFACE_PAINTING_WARP_F2 = 0x00F2 - self.SURFACE_PAINTING_WARP_F3 = 0x00F3 - self.SURFACE_TTC_PAINTING_1 = 0x00F4 - self.SURFACE_TTC_PAINTING_2 = 0x00F5 - self.SURFACE_TTC_PAINTING_3 = 0x00F6 - self.SURFACE_PAINTING_WARP_F7 = 0x00F7 - self.SURFACE_PAINTING_WARP_F8 = 0x00F8 - self.SURFACE_PAINTING_WARP_F9 = 0x00F9 - self.SURFACE_PAINTING_WARP_FA = 0x00FA - self.SURFACE_PAINTING_WARP_FB = 0x00FB - self.SURFACE_PAINTING_WARP_FC = 0x00FC - self.SURFACE_WOBBLING_WARP = 0x00FD - self.SURFACE_TRAPDOOR = 0x00FF - - self.SURFACE_CLASS_DEFAULT = 0x0000 - self.SURFACE_CLASS_VERY_SLIPPERY = 0x0013 - self.SURFACE_CLASS_SLIPPERY = 0x0014 - self.SURFACE_CLASS_NOT_SLIPPERY = 0x0015 - - self.SURFACE_FLAG_DYNAMIC = (1 << 0) - self.SURFACE_FLAG_NO_CAM_COLLISION = (1 << 1) - self.SURFACE_FLAG_X_PROJECTION = (1 << 3) - - self.TERRAIN_LOAD_VERTICES = 0x0040 - self.TERRAIN_LOAD_CONTINUE = 0x0041 - self.TERRAIN_LOAD_END = 0x0042 - self.TERRAIN_LOAD_OBJECTS = 0x0043 - self.TERRAIN_LOAD_ENVIRONMENT = 0x0044 - - self.TERRAIN_GRASS = 0x0000 - self.TERRAIN_STONE = 0x0001 - self.TERRAIN_SNOW = 0x0002 - self.TERRAIN_SAND = 0x0003 - self.TERRAIN_SPOOKY = 0x0004 - self.TERRAIN_WATER = 0x0005 - self.TERRAIN_SLIDE = 0x0006 - self.TERRAIN_MASK = 0x0007 - - def SURFACE_IS_QUICKSAND(self, cmd): - return (cmd >= 0x21 and cmd <= 0x28) - def SURFACE_IS_NOT_HARD(self, cmd): - return (cmd != self.SURFACE_HARD and not (cmd >= 0x35 and cmd <= 0x37)) - def SURFACE_IS_PAINTING_WARP(self, cmd): - return (cmd >= 0xD3 and cmd < 0xFD) - def TERRAIN_LOAD_IS_SURFACE_TYPE_LOW(self, cmd) : - return (cmd < 0x40) - def TERRAIN_LOAD_IS_SURFACE_TYPE_HIGH(self, cmd) : - return (cmd >= 0x65) + def __init__(self): + self.SURFACE_DEFAULT = 0x0000 + self.SURFACE_BURNING = 0x0001 + self.SURFACE_0004 = 0x0004 + self.SURFACE_HANGABLE = 0x0005 + self.SURFACE_SLOW = 0x0009 + self.SURFACE_DEATH_PLANE = 0x000A + self.SURFACE_CLOSE_CAMERA = 0x000B + self.SURFACE_WATER = 0x000D + self.SURFACE_FLOWING_WATER = 0x000E + self.SURFACE_INTANGIBLE = 0x0012 + self.SURFACE_VERY_SLIPPERY = 0x0013 + self.SURFACE_SLIPPERY = 0x0014 + self.SURFACE_NOT_SLIPPERY = 0x0015 + self.SURFACE_TTM_VINES = 0x0016 + self.SURFACE_MGR_MUSIC = 0x001A + self.SURFACE_INSTANT_WARP_1B = 0x001B + self.SURFACE_INSTANT_WARP_1C = 0x001C + self.SURFACE_INSTANT_WARP_1D = 0x001D + self.SURFACE_INSTANT_WARP_1E = 0x001E + self.SURFACE_SHALLOW_QUICKSAND = 0x0021 + self.SURFACE_DEEP_QUICKSAND = 0x0022 + self.SURFACE_INSTANT_QUICKSAND = 0x0023 + self.SURFACE_DEEP_MOVING_QUICKSAND = 0x0024 + self.SURFACE_SHALLOW_MOVING_QUICKSAND = 0x0025 + self.SURFACE_QUICKSAND = 0x0026 + self.SURFACE_MOVING_QUICKSAND = 0x0027 + self.SURFACE_WALL_MISC = 0x0028 + self.SURFACE_NOISE_DEFAULT = 0x0029 + self.SURFACE_NOISE_SLIPPERY = 0x002A + self.SURFACE_HORIZONTAL_WIND = 0x002C + self.SURFACE_INSTANT_MOVING_QUICKSAND = 0x002D + self.SURFACE_ICE = 0x002E + self.SURFACE_LOOK_UP_WARP = 0x002F + self.SURFACE_HARD = 0x0030 + self.SURFACE_WARP = 0x0032 + self.SURFACE_TIMER_START = 0x0033 + self.SURFACE_TIMER_END = 0x0034 + self.SURFACE_HARD_SLIPPERY = 0x0035 + self.SURFACE_HARD_VERY_SLIPPERY = 0x0036 + self.SURFACE_HARD_NOT_SLIPPERY = 0x0037 + self.SURFACE_VERTICAL_WIND = 0x0038 + self.SURFACE_BOSS_FIGHT_CAMERA = 0x0065 + self.SURFACE_CAMERA_FREE_ROAM = 0x0066 + self.SURFACE_THI3_WALLKICK = 0x0068 + self.SURFACE_CAMERA_PLATFORM = 0x0069 + self.SURFACE_CAMERA_MIDDLE = 0x006E + self.SURFACE_CAMERA_ROTATE_RIGHT = 0x006F + self.SURFACE_CAMERA_ROTATE_LEFT = 0x0070 + self.SURFACE_CAMERA_BOUNDARY = 0x0072 + self.SURFACE_NOISE_VERY_SLIPPERY_73 = 0x0073 + self.SURFACE_NOISE_VERY_SLIPPERY_74 = 0x0074 + self.SURFACE_NOISE_VERY_SLIPPERY = 0x0075 + self.SURFACE_NO_CAM_COLLISION = 0x0076 + self.SURFACE_NO_CAM_COLLISION_77 = 0x0077 + self.SURFACE_NO_CAM_COL_VERY_SLIPPERY = 0x0078 + self.SURFACE_NO_CAM_COL_SLIPPERY = 0x0079 + self.SURFACE_SWITCH = 0x007A + self.SURFACE_VANISH_CAP_WALLS = 0x007B + self.SURFACE_PAINTING_WOBBLE_A6 = 0x00A6 + self.SURFACE_PAINTING_WOBBLE_A7 = 0x00A7 + self.SURFACE_PAINTING_WOBBLE_A8 = 0x00A8 + self.SURFACE_PAINTING_WOBBLE_A9 = 0x00A9 + self.SURFACE_PAINTING_WOBBLE_AA = 0x00AA + self.SURFACE_PAINTING_WOBBLE_AB = 0x00AB + self.SURFACE_PAINTING_WOBBLE_AC = 0x00AC + self.SURFACE_PAINTING_WOBBLE_AD = 0x00AD + self.SURFACE_PAINTING_WOBBLE_AE = 0x00AE + self.SURFACE_PAINTING_WOBBLE_AF = 0x00AF + self.SURFACE_PAINTING_WOBBLE_B0 = 0x00B0 + self.SURFACE_PAINTING_WOBBLE_B1 = 0x00B1 + self.SURFACE_PAINTING_WOBBLE_B2 = 0x00B2 + self.SURFACE_PAINTING_WOBBLE_B3 = 0x00B3 + self.SURFACE_PAINTING_WOBBLE_B4 = 0x00B4 + self.SURFACE_PAINTING_WOBBLE_B5 = 0x00B5 + self.SURFACE_PAINTING_WOBBLE_B6 = 0x00B6 + self.SURFACE_PAINTING_WOBBLE_B7 = 0x00B7 + self.SURFACE_PAINTING_WOBBLE_B8 = 0x00B8 + self.SURFACE_PAINTING_WOBBLE_B9 = 0x00B9 + self.SURFACE_PAINTING_WOBBLE_BA = 0x00BA + self.SURFACE_PAINTING_WOBBLE_BB = 0x00BB + self.SURFACE_PAINTING_WOBBLE_BC = 0x00BC + self.SURFACE_PAINTING_WOBBLE_BD = 0x00BD + self.SURFACE_PAINTING_WOBBLE_BE = 0x00BE + self.SURFACE_PAINTING_WOBBLE_BF = 0x00BF + self.SURFACE_PAINTING_WOBBLE_C0 = 0x00C0 + self.SURFACE_PAINTING_WOBBLE_C1 = 0x00C1 + self.SURFACE_PAINTING_WOBBLE_C2 = 0x00C2 + self.SURFACE_PAINTING_WOBBLE_C3 = 0x00C3 + self.SURFACE_PAINTING_WOBBLE_C4 = 0x00C4 + self.SURFACE_PAINTING_WOBBLE_C5 = 0x00C5 + self.SURFACE_PAINTING_WOBBLE_C6 = 0x00C6 + self.SURFACE_PAINTING_WOBBLE_C7 = 0x00C7 + self.SURFACE_PAINTING_WOBBLE_C8 = 0x00C8 + self.SURFACE_PAINTING_WOBBLE_C9 = 0x00C9 + self.SURFACE_PAINTING_WOBBLE_CA = 0x00CA + self.SURFACE_PAINTING_WOBBLE_CB = 0x00CB + self.SURFACE_PAINTING_WOBBLE_CC = 0x00CC + self.SURFACE_PAINTING_WOBBLE_CD = 0x00CD + self.SURFACE_PAINTING_WOBBLE_CE = 0x00CE + self.SURFACE_PAINTING_WOBBLE_CF = 0x00CF + self.SURFACE_PAINTING_WOBBLE_D0 = 0x00D0 + self.SURFACE_PAINTING_WOBBLE_D1 = 0x00D1 + self.SURFACE_PAINTING_WOBBLE_D2 = 0x00D2 + self.SURFACE_PAINTING_WARP_D3 = 0x00D3 + self.SURFACE_PAINTING_WARP_D4 = 0x00D4 + self.SURFACE_PAINTING_WARP_D5 = 0x00D5 + self.SURFACE_PAINTING_WARP_D6 = 0x00D6 + self.SURFACE_PAINTING_WARP_D7 = 0x00D7 + self.SURFACE_PAINTING_WARP_D8 = 0x00D8 + self.SURFACE_PAINTING_WARP_D9 = 0x00D9 + self.SURFACE_PAINTING_WARP_DA = 0x00DA + self.SURFACE_PAINTING_WARP_DB = 0x00DB + self.SURFACE_PAINTING_WARP_DC = 0x00DC + self.SURFACE_PAINTING_WARP_DD = 0x00DD + self.SURFACE_PAINTING_WARP_DE = 0x00DE + self.SURFACE_PAINTING_WARP_DF = 0x00DF + self.SURFACE_PAINTING_WARP_E0 = 0x00E0 + self.SURFACE_PAINTING_WARP_E1 = 0x00E1 + self.SURFACE_PAINTING_WARP_E2 = 0x00E2 + self.SURFACE_PAINTING_WARP_E3 = 0x00E3 + self.SURFACE_PAINTING_WARP_E4 = 0x00E4 + self.SURFACE_PAINTING_WARP_E5 = 0x00E5 + self.SURFACE_PAINTING_WARP_E6 = 0x00E6 + self.SURFACE_PAINTING_WARP_E7 = 0x00E7 + self.SURFACE_PAINTING_WARP_E8 = 0x00E8 + self.SURFACE_PAINTING_WARP_E9 = 0x00E9 + self.SURFACE_PAINTING_WARP_EA = 0x00EA + self.SURFACE_PAINTING_WARP_EB = 0x00EB + self.SURFACE_PAINTING_WARP_EC = 0x00EC + self.SURFACE_PAINTING_WARP_ED = 0x00ED + self.SURFACE_PAINTING_WARP_EE = 0x00EE + self.SURFACE_PAINTING_WARP_EF = 0x00EF + self.SURFACE_PAINTING_WARP_F0 = 0x00F0 + self.SURFACE_PAINTING_WARP_F1 = 0x00F1 + self.SURFACE_PAINTING_WARP_F2 = 0x00F2 + self.SURFACE_PAINTING_WARP_F3 = 0x00F3 + self.SURFACE_TTC_PAINTING_1 = 0x00F4 + self.SURFACE_TTC_PAINTING_2 = 0x00F5 + self.SURFACE_TTC_PAINTING_3 = 0x00F6 + self.SURFACE_PAINTING_WARP_F7 = 0x00F7 + self.SURFACE_PAINTING_WARP_F8 = 0x00F8 + self.SURFACE_PAINTING_WARP_F9 = 0x00F9 + self.SURFACE_PAINTING_WARP_FA = 0x00FA + self.SURFACE_PAINTING_WARP_FB = 0x00FB + self.SURFACE_PAINTING_WARP_FC = 0x00FC + self.SURFACE_WOBBLING_WARP = 0x00FD + self.SURFACE_TRAPDOOR = 0x00FF + + self.SURFACE_CLASS_DEFAULT = 0x0000 + self.SURFACE_CLASS_VERY_SLIPPERY = 0x0013 + self.SURFACE_CLASS_SLIPPERY = 0x0014 + self.SURFACE_CLASS_NOT_SLIPPERY = 0x0015 + + self.SURFACE_FLAG_DYNAMIC = 1 << 0 + self.SURFACE_FLAG_NO_CAM_COLLISION = 1 << 1 + self.SURFACE_FLAG_X_PROJECTION = 1 << 3 + + self.TERRAIN_LOAD_VERTICES = 0x0040 + self.TERRAIN_LOAD_CONTINUE = 0x0041 + self.TERRAIN_LOAD_END = 0x0042 + self.TERRAIN_LOAD_OBJECTS = 0x0043 + self.TERRAIN_LOAD_ENVIRONMENT = 0x0044 + + self.TERRAIN_GRASS = 0x0000 + self.TERRAIN_STONE = 0x0001 + self.TERRAIN_SNOW = 0x0002 + self.TERRAIN_SAND = 0x0003 + self.TERRAIN_SPOOKY = 0x0004 + self.TERRAIN_WATER = 0x0005 + self.TERRAIN_SLIDE = 0x0006 + self.TERRAIN_MASK = 0x0007 + + def SURFACE_IS_QUICKSAND(self, cmd): + return cmd >= 0x21 and cmd <= 0x28 + + def SURFACE_IS_NOT_HARD(self, cmd): + return cmd != self.SURFACE_HARD and not (cmd >= 0x35 and cmd <= 0x37) + + def SURFACE_IS_PAINTING_WARP(self, cmd): + return cmd >= 0xD3 and cmd < 0xFD + + def TERRAIN_LOAD_IS_SURFACE_TYPE_LOW(self, cmd): + return cmd < 0x40 + + def TERRAIN_LOAD_IS_SURFACE_TYPE_HIGH(self, cmd): + return cmd >= 0x65 + enumSpecialType = [ - ('special_null_start', 'Null Start', 'Null Start'), - ('special_yellow_coin', 'Yellow Coin', 'Yellow Coin'), - ('special_yellow_coin_2', 'Yellow Coin 2', 'Yellow Coin 2'), - ('special_unknown_3', 'Unknown 3', 'Unknown 3'), - ('special_boo', 'Boo', 'Boo'), - ('special_unknown_5', 'Unknown 5', 'Unknown 5'), - ('special_lll_moving_octagonal_mesh_platform', - 'LLL Moving Octagonal Platform', 'LLL Moving Octagonal Platform'), - ('special_snow_ball', 'Snow Ball', 'Snow Ball'), - ('special_lll_drawbridge_spawner', 'LLL Drawbridge Spawner', - 'LLL Drawbridge Spawner'), - ('special_empty_9', 'Empty 9', 'Empty 9'), - ('special_lll_rotating_block_with_fire_bars', - 'LLL Rotating Block With Fire Bars', 'LLL Rotating Block With Fire Bars'), - ('special_lll_floating_wood_bridge', - 'LLL Floating Wood Bridge', 'LLL Floating Wood Bridge'), - ('special_tumbling_platform', 'Tumbling Platform', 'Tumbling Platform'), - ('special_lll_rotating_hexagonal_ring', 'LLL Rotating Hexagonal Ring', - 'LLL Rotating Hexagonal Ring'), - ('special_lll_sinking_rectangular_platform', - 'LLL Sinking Rectangular Platform', 'LLL Sinking Rectangular Platform'), - ('special_lll_sinking_square_platforms', 'LLL Sinking Square Platforms', - 'LLL Sinking Square Platforms'), - ('special_lll_tilting_square_platform', 'LLL Tilting Square Platform', - 'LLL Tilting Square Platform'), - ('special_lll_bowser_puzzle', 'LLL Bowser Puzzle', 'LLL Bowser Puzzle'), - ('special_mr_i', 'Mr. I', 'Mr. I'), - ('special_small_bully', 'Small Bully', 'Small Bully'), - ('special_big_bully', 'Big Bully', 'Big Bully'), - ('special_empty_21', 'Empty 21', 'Empty 21'), - ('special_empty_22', 'Empty 22', 'Empty 22'), - ('special_empty_23', 'Empty 23', 'Empty 23'), - ('special_empty_24', 'Empty 24', 'Empty 24'), - ('special_empty_25', 'Empty 25', 'Empty 25'), - ('special_moving_blue_coin', 'Moving Blue Coin', 'Moving Blue Coin'), - ('special_jrb_chest', 'JRB Chest', 'JRB Chest'), - ('special_water_ring', 'Water Ring', 'Water Ring'), - ('special_mine', 'Mine', 'Mine'), - ('special_empty_30', 'Empty 30', 'Empty 30'), - ('special_empty_31', 'Empty 31', 'Empty 31'), - ('special_butterfly', 'Butterfly', 'Butterfly'), - ('special_bowser', 'Bowser', 'Bowser'), - ('special_wf_rotating_wooden_platform', 'WF Rotating Wooden Platform', - 'WF Rotating Wooden Platform'), - ('special_small_bomp', 'Small Bomp', 'Small Bomp'), - ('special_wf_sliding_platform', 'WF Sliding Platform', 'WF Sliding Platform'), - ('special_tower_platform_group', 'Tower Platform Group', - 'Tower Platform Group'), - ('special_rotating_counter_clockwise', 'Rotating Counter Clockwise', - 'Rotating Counter Clockwise'), - ('special_wf_tumbling_bridge', 'WF Tumbling Bridge', 'WF Tumbling Bridge'), - ('special_large_bomp', 'Large Bomp', 'Large Bomp' ), - ('special_level_geo_03', 'Level Geo 03', 'Level Geo 03'), - ('special_level_geo_04', 'Level Geo 04', 'Level Geo 04'), - ('special_level_geo_05', 'Level Geo 05', 'Level Geo 05'), - ('special_level_geo_06', 'Level Geo 06', 'Level Geo 06'), - ('special_level_geo_07', 'Level Geo 07', 'Level Geo 07'), - ('special_level_geo_08', 'Level Geo 08', 'Level Geo 08'), - ('special_level_geo_09', 'Level Geo 09', 'Level Geo 09'), - ('special_level_geo_0A', 'Level Geo 0A', 'Level Geo 0A'), - ('special_level_geo_0B', 'Level Geo 0B', 'Level Geo 0B'), - ('special_level_geo_0C', 'Level Geo 0C', 'Level Geo 0C'), - ('special_level_geo_0D', 'Level Geo 0D', 'Level Geo 0D'), - ('special_level_geo_0E', 'Level Geo 0E', 'Level Geo 0E'), - ('special_level_geo_0F', 'Level Geo 0F', 'Level Geo 0F'), - ('special_level_geo_10', 'Level Geo 10', 'Level Geo 10'), - ('special_level_geo_11', 'Level Geo 11', 'Level Geo 11'), - ('special_level_geo_12', 'Level Geo 12', 'Level Geo 12'), - ('special_level_geo_13', 'Level Geo 13', 'Level Geo 13'), - ('special_level_geo_14', 'Level Geo 14', 'Level Geo 14'), - ('special_level_geo_15', 'Level Geo 15', 'Level Geo 15'), - ('special_level_geo_16', 'Level Geo 16', 'Level Geo 16'), - ('special_bubble_tree', 'bubble_tree', 'bubble_tree'), - ('special_spiky_tree', 'Spiky Tree', 'Spiky Tree'), - ('special_snow_tree', 'Snow Tree', 'Snow Tree'), - ('special_unknown_tree', 'Unknown Tree', 'Unknown Tree'), - ('special_palm_tree', 'Palm Tree', 'Palm Tree'), - ('special_wooden_door', 'Wooden Door', 'Wooden Door'), - ('special_haunted_door', 'Haunted Door', 'Haunted Door'), - ('special_unknown_door', 'Unknown Door', 'Unknown Door'), - ('special_metal_door', 'Metal Door', 'Metal Door'), - ('special_hmc_door', 'HMC Door', 'HMC Door'), - ('special_unknown2_door', 'Unknown 2 Door', 'Unknown 2 Door'), - ('special_wooden_door_warp', 'Wooden Door Warp', 'Wooden Door Warp'), - ('special_unknown1_door_warp', 'Unknown 1 Door Warp', 'Unknown 1 Door Warp'), - ('special_metal_door_warp', 'Metal Door Warp', 'Metal Door Warp'), - ('special_unknown2_door_warp', 'Unknown 2 Door Warp', 'Unknown 2 Door Warp'), - ('special_unknown3_door_warp', 'Unknown 3 Door Warp', 'Unknown 3 Door Warp'), - ('special_castle_door_warp', 'Castle Door Warp', 'Castle Door Warp'), - ('special_castle_door', 'Castle Door', 'Castle Door'), - ('special_0stars_door', '0 Stars Door', '0 Stars Door'), - ('special_1star_door', '1 Star Door', '1 Star Door'), - ('special_3star_door', '3 Star Door', '3 Star Door'), - ('special_key_door', 'Key Door', 'Key Door'), - ('special_null_end', 'Null End', 'Null End'), + ("special_null_start", "Null Start", "Null Start"), + ("special_yellow_coin", "Yellow Coin", "Yellow Coin"), + ("special_yellow_coin_2", "Yellow Coin 2", "Yellow Coin 2"), + ("special_unknown_3", "Unknown 3", "Unknown 3"), + ("special_boo", "Boo", "Boo"), + ("special_unknown_5", "Unknown 5", "Unknown 5"), + ( + "special_lll_moving_octagonal_mesh_platform", + "LLL Moving Octagonal Platform", + "LLL Moving Octagonal Platform", + ), + ("special_snow_ball", "Snow Ball", "Snow Ball"), + ( + "special_lll_drawbridge_spawner", + "LLL Drawbridge Spawner", + "LLL Drawbridge Spawner", + ), + ("special_empty_9", "Empty 9", "Empty 9"), + ( + "special_lll_rotating_block_with_fire_bars", + "LLL Rotating Block With Fire Bars", + "LLL Rotating Block With Fire Bars", + ), + ( + "special_lll_floating_wood_bridge", + "LLL Floating Wood Bridge", + "LLL Floating Wood Bridge", + ), + ("special_tumbling_platform", "Tumbling Platform", "Tumbling Platform"), + ( + "special_lll_rotating_hexagonal_ring", + "LLL Rotating Hexagonal Ring", + "LLL Rotating Hexagonal Ring", + ), + ( + "special_lll_sinking_rectangular_platform", + "LLL Sinking Rectangular Platform", + "LLL Sinking Rectangular Platform", + ), + ( + "special_lll_sinking_square_platforms", + "LLL Sinking Square Platforms", + "LLL Sinking Square Platforms", + ), + ( + "special_lll_tilting_square_platform", + "LLL Tilting Square Platform", + "LLL Tilting Square Platform", + ), + ("special_lll_bowser_puzzle", "LLL Bowser Puzzle", "LLL Bowser Puzzle"), + ("special_mr_i", "Mr. I", "Mr. I"), + ("special_small_bully", "Small Bully", "Small Bully"), + ("special_big_bully", "Big Bully", "Big Bully"), + ("special_empty_21", "Empty 21", "Empty 21"), + ("special_empty_22", "Empty 22", "Empty 22"), + ("special_empty_23", "Empty 23", "Empty 23"), + ("special_empty_24", "Empty 24", "Empty 24"), + ("special_empty_25", "Empty 25", "Empty 25"), + ("special_moving_blue_coin", "Moving Blue Coin", "Moving Blue Coin"), + ("special_jrb_chest", "JRB Chest", "JRB Chest"), + ("special_water_ring", "Water Ring", "Water Ring"), + ("special_mine", "Mine", "Mine"), + ("special_empty_30", "Empty 30", "Empty 30"), + ("special_empty_31", "Empty 31", "Empty 31"), + ("special_butterfly", "Butterfly", "Butterfly"), + ("special_bowser", "Bowser", "Bowser"), + ( + "special_wf_rotating_wooden_platform", + "WF Rotating Wooden Platform", + "WF Rotating Wooden Platform", + ), + ("special_small_bomp", "Small Bomp", "Small Bomp"), + ("special_wf_sliding_platform", "WF Sliding Platform", "WF Sliding Platform"), + ("special_tower_platform_group", "Tower Platform Group", "Tower Platform Group"), + ( + "special_rotating_counter_clockwise", + "Rotating Counter Clockwise", + "Rotating Counter Clockwise", + ), + ("special_wf_tumbling_bridge", "WF Tumbling Bridge", "WF Tumbling Bridge"), + ("special_large_bomp", "Large Bomp", "Large Bomp"), + ("special_level_geo_03", "Level Geo 03", "Level Geo 03"), + ("special_level_geo_04", "Level Geo 04", "Level Geo 04"), + ("special_level_geo_05", "Level Geo 05", "Level Geo 05"), + ("special_level_geo_06", "Level Geo 06", "Level Geo 06"), + ("special_level_geo_07", "Level Geo 07", "Level Geo 07"), + ("special_level_geo_08", "Level Geo 08", "Level Geo 08"), + ("special_level_geo_09", "Level Geo 09", "Level Geo 09"), + ("special_level_geo_0A", "Level Geo 0A", "Level Geo 0A"), + ("special_level_geo_0B", "Level Geo 0B", "Level Geo 0B"), + ("special_level_geo_0C", "Level Geo 0C", "Level Geo 0C"), + ("special_level_geo_0D", "Level Geo 0D", "Level Geo 0D"), + ("special_level_geo_0E", "Level Geo 0E", "Level Geo 0E"), + ("special_level_geo_0F", "Level Geo 0F", "Level Geo 0F"), + ("special_level_geo_10", "Level Geo 10", "Level Geo 10"), + ("special_level_geo_11", "Level Geo 11", "Level Geo 11"), + ("special_level_geo_12", "Level Geo 12", "Level Geo 12"), + ("special_level_geo_13", "Level Geo 13", "Level Geo 13"), + ("special_level_geo_14", "Level Geo 14", "Level Geo 14"), + ("special_level_geo_15", "Level Geo 15", "Level Geo 15"), + ("special_level_geo_16", "Level Geo 16", "Level Geo 16"), + ("special_bubble_tree", "bubble_tree", "bubble_tree"), + ("special_spiky_tree", "Spiky Tree", "Spiky Tree"), + ("special_snow_tree", "Snow Tree", "Snow Tree"), + ("special_unknown_tree", "Unknown Tree", "Unknown Tree"), + ("special_palm_tree", "Palm Tree", "Palm Tree"), + ("special_wooden_door", "Wooden Door", "Wooden Door"), + ("special_haunted_door", "Haunted Door", "Haunted Door"), + ("special_unknown_door", "Unknown Door", "Unknown Door"), + ("special_metal_door", "Metal Door", "Metal Door"), + ("special_hmc_door", "HMC Door", "HMC Door"), + ("special_unknown2_door", "Unknown 2 Door", "Unknown 2 Door"), + ("special_wooden_door_warp", "Wooden Door Warp", "Wooden Door Warp"), + ("special_unknown1_door_warp", "Unknown 1 Door Warp", "Unknown 1 Door Warp"), + ("special_metal_door_warp", "Metal Door Warp", "Metal Door Warp"), + ("special_unknown2_door_warp", "Unknown 2 Door Warp", "Unknown 2 Door Warp"), + ("special_unknown3_door_warp", "Unknown 3 Door Warp", "Unknown 3 Door Warp"), + ("special_castle_door_warp", "Castle Door Warp", "Castle Door Warp"), + ("special_castle_door", "Castle Door", "Castle Door"), + ("special_0stars_door", "0 Stars Door", "0 Stars Door"), + ("special_1star_door", "1 Star Door", "1 Star Door"), + ("special_3star_door", "3 Star Door", "3 Star Door"), + ("special_key_door", "Key Door", "Key Door"), + ("special_null_end", "Null End", "Null End"), ] enumObjectType = [ - ('None', 'None', 'None'), - ('Special', 'Special', 'Special'), - ('Water Box', 'Water Box', 'Water Box'), + ("None", "None", "None"), + ("Special", "Special", "Special"), + ("Water Box", "Water Box", "Water Box"), ] enumCollisionTypeSimple = [ - ('SURFACE_DEFAULT','Default','Default'), - ('SURFACE_BURNING','Burning','Burning'), - ('SURFACE_HANGABLE','Hangable','Hangable'), - ('SURFACE_SLOW','Slow','Slow'), - ('SURFACE_DEATH_PLANE','Death Plane','Death Plane'), - ('SURFACE_WATER','Water','Water'), - ('SURFACE_FLOWING_WATER','Flowing Water','Flowing Water'), - ('SURFACE_INTANGIBLE','Intangible','Intangible'), - ('SURFACE_VERY_SLIPPERY','Very Slippery','Very Slippery'), - ('SURFACE_SLIPPERY','Slippery','Slippery'), - ('SURFACE_NOT_SLIPPERY','Not Slippery','Not Slippery'), - ('SURFACE_TTM_VINES','Vines','Vines'), - ('SURFACE_SHALLOW_QUICKSAND','Shallow Quicksand','Shallow Quicksand'), - ('SURFACE_DEEP_QUICKSAND','Deep Quicksand','Deep Quicksand'), - ('SURFACE_INSTANT_QUICKSAND','Instant Quicksand','Instant Quicksand'), - ('SURFACE_DEEP_MOVING_QUICKSAND','Deep Moving Quicksand','Deep Moving Quicksand'), - ('SURFACE_SHALLOW_MOVING_QUICKSAND','Shallow Moving Quicksand','Shallow Moving Quicksand'), - ('SURFACE_QUICKSAND','Quicksand','Quicksand'), - ('SURFACE_MOVING_QUICKSAND','Moving Quicksand','Moving Quicksand'), - ('SURFACE_WALL_MISC','Wall Misc','Wall Misc'), - ('SURFACE_NOISE_DEFAULT','Noise Default','Noise Default'), - ('SURFACE_NOISE_SLIPPERY','Noise Slippery','Noise Slippery'), - ('SURFACE_HORIZONTAL_WIND','Horizontal Wind','Horizontal Wind'), - ('SURFACE_INSTANT_MOVING_QUICKSAND','Instant Moving Quicksand','Instant Moving Quicksand'), - ('SURFACE_ICE','Ice','Ice'), - ('SURFACE_HARD','Hard','Hard'), - ('SURFACE_HARD_SLIPPERY','Hard Slippery','Hard Slippery'), - ('SURFACE_HARD_VERY_SLIPPERY','Hard Very Slippery','Hard Very Slippery'), - ('SURFACE_HARD_NOT_SLIPPERY','Hard Not Slippery','Hard Not Slippery'), - ('SURFACE_VERTICAL_WIND','Vertical Wind','Vertical Wind'), - ('SURFACE_SWITCH','Switch','Switch'), - ('SURFACE_VANISH_CAP_WALLS','Vanish Cap Walls','Vanish Cap Walls'), - ('Custom', 'Custom', 'Custom'), + ("SURFACE_DEFAULT", "Default", "Default"), + ("SURFACE_BURNING", "Burning", "Burning"), + ("SURFACE_HANGABLE", "Hangable", "Hangable"), + ("SURFACE_SLOW", "Slow", "Slow"), + ("SURFACE_DEATH_PLANE", "Death Plane", "Death Plane"), + ("SURFACE_WATER", "Water", "Water"), + ("SURFACE_FLOWING_WATER", "Flowing Water", "Flowing Water"), + ("SURFACE_INTANGIBLE", "Intangible", "Intangible"), + ("SURFACE_VERY_SLIPPERY", "Very Slippery", "Very Slippery"), + ("SURFACE_SLIPPERY", "Slippery", "Slippery"), + ("SURFACE_NOT_SLIPPERY", "Not Slippery", "Not Slippery"), + ("SURFACE_TTM_VINES", "Vines", "Vines"), + ("SURFACE_SHALLOW_QUICKSAND", "Shallow Quicksand", "Shallow Quicksand"), + ("SURFACE_DEEP_QUICKSAND", "Deep Quicksand", "Deep Quicksand"), + ("SURFACE_INSTANT_QUICKSAND", "Instant Quicksand", "Instant Quicksand"), + ("SURFACE_DEEP_MOVING_QUICKSAND", "Deep Moving Quicksand", "Deep Moving Quicksand"), + ( + "SURFACE_SHALLOW_MOVING_QUICKSAND", + "Shallow Moving Quicksand", + "Shallow Moving Quicksand", + ), + ("SURFACE_QUICKSAND", "Quicksand", "Quicksand"), + ("SURFACE_MOVING_QUICKSAND", "Moving Quicksand", "Moving Quicksand"), + ("SURFACE_WALL_MISC", "Wall Misc", "Wall Misc"), + ("SURFACE_NOISE_DEFAULT", "Noise Default", "Noise Default"), + ("SURFACE_NOISE_SLIPPERY", "Noise Slippery", "Noise Slippery"), + ("SURFACE_HORIZONTAL_WIND", "Horizontal Wind", "Horizontal Wind"), + ( + "SURFACE_INSTANT_MOVING_QUICKSAND", + "Instant Moving Quicksand", + "Instant Moving Quicksand", + ), + ("SURFACE_ICE", "Ice", "Ice"), + ("SURFACE_HARD", "Hard", "Hard"), + ("SURFACE_HARD_SLIPPERY", "Hard Slippery", "Hard Slippery"), + ("SURFACE_HARD_VERY_SLIPPERY", "Hard Very Slippery", "Hard Very Slippery"), + ("SURFACE_HARD_NOT_SLIPPERY", "Hard Not Slippery", "Hard Not Slippery"), + ("SURFACE_VERTICAL_WIND", "Vertical Wind", "Vertical Wind"), + ("SURFACE_SWITCH", "Switch", "Switch"), + ("SURFACE_VANISH_CAP_WALLS", "Vanish Cap Walls", "Vanish Cap Walls"), + ("Custom", "Custom", "Custom"), ] enumCollisionType = [ - ('SURFACE_DEFAULT','Default','Default'), - ('SURFACE_BURNING','Burning','Burning'), - ('SURFACE_0004','0004','0004'), - ('SURFACE_HANGABLE','Hangable','Hangable'), - ('SURFACE_SLOW','Slow','Slow'), - ('SURFACE_DEATH_PLANE','Death Plane','Death Plane'), - ('SURFACE_CLOSE_CAMERA','Close Camera','Close Camera'), - ('SURFACE_WATER','Water','Water'), - ('SURFACE_FLOWING_WATER','Flowing Water','Flowing Water'), - ('SURFACE_INTANGIBLE','Intangible','Intangible'), - ('SURFACE_VERY_SLIPPERY','Very Slippery','Very Slippery'), - ('SURFACE_SLIPPERY','Slippery','Slippery'), - ('SURFACE_NOT_SLIPPERY','Not Slippery','Not Slippery'), - ('SURFACE_TTM_VINES','Vines','Vines'), - ('SURFACE_MGR_MUSIC','Music','Music'), - ('SURFACE_INSTANT_WARP_1B','Instant Warp 1B','Instant Warp 1B'), - ('SURFACE_INSTANT_WARP_1C','Instant Warp 1C','Instant Warp 1C'), - ('SURFACE_INSTANT_WARP_1D','Instant Warp 1D','Instant Warp 1D'), - ('SURFACE_INSTANT_WARP_1E','Instant Warp 1E','Instant Warp 1E'), - ('SURFACE_SHALLOW_QUICKSAND','Shallow Quicksand','Shallow Quicksand'), - ('SURFACE_DEEP_QUICKSAND','Deep Quicksand','Deep Quicksand'), - ('SURFACE_INSTANT_QUICKSAND','Instant Quicksand','Instant Quicksand'), - ('SURFACE_DEEP_MOVING_QUICKSAND','Deep Moving Quicksand','Deep Moving Quicksand'), - ('SURFACE_SHALLOW_MOVING_QUICKSAND','Shallow Moving Quicksand','Shallow Moving Quicksand'), - ('SURFACE_QUICKSAND','Quicksand','Quicksand'), - ('SURFACE_MOVING_QUICKSAND','Moving Quicksand','Moving Quicksand'), - ('SURFACE_WALL_MISC','Wall Misc','Wall Misc'), - ('SURFACE_NOISE_DEFAULT','Noise Default','Noise Default'), - ('SURFACE_NOISE_SLIPPERY','Noise Slippery','Noise Slippery'), - ('SURFACE_HORIZONTAL_WIND','Horizontal Wind','Horizontal Wind'), - ('SURFACE_INSTANT_MOVING_QUICKSAND','Instant Moving Quicksand','Instant Moving Quicksand'), - ('SURFACE_ICE','Ice','Ice'), - ('SURFACE_LOOK_UP_WARP','Look Up Warp','Look Up Warp'), - ('SURFACE_HARD','Hard','Hard'), - ('SURFACE_WARP','Warp','Warp'), - ('SURFACE_TIMER_START','Timer Start','Timer Start'), - ('SURFACE_TIMER_END','Timer End','Timer End'), - ('SURFACE_HARD_SLIPPERY','Hard Slippery','Hard Slippery'), - ('SURFACE_HARD_VERY_SLIPPERY','Hard Very Slippery','Hard Very Slippery'), - ('SURFACE_HARD_NOT_SLIPPERY','Hard Not Slippery','Hard Not Slippery'), - ('SURFACE_VERTICAL_WIND','Vertical Wind','Vertical Wind'), - ('SURFACE_BOSS_FIGHT_CAMERA','Boss Fight Camera','Boss Fight Camera'), - ('SURFACE_CAMERA_FREE_ROAM','Camera Free Roam','Camera Free Roam'), - ('SURFACE_THI3_WALLKICK','Wallkick','Wallkick'), - ('SURFACE_CAMERA_PLATFORM','Camera Platform','Camera Platform'), - ('SURFACE_CAMERA_MIDDLE','Camera Middle','Camera Middle'), - ('SURFACE_CAMERA_ROTATE_RIGHT','Camera Rotate Right','Camera Rotate Right'), - ('SURFACE_CAMERA_ROTATE_LEFT','Camera Rotate Left','Camera Rotate Left'), - ('SURFACE_CAMERA_BOUNDARY','Camera Boundary','Camera Boundary'), - ('SURFACE_NOISE_VERY_SLIPPERY_73','Noise Very Slippery 73','Noise Very Slippery 73'), - ('SURFACE_NOISE_VERY_SLIPPERY_74','Noise Very Slippery 74','Noise Very Slippery 74'), - ('SURFACE_NOISE_VERY_SLIPPERY','Noise Very Slippery','Noise Very Slippery'), - ('SURFACE_NO_CAM_COLLISION','No Cam Collision','No Cam Collision'), - ('SURFACE_NO_CAM_COLLISION_77','No Cam Collision 77','No Cam Collision 77'), - ('SURFACE_NO_CAM_COL_VERY_SLIPPERY','No Cam Collision Very Slippery','No Cam Collision Very Slippery'), - ('SURFACE_NO_CAM_COL_SLIPPERY','No Cam Collision Slippery','No Cam Collision Slippery'), - ('SURFACE_SWITCH','Switch','Switch'), - ('SURFACE_VANISH_CAP_WALLS','Vanish Cap Walls','Vanish Cap Walls'), - ('SURFACE_PAINTING_WOBBLE_A6','Painting Wobble A6','Painting Wobble A6'), - ('SURFACE_PAINTING_WOBBLE_A7','Painting Wobble A7','Painting Wobble A7'), - ('SURFACE_PAINTING_WOBBLE_A8','Painting Wobble A8','Painting Wobble A8'), - ('SURFACE_PAINTING_WOBBLE_A9','Painting Wobble A9','Painting Wobble A9'), - ('SURFACE_PAINTING_WOBBLE_AA','Painting Wobble AA','Painting Wobble AA'), - ('SURFACE_PAINTING_WOBBLE_AB','Painting Wobble AB','Painting Wobble AB'), - ('SURFACE_PAINTING_WOBBLE_AC','Painting Wobble AC','Painting Wobble AC'), - ('SURFACE_PAINTING_WOBBLE_AD','Painting Wobble AD','Painting Wobble AD'), - ('SURFACE_PAINTING_WOBBLE_AE','Painting Wobble AE','Painting Wobble AE'), - ('SURFACE_PAINTING_WOBBLE_AF','Painting Wobble AF','Painting Wobble AF'), - ('SURFACE_PAINTING_WOBBLE_B0','Painting Wobble B0','Painting Wobble B0'), - ('SURFACE_PAINTING_WOBBLE_B1','Painting Wobble B1','Painting Wobble B1'), - ('SURFACE_PAINTING_WOBBLE_B2','Painting Wobble B2','Painting Wobble B2'), - ('SURFACE_PAINTING_WOBBLE_B3','Painting Wobble B3','Painting Wobble B3'), - ('SURFACE_PAINTING_WOBBLE_B4','Painting Wobble B4','Painting Wobble B4'), - ('SURFACE_PAINTING_WOBBLE_B5','Painting Wobble B5','Painting Wobble B5'), - ('SURFACE_PAINTING_WOBBLE_B6','Painting Wobble B6','Painting Wobble B6'), - ('SURFACE_PAINTING_WOBBLE_B7','Painting Wobble B7','Painting Wobble B7'), - ('SURFACE_PAINTING_WOBBLE_B8','Painting Wobble B8','Painting Wobble B8'), - ('SURFACE_PAINTING_WOBBLE_B9','Painting Wobble B9','Painting Wobble B9'), - ('SURFACE_PAINTING_WOBBLE_BA','Painting Wobble BA','Painting Wobble BA'), - ('SURFACE_PAINTING_WOBBLE_BB','Painting Wobble BB','Painting Wobble BB'), - ('SURFACE_PAINTING_WOBBLE_BC','Painting Wobble BC','Painting Wobble BC'), - ('SURFACE_PAINTING_WOBBLE_BD','Painting Wobble BD','Painting Wobble BD'), - ('SURFACE_PAINTING_WOBBLE_BE','Painting Wobble BE','Painting Wobble BE'), - ('SURFACE_PAINTING_WOBBLE_BF','Painting Wobble BF','Painting Wobble BF'), - ('SURFACE_PAINTING_WOBBLE_C0','Painting Wobble C0','Painting Wobble C0'), - ('SURFACE_PAINTING_WOBBLE_C1','Painting Wobble C1','Painting Wobble C1'), - ('SURFACE_PAINTING_WOBBLE_C2','Painting Wobble C2','Painting Wobble C2'), - ('SURFACE_PAINTING_WOBBLE_C3','Painting Wobble C3','Painting Wobble C3'), - ('SURFACE_PAINTING_WOBBLE_C4','Painting Wobble C4','Painting Wobble C4'), - ('SURFACE_PAINTING_WOBBLE_C5','Painting Wobble C5','Painting Wobble C5'), - ('SURFACE_PAINTING_WOBBLE_C6','Painting Wobble C6','Painting Wobble C6'), - ('SURFACE_PAINTING_WOBBLE_C7','Painting Wobble C7','Painting Wobble C7'), - ('SURFACE_PAINTING_WOBBLE_C8','Painting Wobble C8','Painting Wobble C8'), - ('SURFACE_PAINTING_WOBBLE_C9','Painting Wobble C9','Painting Wobble C9'), - ('SURFACE_PAINTING_WOBBLE_CA','Painting Wobble CA','Painting Wobble CA'), - ('SURFACE_PAINTING_WOBBLE_CB','Painting Wobble CB','Painting Wobble CB'), - ('SURFACE_PAINTING_WOBBLE_CC','Painting Wobble CC','Painting Wobble CC'), - ('SURFACE_PAINTING_WOBBLE_CD','Painting Wobble CD','Painting Wobble CD'), - ('SURFACE_PAINTING_WOBBLE_CE','Painting Wobble CE','Painting Wobble CE'), - ('SURFACE_PAINTING_WOBBLE_CF','Painting Wobble CF','Painting Wobble CF'), - ('SURFACE_PAINTING_WOBBLE_D0','Painting Wobble D0','Painting Wobble D0'), - ('SURFACE_PAINTING_WOBBLE_D1','Painting Wobble D1','Painting Wobble D1'), - ('SURFACE_PAINTING_WOBBLE_D2','Painting Wobble D2','Painting Wobble D2'), - ('SURFACE_PAINTING_WARP_D3','Painting Warp D3','Painting Warp D3'), - ('SURFACE_PAINTING_WARP_D4','Painting Warp D4','Painting Warp D4'), - ('SURFACE_PAINTING_WARP_D5','Painting Warp D5','Painting Warp D5'), - ('SURFACE_PAINTING_WARP_D6','Painting Warp D6','Painting Warp D6'), - ('SURFACE_PAINTING_WARP_D7','Painting Warp D7','Painting Warp D7'), - ('SURFACE_PAINTING_WARP_D8','Painting Warp D8','Painting Warp D8'), - ('SURFACE_PAINTING_WARP_D9','Painting Warp D9','Painting Warp D9'), - ('SURFACE_PAINTING_WARP_DA','Painting Warp DA','Painting Warp DA'), - ('SURFACE_PAINTING_WARP_DB','Painting Warp DB','Painting Warp DB'), - ('SURFACE_PAINTING_WARP_DC','Painting Warp DC','Painting Warp DC'), - ('SURFACE_PAINTING_WARP_DD','Painting Warp DD','Painting Warp DD'), - ('SURFACE_PAINTING_WARP_DE','Painting Warp DE','Painting Warp DE'), - ('SURFACE_PAINTING_WARP_DF','Painting Warp DF','Painting Warp DF'), - ('SURFACE_PAINTING_WARP_E0','Painting Warp E0','Painting Warp E0'), - ('SURFACE_PAINTING_WARP_E1','Painting Warp E1','Painting Warp E1'), - ('SURFACE_PAINTING_WARP_E2','Painting Warp E2','Painting Warp E2'), - ('SURFACE_PAINTING_WARP_E3','Painting Warp E3','Painting Warp E3'), - ('SURFACE_PAINTING_WARP_E4','Painting Warp E4','Painting Warp E4'), - ('SURFACE_PAINTING_WARP_E5','Painting Warp E5','Painting Warp E5'), - ('SURFACE_PAINTING_WARP_E6','Painting Warp E6','Painting Warp E6'), - ('SURFACE_PAINTING_WARP_E7','Painting Warp E7','Painting Warp E7'), - ('SURFACE_PAINTING_WARP_E8','Painting Warp E8','Painting Warp E8'), - ('SURFACE_PAINTING_WARP_E9','Painting Warp E9','Painting Warp E9'), - ('SURFACE_PAINTING_WARP_EA','Painting Warp EA','Painting Warp EA'), - ('SURFACE_PAINTING_WARP_EB','Painting Warp EB','Painting Warp EB'), - ('SURFACE_PAINTING_WARP_EC','Painting Warp EC','Painting Warp EC'), - ('SURFACE_PAINTING_WARP_ED','Painting Warp ED','Painting Warp ED'), - ('SURFACE_PAINTING_WARP_EE','Painting Warp EE','Painting Warp EE'), - ('SURFACE_PAINTING_WARP_EF','Painting Warp EF','Painting Warp EF'), - ('SURFACE_PAINTING_WARP_F0','Painting Warp F0','Painting Warp F0'), - ('SURFACE_PAINTING_WARP_F1','Painting Warp F1','Painting Warp F1'), - ('SURFACE_PAINTING_WARP_F2','Painting Warp F2','Painting Warp F2'), - ('SURFACE_PAINTING_WARP_F3','Painting Warp F3','Painting Warp F3'), - ('SURFACE_TTC_PAINTING_1','TTC Painting 1','TTC Painting 1'), - ('SURFACE_TTC_PAINTING_2','TTC Painting 2','TTC Painting 2'), - ('SURFACE_TTC_PAINTING_3','TTC Painting 3','TTC Painting 3'), - ('SURFACE_PAINTING_WARP_F7','Painting Warp F7','Painting Warp F7'), - ('SURFACE_PAINTING_WARP_F8','Painting Warp F8','Painting Warp F8'), - ('SURFACE_PAINTING_WARP_F9','Painting Warp F9','Painting Warp F9'), - ('SURFACE_PAINTING_WARP_FA','Painting Warp FA','Painting Warp FA'), - ('SURFACE_PAINTING_WARP_FB','Painting Warp FB','Painting Warp FB'), - ('SURFACE_PAINTING_WARP_FC','Painting Warp FC','Painting Warp FC'), - ('SURFACE_WOBBLING_WARP','Wobbling Warp','Wobbling Warp'), - ('SURFACE_TRAPDOOR','Trapdoor','Trapdoor'), - ('Custom', 'Custom', 'Custom'), + ("SURFACE_DEFAULT", "Default", "Default"), + ("SURFACE_BURNING", "Burning", "Burning"), + ("SURFACE_0004", "0004", "0004"), + ("SURFACE_HANGABLE", "Hangable", "Hangable"), + ("SURFACE_SLOW", "Slow", "Slow"), + ("SURFACE_DEATH_PLANE", "Death Plane", "Death Plane"), + ("SURFACE_CLOSE_CAMERA", "Close Camera", "Close Camera"), + ("SURFACE_WATER", "Water", "Water"), + ("SURFACE_FLOWING_WATER", "Flowing Water", "Flowing Water"), + ("SURFACE_INTANGIBLE", "Intangible", "Intangible"), + ("SURFACE_VERY_SLIPPERY", "Very Slippery", "Very Slippery"), + ("SURFACE_SLIPPERY", "Slippery", "Slippery"), + ("SURFACE_NOT_SLIPPERY", "Not Slippery", "Not Slippery"), + ("SURFACE_TTM_VINES", "Vines", "Vines"), + ("SURFACE_MGR_MUSIC", "Music", "Music"), + ("SURFACE_INSTANT_WARP_1B", "Instant Warp 1B", "Instant Warp 1B"), + ("SURFACE_INSTANT_WARP_1C", "Instant Warp 1C", "Instant Warp 1C"), + ("SURFACE_INSTANT_WARP_1D", "Instant Warp 1D", "Instant Warp 1D"), + ("SURFACE_INSTANT_WARP_1E", "Instant Warp 1E", "Instant Warp 1E"), + ("SURFACE_SHALLOW_QUICKSAND", "Shallow Quicksand", "Shallow Quicksand"), + ("SURFACE_DEEP_QUICKSAND", "Deep Quicksand", "Deep Quicksand"), + ("SURFACE_INSTANT_QUICKSAND", "Instant Quicksand", "Instant Quicksand"), + ("SURFACE_DEEP_MOVING_QUICKSAND", "Deep Moving Quicksand", "Deep Moving Quicksand"), + ( + "SURFACE_SHALLOW_MOVING_QUICKSAND", + "Shallow Moving Quicksand", + "Shallow Moving Quicksand", + ), + ("SURFACE_QUICKSAND", "Quicksand", "Quicksand"), + ("SURFACE_MOVING_QUICKSAND", "Moving Quicksand", "Moving Quicksand"), + ("SURFACE_WALL_MISC", "Wall Misc", "Wall Misc"), + ("SURFACE_NOISE_DEFAULT", "Noise Default", "Noise Default"), + ("SURFACE_NOISE_SLIPPERY", "Noise Slippery", "Noise Slippery"), + ("SURFACE_HORIZONTAL_WIND", "Horizontal Wind", "Horizontal Wind"), + ( + "SURFACE_INSTANT_MOVING_QUICKSAND", + "Instant Moving Quicksand", + "Instant Moving Quicksand", + ), + ("SURFACE_ICE", "Ice", "Ice"), + ("SURFACE_LOOK_UP_WARP", "Look Up Warp", "Look Up Warp"), + ("SURFACE_HARD", "Hard", "Hard"), + ("SURFACE_WARP", "Warp", "Warp"), + ("SURFACE_TIMER_START", "Timer Start", "Timer Start"), + ("SURFACE_TIMER_END", "Timer End", "Timer End"), + ("SURFACE_HARD_SLIPPERY", "Hard Slippery", "Hard Slippery"), + ("SURFACE_HARD_VERY_SLIPPERY", "Hard Very Slippery", "Hard Very Slippery"), + ("SURFACE_HARD_NOT_SLIPPERY", "Hard Not Slippery", "Hard Not Slippery"), + ("SURFACE_VERTICAL_WIND", "Vertical Wind", "Vertical Wind"), + ("SURFACE_BOSS_FIGHT_CAMERA", "Boss Fight Camera", "Boss Fight Camera"), + ("SURFACE_CAMERA_FREE_ROAM", "Camera Free Roam", "Camera Free Roam"), + ("SURFACE_THI3_WALLKICK", "Wallkick", "Wallkick"), + ("SURFACE_CAMERA_PLATFORM", "Camera Platform", "Camera Platform"), + ("SURFACE_CAMERA_MIDDLE", "Camera Middle", "Camera Middle"), + ("SURFACE_CAMERA_ROTATE_RIGHT", "Camera Rotate Right", "Camera Rotate Right"), + ("SURFACE_CAMERA_ROTATE_LEFT", "Camera Rotate Left", "Camera Rotate Left"), + ("SURFACE_CAMERA_BOUNDARY", "Camera Boundary", "Camera Boundary"), + ( + "SURFACE_NOISE_VERY_SLIPPERY_73", + "Noise Very Slippery 73", + "Noise Very Slippery 73", + ), + ( + "SURFACE_NOISE_VERY_SLIPPERY_74", + "Noise Very Slippery 74", + "Noise Very Slippery 74", + ), + ("SURFACE_NOISE_VERY_SLIPPERY", "Noise Very Slippery", "Noise Very Slippery"), + ("SURFACE_NO_CAM_COLLISION", "No Cam Collision", "No Cam Collision"), + ("SURFACE_NO_CAM_COLLISION_77", "No Cam Collision 77", "No Cam Collision 77"), + ( + "SURFACE_NO_CAM_COL_VERY_SLIPPERY", + "No Cam Collision Very Slippery", + "No Cam Collision Very Slippery", + ), + ( + "SURFACE_NO_CAM_COL_SLIPPERY", + "No Cam Collision Slippery", + "No Cam Collision Slippery", + ), + ("SURFACE_SWITCH", "Switch", "Switch"), + ("SURFACE_VANISH_CAP_WALLS", "Vanish Cap Walls", "Vanish Cap Walls"), + ("SURFACE_PAINTING_WOBBLE_A6", "Painting Wobble A6", "Painting Wobble A6"), + ("SURFACE_PAINTING_WOBBLE_A7", "Painting Wobble A7", "Painting Wobble A7"), + ("SURFACE_PAINTING_WOBBLE_A8", "Painting Wobble A8", "Painting Wobble A8"), + ("SURFACE_PAINTING_WOBBLE_A9", "Painting Wobble A9", "Painting Wobble A9"), + ("SURFACE_PAINTING_WOBBLE_AA", "Painting Wobble AA", "Painting Wobble AA"), + ("SURFACE_PAINTING_WOBBLE_AB", "Painting Wobble AB", "Painting Wobble AB"), + ("SURFACE_PAINTING_WOBBLE_AC", "Painting Wobble AC", "Painting Wobble AC"), + ("SURFACE_PAINTING_WOBBLE_AD", "Painting Wobble AD", "Painting Wobble AD"), + ("SURFACE_PAINTING_WOBBLE_AE", "Painting Wobble AE", "Painting Wobble AE"), + ("SURFACE_PAINTING_WOBBLE_AF", "Painting Wobble AF", "Painting Wobble AF"), + ("SURFACE_PAINTING_WOBBLE_B0", "Painting Wobble B0", "Painting Wobble B0"), + ("SURFACE_PAINTING_WOBBLE_B1", "Painting Wobble B1", "Painting Wobble B1"), + ("SURFACE_PAINTING_WOBBLE_B2", "Painting Wobble B2", "Painting Wobble B2"), + ("SURFACE_PAINTING_WOBBLE_B3", "Painting Wobble B3", "Painting Wobble B3"), + ("SURFACE_PAINTING_WOBBLE_B4", "Painting Wobble B4", "Painting Wobble B4"), + ("SURFACE_PAINTING_WOBBLE_B5", "Painting Wobble B5", "Painting Wobble B5"), + ("SURFACE_PAINTING_WOBBLE_B6", "Painting Wobble B6", "Painting Wobble B6"), + ("SURFACE_PAINTING_WOBBLE_B7", "Painting Wobble B7", "Painting Wobble B7"), + ("SURFACE_PAINTING_WOBBLE_B8", "Painting Wobble B8", "Painting Wobble B8"), + ("SURFACE_PAINTING_WOBBLE_B9", "Painting Wobble B9", "Painting Wobble B9"), + ("SURFACE_PAINTING_WOBBLE_BA", "Painting Wobble BA", "Painting Wobble BA"), + ("SURFACE_PAINTING_WOBBLE_BB", "Painting Wobble BB", "Painting Wobble BB"), + ("SURFACE_PAINTING_WOBBLE_BC", "Painting Wobble BC", "Painting Wobble BC"), + ("SURFACE_PAINTING_WOBBLE_BD", "Painting Wobble BD", "Painting Wobble BD"), + ("SURFACE_PAINTING_WOBBLE_BE", "Painting Wobble BE", "Painting Wobble BE"), + ("SURFACE_PAINTING_WOBBLE_BF", "Painting Wobble BF", "Painting Wobble BF"), + ("SURFACE_PAINTING_WOBBLE_C0", "Painting Wobble C0", "Painting Wobble C0"), + ("SURFACE_PAINTING_WOBBLE_C1", "Painting Wobble C1", "Painting Wobble C1"), + ("SURFACE_PAINTING_WOBBLE_C2", "Painting Wobble C2", "Painting Wobble C2"), + ("SURFACE_PAINTING_WOBBLE_C3", "Painting Wobble C3", "Painting Wobble C3"), + ("SURFACE_PAINTING_WOBBLE_C4", "Painting Wobble C4", "Painting Wobble C4"), + ("SURFACE_PAINTING_WOBBLE_C5", "Painting Wobble C5", "Painting Wobble C5"), + ("SURFACE_PAINTING_WOBBLE_C6", "Painting Wobble C6", "Painting Wobble C6"), + ("SURFACE_PAINTING_WOBBLE_C7", "Painting Wobble C7", "Painting Wobble C7"), + ("SURFACE_PAINTING_WOBBLE_C8", "Painting Wobble C8", "Painting Wobble C8"), + ("SURFACE_PAINTING_WOBBLE_C9", "Painting Wobble C9", "Painting Wobble C9"), + ("SURFACE_PAINTING_WOBBLE_CA", "Painting Wobble CA", "Painting Wobble CA"), + ("SURFACE_PAINTING_WOBBLE_CB", "Painting Wobble CB", "Painting Wobble CB"), + ("SURFACE_PAINTING_WOBBLE_CC", "Painting Wobble CC", "Painting Wobble CC"), + ("SURFACE_PAINTING_WOBBLE_CD", "Painting Wobble CD", "Painting Wobble CD"), + ("SURFACE_PAINTING_WOBBLE_CE", "Painting Wobble CE", "Painting Wobble CE"), + ("SURFACE_PAINTING_WOBBLE_CF", "Painting Wobble CF", "Painting Wobble CF"), + ("SURFACE_PAINTING_WOBBLE_D0", "Painting Wobble D0", "Painting Wobble D0"), + ("SURFACE_PAINTING_WOBBLE_D1", "Painting Wobble D1", "Painting Wobble D1"), + ("SURFACE_PAINTING_WOBBLE_D2", "Painting Wobble D2", "Painting Wobble D2"), + ("SURFACE_PAINTING_WARP_D3", "Painting Warp D3", "Painting Warp D3"), + ("SURFACE_PAINTING_WARP_D4", "Painting Warp D4", "Painting Warp D4"), + ("SURFACE_PAINTING_WARP_D5", "Painting Warp D5", "Painting Warp D5"), + ("SURFACE_PAINTING_WARP_D6", "Painting Warp D6", "Painting Warp D6"), + ("SURFACE_PAINTING_WARP_D7", "Painting Warp D7", "Painting Warp D7"), + ("SURFACE_PAINTING_WARP_D8", "Painting Warp D8", "Painting Warp D8"), + ("SURFACE_PAINTING_WARP_D9", "Painting Warp D9", "Painting Warp D9"), + ("SURFACE_PAINTING_WARP_DA", "Painting Warp DA", "Painting Warp DA"), + ("SURFACE_PAINTING_WARP_DB", "Painting Warp DB", "Painting Warp DB"), + ("SURFACE_PAINTING_WARP_DC", "Painting Warp DC", "Painting Warp DC"), + ("SURFACE_PAINTING_WARP_DD", "Painting Warp DD", "Painting Warp DD"), + ("SURFACE_PAINTING_WARP_DE", "Painting Warp DE", "Painting Warp DE"), + ("SURFACE_PAINTING_WARP_DF", "Painting Warp DF", "Painting Warp DF"), + ("SURFACE_PAINTING_WARP_E0", "Painting Warp E0", "Painting Warp E0"), + ("SURFACE_PAINTING_WARP_E1", "Painting Warp E1", "Painting Warp E1"), + ("SURFACE_PAINTING_WARP_E2", "Painting Warp E2", "Painting Warp E2"), + ("SURFACE_PAINTING_WARP_E3", "Painting Warp E3", "Painting Warp E3"), + ("SURFACE_PAINTING_WARP_E4", "Painting Warp E4", "Painting Warp E4"), + ("SURFACE_PAINTING_WARP_E5", "Painting Warp E5", "Painting Warp E5"), + ("SURFACE_PAINTING_WARP_E6", "Painting Warp E6", "Painting Warp E6"), + ("SURFACE_PAINTING_WARP_E7", "Painting Warp E7", "Painting Warp E7"), + ("SURFACE_PAINTING_WARP_E8", "Painting Warp E8", "Painting Warp E8"), + ("SURFACE_PAINTING_WARP_E9", "Painting Warp E9", "Painting Warp E9"), + ("SURFACE_PAINTING_WARP_EA", "Painting Warp EA", "Painting Warp EA"), + ("SURFACE_PAINTING_WARP_EB", "Painting Warp EB", "Painting Warp EB"), + ("SURFACE_PAINTING_WARP_EC", "Painting Warp EC", "Painting Warp EC"), + ("SURFACE_PAINTING_WARP_ED", "Painting Warp ED", "Painting Warp ED"), + ("SURFACE_PAINTING_WARP_EE", "Painting Warp EE", "Painting Warp EE"), + ("SURFACE_PAINTING_WARP_EF", "Painting Warp EF", "Painting Warp EF"), + ("SURFACE_PAINTING_WARP_F0", "Painting Warp F0", "Painting Warp F0"), + ("SURFACE_PAINTING_WARP_F1", "Painting Warp F1", "Painting Warp F1"), + ("SURFACE_PAINTING_WARP_F2", "Painting Warp F2", "Painting Warp F2"), + ("SURFACE_PAINTING_WARP_F3", "Painting Warp F3", "Painting Warp F3"), + ("SURFACE_TTC_PAINTING_1", "TTC Painting 1", "TTC Painting 1"), + ("SURFACE_TTC_PAINTING_2", "TTC Painting 2", "TTC Painting 2"), + ("SURFACE_TTC_PAINTING_3", "TTC Painting 3", "TTC Painting 3"), + ("SURFACE_PAINTING_WARP_F7", "Painting Warp F7", "Painting Warp F7"), + ("SURFACE_PAINTING_WARP_F8", "Painting Warp F8", "Painting Warp F8"), + ("SURFACE_PAINTING_WARP_F9", "Painting Warp F9", "Painting Warp F9"), + ("SURFACE_PAINTING_WARP_FA", "Painting Warp FA", "Painting Warp FA"), + ("SURFACE_PAINTING_WARP_FB", "Painting Warp FB", "Painting Warp FB"), + ("SURFACE_PAINTING_WARP_FC", "Painting Warp FC", "Painting Warp FC"), + ("SURFACE_WOBBLING_WARP", "Wobbling Warp", "Wobbling Warp"), + ("SURFACE_TRAPDOOR", "Trapdoor", "Trapdoor"), + ("Custom", "Custom", "Custom"), ] enumPaintingCollisionType = [ - ('SURFACE_PAINTING_WOBBLE_A6','Painting Wobble A6','Painting Wobble A6'), - ('SURFACE_PAINTING_WOBBLE_A7','Painting Wobble A7','Painting Wobble A7'), - ('SURFACE_PAINTING_WOBBLE_A8','Painting Wobble A8','Painting Wobble A8'), - ('SURFACE_PAINTING_WOBBLE_A9','Painting Wobble A9','Painting Wobble A9'), - ('SURFACE_PAINTING_WOBBLE_AA','Painting Wobble AA','Painting Wobble AA'), - ('SURFACE_PAINTING_WOBBLE_AB','Painting Wobble AB','Painting Wobble AB'), - ('SURFACE_PAINTING_WOBBLE_AC','Painting Wobble AC','Painting Wobble AC'), - ('SURFACE_PAINTING_WOBBLE_AD','Painting Wobble AD','Painting Wobble AD'), - ('SURFACE_PAINTING_WOBBLE_AE','Painting Wobble AE','Painting Wobble AE'), - ('SURFACE_PAINTING_WOBBLE_AF','Painting Wobble AF','Painting Wobble AF'), - ('SURFACE_PAINTING_WOBBLE_B0','Painting Wobble B0','Painting Wobble B0'), - ('SURFACE_PAINTING_WOBBLE_B1','Painting Wobble B1','Painting Wobble B1'), - ('SURFACE_PAINTING_WOBBLE_B2','Painting Wobble B2','Painting Wobble B2'), - ('SURFACE_PAINTING_WOBBLE_B3','Painting Wobble B3','Painting Wobble B3'), - ('SURFACE_PAINTING_WOBBLE_B4','Painting Wobble B4','Painting Wobble B4'), - ('SURFACE_PAINTING_WOBBLE_B5','Painting Wobble B5','Painting Wobble B5'), - ('SURFACE_PAINTING_WOBBLE_B6','Painting Wobble B6','Painting Wobble B6'), - ('SURFACE_PAINTING_WOBBLE_B7','Painting Wobble B7','Painting Wobble B7'), - ('SURFACE_PAINTING_WOBBLE_B8','Painting Wobble B8','Painting Wobble B8'), - ('SURFACE_PAINTING_WOBBLE_B9','Painting Wobble B9','Painting Wobble B9'), - ('SURFACE_PAINTING_WOBBLE_BA','Painting Wobble BA','Painting Wobble BA'), - ('SURFACE_PAINTING_WOBBLE_BB','Painting Wobble BB','Painting Wobble BB'), - ('SURFACE_PAINTING_WOBBLE_BC','Painting Wobble BC','Painting Wobble BC'), - ('SURFACE_PAINTING_WOBBLE_BD','Painting Wobble BD','Painting Wobble BD'), - ('SURFACE_PAINTING_WOBBLE_BE','Painting Wobble BE','Painting Wobble BE'), - ('SURFACE_PAINTING_WOBBLE_BF','Painting Wobble BF','Painting Wobble BF'), - ('SURFACE_PAINTING_WOBBLE_C0','Painting Wobble C0','Painting Wobble C0'), - ('SURFACE_PAINTING_WOBBLE_C1','Painting Wobble C1','Painting Wobble C1'), - ('SURFACE_PAINTING_WOBBLE_C2','Painting Wobble C2','Painting Wobble C2'), - ('SURFACE_PAINTING_WOBBLE_C3','Painting Wobble C3','Painting Wobble C3'), - ('SURFACE_PAINTING_WOBBLE_C4','Painting Wobble C4','Painting Wobble C4'), - ('SURFACE_PAINTING_WOBBLE_C5','Painting Wobble C5','Painting Wobble C5'), - ('SURFACE_PAINTING_WOBBLE_C6','Painting Wobble C6','Painting Wobble C6'), - ('SURFACE_PAINTING_WOBBLE_C7','Painting Wobble C7','Painting Wobble C7'), - ('SURFACE_PAINTING_WOBBLE_C8','Painting Wobble C8','Painting Wobble C8'), - ('SURFACE_PAINTING_WOBBLE_C9','Painting Wobble C9','Painting Wobble C9'), - ('SURFACE_PAINTING_WOBBLE_CA','Painting Wobble CA','Painting Wobble CA'), - ('SURFACE_PAINTING_WOBBLE_CB','Painting Wobble CB','Painting Wobble CB'), - ('SURFACE_PAINTING_WOBBLE_CC','Painting Wobble CC','Painting Wobble CC'), - ('SURFACE_PAINTING_WOBBLE_CD','Painting Wobble CD','Painting Wobble CD'), - ('SURFACE_PAINTING_WOBBLE_CE','Painting Wobble CE','Painting Wobble CE'), - ('SURFACE_PAINTING_WOBBLE_CF','Painting Wobble CF','Painting Wobble CF'), - ('SURFACE_PAINTING_WOBBLE_D0','Painting Wobble D0','Painting Wobble D0'), - ('SURFACE_PAINTING_WOBBLE_D1','Painting Wobble D1','Painting Wobble D1'), - ('SURFACE_PAINTING_WOBBLE_D2','Painting Wobble D2','Painting Wobble D2'), - ('SURFACE_PAINTING_WARP_D3','Painting Warp D3','Painting Warp D3'), - ('SURFACE_PAINTING_WARP_D4','Painting Warp D4','Painting Warp D4'), - ('SURFACE_PAINTING_WARP_D5','Painting Warp D5','Painting Warp D5'), - ('SURFACE_PAINTING_WARP_D6','Painting Warp D6','Painting Warp D6'), - ('SURFACE_PAINTING_WARP_D7','Painting Warp D7','Painting Warp D7'), - ('SURFACE_PAINTING_WARP_D8','Painting Warp D8','Painting Warp D8'), - ('SURFACE_PAINTING_WARP_D9','Painting Warp D9','Painting Warp D9'), - ('SURFACE_PAINTING_WARP_DA','Painting Warp DA','Painting Warp DA'), - ('SURFACE_PAINTING_WARP_DB','Painting Warp DB','Painting Warp DB'), - ('SURFACE_PAINTING_WARP_DC','Painting Warp DC','Painting Warp DC'), - ('SURFACE_PAINTING_WARP_DD','Painting Warp DD','Painting Warp DD'), - ('SURFACE_PAINTING_WARP_DE','Painting Warp DE','Painting Warp DE'), - ('SURFACE_PAINTING_WARP_DF','Painting Warp DF','Painting Warp DF'), - ('SURFACE_PAINTING_WARP_E0','Painting Warp E0','Painting Warp E0'), - ('SURFACE_PAINTING_WARP_E1','Painting Warp E1','Painting Warp E1'), - ('SURFACE_PAINTING_WARP_E2','Painting Warp E2','Painting Warp E2'), - ('SURFACE_PAINTING_WARP_E3','Painting Warp E3','Painting Warp E3'), - ('SURFACE_PAINTING_WARP_E4','Painting Warp E4','Painting Warp E4'), - ('SURFACE_PAINTING_WARP_E5','Painting Warp E5','Painting Warp E5'), - ('SURFACE_PAINTING_WARP_E6','Painting Warp E6','Painting Warp E6'), - ('SURFACE_PAINTING_WARP_E7','Painting Warp E7','Painting Warp E7'), - ('SURFACE_PAINTING_WARP_E8','Painting Warp E8','Painting Warp E8'), - ('SURFACE_PAINTING_WARP_E9','Painting Warp E9','Painting Warp E9'), - ('SURFACE_PAINTING_WARP_EA','Painting Warp EA','Painting Warp EA'), - ('SURFACE_PAINTING_WARP_EB','Painting Warp EB','Painting Warp EB'), - ('SURFACE_PAINTING_WARP_EC','Painting Warp EC','Painting Warp EC'), - ('SURFACE_PAINTING_WARP_ED','Painting Warp ED','Painting Warp ED'), - ('SURFACE_PAINTING_WARP_EE','Painting Warp EE','Painting Warp EE'), - ('SURFACE_PAINTING_WARP_EF','Painting Warp EF','Painting Warp EF'), - ('SURFACE_PAINTING_WARP_F0','Painting Warp F0','Painting Warp F0'), - ('SURFACE_PAINTING_WARP_F1','Painting Warp F1','Painting Warp F1'), - ('SURFACE_PAINTING_WARP_F2','Painting Warp F2','Painting Warp F2'), - ('SURFACE_PAINTING_WARP_F3','Painting Warp F3','Painting Warp F3'), - ('SURFACE_TTC_PAINTING_1','TTC Painting 1','TTC Painting 1'), - ('SURFACE_TTC_PAINTING_2','TTC Painting 2','TTC Painting 2'), - ('SURFACE_TTC_PAINTING_3','TTC Painting 3','TTC Painting 3'), - ('SURFACE_PAINTING_WARP_F7','Painting Warp F7','Painting Warp F7'), - ('SURFACE_PAINTING_WARP_F8','Painting Warp F8','Painting Warp F8'), - ('SURFACE_PAINTING_WARP_F9','Painting Warp F9','Painting Warp F9'), - ('SURFACE_PAINTING_WARP_FA','Painting Warp FA','Painting Warp FA'), - ('SURFACE_PAINTING_WARP_FB','Painting Warp FB','Painting Warp FB'), - ('SURFACE_PAINTING_WARP_FC','Painting Warp FC','Painting Warp FC'), + ("SURFACE_PAINTING_WOBBLE_A6", "Painting Wobble A6", "Painting Wobble A6"), + ("SURFACE_PAINTING_WOBBLE_A7", "Painting Wobble A7", "Painting Wobble A7"), + ("SURFACE_PAINTING_WOBBLE_A8", "Painting Wobble A8", "Painting Wobble A8"), + ("SURFACE_PAINTING_WOBBLE_A9", "Painting Wobble A9", "Painting Wobble A9"), + ("SURFACE_PAINTING_WOBBLE_AA", "Painting Wobble AA", "Painting Wobble AA"), + ("SURFACE_PAINTING_WOBBLE_AB", "Painting Wobble AB", "Painting Wobble AB"), + ("SURFACE_PAINTING_WOBBLE_AC", "Painting Wobble AC", "Painting Wobble AC"), + ("SURFACE_PAINTING_WOBBLE_AD", "Painting Wobble AD", "Painting Wobble AD"), + ("SURFACE_PAINTING_WOBBLE_AE", "Painting Wobble AE", "Painting Wobble AE"), + ("SURFACE_PAINTING_WOBBLE_AF", "Painting Wobble AF", "Painting Wobble AF"), + ("SURFACE_PAINTING_WOBBLE_B0", "Painting Wobble B0", "Painting Wobble B0"), + ("SURFACE_PAINTING_WOBBLE_B1", "Painting Wobble B1", "Painting Wobble B1"), + ("SURFACE_PAINTING_WOBBLE_B2", "Painting Wobble B2", "Painting Wobble B2"), + ("SURFACE_PAINTING_WOBBLE_B3", "Painting Wobble B3", "Painting Wobble B3"), + ("SURFACE_PAINTING_WOBBLE_B4", "Painting Wobble B4", "Painting Wobble B4"), + ("SURFACE_PAINTING_WOBBLE_B5", "Painting Wobble B5", "Painting Wobble B5"), + ("SURFACE_PAINTING_WOBBLE_B6", "Painting Wobble B6", "Painting Wobble B6"), + ("SURFACE_PAINTING_WOBBLE_B7", "Painting Wobble B7", "Painting Wobble B7"), + ("SURFACE_PAINTING_WOBBLE_B8", "Painting Wobble B8", "Painting Wobble B8"), + ("SURFACE_PAINTING_WOBBLE_B9", "Painting Wobble B9", "Painting Wobble B9"), + ("SURFACE_PAINTING_WOBBLE_BA", "Painting Wobble BA", "Painting Wobble BA"), + ("SURFACE_PAINTING_WOBBLE_BB", "Painting Wobble BB", "Painting Wobble BB"), + ("SURFACE_PAINTING_WOBBLE_BC", "Painting Wobble BC", "Painting Wobble BC"), + ("SURFACE_PAINTING_WOBBLE_BD", "Painting Wobble BD", "Painting Wobble BD"), + ("SURFACE_PAINTING_WOBBLE_BE", "Painting Wobble BE", "Painting Wobble BE"), + ("SURFACE_PAINTING_WOBBLE_BF", "Painting Wobble BF", "Painting Wobble BF"), + ("SURFACE_PAINTING_WOBBLE_C0", "Painting Wobble C0", "Painting Wobble C0"), + ("SURFACE_PAINTING_WOBBLE_C1", "Painting Wobble C1", "Painting Wobble C1"), + ("SURFACE_PAINTING_WOBBLE_C2", "Painting Wobble C2", "Painting Wobble C2"), + ("SURFACE_PAINTING_WOBBLE_C3", "Painting Wobble C3", "Painting Wobble C3"), + ("SURFACE_PAINTING_WOBBLE_C4", "Painting Wobble C4", "Painting Wobble C4"), + ("SURFACE_PAINTING_WOBBLE_C5", "Painting Wobble C5", "Painting Wobble C5"), + ("SURFACE_PAINTING_WOBBLE_C6", "Painting Wobble C6", "Painting Wobble C6"), + ("SURFACE_PAINTING_WOBBLE_C7", "Painting Wobble C7", "Painting Wobble C7"), + ("SURFACE_PAINTING_WOBBLE_C8", "Painting Wobble C8", "Painting Wobble C8"), + ("SURFACE_PAINTING_WOBBLE_C9", "Painting Wobble C9", "Painting Wobble C9"), + ("SURFACE_PAINTING_WOBBLE_CA", "Painting Wobble CA", "Painting Wobble CA"), + ("SURFACE_PAINTING_WOBBLE_CB", "Painting Wobble CB", "Painting Wobble CB"), + ("SURFACE_PAINTING_WOBBLE_CC", "Painting Wobble CC", "Painting Wobble CC"), + ("SURFACE_PAINTING_WOBBLE_CD", "Painting Wobble CD", "Painting Wobble CD"), + ("SURFACE_PAINTING_WOBBLE_CE", "Painting Wobble CE", "Painting Wobble CE"), + ("SURFACE_PAINTING_WOBBLE_CF", "Painting Wobble CF", "Painting Wobble CF"), + ("SURFACE_PAINTING_WOBBLE_D0", "Painting Wobble D0", "Painting Wobble D0"), + ("SURFACE_PAINTING_WOBBLE_D1", "Painting Wobble D1", "Painting Wobble D1"), + ("SURFACE_PAINTING_WOBBLE_D2", "Painting Wobble D2", "Painting Wobble D2"), + ("SURFACE_PAINTING_WARP_D3", "Painting Warp D3", "Painting Warp D3"), + ("SURFACE_PAINTING_WARP_D4", "Painting Warp D4", "Painting Warp D4"), + ("SURFACE_PAINTING_WARP_D5", "Painting Warp D5", "Painting Warp D5"), + ("SURFACE_PAINTING_WARP_D6", "Painting Warp D6", "Painting Warp D6"), + ("SURFACE_PAINTING_WARP_D7", "Painting Warp D7", "Painting Warp D7"), + ("SURFACE_PAINTING_WARP_D8", "Painting Warp D8", "Painting Warp D8"), + ("SURFACE_PAINTING_WARP_D9", "Painting Warp D9", "Painting Warp D9"), + ("SURFACE_PAINTING_WARP_DA", "Painting Warp DA", "Painting Warp DA"), + ("SURFACE_PAINTING_WARP_DB", "Painting Warp DB", "Painting Warp DB"), + ("SURFACE_PAINTING_WARP_DC", "Painting Warp DC", "Painting Warp DC"), + ("SURFACE_PAINTING_WARP_DD", "Painting Warp DD", "Painting Warp DD"), + ("SURFACE_PAINTING_WARP_DE", "Painting Warp DE", "Painting Warp DE"), + ("SURFACE_PAINTING_WARP_DF", "Painting Warp DF", "Painting Warp DF"), + ("SURFACE_PAINTING_WARP_E0", "Painting Warp E0", "Painting Warp E0"), + ("SURFACE_PAINTING_WARP_E1", "Painting Warp E1", "Painting Warp E1"), + ("SURFACE_PAINTING_WARP_E2", "Painting Warp E2", "Painting Warp E2"), + ("SURFACE_PAINTING_WARP_E3", "Painting Warp E3", "Painting Warp E3"), + ("SURFACE_PAINTING_WARP_E4", "Painting Warp E4", "Painting Warp E4"), + ("SURFACE_PAINTING_WARP_E5", "Painting Warp E5", "Painting Warp E5"), + ("SURFACE_PAINTING_WARP_E6", "Painting Warp E6", "Painting Warp E6"), + ("SURFACE_PAINTING_WARP_E7", "Painting Warp E7", "Painting Warp E7"), + ("SURFACE_PAINTING_WARP_E8", "Painting Warp E8", "Painting Warp E8"), + ("SURFACE_PAINTING_WARP_E9", "Painting Warp E9", "Painting Warp E9"), + ("SURFACE_PAINTING_WARP_EA", "Painting Warp EA", "Painting Warp EA"), + ("SURFACE_PAINTING_WARP_EB", "Painting Warp EB", "Painting Warp EB"), + ("SURFACE_PAINTING_WARP_EC", "Painting Warp EC", "Painting Warp EC"), + ("SURFACE_PAINTING_WARP_ED", "Painting Warp ED", "Painting Warp ED"), + ("SURFACE_PAINTING_WARP_EE", "Painting Warp EE", "Painting Warp EE"), + ("SURFACE_PAINTING_WARP_EF", "Painting Warp EF", "Painting Warp EF"), + ("SURFACE_PAINTING_WARP_F0", "Painting Warp F0", "Painting Warp F0"), + ("SURFACE_PAINTING_WARP_F1", "Painting Warp F1", "Painting Warp F1"), + ("SURFACE_PAINTING_WARP_F2", "Painting Warp F2", "Painting Warp F2"), + ("SURFACE_PAINTING_WARP_F3", "Painting Warp F3", "Painting Warp F3"), + ("SURFACE_TTC_PAINTING_1", "TTC Painting 1", "TTC Painting 1"), + ("SURFACE_TTC_PAINTING_2", "TTC Painting 2", "TTC Painting 2"), + ("SURFACE_TTC_PAINTING_3", "TTC Painting 3", "TTC Painting 3"), + ("SURFACE_PAINTING_WARP_F7", "Painting Warp F7", "Painting Warp F7"), + ("SURFACE_PAINTING_WARP_F8", "Painting Warp F8", "Painting Warp F8"), + ("SURFACE_PAINTING_WARP_F9", "Painting Warp F9", "Painting Warp F9"), + ("SURFACE_PAINTING_WARP_FA", "Painting Warp FA", "Painting Warp FA"), + ("SURFACE_PAINTING_WARP_FB", "Painting Warp FB", "Painting Warp FB"), + ("SURFACE_PAINTING_WARP_FC", "Painting Warp FC", "Painting Warp FC"), ] enumUnusedCollisionType = [ - ('SURFACE_0004','0004','0004'), + ("SURFACE_0004", "0004", "0004"), ] diff --git a/fast64_internal/sm64/sm64_constants.py b/fast64_internal/sm64/sm64_constants.py index fbcb61b94..e1fe4f946 100644 --- a/fast64_internal/sm64/sm64_constants.py +++ b/fast64_internal/sm64/sm64_constants.py @@ -11,1748 +11,2271 @@ marioFullRomInterval = (0x11D8930, 0x11FFF00) defaultExtendSegment4 = (0x11A35B8, 0x11FFF00) -mainLevelLoadScriptSegment = { - 0x15 : (0x2ABCA0, 0x2AC6B0) -} +mainLevelLoadScriptSegment = {0x15: (0x2ABCA0, 0x2AC6B0)} -bank0Segment = { - 0x00 : (0x000000, 0x7FFFFF) -} +bank0Segment = {0x00: (0x000000, 0x7FFFFF)} # Segments for common geolayouts and Mario loadSegmentAddresses = { - 0x03 : 0x2ABCAC, - 0x04 : 0x2ABCA0, - 0x13 : 0x2ABCD0, - 0x16 : 0x2ABCC4, - 0x17 : 0x2ABCB8 + 0x03: 0x2ABCAC, + 0x04: 0x2ABCA0, + 0x13: 0x2ABCD0, + 0x16: 0x2ABCC4, + 0x17: 0x2ABCB8, } lightIndices = [0x86, 0x88, 0x8A, 0x8C, 0x8E, 0x90, 0x92, 0x94] -originalMarioHeadROMInterval = ( - 0x011B4F58, - 0x011B5710 -) +originalMarioHeadROMInterval = (0x011B4F58, 0x011B5710) marioVanishOffsets = { - "regular" : 0xB0C, - "metal" : 0x9EC, + "regular": 0xB0C, + "metal": 0x9EC, } commonGeolayoutPointers = { - 'Dorrie' : [2039136, 'HMC'], - 'Bowser' : [1809204, 'BFB'], - 'Bowser 2' : [1809328, 'BFB'], - 'Lakitu' : [1985520, 'CC'] + "Dorrie": [2039136, "HMC"], + "Bowser": [1809204, "BFB"], + "Bowser 2": [1809328, "BFB"], + "Lakitu": [1985520, "CC"], } draw_layer_enums = [ - ('1', 'Solid', '0x01'), - ('2', 'Solid Decal', '0x02'), - ('4', 'Transparent (No Blending)', '0x04'), - ('5', 'Transparent (Blending Front)', '0x05'), - ('6', 'Transparent (Blending Back)', '0x06'), + ("1", "Solid", "0x01"), + ("2", "Solid Decal", "0x02"), + ("4", "Transparent (No Blending)", "0x04"), + ("5", "Transparent (Blending Front)", "0x05"), + ("6", "Transparent (Blending Back)", "0x06"), ] level_enums = [ - ("HH" , "Big Boo's Haunt" , "HH" ), # Originally Haunted House - ("CCM", "Cool Cool Mountain" , "CCM"), - ("IC" , "Inside Castle" , "IC" ), - ("HMC", "Hazy Maze Cave" , "HMC"), - ("SSL", "Shifting Sand Land" , "SSL"), - ("BOB", "Bob-Omb's Battlefield" , "BOB"), - ("SML", "Snow Man's land" , "SML"), - ("WDW", "Wet Dry World" , "WDW"), - ("JRB", "Jolly Roger Bay" , "JRB"), - ("THI", "Tiny Huge Island" , "THI"), - ("TTC", "Tick Tock Clock" , "TTC"), - ("RR" , "Rainbow Ride" , "RR" ), - ("CG" , "Castle Grounds" , "CG" ), - ("BFC", "Bowser First Course" , "BFC"), - ("VC" , "Vanish Cap" , "VC" ), - ("BFS", "Bowser's Fire Sea" , "BFS"), - ("SA" , "Secret Aquarium" , "SA" ), - ("BTC", "Bowser Third Course" , "BTC"), - ("LLL", "Lethal Lava Land" , "LLL"), - ("DDD", "Dire Dire Docks" , "DDD"), - ("WF" , "Whomp's Fortress" , "WF" ), - ("PIC", "Picture at the end" , "PIC"), - ("CC" , "Castle Courtyard" , "CC" ), - ("PSS", "Peach's Secret Slide" , "PSS"), - ("MC" , "Metal Cap" , "MC" ), - ("WC" , "Wing Cap" , "WC" ), - ("BFB", "Bowser First Battle" , "BFB"), - ("RC" , "Rainbow Clouds" , "RC" ), - ("BSB", "Bowser Second Battle" , "BSB"), - ("BTB", "Bowser Third Battle" , "BTB"), - ("TTM", "Tall Tall Mountain" , "TTM"), + ("HH", "Big Boo's Haunt", "HH"), # Originally Haunted House + ("CCM", "Cool Cool Mountain", "CCM"), + ("IC", "Inside Castle", "IC"), + ("HMC", "Hazy Maze Cave", "HMC"), + ("SSL", "Shifting Sand Land", "SSL"), + ("BOB", "Bob-Omb's Battlefield", "BOB"), + ("SML", "Snow Man's land", "SML"), + ("WDW", "Wet Dry World", "WDW"), + ("JRB", "Jolly Roger Bay", "JRB"), + ("THI", "Tiny Huge Island", "THI"), + ("TTC", "Tick Tock Clock", "TTC"), + ("RR", "Rainbow Ride", "RR"), + ("CG", "Castle Grounds", "CG"), + ("BFC", "Bowser First Course", "BFC"), + ("VC", "Vanish Cap", "VC"), + ("BFS", "Bowser's Fire Sea", "BFS"), + ("SA", "Secret Aquarium", "SA"), + ("BTC", "Bowser Third Course", "BTC"), + ("LLL", "Lethal Lava Land", "LLL"), + ("DDD", "Dire Dire Docks", "DDD"), + ("WF", "Whomp's Fortress", "WF"), + ("PIC", "Picture at the end", "PIC"), + ("CC", "Castle Courtyard", "CC"), + ("PSS", "Peach's Secret Slide", "PSS"), + ("MC", "Metal Cap", "MC"), + ("WC", "Wing Cap", "WC"), + ("BFB", "Bowser First Battle", "BFB"), + ("RC", "Rainbow Clouds", "RC"), + ("BSB", "Bowser Second Battle", "BSB"), + ("BTB", "Bowser Third Battle", "BTB"), + ("TTM", "Tall Tall Mountain", "TTM"), ] enumLevelNames = [ - ('custom', 'Custom', 'Custom'), - ('bbh', 'Big Boo\'s Haunt', 'Big Boo\'s Haunt'), - ('bitdw', 'Bowser In The Dark World', 'Bowser In The Dark World'), - ('bitfs', 'Bowser In The Fire Sea', 'Bowser In The Fire Sea'), - ('bits', 'Bowser In The Sky', 'Bowser In The Sky'), - ('bob', 'Bob-omb Battlefield', 'Bob-omb Battlefield'), - ('bowser_1', 'Bowser 1', 'Bowser 1'), - ('bowser_2', 'Bowser 2', 'Bowser 2'), - ('bowser_3', 'Bowser 3', 'Bowser 3'), - ('castle_courtyard', 'Castle Courtyard', 'Castle Courtyard'), - ('castle_grounds', 'Castle Grounds', 'Castle Grounds'), - ('castle_inside', 'Castle Inside', 'Castle Inside'), - ('ccm', 'Cool Cool Mountain', 'Cool Cool Mountain'), - ('cotmc', 'Cavern Of The Metal Cap', 'Cavern Of The Metal Cap'), - ('ddd', 'Dire Dire Docks', 'Dire Dire Docks'), - ('ending', 'Ending', 'Ending'), - ('hmc', 'Hazy Maze Cave', 'Hazy Maze Cave'), - ('intro', 'Intro', 'Intro'), - ('jrb', 'Jolly Roger Bay', 'Jolly Roger Bay'), - ('lll', 'Lethal Lava Land', 'Lethal Lava Land'), - ('menu', 'Menu', 'Menu'), - ('pss', 'Peach\'s Secret Slide', 'Peach\'s Secret Slide'), - ('rr', 'Rainbow Ride', 'Rainbow Ride'), - ('sa', 'Secret Aquarium', 'Secret Aquarium'), - ('sl', 'Snowman\'s Land', 'Snowman\'s Land'), - ('ssl', 'Shifting Sand Land', 'Shifting Sand Land'), - ('thi', 'Tiny Huge Island', 'Tiny Huge Island'), - ('totwc', 'Tower Of The Wing Cap', 'Tower Of The Wing Cap'), - ('ttc', 'Tick Tock Clock', 'Tick Tock Clock'), - ('ttm', 'Tall Tall Mountain', 'Tall Tall Mountain'), - ('vcutm', 'Vanish Cap Under The Moat', 'Vanish Cap Under The Moat'), - ('wdw', 'Wet Dry World', 'Wet Dry World'), - ('wf', 'Whomp\'s Fortress', 'Whomp\'s Fortress'), - ('wmotr', 'Wing Mario Over The Rainbow', 'Wing Mario Over The Rainbow'), + ("custom", "Custom", "Custom"), + ("bbh", "Big Boo's Haunt", "Big Boo's Haunt"), + ("bitdw", "Bowser In The Dark World", "Bowser In The Dark World"), + ("bitfs", "Bowser In The Fire Sea", "Bowser In The Fire Sea"), + ("bits", "Bowser In The Sky", "Bowser In The Sky"), + ("bob", "Bob-omb Battlefield", "Bob-omb Battlefield"), + ("bowser_1", "Bowser 1", "Bowser 1"), + ("bowser_2", "Bowser 2", "Bowser 2"), + ("bowser_3", "Bowser 3", "Bowser 3"), + ("castle_courtyard", "Castle Courtyard", "Castle Courtyard"), + ("castle_grounds", "Castle Grounds", "Castle Grounds"), + ("castle_inside", "Castle Inside", "Castle Inside"), + ("ccm", "Cool Cool Mountain", "Cool Cool Mountain"), + ("cotmc", "Cavern Of The Metal Cap", "Cavern Of The Metal Cap"), + ("ddd", "Dire Dire Docks", "Dire Dire Docks"), + ("ending", "Ending", "Ending"), + ("hmc", "Hazy Maze Cave", "Hazy Maze Cave"), + ("intro", "Intro", "Intro"), + ("jrb", "Jolly Roger Bay", "Jolly Roger Bay"), + ("lll", "Lethal Lava Land", "Lethal Lava Land"), + ("menu", "Menu", "Menu"), + ("pss", "Peach's Secret Slide", "Peach's Secret Slide"), + ("rr", "Rainbow Ride", "Rainbow Ride"), + ("sa", "Secret Aquarium", "Secret Aquarium"), + ("sl", "Snowman's Land", "Snowman's Land"), + ("ssl", "Shifting Sand Land", "Shifting Sand Land"), + ("thi", "Tiny Huge Island", "Tiny Huge Island"), + ("totwc", "Tower Of The Wing Cap", "Tower Of The Wing Cap"), + ("ttc", "Tick Tock Clock", "Tick Tock Clock"), + ("ttm", "Tall Tall Mountain", "Tall Tall Mountain"), + ("vcutm", "Vanish Cap Under The Moat", "Vanish Cap Under The Moat"), + ("wdw", "Wet Dry World", "Wet Dry World"), + ("wf", "Whomp's Fortress", "Whomp's Fortress"), + ("wmotr", "Wing Mario Over The Rainbow", "Wing Mario Over The Rainbow"), ] levelIDNames = { - 'bbh' : 'LEVEL_BBH', - 'bitdw' : 'LEVEL_BITDW', - 'bitfs' : 'LEVEL_BITFS', - 'bits' : 'LEVEL_BITS', - 'bob' : 'LEVEL_BOB', - 'bowser_1' : 'LEVEL_BOWSER_1', - 'bowser_2' : 'LEVEL_BOWSER_2', - 'bowser_3' : 'LEVEL_BOWSER_3', - 'castle_courtyard' : 'LEVEL_CASTLE_COURTYARD', - 'castle_grounds' : 'LEVEL_CASTLE_GROUNDS', - 'castle_inside' : 'LEVEL_CASTLE', - 'ccm' : 'LEVEL_CCM', - 'cotmc' : 'LEVEL_COTMC', - 'ddd' : 'LEVEL_DDD', - 'ending' : 'LEVEL_ENDING', - 'hmc' : 'LEVEL_HMC', - 'intro' : 'LEVEL_INTRO', - 'jrb' : 'LEVEL_JRB', - 'lll' : 'LEVEL_LLL', - 'menu' : 'LEVEL_MENU', - 'pss' : 'LEVEL_PSS', - 'rr' : 'LEVEL_RR', - 'sa' : 'LEVEL_SA', - 'sl' : 'LEVEL_SL', - 'ssl' : 'LEVEL_SSL', - 'thi' : 'LEVEL_THI', - 'totwc' : 'LEVEL_TOTWC', - 'ttc' : 'LEVEL_TTC', - 'ttm' : 'LEVEL_TTM', - 'vcutm' : 'LEVEL_VCUTM', - 'wdw' : 'LEVEL_WDW', - 'wf' : 'LEVEL_WF', - 'wmotr' : 'LEVEL_WMOTR', + "bbh": "LEVEL_BBH", + "bitdw": "LEVEL_BITDW", + "bitfs": "LEVEL_BITFS", + "bits": "LEVEL_BITS", + "bob": "LEVEL_BOB", + "bowser_1": "LEVEL_BOWSER_1", + "bowser_2": "LEVEL_BOWSER_2", + "bowser_3": "LEVEL_BOWSER_3", + "castle_courtyard": "LEVEL_CASTLE_COURTYARD", + "castle_grounds": "LEVEL_CASTLE_GROUNDS", + "castle_inside": "LEVEL_CASTLE", + "ccm": "LEVEL_CCM", + "cotmc": "LEVEL_COTMC", + "ddd": "LEVEL_DDD", + "ending": "LEVEL_ENDING", + "hmc": "LEVEL_HMC", + "intro": "LEVEL_INTRO", + "jrb": "LEVEL_JRB", + "lll": "LEVEL_LLL", + "menu": "LEVEL_MENU", + "pss": "LEVEL_PSS", + "rr": "LEVEL_RR", + "sa": "LEVEL_SA", + "sl": "LEVEL_SL", + "ssl": "LEVEL_SSL", + "thi": "LEVEL_THI", + "totwc": "LEVEL_TOTWC", + "ttc": "LEVEL_TTC", + "ttm": "LEVEL_TTM", + "vcutm": "LEVEL_VCUTM", + "wdw": "LEVEL_WDW", + "wf": "LEVEL_WF", + "wmotr": "LEVEL_WMOTR", } cameraTriggerNames = { - 'bbh' : 'sCamBBH', - 'bitdw' : 'sCamBitDW', - 'bitfs' : 'sCamBitFS', - 'bits' : 'sCamBitS', - 'bob' : 'sCamBOB', - 'bowser_1' : 'sCamBowser_1', - 'bowser_2' : 'sCamBowser_2', - 'bowser_3' : 'sCamBowser_3', - 'castle_courtyard' : 'sCamCastleCourtyard', - 'castle_grounds' : 'sCamCastleGrounds', - 'castle_inside' : 'sCamCastle', - 'ccm' : 'sCamCCM', - 'cotmc' : 'sCamCotMC', - 'ddd' : 'sCamDDD', - 'ending' : 'sCamEnding', - 'hmc' : 'sCamHMC', - 'intro' : 'sCamIntro', - 'jrb' : 'sCamJRB', - 'lll' : 'sCamLLL', - 'menu' : 'sCamMenu', - 'pss' : 'sCamPSS', - 'rr' : 'sCamRR', - 'sa' : 'sCamSA', - 'sl' : 'sCamSL', - 'ssl' : 'sCamSSL', - 'thi' : 'sCamTHI', - 'totwc' : 'sCamTotWC', - 'ttc' : 'sCamTTC', - 'ttm' : 'sCamTTM', - 'vcutm' : 'sCamVCUtM', - 'wdw' : 'sCamWDW', - 'wf' : 'sCamWF', - 'wmotr' : 'sCamWMOtR', + "bbh": "sCamBBH", + "bitdw": "sCamBitDW", + "bitfs": "sCamBitFS", + "bits": "sCamBitS", + "bob": "sCamBOB", + "bowser_1": "sCamBowser_1", + "bowser_2": "sCamBowser_2", + "bowser_3": "sCamBowser_3", + "castle_courtyard": "sCamCastleCourtyard", + "castle_grounds": "sCamCastleGrounds", + "castle_inside": "sCamCastle", + "ccm": "sCamCCM", + "cotmc": "sCamCotMC", + "ddd": "sCamDDD", + "ending": "sCamEnding", + "hmc": "sCamHMC", + "intro": "sCamIntro", + "jrb": "sCamJRB", + "lll": "sCamLLL", + "menu": "sCamMenu", + "pss": "sCamPSS", + "rr": "sCamRR", + "sa": "sCamSA", + "sl": "sCamSL", + "ssl": "sCamSSL", + "thi": "sCamTHI", + "totwc": "sCamTotWC", + "ttc": "sCamTTC", + "ttm": "sCamTTM", + "vcutm": "sCamVCUtM", + "wdw": "sCamWDW", + "wf": "sCamWF", + "wmotr": "sCamWMOtR", } + class SM64_CharacterImportData: - def __init__(self, geoAddr, level, switchDict): - self.geoAddr = geoAddr - self.level = level - self.switchDict = switchDict + def __init__(self, geoAddr, level, switchDict): + self.geoAddr = geoAddr + self.level = level + self.switchDict = switchDict + character_enums = [ - ("Mario" , "Mario" , "Mario" ), - ("Peach" , "Peach" , "Peach" ), - #("Bowser" , "Bowser" , "Bowser" ), - #("Koopa" , "Koopa" , "Koopa" ), - #("Toad" , "Toad" , "Toad" ) + ("Mario", "Mario", "Mario"), + ("Peach", "Peach", "Peach"), + # ("Bowser" , "Bowser" , "Bowser" ), + # ("Koopa" , "Koopa" , "Koopa" ), + # ("Toad" , "Toad" , "Toad" ) ] # switch index starts at 1. # switch option index starts at 0. sm64_character_data = { - - "Mario" : SM64_CharacterImportData('12A784', 'CG', { - 1 : { # Low poly mario - 0 : 'Ignore' - }, - 2 : { - 1 : "Material", # metal mario - 2 : "Draw Layer", # vanish mario - 3 : "Material", # metal vanish mario - }, - 3 : { # cap vs no cap - }, - 4 : { # face animation (cap) - 0 : "Material", - 1 : "Material", - 2 : "Material", - 3 : "Material", - 4 : "Material", - 5 : "Material", - 6 : "Material", - 7 : "Material", - }, - 5 : { # face animation (no cap) - 0 : "Material", - 1 : "Material", - 2 : "Material", - 3 : "Material", - 4 : "Material", - 5 : "Material", - 6 : "Material", - 7 : "Material", - }, - 6 : { # right fist type - # 0 = closed, 1 = open, 2 is something, 3-5 are same as 2 - 3 : 'Ignore', - 4 : 'Ignore', - 5 : 'Ignore', - }, - 7 : { # left fist type - # 0 = closed, 1 = open, 2 = peace, 3 = hold cap, 4 = hold cap wing - }, - }), - 'Peach' : SM64_CharacterImportData('180950', 'CG', { - 1 : { # transparent peach - 1 : 'Draw Layer', - }, - 2 : { # 0-3 = face animation kissing, 4-7 = face animation normal - 0 : "Material", - 1 : "Material", - 2 : "Material", - 3 : "Material", - 4 : "Material", - 5 : "Material", - 6 : "Material", - 7 : "Material", - } - }), + "Mario": SM64_CharacterImportData( + "12A784", + "CG", + { + 1: {0: "Ignore"}, # Low poly mario + 2: { + 1: "Material", # metal mario + 2: "Draw Layer", # vanish mario + 3: "Material", # metal vanish mario + }, + 3: {}, # cap vs no cap + 4: { # face animation (cap) + 0: "Material", + 1: "Material", + 2: "Material", + 3: "Material", + 4: "Material", + 5: "Material", + 6: "Material", + 7: "Material", + }, + 5: { # face animation (no cap) + 0: "Material", + 1: "Material", + 2: "Material", + 3: "Material", + 4: "Material", + 5: "Material", + 6: "Material", + 7: "Material", + }, + 6: { # right fist type + # 0 = closed, 1 = open, 2 is something, 3-5 are same as 2 + 3: "Ignore", + 4: "Ignore", + 5: "Ignore", + }, + 7: { # left fist type + # 0 = closed, 1 = open, 2 = peace, 3 = hold cap, 4 = hold cap wing + }, + }, + ), + "Peach": SM64_CharacterImportData( + "180950", + "CG", + { + 1: { # transparent peach + 1: "Draw Layer", + }, + 2: { # 0-3 = face animation kissing, 4-7 = face animation normal + 0: "Material", + 1: "Material", + 2: "Material", + 3: "Material", + 4: "Material", + 5: "Material", + 6: "Material", + 7: "Material", + }, + }, + ), } level_pointers = { - "HH" : 0x2AC094, - "CCM": 0x2AC0A8, - "IC" : 0x2AC0BC, - "HMC": 0x2AC0D0, - "SSL": 0x2AC0E4, - "BOB": 0x2AC0F8, - "SML": 0x2AC10C, - "WDW": 0x2AC120, - "JRB": 0x2AC134, - "THI": 0x2AC148, - "TTC": 0x2AC15C, - "RR" : 0x2AC170, - "CG" : 0x2AC184, - "BFC": 0x2AC198, - "VC" : 0x2AC1AC, - "BFS": 0x2AC1C0, - "SA" : 0x2AC1D4, - "BTC": 0x2AC1E8, - "LLL": 0x2AC1FC, - "DDD": 0x2AC210, - "WF" : 0x2AC224, - "PIC": 0x2AC238, - "CC" : 0x2AC24C, - "PSS": 0x2AC260, - "MC" : 0x2AC274, - "WC" : 0x2AC288, - "BFB": 0x2AC29C, - "RC" : 0x2AC2B0, - "BSB": 0x2AC2C4, - "BTB": 0x2AC2D8, - "TTM": 0x2AC2EC, + "HH": 0x2AC094, + "CCM": 0x2AC0A8, + "IC": 0x2AC0BC, + "HMC": 0x2AC0D0, + "SSL": 0x2AC0E4, + "BOB": 0x2AC0F8, + "SML": 0x2AC10C, + "WDW": 0x2AC120, + "JRB": 0x2AC134, + "THI": 0x2AC148, + "TTC": 0x2AC15C, + "RR": 0x2AC170, + "CG": 0x2AC184, + "BFC": 0x2AC198, + "VC": 0x2AC1AC, + "BFS": 0x2AC1C0, + "SA": 0x2AC1D4, + "BTC": 0x2AC1E8, + "LLL": 0x2AC1FC, + "DDD": 0x2AC210, + "WF": 0x2AC224, + "PIC": 0x2AC238, + "CC": 0x2AC24C, + "PSS": 0x2AC260, + "MC": 0x2AC274, + "WC": 0x2AC288, + "BFB": 0x2AC29C, + "RC": 0x2AC2B0, + "BSB": 0x2AC2C4, + "BTB": 0x2AC2D8, + "TTM": 0x2AC2EC, } insertableBinaryTypes = { - 'Display List' : 0, - 'Geolayout' : 1, - 'Animation' : 2, - 'Collision' : 3 + "Display List": 0, + "Geolayout": 1, + "Animation": 2, + "Collision": 3, } enumBehaviourPresets = [ - ('Custom', 'Custom', 'Custom'), - ('1300407c', '1 Up', '1 Up'), - ('130040b4', '1 Up Jump On Approach', '1 Up Jump On Approach'), - ('13004010', '1 Up Running Away', '1 Up Running Away'), - ('13004044', '1 Up Sliding', '1 Up Sliding'), - ('13003fdc', '1 Up Walking', '1 Up Walking'), - ('13003048', 'Act Selector', 'Act Selector'), - ('1300302c', 'Act Selector Star Type', 'Act Selector Star Type'), - ('13004ecc', 'Activated Back And Forth Platform', 'Activated Back And Forth Platform'), - ('13001778', 'Alpha Boo Key', 'Alpha Boo Key'), - ('13003c90', 'Ambient Sounds', 'Ambient Sounds'), - ('1300269c', 'Animated Texture', 'Animated Texture'), - ('13004ea0', 'Animates On Floor Switch Press', 'Animates On Floor Switch Press'), - ('13000cc8', 'Another Elavator', 'Another Elavator'), - ('130013dc', 'Another Tilting Platform', 'Another Tilting Platform'), - ('13004314', 'Arrow Lift', 'Arrow Lift'), - ('130028cc', 'BBH Tilting Trap Platform', 'BBH Tilting Trap Platform'), - ('13000c44', 'BBH Tumbling Bridge', 'BBH Tumbling Bridge'), - ('13000fc8', 'BITFS Sinking Cage Platform', 'BITFS Sinking Cage Platform'), - ('13000f9c', 'BITFS Sinking Platforms', 'BITFS Sinking Platforms'), - ('13001030', 'BITFS Tilting Inverted Pyramid', 'BITFS Tilting Inverted Pyramid'), - ('13003aa4', 'BOB Bowling Ball Spawner', 'BOB Bowling Ball Spawner'), - ('13002768', 'Balcony Big Boo', 'Balcony Big Boo'), - ('13005610', 'Beginning Lakitu', 'Beginning Lakitu'), - ('13005638', 'Beginning Peach', 'Beginning Peach'), - ('13001744', 'Beta Boo Key', 'Beta Boo Key'), - ('130029b4', 'Beta Bowser Anchor', 'Beta Bowser Anchor'), - ('13000278', 'Beta Chest Bottom', 'Beta Chest Bottom'), - ('1300029c', 'Beta Chest Lid', 'Beta Chest Lid'), - ('13001298', 'Beta Fish Splash Spawner', 'Beta Fish Splash Spawner'), - ('13003420', 'Beta Holdable Object', 'Beta Holdable Object'), - ('130010b8', 'Beta Moving Flames', 'Beta Moving Flames'), - ('130010a8', 'Beta Moving Flames Spawn', 'Beta Moving Flames Spawn'), - ('13001634', 'Beta Trampoline Spring', 'Beta Trampoline Spring'), - ('13001608', 'Beta Trampoline Top', 'Beta Trampoline Top'), - ('13003d74', 'Big Boulder', 'Big Boulder'), - ('13003da0', 'Big Boulder Generator', 'Big Boulder Generator'), - ('13003660', 'Big Bully', 'Big Bully'), - ('13003694', 'Big Bully With Minions', 'Big Bully With Minions'), - ('13003700', 'Big Chill Bully', 'Big Chill Bully'), - ('13003d4c', 'Big Snowman Whole', 'Big Snowman Whole'), - ('13005354', 'Bird', 'Bird'), - ('13003c7c', 'Birds Sound Loop', 'Birds Sound Loop'), - ('13001254', 'Black Smoke Bowser', 'Black Smoke Bowser'), - ('13001214', 'Black Smoke Mario', 'Black Smoke Mario'), - ('1300127c', 'Black Smoke Upward', 'Black Smoke Upward'), - ('13001984', 'Blue Bowser Flame', 'Blue Bowser Flame'), - ('13003104', 'Blue Coin Jumping', 'Blue Coin Jumping'), - ('130030d4', 'Blue Coin Sliding', 'Blue Coin Sliding'), - ('13002568', 'Blue Coin Switch', 'Blue Coin Switch'), - ('13001b2c', 'Blue Fish', 'Blue Fish'), - ('13001a0c', 'Blue Flames Group', 'Blue Flames Group'), - ('13003174', 'Bobomb', 'Bobomb'), - ('13000254', 'Bobomb Anchor Mario', 'Bobomb Anchor Mario'), - ('130031dc', 'Bobomb Buddy', 'Bobomb Buddy'), - ('13003228', 'Bobomb Buddy Opens Cannon', 'Bobomb Buddy Opens Cannon'), - ('13003558', 'Bobomb Bully Death Smoke', 'Bobomb Bully Death Smoke'), - ('130035b0', 'Bobomb Explosion Bubble', 'Bobomb Explosion Bubble'), - ('13003600', 'Bobomb Explosion Bubble 3600', 'Bobomb Explosion Bubble 3600'), - ('130031ac', 'Bobomb Fuse Smoke', 'Bobomb Fuse Smoke'), - ('130027e4', 'Boo', 'Boo'), - ('13002898', 'Boo Boss Spawned Bridge', 'Boo Boss Spawned Bridge'), - ('1300167c', 'Boo Cage', 'Boo Cage'), - ('130026d4', 'Boo In Castle', 'Boo In Castle'), - ('13002710', 'Boo With Cage', 'Boo With Cage'), - ('130050f4', 'Book Switch', 'Book Switch'), - ('130050b4', 'Bookend Spawn', 'Bookend Spawn'), - ('13001168', 'Bouncing Fireball', 'Bouncing Fireball'), - ('13001184', 'Bouncing Fireball Flame', 'Bouncing Fireball Flame'), - ('13003a58', 'Bowling Ball', 'Bowling Ball'), - ('13001850', 'Bowser', 'Bowser'), - ('130018cc', 'Bowser Body Anchor', 'Bowser Body Anchor'), - ('130037ec', 'Bowser Bomb', 'Bowser Bomb'), - ('1300381c', 'Bowser Bomb Explosion', 'Bowser Bomb Explosion'), - ('13003840', 'Bowser Bomb Smoke', 'Bowser Bomb Smoke'), - ('13003ee4', 'Bowser Course Red Coin Star', 'Bowser Course Red Coin Star'), - ('13001904', 'Bowser Flame Spawn', 'Bowser Flame Spawn'), - ('130016e4', 'Bowser Key', 'Bowser Key'), - ('13001bd4', 'Bowser Key Course Exit', 'Bowser Key Course Exit'), - ('13001bb4', 'Bowser Key Unlock Door', 'Bowser Key Unlock Door'), - ('130011d0', 'Bowser Shock Wave', 'Bowser Shock Wave'), - ('130022d8', 'Bowser Sub Door', 'Bowser Sub Door'), - ('13001828', 'Bowser Tail Anchor', 'Bowser Tail Anchor'), - ('13002308', 'Bowsers Sub', 'Bowsers Sub'), - ('13000db4', 'Break Box Triangle', 'Break Box Triangle'), - ('130014e0', 'Breakable Box', 'Breakable Box'), - ('13004218', 'Breakable Box Small', 'Breakable Box Small'), - ('13000d98', 'Breath Particle Spawner', 'Breath Particle Spawner'), - ('1300220c', 'Bub', 'Bub'), - ('130055dc', 'Bubba', 'Bubba'), - ('130002e4', 'Bubble Maybe', 'Bubble Maybe'), - ('130002b8', 'Bubble Particle Spawner', 'Bubble Particle Spawner'), - ('13002cb0', 'Bubble Splash', 'Bubble Splash'), - ('1300179c', 'Bullet Bill', 'Bullet Bill'), - ('13000600', 'Bullet Bill Cannon', 'Bullet Bill Cannon'), - ('130033bc', 'Butterfly', 'Butterfly'), - ('130015c0', 'CCM Touched Star Spawn', 'CCM Touched Star Spawn'), - ('13004954', 'Camera Lakitu', 'Camera Lakitu'), - ('130004a8', 'Cannon', 'Cannon'), - ('130004e4', 'Cannon Barrel', 'Cannon Barrel'), - ('13004f28', 'Cannon Barrel Bubbles', 'Cannon Barrel Bubbles'), - ('13000500', 'Cannon Base Unused', 'Cannon Base Unused'), - ('13003274', 'Cannon Closed', 'Cannon Closed'), - ('130001cc', 'Cap Switch', 'Cap Switch'), - ('130001ac', 'Cap Switch Base', 'Cap Switch Base'), - ('13003454', 'Carry Something 1', 'Carry Something 1'), - ('1300345c', 'Carry Something 2', 'Carry Something 2'), - ('13003464', 'Carry Something 3', 'Carry Something 3'), - ('1300346c', 'Carry Something 4', 'Carry Something 4'), - ('13003474', 'Carry Something 5', 'Carry Something 5'), - ('1300347c', 'Carry Something 6', 'Carry Something 6'), - ('13003c58', 'Castle Flag Waving', 'Castle Flag Waving'), - ('13002a5c', 'Castle Floor Trap', 'Castle Floor Trap'), - ('13003868', 'Celebration Star', 'Celebration Star'), - ('13003888', 'Celebration Star Sparkle', 'Celebration Star Sparkle'), - ('1300478c', 'Chain Chomp', 'Chain Chomp'), - ('130047e4', 'Chain Chomp Chain Part', 'Chain Chomp Chain Part'), - ('13004868', 'Chain Chomp Gate', 'Chain Chomp Gate'), - ('13001b70', 'Checkerboard Elevator Group', 'Checkerboard Elevator Group'), - ('13001b88', 'Checkerboard Platform Sub', 'Checkerboard Platform Sub'), - ('130021e4', 'Chirp Chirp', 'Chirp Chirp'), - ('130021f4', 'Chirp Chirp Unused', 'Chirp Chirp Unused'), - ('13000528', 'Chuckya', 'Chuckya'), - ('13000584', 'Chuckya Anchor Mario', 'Chuckya Anchor Mario'), - ('13003388', 'Circling Amp', 'Circling Amp'), - ('13005440', 'Clam Shell', 'Clam Shell'), - ('13001c8c', 'Clock Hour Hand', 'Clock Hour Hand'), - ('13001c7c', 'Clock Minute Hand', 'Clock Minute Hand'), - ('13004988', 'Cloud', 'Cloud'), - ('130049ac', 'Cloud Part', 'Cloud Part'), - ('13005414', 'Coffin', 'Coffin'), - ('130053f4', 'Coffin Spawner', 'Coffin Spawner'), - ('130008ec', 'Coin Formation', 'Coin Formation'), - ('130008d0', 'Coin Formation Spawn', 'Coin Formation Spawn'), - ('13000888', 'Coin Inside Boo', 'Coin Inside Boo'), - ('130009e0', 'Coin Sparkles', 'Coin Sparkles'), - ('130041bc', 'Controllable Platform', 'Controllable Platform'), - ('130041f0', 'Controllable Platform Sub', 'Controllable Platform Sub'), - ('130027d0', 'Courtyard Boo Triplet', 'Courtyard Boo Triplet'), - ('13001098', 'Cut Out Object', 'Cut Out Object'), - ('13001000', 'DDD Moving Pole', 'DDD Moving Pole'), - ('13005528', 'DDD Pole', 'DDD Pole'), - ('13001c34', 'DDD Warp', 'DDD Warp'), - ('13002f70', 'Death Warp', 'Death Warp'), - ('1300442c', 'Decorative Pendulum', 'Decorative Pendulum'), - ('13000e3c', 'Dirt Particle Spawner', 'Dirt Particle Spawner'), - ('13005504', 'Donut Platform', 'Donut Platform'), - ('130054ec', 'Donut Platform Spawner', 'Donut Platform Spawner'), - ('13000b0c', 'Door', 'Door'), - ('13000afc', 'Door Warp', 'Door Warp'), - ('13004f90', 'Dorrie', 'Dorrie'), - ('1300565c', 'End Birds 1', 'End Birds 1'), - ('13005680', 'End Birds 2', 'End Birds 2'), - ('13000eac', 'End Peach', 'End Peach'), - ('13000e88', 'End Toad', 'End Toad'), - ('13004918', 'Enemy Lakitu', 'Enemy Lakitu'), - ('13002250', 'Exclamation Box', 'Exclamation Box'), - ('13000720', 'Exit Podium Warp', 'Exit Podium Warp'), - ('13003510', 'Explosion', 'Explosion'), - ('130052b4', 'Eyerok Boss', 'Eyerok Boss'), - ('130052d0', 'Eyerok Hand', 'Eyerok Hand'), - ('1300075c', 'Fading Warp', 'Fading Warp'), - ('13001958', 'Falling Bowser Platform', 'Falling Bowser Platform'), - ('130043a0', 'Falling Pillar', 'Falling Pillar'), - ('130043c4', 'Falling Pillar Hitbox', 'Falling Pillar Hitbox'), - ('13004b44', 'Ferris Wheel Axle', 'Ferris Wheel Axle'), - ('13004b6c', 'Ferris Wheel Platform', 'Ferris Wheel Platform'), - ('130011ec', 'Fire Particle Spawner', 'Fire Particle Spawner'), - ('13005120', 'Fire Piranha Plant', 'Fire Piranha Plant'), - ('1300518c', 'Fire Spitter', 'Fire Spitter'), - ('13002178', 'Fish', 'Fish'), - ('1300213c', 'Fish 2', 'Fish 2'), - ('1300214c', 'Fish 3', 'Fish 3'), - ('13000494', 'Fish Group', 'Fish Group'), - ('13000c84', 'Flame', 'Flame'), - ('13001a30', 'Flame Bouncing', 'Flame Bouncing'), - ('13001aa4', 'Flame Bowser', 'Flame Bowser'), - ('130019c8', 'Flame Floating Landing', 'Flame Floating Landing'), - ('13001ae8', 'Flame Large Burning Out', 'Flame Large Burning Out'), - ('13001a74', 'Flame Moving Forward Growing', 'Flame Moving Forward Growing'), - ('13001108', 'Flamethrower', 'Flamethrower'), - ('13001124', 'Flamethrower Flame', 'Flamethrower Flame'), - ('13001468', 'Floor Switch Animates Object', 'Floor Switch Animates Object'), - ('13001478', 'Floor Switch Grills', 'Floor Switch Grills'), - ('13001484', 'Floor Switch Hardcoded Model', 'Floor Switch Hardcoded Model'), - ('130014ac', 'Floor Switch Hidden Objects', 'Floor Switch Hidden Objects'), - ('13002a7c', 'Floor Trap In Castle', 'Floor Trap In Castle'), - ('130046dc', 'Fly Guy', 'Fly Guy'), - ('130051ac', 'Flyguy Flame', 'Flyguy Flame'), - ('1300506c', 'Flying Bookend', 'Flying Bookend'), - ('13003a30', 'Free Bowling Ball', 'Free Bowling Ball'), - ('13002790', 'Ghost Hunt Big Boo', 'Ghost Hunt Big Boo'), - ('13002804', 'Ghost Hunt Boo', 'Ghost Hunt Boo'), - ('13000118', 'Giant Pole', 'Giant Pole'), - ('13000a14', 'Golden Coin Sparkles', 'Golden Coin Sparkles'), - ('1300472c', 'Goomba', 'Goomba'), - ('13004770', 'Goomba Triplet Spawner', 'Goomba Triplet Spawner'), - ('13001714', 'Grand Star', 'Grand Star'), - ('13000b58', 'Grindel', 'Grindel'), - ('13000d30', 'HMC Elevator Platform', 'HMC Elevator Platform'), - ('130028fc', 'Haunted Bookshelf', 'Haunted Bookshelf'), - ('130050d4', 'Haunted Bookshelf Manager', 'Haunted Bookshelf Manager'), - ('13004fd4', 'Haunted Chair', 'Haunted Chair'), - ('13001548', 'Heave Ho', 'Heave Ho'), - ('130015a4', 'Heave Ho Throw Mario', 'Heave Ho Throw Mario'), - ('130040ec', 'Hidden 1 Up', 'Hidden 1 Up'), - ('13004148', 'Hidden 1 Up In Pole', 'Hidden 1 Up In Pole'), - ('130041a4', 'Hidden 1 Up In Pole Spawner', 'Hidden 1 Up In Pole Spawner'), - ('13004180', 'Hidden 1 Up In Pole Trigger', 'Hidden 1 Up In Pole Trigger'), - ('13004124', 'Hidden 1 Up Trigger', 'Hidden 1 Up Trigger'), - ('13003cb8', 'Hidden At 120 Stars', 'Hidden At 120 Stars'), - ('13002588', 'Hidden Blue Coin', 'Hidden Blue Coin'), - ('130014bc', 'Hidden Object', 'Hidden Object'), - ('13003e8c', 'Hidden Red Coin Star', 'Hidden Red Coin Star'), - ('1300286c', 'Hidden Staircase Step', 'Hidden Staircase Step'), - ('13003efc', 'Hidden Star', 'Hidden Star'), - ('13003f1c', 'Hidden Star Trigger', 'Hidden Star Trigger'), - ('13003354', 'Homing Amp', 'Homing Amp'), - ('130033ec', 'Hoot', 'Hoot'), - ('13000a98', 'Hor Star Particle Spawner', 'Hor Star Particle Spawner'), - ('1300525c', 'Horizontal Grindel', 'Horizontal Grindel'), - ('13002ce0', 'Idle Water Wave', 'Idle Water Wave'), - ('130016b8', 'Igloo', 'Igloo'), - ('1300246c', 'In Sunken Ship', 'In Sunken Ship'), - ('13002480', 'In Sunken Ship 2', 'In Sunken Ship 2'), - ('130023ec', 'In Sunken Ship 3', 'In Sunken Ship 3'), - ('13002620', 'Initialize Changing Water Level', 'Initialize Changing Water Level'), - ('130029b0', 'Inside Cannon', 'Inside Cannon'), - ('130056a4', 'Intro Scene', 'Intro Scene'), - ('13001bf4', 'Invisible Objects Under Bridge', 'Invisible Objects Under Bridge'), - ('13004400', 'JRB Floating Box', 'JRB Floating Box'), - ('130042e4', 'JRB Floating Platform', 'JRB Floating Platform'), - ('130023a4', 'JRB Sliding Box', 'JRB Sliding Box'), - ('130032c8', 'Jet Stream', 'Jet Stream'), - ('13003738', 'Jet Stream Ring Spawner', 'Jet Stream Ring Spawner'), - ('13003750', 'Jet Stream Water Ring', 'Jet Stream Water Ring'), - ('13001650', 'Jumping Box', 'Jumping Box'), - ('1300066c', 'Kickable Board', 'Kickable Board'), - ('130001f4', 'King Bobomb', 'King Bobomb'), - ('13005310', 'Klepto', 'Klepto'), - ('13004580', 'Koopa', 'Koopa'), - ('130045f8', 'Koopa Flag', 'Koopa Flag'), - ('130045d0', 'Koopa Race Endpoint', 'Koopa Race Endpoint'), - ('13001f3c', 'Koopa Shell', 'Koopa Shell'), - ('13001f68', 'Koopa Shell Flame', 'Koopa Shell Flame'), - ('13000708', 'Koopa Shell Underwater', 'Koopa Shell Underwater'), - ('13002068', 'LLL Bowser Puzzle', 'LLL Bowser Puzzle'), - ('13002038', 'LLL Bowser Puzzle Piece', 'LLL Bowser Puzzle Piece'), - ('130038e8', 'LLL Drawbridge', 'LLL Drawbridge'), - ('130038d0', 'LLL Drawbridge Spawner', 'LLL Drawbridge Spawner'), - ('13001e30', 'LLL Floating Wood Bridge', 'LLL Floating Wood Bridge'), - ('13002018', 'LLL Hexagonal Mesh', 'LLL Hexagonal Mesh'), - ('13001d78', 'LLL Moving Octagonal Mesh Platform', 'LLL Moving Octagonal Mesh Platform'), - ('13003fa4', 'LLL Rolling Log', 'LLL Rolling Log'), - ('13001da8', 'LLL Rotating Block With Fire Bars', 'LLL Rotating Block With Fire Bars'), - ('13001dcc', 'LLL Rotating Hex Flame', 'LLL Rotating Hex Flame'), - ('13001d14', 'LLL Rotating Hexagonal Platform', 'LLL Rotating Hexagonal Platform'), - ('13001e6c', 'LLL Rotating Hexagonal Ring', 'LLL Rotating Hexagonal Ring'), - ('13001e94', 'LLL Sinking Rectangular Platform', 'LLL Sinking Rectangular Platform'), - ('13001d40', 'LLL Sinking Rock Block', 'LLL Sinking Rock Block'), - ('13001ec4', 'LLL Sinking Square Platforms', 'LLL Sinking Square Platforms'), - ('13001ef8', 'LLL Tilting Inverted Pyramid', 'LLL Tilting Inverted Pyramid'), - ('13000c64', 'LLL Tumbling Bridge', 'LLL Tumbling Bridge'), - ('13003f78', 'LLL Volcano Falling Trap', 'LLL Volcano Falling Trap'), - ('13001e04', 'LLL Wood Piece', 'LLL Wood Piece'), - ('13003940', 'Large Bomp', 'Large Bomp'), - ('1300215c', 'Large Fish Group', 'Large Fish Group'), - ('13001390', 'Leaf Particle Spawner', 'Leaf Particle Spawner'), - ('13001cb0', 'Macro Ukiki', 'Macro Ukiki'), - ('13005024', 'Mad Piano', 'Mad Piano'), - ('13004370', 'Manta Ray', 'Manta Ray'), - ('130037e0', 'Manta Ray Ring Manager', 'Manta Ray Ring Manager'), - ('13003798', 'Manta Ray Water Ring', 'Manta Ray Water Ring'), - ('13002ec0', 'Mario', 'Mario'), - ('13002fe4', 'Menu Button', 'Menu Button'), - ('13003008', 'Menu Button Manager', 'Menu Button Manager'), - ('13002968', 'Merry Go Round', 'Merry Go Round'), - ('1300277c', 'Merry Go Round Big Boo', 'Merry Go Round Big Boo'), - ('130027f4', 'Merry Go Round Boo', 'Merry Go Round Boo'), - ('13002684', 'Merry Go Round Boo Manager', 'Merry Go Round Boo Manager'), - ('1300292c', 'Mesh Elevator', 'Mesh Elevator'), - ('130032e0', 'Message Panel', 'Message Panel'), - ('13003dd8', 'Metal Cap', 'Metal Cap'), - ('130044fc', 'Mips', 'Mips'), - ('13000e24', 'Mist Circ Particle Spawner', 'Mist Circ Particle Spawner'), - ('130024ac', 'Mist Particle Spawner', 'Mist Particle Spawner'), - ('13001c58', 'Moat Grills', 'Moat Grills'), - ('130039a0', 'Moneybag', 'Moneybag'), - ('130039d4', 'Moneybag Hidden', 'Moneybag Hidden'), - ('13004a00', 'Monty Mole', 'Monty Mole'), - ('13004a58', 'Monty Mole Hole', 'Monty Mole Hole'), - ('13004a78', 'Monty Mole Rock', 'Monty Mole Rock'), - ('130030a4', 'Moving Blue Coin', 'Moving Blue Coin'), - ('13003068', 'Moving Yellow Coin', 'Moving Yellow Coin'), - ('13004dbc', 'Mr. Blizzard', 'Mr. Blizzard'), - ('13004e08', 'Mr. Blizzard Snowball', 'Mr. Blizzard Snowball'), - ('13000054', 'Mr. I ', 'Mr. I '), - ('13000830', 'Mr. I Blue Coin', 'Mr. I Blue Coin'), - ('1300008c', 'Mr. I Body', 'Mr. I Body'), - ('130000ac', 'Mr. I Particle', 'Mr. I Particle'), - ('13003df8', 'Normal Cap', 'Normal Cap'), - ('13003484', 'Object Bubble', 'Object Bubble'), - ('13002d28', 'Object Water Splash', 'Object Water Splash'), - ('130034c4', 'Object Water Wave', 'Object Water Wave'), - ('13002db0', 'Object Wave Trail', 'Object Wave Trail'), - ('13004e78', 'Octagonal Platform Rotating', 'Octagonal Platform Rotating'), - ('1300090c', 'One Coin', 'One Coin'), - ('130025c0', 'Openable Cage Door', 'Openable Cage Door'), - ('130025e0', 'Openable Grill', 'Openable Grill'), - ('13004348', 'Orange Number', 'Orange Number'), - ('13002f80', 'Painting Death Warp', 'Painting Death Warp'), - ('130020d8', 'Penguin Baby', 'Penguin Baby'), - ('130053c4', 'Penguin Race Finish Line', 'Penguin Race Finish Line'), - ('130053dc', 'Penguin Race Shortcut Check', 'Penguin Race Shortcut Check'), - ('130043e0', 'Pillar Base', 'Pillar Base'), - ('13001fbc', 'Piranha Plant', 'Piranha Plant'), - ('1300142c', 'Piranha Plant Bubble', 'Piranha Plant Bubble'), - ('13001448', 'Piranha Plant Waking Bubbles', 'Piranha Plant Waking Bubbles'), - ('13003a08', 'Pit Bowling Ball', 'Pit Bowling Ball'), - ('13004ab0', 'Platform On Track', 'Platform On Track'), - ('13002998', 'Plays Music Track When Touched', 'Plays Music Track When Touched'), - ('13000428', 'Plunge Bubble', 'Plunge Bubble'), - ('13004634', 'Pokey', 'Pokey'), - ('13004668', 'Pokey Body Part', 'Pokey Body Part'), - ('13000144', 'Pole Grabbing', 'Pole Grabbing'), - ('13000a78', 'Pound Tiny Star Particle', 'Pound Tiny Star Particle'), - ('13000abc', 'Punch Tiny Triangle', 'Punch Tiny Triangle'), - ('130000f8', 'Purple Particle', 'Purple Particle'), - ('13002558', 'Purple Switch Hidden Boxes', 'Purple Switch Hidden Boxes'), - ('13001518', 'Pushable Metal Box', 'Pushable Metal Box'), - ('13003b60', 'Pyramid Elevator', 'Pyramid Elevator'), - ('13003b98', 'Pyramid Elevator Trajectory Marker Ball', 'Pyramid Elevator Trajectory Marker Ball'), - ('13003c0c', 'Pyramid Pillar Touch Detector', 'Pyramid Pillar Touch Detector'), - ('13003bb4', 'Pyramid Top', 'Pyramid Top'), - ('13003bec', 'Pyramid Top Fragment', 'Pyramid Top Fragment'), - ('13003ae0', 'RR Cruiser Wing', 'RR Cruiser Wing'), - ('13000cfc', 'RR Elevator Platform', 'RR Elevator Platform'), - ('130010d8', 'RR Rotating Bridge Platform', 'RR Rotating Bridge Platform'), - ('13005380', 'Racing Penguin', 'Racing Penguin'), - ('13002fa0', 'Random Animated Texture', 'Random Animated Texture'), - ('13004ef8', 'Recovery Heart', 'Recovery Heart'), - ('13003eac', 'Red Coin', 'Red Coin'), - ('1300556c', 'Red Coin Star Marker', 'Red Coin Star Marker'), - ('13003614', 'Respawner', 'Respawner'), - ('130022b8', 'Rock Solid', 'Rock Solid'), - ('130006d8', 'Rotating Counter Clockwise', 'Rotating Counter Clockwise'), - ('1300227c', 'Rotating Exclamation Mark', 'Rotating Exclamation Mark'), - ('130005b4', 'Rotating Platform', 'Rotating Platform'), - ('13002e3c', 'SL Snowman Wind', 'SL Snowman Wind'), - ('13002e58', 'SL Walking Penguin', 'SL Walking Penguin'), - ('13003b30', 'SSL Moving Pyramid Wall', 'SSL Moving Pyramid Wall'), - ('13003ca4', 'Sand Sound Loop', 'Sand Sound Loop'), - ('13002b5c', 'Scuttlebug', 'Scuttlebug'), - ('13002ba0', 'Scuttlebug Spawn', 'Scuttlebug Spawn'), - ('13003134', 'Seaweed', 'Seaweed'), - ('13003158', 'Seaweed Bundle', 'Seaweed Bundle'), - ('13004b1c', 'Seesaw Platform', 'Seesaw Platform'), - ('13002d7c', 'Shallow Water Splash', 'Shallow Water Splash'), - ('13002d50', 'Shallow Water Wave', 'Shallow Water Wave'), - ('130023d0', 'Ship Part 3', 'Ship Part 3'), - ('13003324', 'Sign On Wall', 'Sign On Wall'), - ('130009a4', 'Single Coin Gets Spawned', 'Single Coin Gets Spawned'), - ('13005468', 'Skeeter', 'Skeeter'), - ('130054a0', 'Skeeter Wave', 'Skeeter Wave'), - ('13004e4c', 'Sliding Platform 2', 'Sliding Platform 2'), - ('13004244', 'Sliding Snow Mound', 'Sliding Snow Mound'), - ('13003910', 'Small Bomp', 'Small Bomp'), - ('1300362c', 'Small Bully', 'Small Bully'), - ('130036c8', 'Small Chill Bully', 'Small Chill Bully'), - ('13000400', 'Small Particle', 'Small Particle'), - ('1300046c', 'Small Particle Bubbles', 'Small Particle Bubbles'), - ('13000444', 'Small Particle Snow', 'Small Particle Snow'), - ('130020e8', 'Small Penguin', 'Small Penguin'), - ('13005158', 'Small Piranha Flame', 'Small Piranha Flame'), - ('13000338', 'Small Water Wave', 'Small Water Wave'), - ('13000398', 'Small Water Wave 398', 'Small Water Wave 398'), - ('13002bcc', 'Small Whomp', 'Small Whomp'), - ('13003588', 'Smoke', 'Smoke'), - ('13001da4', 'Snow Ball', 'Snow Ball'), - ('13004270', 'Snow Mound Spawn', 'Snow Mound Spawn'), - ('13000e58', 'Snow Particle Spawner', 'Snow Particle Spawner'), - ('13003d34', 'Snowmans Body Checkpoint', 'Snowmans Body Checkpoint'), - ('13003ce4', 'Snowmans Bottom', 'Snowmans Bottom'), - ('13003d0c', 'Snowmans Head', 'Snowmans Head'), - ('130051e0', 'Snufit', 'Snufit'), - ('1300521c', 'Snufit Balls', 'Snufit Balls'), - ('1300229c', 'Sound Spawner', 'Sound Spawner'), - ('13002ad0', 'Sparkle', 'Sparkle'), - ('13002b08', 'Sparkle Particle Spawner', 'Sparkle Particle Spawner'), - ('13002af0', 'Sparkle Spawn', 'Sparkle Spawn'), - ('130007f8', 'Spawned Star', 'Spawned Star'), - ('1300080c', 'Spawned Star No Level Exit', 'Spawned Star No Level Exit'), - ('13003b00', 'Spindel', 'Spindel'), - ('130012b4', 'Spindrift', 'Spindrift'), - ('130049c8', 'Spiny', 'Spiny'), - ('13001408', 'Squarish Path Moving', 'Squarish Path Moving'), - ('13001064', 'Squishable Platform', 'Squishable Platform'), - ('13003e3c', 'Star', 'Star'), - ('13000000', 'Star Door', 'Star Door'), - ('130038b0', 'Star Key Collection Puff Spawner', 'Star Key Collection Puff Spawner'), - ('13003e64', 'Star Spawn Coordinates', 'Star Spawn Coordinates'), - ('130029e4', 'Static Checkered Platform', 'Static Checkered Platform'), - ('13002a48', 'Static Object', 'Static Object'), - ('13002e20', 'Strong Wind Particle', 'Strong Wind Particle'), - ('130016ac', 'Stub', 'Stub'), - ('13001d0c', 'Stub 1D0C', 'Stub 1D0C'), - ('13001d70', 'Stub 1D70', 'Stub 1D70'), - ('1300241c', 'Sunken Ship Part', 'Sunken Ship Part'), - ('1300244c', 'Sunken Ship Part 2', 'Sunken Ship Part 2'), - ('1300243c', 'Sunken Ship Set Rotation', 'Sunken Ship Set Rotation'), - ('13002338', 'Sushi Shark', 'Sushi Shark'), - ('13002388', 'Sushi Shark Collision Child', 'Sushi Shark Collision Child'), - ('130054b8', 'Swing Platform', 'Swing Platform'), - ('13004698', 'Swoop', 'Swoop'), - ('13003ac8', 'THI Bowling Ball Spawner', 'THI Bowling Ball Spawner'), - ('13000174', 'THI Huge Island Top', 'THI Huge Island Top'), - ('13000194', 'THI Tiny Island Top', 'THI Tiny Island Top'), - ('13004d64', 'TTC 2D Rotator', 'TTC 2D Rotator'), - ('13004ccc', 'TTC Cog', 'TTC Cog'), - ('13004d28', 'TTC Elevator', 'TTC Elevator'), - ('13004c94', 'TTC Moving Bar', 'TTC Moving Bar'), - ('13004c24', 'TTC Pendulum', 'TTC Pendulum'), - ('13004cf8', 'TTC Pit Block', 'TTC Pit Block'), - ('13004bf0', 'TTC Rotating Solid', 'TTC Rotating Solid'), - ('13004d90', 'TTC Spinner', 'TTC Spinner'), - ('13004c5c', 'TTC Treadmill', 'TTC Treadmill'), - ('13003a80', 'TTM Bowling Ball Spawner', 'TTM Bowling Ball Spawner'), - ('13003f40', 'TTM Rolling Log', 'TTM Rolling Log'), - ('13001b54', 'Tank Fish Group', 'Tank Fish Group'), - ('13000940', 'Temporary Yellow Coin', 'Temporary Yellow Coin'), - ('13000984', 'Ten Coins Spawn', 'Ten Coins Spawn'), - ('13000964', 'Three Coins Spawn', 'Three Coins Spawn'), - ('13000bc8', 'Thwomp', 'Thwomp'), - ('13000b8c', 'Thwomp 2', 'Thwomp 2'), - ('13001920', 'Tilting Bowser Lava Platform', 'Tilting Bowser Lava Platform'), - ('13002e04', 'Tiny Strong Wind Particle', 'Tiny Strong Wind Particle'), - ('13002ef8', 'Toad Message', 'Toad Message'), - ('130005d8', 'Tower', 'Tower'), - ('130006a4', 'Tower Door', 'Tower Door'), - ('130012f4', 'Tower Platform Group', 'Tower Platform Group'), - ('13001f90', 'Tox Box', 'Tox Box'), - ('13004af4', 'Track Ball', 'Track Ball'), - ('130044b8', 'Treasure Chest Bottom', 'Treasure Chest Bottom'), - ('130044e0', 'Treasure Chest Top', 'Treasure Chest Top'), - ('13004494', 'Treasure Chests', 'Treasure Chests'), - ('13004470', 'Treasure Chests JRB', 'Treasure Chests JRB'), - ('1300444c', 'Treasure Chests Ship', 'Treasure Chests Ship'), - ('13002aa4', 'Tree', 'Tree'), - ('130013c4', 'Tree Leaf', 'Tree Leaf'), - ('130013a8', 'Tree Snow', 'Tree Snow'), - ('13000ad8', 'Triangle Particle Spawner', 'Triangle Particle Spawner'), - ('13005598', 'Triplet Butterfly', 'Triplet Butterfly'), - ('13000c04', 'Tumbling Bridge Platform', 'Tumbling Bridge Platform'), - ('13002088', 'Tuxies Mother', 'Tuxies Mother'), - ('13002650', 'Tweester', 'Tweester'), - ('13002634', 'Tweester Sand Particle', 'Tweester Sand Particle'), - ('13000f08', 'Ukiki', 'Ukiki'), - ('13000f48', 'Ukiki Cage', 'Ukiki Cage'), - ('13000f14', 'Ukiki Cage Child', 'Ukiki Cage Child'), - ('13000f2c', 'Ukiki Cage Star', 'Ukiki Cage Star'), - ('13004f40', 'Unagi', 'Unagi'), - ('13004f78', 'Unagi Subobject', 'Unagi Subobject'), - ('13002f40', 'Unlock Door Star', 'Unlock Door Star'), - ('130005a8', 'Unused 05A8', 'Unused 05A8'), - ('13000dfc', 'Unused 0DFC', 'Unused 0DFC'), - ('13001820', 'Unused 1820', 'Unused 1820'), - ('13001f30', 'Unused 1F30', 'Unused 1F30'), - ('130020e0', 'Unused 20E0', 'Unused 20E0'), - ('13002a10', 'Unused 2A10', 'Unused 2A10'), - ('13002a54', 'Unused 2A54', 'Unused 2A54'), - ('13002a20', 'Unused Fake Star', 'Unused Fake Star'), - ('13000ed0', 'Unused Particle Spawn', 'Unused Particle Spawn'), - ('130015e4', 'Unused Poundable Platform', 'Unused Poundable Platform'), - ('13003e1c', 'Vanish Cap', 'Vanish Cap'), - ('13000a54', 'Vert Star Particle Spawner', 'Vert Star Particle Spawner'), - ('13001e4c', 'Volcano Flames', 'Volcano Flames'), - ('13003c44', 'Volcano Sound Loop', 'Volcano Sound Loop'), - ('13002194', 'WDW Express Elevator', 'WDW Express Elevator'), - ('130021c0', 'WDW Express Elevator Platform', 'WDW Express Elevator Platform'), - ('130042b4', 'WDW Rectangular Floating Platform', 'WDW Rectangular Floating Platform'), - ('13004284', 'WDW Square Floating Platform', 'WDW Square Floating Platform'), - ('13000638', 'WF Breakable Wall Left', 'WF Breakable Wall Left'), - ('13000624', 'WF Breakable Wall Right', 'WF Breakable Wall Right'), - ('13001340', 'WF Elevator Tower Platform', 'WF Elevator Tower Platform'), - ('130006e0', 'WF Rotating Wooden Platform', 'WF Rotating Wooden Platform'), - ('13003970', 'WF Sliding Platform', 'WF Sliding Platform'), - ('13001318', 'WF Sliding Tower Platform', 'WF Sliding Tower Platform'), - ('13001368', 'WF Solid Tower Platform', 'WF Solid Tower Platform'), - ('13000c28', 'WF Tumbling Bridge', 'WF Tumbling Bridge'), - ('13000a34', 'Wall Tiny Star Particle', 'Wall Tiny Star Particle'), - ('13000780', 'Warp', 'Warp'), - ('130007a0', 'Warp Pipe', 'Warp Pipe'), - ('13002f60', 'Warps 60 (Instant Active)', 'Warps 60'), - ('13002f64', 'Warps 64 (Airborne)', 'Warps 64'), - ('13002f68', 'Warps 68 (Hard Air Knockback)', 'Warps 68'), - ('13002f6c', 'Warps 6C (Spin Airborne Circle)', 'Warps 6C'), - ('13002f74', 'Warps 74 (Spin Airborne)', 'Warps 74'), - ('13002f78', 'Warps 78 (Flying)', 'Warps 78'), - ('13002f7c', 'Warps 7C (Painting Star Collect)', 'Warps 7C'), - ('13002f84', 'Warps 84 (Airborne Death)', 'Warps 84'), - ('13002f88', 'Warps 88 (Airborne Star Collect)', 'Warps 88'), - ('13002f8c', 'Warps 8C (Launch Star Collect)', 'Warps 8C'), - ('13002f90', 'Warps 90 (Launch Death)', 'Warps 90'), - ('13002f94', 'Warps 94 (Swimming)', 'Warps 94'), - ('130003bc', 'Water Air Bubble', 'Water Air Bubble'), - ('13004ba8', 'Water Bomb', 'Water Bomb'), - ('13004f10', 'Water Bomb Cannon', 'Water Bomb Cannon'), - ('13004bd4', 'Water Bomb Shadow', 'Water Bomb Shadow'), - ('13004b8c', 'Water Bomb Spawner', 'Water Bomb Spawner'), - ('13002c60', 'Water Droplet', 'Water Droplet'), - ('13002c7c', 'Water Droplet Splash', 'Water Droplet Splash'), - ('130025f8', 'Water Level Diamond', 'Water Level Diamond'), - ('13001c04', 'Water Level Pillar', 'Water Level Pillar'), - ('13000d6c', 'Water Mist', 'Water Mist'), - ('13000dd8', 'Water Mist 2', 'Water Mist 2'), - ('13002c14', 'Water Splash', 'Water Splash'), - ('13003c30', 'Waterfall Sound Loop', 'Waterfall Sound Loop'), - ('13002dc0', 'Wave Trail', 'Wave Trail'), - ('130032a8', 'Whirlpool', 'Whirlpool'), - ('130024dc', 'White Puff 1', 'White Puff 1'), - ('13002500', 'White Puff 2', 'White Puff 2'), - ('130007dc', 'White Puff Explosion', 'White Puff Explosion'), - ('130017f4', 'White Puff Smoke', 'White Puff Smoke'), - ('13002528', 'White Puff Smoke 2', 'White Puff Smoke 2'), - ('13002bb8', 'Whomp King Boss', 'Whomp King Boss'), - ('130048e0', 'Wiggler Body', 'Wiggler Body'), - ('13004898', 'Wiggler Head', 'Wiggler Head'), - ('13000e70', 'Wind', 'Wind'), - ('13003db8', 'Wing Cap', 'Wing Cap'), - ('1300481c', 'Wooden Post', 'Wooden Post'), - ('13002fc0', 'Yellow Background In Menu', 'Yellow Background In Menu'), - ('13002ea8', 'Yellow Ball', 'Yellow Ball'), - ('1300091c', 'Yellow Coin', 'Yellow Coin'), - ('13004538', 'Yoshi', 'Yoshi'), + ("Custom", "Custom", "Custom"), + ("1300407c", "1 Up", "1 Up"), + ("130040b4", "1 Up Jump On Approach", "1 Up Jump On Approach"), + ("13004010", "1 Up Running Away", "1 Up Running Away"), + ("13004044", "1 Up Sliding", "1 Up Sliding"), + ("13003fdc", "1 Up Walking", "1 Up Walking"), + ("13003048", "Act Selector", "Act Selector"), + ("1300302c", "Act Selector Star Type", "Act Selector Star Type"), + ( + "13004ecc", + "Activated Back And Forth Platform", + "Activated Back And Forth Platform", + ), + ("13001778", "Alpha Boo Key", "Alpha Boo Key"), + ("13003c90", "Ambient Sounds", "Ambient Sounds"), + ("1300269c", "Animated Texture", "Animated Texture"), + ("13004ea0", "Animates On Floor Switch Press", "Animates On Floor Switch Press"), + ("13000cc8", "Another Elavator", "Another Elavator"), + ("130013dc", "Another Tilting Platform", "Another Tilting Platform"), + ("13004314", "Arrow Lift", "Arrow Lift"), + ("130028cc", "BBH Tilting Trap Platform", "BBH Tilting Trap Platform"), + ("13000c44", "BBH Tumbling Bridge", "BBH Tumbling Bridge"), + ("13000fc8", "BITFS Sinking Cage Platform", "BITFS Sinking Cage Platform"), + ("13000f9c", "BITFS Sinking Platforms", "BITFS Sinking Platforms"), + ("13001030", "BITFS Tilting Inverted Pyramid", "BITFS Tilting Inverted Pyramid"), + ("13003aa4", "BOB Bowling Ball Spawner", "BOB Bowling Ball Spawner"), + ("13002768", "Balcony Big Boo", "Balcony Big Boo"), + ("13005610", "Beginning Lakitu", "Beginning Lakitu"), + ("13005638", "Beginning Peach", "Beginning Peach"), + ("13001744", "Beta Boo Key", "Beta Boo Key"), + ("130029b4", "Beta Bowser Anchor", "Beta Bowser Anchor"), + ("13000278", "Beta Chest Bottom", "Beta Chest Bottom"), + ("1300029c", "Beta Chest Lid", "Beta Chest Lid"), + ("13001298", "Beta Fish Splash Spawner", "Beta Fish Splash Spawner"), + ("13003420", "Beta Holdable Object", "Beta Holdable Object"), + ("130010b8", "Beta Moving Flames", "Beta Moving Flames"), + ("130010a8", "Beta Moving Flames Spawn", "Beta Moving Flames Spawn"), + ("13001634", "Beta Trampoline Spring", "Beta Trampoline Spring"), + ("13001608", "Beta Trampoline Top", "Beta Trampoline Top"), + ("13003d74", "Big Boulder", "Big Boulder"), + ("13003da0", "Big Boulder Generator", "Big Boulder Generator"), + ("13003660", "Big Bully", "Big Bully"), + ("13003694", "Big Bully With Minions", "Big Bully With Minions"), + ("13003700", "Big Chill Bully", "Big Chill Bully"), + ("13003d4c", "Big Snowman Whole", "Big Snowman Whole"), + ("13005354", "Bird", "Bird"), + ("13003c7c", "Birds Sound Loop", "Birds Sound Loop"), + ("13001254", "Black Smoke Bowser", "Black Smoke Bowser"), + ("13001214", "Black Smoke Mario", "Black Smoke Mario"), + ("1300127c", "Black Smoke Upward", "Black Smoke Upward"), + ("13001984", "Blue Bowser Flame", "Blue Bowser Flame"), + ("13003104", "Blue Coin Jumping", "Blue Coin Jumping"), + ("130030d4", "Blue Coin Sliding", "Blue Coin Sliding"), + ("13002568", "Blue Coin Switch", "Blue Coin Switch"), + ("13001b2c", "Blue Fish", "Blue Fish"), + ("13001a0c", "Blue Flames Group", "Blue Flames Group"), + ("13003174", "Bobomb", "Bobomb"), + ("13000254", "Bobomb Anchor Mario", "Bobomb Anchor Mario"), + ("130031dc", "Bobomb Buddy", "Bobomb Buddy"), + ("13003228", "Bobomb Buddy Opens Cannon", "Bobomb Buddy Opens Cannon"), + ("13003558", "Bobomb Bully Death Smoke", "Bobomb Bully Death Smoke"), + ("130035b0", "Bobomb Explosion Bubble", "Bobomb Explosion Bubble"), + ("13003600", "Bobomb Explosion Bubble 3600", "Bobomb Explosion Bubble 3600"), + ("130031ac", "Bobomb Fuse Smoke", "Bobomb Fuse Smoke"), + ("130027e4", "Boo", "Boo"), + ("13002898", "Boo Boss Spawned Bridge", "Boo Boss Spawned Bridge"), + ("1300167c", "Boo Cage", "Boo Cage"), + ("130026d4", "Boo In Castle", "Boo In Castle"), + ("13002710", "Boo With Cage", "Boo With Cage"), + ("130050f4", "Book Switch", "Book Switch"), + ("130050b4", "Bookend Spawn", "Bookend Spawn"), + ("13001168", "Bouncing Fireball", "Bouncing Fireball"), + ("13001184", "Bouncing Fireball Flame", "Bouncing Fireball Flame"), + ("13003a58", "Bowling Ball", "Bowling Ball"), + ("13001850", "Bowser", "Bowser"), + ("130018cc", "Bowser Body Anchor", "Bowser Body Anchor"), + ("130037ec", "Bowser Bomb", "Bowser Bomb"), + ("1300381c", "Bowser Bomb Explosion", "Bowser Bomb Explosion"), + ("13003840", "Bowser Bomb Smoke", "Bowser Bomb Smoke"), + ("13003ee4", "Bowser Course Red Coin Star", "Bowser Course Red Coin Star"), + ("13001904", "Bowser Flame Spawn", "Bowser Flame Spawn"), + ("130016e4", "Bowser Key", "Bowser Key"), + ("13001bd4", "Bowser Key Course Exit", "Bowser Key Course Exit"), + ("13001bb4", "Bowser Key Unlock Door", "Bowser Key Unlock Door"), + ("130011d0", "Bowser Shock Wave", "Bowser Shock Wave"), + ("130022d8", "Bowser Sub Door", "Bowser Sub Door"), + ("13001828", "Bowser Tail Anchor", "Bowser Tail Anchor"), + ("13002308", "Bowsers Sub", "Bowsers Sub"), + ("13000db4", "Break Box Triangle", "Break Box Triangle"), + ("130014e0", "Breakable Box", "Breakable Box"), + ("13004218", "Breakable Box Small", "Breakable Box Small"), + ("13000d98", "Breath Particle Spawner", "Breath Particle Spawner"), + ("1300220c", "Bub", "Bub"), + ("130055dc", "Bubba", "Bubba"), + ("130002e4", "Bubble Maybe", "Bubble Maybe"), + ("130002b8", "Bubble Particle Spawner", "Bubble Particle Spawner"), + ("13002cb0", "Bubble Splash", "Bubble Splash"), + ("1300179c", "Bullet Bill", "Bullet Bill"), + ("13000600", "Bullet Bill Cannon", "Bullet Bill Cannon"), + ("130033bc", "Butterfly", "Butterfly"), + ("130015c0", "CCM Touched Star Spawn", "CCM Touched Star Spawn"), + ("13004954", "Camera Lakitu", "Camera Lakitu"), + ("130004a8", "Cannon", "Cannon"), + ("130004e4", "Cannon Barrel", "Cannon Barrel"), + ("13004f28", "Cannon Barrel Bubbles", "Cannon Barrel Bubbles"), + ("13000500", "Cannon Base Unused", "Cannon Base Unused"), + ("13003274", "Cannon Closed", "Cannon Closed"), + ("130001cc", "Cap Switch", "Cap Switch"), + ("130001ac", "Cap Switch Base", "Cap Switch Base"), + ("13003454", "Carry Something 1", "Carry Something 1"), + ("1300345c", "Carry Something 2", "Carry Something 2"), + ("13003464", "Carry Something 3", "Carry Something 3"), + ("1300346c", "Carry Something 4", "Carry Something 4"), + ("13003474", "Carry Something 5", "Carry Something 5"), + ("1300347c", "Carry Something 6", "Carry Something 6"), + ("13003c58", "Castle Flag Waving", "Castle Flag Waving"), + ("13002a5c", "Castle Floor Trap", "Castle Floor Trap"), + ("13003868", "Celebration Star", "Celebration Star"), + ("13003888", "Celebration Star Sparkle", "Celebration Star Sparkle"), + ("1300478c", "Chain Chomp", "Chain Chomp"), + ("130047e4", "Chain Chomp Chain Part", "Chain Chomp Chain Part"), + ("13004868", "Chain Chomp Gate", "Chain Chomp Gate"), + ("13001b70", "Checkerboard Elevator Group", "Checkerboard Elevator Group"), + ("13001b88", "Checkerboard Platform Sub", "Checkerboard Platform Sub"), + ("130021e4", "Chirp Chirp", "Chirp Chirp"), + ("130021f4", "Chirp Chirp Unused", "Chirp Chirp Unused"), + ("13000528", "Chuckya", "Chuckya"), + ("13000584", "Chuckya Anchor Mario", "Chuckya Anchor Mario"), + ("13003388", "Circling Amp", "Circling Amp"), + ("13005440", "Clam Shell", "Clam Shell"), + ("13001c8c", "Clock Hour Hand", "Clock Hour Hand"), + ("13001c7c", "Clock Minute Hand", "Clock Minute Hand"), + ("13004988", "Cloud", "Cloud"), + ("130049ac", "Cloud Part", "Cloud Part"), + ("13005414", "Coffin", "Coffin"), + ("130053f4", "Coffin Spawner", "Coffin Spawner"), + ("130008ec", "Coin Formation", "Coin Formation"), + ("130008d0", "Coin Formation Spawn", "Coin Formation Spawn"), + ("13000888", "Coin Inside Boo", "Coin Inside Boo"), + ("130009e0", "Coin Sparkles", "Coin Sparkles"), + ("130041bc", "Controllable Platform", "Controllable Platform"), + ("130041f0", "Controllable Platform Sub", "Controllable Platform Sub"), + ("130027d0", "Courtyard Boo Triplet", "Courtyard Boo Triplet"), + ("13001098", "Cut Out Object", "Cut Out Object"), + ("13001000", "DDD Moving Pole", "DDD Moving Pole"), + ("13005528", "DDD Pole", "DDD Pole"), + ("13001c34", "DDD Warp", "DDD Warp"), + ("13002f70", "Death Warp", "Death Warp"), + ("1300442c", "Decorative Pendulum", "Decorative Pendulum"), + ("13000e3c", "Dirt Particle Spawner", "Dirt Particle Spawner"), + ("13005504", "Donut Platform", "Donut Platform"), + ("130054ec", "Donut Platform Spawner", "Donut Platform Spawner"), + ("13000b0c", "Door", "Door"), + ("13000afc", "Door Warp", "Door Warp"), + ("13004f90", "Dorrie", "Dorrie"), + ("1300565c", "End Birds 1", "End Birds 1"), + ("13005680", "End Birds 2", "End Birds 2"), + ("13000eac", "End Peach", "End Peach"), + ("13000e88", "End Toad", "End Toad"), + ("13004918", "Enemy Lakitu", "Enemy Lakitu"), + ("13002250", "Exclamation Box", "Exclamation Box"), + ("13000720", "Exit Podium Warp", "Exit Podium Warp"), + ("13003510", "Explosion", "Explosion"), + ("130052b4", "Eyerok Boss", "Eyerok Boss"), + ("130052d0", "Eyerok Hand", "Eyerok Hand"), + ("1300075c", "Fading Warp", "Fading Warp"), + ("13001958", "Falling Bowser Platform", "Falling Bowser Platform"), + ("130043a0", "Falling Pillar", "Falling Pillar"), + ("130043c4", "Falling Pillar Hitbox", "Falling Pillar Hitbox"), + ("13004b44", "Ferris Wheel Axle", "Ferris Wheel Axle"), + ("13004b6c", "Ferris Wheel Platform", "Ferris Wheel Platform"), + ("130011ec", "Fire Particle Spawner", "Fire Particle Spawner"), + ("13005120", "Fire Piranha Plant", "Fire Piranha Plant"), + ("1300518c", "Fire Spitter", "Fire Spitter"), + ("13002178", "Fish", "Fish"), + ("1300213c", "Fish 2", "Fish 2"), + ("1300214c", "Fish 3", "Fish 3"), + ("13000494", "Fish Group", "Fish Group"), + ("13000c84", "Flame", "Flame"), + ("13001a30", "Flame Bouncing", "Flame Bouncing"), + ("13001aa4", "Flame Bowser", "Flame Bowser"), + ("130019c8", "Flame Floating Landing", "Flame Floating Landing"), + ("13001ae8", "Flame Large Burning Out", "Flame Large Burning Out"), + ("13001a74", "Flame Moving Forward Growing", "Flame Moving Forward Growing"), + ("13001108", "Flamethrower", "Flamethrower"), + ("13001124", "Flamethrower Flame", "Flamethrower Flame"), + ("13001468", "Floor Switch Animates Object", "Floor Switch Animates Object"), + ("13001478", "Floor Switch Grills", "Floor Switch Grills"), + ("13001484", "Floor Switch Hardcoded Model", "Floor Switch Hardcoded Model"), + ("130014ac", "Floor Switch Hidden Objects", "Floor Switch Hidden Objects"), + ("13002a7c", "Floor Trap In Castle", "Floor Trap In Castle"), + ("130046dc", "Fly Guy", "Fly Guy"), + ("130051ac", "Flyguy Flame", "Flyguy Flame"), + ("1300506c", "Flying Bookend", "Flying Bookend"), + ("13003a30", "Free Bowling Ball", "Free Bowling Ball"), + ("13002790", "Ghost Hunt Big Boo", "Ghost Hunt Big Boo"), + ("13002804", "Ghost Hunt Boo", "Ghost Hunt Boo"), + ("13000118", "Giant Pole", "Giant Pole"), + ("13000a14", "Golden Coin Sparkles", "Golden Coin Sparkles"), + ("1300472c", "Goomba", "Goomba"), + ("13004770", "Goomba Triplet Spawner", "Goomba Triplet Spawner"), + ("13001714", "Grand Star", "Grand Star"), + ("13000b58", "Grindel", "Grindel"), + ("13000d30", "HMC Elevator Platform", "HMC Elevator Platform"), + ("130028fc", "Haunted Bookshelf", "Haunted Bookshelf"), + ("130050d4", "Haunted Bookshelf Manager", "Haunted Bookshelf Manager"), + ("13004fd4", "Haunted Chair", "Haunted Chair"), + ("13001548", "Heave Ho", "Heave Ho"), + ("130015a4", "Heave Ho Throw Mario", "Heave Ho Throw Mario"), + ("130040ec", "Hidden 1 Up", "Hidden 1 Up"), + ("13004148", "Hidden 1 Up In Pole", "Hidden 1 Up In Pole"), + ("130041a4", "Hidden 1 Up In Pole Spawner", "Hidden 1 Up In Pole Spawner"), + ("13004180", "Hidden 1 Up In Pole Trigger", "Hidden 1 Up In Pole Trigger"), + ("13004124", "Hidden 1 Up Trigger", "Hidden 1 Up Trigger"), + ("13003cb8", "Hidden At 120 Stars", "Hidden At 120 Stars"), + ("13002588", "Hidden Blue Coin", "Hidden Blue Coin"), + ("130014bc", "Hidden Object", "Hidden Object"), + ("13003e8c", "Hidden Red Coin Star", "Hidden Red Coin Star"), + ("1300286c", "Hidden Staircase Step", "Hidden Staircase Step"), + ("13003efc", "Hidden Star", "Hidden Star"), + ("13003f1c", "Hidden Star Trigger", "Hidden Star Trigger"), + ("13003354", "Homing Amp", "Homing Amp"), + ("130033ec", "Hoot", "Hoot"), + ("13000a98", "Hor Star Particle Spawner", "Hor Star Particle Spawner"), + ("1300525c", "Horizontal Grindel", "Horizontal Grindel"), + ("13002ce0", "Idle Water Wave", "Idle Water Wave"), + ("130016b8", "Igloo", "Igloo"), + ("1300246c", "In Sunken Ship", "In Sunken Ship"), + ("13002480", "In Sunken Ship 2", "In Sunken Ship 2"), + ("130023ec", "In Sunken Ship 3", "In Sunken Ship 3"), + ("13002620", "Initialize Changing Water Level", "Initialize Changing Water Level"), + ("130029b0", "Inside Cannon", "Inside Cannon"), + ("130056a4", "Intro Scene", "Intro Scene"), + ("13001bf4", "Invisible Objects Under Bridge", "Invisible Objects Under Bridge"), + ("13004400", "JRB Floating Box", "JRB Floating Box"), + ("130042e4", "JRB Floating Platform", "JRB Floating Platform"), + ("130023a4", "JRB Sliding Box", "JRB Sliding Box"), + ("130032c8", "Jet Stream", "Jet Stream"), + ("13003738", "Jet Stream Ring Spawner", "Jet Stream Ring Spawner"), + ("13003750", "Jet Stream Water Ring", "Jet Stream Water Ring"), + ("13001650", "Jumping Box", "Jumping Box"), + ("1300066c", "Kickable Board", "Kickable Board"), + ("130001f4", "King Bobomb", "King Bobomb"), + ("13005310", "Klepto", "Klepto"), + ("13004580", "Koopa", "Koopa"), + ("130045f8", "Koopa Flag", "Koopa Flag"), + ("130045d0", "Koopa Race Endpoint", "Koopa Race Endpoint"), + ("13001f3c", "Koopa Shell", "Koopa Shell"), + ("13001f68", "Koopa Shell Flame", "Koopa Shell Flame"), + ("13000708", "Koopa Shell Underwater", "Koopa Shell Underwater"), + ("13002068", "LLL Bowser Puzzle", "LLL Bowser Puzzle"), + ("13002038", "LLL Bowser Puzzle Piece", "LLL Bowser Puzzle Piece"), + ("130038e8", "LLL Drawbridge", "LLL Drawbridge"), + ("130038d0", "LLL Drawbridge Spawner", "LLL Drawbridge Spawner"), + ("13001e30", "LLL Floating Wood Bridge", "LLL Floating Wood Bridge"), + ("13002018", "LLL Hexagonal Mesh", "LLL Hexagonal Mesh"), + ( + "13001d78", + "LLL Moving Octagonal Mesh Platform", + "LLL Moving Octagonal Mesh Platform", + ), + ("13003fa4", "LLL Rolling Log", "LLL Rolling Log"), + ( + "13001da8", + "LLL Rotating Block With Fire Bars", + "LLL Rotating Block With Fire Bars", + ), + ("13001dcc", "LLL Rotating Hex Flame", "LLL Rotating Hex Flame"), + ("13001d14", "LLL Rotating Hexagonal Platform", "LLL Rotating Hexagonal Platform"), + ("13001e6c", "LLL Rotating Hexagonal Ring", "LLL Rotating Hexagonal Ring"), + ( + "13001e94", + "LLL Sinking Rectangular Platform", + "LLL Sinking Rectangular Platform", + ), + ("13001d40", "LLL Sinking Rock Block", "LLL Sinking Rock Block"), + ("13001ec4", "LLL Sinking Square Platforms", "LLL Sinking Square Platforms"), + ("13001ef8", "LLL Tilting Inverted Pyramid", "LLL Tilting Inverted Pyramid"), + ("13000c64", "LLL Tumbling Bridge", "LLL Tumbling Bridge"), + ("13003f78", "LLL Volcano Falling Trap", "LLL Volcano Falling Trap"), + ("13001e04", "LLL Wood Piece", "LLL Wood Piece"), + ("13003940", "Large Bomp", "Large Bomp"), + ("1300215c", "Large Fish Group", "Large Fish Group"), + ("13001390", "Leaf Particle Spawner", "Leaf Particle Spawner"), + ("13001cb0", "Macro Ukiki", "Macro Ukiki"), + ("13005024", "Mad Piano", "Mad Piano"), + ("13004370", "Manta Ray", "Manta Ray"), + ("130037e0", "Manta Ray Ring Manager", "Manta Ray Ring Manager"), + ("13003798", "Manta Ray Water Ring", "Manta Ray Water Ring"), + ("13002ec0", "Mario", "Mario"), + ("13002fe4", "Menu Button", "Menu Button"), + ("13003008", "Menu Button Manager", "Menu Button Manager"), + ("13002968", "Merry Go Round", "Merry Go Round"), + ("1300277c", "Merry Go Round Big Boo", "Merry Go Round Big Boo"), + ("130027f4", "Merry Go Round Boo", "Merry Go Round Boo"), + ("13002684", "Merry Go Round Boo Manager", "Merry Go Round Boo Manager"), + ("1300292c", "Mesh Elevator", "Mesh Elevator"), + ("130032e0", "Message Panel", "Message Panel"), + ("13003dd8", "Metal Cap", "Metal Cap"), + ("130044fc", "Mips", "Mips"), + ("13000e24", "Mist Circ Particle Spawner", "Mist Circ Particle Spawner"), + ("130024ac", "Mist Particle Spawner", "Mist Particle Spawner"), + ("13001c58", "Moat Grills", "Moat Grills"), + ("130039a0", "Moneybag", "Moneybag"), + ("130039d4", "Moneybag Hidden", "Moneybag Hidden"), + ("13004a00", "Monty Mole", "Monty Mole"), + ("13004a58", "Monty Mole Hole", "Monty Mole Hole"), + ("13004a78", "Monty Mole Rock", "Monty Mole Rock"), + ("130030a4", "Moving Blue Coin", "Moving Blue Coin"), + ("13003068", "Moving Yellow Coin", "Moving Yellow Coin"), + ("13004dbc", "Mr. Blizzard", "Mr. Blizzard"), + ("13004e08", "Mr. Blizzard Snowball", "Mr. Blizzard Snowball"), + ("13000054", "Mr. I ", "Mr. I "), + ("13000830", "Mr. I Blue Coin", "Mr. I Blue Coin"), + ("1300008c", "Mr. I Body", "Mr. I Body"), + ("130000ac", "Mr. I Particle", "Mr. I Particle"), + ("13003df8", "Normal Cap", "Normal Cap"), + ("13003484", "Object Bubble", "Object Bubble"), + ("13002d28", "Object Water Splash", "Object Water Splash"), + ("130034c4", "Object Water Wave", "Object Water Wave"), + ("13002db0", "Object Wave Trail", "Object Wave Trail"), + ("13004e78", "Octagonal Platform Rotating", "Octagonal Platform Rotating"), + ("1300090c", "One Coin", "One Coin"), + ("130025c0", "Openable Cage Door", "Openable Cage Door"), + ("130025e0", "Openable Grill", "Openable Grill"), + ("13004348", "Orange Number", "Orange Number"), + ("13002f80", "Painting Death Warp", "Painting Death Warp"), + ("130020d8", "Penguin Baby", "Penguin Baby"), + ("130053c4", "Penguin Race Finish Line", "Penguin Race Finish Line"), + ("130053dc", "Penguin Race Shortcut Check", "Penguin Race Shortcut Check"), + ("130043e0", "Pillar Base", "Pillar Base"), + ("13001fbc", "Piranha Plant", "Piranha Plant"), + ("1300142c", "Piranha Plant Bubble", "Piranha Plant Bubble"), + ("13001448", "Piranha Plant Waking Bubbles", "Piranha Plant Waking Bubbles"), + ("13003a08", "Pit Bowling Ball", "Pit Bowling Ball"), + ("13004ab0", "Platform On Track", "Platform On Track"), + ("13002998", "Plays Music Track When Touched", "Plays Music Track When Touched"), + ("13000428", "Plunge Bubble", "Plunge Bubble"), + ("13004634", "Pokey", "Pokey"), + ("13004668", "Pokey Body Part", "Pokey Body Part"), + ("13000144", "Pole Grabbing", "Pole Grabbing"), + ("13000a78", "Pound Tiny Star Particle", "Pound Tiny Star Particle"), + ("13000abc", "Punch Tiny Triangle", "Punch Tiny Triangle"), + ("130000f8", "Purple Particle", "Purple Particle"), + ("13002558", "Purple Switch Hidden Boxes", "Purple Switch Hidden Boxes"), + ("13001518", "Pushable Metal Box", "Pushable Metal Box"), + ("13003b60", "Pyramid Elevator", "Pyramid Elevator"), + ( + "13003b98", + "Pyramid Elevator Trajectory Marker Ball", + "Pyramid Elevator Trajectory Marker Ball", + ), + ("13003c0c", "Pyramid Pillar Touch Detector", "Pyramid Pillar Touch Detector"), + ("13003bb4", "Pyramid Top", "Pyramid Top"), + ("13003bec", "Pyramid Top Fragment", "Pyramid Top Fragment"), + ("13003ae0", "RR Cruiser Wing", "RR Cruiser Wing"), + ("13000cfc", "RR Elevator Platform", "RR Elevator Platform"), + ("130010d8", "RR Rotating Bridge Platform", "RR Rotating Bridge Platform"), + ("13005380", "Racing Penguin", "Racing Penguin"), + ("13002fa0", "Random Animated Texture", "Random Animated Texture"), + ("13004ef8", "Recovery Heart", "Recovery Heart"), + ("13003eac", "Red Coin", "Red Coin"), + ("1300556c", "Red Coin Star Marker", "Red Coin Star Marker"), + ("13003614", "Respawner", "Respawner"), + ("130022b8", "Rock Solid", "Rock Solid"), + ("130006d8", "Rotating Counter Clockwise", "Rotating Counter Clockwise"), + ("1300227c", "Rotating Exclamation Mark", "Rotating Exclamation Mark"), + ("130005b4", "Rotating Platform", "Rotating Platform"), + ("13002e3c", "SL Snowman Wind", "SL Snowman Wind"), + ("13002e58", "SL Walking Penguin", "SL Walking Penguin"), + ("13003b30", "SSL Moving Pyramid Wall", "SSL Moving Pyramid Wall"), + ("13003ca4", "Sand Sound Loop", "Sand Sound Loop"), + ("13002b5c", "Scuttlebug", "Scuttlebug"), + ("13002ba0", "Scuttlebug Spawn", "Scuttlebug Spawn"), + ("13003134", "Seaweed", "Seaweed"), + ("13003158", "Seaweed Bundle", "Seaweed Bundle"), + ("13004b1c", "Seesaw Platform", "Seesaw Platform"), + ("13002d7c", "Shallow Water Splash", "Shallow Water Splash"), + ("13002d50", "Shallow Water Wave", "Shallow Water Wave"), + ("130023d0", "Ship Part 3", "Ship Part 3"), + ("13003324", "Sign On Wall", "Sign On Wall"), + ("130009a4", "Single Coin Gets Spawned", "Single Coin Gets Spawned"), + ("13005468", "Skeeter", "Skeeter"), + ("130054a0", "Skeeter Wave", "Skeeter Wave"), + ("13004e4c", "Sliding Platform 2", "Sliding Platform 2"), + ("13004244", "Sliding Snow Mound", "Sliding Snow Mound"), + ("13003910", "Small Bomp", "Small Bomp"), + ("1300362c", "Small Bully", "Small Bully"), + ("130036c8", "Small Chill Bully", "Small Chill Bully"), + ("13000400", "Small Particle", "Small Particle"), + ("1300046c", "Small Particle Bubbles", "Small Particle Bubbles"), + ("13000444", "Small Particle Snow", "Small Particle Snow"), + ("130020e8", "Small Penguin", "Small Penguin"), + ("13005158", "Small Piranha Flame", "Small Piranha Flame"), + ("13000338", "Small Water Wave", "Small Water Wave"), + ("13000398", "Small Water Wave 398", "Small Water Wave 398"), + ("13002bcc", "Small Whomp", "Small Whomp"), + ("13003588", "Smoke", "Smoke"), + ("13001da4", "Snow Ball", "Snow Ball"), + ("13004270", "Snow Mound Spawn", "Snow Mound Spawn"), + ("13000e58", "Snow Particle Spawner", "Snow Particle Spawner"), + ("13003d34", "Snowmans Body Checkpoint", "Snowmans Body Checkpoint"), + ("13003ce4", "Snowmans Bottom", "Snowmans Bottom"), + ("13003d0c", "Snowmans Head", "Snowmans Head"), + ("130051e0", "Snufit", "Snufit"), + ("1300521c", "Snufit Balls", "Snufit Balls"), + ("1300229c", "Sound Spawner", "Sound Spawner"), + ("13002ad0", "Sparkle", "Sparkle"), + ("13002b08", "Sparkle Particle Spawner", "Sparkle Particle Spawner"), + ("13002af0", "Sparkle Spawn", "Sparkle Spawn"), + ("130007f8", "Spawned Star", "Spawned Star"), + ("1300080c", "Spawned Star No Level Exit", "Spawned Star No Level Exit"), + ("13003b00", "Spindel", "Spindel"), + ("130012b4", "Spindrift", "Spindrift"), + ("130049c8", "Spiny", "Spiny"), + ("13001408", "Squarish Path Moving", "Squarish Path Moving"), + ("13001064", "Squishable Platform", "Squishable Platform"), + ("13003e3c", "Star", "Star"), + ("13000000", "Star Door", "Star Door"), + ( + "130038b0", + "Star Key Collection Puff Spawner", + "Star Key Collection Puff Spawner", + ), + ("13003e64", "Star Spawn Coordinates", "Star Spawn Coordinates"), + ("130029e4", "Static Checkered Platform", "Static Checkered Platform"), + ("13002a48", "Static Object", "Static Object"), + ("13002e20", "Strong Wind Particle", "Strong Wind Particle"), + ("130016ac", "Stub", "Stub"), + ("13001d0c", "Stub 1D0C", "Stub 1D0C"), + ("13001d70", "Stub 1D70", "Stub 1D70"), + ("1300241c", "Sunken Ship Part", "Sunken Ship Part"), + ("1300244c", "Sunken Ship Part 2", "Sunken Ship Part 2"), + ("1300243c", "Sunken Ship Set Rotation", "Sunken Ship Set Rotation"), + ("13002338", "Sushi Shark", "Sushi Shark"), + ("13002388", "Sushi Shark Collision Child", "Sushi Shark Collision Child"), + ("130054b8", "Swing Platform", "Swing Platform"), + ("13004698", "Swoop", "Swoop"), + ("13003ac8", "THI Bowling Ball Spawner", "THI Bowling Ball Spawner"), + ("13000174", "THI Huge Island Top", "THI Huge Island Top"), + ("13000194", "THI Tiny Island Top", "THI Tiny Island Top"), + ("13004d64", "TTC 2D Rotator", "TTC 2D Rotator"), + ("13004ccc", "TTC Cog", "TTC Cog"), + ("13004d28", "TTC Elevator", "TTC Elevator"), + ("13004c94", "TTC Moving Bar", "TTC Moving Bar"), + ("13004c24", "TTC Pendulum", "TTC Pendulum"), + ("13004cf8", "TTC Pit Block", "TTC Pit Block"), + ("13004bf0", "TTC Rotating Solid", "TTC Rotating Solid"), + ("13004d90", "TTC Spinner", "TTC Spinner"), + ("13004c5c", "TTC Treadmill", "TTC Treadmill"), + ("13003a80", "TTM Bowling Ball Spawner", "TTM Bowling Ball Spawner"), + ("13003f40", "TTM Rolling Log", "TTM Rolling Log"), + ("13001b54", "Tank Fish Group", "Tank Fish Group"), + ("13000940", "Temporary Yellow Coin", "Temporary Yellow Coin"), + ("13000984", "Ten Coins Spawn", "Ten Coins Spawn"), + ("13000964", "Three Coins Spawn", "Three Coins Spawn"), + ("13000bc8", "Thwomp", "Thwomp"), + ("13000b8c", "Thwomp 2", "Thwomp 2"), + ("13001920", "Tilting Bowser Lava Platform", "Tilting Bowser Lava Platform"), + ("13002e04", "Tiny Strong Wind Particle", "Tiny Strong Wind Particle"), + ("13002ef8", "Toad Message", "Toad Message"), + ("130005d8", "Tower", "Tower"), + ("130006a4", "Tower Door", "Tower Door"), + ("130012f4", "Tower Platform Group", "Tower Platform Group"), + ("13001f90", "Tox Box", "Tox Box"), + ("13004af4", "Track Ball", "Track Ball"), + ("130044b8", "Treasure Chest Bottom", "Treasure Chest Bottom"), + ("130044e0", "Treasure Chest Top", "Treasure Chest Top"), + ("13004494", "Treasure Chests", "Treasure Chests"), + ("13004470", "Treasure Chests JRB", "Treasure Chests JRB"), + ("1300444c", "Treasure Chests Ship", "Treasure Chests Ship"), + ("13002aa4", "Tree", "Tree"), + ("130013c4", "Tree Leaf", "Tree Leaf"), + ("130013a8", "Tree Snow", "Tree Snow"), + ("13000ad8", "Triangle Particle Spawner", "Triangle Particle Spawner"), + ("13005598", "Triplet Butterfly", "Triplet Butterfly"), + ("13000c04", "Tumbling Bridge Platform", "Tumbling Bridge Platform"), + ("13002088", "Tuxies Mother", "Tuxies Mother"), + ("13002650", "Tweester", "Tweester"), + ("13002634", "Tweester Sand Particle", "Tweester Sand Particle"), + ("13000f08", "Ukiki", "Ukiki"), + ("13000f48", "Ukiki Cage", "Ukiki Cage"), + ("13000f14", "Ukiki Cage Child", "Ukiki Cage Child"), + ("13000f2c", "Ukiki Cage Star", "Ukiki Cage Star"), + ("13004f40", "Unagi", "Unagi"), + ("13004f78", "Unagi Subobject", "Unagi Subobject"), + ("13002f40", "Unlock Door Star", "Unlock Door Star"), + ("130005a8", "Unused 05A8", "Unused 05A8"), + ("13000dfc", "Unused 0DFC", "Unused 0DFC"), + ("13001820", "Unused 1820", "Unused 1820"), + ("13001f30", "Unused 1F30", "Unused 1F30"), + ("130020e0", "Unused 20E0", "Unused 20E0"), + ("13002a10", "Unused 2A10", "Unused 2A10"), + ("13002a54", "Unused 2A54", "Unused 2A54"), + ("13002a20", "Unused Fake Star", "Unused Fake Star"), + ("13000ed0", "Unused Particle Spawn", "Unused Particle Spawn"), + ("130015e4", "Unused Poundable Platform", "Unused Poundable Platform"), + ("13003e1c", "Vanish Cap", "Vanish Cap"), + ("13000a54", "Vert Star Particle Spawner", "Vert Star Particle Spawner"), + ("13001e4c", "Volcano Flames", "Volcano Flames"), + ("13003c44", "Volcano Sound Loop", "Volcano Sound Loop"), + ("13002194", "WDW Express Elevator", "WDW Express Elevator"), + ("130021c0", "WDW Express Elevator Platform", "WDW Express Elevator Platform"), + ( + "130042b4", + "WDW Rectangular Floating Platform", + "WDW Rectangular Floating Platform", + ), + ("13004284", "WDW Square Floating Platform", "WDW Square Floating Platform"), + ("13000638", "WF Breakable Wall Left", "WF Breakable Wall Left"), + ("13000624", "WF Breakable Wall Right", "WF Breakable Wall Right"), + ("13001340", "WF Elevator Tower Platform", "WF Elevator Tower Platform"), + ("130006e0", "WF Rotating Wooden Platform", "WF Rotating Wooden Platform"), + ("13003970", "WF Sliding Platform", "WF Sliding Platform"), + ("13001318", "WF Sliding Tower Platform", "WF Sliding Tower Platform"), + ("13001368", "WF Solid Tower Platform", "WF Solid Tower Platform"), + ("13000c28", "WF Tumbling Bridge", "WF Tumbling Bridge"), + ("13000a34", "Wall Tiny Star Particle", "Wall Tiny Star Particle"), + ("13000780", "Warp", "Warp"), + ("130007a0", "Warp Pipe", "Warp Pipe"), + ("13002f60", "Warps 60 (Instant Active)", "Warps 60"), + ("13002f64", "Warps 64 (Airborne)", "Warps 64"), + ("13002f68", "Warps 68 (Hard Air Knockback)", "Warps 68"), + ("13002f6c", "Warps 6C (Spin Airborne Circle)", "Warps 6C"), + ("13002f74", "Warps 74 (Spin Airborne)", "Warps 74"), + ("13002f78", "Warps 78 (Flying)", "Warps 78"), + ("13002f7c", "Warps 7C (Painting Star Collect)", "Warps 7C"), + ("13002f84", "Warps 84 (Airborne Death)", "Warps 84"), + ("13002f88", "Warps 88 (Airborne Star Collect)", "Warps 88"), + ("13002f8c", "Warps 8C (Launch Star Collect)", "Warps 8C"), + ("13002f90", "Warps 90 (Launch Death)", "Warps 90"), + ("13002f94", "Warps 94 (Swimming)", "Warps 94"), + ("130003bc", "Water Air Bubble", "Water Air Bubble"), + ("13004ba8", "Water Bomb", "Water Bomb"), + ("13004f10", "Water Bomb Cannon", "Water Bomb Cannon"), + ("13004bd4", "Water Bomb Shadow", "Water Bomb Shadow"), + ("13004b8c", "Water Bomb Spawner", "Water Bomb Spawner"), + ("13002c60", "Water Droplet", "Water Droplet"), + ("13002c7c", "Water Droplet Splash", "Water Droplet Splash"), + ("130025f8", "Water Level Diamond", "Water Level Diamond"), + ("13001c04", "Water Level Pillar", "Water Level Pillar"), + ("13000d6c", "Water Mist", "Water Mist"), + ("13000dd8", "Water Mist 2", "Water Mist 2"), + ("13002c14", "Water Splash", "Water Splash"), + ("13003c30", "Waterfall Sound Loop", "Waterfall Sound Loop"), + ("13002dc0", "Wave Trail", "Wave Trail"), + ("130032a8", "Whirlpool", "Whirlpool"), + ("130024dc", "White Puff 1", "White Puff 1"), + ("13002500", "White Puff 2", "White Puff 2"), + ("130007dc", "White Puff Explosion", "White Puff Explosion"), + ("130017f4", "White Puff Smoke", "White Puff Smoke"), + ("13002528", "White Puff Smoke 2", "White Puff Smoke 2"), + ("13002bb8", "Whomp King Boss", "Whomp King Boss"), + ("130048e0", "Wiggler Body", "Wiggler Body"), + ("13004898", "Wiggler Head", "Wiggler Head"), + ("13000e70", "Wind", "Wind"), + ("13003db8", "Wing Cap", "Wing Cap"), + ("1300481c", "Wooden Post", "Wooden Post"), + ("13002fc0", "Yellow Background In Menu", "Yellow Background In Menu"), + ("13002ea8", "Yellow Ball", "Yellow Ball"), + ("1300091c", "Yellow Coin", "Yellow Coin"), + ("13004538", "Yoshi", "Yoshi"), ] enumModelIDs = [ - ('Custom', 'Custom', 'Custom'), - ('MODEL_1UP', '1 Up', '1 Up'), - ('MODEL_AMP', 'Amp', 'Amp'), - ('MODEL_BBH_HAUNTED_DOOR', 'BBH Haunted Door', 'BBH Haunted Door'), - ('MODEL_BBH_MERRY_GO_ROUND', 'BBH Merry Go Round', 'BBH Merry Go Round'), - ('MODEL_BBH_MESH_ELEVATOR', 'BBH Mesh Elevator', 'BBH Mesh Elevator'), - ('MODEL_BBH_MOVING_BOOKSHELF', 'BBH Moving Bookshelf', 'BBH Moving Bookshelf'), - ('MODEL_BBH_STAIRCASE_STEP', 'BBH Staircase Step', 'BBH Staircase Step'), - ('MODEL_BBH_TILTING_FLOOR_PLATFORM', 'BBH Tilting Floor Platform', 'BBH Tilting Floor Platform'), - ('MODEL_BBH_TUMBLING_PLATFORM', 'BBH Tumbling Platform', 'BBH Tumbling Platform'), - ('MODEL_BBH_TUMBLING_PLATFORM_PART', 'BBH Tumbling Platform Part', 'BBH Tumbling Platform Part'), - ('MODEL_BBH_WOODEN_TOMB', 'BBH Wooden Tomb', 'BBH Wooden Tomb'), - ('MODEL_BITDW_BLUE_PLATFORM', 'BITDW Blue Platform', 'BITDW Blue Platform'), - ('MODEL_BITDW_FERRIS_WHEEL_AXLE', 'BITDW Ferris Wheel Axle', 'BITDW Ferris Wheel Axle'), - ('MODEL_BITDW_SEESAW_PLATFORM', 'BITDW Seesaw Platform', 'BITDW Seesaw Platform'), - ('MODEL_BITDW_SLIDING_PLATFORM', 'BITDW Sliding Platform', 'BITDW Sliding Platform'), - ('MODEL_BITDW_SQUARE_PLATFORM', 'BITDW Square Platform', 'BITDW Square Platform'), - ('MODEL_BITDW_STAIRCASE', 'BITDW Staircase', 'BITDW Staircase'), - ('MODEL_BITDW_STAIRCASE_FRAME1', 'BITDW Staircase Frame1', 'BITDW Staircase Frame1'), - ('MODEL_BITDW_STAIRCASE_FRAME2', 'BITDW Staircase Frame2', 'BITDW Staircase Frame2'), - ('MODEL_BITDW_STAIRCASE_FRAME3', 'BITDW Staircase Frame3', 'BITDW Staircase Frame3'), - ('MODEL_BITDW_STAIRCASE_FRAME4', 'BITDW Staircase Frame4', 'BITDW Staircase Frame4'), - ('MODEL_BITDW_WARP_PIPE', 'BITDW Warp Pipe', 'BITDW Warp Pipe'), - ('MODEL_BITFS_BLUE_POLE', 'BITFS Blue Pole', 'BITFS Blue Pole'), - ('MODEL_BITFS_ELEVATOR', 'BITFS Elevator', 'BITFS Elevator'), - ('MODEL_BITFS_MOVING_SQUARE_PLATFORM', 'BITFS Moving Square Platform', 'BITFS Moving Square Platform'), - ('MODEL_BITFS_PLATFORM_ON_TRACK', 'BITFS Platform On Track', 'BITFS Platform On Track'), - ('MODEL_BITFS_SEESAW_PLATFORM', 'BITFS Seesaw Platform', 'BITFS Seesaw Platform'), - ('MODEL_BITFS_SINKING_CAGE_PLATFORM', 'BITFS Sinking Cage Platform', 'BITFS Sinking Cage Platform'), - ('MODEL_BITFS_SINKING_PLATFORMS', 'BITFS Sinking Platforms', 'BITFS Sinking Platforms'), - ('MODEL_BITFS_SLIDING_PLATFORM', 'BITFS Sliding Platform', 'BITFS Sliding Platform'), - ('MODEL_BITFS_STRETCHING_PLATFORMS', 'BITFS Stretching Platforms', 'BITFS Stretching Platforms'), - ('MODEL_BITFS_TILTING_SQUARE_PLATFORM', 'BITFS Tilting Square Platform', 'BITFS Tilting Square Platform'), - ('MODEL_BITFS_TUMBLING_PLATFORM', 'BITFS Tumbling Platform', 'BITFS Tumbling Platform'), - ('MODEL_BITFS_TUMBLING_PLATFORM_PART', 'BITFS Tumbling Platform Part', 'BITFS Tumbling Platform Part'), - ('MODEL_BITS_ARROW_PLATFORM', 'BITS Arrow Platform', 'BITS Arrow Platform'), - ('MODEL_BITS_BLUE_PLATFORM', 'BITS Blue Platform', 'BITS Blue Platform'), - ('MODEL_BITS_FERRIS_WHEEL_AXLE', 'BITS Ferris Wheel Axle', 'BITS Ferris Wheel Axle'), - ('MODEL_BITS_OCTAGONAL_PLATFORM', 'BITS Octagonal Platform', 'BITS Octagonal Platform'), - ('MODEL_BITS_SEESAW_PLATFORM', 'BITS Seesaw Platform', 'BITS Seesaw Platform'), - ('MODEL_BITS_SLIDING_PLATFORM', 'BITS Sliding Platform', 'BITS Sliding Platform'), - ('MODEL_BITS_STAIRCASE', 'BITS Staircase', 'BITS Staircase'), - ('MODEL_BITS_STAIRCASE_FRAME1', 'BITS Staircase Frame1', 'BITS Staircase Frame1'), - ('MODEL_BITS_STAIRCASE_FRAME2', 'BITS Staircase Frame2', 'BITS Staircase Frame2'), - ('MODEL_BITS_STAIRCASE_FRAME3', 'BITS Staircase Frame3', 'BITS Staircase Frame3'), - ('MODEL_BITS_STAIRCASE_FRAME4', 'BITS Staircase Frame4', 'BITS Staircase Frame4'), - ('MODEL_BITS_TILTING_W_PLATFORM', 'BITS Tilting With Platform', 'BITS Tilting With Platform'), - ('MODEL_BITS_TWIN_SLIDING_PLATFORMS', 'BITS Twin Sliding Platforms', 'BITS Twin Sliding Platforms'), - ('MODEL_BITS_WARP_PIPE', 'BITS Warp Pipe', 'BITS Warp Pipe'), - ('MODEL_BOB_BARS_GRILLS', 'BOB Bars Grills', 'BOB Bars Grills'), - ('MODEL_BOB_BUBBLY_TREE', 'BOB Bubbly Tree', 'BOB Bubbly Tree'), - ('MODEL_BOB_CHAIN_CHOMP_GATE', 'BOB Chain Chomp Gate', 'BOB Chain Chomp Gate'), - ('MODEL_BOB_SEESAW_PLATFORM', 'BOB Seesaw Platform', 'BOB Seesaw Platform'), - ('MODEL_BETA_BOO_KEY', 'Beta Boo Key', 'Beta Boo Key'), - ('MODEL_BIG_CHILL_BULLY', 'Big Chill Bully', 'Big Chill Bully'), - ('MODEL_BIRDS', 'Birds', 'Birds'), - ('MODEL_BLACK_BOBOMB', 'Black Bobomb', 'Black Bobomb'), - ('MODEL_BLARGG', 'Blargg', 'Blargg'), - ('MODEL_BLUE_COIN', 'Blue Coin', 'Blue Coin'), - ('MODEL_BLUE_COIN_NO_SHADOW', 'Blue Coin No Shadow', 'Blue Coin No Shadow'), - ('MODEL_BLUE_COIN_SWITCH', 'Blue Coin Switch', 'Blue Coin Switch'), - ('MODEL_BLUE_FLAME', 'Blue Flame', 'Blue Flame'), - ('MODEL_BOBOMB_BUDDY', 'Bobomb Buddy', 'Bobomb Buddy'), - ('MODEL_BOO', 'Boo', 'Boo'), - ('MODEL_BOO_CASTLE', 'Boo Castle', 'Boo Castle'), - ('MODEL_BOOKEND', 'Bookend', 'Bookend'), - ('MODEL_BOOKEND_PART', 'Bookend Part', 'Bookend Part'), - ('MODEL_BOWLING_BALL', 'Bowling Ball', 'Bowling Ball'), - ('MODEL_BOWSER', 'Bowser', 'Bowser'), - ('MODEL_BOWSER_2_TILTING_ARENA', 'Bowser 2 Tilting Arena', 'Bowser 2 Tilting Arena'), - ('MODEL_BOWSER_3_FALLING_PLATFORM_1', 'Bowser 3 Falling Platform 1', 'Bowser 3 Falling Platform 1'), - ('MODEL_BOWSER_3_FALLING_PLATFORM_10', 'Bowser 3 Falling Platform 10', 'Bowser 3 Falling Platform 10'), - ('MODEL_BOWSER_3_FALLING_PLATFORM_2', 'Bowser 3 Falling Platform 2', 'Bowser 3 Falling Platform 2'), - ('MODEL_BOWSER_3_FALLING_PLATFORM_3', 'Bowser 3 Falling Platform 3', 'Bowser 3 Falling Platform 3'), - ('MODEL_BOWSER_3_FALLING_PLATFORM_4', 'Bowser 3 Falling Platform 4', 'Bowser 3 Falling Platform 4'), - ('MODEL_BOWSER_3_FALLING_PLATFORM_5', 'Bowser 3 Falling Platform 5', 'Bowser 3 Falling Platform 5'), - ('MODEL_BOWSER_3_FALLING_PLATFORM_6', 'Bowser 3 Falling Platform 6', 'Bowser 3 Falling Platform 6'), - ('MODEL_BOWSER_3_FALLING_PLATFORM_7', 'Bowser 3 Falling Platform 7', 'Bowser 3 Falling Platform 7'), - ('MODEL_BOWSER_3_FALLING_PLATFORM_8', 'Bowser 3 Falling Platform 8', 'Bowser 3 Falling Platform 8'), - ('MODEL_BOWSER_3_FALLING_PLATFORM_9', 'Bowser 3 Falling Platform 9', 'Bowser 3 Falling Platform 9'), - ('MODEL_BOWSER_BOMB', 'Bowser Bomb', 'Bowser Bomb'), - ('MODEL_BOWSER_BOMB_CHILD_OBJ', 'Bowser Bomb Child Obj', 'Bowser Bomb Child Obj'), - ('MODEL_BOWSER_FLAMES', 'Bowser Flames', 'Bowser Flames'), - ('MODEL_BOWSER_KEY', 'Bowser Key', 'Bowser Key'), - ('MODEL_BOWSER_KEY_CUTSCENE', 'Bowser Key Cutscene', 'Bowser Key Cutscene'), - ('MODEL_BOWSER_SMOKE', 'Bowser Smoke', 'Bowser Smoke'), - ('MODEL_BOWSER_WAVE', 'Bowser Wave', 'Bowser Wave'), - ('MODEL_BOWSER2', 'Bowser2', 'Bowser2'), - ('MODEL_BREAKABLE_BOX', 'Breakable Box', 'Breakable Box'), - ('MODEL_BREAKABLE_BOX_SMALL', 'Breakable Box Small', 'Breakable Box Small'), - ('MODEL_BUB', 'Bub', 'Bub'), - ('MODEL_BUBBA', 'Bubba', 'Bubba'), - ('MODEL_BUBBLE', 'Bubble', 'Bubble'), - ('MODEL_BULLET_BILL', 'Bullet Bill', 'Bullet Bill'), - ('MODEL_BULLY', 'Bully', 'Bully'), - ('MODEL_BULLY_BOSS', 'Bully Boss', 'Bully Boss'), - ('MODEL_BURN_SMOKE', 'Burn Smoke', 'Burn Smoke'), - ('MODEL_BURN_SMOKE_UNUSED', 'Burn Smoke Unused', 'Burn Smoke Unused'), - ('MODEL_BUTTERFLY', 'Butterfly', 'Butterfly'), - ('MODEL_CCM_CABIN_DOOR', 'CCM Cabin Door', 'CCM Cabin Door'), - ('MODEL_CCM_ROPEWAY_LIFT', 'CCM Ropeway Lift', 'CCM Ropeway Lift'), - ('MODEL_CCM_SNOW_TREE', 'CCM Snow Tree', 'CCM Snow Tree'), - ('MODEL_CCM_SNOWMAN_BASE', 'CCM Snowman Base', 'CCM Snowman Base'), - ('MODEL_CCM_SNOWMAN_HEAD', 'CCM Snowman Head', 'CCM Snowman Head'), - ('MODEL_CANNON_BARREL', 'Cannon Barrel', 'Cannon Barrel'), - ('MODEL_CANNON_BASE', 'Cannon Base', 'Cannon Base'), - ('MODEL_CAP_SWITCH', 'Cap Switch', 'Cap Switch'), - ('MODEL_CAP_SWITCH_BASE', 'Cap Switch Base', 'Cap Switch Base'), - ('MODEL_CAP_SWITCH_EXCLAMATION', 'Cap Switch Exclamation', 'Cap Switch Exclamation'), - ('MODEL_CARTOON_STAR', 'Cartoon Star', 'Cartoon Star'), - ('MODEL_CASTLE_BOWSER_TRAP', 'Castle Bowser Trap', 'Castle Bowser Trap'), - ('MODEL_CASTLE_CASTLE_DOOR', 'Castle Castle Door', 'Castle Castle Door'), - ('MODEL_CASTLE_CASTLE_DOOR_UNUSED', 'Castle Castle Door Unused', 'Castle Castle Door Unused'), - ('MODEL_CASTLE_CLOCK_HOUR_HAND', 'Castle Clock Hour Hand', 'Castle Clock Hour Hand'), - ('MODEL_CASTLE_CLOCK_MINUTE_HAND', 'Castle Clock Minute Hand', 'Castle Clock Minute Hand'), - ('MODEL_CASTLE_CLOCK_PENDULUM', 'Castle Clock Pendulum', 'Castle Clock Pendulum'), - ('MODEL_CASTLE_DOOR_0_STARS', 'Castle Door 0 Stars', 'Castle Door 0 Stars'), - ('MODEL_CASTLE_DOOR_1_STAR', 'Castle Door 1 Star', 'Castle Door 1 Star'), - ('MODEL_CASTLE_DOOR_3_STARS', 'Castle Door 3 Stars', 'Castle Door 3 Stars'), - ('MODEL_CASTLE_GROUNDS_BUBBLY_TREE', 'Castle Grounds Bubbly Tree', 'Castle Grounds Bubbly Tree'), - ('MODEL_CASTLE_GROUNDS_CANNON_GRILL', 'Castle Grounds Cannon Grill', 'Castle Grounds Cannon Grill'), - ('MODEL_CASTLE_GROUNDS_CASTLE_DOOR', 'Castle Grounds Castle Door', 'Castle Grounds Castle Door'), - ('MODEL_CASTLE_GROUNDS_FLAG', 'Castle Grounds Flag', 'Castle Grounds Flag'), - ('MODEL_CASTLE_GROUNDS_METAL_DOOR', 'Castle Grounds Metal Door', 'Castle Grounds Metal Door'), - ('MODEL_CASTLE_GROUNDS_VCUTM_GRILL', 'Castle Grounds Vcutm Grill', 'Castle Grounds Vcutm Grill'), - ('MODEL_CASTLE_GROUNDS_WARP_PIPE', 'Castle Grounds Warp Pipe', 'Castle Grounds Warp Pipe'), - ('MODEL_CASTLE_KEY_DOOR', 'Castle Key Door', 'Castle Key Door'), - ('MODEL_CASTLE_METAL_DOOR', 'Castle Metal Door', 'Castle Metal Door'), - ('MODEL_CASTLE_STAR_DOOR_30_STARS', 'Castle Star Door 30 Stars', 'Castle Star Door 30 Stars'), - ('MODEL_CASTLE_STAR_DOOR_50_STARS', 'Castle Star Door 50 Stars', 'Castle Star Door 50 Stars'), - ('MODEL_CASTLE_STAR_DOOR_70_STARS', 'Castle Star Door 70 Stars', 'Castle Star Door 70 Stars'), - ('MODEL_CASTLE_STAR_DOOR_8_STARS', 'Castle Star Door 8 Stars', 'Castle Star Door 8 Stars'), - ('MODEL_CASTLE_WATER_LEVEL_PILLAR', 'Castle Water Level Pillar', 'Castle Water Level Pillar'), - ('MODEL_CASTLE_WOODEN_DOOR', 'Castle Wooden Door', 'Castle Wooden Door'), - ('MODEL_CASTLE_WOODEN_DOOR_UNUSED', 'Castle Wooden Door Unused', 'Castle Wooden Door Unused'), - ('MODEL_CHAIN_CHOMP', 'Chain Chomp', 'Chain Chomp'), - ('MODEL_CHECKERBOARD_PLATFORM', 'Checkerboard Platform', 'Checkerboard Platform'), - ('MODEL_CHILL_BULLY', 'Chill Bully', 'Chill Bully'), - ('MODEL_CHUCKYA', 'Chuckya', 'Chuckya'), - ('MODEL_CLAM_SHELL', 'Clam Shell', 'Clam Shell'), - ('MODEL_COURTYARD_SPIKY_TREE', 'Courtyard Spiky Tree', 'Courtyard Spiky Tree'), - ('MODEL_COURTYARD_WOODEN_DOOR', 'Courtyard Wooden Door', 'Courtyard Wooden Door'), - ('MODEL_CYAN_FISH', 'Cyan Fish', 'Cyan Fish'), - ('MODEL_DDD_BOWSER_SUB', 'DDD Bowser Sub', 'DDD Bowser Sub'), - ('MODEL_DDD_BOWSER_SUB_DOOR', 'DDD Bowser Sub Door', 'DDD Bowser Sub Door'), - ('MODEL_DDD_POLE', 'DDD Pole', 'DDD Pole'), - ('MODEL_DL_CANNON_LID', 'DL Cannon Lid', 'DL Cannon Lid'), - ('MODEL_DL_MONTY_MOLE_HOLE', 'DL Monty Mole Hole', 'DL Monty Mole Hole'), - ('MODEL_DL_WHIRLPOOL', 'DL Whirlpool', 'DL Whirlpool'), - ('MODEL_DIRT_ANIMATION', 'Dirt Animation', 'Dirt Animation'), - ('MODEL_DORRIE', 'Dorrie', 'Dorrie'), - ('MODEL_ENEMY_LAKITU', 'Enemy Lakitu', 'Enemy Lakitu'), - ('MODEL_EXCLAMATION_BOX', 'Exclamation Box', 'Exclamation Box'), - ('MODEL_EXCLAMATION_BOX_OUTLINE', 'Exclamation Box Outline', 'Exclamation Box Outline'), - ('MODEL_EXCLAMATION_POINT', 'Exclamation Point', 'Exclamation Point'), - ('MODEL_EXPLOSION', 'Explosion', 'Explosion'), - ('MODEL_EYEROK_LEFT_HAND', 'Eyerok Left Hand', 'Eyerok Left Hand'), - ('MODEL_EYEROK_RIGHT_HAND', 'Eyerok Right Hand', 'Eyerok Right Hand'), - ('MODEL_FISH', 'Fish', 'Fish'), - ('MODEL_FISH_SHADOW', 'Fish Shadow', 'Fish Shadow'), - ('MODEL_FLYGUY', 'Flyguy', 'Flyguy'), - ('MODEL_FWOOSH', 'Fwoosh', 'Fwoosh'), - ('MODEL_GOOMBA', 'Goomba', 'Goomba'), - ('MODEL_HMC_ELEVATOR_PLATFORM', 'HMC Elevator Platform', 'HMC Elevator Platform'), - ('MODEL_HMC_HAZY_MAZE_DOOR', 'HMC Hazy Maze Door', 'HMC Hazy Maze Door'), - ('MODEL_HMC_METAL_ARROW_PLATFORM', 'HMC Metal Arrow Platform', 'HMC Metal Arrow Platform'), - ('MODEL_HMC_METAL_DOOR', 'HMC Metal Door', 'HMC Metal Door'), - ('MODEL_HMC_METAL_PLATFORM', 'HMC Metal Platform', 'HMC Metal Platform'), - ('MODEL_HMC_RED_GRILLS', 'HMC Red Grills', 'HMC Red Grills'), - ('MODEL_HMC_ROCK_PIECE', 'HMC Rock Piece', 'HMC Rock Piece'), - ('MODEL_HMC_ROCK_SMALL_PIECE', 'HMC Rock Small Piece', 'HMC Rock Small Piece'), - ('MODEL_HMC_ROLLING_ROCK', 'HMC Rolling Rock', 'HMC Rolling Rock'), - ('MODEL_HMC_WOODEN_DOOR', 'HMC Wooden Door', 'HMC Wooden Door'), - ('MODEL_HAUNTED_CAGE', 'Haunted Cage', 'Haunted Cage'), - ('MODEL_HAUNTED_CHAIR', 'Haunted Chair', 'Haunted Chair'), - ('MODEL_HEART', 'Heart', 'Heart'), - ('MODEL_HEAVE_HO', 'Heave Ho', 'Heave Ho'), - ('MODEL_HOOT', 'Hoot', 'Hoot'), - ('MODEL_IDLE_WATER_WAVE', 'Idle Water Wave', 'Idle Water Wave'), - ('MODEL_JRB_FALLING_PILLAR', 'JRB Falling Pillar', 'JRB Falling Pillar'), - ('MODEL_JRB_FALLING_PILLAR_BASE', 'JRB Falling Pillar Base', 'JRB Falling Pillar Base'), - ('MODEL_JRB_FLOATING_PLATFORM', 'JRB Floating Platform', 'JRB Floating Platform'), - ('MODEL_JRB_ROCK', 'JRB Rock', 'JRB Rock'), - ('MODEL_JRB_SHIP_BACK_LEFT_PART', 'JRB Ship Back Left Part', 'JRB Ship Back Left Part'), - ('MODEL_JRB_SHIP_BACK_RIGHT_PART', 'JRB Ship Back Right Part', 'JRB Ship Back Right Part'), - ('MODEL_JRB_SHIP_LEFT_HALF_PART', 'JRB Ship Left Half Part', 'JRB Ship Left Half Part'), - ('MODEL_JRB_SHIP_RIGHT_HALF_PART', 'JRB Ship Right Half Part', 'JRB Ship Right Half Part'), - ('MODEL_JRB_SLIDING_BOX', 'JRB Sliding Box', 'JRB Sliding Box'), - ('MODEL_JRB_SUNKEN_SHIP', 'JRB Sunken Ship', 'JRB Sunken Ship'), - ('MODEL_JRB_SUNKEN_SHIP_BACK', 'JRB Sunken Ship Back', 'JRB Sunken Ship Back'), - ('MODEL_KING_BOBOMB', 'King Bobomb', 'King Bobomb'), - ('MODEL_KLEPTO', 'Klepto', 'Klepto'), - ('MODEL_KOOPA_FLAG', 'Koopa Flag', 'Koopa Flag'), - ('MODEL_KOOPA_SHELL', 'Koopa Shell', 'Koopa Shell'), - ('MODEL_KOOPA_WITH_SHELL', 'Koopa With Shell', 'Koopa With Shell'), - ('MODEL_KOOPA_WITHOUT_SHELL', 'Koopa Without Shell', 'Koopa Without Shell'), - ('MODEL_LLL_BOWSER_PIECE_1', 'LLL Bowser Piece 1', 'LLL Bowser Piece 1'), - ('MODEL_LLL_BOWSER_PIECE_10', 'LLL Bowser Piece 10', 'LLL Bowser Piece 10'), - ('MODEL_LLL_BOWSER_PIECE_11', 'LLL Bowser Piece 11', 'LLL Bowser Piece 11'), - ('MODEL_LLL_BOWSER_PIECE_12', 'LLL Bowser Piece 12', 'LLL Bowser Piece 12'), - ('MODEL_LLL_BOWSER_PIECE_13', 'LLL Bowser Piece 13', 'LLL Bowser Piece 13'), - ('MODEL_LLL_BOWSER_PIECE_14', 'LLL Bowser Piece 14', 'LLL Bowser Piece 14'), - ('MODEL_LLL_BOWSER_PIECE_2', 'LLL Bowser Piece 2', 'LLL Bowser Piece 2'), - ('MODEL_LLL_BOWSER_PIECE_3', 'LLL Bowser Piece 3', 'LLL Bowser Piece 3'), - ('MODEL_LLL_BOWSER_PIECE_4', 'LLL Bowser Piece 4', 'LLL Bowser Piece 4'), - ('MODEL_LLL_BOWSER_PIECE_5', 'LLL Bowser Piece 5', 'LLL Bowser Piece 5'), - ('MODEL_LLL_BOWSER_PIECE_6', 'LLL Bowser Piece 6', 'LLL Bowser Piece 6'), - ('MODEL_LLL_BOWSER_PIECE_7', 'LLL Bowser Piece 7', 'LLL Bowser Piece 7'), - ('MODEL_LLL_BOWSER_PIECE_8', 'LLL Bowser Piece 8', 'LLL Bowser Piece 8'), - ('MODEL_LLL_BOWSER_PIECE_9', 'LLL Bowser Piece 9', 'LLL Bowser Piece 9'), - ('MODEL_LLL_DRAWBRIDGE_PART', 'LLL Drawbridge Part', 'LLL Drawbridge Part'), - ('MODEL_LLL_FALLING_PLATFORM', 'LLL Falling Platform', 'LLL Falling Platform'), - ('MODEL_LLL_LARGE_FALLING_PLATFORM', 'LLL Large Falling Platform', 'LLL Large Falling Platform'), - ('MODEL_LLL_LARGE_WOOD_BRIDGE', 'LLL Large Wood Bridge', 'LLL Large Wood Bridge'), - ('MODEL_LLL_MOVING_OCTAGONAL_MESH_PLATFORM', 'LLL Moving Octagonal Mesh Platform', 'LLL Moving Octagonal Mesh Platform'), - ('MODEL_LLL_ROLLING_LOG', 'LLL Rolling Log', 'LLL Rolling Log'), - ('MODEL_LLL_ROTATING_BLOCK_FIRE_BARS', 'LLL Rotating Block Fire Bars', 'LLL Rotating Block Fire Bars'), - ('MODEL_LLL_ROTATING_HEXAGONAL_PLATFORM', 'LLL Rotating Hexagonal Platform', 'LLL Rotating Hexagonal Platform'), - ('MODEL_LLL_ROTATING_HEXAGONAL_RING', 'LLL Rotating Hexagonal Ring', 'LLL Rotating Hexagonal Ring'), - ('MODEL_LLL_SINKING_RECTANGULAR_PLATFORM', 'LLL Sinking Rectangular Platform', 'LLL Sinking Rectangular Platform'), - ('MODEL_LLL_SINKING_ROCK_BLOCK', 'LLL Sinking Rock Block', 'LLL Sinking Rock Block'), - ('MODEL_LLL_SINKING_SQUARE_PLATFORMS', 'LLL Sinking Square Platforms', 'LLL Sinking Square Platforms'), - ('MODEL_LLL_TILTING_SQUARE_PLATFORM', 'LLL Tilting Square Platform', 'LLL Tilting Square Platform'), - ('MODEL_LLL_VOLCANO_FALLING_TRAP', 'LLL Volcano Falling Trap', 'LLL Volcano Falling Trap'), - ('MODEL_LLL_WOOD_BRIDGE', 'LLL Wood Bridge', 'LLL Wood Bridge'), - ('MODEL_LAKITU', 'Lakitu', 'Lakitu'), - ('MODEL_LEAVES', 'Leaves', 'Leaves'), - ('MODEL_LEVEL_GEOMETRY_03', 'Level Geometry 03', 'Level Geometry 03'), - ('MODEL_LEVEL_GEOMETRY_03', 'Level Geometry 03', 'Level Geometry 03'), - ('MODEL_LEVEL_GEOMETRY_04', 'Level Geometry 04', 'Level Geometry 04'), - ('MODEL_LEVEL_GEOMETRY_04', 'Level Geometry 04', 'Level Geometry 04'), - ('MODEL_LEVEL_GEOMETRY_05', 'Level Geometry 05', 'Level Geometry 05'), - ('MODEL_LEVEL_GEOMETRY_05', 'Level Geometry 05', 'Level Geometry 05'), - ('MODEL_LEVEL_GEOMETRY_06', 'Level Geometry 06', 'Level Geometry 06'), - ('MODEL_LEVEL_GEOMETRY_06', 'Level Geometry 06', 'Level Geometry 06'), - ('MODEL_LEVEL_GEOMETRY_07', 'Level Geometry 07', 'Level Geometry 07'), - ('MODEL_LEVEL_GEOMETRY_07', 'Level Geometry 07', 'Level Geometry 07'), - ('MODEL_LEVEL_GEOMETRY_08', 'Level Geometry 08', 'Level Geometry 08'), - ('MODEL_LEVEL_GEOMETRY_08', 'Level Geometry 08', 'Level Geometry 08'), - ('MODEL_LEVEL_GEOMETRY_09', 'Level Geometry 09', 'Level Geometry 09'), - ('MODEL_LEVEL_GEOMETRY_09', 'Level Geometry 09', 'Level Geometry 09'), - ('MODEL_LEVEL_GEOMETRY_09', 'Level Geometry 09', 'Level Geometry 09'), - ('MODEL_LEVEL_GEOMETRY_0A', 'Level Geometry 0A', 'Level Geometry 0A'), - ('MODEL_LEVEL_GEOMETRY_0A', 'Level Geometry 0A', 'Level Geometry 0A'), - ('MODEL_LEVEL_GEOMETRY_0B', 'Level Geometry 0B', 'Level Geometry 0B'), - ('MODEL_LEVEL_GEOMETRY_0B', 'Level Geometry 0B', 'Level Geometry 0B'), - ('MODEL_LEVEL_GEOMETRY_0C', 'Level Geometry 0C', 'Level Geometry 0C'), - ('MODEL_LEVEL_GEOMETRY_0C', 'Level Geometry 0C', 'Level Geometry 0C'), - ('MODEL_LEVEL_GEOMETRY_0D', 'Level Geometry 0D', 'Level Geometry 0D'), - ('MODEL_LEVEL_GEOMETRY_0D', 'Level Geometry 0D', 'Level Geometry 0D'), - ('MODEL_LEVEL_GEOMETRY_0E', 'Level Geometry 0E', 'Level Geometry 0E'), - ('MODEL_LEVEL_GEOMETRY_0F', 'Level Geometry 0F', 'Level Geometry 0F'), - ('MODEL_LEVEL_GEOMETRY_10', 'Level Geometry 10', 'Level Geometry 10'), - ('MODEL_LEVEL_GEOMETRY_10', 'Level Geometry 10', 'Level Geometry 10'), - ('MODEL_LEVEL_GEOMETRY_11', 'Level Geometry 11', 'Level Geometry 11'), - ('MODEL_LEVEL_GEOMETRY_12', 'Level Geometry 12', 'Level Geometry 12'), - ('MODEL_LEVEL_GEOMETRY_12', 'Level Geometry 12', 'Level Geometry 12'), - ('MODEL_LEVEL_GEOMETRY_13', 'Level Geometry 13', 'Level Geometry 13'), - ('MODEL_LEVEL_GEOMETRY_14', 'Level Geometry 14', 'Level Geometry 14'), - ('MODEL_LEVEL_GEOMETRY_15', 'Level Geometry 15', 'Level Geometry 15'), - ('MODEL_LEVEL_GEOMETRY_16', 'Level Geometry 16', 'Level Geometry 16'), - ('MODEL_LEVEL_GEOMETRY_16', 'Level Geometry 16', 'Level Geometry 16'), - ('MODEL_LEVEL_GEOMETRY_16', 'Level Geometry 16', 'Level Geometry 16'), - ('MODEL_LEVEL_GEOMETRY_16', 'Level Geometry 16', 'Level Geometry 16'), - ('MODEL_LUIGI', 'Luigi', 'Luigi'), - ('MODEL_MAD_PIANO', 'Mad Piano', 'Mad Piano'), - ('MODEL_MAIN_MENU_BLUE_COPY_BUTTON', 'Main Menu Blue Copy Button', 'Main Menu Blue Copy Button'), - ('MODEL_MAIN_MENU_GENERIC_BUTTON', 'Main Menu Generic Button', 'Main Menu Generic Button'), - ('MODEL_MAIN_MENU_GREEN_SCORE_BUTTON', 'Main Menu Green Score Button', 'Main Menu Green Score Button'), - ('MODEL_MAIN_MENU_MARIO_NEW_BUTTON', 'Main Menu Mario New Button', 'Main Menu Mario New Button'), - ('MODEL_MAIN_MENU_MARIO_NEW_BUTTON_FADE', 'Main Menu Mario New Button Fade', 'Main Menu Mario New Button Fade'), - ('MODEL_MAIN_MENU_MARIO_SAVE_BUTTON', 'Main Menu Mario Save Button', 'Main Menu Mario Save Button'), - ('MODEL_MAIN_MENU_MARIO_SAVE_BUTTON_FADE', 'Main Menu Mario Save Button Fade', 'Main Menu Mario Save Button Fade'), - ('MODEL_MAIN_MENU_PURPLE_SOUND_BUTTON', 'Main Menu Purple Sound Button', 'Main Menu Purple Sound Button'), - ('MODEL_MAIN_MENU_RED_ERASE_BUTTON', 'Main Menu Red Erase Button', 'Main Menu Red Erase Button'), - ('MODEL_MAIN_MENU_YELLOW_FILE_BUTTON', 'Main Menu Yellow File Button', 'Main Menu Yellow File Button'), - ('MODEL_MANTA_RAY', 'Manta Ray', 'Manta Ray'), - ('MODEL_MARIO', 'Mario', 'Mario'), - ('MODEL_MARIOS_CAP', 'Mario\'s Cap', 'Mario\'s Cap'), - ('MODEL_MARIOS_METAL_CAP', 'Mario\'s Metal Cap', 'Mario\'s Metal Cap'), - ('MODEL_MARIOS_WING_CAP', 'Mario\'s Wing Cap', 'Mario\'s Wing Cap'), - ('MODEL_MARIOS_WINGED_METAL_CAP', 'Mario\'s Winged Metal Cap', 'Mario\'s Winged Metal Cap'), - ('MODEL_METAL_BOX', 'Metal Box', 'Metal Box'), - ('MODEL_METAL_BOX_DL', 'Metal Box DL', 'Metal Box DL'), - ('MODEL_METALLIC_BALL', 'Metallic Ball', 'Metallic Ball'), - ('MODEL_MIPS', 'Mips', 'Mips'), - ('MODEL_MIST', 'Mist', 'Mist'), - ('MODEL_MONEYBAG', 'Moneybag', 'Moneybag'), - ('MODEL_MONTY_MOLE', 'Monty Mole', 'Monty Mole'), - ('MODEL_MR_BLIZZARD', 'Mr. Blizzard', 'Mr. Blizzard'), - ('MODEL_MR_BLIZZARD_HIDDEN', 'Mr. Blizzard Hidden', 'Mr. Blizzard Hidden'), - ('MODEL_MR_I', 'Mr. I', 'Mr. I'), - ('MODEL_MR_I_IRIS', 'Mr. I Iris', 'Mr. I Iris'), - ('MODEL_NONE', 'None', 'None'), - ('MODEL_NUMBER', 'Number', 'Number'), - ('MODEL_PEACH', 'Peach', 'Peach'), - ('MODEL_PEBBLE', 'Pebble', 'Pebble'), - ('MODEL_PENGUIN', 'Penguin', 'Penguin'), - ('MODEL_PIRANHA_PLANT', 'Piranha Plant', 'Piranha Plant'), - ('MODEL_POKEY_BODY_PART', 'Pokey Body Part', 'Pokey Body Part'), - ('MODEL_POKEY_HEAD', 'Pokey Head', 'Pokey Head'), - ('MODEL_PURPLE_MARBLE', 'Purple Marble', 'Purple Marble'), - ('MODEL_PURPLE_SWITCH', 'Purple Switch', 'Purple Switch'), - ('MODEL_RR_CRUISER_WING', 'RR Cruiser Wing', 'RR Cruiser Wing'), - ('MODEL_RR_DONUT_PLATFORM', 'RR Donut Platform', 'RR Donut Platform'), - ('MODEL_RR_ELEVATOR_PLATFORM', 'RR Elevator Platform', 'RR Elevator Platform'), - ('MODEL_RR_FLYING_CARPET', 'RR Flying Carpet', 'RR Flying Carpet'), - ('MODEL_RR_L_SHAPED_PLATFORM', 'RR L Shaped Platform', 'RR L Shaped Platform'), - ('MODEL_RR_OCTAGONAL_PLATFORM', 'RR Octagonal Platform', 'RR Octagonal Platform'), - ('MODEL_RR_ROTATING_BRIDGE_PLATFORM', 'RR Rotating Bridge Platform', 'RR Rotating Bridge Platform'), - ('MODEL_RR_SEESAW_PLATFORM', 'RR Seesaw Platform', 'RR Seesaw Platform'), - ('MODEL_RR_SLIDING_PLATFORM', 'RR Sliding Platform', 'RR Sliding Platform'), - ('MODEL_RR_SWINGING_PLATFORM', 'RR Swinging Platform', 'RR Swinging Platform'), - ('MODEL_RR_TRIANGLE_PLATFORM', 'RR Triangle Platform', 'RR Triangle Platform'), - ('MODEL_RR_TRICKY_TRIANGLES', 'RR Tricky Triangles', 'RR Tricky Triangles'), - ('MODEL_RR_TRICKY_TRIANGLES_FRAME1', 'RR Tricky Triangles Frame1', 'RR Tricky Triangles Frame1'), - ('MODEL_RR_TRICKY_TRIANGLES_FRAME2', 'RR Tricky Triangles Frame2', 'RR Tricky Triangles Frame2'), - ('MODEL_RR_TRICKY_TRIANGLES_FRAME3', 'RR Tricky Triangles Frame3', 'RR Tricky Triangles Frame3'), - ('MODEL_RR_TRICKY_TRIANGLES_FRAME4', 'RR Tricky Triangles Frame4', 'RR Tricky Triangles Frame4'), - ('MODEL_RED_COIN', 'Red Coin', 'Red Coin'), - ('MODEL_RED_COIN_NO_SHADOW', 'Red Coin No Shadow', 'Red Coin No Shadow'), - ('MODEL_RED_FLAME', 'Red Flame', 'Red Flame'), - ('MODEL_RED_FLAME_SHADOW', 'Red Flame Shadow', 'Red Flame Shadow'), - ('MODEL_SL_CRACKED_ICE', 'SL Cracked Ice', 'SL Cracked Ice'), - ('MODEL_SL_CRACKED_ICE_CHUNK', 'SL Cracked Ice Chunk', 'SL Cracked Ice Chunk'), - ('MODEL_SL_SNOW_TREE', 'SL Snow Tree', 'SL Snow Tree'), - ('MODEL_SL_SNOW_TRIANGLE', 'SL Snow Triangle', 'SL Snow Triangle'), - ('MODEL_SSL_GRINDEL', 'SSL Grindel', 'SSL Grindel'), - ('MODEL_SSL_MOVING_PYRAMID_WALL', 'SSL Moving Pyramid Wall', 'SSL Moving Pyramid Wall'), - ('MODEL_SSL_PALM_TREE', 'SSL Palm Tree', 'SSL Palm Tree'), - ('MODEL_SSL_PYRAMID_ELEVATOR', 'SSL Pyramid Elevator', 'SSL Pyramid Elevator'), - ('MODEL_SSL_PYRAMID_TOP', 'SSL Pyramid Top', 'SSL Pyramid Top'), - ('MODEL_SSL_SPINDEL', 'SSL Spindel', 'SSL Spindel'), - ('MODEL_SSL_TOX_BOX', 'SSL Tox Box', 'SSL Tox Box'), - ('MODEL_SAND_DUST', 'Sand Dust', 'Sand Dust'), - ('MODEL_SCUTTLEBUG', 'Scuttlebug', 'Scuttlebug'), - ('MODEL_SEAWEED', 'Seaweed', 'Seaweed'), - ('MODEL_SKEETER', 'Skeeter', 'Skeeter'), - ('MODEL_SMALL_WATER_SPLASH', 'Small Water Splash', 'Small Water Splash'), - ('MODEL_SMOKE', 'Smoke', 'Smoke'), - ('MODEL_SNUFIT', 'Snufit', 'Snufit'), - ('MODEL_SPARKLES', 'Sparkles', 'Sparkles'), - ('MODEL_SPARKLES_ANIMATION', 'Sparkles Animation', 'Sparkles Animation'), - ('MODEL_SPINDRIFT', 'Spindrift', 'Spindrift'), - ('MODEL_SPINY', 'Spiny', 'Spiny'), - ('MODEL_SPINY_BALL', 'Spiny Ball', 'Spiny Ball'), - ('MODEL_STAR', 'Star', 'Star'), - ('MODEL_SUSHI', 'Sushi', 'Sushi'), - ('MODEL_SWOOP', 'Swoop', 'Swoop'), - ('MODEL_THI_BUBBLY_TREE', 'THI Bubbly Tree', 'THI Bubbly Tree'), - ('MODEL_THI_HUGE_ISLAND_TOP', 'THI Huge Island Top', 'THI Huge Island Top'), - ('MODEL_THI_TINY_ISLAND_TOP', 'THI Tiny Island Top', 'THI Tiny Island Top'), - ('MODEL_THI_WARP_PIPE', 'THI Warp Pipe', 'THI Warp Pipe'), - ('MODEL_TTC_CLOCK_HAND', 'TTC Clock Hand', 'TTC Clock Hand'), - ('MODEL_TTC_ELEVATOR_PLATFORM', 'TTC Elevator Platform', 'TTC Elevator Platform'), - ('MODEL_TTC_LARGE_GEAR', 'TTC Large Gear', 'TTC Large Gear'), - ('MODEL_TTC_LARGE_TREADMILL', 'TTC Large Treadmill', 'TTC Large Treadmill'), - ('MODEL_TTC_PENDULUM', 'TTC Pendulum', 'TTC Pendulum'), - ('MODEL_TTC_PIT_BLOCK', 'TTC Pit Block', 'TTC Pit Block'), - ('MODEL_TTC_PIT_BLOCK_UNUSED', 'TTC Pit Block Unused', 'TTC Pit Block Unused'), - ('MODEL_TTC_PUSH_BLOCK', 'TTC Push Block', 'TTC Push Block'), - ('MODEL_TTC_ROTATING_CUBE', 'TTC Rotating Cube', 'TTC Rotating Cube'), - ('MODEL_TTC_ROTATING_HEXAGON', 'TTC Rotating Hexagon', 'TTC Rotating Hexagon'), - ('MODEL_TTC_ROTATING_PRISM', 'TTC Rotating Prism', 'TTC Rotating Prism'), - ('MODEL_TTC_ROTATING_TRIANGLE', 'TTC Rotating Triangle', 'TTC Rotating Triangle'), - ('MODEL_TTC_SMALL_GEAR', 'TTC Small Gear', 'TTC Small Gear'), - ('MODEL_TTC_SMALL_TREADMILL', 'TTC Small Treadmill', 'TTC Small Treadmill'), - ('MODEL_TTC_SPINNER', 'TTC Spinner', 'TTC Spinner'), - ('MODEL_TTM_BLUE_SMILEY', 'TTM Blue Smiley', 'TTM Blue Smiley'), - ('MODEL_TTM_MOON_SMILEY', 'TTM Moon Smiley', 'TTM Moon Smiley'), - ('MODEL_TTM_ROLLING_LOG', 'TTM Rolling Log', 'TTM Rolling Log'), - ('MODEL_TTM_SLIDE_EXIT_PODIUM', 'TTM Slide Exit Podium', 'TTM Slide Exit Podium'), - ('MODEL_TTM_STAR_CAGE', 'TTM Star Cage', 'TTM Star Cage'), - ('MODEL_TTM_STAR_SMILEY', 'TTM Star Smiley', 'TTM Star Smiley'), - ('MODEL_TTM_YELLOW_SMILEY', 'TTM Yellow Smiley', 'TTM Yellow Smiley'), - ('MODEL_THWOMP', 'Thwomp', 'Thwomp'), - ('MODEL_TOAD', 'Toad', 'Toad'), - ('MODEL_TRAJECTORY_MARKER_BALL', 'Trajectory Marker Ball', 'Trajectory Marker Ball'), - ('MODEL_TRAMPOLINE', 'Trampoline', 'Trampoline'), - ('MODEL_TRAMPOLINE_BASE', 'Trampoline Base', 'Trampoline Base'), - ('MODEL_TRAMPOLINE_CENTER', 'Trampoline Center', 'Trampoline Center'), - ('MODEL_TRANSPARENT_STAR', 'Transparent Star', 'Transparent Star'), - ('MODEL_TREASURE_CHEST_BASE', 'Treasure Chest Base', 'Treasure Chest Base'), - ('MODEL_TREASURE_CHEST_LID', 'Treasure Chest Lid', 'Treasure Chest Lid'), - ('MODEL_TWEESTER', 'Tweester', 'Tweester'), - ('MODEL_UKIKI', 'Ukiki', 'Ukiki'), - ('MODEL_UNAGI', 'Unagi', 'Unagi'), - ('MODEL_UNKNOWN_54', 'Unknown 54', 'Unknown 54'), - ('MODEL_UNKNOWN_58', 'Unknown 58', 'Unknown 58'), - ('MODEL_UNKNOWN_7D', 'Unknown 7D', 'Unknown 7D'), - ('MODEL_UNKNOWN_AC', 'Unknown AC', 'Unknown AC'), - ('MODEL_UNKNOWN_B8', 'Unknown B8', 'Unknown B8'), - ('MODEL_UNKNOWN_DOOR_1E', 'Unknown Door 1E', 'Unknown Door 1E'), - ('MODEL_UNKNOWN_DOOR_21', 'Unknown Door 21', 'Unknown Door 21'), - ('MODEL_UNKNOWN_DOOR_28', 'Unknown Door 28', 'Unknown Door 28'), - ('MODEL_UNKNOWN_DOOR_2A', 'Unknown Door 2A', 'Unknown Door 2A'), - ('MODEL_UNKNOWN_DOOR_2B', 'Unknown Door 2B', 'Unknown Door 2B'), - ('MODEL_UNKNOWN_TREE_1A', 'Unknown Tree 1A', 'Unknown Tree 1A'), - ('MODEL_VCUTM_CHECKERBOARD_PLATFORM_SPAWNER', 'Vcutm Checkerboard Platform Spawner', 'Vcutm Checkerboard Platform Spawner'), - ('MODEL_VCUTM_SEESAW_PLATFORM', 'Vcutm Seesaw Platform', 'Vcutm Seesaw Platform'), - ('MODEL_VCUTM_WARP_PIPE', 'Vcutm Warp Pipe', 'Vcutm Warp Pipe'), - ('MODEL_WDW_ARROW_LIFT', 'WDW Arrow Lift', 'WDW Arrow Lift'), - ('MODEL_WDW_BUBBLY_TREE', 'WDW Bubbly Tree', 'WDW Bubbly Tree'), - ('MODEL_WDW_EXPRESS_ELEVATOR', 'WDW Express Elevator', 'WDW Express Elevator'), - ('MODEL_WDW_HIDDEN_PLATFORM', 'WDW Hidden Platform', 'WDW Hidden Platform'), - ('MODEL_WDW_RECTANGULAR_FLOATING_PLATFORM', 'WDW Rectangular Floating Platform', 'WDW Rectangular Floating Platform'), - ('MODEL_WDW_ROTATING_PLATFORM', 'WDW Rotating Platform', 'WDW Rotating Platform'), - ('MODEL_WDW_SQUARE_FLOATING_PLATFORM', 'WDW Square Floating Platform', 'WDW Square Floating Platform'), - ('MODEL_WDW_WATER_LEVEL_DIAMOND', 'WDW Water Level Diamond', 'WDW Water Level Diamond'), - ('MODEL_WF_BREAKABLE_WALL_LEFT', 'WF Breakable Wall Left', 'WF Breakable Wall Left'), - ('MODEL_WF_BREAKABLE_WALL_RIGHT', 'WF Breakable Wall Right', 'WF Breakable Wall Right'), - ('MODEL_WF_BUBBLY_TREE', 'WF Bubbly Tree', 'WF Bubbly Tree'), - ('MODEL_WF_GIANT_POLE', 'WF Giant Pole', 'WF Giant Pole'), - ('MODEL_WF_KICKABLE_BOARD', 'WF Kickable Board', 'WF Kickable Board'), - ('MODEL_WF_KICKABLE_BOARD_FELLED', 'WF Kickable Board Felled', 'WF Kickable Board Felled'), - ('MODEL_WF_LARGE_BOMP', 'WF Large Bomp', 'WF Large Bomp'), - ('MODEL_WF_ROTATING_PLATFORM', 'WF Rotating Platform', 'WF Rotating Platform'), - ('MODEL_WF_ROTATING_WOODEN_PLATFORM', 'WF Rotating Wooden Platform', 'WF Rotating Wooden Platform'), - ('MODEL_WF_SLIDING_PLATFORM', 'WF Sliding Platform', 'WF Sliding Platform'), - ('MODEL_WF_SMALL_BOMP', 'WF Small Bomp', 'WF Small Bomp'), - ('MODEL_WF_TOWER_DOOR', 'WF Tower Door', 'WF Tower Door'), - ('MODEL_WF_TOWER_SQUARE_PLATORM', 'WF Tower Square Platorm', 'WF Tower Square Platorm'), - ('MODEL_WF_TOWER_SQUARE_PLATORM_ELEVATOR', 'WF Tower Square Platorm Elevator', 'WF Tower Square Platorm Elevator'), - ('MODEL_WF_TOWER_SQUARE_PLATORM_UNUSED', 'WF Tower Square Platorm Unused', 'WF Tower Square Platorm Unused'), - ('MODEL_WF_TOWER_TRAPEZOID_PLATORM', 'WF Tower Trapezoid Platorm', 'WF Tower Trapezoid Platorm'), - ('MODEL_WF_TUMBLING_BRIDGE', 'WF Tumbling Bridge', 'WF Tumbling Bridge'), - ('MODEL_WF_TUMBLING_BRIDGE_PART', 'WF Tumbling Bridge Part', 'WF Tumbling Bridge Part'), - ('MODEL_WATER_BOMB', 'Water Bomb', 'Water Bomb'), - ('MODEL_WATER_BOMB_SHADOW', 'Water Bomb Shadow', 'Water Bomb Shadow'), - ('MODEL_WATER_MINE', 'Water Mine', 'Water Mine'), - ('MODEL_WATER_RING', 'Water Ring', 'Water Ring'), - ('MODEL_WATER_SPLASH', 'Water Splash', 'Water Splash'), - ('MODEL_WAVE_TRAIL', 'Wave Trail', 'Wave Trail'), - ('MODEL_WHITE_PARTICLE', 'White Particle', 'White Particle'), - ('MODEL_WHITE_PARTICLE_DL', 'White Particle DL', 'White Particle DL'), - ('MODEL_WHITE_PARTICLE_SMALL', 'White Particle Small', 'White Particle Small'), - ('MODEL_WHITE_PUFF', 'White Puff', 'White Puff'), - ('MODEL_WHOMP', 'Whomp', 'Whomp'), - ('MODEL_WIGGLER_BODY', 'Wiggler Body', 'Wiggler Body'), - ('MODEL_WIGGLER_HEAD', 'Wiggler Head', 'Wiggler Head'), - ('MODEL_WOODEN_POST', 'Wooden Post', 'Wooden Post'), - ('MODEL_WOODEN_SIGNPOST', 'Wooden Signpost', 'Wooden Signpost'), - ('MODEL_YELLOW_COIN', 'Yellow Coin', 'Yellow Coin'), - ('MODEL_YELLOW_COIN_NO_SHADOW', 'Yellow Coin No Shadow', 'Yellow Coin No Shadow'), - ('MODEL_YELLOW_SPHERE', 'Yellow Sphere', 'Yellow Sphere'), - ('MODEL_YOSHI', 'Yoshi', 'Yoshi'), - ('MODEL_YOSHI_EGG', 'Yoshi Egg', 'Yoshi Egg'), + ("Custom", "Custom", "Custom"), + ("MODEL_1UP", "1 Up", "1 Up"), + ("MODEL_AMP", "Amp", "Amp"), + ("MODEL_BBH_HAUNTED_DOOR", "BBH Haunted Door", "BBH Haunted Door"), + ("MODEL_BBH_MERRY_GO_ROUND", "BBH Merry Go Round", "BBH Merry Go Round"), + ("MODEL_BBH_MESH_ELEVATOR", "BBH Mesh Elevator", "BBH Mesh Elevator"), + ("MODEL_BBH_MOVING_BOOKSHELF", "BBH Moving Bookshelf", "BBH Moving Bookshelf"), + ("MODEL_BBH_STAIRCASE_STEP", "BBH Staircase Step", "BBH Staircase Step"), + ( + "MODEL_BBH_TILTING_FLOOR_PLATFORM", + "BBH Tilting Floor Platform", + "BBH Tilting Floor Platform", + ), + ("MODEL_BBH_TUMBLING_PLATFORM", "BBH Tumbling Platform", "BBH Tumbling Platform"), + ( + "MODEL_BBH_TUMBLING_PLATFORM_PART", + "BBH Tumbling Platform Part", + "BBH Tumbling Platform Part", + ), + ("MODEL_BBH_WOODEN_TOMB", "BBH Wooden Tomb", "BBH Wooden Tomb"), + ("MODEL_BITDW_BLUE_PLATFORM", "BITDW Blue Platform", "BITDW Blue Platform"), + ( + "MODEL_BITDW_FERRIS_WHEEL_AXLE", + "BITDW Ferris Wheel Axle", + "BITDW Ferris Wheel Axle", + ), + ("MODEL_BITDW_SEESAW_PLATFORM", "BITDW Seesaw Platform", "BITDW Seesaw Platform"), + ( + "MODEL_BITDW_SLIDING_PLATFORM", + "BITDW Sliding Platform", + "BITDW Sliding Platform", + ), + ("MODEL_BITDW_SQUARE_PLATFORM", "BITDW Square Platform", "BITDW Square Platform"), + ("MODEL_BITDW_STAIRCASE", "BITDW Staircase", "BITDW Staircase"), + ( + "MODEL_BITDW_STAIRCASE_FRAME1", + "BITDW Staircase Frame1", + "BITDW Staircase Frame1", + ), + ( + "MODEL_BITDW_STAIRCASE_FRAME2", + "BITDW Staircase Frame2", + "BITDW Staircase Frame2", + ), + ( + "MODEL_BITDW_STAIRCASE_FRAME3", + "BITDW Staircase Frame3", + "BITDW Staircase Frame3", + ), + ( + "MODEL_BITDW_STAIRCASE_FRAME4", + "BITDW Staircase Frame4", + "BITDW Staircase Frame4", + ), + ("MODEL_BITDW_WARP_PIPE", "BITDW Warp Pipe", "BITDW Warp Pipe"), + ("MODEL_BITFS_BLUE_POLE", "BITFS Blue Pole", "BITFS Blue Pole"), + ("MODEL_BITFS_ELEVATOR", "BITFS Elevator", "BITFS Elevator"), + ( + "MODEL_BITFS_MOVING_SQUARE_PLATFORM", + "BITFS Moving Square Platform", + "BITFS Moving Square Platform", + ), + ( + "MODEL_BITFS_PLATFORM_ON_TRACK", + "BITFS Platform On Track", + "BITFS Platform On Track", + ), + ("MODEL_BITFS_SEESAW_PLATFORM", "BITFS Seesaw Platform", "BITFS Seesaw Platform"), + ( + "MODEL_BITFS_SINKING_CAGE_PLATFORM", + "BITFS Sinking Cage Platform", + "BITFS Sinking Cage Platform", + ), + ( + "MODEL_BITFS_SINKING_PLATFORMS", + "BITFS Sinking Platforms", + "BITFS Sinking Platforms", + ), + ( + "MODEL_BITFS_SLIDING_PLATFORM", + "BITFS Sliding Platform", + "BITFS Sliding Platform", + ), + ( + "MODEL_BITFS_STRETCHING_PLATFORMS", + "BITFS Stretching Platforms", + "BITFS Stretching Platforms", + ), + ( + "MODEL_BITFS_TILTING_SQUARE_PLATFORM", + "BITFS Tilting Square Platform", + "BITFS Tilting Square Platform", + ), + ( + "MODEL_BITFS_TUMBLING_PLATFORM", + "BITFS Tumbling Platform", + "BITFS Tumbling Platform", + ), + ( + "MODEL_BITFS_TUMBLING_PLATFORM_PART", + "BITFS Tumbling Platform Part", + "BITFS Tumbling Platform Part", + ), + ("MODEL_BITS_ARROW_PLATFORM", "BITS Arrow Platform", "BITS Arrow Platform"), + ("MODEL_BITS_BLUE_PLATFORM", "BITS Blue Platform", "BITS Blue Platform"), + ( + "MODEL_BITS_FERRIS_WHEEL_AXLE", + "BITS Ferris Wheel Axle", + "BITS Ferris Wheel Axle", + ), + ( + "MODEL_BITS_OCTAGONAL_PLATFORM", + "BITS Octagonal Platform", + "BITS Octagonal Platform", + ), + ("MODEL_BITS_SEESAW_PLATFORM", "BITS Seesaw Platform", "BITS Seesaw Platform"), + ("MODEL_BITS_SLIDING_PLATFORM", "BITS Sliding Platform", "BITS Sliding Platform"), + ("MODEL_BITS_STAIRCASE", "BITS Staircase", "BITS Staircase"), + ("MODEL_BITS_STAIRCASE_FRAME1", "BITS Staircase Frame1", "BITS Staircase Frame1"), + ("MODEL_BITS_STAIRCASE_FRAME2", "BITS Staircase Frame2", "BITS Staircase Frame2"), + ("MODEL_BITS_STAIRCASE_FRAME3", "BITS Staircase Frame3", "BITS Staircase Frame3"), + ("MODEL_BITS_STAIRCASE_FRAME4", "BITS Staircase Frame4", "BITS Staircase Frame4"), + ( + "MODEL_BITS_TILTING_W_PLATFORM", + "BITS Tilting With Platform", + "BITS Tilting With Platform", + ), + ( + "MODEL_BITS_TWIN_SLIDING_PLATFORMS", + "BITS Twin Sliding Platforms", + "BITS Twin Sliding Platforms", + ), + ("MODEL_BITS_WARP_PIPE", "BITS Warp Pipe", "BITS Warp Pipe"), + ("MODEL_BOB_BARS_GRILLS", "BOB Bars Grills", "BOB Bars Grills"), + ("MODEL_BOB_BUBBLY_TREE", "BOB Bubbly Tree", "BOB Bubbly Tree"), + ("MODEL_BOB_CHAIN_CHOMP_GATE", "BOB Chain Chomp Gate", "BOB Chain Chomp Gate"), + ("MODEL_BOB_SEESAW_PLATFORM", "BOB Seesaw Platform", "BOB Seesaw Platform"), + ("MODEL_BETA_BOO_KEY", "Beta Boo Key", "Beta Boo Key"), + ("MODEL_BIG_CHILL_BULLY", "Big Chill Bully", "Big Chill Bully"), + ("MODEL_BIRDS", "Birds", "Birds"), + ("MODEL_BLACK_BOBOMB", "Black Bobomb", "Black Bobomb"), + ("MODEL_BLARGG", "Blargg", "Blargg"), + ("MODEL_BLUE_COIN", "Blue Coin", "Blue Coin"), + ("MODEL_BLUE_COIN_NO_SHADOW", "Blue Coin No Shadow", "Blue Coin No Shadow"), + ("MODEL_BLUE_COIN_SWITCH", "Blue Coin Switch", "Blue Coin Switch"), + ("MODEL_BLUE_FLAME", "Blue Flame", "Blue Flame"), + ("MODEL_BOBOMB_BUDDY", "Bobomb Buddy", "Bobomb Buddy"), + ("MODEL_BOO", "Boo", "Boo"), + ("MODEL_BOO_CASTLE", "Boo Castle", "Boo Castle"), + ("MODEL_BOOKEND", "Bookend", "Bookend"), + ("MODEL_BOOKEND_PART", "Bookend Part", "Bookend Part"), + ("MODEL_BOWLING_BALL", "Bowling Ball", "Bowling Ball"), + ("MODEL_BOWSER", "Bowser", "Bowser"), + ( + "MODEL_BOWSER_2_TILTING_ARENA", + "Bowser 2 Tilting Arena", + "Bowser 2 Tilting Arena", + ), + ( + "MODEL_BOWSER_3_FALLING_PLATFORM_1", + "Bowser 3 Falling Platform 1", + "Bowser 3 Falling Platform 1", + ), + ( + "MODEL_BOWSER_3_FALLING_PLATFORM_10", + "Bowser 3 Falling Platform 10", + "Bowser 3 Falling Platform 10", + ), + ( + "MODEL_BOWSER_3_FALLING_PLATFORM_2", + "Bowser 3 Falling Platform 2", + "Bowser 3 Falling Platform 2", + ), + ( + "MODEL_BOWSER_3_FALLING_PLATFORM_3", + "Bowser 3 Falling Platform 3", + "Bowser 3 Falling Platform 3", + ), + ( + "MODEL_BOWSER_3_FALLING_PLATFORM_4", + "Bowser 3 Falling Platform 4", + "Bowser 3 Falling Platform 4", + ), + ( + "MODEL_BOWSER_3_FALLING_PLATFORM_5", + "Bowser 3 Falling Platform 5", + "Bowser 3 Falling Platform 5", + ), + ( + "MODEL_BOWSER_3_FALLING_PLATFORM_6", + "Bowser 3 Falling Platform 6", + "Bowser 3 Falling Platform 6", + ), + ( + "MODEL_BOWSER_3_FALLING_PLATFORM_7", + "Bowser 3 Falling Platform 7", + "Bowser 3 Falling Platform 7", + ), + ( + "MODEL_BOWSER_3_FALLING_PLATFORM_8", + "Bowser 3 Falling Platform 8", + "Bowser 3 Falling Platform 8", + ), + ( + "MODEL_BOWSER_3_FALLING_PLATFORM_9", + "Bowser 3 Falling Platform 9", + "Bowser 3 Falling Platform 9", + ), + ("MODEL_BOWSER_BOMB", "Bowser Bomb", "Bowser Bomb"), + ("MODEL_BOWSER_BOMB_CHILD_OBJ", "Bowser Bomb Child Obj", "Bowser Bomb Child Obj"), + ("MODEL_BOWSER_FLAMES", "Bowser Flames", "Bowser Flames"), + ("MODEL_BOWSER_KEY", "Bowser Key", "Bowser Key"), + ("MODEL_BOWSER_KEY_CUTSCENE", "Bowser Key Cutscene", "Bowser Key Cutscene"), + ("MODEL_BOWSER_SMOKE", "Bowser Smoke", "Bowser Smoke"), + ("MODEL_BOWSER_WAVE", "Bowser Wave", "Bowser Wave"), + ("MODEL_BOWSER2", "Bowser2", "Bowser2"), + ("MODEL_BREAKABLE_BOX", "Breakable Box", "Breakable Box"), + ("MODEL_BREAKABLE_BOX_SMALL", "Breakable Box Small", "Breakable Box Small"), + ("MODEL_BUB", "Bub", "Bub"), + ("MODEL_BUBBA", "Bubba", "Bubba"), + ("MODEL_BUBBLE", "Bubble", "Bubble"), + ("MODEL_BULLET_BILL", "Bullet Bill", "Bullet Bill"), + ("MODEL_BULLY", "Bully", "Bully"), + ("MODEL_BULLY_BOSS", "Bully Boss", "Bully Boss"), + ("MODEL_BURN_SMOKE", "Burn Smoke", "Burn Smoke"), + ("MODEL_BURN_SMOKE_UNUSED", "Burn Smoke Unused", "Burn Smoke Unused"), + ("MODEL_BUTTERFLY", "Butterfly", "Butterfly"), + ("MODEL_CCM_CABIN_DOOR", "CCM Cabin Door", "CCM Cabin Door"), + ("MODEL_CCM_ROPEWAY_LIFT", "CCM Ropeway Lift", "CCM Ropeway Lift"), + ("MODEL_CCM_SNOW_TREE", "CCM Snow Tree", "CCM Snow Tree"), + ("MODEL_CCM_SNOWMAN_BASE", "CCM Snowman Base", "CCM Snowman Base"), + ("MODEL_CCM_SNOWMAN_HEAD", "CCM Snowman Head", "CCM Snowman Head"), + ("MODEL_CANNON_BARREL", "Cannon Barrel", "Cannon Barrel"), + ("MODEL_CANNON_BASE", "Cannon Base", "Cannon Base"), + ("MODEL_CAP_SWITCH", "Cap Switch", "Cap Switch"), + ("MODEL_CAP_SWITCH_BASE", "Cap Switch Base", "Cap Switch Base"), + ( + "MODEL_CAP_SWITCH_EXCLAMATION", + "Cap Switch Exclamation", + "Cap Switch Exclamation", + ), + ("MODEL_CARTOON_STAR", "Cartoon Star", "Cartoon Star"), + ("MODEL_CASTLE_BOWSER_TRAP", "Castle Bowser Trap", "Castle Bowser Trap"), + ("MODEL_CASTLE_CASTLE_DOOR", "Castle Castle Door", "Castle Castle Door"), + ( + "MODEL_CASTLE_CASTLE_DOOR_UNUSED", + "Castle Castle Door Unused", + "Castle Castle Door Unused", + ), + ( + "MODEL_CASTLE_CLOCK_HOUR_HAND", + "Castle Clock Hour Hand", + "Castle Clock Hour Hand", + ), + ( + "MODEL_CASTLE_CLOCK_MINUTE_HAND", + "Castle Clock Minute Hand", + "Castle Clock Minute Hand", + ), + ("MODEL_CASTLE_CLOCK_PENDULUM", "Castle Clock Pendulum", "Castle Clock Pendulum"), + ("MODEL_CASTLE_DOOR_0_STARS", "Castle Door 0 Stars", "Castle Door 0 Stars"), + ("MODEL_CASTLE_DOOR_1_STAR", "Castle Door 1 Star", "Castle Door 1 Star"), + ("MODEL_CASTLE_DOOR_3_STARS", "Castle Door 3 Stars", "Castle Door 3 Stars"), + ( + "MODEL_CASTLE_GROUNDS_BUBBLY_TREE", + "Castle Grounds Bubbly Tree", + "Castle Grounds Bubbly Tree", + ), + ( + "MODEL_CASTLE_GROUNDS_CANNON_GRILL", + "Castle Grounds Cannon Grill", + "Castle Grounds Cannon Grill", + ), + ( + "MODEL_CASTLE_GROUNDS_CASTLE_DOOR", + "Castle Grounds Castle Door", + "Castle Grounds Castle Door", + ), + ("MODEL_CASTLE_GROUNDS_FLAG", "Castle Grounds Flag", "Castle Grounds Flag"), + ( + "MODEL_CASTLE_GROUNDS_METAL_DOOR", + "Castle Grounds Metal Door", + "Castle Grounds Metal Door", + ), + ( + "MODEL_CASTLE_GROUNDS_VCUTM_GRILL", + "Castle Grounds Vcutm Grill", + "Castle Grounds Vcutm Grill", + ), + ( + "MODEL_CASTLE_GROUNDS_WARP_PIPE", + "Castle Grounds Warp Pipe", + "Castle Grounds Warp Pipe", + ), + ("MODEL_CASTLE_KEY_DOOR", "Castle Key Door", "Castle Key Door"), + ("MODEL_CASTLE_METAL_DOOR", "Castle Metal Door", "Castle Metal Door"), + ( + "MODEL_CASTLE_STAR_DOOR_30_STARS", + "Castle Star Door 30 Stars", + "Castle Star Door 30 Stars", + ), + ( + "MODEL_CASTLE_STAR_DOOR_50_STARS", + "Castle Star Door 50 Stars", + "Castle Star Door 50 Stars", + ), + ( + "MODEL_CASTLE_STAR_DOOR_70_STARS", + "Castle Star Door 70 Stars", + "Castle Star Door 70 Stars", + ), + ( + "MODEL_CASTLE_STAR_DOOR_8_STARS", + "Castle Star Door 8 Stars", + "Castle Star Door 8 Stars", + ), + ( + "MODEL_CASTLE_WATER_LEVEL_PILLAR", + "Castle Water Level Pillar", + "Castle Water Level Pillar", + ), + ("MODEL_CASTLE_WOODEN_DOOR", "Castle Wooden Door", "Castle Wooden Door"), + ( + "MODEL_CASTLE_WOODEN_DOOR_UNUSED", + "Castle Wooden Door Unused", + "Castle Wooden Door Unused", + ), + ("MODEL_CHAIN_CHOMP", "Chain Chomp", "Chain Chomp"), + ("MODEL_CHECKERBOARD_PLATFORM", "Checkerboard Platform", "Checkerboard Platform"), + ("MODEL_CHILL_BULLY", "Chill Bully", "Chill Bully"), + ("MODEL_CHUCKYA", "Chuckya", "Chuckya"), + ("MODEL_CLAM_SHELL", "Clam Shell", "Clam Shell"), + ("MODEL_COURTYARD_SPIKY_TREE", "Courtyard Spiky Tree", "Courtyard Spiky Tree"), + ("MODEL_COURTYARD_WOODEN_DOOR", "Courtyard Wooden Door", "Courtyard Wooden Door"), + ("MODEL_CYAN_FISH", "Cyan Fish", "Cyan Fish"), + ("MODEL_DDD_BOWSER_SUB", "DDD Bowser Sub", "DDD Bowser Sub"), + ("MODEL_DDD_BOWSER_SUB_DOOR", "DDD Bowser Sub Door", "DDD Bowser Sub Door"), + ("MODEL_DDD_POLE", "DDD Pole", "DDD Pole"), + ("MODEL_DL_CANNON_LID", "DL Cannon Lid", "DL Cannon Lid"), + ("MODEL_DL_MONTY_MOLE_HOLE", "DL Monty Mole Hole", "DL Monty Mole Hole"), + ("MODEL_DL_WHIRLPOOL", "DL Whirlpool", "DL Whirlpool"), + ("MODEL_DIRT_ANIMATION", "Dirt Animation", "Dirt Animation"), + ("MODEL_DORRIE", "Dorrie", "Dorrie"), + ("MODEL_ENEMY_LAKITU", "Enemy Lakitu", "Enemy Lakitu"), + ("MODEL_EXCLAMATION_BOX", "Exclamation Box", "Exclamation Box"), + ( + "MODEL_EXCLAMATION_BOX_OUTLINE", + "Exclamation Box Outline", + "Exclamation Box Outline", + ), + ("MODEL_EXCLAMATION_POINT", "Exclamation Point", "Exclamation Point"), + ("MODEL_EXPLOSION", "Explosion", "Explosion"), + ("MODEL_EYEROK_LEFT_HAND", "Eyerok Left Hand", "Eyerok Left Hand"), + ("MODEL_EYEROK_RIGHT_HAND", "Eyerok Right Hand", "Eyerok Right Hand"), + ("MODEL_FISH", "Fish", "Fish"), + ("MODEL_FISH_SHADOW", "Fish Shadow", "Fish Shadow"), + ("MODEL_FLYGUY", "Flyguy", "Flyguy"), + ("MODEL_FWOOSH", "Fwoosh", "Fwoosh"), + ("MODEL_GOOMBA", "Goomba", "Goomba"), + ("MODEL_HMC_ELEVATOR_PLATFORM", "HMC Elevator Platform", "HMC Elevator Platform"), + ("MODEL_HMC_HAZY_MAZE_DOOR", "HMC Hazy Maze Door", "HMC Hazy Maze Door"), + ( + "MODEL_HMC_METAL_ARROW_PLATFORM", + "HMC Metal Arrow Platform", + "HMC Metal Arrow Platform", + ), + ("MODEL_HMC_METAL_DOOR", "HMC Metal Door", "HMC Metal Door"), + ("MODEL_HMC_METAL_PLATFORM", "HMC Metal Platform", "HMC Metal Platform"), + ("MODEL_HMC_RED_GRILLS", "HMC Red Grills", "HMC Red Grills"), + ("MODEL_HMC_ROCK_PIECE", "HMC Rock Piece", "HMC Rock Piece"), + ("MODEL_HMC_ROCK_SMALL_PIECE", "HMC Rock Small Piece", "HMC Rock Small Piece"), + ("MODEL_HMC_ROLLING_ROCK", "HMC Rolling Rock", "HMC Rolling Rock"), + ("MODEL_HMC_WOODEN_DOOR", "HMC Wooden Door", "HMC Wooden Door"), + ("MODEL_HAUNTED_CAGE", "Haunted Cage", "Haunted Cage"), + ("MODEL_HAUNTED_CHAIR", "Haunted Chair", "Haunted Chair"), + ("MODEL_HEART", "Heart", "Heart"), + ("MODEL_HEAVE_HO", "Heave Ho", "Heave Ho"), + ("MODEL_HOOT", "Hoot", "Hoot"), + ("MODEL_IDLE_WATER_WAVE", "Idle Water Wave", "Idle Water Wave"), + ("MODEL_JRB_FALLING_PILLAR", "JRB Falling Pillar", "JRB Falling Pillar"), + ( + "MODEL_JRB_FALLING_PILLAR_BASE", + "JRB Falling Pillar Base", + "JRB Falling Pillar Base", + ), + ("MODEL_JRB_FLOATING_PLATFORM", "JRB Floating Platform", "JRB Floating Platform"), + ("MODEL_JRB_ROCK", "JRB Rock", "JRB Rock"), + ( + "MODEL_JRB_SHIP_BACK_LEFT_PART", + "JRB Ship Back Left Part", + "JRB Ship Back Left Part", + ), + ( + "MODEL_JRB_SHIP_BACK_RIGHT_PART", + "JRB Ship Back Right Part", + "JRB Ship Back Right Part", + ), + ( + "MODEL_JRB_SHIP_LEFT_HALF_PART", + "JRB Ship Left Half Part", + "JRB Ship Left Half Part", + ), + ( + "MODEL_JRB_SHIP_RIGHT_HALF_PART", + "JRB Ship Right Half Part", + "JRB Ship Right Half Part", + ), + ("MODEL_JRB_SLIDING_BOX", "JRB Sliding Box", "JRB Sliding Box"), + ("MODEL_JRB_SUNKEN_SHIP", "JRB Sunken Ship", "JRB Sunken Ship"), + ("MODEL_JRB_SUNKEN_SHIP_BACK", "JRB Sunken Ship Back", "JRB Sunken Ship Back"), + ("MODEL_KING_BOBOMB", "King Bobomb", "King Bobomb"), + ("MODEL_KLEPTO", "Klepto", "Klepto"), + ("MODEL_KOOPA_FLAG", "Koopa Flag", "Koopa Flag"), + ("MODEL_KOOPA_SHELL", "Koopa Shell", "Koopa Shell"), + ("MODEL_KOOPA_WITH_SHELL", "Koopa With Shell", "Koopa With Shell"), + ("MODEL_KOOPA_WITHOUT_SHELL", "Koopa Without Shell", "Koopa Without Shell"), + ("MODEL_LLL_BOWSER_PIECE_1", "LLL Bowser Piece 1", "LLL Bowser Piece 1"), + ("MODEL_LLL_BOWSER_PIECE_10", "LLL Bowser Piece 10", "LLL Bowser Piece 10"), + ("MODEL_LLL_BOWSER_PIECE_11", "LLL Bowser Piece 11", "LLL Bowser Piece 11"), + ("MODEL_LLL_BOWSER_PIECE_12", "LLL Bowser Piece 12", "LLL Bowser Piece 12"), + ("MODEL_LLL_BOWSER_PIECE_13", "LLL Bowser Piece 13", "LLL Bowser Piece 13"), + ("MODEL_LLL_BOWSER_PIECE_14", "LLL Bowser Piece 14", "LLL Bowser Piece 14"), + ("MODEL_LLL_BOWSER_PIECE_2", "LLL Bowser Piece 2", "LLL Bowser Piece 2"), + ("MODEL_LLL_BOWSER_PIECE_3", "LLL Bowser Piece 3", "LLL Bowser Piece 3"), + ("MODEL_LLL_BOWSER_PIECE_4", "LLL Bowser Piece 4", "LLL Bowser Piece 4"), + ("MODEL_LLL_BOWSER_PIECE_5", "LLL Bowser Piece 5", "LLL Bowser Piece 5"), + ("MODEL_LLL_BOWSER_PIECE_6", "LLL Bowser Piece 6", "LLL Bowser Piece 6"), + ("MODEL_LLL_BOWSER_PIECE_7", "LLL Bowser Piece 7", "LLL Bowser Piece 7"), + ("MODEL_LLL_BOWSER_PIECE_8", "LLL Bowser Piece 8", "LLL Bowser Piece 8"), + ("MODEL_LLL_BOWSER_PIECE_9", "LLL Bowser Piece 9", "LLL Bowser Piece 9"), + ("MODEL_LLL_DRAWBRIDGE_PART", "LLL Drawbridge Part", "LLL Drawbridge Part"), + ("MODEL_LLL_FALLING_PLATFORM", "LLL Falling Platform", "LLL Falling Platform"), + ( + "MODEL_LLL_LARGE_FALLING_PLATFORM", + "LLL Large Falling Platform", + "LLL Large Falling Platform", + ), + ("MODEL_LLL_LARGE_WOOD_BRIDGE", "LLL Large Wood Bridge", "LLL Large Wood Bridge"), + ( + "MODEL_LLL_MOVING_OCTAGONAL_MESH_PLATFORM", + "LLL Moving Octagonal Mesh Platform", + "LLL Moving Octagonal Mesh Platform", + ), + ("MODEL_LLL_ROLLING_LOG", "LLL Rolling Log", "LLL Rolling Log"), + ( + "MODEL_LLL_ROTATING_BLOCK_FIRE_BARS", + "LLL Rotating Block Fire Bars", + "LLL Rotating Block Fire Bars", + ), + ( + "MODEL_LLL_ROTATING_HEXAGONAL_PLATFORM", + "LLL Rotating Hexagonal Platform", + "LLL Rotating Hexagonal Platform", + ), + ( + "MODEL_LLL_ROTATING_HEXAGONAL_RING", + "LLL Rotating Hexagonal Ring", + "LLL Rotating Hexagonal Ring", + ), + ( + "MODEL_LLL_SINKING_RECTANGULAR_PLATFORM", + "LLL Sinking Rectangular Platform", + "LLL Sinking Rectangular Platform", + ), + ( + "MODEL_LLL_SINKING_ROCK_BLOCK", + "LLL Sinking Rock Block", + "LLL Sinking Rock Block", + ), + ( + "MODEL_LLL_SINKING_SQUARE_PLATFORMS", + "LLL Sinking Square Platforms", + "LLL Sinking Square Platforms", + ), + ( + "MODEL_LLL_TILTING_SQUARE_PLATFORM", + "LLL Tilting Square Platform", + "LLL Tilting Square Platform", + ), + ( + "MODEL_LLL_VOLCANO_FALLING_TRAP", + "LLL Volcano Falling Trap", + "LLL Volcano Falling Trap", + ), + ("MODEL_LLL_WOOD_BRIDGE", "LLL Wood Bridge", "LLL Wood Bridge"), + ("MODEL_LAKITU", "Lakitu", "Lakitu"), + ("MODEL_LEAVES", "Leaves", "Leaves"), + ("MODEL_LEVEL_GEOMETRY_03", "Level Geometry 03", "Level Geometry 03"), + ("MODEL_LEVEL_GEOMETRY_03", "Level Geometry 03", "Level Geometry 03"), + ("MODEL_LEVEL_GEOMETRY_04", "Level Geometry 04", "Level Geometry 04"), + ("MODEL_LEVEL_GEOMETRY_04", "Level Geometry 04", "Level Geometry 04"), + ("MODEL_LEVEL_GEOMETRY_05", "Level Geometry 05", "Level Geometry 05"), + ("MODEL_LEVEL_GEOMETRY_05", "Level Geometry 05", "Level Geometry 05"), + ("MODEL_LEVEL_GEOMETRY_06", "Level Geometry 06", "Level Geometry 06"), + ("MODEL_LEVEL_GEOMETRY_06", "Level Geometry 06", "Level Geometry 06"), + ("MODEL_LEVEL_GEOMETRY_07", "Level Geometry 07", "Level Geometry 07"), + ("MODEL_LEVEL_GEOMETRY_07", "Level Geometry 07", "Level Geometry 07"), + ("MODEL_LEVEL_GEOMETRY_08", "Level Geometry 08", "Level Geometry 08"), + ("MODEL_LEVEL_GEOMETRY_08", "Level Geometry 08", "Level Geometry 08"), + ("MODEL_LEVEL_GEOMETRY_09", "Level Geometry 09", "Level Geometry 09"), + ("MODEL_LEVEL_GEOMETRY_09", "Level Geometry 09", "Level Geometry 09"), + ("MODEL_LEVEL_GEOMETRY_09", "Level Geometry 09", "Level Geometry 09"), + ("MODEL_LEVEL_GEOMETRY_0A", "Level Geometry 0A", "Level Geometry 0A"), + ("MODEL_LEVEL_GEOMETRY_0A", "Level Geometry 0A", "Level Geometry 0A"), + ("MODEL_LEVEL_GEOMETRY_0B", "Level Geometry 0B", "Level Geometry 0B"), + ("MODEL_LEVEL_GEOMETRY_0B", "Level Geometry 0B", "Level Geometry 0B"), + ("MODEL_LEVEL_GEOMETRY_0C", "Level Geometry 0C", "Level Geometry 0C"), + ("MODEL_LEVEL_GEOMETRY_0C", "Level Geometry 0C", "Level Geometry 0C"), + ("MODEL_LEVEL_GEOMETRY_0D", "Level Geometry 0D", "Level Geometry 0D"), + ("MODEL_LEVEL_GEOMETRY_0D", "Level Geometry 0D", "Level Geometry 0D"), + ("MODEL_LEVEL_GEOMETRY_0E", "Level Geometry 0E", "Level Geometry 0E"), + ("MODEL_LEVEL_GEOMETRY_0F", "Level Geometry 0F", "Level Geometry 0F"), + ("MODEL_LEVEL_GEOMETRY_10", "Level Geometry 10", "Level Geometry 10"), + ("MODEL_LEVEL_GEOMETRY_10", "Level Geometry 10", "Level Geometry 10"), + ("MODEL_LEVEL_GEOMETRY_11", "Level Geometry 11", "Level Geometry 11"), + ("MODEL_LEVEL_GEOMETRY_12", "Level Geometry 12", "Level Geometry 12"), + ("MODEL_LEVEL_GEOMETRY_12", "Level Geometry 12", "Level Geometry 12"), + ("MODEL_LEVEL_GEOMETRY_13", "Level Geometry 13", "Level Geometry 13"), + ("MODEL_LEVEL_GEOMETRY_14", "Level Geometry 14", "Level Geometry 14"), + ("MODEL_LEVEL_GEOMETRY_15", "Level Geometry 15", "Level Geometry 15"), + ("MODEL_LEVEL_GEOMETRY_16", "Level Geometry 16", "Level Geometry 16"), + ("MODEL_LEVEL_GEOMETRY_16", "Level Geometry 16", "Level Geometry 16"), + ("MODEL_LEVEL_GEOMETRY_16", "Level Geometry 16", "Level Geometry 16"), + ("MODEL_LEVEL_GEOMETRY_16", "Level Geometry 16", "Level Geometry 16"), + ("MODEL_LUIGI", "Luigi", "Luigi"), + ("MODEL_MAD_PIANO", "Mad Piano", "Mad Piano"), + ( + "MODEL_MAIN_MENU_BLUE_COPY_BUTTON", + "Main Menu Blue Copy Button", + "Main Menu Blue Copy Button", + ), + ( + "MODEL_MAIN_MENU_GENERIC_BUTTON", + "Main Menu Generic Button", + "Main Menu Generic Button", + ), + ( + "MODEL_MAIN_MENU_GREEN_SCORE_BUTTON", + "Main Menu Green Score Button", + "Main Menu Green Score Button", + ), + ( + "MODEL_MAIN_MENU_MARIO_NEW_BUTTON", + "Main Menu Mario New Button", + "Main Menu Mario New Button", + ), + ( + "MODEL_MAIN_MENU_MARIO_NEW_BUTTON_FADE", + "Main Menu Mario New Button Fade", + "Main Menu Mario New Button Fade", + ), + ( + "MODEL_MAIN_MENU_MARIO_SAVE_BUTTON", + "Main Menu Mario Save Button", + "Main Menu Mario Save Button", + ), + ( + "MODEL_MAIN_MENU_MARIO_SAVE_BUTTON_FADE", + "Main Menu Mario Save Button Fade", + "Main Menu Mario Save Button Fade", + ), + ( + "MODEL_MAIN_MENU_PURPLE_SOUND_BUTTON", + "Main Menu Purple Sound Button", + "Main Menu Purple Sound Button", + ), + ( + "MODEL_MAIN_MENU_RED_ERASE_BUTTON", + "Main Menu Red Erase Button", + "Main Menu Red Erase Button", + ), + ( + "MODEL_MAIN_MENU_YELLOW_FILE_BUTTON", + "Main Menu Yellow File Button", + "Main Menu Yellow File Button", + ), + ("MODEL_MANTA_RAY", "Manta Ray", "Manta Ray"), + ("MODEL_MARIO", "Mario", "Mario"), + ("MODEL_MARIOS_CAP", "Mario's Cap", "Mario's Cap"), + ("MODEL_MARIOS_METAL_CAP", "Mario's Metal Cap", "Mario's Metal Cap"), + ("MODEL_MARIOS_WING_CAP", "Mario's Wing Cap", "Mario's Wing Cap"), + ( + "MODEL_MARIOS_WINGED_METAL_CAP", + "Mario's Winged Metal Cap", + "Mario's Winged Metal Cap", + ), + ("MODEL_METAL_BOX", "Metal Box", "Metal Box"), + ("MODEL_METAL_BOX_DL", "Metal Box DL", "Metal Box DL"), + ("MODEL_METALLIC_BALL", "Metallic Ball", "Metallic Ball"), + ("MODEL_MIPS", "Mips", "Mips"), + ("MODEL_MIST", "Mist", "Mist"), + ("MODEL_MONEYBAG", "Moneybag", "Moneybag"), + ("MODEL_MONTY_MOLE", "Monty Mole", "Monty Mole"), + ("MODEL_MR_BLIZZARD", "Mr. Blizzard", "Mr. Blizzard"), + ("MODEL_MR_BLIZZARD_HIDDEN", "Mr. Blizzard Hidden", "Mr. Blizzard Hidden"), + ("MODEL_MR_I", "Mr. I", "Mr. I"), + ("MODEL_MR_I_IRIS", "Mr. I Iris", "Mr. I Iris"), + ("MODEL_NONE", "None", "None"), + ("MODEL_NUMBER", "Number", "Number"), + ("MODEL_PEACH", "Peach", "Peach"), + ("MODEL_PEBBLE", "Pebble", "Pebble"), + ("MODEL_PENGUIN", "Penguin", "Penguin"), + ("MODEL_PIRANHA_PLANT", "Piranha Plant", "Piranha Plant"), + ("MODEL_POKEY_BODY_PART", "Pokey Body Part", "Pokey Body Part"), + ("MODEL_POKEY_HEAD", "Pokey Head", "Pokey Head"), + ("MODEL_PURPLE_MARBLE", "Purple Marble", "Purple Marble"), + ("MODEL_PURPLE_SWITCH", "Purple Switch", "Purple Switch"), + ("MODEL_RR_CRUISER_WING", "RR Cruiser Wing", "RR Cruiser Wing"), + ("MODEL_RR_DONUT_PLATFORM", "RR Donut Platform", "RR Donut Platform"), + ("MODEL_RR_ELEVATOR_PLATFORM", "RR Elevator Platform", "RR Elevator Platform"), + ("MODEL_RR_FLYING_CARPET", "RR Flying Carpet", "RR Flying Carpet"), + ("MODEL_RR_L_SHAPED_PLATFORM", "RR L Shaped Platform", "RR L Shaped Platform"), + ("MODEL_RR_OCTAGONAL_PLATFORM", "RR Octagonal Platform", "RR Octagonal Platform"), + ( + "MODEL_RR_ROTATING_BRIDGE_PLATFORM", + "RR Rotating Bridge Platform", + "RR Rotating Bridge Platform", + ), + ("MODEL_RR_SEESAW_PLATFORM", "RR Seesaw Platform", "RR Seesaw Platform"), + ("MODEL_RR_SLIDING_PLATFORM", "RR Sliding Platform", "RR Sliding Platform"), + ("MODEL_RR_SWINGING_PLATFORM", "RR Swinging Platform", "RR Swinging Platform"), + ("MODEL_RR_TRIANGLE_PLATFORM", "RR Triangle Platform", "RR Triangle Platform"), + ("MODEL_RR_TRICKY_TRIANGLES", "RR Tricky Triangles", "RR Tricky Triangles"), + ( + "MODEL_RR_TRICKY_TRIANGLES_FRAME1", + "RR Tricky Triangles Frame1", + "RR Tricky Triangles Frame1", + ), + ( + "MODEL_RR_TRICKY_TRIANGLES_FRAME2", + "RR Tricky Triangles Frame2", + "RR Tricky Triangles Frame2", + ), + ( + "MODEL_RR_TRICKY_TRIANGLES_FRAME3", + "RR Tricky Triangles Frame3", + "RR Tricky Triangles Frame3", + ), + ( + "MODEL_RR_TRICKY_TRIANGLES_FRAME4", + "RR Tricky Triangles Frame4", + "RR Tricky Triangles Frame4", + ), + ("MODEL_RED_COIN", "Red Coin", "Red Coin"), + ("MODEL_RED_COIN_NO_SHADOW", "Red Coin No Shadow", "Red Coin No Shadow"), + ("MODEL_RED_FLAME", "Red Flame", "Red Flame"), + ("MODEL_RED_FLAME_SHADOW", "Red Flame Shadow", "Red Flame Shadow"), + ("MODEL_SL_CRACKED_ICE", "SL Cracked Ice", "SL Cracked Ice"), + ("MODEL_SL_CRACKED_ICE_CHUNK", "SL Cracked Ice Chunk", "SL Cracked Ice Chunk"), + ("MODEL_SL_SNOW_TREE", "SL Snow Tree", "SL Snow Tree"), + ("MODEL_SL_SNOW_TRIANGLE", "SL Snow Triangle", "SL Snow Triangle"), + ("MODEL_SSL_GRINDEL", "SSL Grindel", "SSL Grindel"), + ( + "MODEL_SSL_MOVING_PYRAMID_WALL", + "SSL Moving Pyramid Wall", + "SSL Moving Pyramid Wall", + ), + ("MODEL_SSL_PALM_TREE", "SSL Palm Tree", "SSL Palm Tree"), + ("MODEL_SSL_PYRAMID_ELEVATOR", "SSL Pyramid Elevator", "SSL Pyramid Elevator"), + ("MODEL_SSL_PYRAMID_TOP", "SSL Pyramid Top", "SSL Pyramid Top"), + ("MODEL_SSL_SPINDEL", "SSL Spindel", "SSL Spindel"), + ("MODEL_SSL_TOX_BOX", "SSL Tox Box", "SSL Tox Box"), + ("MODEL_SAND_DUST", "Sand Dust", "Sand Dust"), + ("MODEL_SCUTTLEBUG", "Scuttlebug", "Scuttlebug"), + ("MODEL_SEAWEED", "Seaweed", "Seaweed"), + ("MODEL_SKEETER", "Skeeter", "Skeeter"), + ("MODEL_SMALL_WATER_SPLASH", "Small Water Splash", "Small Water Splash"), + ("MODEL_SMOKE", "Smoke", "Smoke"), + ("MODEL_SNUFIT", "Snufit", "Snufit"), + ("MODEL_SPARKLES", "Sparkles", "Sparkles"), + ("MODEL_SPARKLES_ANIMATION", "Sparkles Animation", "Sparkles Animation"), + ("MODEL_SPINDRIFT", "Spindrift", "Spindrift"), + ("MODEL_SPINY", "Spiny", "Spiny"), + ("MODEL_SPINY_BALL", "Spiny Ball", "Spiny Ball"), + ("MODEL_STAR", "Star", "Star"), + ("MODEL_SUSHI", "Sushi", "Sushi"), + ("MODEL_SWOOP", "Swoop", "Swoop"), + ("MODEL_THI_BUBBLY_TREE", "THI Bubbly Tree", "THI Bubbly Tree"), + ("MODEL_THI_HUGE_ISLAND_TOP", "THI Huge Island Top", "THI Huge Island Top"), + ("MODEL_THI_TINY_ISLAND_TOP", "THI Tiny Island Top", "THI Tiny Island Top"), + ("MODEL_THI_WARP_PIPE", "THI Warp Pipe", "THI Warp Pipe"), + ("MODEL_TTC_CLOCK_HAND", "TTC Clock Hand", "TTC Clock Hand"), + ("MODEL_TTC_ELEVATOR_PLATFORM", "TTC Elevator Platform", "TTC Elevator Platform"), + ("MODEL_TTC_LARGE_GEAR", "TTC Large Gear", "TTC Large Gear"), + ("MODEL_TTC_LARGE_TREADMILL", "TTC Large Treadmill", "TTC Large Treadmill"), + ("MODEL_TTC_PENDULUM", "TTC Pendulum", "TTC Pendulum"), + ("MODEL_TTC_PIT_BLOCK", "TTC Pit Block", "TTC Pit Block"), + ("MODEL_TTC_PIT_BLOCK_UNUSED", "TTC Pit Block Unused", "TTC Pit Block Unused"), + ("MODEL_TTC_PUSH_BLOCK", "TTC Push Block", "TTC Push Block"), + ("MODEL_TTC_ROTATING_CUBE", "TTC Rotating Cube", "TTC Rotating Cube"), + ("MODEL_TTC_ROTATING_HEXAGON", "TTC Rotating Hexagon", "TTC Rotating Hexagon"), + ("MODEL_TTC_ROTATING_PRISM", "TTC Rotating Prism", "TTC Rotating Prism"), + ("MODEL_TTC_ROTATING_TRIANGLE", "TTC Rotating Triangle", "TTC Rotating Triangle"), + ("MODEL_TTC_SMALL_GEAR", "TTC Small Gear", "TTC Small Gear"), + ("MODEL_TTC_SMALL_TREADMILL", "TTC Small Treadmill", "TTC Small Treadmill"), + ("MODEL_TTC_SPINNER", "TTC Spinner", "TTC Spinner"), + ("MODEL_TTM_BLUE_SMILEY", "TTM Blue Smiley", "TTM Blue Smiley"), + ("MODEL_TTM_MOON_SMILEY", "TTM Moon Smiley", "TTM Moon Smiley"), + ("MODEL_TTM_ROLLING_LOG", "TTM Rolling Log", "TTM Rolling Log"), + ("MODEL_TTM_SLIDE_EXIT_PODIUM", "TTM Slide Exit Podium", "TTM Slide Exit Podium"), + ("MODEL_TTM_STAR_CAGE", "TTM Star Cage", "TTM Star Cage"), + ("MODEL_TTM_STAR_SMILEY", "TTM Star Smiley", "TTM Star Smiley"), + ("MODEL_TTM_YELLOW_SMILEY", "TTM Yellow Smiley", "TTM Yellow Smiley"), + ("MODEL_THWOMP", "Thwomp", "Thwomp"), + ("MODEL_TOAD", "Toad", "Toad"), + ( + "MODEL_TRAJECTORY_MARKER_BALL", + "Trajectory Marker Ball", + "Trajectory Marker Ball", + ), + ("MODEL_TRAMPOLINE", "Trampoline", "Trampoline"), + ("MODEL_TRAMPOLINE_BASE", "Trampoline Base", "Trampoline Base"), + ("MODEL_TRAMPOLINE_CENTER", "Trampoline Center", "Trampoline Center"), + ("MODEL_TRANSPARENT_STAR", "Transparent Star", "Transparent Star"), + ("MODEL_TREASURE_CHEST_BASE", "Treasure Chest Base", "Treasure Chest Base"), + ("MODEL_TREASURE_CHEST_LID", "Treasure Chest Lid", "Treasure Chest Lid"), + ("MODEL_TWEESTER", "Tweester", "Tweester"), + ("MODEL_UKIKI", "Ukiki", "Ukiki"), + ("MODEL_UNAGI", "Unagi", "Unagi"), + ("MODEL_UNKNOWN_54", "Unknown 54", "Unknown 54"), + ("MODEL_UNKNOWN_58", "Unknown 58", "Unknown 58"), + ("MODEL_UNKNOWN_7D", "Unknown 7D", "Unknown 7D"), + ("MODEL_UNKNOWN_AC", "Unknown AC", "Unknown AC"), + ("MODEL_UNKNOWN_B8", "Unknown B8", "Unknown B8"), + ("MODEL_UNKNOWN_DOOR_1E", "Unknown Door 1E", "Unknown Door 1E"), + ("MODEL_UNKNOWN_DOOR_21", "Unknown Door 21", "Unknown Door 21"), + ("MODEL_UNKNOWN_DOOR_28", "Unknown Door 28", "Unknown Door 28"), + ("MODEL_UNKNOWN_DOOR_2A", "Unknown Door 2A", "Unknown Door 2A"), + ("MODEL_UNKNOWN_DOOR_2B", "Unknown Door 2B", "Unknown Door 2B"), + ("MODEL_UNKNOWN_TREE_1A", "Unknown Tree 1A", "Unknown Tree 1A"), + ( + "MODEL_VCUTM_CHECKERBOARD_PLATFORM_SPAWNER", + "Vcutm Checkerboard Platform Spawner", + "Vcutm Checkerboard Platform Spawner", + ), + ("MODEL_VCUTM_SEESAW_PLATFORM", "Vcutm Seesaw Platform", "Vcutm Seesaw Platform"), + ("MODEL_VCUTM_WARP_PIPE", "Vcutm Warp Pipe", "Vcutm Warp Pipe"), + ("MODEL_WDW_ARROW_LIFT", "WDW Arrow Lift", "WDW Arrow Lift"), + ("MODEL_WDW_BUBBLY_TREE", "WDW Bubbly Tree", "WDW Bubbly Tree"), + ("MODEL_WDW_EXPRESS_ELEVATOR", "WDW Express Elevator", "WDW Express Elevator"), + ("MODEL_WDW_HIDDEN_PLATFORM", "WDW Hidden Platform", "WDW Hidden Platform"), + ( + "MODEL_WDW_RECTANGULAR_FLOATING_PLATFORM", + "WDW Rectangular Floating Platform", + "WDW Rectangular Floating Platform", + ), + ("MODEL_WDW_ROTATING_PLATFORM", "WDW Rotating Platform", "WDW Rotating Platform"), + ( + "MODEL_WDW_SQUARE_FLOATING_PLATFORM", + "WDW Square Floating Platform", + "WDW Square Floating Platform", + ), + ( + "MODEL_WDW_WATER_LEVEL_DIAMOND", + "WDW Water Level Diamond", + "WDW Water Level Diamond", + ), + ( + "MODEL_WF_BREAKABLE_WALL_LEFT", + "WF Breakable Wall Left", + "WF Breakable Wall Left", + ), + ( + "MODEL_WF_BREAKABLE_WALL_RIGHT", + "WF Breakable Wall Right", + "WF Breakable Wall Right", + ), + ("MODEL_WF_BUBBLY_TREE", "WF Bubbly Tree", "WF Bubbly Tree"), + ("MODEL_WF_GIANT_POLE", "WF Giant Pole", "WF Giant Pole"), + ("MODEL_WF_KICKABLE_BOARD", "WF Kickable Board", "WF Kickable Board"), + ( + "MODEL_WF_KICKABLE_BOARD_FELLED", + "WF Kickable Board Felled", + "WF Kickable Board Felled", + ), + ("MODEL_WF_LARGE_BOMP", "WF Large Bomp", "WF Large Bomp"), + ("MODEL_WF_ROTATING_PLATFORM", "WF Rotating Platform", "WF Rotating Platform"), + ( + "MODEL_WF_ROTATING_WOODEN_PLATFORM", + "WF Rotating Wooden Platform", + "WF Rotating Wooden Platform", + ), + ("MODEL_WF_SLIDING_PLATFORM", "WF Sliding Platform", "WF Sliding Platform"), + ("MODEL_WF_SMALL_BOMP", "WF Small Bomp", "WF Small Bomp"), + ("MODEL_WF_TOWER_DOOR", "WF Tower Door", "WF Tower Door"), + ( + "MODEL_WF_TOWER_SQUARE_PLATORM", + "WF Tower Square Platorm", + "WF Tower Square Platorm", + ), + ( + "MODEL_WF_TOWER_SQUARE_PLATORM_ELEVATOR", + "WF Tower Square Platorm Elevator", + "WF Tower Square Platorm Elevator", + ), + ( + "MODEL_WF_TOWER_SQUARE_PLATORM_UNUSED", + "WF Tower Square Platorm Unused", + "WF Tower Square Platorm Unused", + ), + ( + "MODEL_WF_TOWER_TRAPEZOID_PLATORM", + "WF Tower Trapezoid Platorm", + "WF Tower Trapezoid Platorm", + ), + ("MODEL_WF_TUMBLING_BRIDGE", "WF Tumbling Bridge", "WF Tumbling Bridge"), + ( + "MODEL_WF_TUMBLING_BRIDGE_PART", + "WF Tumbling Bridge Part", + "WF Tumbling Bridge Part", + ), + ("MODEL_WATER_BOMB", "Water Bomb", "Water Bomb"), + ("MODEL_WATER_BOMB_SHADOW", "Water Bomb Shadow", "Water Bomb Shadow"), + ("MODEL_WATER_MINE", "Water Mine", "Water Mine"), + ("MODEL_WATER_RING", "Water Ring", "Water Ring"), + ("MODEL_WATER_SPLASH", "Water Splash", "Water Splash"), + ("MODEL_WAVE_TRAIL", "Wave Trail", "Wave Trail"), + ("MODEL_WHITE_PARTICLE", "White Particle", "White Particle"), + ("MODEL_WHITE_PARTICLE_DL", "White Particle DL", "White Particle DL"), + ("MODEL_WHITE_PARTICLE_SMALL", "White Particle Small", "White Particle Small"), + ("MODEL_WHITE_PUFF", "White Puff", "White Puff"), + ("MODEL_WHOMP", "Whomp", "Whomp"), + ("MODEL_WIGGLER_BODY", "Wiggler Body", "Wiggler Body"), + ("MODEL_WIGGLER_HEAD", "Wiggler Head", "Wiggler Head"), + ("MODEL_WOODEN_POST", "Wooden Post", "Wooden Post"), + ("MODEL_WOODEN_SIGNPOST", "Wooden Signpost", "Wooden Signpost"), + ("MODEL_YELLOW_COIN", "Yellow Coin", "Yellow Coin"), + ("MODEL_YELLOW_COIN_NO_SHADOW", "Yellow Coin No Shadow", "Yellow Coin No Shadow"), + ("MODEL_YELLOW_SPHERE", "Yellow Sphere", "Yellow Sphere"), + ("MODEL_YOSHI", "Yoshi", "Yoshi"), + ("MODEL_YOSHI_EGG", "Yoshi Egg", "Yoshi Egg"), ] enumSpecialsNames = [ - ('Custom', 'Custom', 'Custom'), - ('special_0stars_door', '0 Stars Door', '0 Stars Door'), - ('special_1star_door', '1 Star Door', '1 Star Door'), - ('special_3star_door', '3 Star Door', '3 Star Door'), - ('special_big_bully', 'Big Bully', 'Big Bully'), - ('special_boo', 'Boo', 'Boo'), - ('special_bowser', 'Bowser', 'Bowser'), - ('special_bubble_tree', 'Bubble Tree', 'Bubble Tree'), - ('special_butterfly', 'Butterfly', 'Butterfly'), - ('special_castle_door', 'Castle Door', 'Castle Door'), - ('special_castle_door_warp', 'Castle Door Warp', 'Castle Door Warp'), - ('special_empty_21', 'Empty 21', 'Empty 21'), - ('special_empty_22', 'Empty 22', 'Empty 22'), - ('special_empty_23', 'Empty 23', 'Empty 23'), - ('special_empty_24', 'Empty 24', 'Empty 24'), - ('special_empty_25', 'Empty 25', 'Empty 25'), - ('special_empty_30', 'Empty 30', 'Empty 30'), - ('special_empty_31', 'Empty 31', 'Empty 31'), - ('special_empty_9', 'Empty 9', 'Empty 9'), - ('special_hmc_door', 'HMC Door', 'HMC Door'), - ('special_haunted_door', 'Haunted Door', 'Haunted Door'), - ('special_jrb_chest', 'JRB Chest', 'JRB Chest'), - ('special_key_door', 'Key Door', 'Key Door'), - ('special_lll_bowser_puzzle', 'LLL Bowser Puzzle', 'LLL Bowser Puzzle'), - ('special_lll_drawbridge_spawner', 'LLL Drawbridge Spawner', 'LLL Drawbridge Spawner'), - ('special_lll_floating_wood_bridge', 'LLL Floating Wood Bridge', 'LLL Floating Wood Bridge'), - ('special_lll_moving_octagonal_mesh_platform', 'LLL Moving Octagonal Mesh Platform', 'LLL Moving Octagonal Mesh Platform'), - ('special_lll_rotating_block_with_fire_bars', 'LLL Rotating Block With Fire Bars', 'LLL Rotating Block With Fire Bars'), - ('special_lll_rotating_hexagonal_ring', 'LLL Rotating Hexagonal Ring', 'LLL Rotating Hexagonal Ring'), - ('special_lll_sinking_rectangular_platform', 'LLL Sinking Rectangular Platform', 'LLL Sinking Rectangular Platform'), - ('special_lll_sinking_square_platforms', 'LLL Sinking Square Platforms', 'LLL Sinking Square Platforms'), - ('special_lll_tilting_square_platform', 'LLL Tilting Square Platform', 'LLL Tilting Square Platform'), - ('special_large_bomp', 'Large Bomp', 'Large Bomp'), - ('special_level_geo_03', 'Level Geo 03', 'Level Geo 03'), - ('special_level_geo_04', 'Level Geo 04', 'Level Geo 04'), - ('special_level_geo_05', 'Level Geo 05', 'Level Geo 05'), - ('special_level_geo_06', 'Level Geo 06', 'Level Geo 06'), - ('special_level_geo_07', 'Level Geo 07', 'Level Geo 07'), - ('special_level_geo_08', 'Level Geo 08', 'Level Geo 08'), - ('special_level_geo_09', 'Level Geo 09', 'Level Geo 09'), - ('special_level_geo_0A', 'Level Geo 0A', 'Level Geo 0A'), - ('special_level_geo_0B', 'Level Geo 0B', 'Level Geo 0B'), - ('special_level_geo_0C', 'Level Geo 0C', 'Level Geo 0C'), - ('special_level_geo_0D', 'Level Geo 0D', 'Level Geo 0D'), - ('special_level_geo_0E', 'Level Geo 0E', 'Level Geo 0E'), - ('special_level_geo_0F', 'Level Geo 0F', 'Level Geo 0F'), - ('special_level_geo_10', 'Level Geo 10', 'Level Geo 10'), - ('special_level_geo_11', 'Level Geo 11', 'Level Geo 11'), - ('special_level_geo_12', 'Level Geo 12', 'Level Geo 12'), - ('special_level_geo_13', 'Level Geo 13', 'Level Geo 13'), - ('special_level_geo_14', 'Level Geo 14', 'Level Geo 14'), - ('special_level_geo_15', 'Level Geo 15', 'Level Geo 15'), - ('special_level_geo_16', 'Level Geo 16', 'Level Geo 16'), - ('special_metal_door', 'Metal Door', 'Metal Door'), - ('special_metal_door_warp', 'Metal Door Warp', 'Metal Door Warp'), - ('special_mine', 'Mine', 'Mine'), - ('special_moving_blue_coin', 'Moving Blue Coin', 'Moving Blue Coin'), - ('special_mr_i', 'Mr. I', 'Mr. I'), - ('special_null_end', 'Null End', 'Null End'), - ('special_null_start', 'Null Start', 'Null Start'), - ('special_palm_tree', 'Palm Tree', 'Palm Tree'), - ('special_rotating_counter_clockwise', 'Rotating Counter Clockwise', 'Rotating Counter Clockwise'), - ('special_small_bomp', 'Small Bomp', 'Small Bomp'), - ('special_small_bully', 'Small Bully', 'Small Bully'), - ('special_snow_ball', 'Snow Ball', 'Snow Ball'), - ('special_snow_tree', 'Snow Tree', 'Snow Tree'), - ('special_spiky_tree', 'Spiky Tree', 'Spiky Tree'), - ('special_tower_platform_group', 'Tower Platform Group', 'Tower Platform Group'), - ('special_tumbling_platform', 'Tumbling Platform', 'Tumbling Platform'), - ('special_unknown_3', 'Unknown 3', 'Unknown 3'), - ('special_unknown_5', 'Unknown 5', 'Unknown 5'), - ('special_unknown_door', 'Unknown Door', 'Unknown Door'), - ('special_unknown_tree', 'Unknown Tree', 'Unknown Tree'), - ('special_unknown1_door_warp', 'Unknown1 Door Warp', 'Unknown1 Door Warp'), - ('special_unknown2_door', 'Unknown2 Door', 'Unknown2 Door'), - ('special_unknown2_door_warp', 'Unknown2 Door Warp', 'Unknown2 Door Warp'), - ('special_unknown3_door_warp', 'Unknown3 Door Warp', 'Unknown3 Door Warp'), - ('special_wf_rotating_wooden_platform', 'WF Rotating Wooden Platform', 'WF Rotating Wooden Platform'), - ('special_wf_sliding_platform', 'WF Sliding Platform', 'WF Sliding Platform'), - ('special_wf_tumbling_bridge', 'WF Tumbling Bridge', 'WF Tumbling Bridge'), - ('special_water_ring', 'Water Ring', 'Water Ring'), - ('special_wooden_door', 'Wooden Door', 'Wooden Door'), - ('special_wooden_door', 'Wooden Door', 'Wooden Door'), - ('special_wooden_door_warp', 'Wooden Door Warp', 'Wooden Door Warp'), - ('special_yellow_coin', 'Yellow Coin', 'Yellow Coin'), - ('special_yellow_coin_2', 'Yellow Coin 2', 'Yellow Coin 2'), + ("Custom", "Custom", "Custom"), + ("special_0stars_door", "0 Stars Door", "0 Stars Door"), + ("special_1star_door", "1 Star Door", "1 Star Door"), + ("special_3star_door", "3 Star Door", "3 Star Door"), + ("special_big_bully", "Big Bully", "Big Bully"), + ("special_boo", "Boo", "Boo"), + ("special_bowser", "Bowser", "Bowser"), + ("special_bubble_tree", "Bubble Tree", "Bubble Tree"), + ("special_butterfly", "Butterfly", "Butterfly"), + ("special_castle_door", "Castle Door", "Castle Door"), + ("special_castle_door_warp", "Castle Door Warp", "Castle Door Warp"), + ("special_empty_21", "Empty 21", "Empty 21"), + ("special_empty_22", "Empty 22", "Empty 22"), + ("special_empty_23", "Empty 23", "Empty 23"), + ("special_empty_24", "Empty 24", "Empty 24"), + ("special_empty_25", "Empty 25", "Empty 25"), + ("special_empty_30", "Empty 30", "Empty 30"), + ("special_empty_31", "Empty 31", "Empty 31"), + ("special_empty_9", "Empty 9", "Empty 9"), + ("special_hmc_door", "HMC Door", "HMC Door"), + ("special_haunted_door", "Haunted Door", "Haunted Door"), + ("special_jrb_chest", "JRB Chest", "JRB Chest"), + ("special_key_door", "Key Door", "Key Door"), + ("special_lll_bowser_puzzle", "LLL Bowser Puzzle", "LLL Bowser Puzzle"), + ( + "special_lll_drawbridge_spawner", + "LLL Drawbridge Spawner", + "LLL Drawbridge Spawner", + ), + ( + "special_lll_floating_wood_bridge", + "LLL Floating Wood Bridge", + "LLL Floating Wood Bridge", + ), + ( + "special_lll_moving_octagonal_mesh_platform", + "LLL Moving Octagonal Mesh Platform", + "LLL Moving Octagonal Mesh Platform", + ), + ( + "special_lll_rotating_block_with_fire_bars", + "LLL Rotating Block With Fire Bars", + "LLL Rotating Block With Fire Bars", + ), + ( + "special_lll_rotating_hexagonal_ring", + "LLL Rotating Hexagonal Ring", + "LLL Rotating Hexagonal Ring", + ), + ( + "special_lll_sinking_rectangular_platform", + "LLL Sinking Rectangular Platform", + "LLL Sinking Rectangular Platform", + ), + ( + "special_lll_sinking_square_platforms", + "LLL Sinking Square Platforms", + "LLL Sinking Square Platforms", + ), + ( + "special_lll_tilting_square_platform", + "LLL Tilting Square Platform", + "LLL Tilting Square Platform", + ), + ("special_large_bomp", "Large Bomp", "Large Bomp"), + ("special_level_geo_03", "Level Geo 03", "Level Geo 03"), + ("special_level_geo_04", "Level Geo 04", "Level Geo 04"), + ("special_level_geo_05", "Level Geo 05", "Level Geo 05"), + ("special_level_geo_06", "Level Geo 06", "Level Geo 06"), + ("special_level_geo_07", "Level Geo 07", "Level Geo 07"), + ("special_level_geo_08", "Level Geo 08", "Level Geo 08"), + ("special_level_geo_09", "Level Geo 09", "Level Geo 09"), + ("special_level_geo_0A", "Level Geo 0A", "Level Geo 0A"), + ("special_level_geo_0B", "Level Geo 0B", "Level Geo 0B"), + ("special_level_geo_0C", "Level Geo 0C", "Level Geo 0C"), + ("special_level_geo_0D", "Level Geo 0D", "Level Geo 0D"), + ("special_level_geo_0E", "Level Geo 0E", "Level Geo 0E"), + ("special_level_geo_0F", "Level Geo 0F", "Level Geo 0F"), + ("special_level_geo_10", "Level Geo 10", "Level Geo 10"), + ("special_level_geo_11", "Level Geo 11", "Level Geo 11"), + ("special_level_geo_12", "Level Geo 12", "Level Geo 12"), + ("special_level_geo_13", "Level Geo 13", "Level Geo 13"), + ("special_level_geo_14", "Level Geo 14", "Level Geo 14"), + ("special_level_geo_15", "Level Geo 15", "Level Geo 15"), + ("special_level_geo_16", "Level Geo 16", "Level Geo 16"), + ("special_metal_door", "Metal Door", "Metal Door"), + ("special_metal_door_warp", "Metal Door Warp", "Metal Door Warp"), + ("special_mine", "Mine", "Mine"), + ("special_moving_blue_coin", "Moving Blue Coin", "Moving Blue Coin"), + ("special_mr_i", "Mr. I", "Mr. I"), + ("special_null_end", "Null End", "Null End"), + ("special_null_start", "Null Start", "Null Start"), + ("special_palm_tree", "Palm Tree", "Palm Tree"), + ( + "special_rotating_counter_clockwise", + "Rotating Counter Clockwise", + "Rotating Counter Clockwise", + ), + ("special_small_bomp", "Small Bomp", "Small Bomp"), + ("special_small_bully", "Small Bully", "Small Bully"), + ("special_snow_ball", "Snow Ball", "Snow Ball"), + ("special_snow_tree", "Snow Tree", "Snow Tree"), + ("special_spiky_tree", "Spiky Tree", "Spiky Tree"), + ("special_tower_platform_group", "Tower Platform Group", "Tower Platform Group"), + ("special_tumbling_platform", "Tumbling Platform", "Tumbling Platform"), + ("special_unknown_3", "Unknown 3", "Unknown 3"), + ("special_unknown_5", "Unknown 5", "Unknown 5"), + ("special_unknown_door", "Unknown Door", "Unknown Door"), + ("special_unknown_tree", "Unknown Tree", "Unknown Tree"), + ("special_unknown1_door_warp", "Unknown1 Door Warp", "Unknown1 Door Warp"), + ("special_unknown2_door", "Unknown2 Door", "Unknown2 Door"), + ("special_unknown2_door_warp", "Unknown2 Door Warp", "Unknown2 Door Warp"), + ("special_unknown3_door_warp", "Unknown3 Door Warp", "Unknown3 Door Warp"), + ( + "special_wf_rotating_wooden_platform", + "WF Rotating Wooden Platform", + "WF Rotating Wooden Platform", + ), + ("special_wf_sliding_platform", "WF Sliding Platform", "WF Sliding Platform"), + ("special_wf_tumbling_bridge", "WF Tumbling Bridge", "WF Tumbling Bridge"), + ("special_water_ring", "Water Ring", "Water Ring"), + ("special_wooden_door", "Wooden Door", "Wooden Door"), + ("special_wooden_door", "Wooden Door", "Wooden Door"), + ("special_wooden_door_warp", "Wooden Door Warp", "Wooden Door Warp"), + ("special_yellow_coin", "Yellow Coin", "Yellow Coin"), + ("special_yellow_coin_2", "Yellow Coin 2", "Yellow Coin 2"), ] enumMacrosNames = [ - ('Custom', 'Custom', 'Custom'), - ('macro_1up', '1 Up', '1 Up'), - ('macro_1up_2', '1 Up 2', '1 Up 2'), - ('macro_1up_3', '1 Up 3', '1 Up 3'), - ('macro_1up_jump_on_approach', '1 Up Jump On Approach', '1 Up Jump On Approach'), - ('macro_1up_sliding', '1 Up Sliding', '1 Up Sliding'), - ('macro_bits_arrow_platform', 'BITS Arrow Platform', 'BITS Arrow Platform'), - ('macro_bits_ferris_wheel_axle', 'BITS Ferris Wheel Axle', 'BITS Ferris Wheel Axle'), - ('macro_bits_octagonal_platform', 'BITS Octagonal Platform', 'BITS Octagonal Platform'), - ('macro_bits_seesaw_platform', 'BITS Seesaw Platform', 'BITS Seesaw Platform'), - ('macro_bits_sliding_platform', 'BITS Sliding Platform', 'BITS Sliding Platform'), - ('macro_bits_staircase', 'BITS Staircase', 'BITS Staircase'), - ('macro_bits_tilting_w_platform', 'BITS Tilting W Platform', 'BITS Tilting W Platform'), - ('macro_bits_twin_sliding_platforms', 'BITS Twin Sliding Platforms', 'BITS Twin Sliding Platforms'), - ('macro_bits_unknown_352', 'BITS Unknown 352', 'BITS Unknown 352'), - ('macro_beta_chest', 'Beta Chest', 'Beta Chest'), - ('macro_beta_key', 'Beta Key', 'Beta Key'), - ('macro_blue_coin_switch', 'Blue Coin Switch', 'Blue Coin Switch'), - ('macro_bob_koopa_the_quick', 'Bob Koopa The Quick', 'Bob Koopa The Quick'), - ('macro_bobomb', 'Bobomb', 'Bobomb'), - ('macro_bobomb_buddy_opens_cannon', 'Bobomb Buddy Opens Cannon', 'Bobomb Buddy Opens Cannon'), - ('macro_bobomb_buddy_opens_cannon_copy', 'Bobomb Buddy Opens Cannon Copy', 'Bobomb Buddy Opens Cannon Copy'), - ('macro_bobomb_still', 'Bobomb Still', 'Bobomb Still'), - ('macro_boo', 'Boo', 'Boo'), - ('macro_boo_copy', 'Boo Copy', 'Boo Copy'), - ('macro_boo_group', 'Boo Group', 'Boo Group'), - ('macro_boo_with_cage', 'Boo With Cage', 'Boo With Cage'), - ('macro_bouncing_fireball', 'Bouncing Fireball', 'Bouncing Fireball'), - ('macro_bouncing_fireball_copy', 'Bouncing Fireball Copy', 'Bouncing Fireball Copy'), - ('macro_box_1up', 'Box 1 Up', 'Box 1 Up'), - ('macro_box_1up_running_away', 'Box 1 Up Running Away', 'Box 1 Up Running Away'), - ('macro_box_koopa_shell', 'Box Koopa Shell', 'Box Koopa Shell'), - ('macro_box_metal_cap', 'Box Metal Cap', 'Box Metal Cap'), - ('macro_box_one_coin', 'Box One Coin', 'Box One Coin'), - ('macro_box_star_1', 'Box Star 1', 'Box Star 1'), - ('macro_box_star_2', 'Box Star 2', 'Box Star 2'), - ('macro_box_star_3', 'Box Star 3', 'Box Star 3'), - ('macro_box_star_4', 'Box Star 4', 'Box Star 4'), - ('macro_box_star_5', 'Box Star 5', 'Box Star 5'), - ('macro_box_star_6', 'Box Star 6', 'Box Star 6'), - ('macro_box_ten_coins', 'Box Ten Coins', 'Box Ten Coins'), - ('macro_box_three_coins', 'Box Three Coins', 'Box Three Coins'), - ('macro_box_vanish_cap', 'Box Vanish Cap', 'Box Vanish Cap'), - ('macro_box_wing_cap', 'Box Wing Cap', 'Box Wing Cap'), - ('macro_breakable_box_giant', 'Breakable Box Giant', 'Breakable Box Giant'), - ('macro_breakable_box_no_coins', 'Breakable Box No Coins', 'Breakable Box No Coins'), - ('macro_breakable_box_small', 'Breakable Box Small', 'Breakable Box Small'), - ('macro_breakable_box_three_coins', 'Breakable Box Three Coins', 'Breakable Box Three Coins'), - ('macro_bullet_bill_cannon', 'Bullet Bill Cannon', 'Bullet Bill Cannon'), - ('macro_bully', 'Bully', 'Bully'), - ('macro_bully_2', 'Bully 2', 'Bully 2'), - ('macro_butterfly', 'Butterfly', 'Butterfly'), - ('macro_butterfly_triplet', 'Butterfly Triplet', 'Butterfly Triplet'), - ('macro_butterfly_triplet_2', 'Butterfly Triplet 2', 'Butterfly Triplet 2'), - ('macro_cannon_closed', 'Cannon Closed', 'Cannon Closed'), - ('macro_cannon_open', 'Cannon Open', 'Cannon Open'), - ('macro_chain_chomp', 'Chain Chomp', 'Chain Chomp'), - ('macro_chirp_chirp', 'Chirp Chirp', 'Chirp Chirp'), - ('macro_chuckya', 'Chuckya', 'Chuckya'), - ('macro_circling_amp', 'Circling Amp', 'Circling Amp'), - ('macro_clam_shell', 'Clam Shell', 'Clam Shell'), - ('macro_coin_arrow', 'Coin Arrow', 'Coin Arrow'), - ('macro_coin_arrow_flying', 'Coin Arrow Flying', 'Coin Arrow Flying'), - ('macro_coin_line_horizontal', 'Coin Line Horizontal', 'Coin Line Horizontal'), - ('macro_coin_line_horizontal_flying', 'Coin Line Horizontal Flying', 'Coin Line Horizontal Flying'), - ('macro_coin_line_vertical', 'Coin Line Vertical', 'Coin Line Vertical'), - ('macro_coin_ring_horizontal', 'Coin Ring Horizontal', 'Coin Ring Horizontal'), - ('macro_coin_ring_horizontal_flying', 'Coin Ring Horizontal Flying', 'Coin Ring Horizontal Flying'), - ('macro_coin_ring_vertical', 'Coin Ring Vertical', 'Coin Ring Vertical'), - ('macro_empty_100', 'Empty 100', 'Empty 100'), - ('macro_empty_101', 'Empty 101', 'Empty 101'), - ('macro_empty_102', 'Empty 102', 'Empty 102'), - ('macro_empty_103', 'Empty 103', 'Empty 103'), - ('macro_empty_104', 'Empty 104', 'Empty 104'), - ('macro_empty_105', 'Empty 105', 'Empty 105'), - ('macro_empty_116', 'Empty 116', 'Empty 116'), - ('macro_empty_117', 'Empty 117', 'Empty 117'), - ('macro_empty_118', 'Empty 118', 'Empty 118'), - ('macro_empty_119', 'Empty 119', 'Empty 119'), - ('macro_empty_120', 'Empty 120', 'Empty 120'), - ('macro_empty_121', 'Empty 121', 'Empty 121'), - ('macro_empty_122', 'Empty 122', 'Empty 122'), - ('macro_empty_124', 'Empty 124', 'Empty 124'), - ('macro_empty_127', 'Empty 127', 'Empty 127'), - ('macro_empty_128', 'Empty 128', 'Empty 128'), - ('macro_empty_129', 'Empty 129', 'Empty 129'), - ('macro_empty_130', 'Empty 130', 'Empty 130'), - ('macro_empty_131', 'Empty 131', 'Empty 131'), - ('macro_empty_132', 'Empty 132', 'Empty 132'), - ('macro_empty_133', 'Empty 133', 'Empty 133'), - ('macro_empty_134', 'Empty 134', 'Empty 134'), - ('macro_empty_135', 'Empty 135', 'Empty 135'), - ('macro_empty_136', 'Empty 136', 'Empty 136'), - ('macro_empty_142', 'Empty 142', 'Empty 142'), - ('macro_empty_143', 'Empty 143', 'Empty 143'), - ('macro_empty_144', 'Empty 144', 'Empty 144'), - ('macro_empty_145', 'Empty 145', 'Empty 145'), - ('macro_empty_146', 'Empty 146', 'Empty 146'), - ('macro_empty_147', 'Empty 147', 'Empty 147'), - ('macro_empty_148', 'Empty 148', 'Empty 148'), - ('macro_empty_149', 'Empty 149', 'Empty 149'), - ('macro_empty_15', 'Empty 15', 'Empty 15'), - ('macro_empty_150', 'Empty 150', 'Empty 150'), - ('macro_empty_155', 'Empty 155', 'Empty 155'), - ('macro_empty_157', 'Empty 157', 'Empty 157'), - ('macro_empty_158', 'Empty 158', 'Empty 158'), - ('macro_empty_159', 'Empty 159', 'Empty 159'), - ('macro_empty_16', 'Empty 16', 'Empty 16'), - ('macro_empty_160', 'Empty 160', 'Empty 160'), - ('macro_empty_161', 'Empty 161', 'Empty 161'), - ('macro_empty_162', 'Empty 162', 'Empty 162'), - ('macro_empty_163', 'Empty 163', 'Empty 163'), - ('macro_empty_164', 'Empty 164', 'Empty 164'), - ('macro_empty_168', 'Empty 168', 'Empty 168'), - ('macro_empty_17', 'Empty 17', 'Empty 17'), - ('macro_empty_173', 'Empty 173', 'Empty 173'), - ('macro_empty_174', 'Empty 174', 'Empty 174'), - ('macro_empty_175', 'Empty 175', 'Empty 175'), - ('macro_empty_176', 'Empty 176', 'Empty 176'), - ('macro_empty_177', 'Empty 177', 'Empty 177'), - ('macro_empty_178', 'Empty 178', 'Empty 178'), - ('macro_empty_179', 'Empty 179', 'Empty 179'), - ('macro_empty_18', 'Empty 18', 'Empty 18'), - ('macro_empty_180', 'Empty 180', 'Empty 180'), - ('macro_empty_181', 'Empty 181', 'Empty 181'), - ('macro_empty_182', 'Empty 182', 'Empty 182'), - ('macro_empty_183', 'Empty 183', 'Empty 183'), - ('macro_empty_184', 'Empty 184', 'Empty 184'), - ('macro_empty_185', 'Empty 185', 'Empty 185'), - ('macro_empty_186', 'Empty 186', 'Empty 186'), - ('macro_empty_187', 'Empty 187', 'Empty 187'), - ('macro_empty_188', 'Empty 188', 'Empty 188'), - ('macro_empty_19', 'Empty 19', 'Empty 19'), - ('macro_empty_197', 'Empty 197', 'Empty 197'), - ('macro_empty_198', 'Empty 198', 'Empty 198'), - ('macro_empty_199', 'Empty 199', 'Empty 199'), - ('macro_empty_200', 'Empty 200', 'Empty 200'), - ('macro_empty_201', 'Empty 201', 'Empty 201'), - ('macro_empty_202', 'Empty 202', 'Empty 202'), - ('macro_empty_203', 'Empty 203', 'Empty 203'), - ('macro_empty_204', 'Empty 204', 'Empty 204'), - ('macro_empty_205', 'Empty 205', 'Empty 205'), - ('macro_empty_206', 'Empty 206', 'Empty 206'), - ('macro_empty_207', 'Empty 207', 'Empty 207'), - ('macro_empty_208', 'Empty 208', 'Empty 208'), - ('macro_empty_209', 'Empty 209', 'Empty 209'), - ('macro_empty_210', 'Empty 210', 'Empty 210'), - ('macro_empty_211', 'Empty 211', 'Empty 211'), - ('macro_empty_212', 'Empty 212', 'Empty 212'), - ('macro_empty_213', 'Empty 213', 'Empty 213'), - ('macro_empty_214', 'Empty 214', 'Empty 214'), - ('macro_empty_215', 'Empty 215', 'Empty 215'), - ('macro_empty_216', 'Empty 216', 'Empty 216'), - ('macro_empty_217', 'Empty 217', 'Empty 217'), - ('macro_empty_218', 'Empty 218', 'Empty 218'), - ('macro_empty_219', 'Empty 219', 'Empty 219'), - ('macro_empty_220', 'Empty 220', 'Empty 220'), - ('macro_empty_221', 'Empty 221', 'Empty 221'), - ('macro_empty_222', 'Empty 222', 'Empty 222'), - ('macro_empty_223', 'Empty 223', 'Empty 223'), - ('macro_empty_224', 'Empty 224', 'Empty 224'), - ('macro_empty_225', 'Empty 225', 'Empty 225'), - ('macro_empty_226', 'Empty 226', 'Empty 226'), - ('macro_empty_227', 'Empty 227', 'Empty 227'), - ('macro_empty_228', 'Empty 228', 'Empty 228'), - ('macro_empty_229', 'Empty 229', 'Empty 229'), - ('macro_empty_230', 'Empty 230', 'Empty 230'), - ('macro_empty_231', 'Empty 231', 'Empty 231'), - ('macro_empty_232', 'Empty 232', 'Empty 232'), - ('macro_empty_233', 'Empty 233', 'Empty 233'), - ('macro_empty_244', 'Empty 244', 'Empty 244'), - ('macro_empty_245', 'Empty 245', 'Empty 245'), - ('macro_empty_246', 'Empty 246', 'Empty 246'), - ('macro_empty_247', 'Empty 247', 'Empty 247'), - ('macro_empty_248', 'Empty 248', 'Empty 248'), - ('macro_empty_249', 'Empty 249', 'Empty 249'), - ('macro_empty_250', 'Empty 250', 'Empty 250'), - ('macro_empty_254', 'Empty 254', 'Empty 254'), - ('macro_empty_257', 'Empty 257', 'Empty 257'), - ('macro_empty_264', 'Empty 264', 'Empty 264'), - ('macro_empty_265', 'Empty 265', 'Empty 265'), - ('macro_empty_266', 'Empty 266', 'Empty 266'), - ('macro_empty_267', 'Empty 267', 'Empty 267'), - ('macro_empty_268', 'Empty 268', 'Empty 268'), - ('macro_empty_269', 'Empty 269', 'Empty 269'), - ('macro_empty_270', 'Empty 270', 'Empty 270'), - ('macro_empty_271', 'Empty 271', 'Empty 271'), - ('macro_empty_272', 'Empty 272', 'Empty 272'), - ('macro_empty_273', 'Empty 273', 'Empty 273'), - ('macro_empty_274', 'Empty 274', 'Empty 274'), - ('macro_empty_275', 'Empty 275', 'Empty 275'), - ('macro_empty_276', 'Empty 276', 'Empty 276'), - ('macro_empty_277', 'Empty 277', 'Empty 277'), - ('macro_empty_278', 'Empty 278', 'Empty 278'), - ('macro_empty_279', 'Empty 279', 'Empty 279'), - ('macro_empty_280', 'Empty 280', 'Empty 280'), - ('macro_empty_282', 'Empty 282', 'Empty 282'), - ('macro_empty_283', 'Empty 283', 'Empty 283'), - ('macro_empty_284', 'Empty 284', 'Empty 284'), - ('macro_empty_285', 'Empty 285', 'Empty 285'), - ('macro_empty_286', 'Empty 286', 'Empty 286'), - ('macro_empty_287', 'Empty 287', 'Empty 287'), - ('macro_empty_288', 'Empty 288', 'Empty 288'), - ('macro_empty_294', 'Empty 294', 'Empty 294'), - ('macro_empty_295', 'Empty 295', 'Empty 295'), - ('macro_empty_296', 'Empty 296', 'Empty 296'), - ('macro_empty_297', 'Empty 297', 'Empty 297'), - ('macro_empty_298', 'Empty 298', 'Empty 298'), - ('macro_empty_299', 'Empty 299', 'Empty 299'), - ('macro_empty_300', 'Empty 300', 'Empty 300'), - ('macro_empty_301', 'Empty 301', 'Empty 301'), - ('macro_empty_302', 'Empty 302', 'Empty 302'), - ('macro_empty_304', 'Empty 304', 'Empty 304'), - ('macro_empty_305', 'Empty 305', 'Empty 305'), - ('macro_empty_306', 'Empty 306', 'Empty 306'), - ('macro_empty_307', 'Empty 307', 'Empty 307'), - ('macro_empty_308', 'Empty 308', 'Empty 308'), - ('macro_empty_309', 'Empty 309', 'Empty 309'), - ('macro_empty_310', 'Empty 310', 'Empty 310'), - ('macro_empty_311', 'Empty 311', 'Empty 311'), - ('macro_empty_312', 'Empty 312', 'Empty 312'), - ('macro_empty_330', 'Empty 330', 'Empty 330'), - ('macro_empty_331', 'Empty 331', 'Empty 331'), - ('macro_empty_332', 'Empty 332', 'Empty 332'), - ('macro_empty_333', 'Empty 333', 'Empty 333'), - ('macro_empty_334', 'Empty 334', 'Empty 334'), - ('macro_empty_335', 'Empty 335', 'Empty 335'), - ('macro_empty_336', 'Empty 336', 'Empty 336'), - ('macro_empty_337', 'Empty 337', 'Empty 337'), - ('macro_empty_338', 'Empty 338', 'Empty 338'), - ('macro_empty_344', 'Empty 344', 'Empty 344'), - ('macro_empty_345', 'Empty 345', 'Empty 345'), - ('macro_empty_346', 'Empty 346', 'Empty 346'), - ('macro_empty_347', 'Empty 347', 'Empty 347'), - ('macro_empty_348', 'Empty 348', 'Empty 348'), - ('macro_empty_349', 'Empty 349', 'Empty 349'), - ('macro_empty_355', 'Empty 355', 'Empty 355'), - ('macro_empty_356', 'Empty 356', 'Empty 356'), - ('macro_empty_361', 'Empty 361', 'Empty 361'), - ('macro_empty_362', 'Empty 362', 'Empty 362'), - ('macro_empty_363', 'Empty 363', 'Empty 363'), - ('macro_empty_364', 'Empty 364', 'Empty 364'), - ('macro_empty_365', 'Empty 365', 'Empty 365'), - ('macro_empty_5', 'Empty 5', 'Empty 5'), - ('macro_empty_52', 'Empty 52', 'Empty 52'), - ('macro_empty_80', 'Empty 80', 'Empty 80'), - ('macro_empty_83', 'Empty 83', 'Empty 83'), - ('macro_empty_90', 'Empty 90', 'Empty 90'), - ('macro_empty_91', 'Empty 91', 'Empty 91'), - ('macro_empty_92', 'Empty 92', 'Empty 92'), - ('macro_empty_95', 'Empty 95', 'Empty 95'), - ('macro_empty_99', 'Empty 99', 'Empty 99'), - ('macro_enemy_lakitu', 'Enemy Lakitu', 'Enemy Lakitu'), - ('macro_fake_star', 'Fake Star', 'Fake Star'), - ('macro_fire_fly_guy', 'Fire Fly Guy', 'Fire Fly Guy'), - ('macro_fire_piranha_plant', 'Fire Piranha Plant', 'Fire Piranha Plant'), - ('macro_fire_piranha_plant_2', 'Fire Piranha Plant 2', 'Fire Piranha Plant 2'), - ('macro_fire_spitter', 'Fire Spitter', 'Fire Spitter'), - ('macro_fish_group', 'Fish Group', 'Fish Group'), - ('macro_fish_group_2', 'Fish Group 2', 'Fish Group 2'), - ('macro_fish_group_3', 'Fish Group 3', 'Fish Group 3'), - ('macro_fish_group_4', 'Fish Group 4', 'Fish Group 4'), - ('macro_flamethrower', 'Flamethrower', 'Flamethrower'), - ('macro_floor_switch_hidden_objects', 'Floor Switch Hidden Objects', 'Floor Switch Hidden Objects'), - ('macro_fly_guy', 'Fly Guy', 'Fly Guy'), - ('macro_free_bowling_ball', 'Free Bowling Ball', 'Free Bowling Ball'), - ('macro_goomba', 'Goomba', 'Goomba'), - ('macro_goomba_quintuplet_spawner', 'Goomba Quintuplet Spawner', 'Goomba Quintuplet Spawner'), - ('macro_goomba_triplet_spawner', 'Goomba Triplet Spawner', 'Goomba Triplet Spawner'), - ('macro_haunted_chair', 'Haunted Chair', 'Haunted Chair'), - ('macro_haunted_chair_copy', 'Haunted Chair Copy', 'Haunted Chair Copy'), - ('macro_haunted_chair_copy2', 'Haunted Chair Copy2', 'Haunted Chair Copy2'), - ('macro_heave_ho', 'Heave Ho', 'Heave Ho'), - ('macro_hidden_1up', 'Hidden 1 Up', 'Hidden 1 Up'), - ('macro_hidden_1up_in_pole', 'Hidden 1 Up In Pole', 'Hidden 1 Up In Pole'), - ('macro_hidden_1up_trigger', 'Hidden 1 Up Trigger', 'Hidden 1 Up Trigger'), - ('macro_hidden_blue_coin', 'Hidden Blue Coin', 'Hidden Blue Coin'), - ('macro_hidden_box', 'Hidden Box', 'Hidden Box'), - ('macro_hidden_object_2', 'Hidden Object 2', 'Hidden Object 2'), - ('macro_hidden_object_3', 'Hidden Object 3', 'Hidden Object 3'), - ('macro_hidden_star_trigger', 'Hidden Star Trigger', 'Hidden Star Trigger'), - ('macro_homing_amp', 'Homing Amp', 'Homing Amp'), - ('macro_huge_goomba', 'Huge Goomba', 'Huge Goomba'), - ('macro_jet_stream_ring_spawner', 'Jet Stream Ring Spawner', 'Jet Stream Ring Spawner'), - ('macro_jet_stream_ring_spawner_copy', 'Jet Stream Ring Spawner Copy', 'Jet Stream Ring Spawner Copy'), - ('macro_jumping_box', 'Jumping Box', 'Jumping Box'), - ('macro_koopa', 'Koopa', 'Koopa'), - ('macro_koopa_race_endpoint', 'Koopa Race Endpoint', 'Koopa Race Endpoint'), - ('macro_koopa_shell_underwater', 'Koopa Shell Underwater', 'Koopa Shell Underwater'), - ('macro_koopa_shellless', 'Koopa Shellless', 'Koopa Shellless'), - ('macro_metal_cap_switch', 'Metal Cap Switch', 'Metal Cap Switch'), - ('macro_moneybag', 'Moneybag', 'Moneybag'), - ('macro_monty_mole', 'Monty Mole', 'Monty Mole'), - ('macro_monty_mole_2', 'Monty Mole 2', 'Monty Mole 2'), - ('macro_monty_mole_hole', 'Monty Mole Hole', 'Monty Mole Hole'), - ('macro_moving_blue_coin', 'Moving Blue Coin', 'Moving Blue Coin'), - ('macro_mr_blizzard', 'Mr. Blizzard', 'Mr. Blizzard'), - ('macro_mr_blizzard_2', 'Mr. Blizzard 2', 'Mr. Blizzard 2'), - ('macro_mr_blizzard_copy', 'Mr. Blizzard Copy', 'Mr. Blizzard Copy'), - ('macro_mr_i', 'Mr. I', 'Mr. I'), - ('macro_piranha_plant', 'Piranha Plant', 'Piranha Plant'), - ('macro_pokey', 'Pokey', 'Pokey'), - ('macro_pokey_copy', 'Pokey Copy', 'Pokey Copy'), - ('macro_pushable_metal_box', 'Pushable Metal Box', 'Pushable Metal Box'), - ('macro_recovery_heart', 'Recovery Heart', 'Recovery Heart'), - ('macro_red_coin', 'Red Coin', 'Red Coin'), - ('macro_scuttlebug', 'Scuttlebug', 'Scuttlebug'), - ('macro_scuttlebug_spawner', 'Scuttlebug Spawner', 'Scuttlebug Spawner'), - ('macro_seaweed_bundle', 'Seaweed Bundle', 'Seaweed Bundle'), - ('macro_sign_on_wall', 'Sign On Wall', 'Sign On Wall'), - ('macro_skeeter', 'Skeeter', 'Skeeter'), - ('macro_sliding_blue_coin', 'Sliding Blue Coin', 'Sliding Blue Coin'), - ('macro_small_penguin', 'Small Penguin', 'Small Penguin'), - ('macro_snufit', 'Snufit', 'Snufit'), - ('macro_spindrift', 'Spindrift', 'Spindrift'), - ('macro_sushi', 'Sushi', 'Sushi'), - ('macro_swoop', 'Swoop', 'Swoop'), - ('macro_swoop_2', 'Swoop 2', 'Swoop 2'), - ('macro_thi_koopa_the_quick', 'THI Koopa The Quick', 'THI Koopa The Quick'), - ('macro_ttc_clock_hand', 'TTC Clock Hand', 'TTC Clock Hand'), - ('macro_ttc_elevator_platform', 'TTC Elevator Platform', 'TTC Elevator Platform'), - ('macro_ttc_large_gear', 'TTC Large Gear', 'TTC Large Gear'), - ('macro_ttc_large_treadmill', 'TTC Large Treadmill', 'TTC Large Treadmill'), - ('macro_ttc_large_treadmill_2', 'TTC Large Treadmill 2', 'TTC Large Treadmill 2'), - ('macro_ttc_pendulum', 'TTC Pendulum', 'TTC Pendulum'), - ('macro_ttc_pit_block', 'TTC Pit Block', 'TTC Pit Block'), - ('macro_ttc_pit_block_2', 'TTC Pit Block 2', 'TTC Pit Block 2'), - ('macro_ttc_push_block', 'TTC Push Block', 'TTC Push Block'), - ('macro_ttc_rotating_cube', 'TTC Rotating Cube', 'TTC Rotating Cube'), - ('macro_ttc_rotating_hexagon', 'TTC Rotating Hexagon', 'TTC Rotating Hexagon'), - ('macro_ttc_rotating_prism', 'TTC Rotating Prism', 'TTC Rotating Prism'), - ('macro_ttc_rotating_triangle', 'TTC Rotating Triangle', 'TTC Rotating Triangle'), - ('macro_ttc_small_gear', 'TTC Small Gear', 'TTC Small Gear'), - ('macro_ttc_small_treadmill', 'TTC Small Treadmill', 'TTC Small Treadmill'), - ('macro_ttc_small_treadmill_2', 'TTC Small Treadmill 2', 'TTC Small Treadmill 2'), - ('macro_ttc_spinner', 'TTC Spinner', 'TTC Spinner'), - ('macro_thwomp', 'Thwomp', 'Thwomp'), - ('macro_tiny_goomba', 'Tiny Goomba', 'Tiny Goomba'), - ('macro_tornado', 'Tornado', 'Tornado'), - ('macro_tox_box', 'Tox Box', 'Tox Box'), - ('macro_tuxies_mother', 'Tuxies Mother', 'Tuxies Mother'), - ('macro_tuxies_mother_copy', 'Tuxies Mother Copy', 'Tuxies Mother Copy'), - ('macro_ukiki', 'Ukiki', 'Ukiki'), - ('macro_ukiki_2', 'Ukiki 2', 'Ukiki 2'), - ('macro_unagi', 'Unagi', 'Unagi'), - ('macro_unknown_123', 'Unknown 123', 'Unknown 123'), - ('macro_unknown_137', 'Unknown 137', 'Unknown 137'), - ('macro_unknown_28', 'Unknown 28', 'Unknown 28'), - ('macro_unknown_303', 'Unknown 303', 'Unknown 303'), - ('macro_unknown_40', 'Unknown 40', 'Unknown 40'), - ('macro_unknown_41', 'Unknown 41', 'Unknown 41'), - ('macro_unknown_59', 'Unknown 59', 'Unknown 59'), - ('macro_unknown_96', 'Unknown 96', 'Unknown 96'), - ('macro_vanish_cap_switch', 'Vanish Cap Switch', 'Vanish Cap Switch'), - ('macro_water_bomb_cannon', 'Water Bomb Cannon', 'Water Bomb Cannon'), - ('macro_water_bomb_cannon_copy', 'Water Bomb Cannon Copy', 'Water Bomb Cannon Copy'), - ('macro_water_bomb_spawner', 'Water Bomb Spawner', 'Water Bomb Spawner'), - ('macro_water_mine', 'Water Mine', 'Water Mine'), - ('macro_whomp', 'Whomp', 'Whomp'), - ('macro_wiggler', 'Wiggler', 'Wiggler'), - ('macro_wing_cap_switch', 'Wing Cap Switch', 'Wing Cap Switch'), - ('macro_wooden_post', 'Wooden Post', 'Wooden Post'), - ('macro_wooden_post_copy', 'Wooden Post Copy', 'Wooden Post Copy'), - ('macro_wooden_signpost', 'Wooden Signpost', 'Wooden Signpost'), - ('macro_yellow_cap_switch', 'Yellow Cap Switch', 'Yellow Cap Switch'), - ('macro_yellow_coin', 'Yellow Coin', 'Yellow Coin'), - ('macro_yellow_coin_2', 'Yellow Coin 2', 'Yellow Coin 2'), + ("Custom", "Custom", "Custom"), + ("macro_1up", "1 Up", "1 Up"), + ("macro_1up_2", "1 Up 2", "1 Up 2"), + ("macro_1up_3", "1 Up 3", "1 Up 3"), + ("macro_1up_jump_on_approach", "1 Up Jump On Approach", "1 Up Jump On Approach"), + ("macro_1up_sliding", "1 Up Sliding", "1 Up Sliding"), + ("macro_bits_arrow_platform", "BITS Arrow Platform", "BITS Arrow Platform"), + ( + "macro_bits_ferris_wheel_axle", + "BITS Ferris Wheel Axle", + "BITS Ferris Wheel Axle", + ), + ( + "macro_bits_octagonal_platform", + "BITS Octagonal Platform", + "BITS Octagonal Platform", + ), + ("macro_bits_seesaw_platform", "BITS Seesaw Platform", "BITS Seesaw Platform"), + ("macro_bits_sliding_platform", "BITS Sliding Platform", "BITS Sliding Platform"), + ("macro_bits_staircase", "BITS Staircase", "BITS Staircase"), + ( + "macro_bits_tilting_w_platform", + "BITS Tilting W Platform", + "BITS Tilting W Platform", + ), + ( + "macro_bits_twin_sliding_platforms", + "BITS Twin Sliding Platforms", + "BITS Twin Sliding Platforms", + ), + ("macro_bits_unknown_352", "BITS Unknown 352", "BITS Unknown 352"), + ("macro_beta_chest", "Beta Chest", "Beta Chest"), + ("macro_beta_key", "Beta Key", "Beta Key"), + ("macro_blue_coin_switch", "Blue Coin Switch", "Blue Coin Switch"), + ("macro_bob_koopa_the_quick", "Bob Koopa The Quick", "Bob Koopa The Quick"), + ("macro_bobomb", "Bobomb", "Bobomb"), + ( + "macro_bobomb_buddy_opens_cannon", + "Bobomb Buddy Opens Cannon", + "Bobomb Buddy Opens Cannon", + ), + ( + "macro_bobomb_buddy_opens_cannon_copy", + "Bobomb Buddy Opens Cannon Copy", + "Bobomb Buddy Opens Cannon Copy", + ), + ("macro_bobomb_still", "Bobomb Still", "Bobomb Still"), + ("macro_boo", "Boo", "Boo"), + ("macro_boo_copy", "Boo Copy", "Boo Copy"), + ("macro_boo_group", "Boo Group", "Boo Group"), + ("macro_boo_with_cage", "Boo With Cage", "Boo With Cage"), + ("macro_bouncing_fireball", "Bouncing Fireball", "Bouncing Fireball"), + ( + "macro_bouncing_fireball_copy", + "Bouncing Fireball Copy", + "Bouncing Fireball Copy", + ), + ("macro_box_1up", "Box 1 Up", "Box 1 Up"), + ("macro_box_1up_running_away", "Box 1 Up Running Away", "Box 1 Up Running Away"), + ("macro_box_koopa_shell", "Box Koopa Shell", "Box Koopa Shell"), + ("macro_box_metal_cap", "Box Metal Cap", "Box Metal Cap"), + ("macro_box_one_coin", "Box One Coin", "Box One Coin"), + ("macro_box_star_1", "Box Star 1", "Box Star 1"), + ("macro_box_star_2", "Box Star 2", "Box Star 2"), + ("macro_box_star_3", "Box Star 3", "Box Star 3"), + ("macro_box_star_4", "Box Star 4", "Box Star 4"), + ("macro_box_star_5", "Box Star 5", "Box Star 5"), + ("macro_box_star_6", "Box Star 6", "Box Star 6"), + ("macro_box_ten_coins", "Box Ten Coins", "Box Ten Coins"), + ("macro_box_three_coins", "Box Three Coins", "Box Three Coins"), + ("macro_box_vanish_cap", "Box Vanish Cap", "Box Vanish Cap"), + ("macro_box_wing_cap", "Box Wing Cap", "Box Wing Cap"), + ("macro_breakable_box_giant", "Breakable Box Giant", "Breakable Box Giant"), + ( + "macro_breakable_box_no_coins", + "Breakable Box No Coins", + "Breakable Box No Coins", + ), + ("macro_breakable_box_small", "Breakable Box Small", "Breakable Box Small"), + ( + "macro_breakable_box_three_coins", + "Breakable Box Three Coins", + "Breakable Box Three Coins", + ), + ("macro_bullet_bill_cannon", "Bullet Bill Cannon", "Bullet Bill Cannon"), + ("macro_bully", "Bully", "Bully"), + ("macro_bully_2", "Bully 2", "Bully 2"), + ("macro_butterfly", "Butterfly", "Butterfly"), + ("macro_butterfly_triplet", "Butterfly Triplet", "Butterfly Triplet"), + ("macro_butterfly_triplet_2", "Butterfly Triplet 2", "Butterfly Triplet 2"), + ("macro_cannon_closed", "Cannon Closed", "Cannon Closed"), + ("macro_cannon_open", "Cannon Open", "Cannon Open"), + ("macro_chain_chomp", "Chain Chomp", "Chain Chomp"), + ("macro_chirp_chirp", "Chirp Chirp", "Chirp Chirp"), + ("macro_chuckya", "Chuckya", "Chuckya"), + ("macro_circling_amp", "Circling Amp", "Circling Amp"), + ("macro_clam_shell", "Clam Shell", "Clam Shell"), + ("macro_coin_arrow", "Coin Arrow", "Coin Arrow"), + ("macro_coin_arrow_flying", "Coin Arrow Flying", "Coin Arrow Flying"), + ("macro_coin_line_horizontal", "Coin Line Horizontal", "Coin Line Horizontal"), + ( + "macro_coin_line_horizontal_flying", + "Coin Line Horizontal Flying", + "Coin Line Horizontal Flying", + ), + ("macro_coin_line_vertical", "Coin Line Vertical", "Coin Line Vertical"), + ("macro_coin_ring_horizontal", "Coin Ring Horizontal", "Coin Ring Horizontal"), + ( + "macro_coin_ring_horizontal_flying", + "Coin Ring Horizontal Flying", + "Coin Ring Horizontal Flying", + ), + ("macro_coin_ring_vertical", "Coin Ring Vertical", "Coin Ring Vertical"), + ("macro_empty_100", "Empty 100", "Empty 100"), + ("macro_empty_101", "Empty 101", "Empty 101"), + ("macro_empty_102", "Empty 102", "Empty 102"), + ("macro_empty_103", "Empty 103", "Empty 103"), + ("macro_empty_104", "Empty 104", "Empty 104"), + ("macro_empty_105", "Empty 105", "Empty 105"), + ("macro_empty_116", "Empty 116", "Empty 116"), + ("macro_empty_117", "Empty 117", "Empty 117"), + ("macro_empty_118", "Empty 118", "Empty 118"), + ("macro_empty_119", "Empty 119", "Empty 119"), + ("macro_empty_120", "Empty 120", "Empty 120"), + ("macro_empty_121", "Empty 121", "Empty 121"), + ("macro_empty_122", "Empty 122", "Empty 122"), + ("macro_empty_124", "Empty 124", "Empty 124"), + ("macro_empty_127", "Empty 127", "Empty 127"), + ("macro_empty_128", "Empty 128", "Empty 128"), + ("macro_empty_129", "Empty 129", "Empty 129"), + ("macro_empty_130", "Empty 130", "Empty 130"), + ("macro_empty_131", "Empty 131", "Empty 131"), + ("macro_empty_132", "Empty 132", "Empty 132"), + ("macro_empty_133", "Empty 133", "Empty 133"), + ("macro_empty_134", "Empty 134", "Empty 134"), + ("macro_empty_135", "Empty 135", "Empty 135"), + ("macro_empty_136", "Empty 136", "Empty 136"), + ("macro_empty_142", "Empty 142", "Empty 142"), + ("macro_empty_143", "Empty 143", "Empty 143"), + ("macro_empty_144", "Empty 144", "Empty 144"), + ("macro_empty_145", "Empty 145", "Empty 145"), + ("macro_empty_146", "Empty 146", "Empty 146"), + ("macro_empty_147", "Empty 147", "Empty 147"), + ("macro_empty_148", "Empty 148", "Empty 148"), + ("macro_empty_149", "Empty 149", "Empty 149"), + ("macro_empty_15", "Empty 15", "Empty 15"), + ("macro_empty_150", "Empty 150", "Empty 150"), + ("macro_empty_155", "Empty 155", "Empty 155"), + ("macro_empty_157", "Empty 157", "Empty 157"), + ("macro_empty_158", "Empty 158", "Empty 158"), + ("macro_empty_159", "Empty 159", "Empty 159"), + ("macro_empty_16", "Empty 16", "Empty 16"), + ("macro_empty_160", "Empty 160", "Empty 160"), + ("macro_empty_161", "Empty 161", "Empty 161"), + ("macro_empty_162", "Empty 162", "Empty 162"), + ("macro_empty_163", "Empty 163", "Empty 163"), + ("macro_empty_164", "Empty 164", "Empty 164"), + ("macro_empty_168", "Empty 168", "Empty 168"), + ("macro_empty_17", "Empty 17", "Empty 17"), + ("macro_empty_173", "Empty 173", "Empty 173"), + ("macro_empty_174", "Empty 174", "Empty 174"), + ("macro_empty_175", "Empty 175", "Empty 175"), + ("macro_empty_176", "Empty 176", "Empty 176"), + ("macro_empty_177", "Empty 177", "Empty 177"), + ("macro_empty_178", "Empty 178", "Empty 178"), + ("macro_empty_179", "Empty 179", "Empty 179"), + ("macro_empty_18", "Empty 18", "Empty 18"), + ("macro_empty_180", "Empty 180", "Empty 180"), + ("macro_empty_181", "Empty 181", "Empty 181"), + ("macro_empty_182", "Empty 182", "Empty 182"), + ("macro_empty_183", "Empty 183", "Empty 183"), + ("macro_empty_184", "Empty 184", "Empty 184"), + ("macro_empty_185", "Empty 185", "Empty 185"), + ("macro_empty_186", "Empty 186", "Empty 186"), + ("macro_empty_187", "Empty 187", "Empty 187"), + ("macro_empty_188", "Empty 188", "Empty 188"), + ("macro_empty_19", "Empty 19", "Empty 19"), + ("macro_empty_197", "Empty 197", "Empty 197"), + ("macro_empty_198", "Empty 198", "Empty 198"), + ("macro_empty_199", "Empty 199", "Empty 199"), + ("macro_empty_200", "Empty 200", "Empty 200"), + ("macro_empty_201", "Empty 201", "Empty 201"), + ("macro_empty_202", "Empty 202", "Empty 202"), + ("macro_empty_203", "Empty 203", "Empty 203"), + ("macro_empty_204", "Empty 204", "Empty 204"), + ("macro_empty_205", "Empty 205", "Empty 205"), + ("macro_empty_206", "Empty 206", "Empty 206"), + ("macro_empty_207", "Empty 207", "Empty 207"), + ("macro_empty_208", "Empty 208", "Empty 208"), + ("macro_empty_209", "Empty 209", "Empty 209"), + ("macro_empty_210", "Empty 210", "Empty 210"), + ("macro_empty_211", "Empty 211", "Empty 211"), + ("macro_empty_212", "Empty 212", "Empty 212"), + ("macro_empty_213", "Empty 213", "Empty 213"), + ("macro_empty_214", "Empty 214", "Empty 214"), + ("macro_empty_215", "Empty 215", "Empty 215"), + ("macro_empty_216", "Empty 216", "Empty 216"), + ("macro_empty_217", "Empty 217", "Empty 217"), + ("macro_empty_218", "Empty 218", "Empty 218"), + ("macro_empty_219", "Empty 219", "Empty 219"), + ("macro_empty_220", "Empty 220", "Empty 220"), + ("macro_empty_221", "Empty 221", "Empty 221"), + ("macro_empty_222", "Empty 222", "Empty 222"), + ("macro_empty_223", "Empty 223", "Empty 223"), + ("macro_empty_224", "Empty 224", "Empty 224"), + ("macro_empty_225", "Empty 225", "Empty 225"), + ("macro_empty_226", "Empty 226", "Empty 226"), + ("macro_empty_227", "Empty 227", "Empty 227"), + ("macro_empty_228", "Empty 228", "Empty 228"), + ("macro_empty_229", "Empty 229", "Empty 229"), + ("macro_empty_230", "Empty 230", "Empty 230"), + ("macro_empty_231", "Empty 231", "Empty 231"), + ("macro_empty_232", "Empty 232", "Empty 232"), + ("macro_empty_233", "Empty 233", "Empty 233"), + ("macro_empty_244", "Empty 244", "Empty 244"), + ("macro_empty_245", "Empty 245", "Empty 245"), + ("macro_empty_246", "Empty 246", "Empty 246"), + ("macro_empty_247", "Empty 247", "Empty 247"), + ("macro_empty_248", "Empty 248", "Empty 248"), + ("macro_empty_249", "Empty 249", "Empty 249"), + ("macro_empty_250", "Empty 250", "Empty 250"), + ("macro_empty_254", "Empty 254", "Empty 254"), + ("macro_empty_257", "Empty 257", "Empty 257"), + ("macro_empty_264", "Empty 264", "Empty 264"), + ("macro_empty_265", "Empty 265", "Empty 265"), + ("macro_empty_266", "Empty 266", "Empty 266"), + ("macro_empty_267", "Empty 267", "Empty 267"), + ("macro_empty_268", "Empty 268", "Empty 268"), + ("macro_empty_269", "Empty 269", "Empty 269"), + ("macro_empty_270", "Empty 270", "Empty 270"), + ("macro_empty_271", "Empty 271", "Empty 271"), + ("macro_empty_272", "Empty 272", "Empty 272"), + ("macro_empty_273", "Empty 273", "Empty 273"), + ("macro_empty_274", "Empty 274", "Empty 274"), + ("macro_empty_275", "Empty 275", "Empty 275"), + ("macro_empty_276", "Empty 276", "Empty 276"), + ("macro_empty_277", "Empty 277", "Empty 277"), + ("macro_empty_278", "Empty 278", "Empty 278"), + ("macro_empty_279", "Empty 279", "Empty 279"), + ("macro_empty_280", "Empty 280", "Empty 280"), + ("macro_empty_282", "Empty 282", "Empty 282"), + ("macro_empty_283", "Empty 283", "Empty 283"), + ("macro_empty_284", "Empty 284", "Empty 284"), + ("macro_empty_285", "Empty 285", "Empty 285"), + ("macro_empty_286", "Empty 286", "Empty 286"), + ("macro_empty_287", "Empty 287", "Empty 287"), + ("macro_empty_288", "Empty 288", "Empty 288"), + ("macro_empty_294", "Empty 294", "Empty 294"), + ("macro_empty_295", "Empty 295", "Empty 295"), + ("macro_empty_296", "Empty 296", "Empty 296"), + ("macro_empty_297", "Empty 297", "Empty 297"), + ("macro_empty_298", "Empty 298", "Empty 298"), + ("macro_empty_299", "Empty 299", "Empty 299"), + ("macro_empty_300", "Empty 300", "Empty 300"), + ("macro_empty_301", "Empty 301", "Empty 301"), + ("macro_empty_302", "Empty 302", "Empty 302"), + ("macro_empty_304", "Empty 304", "Empty 304"), + ("macro_empty_305", "Empty 305", "Empty 305"), + ("macro_empty_306", "Empty 306", "Empty 306"), + ("macro_empty_307", "Empty 307", "Empty 307"), + ("macro_empty_308", "Empty 308", "Empty 308"), + ("macro_empty_309", "Empty 309", "Empty 309"), + ("macro_empty_310", "Empty 310", "Empty 310"), + ("macro_empty_311", "Empty 311", "Empty 311"), + ("macro_empty_312", "Empty 312", "Empty 312"), + ("macro_empty_330", "Empty 330", "Empty 330"), + ("macro_empty_331", "Empty 331", "Empty 331"), + ("macro_empty_332", "Empty 332", "Empty 332"), + ("macro_empty_333", "Empty 333", "Empty 333"), + ("macro_empty_334", "Empty 334", "Empty 334"), + ("macro_empty_335", "Empty 335", "Empty 335"), + ("macro_empty_336", "Empty 336", "Empty 336"), + ("macro_empty_337", "Empty 337", "Empty 337"), + ("macro_empty_338", "Empty 338", "Empty 338"), + ("macro_empty_344", "Empty 344", "Empty 344"), + ("macro_empty_345", "Empty 345", "Empty 345"), + ("macro_empty_346", "Empty 346", "Empty 346"), + ("macro_empty_347", "Empty 347", "Empty 347"), + ("macro_empty_348", "Empty 348", "Empty 348"), + ("macro_empty_349", "Empty 349", "Empty 349"), + ("macro_empty_355", "Empty 355", "Empty 355"), + ("macro_empty_356", "Empty 356", "Empty 356"), + ("macro_empty_361", "Empty 361", "Empty 361"), + ("macro_empty_362", "Empty 362", "Empty 362"), + ("macro_empty_363", "Empty 363", "Empty 363"), + ("macro_empty_364", "Empty 364", "Empty 364"), + ("macro_empty_365", "Empty 365", "Empty 365"), + ("macro_empty_5", "Empty 5", "Empty 5"), + ("macro_empty_52", "Empty 52", "Empty 52"), + ("macro_empty_80", "Empty 80", "Empty 80"), + ("macro_empty_83", "Empty 83", "Empty 83"), + ("macro_empty_90", "Empty 90", "Empty 90"), + ("macro_empty_91", "Empty 91", "Empty 91"), + ("macro_empty_92", "Empty 92", "Empty 92"), + ("macro_empty_95", "Empty 95", "Empty 95"), + ("macro_empty_99", "Empty 99", "Empty 99"), + ("macro_enemy_lakitu", "Enemy Lakitu", "Enemy Lakitu"), + ("macro_fake_star", "Fake Star", "Fake Star"), + ("macro_fire_fly_guy", "Fire Fly Guy", "Fire Fly Guy"), + ("macro_fire_piranha_plant", "Fire Piranha Plant", "Fire Piranha Plant"), + ("macro_fire_piranha_plant_2", "Fire Piranha Plant 2", "Fire Piranha Plant 2"), + ("macro_fire_spitter", "Fire Spitter", "Fire Spitter"), + ("macro_fish_group", "Fish Group", "Fish Group"), + ("macro_fish_group_2", "Fish Group 2", "Fish Group 2"), + ("macro_fish_group_3", "Fish Group 3", "Fish Group 3"), + ("macro_fish_group_4", "Fish Group 4", "Fish Group 4"), + ("macro_flamethrower", "Flamethrower", "Flamethrower"), + ( + "macro_floor_switch_hidden_objects", + "Floor Switch Hidden Objects", + "Floor Switch Hidden Objects", + ), + ("macro_fly_guy", "Fly Guy", "Fly Guy"), + ("macro_free_bowling_ball", "Free Bowling Ball", "Free Bowling Ball"), + ("macro_goomba", "Goomba", "Goomba"), + ( + "macro_goomba_quintuplet_spawner", + "Goomba Quintuplet Spawner", + "Goomba Quintuplet Spawner", + ), + ( + "macro_goomba_triplet_spawner", + "Goomba Triplet Spawner", + "Goomba Triplet Spawner", + ), + ("macro_haunted_chair", "Haunted Chair", "Haunted Chair"), + ("macro_haunted_chair_copy", "Haunted Chair Copy", "Haunted Chair Copy"), + ("macro_haunted_chair_copy2", "Haunted Chair Copy2", "Haunted Chair Copy2"), + ("macro_heave_ho", "Heave Ho", "Heave Ho"), + ("macro_hidden_1up", "Hidden 1 Up", "Hidden 1 Up"), + ("macro_hidden_1up_in_pole", "Hidden 1 Up In Pole", "Hidden 1 Up In Pole"), + ("macro_hidden_1up_trigger", "Hidden 1 Up Trigger", "Hidden 1 Up Trigger"), + ("macro_hidden_blue_coin", "Hidden Blue Coin", "Hidden Blue Coin"), + ("macro_hidden_box", "Hidden Box", "Hidden Box"), + ("macro_hidden_object_2", "Hidden Object 2", "Hidden Object 2"), + ("macro_hidden_object_3", "Hidden Object 3", "Hidden Object 3"), + ("macro_hidden_star_trigger", "Hidden Star Trigger", "Hidden Star Trigger"), + ("macro_homing_amp", "Homing Amp", "Homing Amp"), + ("macro_huge_goomba", "Huge Goomba", "Huge Goomba"), + ( + "macro_jet_stream_ring_spawner", + "Jet Stream Ring Spawner", + "Jet Stream Ring Spawner", + ), + ( + "macro_jet_stream_ring_spawner_copy", + "Jet Stream Ring Spawner Copy", + "Jet Stream Ring Spawner Copy", + ), + ("macro_jumping_box", "Jumping Box", "Jumping Box"), + ("macro_koopa", "Koopa", "Koopa"), + ("macro_koopa_race_endpoint", "Koopa Race Endpoint", "Koopa Race Endpoint"), + ( + "macro_koopa_shell_underwater", + "Koopa Shell Underwater", + "Koopa Shell Underwater", + ), + ("macro_koopa_shellless", "Koopa Shellless", "Koopa Shellless"), + ("macro_metal_cap_switch", "Metal Cap Switch", "Metal Cap Switch"), + ("macro_moneybag", "Moneybag", "Moneybag"), + ("macro_monty_mole", "Monty Mole", "Monty Mole"), + ("macro_monty_mole_2", "Monty Mole 2", "Monty Mole 2"), + ("macro_monty_mole_hole", "Monty Mole Hole", "Monty Mole Hole"), + ("macro_moving_blue_coin", "Moving Blue Coin", "Moving Blue Coin"), + ("macro_mr_blizzard", "Mr. Blizzard", "Mr. Blizzard"), + ("macro_mr_blizzard_2", "Mr. Blizzard 2", "Mr. Blizzard 2"), + ("macro_mr_blizzard_copy", "Mr. Blizzard Copy", "Mr. Blizzard Copy"), + ("macro_mr_i", "Mr. I", "Mr. I"), + ("macro_piranha_plant", "Piranha Plant", "Piranha Plant"), + ("macro_pokey", "Pokey", "Pokey"), + ("macro_pokey_copy", "Pokey Copy", "Pokey Copy"), + ("macro_pushable_metal_box", "Pushable Metal Box", "Pushable Metal Box"), + ("macro_recovery_heart", "Recovery Heart", "Recovery Heart"), + ("macro_red_coin", "Red Coin", "Red Coin"), + ("macro_scuttlebug", "Scuttlebug", "Scuttlebug"), + ("macro_scuttlebug_spawner", "Scuttlebug Spawner", "Scuttlebug Spawner"), + ("macro_seaweed_bundle", "Seaweed Bundle", "Seaweed Bundle"), + ("macro_sign_on_wall", "Sign On Wall", "Sign On Wall"), + ("macro_skeeter", "Skeeter", "Skeeter"), + ("macro_sliding_blue_coin", "Sliding Blue Coin", "Sliding Blue Coin"), + ("macro_small_penguin", "Small Penguin", "Small Penguin"), + ("macro_snufit", "Snufit", "Snufit"), + ("macro_spindrift", "Spindrift", "Spindrift"), + ("macro_sushi", "Sushi", "Sushi"), + ("macro_swoop", "Swoop", "Swoop"), + ("macro_swoop_2", "Swoop 2", "Swoop 2"), + ("macro_thi_koopa_the_quick", "THI Koopa The Quick", "THI Koopa The Quick"), + ("macro_ttc_clock_hand", "TTC Clock Hand", "TTC Clock Hand"), + ("macro_ttc_elevator_platform", "TTC Elevator Platform", "TTC Elevator Platform"), + ("macro_ttc_large_gear", "TTC Large Gear", "TTC Large Gear"), + ("macro_ttc_large_treadmill", "TTC Large Treadmill", "TTC Large Treadmill"), + ("macro_ttc_large_treadmill_2", "TTC Large Treadmill 2", "TTC Large Treadmill 2"), + ("macro_ttc_pendulum", "TTC Pendulum", "TTC Pendulum"), + ("macro_ttc_pit_block", "TTC Pit Block", "TTC Pit Block"), + ("macro_ttc_pit_block_2", "TTC Pit Block 2", "TTC Pit Block 2"), + ("macro_ttc_push_block", "TTC Push Block", "TTC Push Block"), + ("macro_ttc_rotating_cube", "TTC Rotating Cube", "TTC Rotating Cube"), + ("macro_ttc_rotating_hexagon", "TTC Rotating Hexagon", "TTC Rotating Hexagon"), + ("macro_ttc_rotating_prism", "TTC Rotating Prism", "TTC Rotating Prism"), + ("macro_ttc_rotating_triangle", "TTC Rotating Triangle", "TTC Rotating Triangle"), + ("macro_ttc_small_gear", "TTC Small Gear", "TTC Small Gear"), + ("macro_ttc_small_treadmill", "TTC Small Treadmill", "TTC Small Treadmill"), + ("macro_ttc_small_treadmill_2", "TTC Small Treadmill 2", "TTC Small Treadmill 2"), + ("macro_ttc_spinner", "TTC Spinner", "TTC Spinner"), + ("macro_thwomp", "Thwomp", "Thwomp"), + ("macro_tiny_goomba", "Tiny Goomba", "Tiny Goomba"), + ("macro_tornado", "Tornado", "Tornado"), + ("macro_tox_box", "Tox Box", "Tox Box"), + ("macro_tuxies_mother", "Tuxies Mother", "Tuxies Mother"), + ("macro_tuxies_mother_copy", "Tuxies Mother Copy", "Tuxies Mother Copy"), + ("macro_ukiki", "Ukiki", "Ukiki"), + ("macro_ukiki_2", "Ukiki 2", "Ukiki 2"), + ("macro_unagi", "Unagi", "Unagi"), + ("macro_unknown_123", "Unknown 123", "Unknown 123"), + ("macro_unknown_137", "Unknown 137", "Unknown 137"), + ("macro_unknown_28", "Unknown 28", "Unknown 28"), + ("macro_unknown_303", "Unknown 303", "Unknown 303"), + ("macro_unknown_40", "Unknown 40", "Unknown 40"), + ("macro_unknown_41", "Unknown 41", "Unknown 41"), + ("macro_unknown_59", "Unknown 59", "Unknown 59"), + ("macro_unknown_96", "Unknown 96", "Unknown 96"), + ("macro_vanish_cap_switch", "Vanish Cap Switch", "Vanish Cap Switch"), + ("macro_water_bomb_cannon", "Water Bomb Cannon", "Water Bomb Cannon"), + ( + "macro_water_bomb_cannon_copy", + "Water Bomb Cannon Copy", + "Water Bomb Cannon Copy", + ), + ("macro_water_bomb_spawner", "Water Bomb Spawner", "Water Bomb Spawner"), + ("macro_water_mine", "Water Mine", "Water Mine"), + ("macro_whomp", "Whomp", "Whomp"), + ("macro_wiggler", "Wiggler", "Wiggler"), + ("macro_wing_cap_switch", "Wing Cap Switch", "Wing Cap Switch"), + ("macro_wooden_post", "Wooden Post", "Wooden Post"), + ("macro_wooden_post_copy", "Wooden Post Copy", "Wooden Post Copy"), + ("macro_wooden_signpost", "Wooden Signpost", "Wooden Signpost"), + ("macro_yellow_cap_switch", "Yellow Cap Switch", "Yellow Cap Switch"), + ("macro_yellow_coin", "Yellow Coin", "Yellow Coin"), + ("macro_yellow_coin_2", "Yellow Coin 2", "Yellow Coin 2"), ] diff --git a/fast64_internal/sm64/sm64_enum_parser.py b/fast64_internal/sm64/sm64_enum_parser.py index 4bcb1a8b9..0c209c557 100644 --- a/fast64_internal/sm64/sm64_enum_parser.py +++ b/fast64_internal/sm64/sm64_enum_parser.py @@ -1,35 +1,54 @@ import re -function_map_path = './sm64.us.map' -output_map_path = './output.py' -model_id_path = 'E://sm64/include/model_ids.h' -macros_path = 'E://sm64/include/macro_preset_names.h' -specials_path = 'E://sm64/include/special_preset_names.h' +function_map_path = "./sm64.us.map" +output_map_path = "./output.py" +model_id_path = "E://sm64/include/model_ids.h" +macros_path = "E://sm64/include/macro_preset_names.h" +specials_path = "E://sm64/include/special_preset_names.h" + +levelNamePrefixes = ["TTC", "DDD", "SL"] +uncapitalizedLevels = [ + "Lll", + "Ttc", + "Jrb", + "Thi", + "Ttm", + "Wdw", + "Wf", + "Rr", + "Bbh", + "Hmc", + "Ddd", + "Bitfs", + "Ssl", + "Ccm", + "Bits", + "Bitdw", +] # NOT Bob -levelNamePrefixes = ['TTC', 'DDD', 'SL'] -uncapitalizedLevels = ['Lll', 'Ttc', 'Jrb', 'Thi', 'Ttm', 'Wdw', 'Wf', 'Rr', 'Bbh', 'Hmc', 'Ddd', 'Bitfs', 'Ssl', 'Ccm', 'Bits', 'Bitdw'] # NOT Bob def handleUncapitalizedNames(name): for uncapitalizedLevel in uncapitalizedLevels: - capitalizeRegex = '' + capitalizeRegex = "" for charVal in uncapitalizedLevel: - #capitalizeRegex += '[' + charVal.lower() + charVal.upper() + ']' + # capitalizeRegex += '[' + charVal.lower() + charVal.upper() + ']' capitalizeRegex += charVal name = re.sub(capitalizeRegex, uncapitalizedLevel.upper(), name) return name + # Special cases are for refresh 8 def parse_enum(): - outfile = open(output_map_path, 'w') + outfile = open(output_map_path, "w") # Behaviours - mapfile = open(function_map_path, 'r') + mapfile = open(function_map_path, "r") mapData = mapfile.read() mapfile.close() bhvList = [] - bhvEnum = 'enumBehaviourPresets = [\n\t(\'Custom\', \'Custom\', \'Custom\'),\n' - for match in re.finditer( '([a-f0-9]{8})\s*bhv([a-zA-Z0-9]\w*)', mapData): + bhvEnum = "enumBehaviourPresets = [\n\t('Custom', 'Custom', 'Custom'),\n" + for match in re.finditer("([a-f0-9]{8})\s*bhv([a-zA-Z0-9]\w*)", mapData): name = re.sub(r"([a-z])([A-Z0-9])", r"\1 \2", match.group(2)) name = re.sub("Mr", "Mr.", name) name = re.sub("Mr\. I", "Mr. I ", name) @@ -38,25 +57,25 @@ def parse_enum(): name = re.sub("2DRotator", "2D Rotator", name) name = re.sub("Bob ", "BOB ", name) for levelNamePrefix in levelNamePrefixes: - if name[:len(levelNamePrefix)] == levelNamePrefix: - name = name[:len(levelNamePrefix)] + ' ' + name[len(levelNamePrefix):] + if name[: len(levelNamePrefix)] == levelNamePrefix: + name = name[: len(levelNamePrefix)] + " " + name[len(levelNamePrefix) :] name = handleUncapitalizedNames(name) bhvList.append((match.group(1), name)) - + bhvList.sort(key=lambda tup: tup[1]) for (val, name) in bhvList: - bhvEnum += '\t(\'' + val + '\', \'' + name + '\', \'' + name + '\'),\n' - bhvEnum += ']\n' + bhvEnum += "\t('" + val + "', '" + name + "', '" + name + "'),\n" + bhvEnum += "]\n" outfile.write(bhvEnum) - + # Model IDs - modelFile = open(model_id_path, 'r') + modelFile = open(model_id_path, "r") modelData = modelFile.read() modelFile.close() modelList = [] - - for match in re.finditer( 'MODEL_(\w*)', modelData): - if match.group(0) == 'MODEL_IDS_H': + + for match in re.finditer("MODEL_(\w*)", modelData): + if match.group(0) == "MODEL_IDS_H": continue name = match.group(1) name = re.sub("_", " ", name) @@ -66,50 +85,50 @@ def parse_enum(): name = re.sub("Bob ", "BOB ", name) name = re.sub("Sl ", "SL ", name) name = re.sub("Dl", "DL", name) - name = re.sub("Marios", "Mario\\\'s", name) + name = re.sub("Marios", "Mario\\'s", name) name = re.sub("Unknown Ac", "Unknown AC", name) name = re.sub(" W ", " With ", name) name = re.sub("1[Uu]p", "1 Up", name) modelList.append((match.group(0), name)) modelList.sort(key=lambda tup: tup[1]) - modelEnum = 'enumModelIDs = [\n\t(\'Custom\', \'Custom\', \'Custom\'),\n' + modelEnum = "enumModelIDs = [\n\t('Custom', 'Custom', 'Custom'),\n" for (val, name) in modelList: - modelEnum += '\t(\'' + val + '\', \'' + name + '\', \'' + name + '\'),\n' - modelEnum += ']\n' + modelEnum += "\t('" + val + "', '" + name + "', '" + name + "'),\n" + modelEnum += "]\n" outfile.write(modelEnum) # Specials - specialsFile = open(specials_path, 'r') + specialsFile = open(specials_path, "r") specialsData = specialsFile.read() specialsFile.close() specialsList = [] - specialsEnum = 'enumSpecialsNames = [\n\t(\'Custom\', \'Custom\', \'Custom\'),\n' - for match in re.finditer('special_(\w*)', specialsData): + specialsEnum = "enumSpecialsNames = [\n\t('Custom', 'Custom', 'Custom'),\n" + for match in re.finditer("special_(\w*)", specialsData): name = match.group(1) name = re.sub("_", " ", name) name = name.title() name = handleUncapitalizedNames(name) name = re.sub("Mr", "Mr.", name) - name = re.sub("([0-9])Star", r'\1 Star', name) + name = re.sub("([0-9])Star", r"\1 Star", name) name = re.sub("1[Uu]p", "1 Up", name) specialsList.append((match.group(0), name)) specialsList.sort(key=lambda tup: tup[1]) for (val, name) in specialsList: - specialsEnum += '\t(\'' + val + '\', \'' + name + '\', \'' + name + '\'),\n' - specialsEnum += ']\n' + specialsEnum += "\t('" + val + "', '" + name + "', '" + name + "'),\n" + specialsEnum += "]\n" outfile.write(specialsEnum) # Macros - macrosFile = open(macros_path, 'r') + macrosFile = open(macros_path, "r") macrosData = macrosFile.read() macrosFile.close() macrosList = [] - macrosEnum = 'enumMacrosNames = [\n\t(\'Custom\', \'Custom\', \'Custom\'),\n' - for match in re.finditer('macro_(\w*)', macrosData): + macrosEnum = "enumMacrosNames = [\n\t('Custom', 'Custom', 'Custom'),\n" + for match in re.finditer("macro_(\w*)", macrosData): name = match.group(1) name = re.sub("_", " ", name) name = name.title() @@ -120,8 +139,8 @@ def parse_enum(): macrosList.sort(key=lambda tup: tup[1]) for (val, name) in macrosList: - macrosEnum += '\t(\'' + val + '\', \'' + name + '\', \'' + name + '\'),\n' - macrosEnum += ']\n' - + macrosEnum += "\t('" + val + "', '" + name + "', '" + name + "'),\n" + macrosEnum += "]\n" + outfile.write(macrosEnum) - outfile.close() \ No newline at end of file + outfile.close() diff --git a/fast64_internal/sm64/sm64_f3d_parser.py b/fast64_internal/sm64/sm64_f3d_parser.py index 268211abf..54aea3fad 100644 --- a/fast64_internal/sm64/sm64_f3d_parser.py +++ b/fast64_internal/sm64/sm64_f3d_parser.py @@ -6,97 +6,112 @@ from .sm64_constants import level_enums, level_pointers from .sm64_level_parser import parseLevelAtPointer + class SM64_ImportDL(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.sm64_import_dl' - bl_label = "Import Display List" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - romfileSrc = None - try: - if context.mode != 'OBJECT': - raise PluginError("Operator can only be used in object mode.") - except Exception as e: - raisePluginError(self, e) - return {'CANCELLED'} - try: - checkExpanded(bpy.path.abspath(context.scene.importRom)) - romfileSrc = open(bpy.path.abspath(context.scene.importRom), 'rb') - levelParsed = parseLevelAtPointer(romfileSrc, - level_pointers[context.scene.levelDLImport]) - segmentData = levelParsed.segmentData - start = decodeSegmentedAddr( - int(context.scene.DLImportStart, 16).to_bytes(4, 'big'), - segmentData) if context.scene.isSegmentedAddrDLImport else \ - int(context.scene.DLImportStart, 16) - readObj = F3DtoBlenderObject(romfileSrc, start, - context.scene, 'sm64_mesh', - Matrix.Identity(4), - segmentData, True) - - applyRotation([readObj], math.radians(-90), 'X') - romfileSrc.close() - - self.report({'INFO'}, 'Generic import succeeded.') - return {'FINISHED'} # must return a set - - except Exception as e: - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - if romfileSrc is not None: - romfileSrc.close() - raisePluginError(self, e) - return {'CANCELLED'} + # set bl_ properties + bl_idname = "object.sm64_import_dl" + bl_label = "Import Display List" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + romfileSrc = None + try: + if context.mode != "OBJECT": + raise PluginError("Operator can only be used in object mode.") + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} + try: + checkExpanded(bpy.path.abspath(context.scene.importRom)) + romfileSrc = open(bpy.path.abspath(context.scene.importRom), "rb") + levelParsed = parseLevelAtPointer( + romfileSrc, level_pointers[context.scene.levelDLImport] + ) + segmentData = levelParsed.segmentData + start = ( + decodeSegmentedAddr( + int(context.scene.DLImportStart, 16).to_bytes(4, "big"), segmentData + ) + if context.scene.isSegmentedAddrDLImport + else int(context.scene.DLImportStart, 16) + ) + readObj = F3DtoBlenderObject( + romfileSrc, + start, + context.scene, + "sm64_mesh", + Matrix.Identity(4), + segmentData, + True, + ) + + applyRotation([readObj], math.radians(-90), "X") + romfileSrc.close() + + self.report({"INFO"}, "Generic import succeeded.") + return {"FINISHED"} # must return a set + + except Exception as e: + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + if romfileSrc is not None: + romfileSrc.close() + raisePluginError(self, e) + return {"CANCELLED"} + class SM64_ImportDLPanel(SM64_Panel): - bl_idname = "SM64_PT_import_dl" - bl_label = "SM64 DL Importer" - goal = sm64GoalImport + bl_idname = "SM64_PT_import_dl" + bl_label = "SM64 DL Importer" + goal = sm64GoalImport - # called every frame - def draw(self, context): - col = self.layout.column() - propsDLI = col.operator(SM64_ImportDL.bl_idname) + # called every frame + def draw(self, context): + col = self.layout.column() + propsDLI = col.operator(SM64_ImportDL.bl_idname) - prop_split(col, context.scene, 'DLImportStart', 'Start Address') - col.prop(context.scene, 'levelDLImport') - col.prop(context.scene, 'isSegmentedAddrDLImport') - col.box().label(text = "Only Fast3D mesh importing allowed.") + prop_split(col, context.scene, "DLImportStart", "Start Address") + col.prop(context.scene, "levelDLImport") + col.prop(context.scene, "isSegmentedAddrDLImport") + col.box().label(text="Only Fast3D mesh importing allowed.") -sm64_dl_parser_classes = ( - SM64_ImportDL, -) -sm64_dl_parser_panel_classes = ( - SM64_ImportDLPanel, -) +sm64_dl_parser_classes = (SM64_ImportDL,) + +sm64_dl_parser_panel_classes = (SM64_ImportDLPanel,) + def sm64_dl_parser_panel_register(): - for cls in sm64_dl_parser_panel_classes: - register_class(cls) + for cls in sm64_dl_parser_panel_classes: + register_class(cls) + def sm64_dl_parser_panel_unregister(): - for cls in sm64_dl_parser_panel_classes: - unregister_class(cls) + for cls in sm64_dl_parser_panel_classes: + unregister_class(cls) + def sm64_dl_parser_register(): - for cls in sm64_dl_parser_classes: - register_class(cls) + for cls in sm64_dl_parser_classes: + register_class(cls) + + bpy.types.Scene.DLImportStart = bpy.props.StringProperty( + name="Start Address", default="A3BE1C" + ) + bpy.types.Scene.levelDLImport = bpy.props.EnumProperty( + items=level_enums, name="Level", default="CG" + ) + bpy.types.Scene.isSegmentedAddrDLImport = bpy.props.BoolProperty( + name="Is Segmented Address", default=False + ) - bpy.types.Scene.DLImportStart = bpy.props.StringProperty( - name ='Start Address', default = 'A3BE1C') - bpy.types.Scene.levelDLImport = bpy.props.EnumProperty(items = level_enums, - name = 'Level', default = 'CG') - bpy.types.Scene.isSegmentedAddrDLImport = bpy.props.BoolProperty( - name = 'Is Segmented Address', default = False) def sm64_dl_parser_unregister(): - for cls in reversed(sm64_dl_parser_classes): - unregister_class(cls) + for cls in reversed(sm64_dl_parser_classes): + unregister_class(cls) - del bpy.types.Scene.levelDLImport - del bpy.types.Scene.DLImportStart - del bpy.types.Scene.isSegmentedAddrDLImport + del bpy.types.Scene.levelDLImport + del bpy.types.Scene.DLImportStart + del bpy.types.Scene.isSegmentedAddrDLImport diff --git a/fast64_internal/sm64/sm64_f3d_writer.py b/fast64_internal/sm64/sm64_f3d_writer.py index c11f2b207..72f21298f 100644 --- a/fast64_internal/sm64/sm64_f3d_writer.py +++ b/fast64_internal/sm64/sm64_f3d_writer.py @@ -7,935 +7,1281 @@ from .sm64_texscroll import * from .sm64_utility import * from bpy.utils import register_class, unregister_class -from .sm64_constants import level_enums, enumLevelNames, level_pointers, defaultExtendSegment4, bank0Segment, insertableBinaryTypes +from .sm64_constants import ( + level_enums, + enumLevelNames, + level_pointers, + defaultExtendSegment4, + bank0Segment, + insertableBinaryTypes, +) from .sm64_level_parser import parseLevelAtPointer from .sm64_rom_tweaks import ExtendBank0x04 enumHUDExportLocation = [ - ('HUD', 'HUD', 'Exports to src/game/hud.c'), - ('Menu', 'Menu', 'Exports to src/game/ingame_menu.c') + ("HUD", "HUD", "Exports to src/game/hud.c"), + ("Menu", "Menu", "Exports to src/game/ingame_menu.c"), ] # filepath, function to insert before enumHUDPaths = { - "HUD" : ('src/game/hud.c', 'void render_hud(void)'), - 'Menu' : ('src/game/ingame_menu.c', 's16 render_menus_and_dialogs()'), + "HUD": ("src/game/hud.c", "void render_hud(void)"), + "Menu": ("src/game/ingame_menu.c", "s16 render_menus_and_dialogs()"), } -class SM64Model(FModel): - def __init__(self, f3dType, isHWv1, name, DLFormat): - FModel.__init__(self, f3dType, isHWv1, name, DLFormat, GfxMatWriteMethod.WriteDifferingAndRevert) - def getDrawLayerV3(self, obj): - return int(obj.draw_layer_static) +class SM64Model(FModel): + def __init__(self, f3dType, isHWv1, name, DLFormat): + FModel.__init__( + self, + f3dType, + isHWv1, + name, + DLFormat, + GfxMatWriteMethod.WriteDifferingAndRevert, + ) + + def getDrawLayerV3(self, obj): + return int(obj.draw_layer_static) + + def getRenderMode(self, drawLayer): + cycle1 = getattr( + bpy.context.scene.world, "draw_layer_" + str(drawLayer) + "_cycle_1" + ) + cycle2 = getattr( + bpy.context.scene.world, "draw_layer_" + str(drawLayer) + "_cycle_2" + ) + return [cycle1, cycle2] - def getRenderMode(self, drawLayer): - cycle1 = getattr(bpy.context.scene.world, 'draw_layer_' + str(drawLayer) + '_cycle_1') - cycle2 = getattr(bpy.context.scene.world, 'draw_layer_' + str(drawLayer) + '_cycle_2') - return [cycle1, cycle2] class SM64GfxFormatter(GfxFormatter): - def __init__(self, scrollMethod: ScrollMethod): - self.functionNodeDraw = False - GfxFormatter.__init__(self, scrollMethod, 8) - - def vertexScrollToC(self, fMaterial: FMaterial, name: str, count: int): - fScrollData = fMaterial.scrollData - data = CData() - sts_data = CData() - - data.source = self.vertexScrollTemplate( - fScrollData, name, count, - 'absi', 'signum_positive', 'coss', 'random_float', 'random_sign', 'segmented_to_virtual' - ) - sts_data.source = self.tileScrollStaticMaterialToC(fMaterial) - - scrollDataFields = fScrollData.fields[0] - if not((scrollDataFields[0].animType == "None") and\ - (scrollDataFields[1].animType == "None")): - data.header = 'extern void scroll_' + name + "();\n" - - # self.tileScrollFunc is set in GfxFormatter.tileScrollStaticMaterialToC - if self.tileScrollFunc is not None: - sts_data.header = f'{self.tileScrollFunc}\n' - else: - sts_data = None - - return data, sts_data - - # This code is not functional, only used for an example - def drawToC(self, f3d, gfxList): - data = CData() - if self.functionNodeDraw: - data.header = 'Gfx* ' + self.name + '(s32 renderContext, struct GraphNode* node, struct AllocOnlyPool *a2);\n' - data.source = 'Gfx* ' + self.name + '(s32 renderContext, struct GraphNode* node, struct AllocOnlyPool *a2) {\n' +\ - '\tGfx* startCmd = NULL;\n' +\ - '\tGfx* glistp = NULL;\n' +\ - '\tstruct GraphNodeGenerated *generatedNode;\n' +\ - '\tif(renderContext == GEO_CONTEXT_RENDER) {\n' +\ - '\t\tgeneratedNode = (struct GraphNodeGenerated *) node;\n' +\ - '\t\tgeneratedNode->fnNode.node.flags = (generatedNode->fnNode.node.flags & 0xFF) | (generatedNode->parameter << 8);\n' +\ - '\t\tstartCmd = glistp = alloc_display_list(sizeof(Gfx) * ' + \ - str(int(round(self.size_total(f3d) / GFX_SIZE))) + ');\n' +\ - '\t\tif(startCmd == NULL) return NULL;\n' - - for command in self.commands: - if isinstance(command, SPDisplayList) and command.displayList.tag == GfxListTag.Material: - data.source += '\t' + 'glistp = ' + command.displayList.name + '(glistp, gAreaUpdateCounter, gAreaUpdateCounter);\n' - else: - data.source += '\t' + command.to_c(False) + ';\n' - - data.source += '\t}\n\treturn startCmd;\n}' - return data - else: - return gfxList.to_c(f3d) - - # This code is not functional, only used for an example - def tileScrollMaterialToC(self, f3d, fMaterial: FMaterial): - data = CData() - - materialGfx = fMaterial.material - scrollDataFields = fMaterial.scrollData.fields - - data.header = 'Gfx* ' + fMaterial.material.name + '(Gfx* glistp, int s, int t);\n' - - # Set tile scrolling - for texIndex in range(2): # for each texture - for axisIndex in range(2): # for each axis - scrollField = scrollDataFields[texIndex][axisIndex] - if scrollField.animType != "None": - if scrollField.animType == "Linear": - if axisIndex == 0: - fMaterial.tileSizeCommands[texIndex].uls = str(fMaterial.tileSizeCommands[0].uls) + \ - " + s * " + str(scrollField.speed) - else: - fMaterial.tileSizeCommands[texIndex].ult = str(fMaterial.tileSizeCommands[0].ult) + \ - " + s * " + str(scrollField.speed) - - # Build commands - data.source = 'Gfx* ' + materialGfx.name + '(Gfx* glistp, int s, int t) {\n' - for command in materialGfx.commands: - data.source += '\t' + command.to_c(False) + ';\n' - data.source += '\treturn glistp;\n}' + '\n\n' - - if fMaterial.revert is not None: - data.append(fMaterial.revert.to_c(f3d)) - return data - -def exportTexRectToC(dirPath, texProp, f3dType, isHWv1, texDir, - savePNG, name, exportToProject, projectExportData): - fTexRect = exportTexRectCommon(texProp, f3dType, isHWv1, name, not savePNG) - - if name is None or name == '': - raise PluginError("Name cannot be empty.") - - exportData = fTexRect.to_c(savePNG, texDir, SM64GfxFormatter(ScrollMethod.Vertex)) - staticData = exportData.staticData - dynamicData = exportData.dynamicData - - declaration = staticData.header - code = modifyDLForHUD(dynamicData.source) - data = staticData.source - - if exportToProject: - seg2CPath = os.path.join(dirPath, "bin/segment2.c") - seg2HPath = os.path.join(dirPath, "src/game/segment2.h") - seg2TexDir = os.path.join(dirPath, "textures/segment2") - hudPath = os.path.join(dirPath, projectExportData[0]) - - checkIfPathExists(seg2CPath) - checkIfPathExists(seg2HPath) - checkIfPathExists(seg2TexDir) - checkIfPathExists(hudPath) - - fTexRect.save_textures(seg2TexDir, not savePNG) - - textures = [] - for info, texture in fTexRect.textures.items(): - textures.append(texture) - - # Append/Overwrite texture definition to segment2.c - overwriteData('const\s*u8\s*', textures[0].name, data, seg2CPath, None, False) - - # Append texture declaration to segment2.h - writeIfNotFound(seg2HPath, declaration, '#endif') - - # Write/Overwrite function to hud.c - overwriteData('void\s*', fTexRect.name, code, hudPath, projectExportData[1], True) - - else: - singleFileData = '' - singleFileData += '// Copy this function to src/game/hud.c or src/game/ingame_menu.c.\n' - singleFileData += '// Call the function in render_hud() or render_menus_and_dialogs() respectively.\n' - singleFileData += code - singleFileData += '// Copy this declaration to src/game/segment2.h.\n' - singleFileData += declaration - singleFileData += '// Copy this texture data to bin/segment2.c\n' - singleFileData += '// If texture data is being included from an inc.c, make sure to copy the png to textures/segment2.\n' - singleFileData += data - singleFilePath = os.path.join(dirPath, fTexRect.name + '.c') - singleFile = open(singleFilePath, 'w', newline='\n') - singleFile.write(singleFileData) - singleFile.close() - - if bpy.context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') + def __init__(self, scrollMethod: ScrollMethod): + self.functionNodeDraw = False + GfxFormatter.__init__(self, scrollMethod, 8) + + def vertexScrollToC(self, fMaterial: FMaterial, name: str, count: int): + fScrollData = fMaterial.scrollData + data = CData() + sts_data = CData() + + data.source = self.vertexScrollTemplate( + fScrollData, + name, + count, + "absi", + "signum_positive", + "coss", + "random_float", + "random_sign", + "segmented_to_virtual", + ) + sts_data.source = self.tileScrollStaticMaterialToC(fMaterial) + + scrollDataFields = fScrollData.fields[0] + if not ( + (scrollDataFields[0].animType == "None") + and (scrollDataFields[1].animType == "None") + ): + data.header = "extern void scroll_" + name + "();\n" + + # self.tileScrollFunc is set in GfxFormatter.tileScrollStaticMaterialToC + if self.tileScrollFunc is not None: + sts_data.header = f"{self.tileScrollFunc}\n" + else: + sts_data = None + + return data, sts_data + + # This code is not functional, only used for an example + def drawToC(self, f3d, gfxList): + data = CData() + if self.functionNodeDraw: + data.header = ( + "Gfx* " + + self.name + + "(s32 renderContext, struct GraphNode* node, struct AllocOnlyPool *a2);\n" + ) + data.source = ( + "Gfx* " + + self.name + + "(s32 renderContext, struct GraphNode* node, struct AllocOnlyPool *a2) {\n" + + "\tGfx* startCmd = NULL;\n" + + "\tGfx* glistp = NULL;\n" + + "\tstruct GraphNodeGenerated *generatedNode;\n" + + "\tif(renderContext == GEO_CONTEXT_RENDER) {\n" + + "\t\tgeneratedNode = (struct GraphNodeGenerated *) node;\n" + + "\t\tgeneratedNode->fnNode.node.flags = (generatedNode->fnNode.node.flags & 0xFF) | (generatedNode->parameter << 8);\n" + + "\t\tstartCmd = glistp = alloc_display_list(sizeof(Gfx) * " + + str(int(round(self.size_total(f3d) / GFX_SIZE))) + + ");\n" + + "\t\tif(startCmd == NULL) return NULL;\n" + ) + + for command in self.commands: + if ( + isinstance(command, SPDisplayList) + and command.displayList.tag == GfxListTag.Material + ): + data.source += ( + "\t" + + "glistp = " + + command.displayList.name + + "(glistp, gAreaUpdateCounter, gAreaUpdateCounter);\n" + ) + else: + data.source += "\t" + command.to_c(False) + ";\n" + + data.source += "\t}\n\treturn startCmd;\n}" + return data + else: + return gfxList.to_c(f3d) + + # This code is not functional, only used for an example + def tileScrollMaterialToC(self, f3d, fMaterial: FMaterial): + data = CData() + + materialGfx = fMaterial.material + scrollDataFields = fMaterial.scrollData.fields + + data.header = ( + "Gfx* " + fMaterial.material.name + "(Gfx* glistp, int s, int t);\n" + ) + + # Set tile scrolling + for texIndex in range(2): # for each texture + for axisIndex in range(2): # for each axis + scrollField = scrollDataFields[texIndex][axisIndex] + if scrollField.animType != "None": + if scrollField.animType == "Linear": + if axisIndex == 0: + fMaterial.tileSizeCommands[texIndex].uls = ( + str(fMaterial.tileSizeCommands[0].uls) + + " + s * " + + str(scrollField.speed) + ) + else: + fMaterial.tileSizeCommands[texIndex].ult = ( + str(fMaterial.tileSizeCommands[0].ult) + + " + s * " + + str(scrollField.speed) + ) + + # Build commands + data.source = "Gfx* " + materialGfx.name + "(Gfx* glistp, int s, int t) {\n" + for command in materialGfx.commands: + data.source += "\t" + command.to_c(False) + ";\n" + data.source += "\treturn glistp;\n}" + "\n\n" + + if fMaterial.revert is not None: + data.append(fMaterial.revert.to_c(f3d)) + return data + + +def exportTexRectToC( + dirPath, + texProp, + f3dType, + isHWv1, + texDir, + savePNG, + name, + exportToProject, + projectExportData, +): + fTexRect = exportTexRectCommon(texProp, f3dType, isHWv1, name, not savePNG) + + if name is None or name == "": + raise PluginError("Name cannot be empty.") + + exportData = fTexRect.to_c(savePNG, texDir, SM64GfxFormatter(ScrollMethod.Vertex)) + staticData = exportData.staticData + dynamicData = exportData.dynamicData + + declaration = staticData.header + code = modifyDLForHUD(dynamicData.source) + data = staticData.source + + if exportToProject: + seg2CPath = os.path.join(dirPath, "bin/segment2.c") + seg2HPath = os.path.join(dirPath, "src/game/segment2.h") + seg2TexDir = os.path.join(dirPath, "textures/segment2") + hudPath = os.path.join(dirPath, projectExportData[0]) + + checkIfPathExists(seg2CPath) + checkIfPathExists(seg2HPath) + checkIfPathExists(seg2TexDir) + checkIfPathExists(hudPath) + + fTexRect.save_textures(seg2TexDir, not savePNG) + + textures = [] + for info, texture in fTexRect.textures.items(): + textures.append(texture) + + # Append/Overwrite texture definition to segment2.c + overwriteData("const\s*u8\s*", textures[0].name, data, seg2CPath, None, False) + + # Append texture declaration to segment2.h + writeIfNotFound(seg2HPath, declaration, "#endif") + + # Write/Overwrite function to hud.c + overwriteData( + "void\s*", fTexRect.name, code, hudPath, projectExportData[1], True + ) + + else: + singleFileData = "" + singleFileData += ( + "// Copy this function to src/game/hud.c or src/game/ingame_menu.c.\n" + ) + singleFileData += "// Call the function in render_hud() or render_menus_and_dialogs() respectively.\n" + singleFileData += code + singleFileData += "// Copy this declaration to src/game/segment2.h.\n" + singleFileData += declaration + singleFileData += "// Copy this texture data to bin/segment2.c\n" + singleFileData += "// If texture data is being included from an inc.c, make sure to copy the png to textures/segment2.\n" + singleFileData += data + singleFilePath = os.path.join(dirPath, fTexRect.name + ".c") + singleFile = open(singleFilePath, "w", newline="\n") + singleFile.write(singleFileData) + singleFile.close() + + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + def modifyDLForHUD(data): - # Use sm64 master dl pointer - data = re.sub('glistp', 'gDisplayListHead', data) - - # Add positional arguments to drawing, along with negative pos handling - negativePosHandling = \ - '\ts32 xl = MAX(0, x);\n' +\ - '\ts32 yl = MAX(0, y);\n' +\ - '\ts32 xh = MAX(0, x + width - 1);\n' +\ - '\ts32 yh = MAX(0, y + height - 1);\n' +\ - '\ts = (x < 0) ? s - x : s;\n' +\ - '\tt = (y < 0) ? t - y : t;\n' - - data = re.sub('Gfx\* gDisplayListHead\) \{\n', - 's32 x, s32 y, s32 width, s32 height, s32 s, s32 t) {\n' + \ - negativePosHandling, data) - - # Remove display list end command and return value - data = re.sub('\tgSPEndDisplayList\(gDisplayListHead\+\+\)\;\n\treturn gDisplayListHead;\n', '', data) - data = 'void' + data[4:] - - # Apply positional arguments to SPScisTextureRectangle - matchResult = re.search('gSPScisTextureRectangle\(gDisplayListHead\+\+\,' + \ - ' (((?!\,).)*)\, (((?!\,).)*)\, (((?!\,).)*)\, (((?!\,).)*)\, (((?!\,).)*)\, (((?!\,).)*)\, (((?!\,).)*)\,', data) - if matchResult: - #data = data[:matchResult.start(0)] + \ - # 'gSPScisTextureRectangle(gDisplayListHead++, (x << 2) + ' + \ - # matchResult.group(1) + ', (y << 2) + ' + \ - # matchResult.group(3) + ', (x << 2) + ' + \ - # matchResult.group(5) + ', (y << 2) + ' + \ - # matchResult.group(7) + ',' + data[matchResult.end(0):] - data = data[:matchResult.start(0)] + \ - 'gSPScisTextureRectangle(gDisplayListHead++, ' +\ - 'xl << 2, yl << 2, xh << 2, yh << 2, ' +\ - matchResult.group(11) + ', s << 5, t << 5, ' + data[matchResult.end(0):] - - # Make sure to convert segmented texture pointer to virtual - #matchResult = re.search('gDPSetTextureImage\(gDisplayListHead\+\+\,' +\ - # '(((?!\,).)*)\, (((?!\,).)*)\, (((?!\,).)*)\, (((?!\,).)*)\)', data) - #if matchResult: - # data = data[:matchResult.start(7)] + 'segmented_to_virtual(&' + \ - # matchResult.group(7) + ")" +data[matchResult.end(7):] - - return data + # Use sm64 master dl pointer + data = re.sub("glistp", "gDisplayListHead", data) + + # Add positional arguments to drawing, along with negative pos handling + negativePosHandling = ( + "\ts32 xl = MAX(0, x);\n" + + "\ts32 yl = MAX(0, y);\n" + + "\ts32 xh = MAX(0, x + width - 1);\n" + + "\ts32 yh = MAX(0, y + height - 1);\n" + + "\ts = (x < 0) ? s - x : s;\n" + + "\tt = (y < 0) ? t - y : t;\n" + ) + + data = re.sub( + "Gfx\* gDisplayListHead\) \{\n", + "s32 x, s32 y, s32 width, s32 height, s32 s, s32 t) {\n" + negativePosHandling, + data, + ) + + # Remove display list end command and return value + data = re.sub( + "\tgSPEndDisplayList\(gDisplayListHead\+\+\)\;\n\treturn gDisplayListHead;\n", + "", + data, + ) + data = "void" + data[4:] + + # Apply positional arguments to SPScisTextureRectangle + matchResult = re.search( + "gSPScisTextureRectangle\(gDisplayListHead\+\+\," + + " (((?!\,).)*)\, (((?!\,).)*)\, (((?!\,).)*)\, (((?!\,).)*)\, (((?!\,).)*)\, (((?!\,).)*)\, (((?!\,).)*)\,", + data, + ) + if matchResult: + # data = data[:matchResult.start(0)] + \ + # 'gSPScisTextureRectangle(gDisplayListHead++, (x << 2) + ' + \ + # matchResult.group(1) + ', (y << 2) + ' + \ + # matchResult.group(3) + ', (x << 2) + ' + \ + # matchResult.group(5) + ', (y << 2) + ' + \ + # matchResult.group(7) + ',' + data[matchResult.end(0):] + data = ( + data[: matchResult.start(0)] + + "gSPScisTextureRectangle(gDisplayListHead++, " + + "xl << 2, yl << 2, xh << 2, yh << 2, " + + matchResult.group(11) + + ", s << 5, t << 5, " + + data[matchResult.end(0) :] + ) + + # Make sure to convert segmented texture pointer to virtual + # matchResult = re.search('gDPSetTextureImage\(gDisplayListHead\+\+\,' +\ + # '(((?!\,).)*)\, (((?!\,).)*)\, (((?!\,).)*)\, (((?!\,).)*)\)', data) + # if matchResult: + # data = data[:matchResult.start(7)] + 'segmented_to_virtual(&' + \ + # matchResult.group(7) + ")" +data[matchResult.end(7):] + + return data + def exportTexRectCommon(texProp, f3dType, isHWv1, name, convertTextureData): - tex = texProp.tex - if tex is None: - raise PluginError('No texture is selected.') - - texProp.S.low = 0 - texProp.S.high = texProp.tex.size[0] - 1 - texProp.S.mask = math.ceil(math.log(texProp.tex.size[0], 2) - 0.001) - texProp.S.shift = 0 - - texProp.T.low = 0 - texProp.T.high = texProp.tex.size[1] - 1 - texProp.T.mask = math.ceil(math.log(texProp.tex.size[1], 2) - 0.001) - texProp.T.shift = 0 - - fTexRect = FTexRect(f3dType, isHWv1, toAlnum(name), GfxMatWriteMethod.WriteDifferingAndRevert) - fMaterial = FMaterial(toAlnum(name) + "_mat", DLFormat.Dynamic) - - # dl_hud_img_begin - fTexRect.draw.commands.extend([ - DPPipeSync(), - DPSetCycleType('G_CYC_COPY'), - DPSetTexturePersp('G_TP_NONE'), - DPSetAlphaCompare('G_AC_THRESHOLD'), - DPSetBlendColor(0xFF, 0xFF, 0xFF, 0xFF), - DPSetRenderMode(['G_RM_AA_XLU_SURF', 'G_RM_AA_XLU_SURF2'], None) - ]) - - drawEndCommands = GfxList("temp", GfxListTag.Draw, DLFormat.Dynamic) - - texDimensions, nextTmem = saveTextureIndex(texProp.tex.name, fTexRect, - fMaterial, fTexRect.draw, drawEndCommands, texProp, 0, 0, 'texture', convertTextureData, - None, True, True) - - fTexRect.draw.commands.append( - SPScisTextureRectangle(0, 0, - (texDimensions[0] - 1) << 2, (texDimensions[1] - 1) << 2, - 0, 0, 0) - ) - - fTexRect.draw.commands.extend(drawEndCommands.commands) - - # dl_hud_img_end - fTexRect.draw.commands.extend([ - DPPipeSync(), - DPSetCycleType('G_CYC_1CYCLE'), - SPTexture(0xFFFF, 0xFFFF, 0, 'G_TX_RENDERTILE', 'G_OFF'), - DPSetTexturePersp('G_TP_PERSP'), - DPSetAlphaCompare('G_AC_NONE'), - DPSetRenderMode(['G_RM_AA_ZB_OPA_SURF', 'G_RM_AA_ZB_OPA_SURF2'], None), - SPEndDisplayList() - ]) - - return fTexRect - -def sm64ExportF3DtoC(basePath, obj, DLFormat, transformMatrix, - f3dType, isHWv1, texDir, savePNG, texSeparate, includeChildren, name, levelName, groupName, customExport, headerType): - dirPath, texDir = getExportDir(customExport, basePath, headerType, - levelName, texDir, name) - - fModel = SM64Model(f3dType, isHWv1, name, DLFormat) - fMesh = exportF3DCommon(obj, fModel, transformMatrix, - includeChildren, name, DLFormat, not savePNG) - - modelDirPath = os.path.join(dirPath, toAlnum(name)) - - if not os.path.exists(modelDirPath): - os.mkdir(modelDirPath) - - if headerType == 'Actor': - scrollName = 'actor_dl_' + name - elif headerType == 'Level': - scrollName = levelName + '_level_dl_' + name - - gfxFormatter = SM64GfxFormatter(ScrollMethod.Vertex) - exportData = fModel.to_c(TextureExportSettings(texSeparate, savePNG, texDir, modelDirPath), gfxFormatter) - staticData = exportData.staticData - dynamicData = exportData.dynamicData - texC = exportData.textureData - - scrollData, hasScrolling = fModel.to_c_vertex_scroll(scrollName, gfxFormatter) - - scroll_data = scrollData.source - cDefineScroll = scrollData.header - - modifyTexScrollFiles(basePath, modelDirPath, cDefineScroll, scroll_data, hasScrolling) - - if DLFormat == DLFormat.Static: - staticData.append(dynamicData) - else: - geoString = writeMaterialFiles(basePath, modelDirPath, - '#include "actors/' + toAlnum(name) + '/header.h"', - '#include "actors/' + toAlnum(name) + '/material.inc.h"', - dynamicData.header, dynamicData.source, '', customExport) - - if texSeparate: - texCFile = open(os.path.join(modelDirPath, 'texture.inc.c'), 'w', newline='\n') - texCFile.write(texC.source) - texCFile.close() - - modelPath = os.path.join(modelDirPath, 'model.inc.c') - outFile = open(modelPath, 'w', newline='\n') - outFile.write(staticData.source) - outFile.close() - - headerPath = os.path.join(modelDirPath, 'header.h') - cDefFile = open(headerPath, 'w', newline='\n') - cDefFile.write(staticData.header) - cDefFile.close() - - fileStatus = None - if not customExport: - if headerType == 'Actor': - # Write to group files - if groupName == '' or groupName is None: - raise PluginError("Actor header type chosen but group name not provided.") - - groupPathC = os.path.join(dirPath, groupName + ".c") - groupPathH = os.path.join(dirPath, groupName + ".h") - - writeIfNotFound(groupPathC, '\n#include "' + toAlnum(name) + '/model.inc.c"', '') - writeIfNotFound(groupPathH, '\n#include "' + toAlnum(name) + '/header.h"', '\n#endif') - - if DLFormat != DLFormat.Static: # Change this - writeMaterialHeaders(basePath, - '#include "actors/' + toAlnum(name) + '/material.inc.c"', - '#include "actors/' + toAlnum(name) + '/material.inc.h"') - - texscrollIncludeC = '#include "actors/' + name + '/texscroll.inc.c"' - texscrollIncludeH = '#include "actors/' + name + '/texscroll.inc.h"' - texscrollGroup = groupName - texscrollGroupInclude = '#include "actors/' + groupName + '.h"' - - elif headerType == 'Level': - groupPathC = os.path.join(dirPath, "leveldata.c") - groupPathH = os.path.join(dirPath, "header.h") - - writeIfNotFound(groupPathC, '\n#include "levels/' + levelName + '/' + \ - toAlnum(name) + '/model.inc.c"', '') - writeIfNotFound(groupPathH, '\n#include "levels/' + levelName + '/' + \ - toAlnum(name) + '/header.h"', '\n#endif') - - if DLFormat != DLFormat.Static: # Change this - writeMaterialHeaders(basePath, - '#include "levels/' + levelName + '/' + toAlnum(name) + '/material.inc.c"', - '#include "levels/' + levelName + '/' + toAlnum(name) + '/material.inc.h"') - - texscrollIncludeC = '#include "levels/' + levelName + '/' + name + '/texscroll.inc.c"' - texscrollIncludeH = '#include "levels/' + levelName + '/' + name + '/texscroll.inc.h"' - texscrollGroup = levelName - texscrollGroupInclude = '#include "levels/' + levelName + '/header.h"' - - fileStatus = modifyTexScrollHeadersGroup(basePath, texscrollIncludeC, texscrollIncludeH, - texscrollGroup, cDefineScroll, texscrollGroupInclude, hasScrolling) - - if bpy.context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - - return fileStatus - -def exportF3DtoBinary(romfile, exportRange, transformMatrix, - obj, f3dType, isHWv1, segmentData, includeChildren): - - fModel = SM64Model(f3dType, isHWv1, obj.name, DLFormat) - fMesh = exportF3DCommon(obj, fModel, - transformMatrix, includeChildren, obj.name, DLFormat.Static, True) - fModel.freePalettes() - - addrRange = fModel.set_addr(exportRange[0]) - if addrRange[1] > exportRange[1]: - raise PluginError('Size too big: Data ends at ' + hex(addrRange[1]) +\ - ', which is larger than the specified range.') - fModel.save_binary(romfile, segmentData) - if bpy.context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - - segPointerData = encodeSegmentedAddr( - fMesh.draw.startAddress, segmentData) - - return fMesh.draw.startAddress, addrRange, segPointerData - -def exportF3DtoBinaryBank0(romfile, exportRange, transformMatrix, - obj, f3dType, isHWv1, RAMAddr, includeChildren): - - fModel = SM64Model(f3dType, isHWv1, obj.name, DLFormat) - fMesh = exportF3DCommon(obj, fModel, transformMatrix, includeChildren, - obj.name, DLFormat.Static, True) - segmentData = copy.copy(bank0Segment) - - data, startRAM = getBinaryBank0F3DData(fModel, RAMAddr, exportRange) - - startAddress = get64bitAlignedAddr(exportRange[0]) - romfile.seek(startAddress) - romfile.write(data) - - if bpy.context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - - segPointerData = encodeSegmentedAddr( - fMesh.draw.startAddress, segmentData) - - return (fMesh.draw.startAddress, \ - (startAddress, startAddress + len(data)), segPointerData) - -def exportF3DtoInsertableBinary(filepath, transformMatrix, - obj, f3dType, isHWv1, includeChildren): - - fModel = SM64Model(f3dType, isHWv1, obj.name, DLFormat) - fMesh = exportF3DCommon(obj, fModel, transformMatrix, includeChildren, - obj.name, DLFormat.Static, True) - - data, startRAM = getBinaryBank0F3DData(fModel, 0, [0, 0xFFFFFF]) - # must happen after getBinaryBank0F3DData - address_ptrs = fModel.get_ptr_addresses(f3dType) - - writeInsertableFile(filepath, insertableBinaryTypes['Display List'], - address_ptrs, fMesh.draw.startAddress, data) + tex = texProp.tex + if tex is None: + raise PluginError("No texture is selected.") + + texProp.S.low = 0 + texProp.S.high = texProp.tex.size[0] - 1 + texProp.S.mask = math.ceil(math.log(texProp.tex.size[0], 2) - 0.001) + texProp.S.shift = 0 + + texProp.T.low = 0 + texProp.T.high = texProp.tex.size[1] - 1 + texProp.T.mask = math.ceil(math.log(texProp.tex.size[1], 2) - 0.001) + texProp.T.shift = 0 + + fTexRect = FTexRect( + f3dType, isHWv1, toAlnum(name), GfxMatWriteMethod.WriteDifferingAndRevert + ) + fMaterial = FMaterial(toAlnum(name) + "_mat", DLFormat.Dynamic) + + # dl_hud_img_begin + fTexRect.draw.commands.extend( + [ + DPPipeSync(), + DPSetCycleType("G_CYC_COPY"), + DPSetTexturePersp("G_TP_NONE"), + DPSetAlphaCompare("G_AC_THRESHOLD"), + DPSetBlendColor(0xFF, 0xFF, 0xFF, 0xFF), + DPSetRenderMode(["G_RM_AA_XLU_SURF", "G_RM_AA_XLU_SURF2"], None), + ] + ) + + drawEndCommands = GfxList("temp", GfxListTag.Draw, DLFormat.Dynamic) + + texDimensions, nextTmem = saveTextureIndex( + texProp.tex.name, + fTexRect, + fMaterial, + fTexRect.draw, + drawEndCommands, + texProp, + 0, + 0, + "texture", + convertTextureData, + None, + True, + True, + ) + + fTexRect.draw.commands.append( + SPScisTextureRectangle( + 0, 0, (texDimensions[0] - 1) << 2, (texDimensions[1] - 1) << 2, 0, 0, 0 + ) + ) + + fTexRect.draw.commands.extend(drawEndCommands.commands) + + # dl_hud_img_end + fTexRect.draw.commands.extend( + [ + DPPipeSync(), + DPSetCycleType("G_CYC_1CYCLE"), + SPTexture(0xFFFF, 0xFFFF, 0, "G_TX_RENDERTILE", "G_OFF"), + DPSetTexturePersp("G_TP_PERSP"), + DPSetAlphaCompare("G_AC_NONE"), + DPSetRenderMode(["G_RM_AA_ZB_OPA_SURF", "G_RM_AA_ZB_OPA_SURF2"], None), + SPEndDisplayList(), + ] + ) + + return fTexRect + + +def sm64ExportF3DtoC( + basePath, + obj, + DLFormat, + transformMatrix, + f3dType, + isHWv1, + texDir, + savePNG, + texSeparate, + includeChildren, + name, + levelName, + groupName, + customExport, + headerType, +): + dirPath, texDir = getExportDir( + customExport, basePath, headerType, levelName, texDir, name + ) + + fModel = SM64Model(f3dType, isHWv1, name, DLFormat) + fMesh = exportF3DCommon( + obj, fModel, transformMatrix, includeChildren, name, DLFormat, not savePNG + ) + + modelDirPath = os.path.join(dirPath, toAlnum(name)) + + if not os.path.exists(modelDirPath): + os.mkdir(modelDirPath) + + if headerType == "Actor": + scrollName = "actor_dl_" + name + elif headerType == "Level": + scrollName = levelName + "_level_dl_" + name + + gfxFormatter = SM64GfxFormatter(ScrollMethod.Vertex) + exportData = fModel.to_c( + TextureExportSettings(texSeparate, savePNG, texDir, modelDirPath), gfxFormatter + ) + staticData = exportData.staticData + dynamicData = exportData.dynamicData + texC = exportData.textureData + + scrollData, hasScrolling = fModel.to_c_vertex_scroll(scrollName, gfxFormatter) + + scroll_data = scrollData.source + cDefineScroll = scrollData.header + + modifyTexScrollFiles( + basePath, modelDirPath, cDefineScroll, scroll_data, hasScrolling + ) + + if DLFormat == DLFormat.Static: + staticData.append(dynamicData) + else: + geoString = writeMaterialFiles( + basePath, + modelDirPath, + '#include "actors/' + toAlnum(name) + '/header.h"', + '#include "actors/' + toAlnum(name) + '/material.inc.h"', + dynamicData.header, + dynamicData.source, + "", + customExport, + ) + + if texSeparate: + texCFile = open(os.path.join(modelDirPath, "texture.inc.c"), "w", newline="\n") + texCFile.write(texC.source) + texCFile.close() + + modelPath = os.path.join(modelDirPath, "model.inc.c") + outFile = open(modelPath, "w", newline="\n") + outFile.write(staticData.source) + outFile.close() + + headerPath = os.path.join(modelDirPath, "header.h") + cDefFile = open(headerPath, "w", newline="\n") + cDefFile.write(staticData.header) + cDefFile.close() + + fileStatus = None + if not customExport: + if headerType == "Actor": + # Write to group files + if groupName == "" or groupName is None: + raise PluginError( + "Actor header type chosen but group name not provided." + ) + + groupPathC = os.path.join(dirPath, groupName + ".c") + groupPathH = os.path.join(dirPath, groupName + ".h") + + writeIfNotFound( + groupPathC, '\n#include "' + toAlnum(name) + '/model.inc.c"', "" + ) + writeIfNotFound( + groupPathH, '\n#include "' + toAlnum(name) + '/header.h"', "\n#endif" + ) + + if DLFormat != DLFormat.Static: # Change this + writeMaterialHeaders( + basePath, + '#include "actors/' + toAlnum(name) + '/material.inc.c"', + '#include "actors/' + toAlnum(name) + '/material.inc.h"', + ) + + texscrollIncludeC = '#include "actors/' + name + '/texscroll.inc.c"' + texscrollIncludeH = '#include "actors/' + name + '/texscroll.inc.h"' + texscrollGroup = groupName + texscrollGroupInclude = '#include "actors/' + groupName + '.h"' + + elif headerType == "Level": + groupPathC = os.path.join(dirPath, "leveldata.c") + groupPathH = os.path.join(dirPath, "header.h") + + writeIfNotFound( + groupPathC, + '\n#include "levels/' + + levelName + + "/" + + toAlnum(name) + + '/model.inc.c"', + "", + ) + writeIfNotFound( + groupPathH, + '\n#include "levels/' + levelName + "/" + toAlnum(name) + '/header.h"', + "\n#endif", + ) + + if DLFormat != DLFormat.Static: # Change this + writeMaterialHeaders( + basePath, + '#include "levels/' + + levelName + + "/" + + toAlnum(name) + + '/material.inc.c"', + '#include "levels/' + + levelName + + "/" + + toAlnum(name) + + '/material.inc.h"', + ) + + texscrollIncludeC = ( + '#include "levels/' + levelName + "/" + name + '/texscroll.inc.c"' + ) + texscrollIncludeH = ( + '#include "levels/' + levelName + "/" + name + '/texscroll.inc.h"' + ) + texscrollGroup = levelName + texscrollGroupInclude = '#include "levels/' + levelName + '/header.h"' + + fileStatus = modifyTexScrollHeadersGroup( + basePath, + texscrollIncludeC, + texscrollIncludeH, + texscrollGroup, + cDefineScroll, + texscrollGroupInclude, + hasScrolling, + ) + + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + + return fileStatus + + +def exportF3DtoBinary( + romfile, + exportRange, + transformMatrix, + obj, + f3dType, + isHWv1, + segmentData, + includeChildren, +): + + fModel = SM64Model(f3dType, isHWv1, obj.name, DLFormat) + fMesh = exportF3DCommon( + obj, fModel, transformMatrix, includeChildren, obj.name, DLFormat.Static, True + ) + fModel.freePalettes() + + addrRange = fModel.set_addr(exportRange[0]) + if addrRange[1] > exportRange[1]: + raise PluginError( + "Size too big: Data ends at " + + hex(addrRange[1]) + + ", which is larger than the specified range." + ) + fModel.save_binary(romfile, segmentData) + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + + segPointerData = encodeSegmentedAddr(fMesh.draw.startAddress, segmentData) + + return fMesh.draw.startAddress, addrRange, segPointerData + + +def exportF3DtoBinaryBank0( + romfile, + exportRange, + transformMatrix, + obj, + f3dType, + isHWv1, + RAMAddr, + includeChildren, +): + + fModel = SM64Model(f3dType, isHWv1, obj.name, DLFormat) + fMesh = exportF3DCommon( + obj, fModel, transformMatrix, includeChildren, obj.name, DLFormat.Static, True + ) + segmentData = copy.copy(bank0Segment) + + data, startRAM = getBinaryBank0F3DData(fModel, RAMAddr, exportRange) + + startAddress = get64bitAlignedAddr(exportRange[0]) + romfile.seek(startAddress) + romfile.write(data) + + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + + segPointerData = encodeSegmentedAddr(fMesh.draw.startAddress, segmentData) + + return ( + fMesh.draw.startAddress, + (startAddress, startAddress + len(data)), + segPointerData, + ) + + +def exportF3DtoInsertableBinary( + filepath, transformMatrix, obj, f3dType, isHWv1, includeChildren +): + + fModel = SM64Model(f3dType, isHWv1, obj.name, DLFormat) + fMesh = exportF3DCommon( + obj, fModel, transformMatrix, includeChildren, obj.name, DLFormat.Static, True + ) + + data, startRAM = getBinaryBank0F3DData(fModel, 0, [0, 0xFFFFFF]) + # must happen after getBinaryBank0F3DData + address_ptrs = fModel.get_ptr_addresses(f3dType) + + writeInsertableFile( + filepath, + insertableBinaryTypes["Display List"], + address_ptrs, + fMesh.draw.startAddress, + data, + ) + def getBinaryBank0F3DData(fModel, RAMAddr, exportRange): - fModel.freePalettes() - segmentData = copy.copy(bank0Segment) - - addrRange = fModel.set_addr(RAMAddr) - if addrRange[1] - RAMAddr > exportRange[1] - exportRange[0]: - raise PluginError('Size too big: Data ends at ' + hex(addrRange[1]) +\ - ', which is larger than the specified range.') - - bytesIO = BytesIO() - #actualRAMAddr = get64bitAlignedAddr(RAMAddr) - bytesIO.seek(RAMAddr) - fModel.save_binary(bytesIO, segmentData) - data = bytesIO.getvalue()[RAMAddr:] - bytesIO.close() - return data, RAMAddr + fModel.freePalettes() + segmentData = copy.copy(bank0Segment) + + addrRange = fModel.set_addr(RAMAddr) + if addrRange[1] - RAMAddr > exportRange[1] - exportRange[0]: + raise PluginError( + "Size too big: Data ends at " + + hex(addrRange[1]) + + ", which is larger than the specified range." + ) + + bytesIO = BytesIO() + # actualRAMAddr = get64bitAlignedAddr(RAMAddr) + bytesIO.seek(RAMAddr) + fModel.save_binary(bytesIO, segmentData) + data = bytesIO.getvalue()[RAMAddr:] + bytesIO.close() + return data, RAMAddr + class SM64_ExportDL(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.sm64_export_dl' - bl_label = "Export Display List" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - romfileOutput = None - tempROM = None - try: - if context.mode != 'OBJECT': - raise PluginError("Operator can only be used in object mode.") - allObjs = context.selected_objects - if len(allObjs) == 0: - raise PluginError("No objects selected.") - obj = context.selected_objects[0] - if not isinstance(obj.data, bpy.types.Mesh): - raise PluginError("Object is not a mesh.") - - #T, R, S = obj.matrix_world.decompose() - #objTransform = R.to_matrix().to_4x4() @ \ - # mathutils.Matrix.Diagonal(S).to_4x4() - - #finalTransform = (blenderToSM64Rotation * \ - # (bpy.context.scene.blenderToSM64Scale)).to_4x4() - #finalTransform = mathutils.Matrix.Identity(4) - scaleValue = bpy.context.scene.blenderToSM64Scale - finalTransform = mathutils.Matrix.Diagonal(mathutils.Vector(( - scaleValue, scaleValue, scaleValue))).to_4x4() - - except Exception as e: - raisePluginError(self, e) - return {"CANCELLED"} - - try: - applyRotation([obj], math.radians(90), 'X') - if context.scene.fast64.sm64.exportType == 'C': - exportPath, levelName = getPathAndLevel(context.scene.DLCustomExport, - context.scene.DLExportPath, context.scene.DLLevelName, - context.scene.DLLevelOption) - if not context.scene.DLCustomExport: - applyBasicTweaks(exportPath) - fileStatus = sm64ExportF3DtoC(exportPath, obj, - DLFormat.Static if context.scene.DLExportisStatic else DLFormat.Dynamic, finalTransform, - context.scene.f3d_type, context.scene.isHWv1, - bpy.context.scene.DLTexDir, - bpy.context.scene.saveTextures or bpy.context.scene.ignoreTextureRestrictions, - bpy.context.scene.DLSeparateTextureDef, - bpy.context.scene.DLincludeChildren, bpy.context.scene.DLName, levelName, context.scene.DLGroupName, - context.scene.DLCustomExport, - context.scene.DLExportHeaderType) - - starSelectWarning(self, fileStatus) - #cProfile.runctx('sm64ExportF3DtoC(exportPath, obj,' +\ - # 'DLFormat.Static if context.scene.DLExportisStatic else DLFormat.Dynamic, finalTransform,' +\ - # 'context.scene.f3d_type, context.scene.isHWv1,' +\ - # 'bpy.context.scene.DLTexDir,' +\ - # 'bpy.context.scene.saveTextures or bpy.context.scene.ignoreTextureRestrictions,' +\ - # 'bpy.context.scene.DLSeparateTextureDef,' +\ - # 'bpy.context.scene.DLincludeChildren, bpy.context.scene.DLName, levelName, context.scene.DLGroupName,' +\ - # 'context.scene.DLCustomExport,' +\ - # 'context.scene.DLExportHeaderType)', - # globals(), locals(), "E:/blender.prof") - #p = pstats.Stats("E:/blender.prof") - #p.sort_stats("cumulative").print_stats(2000) - self.report({'INFO'}, 'Success!') - - elif context.scene.fast64.sm64.exportType == 'Insertable Binary': - exportF3DtoInsertableBinary( - bpy.path.abspath(context.scene.DLInsertableBinaryPath), - finalTransform, obj, context.scene.f3d_type, - context.scene.isHWv1, bpy.context.scene.DLincludeChildren) - self.report({'INFO'}, 'Success! DL at ' + \ - context.scene.DLInsertableBinaryPath + '.') - else: - checkExpanded(bpy.path.abspath(context.scene.exportRom)) - tempROM = tempName(context.scene.outputRom) - romfileExport = \ - open(bpy.path.abspath(context.scene.exportRom), 'rb') - shutil.copy(bpy.path.abspath(context.scene.exportRom), - bpy.path.abspath(tempROM)) - romfileExport.close() - romfileOutput = open(bpy.path.abspath(tempROM), 'rb+') - - levelParsed = parseLevelAtPointer(romfileOutput, - level_pointers[context.scene.levelDLExport]) - segmentData = levelParsed.segmentData - if context.scene.extendBank4: - ExtendBank0x04(romfileOutput, segmentData, - defaultExtendSegment4) - - if context.scene.DLUseBank0: - startAddress, addrRange, segPointerData = \ - exportF3DtoBinaryBank0(romfileOutput, - [int(context.scene.DLExportStart, 16), - int(context.scene.DLExportEnd, 16)], - finalTransform, obj, context.scene.f3d_type, - context.scene.isHWv1, getAddressFromRAMAddress( - int(context.scene.DLRAMAddr, 16)), - bpy.context.scene.DLincludeChildren) - else: - startAddress, addrRange, segPointerData = \ - exportF3DtoBinary(romfileOutput, - [int(context.scene.DLExportStart, 16), - int(context.scene.DLExportEnd, 16)], - finalTransform, obj, context.scene.f3d_type, - context.scene.isHWv1, segmentData, - bpy.context.scene.DLincludeChildren) - - if context.scene.overwriteGeoPtr: - romfileOutput.seek(int(context.scene.DLExportGeoPtr, 16)) - romfileOutput.write(segPointerData) - - romfileOutput.close() - if os.path.exists(bpy.path.abspath(context.scene.outputRom)): - os.remove(bpy.path.abspath(context.scene.outputRom)) - os.rename(bpy.path.abspath(tempROM), - bpy.path.abspath(context.scene.outputRom)) - - if context.scene.DLUseBank0: - self.report({'INFO'}, 'Success! DL at (' + \ - hex(addrRange[0]) + ', ' + hex(addrRange[1]) + \ - '), ' +\ - 'to write to RAM address ' + \ - hex(startAddress + 0x80000000)) - else: - - self.report({'INFO'}, 'Success! DL at (' + \ - hex(addrRange[0]) + ', ' + hex(addrRange[1]) + \ - ') (Seg. ' + bytesToHex(segPointerData) + ').') - - applyRotation([obj], math.radians(-90), 'X') - return {'FINISHED'} # must return a set - - except Exception as e: - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - applyRotation([obj], math.radians(-90), 'X') - if context.scene.fast64.sm64.exportType == 'Binary': - if romfileOutput is not None: - romfileOutput.close() - if tempROM is not None and os.path.exists(bpy.path.abspath(tempROM)): - os.remove(bpy.path.abspath(tempROM)) - raisePluginError(self, e) - return {'CANCELLED'} # must return a set + # set bl_ properties + bl_idname = "object.sm64_export_dl" + bl_label = "Export Display List" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + romfileOutput = None + tempROM = None + try: + if context.mode != "OBJECT": + raise PluginError("Operator can only be used in object mode.") + allObjs = context.selected_objects + if len(allObjs) == 0: + raise PluginError("No objects selected.") + obj = context.selected_objects[0] + if not isinstance(obj.data, bpy.types.Mesh): + raise PluginError("Object is not a mesh.") + + # T, R, S = obj.matrix_world.decompose() + # objTransform = R.to_matrix().to_4x4() @ \ + # mathutils.Matrix.Diagonal(S).to_4x4() + + # finalTransform = (blenderToSM64Rotation * \ + # (bpy.context.scene.blenderToSM64Scale)).to_4x4() + # finalTransform = mathutils.Matrix.Identity(4) + scaleValue = bpy.context.scene.blenderToSM64Scale + finalTransform = mathutils.Matrix.Diagonal( + mathutils.Vector((scaleValue, scaleValue, scaleValue)) + ).to_4x4() + + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} + + try: + applyRotation([obj], math.radians(90), "X") + if context.scene.fast64.sm64.exportType == "C": + exportPath, levelName = getPathAndLevel( + context.scene.DLCustomExport, + context.scene.DLExportPath, + context.scene.DLLevelName, + context.scene.DLLevelOption, + ) + if not context.scene.DLCustomExport: + applyBasicTweaks(exportPath) + fileStatus = sm64ExportF3DtoC( + exportPath, + obj, + DLFormat.Static + if context.scene.DLExportisStatic + else DLFormat.Dynamic, + finalTransform, + context.scene.f3d_type, + context.scene.isHWv1, + bpy.context.scene.DLTexDir, + bpy.context.scene.saveTextures + or bpy.context.scene.ignoreTextureRestrictions, + bpy.context.scene.DLSeparateTextureDef, + bpy.context.scene.DLincludeChildren, + bpy.context.scene.DLName, + levelName, + context.scene.DLGroupName, + context.scene.DLCustomExport, + context.scene.DLExportHeaderType, + ) + + starSelectWarning(self, fileStatus) + # cProfile.runctx('sm64ExportF3DtoC(exportPath, obj,' +\ + # 'DLFormat.Static if context.scene.DLExportisStatic else DLFormat.Dynamic, finalTransform,' +\ + # 'context.scene.f3d_type, context.scene.isHWv1,' +\ + # 'bpy.context.scene.DLTexDir,' +\ + # 'bpy.context.scene.saveTextures or bpy.context.scene.ignoreTextureRestrictions,' +\ + # 'bpy.context.scene.DLSeparateTextureDef,' +\ + # 'bpy.context.scene.DLincludeChildren, bpy.context.scene.DLName, levelName, context.scene.DLGroupName,' +\ + # 'context.scene.DLCustomExport,' +\ + # 'context.scene.DLExportHeaderType)', + # globals(), locals(), "E:/blender.prof") + # p = pstats.Stats("E:/blender.prof") + # p.sort_stats("cumulative").print_stats(2000) + self.report({"INFO"}, "Success!") + + elif context.scene.fast64.sm64.exportType == "Insertable Binary": + exportF3DtoInsertableBinary( + bpy.path.abspath(context.scene.DLInsertableBinaryPath), + finalTransform, + obj, + context.scene.f3d_type, + context.scene.isHWv1, + bpy.context.scene.DLincludeChildren, + ) + self.report( + {"INFO"}, + "Success! DL at " + context.scene.DLInsertableBinaryPath + ".", + ) + else: + checkExpanded(bpy.path.abspath(context.scene.exportRom)) + tempROM = tempName(context.scene.outputRom) + romfileExport = open(bpy.path.abspath(context.scene.exportRom), "rb") + shutil.copy( + bpy.path.abspath(context.scene.exportRom), bpy.path.abspath(tempROM) + ) + romfileExport.close() + romfileOutput = open(bpy.path.abspath(tempROM), "rb+") + + levelParsed = parseLevelAtPointer( + romfileOutput, level_pointers[context.scene.levelDLExport] + ) + segmentData = levelParsed.segmentData + if context.scene.extendBank4: + ExtendBank0x04(romfileOutput, segmentData, defaultExtendSegment4) + + if context.scene.DLUseBank0: + startAddress, addrRange, segPointerData = exportF3DtoBinaryBank0( + romfileOutput, + [ + int(context.scene.DLExportStart, 16), + int(context.scene.DLExportEnd, 16), + ], + finalTransform, + obj, + context.scene.f3d_type, + context.scene.isHWv1, + getAddressFromRAMAddress(int(context.scene.DLRAMAddr, 16)), + bpy.context.scene.DLincludeChildren, + ) + else: + startAddress, addrRange, segPointerData = exportF3DtoBinary( + romfileOutput, + [ + int(context.scene.DLExportStart, 16), + int(context.scene.DLExportEnd, 16), + ], + finalTransform, + obj, + context.scene.f3d_type, + context.scene.isHWv1, + segmentData, + bpy.context.scene.DLincludeChildren, + ) + + if context.scene.overwriteGeoPtr: + romfileOutput.seek(int(context.scene.DLExportGeoPtr, 16)) + romfileOutput.write(segPointerData) + + romfileOutput.close() + if os.path.exists(bpy.path.abspath(context.scene.outputRom)): + os.remove(bpy.path.abspath(context.scene.outputRom)) + os.rename( + bpy.path.abspath(tempROM), bpy.path.abspath(context.scene.outputRom) + ) + + if context.scene.DLUseBank0: + self.report( + {"INFO"}, + "Success! DL at (" + + hex(addrRange[0]) + + ", " + + hex(addrRange[1]) + + "), " + + "to write to RAM address " + + hex(startAddress + 0x80000000), + ) + else: + + self.report( + {"INFO"}, + "Success! DL at (" + + hex(addrRange[0]) + + ", " + + hex(addrRange[1]) + + ") (Seg. " + + bytesToHex(segPointerData) + + ").", + ) + + applyRotation([obj], math.radians(-90), "X") + return {"FINISHED"} # must return a set + + except Exception as e: + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + applyRotation([obj], math.radians(-90), "X") + if context.scene.fast64.sm64.exportType == "Binary": + if romfileOutput is not None: + romfileOutput.close() + if tempROM is not None and os.path.exists(bpy.path.abspath(tempROM)): + os.remove(bpy.path.abspath(tempROM)) + raisePluginError(self, e) + return {"CANCELLED"} # must return a set + class SM64_ExportDLPanel(SM64_Panel): - bl_idname = "SM64_PT_export_dl" - bl_label = "SM64 DL Exporter" - goal = 'Export Displaylist' - - # called every frame - def draw(self, context): - col = self.layout.column() - propsDLE = col.operator(SM64_ExportDL.bl_idname) - - if context.scene.fast64.sm64.exportType == 'C': - col.prop(context.scene, 'DLExportisStatic') - - - col.prop(context.scene, 'DLCustomExport') - if context.scene.DLCustomExport: - col.prop(context.scene, 'DLExportPath') - prop_split(col, context.scene, 'DLName', 'Name') - if not bpy.context.scene.ignoreTextureRestrictions and context.scene.saveTextures: - prop_split(col, context.scene, 'DLTexDir', - 'Texture Include Path') - col.prop(context.scene, 'DLSeparateTextureDef') - customExportWarning(col) - else: - prop_split(col, context.scene, 'DLExportHeaderType', 'Export Type') - prop_split(col, context.scene, 'DLName', 'Name') - if context.scene.DLExportHeaderType == 'Actor': - prop_split(col, context.scene, 'DLGroupName', 'Group Name') - elif context.scene.DLExportHeaderType == 'Level': - prop_split(col, context.scene, 'DLLevelOption', 'Level') - if context.scene.DLLevelOption == 'custom': - prop_split(col, context.scene, 'DLLevelName', 'Level Name') - if not bpy.context.scene.ignoreTextureRestrictions and context.scene.saveTextures: - col.prop(context.scene, 'DLSeparateTextureDef') - - decompFolderMessage(col) - writeBox = makeWriteInfoBox(col) - writeBoxExportType(writeBox, context.scene.DLExportHeaderType, - context.scene.DLName, context.scene.DLLevelName, context.scene.DLLevelOption) - - elif context.scene.fast64.sm64.exportType == 'Insertable Binary': - col.prop(context.scene, 'DLInsertableBinaryPath') - else: - prop_split(col, context.scene, 'DLExportStart', 'Start Address') - prop_split(col, context.scene, 'DLExportEnd', 'End Address') - col.prop(context.scene, 'DLUseBank0') - if context.scene.DLUseBank0: - prop_split(col, context.scene, 'DLRAMAddr', 'RAM Address') - else: - col.prop(context.scene, 'levelDLExport') - col.prop(context.scene, 'overwriteGeoPtr') - if context.scene.overwriteGeoPtr: - prop_split(col, context.scene, 'DLExportGeoPtr', - 'Geolayout Pointer') - col.prop(context.scene, 'DLincludeChildren') + bl_idname = "SM64_PT_export_dl" + bl_label = "SM64 DL Exporter" + goal = "Export Displaylist" + + # called every frame + def draw(self, context): + col = self.layout.column() + propsDLE = col.operator(SM64_ExportDL.bl_idname) + + if context.scene.fast64.sm64.exportType == "C": + col.prop(context.scene, "DLExportisStatic") + + col.prop(context.scene, "DLCustomExport") + if context.scene.DLCustomExport: + col.prop(context.scene, "DLExportPath") + prop_split(col, context.scene, "DLName", "Name") + if ( + not bpy.context.scene.ignoreTextureRestrictions + and context.scene.saveTextures + ): + prop_split(col, context.scene, "DLTexDir", "Texture Include Path") + col.prop(context.scene, "DLSeparateTextureDef") + customExportWarning(col) + else: + prop_split(col, context.scene, "DLExportHeaderType", "Export Type") + prop_split(col, context.scene, "DLName", "Name") + if context.scene.DLExportHeaderType == "Actor": + prop_split(col, context.scene, "DLGroupName", "Group Name") + elif context.scene.DLExportHeaderType == "Level": + prop_split(col, context.scene, "DLLevelOption", "Level") + if context.scene.DLLevelOption == "custom": + prop_split(col, context.scene, "DLLevelName", "Level Name") + if ( + not bpy.context.scene.ignoreTextureRestrictions + and context.scene.saveTextures + ): + col.prop(context.scene, "DLSeparateTextureDef") + + decompFolderMessage(col) + writeBox = makeWriteInfoBox(col) + writeBoxExportType( + writeBox, + context.scene.DLExportHeaderType, + context.scene.DLName, + context.scene.DLLevelName, + context.scene.DLLevelOption, + ) + + elif context.scene.fast64.sm64.exportType == "Insertable Binary": + col.prop(context.scene, "DLInsertableBinaryPath") + else: + prop_split(col, context.scene, "DLExportStart", "Start Address") + prop_split(col, context.scene, "DLExportEnd", "End Address") + col.prop(context.scene, "DLUseBank0") + if context.scene.DLUseBank0: + prop_split(col, context.scene, "DLRAMAddr", "RAM Address") + else: + col.prop(context.scene, "levelDLExport") + col.prop(context.scene, "overwriteGeoPtr") + if context.scene.overwriteGeoPtr: + prop_split(col, context.scene, "DLExportGeoPtr", "Geolayout Pointer") + col.prop(context.scene, "DLincludeChildren") + class ExportTexRectDraw(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.f3d_texrect_draw' - bl_label = "Export F3D Texture Rectangle" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - try: - if context.scene.texrect.tex is None: - raise PluginError("No texture selected.") - else: - if context.scene.TexRectCustomExport: - exportPath = context.scene.TexRectExportPath - else: - if context.scene.decompPath == "": - raise PluginError("Decomp path has not been set in File Settings.") - exportPath = context.scene.decompPath - if not context.scene.TexRectCustomExport: - applyBasicTweaks(exportPath) - exportTexRectToC(bpy.path.abspath(exportPath), - context.scene.texrect, - context.scene.f3d_type, context.scene.isHWv1, - 'textures/segment2', - context.scene.saveTextures or bpy.context.scene.ignoreTextureRestrictions, - context.scene.TexRectName, - not context.scene.TexRectCustomExport, - enumHUDPaths[context.scene.TexRectExportType]) - - self.report({'INFO'}, 'Success!') - except Exception as e: - raisePluginError(self, e) - return {"CANCELLED"} - return {'FINISHED'} # must return a set + # set bl_ properties + bl_idname = "object.f3d_texrect_draw" + bl_label = "Export F3D Texture Rectangle" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + try: + if context.scene.texrect.tex is None: + raise PluginError("No texture selected.") + else: + if context.scene.TexRectCustomExport: + exportPath = context.scene.TexRectExportPath + else: + if context.scene.decompPath == "": + raise PluginError( + "Decomp path has not been set in File Settings." + ) + exportPath = context.scene.decompPath + if not context.scene.TexRectCustomExport: + applyBasicTweaks(exportPath) + exportTexRectToC( + bpy.path.abspath(exportPath), + context.scene.texrect, + context.scene.f3d_type, + context.scene.isHWv1, + "textures/segment2", + context.scene.saveTextures + or bpy.context.scene.ignoreTextureRestrictions, + context.scene.TexRectName, + not context.scene.TexRectCustomExport, + enumHUDPaths[context.scene.TexRectExportType], + ) + + self.report({"INFO"}, "Success!") + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} + return {"FINISHED"} # must return a set + class UnlinkTexRect(bpy.types.Operator): - bl_idname = 'image.texrect_unlink' - bl_label = "Unlink TexRect Image" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} + bl_idname = "image.texrect_unlink" + bl_label = "Unlink TexRect Image" + bl_options = {"REGISTER", "UNDO", "PRESET"} - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - context.scene.texrect.tex = None - return {'FINISHED'} # must return a set + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + context.scene.texrect.tex = None + return {"FINISHED"} # must return a set -class ExportTexRectDrawPanel(SM64_Panel): - bl_idname = "TEXTURE_PT_export_texrect" - bl_label = "SM64 UI Image Exporter" - goal = 'Export UI Image' - decomp_only = True - - # called every frame - def draw(self, context): - col = self.layout.column() - propsTexRectE = col.operator(ExportTexRectDraw.bl_idname) - - textureProp = context.scene.texrect - tex = textureProp.tex - col.label(text = 'This is for decomp only.') - col.template_ID(textureProp, 'tex', new="image.new", open="image.open", unlink="image.texrect_unlink") - #col.prop(textureProp, 'tex') - - tmemUsageUI(col, textureProp) - if tex is not None and tex.size[0] > 0 and tex.size[1] > 0: - col.prop(textureProp, 'tex_format', text = 'Format') - if textureProp.tex_format[:2] == 'CI': - col.prop(textureProp, 'ci_format', text = 'CI Format') - col.prop(textureProp.S, 'clamp', text = 'Clamp S') - col.prop(textureProp.T, 'clamp', text = 'Clamp T') - col.prop(textureProp.S, 'mirror', text = 'Mirror S') - col.prop(textureProp.T, 'mirror', text = 'Mirror T') - - prop_split(col, context.scene, 'TexRectName', 'Name') - col.prop(context.scene, 'TexRectCustomExport') - if context.scene.TexRectCustomExport: - col.prop(context.scene, 'TexRectExportPath') - customExportWarning(col) - else: - prop_split(col, context.scene, 'TexRectExportType', 'Export Type') - if not context.scene.TexRectCustomExport: - decompFolderMessage(col) - writeBox = makeWriteInfoBox(col) - writeBox.label(text = 'bin/segment2.c') - writeBox.label(text = 'src/game/segment2.h') - writeBox.label(text = 'textures/segment2') - infoBox = col.box() - infoBox.label(text = 'After export, call your hud\'s draw function in ') - infoBox.label(text = enumHUDPaths[context.scene.TexRectExportType][0] + ': ') - infoBox.label(text = enumHUDPaths[context.scene.TexRectExportType][1] + '.') -class SM64_DrawLayersPanel(bpy.types.Panel): - bl_label = "SM64 Draw Layers" - bl_idname = "WORLD_PT_SM64_Draw_Layers_Panel" - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "world" - bl_options = {'HIDE_HEADER'} - - @classmethod - def poll(cls, context): - return context.scene.gameEditorMode == "SM64" - - def draw(self, context): - world = context.scene.world - layout = self.layout - - inputGroup = layout.column() - inputGroup.prop(world, 'menu_layers', - text = 'Draw Layers', - icon = 'TRIA_DOWN' if world.menu_layers else 'TRIA_RIGHT') - if world.menu_layers: - for i in range(8): - drawLayerUI(inputGroup, i, world) +class ExportTexRectDrawPanel(SM64_Panel): + bl_idname = "TEXTURE_PT_export_texrect" + bl_label = "SM64 UI Image Exporter" + goal = "Export UI Image" + decomp_only = True + + # called every frame + def draw(self, context): + col = self.layout.column() + propsTexRectE = col.operator(ExportTexRectDraw.bl_idname) + + textureProp = context.scene.texrect + tex = textureProp.tex + col.label(text="This is for decomp only.") + col.template_ID( + textureProp, + "tex", + new="image.new", + open="image.open", + unlink="image.texrect_unlink", + ) + # col.prop(textureProp, 'tex') + + tmemUsageUI(col, textureProp) + if tex is not None and tex.size[0] > 0 and tex.size[1] > 0: + col.prop(textureProp, "tex_format", text="Format") + if textureProp.tex_format[:2] == "CI": + col.prop(textureProp, "ci_format", text="CI Format") + col.prop(textureProp.S, "clamp", text="Clamp S") + col.prop(textureProp.T, "clamp", text="Clamp T") + col.prop(textureProp.S, "mirror", text="Mirror S") + col.prop(textureProp.T, "mirror", text="Mirror T") + + prop_split(col, context.scene, "TexRectName", "Name") + col.prop(context.scene, "TexRectCustomExport") + if context.scene.TexRectCustomExport: + col.prop(context.scene, "TexRectExportPath") + customExportWarning(col) + else: + prop_split(col, context.scene, "TexRectExportType", "Export Type") + if not context.scene.TexRectCustomExport: + decompFolderMessage(col) + writeBox = makeWriteInfoBox(col) + writeBox.label(text="bin/segment2.c") + writeBox.label(text="src/game/segment2.h") + writeBox.label(text="textures/segment2") + infoBox = col.box() + infoBox.label(text="After export, call your hud's draw function in ") + infoBox.label(text=enumHUDPaths[context.scene.TexRectExportType][0] + ": ") + infoBox.label(text=enumHUDPaths[context.scene.TexRectExportType][1] + ".") -def drawLayerUI(layout, drawLayer, world): - box = layout.box() - box.label(text = 'Layer ' + str(drawLayer)) - row = box.row() - row.prop(world, 'draw_layer_' + str(drawLayer) + '_cycle_1', text = '') - row.prop(world, 'draw_layer_' + str(drawLayer) + '_cycle_2', text = '') -class SM64_MaterialPanel(bpy.types.Panel): - bl_label = "SM64 Material" - bl_idname = "MATERIAL_PT_SM64_Material_Inspector" - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "material" - bl_options = {'HIDE_HEADER'} +class SM64_DrawLayersPanel(bpy.types.Panel): + bl_label = "SM64 Draw Layers" + bl_idname = "WORLD_PT_SM64_Draw_Layers_Panel" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "world" + bl_options = {"HIDE_HEADER"} + + @classmethod + def poll(cls, context): + return context.scene.gameEditorMode == "SM64" + + def draw(self, context): + world = context.scene.world + layout = self.layout + + inputGroup = layout.column() + inputGroup.prop( + world, + "menu_layers", + text="Draw Layers", + icon="TRIA_DOWN" if world.menu_layers else "TRIA_RIGHT", + ) + if world.menu_layers: + for i in range(8): + drawLayerUI(inputGroup, i, world) - @classmethod - def poll(cls, context): - return context.material is not None and context.scene.gameEditorMode == "SM64" - def draw(self, context): - layout = self.layout - material = context.material - col = layout.column() +def drawLayerUI(layout, drawLayer, world): + box = layout.box() + box.label(text="Layer " + str(drawLayer)) + row = box.row() + row.prop(world, "draw_layer_" + str(drawLayer) + "_cycle_1", text="") + row.prop(world, "draw_layer_" + str(drawLayer) + "_cycle_2", text="") - if material.mat_ver > 3: - f3dMat = material.f3d_mat - else: - f3dMat = material - useDict = all_combiner_uses(f3dMat) - if useDict['Texture']: - ui_procAnim(material, col, useDict['Texture 0'], useDict['Texture 1'], - "SM64 UV Texture Scroll", False) +class SM64_MaterialPanel(bpy.types.Panel): + bl_label = "SM64 Material" + bl_idname = "MATERIAL_PT_SM64_Material_Inspector" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "material" + bl_options = {"HIDE_HEADER"} + + @classmethod + def poll(cls, context): + return context.material is not None and context.scene.gameEditorMode == "SM64" + + def draw(self, context): + layout = self.layout + material = context.material + col = layout.column() + + if material.mat_ver > 3: + f3dMat = material.f3d_mat + else: + f3dMat = material + useDict = all_combiner_uses(f3dMat) + + if useDict["Texture"]: + ui_procAnim( + material, + col, + useDict["Texture 0"], + useDict["Texture 1"], + "SM64 UV Texture Scroll", + False, + ) sm64_dl_writer_classes = ( - SM64_ExportDL, - ExportTexRectDraw, - UnlinkTexRect, + SM64_ExportDL, + ExportTexRectDraw, + UnlinkTexRect, ) sm64_dl_writer_panel_classes = ( - SM64_MaterialPanel, - SM64_DrawLayersPanel, - SM64_ExportDLPanel, - ExportTexRectDrawPanel, + SM64_MaterialPanel, + SM64_DrawLayersPanel, + SM64_ExportDLPanel, + ExportTexRectDrawPanel, ) + def sm64_dl_writer_panel_register(): - for cls in sm64_dl_writer_panel_classes: - register_class(cls) + for cls in sm64_dl_writer_panel_classes: + register_class(cls) + def sm64_dl_writer_panel_unregister(): - for cls in sm64_dl_writer_panel_classes: - unregister_class(cls) + for cls in sm64_dl_writer_panel_classes: + unregister_class(cls) + def sm64_dl_writer_register(): - for cls in sm64_dl_writer_classes: - register_class(cls) - - bpy.types.World.draw_layer_0_cycle_1 = bpy.props.StringProperty(default = 'G_RM_ZB_OPA_SURF') - bpy.types.World.draw_layer_0_cycle_2 = bpy.props.StringProperty(default = 'G_RM_ZB_OPA_SURF2') - bpy.types.World.draw_layer_1_cycle_1 = bpy.props.StringProperty(default = 'G_RM_AA_ZB_OPA_SURF') - bpy.types.World.draw_layer_1_cycle_2 = bpy.props.StringProperty(default = 'G_RM_AA_ZB_OPA_SURF2') - bpy.types.World.draw_layer_2_cycle_1 = bpy.props.StringProperty(default = 'G_RM_AA_ZB_OPA_DECAL') - bpy.types.World.draw_layer_2_cycle_2 = bpy.props.StringProperty(default = 'G_RM_AA_ZB_OPA_DECAL2') - bpy.types.World.draw_layer_3_cycle_1 = bpy.props.StringProperty(default = 'G_RM_AA_ZB_OPA_INTER') - bpy.types.World.draw_layer_3_cycle_2 = bpy.props.StringProperty(default = 'G_RM_AA_ZB_OPA_INTER2') - bpy.types.World.draw_layer_4_cycle_1 = bpy.props.StringProperty(default = 'G_RM_AA_ZB_TEX_EDGE') - bpy.types.World.draw_layer_4_cycle_2 = bpy.props.StringProperty(default = 'G_RM_AA_ZB_TEX_EDGE2') - bpy.types.World.draw_layer_5_cycle_1 = bpy.props.StringProperty(default = 'G_RM_AA_ZB_XLU_SURF') - bpy.types.World.draw_layer_5_cycle_2 = bpy.props.StringProperty(default = 'G_RM_AA_ZB_XLU_SURF2') - bpy.types.World.draw_layer_6_cycle_1 = bpy.props.StringProperty(default = 'G_RM_AA_ZB_XLU_DECAL') - bpy.types.World.draw_layer_6_cycle_2 = bpy.props.StringProperty(default = 'G_RM_AA_ZB_XLU_DECAL2') - bpy.types.World.draw_layer_7_cycle_1 = bpy.props.StringProperty(default = 'G_RM_AA_ZB_XLU_INTER') - bpy.types.World.draw_layer_7_cycle_2 = bpy.props.StringProperty(default = 'G_RM_AA_ZB_XLU_INTER2') - - bpy.types.Scene.DLExportStart = bpy.props.StringProperty( - name = 'Start', default = '11D8930') - bpy.types.Scene.DLExportEnd = bpy.props.StringProperty( - name = 'End', default = '11FFF00') - bpy.types.Scene.levelDLExport = bpy.props.EnumProperty(items = level_enums, - name = 'Level', default = 'WF') - bpy.types.Scene.DLExportGeoPtr = bpy.props.StringProperty( - name ='Geolayout Pointer', default = '132AA8') - bpy.types.Scene.overwriteGeoPtr = bpy.props.BoolProperty( - name = "Overwrite geolayout pointer", default = False) - bpy.types.Scene.DLExportPath = bpy.props.StringProperty( - name = 'Directory', subtype = 'FILE_PATH') - bpy.types.Scene.DLExportisStatic = bpy.props.BoolProperty( - name = 'Static DL', default = True) - bpy.types.Scene.DLDefinePath = bpy.props.StringProperty( - name = 'Definitions Filepath', subtype = 'FILE_PATH') - bpy.types.Scene.DLUseBank0 = bpy.props.BoolProperty(name = 'Use Bank 0') - bpy.types.Scene.DLRAMAddr = bpy.props.StringProperty(name = 'RAM Address', - default = '80000000') - bpy.types.Scene.DLTexDir = bpy.props.StringProperty( - name ='Include Path', default = 'levels/bob') - bpy.types.Scene.DLSeparateTextureDef = bpy.props.BoolProperty( - name = 'Save texture.inc.c separately') - bpy.types.Scene.DLincludeChildren = bpy.props.BoolProperty( - name = 'Include Children') - bpy.types.Scene.DLInsertableBinaryPath = bpy.props.StringProperty( - name = 'Filepath', subtype = 'FILE_PATH') - bpy.types.Scene.DLName = bpy.props.StringProperty( - name = 'Name', default = 'mario') - bpy.types.Scene.DLCustomExport = bpy.props.BoolProperty( - name = 'Custom Export Path') - bpy.types.Scene.DLExportHeaderType = bpy.props.EnumProperty( - items = enumExportHeaderType, name = 'Header Export', default = 'Actor') - bpy.types.Scene.DLGroupName = bpy.props.StringProperty(name = 'Group Name', - default = 'group0') - bpy.types.Scene.DLLevelName = bpy.props.StringProperty(name = 'Level', - default = 'bob') - bpy.types.Scene.DLLevelOption = bpy.props.EnumProperty( - items = enumLevelNames, name = 'Level', default = 'bob') - - bpy.types.Scene.texrect = bpy.props.PointerProperty(type = TextureProperty) - bpy.types.Scene.texrectImageTexture = bpy.props.PointerProperty(type = bpy.types.ImageTexture) - bpy.types.Scene.TexRectExportPath = bpy.props.StringProperty(name = 'Export Path', subtype='FILE_PATH') - bpy.types.Scene.TexRectTexDir = bpy.props.StringProperty(name = 'Include Path', default = 'textures/segment2') - bpy.types.Scene.TexRectName = bpy.props.StringProperty(name = 'Name', default = 'render_hud_image') - bpy.types.Scene.TexRectCustomExport = bpy.props.BoolProperty(name = 'Custom Export Path') - bpy.types.Scene.TexRectExportType = bpy.props.EnumProperty(name = 'Export Type', items = enumHUDExportLocation) + for cls in sm64_dl_writer_classes: + register_class(cls) + + bpy.types.World.draw_layer_0_cycle_1 = bpy.props.StringProperty( + default="G_RM_ZB_OPA_SURF" + ) + bpy.types.World.draw_layer_0_cycle_2 = bpy.props.StringProperty( + default="G_RM_ZB_OPA_SURF2" + ) + bpy.types.World.draw_layer_1_cycle_1 = bpy.props.StringProperty( + default="G_RM_AA_ZB_OPA_SURF" + ) + bpy.types.World.draw_layer_1_cycle_2 = bpy.props.StringProperty( + default="G_RM_AA_ZB_OPA_SURF2" + ) + bpy.types.World.draw_layer_2_cycle_1 = bpy.props.StringProperty( + default="G_RM_AA_ZB_OPA_DECAL" + ) + bpy.types.World.draw_layer_2_cycle_2 = bpy.props.StringProperty( + default="G_RM_AA_ZB_OPA_DECAL2" + ) + bpy.types.World.draw_layer_3_cycle_1 = bpy.props.StringProperty( + default="G_RM_AA_ZB_OPA_INTER" + ) + bpy.types.World.draw_layer_3_cycle_2 = bpy.props.StringProperty( + default="G_RM_AA_ZB_OPA_INTER2" + ) + bpy.types.World.draw_layer_4_cycle_1 = bpy.props.StringProperty( + default="G_RM_AA_ZB_TEX_EDGE" + ) + bpy.types.World.draw_layer_4_cycle_2 = bpy.props.StringProperty( + default="G_RM_AA_ZB_TEX_EDGE2" + ) + bpy.types.World.draw_layer_5_cycle_1 = bpy.props.StringProperty( + default="G_RM_AA_ZB_XLU_SURF" + ) + bpy.types.World.draw_layer_5_cycle_2 = bpy.props.StringProperty( + default="G_RM_AA_ZB_XLU_SURF2" + ) + bpy.types.World.draw_layer_6_cycle_1 = bpy.props.StringProperty( + default="G_RM_AA_ZB_XLU_DECAL" + ) + bpy.types.World.draw_layer_6_cycle_2 = bpy.props.StringProperty( + default="G_RM_AA_ZB_XLU_DECAL2" + ) + bpy.types.World.draw_layer_7_cycle_1 = bpy.props.StringProperty( + default="G_RM_AA_ZB_XLU_INTER" + ) + bpy.types.World.draw_layer_7_cycle_2 = bpy.props.StringProperty( + default="G_RM_AA_ZB_XLU_INTER2" + ) + + bpy.types.Scene.DLExportStart = bpy.props.StringProperty( + name="Start", default="11D8930" + ) + bpy.types.Scene.DLExportEnd = bpy.props.StringProperty( + name="End", default="11FFF00" + ) + bpy.types.Scene.levelDLExport = bpy.props.EnumProperty( + items=level_enums, name="Level", default="WF" + ) + bpy.types.Scene.DLExportGeoPtr = bpy.props.StringProperty( + name="Geolayout Pointer", default="132AA8" + ) + bpy.types.Scene.overwriteGeoPtr = bpy.props.BoolProperty( + name="Overwrite geolayout pointer", default=False + ) + bpy.types.Scene.DLExportPath = bpy.props.StringProperty( + name="Directory", subtype="FILE_PATH" + ) + bpy.types.Scene.DLExportisStatic = bpy.props.BoolProperty( + name="Static DL", default=True + ) + bpy.types.Scene.DLDefinePath = bpy.props.StringProperty( + name="Definitions Filepath", subtype="FILE_PATH" + ) + bpy.types.Scene.DLUseBank0 = bpy.props.BoolProperty(name="Use Bank 0") + bpy.types.Scene.DLRAMAddr = bpy.props.StringProperty( + name="RAM Address", default="80000000" + ) + bpy.types.Scene.DLTexDir = bpy.props.StringProperty( + name="Include Path", default="levels/bob" + ) + bpy.types.Scene.DLSeparateTextureDef = bpy.props.BoolProperty( + name="Save texture.inc.c separately" + ) + bpy.types.Scene.DLincludeChildren = bpy.props.BoolProperty(name="Include Children") + bpy.types.Scene.DLInsertableBinaryPath = bpy.props.StringProperty( + name="Filepath", subtype="FILE_PATH" + ) + bpy.types.Scene.DLName = bpy.props.StringProperty(name="Name", default="mario") + bpy.types.Scene.DLCustomExport = bpy.props.BoolProperty(name="Custom Export Path") + bpy.types.Scene.DLExportHeaderType = bpy.props.EnumProperty( + items=enumExportHeaderType, name="Header Export", default="Actor" + ) + bpy.types.Scene.DLGroupName = bpy.props.StringProperty( + name="Group Name", default="group0" + ) + bpy.types.Scene.DLLevelName = bpy.props.StringProperty(name="Level", default="bob") + bpy.types.Scene.DLLevelOption = bpy.props.EnumProperty( + items=enumLevelNames, name="Level", default="bob" + ) + + bpy.types.Scene.texrect = bpy.props.PointerProperty(type=TextureProperty) + bpy.types.Scene.texrectImageTexture = bpy.props.PointerProperty( + type=bpy.types.ImageTexture + ) + bpy.types.Scene.TexRectExportPath = bpy.props.StringProperty( + name="Export Path", subtype="FILE_PATH" + ) + bpy.types.Scene.TexRectTexDir = bpy.props.StringProperty( + name="Include Path", default="textures/segment2" + ) + bpy.types.Scene.TexRectName = bpy.props.StringProperty( + name="Name", default="render_hud_image" + ) + bpy.types.Scene.TexRectCustomExport = bpy.props.BoolProperty( + name="Custom Export Path" + ) + bpy.types.Scene.TexRectExportType = bpy.props.EnumProperty( + name="Export Type", items=enumHUDExportLocation + ) + def sm64_dl_writer_unregister(): - for cls in reversed(sm64_dl_writer_classes): - unregister_class(cls) - - del bpy.types.Scene.levelDLExport - del bpy.types.Scene.DLExportStart - del bpy.types.Scene.DLExportEnd - del bpy.types.Scene.DLExportGeoPtr - del bpy.types.Scene.overwriteGeoPtr - del bpy.types.Scene.DLExportPath - del bpy.types.Scene.DLExportisStatic - del bpy.types.Scene.DLDefinePath - del bpy.types.Scene.DLUseBank0 - del bpy.types.Scene.DLRAMAddr - del bpy.types.Scene.DLTexDir - del bpy.types.Scene.DLSeparateTextureDef - del bpy.types.Scene.DLincludeChildren - del bpy.types.Scene.DLInsertableBinaryPath - del bpy.types.Scene.DLName - del bpy.types.Scene.DLCustomExport - del bpy.types.Scene.DLExportHeaderType - del bpy.types.Scene.DLGroupName - del bpy.types.Scene.DLLevelName - del bpy.types.Scene.DLLevelOption - - del bpy.types.Scene.texrect - del bpy.types.Scene.TexRectExportPath - del bpy.types.Scene.TexRectTexDir - del bpy.types.Scene.TexRectName - del bpy.types.Scene.texrectImageTexture - del bpy.types.Scene.TexRectCustomExport - del bpy.types.Scene.TexRectExportType + for cls in reversed(sm64_dl_writer_classes): + unregister_class(cls) + + del bpy.types.Scene.levelDLExport + del bpy.types.Scene.DLExportStart + del bpy.types.Scene.DLExportEnd + del bpy.types.Scene.DLExportGeoPtr + del bpy.types.Scene.overwriteGeoPtr + del bpy.types.Scene.DLExportPath + del bpy.types.Scene.DLExportisStatic + del bpy.types.Scene.DLDefinePath + del bpy.types.Scene.DLUseBank0 + del bpy.types.Scene.DLRAMAddr + del bpy.types.Scene.DLTexDir + del bpy.types.Scene.DLSeparateTextureDef + del bpy.types.Scene.DLincludeChildren + del bpy.types.Scene.DLInsertableBinaryPath + del bpy.types.Scene.DLName + del bpy.types.Scene.DLCustomExport + del bpy.types.Scene.DLExportHeaderType + del bpy.types.Scene.DLGroupName + del bpy.types.Scene.DLLevelName + del bpy.types.Scene.DLLevelOption + + del bpy.types.Scene.texrect + del bpy.types.Scene.TexRectExportPath + del bpy.types.Scene.TexRectTexDir + del bpy.types.Scene.TexRectName + del bpy.types.Scene.texrectImageTexture + del bpy.types.Scene.TexRectCustomExport + del bpy.types.Scene.TexRectExportType diff --git a/fast64_internal/sm64/sm64_function_map.py b/fast64_internal/sm64/sm64_function_map.py index 39e98b3b4..b6dba3a98 100644 --- a/fast64_internal/sm64/sm64_function_map.py +++ b/fast64_internal/sm64/sm64_function_map.py @@ -1,51591 +1,51585 @@ # use parse_function_map.py for different refreshes. func_map = { - "Refresh 3" : { - "80000300" : "osTvType", - "80000308" : "osRomBase", - "8000030c" : "osResetType", - "80000318" : "osMemSize", - "8000031c" : "osAppNmiBuffer", - "80000400" : "gZBuffer", - "80000000" : "D_80000000", - "a4000000" : "D_A4000000", - "a40004c0" : "D_A40004C0", - "a4000774" : "D_A4000774", - "a4001000" : "D_A4001000", - "a4040010" : "D_A4040010", - "a4080000" : "D_A4080000", - "a4300000" : "D_A4300000", - "a4300004" : "D_A4300004", - "a4300008" : "D_A4300008", - "a430000c" : "D_A430000C", - "a4400010" : "D_A4400010", - "a450000c" : "D_A450000C", - "a4600000" : "D_A4600000", - "a4600004" : "D_A4600004", - "a460000c" : "D_A460000C", - "a4600010" : "D_A4600010", - "a4700000" : "D_A4700000", - "a4700010" : "D_A4700010", - "a4800018" : "D_A4800018", - "b0000008" : "D_B0000008", - "b0000010" : "D_B0000010", - "b0000014" : "D_B0000014", - "c0000000" : "D_C0000000", - "c0000008" : "D_C0000008", - "c000000c" : "D_C000000C", - "802ef700" : "__osGetCurrFaultedThread", - "00000000" : "__romPos", - "04000000" : "_bootSegmentStart", - "007cc6c0" : "_bootSegmentRomStart", - "04001000" : "_bootSegmentEnd", - "007cd6c0" : "_bootSegmentRomEnd", - "80246000" : "_mainSegmentStart", - "007cc6c0" : "_mainSegmentRomStart", - "80246000" : "EntryPoint", - "80246050" : "handle_debug_key_sequences", - "80246170" : "Unknown80246170", - "802461cc" : "Dummy802461CC", - "802461dc" : "Dummy802461DC", - "802461ec" : "Dummy802461EC", - "802461fc" : "setup_mesg_queues", - "802462e0" : "AllocPool", - "80246338" : "create_thread", - "8024639c" : "handle_nmi_request", - "802463ec" : "receive_new_tasks", - "8024651c" : "start_sptask", - "8024659c" : "interrupt_gfx_sptask", - "802465ec" : "start_gfx_sptask", - "80246648" : "pretend_audio_sptask_done", - "8024669c" : "handle_vblank", - "802467fc" : "handle_sp_complete", - "8024694c" : "handle_dp_complete", - "802469b8" : "thread3_main", - "80246b14" : "set_vblank_handler", - "80246b74" : "SendMessage", - "80246bb4" : "dispatch_audio_sptask", - "80246c10" : "send_display_list", - "80246c9c" : "turn_on_audio", - "80246cb8" : "turn_off_audio", - "80246cf0" : "thread1_idle", - "80246df8" : "Main", - "80246e70" : "my_rdp_init", - "802471a4" : "my_rsp_init", - "80247284" : "clear_z_buffer", - "802473c8" : "display_frame_buffer", - "802474b8" : "clear_frame_buffer", - "80247620" : "clear_viewport", - "8024784c" : "draw_screen_borders", - "802479bc" : "make_viewport_clip_rect", - "80247b3c" : "create_task_structure", - "80247ccc" : "init_render_image", - "80247d14" : "end_master_display_list", - "80247db4" : "func_80247D84", - "80247f08" : "func_80247ED8", - "80247fdc" : "func_80247FAC", - "80248090" : "display_and_vsync", - "80248304" : "adjust_analog_stick", - "80248498" : "run_demo_inputs", - "80248638" : "read_controller_inputs", - "80248824" : "init_controllers", - "80248964" : "setup_game_memory", - "80248af0" : "thread5_game_loop", - "80248c40" : "func_80248C10", - "80248c58" : "func_80248C28", - "80248ce8" : "func_80248CB8", - "80248d78" : "func_80248D48", - "80248dc0" : "func_80248D90", - "80248e08" : "set_sound_mode", - "80248e54" : "play_menu_sounds", - "80248fec" : "play_painting_eject_sound", - "80249070" : "play_infinite_stairs_music", - "80249178" : "set_background_music", - "8024922c" : "func_802491FC", - "8024927c" : "func_8024924C", - "802492d0" : "play_cutscene_music", - "80249310" : "play_shell_music", - "8024934c" : "stop_shell_music", - "80249398" : "play_cap_music", - "80249404" : "fadeout_cap_music", - "80249448" : "stop_cap_music", - "802494d8" : "audio_game_loop_tick", - "80249500" : "thread4_sound", - "802495e0" : "level_control_timer", - "802496b8" : "pressed_paused", - "80249764" : "set_play_mode", - "8024978c" : "func_8024975C", - "802497b8" : "func_80249788", - "8024982c" : "nop_802497FC", - "8024983c" : "func_8024980C", - "8024995c" : "func_8024992C", - "80249a10" : "set_mario_initial_cap_powerup", - "80249ab4" : "set_mario_initial_action", - "80249cd8" : "init_mario_after_warp", - "8024a124" : "func_8024A02C", - "8024a18c" : "func_8024A094", - "8024a1d8" : "func_8024A0E0", - "8024a374" : "check_instant_warp", - "8024a584" : "func_8024A48C", - "8024a700" : "initiate_warp", - "8024a7b4" : "get_painting_warp_node", - "8024a85c" : "initiate_painting_warp", - "8024a9cc" : "level_trigger_warp", - "8024aedc" : "initiate_delayed_warp", - "8024b13c" : "update_hud_values", - "8024b390" : "basic_update", - "8024b3e4" : "play_mode_normal", - "8024b5d4" : "play_mode_paused", - "8024b6cc" : "play_mode_frame_advance", - "8024b798" : "level_set_transition", - "8024b7c0" : "play_mode_change_area", - "8024b880" : "play_mode_change_level", - "8024b9b8" : "update_level", - "8024ba8c" : "init_level", - "8024bcd8" : "lvl_init_or_update", - "8024bd5c" : "lvl_init_from_save_file", - "8024be14" : "lvl_set_current_level", - "8024bfa0" : "lvl_play_the_end_screen_sound", - "8024bff0" : "get_mario_cap_flag", - "8024c0b8" : "object_facing_mario", - "8024c16c" : "mario_angle_to_object", - "8024c1d8" : "determine_interaction", - "8024c51c" : "attack_object", - "8024c618" : "mario_stop_riding_object", - "8024c66c" : "mario_grab_used_object", - "8024c6c0" : "mario_drop_held_object", - "8024c780" : "mario_throw_held_object", - "8024c894" : "mario_stop_riding_and_holding", - "8024c8fc" : "does_mario_have_hat", - "8024c928" : "mario_blow_off_cap", - "8024ca68" : "mario_lose_cap_to_enemy", - "8024caf8" : "mario_retrieve_cap", - "8024cb58" : "able_to_grab_object", - "8024cbfc" : "mario_get_collided_object", - "8024cc7c" : "mario_check_object_grab", - "8024ce08" : "bully_knock_back_mario", - "8024d0b4" : "bounce_off_object", - "8024d130" : "hit_object_from_below", - "8024d2bc" : "determine_knockback_action", - "8024d578" : "push_mario_out_of_object", - "8024d72c" : "bounce_back_from_attack", - "8024d804" : "func_8024D664", - "8024d8b0" : "take_damage_from_interact_object", - "8024d998" : "take_damage_and_knock_back", - "8024daac" : "reset_mario_pitch", - "8024db2c" : "interact_coin", - "8024dbf0" : "interact_water_ring", - "8024dc28" : "interact_star_or_key", - "8024de4c" : "interact_bbh_entrance", - "8024df10" : "interact_warp", - "8024e0c4" : "interact_warp_door", - "8024e2fc" : "get_door_save_file_flag", - "8024e420" : "interact_door", - "8024e6ec" : "interact_cannon_base", - "8024e778" : "interact_igloo_barrier", - "8024e7d4" : "interact_tornado", - "8024e8f0" : "interact_whirlpool", - "8024e9d0" : "interact_wind", - "8024ead8" : "interact_flame", - "8024ec54" : "interact_snufit_bullet", - "8024ed84" : "interact_clam_or_bubba", - "8024ee44" : "interact_bully", - "8024eff8" : "interact_shock", - "8024f170" : "interact_mr_blizzard", - "8024f1e0" : "interact_hit_from_below", - "8024f354" : "interact_bounce_top", - "8024f4ac" : "interact_unknown_08", - "8024f55c" : "interact_damage", - "8024f5cc" : "interact_breakable", - "8024f6a4" : "interact_koopa_shell", - "8024f7a8" : "check_object_grab_mario", - "8024f8bc" : "interact_pole", - "8024fa60" : "interact_hoot", - "8024fb30" : "interact_cap", - "8024fd2c" : "interact_grabbable", - "8024fe6c" : "func_8024FC94", - "8024ff04" : "func_8024FD2C", - "80250098" : "func_8024FEC0", - "80250198" : "interact_text", - "80250230" : "check_kick_or_punch_wall", - "802503f0" : "mario_process_interactions", - "802505c8" : "check_death_barrier", - "8025065c" : "check_lava_boost", - "80250724" : "pss_begin_slide", - "80250778" : "pss_end_slide", - "802507fc" : "mario_handle_special_floors", - "80250940" : "is_anim_at_end", - "8025097c" : "is_anim_past_end", - "802509b8" : "set_mario_animation", - "80250b04" : "set_mario_anim_with_accel", - "80250c7c" : "set_anim_to_frame", - "80250d38" : "is_anim_past_frame", - "80250e54" : "find_mario_anim_flags_and_translation", - "80251020" : "update_mario_pos_for_anim", - "802510dc" : "return_mario_anim_y_translation", - "80251120" : "play_sound_if_no_flag", - "8025118c" : "play_mario_jump_sound", - "80251274" : "adjust_sound_for_speed", - "80251310" : "play_sound_and_spawn_particles", - "80251444" : "play_mario_action_sound", - "802514ac" : "play_mario_landing_sound", - "80251510" : "play_mario_landing_sound_once", - "80251574" : "play_mario_heavy_landing_sound", - "802515d8" : "play_mario_heavy_landing_sound_once", - "8025163c" : "play_mario_sound", - "80251708" : "mario_set_forward_vel", - "8025177c" : "mario_get_floor_class", - "802518a8" : "mario_get_terrain_sound_addend", - "80251a48" : "resolve_and_return_wall_collisions", - "80251afc" : "vec3f_find_ceil", - "80251b54" : "mario_facing_downhill", - "80251bd4" : "mario_floor_is_slippery", - "80251cfc" : "mario_floor_is_slope", - "80251e24" : "mario_floor_is_steep", - "80251f24" : "find_floor_height_relative_polar", - "80252000" : "find_floor_slope", - "802521a0" : "update_mario_sound_and_camera", - "8025229c" : "set_steep_jump_action", - "80252cf4" : "set_mario_action", - "80252e5c" : "set_jump_from_landing", - "802530a0" : "set_jumping_action", - "80253178" : "drop_and_set_mario_action", - "802531c4" : "hurt_and_set_mario_action", - "80253218" : "check_common_action_exits", - "80253300" : "check_common_hold_action_exits", - "802533e4" : "transition_submerged_to_walking", - "80253488" : "set_water_plunge_action", - "80253588" : "squish_mario_model", - "80253720" : "debug_print_speed_action_normal", - "80253838" : "update_mario_button_inputs", - "8025395c" : "update_mario_joystick_inputs", - "80253a60" : "update_mario_geometry_inputs", - "80253d58" : "update_mario_inputs", - "80253ec0" : "set_submerged_cam_preset_and_spawn_bubbles", - "80254060" : "update_mario_health", - "802542b4" : "update_mario_info_for_cam", - "80254338" : "mario_reset_bodystate", - "80254390" : "sink_mario_in_quicksand", - "802543e8" : "update_and_return_cap_flags", - "80254588" : "mario_update_hitbox_and_cap_model", - "80254830" : "execute_mario_action", - "80254b20" : "init_mario", - "80254f44" : "init_mario_from_save_file", - "80255080" : "get_additive_y_vel_for_jumps", - "8025509c" : "nop_80254E3C", - "802550b0" : "nop_80254E50", - "802550c0" : "transfer_bully_speed", - "80255238" : "init_bully_collision_data", - "802552fc" : "mario_bonk_reflection", - "80255414" : "mario_update_quicksand", - "80255654" : "mario_push_off_steep_floor", - "8025570c" : "mario_update_moving_sand", - "8025580c" : "mario_update_windy_ground", - "802559b0" : "stop_and_set_height_to_floor", - "80255a34" : "stationary_ground_step", - "80255d88" : "perform_ground_step", - "80255ec4" : "check_ledge_grab", - "802560ac" : "perform_air_quarter_step", - "802564e0" : "apply_twirl_gravity", - "80256584" : "should_strengthen_gravity_for_jump_ascent", - "8025661c" : "apply_gravity", - "802569f8" : "apply_vertical_wind", - "80256b24" : "perform_air_step", - "80256cd8" : "set_vel_from_pitch_and_yaw", - "80256d8c" : "set_vel_from_yaw", - "80256e00" : "get_credits_str_width", - "80256e88" : "print_displaying_credits_entry", - "80257060" : "BehEndPeachLoop", - "802570dc" : "BehEndToadLoop", - "80257198" : "geo_switch_peach_eyes", - "802572b0" : "get_star_collection_dialog", - "8025733c" : "handle_save_menu", - "80257450" : "spawn_obj_at_mario_rel_yaw", - "802574e8" : "cutscene_take_cap_off", - "80257548" : "cutscene_put_cap_on", - "802575a8" : "mario_ready_to_speak", - "80257640" : "set_mario_npc_dialog", - "80257748" : "act_reading_npc_dialog", - "80257980" : "act_waiting_for_dialog", - "80257a0c" : "act_disappeared", - "80257ab0" : "act_reading_automatic_dialog", - "80257ce4" : "act_reading_sign", - "80257eac" : "act_debug_free_move", - "80258184" : "general_star_dance_handler", - "80258420" : "act_star_dance", - "802584dc" : "act_star_dance_water", - "802585c0" : "act_fall_after_star_grab", - "802586cc" : "common_death_handler", - "80258744" : "act_standing_death", - "802587ec" : "act_electrocution", - "8025883c" : "act_suffocation", - "8025888c" : "act_death_on_back", - "802588f8" : "act_death_on_stomach", - "80258964" : "act_quicksand_death", - "80258a7c" : "act_eaten_by_bubba", - "80258b24" : "launch_mario_until_land", - "80258ba8" : "act_unlocking_key_door", - "80258dac" : "act_unlocking_star_door", - "80258f94" : "act_entering_star_door", - "80259264" : "act_going_through_door", - "802593cc" : "act_warp_door_spawn", - "802594d4" : "act_emerge_from_pipe", - "80259608" : "act_spawn_spin_airborne", - "80259740" : "act_spawn_spin_landing", - "802597ac" : "act_exit_airborne", - "80259854" : "act_falling_exit_airborne", - "802598d0" : "act_exit_land_save_dialog", - "80259c30" : "act_death_exit", - "80259ce8" : "act_unused_death_exit", - "80259d74" : "act_falling_death_exit", - "80259e00" : "act_special_exit_airborne", - "80259ef8" : "act_special_death_exit", - "80259fcc" : "act_spawn_no_spin_airborne", - "8025a040" : "act_spawn_no_spin_landing", - "8025a0bc" : "act_bbh_enter_spin", - "8025a494" : "act_bbh_enter_jump", - "8025a610" : "act_teleport_fade_out", - "8025a6fc" : "act_teleport_fade_in", - "8025a858" : "act_shocked", - "8025a9ac" : "act_squished", - "8025ae0c" : "act_putting_on_cap", - "8025aea8" : "stuck_in_ground_handler", - "8025affc" : "act_head_stuck_in_ground", - "8025b050" : "act_butt_stuck_in_ground", - "8025b0a4" : "act_feet_stuck_in_ground", - "8025d798" : "mario_execute_cutscene_action", - "8025dd70" : "add_tree_leaf_particles", - "8025de1c" : "play_climbing_sounds", - "8025df04" : "set_pole_position", - "8025e21c" : "act_holding_pole", - "8025e5a8" : "act_climbing_pole", - "8025e7a4" : "act_grab_pole_slow", - "8025e830" : "act_grab_pole_fast", - "8025e930" : "act_top_of_pole_transition", - "8025ea30" : "act_top_of_pole", - "8025eb50" : "perform_hanging_step", - "8025ecfc" : "update_hang_moving", - "8025eed0" : "update_hang_stationary", - "8025ef58" : "act_start_hanging", - "8025f0b4" : "act_hanging", - "8025f1e4" : "act_hang_moving", - "8025f384" : "let_go_of_ledge", - "8025f4b4" : "func_8025F0DC", - "8025f560" : "func_8025F188", - "8025f644" : "update_ledge_climb", - "8025f6c0" : "act_ledge_grab", - "8025f970" : "act_ledge_climb_slow", - "8025fa64" : "act_ledge_climb_down", - "8025fae8" : "act_ledge_climb_fast", - "8025fb90" : "act_grabbed", - "8025fc6c" : "act_in_cannon", - "80260154" : "act_tornado_twirling", - "80260568" : "check_common_automatic_cancels", - "802605d0" : "mario_execute_automatic_action", - "802608b0" : "func_802604E0", - "80260aac" : "func_802606DC", - "80260cb4" : "act_idle", - "80260f94" : "func_80260BC4", - "80261000" : "act_start_sleeping", - "80261268" : "act_sleeping", - "802614fc" : "act_waking_up", - "8026168c" : "act_shivering", - "802618d8" : "act_coughing", - "802619d0" : "func_802615C4", - "80261ad0" : "func_802616C4", - "80261bf8" : "act_standing_against_wall", - "80261cec" : "act_in_quicksand", - "80261db4" : "act_crouching", - "80261f70" : "act_panting", - "80262080" : "func_80261C74", - "8026217c" : "func_80261D70", - "802621dc" : "act_braking_stop", - "802622dc" : "act_butt_slide_stop", - "80262398" : "func_80261F8C", - "80262490" : "act_slide_kick_slide_stop", - "80262530" : "act_start_crouching", - "80262650" : "act_stop_crouching", - "80262770" : "act_start_crawling", - "80262890" : "act_stop_crawling", - "80262980" : "func_80262574", - "80262bc4" : "func_802627B8", - "80262c34" : "func_80262828", - "80262d68" : "act_jump_land_stop", - "80262dc4" : "act_double_jump_land_stop", - "80262e20" : "act_side_flip_land_stop", - "80262e94" : "act_freefall_land_stop", - "80262ef0" : "act_triple_jump_land_stop", - "80262f50" : "act_backflip_land_stop", - "80262fec" : "act_lava_boost_land", - "8026305c" : "act_long_jump_land_stop", - "802630f8" : "func_80262CEC", - "802631f0" : "func_80262DE4", - "802632e8" : "act_air_throw_land", - "802633b4" : "act_twirl_land", - "8026350c" : "act_ground_pound_land", - "802635e8" : "act_first_person", - "80263784" : "func_80263378", - "80263898" : "mario_execute_stationary_action", - "80263e60" : "func_80263A50", - "80263ee4" : "func_80263AD4", - "80264024" : "func_80263C14", - "8026409c" : "begin_walking_action", - "802640fc" : "check_ledge_climb_down", - "802642b4" : "slide_bonk", - "80264340" : "set_triple_jump_action", - "8026440c" : "update_sliding_angle", - "80264740" : "update_sliding", - "80264b54" : "apply_slope_accel", - "80264d80" : "apply_landing_accel", - "80264e18" : "update_shell_speed", - "80265080" : "apply_slope_decel", - "802651b0" : "update_decelerating_speed", - "80265244" : "update_walking_speed", - "80265458" : "should_begin_sliding", - "80265514" : "analog_stick_held_back", - "80265558" : "check_ground_dive_or_punch", - "80265620" : "begin_braking_action", - "80265700" : "func_802652F0", - "80265b1c" : "func_8026570C", - "80265d90" : "func_80265980", - "80265df8" : "func_802659E8", - "80266038" : "func_80265C28", - "802661cc" : "func_80265DBC", - "80266354" : "act_walking", - "802665b4" : "act_move_punching", - "80266734" : "act_hold_walking", - "8026699c" : "act_hold_heavy_walking", - "80266af8" : "act_turning_around", - "80266d4c" : "act_finish_turning_around", - "80266e48" : "act_braking", - "80266fc8" : "act_decelerating", - "80267240" : "act_hold_decelerating", - "80267504" : "act_riding_shell_ground", - "80267728" : "act_crawling", - "8026795c" : "act_burning_ground", - "80267c24" : "func_80267814", - "80267ce4" : "common_slide_action", - "80267fa4" : "common_slide_action_with_jump", - "80268074" : "act_butt_slide", - "802680d4" : "act_hold_butt_slide", - "80268168" : "act_crouch_slide", - "80268338" : "act_slide_kick_slide", - "802684ac" : "stomach_slide_action", - "802685c0" : "act_stomach_slide", - "80268608" : "act_hold_stomach_slide", - "80268684" : "act_dive_slide", - "802687b8" : "common_ground_knockback_action", - "802689f8" : "act_hard_backward_ground_kb", - "80268adc" : "act_hard_forward_ground_kb", - "80268b64" : "act_backward_ground_kb", - "80268bb0" : "act_forward_ground_kb", - "80268bfc" : "act_soft_backward_ground_kb", - "80268c48" : "act_soft_forward_ground_kb", - "80268c94" : "act_ground_bonk", - "80268d04" : "act_death_exit_land", - "80268dcc" : "common_landing_action", - "80268f78" : "common_landing_cancels", - "80269108" : "act_jump_land", - "80269170" : "act_freefall_land", - "802691d8" : "act_side_flip_land", - "80269264" : "act_hold_jump_land", - "80269300" : "act_hold_freefall_land", - "8026939c" : "act_long_jump_land", - "8026947c" : "act_double_jump_land", - "802694e4" : "act_triple_jump_land", - "80269588" : "act_backflip_land", - "80269640" : "quicksand_jump_land_action", - "80269788" : "act_quicksand_jump_land", - "802697dc" : "act_hold_quicksand_jump_land", - "80269830" : "check_common_moving_cancels", - "80269954" : "mario_execute_moving_action", - "80269f40" : "play_flip_sounds", - "80269fc0" : "play_far_fall_sound", - "8026a090" : "func_u_8026A090", - "8026a12c" : "lava_boost_on_wall", - "8026a224" : "check_fall_damage", - "8026a400" : "check_kick_or_dive_in_air", - "8026a494" : "should_get_stuck_in_ground", - "8026a598" : "check_fall_damage_or_get_stuck", - "8026a62c" : "check_horizontal_wind", - "8026a818" : "update_air_with_turn", - "8026aa48" : "update_air_without_turn", - "8026acd8" : "update_lava_boost_or_twirling", - "8026ae5c" : "update_flying_yaw", - "8026b004" : "update_flying_pitch", - "8026b17c" : "update_flying", - "8026b444" : "common_air_action_step", - "8026b6a0" : "act_jump", - "8026b740" : "act_double_jump", - "8026b814" : "act_triple_jump", - "8026b90c" : "act_backflip", - "8026b9ac" : "act_freefall", - "8026bab8" : "act_hold_jump", - "8026bbb4" : "act_hold_freefall", - "8026bcc0" : "act_side_flip", - "8026bdcc" : "act_wall_kick_air", - "8026be78" : "act_long_jump", - "8026bf40" : "act_riding_shell_air", - "8026c034" : "act_twirling", - "8026c1e0" : "act_dive", - "8026c4b8" : "act_air_throw", - "8026c5d0" : "act_water_jump", - "8026c738" : "act_hold_water_jump", - "8026c880" : "act_steep_jump", - "8026c9fc" : "act_ground_pound", - "8026cd0c" : "act_burning_jump", - "8026ce50" : "act_burning_fall", - "8026cf28" : "act_crazy_box_bounce", - "8026d1b0" : "common_air_knockback_step", - "8026d33c" : "func_8026CDFC", - "8026d3c8" : "act_backward_air_kb", - "8026d43c" : "act_forward_air_kb", - "8026d4b0" : "act_hard_backward_air_kb", - "8026d508" : "act_hard_forward_air_kb", - "8026d560" : "act_thrown_backward", - "8026d608" : "act_thrown_forward", - "8026d6fc" : "act_soft_bonk", - "8026d770" : "act_getting_blown", - "8026d988" : "act_air_hit_wall", - "8026db54" : "act_forward_rollout", - "8026dcf4" : "act_backward_rollout", - "8026de98" : "act_butt_slide_air", - "8026e088" : "act_hold_butt_slide_air", - "8026e2b4" : "act_lava_boost", - "8026e59c" : "act_slide_kick", - "8026e810" : "act_jump_kick", - "8026e968" : "act_shot_from_cannon", - "8026ec00" : "act_flying", - "8026f158" : "act_riding_hoot", - "8026f2ec" : "act_flying_triple_jump", - "8026f614" : "act_top_of_pole_jump", - "8026f660" : "act_vertical_wind", - "8026f840" : "act_special_triple_jump", - "8026fa18" : "check_common_airborne_cancels", - "8026fb04" : "mario_execute_airborne_action", - "8027499c" : "mario_execute_submerged_action", - "80274eb0" : "animated_stationary_ground_step", - "80274f10" : "mario_update_punch_sequence", - "80275328" : "act_punching", - "8027546c" : "act_picking_up", - "802755fc" : "act_dive_picking_up", - "802756c8" : "act_placing_down", - "80275794" : "act_throwing", - "802758c0" : "act_heavy_throw", - "802759b4" : "act_stomach_slide_stop", - "80275a80" : "act_picking_up_bowser", - "80275b34" : "act_holding_bowser", - "80275e78" : "act_releasing_bowser", - "80275f0c" : "check_common_object_cancels", - "80275fe0" : "mario_execute_object_action", - "802761d0" : "geo_enfvx_main", - "802763d4" : "geo_skybox_main", - "802764b0" : "Geo18_802764B0", - "8027684c" : "bhvToadMessage_loop", - "80276910" : "bhvToadMessage_init", - "80276bb8" : "bhvUnlockDoorStar_init", - "80276ccc" : "bhvUnlockDoorStar_loop", - "802770a4" : "Geo18_802770A4", - "80277150" : "geo_switch_mario_stand_run", - "802771bc" : "geo_switch_mario_eyes", - "80277294" : "Geo18_80277294", - "802773a4" : "Geo18_802773A4", - "802774f4" : "geo_switch_mario_hand", - "802775cc" : "Geo18_802775CC", - "802776d8" : "geo_switch_mario_cap_effect", - "80277740" : "geo_switch_mario_cap_on_off", - "80277824" : "Geo18_80277824", - "8027795c" : "geo_switch_mario_hand_grab_pos", - "80277b14" : "geo_render_mirror_mario", - "80277d6c" : "geo_mirror_mario_backface_culling", - "80277ee0" : "set_segment_base_addr", - "80277f20" : "get_segment_base_addr", - "80277f50" : "segmented_to_virtual", - "80277fa8" : "virtual_to_segmented", - "80277ff0" : "move_segment_table_to_dmem", - "80278074" : "main_pool_init", - "80278120" : "main_pool_alloc", - "80278238" : "main_pool_free", - "80278358" : "main_pool_realloc", - "802783c8" : "main_pool_available", - "802783e8" : "main_pool_push_state", - "80278498" : "main_pool_pop_state", - "8027868c" : "load_segment", - "802786f0" : "load_to_fixed_pool_addr", - "802787d8" : "load_segment_decompress", - "802788b4" : "func_80278304", - "80278974" : "load_engine_code_segment", - "80278a14" : "alloc_only_pool_init", - "80278ab8" : "alloc_only_pool_alloc", - "80278b28" : "alloc_only_pool_resize", - "80278b98" : "mem_pool_init", - "80278c58" : "mem_pool_alloc", - "80278d74" : "mem_pool_free", - "80278f2c" : "alloc_display_list", - "80279028" : "func_80278A78", - "80279084" : "func_80278AD4", - "80279840" : "save_file_do_save", - "802798fc" : "save_file_erase", - "80279960" : "save_file_copy", - "802799dc" : "save_file_load_all", - "80279bc8" : "save_file_reload", - "80279c44" : "save_file_collect_star_or_key", - "80279e44" : "save_file_exists", - "80279e80" : "save_file_get_max_coin_score", - "80279f80" : "save_file_get_course_star_count", - "8027a010" : "save_file_get_total_star_count", - "8027a0a8" : "save_file_set_flags", - "8027a0f4" : "save_file_clear_flags", - "8027a16c" : "save_file_get_flags", - "8027a1c8" : "save_file_get_star_flags", - "8027a23c" : "save_file_set_star_flags", - "8027a310" : "save_file_get_course_coin_score", - "8027a340" : "save_file_is_cannon_unlocked", - "8027a390" : "save_file_set_cannon_unlocked", - "8027a418" : "save_file_set_cap_pos", - "8027a4ac" : "save_file_get_cap_pos", - "8027a564" : "save_file_set_sound_mode", - "8027a5b4" : "save_file_get_sound_mode", - "8027a5d4" : "save_file_move_cap_to_default_location", - "8027a698" : "disable_warp_checkpoint", - "8027a6b0" : "check_if_should_set_warp_checkpoint", - "8027a718" : "check_warp_checkpoint", - "8027a7d0" : "func_8027A220", - "8027a83c" : "set_warp_transition_rgb", - "8027a8b0" : "print_intro_text", - "8027a93c" : "get_mario_spawn_type", - "8027a9c8" : "area_get_warp_node", - "8027aa28" : "func_8027A478", - "8027aa74" : "func_8027A4C4", - "8027ab04" : "clear_areas", - "8027ad74" : "func_8027A7C4", - "8027ae44" : "load_area", - "8027af48" : "func_8027A998", - "8027afbc" : "load_mario_area", - "8027b038" : "func_8027AA88", - "8027b0c0" : "change_area", - "8027b164" : "area_update_objects", - "8027b1a0" : "play_transition", - "8027b35c" : "play_transition_after_delay", - "8027b3b4" : "render_game", - "8027cf38" : "geo_set_animation_globals", - "8027da84" : "geo_process_held_object", - "8027de68" : "geo_try_process_children", - "8027dea8" : "geo_process_node_and_siblings", - "8027e130" : "geo_process_root", - "8027e3e0" : "profiler_log_thread5_time", - "8027e490" : "profiler_log_thread4_time", - "8027e520" : "profiler_log_gfx_time", - "8027e5cc" : "profiler_log_vblank_time", - "8027e65c" : "draw_profiler_bar", - "8027e958" : "draw_reference_profiler_bars", - "8027ebcc" : "draw_profiler_mode_1", - "8027eeac" : "draw_profiler_mode_0", - "8027f460" : "draw_profiler", - "8027f4e0" : "decompress", - "8027f590" : "set_camera_shake", - "8027f8b8" : "set_camera_shake_2", - "8027f9f0" : "func_8027F440", - "8027fb74" : "unused_set_camera_shake", - "8027fc18" : "return_height_above_floor", - "8027fe20" : "set_cam_focus_and_pos_rel_mario", - "8027fff8" : "set_camera_height", - "80280368" : "return_pitch_parallel_floor", - "802804f4" : "func_8027FF44", - "802806a4" : "find_in_bounds_yaw_wdw_bob_thi", - "80280810" : "return_open_camera_yaw", - "80280970" : "return_platform_camera_yaw", - "80280b00" : "func_80280550", - "80281188" : "func_80280BD8", - "802813bc" : "func_80280E0C", - "802813ec" : "func_80280E3C", - "8028146c" : "update_open_camera", - "80281588" : "update_platform_level_camera", - "802816a0" : "return_reverse_tower_camera_yaw", - "802817fc" : "update_reverse_tower_camera", - "80281904" : "return_parallel_tracking_camera_yaw", - "80282280" : "return_fixed_camera_yaw", - "802826a0" : "return_boss_fight_camera_yaw", - "80282c0c" : "unused_return_mode_5_camera_yaw", - "80282c28" : "unused_80282678", - "80282c3c" : "update_boss_fight_camera", - "80282c7c" : "update_parallel_tracking_camera", - "80282ce0" : "update_fixed_camera", - "80282d78" : "return_behind_mario_camera_yaw", - "80283340" : "return_behind_mario_water_camera_yaw", - "80283578" : "return_slide_camera_yaw", - "802839e4" : "update_behind_mario_camera", - "80283a18" : "nop_return_water_camera_yaw", - "80283a34" : "update_water_surface_camera", - "80283a68" : "return_mario_yaw", - "80283af8" : "return_close_or_free_roam_cam_yaw", - "80284cb8" : "update_close_or_free_roam_camera", - "80284cfc" : "camera_lakitu_zoom_distance", - "80284d38" : "camera_mario_zoom_distance", - "80284d74" : "return_spiral_stairs_camera_yaw", - "802850ac" : "update_spiral_stairs_camera", - "802850ec" : "return_slide_or_0f_camera_yaw", - "802851dc" : "update_slide_camera", - "8028526c" : "func_80284CBC", - "802852f4" : "func_80284D44", - "80285370" : "exit_c_up_mode", - "80285808" : "return_first_person_camera_yaw", - "802858a4" : "operate_c_up_looking", - "80285a2c" : "func_8028547C", - "80285d20" : "update_c_up_camera", - "80285ed8" : "return_cannon_camera_yaw", - "80285f60" : "update_cannon_camera", - "8028603c" : "init_transitional_movement", - "80286088" : "set_camera_preset", - "80286188" : "func_80285BD8", - "80286420" : "func_80285E70", - "802868f8" : "update_camera", - "80286f68" : "reset_camera", - "8028724c" : "init_camera", - "802879ec" : "func_80287404", - "80287bc4" : "select_mario_cam_mode", - "80287be0" : "func_802875F8", - "80287cb8" : "func_802876D0", - "80287d30" : "geo_camera_preset_and_pos", - "80287dc0" : "dummy_802877D8", - "80287dd4" : "dummy_802877EC", - "80287de8" : "vec3f_sub", - "80287e28" : "object_pos_to_vec3f", - "80287e50" : "vec3f_to_object_pos", - "80287e78" : "unused_object_angle_to_vec3s", - "80287ea0" : "evaluate_cubic_spline", - "802882e4" : "move_point_along_spline", - "80288624" : "select_or_activate_mario_cam", - "80288718" : "test_or_set_mario_cam_active", - "80288888" : "set_spline_values", - "802889b0" : "set_face_angle_from_spline", - "80288ce4" : "find_c_buttons_pressed", - "80288e68" : "update_camera_status", - "80288f5c" : "find_and_return_count_wall_collisions", - "80289198" : "vec3f_compare", - "80289214" : "clamp_pitch", - "802892d8" : "is_within_100_units_of_mario", - "8028935c" : "set_or_approach_f32_exponential", - "802893f4" : "approach_f32_exponential_bool", - "80289488" : "approach_f32_exponential", - "802894b4" : "approach_s16_exponential_bool", - "8028956c" : "approach_s16_exponential", - "80289610" : "approach_vec3f_exponential", - "80289684" : "set_or_approach_vec3f_exponential", - "802896f8" : "approach_vec3s_exponential", - "8028976c" : "camera_approach_s16_symmetric_bool", - "8028984c" : "camera_approach_s16_symmetric", - "8028993c" : "set_or_approach_s16_symmetric", - "802899cc" : "camera_approach_f32_symmetric_bool", - "80289b0c" : "camera_approach_f32_symmetric", - "80289c00" : "random_vec3s", - "80289d20" : "func_80289738", - "80289f88" : "clamp_positions_and_find_yaw_angle", - "8028a080" : "func_80289A98", - "8028a0f4" : "is_pos_less_than_bounds", - "8028a4ec" : "is_behind_surface", - "8028a6bc" : "func_8028A0D4", - "8028a7ec" : "is_mario_behind_surface", - "8028a834" : "scale_along_line", - "8028a8e8" : "check_if_vector_fits_in_bounds", - "8028aa28" : "calculate_verticle_angle", - "8028aad8" : "calculate_yaw", - "8028ab60" : "calculate_angles", - "8028ac28" : "calc_abs_dist", - "8028accc" : "calc_hor_dist", - "8028ad4c" : "rotate_in_xz", - "8028ae1c" : "rotate_in_yz", - "8028aef0" : "set_camera_pitch_shake", - "8028af4c" : "set_camera_yaw_shake", - "8028b00c" : "set_camera_roll_shake", - "8028b068" : "func_8028AA80", - "8028b11c" : "Unknown8028AB34", - "8028b1d0" : "increment_shake_offset", - "8028b218" : "shake_camera_pitch", - "8028b32c" : "shake_camera_yaw", - "8028b438" : "shake_camera_roll", - "8028b50c" : "func_8028AF24", - "8028b724" : "func_8028B13C", - "8028b754" : "func_8028B16C", - "8028b784" : "play_camera_buzz_if_cdown", - "8028b7c4" : "play_camera_buzz_if_cbutton", - "8028b804" : "play_camera_buzz_if_c_sideways", - "8028b850" : "play_sound_cbutton_up", - "8028b884" : "play_sound_cbutton_down", - "8028b8b8" : "play_sound_cbutton_side", - "8028b8ec" : "play_sound_button_change_blocked", - "8028b920" : "play_sound_rbutton_changed", - "8028b954" : "func_8028B36C", - "8028b9c4" : "func_8028B3DC", - "8028bd34" : "stop_mario", - "8028bd98" : "handle_c_button_movement", - "8028c038" : "func_8028BA38", - "8028c13c" : "set_camera_cutscene_table", - "8028c18c" : "determine_star_fadeout_cutscene_table", - "8028c26c" : "return_table_door_push_or_pull", - "8028c2c8" : "return_cutscene_table", - "8028c7a0" : "instant_warp_camera_update", - "8028c8f0" : "approach_camera_height", - "8028c9ac" : "Unknown8028C3AC", - "8028c9cc" : "set_focus_position", - "8028cbf0" : "set_pos_from_face_angle_and_vec3f", - "8028cd94" : "set_pos_from_face_angle_and_rel_coords", - "8028cdec" : "determine_pushing_or_pulling_door", - "8028ce24" : "func_8028C824", - "8028d44c" : "set_camera_preset_fixed_ref_point", - "8028d5ac" : "set_camera_preset_platform_level", - "8028d5fc" : "set_camera_preset_boss_fight", - "8028d658" : "set_camera_preset_close_cam", - "8028d698" : "set_camera_preset_open_camera", - "8028d79c" : "parallel_tracking_init", - "8028d888" : "set_fixed_cam_axis_sa_lobby", - "8028d92c" : "func_8028D32C", - "8028da18" : "CameraRR00", - "8028da50" : "CameraRR04", - "8028daec" : "CameraRR02", - "8028db38" : "CameraRR0305", - "8028dbb4" : "CameraRR01", - "8028dbf4" : "CameraCotMC00", - "8028dc1c" : "CameraSL00", - "8028dc70" : "camera_change_set_free_roam_mode", - "8028dca4" : "move_camera_through_floor_while_descending", - "8028dd48" : "camera_change_hmc_maze_entrance", - "8028de2c" : "CameraHMC02", - "8028de5c" : "CameraHMC03", - "8028de90" : "CameraHMC04", - "8028dec4" : "CameraHMC05", - "8028def8" : "CameraSSL00", - "8028df24" : "CameraSSL0102", - "8028df6c" : "CameraSSL03", - "8028dfb4" : "CameraTHI00", - "8028dfe8" : "CameraTHI01", - "8028e01c" : "CameraRR07", - "8028e064" : "CameraRR08", - "8028e098" : "camera_change_hmc_cotmc_pool_entry", - "8028e0ec" : "CameraInside20", - "8028e164" : "CameraInside1E", - "8028e210" : "CameraInside1F", - "8028e298" : "CameraInside01", - "8028e300" : "CameraInside1213", - "8028e38c" : "CameraInside00", - "8028e3b8" : "CameraInside0E", - "8028e3f0" : "CameraInside0F", - "8028e41c" : "bbh_room_6_camera", - "8028e450" : "CameraBBH24", - "8028e47c" : "CameraBBH2E2F", - "8028e524" : "bbh_room_1_camera", - "8028e55c" : "CameraBBH01", - "8028e594" : "bbh_room_2_lower_camera", - "8028e5cc" : "bbh_room_4_camera", - "8028e604" : "bbh_room_8_camera", - "8028e63c" : "bbh_room_5_library_camera", - "8028e674" : "bbh_room_5_library_to_hidden_transition", - "8028e6c4" : "bbh_room_5_hidden_to_library_transition", - "8028e714" : "bbh_room_5_hidden_camera", - "8028e758" : "bbh_room_3_camera", - "8028e790" : "bbh_room_7_mr_i_camera", - "8028e7c8" : "bbh_room_7_mr_i_to_coffins_transition", - "8028e818" : "bbh_room_7_coffins_to_mr_i_transition", - "8028e868" : "CameraBBH3033", - "8028e8a0" : "CameraBBH34", - "8028e8cc" : "CameraBBH38", - "8028e930" : "bbh_room_12_upper_camera", - "8028e974" : "CameraBBH00", - "8028e9a0" : "bbh_room_2_library_camera", - "8028e9d8" : "bbh_room_2_library_to_trapdoor_transition", - "8028ea28" : "bbh_room_2_trapdoor_camera", - "8028ea60" : "bbh_room_2_trapdoor_transition", - "8028eab0" : "bbh_room_9_attic_camera", - "8028eae8" : "bbh_room_9_attic_transition", - "8028eb38" : "bbh_room_9_mr_i_transition", - "8028eb88" : "bbh_room_13_balcony_camera", - "8028ebc0" : "bbh_room_0_camera", - "8028ec04" : "camera_change_activate_ccm_slide_flag", - "8028ec2c" : "camera_change_deactivate_ccm_slide_flag", - "8028ec58" : "surface_type_presets", - "8028ed30" : "set_preset_via_surface_or_input", - "8028ed98" : "surface_type_presets_thi", - "8028eeb0" : "level_specific_camera_update", - "8028f670" : "resolve_geometry_collisions", - "8028f914" : "func_8028F2F0", - "8028fc9c" : "find_mario_relative_geometry", - "8028fe24" : "func_8028F800", - "8028fe58" : "func_8028F834", - "8028fe84" : "unused_8028F860", - "8028ff04" : "cutscene_object_with_dialog", - "8028ffc8" : "cutscene_object_without_dialog", - "8029000c" : "cutscene_object", - "80290098" : "set_cam_yaw_from_focus_and_pos", - "802900e0" : "func_8028FABC", - "80290104" : "func_8028FAE0", - "80290168" : "cap_switch_save", - "802901a4" : "func_8028FB80", - "802901fc" : "func_8028FBD8", - "802903b8" : "func_8028FD94", - "802904a8" : "CutsceneIntroPeach0_2", - "802904e4" : "CutsceneIntroPeach2_1", - "8029051c" : "func_8028FEDC", - "8029053c" : "move_credits_camera", - "80290784" : "func_80290144", - "802907f4" : "func_802901B4", - "80290864" : "func_80290224", - "802908e8" : "func_802902A8", - "802909d0" : "rotate_camera", - "80290a5c" : "CutsceneEnterSomething8029041C", - "80290abc" : "rotate_and_move_vec3f", - "80290b54" : "func_80290514", - "80290ba4" : "func_80290564", - "80290bd8" : "func_80290598", - "80290c08" : "unused_802905C8", - "80290c1c" : "Cutscene0FTodo0", - "80290c30" : "Cutscene0FTodo1", - "80290c44" : "CutscenePeachEnd0_1", - "80290c9c" : "CutscenePeachEnd0_2", - "80290d90" : "CutscenePeachEnd0", - "80290e00" : "CutscenePeachEnd2", - "80290e74" : "CutscenePeachEndCommon367A", - "80290eb0" : "CutscenePeachEnd3_1", - "80290f1c" : "CutscenePeachEnd3", - "80290f8c" : "CutscenePeachEnd1", - "80291074" : "CutscenePeachEnd4_1", - "80291108" : "CutscenePeachEnd4", - "802911c8" : "CutscenePeachEnd5_1", - "80291208" : "CutscenePeachEnd5_2", - "8029127c" : "CutscenePeachEnd5_3", - "802912b8" : "CutscenePeachEnd5_4", - "80291354" : "CutscenePeachEnd5", - "8029142c" : "CutscenePeachEnd6", - "802914cc" : "CutscenePeachEnd7_1", - "80291514" : "CutscenePeachEnd7", - "802915d4" : "CutscenePeachEnd8", - "80291654" : "CutscenePeachEnd9_1", - "802916b8" : "CutscenePeachEnd9_2", - "80291774" : "CutscenePeachEnd9", - "802917e4" : "CutscenePeachEndA_1", - "8029184c" : "CutscenePeachEndA_2", - "80291870" : "CutscenePeachEndA", - "80291924" : "CutscenePeachEndB", - "80291964" : "CutsceneGrandStar0_1", - "802919dc" : "CutsceneGrandStar0_2", - "80291ab4" : "CutsceneGrandStar0_4", - "80291b18" : "CutsceneGrandStar0_5", - "80291b68" : "CutsceneGrandStar0_6", - "80291bf4" : "CutsceneGrandStar0_7", - "80291c3c" : "CutsceneGrandStar0_3", - "80291cd0" : "CutsceneGrandStar0", - "80291db0" : "CutsceneGrandStar1_1", - "80291e84" : "CutsceneGrandStar1_2", - "80291f18" : "CutsceneGrandStar1_3", - "80292038" : "CutsceneGrandStar1_4", - "80292164" : "CutsceneGrandStar1", - "802921fc" : "func_80291BBC", - "8029228c" : "CutsceneDanceCommon", - "80292324" : "CutsceneStarDance1_4", - "80292370" : "CutsceneStarDance1_5", - "802923b8" : "CutsceneStarDance1_6", - "80292400" : "dummy_80291DC0", - "80292414" : "CutsceneStarDance1_1", - "8029244c" : "CutsceneStarDance1_3", - "80292484" : "CutsceneStarDance1_2", - "802924b8" : "CutsceneStarDance1", - "80292628" : "func_80291FE8", - "802926dc" : "CutsceneStarDance3_1", - "802927d0" : "CutsceneStarDance3_2", - "80292868" : "CutsceneStarDance3_3", - "80292974" : "CutsceneStarDance3_4", - "80292a20" : "CutsceneStarDance3_5", - "80292a4c" : "CutsceneStarDance3_6", - "80292a80" : "CutsceneStarDance3", - "80292c00" : "CutsceneStarDance2_1", - "80292d80" : "CutsceneStarDance2_3", - "80292e2c" : "CutsceneStarDance2_2", - "80292ec4" : "func_80292884", - "80292f40" : "CutsceneStarDance2_4", - "80292f98" : "CutsceneStarDance2_5", - "80292fe4" : "CutsceneStarDance2_6", - "80293018" : "CutsceneStarDance2", - "802930f0" : "CutsceneKeyDance0_6", - "80293164" : "CutsceneKeyDance0_2", - "802931c0" : "CutsceneKeyDance0_3", - "80293220" : "CutsceneKeyDance0_4", - "8029328c" : "CutsceneKeyDance0_5", - "802932f4" : "CutsceneKeyDance0_7", - "80293328" : "CutsceneKeyDance0_8", - "80293354" : "CutsceneKeyDance0_1", - "8029338c" : "CutsceneKeyDance0", - "80293488" : "CutsceneEnterBowserPlatform0_4", - "802934b4" : "CutsceneEnterBowserPlatform0_3", - "802934d8" : "CutsceneEnterBowserPlatform0_5", - "80293548" : "CutsceneEnterBowserPlatform0_8", - "802935e0" : "CutsceneEnterBowserPlatform0_9", - "80293624" : "CutsceneEnterBowserPlatform0_7", - "8029369c" : "CutsceneEnterBowserPlatform0_6", - "802936dc" : "CutsceneEnterBowserPlatform0_1", - "80293708" : "func_802930C8", - "80293734" : "CutsceneEnterBowserPlatform0_2", - "802937e8" : "bowser_fight_intro_dialog", - "8029386c" : "CutsceneEnterBowserPlatform1", - "802938c8" : "CutsceneEnterBowserPlatform2", - "80293944" : "CutsceneEnterBowserPlatform0", - "80293abc" : "CutsceneStarSpawn0_1", - "80293ae8" : "CutsceneStarSpawn0_2", - "80293b70" : "CutsceneStarSpawn1_1", - "80293bf4" : "CutsceneStarSpawn1_2", - "80293c2c" : "CutsceneStarSpawn0", - "80293cb0" : "CutsceneStarSpawn1", - "80293d5c" : "CutsceneStarSpawn2", - "80293d90" : "CutsceneExitWaterfall0_1", - "80293dd4" : "Cutscene80293794", - "80293e7c" : "CutsceneExitWaterfall0", - "80293ed8" : "CutsceneFallCommon1", - "80293f2c" : "CutsceneFallToCastleGrounds0_1", - "80293f70" : "CutsceneFallToCastleGrounds0", - "80293fcc" : "CutsceneSpecialStarSpawn0_1", - "80294024" : "CutsceneSpecialStarSpawn0_3", - "80294088" : "CutsceneSpecialStarSpawn0_4", - "802940cc" : "CutsceneSpecialStarSpawn0_5", - "8029410c" : "CutsceneSpecialStarSpawn0_2", - "802942cc" : "CutsceneSpecialStarSpawn0_6", - "802942f0" : "CutsceneSpecialStarSpawn0", - "802943d4" : "CutsceneSpecialStarSpawn1", - "80294428" : "func_80293DE8", - "80294718" : "CutscenePrepareCannon0_1", - "802947a4" : "CutscenePrepareCannon0_2", - "8029480c" : "func_802941CC", - "802948a0" : "CutscenePrepareCannon0_3", - "80294a14" : "CutscenePrepareCannon0", - "80294a94" : "CutscenePrepareCannon1", - "80294ae8" : "func_802944A8", - "80294b78" : "func_80294538", - "80294bb4" : "CutsceneDeath1_1", - "80294c28" : "CutsceneDeath1_2", - "80294c5c" : "CutsceneDeath1", - "80294cc4" : "CutsceneDeath2_1", - "80294d48" : "CutsceneDeath2_2", - "80294db4" : "CutsceneDeath2", - "80294e24" : "CutsceneBBHDeath0_1", - "80294ea8" : "CutsceneBBHDeath0_2", - "80294ee8" : "CutsceneBBHDeath0", - "80294f58" : "CutsceneQuicksandDeath0_1", - "80294f94" : "CutsceneQuicksandDeath0_2", - "80294fec" : "CutsceneQuicksandDeath0", - "802950b0" : "Cutscene1ATodo0_3", - "80295140" : "Cutscene1ATodo0_2", - "802951f0" : "Cutscene1ATodo0_1", - "80295270" : "Cutscene1ATodo0", - "80295310" : "CutsceneEnterPool0_1", - "802953dc" : "CutsceneEnterPool0_2", - "80295418" : "CutsceneEnterPool0", - "80295480" : "Cutscene26Todo1_1", - "802954ec" : "Cutscene26Todo1_5", - "80295518" : "Cutscene26Todo1_2", - "80295580" : "Cutscene26Todo1_3", - "80295670" : "Cutscene26Todo1_4", - "80295740" : "Cutscene26Todo1_7", - "8029576c" : "Cutscene26Todo1_6", - "802957c8" : "Cutscene26Todo1", - "80295894" : "Cutscene26Todo2", - "802958d4" : "CutsceneEnterPyramidTop0_1", - "80295930" : "CutsceneEnterPyramidTop0", - "80295a58" : "CutsceneDialog0_1", - "80295bf0" : "CutsceneDialog0_2", - "80295e24" : "CutsceneDialog0_3", - "80295e8c" : "CutsceneDialog0", - "80295fb0" : "CutsceneDialog1", - "80295fd8" : "CutsceneDialog2", - "80296020" : "CutsceneReadMessage0_1", - "80296160" : "CutsceneReadMessage0", - "802962c8" : "CutsceneReadMessage1", - "802962f0" : "CutsceneReadMessage2", - "80296318" : "CutsceneExitSuccess1", - "802963b8" : "CutsceneExitSuccess2", - "8029652c" : "CutsceneExitSuccess4", - "8029665c" : "CutsceneExitSuccess3", - "8029669c" : "CutsceneExitBowserSuccess0_1", - "802966e4" : "CutsceneExitSuccess5", - "80296710" : "CutsceneExitBowserSuccess0", - "802967c4" : "CutsceneExitNonPainting1", - "8029685c" : "CutsceneBBHExitSuccess0_1", - "802968a0" : "CutsceneBBHExitSuccess0", - "8029695c" : "CutsceneNonPaintingDeath0_1", - "802969f8" : "Cutscene1CTodo_0", - "80296a64" : "CutsceneNonPaintingDeath0_2", - "80296b30" : "CutsceneNonPaintingDeath0", - "80296bc8" : "CutsceneCapSwitchPress0_1", - "80296c4c" : "CutsceneCapSwitchPress0_4", - "80296d60" : "CutsceneCapSwitchPress0_5", - "80296da8" : "CutsceneCapSwitchPress0_2", - "80296eb4" : "CutsceneCapSwitchPress0_3", - "80296f38" : "CutsceneCapSwitchPress0_6", - "80296fa8" : "CutsceneCapSwitchPress0", - "80297148" : "CutsceneUnlockKeyDoor0_1", - "8029720c" : "CutsceneUnlockKeyDoor0_2", - "80297290" : "CutsceneUnlockKeyDoor0_5", - "802972ec" : "CutsceneUnlockKeyDoor0_6", - "80297300" : "CutsceneUnlockKeyDoor0_3", - "80297384" : "CutsceneUnlockKeyDoor0_4", - "802973b0" : "CutsceneUnlockKeyDoor0", - "80297464" : "intro_peach_move_camera_start_to_pipe", - "80297560" : "peach_letter_text", - "8029758c" : "play_sound_peach_reading_letter", - "802975c4" : "CutsceneIntroPeachCommon", - "8029762c" : "CutsceneIntroPeach4", - "802976bc" : "CutsceneIntroPeach3_2", - "80297728" : "CutsceneIntroPeach2_2", - "80297748" : "CutsceneIntroPeach0_1", - "80297784" : "CutsceneIntroPeach3_1", - "802977c8" : "CutsceneIntroPeach3_3", - "802977f4" : "intro_pipe_exit_text", - "80297820" : "play_sound_intro_turn_on_hud", - "8029784c" : "CutsceneIntroPeach2", - "80297908" : "CutsceneIntroPeach3", - "80297a38" : "CutsceneIntroPeach1", - "80297a64" : "CutsceneIntroPeach0", - "80297b58" : "CutsceneEndWaving0_1", - "80297b84" : "CutsceneEndWaving0", - "80297c14" : "CutsceneCredits0_1", - "80297c40" : "CutsceneCredits0", - "802980dc" : "CutsceneSlidingDoorsOpen0_1", - "8029819c" : "CutsceneSlidingDoorsOpen0_2", - "80298218" : "CutsceneSlidingDoorsOpen0_3", - "80298254" : "CutsceneSlidingDoorsOpen0_4", - "80298290" : "CutsceneSlidingDoorsOpen0_5", - "802983b4" : "CutsceneSlidingDoorsOpen0", - "80298458" : "CutsceneDoubleDoorsOpen1", - "802984a0" : "CutsceneEnterPainting0_1", - "802984b4" : "CutsceneEnterPainting0", - "802987b0" : "CutsceneExitPainting80298094", - "8029894c" : "CutsceneExitPainting80298230", - "802989e8" : "CutsceneExitPainting802982CC", - "80298af8" : "CutsceneExitPainting0", - "80298ba0" : "Cutscene11Todo_0", - "80298c2c" : "Cutscene11Todo_1", - "80298ccc" : "CutsceneExitPainting1", - "80298d44" : "CutsceneEnterCannon2", - "80298d9c" : "CutsceneEnterCannon1", - "80298fe8" : "CutsceneEnterCannon0", - "80299100" : "CutsceneDoor0", - "80299154" : "CutsceneDoor1", - "802991a8" : "CutsceneDoorWarp1", - "802991f0" : "CutsceneDoor2", - "802992cc" : "CutsceneDoor3", - "80299360" : "CutsceneDoor4", - "80299404" : "CutsceneDoorAB_2", - "802994e8" : "handle_cutscenes", - "8029a2f8" : "call_cutscene_func_in_time_range", - "8029a37c" : "set_cutscene_phase_at_frame", - "8029a3b4" : "func_80299C98", - "8029a41c" : "func_80299D00", - "8029a4d0" : "func_80299DB4", - "8029a5e8" : "set_fov_30", - "8029a60c" : "approach_fov_20", - "8029a64c" : "set_fov_45", - "8029a670" : "set_fov_29", - "8029a694" : "zoom_fov_30", - "8029a6f4" : "zoom_fov_for_sleep", - "8029a858" : "approach_fov_30", - "8029a894" : "approach_fov_60", - "8029a8d0" : "approach_fov_45", - "8029a968" : "approach_fov_80", - "8029a9a4" : "func_8029A288", - "8029aa3c" : "geo_camera_fov", - "8029ab94" : "set_fov_function", - "8029abb0" : "func_8029A494", - "8029ac30" : "func_8029A514", - "8029aef8" : "func_8029A7DC", - "8029af98" : "intro_peach_set_pos_and_opacity", - "8029b08c" : "bhv_intro_peach_loop", - "8029b28c" : "intro_lakitu_set_offset_from_camera", - "8029b358" : "intro_lakitu_set_focus", - "8029b3c8" : "intro_lakitu_set_pos_and_focus", - "8029b49c" : "bhv_intro_lakitu_loop", - "8029bde4" : "bhv_end_birds_1_loop", - "8029bf64" : "bhv_end_birds_2_loop", - "8029c0e4" : "func_8029B964", - "8029c254" : "bhv_intro_scene_loop", - "8029c770" : "nop_change_course", - "8029c780" : "copy_mario_state_to_object", - "8029c9cc" : "spawn_particle", - "8029ca58" : "bhv_mario_update", - "8029cb34" : "update_objects_starting_at", - "8029cbc8" : "update_objects_during_time_stop", - "8029cd28" : "update_objects_in_list", - "8029cd98" : "unload_deactivated_objects_in_list", - "8029ce58" : "set_object_respawn_info_bits", - "8029cedc" : "unload_objects_from_area", - "8029cfb0" : "spawn_objects_from_info", - "8029d1d8" : "stub_8029CA50", - "8029d1e8" : "clear_objects", - "8029d324" : "update_terrain_objects", - "8029d374" : "update_non_terrain_objects", - "8029d428" : "unload_deactivated_objects", - "8029d690" : "update_objects", - "8029d890" : "Geo18_8029D890", - "8029d924" : "Geo18_8029D924", - "8029db48" : "geo_switch_anim_state", - "8029dbd4" : "geo_switch_area", - "8029dcd4" : "func_8029D558", - "8029dda8" : "apply_object_scale_to_matrix", - "8029de80" : "func_8029D704", - "8029e1b0" : "set_object_held_state", - "8029e27c" : "lateral_dist_between_objects", - "8029e2f8" : "dist_between_objects", - "8029e398" : "obj_forward_vel_approach_upward", - "8029e3e8" : "approach_f32_signed", - "8029e494" : "approach_f32_symmetric", - "8029e530" : "approach_s16_symmetric", - "8029e5ec" : "obj_rotate_yaw_toward", - "8029e694" : "angle_to_object", - "8029e714" : "obj_turn_toward_object", - "8029e8bc" : "set_object_parent_relative_pos", - "8029e914" : "set_object_pos", - "8029e96c" : "set_object_angle", - "8029e9ac" : "spawn_object_abs_with_rot", - "8029ea24" : "spawn_object_rel_with_rot", - "8029eaac" : "Unknown8029E330", - "8029eb04" : "spawn_water_splash", - "8029ed20" : "spawn_object_at_origin", - "8029edcc" : "spawn_object", - "8029ee24" : "try_to_spawn_object", - "8029eeb8" : "spawn_object_with_scale", - "8029ef64" : "spawn_object_relative", - "8029effc" : "spawn_object_relative_with_scale", - "8029f070" : "obj_move_using_vel", - "8029f0c8" : "copy_object_graph_y_offset", - "8029f0e0" : "copy_object_pos_and_angle", - "8029f120" : "copy_object_pos", - "8029f148" : "copy_object_angle", - "8029f188" : "func_8029EA0C", - "8029f1b0" : "Unknown8029EA34", - "8029f200" : "linear_mtxf_mul_vec3f", - "8029f274" : "linear_mtxf_transpose_mul_vec3f", - "8029f2ec" : "apply_scale_to_object_transform", - "8029f3a8" : "copy_object_scale", - "8029f3d0" : "scale_object_xyz", - "8029f404" : "scale_object", - "8029f430" : "obj_scale", - "8029f464" : "SetObjAnimation", - "8029f4b4" : "set_obj_animation_and_sound_state", - "8029f514" : "func_8029ED98", - "8029f59c" : "func_8029EE20", - "8029f600" : "obj_enable_rendering_and_become_tangible", - "8029f620" : "obj_enable_rendering", - "8029f644" : "obj_disable_rendering_and_become_intangible", - "8029f66c" : "obj_disable_rendering", - "8029f694" : "obj_unhide", - "8029f6bc" : "obj_hide", - "8029f6e0" : "obj_set_pos_relative", - "8029f7d8" : "obj_set_pos_relative_to_parent", - "8029f820" : "obj_enable_rendering_2", - "8029f848" : "obj_unused_init_on_floor", - "8029f8ec" : "obj_set_facing_to_move_angles", - "8029f914" : "get_object_list_from_behavior", - "8029f95c" : "obj_nearest_object_with_behavior", - "8029f998" : "obj_dist_to_nearest_object_with_behavior", - "8029f9ec" : "obj_find_nearest_object_with_behavior", - "8029fb1c" : "find_unimportant_object", - "8029fb68" : "count_unimportant_objects", - "8029fbdc" : "count_objects_with_behavior", - "8029fc9c" : "obj_find_nearby_held_actor", - "8029fdb4" : "obj_change_action", - "8029fe00" : "func_8029F684", - "8029fe6c" : "func_8029F6F0", - "8029fea4" : "func_8029F728", - "8029ff04" : "func_8029F788", - "8029ffa4" : "func_8029F828", - "802a0008" : "obj_check_anim_frame", - "802a0050" : "obj_check_anim_frame_in_range", - "802a00ac" : "Unknown8029F930", - "802a0114" : "mario_is_in_air_action", - "802a0154" : "mario_is_dive_sliding", - "802a0198" : "func_8029FA1C", - "802a01d8" : "func_8029FA5C", - "802a0380" : "obj_get_thrown_or_placed", - "802a0474" : "obj_get_dropped", - "802a04c0" : "obj_set_model", - "802a04f0" : "mario_set_flag", - "802a0514" : "obj_clear_interact_status_flag", - "802a0568" : "mark_object_for_deletion", - "802a057c" : "obj_disable", - "802a05b4" : "obj_become_intangible", - "802a05d4" : "obj_become_tangible", - "802a05f0" : "make_object_tangible", - "802a0604" : "obj_update_floor_height", - "802a064c" : "obj_update_floor_height_and_get_floor", - "802a079c" : "obj_apply_drag_xz", - "802a0e68" : "obj_move_y", - "802a113c" : "obj_unused_resolve_wall_collisions", - "802a11a8" : "abs_angle_diff", - "802a120c" : "obj_move_xz_using_fvel_and_yaw", - "802a12a4" : "obj_move_y_with_terminal_vel", - "802a1308" : "obj_compute_vel_xz", - "802a1370" : "func_802A0BF4", - "802a1424" : "are_objects_collided", - "802a148c" : "obj_set_behavior", - "802a14c4" : "set_object_behavior", - "802a14fc" : "obj_has_behavior", - "802a1554" : "object_has_behavior", - "802a15ac" : "obj_lateral_dist_from_mario_to_home", - "802a1634" : "obj_lateral_dist_to_home", - "802a16ac" : "obj_outside_home_square", - "802a1774" : "obj_outside_home_rectangle", - "802a184c" : "obj_set_pos_to_home", - "802a188c" : "obj_set_pos_to_home_and_stop", - "802a18dc" : "obj_shake_y", - "802a1930" : "func_802A11B4", - "802a1960" : "Unknown802A11E4", - "802a19ac" : "obj_set_billboard", - "802a19c8" : "obj_set_hitbox_radius_and_height", - "802a19f0" : "obj_set_hurtbox_radius_and_height", - "802a1b34" : "spawn_object_loot_blue_coins", - "802a1b8c" : "spawn_object_loot_yellow_coins", - "802a1bdc" : "obj_spawn_loot_coin_at_mario_pos", - "802a1c68" : "obj_abs_y_dist_to_home", - "802a1cc4" : "Unknown802A1548", - "802a1f3c" : "obj_resolve_wall_collisions", - "802a2320" : "obj_update_floor_and_walls", - "802a2348" : "obj_move_standard", - "802a25b4" : "obj_move_using_vel_and_gravity", - "802a2644" : "obj_move_using_fvel_and_gravity", - "802a2674" : "set_object_pos_relative", - "802a2748" : "obj_angle_to_home", - "802a27b0" : "func_802A2008", - "802a2804" : "translate_object_local", - "802a2930" : "build_object_transform_from_pos_and_angle", - "802a2a18" : "func_802A2270", - "802a2a84" : "build_object_transform_relative_to_parent", - "802a2b28" : "Unknown802A2380", - "802a2b6c" : "obj_rotate_move_angle_using_vel", - "802a2bc4" : "obj_rotate_face_angle_using_vel", - "802a2c1c" : "obj_set_face_angle_to_move_angle", - "802a2c5c" : "obj_follow_path", - "802a2ed4" : "chain_segment_init", - "802a2f14" : "random_f32_around_zero", - "802a2f5c" : "scale_object_random", - "802a2fc0" : "translate_object_xyz_random", - "802a308c" : "translate_object_xz_random", - "802a31e0" : "func_802A2A38", - "802a3268" : "obj_reflect_move_angle_off_wall", - "802a32ac" : "obj_spawn_particles", - "802a34a4" : "set_object_hitbox", - "802a3604" : "signum_positive", - "802a3634" : "absf", - "802a3674" : "absi", - "802a36a4" : "obj_wait_then_blink", - "802a3754" : "obj_is_mario_ground_pounding_platform", - "802a37ac" : "func_802A3004", - "802a37dc" : "func_802A3034", - "802a3818" : "obj_push_mario_away", - "802a390c" : "obj_push_mario_away_from_cylinder", - "802a399c" : "BehDustSmokeLoop", - "802a3a4c" : "func_802A32A4", - "802a3a88" : "func_802A32E0", - "802a3b40" : "func_802A3398", - "802a3c18" : "func_802A3470", - "802a3cfc" : "obj_is_mario_on_platform", - "802a3d40" : "obj_shake_y_until", - "802a3dd4" : "func_802A362C", - "802a3e30" : "obj_call_action_function", - "802a3ef8" : "Unknown802A3750", - "802a3f24" : "func_802A377C", - "802a3f48" : "obj_mario_far_away", - "802a404c" : "obj_is_mario_moving_fast_or_in_air", - "802a40b8" : "item_in_array", - "802a4120" : "bhv_init_room", - "802a4210" : "obj_enable_rendering_if_mario_in_room", - "802a4360" : "obj_set_hitbox_and_die_if_attacked", - "802a4440" : "func_802A3C98", - "802a44f4" : "set_object_collision_data", - "802a452c" : "obj_if_hit_wall_bounce_away", - "802a4564" : "obj_hide_if_mario_far_away_y", - "802a45e4" : "Geo18_802A45E4", - "802a462c" : "Unknown802A3E84", - "802a46cc" : "obj_is_hidden", - "802a4704" : "enable_time_stop", - "802a4728" : "disable_time_stop", - "802a4750" : "set_time_stop_flags", - "802a4774" : "clear_time_stop_flags", - "802a47a0" : "func_802A3FF8", - "802a48bc" : "obj_is_mario_in_range_and_ready_to_speak", - "802a4960" : "obj_update_dialog", - "802a4be4" : "obj_update_dialog_with_cutscene", - "802a4f04" : "obj_has_model", - "802a4f58" : "obj_align_gfx_with_floor", - "802a5034" : "mario_is_within_rectangle", - "802a50fc" : "ShakeScreen", - "802a513c" : "attack_collided_non_mario_object", - "802a51ac" : "obj_was_attacked_or_ground_pounded", - "802a5228" : "copy_object_behavior_params", - "802a5248" : "func_802A4A70", - "802a5288" : "func_802A4AB0", - "802a52c4" : "func_802A4AEC", - "802a52f8" : "obj_check_grabbed_mario", - "802a5358" : "player_performed_grab_escape_action", - "802a540c" : "obj_unused_play_footstep_sound", - "802a5460" : "enable_time_stop_including_mario", - "802a5498" : "disable_time_stop_including_mario", - "802a54d8" : "obj_check_interacted", - "802a5524" : "obj_spawn_loot_blue_coin", - "802a5588" : "obj_spawn_star_at_y_offset", - "802a5620" : "func_802A4DB0", - "802a56bc" : "bhv_star_door_loop", - "802a58dc" : "bhv_piranha_particle_loop", - "802a597c" : "ActionMrIParticle0", - "802a5a44" : "ActionMrIParticle1", - "802a5aa0" : "bhv_mr_i_particle_loop", - "802a5acc" : "func_802A525C", - "802a5bd4" : "bhv_mr_i_body_loop", - "802a5d4c" : "ActionMrI3", - "802a6518" : "ActionMrI2", - "802a68a0" : "ActionMrI1", - "802a6ad8" : "ActionMrI0", - "802a6b7c" : "bhv_mr_i_loop", - "802a6c20" : "bhv_pole_init", - "802a6c74" : "bhv_giant_pole_loop", - "802a6cf4" : "bhv_thi_huge_island_top_loop", - "802a6d64" : "bhv_thi_tiny_island_top_loop", - "802a6ee4" : "ActionActivateCapSwitch0", - "802a7020" : "ActionActivateCapSwitch1", - "802a708c" : "ActionActivateCapSwitch2", - "802a7160" : "ActionActivateCapSwitch3", - "802a7170" : "bhv_cap_switch_loop", - "802a719c" : "Geo18_802A719C", - "802a7230" : "bhv_bobomb_anchor_mario_loop", - "802a7264" : "ActionKingBobomb0", - "802a7384" : "func_802A6AF8", - "802a73d8" : "ActionKingBobomb2", - "802a7598" : "ActionKingBobomb3", - "802a7804" : "ActionKingBobomb1", - "802a78d8" : "ActionKingBobomb6", - "802a7a60" : "ActionKingBobomb7", - "802a7b1c" : "ActionKingBobomb8", - "802a7b5c" : "ActionKingBobomb4", - "802a7d14" : "ActionKingBobomb5", - "802a7fbc" : "func_802A7748", - "802a8064" : "bhv_king_bobomb_loop", - "802a816c" : "bhv_beta_chest_bottom_init", - "802a81e8" : "bhv_beta_chest_bottom_loop", - "802a821c" : "bhv_beta_chest_lid_loop", - "802a8370" : "bhv_water_air_bubble_init", - "802a83a0" : "bhv_water_air_bubble_loop", - "802a8630" : "bhv_bubble_wave_init", - "802a86bc" : "Unknown802A7E48", - "802a870c" : "bhv_bubble_maybe_loop", - "802a88a4" : "bhv_small_water_wave_loop", - "802a8a38" : "func_802A81C4", - "802a8b18" : "bhv_particle_init", - "802a8bc0" : "bhv_particle_loop", - "802a8c88" : "bhv_small_bubbles_loop", - "802a8cdc" : "bhv_fish_group_loop", - "802a8d48" : "bhv_water_waves_init", - "802a8d98" : "bhv_cannon_base_unused_loop", - "802a8dc0" : "ActionOpenedCannon0", - "802a8f40" : "ActionOpenedCannon4", - "802a9114" : "ActionOpenedCannon6", - "802a92fc" : "ActionOpenedCannon5", - "802a93f8" : "ActionOpenedCannon1", - "802a9440" : "ActionOpenedCannon2", - "802a9460" : "ActionOpenedCannon3", - "802a9498" : "bhv_cannon_base_loop", - "802a94f8" : "bhv_cannon_barrel_loop", - "802a958c" : "func_802A8D18", - "802a9708" : "bhv_chuckya_anchor_mario_loop", - "802a973c" : "Unknown802A8EC8", - "802a98c4" : "func_802A9050", - "802a9994" : "ActionChuckya0", - "802a9d08" : "ActionChuckya1", - "802a9f54" : "ActionChuckya3", - "802a9fc8" : "ActionChuckya2", - "802aa02c" : "func_802A97B8", - "802aa0ac" : "bhv_chuckya_loop", - "802aa1b8" : "bhv_wf_breakable_wall_loop", - "802aa280" : "func_802A9A0C", - "802aa3c8" : "func_802A9B54", - "802aa3f4" : "bhv_kickable_board_loop", - "802aa700" : "bhv_tower_door_loop", - "802aa774" : "bhv_wf_rotating_wooden_platform_loop", - "802aa830" : "bhv_rotating_platform_loop", - "802aa948" : "func_802AA0D4", - "802aa97c" : "bhv_koopa_shell_underwater_loop", - "802aaa60" : "bhv_warp_loop", - "802aab54" : "BehFadingWarpLoop", - "802aac48" : "bhv_white_puff_exploding_loop", - "802aae8c" : "func_802AA618", - "802aaf48" : "bhv_unused_080c_init", - "802aaffc" : "func_802AA788", - "802ab060" : "func_802AA7EC", - "802ab158" : "func_802AA8E4", - "802ab18c" : "func_802AA918", - "802ab1c8" : "bhv_unused_080c_loop", - "802ab558" : "bhv_spawn_star_objects", - "802ab5c8" : "bhv_coin_sparkles_init", - "802ab650" : "bhv_yellow_coin_init", - "802ab70c" : "bhv_yellow_coin_loop", - "802ab748" : "bhv_temp_coin_loop", - "802ab7a4" : "bhv_coin_init", - "802ab860" : "bhv_coin_loop", - "802aba40" : "bhv_coin_formation_spawn_loop", - "802abc04" : "func_802AB364", - "802abee4" : "bhv_coin_formation_init", - "802abf0c" : "bhv_coin_formation_loop", - "802ac068" : "ActionCoinInsideBoo1", - "802ac15c" : "ActionCoinInsideBoo0", - "802ac294" : "bhv_coin_inside_boo_loop", - "802ac2c0" : "bhv_coin_sparkles_loop", - "802ac2ec" : "bhv_golden_coin_sparkles_loop", - "802ac3a8" : "bhv_punch_tiny_triangle_loop", - "802ac4a0" : "bhv_punch_tiny_triangle_init", - "802ac5b4" : "bhv_wall_tiny_star_particle_loop", - "802ac678" : "bhv_tiny_star_particles_init", - "802ac78c" : "bhv_pound_tiny_star_particle_loop", - "802ac864" : "bhv_pound_tiny_star_particle_init", - "802ac910" : "func_802AC070", - "802ac958" : "func_802AC0B8", - "802ac9d0" : "func_802AC130", - "802aca6c" : "func_802AC1CC", - "802acac8" : "bhv_door_loop", - "802acc3c" : "bhv_door_init", - "802ace80" : "bhv_star_door_loop_2", - "802ad078" : "ActionGrindelThwomp4", - "802ad10c" : "ActionGrindelThwomp2", - "802ad1a4" : "ActionGrindelThwomp3", - "802ad238" : "ActionGrindelThwomp1", - "802ad2d0" : "ActionGrindelThwomp0", - "802ad34c" : "bhv_grindel_thwomp_loop", - "802ad378" : "bhv_tumbling_bridge_platform_loop", - "802ad580" : "ActionTumblingBridge1", - "802ad76c" : "ActionTumblingBridge2", - "802ad7f4" : "ActionTumblingBridge3", - "802ad828" : "ActionTumblingBridge0", - "802ad890" : "bhv_tumbling_bridge_loop", - "802ad8bc" : "func_802AD01C", - "802ad8f0" : "ActionElevator0", - "802ada4c" : "ActionElevator1", - "802adb88" : "ActionElevator2", - "802adce4" : "ActionElevator4", - "802add70" : "ActionElevator3", - "802addf8" : "bhv_elevator_init", - "802adf6c" : "bhv_elevator_loop", - "802adf98" : "bhv_water_mist_spawn_loop", - "802adfd8" : "bhv_water_mist_loop", - "802ae0cc" : "spawn_triangle_break_particles", - "802ae238" : "bhv_water_mist_2_loop", - "802ae304" : "bhv_pound_white_puffs_init", - "802ae334" : "func_802ADA94", - "802ae360" : "bhv_unused_0e40_init", - "802ae394" : "Unknown802ADAF4", - "802ae45c" : "func_802ADBBC", - "802ae48c" : "bhv_ground_snow_init", - "802ae4c0" : "func_802ADC20", - "802ae534" : "bhv_wind_loop", - "802ae85c" : "bhv_unused_particle_spawn_loop", - "802ae908" : "bhv_ukiki_cage_star_loop", - "802aea6c" : "ukiki_cage_act_wait_for_ukiki", - "802aeab8" : "ukiki_cage_act_spin", - "802aeb1c" : "ukiki_cage_act_fall", - "802aeb74" : "ukiki_cage_act_hide", - "802aeb9c" : "bhv_ukiki_cage_loop", - "802aebc8" : "bhv_squishable_platform_loop", - "802aec40" : "bhv_bitfs_sinking_platform_loop", - "802aeca8" : "bhv_ddd_moving_pole_loop", - "802aecdc" : "bhv_bitfs_sinking_cage_platform_loop", - "802aedc0" : "bhv_beta_moving_flames_spawn_loop", - "802aeea4" : "bhv_beta_moving_flames_loop", - "802aef1c" : "bhv_flamethrower_flame_loop", - "802af1e8" : "bhv_flamethrower_loop", - "802af3fc" : "bhv_rr_rotating_bridge_platform_loop", - "802af448" : "bhv_bouncing_fireball_flame_loop", - "802af5f8" : "bhv_bouncing_fireball_loop", - "802af7c4" : "bhv_bowser_shock_wave_loop", - "802af9cc" : "bhv_black_smoke_upward_loop", - "802afa0c" : "bhv_black_smoke_bowser_loop", - "802afae4" : "bhv_black_smoke_mario_loop", - "802afbf8" : "bhv_flame_mario_loop", - "802afce4" : "bhv_beta_fish_splash_spawner_loop", - "802afd1c" : "bhv_spindrift_loop", - "802afee8" : "bhv_wf_solid_tower_platform_loop", - "802aff30" : "bhv_wf_elevator_tower_platform_loop", - "802b00e4" : "bhv_wf_sliding_tower_platform_loop", - "802b0244" : "func_802AF9A4", - "802b039c" : "func_802AFAFC", - "802b04b4" : "bhv_tower_platform_group_loop", - "802b0614" : "bhv_tree_snow_or_leaf_loop", - "802b0974" : "bhv_snow_leaf_particle_spawn_init", - "802b0b9c" : "func_802B02FC", - "802b0bec" : "bhv_squarish_path_moving_loop", - "802b0d48" : "bhv_piranha_plant_waking_bubbles_loop", - "802b0df0" : "bhv_piranha_plant_bubble_loop", - "802b1278" : "bhv_purple_switch_loop", - "802b14f4" : "func_802B0C54", - "802b15e8" : "bhv_pushable_loop", - "802b1714" : "func_802B0E74", - "802b17f4" : "func_802B0F54", - "802b19d8" : "func_802B1138", - "802b1ae0" : "bhv_hidden_object_loop", - "802b1b2c" : "bhv_breakable_box_loop", - "802b1bb0" : "Geo18_802B1BB0", - "802b1c54" : "bhv_heave_ho_throw_mario_loop", - "802b1d7c" : "ActionHeaveHo1", - "802b1e6c" : "ActionHeaveHo2", - "802b1ff4" : "ActionHeaveHo3", - "802b20a0" : "ActionHeaveHo0", - "802b2154" : "func_802B18B4", - "802b2278" : "bhv_heave_ho_loop", - "802b2340" : "bhv_ccm_touched_star_spawn_loop", - "802b23e0" : "bhv_unused_poundable_platform", - "802b2494" : "bhv_beta_trampoline_spring_loop", - "802b25ac" : "bhv_beta_trampoline_top_loop", - "802b26a4" : "ActionJumpingBox0", - "802b27d8" : "ActionJumpingBox1", - "802b2824" : "func_802B1F84", - "802b288c" : "bhv_jumping_box_loop", - "802b29b8" : "bhv_boo_cage_loop", - "802b2bc8" : "func_802B2328", - "802b2d10" : "bhv_alpha_boo_key_loop", - "802b3108" : "bhv_beta_boo_key_loop", - "802b3134" : "func_802B2894", - "802b3250" : "func_802B29B0", - "802b329c" : "bhv_grand_star_loop", - "802b3600" : "bhv_bowser_key_loop", - "802b37b8" : "bhv_white_puff_smoke_init", - "802b3810" : "bhv_bullet_bill_init", - "802b3830" : "ActionBulletBill0", - "802b38b8" : "ActionBulletBill1", - "802b394c" : "ActionBulletBill2", - "802b3b08" : "ActionBulletBill3", - "802b3b24" : "ActionBulletBill4", - "802b3be0" : "bhv_bullet_bill_loop", - "802b3c2c" : "ActionBowserTailAnchor0", - "802b3cdc" : "ActionBowserTailAnchor1", - "802b3d10" : "ActionBowserTailAnchor2", - "802b3d74" : "bhv_bowser_tail_anchor_loop", - "802b3df4" : "bhv_bowser_flame_spawn_loop", - "802b4080" : "bhv_bowser_body_anchor_loop", - "802b4184" : "func_802B38B4", - "802b41fc" : "func_802B392C", - "802b4288" : "func_802B39B8", - "802b4300" : "func_802B3A30", - "802b4368" : "func_802B3A98", - "802b43dc" : "func_802B3B0C", - "802b4478" : "ActionBowser5", - "802b44bc" : "ActionBowser6", - "802b45f4" : "func_802B3D24", - "802b473c" : "func_802B3E44", - "802b48d4" : "func_802B3FDC", - "802b4a1c" : "func_802B4124", - "802b4a3c" : "func_802B4144", - "802b4af4" : "func_u_802B4AF4", - "802b4bac" : "ActionBowser18", - "802b4be8" : "ActionBowser0", - "802b4ca4" : "ActionBowser15", - "802b4d14" : "ActionBowser14", - "802b4f00" : "ActionBowser16", - "802b5104" : "ActionBowser8", - "802b5218" : "ActionBowser12", - "802b53f4" : "func_802B4A44", - "802b5444" : "func_802B4A94", - "802b5554" : "func_802B4BA4", - "802b55cc" : "ActionBowser13", - "802b5798" : "ActionBowser17", - "802b58bc" : "ActionBowser10", - "802b59cc" : "ActionBowser9", - "802b5aec" : "func_802B5108", - "802b5c00" : "ActionBowser11", - "802b5c40" : "ActionBowser7", - "802b5f6c" : "func_802B5588", - "802b5fec" : "ActionBowser1", - "802b611c" : "func_802B5738", - "802b6190" : "ActionBowser2", - "802b6568" : "ActionBowser3", - "802b65d0" : "func_802B5C78", - "802b6670" : "func_802B5D18", - "802b6730" : "func_802B5DD8", - "802b67d4" : "func_802B5E7C", - "802b6878" : "func_802B5F20", - "802b6a10" : "func_802B60B8", - "802b6a78" : "func_802B6120", - "802b6bac" : "func_802B6254", - "802b6cf0" : "ActionBowser4", - "802b6e40" : "func_802B64E8", - "802b6ee0" : "ActionBowser19", - "802b711c" : "func_802B67C4", - "802b71e4" : "func_802B688C", - "802b72d4" : "func_802B697C", - "802b7418" : "func_802B6AC0", - "802b75a4" : "bhv_bowser_loop", - "802b7878" : "bhv_bowser_init", - "802b798c" : "Geo18_802B798C", - "802b7a20" : "func_802B70C8", - "802b7c64" : "geo_switch_bowser_eyes", - "802b7d44" : "Geo18_802B7D44", - "802b7e68" : "ActionFallingBowserPlatform0", - "802b7ef0" : "ActionFallingBowserPlatform1", - "802b8024" : "ActionFallingBowserPlatform2", - "802b8384" : "bhv_falling_bowser_platform_loop", - "802b83b0" : "func_802B7A58", - "802b8434" : "func_802B7ADC", - "802b84ac" : "bhv_flame_bowser_init", - "802b85b0" : "bhv_flame_large_burning_out_init", - "802b8654" : "func_802B7CFC", - "802b8734" : "bhv_flame_bowser_loop", - "802b8960" : "bhv_flame_moving_forward_growing_init", - "802b89ec" : "bhv_flame_moving_forward_growing_loop", - "802b8b1c" : "bhv_flame_floating_landing_init", - "802b8c38" : "bhv_flame_floating_landing_loop", - "802b8d68" : "bhv_blue_bowser_flame_init", - "802b8e7c" : "bhv_blue_bowser_flame_loop", - "802b9034" : "bhv_flame_bouncing_init", - "802b90ec" : "bhv_flame_bouncing_loop", - "802b921c" : "bhv_blue_flames_group_loop", - "802b935c" : "bhv_blue_fish_loop", - "802b9790" : "bhv_tank_fish_group_loop", - "802b98d4" : "func_802B8F7C", - "802b98fc" : "bhv_checkerboard_elevator_group_init", - "802b9a78" : "func_802B9120", - "802b9af8" : "func_802B91A0", - "802b9bb4" : "bhv_checkerboard_platform_init", - "802b9bd8" : "bhv_checkerboard_platform_loop", - "802b9e94" : "bhv_ddd_warp_loop", - "802b9efc" : "func_802B95A4", - "802ba13c" : "func_802B97E4", - "802ba19c" : "bhv_water_level_pillar_init", - "802ba1e0" : "bhv_water_level_pillar_loop", - "802ba25c" : "bhv_invisible_objects_under_bridge_init", - "802ba2b0" : "Geo18_802BA2B0", - "802ba2f8" : "bhv_bowser_key_unlock_door_loop", - "802ba458" : "bhv_bowser_key_course_exit_loop", - "802ba5bc" : "bhv_moat_grills_loop", - "802ba608" : "bhv_rotating_clock_arm_loop", - "802ba7e0" : "handle_hat_ukiki_reset", - "802ba868" : "is_hat_ukiki_and_mario_has_hat", - "802ba8c4" : "unused_Geo18_8029D890", - "802ba958" : "idle_ukiki_taunt", - "802bab7c" : "ukiki_act_idle", - "802bae40" : "ukiki_act_return_home", - "802baec4" : "ukiki_act_wait_to_respawn", - "802baf10" : "ukiki_act_unused_turn", - "802baf64" : "ukiki_act_turn_to_mario", - "802bb07c" : "ukiki_act_run", - "802bb288" : "ukiki_act_jump", - "802bb3b8" : "ukiki_act_go_to_cage", - "802bb798" : "ukiki_free_loop", - "802bb888" : "cage_ukiki_held_loop", - "802bba3c" : "hat_ukiki_held_loop", - "802bbb98" : "bhv_ukiki_init", - "802bbc0c" : "bhv_ukiki_loop", - "802bbd6c" : "func_802BB414", - "802bbfd8" : "func_802BB680", - "802bc0f0" : "bhv_lll_moving_octagonal_mesh_platform_loop", - "802bc22c" : "bhv_lll_sinking_rock_block_loop", - "802bc294" : "bhv_lll_rotating_hex_flame_loop", - "802bc348" : "func_802BB9F0", - "802bc4f4" : "ActionRotatingCwFireBars0", - "802bc538" : "ActionRotatingCwFireBars1", - "802bc590" : "ActionRotatingCwFireBars2", - "802bc5fc" : "ActionRotatingCwFireBars3", - "802bc618" : "bhv_lll_rotating_block_fire_bars_loop", - "802bc660" : "bhv_lll_wood_piece_loop", - "802bc728" : "bhv_lll_floating_wood_bridge_loop", - "802bc898" : "bhv_volcano_flames_loop", - "802bc934" : "func_802BBFDC", - "802bca74" : "bhv_lll_rotating_hexagonal_ring_loop", - "802bcce8" : "func_802BC390", - "802bcda8" : "bhv_lll_sinking_rectangular_platform_loop", - "802bce58" : "bhv_lll_sinking_square_platforms_loop", - "802bce9c" : "func_802BC544", - "802bcf40" : "bhv_tilting_platform_init", - "802bcfc4" : "func_802BC66C", - "802bd058" : "bhv_tilting_platform_loop", - "802bd3e4" : "func_802BCA8C", - "802bd488" : "bhv_koopa_shell_flame_loop", - "802bd5dc" : "bhv_koopa_shell_flame_spawn", - "802bd62c" : "func_802BCCD4", - "802bd680" : "bhv_koopa_shell_loop", - "802bd8d0" : "func_802BCF78", - "802bd91c" : "func_802BCFC4", - "802bdb04" : "ActionToxBox4", - "802bdb3c" : "ActionToxBox5", - "802bdb74" : "ActionToxBox6", - "802bdbac" : "ActionToxBox7", - "802bdbe4" : "ActionToxBox1", - "802bdc7c" : "ActionToxBox2", - "802bdcc8" : "ActionToxBox3", - "802bdd14" : "ActionToxBox0", - "802bdd68" : "bhv_tox_box_loop", - "802bdd9c" : "piranha_plant_act_idle", - "802bde10" : "piranha_plant_check_interactions", - "802bdeec" : "piranha_plant_act_sleeping", - "802be034" : "piranha_plant_act_woken_up", - "802be0b8" : "piranha_plant_reset_when_far", - "802be0ec" : "piranha_plant_attacked", - "802be150" : "piranha_plant_act_shrink_and_die", - "802be234" : "piranha_plant_act_wait_to_respawn", - "802be278" : "piranha_plant_act_respawn", - "802be350" : "piranha_plant_act_biting", - "802be49c" : "mario_moving_fast_enough_to_make_piranha_plant_bite", - "802be50c" : "piranha_plant_act_stopped_biting", - "802be5a0" : "bhv_piranha_plant_loop", - "802be628" : "bhv_lll_bowser_puzzle_spawn_piece", - "802be6d4" : "bhv_lll_bowser_puzzle_spawn_pieces", - "802be79c" : "bhv_lll_bowser_puzzle_loop", - "802be8a8" : "bhv_lll_bowser_puzzle_piece_action_0", - "802be8b8" : "bhv_lll_bowser_puzzle_piece_action_1", - "802be8f4" : "bhv_lll_bowser_puzzle_piece_update", - "802be9dc" : "bhv_lll_bowser_puzzle_piece_move", - "802beb14" : "bhv_lll_bowser_puzzle_piece_idle", - "802beb54" : "bhv_lll_bowser_puzzle_piece_move_left", - "802beb8c" : "bhv_lll_bowser_puzzle_piece_move_right", - "802bebc4" : "bhv_lll_bowser_puzzle_piece_move_up", - "802bebfc" : "bhv_lll_bowser_puzzle_piece_move_down", - "802bec34" : "bhv_lll_bowser_puzzle_piece_loop", - "802becb0" : "func_802BE2E8", - "802bed7c" : "play_penguin_walking_sound", - "802bedec" : "ActionTuxiesMother2", - "802bef8c" : "ActionTuxiesMother1", - "802bf1d8" : "ActionTuxiesMother0", - "802bf3c0" : "bhv_tuxies_mother_loop", - "802bf424" : "func_802BEA58", - "802bf474" : "ActionSmallPenguin2", - "802bf57c" : "ActionSmallPenguin1", - "802bf648" : "ActionSmallPenguin3", - "802bf6e4" : "ActionSmallPenguin4", - "802bf760" : "ActionSmallPenguin0", - "802bf90c" : "ActionSmallPenguin5", - "802bfa14" : "func_802BF048", - "802bfa88" : "bhv_small_penguin_loop", - "802bfbac" : "geo_switch_tuxie_mother_eyes", - "802bfcd8" : "ActionFish0", - "802bfeb8" : "ActionFish1", - "802bff20" : "ActionFish2", - "802bff3c" : "bhv_fish_loop", - "802bff68" : "func_802BF59C", - "802c00b4" : "ActionFishGroup1", - "802c0348" : "ActionFishGroup2", - "802c06a8" : "ActionFishGroup0", - "802c0768" : "bhv_fish_group_2_loop", - "802c08a8" : "bhv_wdw_express_elevator_loop", - "802c0aac" : "ActionBirdChirpChirp0", - "802c0b50" : "ActionBirdChirpChirp1", - "802c0ba4" : "ActionBirdChirpChirp2", - "802c0bc4" : "ActionBirdChirpChirp3", - "802c0be0" : "bhv_bird_chirp_chirp_loop", - "802c0c0c" : "func_802C0240", - "802c0cd4" : "ActionCheepCheep0", - "802c0d44" : "ActionCheepCheep1", - "802c0f90" : "ActionCheepCheep2", - "802c1204" : "bhv_cheep_cheep_loop", - "802c12c0" : "bhv_rotatin_exclamation_box_loop", - "802c1308" : "ActionExclamationBox0", - "802c13ec" : "ActionExclamationBox1", - "802c14b0" : "ActionExclamationBox2", - "802c15b8" : "ActionExclamationBox3", - "802c17bc" : "func_802C0DF0", - "802c18d0" : "ActionExclamationBox4", - "802c1988" : "ActionExclamationBox5", - "802c19c0" : "bhv_exclamation_box_loop", - "802c19fc" : "bhv_sound_spawner_init", - "802c1a40" : "bhv_bowsers_sub_loop", - "802c1a80" : "bhv_sushi_shark_collision_loop", - "802c1a90" : "bhv_sushi_shark_loop", - "802c1c44" : "bhv_sunken_ship_part_loop", - "802c1cd4" : "bhv_ship_part_3_loop", - "802c1e10" : "bhv_jrb_sliding_box_loop", - "802c2190" : "bhv_white_puff_1_loop", - "802c2274" : "bhv_white_puff_2_loop", - "802c22b8" : "bhv_hidden_blue_coin_loop", - "802c242c" : "bhv_blue_coin_switch_loop", - "802c263c" : "bhv_openable_cage_door_loop", - "802c26f8" : "bhv_openable_grill_loop", - "802c2930" : "bhv_init_changing_water_level_loop", - "802c2a24" : "bhv_water_level_diamond_loop", - "802c2ce8" : "func_802C231C", - "802c2ebc" : "ActionTweester0", - "802c2fbc" : "ActionTweester1", - "802c31c4" : "ActionTweester2", - "802c329c" : "bhv_tweester_loop", - "802c32e8" : "bhv_tweester_sand_particle_loop", - "802c3440" : "bhv_boo_init", - "802c3684" : "bhv_courtyard_boo_triplet_init", - "802c4824" : "bhv_boo_loop", - "802c4f30" : "bhv_big_boo_loop", - "802c515c" : "bhv_boo_with_cage_init", - "802c51d4" : "bhv_boo_with_cage_loop", - "802c5224" : "bhv_merry_go_round_boo_manager_loop", - "802c53cc" : "obj_set_secondary_camera_focus", - "802c53ec" : "bhv_animated_texture_loop", - "802c5414" : "bhv_boo_in_castle_loop", - "802c5688" : "bhv_boo_boss_spawned_bridge_loop", - "802c5890" : "bhv_bbh_tilting_trap_platform_loop", - "802c5a38" : "bhv_haunted_bookshelf_loop", - "802c5ca8" : "bhv_merry_go_round_loop", - "802c5dc0" : "bhv_static_checkered_platform_loop", - "802c5f48" : "bhv_beta_bowser_anchor_loop", - "802c5fdc" : "bhv_play_music_track_when_touched_loop", - "802c6050" : "bhv_floor_trap_in_castle_loop", - "802c60ac" : "bhv_castle_floor_trap_init", - "802c6150" : "bhv_castle_floor_trap_open_detect", - "802c61d4" : "bhv_castle_floor_trap_open", - "802c6278" : "bhv_castle_floor_trap_close_detect", - "802c62bc" : "bhv_castle_floor_trap_close", - "802c6328" : "bhv_castle_floor_trap_rotate", - "802c6348" : "bhv_castle_floor_trap_loop", - "802c63e8" : "BehClimbDetectLoop", - "802c64a4" : "bhv_sparkle_spawn_loop", - "802c6538" : "func_802C5A64", - "802c65c0" : "bhv_scuttlebug_loop", - "802c6b6c" : "bhv_scuttlebug_spawn_loop", - "802c6ca0" : "func_802C61CC", - "802c6d6c" : "ActionWhomp0", - "802c6ec8" : "ActionWhomp7", - "802c6fb0" : "ActionWhomp1", - "802c710c" : "ActionWhomp2", - "802c7254" : "ActionWhomp3", - "802c72b4" : "ActionWhomp4", - "802c7380" : "ActionWhomp5", - "802c7428" : "func_802C6954", - "802c75fc" : "func_802C6B28", - "802c76d4" : "ActionWhomp6", - "802c7858" : "ActionWhomp8", - "802c7998" : "ActionWhomp9", - "802c79d8" : "bhv_whomp_loop", - "802c7a70" : "bhv_water_splash_loop", - "802c7b14" : "bhv_water_drops_loop", - "802c7cac" : "bhv_surface_waves_loop", - "802c7d40" : "bhv_water_surface_white_wave_init", - "802c7d90" : "bhv_object_bubble_ripples_init", - "802c7dfc" : "bhv_surface_wave_shrinking_init", - "802c7e5c" : "bhv_wave_trail_loop", - "802c7f98" : "bhv_white_wind_particle_loop", - "802c81b4" : "func_802C76E0", - "802c834c" : "bhv_snowman_wind_blowing_loop", - "802c85a4" : "func_802C7AD0", - "802c863c" : "bhv_walking_penguin_loop", - "802c89f0" : "update_mario_platform", - "802c8b4c" : "get_mario_pos", - "802c8b8c" : "set_mario_pos", - "802c8bc8" : "apply_platform_displacement", - "802c8ec0" : "apply_mario_platform_displacement", - "802c8f28" : "clear_mario_platform", - "802c8f40" : "Unknown802C8460", - "802c8fe4" : "func_802C8504", - "802c91ec" : "func_802C870C", - "802c9388" : "func_802C88A8", - "802c93f8" : "func_802C8918", - "802c94ac" : "func_802C89CC", - "802c95b4" : "func_802C8AD4", - "802c9630" : "func_802C8B50", - "802c9724" : "detect_object_collisions", - "802c99b8" : "init_free_object_list", - "802c9a3c" : "clear_object_lists", - "802c9b68" : "unload_object", - "802c9f04" : "create_object", - "802ca028" : "mark_obj_for_deletion", - "802ca040" : "exec_anim_sound_state", - "802ca144" : "create_sound_spawner", - "802ca190" : "PlaySound", - "802ca1e0" : "PlaySound2", - "802ca230" : "calc_dist_to_volume_range_1", - "802ca2d4" : "calc_dist_to_volume_range_2", - "802ca370" : "Stub802C9890", - "802ca380" : "Stub802C98A0", - "802ca390" : "Stub802C98B0", - "802ca3a0" : "Stub802C98C0", - "802ca3b0" : "get_current_clock", - "802ca3e0" : "get_clock_difference", - "802ca418" : "set_print_state_info", - "802ca460" : "print_text_array_info", - "802ca51c" : "set_text_array_x_y", - "802ca568" : "print_debug_bottom_up", - "802ca5b8" : "print_debug_top_down_objectinfo", - "802ca618" : "print_debug_top_down_mapinfo", - "802ca680" : "print_debug_top_down_normal", - "802ca6d0" : "print_mapinfo", - "802ca8e8" : "print_checkinfo", - "802ca918" : "print_surfaceinfo", - "802ca94c" : "print_stageinfo", - "802ca990" : "print_string_array_info", - "802caa6c" : "print_effectinfo", - "802caaa8" : "print_enemyinfo", - "802caae4" : "update_debug_dpadmask", - "802cabac" : "debug_unknown_level_select_check", - "802cac20" : "reset_debug_objectinfo", - "802cb0b0" : "stub_802CA5D0", - "802cb0c0" : "try_print_debug_mario_object_info", - "802cb1c0" : "try_print_debug_mario_level_info", - "802cb264" : "try_do_mario_debug_object_spawn", - "802cb564" : "Unknown802CAA84", - "802cb5c0" : "func_802CAAE0", - "802cb640" : "func_802CAB60", - "802cb894" : "func_802CADB4", - "802cba18" : "func_802CAF38", - "802cbbc4" : "func_802CB0E4", - "802cbc20" : "func_802CB140", - "802cbc7c" : "func_802CB19C", - "802cbd54" : "func_802CB274", - "802cbe64" : "func_802CB384", - "802cbee0" : "func_802CB400", - "802cbf64" : "func_802CB484", - "802cbfe8" : "func_802CB508", - "802cc180" : "func_802CB6A0", - "802cc4d8" : "func_802CB9F8", - "802ccbe8" : "func_802CC108", - "802ccdc8" : "func_802CC2E8", - "802cd1e8" : "Geo18_802CD1E8", - "802cd280" : "rotate_rectangle", - "802cd328" : "atan2_deg", - "802cd388" : "scale_shadow_with_distance", - "802cd444" : "disable_shadow_with_distance", - "802cd48c" : "dim_shadow_with_distance", - "802cd614" : "get_water_level_below_shadow", - "802cd6c4" : "init_shadow", - "802cd938" : "get_texture_coords_9_vertices", - "802cd988" : "get_texture_coords_4_vertices", - "802cd9ec" : "make_shadow_vertex_at_xyz", - "802cdb20" : "extrapolate_vertex_y_position", - "802cdb74" : "get_vertex_coords", - "802cdc40" : "calculate_vertex_xyz", - "802cde94" : "floor_local_tilt", - "802cdf3c" : "make_shadow_vertex", - "802ce128" : "add_shadow_to_display_list", - "802ce2bc" : "linearly_interpolate_solidity_positive", - "802ce3ec" : "linearly_interpolate_solidity_negative", - "802ce524" : "correct_shadow_solidity_for_animations", - "802ce690" : "correct_lava_shadow_height", - "802ce79c" : "create_shadow_player", - "802ce9d0" : "create_shadow_circle_9_verts", - "802ceae8" : "create_shadow_circle_4_verts", - "802cec04" : "create_shadow_circle_assuming_flat_ground", - "802cedc0" : "create_shadow_rectangle", - "802cef6c" : "get_shadow_height_solidity", - "802cf080" : "create_shadow_square", - "802cf1f0" : "create_shadow_hardcoded_rectangle", - "802cf34c" : "create_shadow_below_xyz", - "802cf5b0" : "calculate_skybox_scaled_x", - "802cf69c" : "calculate_skybox_scaled_y", - "802cf804" : "make_skybox_rect", - "802cfa2c" : "draw_skybox_tile_grid", - "802cfc68" : "create_skybox_ortho_matrix", - "802cfd88" : "init_skybox_display_list", - "802cfef4" : "create_skybox_facing_camera", - "802d0080" : "geo_wdw_set_initial_water_level", - "802d01e0" : "geo_movtex_pause_control", - "802d0254" : "movtex_make_quad_vertex", - "802d0484" : "movtex_gen_from_quad", - "802d0a84" : "movtex_gen_from_quad_array", - "802d0bb0" : "movtex_gen_quads_id", - "802d0c84" : "get_quad_collection_from_id", - "802d0f28" : "movtex_change_texture_format", - "802d104c" : "geo_movtex_draw_water_regions", - "802d1330" : "update_moving_texture_offset", - "802d13cc" : "movtex_write_vertex_first", - "802d1574" : "movtex_write_vertex_index", - "802d18b4" : "movtex_gen_list", - "802d1b70" : "geo_movtex_draw_nocolor", - "802d1cdc" : "geo_movtex_draw_colored", - "802d1e48" : "geo_movtex_draw_colored_no_update", - "802d1fa8" : "geo_movtex_draw_colored_2_no_update", - "802d2108" : "geo_movtex_update_horizontal", - "802d2210" : "make_vertex", - "802d22c4" : "round_float", - "802d2360" : "geo_exec_inside_castle_light", - "802d2470" : "geo_exec_flying_carpet_timer_update", - "802d2520" : "geo_exec_flying_carpet_create", - "802d28cc" : "geo_exec_cake_end_screen", - "802d29c0" : "stopAllRippleExcept", - "802d2a74" : "find_mario_y_position_on_painting", - "802d2b08" : "find_mario_z_position_on_painting", - "802d2b84" : "painting_find_vertical_ripple_location", - "802d2c40" : "find_part_of_painting_near_mario", - "802d2d80" : "find_mario_x_position_on_painting", - "802d2dfc" : "painting_find_horizontal_ripple_location", - "802d2eb8" : "painting_set_ripple_type", - "802d2ffc" : "vertical_proximity_ripple_painting_ripple", - "802d319c" : "vertical_proximity_ripple_painting_ripple_if_mario_enters", - "802d327c" : "vertical_continuous_ripple_painting_ripple", - "802d341c" : "vertical_continuous_ripple_painting_ripple_if_mario_enters", - "802d34fc" : "horizontal_proximity_ripple_painting_ripple", - "802d36ac" : "horizontal_proximity_ripple_painting_ripple_if_mario_enters", - "802d379c" : "horizontal_continuous_ripple_painting_ripple", - "802d393c" : "horizontal_continuous_ripple_painting_ripple_if_mario_enters", - "802d3a2c" : "painting_update_floors", - "802d3bec" : "painting_update_ripple_status", - "802d3cec" : "painting_calculate_point_ripple", - "802d3e6c" : "painting_conditionally_calculate_point_ripple", - "802d3ee4" : "Print1", - "802d404c" : "Print2", - "802d43f8" : "small_float_to_byte", - "802d44bc" : "func_802D39DC", - "802d47d0" : "func_802D3CF0", - "802d4edc" : "func_802D43FC", - "802d50dc" : "func_802D45FC", - "802d5354" : "func_802D4874", - "802d556c" : "display_painting_rippling", - "802d568c" : "display_painting_not_rippling", - "802d5778" : "reset_painting", - "802d57a8" : "update_ddd_painting", - "802d58e4" : "func_802D4E04", - "802d593c" : "display_painting", - "802d59a8" : "vertical_painting_ripple", - "802d5aa0" : "horizontal_painting_ripple", - "802d5b98" : "Geo18_802D5B98", - "802d5d0c" : "Geo18_802D5D0C", - "802d5e00" : "int_pow", - "802d5e54" : "format_integer", - "802d6144" : "parse_width_field", - "802d62d8" : "print_text_fmt_int", - "802d6554" : "print_text", - "802d66c0" : "print_text_centered", - "802d6858" : "char_to_glyph_index", - "802d69f8" : "add_glyph_texture", - "802d6acc" : "clip_to_bounds", - "802d6b3c" : "render_textrect", - "802d6c88" : "render_text_labels", - "802d6f20" : "create_dl_identity_matrix", - "802d7070" : "create_dl_translation_matrix", - "802d7174" : "create_dl_rotation_matrix", - "802d7280" : "create_dl_scale_matrix", - "802d7384" : "create_dl_ortho_matrix", - "802d75dc" : "render_generic_char", - "802d76c8" : "render_multi_text_string", - "802d77dc" : "print_generic_string", - "802d7b84" : "print_hud_lut_string", - "802d7e88" : "print_menu_generic_string", - "802d82d4" : "print_credits_string", - "802d862c" : "handle_menu_scrolling", - "802d8844" : "get_str_x_pos_from_center", - "802d8934" : "get_string_width", - "802d89b8" : "print_hud_my_score_coins", - "802d8a80" : "print_hud_my_score_stars", - "802d8b34" : "int_to_str", - "802d8c6c" : "get_dialog_id", - "802d8c88" : "create_dialog_box", - "802d8cc4" : "create_dialog_box_with_var", - "802d8d08" : "create_dialog_inverted_box", - "802d8d48" : "create_dialog_box_with_response", - "802d8d90" : "reset_dialog_render_state", - "802d8e2c" : "render_dialog_box_type", - "802d9148" : "change_and_flash_dialog_text_color_lines", - "802d9388" : "handle_dialog_scroll_page_state", - "802d944c" : "render_star_count_dialog_text", - "802d9634" : "render_multi_text_string_lines", - "802d9800" : "ensure_nonnegative", - "802d982c" : "handle_dialog_text_and_pages", - "802d9cb0" : "render_dialog_triangle_choice", - "802d9dfc" : "render_dialog_string_color", - "802d9f84" : "handle_special_dialog_text", - "802da1ac" : "render_dialog_entries", - "802da810" : "set_menu_mode", - "802da844" : "reset_cutscene_msg_fade", - "802da85c" : "dl_rgba16_begin_cutscene_msg_fade", - "802da8e4" : "dl_rgba16_stop_cutscene_msg_fade", - "802da964" : "ascii_to_credits_char", - "802daa34" : "print_credits_str_ascii", - "802daae4" : "set_cutscene_message", - "802dab58" : "do_cutscene_handler", - "802dad54" : "print_peach_letter_message", - "802db08c" : "render_hud_cannon_reticle", - "802db350" : "reset_red_coins_collected", - "802db368" : "change_dialog_camera_angle", - "802db3b8" : "shade_screen", - "802db498" : "print_animated_red_coin", - "802db6e8" : "render_pause_red_coins", - "802db760" : "render_pause_my_score_coins", - "802dbb24" : "render_pause_camera_options", - "802dbe68" : "render_pause_course_options", - "802dc15c" : "render_pause_castle_menu_box", - "802dc418" : "highlight_last_course_complete_stars", - "802dc478" : "print_hud_pause_colorful_str", - "802dc570" : "render_pause_castle_course_stars", - "802dc718" : "render_pause_castle_main_strings", - "802dca88" : "render_pause_courses_and_castle", - "802dcd04" : "print_hud_course_complete_string", - "802dcf30" : "print_hud_course_complete_coins", - "802dd194" : "play_star_fanfare_and_flash_hud", - "802dd210" : "render_course_complete_lvl_info_and_hud_str", - "802dd838" : "render_save_confirmation", - "802ddae0" : "render_course_complete_screen", - "802ddca4" : "render_menus_and_dialogs", - "802dddf0" : "envfx_init_snow", - "802ddf38" : "envfx_update_snowflake_count", - "802de0bc" : "envfx_cleanup_snow", - "802de114" : "orbit_from_positions", - "802de23c" : "pos_from_orbit", - "802de360" : "envfx_is_snowflake_alive", - "802de458" : "envfx_update_snow_normal", - "802de888" : "envfx_update_snow_blizzard", - "802ded38" : "envfx_update_snow_water", - "802def2c" : "rotate_triangle_vertices", - "802df334" : "append_snowflake_vertex_buffer", - "802df748" : "envfx_update_snow", - "802dfbc8" : "envfx_update_particles", - "802dfd50" : "particle_is_laterally_close", - "802dfe00" : "random_flower_offset", - "802dfe80" : "envfx_update_flower", - "802e0120" : "envfx_set_lava_bubble_position", - "802e048c" : "envfx_update_lava", - "802e065c" : "envfx_rotate_around_whirlpool", - "802e08a8" : "envfx_is_whirlpool_bubble_alive", - "802e0934" : "envfx_update_whirlpool", - "802e0e24" : "envfx_is_jestream_bubble_alive", - "802e0eb8" : "envfx_update_jetstream", - "802e1238" : "envfx_init_bubble", - "802e1414" : "envfx_bubbles_update_switch", - "802e1618" : "append_bubble_vertex_buffer", - "802e1a20" : "envfx_set_bubble_texture", - "802e1bb8" : "envfx_update_bubble_particles", - "802e1ed8" : "envfx_set_max_bubble_particles", - "802e1f48" : "envfx_update_bubbles", - "802e20a0" : "convert_rotation", - "802e2134" : "spawn_macro_abs_yrot_2params", - "802e21dc" : "spawn_macro_abs_yrot_param1", - "802e2284" : "spawn_macro_abs_special", - "802e2414" : "spawn_macro_objects", - "802e2690" : "spawn_macro_objects_hardcoded", - "802e28ec" : "spawn_special_objects", - "802e2cf0" : "render_hud_tex_lut", - "802e2e58" : "render_hud_small_tex_lut", - "802e30b4" : "render_power_meter_health_segment", - "802e3214" : "render_dl_power_meter", - "802e33b8" : "animate_power_meter_emphasized", - "802e352c" : "handle_power_meter_actions", - "802e3654" : "render_hud_power_meter", - "802e3744" : "render_hud_mario_lives", - "802e37a8" : "render_hud_coins", - "802e380c" : "render_hud_stars", - "802e38e4" : "render_hud_keys", - "802e395c" : "render_hud_timer", - "802e3b1c" : "set_hud_camera_status", - "802e3b3c" : "render_hud_camera_status", - "802e3d2c" : "render_hud", - "802e3e50" : "func_802E2F40", - "802e3e68" : "func_802E2F58", - "802e3f68" : "absf_2", - "802e3fac" : "TurnObjAwayFromSurface", - "802e405c" : "ObjFindWall", - "802e41a4" : "TurnObjAwayFromAwkwardFloor", - "802e42e0" : "ObjOrientGraph", - "802e43e4" : "CalcObjFriction", - "802e445c" : "CalcNewObjVelAndPosY", - "802e4814" : "CalcNewObjVelAndPosYUnderwater", - "802e4cec" : "ObjUpdatePosVelXZ", - "802e4d88" : "ObjSplash", - "802e4e90" : "ObjectStep", - "802e5114" : "func_802E4204", - "802e5160" : "obj_move_xyz_using_fvel_and_yaw", - "802e5208" : "is_point_within_radius_of_mario", - "802e52b8" : "IsPointCloseToObject", - "802e5360" : "SetObjectVisibility", - "802e53f4" : "ObjLeaveIfMarioIsNearHome", - "802e54b0" : "ObjDisplaceHome", - "802e55d0" : "func_802E46C0", - "802e569c" : "func_802E478C", - "802e5760" : "ObjSpawnYellowCoins", - "802e5824" : "ObjFlickerAndDisappear", - "802e58b4" : "func_802E49A4", - "802e5948" : "func_802E4A38", - "802e5a80" : "ObjCheckFloorDeath", - "802e5b18" : "ObjLavaDeath", - "802e5c6c" : "SpawnOrangeNumber", - "802e5d04" : "Unknown802E4DF4", - "802e5de8" : "CoinStep", - "802e5e6c" : "MovingCoinFlickerLoop", - "802e5ea4" : "CoinCollected", - "802e5ee8" : "bhv_moving_yellow_coin_init", - "802e5f64" : "bhv_moving_yellow_coin_loop", - "802e6098" : "bhv_moving_blue_coin_init", - "802e6114" : "bhv_moving_blue_coin_loop", - "802e62a4" : "bhv_blue_coin_sliding_jumping_init", - "802e631c" : "func_802E540C", - "802e63ec" : "func_802E54DC", - "802e6474" : "bhv_blue_coin_sliding_loop", - "802e6628" : "bhv_blue_coin_jumping_loop", - "802e6790" : "bhv_seaweed_init", - "802e67dc" : "bhv_seaweed_bundle_init", - "802e6a2c" : "bhv_bobomb_init", - "802e6a8c" : "func_802E5B7C", - "802e6af8" : "BobombExplodeLoop", - "802e6bd4" : "CheckBobombInteractions", - "802e6cf0" : "BobombPatrolLoop", - "802e6dc8" : "BobombChaseMarioLoop", - "802e6e84" : "BobombLaunchedLoop", - "802e6ed8" : "GenericBobombFreeLoop", - "802e7020" : "StationaryBobombFreeLoop", - "802e7134" : "BobombFreeLoop", - "802e7180" : "BobombHeldLoop", - "802e7220" : "BobombDroppedLoop", - "802e7280" : "BobombThrownLoop", - "802e7324" : "ObjRandomBlink", - "802e742c" : "bhv_bobomb_loop", - "802e75a0" : "bhv_bobomb_fuse_smoke_init", - "802e76ac" : "bhv_bobomb_buddy_init", - "802e770c" : "BobombBuddyIdleLoop", - "802e7814" : "BobombBuddyCannonLoop", - "802e79dc" : "BobombBuddyTalkLoop", - "802e7b00" : "BobombBuddyTurnToTalkLoop", - "802e7bb0" : "BobombBuddyActionLoop", - "802e7c4c" : "bhv_bobomb_buddy_loop", - "802e7c90" : "bhv_cannon_closed_init", - "802e7d4c" : "CannonTrapDoorOpeningLoop", - "802e7e54" : "bhv_cannon_closed_loop", - "802e7f70" : "bhv_whirlpool_init", - "802e7fb8" : "func_802E70A8", - "802e7fec" : "func_802E70DC", - "802e80dc" : "bhv_whirlpool_loop", - "802e82b0" : "bhv_jet_stream_loop", - "802e8388" : "bhv_homing_amp_init", - "802e89d4" : "bhv_homing_amp_loop", - "802e8ae4" : "bhv_circling_amp_init", - "802e8ecc" : "bhv_circling_amp_loop", - "802e8f68" : "bhv_butterfly_init", - "802e9018" : "ButterflyStep", - "802e9278" : "CalculateButterflyAngle", - "802e9470" : "ButterflyRestingLoop", - "802e94e4" : "ButterflyFollowMarioLoop", - "802e9548" : "ButterflyReturnHomeLoop", - "802e96c8" : "bhv_butterfly_loop", - "802e9764" : "bhv_hoot_init", - "802e97fc" : "HootFindNextFloor", - "802e98c0" : "HootFloorBounce", - "802e9a4c" : "HootFreeStep", - "802e9cf4" : "PlayerSetHootYaw", - "802e9d98" : "HootCarryStep", - "802e9f60" : "HootSurfaceCollision", - "802ea144" : "HootAscentLoop", - "802ea258" : "HootActionLoop", - "802ea3f0" : "HootTurnToHome", - "802ea4ec" : "HootAwakeLoop", - "802ea588" : "bhv_hoot_loop", - "802ea6a8" : "bhv_beta_holdable_object_init", - "802ea7e0" : "bhv_beta_holdable_object_loop", - "802ea888" : "bhv_object_bubble_init", - "802ea934" : "bhv_object_bubble_loop", - "802eaa10" : "bhv_object_water_wave_init", - "802eaa50" : "bhv_object_water_wave_loop", - "802eaa8c" : "bhv_explosion_init", - "802eaad0" : "bhv_explosion_loop", - "802eabf0" : "bhv_bobomb_bully_death_smoke_init", - "802eac3c" : "bhv_bobomb_explosion_bubble_init", - "802ead3c" : "bhv_bobomb_explosion_bubble_loop", - "802eaef8" : "bhv_respawner_loop", - "802eaf84" : "create_respawner", - "802eb05c" : "bhv_small_bully_init", - "802eb104" : "bhv_big_bully_init", - "802eb1c0" : "BullyCheckMarioCollision", - "802eb288" : "BullyChaseMarioLoop", - "802eb3f0" : "BullyKnockbackLoop", - "802eb510" : "BullyBackUpLoop", - "802eb5c4" : "BullyBackUpCheck", - "802eb630" : "PlayBullyStompingSound", - "802eb744" : "BullyStep", - "802eb7e0" : "BullySpawnCoin", - "802eb8b0" : "BullyLavaDeath", - "802eb9d0" : "bhv_bully_loop", - "802ebb74" : "BigBullySpawnMinion", - "802ebc00" : "bhv_big_bully_with_minions_init", - "802ebc88" : "BigBullyWithMinionsLavaDeath", - "802ebce0" : "bhv_big_bully_with_minions_loop", - "802ebf70" : "WaterRingCalcMarioDistInFront", - "802ec030" : "WaterRingInit", - "802ec1b0" : "bhv_jet_stream_water_ring_init", - "802ec200" : "CheckWaterRingCollection", - "802ec3d0" : "SetWaterRingScale", - "802ec4e0" : "WaterRingCollectedLoop", - "802ec59c" : "JetStreamWaterRingNotCollectedLoop", - "802ec75c" : "bhv_jet_stream_water_ring_loop", - "802ec7cc" : "Unknown802EB8A4", - "802ec818" : "JetStreamRingSpawnerActiveLoop", - "802ec908" : "bhv_jet_stream_ring_spawner_loop", - "802ec9b8" : "bhv_manta_ray_water_ring_init", - "802ec9f0" : "MantaRayWaterRingNotCollectedLoop", - "802ecba4" : "bhv_manta_ray_water_ring_loop", - "802ecc14" : "bhv_bowser_bomb_loop", - "802ecd0c" : "bhv_bowser_bomb_explosion_loop", - "802ecea0" : "bhv_bowser_bomb_smoke_loop", - "802ecfac" : "bhv_celebration_star_init", - "802ed10c" : "CelebrationStarSpinAroundMarioLoop", - "802ed28c" : "CelebrationStarFaceCameraLoop", - "802ed39c" : "bhv_celebration_star_loop", - "802ed40c" : "bhv_celebration_star_sparkle_loop", - "802ed45c" : "bhv_star_key_collection_puff_spawner_loop", - "802ed498" : "bhv_lll_drawbridge_spawner_loop", - "802ed62c" : "bhv_lll_drawbridge_loop", - "802ed78c" : "bhv_small_bomp_init", - "802ed7fc" : "bhv_small_bomp_loop", - "802edacc" : "bhv_large_bomp_init", - "802edb2c" : "bhv_large_bomp_loop", - "802eddfc" : "bhv_wf_sliding_platform_init", - "802edf28" : "bhv_wf_sliding_platform_loop", - "802ee124" : "bhv_moneybag_init", - "802ee1a0" : "MoneybagCheckMarioCollision", - "802ee268" : "MoneybagJump", - "802ee46c" : "MoneybagMoveAroundLoop", - "802ee598" : "MoneybagReturnHomeLoop", - "802ee728" : "MoneybagDisappearLoop", - "802ee778" : "MoneybagDeathLoop", - "802ee7e0" : "bhv_moneybag_loop", - "802ee8f4" : "bhv_moneybag_hidden_loop", - "802ee9cc" : "bhv_bowling_ball_init", - "802eea24" : "func_802EDA14", - "802eea7c" : "func_802EDA6C", - "802eeb64" : "bhv_bowling_ball_roll_loop", - "802eecb8" : "bhv_bowling_ball_initializeLoop", - "802eedf0" : "bhv_bowling_ball_loop", - "802eeeb4" : "bhv_generic_bowling_ball_spawner_init", - "802eef9c" : "bhv_generic_bowling_ball_spawner_loop", - "802ef0e8" : "bhv_thi_bowling_ball_spawner_loop", - "802ef21c" : "bhv_bob_pit_bowling_ball_init", - "802ef274" : "bhv_bob_pit_bowling_ball_loop", - "802ef34c" : "bhv_free_bowling_ball_init", - "802ef3f4" : "bhv_free_bowling_ball_roll_loop", - "802ef524" : "bhv_free_bowling_ball_loop", - "802ef63c" : "bhv_rr_cruiser_wing_init", - "802ef66c" : "bhv_rr_cruiser_wing_loop", - "802ef820" : "bhv_spindel_init", - "802ef858" : "bhv_spindel_loop", - "802efcd0" : "bhv_ssl_moving_pyramid_wall_init", - "802efd8c" : "bhv_ssl_moving_pyramid_wall_loop", - "802efe64" : "bhv_pyramid_elevator_init", - "802efef4" : "bhv_pyramid_elevator_loop", - "802f0104" : "bhv_pyramid_elevator_trajectory_marker_ball_loop", - "802f0168" : "bhv_pyramid_top_init", - "802f0288" : "bhv_pyramid_top_spinning", - "802f04a0" : "bhv_pyramid_top_explode", - "802f05b4" : "bhv_pyramid_top_loop", - "802f06a8" : "bhv_pyramid_top_fragment_init", - "802f0714" : "bhv_pyramid_top_fragment_loop", - "802f0788" : "bhv_pyramid_pillar_touch_detector_loop", - "802f07f4" : "bhv_waterfall_sound_loop", - "802f0820" : "bhv_volcano_sound_loop", - "802f084c" : "bhv_castle_flag_init", - "802f0898" : "bhv_birds_sound_loop", - "802f0950" : "bhv_ambient_sounds_init", - "802f09a4" : "bhv_sand_sound_loop", - "802f09f0" : "bhv_castle_cannon_grate_init", - "802f0a40" : "bhv_snowmans_bottom_init", - "802f0b7c" : "func_802EFB2C", - "802f0bd4" : "func_802EFB84", - "802f0c94" : "func_802EFC44", - "802f0df0" : "func_802EFDA0", - "802f0fa8" : "func_802EFF58", - "802f105c" : "bhv_snowmans_bottom_loop", - "802f120c" : "bhv_snowmans_head_init", - "802f1370" : "bhv_snowmans_head_loop", - "802f151c" : "bhv_snowmans_body_checkpoint_loop", - "802f15a8" : "bhv_big_boulder_init", - "802f162c" : "func_802F05DC", - "802f1714" : "bhv_big_boulder_loop", - "802f17f0" : "bhv_big_boulder_generator_loop", - "802f1954" : "func_802F0904", - "802f19c8" : "func_802F0978", - "802f1a10" : "func_802F09C0", - "802f1bb8" : "func_802F0B68", - "802f1d64" : "bhv_wing_cap_init", - "802f1dc0" : "func_802F0D70", - "802f1e5c" : "func_802F0E0C", - "802f1f3c" : "bhv_wing_vanish_cap_loop", - "802f1fd0" : "bhv_metal_cap_init", - "802f2030" : "func_802F0FE0", - "802f20ac" : "bhv_metal_cap_loop", - "802f2140" : "bhv_normal_cap_init", - "802f21e0" : "func_802F1190", - "802f2284" : "func_802F1234", - "802f23a8" : "bhv_normal_cap_loop", - "802f2498" : "bhv_vanish_cap_init", - "802f24f4" : "bhv_collect_star_init", - "802f25b0" : "bhv_collect_star_loop", - "802f2614" : "bhv_star_spawn_init", - "802f2768" : "bhv_star_spawn_loop", - "802f2aa0" : "func_802F1A50", - "802f2b88" : "create_star", - "802f2bd4" : "func_802F1B84", - "802f2c24" : "func_802F1BD4", - "802f2c84" : "bhv_hidden_red_coin_star_init", - "802f2d8c" : "bhv_hidden_red_coin_star_loop", - "802f2e6c" : "bhv_red_coin_init", - "802f2f2c" : "bhv_red_coin_loop", - "802f3014" : "bhv_hidden_star_init", - "802f30f0" : "bhv_hidden_star_loop", - "802f31bc" : "bhv_hidden_star_trigger_loop", - "802f328c" : "bhv_bowser_course_red_coin_star_loop", - "802f336c" : "bhv_ttm_rolling_log_init", - "802f341c" : "func_802F238C", - "802f36a4" : "bhv_rolling_log_loop", - "802f38b0" : "func_802F2820", - "802f39b4" : "func_802F2924", - "802f3a30" : "bhvLllVolcanoFallingTrap_loop", - "802f3b98" : "bhv_lll_rolling_log_init", - "802f3c54" : "bhv_1up_interact", - "802f3cc8" : "bhv_1up_common_init", - "802f3d30" : "bhv_1up_init", - "802f3dd0" : "func_802F2D40", - "802f3ea8" : "func_802F2E18", - "802f401c" : "func_802F2F8C", - "802f40cc" : "bhv_1up_walking_loop", - "802f4248" : "bhv_1up_running_away_loop", - "802f43b8" : "func_802F3328", - "802f44c0" : "bhv_1up_sliding_loop", - "802f45b8" : "bhv_1up_loop", - "802f45f0" : "bhv_1up_jump_on_approach_loop", - "802f4710" : "bhv_1up_hidden_loop", - "802f48f4" : "bhv_1up_hidden_trigger_loop", - "802f496c" : "bhv_1up_hidden_in_pole_loop", - "802f4b00" : "bhv_1up_hidden_in_pole_trigger_loop", - "802f4b78" : "bhv_1up_hidden_in_pole_spawner_loop", - "802f4c68" : "func_802F3BD8", - "802f4ce0" : "func_802F3C50", - "802f4d78" : "bhv_controllable_platform_sub_loop", - "802f4eb4" : "bhv_controllable_platform_init", - "802f5010" : "func_802F3F80", - "802f5068" : "func_802F3FD8", - "802f52c0" : "func_802F4230", - "802f547c" : "func_802F43EC", - "802f55a4" : "bhv_controllable_platform_loop", - "802f5cd4" : "bhv_breakable_box_small_init", - "802f5d78" : "func_802F4CE8", - "802f5e44" : "func_802F4DB4", - "802f5f48" : "breakable_box_small_released_loop", - "802f6014" : "breakable_box_small_idle_loop", - "802f60d8" : "breakable_box_small_get_dropped", - "802f6150" : "breakable_box_small_get_thrown", - "802f6228" : "bhv_breakable_box_small_loop", - "802f62e4" : "bhv_sliding_snow_mound_loop", - "802f6448" : "bhv_snow_mound_spawn_loop", - "802f6588" : "func_802F54F8", - "802f665c" : "func_802F55CC", - "802f6984" : "bhv_floating_platform_loop", - "802f6c0c" : "bhv_arrow_lift_loop", - "802f6d20" : "bhv_orange_number_init", - "802f6d58" : "bhv_orange_number_loop", - "802f6e40" : "bhv_manta_ray_init", - "802f6eb0" : "func_802F5E20", - "802f7068" : "func_802F5FD8", - "802f7264" : "bhv_manta_ray_loop", - "802f7348" : "bhv_falling_pillar_init", - "802f7398" : "bhv_falling_pillar_spawn_hitboxes", - "802f7418" : "bhv_falling_pillar_calculate_angle_in_front_of_mario", - "802f74dc" : "bhv_falling_pillar_loop", - "802f7760" : "bhv_falling_pillar_hitbox_loop", - "802f7924" : "bhv_jrb_floating_box_loop", - "802f7978" : "bhv_decorative_pendulum_init", - "802f79b0" : "bhv_decorative_pendulum_loop", - "802f7a58" : "bhv_treasure_chest_top_loop", - "802f7c9c" : "bhv_treasure_chest_bottom_init", - "802f7d04" : "bhv_treasure_chest_bottom_loop", - "802f7f1c" : "func_802F6E8C", - "802f7fa0" : "bhv_treasure_chest_ship_init", - "802f8044" : "bhv_treasure_chest_ship_loop", - "802f8158" : "bhv_treasure_chest_jrb_init", - "802f8208" : "bhv_treasure_chest_jrb_loop", - "802f82f8" : "bhv_treasure_chest_init", - "802f83a4" : "bhv_treasure_chest_loop", - "802f8490" : "bhv_mips_init", - "802f85e0" : "bhv_mips_find_furthest_waypoint_to_mario", - "802f8760" : "bhv_mips_act_wait_for_nearby_mario", - "802f8808" : "bhv_mips_act_follow_path", - "802f893c" : "bhv_mips_act_wait_for_animation_done", - "802f8988" : "bhv_mips_act_fall_down", - "802f8a34" : "bhv_mips_act_idle", - "802f8ab4" : "bhv_mips_free", - "802f8b54" : "bhv_mips_held", - "802f8c74" : "bhv_mips_dropped", - "802f8cf8" : "bhv_mips_thrown", - "802f8dac" : "bhv_mips_loop", - "802f8e54" : "bhv_yoshi_init", - "802f8f08" : "yoshi_walk_loop", - "802f9054" : "yoshi_idle_loop", - "802f923c" : "yoshi_talk_loop", - "802f93a8" : "yoshi_walk_and_jump_off_roof_loop", - "802f9500" : "yoshi_finish_jumping_and_despawn_loop", - "802f95ac" : "yoshi_give_present_loop", - "802f965c" : "BehYoshiLoop", - "802fbc4c" : "bhv_koopa_init", - "802fc414" : "shelled_koopa_attack_handler", - "802fcc00" : "obj_begin_race", - "802fd7f8" : "bhv_koopa_update", - "802fd950" : "bhv_koopa_race_endpoint_update", - "802fda28" : "bhv_pokey_body_part_update", - "802fe3b0" : "bhv_pokey_update", - "802fe8b4" : "bhv_swoop_update", - "802ff040" : "bhv_fly_guy_update", - "802ff214" : "bhv_goomba_triplet_spawner_update", - "802ff408" : "bhv_goomba_init", - "802ff94c" : "huge_goomba_weakly_attacked", - "802ff96c" : "bhv_goomba_update", - "802ffb38" : "bhv_chain_chomp_chain_part_update", - "80300e40" : "bhv_chain_chomp_update", - "80300ecc" : "bhv_wooden_post_update", - "80301148" : "bhv_chain_chomp_gate_init", - "80301180" : "bhv_chain_chomp_gate_update", - "80301210" : "bhv_wiggler_body_part_update", - "803020e4" : "wiggler_jumped_on_attack_handler", - "80302154" : "bhv_wiggler_update", - "80302910" : "bhv_spiny_update", - "80303028" : "bhv_enemy_lakitu_update", - "8030369c" : "bhv_cloud_update", - "80303744" : "bhv_cloud_part_update", - "80303984" : "bhv_camera_lakitu_init", - "80303f64" : "bhv_camera_lakitu_update", - "803043f8" : "bhv_monty_mole_hole_update", - "803044c0" : "bhv_monty_mole_init", - "80304ba8" : "bhv_monty_mole_update", - "80304fd4" : "bhv_monty_mole_rock_update", - "80305100" : "bhv_platform_on_track_init", - "80305a58" : "bhv_platform_on_track_update", - "80305bb0" : "bhv_track_ball_update", - "80305c14" : "bhv_seesaw_platform_init", - "80305c90" : "bhv_seesaw_platform_update", - "80305e2c" : "bhv_ferris_wheel_axle_init", - "80305f24" : "bhv_ferris_wheel_platform_update", - "80306084" : "bhv_water_bomb_spawner_update", - "803067e8" : "bhv_water_bomb_update", - "803068c0" : "bhv_water_bomb_shadow_update", - "8030699c" : "bhv_ttc_rotating_solid_init", - "80306a38" : "bhv_ttc_rotating_solid_update", - "80306cc4" : "bhv_ttc_pendulum_init", - "80306d38" : "bhv_ttc_pendulum_update", - "80306f48" : "bhv_ttc_treadmill_init", - "80307010" : "bhv_ttc_treadmill_update", - "803071b8" : "bhv_ttc_moving_bar_init", - "80307670" : "bhv_ttc_moving_bar_update", - "80307760" : "bhv_ttc_cog_init", - "803077e0" : "bhv_ttc_cog_update", - "80307930" : "bhv_ttc_pit_block_init", - "803079c8" : "bhv_ttc_pit_block_update", - "80307ae4" : "bhv_ttc_elevator_init", - "80307b58" : "bhv_ttc_elevator_update", - "80307c88" : "bhv_ttc_2d_rotator_init", - "80307cf8" : "bhv_ttc_2d_rotator_update", - "80307ea4" : "bhv_ttc_spinner_update", - "8030803c" : "bhv_mr_blizzard_init", - "80308d6c" : "bhv_mr_blizzard_update", - "80309154" : "bhv_mr_blizzard_snowball", - "803091e0" : "bhv_sliding_plat_2_init", - "80309354" : "bhv_sliding_plat_2_loop", - "80309454" : "bhv_rotating_octagonal_plat_init", - "803094d0" : "bhv_rotating_octagonal_plat_loop", - "803094f8" : "bhv_animates_on_floor_switch_press_init", - "80309530" : "bhv_animates_on_floor_switch_press_loop", - "803097a4" : "bhv_activated_back_and_forth_platform_init", - "803098c0" : "bhv_activated_back_and_forth_platform_update", - "80309b64" : "bhv_recovery_heart_loop", - "80309cec" : "bhv_bubble_cannon_barrel_loop", - "80309ed4" : "water_bomb_cannon_act_0", - "80309f68" : "water_bomb_cannon_act_1", - "8030a0e8" : "water_bomb_cannon_act_2", - "8030a11c" : "bhv_water_bomb_cannon_loop", - "8030a1c0" : "bhv_unagi_init", - "8030a2a8" : "unagi_act_0", - "8030a390" : "unagi_act_1_4", - "8030a514" : "unagi_act_2", - "8030a614" : "unagi_act_3", - "8030a93c" : "bhv_unagi_loop", - "8030aabc" : "bhv_unagi_subobject_loop", - "8030b2f4" : "bhv_dorrie_update", - "8030b658" : "bhv_haunted_chair_init", - "8030b6d8" : "haunted_chair_act_0", - "8030ba68" : "haunted_chair_act_1", - "8030bc90" : "bhv_haunted_chair_loop", - "8030bfd0" : "bhv_mad_piano_update", - "8030c06c" : "flying_bookend_act_0", - "8030c0f0" : "flying_bookend_act_1", - "8030c210" : "flying_bookend_act_2", - "8030c2c8" : "flying_bookend_act_3", - "8030c364" : "bhv_flying_bookend_loop", - "8030c4b0" : "bhv_bookend_spawn_loop", - "8030c564" : "bookshelf_manager_act_0", - "8030c60c" : "bookshelf_manager_act_1", - "8030c6a4" : "bookshelf_manager_act_2", - "8030c828" : "bookshelf_manager_act_3", - "8030c894" : "bookshelf_manager_act_4", - "8030c8ec" : "bhv_haunted_bookshelf_manager_loop", - "8030c98c" : "bhv_book_switch_loop", - "8030cd30" : "obj_spit_fire", - "8030cddc" : "bhv_fire_piranha_plant_init", - "8030d2f0" : "bhv_fire_piranha_plant_update", - "8030d598" : "bhv_fire_spitter_update", - "8030d640" : "bhv_small_piranha_flame_loop", - "8030d8d4" : "bhv_fly_guy_flame_loop", - "8030d93c" : "Geo18_8030D93C", - "8030d9ac" : "Geo18_8030D9AC", - "8030da14" : "snufit_act_0", - "8030db38" : "snufit_act_1", - "8030dc70" : "bhv_snufit_loop", - "8030dfc4" : "bhv_snufit_balls_loop", - "8030e14c" : "bhv_horizontal_grindel_init", - "8030e16c" : "bhv_horizontal_grindel_update", - "8030ea9c" : "bhv_eyerok_boss_loop", - "8030fff8" : "bhv_eyerok_hand_loop", - "80310498" : "bhv_klepto_init", - "8031126c" : "obj_set_speed_to_zero", - "8031129c" : "bhv_klepto_update", - "80311874" : "bhv_bird_update", - "803118e4" : "bhv_racing_penguin_init", - "80312070" : "bhv_racing_penguin_update", - "80312168" : "bhv_penguin_race_finish_line_update", - "80312200" : "bhv_penguin_race_shortcut_check_update", - "80312248" : "bhv_coffin_manager_loop", - "80312370" : "coffin_act_0", - "8031262c" : "coffin_act_1", - "8031274c" : "bhv_coffin_loop", - "80312804" : "clam_act_0", - "80312900" : "clam_act_1", - "80312a54" : "bhv_clam_loop", - "80313110" : "bhv_skeeter_update", - "803131e8" : "bhv_skeeter_wave_update", - "8031326c" : "bhv_swing_platform_init", - "80313294" : "bhv_swing_platform_update", - "80313354" : "bhv_donut_platform_spawner_update", - "80313530" : "bhv_donut_platform_update", - "803136cc" : "bhv_ddd_pole_init", - "80313754" : "bhv_ddd_pole_update", - "803137f4" : "bhv_red_coin_star_marker_init", - "80313fc0" : "bhv_triplet_butterfly_update", - "80314098" : "bubba_act_0", - "8031427c" : "bubba_act_1", - "803145d4" : "bhv_bubba_loop", - "80314a30" : "prepare_reverb_ring_buffer", - "80314cc0" : "get_volume_ramping", - "80314de4" : "synthesis_execute", - "80314f64" : "synthesis_do_one_audio_update", - "80315590" : "process_notes", - "80316010" : "load_wave_samples", - "803160dc" : "final_resample", - "80316138" : "process_envelope", - "8031619c" : "process_envelope_inner", - "803166fc" : "note_apply_headset_pan_effects", - "80316ac8" : "note_init_volume", - "80316af4" : "note_set_vel_pan_reverb", - "80316da8" : "note_set_frequency", - "80316db4" : "note_enable", - "80316e00" : "note_disable", - "80316e80" : "reset_bank_and_seq_load_status", - "80316ec4" : "discard_bank", - "80316fb4" : "discard_sequence", - "80317040" : "soundAlloc", - "803170b4" : "sound_alloc_pool_init", - "803170d4" : "persistent_pool_clear", - "803170e8" : "temporary_pool_clear", - "80317118" : "unused_803160F8", - "80317128" : "sound_init_main_pools", - "80317184" : "session_pools_init", - "80317200" : "seq_and_bank_pool_init", - "8031727c" : "persistent_pools_init", - "80317338" : "temporary_pools_init", - "803173fc" : "alloc_bank_or_seq", - "8031782c" : "get_bank_or_seq", - "803178ec" : "decrease_reverb_gain", - "80317914" : "wait_for_audio_frames", - "80317948" : "audio_reset_session", - "80318040" : "audio_dma_copy_immediate", - "803180c4" : "audio_dma_copy_async", - "80318130" : "audio_dma_partial_copy_async", - "803181ec" : "decrease_sample_dma_ttls", - "80318300" : "dma_sample_data", - "80318634" : "func_8031758C", - "803188f4" : "func_8031784C", - "80318b30" : "bank_load_immediate", - "80318c8c" : "bank_load_async", - "80318dc4" : "sequence_dma_immediate", - "80318e70" : "sequence_dma_async", - "80318fac" : "get_missing_bank", - "803190f4" : "load_banks_immediate", - "80319220" : "preload_sequence", - "80319328" : "load_sequence", - "80319388" : "load_sequence_internal", - "8031950c" : "audio_init", - "80319920" : "func_80318870", - "80319998" : "note_disable2", - "803199b8" : "func_80318908", - "80319db8" : "seq_channel_layer_decay_release_internal", - "80319f64" : "seq_channel_layer_note_decay", - "80319f84" : "seq_channel_layer_note_release", - "80319fa4" : "func_80318F04", - "8031a1d0" : "func_80319164", - "8031a254" : "init_note_list", - "8031a264" : "init_note_lists", - "8031a2b4" : "init_note_free_list", - "8031a368" : "note_pool_clear", - "8031a494" : "note_pool_fill", - "8031a5d0" : "audio_list_push_front", - "8031a610" : "audio_list_remove", - "8031a63c" : "pop_node_with_value_less_equal", - "8031a6cc" : "note_init_for_layer", - "8031a794" : "func_80319728", - "8031a7c8" : "note_release_and_take_ownership", - "8031a820" : "alloc_note_from_disabled", - "8031a89c" : "alloc_note_from_decaying", - "8031a8f0" : "alloc_note_from_active", - "8031a94c" : "alloc_note", - "8031ac34" : "func_80319BC8", - "8031adac" : "note_init_all", - "8031aee0" : "func_80319E70", - "8031aee8" : "sequence_player_process_sound", - "8031b0cc" : "get_portamento_freq_scale", - "8031b1c0" : "get_vibrato_pitch_change", - "8031b248" : "get_vibrato_freq_scale", - "8031b440" : "note_vibrato_update", - "8031b4a0" : "note_vibrato_init", - "8031b58c" : "adsr_init", - "8031b5ac" : "adsr_update", - "8031b830" : "sequence_channel_init", - "8031b940" : "seq_channel_set_layer", - "8031ba30" : "seq_channel_layer_disable", - "8031ba6c" : "seq_channel_layer_free", - "8031baf0" : "sequence_channel_disable", - "8031bb5c" : "allocate_sequence_channel", - "8031bba4" : "sequence_player_init_channels", - "8031bcd0" : "sequence_player_disable_channels", - "8031bda0" : "sequence_channel_enable", - "8031be44" : "sequence_player_disable", - "8031bf14" : "audio_list_push_back", - "8031bf54" : "audio_list_pop_back", - "8031bf94" : "func_8031AF74", - "8031c03c" : "m64_read_u8", - "8031c050" : "m64_read_s16", - "8031c080" : "m64_read_compressed_u16", - "8031c0c4" : "seq_channel_layer_process_script", - "8031c200" : "L_U_8031C200", - "8031c23c" : "L_U_8031C23C", - "8031c298" : "L_U_8031C298", - "8031c2dc" : "L_U_8031C2DC", - "8031c328" : "L_U_8031C328", - "8031c36c" : "L_U_8031C36C", - "8031c3bc" : "L_U_8031C3BC", - "8031c3e8" : "L_U_8031C3E8", - "8031c454" : "L_U_8031C454", - "8031c4a4" : "L_U_8031C4A4", - "8031c5c8" : "L_U_8031C5C8", - "8031c698" : "L_U_8031C698", - "8031c6a0" : "L_U_8031C6A0", - "8031cbe0" : "L_U_8031CBE0", - "8031cbec" : "L_U_8031CBEC", - "8031ce54" : "get_instrument", - "8031cfd4" : "set_instrument", - "8031d068" : "sequence_channel_set_volume", - "8031d08c" : "sequence_channel_process_script", - "8031d144" : "L_U_8031D144", - "8031d1f8" : "L_U_8031D1F8", - "8031d234" : "L_U_8031D234", - "8031d26c" : "L_U_8031D26C", - "8031d2b4" : "L_U_8031D2B4", - "8031d2c4" : "L_U_8031D2C4", - "8031d31c" : "L_U_8031D31C", - "8031d344" : "L_U_8031D344", - "8031d354" : "L_U_8031D354", - "8031d370" : "L_U_8031D370", - "8031d3a8" : "L_U_8031D3A8", - "8031d3c4" : "L_U_8031D3C4", - "8031d3d4" : "L_U_8031D3D4", - "8031d3e4" : "L_U_8031D3E4", - "8031d400" : "L_U_8031D400", - "8031d424" : "L_U_8031D424", - "8031d44c" : "L_U_8031D44C", - "8031d474" : "L_U_8031D474", - "8031d498" : "L_U_8031D498", - "8031d4bc" : "L_U_8031D4BC", - "8031d4d4" : "L_U_8031D4D4", - "8031d4f0" : "L_U_8031D4F0", - "8031d500" : "L_U_8031D500", - "8031d51c" : "L_U_8031D51C", - "8031d538" : "L_U_8031D538", - "8031d56c" : "L_U_8031D56C", - "8031d5a0" : "L_U_8031D5A0", - "8031d5b4" : "L_U_8031D5B4", - "8031d5d4" : "L_U_8031D5D4", - "8031d5e4" : "L_U_8031D5E4", - "8031d640" : "L_U_8031D640", - "8031d678" : "L_U_8031D678", - "8031d6c4" : "L_U_8031D6C4", - "8031d6d4" : "L_U_8031D6D4", - "8031d6f4" : "L_U_8031D6F4", - "8031d718" : "L_U_8031D718", - "8031d728" : "L_U_8031D728", - "8031d73c" : "L_U_8031D73C", - "8031d7b8" : "L_U_8031D7B8", - "8031d7e8" : "L_U_8031D7E8", - "8031d7f8" : "L_U_8031D7F8", - "8031d814" : "L_U_8031D814", - "8031d830" : "L_U_8031D830", - "8031d87c" : "L_U_8031D87C", - "8031d898" : "L_U_8031D898", - "8031d8f8" : "L_U_8031D8F8", - "8031d900" : "L_U_8031D900", - "8031d930" : "L_U_8031D930", - "8031d94c" : "L_U_8031D94C", - "8031d974" : "L_U_8031D974", - "8031d9ec" : "sequence_player_process_sequence", - "8031e240" : "process_sequences", - "8031e2e8" : "init_sequence_player", - "8031e374" : "func_8031D4B8", - "8031e4f0" : "unused_8031E4F0", - "8031e568" : "unused_8031E568", - "8031e7b8" : "create_next_audio_frame_task", - "8031eb00" : "play_sound", - "8031fd84" : "audio_signal_game_loop_tick", - "8031fdac" : "update_game_sound", - "80320544" : "play_sequence", - "80320678" : "sequence_player_fade_out", - "803206bc" : "fade_volume_scale", - "80320734" : "fade_channel_volume_scale", - "8032080c" : "func_8031F96C", - "803208ec" : "process_level_music_dynamics", - "80320a4c" : "L8031FBAC", - "80320a8c" : "L8031FBEC", - "80320acc" : "L8031FC2C", - "80320b0c" : "L8031FC6C", - "80320b4c" : "L8031FCAC", - "80320b8c" : "L8031FCEC", - "80320bcc" : "L8031FD2C", - "80320bf4" : "L8031FD54", - "80320d70" : "unused_8031FED0", - "80320e3c" : "func_8031FFB4", - "80320ec4" : "sequence_player_unlower", - "80320f68" : "func_803200E4", - "803210d4" : "set_sound_disabled", - "8032112c" : "sound_init", - "80321398" : "unused_8032050C", - "80321474" : "func_803205E8", - "80321584" : "func_803206F8", - "8032171c" : "func_80320890", - "8032174c" : "sound_banks_disable", - "8032180c" : "sound_banks_enable", - "80321864" : "unused_803209D8", - "803218d8" : "func_80320A4C", - "803218f4" : "play_dialog_sound", - "803219ac" : "play_music", - "80321bac" : "stop_background_music", - "80321ce4" : "fadeout_background_music", - "80321d38" : "drop_queued_background_music", - "80321d5c" : "get_current_background_music", - "80321d9c" : "func_80320ED8", - "80321e48" : "play_secondary_music", - "80321f48" : "func_80321080", - "80321f9c" : "func_803210D4", - "80322078" : "play_course_clear", - "803220b4" : "play_peachs_jingle", - "803220f0" : "play_puzzle_jingle", - "8032212c" : "play_star_fanfare", - "80322168" : "play_power_star_jingle", - "803221b8" : "play_race_fanfare", - "803221f4" : "play_toads_jingle", - "80322230" : "sound_reset", - "8032231c" : "audio_set_sound_mode", - "80322348" : "unused_80321460", - "8032235c" : "unused_80321474", - "803223b0" : ".", - "803223b0" : "osSetTime", - "803223e0" : "osMapTLB", - "803224a0" : "osUnmapTLBAll", - "803224f0" : "sprintf", - "8032255c" : "proutSprintf", - "803225a0" : "osCreateMesgQueue", - "803225d0" : "osSetEventMesg", - "80322640" : "osViSetEvent", - "803226b0" : "osCreateThread", - "80322800" : "osRecvMesg", - "80322940" : "_VirtualToPhysicalTask", - "80322a5c" : "osSpTaskLoad", - "80322bbc" : "osSpTaskStartGo", - "80322c00" : "osSpTaskYield", - "80322c20" : "osSendMesg", - "80322d70" : "osSpTaskYielded", - "80322df0" : "osStartThread", - "80322f40" : "osWritebackDCacheAll", - "80322f70" : "osCreateViManager", - "803230f4" : "viMgrMain", - "803232d0" : "osViSetMode", - "80323340" : "osViBlack", - "803233b0" : "osViSetSpecialFeatures", - "80323570" : "osCreatePiManager", - "803236f0" : "osSetThreadPri", - "803237d0" : "osInitialize", - "80323a00" : "osViSwapBuffer", - "80323a50" : "sqrtf", - "80323a60" : "osContStartReadData", - "80323b24" : "osContGetReadData", - "80323bcc" : "__osPackReadData", - "80323cc0" : "osContInit", - "80323ebc" : "__osContGetInitData", - "80323f8c" : "__osPackRequestData", - "80324080" : "osEepromProbe", - "803240f0" : "__ull_rshift", - "8032411c" : "__ull_rem", - "80324158" : "__ull_div", - "80324194" : "__ll_lshift", - "803241c0" : "__ll_rem", - "803241fc" : "__ll_div", - "80324258" : "__ll_mul", - "80324288" : "__ull_divremi", - "803242e8" : "__ll_mod", - "80324384" : "__ll_rshift", - "803243b0" : "osInvalDCache", - "80324460" : "osPiStartDma", - "80324570" : "bzero", - "80324610" : "osInvalICache", - "80324690" : "osEepromLongRead", - "803247d0" : "osEepromLongWrite", - "80324910" : "bcopy", - "80324c20" : "guOrthoF", - "80324d74" : "guOrtho", - "80324de0" : "guPerspectiveF", - "80325010" : "guPerspective", - "80325070" : "osGetTime", - "80325100" : "__d_to_ll", - "8032511c" : "__f_to_ll", - "80325138" : "__d_to_ull", - "803251d8" : "__f_to_ull", - "80325274" : "__ll_to_d", - "8032528c" : "__ll_to_f", - "803252a4" : "__ull_to_d", - "803252d8" : "__ull_to_f", - "80325310" : "cosf", - "80325480" : "sinf", - "80325640" : "guTranslateF", - "80325688" : "guTranslate", - "803256e0" : "guRotateF", - "80325874" : "guRotate", - "803258d0" : "guScaleF", - "80325924" : "guScale", - "80325970" : "osAiSetFrequency", - "80325bd4" : "alBnkfNew", - "80325cd8" : "alSeqFileNew", - "80325d20" : "osWritebackDCache", - "80325da0" : "osAiGetLength", - "80325db0" : "osAiSetNextBuffer", - "80325e60" : "__osTimerServicesInit", - "80325eec" : "__osTimerInterrupt", - "80326064" : "__osSetTimerIntr", - "803260d8" : "__osInsertTimer", - "80326260" : "_Printf", - "803273f0" : "memcpy", - "8032741c" : "strlen", - "80327444" : "strchr", - "80327490" : "__osDequeueThread", - "803274d0" : "__osDisableInt", - "803274f0" : "__osRestoreInt", - "80327510" : "__osViInit", - "80327640" : "__osExceptionPreamble", - "80327650" : "__osException", - "803278e4" : "L80326964", - "80327904" : "L80326984", - "80327938" : "L803269B8", - "80327a68" : "L80326AE8", - "80327ac4" : "L80326B44", - "80327ae4" : "L80326B64", - "80327b1c" : "L80326B9C", - "80327b68" : "L80326BE8", - "80327b98" : "send_mesg", - "80327c80" : "__osEnqueueAndYield", - "80327d10" : "__osEnqueueThread", - "80327d58" : "__osPopThread", - "80327d68" : "__osDispatchThread", - "80327ea8" : "__osCleanupThread", - "80327eb0" : "osVirtualToPhysical", - "80327f30" : "__osSpSetStatus", - "80327f40" : "__osSpSetPc", - "80327f80" : "__osSpRawStartDma", - "80328010" : "__osSpDeviceBusy", - "80328040" : "__osSpGetStatus", - "80328050" : "osGetThreadPri", - "80328070" : "__osViGetCurrentContext", - "80328080" : "__osViSwapContext", - "803283e0" : "osGetCount", - "803283f0" : "__osPiCreateAccessQueue", - "80328440" : "__osPiGetAccess", - "80328484" : "__osPiRelAccess", - "803284b0" : "osPiRawStartDma", - "80328590" : "__osDevMgrMain", - "80328710" : "__osSetSR", - "80328720" : "__osGetSR", - "80328730" : "__osSetFpcCsr", - "80328740" : "__osSiRawReadIo", - "80328790" : "__osSiRawWriteIo", - "803287e0" : "osMapTLBRdb", - "80328840" : "osPiRawReadIo", - "803288a0" : "__osSiCreateAccessQueue", - "803288f0" : "__osSiGetAccess", - "80328934" : "__osSiRelAccess", - "80328960" : "__osSiRawStartDma", - "80328a10" : "osSetTimer", - "80328af0" : "osEepromWrite", - "80328ca0" : "__osPackEepWriteData", - "80328dac" : "__osEepStatus", - "80328fd0" : "osJamMesg", - "80329120" : "osPiGetCmdQueue", - "80329150" : "osEepromRead", - "80329340" : "__osPackEepReadData", - "80329450" : "guMtxF2L", - "80329550" : "guMtxIdentF", - "803295d8" : "guMtxIdent", - "80329608" : "guMtxL2F", - "803296c0" : "guNormalize", - "80329750" : "__osAiDeviceBusy", - "80329780" : "__osSetCompare", - "80329790" : "_Litob", - "80329a90" : "_Ldtob", - "8032a860" : "u32_to_string", - "8032a890" : "string_to_u32", - "8032a8e8" : "send_packet", - "8032a9a8" : "send", - "8032aa80" : "process_command_memory", - "8032aacc" : "process_command_register", - "8032aaf8" : "kdebugserver", - "8032ace0" : "__osSyncPutChars", - "8032ae10" : "osSetIntMask", - "8032ae70" : "osDestroyThread", - "8032af70" : "__osProbeTLB", - "8032b030" : "__osSiDeviceBusy", - "8032b060" : "lldiv", - "8032b160" : "ldiv", - "8032b1f0" : "__osGetCause", - "8032b200" : "__osAtomicDec", - "8032b260" : "rspF3DBootStart", - "8032b330" : "rspF3DBootEnd", - "8032b330" : "rspF3DStart", - "8032c738" : "rspF3DEnd", - "8032c740" : "rspAspMainStart", - "8032d560" : "rspAspMainEnd", - "8032d560" : "gVblankHandler1", - "8032d564" : "gVblankHandler2", - "8032d568" : "gActiveSPTask", - "8032d56c" : "sCurrentAudioSPTask", - "8032d570" : "sCurrentDisplaySPTask", - "8032d574" : "sNextAudioSPTask", - "8032d578" : "sNextDisplaySPTask", - "8032d57c" : "sAudioEnabled", - "8032d580" : "sNumVblanks", - "8032d584" : "gResetTimer", - "8032d588" : "D_8032C648", - "8032d58c" : "gDebugLevelSelect", - "8032d590" : "D_8032C650", - "8032d594" : "gShowProfiler", - "8032d598" : "gShowDebugText", - "8032d5d0" : "unused8032C690", - "8032d5d4" : "gGlobalTimer", - "8032d5dc" : "frameBufferIndex", - "8032d5e0" : "D_8032C6A0", - "8032d5e4" : "gPlayer1Controller", - "8032d5e8" : "gPlayer2Controller", - "8032d5ec" : "gPlayer3Controller", - "8032d5f0" : "gCurrDemoInput", - "8032d5f4" : "gDemoInputListID", - "8032d5f8" : "gRecordedDemoInput", - "8032d6d0" : "credits01", - "8032d6d8" : "credits02", - "8032d6e4" : "credits03", - "8032d6f0" : "credits04", - "8032d700" : "credits05", - "8032d710" : "credits06", - "8032d71c" : "credits07", - "8032d728" : "credits08", - "8032d738" : "credits09", - "8032d740" : "credits10", - "8032d750" : "credits11", - "8032d75c" : "credits12", - "8032d764" : "credits13", - "8032d774" : "credits14", - "8032d77c" : "credits15", - "8032d788" : "credits16", - "8032d79c" : "credits17", - "8032d7ac" : "credits18", - "8032d7bc" : "credits19", - "8032d7c4" : "credits20", - "8032d7cc" : "sCreditsSequence", - "8032d93c" : "gMarioState", - "8032d940" : "unused1", - "8032d944" : "D_8032C9E0", - "8032daa0" : "sTerrainSounds", - "8032dacc" : "sSquishScaleOverTime", - "8032dae0" : "sCapFlickerFrames", - "8032daf8" : "gWaterSurfacePseudoFloor", - "8032dc50" : "sJumpLandAction", - "8032dc68" : "sFreefallLandAction", - "8032dc80" : "sSideFlipLandAction", - "8032dc98" : "sHoldJumpLandAction", - "8032dcb0" : "sHoldFreefallLandAction", - "8032dcc8" : "sLongJumpLandAction", - "8032dce0" : "sDoubleJumpLandAction", - "8032dcf8" : "sTripleJumpLandAction", - "8032dd10" : "sBackflipLandAction", - "8032dd40" : "sPunchingForwardVelocities", - "8032dd80" : "gLastCompletedCourseNum", - "8032dd84" : "gLastCompletedStarNum", - "8032dd88" : "sUnusedGotGlobalCoinHiScore", - "8032dd8c" : "gGotFileCoinHiScore", - "8032dd90" : "gCurrCourseStarFlags", - "8032dd94" : "gSpecialTripleJump", - "8032dd98" : "gLevelToCourseNumTable", - "8032ddc0" : "gMarioSpawnInfo", - "8032ddc4" : "gLoadedGraphNodes", - "8032ddc8" : "gAreas", - "8032ddcc" : "gCurrentArea", - "8032ddd0" : "gCurrCreditsEntry", - "8032ddd4" : "D_8032CE74", - "8032ddd8" : "D_8032CE78", - "8032dddc" : "gWarpTransDelay", - "8032dde0" : "gFBSetColor", - "8032dde4" : "gWarpTransFBSetColor", - "8032dde8" : "gWarpTransRed", - "8032ddec" : "gWarpTransGreen", - "8032ddf0" : "gWarpTransBlue", - "8032ddf4" : "gCurrSaveFileNum", - "8032ddf8" : "gCurrLevelNum", - "8032ddfc" : "D_8032CE9C", - "8032de4c" : "D_8032CEEC", - "8032de60" : "D_8032CF00", - "8032de70" : "renderModeTable_1Cycle", - "8032deb0" : "renderModeTable_2Cycle", - "8032def0" : "gCurGraphNodeRoot", - "8032def4" : "gCurGraphNodeMasterList", - "8032def8" : "gCurGraphNodeCamFrustum", - "8032defc" : "gCurGraphNodeCamera", - "8032df00" : "gCurGraphNodeObject", - "8032df04" : "gCurGraphNodeHeldObject", - "8032df08" : "gAreaUpdateCounter", - "8032df10" : "gProfilerMode", - "8032df14" : "gCurrentFrameIndex1", - "8032df18" : "gCurrentFrameIndex2", - "8032df20" : "unused_8032CFC0", - "8032df24" : "gCutsceneFocus", - "8032df28" : "unused_8032CFC8", - "8032df2c" : "unused_8032CFCC", - "8032df30" : "gSecondCameraFocus", - "8032df34" : "D_8032CFD4", - "8032df38" : "gCurrLevelArea", - "8032df3c" : "gPrevLevel", - "8032df40" : "D_8032CFE0", - "8032df44" : "D_8032CFE4", - "8032df48" : "D_8032CFE8", - "8032df4c" : "gCameraZoomDist", - "8032df50" : "sTempCutsceneNumber", - "8032df54" : "gCutsceneNumber", - "8032df58" : "sCutsceneTransitionTimer", - "8032df5c" : "D_8032CFFC", - "8032df60" : "sMarioStatusForCamera", - "8032df64" : "sLuigiStatusForCamera", - "8032df68" : "D_8032D008", - "8032df6c" : "sFixedPresetBasePosition", - "8032df78" : "D_8032D00C_2", - "8032df84" : "D_8032D00C_3", - "8032df90" : "D_8032D00C_4", - "8032df9c" : "D_8032D00C_5", - "8032dfa8" : "TableCameraTransitions", - "8032e008" : "unused_8032D0A8", - "8032e010" : "unused_8032D0B0", - "8032e018" : "D_8032D0B8", - "8032e050" : "BBHRoom6ParallelTrackingTable", - "8032e098" : "TableCameraSL", - "8032e0e0" : "TableCameraTHI", - "8032e128" : "TableCameraHMC", - "8032e1d0" : "TableCameraSSL", - "8032e248" : "TableCameraRR", - "8032e338" : "TableCameraCotMC", - "8032e368" : "TableCameraCCM", - "8032e3b0" : "TableCameraInside", - "8032e6f8" : "TableCameraBBH", - "8032ecb0" : "TableLevelCinematicCamera", - "8032ed50" : "sIntroStartToPipePosition", - "8032ee08" : "sIntroStartToPipeFocus", - "8032eec0" : "sIntroPipeToDialogPosition", - "8032ef30" : "sIntroPipeToDialogFocus", - "8032efa0" : "D_8032E040", - "8032eff0" : "D_8032E090", - "8032f048" : "D_8032E0E8", - "8032f0e8" : "D_8032E188", - "8032f130" : "D_8032E1D0", - "8032f178" : "D_8032E218", - "8032f1b8" : "D_8032E258", - "8032f214" : "gIntroLakituStartToPipeFocus", - "8032f32c" : "gIntroLakituStartToPipeOffsetFromCamera", - "8032f444" : "D_8032E4E4", - "8032f48c" : "D_8032E52C", - "8032f4d4" : "TableCutscenePeachEnd", - "8032f534" : "TableCutsceneGrandStar", - "8032f544" : "TableCutscene0FTodo", - "8032f554" : "TableCutsceneDoorWarp", - "8032f564" : "TableCutsceneEndWaving", - "8032f56c" : "TableCutsceneCredits", - "8032f574" : "TableCutsceneDoor00", - "8032f59c" : "TableCutsceneDoor01", - "8032f5c4" : "TableCutsceneDoor0A", - "8032f5dc" : "TableCutsceneDoor0B", - "8032f5f4" : "TableCutsceneEnterCannon", - "8032f60c" : "TableCutsceneStarSpawn", - "8032f624" : "TableCutsceneSpecialStarSpawn", - "8032f634" : "TableCutsceneEnterPainting", - "8032f63c" : "TableCutsceneDeathExit", - "8032f64c" : "TableCutsceneExitPaintingSuccess", - "8032f65c" : "TableCutscene11Todo", - "8032f674" : "TableCutsceneIntroPeach", - "8032f69c" : "TableCutscenePrepareCannon", - "8032f6ac" : "TableCutsceneExitWaterfall", - "8032f6bc" : "TableCutsceneFallToCastleGrounds", - "8032f6cc" : "TableCutsceneEnterPyramidTop", - "8032f6dc" : "TableCutscene26Todo", - "8032f6f4" : "TableCutsceneStandingDeath", - "8032f6fc" : "TableCutsceneEnterPool", - "8032f70c" : "TableCutsceneDeath2", - "8032f714" : "TableCutsceneDeathOnBack", - "8032f71c" : "TableCutsceneQuicksandDeath", - "8032f72c" : "TableCutsceneSuffocationDeath", - "8032f734" : "TableCutsceneEnterBowserPlatform", - "8032f74c" : "TableCutsceneStarDance1", - "8032f754" : "TableCutsceneStarDance2", - "8032f75c" : "TableCutsceneStarDance3", - "8032f764" : "TableCutsceneKeyDance", - "8032f76c" : "TableCutsceneCapSwitchPress", - "8032f774" : "TableCutsceneSlidingDoorsOpen", - "8032f784" : "TableCutsceneUnlockKeyDoor", - "8032f794" : "TableCutsceneExitBowserSuccess", - "8032f7a4" : "TableCutscene1CTodo", - "8032f7b4" : "TableCutsceneBBHExitSuccess", - "8032f7c4" : "TableCutsceneNonPaintingDeath", - "8032f7d4" : "TableCutsceneDialog", - "8032f7ec" : "TableCutsceneReadMessage", - "8032f804" : "D_8032E8A4", - "8032f870" : "D_8032E910", - "8032f884" : "sBobCreditsCameraPositions", - "8032f8ac" : "sBobCreditsCameraFocus", - "8032f8d4" : "sWfCreditsCameraPositions", - "8032f8fc" : "sWfCreditsCameraFocus", - "8032f924" : "sJrbCreditsCameraPositions", - "8032f94c" : "sJrbCreditsCameraFocus", - "8032f974" : "sCcmSlideCreditsCameraPositions", - "8032f99c" : "sCcmSlideCreditsCameraFocus", - "8032f9c4" : "sBbhCreditsCameraPositions", - "8032f9e4" : "sBbhCreditsCameraFocus", - "8032fa04" : "sHmcCreditsCameraPositions", - "8032fa2c" : "sHmcCreditsCameraFocus", - "8032fa54" : "sThiWigglerCreditsCameraPositions", - "8032fa6c" : "sThiWigglerCreditsCameraFocus", - "8032fa84" : "sVolcanoCreditsCameraPositions", - "8032fab4" : "sVolcanoCreditsCameraFocus", - "8032fae4" : "sSslCreditsCameraPositions", - "8032fb14" : "sSslCreditsCameraFocus", - "8032fb44" : "sDddCreditsCameraPositions", - "8032fb7c" : "sDddCreditsCameraFocus", - "8032fbb4" : "sSlCreditsCameraPositions", - "8032fbd4" : "sSlCreditsCameraFocus", - "8032fbf4" : "sWdwCreditsCameraPositions", - "8032fc14" : "sWdwCreditsCameraFocus", - "8032fc34" : "sTtmCreditsCameraPositions", - "8032fc64" : "sTtmCreditsCameraFocus", - "8032fc94" : "sThiHugeCreditsCameraPositions", - "8032fccc" : "sThiHugeCreditsCameraFocus", - "8032fd04" : "sTtcCreditsCameraPositions", - "8032fd24" : "sTtcCreditsCameraFocus", - "8032fd44" : "sRrCreditsCameraPositions", - "8032fd64" : "sRrCreditsCameraFocus", - "8032fd84" : "sSaCreditsCameraPositions", - "8032fdac" : "sSaCreditsCameraFocus", - "8032fdd4" : "sCotmcCreditsCameraPositions", - "8032fdfc" : "sCotmcCreditsCameraFocus", - "8032fe24" : "sDddSubCreditsCameraPositions", - "8032fe4c" : "sDddSubCreditsCameraFocus", - "8032fe74" : "sCcmOutsideCreditsCameraPositions", - "8032fe94" : "sCcmOutsideCreditsCameraFocus", - "8032fec0" : "sObjectListUpdateOrder", - "8032fecc" : "sParticleTypes", - "80330000" : "D_8032F0A0", - "80330004" : "D_8032F0A4", - "80330020" : "D_8032F0C0", - "8033002c" : "D_8032F0CC", - "8033006c" : "sMrIParticleActions", - "80330074" : "sMrIActions", - "80330084" : "sMrIHitbox", - "80330094" : "D_8032F134", - "803300a8" : "unused8032F134", - "803300ac" : "sCapSwitchActions", - "803300bc" : "sKingBobombActions", - "803300e0" : "sKingBobombSoundStates", - "80330140" : "sOpenedCannonActions", - "8033015c" : "unused0EA1FC", - "80330198" : "sChuckyaActions", - "803301a8" : "sWFRotatingPlatformData", - "803301c0" : "sKoopaShellUnderwaterHitbox", - "803301d0" : "D_8032F270", - "803301e4" : "sSparkleSpawnStarHitbox", - "803301f4" : "sYellowCoinHitbox", - "80330204" : "D_8032F2A4", - "80330224" : "sCoinInsideBooActions", - "8033022c" : "D_8032F2CC", - "80330244" : "D_8032F2E4", - "80330260" : "D_8032F300", - "80330288" : "D_8032F328", - "80330290" : "D_8032F330", - "80330298" : "sGrindelThwompActions", - "803302ac" : "sTumblingBridgeParams", - "803302dc" : "sTumblingBridgeActions", - "803302ec" : "D_8032F38C", - "80330318" : "sElevatorActions", - "8033032c" : "D_8032F3CC", - "80330340" : "D_8032F3E0", - "80330354" : "D_8032F3F4", - "8033035c" : "D_8032F3FC", - "80330370" : "sUkikiCageActions", - "80330380" : "D_8032F420", - "80330390" : "sSpindriftHitbox", - "803303a0" : "sMetalBoxHitbox", - "803303b0" : "sBreakableBoxHitbox", - "803303c0" : "D_8032F460", - "803303e8" : "sHeaveHoActions", - "803303f8" : "sJumpingBoxHitbox", - "80330408" : "sJumpingBoxActions", - "8033042c" : "sBowserKeyHitbox", - "8033043c" : "sBulletBillActions", - "80330450" : "sBowserTailAnchorActions", - "8033045c" : "D_8032F4FC", - "8033046c" : "D_8032F50C", - "80330470" : "D_8032F510", - "80330474" : "D_8032F514", - "80330478" : "sBowserDefeatedDialogText", - "80330480" : "D_8032F520", - "803304c8" : "sBowserActions", - "80330518" : "D_8032F5B8", - "803305f0" : "D_8032F690", - "803305f4" : "D_8032F694", - "803305f8" : "D_8032F698", - "8033067c" : "sFallingBowserPlatformActions", - "80330688" : "sGrowingBowserFlameHitbox", - "80330698" : "sBowserFlameHitbox", - "803306a8" : "D_8032F748", - "803306b4" : "D_8032F754", - "803306dc" : "sCageUkikiPath", - "80330738" : "sUkikiSoundStates", - "803307a0" : "sUkikiActions", - "803307c0" : "D_8032F860", - "803307f4" : "D_8032F894", - "80330828" : "D_8032F8C8", - "80330830" : "sRotatingCwFireBarsActions", - "80330840" : "sKoopaShellHitbox", - "80330850" : "D_8032F8F0", - "80330884" : "D_8032F924", - "803308a8" : "D_8032F948", - "803308cc" : "D_8032F96C", - "803308d8" : "sToxBoxActions", - "80330900" : "TablePiranhaPlantActions", - "80330b1c" : "sBowserPuzzlePieceActions", - "80330b38" : "sTuxiesMotherActions", - "80330b44" : "sSmallPenguinActions", - "80330b5c" : "sFishActions", - "80330b68" : "sFishGroupActions", - "80330b74" : "sBirdChirpChirpActions", - "80330b84" : "sCheepCheepActions", - "80330b90" : "sExclamationBoxHitbox", - "80330ba0" : "sExclamationBoxContents", - "80330c20" : "sExclamationBoxActions", - "80330c38" : "sSkullSlidingBoxHitbox", - "80330c48" : "D_8032FCE8", - "80330c58" : "sTweesterHitbox", - "80330c68" : "sTweesterActions", - "80330cd4" : "sScuttlebugHitbox", - "80330ce4" : "sWhompActions", - "80330d0c" : "D_8032FDAC", - "80330d30" : "D_8032FDD0", - "80330d54" : "D_8032FDF4", - "80330d78" : "D_8032FE18", - "80330d9c" : "sWindParticleHitbox", - "80330dac" : "D_8032FE4C", - "80330e20" : "D_8032FEC0", - "80330e24" : "unused_8032FEC4", - "80330e34" : "gMarioPlatform", - "80330e40" : "sDebugEffectStringInfo", - "80330e64" : "sDebugEnemyStringInfo", - "80330e88" : "sDebugInfoDPadMask", - "80330e8c" : "sDebugInfoDPadUpdID", - "80330e90" : "sDebugLvSelectCheckFlag", - "80330e94" : "sDebugPage", - "80330e98" : "sNoExtraDebug", - "80330e9c" : "sDebugStringArrPrinted", - "80330ea0" : "sDebugSysCursor", - "80330ea4" : "sDebugInfoButtonSeqID", - "80330ea8" : "sDebugInfoButtonSeq", - "80330ec0" : "D_8032FF60", - "80330ec4" : "D_8032FF64", - "80330ec8" : "D_8032FF68", - "80330ee0" : "rectangles", - "80330f00" : "sSkyboxTextures", - "80330f28" : "sSkyboxColors", - "80330f30" : "gMovtexCounter", - "80330f34" : "gMovtexCounterPrev", - "80330f38" : "gMovtexVtxColor", - "80330f3c" : "gPaintingMarioYEntry", - "80330f40" : "gWdwWaterLevelSet", - "80330f44" : "gMovtexIdToTexture", - "80330f64" : "gMovtexNonColored", - "803311a4" : "gMovtexColored", - "8033127c" : "gMovtexColored2", - "80331300" : "hmcPaintings", - "80331308" : "insideCastlePaintings", - "80331344" : "ttmPaintings", - "8033134c" : "paintingGroups", - "80331358" : "gPaintingUpdateCounter", - "8033135c" : "gLastPaintingUpdateCounter", - "80331360" : "sTextLabelsCount", - "80331370" : "gDialogCharWidths", - "80331470" : "gDialogBoxState", - "80331474" : "gDialogBoxOpenTimer", - "80331478" : "gDialogBoxScale", - "8033147c" : "gDialogScrollOffsetY", - "80331480" : "gDialogBoxType", - "80331484" : "gDialogID", - "80331488" : "gLastDialogPageStrPos", - "8033148c" : "gDialogTextPos", - "80331490" : "gDialogLineNum", - "80331494" : "gLastDialogResponse", - "80331498" : "gMenuHoldKeyIndex", - "8033149c" : "gMenuHoldKeyTimer", - "803314a0" : "gDialogResponse", - "803314b0" : "gHudSymCoin", - "803314b4" : "gHudSymX", - "803314f8" : "gMenuMode", - "803314fc" : "gEndCutsceneStrEn0", - "80331504" : "gEndCutsceneStrEn1", - "80331538" : "gEndCutsceneStrEn2", - "80331558" : "gEndCutsceneStrEn3", - "8033156c" : "gEndCutsceneStrEn4", - "80331598" : "gEndCutsceneStrEn5", - "803315ac" : "gEndCutsceneStrEn6", - "803315cc" : "gEndCutsceneStrEn7", - "803315dc" : "gEndCutsceneStrEn8", - "803315e4" : "gEndCutsceneStringsEn", - "8033160c" : "gCutsceneMsgFade", - "80331610" : "gCutsceneMsgIndex", - "80331614" : "gCutsceneMsgDuration", - "80331618" : "gCutsceneMsgTimer", - "8033161c" : "gDialogCameraAngleIndex", - "80331620" : "gDialogCourseActNum", - "803316c8" : "gCourseCompleteCoinsEqual", - "803316cc" : "gCourseDoneMenuTimer", - "803316d0" : "gCourseCompleteCoins", - "803316d4" : "gHudFlash", - "80331750" : "gEnvFxMode", - "80331754" : "D_80330644", - "80331758" : "gSnowTempVtx", - "80331788" : "gSnowFlakeVertex1", - "80331790" : "gSnowFlakeVertex2", - "80331798" : "gSnowFlakeVertex3", - "803317a0" : "D_80330690", - "803317a4" : "D_80330694", - "803317a8" : "gBubbleTempVtx", - "803317e0" : "MacroObjectPresets", - "803325fc" : "sPowerMeterVisibleTimer", - "80332610" : "D_80331500", - "80332614" : "D_80331504", - "80332618" : "D_80331508", - "8033261c" : "D_8033150C", - "80332620" : "D_80331510", - "803327a8" : "sBreakableBoxSmallHitbox", - "80332b00" : "sMrBlizzardHitbox", - "80332b10" : "D_80331A00", - "80332b24" : "sMrBlizzardSnowballHitbox", - "80332b34" : "D_80331A24", - "80332b54" : "D_80331A44", - "80332b5c" : "D_80331A4C", - "80332b64" : "D_80331A54", - "80332bdc" : "D_80331ACC", - "80332bf0" : "sRecoveryHeartHitbox", - "80332c00" : "sUnagiHitbox", - "80332c10" : "sHauntedChairHitbox", - "80332c30" : "sFlyingBookendHitbox", - "80332c40" : "D_80331B30", - "80332c4c" : "sBookSwitchHitbox", - "80332c5c" : "sFirePiranhaPlantHitbox", - "80332c6c" : "D_80331B5C", - "80332c74" : "sPiranhaPlantFireHitbox", - "80332c84" : "sSnufitHitbox", - "80332c94" : "sSnufitBulletHitbox", - "80332ca4" : "sEyerokHitbox", - "80332cb4" : "D_80331BA4", - "80332d10" : "D_80331C00", - "80332d28" : "sClamShellHitbox", - "80332d38" : "sSkeeterHitbox", - "80332d48" : "D_80331C38", - "80332e50" : "gAudioErrorFlags", - "80332e54" : "sGameLoopTicked", - "80332e58" : "sDialogSpeaker", - "80332f04" : "sDialogSpeakerVoice", - "80332f40" : "sNumProcessedSoundRequests", - "80332f44" : "sSoundRequestCount", - "80332f48" : "sDynBbh", - "80332f54" : "sDynDdd", - "80332f6c" : "sDynJrb", - "80332f88" : "sDynWdw", - "80332f98" : "sDynHmc", - "80332fa8" : "sDynUnk38", - "80332fb8" : "sDynNone", - "80332fbc" : "sCurrentMusicDynamic", - "80332fc0" : "sBackgroundMusicForDynamics", - "80332fc4" : "sLevelDynamics", - "80333060" : "sMusicDynamics", - "803330c0" : "gAreaEchoLevel", - "80333138" : "D_80332028", - "80333188" : "sBackgroundMusicDefaultVolume", - "803331ac" : "gPlayer0CurSeqId", - "803331b0" : "sMusicDynamicDelay", - "803331b4" : "D_803320A4", - "803331c0" : "D_803320B0", - "803331cc" : "D_803320BC", - "803331d8" : "D_803320C8", - "803331e4" : "sNumSoundsPerBank", - "803331f0" : "gDefaultSoundArgs", - "803331fc" : "gUnusedSoundArgs", - "80333208" : "gSoundBankDisabled", - "80333218" : "D_80332108", - "8033321c" : "sHasStartedFadeOut", - "80333220" : "D_80332110", - "80333224" : "sUnused80332114", - "80333228" : "sUnused80332118", - "8033322c" : "D_8033211C", - "80333230" : "D_80332120", - "80333234" : "D_80332124", - "80333238" : "sBackgroundMusicQueueSize", - "8033323c" : "sUnused8033323C", - "803332a0" : "gAudioSessionPresets", - "80333498" : "gAudioCosineTable", - "80333598" : "gPitchBendFrequencyScale", - "80333994" : "gNoteFrequencies", - "80333b94" : "gDefaultShortNoteVelocityTable", - "80333ba4" : "gDefaultShortNoteDurationTable", - "80333bb4" : "gVibratoCurve", - "80333bc4" : "gDefaultEnvelope", - "80333bd0" : "sSineWave", - "80333c50" : "sSquareWave", - "80333cd0" : "sTriangleWave", - "80333d50" : "sSawtoothWave", - "80333dd0" : "gWaveSamples", - "80333de0" : "gHeadsetPanQuantization", - "80333df4" : "gHeadsetPanVolume", - "80333ff4" : "gStereoPanVolume", - "803341f4" : "gDefaultPanVolume", - "803343f4" : "gVolRampingLhs136", - "803345f4" : "gVolRampingRhs136", - "803347f4" : "gVolRampingLhs144", - "803349f4" : "gVolRampingRhs144", - "80334bf4" : "gVolRampingLhs128", - "80334df4" : "gVolRampingRhs128", - "80334ff4" : "gTatumsPerBeat", - "80334ff8" : "gUnusedCount80333EE8", - "80334ffc" : "gAudioHeapSize", - "80335000" : "D_80333EF0", - "80335004" : "gAudioLoadLock", - "80335008" : "sUnused8033EF8", - "80335010" : "osViModeTable", - "803358d0" : "viMgrMainArgs", - "803358f0" : "piMgrArgs", - "80335910" : "osClockRate", - "80335918" : "D_80334808", - "80335920" : "D_80334810", - "80335930" : "D_80334820", - "80335940" : "D_80334830", - "80335950" : "_spaces", - "80335974" : "_zeroes", - "803359a0" : "D_80334890", - "803359a4" : "unknown", - "803359a8" : "D_80334898", - "803359ac" : "D_8033489C", - "803359b0" : "D_803348A0", - "803359b4" : "D_803348A4", - "803359c0" : "D_803348B0", - "80335a20" : "D_80334910", - "80335a24" : "D_80334914", - "80335a28" : "D_80334918", - "80335a2c" : "D_8033491C", - "80335a30" : "D_80334920", - "80335a44" : "D_80334934", - "80335a48" : "D_80334938", - "80335a50" : "gOsPiAccessQueueCreated", - "80335a60" : "gOsSiAccessQueueCreated", - "80335aa0" : "D_80334990", - "80335af0" : "D_803349E0", - "80335b40" : "D_80334A30", - "80335b44" : "D_80334A34", - "80335b48" : "D_80334A38", - "80335b50" : "D_80334A40", - "80335b54" : "D_80334A44", - "80338da0" : "D_80337BB0", - "80338da8" : "D_80337BB8", - "80338e60" : "jtbl_80337C90", - "80338e84" : "jtbl_80337CB4", - "80338eac" : "jtbl_80337CDC", - "80338ec0" : "jtbl_80337D08", - "80338fbc" : "jtbl_80337E04", - "8033978c" : "jtbl_80338418", - "80339880" : "length_str", - "80339884" : "flags_str", - "8033988c" : "flags_arr", - "80339980" : "D_80338610", - "803399a0" : "jtbl_80338630", - "803399d0" : "NAN", - "803399e0" : "D_80338670", - "80339a40" : "D_803386D0", - "80339ac0" : "rspF3DDataStart", - "8033a2c0" : "rspF3DDataEnd", - "8033a2c0" : "rspAspMainDataStart", - "8033a580" : "rspAspMainDataEnd", - "8033a580" : "_mainSegmentEnd", - "008c0c40" : "_mainSegmentRomEnd", - "8033a580" : "_mainSegmentNoloadStart", - "8033a580" : "D_80339210", - "8033a730" : "gIdleThread", - "8033a8e0" : "gMainThread", - "8033aa90" : "gGameLoopThread", - "8033ac40" : "gSoundThread", - "8033adf0" : "gPIMesgQueue", - "8033ae08" : "gIntrMesgQueue", - "8033ae20" : "gSPTaskMesgQueue", - "8033ae38" : "gDmaMesgBuf", - "8033ae40" : "gPIMesgBuf", - "8033aec0" : "gSIEventMesgBuf", - "8033aec8" : "gIntrMesgBuf", - "8033af08" : "gUnknownMesgBuf", - "8033af48" : "gDmaIoMesg", - "8033af5c" : "D_80339BEC", - "8033af60" : "gDmaMesgQueue", - "8033af78" : "gSIEventMesgQueue", - "8033af90" : "gControllers", - "8033afe8" : "gControllerStatuses", - "8033aff8" : "gControllerPads", - "8033b010" : "gGameVblankQueue", - "8033b028" : "D_80339CB8", - "8033b040" : "D_80339CD0", - "8033b044" : "D_80339CD4", - "8033b048" : "gGameVblankHandler", - "8033b050" : "gPhysicalFrameBuffers", - "8033b05c" : "gPhysicalZBuffer", - "8033b060" : "D_80339CF0", - "8033b064" : "D_80339CF4", - "8033b068" : "gGfxSPTask", - "8033b06c" : "gDisplayListHead", - "8033b070" : "gGfxPoolEnd", - "8033b074" : "gGfxPool", - "8033b078" : "gControllerBits", - "8033b079" : "gEepromProbe", - "8033b080" : "D_80339D10", - "8033b090" : "gDemo", - "8033b0a0" : "filler80339D30", - "8033b170" : "gMarioStates", - "8033b238" : "sCurrPlayMode", - "8033b23a" : "D_80339ECA", - "8033b23c" : "sTransitionTimer", - "8033b240" : "sTransitionUpdate", - "8033b244" : "unused3", - "8033b248" : "sWarpDest", - "8033b250" : "D_80339EE0", - "8033b252" : "sDelayedWarpOp", - "8033b254" : "sDelayedWarpTimer", - "8033b256" : "sSourceWarpNodeId", - "8033b258" : "sDelayedWarpArg", - "8033b25c" : "unused4", - "8033b25e" : "sTimerRunning", - "8033b260" : "gHudDisplay", - "8033b26e" : "gShouldNotPlayCastleMusic", - "8033b270" : "sDelayInvincTimer", - "8033b272" : "sInvulnerable", - "8033b280" : "unused80339F10", - "8033b288" : "filler80339F1C", - "8033b2c0" : "D_80339F50", - "8033b350" : "D_80339FE0", - "8033b3b0" : "gBodyStates", - "8033b494" : "D_8033A124", - "8033b4a0" : "gWarpCheckpoint", - "8033b4a5" : "gMainMenuDataModified", - "8033b4a6" : "gSaveFileModified", - "8033b4b0" : "gPlayerSpawnInfos", - "8033b4d0" : "D_8033A160", - "8033b8d0" : "gAreaData", - "8033bab0" : "gWarpTransition", - "8033bac6" : "gCurrCourseNum", - "8033bac8" : "gCurrActNum", - "8033baca" : "gCurrAreaIndex", - "8033bacc" : "gSavedCourseNum", - "8033bace" : "gPauseScreenMode", - "8033bad0" : "gSaveOptSelectIndex", - "8033bae0" : "gMatStackIndex", - "8033bae8" : "gMatStack", - "8033c2e8" : "gMatStackFixed", - "8033c368" : "gGeoTempState", - "8033c378" : "gCurAnimType", - "8033c379" : "gCurAnimEnabled", - "8033c37a" : "gCurrAnimFrame", - "8033c37c" : "gCurAnimTranslationMultiplier", - "8033c380" : "gCurrAnimAttribute", - "8033c384" : "gCurAnimData", - "8033c388" : "gDisplayListHeap", - "8033c390" : "gProfilerFrameData", - "8033c520" : "gPlayerStatusForCamera", - "8033c568" : "sCameraPosition", - "8033c578" : "sCameraFocus", - "8033c588" : "D_8033B218", - "8033c594" : "sCreditsCameraPitch", - "8033c596" : "sCreditsCameraYaw", - "8033c598" : "gFramesPaused", - "8033c5a0" : "D_8033B230", - "8033c5c0" : "sCameraTransition", - "8033c5e8" : "sGeometryForMario", - "8033c61c" : "unused_8033B2AC", - "8033c61e" : "sCameraYawVelocity", - "8033c620" : "sCameraYawAfterDoorCutscene", - "8033c622" : "unused_spline_pitch", - "8033c624" : "unused_spline_yaw", - "8033c628" : "sSplineParameters", - "8033c668" : "sSplineParameterMax", - "8033c66c" : "sPositionAlongSpline", - "8033c670" : "sSplinePositionLimit", - "8033c674" : "sCameraCutscenePitchOffset", - "8033c676" : "sCameraCutsceneYawOffset", - "8033c678" : "sCameraCutsceneRollOffset", - "8033c67c" : "unused_8033B30C", - "8033c680" : "unused_8033B310", - "8033c684" : "gCameraModeFlags", - "8033c686" : "unused_8033B316", - "8033c688" : "sCameraSideCFlags", - "8033c68a" : "unused_8033B31A", - "8033c68c" : "gCameraFlags1", - "8033c68e" : "gCButtonsPressed", - "8033c690" : "D_8033B320", - "8033c698" : "gCameraStatus", - "8033c758" : "unused_8033B3E8", - "8033c75a" : "sYawFocToMario", - "8033c75c" : "D_8033B3EC", - "8033c75e" : "D_8033B3EE", - "8033c760" : "D_8033B3F0", - "8033c764" : "D_8033B3F4", - "8033c768" : "sCSideButtonYaw", - "8033c76a" : "D_8033B3FA", - "8033c76c" : "D_8033B3FC", - "8033c770" : "sFirstPersonCameraPitch", - "8033c772" : "sFirstPersonCameraYaw", - "8033c774" : "D_8033B404", - "8033c776" : "sPlatformLevelPresetBaseYaw", - "8033c778" : "gPlatformLevelYawOffset", - "8033c77c" : "D_8033B40C", - "8033c780" : "D_8033B410", - "8033c788" : "D_8033B418", - "8033c7d0" : "sFixedPresetBasePositionOffset", - "8033c7dc" : "D_8033B46C", - "8033c7e0" : "D_8033B470", - "8033c7e8" : "D_8033B478", - "8033c808" : "D_8033B498", - "8033c828" : "D_8033B4B8", - "8033c848" : "gCameraMovementFlags", - "8033c84a" : "gCameraFlags2", - "8033c850" : "D_8033B4E0", - "8033c950" : "D_8033B5E0", - "8033ca50" : "sCutsceneSplineSegment", - "8033ca54" : "sCutsceneSplineSegmentProgress", - "8033ca58" : "D_8033B6E8", - "8033ca5a" : "D_8033B6EA", - "8033ca5c" : "gCutsceneTimer", - "8033ca60" : "D_8033B6F0", - "8033cbc8" : "gCutsceneActive", - "8033cbcc" : "sCutscenePhase", - "8033cbd0" : "gCurrLevelCamera", - "8033cbe0" : "gObjectListArray", - "8033d260" : "gDebugInfoFlags", - "8033d264" : "gNumFindFloorMisses", - "8033d268" : "unused_8033BEF8", - "8033d26c" : "gUnknownWallCount", - "8033d270" : "gObjectCounter", - "8033d274" : "gNumCalls", - "8033d280" : "gDebugInfo", - "8033d380" : "gDebugInfoOverwrite", - "8033d480" : "gTimeStopState", - "8033d488" : "gObjectPool", - "80360e88" : "gMacroObjectDefaultParent", - "803610e8" : "gObjectLists", - "803610f0" : "gFreeObjectList", - "80361158" : "gMarioObject", - "8036115c" : "gLuigiObject", - "80361160" : "gCurrentObject", - "80361164" : "gBehCommand", - "80361168" : "gPrevFrameObjectCount", - "8036116c" : "gSurfaceNodesAllocated", - "80361170" : "gSurfacesAllocated", - "80361174" : "gNumStaticSurfaceNodes", - "80361178" : "gNumStaticSurfaces", - "8036117c" : "gObjectMemoryPool", - "80361180" : "gCheckingSurfaceCollisionsForCamera", - "80361182" : "gFindFloorIncludeSurfaceIntangible", - "80361184" : "gEnvironmentRegions", - "80361188" : "gEnvironmentLevels", - "803611d8" : "gDoorAdjacentRooms", - "80361250" : "gMarioCurrentRoom", - "80361252" : "D_8035FEE2", - "80361254" : "D_8035FEE4", - "80361256" : "gTHIWaterDrained", - "80361258" : "gTTCSpeedSetting", - "8036125a" : "gMarioShotFromCannon", - "8036125c" : "gCCMEnteredSlide", - "8036125e" : "gNumRoomedObjectsInMarioRoom", - "80361260" : "gNumRoomedObjectsNotInMarioRoom", - "80361262" : "gWDWWaterLevelChanging", - "80361264" : "gMarioOnMerryGoRound", - "80361270" : "sGrabReleaseState", - "80361280" : "D_8035FF10", - "80361290" : "gDebugPrintState1", - "803612a0" : "gDebugPrintState2", - "803612b0" : "sMarioOnFlyingCarpet", - "803612b2" : "sSurfaceTypeBelowShadow", - "803612b4" : "gShadowAboveWaterOrLava", - "803612b5" : "gMarioOnIceOrCarpet", - "803612c0" : "sSkyBoxInfo", - "803612e0" : "gMovetexLastTextureId", - "803612f0" : "gFlyingCarpetState", - "80361300" : "gPaintingMarioFloorType", - "80361304" : "gPaintingMarioXPos", - "80361308" : "gPaintingMarioYPos", - "8036130c" : "gPaintingMarioZPos", - "80361310" : "D_8035FFA0", - "80361314" : "D_8035FFA4", - "80361318" : "ripplingPainting", - "8036131c" : "dddStatus", - "80361320" : "sTextLabels", - "803613f0" : "gDialogColorFadeTimer", - "803613f2" : "gLastDialogLineNum", - "803613f4" : "gDialogVariable", - "803613f8" : "gDialogTextAlpha", - "803613fa" : "gCutsceneMsgXOffset", - "803613fc" : "gCutsceneMsgYOffset", - "803613fe" : "gRedCoinsCollected", - "80361400" : "gEnvFxBuffer", - "80361408" : "gSnowCylinderLastPos", - "80361414" : "gSnowParticleCount", - "80361416" : "gSnowParticleMaxCount", - "80361420" : "gEnvFxBubbleConfig", - "80361450" : "D_803600E0", - "80361460" : "sNumActiveFirePiranhaPlants", - "80361464" : "sNumKilledFirePiranhaPlants", - "80361468" : "sObjSavedPosX", - "8036146c" : "sObjSavedPosY", - "80361470" : "sObjSavedPosZ", - "80361474" : "sMontyMoleHoleList", - "80361478" : "sMontyMoleKillStreak", - "8036147c" : "sMontyMoleLastKilledPosX", - "80361480" : "sMontyMoleLastKilledPosY", - "80361484" : "sMontyMoleLastKilledPosZ", - "80361488" : "sMasterTreadmill", - "80361490" : "gCurrAiBuffer", - "80361498" : "sSoundRequests", - "80361c98" : "D_80360928", - "80361f98" : "D_80360C28", - "80361fa8" : "D_80360C38", - "80361fb8" : "gSoundBanks", - "80364b78" : "D_80363808", - "80364b82" : "D_80363812", - "80364b88" : "sBackgroundMusicQueue", - "80364ba0" : "D_80363830", - "80364c20" : "D_803638B0", - "80364c60" : "viMgrThread", - "80364e10" : "viMgrStack", - "80365e10" : "__osViMesgQueue", - "80365e28" : "viMgrMesgBuff", - "80365e40" : "viEventViMesg", - "80365e58" : "viEventCounterMesg", - "80365e70" : "piMgrThread", - "80366020" : "piMgrStack", - "80367020" : "__osPiMesgQueue", - "80367038" : "piMgrMesgBuff", - "80367040" : "D_80365CD0", - "80367050" : "D_80365CE0", - "8036708c" : "D_80365D1C", - "80367090" : "D_80365D20", - "80367091" : "_osCont_numControllers", - "80367098" : "D_80365D28", - "803670b8" : "_osContMesgQueue", - "803670d0" : "_osContMesgBuff", - "803670f0" : "D_80365D80", - "80367110" : "_osCurrentTime", - "80367118" : "D_80365DA8", - "8036711c" : "D_80365DAC", - "80367120" : "D_80365DB0", - "80367130" : "osPiMesgBuff", - "80367138" : "gOsPiMessageQueue", - "80367150" : "osSiMesgBuff", - "80367158" : "gOsSiMessageQueue", - "80367170" : "D_80365E00", - "803671ac" : "D_80365E3C", - "803671b0" : "D_80365E40", - "803672b0" : "gInterruptedThread", - "80367460" : "_mainSegmentNoloadEnd", - "0000cee0" : "_mainSegmentNoloadSizeLo", - "00000002" : "_mainSegmentNoloadSizeHi", - "00000001" : "ASSERT", - "80378800" : "_engineSegmentStart", - "007cc6c0" : "_engineSegmentRomStart", - "80378800" : "vec3f_copy", - "80378840" : "vec3f_set", - "8037888c" : "vec3f_add", - "803788e4" : "vec3f_sum", - "8037893c" : "vec3s_copy", - "8037897c" : "vec3s_set", - "803789c8" : "vec3s_add", - "80378a20" : "vec3s_sum", - "80378a78" : "vec3s_sub", - "80378ad0" : "vec3s_to_vec3f", - "80378b34" : "vec3f_to_vec3s", - "80378c50" : "find_vector_perpendicular_to_plane", - "80378d38" : "vec3f_cross", - "80378dc0" : "vec3f_normalize", - "80378e68" : "mtxf_copy", - "80378eb4" : "mtxf_identity", - "80378f24" : "mtxf_translate", - "80378f84" : "mtxf_lookat", - "80379440" : "mtxf_rotate_zxy_and_translate", - "803795f0" : "mtxf_rotate_xyz_and_translate", - "80379798" : "mtxf_billboard", - "80379918" : "mtxf_align_terrain_normal", - "80379aa4" : "mtxf_align_terrain_triangle", - "80379f60" : "mtxf_mul", - "8037a29c" : "mtxf_scale_vec3f", - "8037a348" : "mtxf_mul_vec3s", - "8037a434" : "mtxf_to_mtx", - "8037a4b8" : "mtxf_rotate_xy", - "8037a550" : "get_pos_from_transform_mtx", - "8037a69c" : "vec3f_get_dist_and_angle", - "8037a788" : "vec3f_set_dist_and_angle", - "8037a860" : "approach_s32", - "8037a8b4" : "approach_f32", - "8037a9a8" : "atan2s", - "8037ab88" : "atan2f", - "8037abec" : "spline_get_weights", - "8037afb8" : "anim_spline_init", - "8037afe8" : "anim_spline_poll", - "8037b220" : "init_scene_graph_node_links", - "8037b24c" : "init_graph_node_root", - "8037b30c" : "init_graph_node_ortho_projection", - "8037b380" : "init_graph_node_perspective", - "8037b448" : "init_graph_node_start", - "8037b4ac" : "init_graph_node_master_list", - "8037b530" : "init_graph_node_render_range", - "8037b5b4" : "init_graph_node_switch_case", - "8037b670" : "init_graph_node_camera", - "8037b744" : "init_graph_node_translation_rotation", - "8037b7f8" : "init_graph_node_translation", - "8037b89c" : "init_graph_node_rotation", - "8037b940" : "init_graph_node_scale", - "8037b9e0" : "init_graph_node_object", - "8037bad4" : "init_graph_node_culling_radius", - "8037bb48" : "init_graph_node_animated_part", - "8037bbec" : "init_graph_node_billboard", - "8037bc90" : "init_graph_node_display_list", - "8037bd24" : "init_graph_node_shadow", - "8037bdb4" : "init_graph_node_object_parent", - "8037be28" : "init_graph_node_generated", - "8037becc" : "init_graph_node_background", - "8037bf84" : "init_graph_node_held_object", - "8037c044" : "geo_add_child", - "8037c0bc" : "geo_remove_child", - "8037c138" : "geo_make_first_child", - "8037c1e4" : "geo_call_global_function_nodes_helper", - "8037c360" : "geo_call_global_function_nodes", - "8037c3d0" : "geo_reset_object_node", - "8037c448" : "geo_obj_init", - "8037c51c" : "geo_obj_init_spawninfo", - "8037c658" : "geo_obj_init_animation", - "8037c708" : "geo_obj_init_animation_accel", - "8037c7d8" : "retrieve_animation_index", - "8037c844" : "geo_update_animation_frame", - "8037c9e8" : "geo_retreive_animation_translation", - "8037cb10" : "geo_find_root", - "8037cb60" : "read_vec3s_to_vec3f", - "8037cbc0" : "read_vec3s", - "8037cbfc" : "read_vec3s_angle", - "8037cc74" : "register_scene_graph_node", - "8037cd60" : "geo_layout_cmd_branch_and_link", - "8037ce24" : "geo_layout_cmd_end", - "8037cee8" : "geo_layout_cmd_branch", - "8037cf70" : "geo_layout_cmd_return", - "8037cfc0" : "geo_layout_cmd_open_node", - "8037d018" : "geo_layout_cmd_close_node", - "8037d050" : "geo_layout_cmd_assign_as_view", - "8037d0d0" : "geo_layout_cmd_update_node_flags", - "8037d1d0" : "geo_layout_cmd_node_root", - "8037d328" : "geo_layout_cmd_node_ortho_projection", - "8037d3a4" : "geo_layout_cmd_node_perspective", - "8037d48c" : "geo_layout_cmd_node_start", - "8037d4dc" : "geo_layout_cmd_nop3", - "8037d500" : "geo_layout_cmd_node_master_list", - "8037d55c" : "geo_layout_cmd_node_level_of_detail", - "8037d5d4" : "geo_layout_cmd_node_switch_case", - "8037d640" : "geo_layout_cmd_node_camera", - "8037d6f0" : "geo_layout_cmd_node_translation_rotation", - "8037d8d4" : "geo_layout_cmd_node_translation", - "8037d998" : "geo_layout_cmd_node_rotation", - "8037da5c" : "geo_layout_cmd_node_scale", - "8037db50" : "geo_layout_cmd_nop2", - "8037db74" : "geo_layout_cmd_node_animated_part", - "8037dc10" : "geo_layout_cmd_node_billboard", - "8037dcd4" : "geo_layout_cmd_node_display_list", - "8037dd4c" : "geo_layout_cmd_node_shadow", - "8037dddc" : "geo_layout_cmd_node_object_parent", - "8037de34" : "geo_layout_cmd_node_generated", - "8037de94" : "geo_layout_cmd_node_background", - "8037def8" : "geo_layout_cmd_nop", - "8037df1c" : "geo_layout_cmd_copy_view", - "8037dfd4" : "geo_layout_cmd_node_held_obj", - "8037e058" : "geo_layout_cmd_node_culling_radius", - "8037e0b4" : "process_geo_layout", - "803805c8" : "level_script_execute", - "80380de8" : "f32_find_wall_collision", - "80380e8c" : "find_wall_collisions", - "80381264" : "find_ceil", - "803814b8" : "find_floor_height_and_data", - "80381794" : "find_floor_height", - "80381900" : "find_floor", - "80381ba0" : "find_water_level", - "80381d3c" : "find_poison_gas_level", - "80381f08" : "debug_surface_list_info", - "80383340" : "alloc_surface_pools", - "803833b8" : "load_area_terrain", - "803835a4" : "clear_dynamic_surfaces", - "803839cc" : "load_object_collision_model", - "80383bb0" : "RandomU16", - "80383cb4" : "RandomFloat", - "80383d1c" : "RandomSign", - "80383d68" : "func_80383D68", - "80385bf0" : "stub_80385BF0", - "80385c00" : "cur_object_exec_behavior", - "80385f90" : "identityMtx", - "80385fb0" : "zeroMtx", - "80385fd0" : "gVec3fZero", - "80385fdc" : "gVec3sZero", - "80385fe4" : "gVec3fOne", - "80385ff0" : "gVec3sOne", - "80386000" : "gSineTable", - "80387000" : "gCosineTable", - "8038b000" : "gArctanTable", - "8038b810" : "GeoLayoutJumpTable", - "8038b894" : "unused_8038B894", - "8038bc90" : "_engineSegmentEnd", - "007dfb50" : "_engineSegmentRomEnd", - "8038bc90" : "_engineSegmentNoloadStart", - "8038bc90" : "gSplineKeyframe", - "8038bc94" : "gSplineKeyframeFraction", - "8038bc98" : "gSplineState", - "8038bca0" : "gGraphNodePool", - "8038bca4" : "gCurRootGraphNode", - "8038bca8" : "D_8038BCA8", - "8038bcac" : "gGeoViews", - "8038bcb0" : "gGeoNumViews", - "8038bcb8" : "gGeoLayoutStack", - "8038bcf8" : "gCurGraphNodeList", - "8038bd78" : "gCurGraphNodeIndex", - "8038bd7a" : "gGeoLayoutStackIndex", - "8038bd7c" : "D_8038BD7C", - "8038bd7e" : "gGeoLayoutReturnIndex", - "8038bd80" : "gGeoLayoutCommand", - "8038bd88" : "gObjParentGraphNode", - "8038be30" : "sFloorGeo", - "8038be90" : "unused8038BE90", - "8038be98" : "gStaticSurfacePartition", - "8038d698" : "gDynamicSurfacePartition", - "8038ee98" : "sSurfaceNodePool", - "8038ee9c" : "sSurfacePool", - "8038eea0" : "sSurfacePoolSize", - "8038eea8" : "unused8038EEA8", - "8038eef0" : "_engineSegmentNoloadEnd", - "00000001" : "ASSERT", - "8038f800" : ".", - "8038f800" : "_framebuffersSegmentNoloadStart", - "8038f800" : "0x70800", - "8038f800" : "gFrameBuffer0", - "803b5000" : "gFrameBuffer1", - "803da800" : "gFrameBuffer2", - "80400000" : "_framebuffersSegmentNoloadEnd", - "80400000" : "__expansionRamStart", - "00000001" : "ASSERT", - "10000000" : "_entrySegmentStart", - "007cc6c0" : "_entrySegmentRomStart", - "10000000" : "level_script_entry", - "10000030" : "_entrySegmentEnd", - "007cc6f0" : "_entrySegmentRomEnd", - "02000000" : "_segment2_mio0SegmentStart", - "007cc6c0" : "_segment2_mio0SegmentRomStart", - "0200bd10" : ".", - "0200bd10" : "_segment2_mio0SegmentEnd", - "007d83d0" : "_segment2_mio0SegmentRomEnd", - "04000000" : "_group0_mio0SegmentStart", - "007cc6c0" : "_group0_mio0SegmentRomStart", - "04013260" : ".", - "04013260" : "_group0_mio0SegmentEnd", - "007df920" : "_group0_mio0SegmentRomEnd", - "17000000" : "_group0_geoSegmentStart", - "007cc6c0" : "_group0_geoSegmentRomStart", - "17000000" : "bubble_geo", - "1700001c" : "purple_marble_geo", - "17000038" : "smoke_geo", - "17000084" : "burn_smoke_geo", - "1700009c" : "spot_on_ground_geo", - "170000e0" : "mario_TODO_geo_0000E0", - "17000124" : "water_waves_surface_geo", - "17000168" : "water_waves_geo", - "170001bc" : "sparkles_geo", - "17000230" : "water_splash_geo", - "17000284" : "sparkles_animation_geo", - "170002e0" : "mario_geo_face_and_wings", - "1700041c" : "mario_geo_left_hand", - "17000494" : "mario_geo_right_hand", - "1700053c" : "mario_geo_body", - "170006f8" : "mario_geo_medium_poly_left_hand", - "17000770" : "mario_geo_medium_poly_right_hand", - "17000818" : "mario_geo_medium_poly_body", - "170009d4" : "mario_geo_low_poly_face_and_wings", - "17000b10" : "mario_geo_low_poly_left_hand", - "17000b88" : "mario_geo_low_poly_right_hand", - "17000c30" : "mario_geo_low_poly_body", - "17000dec" : "mario_vanish_geo_face_and_wings", - "17000f28" : "mario_vanish_geo_left_hand", - "17000fa0" : "mario_vanish_geo_right_hand", - "17001048" : "mario_vanish_geo_body", - "17001204" : "mario_vanish_geo_medium_poly_left_hand", - "1700127c" : "mario_vanish_geo_medium_poly_right_hand", - "17001324" : "mario_vanish_geo_medium_poly_body", - "170014e0" : "mario_vanish_geo_low_poly_face_and_wings", - "1700161c" : "mario_vanish_geo_low_poly_left_hand", - "17001694" : "mario_vanish_geo_low_poly_right_hand", - "1700173c" : "mario_vanish_geo_low_poly_body", - "170018f8" : "mario_metal_geo_face_and_wings", - "170019a4" : "mario_metal_geo_left_hand", - "17001a1c" : "mario_metal_geo_right_hand", - "17001ac4" : "mario_metal_geo_body", - "17001c80" : "mario_metal_geo_medium_poly_left_hand", - "17001cf8" : "mario_metal_geo_medium_poly_right_hand", - "17001da0" : "mario_metal_geo_medium_poly_body", - "17001f5c" : "mario_metal_geo_low_poly_face_and_wings", - "17002008" : "mario_metal_geo_low_poly_left_hand", - "17002080" : "mario_metal_geo_low_poly_right_hand", - "17002128" : "mario_metal_geo_low_poly_body", - "170022e4" : "mario_metal_vanish_geo_face_and_wings", - "17002390" : "mario_metal_vanish_geo_left_hand", - "17002408" : "mario_metal_vanish_geo_right_hand", - "170024b0" : "mario_metal_vanish_geo_body", - "1700266c" : "mario_metal_vanish_geo_medium_poly_left_hand", - "170026e4" : "mario_metal_vanish_geo_medium_poly_right_hand", - "1700278c" : "mario_metal_vanish_geo_medium_poly_body", - "17002958" : "mario_metal_vanish_geo_low_poly_face_and_wings", - "17002a04" : "mario_metal_vanish_geo_low_poly_left_hand", - "17002a7c" : "mario_metal_vanish_geo_low_poly_right_hand", - "17002b24" : "mario_metal_vanish_geo_low_poly_body", - "17002ce0" : "mario_geo_load_body", - "17002d14" : "mario_geo_load_medium_poly_body", - "17002d48" : "mario_geo_load_low_poly_body", - "17002d7c" : "mario_geo_render_body", - "17002dd4" : "mario_geo", - "17002e30" : "_group0_geoSegmentEnd", - "007cf4f0" : "_group0_geoSegmentRomEnd", - "05000000" : "_group1_mio0SegmentStart", - "007cc6c0" : "_group1_mio0SegmentRomStart", - "05008070" : ".", - "05008070" : "_group1_mio0SegmentEnd", - "007d4730" : "_group1_mio0SegmentRomEnd", - "0c000000" : "_group1_geoSegmentStart", - "007cc6c0" : "_group1_geoSegmentRomStart", - "0c000000" : "yellow_sphere_geo", - "0c000018" : "hoot_geo", - "0c0001e4" : "yoshi_egg_geo", - "0c000248" : "thwomp_geo", - "0c000264" : "bullet_bill_geo", - "0c00028c" : "heave_ho_geo", - "0c000410" : "_group1_geoSegmentEnd", - "007ccad0" : "_group1_geoSegmentRomEnd", - "05000000" : "_group2_mio0SegmentStart", - "007cc6c0" : "_group2_mio0SegmentRomStart", - "05001e10" : ".", - "05001e10" : "_group2_mio0SegmentEnd", - "007ce4d0" : "_group2_mio0SegmentRomEnd", - "0c000000" : "_group2_geoSegmentStart", - "007cc6c0" : "_group2_geoSegmentRomStart", - "0c000000" : "bully_geo", - "0c000120" : "bully_boss_geo", - "0c000240" : "blargg_geo", - "0c0002b0" : "_group2_geoSegmentEnd", - "007cc970" : "_group2_geoSegmentRomEnd", - "05000000" : "_group3_mio0SegmentStart", - "007cc6c0" : "_group3_mio0SegmentRomStart", - "050068b0" : ".", - "050068b0" : "_group3_mio0SegmentEnd", - "007d2f70" : "_group3_mio0SegmentRomEnd", - "0c000000" : "_group3_geoSegmentStart", - "007cc6c0" : "_group3_geoSegmentRomStart", - "0c000000" : "king_bobomb_geo", - "0c000308" : "water_bomb_geo", - "0c000328" : "water_bomb_shadow_geo", - "0c000340" : "_group3_geoSegmentEnd", - "007cca00" : "_group3_geoSegmentRomEnd", - "05000000" : "_group4_mio0SegmentStart", - "007cc6c0" : "_group4_mio0SegmentRomStart", - "0500a300" : ".", - "0500a300" : "_group4_mio0SegmentEnd", - "007d69c0" : "_group4_mio0SegmentRomEnd", - "0c000000" : "_group4_geoSegmentStart", - "007cc6c0" : "_group4_geoSegmentRomStart", - "0c000000" : "clam_shell_geo", - "0c000068" : "sushi_geo", - "0c00010c" : "unagi_geo", - "0c000280" : "_group4_geoSegmentEnd", - "007cc940" : "_group4_geoSegmentRomEnd", - "05000000" : "_group5_mio0SegmentStart", - "007cc6c0" : "_group5_mio0SegmentRomStart", - "0500bce0" : ".", - "0500bce0" : "_group5_mio0SegmentEnd", - "007d83a0" : "_group5_mio0SegmentRomEnd", - "0c000000" : "_group5_geoSegmentStart", - "007cc6c0" : "_group5_geoSegmentRomStart", - "0c000000" : "klepto_geo", - "0c0002ac" : "eyerok_geo_0002AC", - "0c0005a8" : "eyerok_left_hand_geo", - "0c0005e4" : "eyerok_right_hand_geo", - "0c000610" : "pokey_head_geo", - "0c000644" : "pokey_body_part_geo", - "0c000660" : "_group5_geoSegmentEnd", - "007ccd20" : "_group5_geoSegmentRomEnd", - "05000000" : "_group6_mio0SegmentStart", - "007cc6c0" : "_group6_mio0SegmentRomStart", - "0500e110" : ".", - "0500e110" : "_group6_mio0SegmentEnd", - "007da7d0" : "_group6_mio0SegmentRomEnd", - "0c000000" : "_group6_geoSegmentStart", - "007cc6c0" : "_group6_geoSegmentRomStart", - "0c000000" : "monty_mole_geo", - "0c000110" : "ukiki_geo", - "0c00036c" : "fwoosh_geo", - "0c000390" : "_group6_geoSegmentEnd", - "007cca50" : "_group6_geoSegmentRomEnd", - "05000000" : "_group7_mio0SegmentStart", - "007cc6c0" : "_group7_mio0SegmentRomStart", - "05005070" : ".", - "05005070" : "_group7_mio0SegmentEnd", - "007d1730" : "_group7_mio0SegmentRomEnd", - "0c000000" : "_group7_geoSegmentStart", - "007cc6c0" : "_group7_geoSegmentRomStart", - "0c000000" : "spindrift_geo", - "0c000104" : "penguin_geo", - "0c00021c" : "mr_blizzard_hidden_geo", - "0c000348" : "mr_blizzard_geo", - "0c000370" : "_group7_geoSegmentEnd", - "007cca30" : "_group7_geoSegmentRomEnd", - "05000000" : "_group8_mio0SegmentStart", - "007cc6c0" : "_group8_mio0SegmentRomStart", - "05001180" : ".", - "05001180" : "_group8_mio0SegmentEnd", - "007cd840" : "_group8_mio0SegmentRomEnd", - "0c000000" : "_group8_geoSegmentStart", - "007cc6c0" : "_group8_geoSegmentRomStart", - "0c000000" : "springboard_top_geo", - "0c000018" : "springboard_spring_geo", - "0c000030" : "springboard_bottom_geo", - "0c000048" : "cap_switch_geo", - "0c000090" : "_group8_geoSegmentEnd", - "007cc750" : "_group8_geoSegmentRomEnd", - "05000000" : "_group9_mio0SegmentStart", - "007cc6c0" : "_group9_mio0SegmentRomStart", - "05006960" : ".", - "05006960" : "_group9_mio0SegmentEnd", - "007d3020" : "_group9_mio0SegmentRomEnd", - "0c000000" : "_group9_geoSegmentStart", - "007cc6c0" : "_group9_geoSegmentRomStart", - "0c000000" : "bookend_part_geo", - "0c0000c0" : "bookend_geo", - "0c0000d8" : "haunted_chair_geo", - "0c000188" : "small_key_geo", - "0c0001b4" : "mad_piano_geo", - "0c000224" : "boo_geo", - "0c000274" : "haunted_cage_geo", - "0c0002b0" : "_group9_geoSegmentEnd", - "007cc970" : "_group9_geoSegmentRomEnd", - "05000000" : "_group10_mio0SegmentStart", - "007cc6c0" : "_group10_mio0SegmentRomStart", - "05012cd0" : ".", - "05012cd0" : "_group10_mio0SegmentEnd", - "007df390" : "_group10_mio0SegmentRomEnd", - "0c000000" : "_group10_geoSegmentStart", - "007cc6c0" : "_group10_geoSegmentRomStart", - "0c000000" : "birds_geo", - "0c000098" : "peach_geo_000098", - "0c000254" : "peach_geo_000254", - "0c000410" : "peach_geo", - "0c000468" : "yoshi_geo", - "0c000670" : "_group10_geoSegmentEnd", - "007ccd30" : "_group10_geoSegmentRomEnd", - "05000000" : "_group11_mio0SegmentStart", - "007cc6c0" : "_group11_mio0SegmentRomStart", - "050073f0" : ".", - "050073f0" : "_group11_mio0SegmentEnd", - "007d3ab0" : "_group11_mio0SegmentRomEnd", - "0c000000" : "_group11_geoSegmentStart", - "007cc6c0" : "_group11_geoSegmentRomStart", - "0c000000" : "bubba_geo", - "0c000030" : "wiggler_head_geo", - "0c0001bc" : "enemy_lakitu_geo", - "0c000290" : "spiny_ball_geo", - "0c000328" : "spiny_geo", - "0c0004a0" : "_group11_geoSegmentEnd", - "007ccb60" : "_group11_geoSegmentRomEnd", - "06000000" : "_group12_mio0SegmentStart", - "007cc6c0" : "_group12_mio0SegmentRomStart", - "06030c30" : ".", - "06030c30" : "_group12_mio0SegmentEnd", - "007fd2f0" : "_group12_mio0SegmentRomEnd", - "0d000000" : "_group12_geoSegmentStart", - "007cc6c0" : "_group12_geoSegmentRomStart", - "0d000000" : "bowser_flames_geo", - "0d000090" : "invisible_bowser_accessory_geo", - "0d0000b0" : "bowser_1_yellow_sphere_geo", - "0d0000d8" : "bowser_geo_0000D8", - "0d000424" : "bowser_geo_000424", - "0d000770" : "bowser_geo_000770", - "0d000ab8" : "bowser_shadow_geo", - "0d000ac4" : "bowser_geo", - "0d000b40" : "bowser2_geo", - "0d000bbc" : "bowser_bomb_geo", - "0d000bfc" : "bowser_impact_smoke_geo", - "0d000c50" : "_group12_geoSegmentEnd", - "007cd310" : "_group12_geoSegmentRomEnd", - "06000000" : "_group13_mio0SegmentStart", - "007cc6c0" : "_group13_mio0SegmentRomStart", - "0600a0f0" : ".", - "0600a0f0" : "_group13_mio0SegmentEnd", - "007d67b0" : "_group13_mio0SegmentRomEnd", - "0d000000" : "_group13_geoSegmentStart", - "007cc6c0" : "_group13_geoSegmentRomStart", - "0d000000" : "skeeter_geo", - "0d000284" : "seaweed_geo", - "0d0002f4" : "water_mine_geo", - "0d000324" : "cyan_fish_geo", - "0d00038c" : "bub_geo", - "0d000414" : "water_ring_geo", - "0d000450" : "treasure_chest_base_geo", - "0d000468" : "treasure_chest_lid_geo", - "0d000480" : "_group13_geoSegmentEnd", - "007ccb40" : "_group13_geoSegmentRomEnd", - "06000000" : "_group14_mio0SegmentStart", - "007cc6c0" : "_group14_mio0SegmentRomStart", - "06013a60" : ".", - "06013a60" : "_group14_mio0SegmentEnd", - "007e0120" : "_group14_mio0SegmentRomEnd", - "0d000000" : "_group14_geoSegmentStart", - "007cc6c0" : "_group14_geoSegmentRomStart", - "0d000000" : "koopa_flag_geo", - "0d0000b8" : "wooden_post_geo", - "0d0000d0" : "koopa_without_shell_geo", - "0d000214" : "koopa_with_shell_geo", - "0d000358" : "piranha_plant_geo", - "0d000480" : "whomp_geo", - "0d0005d0" : "metallic_ball_geo", - "0d0005ec" : "chain_chomp_geo", - "0d000680" : "_group14_geoSegmentEnd", - "007ccd40" : "_group14_geoSegmentRomEnd", - "06000000" : "_group15_mio0SegmentStart", - "007cc6c0" : "_group15_mio0SegmentRomStart", - "0600c8e0" : ".", - "0600c8e0" : "_group15_mio0SegmentEnd", - "007d8fa0" : "_group15_mio0SegmentRomEnd", - "0d000000" : "_group15_geoSegmentStart", - "007cc6c0" : "_group15_geoSegmentRomStart", - "0d000000" : "lakitu_geo", - "0d000114" : "toad_geo_000114", - "0d00027c" : "toad_geo_00027C", - "0d0003e4" : "toad_geo", - "0d000448" : "mips_geo", - "0d0005b0" : "boo_castle_geo", - "0d000600" : "_group15_geoSegmentEnd", - "007cccc0" : "_group15_geoSegmentRomEnd", - "06000000" : "_group16_mio0SegmentStart", - "007cc6c0" : "_group16_mio0SegmentRomStart", - "06002ba0" : ".", - "06002ba0" : "_group16_mio0SegmentEnd", - "007cf260" : "_group16_mio0SegmentRomEnd", - "0d000000" : "_group16_geoSegmentStart", - "007cc6c0" : "_group16_geoSegmentRomStart", - "0d000000" : "moneybag_geo_000000", - "0d000078" : "moneybag_geo_000078", - "0d0000f0" : "moneybag_geo", - "0d000150" : "_group16_geoSegmentEnd", - "007cc810" : "_group16_geoSegmentRomEnd", - "06000000" : "_group17_mio0SegmentStart", - "007cc6c0" : "_group17_mio0SegmentRomStart", - "06009c50" : ".", - "06009c50" : "_group17_mio0SegmentEnd", - "007d6310" : "_group17_mio0SegmentRomEnd", - "0d000000" : "_group17_geoSegmentStart", - "007cc6c0" : "_group17_geoSegmentRomStart", - "0d000000" : "mr_i_geo", - "0d00001c" : "mr_i_iris_geo", - "0d0000dc" : "swoop_geo", - "0d0001a0" : "snufit_geo", - "0d000230" : "dorrie_geo", - "0d000394" : "scuttlebug_geo", - "0d0006d0" : "_group17_geoSegmentEnd", - "007ccd90" : "_group17_geoSegmentRomEnd", - "08000000" : "_common0_mio0SegmentStart", - "007cc6c0" : "_common0_mio0SegmentRomStart", - "0800e6d0" : ".", - "0800e6d0" : "_common0_mio0SegmentEnd", - "007dad90" : "_common0_mio0SegmentRomEnd", - "0f000000" : "_common0_geoSegmentStart", - "007cc6c0" : "_common0_geoSegmentRomStart", - "0f000000" : "blue_coin_switch_geo", - "0f000020" : "test_platform_geo", - "0f000028" : "amp_geo", - "0f0001a8" : "cannon_base_geo", - "0f0001c0" : "cannon_barrel_geo", - "0f0001d8" : "chuckya_geo", - "0f0004cc" : "purple_switch_geo", - "0f0004e4" : "checkerboard_platform_geo", - "0f0004fc" : "heart_geo", - "0f000518" : "flyguy_geo", - "0f0005d0" : "breakable_box_geo", - "0f000610" : "breakable_box_small_geo", - "0f000640" : "bowling_ball_geo", - "0f00066c" : "bowling_ball_track_geo", - "0f000694" : "exclamation_box_geo", - "0f0006e4" : "goomba_geo", - "0f0007b8" : "black_bobomb_geo", - "0f0008f4" : "bobomb_buddy_geo", - "0f000a30" : "metal_box_geo", - "0f000a58" : "exclamation_box_outline_geo", - "0f000ab0" : "koopa_shell_geo", - "0f000adc" : "koopa_shell2_geo", - "0f000b08" : "koopa_shell3_geo", - "0f000b40" : "_common0_geoSegmentEnd", - "007cd200" : "_common0_geoSegmentRomEnd", - "03000000" : "_common1_mio0SegmentStart", - "007cc6c0" : "_common1_mio0SegmentRomStart", - "03017990" : ".", - "03017990" : "_common1_mio0SegmentEnd", - "007e4050" : "_common1_mio0SegmentRomEnd", - "16000000" : "_common1_geoSegmentStart", - "007cc6c0" : "_common1_geoSegmentRomStart", - "16000000" : "mist_geo", - "16000020" : "white_puff_geo", - "16000040" : "explosion_geo", - "160000a8" : "butterfly_geo", - "1600013c" : "yellow_coin_geo", - "160001a0" : "yellow_coin_no_shadow_geo", - "16000200" : "blue_coin_geo", - "16000264" : "blue_coin_no_shadow_geo", - "160002c4" : "red_coin_geo", - "16000328" : "red_coin_no_shadow_geo", - "16000388" : "warp_pipe_geo", - "160003a8" : "castle_door_geo", - "1600043c" : "cabin_door_geo", - "160004d0" : "wooden_door_geo", - "16000564" : "wooden_door2_geo", - "160005f8" : "metal_door_geo", - "1600068c" : "hazy_maze_door_geo", - "16000720" : "haunted_door_geo", - "160007b4" : "castle_door_0_star_geo", - "16000868" : "castle_door_1_star_geo", - "1600091c" : "castle_door_3_stars_geo", - "160009d0" : "key_door_geo", - "16000a84" : "bowser_key_geo", - "16000ab0" : "bowser_key_cutscene_geo", - "16000b10" : "red_flame_shadow_geo", - "16000b2c" : "red_flame_geo", - "16000b8c" : "blue_flame_geo", - "16000bec" : "fish_shadow_geo", - "16000c44" : "fish_geo", - "16000c8c" : "leaves_geo", - "16000ca4" : "marios_cap_geo", - "16000cf0" : "marios_metal_cap_geo", - "16000d3c" : "marios_wing_cap_geo", - "16000da8" : "marios_winged_metal_cap_geo", - "16000e14" : "number_geo", - "16000e84" : "mushroom_1up_geo", - "16000ea0" : "star_geo", - "16000ed4" : "dirt_animation_geo", - "16000f24" : "cartoon_star_geo", - "16000f6c" : "transparent_star_geo", - "16000f98" : "white_particle_geo", - "16000fb4" : "wooden_signpost_geo", - "16000fe8" : "bubbly_tree_geo", - "16001000" : "spiky_tree_geo", - "16001018" : "snow_tree_geo", - "16001030" : "spiky_tree1_geo", - "16001048" : "palm_tree_geo", - "16001060" : "_common1_geoSegmentEnd", - "007cd720" : "_common1_geoSegmentRomEnd", - "13000000" : "_behaviorSegmentStart", - "007cc6c0" : "_behaviorSegmentRomStart", - "13000000" : "bhvStarDoor", - "13000054" : "bhvMrI", - "1300008c" : "bhvMrIBody", - "130000ac" : "bhvMrIParticle", - "130000f8" : "bhvPurpleParticle", - "13000118" : "bhvGiantPole", - "13000144" : "bhvPoleGrabbing", - "13000174" : "bhvThiHugeIslandTop", - "13000194" : "bhvThiTinyIslandTop", - "130001ac" : "bhvCapSwitchBase", - "130001cc" : "bhvCapSwitch", - "130001f4" : "bhvKingBobomb", - "13000254" : "bhvBobombAnchorMario", - "13000278" : "bhvBetaChestBottom", - "1300029c" : "bhvBetaChestLid", - "130002b8" : "bhvBubbleMario", - "130002e4" : "bhvBubbleMaybe", - "13000338" : "bhvSmallWaterWave", - "13000398" : "bhvSmallWaterWave398", - "130003bc" : "bhvWaterAirBubble", - "13000400" : "bhvSmallParticle", - "13000428" : "bhvWaterWaves", - "13000444" : "bhvSmallParticleSnow", - "1300046c" : "bhvSmallParticleBubbles", - "13000494" : "bhvFishGroup", - "130004a8" : "bhvCannon", - "130004e4" : "bhvCannonBarrel", - "13000500" : "bhvCannonBaseUnused", - "13000528" : "bhvChuckya", - "13000584" : "bhvChuckyaAnchorMario", - "130005a8" : "bhvUnused05A8", - "130005b4" : "bhvRotatingPlatform", - "130005d8" : "bhvTower", - "13000600" : "bhvBulletBillCannon", - "13000624" : "bhvWfBreakableWallRight", - "13000638" : "bhvWfBreakableWallLeft", - "1300066c" : "bhvKickableBoard", - "130006a4" : "bhvTowerDoor", - "130006d8" : "bhvRotatingCounterClockwise", - "130006e0" : "bhvWfRotatingWoodenPlatform", - "13000708" : "bhvKoopaShellUnderwater", - "13000720" : "bhvExitPodiumWarp", - "1300075c" : "bhvFadingWarp", - "13000780" : "bhvWarp", - "130007a0" : "bhvWarpPipe", - "130007dc" : "bhvWhitePuffExplosion", - "130007f8" : "bhvSpawnedStar", - "1300080c" : "bhvUnused080C", - "13000830" : "bhvMrIBlueCoin", - "13000888" : "bhvCoinInsideBoo", - "130008d0" : "bhvCoinFormationSpawn", - "130008ec" : "bhvCoinFormation", - "1300090c" : "bhvOneCoin", - "1300091c" : "bhvYellowCoin", - "13000940" : "bhvTemporaryYellowCoin", - "13000964" : "bhvThreeCoinsSpawn", - "13000984" : "bhvTenCoinsSpawn", - "130009a4" : "bhvSingleCoinGetsSpawned", - "130009e0" : "bhvCoinSparkles", - "13000a14" : "bhvGoldenCoinSparkles", - "13000a34" : "bhvWallTinyStarParticle", - "13000a54" : "bhvWallTinyStarParticleSpawn", - "13000a78" : "bhvPoundTinyStarParticle", - "13000a98" : "bhvPoundTinyStarParticleSpawn", - "13000abc" : "bhvPunchTinyTriangle", - "13000ad8" : "bhvPunchTinyTriangleSpawn", - "13000afc" : "bhvDoorWarp", - "13000b0c" : "bhvDoor", - "13000b58" : "bhvGrindel", - "13000b8c" : "bhvThwomp2", - "13000bc8" : "bhvThwomp", - "13000c04" : "bhvTumblingBridgePlatform", - "13000c28" : "bhvWfTumblingBridge", - "13000c44" : "bhvBbhTumblingBridge", - "13000c64" : "bhvLllTumblingBridge", - "13000c84" : "bhvFlame", - "13000cc8" : "bhvAnotherElavator", - "13000cfc" : "bhvRrElevatorPlatform", - "13000d30" : "bhvHmcElevatorPlatform", - "13000d6c" : "bhvWaterMist", - "13000d98" : "bhvWaterMistSpawn", - "13000db4" : "bhvBreakBoxTriangle", - "13000dd8" : "bhvWaterMist2", - "13000dfc" : "bhvUnused0DFC", - "13000e24" : "bhvPoundWhitePuffs", - "13000e3c" : "bhvGroundSand", - "13000e58" : "bhvGroundSnow", - "13000e70" : "bhvWind", - "13000e88" : "bhvEndToad", - "13000eac" : "bhvEndPeach", - "13000ed0" : "bhvUnusedParticleSpawn", - "13000f08" : "bhvUkiki", - "13000f14" : "bhvUkikiCageChild", - "13000f2c" : "bhvUkikiCageStar", - "13000f48" : "bhvUkikiCage", - "13000f9c" : "bhvBitfsSinkingPlatforms", - "13000fc8" : "bhvBitfsSinkingCagePlatform", - "13001000" : "bhvDddMovingPole", - "13001030" : "bhvBitfsTiltingSquarePlatform", - "13001064" : "bhvSquishablePlatform", - "13001098" : "bhvCutOutObject", - "130010a8" : "bhvBetaMovingFlamesSpawn", - "130010b8" : "bhvBetaMovingFlames", - "130010d8" : "bhvRrRotatingBridgePlatform", - "13001108" : "bhvFlamethrower", - "13001124" : "bhvFlamethrowerFlame", - "13001168" : "bhvBouncingFireball", - "13001184" : "bhvBouncingFireballFlame", - "130011d0" : "bhvBowserShockWave", - "130011ec" : "bhvFlameMario", - "13001214" : "bhvBlackSmokeMario", - "13001254" : "bhvBlackSmokeBowser", - "1300127c" : "bhvBlackSmokeUpward", - "13001298" : "bhvBetaFishSplashSpawner", - "130012b4" : "bhvSpindrift", - "130012f4" : "bhvTowerPlatformGroup", - "13001318" : "bhvWfSlidingTowerPlatform", - "13001340" : "bhvWfElevatorTowerPlatform", - "13001368" : "bhvWfSolidTowerPlatform", - "13001390" : "bhvSnowLeafParticleSpawn", - "130013a8" : "bhvTreeSnow", - "130013c4" : "bhvTreeLeaf", - "130013dc" : "bhvAnotherTiltingPlatform", - "13001408" : "bhvSquarishPathMoving", - "1300142c" : "bhvPiranhaPlantBubble", - "13001448" : "bhvPiranhaPlantWakingBubbles", - "13001468" : "bhvFloorSwitchAnimatesObject", - "13001478" : "bhvFloorSwitchGrills", - "13001484" : "bhvFloorSwitchHardcodedModel", - "130014ac" : "bhvFloorSwitchHiddenObjects", - "130014bc" : "bhvHiddenObject", - "130014e0" : "bhvBreakableBox", - "13001518" : "bhvPushableMetalBox", - "13001548" : "bhvHeaveHo", - "130015a4" : "bhvHeaveHoThrowMario", - "130015c0" : "bhvCcmTouchedStarSpawn", - "130015e4" : "bhvUnusedPoundablePlatform", - "13001608" : "bhvBetaTrampolineTop", - "13001634" : "bhvBetaTrampolineSpring", - "13001650" : "bhvJumpingBox", - "1300167c" : "bhvBooCage", - "130016ac" : "bhvStub", - "130016b8" : "bhvIgloo", - "130016e4" : "bhvBowserKey", - "13001714" : "bhvGrandStar", - "13001744" : "bhvBetaBooKey", - "13001778" : "bhvAlphaBooKey", - "1300179c" : "bhvBulletBill", - "130017f4" : "bhvWhitePuffSmoke", - "13001820" : "bhvUnused1820", - "13001828" : "bhvBowserTailAnchor", - "13001850" : "bhvBowser", - "130018cc" : "bhvBowserBodyAnchor", - "13001904" : "bhvBowserFlameSpawn", - "13001920" : "bhvTiltingBowserLavaPlatform", - "13001958" : "bhvFallingBowserPlatform", - "13001984" : "bhvBlueBowserFlame", - "130019c8" : "bhvFlameFloatingLanding", - "13001a0c" : "bhvBlueFlamesGroup", - "13001a30" : "bhvFlameBouncing", - "13001a74" : "bhvFlameMovingForwardGrowing", - "13001aa4" : "bhvFlameBowser", - "13001ae8" : "bhvFlameLargeBurningOut", - "13001b2c" : "bhvBlueFish", - "13001b54" : "bhvTankFishGroup", - "13001b70" : "bhvCheckerboardElevatorGroup", - "13001b88" : "bhvCheckerboardPlatformSub", - "13001bb4" : "bhvBowserKeyUnlockDoor", - "13001bd4" : "bhvBowserKeyCourseExit", - "13001bf4" : "bhvInvisibleObjectsUnderBridge", - "13001c04" : "bhvWaterLevelPillar", - "13001c34" : "bhvDddWarp", - "13001c58" : "bhvMoatGrills", - "13001c7c" : "bhvClockMinuteHand", - "13001c8c" : "bhvClockHourHand", - "13001cb0" : "bhvMacroUkiki", - "13001d0c" : "bhvStub1D0C", - "13001d14" : "bhvLllRotatingHexagonalPlatform", - "13001d40" : "bhvLllSinkingRockBlock", - "13001d70" : "bhvStub1D70", - "13001d78" : "bhvLllMovingOctagonalMeshPlatform", - "13001da4" : "bhvSnowBall", - "13001da8" : "bhvLllRotatingBlockWithFireBars", - "13001dcc" : "bhvLllRotatingHexFlame", - "13001e04" : "bhvLllWoodPiece", - "13001e30" : "bhvLllFloatingWoodBridge", - "13001e4c" : "bhvVolcanoFlames", - "13001e6c" : "bhvLllRotatingHexagonalRing", - "13001e94" : "bhvLllSinkingRectangularPlatform", - "13001ec4" : "bhvLllSinkingSquarePlatforms", - "13001ef8" : "bhvLllTiltingSquarePlatform", - "13001f30" : "bhvUnused1F30", - "13001f3c" : "bhvKoopaShell", - "13001f68" : "bhvKoopaShellFlame", - "13001f90" : "bhvToxBox", - "13001fbc" : "bhvPiranhaPlant", - "13002018" : "bhvLllHexagonalMesh", - "13002038" : "bhvLllBowserPuzzlePiece", - "13002068" : "bhvLllBowserPuzzle", - "13002088" : "bhvTuxiesMother", - "130020d8" : "bhvPenguinBaby", - "130020e0" : "bhvUnused20E0", - "130020e8" : "bhvSmallPenguin", - "1300213c" : "bhvFish2", - "1300214c" : "bhvFish3", - "1300215c" : "bhvLargeFishGroup", - "13002178" : "bhvFishGroup2", - "13002194" : "bhvWdwExpressElevator", - "130021c0" : "bhvWdwExpressElevatorPlatform", - "130021e4" : "bhvChirpChirp", - "130021f4" : "bhvChirpChirpUnused", - "1300220c" : "bhvBub", - "13002250" : "bhvExclamationBox", - "1300227c" : "bhvRotatingExclamationMark", - "1300229c" : "bhvSoundSpawner", - "130022b8" : "bhvRockSolid", - "130022d8" : "bhvBowserSubDoor", - "13002308" : "bhvBowsersSub", - "13002338" : "bhvSushiShark", - "13002388" : "bhvSushiSharkCollisionChild", - "130023a4" : "bhvJrbSlidingBox", - "130023d0" : "bhvShipPart3", - "130023ec" : "bhvInSunkenShip3", - "1300241c" : "bhvSunkenShipPart", - "1300243c" : "bhvUnused243C", - "1300244c" : "bhvSunkenShipPart2", - "1300246c" : "bhvInSunkenShip", - "13002480" : "bhvInSunkenShip2", - "130024ac" : "bhvMarioDustGenerator", - "130024dc" : "bhvWhitePuff1", - "13002500" : "bhvWhitePuff2", - "13002528" : "bhvWhitePuffSmoke2", - "13002558" : "bhvPurpleSwitchHiddenBoxes", - "13002568" : "bhvBlueCoinSwitch", - "13002588" : "bhvHiddenBlueCoin", - "130025c0" : "bhvOpenableCageDoor", - "130025e0" : "bhvOpenableGrill", - "130025f8" : "bhvWaterLevelDiamond", - "13002620" : "bhvInitializeChangingWaterLevel", - "13002634" : "bhvTornadoSandParticle", - "13002650" : "bhvTornado", - "13002684" : "bhvMerryGoRoundBooManager", - "1300269c" : "bhvAnimatedTexture", - "130026d4" : "bhvBooInCastle", - "13002710" : "bhvBooWithCage", - "13002768" : "bhvBalconyBigBoo", - "1300277c" : "bhvMerryGoRoundBigBoo", - "13002790" : "bhvGhostHuntBigBoo", - "130027d0" : "bhvCourtyardBooTriplet", - "130027e4" : "bhvBoo", - "130027f4" : "bhvMerryGoRoundBoo", - "13002804" : "bhvGhostHuntBoo", - "1300286c" : "bhvHiddenStaircaseStep", - "13002898" : "bhvBooBossSpawnedBridge", - "130028cc" : "bhvBbhTiltingTrapPlatform", - "130028fc" : "bhvHauntedBookshelf", - "1300292c" : "bhvMeshElevator", - "13002968" : "bhvMerryGoRound", - "13002998" : "bhvPlaysMusicTrackWhenTouched", - "130029b0" : "bhvInsideCannon", - "130029b4" : "bhvBetaBowserAnchor", - "130029e4" : "bhvStaticCheckeredPlatform", - "13002a10" : "bhvUnused2A10", - "13002a20" : "bhvUnusedFakeStar", - "13002a48" : "bhvStaticObject", - "13002a54" : "bhvUnused2A54", - "13002a5c" : "bhvCastleFloorTrap", - "13002a7c" : "bhvFloorTrapInCastle", - "13002aa4" : "bhvTree", - "13002ad0" : "bhvSparkle", - "13002af0" : "bhvSparkleSpawn", - "13002b08" : "bhvSpecialTripleJumpSparkles", - "13002b5c" : "bhvScuttlebug", - "13002ba0" : "bhvScuttlebugSpawn", - "13002bb8" : "bhvWhompKingBoss", - "13002bcc" : "bhvSmallWhomp", - "13002c14" : "bhvWaterSplash", - "13002c60" : "bhvWaterDrops", - "13002c7c" : "bhvWaterSurfaceWhiteWave", - "13002cb0" : "bhvObjectBubbleRipples", - "13002ce0" : "bhvSurfaceWaves", - "13002d28" : "bhvWaterSurfaceWhiteWave2", - "13002d50" : "bhvWavesGenerator", - "13002d7c" : "bhvSurfaceWaveShrinking", - "13002db0" : "bhvWaterType", - "13002dc0" : "bhvWaveTrailOnSurface", - "13002e04" : "bhvTinyWhiteWindParticle", - "13002e20" : "bhvWindParticle", - "13002e3c" : "bhvSnowmanWindBlowing", - "13002e58" : "bhvWalkingPenguin", - "13002ea8" : "bhvYellowBall", - "13002ec0" : "bhvMario", - "13002ef8" : "bhvToadMessage", - "13002f40" : "bhvUnlockDoorStar", - "13002f60" : "bhvWarps60", - "13002f64" : "bhvWarps64", - "13002f68" : "bhvWarps68", - "13002f6c" : "bhvWarps6C", - "13002f70" : "bhvWarps70", - "13002f74" : "bhvWarps74", - "13002f78" : "bhvWarps78", - "13002f7c" : "bhvWarps7C", - "13002f80" : "bhvWarps80", - "13002f84" : "bhvWarps84", - "13002f88" : "bhvWarps88", - "13002f8c" : "bhvWarps8C", - "13002f90" : "bhvWarps90", - "13002f94" : "bhvWarps94", - "13002fa0" : "bhvRandomAnimatedTexture", - "13002fc0" : "bhvYellowBackgroundInMenu", - "13002fe4" : "bhvMenuButton", - "13003008" : "bhvMenuButtonManager", - "1300302c" : "bhvActSelectorStarType", - "13003048" : "bhvActSelector", - "13003068" : "bhvMovingYellowCoin", - "130030a4" : "bhvMovingBlueCoin", - "130030d4" : "bhvBlueCoinSliding", - "13003104" : "bhvBlueCoinJumping", - "13003134" : "bhvSeaweed", - "13003158" : "bhvSeaweedBundle", - "13003174" : "bhvBobomb", - "130031ac" : "bhvBobombFuseSmoke", - "130031dc" : "bhvBobombBuddy", - "13003228" : "bhvBobombBuddyOpensCannon", - "13003274" : "bhvCannonClosed", - "130032a8" : "bhvWhirlpool", - "130032c8" : "bhvJetStream", - "130032e0" : "bhvMessagePanel", - "13003324" : "bhvSignOnWall", - "13003354" : "bhvHomingAmp", - "13003388" : "bhvCirclingAmp", - "130033bc" : "bhvButterfly", - "130033ec" : "bhvHoot", - "13003420" : "bhvBetaHoldableObject", - "13003454" : "bhvCarrySomething1", - "1300345c" : "bhvCarrySomething2", - "13003464" : "bhvCarrySomething3", - "1300346c" : "bhvCarrySomething4", - "13003474" : "bhvCarrySomething5", - "1300347c" : "bhvCarrySomething6", - "13003484" : "bhvObjectBubble", - "130034c4" : "bhvObjectWaterWave", - "13003510" : "bhvExplosion", - "13003558" : "bhvBobombBullyDeathSmoke", - "13003588" : "bhvSmoke", - "130035b0" : "bhvBobombExplosionBubble", - "13003600" : "bhvBobombExplosionBubble3600", - "13003614" : "bhvRespawner", - "1300362c" : "bhvSmallBully", - "13003660" : "bhvBigBully", - "13003694" : "bhvBigBullyWithMinions", - "130036c8" : "bhvSmallChillBully", - "13003700" : "bhvBigChillBully", - "13003738" : "bhvJetStreamRingSpawner", - "13003750" : "bhvJetStreamWaterRing", - "13003798" : "bhvMantaRayWaterRing", - "130037e0" : "bhvMantaRayRingManager", - "130037ec" : "bhvBowserBomb", - "1300381c" : "bhvBowserBombExplosion", - "13003840" : "bhvBowserBombSmoke", - "13003868" : "bhvCelebrationStar", - "13003888" : "bhvCelebrationStarSparkle", - "130038b0" : "bhvStarKeyCollectionPuffSpawner", - "130038d0" : "bhvLllDrawbridgeSpawner", - "130038e8" : "bhvLllDrawbridge", - "13003910" : "bhvSmallBomp", - "13003940" : "bhvLargeBomp", - "13003970" : "bhvWfSlidingPlatform", - "130039a0" : "bhvMoneybag", - "130039d4" : "bhvMoneybagHidden", - "13003a08" : "bhvPitBowlingBall", - "13003a30" : "bhvFreeBowlingBall", - "13003a58" : "bhvBowlingBall", - "13003a80" : "bhvTtmBowlingBallSpawner", - "13003aa4" : "bhvBobBowlingBallSpawner", - "13003ac8" : "bhvThiBowlingBallSpawner", - "13003ae0" : "bhvRrCruiserWing", - "13003b00" : "bhvSpindel", - "13003b30" : "bhvSslMovingPyramidWall", - "13003b60" : "bhvPyramidElevator", - "13003b98" : "bhvPyramidElevatorTrajectoryMarkerBall", - "13003bb4" : "bhvPyramidTop", - "13003bec" : "bhvPyramidTopFragment", - "13003c0c" : "bhvPyramidPillarTouchDetector", - "13003c30" : "bhvWaterfallSoundLoop", - "13003c44" : "bhvVolcanoSoundLoop", - "13003c58" : "bhvCastleFlagWaving", - "13003c7c" : "bhvBirdsSoundLoop", - "13003c90" : "bhvAmbientSounds", - "13003ca4" : "bhvSandSoundLoop", - "13003cb8" : "bhvHiddenAt120Stars", - "13003ce4" : "bhvSnowmansBottom", - "13003d0c" : "bhvSnowmansHead", - "13003d34" : "bhvSnowmansBodyCheckpoint", - "13003d4c" : "bhvBigSnowmanWhole", - "13003d74" : "bhvBigBoulder", - "13003da0" : "bhvBigBoulderGenerator", - "13003db8" : "bhvWingCap", - "13003dd8" : "bhvMetalCap", - "13003df8" : "bhvNormalCap", - "13003e1c" : "bhvVanishCap", - "13003e3c" : "bhvStar", - "13003e64" : "bhvStarSpawnCoordinates", - "13003e8c" : "bhvHiddenRedCoinStar", - "13003eac" : "bhvRedCoin", - "13003ee4" : "bhvBowserCourseRedCoinStar", - "13003efc" : "bhvHiddenStar", - "13003f1c" : "bhvHiddenStarTrigger", - "13003f40" : "bhvTtmRollingLog", - "13003f78" : "bhvLllVolcanoFallingTrap", - "13003fa4" : "bhvLllRollingLog", - "13003fdc" : "bhv1upWalking", - "13004010" : "bhv1upRunningAway", - "13004044" : "bhv1upSliding", - "1300407c" : "bhv1Up", - "130040b4" : "bhv1upJumpOnApproach", - "130040ec" : "bhvHidden1up", - "13004124" : "bhvHidden1upTrigger", - "13004148" : "bhvHidden1upInPole", - "13004180" : "bhvHidden1upInPoleTrigger", - "130041a4" : "bhvHidden1upInPoleSpawner", - "130041bc" : "bhvControllablePlatform", - "130041f0" : "bhvControllablePlatformSub", - "13004218" : "bhvBreakableBoxSmall", - "13004244" : "bhvSlidingSnowMound", - "13004270" : "bhvSnowMoundSpawn", - "13004284" : "bhvWdwSquareFloatingPlatform", - "130042b4" : "bhvWdwRectangularFloatingPlatform", - "130042e4" : "bhvJrbFloatingPlatform", - "13004314" : "bhvArrowLift", - "13004348" : "bhvOrangeNumber", - "13004370" : "bhvMantaRay", - "130043a0" : "bhvFallingPillar", - "130043c4" : "bhvFallingPillarHitbox", - "130043e0" : "bhvPillarBase", - "13004400" : "bhvJrbFloatingBox", - "1300442c" : "bhvDecorativePendulum", - "1300444c" : "bhvTreasureChestsShip", - "13004470" : "bhvTreasureChestsJrb", - "13004494" : "bhvTreasureChests", - "130044b8" : "bhvTreasureChestBottom", - "130044e0" : "bhvTreasureChestTop", - "130044fc" : "bhvMips", - "13004538" : "bhvYoshi", - "13004580" : "bhvKoopa", - "130045d0" : "bhvKoopaRaceEndpoint", - "130045f8" : "bhvKoopaFlag", - "13004634" : "bhvPokey", - "13004668" : "bhvPokeyBodyPart", - "13004698" : "bhvSwoop", - "130046dc" : "bhvFlyGuy", - "1300472c" : "bhvGoomba", - "13004770" : "bhvGoombaTripletSpawner", - "1300478c" : "bhvChainChomp", - "130047e4" : "bhvChainChompChainPart", - "1300481c" : "bhvWoodenPost", - "13004868" : "bhvChainChompGate", - "13004898" : "bhvWigglerHead", - "130048e0" : "bhvWigglerBody", - "13004918" : "bhvEnemyLakitu", - "13004954" : "bhvCameraLakitu", - "13004988" : "bhvCloud", - "130049ac" : "bhvCloudPart", - "130049c8" : "bhvSpiny", - "13004a00" : "bhvMontyMole", - "13004a58" : "bhvMontyMoleHole", - "13004a78" : "bhvMontyMoleRock", - "13004ab0" : "bhvPlatformOnTrack", - "13004af4" : "bhvTrackBall", - "13004b1c" : "bhvSeesawPlatform", - "13004b44" : "bhvFerrisWheelAxle", - "13004b6c" : "bhvFerrisWheelPlatform", - "13004b8c" : "bhvWaterBombSpawner", - "13004ba8" : "bhvWaterBomb", - "13004bd4" : "bhvWaterBombShadow", - "13004bf0" : "bhvTTCRotatingSolid", - "13004c24" : "bhvTTCPendulum", - "13004c5c" : "bhvTTCTreadmill", - "13004c94" : "bhvTTCMovingBar", - "13004ccc" : "bhvTTCCog", - "13004cf8" : "bhvTTCPitBlock", - "13004d28" : "bhvTTCElevator", - "13004d64" : "bhvTTC2DRotator", - "13004d90" : "bhvTTCSpinner", - "13004dbc" : "bhvMrBlizzard", - "13004e08" : "bhvMrBlizzardSnowball", - "13004e4c" : "bhvSlidingPlatform2", - "13004e78" : "bhvOctagonalPlatformRotating", - "13004ea0" : "bhvAnimatesOnFloorSwitchPress", - "13004ecc" : "bhvActivatedBackAndForthPlatform", - "13004ef8" : "bhvRecoveryHeart", - "13004f10" : "bhvWaterBombCannon", - "13004f28" : "bhvCannonBarrelBubbles", - "13004f40" : "bhvUnagi", - "13004f78" : "bhvUnagiSubobject", - "13004f90" : "bhvDorrie", - "13004fd4" : "bhvHauntedChair", - "13005024" : "bhvMadPiano", - "1300506c" : "bhvFlyingBookend", - "130050b4" : "bhvBookendSpawn", - "130050d4" : "bhvHauntedBookshelfManager", - "130050f4" : "bhvBookSwitch", - "13005120" : "bhvFirePiranhaPlant", - "13005158" : "bhvSmallPiranhaFlame", - "1300518c" : "bhvFireSpitter", - "130051ac" : "bhvFlyguyFlame", - "130051e0" : "bhvSnufit", - "1300521c" : "bhvSnufitBalls", - "1300525c" : "bhvHorizontalGrindel", - "130052b4" : "bhvEyerokBoss", - "130052d0" : "bhvEyerokHand", - "13005310" : "bhvKlepto", - "13005354" : "bhvBird", - "13005380" : "bhvRacingPenguin", - "130053c4" : "bhvPenguinRaceFinishLine", - "130053dc" : "bhvPenguinRaceShortcutCheck", - "130053f4" : "bhvCoffinManager", - "13005414" : "bhvCoffin", - "13005440" : "bhvClamShell", - "13005468" : "bhvSkeeter", - "130054a0" : "bhvSkeeterWave", - "130054b8" : "bhvSwingPlatform", - "130054ec" : "bhvDonutPlatformSpawner", - "13005504" : "bhvDonutPlatform", - "13005528" : "bhvDDDPole", - "1300556c" : "bhvRedCoinStarMarker", - "13005598" : "bhvTripletButterfly", - "130055dc" : "bhvBubba", - "13005610" : "bhvBeginningLakitu", - "13005638" : "bhvBeginningPeach", - "1300565c" : "bhvEndBirds1", - "13005680" : "bhvEndBirds2", - "130056a4" : "bhvIntroScene", - "130056c0" : "_behaviorSegmentEnd", - "007d1d80" : "_behaviorSegmentRomEnd", - "8016f000" : "_goddardSegmentStart", - "007cc6c0" : "_goddardSegmentRomStart", - }, - - "Refresh 4" : { - "80000300" : "osTvType", - "80000308" : "osRomBase", - "8000030c" : "osResetType", - "80000318" : "osMemSize", - "8000031c" : "osAppNmiBuffer", - "80000000" : "D_80000000", - "a4000000" : "D_A4000000", - "a40004c0" : "D_A40004C0", - "a4000774" : "D_A4000774", - "a4001000" : "D_A4001000", - "a4040010" : "D_A4040010", - "a4080000" : "D_A4080000", - "a4300000" : "D_A4300000", - "a4300004" : "D_A4300004", - "a4300008" : "D_A4300008", - "a430000c" : "D_A430000C", - "a4400010" : "D_A4400010", - "a450000c" : "D_A450000C", - "a4600000" : "D_A4600000", - "a4600004" : "D_A4600004", - "a460000c" : "D_A460000C", - "a4600010" : "D_A4600010", - "a4700000" : "D_A4700000", - "a4700010" : "D_A4700010", - "a4800018" : "D_A4800018", - "b0000008" : "D_B0000008", - "b0000010" : "D_B0000010", - "b0000014" : "D_B0000014", - "c0000000" : "D_C0000000", - "c0000008" : "D_C0000008", - "c000000c" : "D_C000000C", - "802ef700" : "__osGetCurrFaultedThread", - "00000000" : "__romPos", - "04000000" : "_bootSegmentStart", - "007cc6c0" : "_bootSegmentRomStart", - "04001000" : "_bootSegmentEnd", - "007cd6c0" : "_bootSegmentRomEnd", - "80000400" : ".", - "80000400" : "_zbufferSegmentNoloadStart", - "80000400" : "0x25800", - "80000400" : "gZBuffer", - "80246000" : "_mainSegmentStart", - "007cc6c0" : "_mainSegmentRomStart", - "80246000" : "EntryPoint", - "80246050" : "handle_debug_key_sequences", - "80246170" : "Unknown80246170", - "802461cc" : "Dummy802461CC", - "802461dc" : "Dummy802461DC", - "802461ec" : "Dummy802461EC", - "802461fc" : "setup_mesg_queues", - "802462e0" : "AllocPool", - "80246338" : "create_thread", - "8024639c" : "handle_nmi_request", - "802463ec" : "receive_new_tasks", - "8024651c" : "start_sptask", - "8024659c" : "interrupt_gfx_sptask", - "802465ec" : "start_gfx_sptask", - "80246648" : "pretend_audio_sptask_done", - "8024669c" : "handle_vblank", - "802467fc" : "handle_sp_complete", - "8024694c" : "handle_dp_complete", - "802469b8" : "thread3_main", - "80246b14" : "set_vblank_handler", - "80246b74" : "SendMessage", - "80246bb4" : "dispatch_audio_sptask", - "80246c10" : "send_display_list", - "80246c9c" : "turn_on_audio", - "80246cb8" : "turn_off_audio", - "80246cf0" : "thread1_idle", - "80246df8" : "Main", - "80246e70" : "my_rdp_init", - "802471a4" : "my_rsp_init", - "80247284" : "clear_z_buffer", - "802473c8" : "display_frame_buffer", - "802474b8" : "clear_frame_buffer", - "80247620" : "clear_viewport", - "8024784c" : "draw_screen_borders", - "802479bc" : "make_viewport_clip_rect", - "80247b3c" : "create_task_structure", - "80247ccc" : "init_render_image", - "80247d14" : "end_master_display_list", - "80247db4" : "func_80247D84", - "80247f08" : "func_80247ED8", - "80247fdc" : "func_80247FAC", - "80248090" : "display_and_vsync", - "80248304" : "adjust_analog_stick", - "80248498" : "run_demo_inputs", - "80248638" : "read_controller_inputs", - "80248824" : "init_controllers", - "80248964" : "setup_game_memory", - "80248af0" : "thread5_game_loop", - "80248c40" : "func_80248C10", - "80248c58" : "func_80248C28", - "80248ce8" : "func_80248CB8", - "80248d78" : "func_80248D48", - "80248dc0" : "func_80248D90", - "80248e08" : "set_sound_mode", - "80248e54" : "play_menu_sounds", - "80248fec" : "play_painting_eject_sound", - "80249070" : "play_infinite_stairs_music", - "80249178" : "set_background_music", - "8024922c" : "func_802491FC", - "8024927c" : "func_8024924C", - "802492d0" : "play_cutscene_music", - "80249310" : "play_shell_music", - "8024934c" : "stop_shell_music", - "80249398" : "play_cap_music", - "80249404" : "fadeout_cap_music", - "80249448" : "stop_cap_music", - "802494d8" : "audio_game_loop_tick", - "80249500" : "thread4_sound", - "802495e0" : "level_control_timer", - "802496b8" : "pressed_paused", - "80249764" : "set_play_mode", - "8024978c" : "func_8024975C", - "802497b8" : "func_80249788", - "8024982c" : "nop_802497FC", - "8024983c" : "func_8024980C", - "8024995c" : "func_8024992C", - "80249a10" : "set_mario_initial_cap_powerup", - "80249ab4" : "set_mario_initial_action", - "80249cd8" : "init_mario_after_warp", - "8024a124" : "func_8024A02C", - "8024a18c" : "func_8024A094", - "8024a1d8" : "func_8024A0E0", - "8024a374" : "check_instant_warp", - "8024a584" : "func_8024A48C", - "8024a700" : "initiate_warp", - "8024a7b4" : "get_painting_warp_node", - "8024a85c" : "initiate_painting_warp", - "8024a9cc" : "level_trigger_warp", - "8024aedc" : "initiate_delayed_warp", - "8024b13c" : "update_hud_values", - "8024b390" : "basic_update", - "8024b3e4" : "play_mode_normal", - "8024b5d4" : "play_mode_paused", - "8024b6cc" : "play_mode_frame_advance", - "8024b798" : "level_set_transition", - "8024b7c0" : "play_mode_change_area", - "8024b880" : "play_mode_change_level", - "8024b9b8" : "update_level", - "8024ba8c" : "init_level", - "8024bcd8" : "lvl_init_or_update", - "8024bd5c" : "lvl_init_from_save_file", - "8024be14" : "lvl_set_current_level", - "8024bfa0" : "lvl_play_the_end_screen_sound", - "8024bff0" : "get_mario_cap_flag", - "8024c0b8" : "object_facing_mario", - "8024c16c" : "mario_angle_to_object", - "8024c1d8" : "determine_interaction", - "8024c51c" : "attack_object", - "8024c618" : "mario_stop_riding_object", - "8024c66c" : "mario_grab_used_object", - "8024c6c0" : "mario_drop_held_object", - "8024c780" : "mario_throw_held_object", - "8024c894" : "mario_stop_riding_and_holding", - "8024c8fc" : "does_mario_have_hat", - "8024c928" : "mario_blow_off_cap", - "8024ca68" : "mario_lose_cap_to_enemy", - "8024caf8" : "mario_retrieve_cap", - "8024cb58" : "able_to_grab_object", - "8024cbfc" : "mario_get_collided_object", - "8024cc7c" : "mario_check_object_grab", - "8024ce08" : "bully_knock_back_mario", - "8024d0b4" : "bounce_off_object", - "8024d130" : "hit_object_from_below", - "8024d2bc" : "determine_knockback_action", - "8024d578" : "push_mario_out_of_object", - "8024d72c" : "bounce_back_from_attack", - "8024d804" : "func_8024D664", - "8024d8b0" : "take_damage_from_interact_object", - "8024d998" : "take_damage_and_knock_back", - "8024daac" : "reset_mario_pitch", - "8024db2c" : "interact_coin", - "8024dbf0" : "interact_water_ring", - "8024dc28" : "interact_star_or_key", - "8024de4c" : "interact_bbh_entrance", - "8024df10" : "interact_warp", - "8024e0c4" : "interact_warp_door", - "8024e2fc" : "get_door_save_file_flag", - "8024e420" : "interact_door", - "8024e6ec" : "interact_cannon_base", - "8024e778" : "interact_igloo_barrier", - "8024e7d4" : "interact_tornado", - "8024e8f0" : "interact_whirlpool", - "8024e9d0" : "interact_wind", - "8024ead8" : "interact_flame", - "8024ec54" : "interact_snufit_bullet", - "8024ed84" : "interact_clam_or_bubba", - "8024ee44" : "interact_bully", - "8024eff8" : "interact_shock", - "8024f170" : "interact_mr_blizzard", - "8024f1e0" : "interact_hit_from_below", - "8024f354" : "interact_bounce_top", - "8024f4ac" : "interact_unknown_08", - "8024f55c" : "interact_damage", - "8024f5cc" : "interact_breakable", - "8024f6a4" : "interact_koopa_shell", - "8024f7a8" : "check_object_grab_mario", - "8024f8bc" : "interact_pole", - "8024fa60" : "interact_hoot", - "8024fb30" : "interact_cap", - "8024fd2c" : "interact_grabbable", - "8024fe6c" : "func_8024FC94", - "8024ff04" : "func_8024FD2C", - "80250098" : "func_8024FEC0", - "80250198" : "interact_text", - "80250230" : "check_kick_or_punch_wall", - "802503f0" : "mario_process_interactions", - "802505c8" : "check_death_barrier", - "8025065c" : "check_lava_boost", - "80250724" : "pss_begin_slide", - "80250778" : "pss_end_slide", - "802507fc" : "mario_handle_special_floors", - "80250940" : "is_anim_at_end", - "8025097c" : "is_anim_past_end", - "802509b8" : "set_mario_animation", - "80250b04" : "set_mario_anim_with_accel", - "80250c7c" : "set_anim_to_frame", - "80250d38" : "is_anim_past_frame", - "80250e54" : "find_mario_anim_flags_and_translation", - "80251020" : "update_mario_pos_for_anim", - "802510dc" : "return_mario_anim_y_translation", - "80251120" : "play_sound_if_no_flag", - "8025118c" : "play_mario_jump_sound", - "80251274" : "adjust_sound_for_speed", - "80251310" : "play_sound_and_spawn_particles", - "80251444" : "play_mario_action_sound", - "802514ac" : "play_mario_landing_sound", - "80251510" : "play_mario_landing_sound_once", - "80251574" : "play_mario_heavy_landing_sound", - "802515d8" : "play_mario_heavy_landing_sound_once", - "8025163c" : "play_mario_sound", - "80251708" : "mario_set_forward_vel", - "8025177c" : "mario_get_floor_class", - "802518a8" : "mario_get_terrain_sound_addend", - "80251a48" : "resolve_and_return_wall_collisions", - "80251afc" : "vec3f_find_ceil", - "80251b54" : "mario_facing_downhill", - "80251bd4" : "mario_floor_is_slippery", - "80251cfc" : "mario_floor_is_slope", - "80251e24" : "mario_floor_is_steep", - "80251f24" : "find_floor_height_relative_polar", - "80252000" : "find_floor_slope", - "802521a0" : "update_mario_sound_and_camera", - "8025229c" : "set_steep_jump_action", - "80252cf4" : "set_mario_action", - "80252e5c" : "set_jump_from_landing", - "802530a0" : "set_jumping_action", - "80253178" : "drop_and_set_mario_action", - "802531c4" : "hurt_and_set_mario_action", - "80253218" : "check_common_action_exits", - "80253300" : "check_common_hold_action_exits", - "802533e4" : "transition_submerged_to_walking", - "80253488" : "set_water_plunge_action", - "80253588" : "squish_mario_model", - "80253720" : "debug_print_speed_action_normal", - "80253838" : "update_mario_button_inputs", - "8025395c" : "update_mario_joystick_inputs", - "80253a60" : "update_mario_geometry_inputs", - "80253d58" : "update_mario_inputs", - "80253ec0" : "set_submerged_cam_preset_and_spawn_bubbles", - "80254060" : "update_mario_health", - "802542b4" : "update_mario_info_for_cam", - "80254338" : "mario_reset_bodystate", - "80254390" : "sink_mario_in_quicksand", - "802543e8" : "update_and_return_cap_flags", - "80254588" : "mario_update_hitbox_and_cap_model", - "80254830" : "execute_mario_action", - "80254b20" : "init_mario", - "80254f44" : "init_mario_from_save_file", - "80255080" : "get_additive_y_vel_for_jumps", - "8025509c" : "nop_80254E3C", - "802550b0" : "nop_80254E50", - "802550c0" : "transfer_bully_speed", - "80255238" : "init_bully_collision_data", - "802552fc" : "mario_bonk_reflection", - "80255414" : "mario_update_quicksand", - "80255654" : "mario_push_off_steep_floor", - "8025570c" : "mario_update_moving_sand", - "8025580c" : "mario_update_windy_ground", - "802559b0" : "stop_and_set_height_to_floor", - "80255a34" : "stationary_ground_step", - "80255d88" : "perform_ground_step", - "80255ec4" : "check_ledge_grab", - "802560ac" : "perform_air_quarter_step", - "802564e0" : "apply_twirl_gravity", - "80256584" : "should_strengthen_gravity_for_jump_ascent", - "8025661c" : "apply_gravity", - "802569f8" : "apply_vertical_wind", - "80256b24" : "perform_air_step", - "80256cd8" : "set_vel_from_pitch_and_yaw", - "80256d8c" : "set_vel_from_yaw", - "80256e00" : "get_credits_str_width", - "80256e88" : "print_displaying_credits_entry", - "80257060" : "BehEndPeachLoop", - "802570dc" : "BehEndToadLoop", - "80257198" : "geo_switch_peach_eyes", - "802572b0" : "get_star_collection_dialog", - "8025733c" : "handle_save_menu", - "80257450" : "spawn_obj_at_mario_rel_yaw", - "802574e8" : "cutscene_take_cap_off", - "80257548" : "cutscene_put_cap_on", - "802575a8" : "mario_ready_to_speak", - "80257640" : "set_mario_npc_dialog", - "80257748" : "act_reading_npc_dialog", - "80257980" : "act_waiting_for_dialog", - "80257a0c" : "act_disappeared", - "80257ab0" : "act_reading_automatic_dialog", - "80257ce4" : "act_reading_sign", - "80257eac" : "act_debug_free_move", - "80258184" : "general_star_dance_handler", - "80258420" : "act_star_dance", - "802584dc" : "act_star_dance_water", - "802585c0" : "act_fall_after_star_grab", - "802586cc" : "common_death_handler", - "80258744" : "act_standing_death", - "802587ec" : "act_electrocution", - "8025883c" : "act_suffocation", - "8025888c" : "act_death_on_back", - "802588f8" : "act_death_on_stomach", - "80258964" : "act_quicksand_death", - "80258a7c" : "act_eaten_by_bubba", - "80258b24" : "launch_mario_until_land", - "80258ba8" : "act_unlocking_key_door", - "80258dac" : "act_unlocking_star_door", - "80258f94" : "act_entering_star_door", - "80259264" : "act_going_through_door", - "802593cc" : "act_warp_door_spawn", - "802594d4" : "act_emerge_from_pipe", - "80259608" : "act_spawn_spin_airborne", - "80259740" : "act_spawn_spin_landing", - "802597ac" : "act_exit_airborne", - "80259854" : "act_falling_exit_airborne", - "802598d0" : "act_exit_land_save_dialog", - "80259c30" : "act_death_exit", - "80259ce8" : "act_unused_death_exit", - "80259d74" : "act_falling_death_exit", - "80259e00" : "act_special_exit_airborne", - "80259ef8" : "act_special_death_exit", - "80259fcc" : "act_spawn_no_spin_airborne", - "8025a040" : "act_spawn_no_spin_landing", - "8025a0bc" : "act_bbh_enter_spin", - "8025a494" : "act_bbh_enter_jump", - "8025a610" : "act_teleport_fade_out", - "8025a6fc" : "act_teleport_fade_in", - "8025a858" : "act_shocked", - "8025a9ac" : "act_squished", - "8025ae0c" : "act_putting_on_cap", - "8025aea8" : "stuck_in_ground_handler", - "8025affc" : "act_head_stuck_in_ground", - "8025b050" : "act_butt_stuck_in_ground", - "8025b0a4" : "act_feet_stuck_in_ground", - "8025d798" : "mario_execute_cutscene_action", - "8025dd70" : "add_tree_leaf_particles", - "8025de1c" : "play_climbing_sounds", - "8025df04" : "set_pole_position", - "8025e21c" : "act_holding_pole", - "8025e5a8" : "act_climbing_pole", - "8025e7a4" : "act_grab_pole_slow", - "8025e830" : "act_grab_pole_fast", - "8025e930" : "act_top_of_pole_transition", - "8025ea30" : "act_top_of_pole", - "8025eb50" : "perform_hanging_step", - "8025ecfc" : "update_hang_moving", - "8025eed0" : "update_hang_stationary", - "8025ef58" : "act_start_hanging", - "8025f0b4" : "act_hanging", - "8025f1e4" : "act_hang_moving", - "8025f384" : "let_go_of_ledge", - "8025f4b4" : "func_8025F0DC", - "8025f560" : "func_8025F188", - "8025f644" : "update_ledge_climb", - "8025f6c0" : "act_ledge_grab", - "8025f970" : "act_ledge_climb_slow", - "8025fa64" : "act_ledge_climb_down", - "8025fae8" : "act_ledge_climb_fast", - "8025fb90" : "act_grabbed", - "8025fc6c" : "act_in_cannon", - "80260154" : "act_tornado_twirling", - "80260568" : "check_common_automatic_cancels", - "802605d0" : "mario_execute_automatic_action", - "802608b0" : "func_802604E0", - "80260aac" : "func_802606DC", - "80260cb4" : "act_idle", - "80260f94" : "func_80260BC4", - "80261000" : "act_start_sleeping", - "80261268" : "act_sleeping", - "802614fc" : "act_waking_up", - "8026168c" : "act_shivering", - "802618d8" : "act_coughing", - "802619d0" : "act_hold_idle", - "80261ad0" : "act_hold_heavy_idle", - "80261bf8" : "act_standing_against_wall", - "80261cec" : "act_in_quicksand", - "80261db4" : "act_crouching", - "80261f70" : "act_panting", - "80262080" : "act_hold_panting_unused", - "8026217c" : "func_80261D70", - "802621dc" : "act_braking_stop", - "802622dc" : "act_butt_slide_stop", - "80262398" : "func_80261F8C", - "80262490" : "act_slide_kick_slide_stop", - "80262530" : "act_start_crouching", - "80262650" : "act_stop_crouching", - "80262770" : "act_start_crawling", - "80262890" : "act_stop_crawling", - "80262980" : "func_80262574", - "80262bc4" : "func_802627B8", - "80262c34" : "func_80262828", - "80262d68" : "act_jump_land_stop", - "80262dc4" : "act_double_jump_land_stop", - "80262e20" : "act_side_flip_land_stop", - "80262e94" : "act_freefall_land_stop", - "80262ef0" : "act_triple_jump_land_stop", - "80262f50" : "act_backflip_land_stop", - "80262fec" : "act_lava_boost_land", - "8026305c" : "act_long_jump_land_stop", - "802630f8" : "func_80262CEC", - "802631f0" : "func_80262DE4", - "802632e8" : "act_air_throw_land", - "802633b4" : "act_twirl_land", - "8026350c" : "act_ground_pound_land", - "802635e8" : "act_first_person", - "80263784" : "func_80263378", - "80263898" : "mario_execute_stationary_action", - "80263e60" : "func_80263A50", - "80263ee4" : "func_80263AD4", - "80264024" : "func_80263C14", - "8026409c" : "begin_walking_action", - "802640fc" : "check_ledge_climb_down", - "802642b4" : "slide_bonk", - "80264340" : "set_triple_jump_action", - "8026440c" : "update_sliding_angle", - "80264740" : "update_sliding", - "80264b54" : "apply_slope_accel", - "80264d80" : "apply_landing_accel", - "80264e18" : "update_shell_speed", - "80265080" : "apply_slope_decel", - "802651b0" : "update_decelerating_speed", - "80265244" : "update_walking_speed", - "80265458" : "should_begin_sliding", - "80265514" : "analog_stick_held_back", - "80265558" : "check_ground_dive_or_punch", - "80265620" : "begin_braking_action", - "80265700" : "func_802652F0", - "80265b1c" : "func_8026570C", - "80265d90" : "func_80265980", - "80265df8" : "func_802659E8", - "80266038" : "func_80265C28", - "802661cc" : "func_80265DBC", - "80266354" : "act_walking", - "802665b4" : "act_move_punching", - "80266734" : "act_hold_walking", - "8026699c" : "act_hold_heavy_walking", - "80266af8" : "act_turning_around", - "80266d4c" : "act_finish_turning_around", - "80266e48" : "act_braking", - "80266fc8" : "act_decelerating", - "80267240" : "act_hold_decelerating", - "80267504" : "act_riding_shell_ground", - "80267728" : "act_crawling", - "8026795c" : "act_burning_ground", - "80267c24" : "func_80267814", - "80267ce4" : "common_slide_action", - "80267fa4" : "common_slide_action_with_jump", - "80268074" : "act_butt_slide", - "802680d4" : "act_hold_butt_slide", - "80268168" : "act_crouch_slide", - "80268338" : "act_slide_kick_slide", - "802684ac" : "stomach_slide_action", - "802685c0" : "act_stomach_slide", - "80268608" : "act_hold_stomach_slide", - "80268684" : "act_dive_slide", - "802687b8" : "common_ground_knockback_action", - "802689f8" : "act_hard_backward_ground_kb", - "80268adc" : "act_hard_forward_ground_kb", - "80268b64" : "act_backward_ground_kb", - "80268bb0" : "act_forward_ground_kb", - "80268bfc" : "act_soft_backward_ground_kb", - "80268c48" : "act_soft_forward_ground_kb", - "80268c94" : "act_ground_bonk", - "80268d04" : "act_death_exit_land", - "80268dcc" : "common_landing_action", - "80268f78" : "common_landing_cancels", - "80269108" : "act_jump_land", - "80269170" : "act_freefall_land", - "802691d8" : "act_side_flip_land", - "80269264" : "act_hold_jump_land", - "80269300" : "act_hold_freefall_land", - "8026939c" : "act_long_jump_land", - "8026947c" : "act_double_jump_land", - "802694e4" : "act_triple_jump_land", - "80269588" : "act_backflip_land", - "80269640" : "quicksand_jump_land_action", - "80269788" : "act_quicksand_jump_land", - "802697dc" : "act_hold_quicksand_jump_land", - "80269830" : "check_common_moving_cancels", - "80269954" : "mario_execute_moving_action", - "80269f40" : "play_flip_sounds", - "80269fc0" : "play_far_fall_sound", - "8026a090" : "func_u_8026A090", - "8026a12c" : "lava_boost_on_wall", - "8026a224" : "check_fall_damage", - "8026a400" : "check_kick_or_dive_in_air", - "8026a494" : "should_get_stuck_in_ground", - "8026a598" : "check_fall_damage_or_get_stuck", - "8026a62c" : "check_horizontal_wind", - "8026a818" : "update_air_with_turn", - "8026aa48" : "update_air_without_turn", - "8026acd8" : "update_lava_boost_or_twirling", - "8026ae5c" : "update_flying_yaw", - "8026b004" : "update_flying_pitch", - "8026b17c" : "update_flying", - "8026b444" : "common_air_action_step", - "8026b6a0" : "act_jump", - "8026b740" : "act_double_jump", - "8026b814" : "act_triple_jump", - "8026b90c" : "act_backflip", - "8026b9ac" : "act_freefall", - "8026bab8" : "act_hold_jump", - "8026bbb4" : "act_hold_freefall", - "8026bcc0" : "act_side_flip", - "8026bdcc" : "act_wall_kick_air", - "8026be78" : "act_long_jump", - "8026bf40" : "act_riding_shell_air", - "8026c034" : "act_twirling", - "8026c1e0" : "act_dive", - "8026c4b8" : "act_air_throw", - "8026c5d0" : "act_water_jump", - "8026c738" : "act_hold_water_jump", - "8026c880" : "act_steep_jump", - "8026c9fc" : "act_ground_pound", - "8026cd0c" : "act_burning_jump", - "8026ce50" : "act_burning_fall", - "8026cf28" : "act_crazy_box_bounce", - "8026d1b0" : "common_air_knockback_step", - "8026d33c" : "func_8026CDFC", - "8026d3c8" : "act_backward_air_kb", - "8026d43c" : "act_forward_air_kb", - "8026d4b0" : "act_hard_backward_air_kb", - "8026d508" : "act_hard_forward_air_kb", - "8026d560" : "act_thrown_backward", - "8026d608" : "act_thrown_forward", - "8026d6fc" : "act_soft_bonk", - "8026d770" : "act_getting_blown", - "8026d988" : "act_air_hit_wall", - "8026db54" : "act_forward_rollout", - "8026dcf4" : "act_backward_rollout", - "8026de98" : "act_butt_slide_air", - "8026e088" : "act_hold_butt_slide_air", - "8026e2b4" : "act_lava_boost", - "8026e59c" : "act_slide_kick", - "8026e810" : "act_jump_kick", - "8026e968" : "act_shot_from_cannon", - "8026ec00" : "act_flying", - "8026f158" : "act_riding_hoot", - "8026f2ec" : "act_flying_triple_jump", - "8026f614" : "act_top_of_pole_jump", - "8026f660" : "act_vertical_wind", - "8026f840" : "act_special_triple_jump", - "8026fa18" : "check_common_airborne_cancels", - "8026fb04" : "mario_execute_airborne_action", - "8027499c" : "mario_execute_submerged_action", - "80274eb0" : "animated_stationary_ground_step", - "80274f10" : "mario_update_punch_sequence", - "80275328" : "act_punching", - "8027546c" : "act_picking_up", - "802755fc" : "act_dive_picking_up", - "802756c8" : "act_placing_down", - "80275794" : "act_throwing", - "802758c0" : "act_heavy_throw", - "802759b4" : "act_stomach_slide_stop", - "80275a80" : "act_picking_up_bowser", - "80275b34" : "act_holding_bowser", - "80275e78" : "act_releasing_bowser", - "80275f0c" : "check_common_object_cancels", - "80275fe0" : "mario_execute_object_action", - "802761d0" : "geo_enfvx_main", - "802763d4" : "geo_skybox_main", - "802764b0" : "Geo18_802764B0", - "8027684c" : "bhvToadMessage_loop", - "80276910" : "bhvToadMessage_init", - "80276bb8" : "bhvUnlockDoorStar_init", - "80276ccc" : "bhvUnlockDoorStar_loop", - "802770a4" : "Geo18_802770A4", - "80277150" : "geo_switch_mario_stand_run", - "802771bc" : "geo_switch_mario_eyes", - "80277294" : "Geo18_80277294", - "802773a4" : "Geo18_802773A4", - "802774f4" : "geo_switch_mario_hand", - "802775cc" : "Geo18_802775CC", - "802776d8" : "geo_switch_mario_cap_effect", - "80277740" : "geo_switch_mario_cap_on_off", - "80277824" : "Geo18_80277824", - "8027795c" : "geo_switch_mario_hand_grab_pos", - "80277b14" : "geo_render_mirror_mario", - "80277d6c" : "geo_mirror_mario_backface_culling", - "80277ee0" : "set_segment_base_addr", - "80277f20" : "get_segment_base_addr", - "80277f50" : "segmented_to_virtual", - "80277fa8" : "virtual_to_segmented", - "80277ff0" : "move_segment_table_to_dmem", - "80278074" : "main_pool_init", - "80278120" : "main_pool_alloc", - "80278238" : "main_pool_free", - "80278358" : "main_pool_realloc", - "802783c8" : "main_pool_available", - "802783e8" : "main_pool_push_state", - "80278498" : "main_pool_pop_state", - "8027868c" : "load_segment", - "802786f0" : "load_to_fixed_pool_addr", - "802787d8" : "load_segment_decompress", - "802788b4" : "func_80278304", - "80278974" : "load_engine_code_segment", - "80278a14" : "alloc_only_pool_init", - "80278ab8" : "alloc_only_pool_alloc", - "80278b28" : "alloc_only_pool_resize", - "80278b98" : "mem_pool_init", - "80278c58" : "mem_pool_alloc", - "80278d74" : "mem_pool_free", - "80278f2c" : "alloc_display_list", - "80279028" : "func_80278A78", - "80279084" : "func_80278AD4", - "80279840" : "save_file_do_save", - "802798fc" : "save_file_erase", - "80279960" : "save_file_copy", - "802799dc" : "save_file_load_all", - "80279bc8" : "save_file_reload", - "80279c44" : "save_file_collect_star_or_key", - "80279e44" : "save_file_exists", - "80279e80" : "save_file_get_max_coin_score", - "80279f80" : "save_file_get_course_star_count", - "8027a010" : "save_file_get_total_star_count", - "8027a0a8" : "save_file_set_flags", - "8027a0f4" : "save_file_clear_flags", - "8027a16c" : "save_file_get_flags", - "8027a1c8" : "save_file_get_star_flags", - "8027a23c" : "save_file_set_star_flags", - "8027a310" : "save_file_get_course_coin_score", - "8027a340" : "save_file_is_cannon_unlocked", - "8027a390" : "save_file_set_cannon_unlocked", - "8027a418" : "save_file_set_cap_pos", - "8027a4ac" : "save_file_get_cap_pos", - "8027a564" : "save_file_set_sound_mode", - "8027a5b4" : "save_file_get_sound_mode", - "8027a5d4" : "save_file_move_cap_to_default_location", - "8027a698" : "disable_warp_checkpoint", - "8027a6b0" : "check_if_should_set_warp_checkpoint", - "8027a718" : "check_warp_checkpoint", - "8027a7d0" : "func_8027A220", - "8027a83c" : "set_warp_transition_rgb", - "8027a8b0" : "print_intro_text", - "8027a93c" : "get_mario_spawn_type", - "8027a9c8" : "area_get_warp_node", - "8027aa28" : "func_8027A478", - "8027aa74" : "func_8027A4C4", - "8027ab04" : "clear_areas", - "8027ad74" : "func_8027A7C4", - "8027ae44" : "load_area", - "8027af48" : "func_8027A998", - "8027afbc" : "load_mario_area", - "8027b038" : "func_8027AA88", - "8027b0c0" : "change_area", - "8027b164" : "area_update_objects", - "8027b1a0" : "play_transition", - "8027b35c" : "play_transition_after_delay", - "8027b3b4" : "render_game", - "8027cf38" : "geo_set_animation_globals", - "8027da84" : "geo_process_held_object", - "8027de68" : "geo_try_process_children", - "8027dea8" : "geo_process_node_and_siblings", - "8027e130" : "geo_process_root", - "8027e3e0" : "profiler_log_thread5_time", - "8027e490" : "profiler_log_thread4_time", - "8027e520" : "profiler_log_gfx_time", - "8027e5cc" : "profiler_log_vblank_time", - "8027e65c" : "draw_profiler_bar", - "8027e958" : "draw_reference_profiler_bars", - "8027ebcc" : "draw_profiler_mode_1", - "8027eeac" : "draw_profiler_mode_0", - "8027f460" : "draw_profiler", - "8027f4e0" : "decompress", - "8027f590" : "set_camera_shake", - "8027f8b8" : "set_camera_shake_2", - "8027f9f0" : "func_8027F440", - "8027fb74" : "unused_set_camera_shake", - "8027fc18" : "return_height_above_floor", - "8027fe20" : "set_cam_focus_and_pos_rel_mario", - "8027fff8" : "set_camera_height", - "80280368" : "return_pitch_parallel_floor", - "802804f4" : "func_8027FF44", - "802806a4" : "find_in_bounds_yaw_wdw_bob_thi", - "80280810" : "return_open_camera_yaw", - "80280970" : "return_platform_camera_yaw", - "80280b00" : "func_80280550", - "80281188" : "func_80280BD8", - "802813bc" : "func_80280E0C", - "802813ec" : "func_80280E3C", - "8028146c" : "update_open_camera", - "80281588" : "update_platform_level_camera", - "802816a0" : "return_reverse_tower_camera_yaw", - "802817fc" : "update_reverse_tower_camera", - "80281904" : "return_parallel_tracking_camera_yaw", - "80282280" : "return_fixed_camera_yaw", - "802826a0" : "return_boss_fight_camera_yaw", - "80282c0c" : "unused_return_mode_5_camera_yaw", - "80282c28" : "unused_80282678", - "80282c3c" : "update_boss_fight_camera", - "80282c7c" : "update_parallel_tracking_camera", - "80282ce0" : "update_fixed_camera", - "80282d78" : "return_behind_mario_camera_yaw", - "80283340" : "return_behind_mario_water_camera_yaw", - "80283578" : "return_slide_camera_yaw", - "802839e4" : "update_behind_mario_camera", - "80283a18" : "nop_return_water_camera_yaw", - "80283a34" : "update_water_surface_camera", - "80283a68" : "return_mario_yaw", - "80283af8" : "return_close_or_free_roam_cam_yaw", - "80284cb8" : "update_close_or_free_roam_camera", - "80284cfc" : "camera_lakitu_zoom_distance", - "80284d38" : "camera_mario_zoom_distance", - "80284d74" : "return_spiral_stairs_camera_yaw", - "802850ac" : "update_spiral_stairs_camera", - "802850ec" : "return_slide_or_0f_camera_yaw", - "802851dc" : "update_slide_camera", - "8028526c" : "func_80284CBC", - "802852f4" : "func_80284D44", - "80285370" : "exit_c_up_mode", - "80285808" : "return_first_person_camera_yaw", - "802858a4" : "operate_c_up_looking", - "80285a2c" : "func_8028547C", - "80285d20" : "update_c_up_camera", - "80285ed8" : "return_cannon_camera_yaw", - "80285f60" : "update_cannon_camera", - "8028603c" : "init_transitional_movement", - "80286088" : "set_camera_preset", - "80286188" : "func_80285BD8", - "80286420" : "func_80285E70", - "802868f8" : "update_camera", - "80286f68" : "reset_camera", - "8028724c" : "init_camera", - "802879ec" : "func_80287404", - "80287bc4" : "select_mario_cam_mode", - "80287be0" : "func_802875F8", - "80287cb8" : "func_802876D0", - "80287d30" : "geo_camera_preset_and_pos", - "80287dc0" : "dummy_802877D8", - "80287dd4" : "dummy_802877EC", - "80287de8" : "vec3f_sub", - "80287e28" : "object_pos_to_vec3f", - "80287e50" : "vec3f_to_object_pos", - "80287e78" : "unused_object_angle_to_vec3s", - "80287ea0" : "evaluate_cubic_spline", - "802882e4" : "move_point_along_spline", - "80288624" : "select_or_activate_mario_cam", - "80288718" : "test_or_set_mario_cam_active", - "80288888" : "set_spline_values", - "802889b0" : "set_face_angle_from_spline", - "80288ce4" : "find_c_buttons_pressed", - "80288e68" : "update_camera_status", - "80288f5c" : "find_and_return_count_wall_collisions", - "80289198" : "vec3f_compare", - "80289214" : "clamp_pitch", - "802892d8" : "is_within_100_units_of_mario", - "8028935c" : "set_or_approach_f32_exponential", - "802893f4" : "approach_f32_exponential_bool", - "80289488" : "approach_f32_exponential", - "802894b4" : "approach_s16_exponential_bool", - "8028956c" : "approach_s16_exponential", - "80289610" : "approach_vec3f_exponential", - "80289684" : "set_or_approach_vec3f_exponential", - "802896f8" : "approach_vec3s_exponential", - "8028976c" : "camera_approach_s16_symmetric_bool", - "8028984c" : "camera_approach_s16_symmetric", - "8028993c" : "set_or_approach_s16_symmetric", - "802899cc" : "camera_approach_f32_symmetric_bool", - "80289b0c" : "camera_approach_f32_symmetric", - "80289c00" : "random_vec3s", - "80289d20" : "func_80289738", - "80289f88" : "clamp_positions_and_find_yaw_angle", - "8028a080" : "func_80289A98", - "8028a0f4" : "is_pos_less_than_bounds", - "8028a4ec" : "is_behind_surface", - "8028a6bc" : "func_8028A0D4", - "8028a7ec" : "is_mario_behind_surface", - "8028a834" : "scale_along_line", - "8028a8e8" : "check_if_vector_fits_in_bounds", - "8028aa28" : "calculate_verticle_angle", - "8028aad8" : "calculate_yaw", - "8028ab60" : "calculate_angles", - "8028ac28" : "calc_abs_dist", - "8028accc" : "calc_hor_dist", - "8028ad4c" : "rotate_in_xz", - "8028ae1c" : "rotate_in_yz", - "8028aef0" : "set_camera_pitch_shake", - "8028af4c" : "set_camera_yaw_shake", - "8028b00c" : "set_camera_roll_shake", - "8028b068" : "func_8028AA80", - "8028b11c" : "Unknown8028AB34", - "8028b1d0" : "increment_shake_offset", - "8028b218" : "shake_camera_pitch", - "8028b32c" : "shake_camera_yaw", - "8028b438" : "shake_camera_roll", - "8028b50c" : "func_8028AF24", - "8028b724" : "func_8028B13C", - "8028b754" : "func_8028B16C", - "8028b784" : "play_camera_buzz_if_cdown", - "8028b7c4" : "play_camera_buzz_if_cbutton", - "8028b804" : "play_camera_buzz_if_c_sideways", - "8028b850" : "play_sound_cbutton_up", - "8028b884" : "play_sound_cbutton_down", - "8028b8b8" : "play_sound_cbutton_side", - "8028b8ec" : "play_sound_button_change_blocked", - "8028b920" : "play_sound_rbutton_changed", - "8028b954" : "func_8028B36C", - "8028b9c4" : "func_8028B3DC", - "8028bd34" : "stop_mario", - "8028bd98" : "handle_c_button_movement", - "8028c038" : "func_8028BA38", - "8028c13c" : "set_camera_cutscene_table", - "8028c18c" : "determine_star_fadeout_cutscene_table", - "8028c26c" : "return_table_door_push_or_pull", - "8028c2c8" : "return_cutscene_table", - "8028c7a0" : "instant_warp_camera_update", - "8028c8f0" : "approach_camera_height", - "8028c9ac" : "Unknown8028C3AC", - "8028c9cc" : "set_focus_position", - "8028cbf0" : "set_pos_from_face_angle_and_vec3f", - "8028cd94" : "set_pos_from_face_angle_and_rel_coords", - "8028cdec" : "determine_pushing_or_pulling_door", - "8028ce24" : "func_8028C824", - "8028d44c" : "set_camera_preset_fixed_ref_point", - "8028d5ac" : "set_camera_preset_platform_level", - "8028d5fc" : "set_camera_preset_boss_fight", - "8028d658" : "set_camera_preset_close_cam", - "8028d698" : "set_camera_preset_open_camera", - "8028d79c" : "parallel_tracking_init", - "8028d888" : "set_fixed_cam_axis_sa_lobby", - "8028d92c" : "func_8028D32C", - "8028da18" : "CameraRR00", - "8028da50" : "CameraRR04", - "8028daec" : "CameraRR02", - "8028db38" : "CameraRR0305", - "8028dbb4" : "CameraRR01", - "8028dbf4" : "CameraCotMC00", - "8028dc1c" : "CameraSL00", - "8028dc70" : "camera_change_set_free_roam_mode", - "8028dca4" : "move_camera_through_floor_while_descending", - "8028dd48" : "camera_change_hmc_maze_entrance", - "8028de2c" : "CameraHMC02", - "8028de5c" : "CameraHMC03", - "8028de90" : "CameraHMC04", - "8028dec4" : "CameraHMC05", - "8028def8" : "CameraSSL00", - "8028df24" : "CameraSSL0102", - "8028df6c" : "CameraSSL03", - "8028dfb4" : "CameraTHI00", - "8028dfe8" : "CameraTHI01", - "8028e01c" : "CameraRR07", - "8028e064" : "CameraRR08", - "8028e098" : "camera_change_hmc_cotmc_pool_entry", - "8028e0ec" : "CameraInside20", - "8028e164" : "CameraInside1E", - "8028e210" : "CameraInside1F", - "8028e298" : "CameraInside01", - "8028e300" : "CameraInside1213", - "8028e38c" : "CameraInside00", - "8028e3b8" : "CameraInside0E", - "8028e3f0" : "CameraInside0F", - "8028e41c" : "bbh_room_6_camera", - "8028e450" : "CameraBBH24", - "8028e47c" : "CameraBBH2E2F", - "8028e524" : "bbh_room_1_camera", - "8028e55c" : "CameraBBH01", - "8028e594" : "bbh_room_2_lower_camera", - "8028e5cc" : "bbh_room_4_camera", - "8028e604" : "bbh_room_8_camera", - "8028e63c" : "bbh_room_5_library_camera", - "8028e674" : "bbh_room_5_library_to_hidden_transition", - "8028e6c4" : "bbh_room_5_hidden_to_library_transition", - "8028e714" : "bbh_room_5_hidden_camera", - "8028e758" : "bbh_room_3_camera", - "8028e790" : "bbh_room_7_mr_i_camera", - "8028e7c8" : "bbh_room_7_mr_i_to_coffins_transition", - "8028e818" : "bbh_room_7_coffins_to_mr_i_transition", - "8028e868" : "CameraBBH3033", - "8028e8a0" : "CameraBBH34", - "8028e8cc" : "CameraBBH38", - "8028e930" : "bbh_room_12_upper_camera", - "8028e974" : "CameraBBH00", - "8028e9a0" : "bbh_room_2_library_camera", - "8028e9d8" : "bbh_room_2_library_to_trapdoor_transition", - "8028ea28" : "bbh_room_2_trapdoor_camera", - "8028ea60" : "bbh_room_2_trapdoor_transition", - "8028eab0" : "bbh_room_9_attic_camera", - "8028eae8" : "bbh_room_9_attic_transition", - "8028eb38" : "bbh_room_9_mr_i_transition", - "8028eb88" : "bbh_room_13_balcony_camera", - "8028ebc0" : "bbh_room_0_camera", - "8028ec04" : "camera_change_activate_ccm_slide_flag", - "8028ec2c" : "camera_change_deactivate_ccm_slide_flag", - "8028ec58" : "surface_type_presets", - "8028ed30" : "set_preset_via_surface_or_input", - "8028ed98" : "surface_type_presets_thi", - "8028eeb0" : "level_specific_camera_update", - "8028f670" : "resolve_geometry_collisions", - "8028f914" : "func_8028F2F0", - "8028fc9c" : "find_mario_relative_geometry", - "8028fe24" : "func_8028F800", - "8028fe58" : "func_8028F834", - "8028fe84" : "unused_8028F860", - "8028ff04" : "cutscene_object_with_dialog", - "8028ffc8" : "cutscene_object_without_dialog", - "8029000c" : "cutscene_object", - "80290098" : "set_cam_yaw_from_focus_and_pos", - "802900e0" : "func_8028FABC", - "80290104" : "func_8028FAE0", - "80290168" : "cap_switch_save", - "802901a4" : "func_8028FB80", - "802901fc" : "func_8028FBD8", - "802903b8" : "func_8028FD94", - "802904a8" : "CutsceneIntroPeach0_2", - "802904e4" : "CutsceneIntroPeach2_1", - "8029051c" : "func_8028FEDC", - "8029053c" : "move_credits_camera", - "80290784" : "func_80290144", - "802907f4" : "func_802901B4", - "80290864" : "func_80290224", - "802908e8" : "func_802902A8", - "802909d0" : "rotate_camera", - "80290a5c" : "CutsceneEnterSomething8029041C", - "80290abc" : "rotate_and_move_vec3f", - "80290b54" : "func_80290514", - "80290ba4" : "func_80290564", - "80290bd8" : "func_80290598", - "80290c08" : "unused_802905C8", - "80290c1c" : "Cutscene0FTodo0", - "80290c30" : "Cutscene0FTodo1", - "80290c44" : "CutscenePeachEnd0_1", - "80290c9c" : "CutscenePeachEnd0_2", - "80290d90" : "CutscenePeachEnd0", - "80290e00" : "CutscenePeachEnd2", - "80290e74" : "CutscenePeachEndCommon367A", - "80290eb0" : "CutscenePeachEnd3_1", - "80290f1c" : "CutscenePeachEnd3", - "80290f8c" : "CutscenePeachEnd1", - "80291074" : "CutscenePeachEnd4_1", - "80291108" : "CutscenePeachEnd4", - "802911c8" : "CutscenePeachEnd5_1", - "80291208" : "CutscenePeachEnd5_2", - "8029127c" : "CutscenePeachEnd5_3", - "802912b8" : "CutscenePeachEnd5_4", - "80291354" : "CutscenePeachEnd5", - "8029142c" : "CutscenePeachEnd6", - "802914cc" : "CutscenePeachEnd7_1", - "80291514" : "CutscenePeachEnd7", - "802915d4" : "CutscenePeachEnd8", - "80291654" : "CutscenePeachEnd9_1", - "802916b8" : "CutscenePeachEnd9_2", - "80291774" : "CutscenePeachEnd9", - "802917e4" : "CutscenePeachEndA_1", - "8029184c" : "CutscenePeachEndA_2", - "80291870" : "CutscenePeachEndA", - "80291924" : "CutscenePeachEndB", - "80291964" : "CutsceneGrandStar0_1", - "802919dc" : "CutsceneGrandStar0_2", - "80291ab4" : "CutsceneGrandStar0_4", - "80291b18" : "CutsceneGrandStar0_5", - "80291b68" : "CutsceneGrandStar0_6", - "80291bf4" : "CutsceneGrandStar0_7", - "80291c3c" : "CutsceneGrandStar0_3", - "80291cd0" : "CutsceneGrandStar0", - "80291db0" : "CutsceneGrandStar1_1", - "80291e84" : "CutsceneGrandStar1_2", - "80291f18" : "CutsceneGrandStar1_3", - "80292038" : "CutsceneGrandStar1_4", - "80292164" : "CutsceneGrandStar1", - "802921fc" : "func_80291BBC", - "8029228c" : "CutsceneDanceCommon", - "80292324" : "CutsceneStarDance1_4", - "80292370" : "CutsceneStarDance1_5", - "802923b8" : "CutsceneStarDance1_6", - "80292400" : "dummy_80291DC0", - "80292414" : "CutsceneStarDance1_1", - "8029244c" : "CutsceneStarDance1_3", - "80292484" : "CutsceneStarDance1_2", - "802924b8" : "CutsceneStarDance1", - "80292628" : "func_80291FE8", - "802926dc" : "CutsceneStarDance3_1", - "802927d0" : "CutsceneStarDance3_2", - "80292868" : "CutsceneStarDance3_3", - "80292974" : "CutsceneStarDance3_4", - "80292a20" : "CutsceneStarDance3_5", - "80292a4c" : "CutsceneStarDance3_6", - "80292a80" : "CutsceneStarDance3", - "80292c00" : "CutsceneStarDance2_1", - "80292d80" : "CutsceneStarDance2_3", - "80292e2c" : "CutsceneStarDance2_2", - "80292ec4" : "func_80292884", - "80292f40" : "CutsceneStarDance2_4", - "80292f98" : "CutsceneStarDance2_5", - "80292fe4" : "CutsceneStarDance2_6", - "80293018" : "CutsceneStarDance2", - "802930f0" : "CutsceneKeyDance0_6", - "80293164" : "CutsceneKeyDance0_2", - "802931c0" : "CutsceneKeyDance0_3", - "80293220" : "CutsceneKeyDance0_4", - "8029328c" : "CutsceneKeyDance0_5", - "802932f4" : "CutsceneKeyDance0_7", - "80293328" : "CutsceneKeyDance0_8", - "80293354" : "CutsceneKeyDance0_1", - "8029338c" : "CutsceneKeyDance0", - "80293488" : "CutsceneEnterBowserPlatform0_4", - "802934b4" : "CutsceneEnterBowserPlatform0_3", - "802934d8" : "CutsceneEnterBowserPlatform0_5", - "80293548" : "CutsceneEnterBowserPlatform0_8", - "802935e0" : "CutsceneEnterBowserPlatform0_9", - "80293624" : "CutsceneEnterBowserPlatform0_7", - "8029369c" : "CutsceneEnterBowserPlatform0_6", - "802936dc" : "CutsceneEnterBowserPlatform0_1", - "80293708" : "func_802930C8", - "80293734" : "CutsceneEnterBowserPlatform0_2", - "802937e8" : "bowser_fight_intro_dialog", - "8029386c" : "CutsceneEnterBowserPlatform1", - "802938c8" : "CutsceneEnterBowserPlatform2", - "80293944" : "CutsceneEnterBowserPlatform0", - "80293abc" : "CutsceneStarSpawn0_1", - "80293ae8" : "CutsceneStarSpawn0_2", - "80293b70" : "CutsceneStarSpawn1_1", - "80293bf4" : "CutsceneStarSpawn1_2", - "80293c2c" : "CutsceneStarSpawn0", - "80293cb0" : "CutsceneStarSpawn1", - "80293d5c" : "CutsceneStarSpawn2", - "80293d90" : "CutsceneExitWaterfall0_1", - "80293dd4" : "Cutscene80293794", - "80293e7c" : "CutsceneExitWaterfall0", - "80293ed8" : "CutsceneFallCommon1", - "80293f2c" : "CutsceneFallToCastleGrounds0_1", - "80293f70" : "CutsceneFallToCastleGrounds0", - "80293fcc" : "CutsceneSpecialStarSpawn0_1", - "80294024" : "CutsceneSpecialStarSpawn0_3", - "80294088" : "CutsceneSpecialStarSpawn0_4", - "802940cc" : "CutsceneSpecialStarSpawn0_5", - "8029410c" : "CutsceneSpecialStarSpawn0_2", - "802942cc" : "CutsceneSpecialStarSpawn0_6", - "802942f0" : "CutsceneSpecialStarSpawn0", - "802943d4" : "CutsceneSpecialStarSpawn1", - "80294428" : "func_80293DE8", - "80294718" : "CutscenePrepareCannon0_1", - "802947a4" : "CutscenePrepareCannon0_2", - "8029480c" : "func_802941CC", - "802948a0" : "CutscenePrepareCannon0_3", - "80294a14" : "CutscenePrepareCannon0", - "80294a94" : "CutscenePrepareCannon1", - "80294ae8" : "func_802944A8", - "80294b78" : "func_80294538", - "80294bb4" : "CutsceneDeath1_1", - "80294c28" : "CutsceneDeath1_2", - "80294c5c" : "CutsceneDeath1", - "80294cc4" : "CutsceneDeath2_1", - "80294d48" : "CutsceneDeath2_2", - "80294db4" : "CutsceneDeath2", - "80294e24" : "CutsceneBBHDeath0_1", - "80294ea8" : "CutsceneBBHDeath0_2", - "80294ee8" : "CutsceneBBHDeath0", - "80294f58" : "CutsceneQuicksandDeath0_1", - "80294f94" : "CutsceneQuicksandDeath0_2", - "80294fec" : "CutsceneQuicksandDeath0", - "802950b0" : "Cutscene1ATodo0_3", - "80295140" : "Cutscene1ATodo0_2", - "802951f0" : "Cutscene1ATodo0_1", - "80295270" : "Cutscene1ATodo0", - "80295310" : "CutsceneEnterPool0_1", - "802953dc" : "CutsceneEnterPool0_2", - "80295418" : "CutsceneEnterPool0", - "80295480" : "Cutscene26Todo1_1", - "802954ec" : "Cutscene26Todo1_5", - "80295518" : "Cutscene26Todo1_2", - "80295580" : "Cutscene26Todo1_3", - "80295670" : "Cutscene26Todo1_4", - "80295740" : "Cutscene26Todo1_7", - "8029576c" : "Cutscene26Todo1_6", - "802957c8" : "Cutscene26Todo1", - "80295894" : "Cutscene26Todo2", - "802958d4" : "CutsceneEnterPyramidTop0_1", - "80295930" : "CutsceneEnterPyramidTop0", - "80295a58" : "CutsceneDialog0_1", - "80295bf0" : "CutsceneDialog0_2", - "80295e24" : "CutsceneDialog0_3", - "80295e8c" : "CutsceneDialog0", - "80295fb0" : "CutsceneDialog1", - "80295fd8" : "CutsceneDialog2", - "80296020" : "CutsceneReadMessage0_1", - "80296160" : "CutsceneReadMessage0", - "802962c8" : "CutsceneReadMessage1", - "802962f0" : "CutsceneReadMessage2", - "80296318" : "CutsceneExitSuccess1", - "802963b8" : "CutsceneExitSuccess2", - "8029652c" : "CutsceneExitSuccess4", - "8029665c" : "CutsceneExitSuccess3", - "8029669c" : "CutsceneExitBowserSuccess0_1", - "802966e4" : "CutsceneExitSuccess5", - "80296710" : "CutsceneExitBowserSuccess0", - "802967c4" : "CutsceneExitNonPainting1", - "8029685c" : "CutsceneBBHExitSuccess0_1", - "802968a0" : "CutsceneBBHExitSuccess0", - "8029695c" : "CutsceneNonPaintingDeath0_1", - "802969f8" : "Cutscene1CTodo_0", - "80296a64" : "CutsceneNonPaintingDeath0_2", - "80296b30" : "CutsceneNonPaintingDeath0", - "80296bc8" : "CutsceneCapSwitchPress0_1", - "80296c4c" : "CutsceneCapSwitchPress0_4", - "80296d60" : "CutsceneCapSwitchPress0_5", - "80296da8" : "CutsceneCapSwitchPress0_2", - "80296eb4" : "CutsceneCapSwitchPress0_3", - "80296f38" : "CutsceneCapSwitchPress0_6", - "80296fa8" : "CutsceneCapSwitchPress0", - "80297148" : "CutsceneUnlockKeyDoor0_1", - "8029720c" : "CutsceneUnlockKeyDoor0_2", - "80297290" : "CutsceneUnlockKeyDoor0_5", - "802972ec" : "CutsceneUnlockKeyDoor0_6", - "80297300" : "CutsceneUnlockKeyDoor0_3", - "80297384" : "CutsceneUnlockKeyDoor0_4", - "802973b0" : "CutsceneUnlockKeyDoor0", - "80297464" : "intro_peach_move_camera_start_to_pipe", - "80297560" : "peach_letter_text", - "8029758c" : "play_sound_peach_reading_letter", - "802975c4" : "CutsceneIntroPeachCommon", - "8029762c" : "CutsceneIntroPeach4", - "802976bc" : "CutsceneIntroPeach3_2", - "80297728" : "CutsceneIntroPeach2_2", - "80297748" : "CutsceneIntroPeach0_1", - "80297784" : "CutsceneIntroPeach3_1", - "802977c8" : "CutsceneIntroPeach3_3", - "802977f4" : "intro_pipe_exit_text", - "80297820" : "play_sound_intro_turn_on_hud", - "8029784c" : "CutsceneIntroPeach2", - "80297908" : "CutsceneIntroPeach3", - "80297a38" : "CutsceneIntroPeach1", - "80297a64" : "CutsceneIntroPeach0", - "80297b58" : "CutsceneEndWaving0_1", - "80297b84" : "CutsceneEndWaving0", - "80297c14" : "CutsceneCredits0_1", - "80297c40" : "CutsceneCredits0", - "802980dc" : "CutsceneSlidingDoorsOpen0_1", - "8029819c" : "CutsceneSlidingDoorsOpen0_2", - "80298218" : "CutsceneSlidingDoorsOpen0_3", - "80298254" : "CutsceneSlidingDoorsOpen0_4", - "80298290" : "CutsceneSlidingDoorsOpen0_5", - "802983b4" : "CutsceneSlidingDoorsOpen0", - "80298458" : "CutsceneDoubleDoorsOpen1", - "802984a0" : "CutsceneEnterPainting0_1", - "802984b4" : "CutsceneEnterPainting0", - "802987b0" : "CutsceneExitPainting80298094", - "8029894c" : "CutsceneExitPainting80298230", - "802989e8" : "CutsceneExitPainting802982CC", - "80298af8" : "CutsceneExitPainting0", - "80298ba0" : "Cutscene11Todo_0", - "80298c2c" : "Cutscene11Todo_1", - "80298ccc" : "CutsceneExitPainting1", - "80298d44" : "CutsceneEnterCannon2", - "80298d9c" : "CutsceneEnterCannon1", - "80298fe8" : "CutsceneEnterCannon0", - "80299100" : "CutsceneDoor0", - "80299154" : "CutsceneDoor1", - "802991a8" : "CutsceneDoorWarp1", - "802991f0" : "CutsceneDoor2", - "802992cc" : "CutsceneDoor3", - "80299360" : "CutsceneDoor4", - "80299404" : "CutsceneDoorAB_2", - "802994e8" : "handle_cutscenes", - "8029a2f8" : "call_cutscene_func_in_time_range", - "8029a37c" : "set_cutscene_phase_at_frame", - "8029a3b4" : "func_80299C98", - "8029a41c" : "func_80299D00", - "8029a4d0" : "func_80299DB4", - "8029a5e8" : "set_fov_30", - "8029a60c" : "approach_fov_20", - "8029a64c" : "set_fov_45", - "8029a670" : "set_fov_29", - "8029a694" : "zoom_fov_30", - "8029a6f4" : "zoom_fov_for_sleep", - "8029a858" : "approach_fov_30", - "8029a894" : "approach_fov_60", - "8029a8d0" : "approach_fov_45", - "8029a968" : "approach_fov_80", - "8029a9a4" : "func_8029A288", - "8029aa3c" : "geo_camera_fov", - "8029ab94" : "set_fov_function", - "8029abb0" : "func_8029A494", - "8029ac30" : "func_8029A514", - "8029aef8" : "func_8029A7DC", - "8029af98" : "intro_peach_set_pos_and_opacity", - "8029b08c" : "bhv_intro_peach_loop", - "8029b28c" : "intro_lakitu_set_offset_from_camera", - "8029b358" : "intro_lakitu_set_focus", - "8029b3c8" : "intro_lakitu_set_pos_and_focus", - "8029b49c" : "bhv_intro_lakitu_loop", - "8029bde4" : "bhv_end_birds_1_loop", - "8029bf64" : "bhv_end_birds_2_loop", - "8029c0e4" : "func_8029B964", - "8029c254" : "bhv_intro_scene_loop", - "8029c770" : "nop_change_course", - "8029c780" : "copy_mario_state_to_object", - "8029c9cc" : "spawn_particle", - "8029ca58" : "bhv_mario_update", - "8029cb34" : "update_objects_starting_at", - "8029cbc8" : "update_objects_during_time_stop", - "8029cd28" : "update_objects_in_list", - "8029cd98" : "unload_deactivated_objects_in_list", - "8029ce58" : "set_object_respawn_info_bits", - "8029cedc" : "unload_objects_from_area", - "8029cfb0" : "spawn_objects_from_info", - "8029d1d8" : "stub_8029CA50", - "8029d1e8" : "clear_objects", - "8029d324" : "update_terrain_objects", - "8029d374" : "update_non_terrain_objects", - "8029d428" : "unload_deactivated_objects", - "8029d690" : "update_objects", - "8029d890" : "Geo18_8029D890", - "8029d924" : "Geo18_8029D924", - "8029db48" : "geo_switch_anim_state", - "8029dbd4" : "geo_switch_area", - "8029dcd4" : "func_8029D558", - "8029dda8" : "apply_object_scale_to_matrix", - "8029de80" : "func_8029D704", - "8029e1b0" : "set_object_held_state", - "8029e27c" : "lateral_dist_between_objects", - "8029e2f8" : "dist_between_objects", - "8029e398" : "obj_forward_vel_approach_upward", - "8029e3e8" : "approach_f32_signed", - "8029e494" : "approach_f32_symmetric", - "8029e530" : "approach_s16_symmetric", - "8029e5ec" : "obj_rotate_yaw_toward", - "8029e694" : "angle_to_object", - "8029e714" : "obj_turn_toward_object", - "8029e8bc" : "set_object_parent_relative_pos", - "8029e914" : "set_object_pos", - "8029e96c" : "set_object_angle", - "8029e9ac" : "spawn_object_abs_with_rot", - "8029ea24" : "spawn_object_rel_with_rot", - "8029eaac" : "Unknown8029E330", - "8029eb04" : "spawn_water_splash", - "8029ed20" : "spawn_object_at_origin", - "8029edcc" : "spawn_object", - "8029ee24" : "try_to_spawn_object", - "8029eeb8" : "spawn_object_with_scale", - "8029ef64" : "spawn_object_relative", - "8029effc" : "spawn_object_relative_with_scale", - "8029f070" : "obj_move_using_vel", - "8029f0c8" : "copy_object_graph_y_offset", - "8029f0e0" : "copy_object_pos_and_angle", - "8029f120" : "copy_object_pos", - "8029f148" : "copy_object_angle", - "8029f188" : "func_8029EA0C", - "8029f1b0" : "Unknown8029EA34", - "8029f200" : "linear_mtxf_mul_vec3f", - "8029f274" : "linear_mtxf_transpose_mul_vec3f", - "8029f2ec" : "apply_scale_to_object_transform", - "8029f3a8" : "copy_object_scale", - "8029f3d0" : "scale_object_xyz", - "8029f404" : "scale_object", - "8029f430" : "obj_scale", - "8029f464" : "SetObjAnimation", - "8029f4b4" : "set_obj_animation_and_sound_state", - "8029f514" : "func_8029ED98", - "8029f59c" : "func_8029EE20", - "8029f600" : "obj_enable_rendering_and_become_tangible", - "8029f620" : "obj_enable_rendering", - "8029f644" : "obj_disable_rendering_and_become_intangible", - "8029f66c" : "obj_disable_rendering", - "8029f694" : "obj_unhide", - "8029f6bc" : "obj_hide", - "8029f6e0" : "obj_set_pos_relative", - "8029f7d8" : "obj_set_pos_relative_to_parent", - "8029f820" : "obj_enable_rendering_2", - "8029f848" : "obj_unused_init_on_floor", - "8029f8ec" : "obj_set_facing_to_move_angles", - "8029f914" : "get_object_list_from_behavior", - "8029f95c" : "obj_nearest_object_with_behavior", - "8029f998" : "obj_dist_to_nearest_object_with_behavior", - "8029f9ec" : "obj_find_nearest_object_with_behavior", - "8029fb1c" : "find_unimportant_object", - "8029fb68" : "count_unimportant_objects", - "8029fbdc" : "count_objects_with_behavior", - "8029fc9c" : "obj_find_nearby_held_actor", - "8029fdb4" : "obj_change_action", - "8029fe00" : "func_8029F684", - "8029fe6c" : "func_8029F6F0", - "8029fea4" : "func_8029F728", - "8029ff04" : "func_8029F788", - "8029ffa4" : "func_8029F828", - "802a0008" : "obj_check_anim_frame", - "802a0050" : "obj_check_anim_frame_in_range", - "802a00ac" : "Unknown8029F930", - "802a0114" : "mario_is_in_air_action", - "802a0154" : "mario_is_dive_sliding", - "802a0198" : "func_8029FA1C", - "802a01d8" : "func_8029FA5C", - "802a0380" : "obj_get_thrown_or_placed", - "802a0474" : "obj_get_dropped", - "802a04c0" : "obj_set_model", - "802a04f0" : "mario_set_flag", - "802a0514" : "obj_clear_interact_status_flag", - "802a0568" : "mark_object_for_deletion", - "802a057c" : "obj_disable", - "802a05b4" : "obj_become_intangible", - "802a05d4" : "obj_become_tangible", - "802a05f0" : "make_object_tangible", - "802a0604" : "obj_update_floor_height", - "802a064c" : "obj_update_floor_height_and_get_floor", - "802a079c" : "obj_apply_drag_xz", - "802a0e68" : "obj_move_y", - "802a113c" : "obj_unused_resolve_wall_collisions", - "802a11a8" : "abs_angle_diff", - "802a120c" : "obj_move_xz_using_fvel_and_yaw", - "802a12a4" : "obj_move_y_with_terminal_vel", - "802a1308" : "obj_compute_vel_xz", - "802a1370" : "func_802A0BF4", - "802a1424" : "are_objects_collided", - "802a148c" : "obj_set_behavior", - "802a14c4" : "set_object_behavior", - "802a14fc" : "obj_has_behavior", - "802a1554" : "object_has_behavior", - "802a15ac" : "obj_lateral_dist_from_mario_to_home", - "802a1634" : "obj_lateral_dist_to_home", - "802a16ac" : "obj_outside_home_square", - "802a1774" : "obj_outside_home_rectangle", - "802a184c" : "obj_set_pos_to_home", - "802a188c" : "obj_set_pos_to_home_and_stop", - "802a18dc" : "obj_shake_y", - "802a1930" : "func_802A11B4", - "802a1960" : "Unknown802A11E4", - "802a19ac" : "obj_set_billboard", - "802a19c8" : "obj_set_hitbox_radius_and_height", - "802a19f0" : "obj_set_hurtbox_radius_and_height", - "802a1b34" : "spawn_object_loot_blue_coins", - "802a1b8c" : "spawn_object_loot_yellow_coins", - "802a1bdc" : "obj_spawn_loot_coin_at_mario_pos", - "802a1c68" : "obj_abs_y_dist_to_home", - "802a1cc4" : "Unknown802A1548", - "802a1f3c" : "obj_resolve_wall_collisions", - "802a2320" : "obj_update_floor_and_walls", - "802a2348" : "obj_move_standard", - "802a25b4" : "obj_move_using_vel_and_gravity", - "802a2644" : "obj_move_using_fvel_and_gravity", - "802a2674" : "set_object_pos_relative", - "802a2748" : "obj_angle_to_home", - "802a27b0" : "func_802A2008", - "802a2804" : "translate_object_local", - "802a2930" : "build_object_transform_from_pos_and_angle", - "802a2a18" : "func_802A2270", - "802a2a84" : "build_object_transform_relative_to_parent", - "802a2b28" : "Unknown802A2380", - "802a2b6c" : "obj_rotate_move_angle_using_vel", - "802a2bc4" : "obj_rotate_face_angle_using_vel", - "802a2c1c" : "obj_set_face_angle_to_move_angle", - "802a2c5c" : "obj_follow_path", - "802a2ed4" : "chain_segment_init", - "802a2f14" : "random_f32_around_zero", - "802a2f5c" : "scale_object_random", - "802a2fc0" : "translate_object_xyz_random", - "802a308c" : "translate_object_xz_random", - "802a31e0" : "func_802A2A38", - "802a3268" : "obj_reflect_move_angle_off_wall", - "802a32ac" : "obj_spawn_particles", - "802a34a4" : "set_object_hitbox", - "802a3604" : "signum_positive", - "802a3634" : "absf", - "802a3674" : "absi", - "802a36a4" : "obj_wait_then_blink", - "802a3754" : "obj_is_mario_ground_pounding_platform", - "802a37ac" : "func_802A3004", - "802a37dc" : "func_802A3034", - "802a3818" : "obj_push_mario_away", - "802a390c" : "obj_push_mario_away_from_cylinder", - "802a399c" : "BehDustSmokeLoop", - "802a3a4c" : "func_802A32A4", - "802a3a88" : "func_802A32E0", - "802a3b40" : "func_802A3398", - "802a3c18" : "func_802A3470", - "802a3cfc" : "obj_is_mario_on_platform", - "802a3d40" : "obj_shake_y_until", - "802a3dd4" : "func_802A362C", - "802a3e30" : "obj_call_action_function", - "802a3ef8" : "Unknown802A3750", - "802a3f24" : "func_802A377C", - "802a3f48" : "obj_mario_far_away", - "802a404c" : "obj_is_mario_moving_fast_or_in_air", - "802a40b8" : "item_in_array", - "802a4120" : "bhv_init_room", - "802a4210" : "obj_enable_rendering_if_mario_in_room", - "802a4360" : "obj_set_hitbox_and_die_if_attacked", - "802a4440" : "func_802A3C98", - "802a44f4" : "set_object_collision_data", - "802a452c" : "obj_if_hit_wall_bounce_away", - "802a4564" : "obj_hide_if_mario_far_away_y", - "802a45e4" : "Geo18_802A45E4", - "802a462c" : "Unknown802A3E84", - "802a46cc" : "obj_is_hidden", - "802a4704" : "enable_time_stop", - "802a4728" : "disable_time_stop", - "802a4750" : "set_time_stop_flags", - "802a4774" : "clear_time_stop_flags", - "802a47a0" : "func_802A3FF8", - "802a48bc" : "obj_is_mario_in_range_and_ready_to_speak", - "802a4960" : "obj_update_dialog", - "802a4be4" : "obj_update_dialog_with_cutscene", - "802a4f04" : "obj_has_model", - "802a4f58" : "obj_align_gfx_with_floor", - "802a5034" : "mario_is_within_rectangle", - "802a50fc" : "ShakeScreen", - "802a513c" : "attack_collided_non_mario_object", - "802a51ac" : "obj_was_attacked_or_ground_pounded", - "802a5228" : "copy_object_behavior_params", - "802a5248" : "func_802A4A70", - "802a5288" : "func_802A4AB0", - "802a52c4" : "func_802A4AEC", - "802a52f8" : "obj_check_grabbed_mario", - "802a5358" : "player_performed_grab_escape_action", - "802a540c" : "obj_unused_play_footstep_sound", - "802a5460" : "enable_time_stop_including_mario", - "802a5498" : "disable_time_stop_including_mario", - "802a54d8" : "obj_check_interacted", - "802a5524" : "obj_spawn_loot_blue_coin", - "802a5588" : "obj_spawn_star_at_y_offset", - "802a5620" : "func_802A4DB0", - "802a56bc" : "bhv_star_door_loop", - "802a58dc" : "bhv_piranha_particle_loop", - "802a597c" : "ActionMrIParticle0", - "802a5a44" : "ActionMrIParticle1", - "802a5aa0" : "bhv_mr_i_particle_loop", - "802a5acc" : "func_802A525C", - "802a5bd4" : "bhv_mr_i_body_loop", - "802a5d4c" : "ActionMrI3", - "802a6518" : "ActionMrI2", - "802a68a0" : "ActionMrI1", - "802a6ad8" : "ActionMrI0", - "802a6b7c" : "bhv_mr_i_loop", - "802a6c20" : "bhv_pole_init", - "802a6c74" : "bhv_giant_pole_loop", - "802a6cf4" : "bhv_thi_huge_island_top_loop", - "802a6d64" : "bhv_thi_tiny_island_top_loop", - "802a6ee4" : "ActionActivateCapSwitch0", - "802a7020" : "ActionActivateCapSwitch1", - "802a708c" : "ActionActivateCapSwitch2", - "802a7160" : "ActionActivateCapSwitch3", - "802a7170" : "bhv_cap_switch_loop", - "802a719c" : "Geo18_802A719C", - "802a7230" : "bhv_bobomb_anchor_mario_loop", - "802a7264" : "ActionKingBobomb0", - "802a7384" : "func_802A6AF8", - "802a73d8" : "ActionKingBobomb2", - "802a7598" : "ActionKingBobomb3", - "802a7804" : "ActionKingBobomb1", - "802a78d8" : "ActionKingBobomb6", - "802a7a60" : "ActionKingBobomb7", - "802a7b1c" : "ActionKingBobomb8", - "802a7b5c" : "ActionKingBobomb4", - "802a7d14" : "ActionKingBobomb5", - "802a7fbc" : "func_802A7748", - "802a8064" : "bhv_king_bobomb_loop", - "802a816c" : "bhv_beta_chest_bottom_init", - "802a81e8" : "bhv_beta_chest_bottom_loop", - "802a821c" : "bhv_beta_chest_lid_loop", - "802a8370" : "bhv_water_air_bubble_init", - "802a83a0" : "bhv_water_air_bubble_loop", - "802a8630" : "bhv_bubble_wave_init", - "802a86bc" : "Unknown802A7E48", - "802a870c" : "bhv_bubble_maybe_loop", - "802a88a4" : "bhv_small_water_wave_loop", - "802a8a38" : "func_802A81C4", - "802a8b18" : "bhv_particle_init", - "802a8bc0" : "bhv_particle_loop", - "802a8c88" : "bhv_small_bubbles_loop", - "802a8cdc" : "bhv_fish_group_loop", - "802a8d48" : "bhv_water_waves_init", - "802a8d98" : "bhv_cannon_base_unused_loop", - "802a8dc0" : "ActionOpenedCannon0", - "802a8f40" : "ActionOpenedCannon4", - "802a9114" : "ActionOpenedCannon6", - "802a92fc" : "ActionOpenedCannon5", - "802a93f8" : "ActionOpenedCannon1", - "802a9440" : "ActionOpenedCannon2", - "802a9460" : "ActionOpenedCannon3", - "802a9498" : "bhv_cannon_base_loop", - "802a94f8" : "bhv_cannon_barrel_loop", - "802a958c" : "func_802A8D18", - "802a9708" : "bhv_chuckya_anchor_mario_loop", - "802a973c" : "Unknown802A8EC8", - "802a98c4" : "func_802A9050", - "802a9994" : "ActionChuckya0", - "802a9d08" : "ActionChuckya1", - "802a9f54" : "ActionChuckya3", - "802a9fc8" : "ActionChuckya2", - "802aa02c" : "func_802A97B8", - "802aa0ac" : "bhv_chuckya_loop", - "802aa1b8" : "bhv_wf_breakable_wall_loop", - "802aa280" : "func_802A9A0C", - "802aa3c8" : "func_802A9B54", - "802aa3f4" : "bhv_kickable_board_loop", - "802aa700" : "bhv_tower_door_loop", - "802aa774" : "bhv_wf_rotating_wooden_platform_loop", - "802aa830" : "bhv_rotating_platform_loop", - "802aa948" : "func_802AA0D4", - "802aa97c" : "bhv_koopa_shell_underwater_loop", - "802aaa60" : "bhv_warp_loop", - "802aab54" : "BehFadingWarpLoop", - "802aac48" : "bhv_white_puff_exploding_loop", - "802aae8c" : "func_802AA618", - "802aaf48" : "bhv_unused_080c_init", - "802aaffc" : "func_802AA788", - "802ab060" : "func_802AA7EC", - "802ab158" : "func_802AA8E4", - "802ab18c" : "func_802AA918", - "802ab1c8" : "bhv_unused_080c_loop", - "802ab558" : "bhv_spawn_star_objects", - "802ab5c8" : "bhv_coin_sparkles_init", - "802ab650" : "bhv_yellow_coin_init", - "802ab70c" : "bhv_yellow_coin_loop", - "802ab748" : "bhv_temp_coin_loop", - "802ab7a4" : "bhv_coin_init", - "802ab860" : "bhv_coin_loop", - "802aba40" : "bhv_coin_formation_spawn_loop", - "802abc04" : "func_802AB364", - "802abee4" : "bhv_coin_formation_init", - "802abf0c" : "bhv_coin_formation_loop", - "802ac068" : "ActionCoinInsideBoo1", - "802ac15c" : "ActionCoinInsideBoo0", - "802ac294" : "bhv_coin_inside_boo_loop", - "802ac2c0" : "bhv_coin_sparkles_loop", - "802ac2ec" : "bhv_golden_coin_sparkles_loop", - "802ac3a8" : "bhv_punch_tiny_triangle_loop", - "802ac4a0" : "bhv_punch_tiny_triangle_init", - "802ac5b4" : "bhv_wall_tiny_star_particle_loop", - "802ac678" : "bhv_tiny_star_particles_init", - "802ac78c" : "bhv_pound_tiny_star_particle_loop", - "802ac864" : "bhv_pound_tiny_star_particle_init", - "802ac910" : "func_802AC070", - "802ac958" : "func_802AC0B8", - "802ac9d0" : "func_802AC130", - "802aca6c" : "func_802AC1CC", - "802acac8" : "bhv_door_loop", - "802acc3c" : "bhv_door_init", - "802ace80" : "bhv_star_door_loop_2", - "802ad078" : "ActionGrindelThwomp4", - "802ad10c" : "ActionGrindelThwomp2", - "802ad1a4" : "ActionGrindelThwomp3", - "802ad238" : "ActionGrindelThwomp1", - "802ad2d0" : "ActionGrindelThwomp0", - "802ad34c" : "bhv_grindel_thwomp_loop", - "802ad378" : "bhv_tumbling_bridge_platform_loop", - "802ad580" : "ActionTumblingBridge1", - "802ad76c" : "ActionTumblingBridge2", - "802ad7f4" : "ActionTumblingBridge3", - "802ad828" : "ActionTumblingBridge0", - "802ad890" : "bhv_tumbling_bridge_loop", - "802ad8bc" : "func_802AD01C", - "802ad8f0" : "ActionElevator0", - "802ada4c" : "ActionElevator1", - "802adb88" : "ActionElevator2", - "802adce4" : "ActionElevator4", - "802add70" : "ActionElevator3", - "802addf8" : "bhv_elevator_init", - "802adf6c" : "bhv_elevator_loop", - "802adf98" : "bhv_water_mist_spawn_loop", - "802adfd8" : "bhv_water_mist_loop", - "802ae0cc" : "spawn_triangle_break_particles", - "802ae238" : "bhv_water_mist_2_loop", - "802ae304" : "bhv_pound_white_puffs_init", - "802ae334" : "func_802ADA94", - "802ae360" : "bhv_unused_0e40_init", - "802ae394" : "Unknown802ADAF4", - "802ae45c" : "func_802ADBBC", - "802ae48c" : "bhv_ground_snow_init", - "802ae4c0" : "func_802ADC20", - "802ae534" : "bhv_wind_loop", - "802ae85c" : "bhv_unused_particle_spawn_loop", - "802ae908" : "bhv_ukiki_cage_star_loop", - "802aea6c" : "ukiki_cage_act_wait_for_ukiki", - "802aeab8" : "ukiki_cage_act_spin", - "802aeb1c" : "ukiki_cage_act_fall", - "802aeb74" : "ukiki_cage_act_hide", - "802aeb9c" : "bhv_ukiki_cage_loop", - "802aebc8" : "bhv_squishable_platform_loop", - "802aec40" : "bhv_bitfs_sinking_platform_loop", - "802aeca8" : "bhv_ddd_moving_pole_loop", - "802aecdc" : "bhv_bitfs_sinking_cage_platform_loop", - "802aedc0" : "bhv_beta_moving_flames_spawn_loop", - "802aeea4" : "bhv_beta_moving_flames_loop", - "802aef1c" : "bhv_flamethrower_flame_loop", - "802af1e8" : "bhv_flamethrower_loop", - "802af3fc" : "bhv_rr_rotating_bridge_platform_loop", - "802af448" : "bhv_bouncing_fireball_flame_loop", - "802af5f8" : "bhv_bouncing_fireball_loop", - "802af7c4" : "bhv_bowser_shock_wave_loop", - "802af9cc" : "bhv_black_smoke_upward_loop", - "802afa0c" : "bhv_black_smoke_bowser_loop", - "802afae4" : "bhv_black_smoke_mario_loop", - "802afbf8" : "bhv_flame_mario_loop", - "802afce4" : "bhv_beta_fish_splash_spawner_loop", - "802afd1c" : "bhv_spindrift_loop", - "802afee8" : "bhv_wf_solid_tower_platform_loop", - "802aff30" : "bhv_wf_elevator_tower_platform_loop", - "802b00e4" : "bhv_wf_sliding_tower_platform_loop", - "802b0244" : "func_802AF9A4", - "802b039c" : "func_802AFAFC", - "802b04b4" : "bhv_tower_platform_group_loop", - "802b0614" : "bhv_tree_snow_or_leaf_loop", - "802b0974" : "bhv_snow_leaf_particle_spawn_init", - "802b0b9c" : "func_802B02FC", - "802b0bec" : "bhv_squarish_path_moving_loop", - "802b0d48" : "bhv_piranha_plant_waking_bubbles_loop", - "802b0df0" : "bhv_piranha_plant_bubble_loop", - "802b1278" : "bhv_purple_switch_loop", - "802b14f4" : "func_802B0C54", - "802b15e8" : "bhv_pushable_loop", - "802b1714" : "func_802B0E74", - "802b17f4" : "func_802B0F54", - "802b19d8" : "func_802B1138", - "802b1ae0" : "bhv_hidden_object_loop", - "802b1b2c" : "bhv_breakable_box_loop", - "802b1bb0" : "Geo18_802B1BB0", - "802b1c54" : "bhv_heave_ho_throw_mario_loop", - "802b1d7c" : "ActionHeaveHo1", - "802b1e6c" : "ActionHeaveHo2", - "802b1ff4" : "ActionHeaveHo3", - "802b20a0" : "ActionHeaveHo0", - "802b2154" : "func_802B18B4", - "802b2278" : "bhv_heave_ho_loop", - "802b2340" : "bhv_ccm_touched_star_spawn_loop", - "802b23e0" : "bhv_unused_poundable_platform", - "802b2494" : "bhv_beta_trampoline_spring_loop", - "802b25ac" : "bhv_beta_trampoline_top_loop", - "802b26a4" : "ActionJumpingBox0", - "802b27d8" : "ActionJumpingBox1", - "802b2824" : "func_802B1F84", - "802b288c" : "bhv_jumping_box_loop", - "802b29b8" : "bhv_boo_cage_loop", - "802b2bc8" : "func_802B2328", - "802b2d10" : "bhv_alpha_boo_key_loop", - "802b3108" : "bhv_beta_boo_key_loop", - "802b3134" : "func_802B2894", - "802b3250" : "func_802B29B0", - "802b329c" : "bhv_grand_star_loop", - "802b3600" : "bhv_bowser_key_loop", - "802b37b8" : "bhv_white_puff_smoke_init", - "802b3810" : "bhv_bullet_bill_init", - "802b3830" : "ActionBulletBill0", - "802b38b8" : "ActionBulletBill1", - "802b394c" : "ActionBulletBill2", - "802b3b08" : "ActionBulletBill3", - "802b3b24" : "ActionBulletBill4", - "802b3be0" : "bhv_bullet_bill_loop", - "802b3c2c" : "ActionBowserTailAnchor0", - "802b3cdc" : "ActionBowserTailAnchor1", - "802b3d10" : "ActionBowserTailAnchor2", - "802b3d74" : "bhv_bowser_tail_anchor_loop", - "802b3df4" : "bhv_bowser_flame_spawn_loop", - "802b4080" : "bhv_bowser_body_anchor_loop", - "802b4184" : "func_802B38B4", - "802b41fc" : "func_802B392C", - "802b4288" : "func_802B39B8", - "802b4300" : "func_802B3A30", - "802b4368" : "func_802B3A98", - "802b43dc" : "func_802B3B0C", - "802b4478" : "ActionBowser5", - "802b44bc" : "ActionBowser6", - "802b45f4" : "func_802B3D24", - "802b473c" : "func_802B3E44", - "802b48d4" : "func_802B3FDC", - "802b4a1c" : "func_802B4124", - "802b4a3c" : "func_802B4144", - "802b4af4" : "func_u_802B4AF4", - "802b4bac" : "ActionBowser18", - "802b4be8" : "ActionBowser0", - "802b4ca4" : "ActionBowser15", - "802b4d14" : "ActionBowser14", - "802b4f00" : "ActionBowser16", - "802b5104" : "ActionBowser8", - "802b5218" : "ActionBowser12", - "802b53f4" : "func_802B4A44", - "802b5444" : "func_802B4A94", - "802b5554" : "func_802B4BA4", - "802b55cc" : "ActionBowser13", - "802b5798" : "ActionBowser17", - "802b58bc" : "ActionBowser10", - "802b59cc" : "ActionBowser9", - "802b5aec" : "func_802B5108", - "802b5c00" : "ActionBowser11", - "802b5c40" : "ActionBowser7", - "802b5f6c" : "func_802B5588", - "802b5fec" : "ActionBowser1", - "802b611c" : "func_802B5738", - "802b6190" : "ActionBowser2", - "802b6568" : "ActionBowser3", - "802b65d0" : "func_802B5C78", - "802b6670" : "func_802B5D18", - "802b6730" : "func_802B5DD8", - "802b67d4" : "func_802B5E7C", - "802b6878" : "func_802B5F20", - "802b6a10" : "func_802B60B8", - "802b6a78" : "func_802B6120", - "802b6bac" : "func_802B6254", - "802b6cf0" : "ActionBowser4", - "802b6e40" : "func_802B64E8", - "802b6ee0" : "ActionBowser19", - "802b711c" : "func_802B67C4", - "802b71e4" : "func_802B688C", - "802b72d4" : "func_802B697C", - "802b7418" : "func_802B6AC0", - "802b75a4" : "bhv_bowser_loop", - "802b7878" : "bhv_bowser_init", - "802b798c" : "Geo18_802B798C", - "802b7a20" : "func_802B70C8", - "802b7c64" : "geo_switch_bowser_eyes", - "802b7d44" : "Geo18_802B7D44", - "802b7e68" : "ActionFallingBowserPlatform0", - "802b7ef0" : "ActionFallingBowserPlatform1", - "802b8024" : "ActionFallingBowserPlatform2", - "802b8384" : "bhv_falling_bowser_platform_loop", - "802b83b0" : "func_802B7A58", - "802b8434" : "func_802B7ADC", - "802b84ac" : "bhv_flame_bowser_init", - "802b85b0" : "bhv_flame_large_burning_out_init", - "802b8654" : "func_802B7CFC", - "802b8734" : "bhv_flame_bowser_loop", - "802b8960" : "bhv_flame_moving_forward_growing_init", - "802b89ec" : "bhv_flame_moving_forward_growing_loop", - "802b8b1c" : "bhv_flame_floating_landing_init", - "802b8c38" : "bhv_flame_floating_landing_loop", - "802b8d68" : "bhv_blue_bowser_flame_init", - "802b8e7c" : "bhv_blue_bowser_flame_loop", - "802b9034" : "bhv_flame_bouncing_init", - "802b90ec" : "bhv_flame_bouncing_loop", - "802b921c" : "bhv_blue_flames_group_loop", - "802b935c" : "bhv_blue_fish_loop", - "802b9790" : "bhv_tank_fish_group_loop", - "802b98d4" : "func_802B8F7C", - "802b98fc" : "bhv_checkerboard_elevator_group_init", - "802b9a78" : "func_802B9120", - "802b9af8" : "func_802B91A0", - "802b9bb4" : "bhv_checkerboard_platform_init", - "802b9bd8" : "bhv_checkerboard_platform_loop", - "802b9e94" : "bhv_ddd_warp_loop", - "802b9efc" : "func_802B95A4", - "802ba13c" : "func_802B97E4", - "802ba19c" : "bhv_water_level_pillar_init", - "802ba1e0" : "bhv_water_level_pillar_loop", - "802ba25c" : "bhv_invisible_objects_under_bridge_init", - "802ba2b0" : "Geo18_802BA2B0", - "802ba2f8" : "bhv_bowser_key_unlock_door_loop", - "802ba458" : "bhv_bowser_key_course_exit_loop", - "802ba5bc" : "bhv_moat_grills_loop", - "802ba608" : "bhv_rotating_clock_arm_loop", - "802ba7e0" : "handle_hat_ukiki_reset", - "802ba868" : "is_hat_ukiki_and_mario_has_hat", - "802ba8c4" : "unused_Geo18_8029D890", - "802ba958" : "idle_ukiki_taunt", - "802bab7c" : "ukiki_act_idle", - "802bae40" : "ukiki_act_return_home", - "802baec4" : "ukiki_act_wait_to_respawn", - "802baf10" : "ukiki_act_unused_turn", - "802baf64" : "ukiki_act_turn_to_mario", - "802bb07c" : "ukiki_act_run", - "802bb288" : "ukiki_act_jump", - "802bb3b8" : "ukiki_act_go_to_cage", - "802bb798" : "ukiki_free_loop", - "802bb888" : "cage_ukiki_held_loop", - "802bba3c" : "hat_ukiki_held_loop", - "802bbb98" : "bhv_ukiki_init", - "802bbc0c" : "bhv_ukiki_loop", - "802bbd6c" : "func_802BB414", - "802bbfd8" : "func_802BB680", - "802bc0f0" : "bhv_lll_moving_octagonal_mesh_platform_loop", - "802bc22c" : "bhv_lll_sinking_rock_block_loop", - "802bc294" : "bhv_lll_rotating_hex_flame_loop", - "802bc348" : "func_802BB9F0", - "802bc4f4" : "ActionRotatingCwFireBars0", - "802bc538" : "ActionRotatingCwFireBars1", - "802bc590" : "ActionRotatingCwFireBars2", - "802bc5fc" : "ActionRotatingCwFireBars3", - "802bc618" : "bhv_lll_rotating_block_fire_bars_loop", - "802bc660" : "bhv_lll_wood_piece_loop", - "802bc728" : "bhv_lll_floating_wood_bridge_loop", - "802bc898" : "bhv_volcano_flames_loop", - "802bc934" : "func_802BBFDC", - "802bca74" : "bhv_lll_rotating_hexagonal_ring_loop", - "802bcce8" : "func_802BC390", - "802bcda8" : "bhv_lll_sinking_rectangular_platform_loop", - "802bce58" : "bhv_lll_sinking_square_platforms_loop", - "802bce9c" : "create_transform_from_normals", - "802bcf40" : "bhv_platform_normals_init", - "802bcfc4" : "approach_by_increment", - "802bd058" : "bhv_tilting_inverted_pyramid_loop", - "802bd3e4" : "func_802BCA8C", - "802bd488" : "bhv_koopa_shell_flame_loop", - "802bd5dc" : "bhv_koopa_shell_flame_spawn", - "802bd62c" : "func_802BCCD4", - "802bd680" : "bhv_koopa_shell_loop", - "802bd8d0" : "func_802BCF78", - "802bd91c" : "func_802BCFC4", - "802bdb04" : "ActionToxBox4", - "802bdb3c" : "ActionToxBox5", - "802bdb74" : "ActionToxBox6", - "802bdbac" : "ActionToxBox7", - "802bdbe4" : "ActionToxBox1", - "802bdc7c" : "ActionToxBox2", - "802bdcc8" : "ActionToxBox3", - "802bdd14" : "ActionToxBox0", - "802bdd68" : "bhv_tox_box_loop", - "802bdd9c" : "piranha_plant_act_idle", - "802bde10" : "piranha_plant_check_interactions", - "802bdeec" : "piranha_plant_act_sleeping", - "802be034" : "piranha_plant_act_woken_up", - "802be0b8" : "piranha_plant_reset_when_far", - "802be0ec" : "piranha_plant_attacked", - "802be150" : "piranha_plant_act_shrink_and_die", - "802be234" : "piranha_plant_act_wait_to_respawn", - "802be278" : "piranha_plant_act_respawn", - "802be350" : "piranha_plant_act_biting", - "802be49c" : "mario_moving_fast_enough_to_make_piranha_plant_bite", - "802be50c" : "piranha_plant_act_stopped_biting", - "802be5a0" : "bhv_piranha_plant_loop", - "802be628" : "bhv_lll_bowser_puzzle_spawn_piece", - "802be6d4" : "bhv_lll_bowser_puzzle_spawn_pieces", - "802be79c" : "bhv_lll_bowser_puzzle_loop", - "802be8a8" : "bhv_lll_bowser_puzzle_piece_action_0", - "802be8b8" : "bhv_lll_bowser_puzzle_piece_action_1", - "802be8f4" : "bhv_lll_bowser_puzzle_piece_update", - "802be9dc" : "bhv_lll_bowser_puzzle_piece_move", - "802beb14" : "bhv_lll_bowser_puzzle_piece_idle", - "802beb54" : "bhv_lll_bowser_puzzle_piece_move_left", - "802beb8c" : "bhv_lll_bowser_puzzle_piece_move_right", - "802bebc4" : "bhv_lll_bowser_puzzle_piece_move_up", - "802bebfc" : "bhv_lll_bowser_puzzle_piece_move_down", - "802bec34" : "bhv_lll_bowser_puzzle_piece_loop", - "802becb0" : "func_802BE2E8", - "802bed7c" : "play_penguin_walking_sound", - "802bedec" : "ActionTuxiesMother2", - "802bef8c" : "ActionTuxiesMother1", - "802bf1d8" : "ActionTuxiesMother0", - "802bf3c0" : "bhv_tuxies_mother_loop", - "802bf424" : "func_802BEA58", - "802bf474" : "ActionSmallPenguin2", - "802bf57c" : "ActionSmallPenguin1", - "802bf648" : "ActionSmallPenguin3", - "802bf6e4" : "ActionSmallPenguin4", - "802bf760" : "ActionSmallPenguin0", - "802bf90c" : "ActionSmallPenguin5", - "802bfa14" : "func_802BF048", - "802bfa88" : "bhv_small_penguin_loop", - "802bfbac" : "geo_switch_tuxie_mother_eyes", - "802bfcd8" : "ActionFish0", - "802bfeb8" : "ActionFish1", - "802bff20" : "ActionFish2", - "802bff3c" : "bhv_fish_loop", - "802bff68" : "func_802BF59C", - "802c00b4" : "ActionFishGroup1", - "802c0348" : "ActionFishGroup2", - "802c06a8" : "ActionFishGroup0", - "802c0768" : "bhv_fish_group_2_loop", - "802c08a8" : "bhv_wdw_express_elevator_loop", - "802c0aac" : "ActionBirdChirpChirp0", - "802c0b50" : "ActionBirdChirpChirp1", - "802c0ba4" : "ActionBirdChirpChirp2", - "802c0bc4" : "ActionBirdChirpChirp3", - "802c0be0" : "bhv_bird_chirp_chirp_loop", - "802c0c0c" : "func_802C0240", - "802c0cd4" : "ActionCheepCheep0", - "802c0d44" : "ActionCheepCheep1", - "802c0f90" : "ActionCheepCheep2", - "802c1204" : "bhv_cheep_cheep_loop", - "802c12c0" : "bhv_rotatin_exclamation_box_loop", - "802c1308" : "ActionExclamationBox0", - "802c13ec" : "ActionExclamationBox1", - "802c14b0" : "ActionExclamationBox2", - "802c15b8" : "ActionExclamationBox3", - "802c17bc" : "func_802C0DF0", - "802c18d0" : "ActionExclamationBox4", - "802c1988" : "ActionExclamationBox5", - "802c19c0" : "bhv_exclamation_box_loop", - "802c19fc" : "bhv_sound_spawner_init", - "802c1a40" : "bhv_bowsers_sub_loop", - "802c1a80" : "bhv_sushi_shark_collision_loop", - "802c1a90" : "bhv_sushi_shark_loop", - "802c1c44" : "bhv_sunken_ship_part_loop", - "802c1cd4" : "bhv_ship_part_3_loop", - "802c1e10" : "bhv_jrb_sliding_box_loop", - "802c2190" : "bhv_white_puff_1_loop", - "802c2274" : "bhv_white_puff_2_loop", - "802c22b8" : "bhv_hidden_blue_coin_loop", - "802c242c" : "bhv_blue_coin_switch_loop", - "802c263c" : "bhv_openable_cage_door_loop", - "802c26f8" : "bhv_openable_grill_loop", - "802c2930" : "bhv_init_changing_water_level_loop", - "802c2a24" : "bhv_water_level_diamond_loop", - "802c2ce8" : "func_802C231C", - "802c2ebc" : "ActionTweester0", - "802c2fbc" : "ActionTweester1", - "802c31c4" : "ActionTweester2", - "802c329c" : "bhv_tweester_loop", - "802c32e8" : "bhv_tweester_sand_particle_loop", - "802c3440" : "bhv_boo_init", - "802c3684" : "bhv_courtyard_boo_triplet_init", - "802c4824" : "bhv_boo_loop", - "802c4f30" : "bhv_big_boo_loop", - "802c515c" : "bhv_boo_with_cage_init", - "802c51d4" : "bhv_boo_with_cage_loop", - "802c5224" : "bhv_merry_go_round_boo_manager_loop", - "802c53cc" : "obj_set_secondary_camera_focus", - "802c53ec" : "bhv_animated_texture_loop", - "802c5414" : "bhv_boo_in_castle_loop", - "802c5688" : "bhv_boo_boss_spawned_bridge_loop", - "802c5890" : "bhv_bbh_tilting_trap_platform_loop", - "802c5a38" : "bhv_haunted_bookshelf_loop", - "802c5ca8" : "bhv_merry_go_round_loop", - "802c5dc0" : "bhv_static_checkered_platform_loop", - "802c5f48" : "bhv_beta_bowser_anchor_loop", - "802c5fdc" : "bhv_play_music_track_when_touched_loop", - "802c6050" : "bhv_floor_trap_in_castle_loop", - "802c60ac" : "bhv_castle_floor_trap_init", - "802c6150" : "bhv_castle_floor_trap_open_detect", - "802c61d4" : "bhv_castle_floor_trap_open", - "802c6278" : "bhv_castle_floor_trap_close_detect", - "802c62bc" : "bhv_castle_floor_trap_close", - "802c6328" : "bhv_castle_floor_trap_rotate", - "802c6348" : "bhv_castle_floor_trap_loop", - "802c63e8" : "BehClimbDetectLoop", - "802c64a4" : "bhv_sparkle_spawn_loop", - "802c6538" : "func_802C5A64", - "802c65c0" : "bhv_scuttlebug_loop", - "802c6b6c" : "bhv_scuttlebug_spawn_loop", - "802c6ca0" : "func_802C61CC", - "802c6d6c" : "ActionWhomp0", - "802c6ec8" : "ActionWhomp7", - "802c6fb0" : "ActionWhomp1", - "802c710c" : "ActionWhomp2", - "802c7254" : "ActionWhomp3", - "802c72b4" : "ActionWhomp4", - "802c7380" : "ActionWhomp5", - "802c7428" : "func_802C6954", - "802c75fc" : "func_802C6B28", - "802c76d4" : "ActionWhomp6", - "802c7858" : "ActionWhomp8", - "802c7998" : "ActionWhomp9", - "802c79d8" : "bhv_whomp_loop", - "802c7a70" : "bhv_water_splash_loop", - "802c7b14" : "bhv_water_drops_loop", - "802c7cac" : "bhv_surface_waves_loop", - "802c7d40" : "bhv_water_surface_white_wave_init", - "802c7d90" : "bhv_object_bubble_ripples_init", - "802c7dfc" : "bhv_surface_wave_shrinking_init", - "802c7e5c" : "bhv_wave_trail_loop", - "802c7f98" : "bhv_white_wind_particle_loop", - "802c81b4" : "func_802C76E0", - "802c834c" : "bhv_snowman_wind_blowing_loop", - "802c85a4" : "func_802C7AD0", - "802c863c" : "bhv_walking_penguin_loop", - "802c89f0" : "update_mario_platform", - "802c8b4c" : "get_mario_pos", - "802c8b8c" : "set_mario_pos", - "802c8bc8" : "apply_platform_displacement", - "802c8ec0" : "apply_mario_platform_displacement", - "802c8f28" : "clear_mario_platform", - "802c8f40" : "Unknown802C8460", - "802c8fe4" : "func_802C8504", - "802c91ec" : "func_802C870C", - "802c9388" : "func_802C88A8", - "802c93f8" : "func_802C8918", - "802c94ac" : "func_802C89CC", - "802c95b4" : "func_802C8AD4", - "802c9630" : "func_802C8B50", - "802c9724" : "detect_object_collisions", - "802c99b8" : "init_free_object_list", - "802c9a3c" : "clear_object_lists", - "802c9b68" : "unload_object", - "802c9f04" : "create_object", - "802ca028" : "mark_obj_for_deletion", - "802ca040" : "exec_anim_sound_state", - "802ca144" : "create_sound_spawner", - "802ca190" : "PlaySound", - "802ca1e0" : "PlaySound2", - "802ca230" : "calc_dist_to_volume_range_1", - "802ca2d4" : "calc_dist_to_volume_range_2", - "802ca370" : "Stub802C9890", - "802ca380" : "Stub802C98A0", - "802ca390" : "Stub802C98B0", - "802ca3a0" : "Stub802C98C0", - "802ca3b0" : "get_current_clock", - "802ca3e0" : "get_clock_difference", - "802ca418" : "set_print_state_info", - "802ca460" : "print_text_array_info", - "802ca51c" : "set_text_array_x_y", - "802ca568" : "print_debug_bottom_up", - "802ca5b8" : "print_debug_top_down_objectinfo", - "802ca618" : "print_debug_top_down_mapinfo", - "802ca680" : "print_debug_top_down_normal", - "802ca6d0" : "print_mapinfo", - "802ca8e8" : "print_checkinfo", - "802ca918" : "print_surfaceinfo", - "802ca94c" : "print_stageinfo", - "802ca990" : "print_string_array_info", - "802caa6c" : "print_effectinfo", - "802caaa8" : "print_enemyinfo", - "802caae4" : "update_debug_dpadmask", - "802cabac" : "debug_unknown_level_select_check", - "802cac20" : "reset_debug_objectinfo", - "802cb0b0" : "stub_802CA5D0", - "802cb0c0" : "try_print_debug_mario_object_info", - "802cb1c0" : "try_print_debug_mario_level_info", - "802cb264" : "try_do_mario_debug_object_spawn", - "802cb564" : "Unknown802CAA84", - "802cb5c0" : "set_and_reset_transition_fade_timer", - "802cb640" : "set_transition_color_fade_alpha", - "802cb894" : "vertex_transition_color", - "802cba18" : "dl_transition_color", - "802cbbc4" : "render_fade_transition_from_color", - "802cbc20" : "render_fade_transition_into_color", - "802cbc7c" : "calc_tex_transition_radius", - "802cbd54" : "calc_tex_transition_time", - "802cbe64" : "convert_tex_transition_angle_to_pos", - "802cbee0" : "center_tex_transition_x", - "802cbf64" : "center_tex_transition_y", - "802cbfe8" : "make_tex_transition_vertex", - "802cc180" : "load_tex_transition_vertex", - "802cc4d8" : "render_textured_transition", - "802ccbe8" : "render_screen_transition", - "802ccdc8" : "render_cannon_circle_base", - "802cd1e8" : "geo_cannon_circle_base", - "802cd280" : "rotate_rectangle", - "802cd328" : "atan2_deg", - "802cd388" : "scale_shadow_with_distance", - "802cd444" : "disable_shadow_with_distance", - "802cd48c" : "dim_shadow_with_distance", - "802cd614" : "get_water_level_below_shadow", - "802cd6c4" : "init_shadow", - "802cd938" : "get_texture_coords_9_vertices", - "802cd988" : "get_texture_coords_4_vertices", - "802cd9ec" : "make_shadow_vertex_at_xyz", - "802cdb20" : "extrapolate_vertex_y_position", - "802cdb74" : "get_vertex_coords", - "802cdc40" : "calculate_vertex_xyz", - "802cde94" : "floor_local_tilt", - "802cdf3c" : "make_shadow_vertex", - "802ce128" : "add_shadow_to_display_list", - "802ce2bc" : "linearly_interpolate_solidity_positive", - "802ce3ec" : "linearly_interpolate_solidity_negative", - "802ce524" : "correct_shadow_solidity_for_animations", - "802ce690" : "correct_lava_shadow_height", - "802ce79c" : "create_shadow_player", - "802ce9d0" : "create_shadow_circle_9_verts", - "802ceae8" : "create_shadow_circle_4_verts", - "802cec04" : "create_shadow_circle_assuming_flat_ground", - "802cedc0" : "create_shadow_rectangle", - "802cef6c" : "get_shadow_height_solidity", - "802cf080" : "create_shadow_square", - "802cf1f0" : "create_shadow_hardcoded_rectangle", - "802cf34c" : "create_shadow_below_xyz", - "802cf5b0" : "calculate_skybox_scaled_x", - "802cf69c" : "calculate_skybox_scaled_y", - "802cf804" : "make_skybox_rect", - "802cfa2c" : "draw_skybox_tile_grid", - "802cfc68" : "create_skybox_ortho_matrix", - "802cfd88" : "init_skybox_display_list", - "802cfef4" : "create_skybox_facing_camera", - "802d0080" : "geo_wdw_set_initial_water_level", - "802d01e0" : "geo_movtex_pause_control", - "802d0254" : "movtex_make_quad_vertex", - "802d0484" : "movtex_gen_from_quad", - "802d0a84" : "movtex_gen_from_quad_array", - "802d0bb0" : "movtex_gen_quads_id", - "802d0c84" : "get_quad_collection_from_id", - "802d0f28" : "movtex_change_texture_format", - "802d104c" : "geo_movtex_draw_water_regions", - "802d1330" : "update_moving_texture_offset", - "802d13cc" : "movtex_write_vertex_first", - "802d1574" : "movtex_write_vertex_index", - "802d18b4" : "movtex_gen_list", - "802d1b70" : "geo_movtex_draw_nocolor", - "802d1cdc" : "geo_movtex_draw_colored", - "802d1e48" : "geo_movtex_draw_colored_no_update", - "802d1fa8" : "geo_movtex_draw_colored_2_no_update", - "802d2108" : "geo_movtex_update_horizontal", - "802d2210" : "make_vertex", - "802d22c4" : "round_float", - "802d2360" : "geo_exec_inside_castle_light", - "802d2470" : "geo_exec_flying_carpet_timer_update", - "802d2520" : "geo_exec_flying_carpet_create", - "802d28cc" : "geo_exec_cake_end_screen", - "802d29c0" : "stopAllRippleExcept", - "802d2a74" : "find_mario_y_position_on_painting", - "802d2b08" : "find_mario_z_position_on_painting", - "802d2b84" : "painting_find_vertical_ripple_location", - "802d2c40" : "find_part_of_painting_near_mario", - "802d2d80" : "find_mario_x_position_on_painting", - "802d2dfc" : "painting_find_horizontal_ripple_location", - "802d2eb8" : "painting_set_ripple_type", - "802d2ffc" : "vertical_proximity_ripple_painting_ripple", - "802d319c" : "vertical_proximity_ripple_painting_ripple_if_mario_enters", - "802d327c" : "vertical_continuous_ripple_painting_ripple", - "802d341c" : "vertical_continuous_ripple_painting_ripple_if_mario_enters", - "802d34fc" : "horizontal_proximity_ripple_painting_ripple", - "802d36ac" : "horizontal_proximity_ripple_painting_ripple_if_mario_enters", - "802d379c" : "horizontal_continuous_ripple_painting_ripple", - "802d393c" : "horizontal_continuous_ripple_painting_ripple_if_mario_enters", - "802d3a2c" : "painting_update_floors", - "802d3bec" : "painting_update_ripple_status", - "802d3cec" : "painting_calculate_point_ripple", - "802d3e6c" : "painting_conditionally_calculate_point_ripple", - "802d3ee4" : "Print1", - "802d404c" : "Print2", - "802d43f8" : "small_float_to_byte", - "802d44bc" : "func_802D39DC", - "802d47d0" : "func_802D3CF0", - "802d4edc" : "func_802D43FC", - "802d50dc" : "func_802D45FC", - "802d5354" : "func_802D4874", - "802d556c" : "display_painting_rippling", - "802d568c" : "display_painting_not_rippling", - "802d5778" : "reset_painting", - "802d57a8" : "update_ddd_painting", - "802d58e4" : "func_802D4E04", - "802d593c" : "display_painting", - "802d59a8" : "vertical_painting_ripple", - "802d5aa0" : "horizontal_painting_ripple", - "802d5b98" : "Geo18_802D5B98", - "802d5d0c" : "Geo18_802D5D0C", - "802d5e00" : "int_pow", - "802d5e54" : "format_integer", - "802d6144" : "parse_width_field", - "802d62d8" : "print_text_fmt_int", - "802d6554" : "print_text", - "802d66c0" : "print_text_centered", - "802d6858" : "char_to_glyph_index", - "802d69f8" : "add_glyph_texture", - "802d6acc" : "clip_to_bounds", - "802d6b3c" : "render_textrect", - "802d6c88" : "render_text_labels", - "802d6f20" : "create_dl_identity_matrix", - "802d7070" : "create_dl_translation_matrix", - "802d7174" : "create_dl_rotation_matrix", - "802d7280" : "create_dl_scale_matrix", - "802d7384" : "create_dl_ortho_matrix", - "802d75dc" : "render_generic_char", - "802d76c8" : "render_multi_text_string", - "802d77dc" : "print_generic_string", - "802d7b84" : "print_hud_lut_string", - "802d7e88" : "print_menu_generic_string", - "802d82d4" : "print_credits_string", - "802d862c" : "handle_menu_scrolling", - "802d8844" : "get_str_x_pos_from_center", - "802d8934" : "get_string_width", - "802d89b8" : "print_hud_my_score_coins", - "802d8a80" : "print_hud_my_score_stars", - "802d8b34" : "int_to_str", - "802d8c6c" : "get_dialog_id", - "802d8c88" : "create_dialog_box", - "802d8cc4" : "create_dialog_box_with_var", - "802d8d08" : "create_dialog_inverted_box", - "802d8d48" : "create_dialog_box_with_response", - "802d8d90" : "reset_dialog_render_state", - "802d8e2c" : "render_dialog_box_type", - "802d9148" : "change_and_flash_dialog_text_color_lines", - "802d9388" : "handle_dialog_scroll_page_state", - "802d944c" : "render_star_count_dialog_text", - "802d9634" : "render_multi_text_string_lines", - "802d9800" : "ensure_nonnegative", - "802d982c" : "handle_dialog_text_and_pages", - "802d9cb0" : "render_dialog_triangle_choice", - "802d9dfc" : "render_dialog_string_color", - "802d9f84" : "handle_special_dialog_text", - "802da1ac" : "render_dialog_entries", - "802da810" : "set_menu_mode", - "802da844" : "reset_cutscene_msg_fade", - "802da85c" : "dl_rgba16_begin_cutscene_msg_fade", - "802da8e4" : "dl_rgba16_stop_cutscene_msg_fade", - "802da964" : "ascii_to_credits_char", - "802daa34" : "print_credits_str_ascii", - "802daae4" : "set_cutscene_message", - "802dab58" : "do_cutscene_handler", - "802dad54" : "print_peach_letter_message", - "802db08c" : "render_hud_cannon_reticle", - "802db350" : "reset_red_coins_collected", - "802db368" : "change_dialog_camera_angle", - "802db3b8" : "shade_screen", - "802db498" : "print_animated_red_coin", - "802db6e8" : "render_pause_red_coins", - "802db760" : "render_pause_my_score_coins", - "802dbb24" : "render_pause_camera_options", - "802dbe68" : "render_pause_course_options", - "802dc15c" : "render_pause_castle_menu_box", - "802dc418" : "highlight_last_course_complete_stars", - "802dc478" : "print_hud_pause_colorful_str", - "802dc570" : "render_pause_castle_course_stars", - "802dc718" : "render_pause_castle_main_strings", - "802dca88" : "render_pause_courses_and_castle", - "802dcd04" : "print_hud_course_complete_string", - "802dcf30" : "print_hud_course_complete_coins", - "802dd194" : "play_star_fanfare_and_flash_hud", - "802dd210" : "render_course_complete_lvl_info_and_hud_str", - "802dd838" : "render_save_confirmation", - "802ddae0" : "render_course_complete_screen", - "802ddca4" : "render_menus_and_dialogs", - "802dddf0" : "envfx_init_snow", - "802ddf38" : "envfx_update_snowflake_count", - "802de0bc" : "envfx_cleanup_snow", - "802de114" : "orbit_from_positions", - "802de23c" : "pos_from_orbit", - "802de360" : "envfx_is_snowflake_alive", - "802de458" : "envfx_update_snow_normal", - "802de888" : "envfx_update_snow_blizzard", - "802ded38" : "envfx_update_snow_water", - "802def2c" : "rotate_triangle_vertices", - "802df334" : "append_snowflake_vertex_buffer", - "802df748" : "envfx_update_snow", - "802dfbc8" : "envfx_update_particles", - "802dfd50" : "particle_is_laterally_close", - "802dfe00" : "random_flower_offset", - "802dfe80" : "envfx_update_flower", - "802e0120" : "envfx_set_lava_bubble_position", - "802e048c" : "envfx_update_lava", - "802e065c" : "envfx_rotate_around_whirlpool", - "802e08a8" : "envfx_is_whirlpool_bubble_alive", - "802e0934" : "envfx_update_whirlpool", - "802e0e24" : "envfx_is_jestream_bubble_alive", - "802e0eb8" : "envfx_update_jetstream", - "802e1238" : "envfx_init_bubble", - "802e1414" : "envfx_bubbles_update_switch", - "802e1618" : "append_bubble_vertex_buffer", - "802e1a20" : "envfx_set_bubble_texture", - "802e1bb8" : "envfx_update_bubble_particles", - "802e1ed8" : "envfx_set_max_bubble_particles", - "802e1f48" : "envfx_update_bubbles", - "802e20a0" : "convert_rotation", - "802e2134" : "spawn_macro_abs_yrot_2params", - "802e21dc" : "spawn_macro_abs_yrot_param1", - "802e2284" : "spawn_macro_abs_special", - "802e2414" : "spawn_macro_objects", - "802e2690" : "spawn_macro_objects_hardcoded", - "802e28ec" : "spawn_special_objects", - "802e2cf0" : "render_hud_tex_lut", - "802e2e58" : "render_hud_small_tex_lut", - "802e30b4" : "render_power_meter_health_segment", - "802e3214" : "render_dl_power_meter", - "802e33b8" : "animate_power_meter_emphasized", - "802e352c" : "handle_power_meter_actions", - "802e3654" : "render_hud_power_meter", - "802e3744" : "render_hud_mario_lives", - "802e37a8" : "render_hud_coins", - "802e380c" : "render_hud_stars", - "802e38e4" : "render_hud_keys", - "802e395c" : "render_hud_timer", - "802e3b1c" : "set_hud_camera_status", - "802e3b3c" : "render_hud_camera_status", - "802e3d2c" : "render_hud", - "802e3e50" : "set_yoshi_as_not_dead", - "802e3e68" : "geo_obj_transparency_something", - "802e3f68" : "absf_2", - "802e3fac" : "turn_obj_away_from_surface", - "802e405c" : "obj_find_wall", - "802e41a4" : "turn_obj_away_from_steep_floor", - "802e42e0" : "obj_orient_graph", - "802e43e4" : "calc_obj_friction", - "802e445c" : "calc_new_obj_vel_and_pos_y", - "802e4814" : "calc_new_obj_vel_and_pos_y_underwater", - "802e4cec" : "obj_update_pos_vel_xz", - "802e4d88" : "obj_splash", - "802e4e90" : "object_step", - "802e5114" : "object_step_without_floor_orient", - "802e5160" : "obj_move_xyz_using_fvel_and_yaw", - "802e5208" : "is_point_within_radius_of_mario", - "802e52b8" : "is_point_close_to_object", - "802e5360" : "set_object_visibility", - "802e53f4" : "obj_return_home_if_safe", - "802e54b0" : "obj_return_and_displace_home", - "802e55d0" : "obj_check_if_facing_toward_angle", - "802e569c" : "obj_find_wall_displacement", - "802e5760" : "obj_spawn_yellow_coins", - "802e5824" : "obj_flicker_and_disappear", - "802e58b4" : "current_mario_room_check", - "802e5948" : "trigger_obj_dialog_when_facing", - "802e5a80" : "obj_check_floor_death", - "802e5b18" : "obj_lava_death", - "802e5c6c" : "spawn_orange_number", - "802e5d04" : "debug_sequence_tracker", - "802e5de8" : "CoinStep", - "802e5e6c" : "MovingCoinFlickerLoop", - "802e5ea4" : "CoinCollected", - "802e5ee8" : "bhv_moving_yellow_coin_init", - "802e5f64" : "bhv_moving_yellow_coin_loop", - "802e6098" : "bhv_moving_blue_coin_init", - "802e6114" : "bhv_moving_blue_coin_loop", - "802e62a4" : "bhv_blue_coin_sliding_jumping_init", - "802e631c" : "func_802E540C", - "802e63ec" : "func_802E54DC", - "802e6474" : "bhv_blue_coin_sliding_loop", - "802e6628" : "bhv_blue_coin_jumping_loop", - "802e6790" : "bhv_seaweed_init", - "802e67dc" : "bhv_seaweed_bundle_init", - "802e6a2c" : "bhv_bobomb_init", - "802e6a8c" : "func_802E5B7C", - "802e6af8" : "BobombExplodeLoop", - "802e6bd4" : "CheckBobombInteractions", - "802e6cf0" : "BobombPatrolLoop", - "802e6dc8" : "BobombChaseMarioLoop", - "802e6e84" : "BobombLaunchedLoop", - "802e6ed8" : "GenericBobombFreeLoop", - "802e7020" : "StationaryBobombFreeLoop", - "802e7134" : "BobombFreeLoop", - "802e7180" : "BobombHeldLoop", - "802e7220" : "BobombDroppedLoop", - "802e7280" : "BobombThrownLoop", - "802e7324" : "ObjRandomBlink", - "802e742c" : "bhv_bobomb_loop", - "802e75a0" : "bhv_bobomb_fuse_smoke_init", - "802e76ac" : "bhv_bobomb_buddy_init", - "802e770c" : "BobombBuddyIdleLoop", - "802e7814" : "BobombBuddyCannonLoop", - "802e79dc" : "BobombBuddyTalkLoop", - "802e7b00" : "BobombBuddyTurnToTalkLoop", - "802e7bb0" : "BobombBuddyActionLoop", - "802e7c4c" : "bhv_bobomb_buddy_loop", - "802e7c90" : "bhv_cannon_closed_init", - "802e7d4c" : "CannonTrapDoorOpeningLoop", - "802e7e54" : "bhv_cannon_closed_loop", - "802e7f70" : "bhv_whirlpool_init", - "802e7fb8" : "func_802E70A8", - "802e7fec" : "func_802E70DC", - "802e80dc" : "bhv_whirlpool_loop", - "802e82b0" : "bhv_jet_stream_loop", - "802e8388" : "bhv_homing_amp_init", - "802e89d4" : "bhv_homing_amp_loop", - "802e8ae4" : "bhv_circling_amp_init", - "802e8ecc" : "bhv_circling_amp_loop", - "802e8f68" : "bhv_butterfly_init", - "802e9018" : "ButterflyStep", - "802e9278" : "CalculateButterflyAngle", - "802e9470" : "ButterflyRestingLoop", - "802e94e4" : "ButterflyFollowMarioLoop", - "802e9548" : "ButterflyReturnHomeLoop", - "802e96c8" : "bhv_butterfly_loop", - "802e9764" : "bhv_hoot_init", - "802e97fc" : "HootFindNextFloor", - "802e98c0" : "HootFloorBounce", - "802e9a4c" : "HootFreeStep", - "802e9cf4" : "PlayerSetHootYaw", - "802e9d98" : "HootCarryStep", - "802e9f60" : "HootSurfaceCollision", - "802ea144" : "HootAscentLoop", - "802ea258" : "HootActionLoop", - "802ea3f0" : "HootTurnToHome", - "802ea4ec" : "HootAwakeLoop", - "802ea588" : "bhv_hoot_loop", - "802ea6a8" : "bhv_beta_holdable_object_init", - "802ea7e0" : "bhv_beta_holdable_object_loop", - "802ea888" : "bhv_object_bubble_init", - "802ea934" : "bhv_object_bubble_loop", - "802eaa10" : "bhv_object_water_wave_init", - "802eaa50" : "bhv_object_water_wave_loop", - "802eaa8c" : "bhv_explosion_init", - "802eaad0" : "bhv_explosion_loop", - "802eabf0" : "bhv_bobomb_bully_death_smoke_init", - "802eac3c" : "bhv_bobomb_explosion_bubble_init", - "802ead3c" : "bhv_bobomb_explosion_bubble_loop", - "802eaef8" : "bhv_respawner_loop", - "802eaf84" : "create_respawner", - "802eb05c" : "bhv_small_bully_init", - "802eb104" : "bhv_big_bully_init", - "802eb1c0" : "BullyCheckMarioCollision", - "802eb288" : "BullyChaseMarioLoop", - "802eb3f0" : "BullyKnockbackLoop", - "802eb510" : "BullyBackUpLoop", - "802eb5c4" : "BullyBackUpCheck", - "802eb630" : "PlayBullyStompingSound", - "802eb744" : "BullyStep", - "802eb7e0" : "BullySpawnCoin", - "802eb8b0" : "BullyLavaDeath", - "802eb9d0" : "bhv_bully_loop", - "802ebb74" : "BigBullySpawnMinion", - "802ebc00" : "bhv_big_bully_with_minions_init", - "802ebc88" : "BigBullyWithMinionsLavaDeath", - "802ebce0" : "bhv_big_bully_with_minions_loop", - "802ebf70" : "WaterRingCalcMarioDistInFront", - "802ec030" : "WaterRingInit", - "802ec1b0" : "bhv_jet_stream_water_ring_init", - "802ec200" : "CheckWaterRingCollection", - "802ec3d0" : "SetWaterRingScale", - "802ec4e0" : "WaterRingCollectedLoop", - "802ec59c" : "JetStreamWaterRingNotCollectedLoop", - "802ec75c" : "bhv_jet_stream_water_ring_loop", - "802ec7cc" : "Unknown802EB8A4", - "802ec818" : "JetStreamRingSpawnerActiveLoop", - "802ec908" : "bhv_jet_stream_ring_spawner_loop", - "802ec9b8" : "bhv_manta_ray_water_ring_init", - "802ec9f0" : "MantaRayWaterRingNotCollectedLoop", - "802ecba4" : "bhv_manta_ray_water_ring_loop", - "802ecc14" : "bhv_bowser_bomb_loop", - "802ecd0c" : "bhv_bowser_bomb_explosion_loop", - "802ecea0" : "bhv_bowser_bomb_smoke_loop", - "802ecfac" : "bhv_celebration_star_init", - "802ed10c" : "CelebrationStarSpinAroundMarioLoop", - "802ed28c" : "CelebrationStarFaceCameraLoop", - "802ed39c" : "bhv_celebration_star_loop", - "802ed40c" : "bhv_celebration_star_sparkle_loop", - "802ed45c" : "bhv_star_key_collection_puff_spawner_loop", - "802ed498" : "bhv_lll_drawbridge_spawner_loop", - "802ed62c" : "bhv_lll_drawbridge_loop", - "802ed78c" : "bhv_small_bomp_init", - "802ed7fc" : "bhv_small_bomp_loop", - "802edacc" : "bhv_large_bomp_init", - "802edb2c" : "bhv_large_bomp_loop", - "802eddfc" : "bhv_wf_sliding_platform_init", - "802edf28" : "bhv_wf_sliding_platform_loop", - "802ee124" : "bhv_moneybag_init", - "802ee1a0" : "MoneybagCheckMarioCollision", - "802ee268" : "MoneybagJump", - "802ee46c" : "MoneybagMoveAroundLoop", - "802ee598" : "MoneybagReturnHomeLoop", - "802ee728" : "MoneybagDisappearLoop", - "802ee778" : "MoneybagDeathLoop", - "802ee7e0" : "bhv_moneybag_loop", - "802ee8f4" : "bhv_moneybag_hidden_loop", - "802ee9cc" : "bhv_bowling_ball_init", - "802eea24" : "func_802EDA14", - "802eea7c" : "func_802EDA6C", - "802eeb64" : "bhv_bowling_ball_roll_loop", - "802eecb8" : "bhv_bowling_ball_initializeLoop", - "802eedf0" : "bhv_bowling_ball_loop", - "802eeeb4" : "bhv_generic_bowling_ball_spawner_init", - "802eef9c" : "bhv_generic_bowling_ball_spawner_loop", - "802ef0e8" : "bhv_thi_bowling_ball_spawner_loop", - "802ef21c" : "bhv_bob_pit_bowling_ball_init", - "802ef274" : "bhv_bob_pit_bowling_ball_loop", - "802ef34c" : "bhv_free_bowling_ball_init", - "802ef3f4" : "bhv_free_bowling_ball_roll_loop", - "802ef524" : "bhv_free_bowling_ball_loop", - "802ef63c" : "bhv_rr_cruiser_wing_init", - "802ef66c" : "bhv_rr_cruiser_wing_loop", - "802ef820" : "bhv_spindel_init", - "802ef858" : "bhv_spindel_loop", - "802efcd0" : "bhv_ssl_moving_pyramid_wall_init", - "802efd8c" : "bhv_ssl_moving_pyramid_wall_loop", - "802efe64" : "bhv_pyramid_elevator_init", - "802efef4" : "bhv_pyramid_elevator_loop", - "802f0104" : "bhv_pyramid_elevator_trajectory_marker_ball_loop", - "802f0168" : "bhv_pyramid_top_init", - "802f0288" : "bhv_pyramid_top_spinning", - "802f04a0" : "bhv_pyramid_top_explode", - "802f05b4" : "bhv_pyramid_top_loop", - "802f06a8" : "bhv_pyramid_top_fragment_init", - "802f0714" : "bhv_pyramid_top_fragment_loop", - "802f0788" : "bhv_pyramid_pillar_touch_detector_loop", - "802f07f4" : "bhv_waterfall_sound_loop", - "802f0820" : "bhv_volcano_sound_loop", - "802f084c" : "bhv_castle_flag_init", - "802f0898" : "bhv_birds_sound_loop", - "802f0950" : "bhv_ambient_sounds_init", - "802f09a4" : "bhv_sand_sound_loop", - "802f09f0" : "bhv_castle_cannon_grate_init", - "802f0a40" : "bhv_snowmans_bottom_init", - "802f0b7c" : "func_802EFB2C", - "802f0bd4" : "func_802EFB84", - "802f0c94" : "func_802EFC44", - "802f0df0" : "func_802EFDA0", - "802f0fa8" : "func_802EFF58", - "802f105c" : "bhv_snowmans_bottom_loop", - "802f120c" : "bhv_snowmans_head_init", - "802f1370" : "bhv_snowmans_head_loop", - "802f151c" : "bhv_snowmans_body_checkpoint_loop", - "802f15a8" : "bhv_big_boulder_init", - "802f162c" : "func_802F05DC", - "802f1714" : "bhv_big_boulder_loop", - "802f17f0" : "bhv_big_boulder_generator_loop", - "802f1954" : "func_802F0904", - "802f19c8" : "func_802F0978", - "802f1a10" : "func_802F09C0", - "802f1bb8" : "func_802F0B68", - "802f1d64" : "bhv_wing_cap_init", - "802f1dc0" : "func_802F0D70", - "802f1e5c" : "func_802F0E0C", - "802f1f3c" : "bhv_wing_vanish_cap_loop", - "802f1fd0" : "bhv_metal_cap_init", - "802f2030" : "func_802F0FE0", - "802f20ac" : "bhv_metal_cap_loop", - "802f2140" : "bhv_normal_cap_init", - "802f21e0" : "func_802F1190", - "802f2284" : "func_802F1234", - "802f23a8" : "bhv_normal_cap_loop", - "802f2498" : "bhv_vanish_cap_init", - "802f24f4" : "bhv_collect_star_init", - "802f25b0" : "bhv_collect_star_loop", - "802f2614" : "bhv_star_spawn_init", - "802f2768" : "bhv_star_spawn_loop", - "802f2aa0" : "func_802F1A50", - "802f2b88" : "create_star", - "802f2bd4" : "func_802F1B84", - "802f2c24" : "func_802F1BD4", - "802f2c84" : "bhv_hidden_red_coin_star_init", - "802f2d8c" : "bhv_hidden_red_coin_star_loop", - "802f2e6c" : "bhv_red_coin_init", - "802f2f2c" : "bhv_red_coin_loop", - "802f3014" : "bhv_hidden_star_init", - "802f30f0" : "bhv_hidden_star_loop", - "802f31bc" : "bhv_hidden_star_trigger_loop", - "802f328c" : "bhv_bowser_course_red_coin_star_loop", - "802f336c" : "bhv_ttm_rolling_log_init", - "802f341c" : "func_802F238C", - "802f36a4" : "bhv_rolling_log_loop", - "802f38b0" : "func_802F2820", - "802f39b4" : "func_802F2924", - "802f3a30" : "bhvLllVolcanoFallingTrap_loop", - "802f3b98" : "bhv_lll_rolling_log_init", - "802f3c54" : "bhv_1up_interact", - "802f3cc8" : "bhv_1up_common_init", - "802f3d30" : "bhv_1up_init", - "802f3dd0" : "func_802F2D40", - "802f3ea8" : "func_802F2E18", - "802f401c" : "func_802F2F8C", - "802f40cc" : "bhv_1up_walking_loop", - "802f4248" : "bhv_1up_running_away_loop", - "802f43b8" : "func_802F3328", - "802f44c0" : "bhv_1up_sliding_loop", - "802f45b8" : "bhv_1up_loop", - "802f45f0" : "bhv_1up_jump_on_approach_loop", - "802f4710" : "bhv_1up_hidden_loop", - "802f48f4" : "bhv_1up_hidden_trigger_loop", - "802f496c" : "bhv_1up_hidden_in_pole_loop", - "802f4b00" : "bhv_1up_hidden_in_pole_trigger_loop", - "802f4b78" : "bhv_1up_hidden_in_pole_spawner_loop", - "802f4c68" : "func_802F3BD8", - "802f4ce0" : "func_802F3C50", - "802f4d78" : "bhv_controllable_platform_sub_loop", - "802f4eb4" : "bhv_controllable_platform_init", - "802f5010" : "func_802F3F80", - "802f5068" : "func_802F3FD8", - "802f52c0" : "func_802F4230", - "802f547c" : "func_802F43EC", - "802f55a4" : "bhv_controllable_platform_loop", - "802f5cd4" : "bhv_breakable_box_small_init", - "802f5d78" : "func_802F4CE8", - "802f5e44" : "func_802F4DB4", - "802f5f48" : "breakable_box_small_released_loop", - "802f6014" : "breakable_box_small_idle_loop", - "802f60d8" : "breakable_box_small_get_dropped", - "802f6150" : "breakable_box_small_get_thrown", - "802f6228" : "bhv_breakable_box_small_loop", - "802f62e4" : "bhv_sliding_snow_mound_loop", - "802f6448" : "bhv_snow_mound_spawn_loop", - "802f6588" : "func_802F54F8", - "802f665c" : "func_802F55CC", - "802f6984" : "bhv_floating_platform_loop", - "802f6c0c" : "bhv_arrow_lift_loop", - "802f6d20" : "bhv_orange_number_init", - "802f6d58" : "bhv_orange_number_loop", - "802f6e40" : "bhv_manta_ray_init", - "802f6eb0" : "func_802F5E20", - "802f7068" : "func_802F5FD8", - "802f7264" : "bhv_manta_ray_loop", - "802f7348" : "bhv_falling_pillar_init", - "802f7398" : "bhv_falling_pillar_spawn_hitboxes", - "802f7418" : "bhv_falling_pillar_calculate_angle_in_front_of_mario", - "802f74dc" : "bhv_falling_pillar_loop", - "802f7760" : "bhv_falling_pillar_hitbox_loop", - "802f7924" : "bhv_jrb_floating_box_loop", - "802f7978" : "bhv_decorative_pendulum_init", - "802f79b0" : "bhv_decorative_pendulum_loop", - "802f7a58" : "bhv_treasure_chest_top_loop", - "802f7c9c" : "bhv_treasure_chest_bottom_init", - "802f7d04" : "bhv_treasure_chest_bottom_loop", - "802f7f1c" : "func_802F6E8C", - "802f7fa0" : "bhv_treasure_chest_ship_init", - "802f8044" : "bhv_treasure_chest_ship_loop", - "802f8158" : "bhv_treasure_chest_jrb_init", - "802f8208" : "bhv_treasure_chest_jrb_loop", - "802f82f8" : "bhv_treasure_chest_init", - "802f83a4" : "bhv_treasure_chest_loop", - "802f8490" : "bhv_mips_init", - "802f85e0" : "bhv_mips_find_furthest_waypoint_to_mario", - "802f8760" : "bhv_mips_act_wait_for_nearby_mario", - "802f8808" : "bhv_mips_act_follow_path", - "802f893c" : "bhv_mips_act_wait_for_animation_done", - "802f8988" : "bhv_mips_act_fall_down", - "802f8a34" : "bhv_mips_act_idle", - "802f8ab4" : "bhv_mips_free", - "802f8b54" : "bhv_mips_held", - "802f8c74" : "bhv_mips_dropped", - "802f8cf8" : "bhv_mips_thrown", - "802f8dac" : "bhv_mips_loop", - "802f8e54" : "bhv_yoshi_init", - "802f8f08" : "yoshi_walk_loop", - "802f9054" : "yoshi_idle_loop", - "802f923c" : "yoshi_talk_loop", - "802f93a8" : "yoshi_walk_and_jump_off_roof_loop", - "802f9500" : "yoshi_finish_jumping_and_despawn_loop", - "802f95ac" : "yoshi_give_present_loop", - "802f965c" : "BehYoshiLoop", - "802fbc4c" : "bhv_koopa_init", - "802fc414" : "shelled_koopa_attack_handler", - "802fcc00" : "obj_begin_race", - "802fd7f8" : "bhv_koopa_update", - "802fd950" : "bhv_koopa_race_endpoint_update", - "802fda28" : "bhv_pokey_body_part_update", - "802fe3b0" : "bhv_pokey_update", - "802fe8b4" : "bhv_swoop_update", - "802ff040" : "bhv_fly_guy_update", - "802ff214" : "bhv_goomba_triplet_spawner_update", - "802ff408" : "bhv_goomba_init", - "802ff94c" : "huge_goomba_weakly_attacked", - "802ff96c" : "bhv_goomba_update", - "802ffb38" : "bhv_chain_chomp_chain_part_update", - "80300e40" : "bhv_chain_chomp_update", - "80300ecc" : "bhv_wooden_post_update", - "80301148" : "bhv_chain_chomp_gate_init", - "80301180" : "bhv_chain_chomp_gate_update", - "80301210" : "bhv_wiggler_body_part_update", - "803020e4" : "wiggler_jumped_on_attack_handler", - "80302154" : "bhv_wiggler_update", - "80302910" : "bhv_spiny_update", - "80303028" : "bhv_enemy_lakitu_update", - "8030369c" : "bhv_cloud_update", - "80303744" : "bhv_cloud_part_update", - "80303984" : "bhv_camera_lakitu_init", - "80303f64" : "bhv_camera_lakitu_update", - "803043f8" : "bhv_monty_mole_hole_update", - "803044c0" : "bhv_monty_mole_init", - "80304ba8" : "bhv_monty_mole_update", - "80304fd4" : "bhv_monty_mole_rock_update", - "80305100" : "bhv_platform_on_track_init", - "80305a58" : "bhv_platform_on_track_update", - "80305bb0" : "bhv_track_ball_update", - "80305c14" : "bhv_seesaw_platform_init", - "80305c90" : "bhv_seesaw_platform_update", - "80305e2c" : "bhv_ferris_wheel_axle_init", - "80305f24" : "bhv_ferris_wheel_platform_update", - "80306084" : "bhv_water_bomb_spawner_update", - "803067e8" : "bhv_water_bomb_update", - "803068c0" : "bhv_water_bomb_shadow_update", - "8030699c" : "bhv_ttc_rotating_solid_init", - "80306a38" : "bhv_ttc_rotating_solid_update", - "80306cc4" : "bhv_ttc_pendulum_init", - "80306d38" : "bhv_ttc_pendulum_update", - "80306f48" : "bhv_ttc_treadmill_init", - "80307010" : "bhv_ttc_treadmill_update", - "803071b8" : "bhv_ttc_moving_bar_init", - "80307670" : "bhv_ttc_moving_bar_update", - "80307760" : "bhv_ttc_cog_init", - "803077e0" : "bhv_ttc_cog_update", - "80307930" : "bhv_ttc_pit_block_init", - "803079c8" : "bhv_ttc_pit_block_update", - "80307ae4" : "bhv_ttc_elevator_init", - "80307b58" : "bhv_ttc_elevator_update", - "80307c88" : "bhv_ttc_2d_rotator_init", - "80307cf8" : "bhv_ttc_2d_rotator_update", - "80307ea4" : "bhv_ttc_spinner_update", - "8030803c" : "bhv_mr_blizzard_init", - "80308d6c" : "bhv_mr_blizzard_update", - "80309154" : "bhv_mr_blizzard_snowball", - "803091e0" : "bhv_sliding_plat_2_init", - "80309354" : "bhv_sliding_plat_2_loop", - "80309454" : "bhv_rotating_octagonal_plat_init", - "803094d0" : "bhv_rotating_octagonal_plat_loop", - "803094f8" : "bhv_animates_on_floor_switch_press_init", - "80309530" : "bhv_animates_on_floor_switch_press_loop", - "803097a4" : "bhv_activated_back_and_forth_platform_init", - "803098c0" : "bhv_activated_back_and_forth_platform_update", - "80309b64" : "bhv_recovery_heart_loop", - "80309cec" : "bhv_bubble_cannon_barrel_loop", - "80309ed4" : "water_bomb_cannon_act_0", - "80309f68" : "water_bomb_cannon_act_1", - "8030a0e8" : "water_bomb_cannon_act_2", - "8030a11c" : "bhv_water_bomb_cannon_loop", - "8030a1c0" : "bhv_unagi_init", - "8030a2a8" : "unagi_act_0", - "8030a390" : "unagi_act_1_4", - "8030a514" : "unagi_act_2", - "8030a614" : "unagi_act_3", - "8030a93c" : "bhv_unagi_loop", - "8030aabc" : "bhv_unagi_subobject_loop", - "8030b2f4" : "bhv_dorrie_update", - "8030b658" : "bhv_haunted_chair_init", - "8030b6d8" : "haunted_chair_act_0", - "8030ba68" : "haunted_chair_act_1", - "8030bc90" : "bhv_haunted_chair_loop", - "8030bfd0" : "bhv_mad_piano_update", - "8030c06c" : "flying_bookend_act_0", - "8030c0f0" : "flying_bookend_act_1", - "8030c210" : "flying_bookend_act_2", - "8030c2c8" : "flying_bookend_act_3", - "8030c364" : "bhv_flying_bookend_loop", - "8030c4b0" : "bhv_bookend_spawn_loop", - "8030c564" : "bookshelf_manager_act_0", - "8030c60c" : "bookshelf_manager_act_1", - "8030c6a4" : "bookshelf_manager_act_2", - "8030c828" : "bookshelf_manager_act_3", - "8030c894" : "bookshelf_manager_act_4", - "8030c8ec" : "bhv_haunted_bookshelf_manager_loop", - "8030c98c" : "bhv_book_switch_loop", - "8030cd30" : "obj_spit_fire", - "8030cddc" : "bhv_fire_piranha_plant_init", - "8030d2f0" : "bhv_fire_piranha_plant_update", - "8030d598" : "bhv_fire_spitter_update", - "8030d640" : "bhv_small_piranha_flame_loop", - "8030d8d4" : "bhv_fly_guy_flame_loop", - "8030d93c" : "Geo18_8030D93C", - "8030d9ac" : "Geo18_8030D9AC", - "8030da14" : "snufit_act_0", - "8030db38" : "snufit_act_1", - "8030dc70" : "bhv_snufit_loop", - "8030dfc4" : "bhv_snufit_balls_loop", - "8030e14c" : "bhv_horizontal_grindel_init", - "8030e16c" : "bhv_horizontal_grindel_update", - "8030ea9c" : "bhv_eyerok_boss_loop", - "8030fff8" : "bhv_eyerok_hand_loop", - "80310498" : "bhv_klepto_init", - "8031126c" : "obj_set_speed_to_zero", - "8031129c" : "bhv_klepto_update", - "80311874" : "bhv_bird_update", - "803118e4" : "bhv_racing_penguin_init", - "80312070" : "bhv_racing_penguin_update", - "80312168" : "bhv_penguin_race_finish_line_update", - "80312200" : "bhv_penguin_race_shortcut_check_update", - "80312248" : "bhv_coffin_manager_loop", - "80312370" : "coffin_act_0", - "8031262c" : "coffin_act_1", - "8031274c" : "bhv_coffin_loop", - "80312804" : "clam_act_0", - "80312900" : "clam_act_1", - "80312a54" : "bhv_clam_loop", - "80313110" : "bhv_skeeter_update", - "803131e8" : "bhv_skeeter_wave_update", - "8031326c" : "bhv_swing_platform_init", - "80313294" : "bhv_swing_platform_update", - "80313354" : "bhv_donut_platform_spawner_update", - "80313530" : "bhv_donut_platform_update", - "803136cc" : "bhv_ddd_pole_init", - "80313754" : "bhv_ddd_pole_update", - "803137f4" : "bhv_red_coin_star_marker_init", - "80313fc0" : "bhv_triplet_butterfly_update", - "80314098" : "bubba_act_0", - "8031427c" : "bubba_act_1", - "803145d4" : "bhv_bubba_loop", - "80314a30" : "prepare_reverb_ring_buffer", - "80314cc0" : "get_volume_ramping", - "80314de4" : "synthesis_execute", - "80314f64" : "synthesis_do_one_audio_update", - "80315590" : "synthesis_process_notes", - "80316010" : "load_wave_samples", - "803160dc" : "final_resample", - "80316138" : "process_envelope", - "8031619c" : "process_envelope_inner", - "803166fc" : "note_apply_headset_pan_effects", - "80316ac8" : "note_init_volume", - "80316af4" : "note_set_vel_pan_reverb", - "80316da8" : "note_set_frequency", - "80316db4" : "note_enable", - "80316e00" : "note_disable", - "80316e80" : "reset_bank_and_seq_load_status", - "80316ec4" : "discard_bank", - "80316fb4" : "discard_sequence", - "80317040" : "soundAlloc", - "803170b4" : "sound_alloc_pool_init", - "803170d4" : "persistent_pool_clear", - "803170e8" : "temporary_pool_clear", - "80317118" : "unused_803160F8", - "80317128" : "sound_init_main_pools", - "80317184" : "session_pools_init", - "80317200" : "seq_and_bank_pool_init", - "8031727c" : "persistent_pools_init", - "80317338" : "temporary_pools_init", - "803173fc" : "alloc_bank_or_seq", - "8031782c" : "get_bank_or_seq", - "803178ec" : "decrease_reverb_gain", - "80317914" : "wait_for_audio_frames", - "80317948" : "audio_reset_session", - "80318040" : "audio_dma_copy_immediate", - "803180c4" : "audio_dma_copy_async", - "80318130" : "audio_dma_partial_copy_async", - "803181ec" : "decrease_sample_dma_ttls", - "80318300" : "dma_sample_data", - "80318634" : "init_sample_dma_buffers", - "803188f4" : "patch_audio_bank", - "80318b30" : "bank_load_immediate", - "80318c8c" : "bank_load_async", - "80318dc4" : "sequence_dma_immediate", - "80318e70" : "sequence_dma_async", - "80318fac" : "get_missing_bank", - "803190f4" : "load_banks_immediate", - "80319220" : "preload_sequence", - "80319328" : "load_sequence", - "80319388" : "load_sequence_internal", - "8031950c" : "audio_init", - "80319920" : "note_init", - "80319998" : "note_disable2", - "803199b8" : "process_notes", - "80319db8" : "seq_channel_layer_decay_release_internal", - "80319f64" : "seq_channel_layer_note_decay", - "80319f84" : "seq_channel_layer_note_release", - "80319fa4" : "build_synthetic_wave", - "8031a1d0" : "init_synthetic_wave", - "8031a254" : "init_note_list", - "8031a264" : "init_note_lists", - "8031a2b4" : "init_note_free_list", - "8031a368" : "note_pool_clear", - "8031a494" : "note_pool_fill", - "8031a5d0" : "audio_list_push_front", - "8031a610" : "audio_list_remove", - "8031a63c" : "pop_node_with_value_less_equal", - "8031a6cc" : "note_init_for_layer", - "8031a794" : "func_80319728", - "8031a7c8" : "note_release_and_take_ownership", - "8031a820" : "alloc_note_from_disabled", - "8031a89c" : "alloc_note_from_decaying", - "8031a8f0" : "alloc_note_from_active", - "8031a94c" : "alloc_note", - "8031ac34" : "reclaim_notes", - "8031adac" : "note_init_all", - "8031aee0" : "func_80319E70", - "8031aee8" : "sequence_player_process_sound", - "8031b0cc" : "get_portamento_freq_scale", - "8031b1c0" : "get_vibrato_pitch_change", - "8031b248" : "get_vibrato_freq_scale", - "8031b440" : "note_vibrato_update", - "8031b4a0" : "note_vibrato_init", - "8031b58c" : "adsr_init", - "8031b5ac" : "adsr_update", - "8031b830" : "sequence_channel_init", - "8031b940" : "seq_channel_set_layer", - "8031ba30" : "seq_channel_layer_disable", - "8031ba6c" : "seq_channel_layer_free", - "8031baf0" : "sequence_channel_disable", - "8031bb5c" : "allocate_sequence_channel", - "8031bba4" : "sequence_player_init_channels", - "8031bcd0" : "sequence_player_disable_channels", - "8031bda0" : "sequence_channel_enable", - "8031be44" : "sequence_player_disable", - "8031bf14" : "audio_list_push_back", - "8031bf54" : "audio_list_pop_back", - "8031bf94" : "init_layer_freelist", - "8031c03c" : "m64_read_u8", - "8031c050" : "m64_read_s16", - "8031c080" : "m64_read_compressed_u16", - "8031c0c4" : "seq_channel_layer_process_script", - "8031c200" : "L_U_8031C200", - "8031c23c" : "L_U_8031C23C", - "8031c298" : "L_U_8031C298", - "8031c2dc" : "L_U_8031C2DC", - "8031c328" : "L_U_8031C328", - "8031c36c" : "L_U_8031C36C", - "8031c3bc" : "L_U_8031C3BC", - "8031c3e8" : "L_U_8031C3E8", - "8031c454" : "L_U_8031C454", - "8031c4a4" : "L_U_8031C4A4", - "8031c5c8" : "L_U_8031C5C8", - "8031c698" : "L_U_8031C698", - "8031c6a0" : "L_U_8031C6A0", - "8031cbe0" : "L_U_8031CBE0", - "8031cbec" : "L_U_8031CBEC", - "8031ce54" : "get_instrument", - "8031cfd4" : "set_instrument", - "8031d068" : "sequence_channel_set_volume", - "8031d08c" : "sequence_channel_process_script", - "8031d144" : "L_U_8031D144", - "8031d1f8" : "L_U_8031D1F8", - "8031d234" : "L_U_8031D234", - "8031d26c" : "L_U_8031D26C", - "8031d2b4" : "L_U_8031D2B4", - "8031d2c4" : "L_U_8031D2C4", - "8031d31c" : "L_U_8031D31C", - "8031d344" : "L_U_8031D344", - "8031d354" : "L_U_8031D354", - "8031d370" : "L_U_8031D370", - "8031d3a8" : "L_U_8031D3A8", - "8031d3c4" : "L_U_8031D3C4", - "8031d3d4" : "L_U_8031D3D4", - "8031d3e4" : "L_U_8031D3E4", - "8031d400" : "L_U_8031D400", - "8031d424" : "L_U_8031D424", - "8031d44c" : "L_U_8031D44C", - "8031d474" : "L_U_8031D474", - "8031d498" : "L_U_8031D498", - "8031d4bc" : "L_U_8031D4BC", - "8031d4d4" : "L_U_8031D4D4", - "8031d4f0" : "L_U_8031D4F0", - "8031d500" : "L_U_8031D500", - "8031d51c" : "L_U_8031D51C", - "8031d538" : "L_U_8031D538", - "8031d56c" : "L_U_8031D56C", - "8031d5a0" : "L_U_8031D5A0", - "8031d5b4" : "L_U_8031D5B4", - "8031d5d4" : "L_U_8031D5D4", - "8031d5e4" : "L_U_8031D5E4", - "8031d640" : "L_U_8031D640", - "8031d678" : "L_U_8031D678", - "8031d6c4" : "L_U_8031D6C4", - "8031d6d4" : "L_U_8031D6D4", - "8031d6f4" : "L_U_8031D6F4", - "8031d718" : "L_U_8031D718", - "8031d728" : "L_U_8031D728", - "8031d73c" : "L_U_8031D73C", - "8031d7b8" : "L_U_8031D7B8", - "8031d7e8" : "L_U_8031D7E8", - "8031d7f8" : "L_U_8031D7F8", - "8031d814" : "L_U_8031D814", - "8031d830" : "L_U_8031D830", - "8031d87c" : "L_U_8031D87C", - "8031d898" : "L_U_8031D898", - "8031d8f8" : "L_U_8031D8F8", - "8031d900" : "L_U_8031D900", - "8031d930" : "L_U_8031D930", - "8031d94c" : "L_U_8031D94C", - "8031d974" : "L_U_8031D974", - "8031d9ec" : "sequence_player_process_sequence", - "8031e240" : "process_sequences", - "8031e2e8" : "init_sequence_player", - "8031e374" : "init_sequence_players", - "8031e4f0" : "unused_8031E4F0", - "8031e568" : "unused_8031E568", - "8031e7b8" : "create_next_audio_frame_task", - "8031eb00" : "play_sound", - "8031fd84" : "audio_signal_game_loop_tick", - "8031fdac" : "update_game_sound", - "80320544" : "play_sequence", - "80320678" : "sequence_player_fade_out", - "803206bc" : "fade_volume_scale", - "80320734" : "fade_channel_volume_scale", - "8032080c" : "func_8031F96C", - "803208ec" : "process_level_music_dynamics", - "80320a4c" : "L8031FBAC", - "80320a8c" : "L8031FBEC", - "80320acc" : "L8031FC2C", - "80320b0c" : "L8031FC6C", - "80320b4c" : "L8031FCAC", - "80320b8c" : "L8031FCEC", - "80320bcc" : "L8031FD2C", - "80320bf4" : "L8031FD54", - "80320d70" : "unused_8031FED0", - "80320e3c" : "func_8031FFB4", - "80320ec4" : "sequence_player_unlower", - "80320f68" : "func_803200E4", - "803210d4" : "set_sound_disabled", - "8032112c" : "sound_init", - "80321398" : "get_currently_playing_sound", - "80321474" : "func_803205E8", - "80321584" : "func_803206F8", - "8032171c" : "func_80320890", - "8032174c" : "sound_banks_disable", - "8032180c" : "sound_banks_enable", - "80321864" : "unused_803209D8", - "803218d8" : "func_80320A4C", - "803218f4" : "play_dialog_sound", - "803219ac" : "play_music", - "80321bac" : "stop_background_music", - "80321ce4" : "fadeout_background_music", - "80321d38" : "drop_queued_background_music", - "80321d5c" : "get_current_background_music", - "80321d9c" : "func_80320ED8", - "80321e48" : "play_secondary_music", - "80321f48" : "func_80321080", - "80321f9c" : "func_803210D4", - "80322078" : "play_course_clear", - "803220b4" : "play_peachs_jingle", - "803220f0" : "play_puzzle_jingle", - "8032212c" : "play_star_fanfare", - "80322168" : "play_power_star_jingle", - "803221b8" : "play_race_fanfare", - "803221f4" : "play_toads_jingle", - "80322230" : "sound_reset", - "8032231c" : "audio_set_sound_mode", - "80322348" : "unused_80321460", - "8032235c" : "unused_80321474", - "803223b0" : ".", - "803223b0" : "osSetTime", - "803223e0" : "osMapTLB", - "803224a0" : "osUnmapTLBAll", - "803224f0" : "sprintf", - "8032255c" : "proutSprintf", - "803225a0" : "osCreateMesgQueue", - "803225d0" : "osSetEventMesg", - "80322640" : "osViSetEvent", - "803226b0" : "osCreateThread", - "80322800" : "osRecvMesg", - "80322940" : "_VirtualToPhysicalTask", - "80322a5c" : "osSpTaskLoad", - "80322bbc" : "osSpTaskStartGo", - "80322c00" : "osSpTaskYield", - "80322c20" : "osSendMesg", - "80322d70" : "osSpTaskYielded", - "80322df0" : "osStartThread", - "80322f40" : "osWritebackDCacheAll", - "80322f70" : "osCreateViManager", - "803230f4" : "viMgrMain", - "803232d0" : "osViSetMode", - "80323340" : "osViBlack", - "803233b0" : "osViSetSpecialFeatures", - "80323570" : "osCreatePiManager", - "803236f0" : "osSetThreadPri", - "803237d0" : "osInitialize", - "80323a00" : "osViSwapBuffer", - "80323a50" : "sqrtf", - "80323a60" : "osContStartReadData", - "80323b24" : "osContGetReadData", - "80323bcc" : "__osPackReadData", - "80323cc0" : "osContInit", - "80323ebc" : "__osContGetInitData", - "80323f8c" : "__osPackRequestData", - "80324080" : "osEepromProbe", - "803240f0" : "__ull_rshift", - "8032411c" : "__ull_rem", - "80324158" : "__ull_div", - "80324194" : "__ll_lshift", - "803241c0" : "__ll_rem", - "803241fc" : "__ll_div", - "80324258" : "__ll_mul", - "80324288" : "__ull_divremi", - "803242e8" : "__ll_mod", - "80324384" : "__ll_rshift", - "803243b0" : "osInvalDCache", - "80324460" : "osPiStartDma", - "80324570" : "bzero", - "80324610" : "osInvalICache", - "80324690" : "osEepromLongRead", - "803247d0" : "osEepromLongWrite", - "80324910" : "bcopy", - "80324c20" : "guOrthoF", - "80324d74" : "guOrtho", - "80324de0" : "guPerspectiveF", - "80325010" : "guPerspective", - "80325070" : "osGetTime", - "80325100" : "__d_to_ll", - "8032511c" : "__f_to_ll", - "80325138" : "__d_to_ull", - "803251d8" : "__f_to_ull", - "80325274" : "__ll_to_d", - "8032528c" : "__ll_to_f", - "803252a4" : "__ull_to_d", - "803252d8" : "__ull_to_f", - "80325310" : "cosf", - "80325480" : "sinf", - "80325640" : "guTranslateF", - "80325688" : "guTranslate", - "803256e0" : "guRotateF", - "80325874" : "guRotate", - "803258d0" : "guScaleF", - "80325924" : "guScale", - "80325970" : "osAiSetFrequency", - "80325bd4" : "alBnkfNew", - "80325cd8" : "alSeqFileNew", - "80325d20" : "osWritebackDCache", - "80325da0" : "osAiGetLength", - "80325db0" : "osAiSetNextBuffer", - "80325e60" : "__osTimerServicesInit", - "80325eec" : "__osTimerInterrupt", - "80326064" : "__osSetTimerIntr", - "803260d8" : "__osInsertTimer", - "80326260" : "_Printf", - "803273f0" : "memcpy", - "8032741c" : "strlen", - "80327444" : "strchr", - "80327490" : "__osDequeueThread", - "803274d0" : "__osDisableInt", - "803274f0" : "__osRestoreInt", - "80327510" : "__osViInit", - "80327640" : "__osExceptionPreamble", - "80327650" : "__osException", - "803278e4" : "L80326964", - "80327904" : "L80326984", - "80327938" : "L803269B8", - "80327a68" : "L80326AE8", - "80327ac4" : "L80326B44", - "80327ae4" : "L80326B64", - "80327b1c" : "L80326B9C", - "80327b68" : "L80326BE8", - "80327b98" : "send_mesg", - "80327c80" : "__osEnqueueAndYield", - "80327d10" : "__osEnqueueThread", - "80327d58" : "__osPopThread", - "80327d68" : "__osDispatchThread", - "80327ea8" : "__osCleanupThread", - "80327eb0" : "osVirtualToPhysical", - "80327f30" : "__osSpSetStatus", - "80327f40" : "__osSpSetPc", - "80327f80" : "__osSpRawStartDma", - "80328010" : "__osSpDeviceBusy", - "80328040" : "__osSpGetStatus", - "80328050" : "osGetThreadPri", - "80328070" : "__osViGetCurrentContext", - "80328080" : "__osViSwapContext", - "803283e0" : "osGetCount", - "803283f0" : "__osPiCreateAccessQueue", - "80328440" : "__osPiGetAccess", - "80328484" : "__osPiRelAccess", - "803284b0" : "osPiRawStartDma", - "80328590" : "__osDevMgrMain", - "80328710" : "__osSetSR", - "80328720" : "__osGetSR", - "80328730" : "__osSetFpcCsr", - "80328740" : "__osSiRawReadIo", - "80328790" : "__osSiRawWriteIo", - "803287e0" : "osMapTLBRdb", - "80328840" : "osPiRawReadIo", - "803288a0" : "__osSiCreateAccessQueue", - "803288f0" : "__osSiGetAccess", - "80328934" : "__osSiRelAccess", - "80328960" : "__osSiRawStartDma", - "80328a10" : "osSetTimer", - "80328af0" : "osEepromWrite", - "80328ca0" : "__osPackEepWriteData", - "80328dac" : "__osEepStatus", - "80328fd0" : "osJamMesg", - "80329120" : "osPiGetCmdQueue", - "80329150" : "osEepromRead", - "80329340" : "__osPackEepReadData", - "80329450" : "guMtxF2L", - "80329550" : "guMtxIdentF", - "803295d8" : "guMtxIdent", - "80329608" : "guMtxL2F", - "803296c0" : "guNormalize", - "80329750" : "__osAiDeviceBusy", - "80329780" : "__osSetCompare", - "80329790" : "_Litob", - "80329a90" : "_Ldtob", - "8032a860" : "u32_to_string", - "8032a890" : "string_to_u32", - "8032a8e8" : "send_packet", - "8032a9a8" : "send", - "8032aa80" : "process_command_memory", - "8032aacc" : "process_command_register", - "8032aaf8" : "kdebugserver", - "8032ace0" : "__osSyncPutChars", - "8032ae10" : "osSetIntMask", - "8032ae70" : "osDestroyThread", - "8032af70" : "__osProbeTLB", - "8032b030" : "__osSiDeviceBusy", - "8032b060" : "lldiv", - "8032b160" : "ldiv", - "8032b1f0" : "__osGetCause", - "8032b200" : "__osAtomicDec", - "8032b260" : "rspF3DBootStart", - "8032b330" : "rspF3DBootEnd", - "8032b330" : "rspF3DStart", - "8032c738" : "rspF3DEnd", - "8032c740" : "rspAspMainStart", - "8032d560" : "rspAspMainEnd", - "8032d560" : "gVblankHandler1", - "8032d564" : "gVblankHandler2", - "8032d568" : "gActiveSPTask", - "8032d56c" : "sCurrentAudioSPTask", - "8032d570" : "sCurrentDisplaySPTask", - "8032d574" : "sNextAudioSPTask", - "8032d578" : "sNextDisplaySPTask", - "8032d57c" : "sAudioEnabled", - "8032d580" : "sNumVblanks", - "8032d584" : "gResetTimer", - "8032d588" : "D_8032C648", - "8032d58c" : "gDebugLevelSelect", - "8032d590" : "D_8032C650", - "8032d594" : "gShowProfiler", - "8032d598" : "gShowDebugText", - "8032d5d0" : "unused8032C690", - "8032d5d4" : "gGlobalTimer", - "8032d5dc" : "frameBufferIndex", - "8032d5e0" : "D_8032C6A0", - "8032d5e4" : "gPlayer1Controller", - "8032d5e8" : "gPlayer2Controller", - "8032d5ec" : "gPlayer3Controller", - "8032d5f0" : "gCurrDemoInput", - "8032d5f4" : "gDemoInputListID", - "8032d5f8" : "gRecordedDemoInput", - "8032d6d0" : "credits01", - "8032d6d8" : "credits02", - "8032d6e4" : "credits03", - "8032d6f0" : "credits04", - "8032d700" : "credits05", - "8032d710" : "credits06", - "8032d71c" : "credits07", - "8032d728" : "credits08", - "8032d738" : "credits09", - "8032d740" : "credits10", - "8032d750" : "credits11", - "8032d75c" : "credits12", - "8032d764" : "credits13", - "8032d774" : "credits14", - "8032d77c" : "credits15", - "8032d788" : "credits16", - "8032d79c" : "credits17", - "8032d7ac" : "credits18", - "8032d7bc" : "credits19", - "8032d7c4" : "credits20", - "8032d7cc" : "sCreditsSequence", - "8032d93c" : "gMarioState", - "8032d940" : "unused1", - "8032d944" : "D_8032C9E0", - "8032daa0" : "sTerrainSounds", - "8032dacc" : "sSquishScaleOverTime", - "8032dae0" : "sCapFlickerFrames", - "8032daf8" : "gWaterSurfacePseudoFloor", - "8032dc50" : "sJumpLandAction", - "8032dc68" : "sFreefallLandAction", - "8032dc80" : "sSideFlipLandAction", - "8032dc98" : "sHoldJumpLandAction", - "8032dcb0" : "sHoldFreefallLandAction", - "8032dcc8" : "sLongJumpLandAction", - "8032dce0" : "sDoubleJumpLandAction", - "8032dcf8" : "sTripleJumpLandAction", - "8032dd10" : "sBackflipLandAction", - "8032dd40" : "sPunchingForwardVelocities", - "8032dd80" : "gLastCompletedCourseNum", - "8032dd84" : "gLastCompletedStarNum", - "8032dd88" : "sUnusedGotGlobalCoinHiScore", - "8032dd8c" : "gGotFileCoinHiScore", - "8032dd90" : "gCurrCourseStarFlags", - "8032dd94" : "gSpecialTripleJump", - "8032dd98" : "gLevelToCourseNumTable", - "8032ddc0" : "gMarioSpawnInfo", - "8032ddc4" : "gLoadedGraphNodes", - "8032ddc8" : "gAreas", - "8032ddcc" : "gCurrentArea", - "8032ddd0" : "gCurrCreditsEntry", - "8032ddd4" : "D_8032CE74", - "8032ddd8" : "D_8032CE78", - "8032dddc" : "gWarpTransDelay", - "8032dde0" : "gFBSetColor", - "8032dde4" : "gWarpTransFBSetColor", - "8032dde8" : "gWarpTransRed", - "8032ddec" : "gWarpTransGreen", - "8032ddf0" : "gWarpTransBlue", - "8032ddf4" : "gCurrSaveFileNum", - "8032ddf8" : "gCurrLevelNum", - "8032ddfc" : "D_8032CE9C", - "8032de4c" : "D_8032CEEC", - "8032de60" : "D_8032CF00", - "8032de70" : "renderModeTable_1Cycle", - "8032deb0" : "renderModeTable_2Cycle", - "8032def0" : "gCurGraphNodeRoot", - "8032def4" : "gCurGraphNodeMasterList", - "8032def8" : "gCurGraphNodeCamFrustum", - "8032defc" : "gCurGraphNodeCamera", - "8032df00" : "gCurGraphNodeObject", - "8032df04" : "gCurGraphNodeHeldObject", - "8032df08" : "gAreaUpdateCounter", - "8032df10" : "gProfilerMode", - "8032df14" : "gCurrentFrameIndex1", - "8032df18" : "gCurrentFrameIndex2", - "8032df20" : "unused_8032CFC0", - "8032df24" : "gCutsceneFocus", - "8032df28" : "unused_8032CFC8", - "8032df2c" : "unused_8032CFCC", - "8032df30" : "gSecondCameraFocus", - "8032df34" : "D_8032CFD4", - "8032df38" : "gCurrLevelArea", - "8032df3c" : "gPrevLevel", - "8032df40" : "D_8032CFE0", - "8032df44" : "D_8032CFE4", - "8032df48" : "D_8032CFE8", - "8032df4c" : "gCameraZoomDist", - "8032df50" : "sTempCutsceneNumber", - "8032df54" : "gCutsceneNumber", - "8032df58" : "sCutsceneTransitionTimer", - "8032df5c" : "D_8032CFFC", - "8032df60" : "sMarioStatusForCamera", - "8032df64" : "sLuigiStatusForCamera", - "8032df68" : "D_8032D008", - "8032df6c" : "sFixedPresetBasePosition", - "8032df78" : "D_8032D00C_2", - "8032df84" : "D_8032D00C_3", - "8032df90" : "D_8032D00C_4", - "8032df9c" : "D_8032D00C_5", - "8032dfa8" : "TableCameraTransitions", - "8032e008" : "unused_8032D0A8", - "8032e010" : "unused_8032D0B0", - "8032e018" : "D_8032D0B8", - "8032e050" : "BBHRoom6ParallelTrackingTable", - "8032e098" : "TableCameraSL", - "8032e0e0" : "TableCameraTHI", - "8032e128" : "TableCameraHMC", - "8032e1d0" : "TableCameraSSL", - "8032e248" : "TableCameraRR", - "8032e338" : "TableCameraCotMC", - "8032e368" : "TableCameraCCM", - "8032e3b0" : "TableCameraInside", - "8032e6f8" : "TableCameraBBH", - "8032ecb0" : "TableLevelCinematicCamera", - "8032ed50" : "sIntroStartToPipePosition", - "8032ee08" : "sIntroStartToPipeFocus", - "8032eec0" : "sIntroPipeToDialogPosition", - "8032ef30" : "sIntroPipeToDialogFocus", - "8032efa0" : "D_8032E040", - "8032eff0" : "D_8032E090", - "8032f048" : "D_8032E0E8", - "8032f0e8" : "D_8032E188", - "8032f130" : "D_8032E1D0", - "8032f178" : "D_8032E218", - "8032f1b8" : "D_8032E258", - "8032f214" : "gIntroLakituStartToPipeFocus", - "8032f32c" : "gIntroLakituStartToPipeOffsetFromCamera", - "8032f444" : "D_8032E4E4", - "8032f48c" : "D_8032E52C", - "8032f4d4" : "TableCutscenePeachEnd", - "8032f534" : "TableCutsceneGrandStar", - "8032f544" : "TableCutscene0FTodo", - "8032f554" : "TableCutsceneDoorWarp", - "8032f564" : "TableCutsceneEndWaving", - "8032f56c" : "TableCutsceneCredits", - "8032f574" : "TableCutsceneDoor00", - "8032f59c" : "TableCutsceneDoor01", - "8032f5c4" : "TableCutsceneDoor0A", - "8032f5dc" : "TableCutsceneDoor0B", - "8032f5f4" : "TableCutsceneEnterCannon", - "8032f60c" : "TableCutsceneStarSpawn", - "8032f624" : "TableCutsceneSpecialStarSpawn", - "8032f634" : "TableCutsceneEnterPainting", - "8032f63c" : "TableCutsceneDeathExit", - "8032f64c" : "TableCutsceneExitPaintingSuccess", - "8032f65c" : "TableCutscene11Todo", - "8032f674" : "TableCutsceneIntroPeach", - "8032f69c" : "TableCutscenePrepareCannon", - "8032f6ac" : "TableCutsceneExitWaterfall", - "8032f6bc" : "TableCutsceneFallToCastleGrounds", - "8032f6cc" : "TableCutsceneEnterPyramidTop", - "8032f6dc" : "TableCutscene26Todo", - "8032f6f4" : "TableCutsceneStandingDeath", - "8032f6fc" : "TableCutsceneEnterPool", - "8032f70c" : "TableCutsceneDeath2", - "8032f714" : "TableCutsceneDeathOnBack", - "8032f71c" : "TableCutsceneQuicksandDeath", - "8032f72c" : "TableCutsceneSuffocationDeath", - "8032f734" : "TableCutsceneEnterBowserPlatform", - "8032f74c" : "TableCutsceneStarDance1", - "8032f754" : "TableCutsceneStarDance2", - "8032f75c" : "TableCutsceneStarDance3", - "8032f764" : "TableCutsceneKeyDance", - "8032f76c" : "TableCutsceneCapSwitchPress", - "8032f774" : "TableCutsceneSlidingDoorsOpen", - "8032f784" : "TableCutsceneUnlockKeyDoor", - "8032f794" : "TableCutsceneExitBowserSuccess", - "8032f7a4" : "TableCutscene1CTodo", - "8032f7b4" : "TableCutsceneBBHExitSuccess", - "8032f7c4" : "TableCutsceneNonPaintingDeath", - "8032f7d4" : "TableCutsceneDialog", - "8032f7ec" : "TableCutsceneReadMessage", - "8032f804" : "D_8032E8A4", - "8032f870" : "zoomOutAreaMasks", - "8032f884" : "sBobCreditsCameraPositions", - "8032f8ac" : "sBobCreditsCameraFocus", - "8032f8d4" : "sWfCreditsCameraPositions", - "8032f8fc" : "sWfCreditsCameraFocus", - "8032f924" : "sJrbCreditsCameraPositions", - "8032f94c" : "sJrbCreditsCameraFocus", - "8032f974" : "sCcmSlideCreditsCameraPositions", - "8032f99c" : "sCcmSlideCreditsCameraFocus", - "8032f9c4" : "sBbhCreditsCameraPositions", - "8032f9e4" : "sBbhCreditsCameraFocus", - "8032fa04" : "sHmcCreditsCameraPositions", - "8032fa2c" : "sHmcCreditsCameraFocus", - "8032fa54" : "sThiWigglerCreditsCameraPositions", - "8032fa6c" : "sThiWigglerCreditsCameraFocus", - "8032fa84" : "sVolcanoCreditsCameraPositions", - "8032fab4" : "sVolcanoCreditsCameraFocus", - "8032fae4" : "sSslCreditsCameraPositions", - "8032fb14" : "sSslCreditsCameraFocus", - "8032fb44" : "sDddCreditsCameraPositions", - "8032fb7c" : "sDddCreditsCameraFocus", - "8032fbb4" : "sSlCreditsCameraPositions", - "8032fbd4" : "sSlCreditsCameraFocus", - "8032fbf4" : "sWdwCreditsCameraPositions", - "8032fc14" : "sWdwCreditsCameraFocus", - "8032fc34" : "sTtmCreditsCameraPositions", - "8032fc64" : "sTtmCreditsCameraFocus", - "8032fc94" : "sThiHugeCreditsCameraPositions", - "8032fccc" : "sThiHugeCreditsCameraFocus", - "8032fd04" : "sTtcCreditsCameraPositions", - "8032fd24" : "sTtcCreditsCameraFocus", - "8032fd44" : "sRrCreditsCameraPositions", - "8032fd64" : "sRrCreditsCameraFocus", - "8032fd84" : "sSaCreditsCameraPositions", - "8032fdac" : "sSaCreditsCameraFocus", - "8032fdd4" : "sCotmcCreditsCameraPositions", - "8032fdfc" : "sCotmcCreditsCameraFocus", - "8032fe24" : "sDddSubCreditsCameraPositions", - "8032fe4c" : "sDddSubCreditsCameraFocus", - "8032fe74" : "sCcmOutsideCreditsCameraPositions", - "8032fe94" : "sCcmOutsideCreditsCameraFocus", - "8032fec0" : "sObjectListUpdateOrder", - "8032fecc" : "sParticleTypes", - "80330000" : "D_8032F0A0", - "80330004" : "D_8032F0A4", - "80330020" : "D_8032F0C0", - "8033002c" : "D_8032F0CC", - "8033006c" : "sMrIParticleActions", - "80330074" : "sMrIActions", - "80330084" : "sMrIHitbox", - "80330094" : "D_8032F134", - "803300a8" : "unused8032F134", - "803300ac" : "sCapSwitchActions", - "803300bc" : "sKingBobombActions", - "803300e0" : "sKingBobombSoundStates", - "80330140" : "sOpenedCannonActions", - "8033015c" : "unused0EA1FC", - "80330198" : "sChuckyaActions", - "803301a8" : "sWFRotatingPlatformData", - "803301c0" : "sKoopaShellUnderwaterHitbox", - "803301d0" : "D_8032F270", - "803301e4" : "sSparkleSpawnStarHitbox", - "803301f4" : "sYellowCoinHitbox", - "80330204" : "D_8032F2A4", - "80330224" : "sCoinInsideBooActions", - "8033022c" : "D_8032F2CC", - "80330244" : "D_8032F2E4", - "80330260" : "D_8032F300", - "80330288" : "D_8032F328", - "80330290" : "D_8032F330", - "80330298" : "sGrindelThwompActions", - "803302ac" : "sTumblingBridgeParams", - "803302dc" : "sTumblingBridgeActions", - "803302ec" : "D_8032F38C", - "80330318" : "sElevatorActions", - "8033032c" : "D_8032F3CC", - "80330340" : "D_8032F3E0", - "80330354" : "D_8032F3F4", - "8033035c" : "D_8032F3FC", - "80330370" : "sUkikiCageActions", - "80330380" : "D_8032F420", - "80330390" : "sSpindriftHitbox", - "803303a0" : "sMetalBoxHitbox", - "803303b0" : "sBreakableBoxHitbox", - "803303c0" : "D_8032F460", - "803303e8" : "sHeaveHoActions", - "803303f8" : "sJumpingBoxHitbox", - "80330408" : "sJumpingBoxActions", - "8033042c" : "sBowserKeyHitbox", - "8033043c" : "sBulletBillActions", - "80330450" : "sBowserTailAnchorActions", - "8033045c" : "D_8032F4FC", - "8033046c" : "D_8032F50C", - "80330470" : "D_8032F510", - "80330474" : "D_8032F514", - "80330478" : "sBowserDefeatedDialogText", - "80330480" : "D_8032F520", - "803304c8" : "sBowserActions", - "80330518" : "D_8032F5B8", - "803305f0" : "D_8032F690", - "803305f4" : "D_8032F694", - "803305f8" : "D_8032F698", - "8033067c" : "sFallingBowserPlatformActions", - "80330688" : "sGrowingBowserFlameHitbox", - "80330698" : "sBowserFlameHitbox", - "803306a8" : "D_8032F748", - "803306b4" : "D_8032F754", - "803306dc" : "sCageUkikiPath", - "80330738" : "sUkikiSoundStates", - "803307a0" : "sUkikiActions", - "803307c0" : "D_8032F860", - "803307f4" : "D_8032F894", - "80330828" : "D_8032F8C8", - "80330830" : "sRotatingCwFireBarsActions", - "80330840" : "sKoopaShellHitbox", - "80330850" : "D_8032F8F0", - "80330884" : "D_8032F924", - "803308a8" : "D_8032F948", - "803308cc" : "D_8032F96C", - "803308d8" : "sToxBoxActions", - "80330900" : "TablePiranhaPlantActions", - "80330b1c" : "sBowserPuzzlePieceActions", - "80330b38" : "sTuxiesMotherActions", - "80330b44" : "sSmallPenguinActions", - "80330b5c" : "sFishActions", - "80330b68" : "sFishGroupActions", - "80330b74" : "sBirdChirpChirpActions", - "80330b84" : "sCheepCheepActions", - "80330b90" : "sExclamationBoxHitbox", - "80330ba0" : "sExclamationBoxContents", - "80330c20" : "sExclamationBoxActions", - "80330c38" : "sSkullSlidingBoxHitbox", - "80330c48" : "D_8032FCE8", - "80330c58" : "sTweesterHitbox", - "80330c68" : "sTweesterActions", - "80330cd4" : "sScuttlebugHitbox", - "80330ce4" : "sWhompActions", - "80330d0c" : "D_8032FDAC", - "80330d30" : "D_8032FDD0", - "80330d54" : "D_8032FDF4", - "80330d78" : "D_8032FE18", - "80330d9c" : "sWindParticleHitbox", - "80330dac" : "D_8032FE4C", - "80330e20" : "D_8032FEC0", - "80330e24" : "unused_8032FEC4", - "80330e34" : "gMarioPlatform", - "80330e40" : "sDebugEffectStringInfo", - "80330e64" : "sDebugEnemyStringInfo", - "80330e88" : "sDebugInfoDPadMask", - "80330e8c" : "sDebugInfoDPadUpdID", - "80330e90" : "sDebugLvSelectCheckFlag", - "80330e94" : "sDebugPage", - "80330e98" : "sNoExtraDebug", - "80330e9c" : "sDebugStringArrPrinted", - "80330ea0" : "sDebugSysCursor", - "80330ea4" : "sDebugInfoButtonSeqID", - "80330ea8" : "sDebugInfoButtonSeq", - "80330ec0" : "sTransitionColorFadeCount", - "80330ec4" : "sTransitionTextureFadeCount", - "80330ec8" : "sTextureTransitionID", - "80330ee0" : "rectangles", - "80330f00" : "sSkyboxTextures", - "80330f28" : "sSkyboxColors", - "80330f30" : "gMovtexCounter", - "80330f34" : "gMovtexCounterPrev", - "80330f38" : "gMovtexVtxColor", - "80330f3c" : "gPaintingMarioYEntry", - "80330f40" : "gWdwWaterLevelSet", - "80330f44" : "gMovtexIdToTexture", - "80330f64" : "gMovtexNonColored", - "803311a4" : "gMovtexColored", - "8033127c" : "gMovtexColored2", - "80331300" : "hmcPaintings", - "80331308" : "insideCastlePaintings", - "80331344" : "ttmPaintings", - "8033134c" : "paintingGroups", - "80331358" : "gPaintingUpdateCounter", - "8033135c" : "gLastPaintingUpdateCounter", - "80331360" : "sTextLabelsCount", - "80331370" : "gDialogCharWidths", - "80331470" : "gDialogBoxState", - "80331474" : "gDialogBoxOpenTimer", - "80331478" : "gDialogBoxScale", - "8033147c" : "gDialogScrollOffsetY", - "80331480" : "gDialogBoxType", - "80331484" : "gDialogID", - "80331488" : "gLastDialogPageStrPos", - "8033148c" : "gDialogTextPos", - "80331490" : "gDialogLineNum", - "80331494" : "gLastDialogResponse", - "80331498" : "gMenuHoldKeyIndex", - "8033149c" : "gMenuHoldKeyTimer", - "803314a0" : "gDialogResponse", - "803314b0" : "gHudSymCoin", - "803314b4" : "gHudSymX", - "803314f8" : "gMenuMode", - "803314fc" : "gEndCutsceneStrEn0", - "80331504" : "gEndCutsceneStrEn1", - "80331538" : "gEndCutsceneStrEn2", - "80331558" : "gEndCutsceneStrEn3", - "8033156c" : "gEndCutsceneStrEn4", - "80331598" : "gEndCutsceneStrEn5", - "803315ac" : "gEndCutsceneStrEn6", - "803315cc" : "gEndCutsceneStrEn7", - "803315dc" : "gEndCutsceneStrEn8", - "803315e4" : "gEndCutsceneStringsEn", - "8033160c" : "gCutsceneMsgFade", - "80331610" : "gCutsceneMsgIndex", - "80331614" : "gCutsceneMsgDuration", - "80331618" : "gCutsceneMsgTimer", - "8033161c" : "gDialogCameraAngleIndex", - "80331620" : "gDialogCourseActNum", - "803316c8" : "gCourseCompleteCoinsEqual", - "803316cc" : "gCourseDoneMenuTimer", - "803316d0" : "gCourseCompleteCoins", - "803316d4" : "gHudFlash", - "80331750" : "gEnvFxMode", - "80331754" : "D_80330644", - "80331758" : "gSnowTempVtx", - "80331788" : "gSnowFlakeVertex1", - "80331790" : "gSnowFlakeVertex2", - "80331798" : "gSnowFlakeVertex3", - "803317a0" : "D_80330690", - "803317a4" : "D_80330694", - "803317a8" : "gBubbleTempVtx", - "803317e0" : "MacroObjectPresets", - "803325fc" : "sPowerMeterVisibleTimer", - "80332614" : "sPrevCheckMarioRoom", - "80332618" : "sYoshiDead", - "8033261c" : "sDebugSequenceTracker", - "80332620" : "sDebugTimer", - "803327a8" : "sBreakableBoxSmallHitbox", - "80332b00" : "sMrBlizzardHitbox", - "80332b10" : "D_80331A00", - "80332b24" : "sMrBlizzardSnowballHitbox", - "80332b34" : "D_80331A24", - "80332b54" : "D_80331A44", - "80332b5c" : "D_80331A4C", - "80332b64" : "D_80331A54", - "80332bdc" : "D_80331ACC", - "80332bf0" : "sRecoveryHeartHitbox", - "80332c00" : "sUnagiHitbox", - "80332c10" : "sHauntedChairHitbox", - "80332c30" : "sFlyingBookendHitbox", - "80332c40" : "D_80331B30", - "80332c4c" : "sBookSwitchHitbox", - "80332c5c" : "sFirePiranhaPlantHitbox", - "80332c6c" : "D_80331B5C", - "80332c74" : "sPiranhaPlantFireHitbox", - "80332c84" : "sSnufitHitbox", - "80332c94" : "sSnufitBulletHitbox", - "80332ca4" : "sEyerokHitbox", - "80332cb4" : "D_80331BA4", - "80332d10" : "D_80331C00", - "80332d28" : "sClamShellHitbox", - "80332d38" : "sSkeeterHitbox", - "80332d48" : "D_80331C38", - "80332e50" : "gAudioErrorFlags", - "80332e54" : "sGameLoopTicked", - "80332e58" : "sDialogSpeaker", - "80332f04" : "sDialogSpeakerVoice", - "80332f40" : "sNumProcessedSoundRequests", - "80332f44" : "sSoundRequestCount", - "80332f48" : "sDynBbh", - "80332f54" : "sDynDdd", - "80332f6c" : "sDynJrb", - "80332f88" : "sDynWdw", - "80332f98" : "sDynHmc", - "80332fa8" : "sDynUnk38", - "80332fb8" : "sDynNone", - "80332fbc" : "sCurrentMusicDynamic", - "80332fc0" : "sBackgroundMusicForDynamics", - "80332fc4" : "sLevelDynamics", - "80333060" : "sMusicDynamics", - "803330c0" : "gAreaEchoLevel", - "80333138" : "D_80332028", - "80333188" : "sBackgroundMusicDefaultVolume", - "803331ac" : "sPlayer0CurSeqId", - "803331b0" : "sMusicDynamicDelay", - "803331b4" : "D_803320A4", - "803331c0" : "D_803320B0", - "803331cc" : "D_803320BC", - "803331d8" : "sMaxChannelsForSoundBank", - "803331e4" : "sNumSoundsPerBank", - "803331f0" : "gDefaultSoundArgs", - "803331fc" : "sUnusedSoundArgs", - "80333208" : "sSoundBankDisabled", - "80333218" : "D_80332108", - "8033321c" : "sHasStartedFadeOut", - "80333220" : "D_80332110", - "80333224" : "sUnused80332114", - "80333228" : "sUnused80332118", - "8033322c" : "D_8033211C", - "80333230" : "D_80332120", - "80333234" : "D_80332124", - "80333238" : "sBackgroundMusicQueueSize", - "8033323c" : "sUnused8033323C", - "803332a0" : "gAudioSessionPresets", - "80333498" : "gAudioCosineTable", - "80333598" : "gPitchBendFrequencyScale", - "80333994" : "gNoteFrequencies", - "80333b94" : "gDefaultShortNoteVelocityTable", - "80333ba4" : "gDefaultShortNoteDurationTable", - "80333bb4" : "gVibratoCurve", - "80333bc4" : "gDefaultEnvelope", - "80333bd0" : "sSineWave", - "80333c50" : "sSquareWave", - "80333cd0" : "sTriangleWave", - "80333d50" : "sSawtoothWave", - "80333dd0" : "gWaveSamples", - "80333de0" : "gHeadsetPanQuantization", - "80333df4" : "gHeadsetPanVolume", - "80333ff4" : "gStereoPanVolume", - "803341f4" : "gDefaultPanVolume", - "803343f4" : "gVolRampingLhs136", - "803345f4" : "gVolRampingRhs136", - "803347f4" : "gVolRampingLhs144", - "803349f4" : "gVolRampingRhs144", - "80334bf4" : "gVolRampingLhs128", - "80334df4" : "gVolRampingRhs128", - "80334ff4" : "gTatumsPerBeat", - "80334ff8" : "gUnusedCount80333EE8", - "80334ffc" : "gAudioHeapSize", - "80335000" : "D_80333EF0", - "80335004" : "gAudioLoadLock", - "80335008" : "sUnused8033EF8", - "80335010" : "osViModeTable", - "803358d0" : "viMgrMainArgs", - "803358f0" : "piMgrArgs", - "80335910" : "osClockRate", - "80335918" : "D_80334808", - "80335920" : "D_80334810", - "80335930" : "D_80334820", - "80335940" : "D_80334830", - "80335950" : "_spaces", - "80335974" : "_zeroes", - "803359a0" : "D_80334890", - "803359a4" : "unknown", - "803359a8" : "D_80334898", - "803359ac" : "D_8033489C", - "803359b0" : "D_803348A0", - "803359b4" : "D_803348A4", - "803359c0" : "D_803348B0", - "80335a20" : "D_80334910", - "80335a24" : "D_80334914", - "80335a28" : "D_80334918", - "80335a2c" : "D_8033491C", - "80335a30" : "D_80334920", - "80335a44" : "D_80334934", - "80335a48" : "D_80334938", - "80335a50" : "gOsPiAccessQueueCreated", - "80335a60" : "gOsSiAccessQueueCreated", - "80335aa0" : "D_80334990", - "80335af0" : "D_803349E0", - "80335b40" : "D_80334A30", - "80335b44" : "D_80334A34", - "80335b48" : "D_80334A38", - "80335b50" : "D_80334A40", - "80335b54" : "D_80334A44", - "80338da0" : "D_80337BB0", - "80338da8" : "D_80337BB8", - "80338e60" : "jtbl_80337C90", - "80338e84" : "jtbl_80337CB4", - "80338eac" : "jtbl_80337CDC", - "80338ec0" : "jtbl_80337D08", - "80338fbc" : "jtbl_80337E04", - "8033978c" : "jtbl_80338418", - "80339880" : "length_str", - "80339884" : "flags_str", - "8033988c" : "flags_arr", - "80339980" : "D_80338610", - "803399a0" : "jtbl_80338630", - "803399d0" : "NAN", - "803399e0" : "D_80338670", - "80339a40" : "D_803386D0", - "80339ac0" : "rspF3DDataStart", - "8033a2c0" : "rspF3DDataEnd", - "8033a2c0" : "rspAspMainDataStart", - "8033a580" : "rspAspMainDataEnd", - "8033a580" : "_mainSegmentEnd", - "008c0c40" : "_mainSegmentRomEnd", - "8033a580" : "_mainSegmentNoloadStart", - "8033a580" : "D_80339210", - "8033a730" : "gIdleThread", - "8033a8e0" : "gMainThread", - "8033aa90" : "gGameLoopThread", - "8033ac40" : "gSoundThread", - "8033adf0" : "gPIMesgQueue", - "8033ae08" : "gIntrMesgQueue", - "8033ae20" : "gSPTaskMesgQueue", - "8033ae38" : "gDmaMesgBuf", - "8033ae40" : "gPIMesgBuf", - "8033aec0" : "gSIEventMesgBuf", - "8033aec8" : "gIntrMesgBuf", - "8033af08" : "gUnknownMesgBuf", - "8033af48" : "gDmaIoMesg", - "8033af5c" : "D_80339BEC", - "8033af60" : "gDmaMesgQueue", - "8033af78" : "gSIEventMesgQueue", - "8033af90" : "gControllers", - "8033afe8" : "gControllerStatuses", - "8033aff8" : "gControllerPads", - "8033b010" : "gGameVblankQueue", - "8033b028" : "D_80339CB8", - "8033b040" : "D_80339CD0", - "8033b044" : "D_80339CD4", - "8033b048" : "gGameVblankHandler", - "8033b050" : "gPhysicalFrameBuffers", - "8033b05c" : "gPhysicalZBuffer", - "8033b060" : "D_80339CF0", - "8033b064" : "D_80339CF4", - "8033b068" : "gGfxSPTask", - "8033b06c" : "gDisplayListHead", - "8033b070" : "gGfxPoolEnd", - "8033b074" : "gGfxPool", - "8033b078" : "gControllerBits", - "8033b079" : "gEepromProbe", - "8033b080" : "D_80339D10", - "8033b090" : "gDemo", - "8033b0a0" : "filler80339D30", - "8033b170" : "gMarioStates", - "8033b238" : "sCurrPlayMode", - "8033b23a" : "D_80339ECA", - "8033b23c" : "sTransitionTimer", - "8033b240" : "sTransitionUpdate", - "8033b244" : "unused3", - "8033b248" : "sWarpDest", - "8033b250" : "D_80339EE0", - "8033b252" : "sDelayedWarpOp", - "8033b254" : "sDelayedWarpTimer", - "8033b256" : "sSourceWarpNodeId", - "8033b258" : "sDelayedWarpArg", - "8033b25c" : "unused4", - "8033b25e" : "sTimerRunning", - "8033b260" : "gHudDisplay", - "8033b26e" : "gShouldNotPlayCastleMusic", - "8033b270" : "sDelayInvincTimer", - "8033b272" : "sInvulnerable", - "8033b280" : "unused80339F10", - "8033b288" : "filler80339F1C", - "8033b2c0" : "D_80339F50", - "8033b350" : "D_80339FE0", - "8033b3b0" : "gBodyStates", - "8033b494" : "D_8033A124", - "8033b4a0" : "gWarpCheckpoint", - "8033b4a5" : "gMainMenuDataModified", - "8033b4a6" : "gSaveFileModified", - "8033b4b0" : "gPlayerSpawnInfos", - "8033b4d0" : "D_8033A160", - "8033b8d0" : "gAreaData", - "8033bab0" : "gWarpTransition", - "8033bac6" : "gCurrCourseNum", - "8033bac8" : "gCurrActNum", - "8033baca" : "gCurrAreaIndex", - "8033bacc" : "gSavedCourseNum", - "8033bace" : "gPauseScreenMode", - "8033bad0" : "gSaveOptSelectIndex", - "8033bae0" : "gMatStackIndex", - "8033bae8" : "gMatStack", - "8033c2e8" : "gMatStackFixed", - "8033c368" : "gGeoTempState", - "8033c378" : "gCurAnimType", - "8033c379" : "gCurAnimEnabled", - "8033c37a" : "gCurrAnimFrame", - "8033c37c" : "gCurAnimTranslationMultiplier", - "8033c380" : "gCurrAnimAttribute", - "8033c384" : "gCurAnimData", - "8033c388" : "gDisplayListHeap", - "8033c390" : "gProfilerFrameData", - "8033c520" : "gPlayerStatusForCamera", - "8033c568" : "sCameraPosition", - "8033c578" : "sCameraFocus", - "8033c588" : "D_8033B218", - "8033c594" : "sCreditsCameraPitch", - "8033c596" : "sCreditsCameraYaw", - "8033c598" : "gFramesPaused", - "8033c5a0" : "D_8033B230", - "8033c5c0" : "sCameraTransition", - "8033c5e8" : "sGeometryForMario", - "8033c61c" : "unused_8033B2AC", - "8033c61e" : "sCameraYawVelocity", - "8033c620" : "sCameraYawAfterDoorCutscene", - "8033c622" : "unused_spline_pitch", - "8033c624" : "unused_spline_yaw", - "8033c628" : "sSplineParameters", - "8033c668" : "sSplineParameterMax", - "8033c66c" : "sPositionAlongSpline", - "8033c670" : "sSplinePositionLimit", - "8033c674" : "sCameraCutscenePitchOffset", - "8033c676" : "sCameraCutsceneYawOffset", - "8033c678" : "sCameraCutsceneRollOffset", - "8033c67c" : "unused_8033B30C", - "8033c680" : "unused_8033B310", - "8033c684" : "gCameraModeFlags", - "8033c686" : "unused_8033B316", - "8033c688" : "sCameraSideCFlags", - "8033c68a" : "unused_8033B31A", - "8033c68c" : "gCameraFlags1", - "8033c68e" : "gCButtonsPressed", - "8033c690" : "D_8033B320", - "8033c698" : "gCameraStatus", - "8033c758" : "unused_8033B3E8", - "8033c75a" : "sYawFocToMario", - "8033c75c" : "D_8033B3EC", - "8033c75e" : "D_8033B3EE", - "8033c760" : "D_8033B3F0", - "8033c764" : "D_8033B3F4", - "8033c768" : "sCSideButtonYaw", - "8033c76a" : "D_8033B3FA", - "8033c76c" : "D_8033B3FC", - "8033c770" : "sFirstPersonCameraPitch", - "8033c772" : "sFirstPersonCameraYaw", - "8033c774" : "D_8033B404", - "8033c776" : "sPlatformLevelPresetBaseYaw", - "8033c778" : "gPlatformLevelYawOffset", - "8033c77c" : "D_8033B40C", - "8033c780" : "D_8033B410", - "8033c788" : "D_8033B418", - "8033c7d0" : "sFixedPresetBasePositionOffset", - "8033c7dc" : "D_8033B46C", - "8033c7e0" : "D_8033B470", - "8033c7e8" : "D_8033B478", - "8033c808" : "D_8033B498", - "8033c828" : "D_8033B4B8", - "8033c848" : "gCameraMovementFlags", - "8033c84a" : "gCameraFlags2", - "8033c850" : "D_8033B4E0", - "8033c950" : "D_8033B5E0", - "8033ca50" : "sCutsceneSplineSegment", - "8033ca54" : "sCutsceneSplineSegmentProgress", - "8033ca58" : "D_8033B6E8", - "8033ca5a" : "D_8033B6EA", - "8033ca5c" : "gCutsceneTimer", - "8033ca60" : "D_8033B6F0", - "8033cbc8" : "gCutsceneActive", - "8033cbcc" : "sCutscenePhase", - "8033cbd0" : "gCurrLevelCamera", - "8033cbe0" : "gObjectListArray", - "8033d260" : "gDebugInfoFlags", - "8033d264" : "gNumFindFloorMisses", - "8033d268" : "unused_8033BEF8", - "8033d26c" : "gUnknownWallCount", - "8033d270" : "gObjectCounter", - "8033d274" : "gNumCalls", - "8033d280" : "gDebugInfo", - "8033d380" : "gDebugInfoOverwrite", - "8033d480" : "gTimeStopState", - "8033d488" : "gObjectPool", - "80360e88" : "gMacroObjectDefaultParent", - "803610e8" : "gObjectLists", - "803610f0" : "gFreeObjectList", - "80361158" : "gMarioObject", - "8036115c" : "gLuigiObject", - "80361160" : "gCurrentObject", - "80361164" : "gBehCommand", - "80361168" : "gPrevFrameObjectCount", - "8036116c" : "gSurfaceNodesAllocated", - "80361170" : "gSurfacesAllocated", - "80361174" : "gNumStaticSurfaceNodes", - "80361178" : "gNumStaticSurfaces", - "8036117c" : "gObjectMemoryPool", - "80361180" : "gCheckingSurfaceCollisionsForCamera", - "80361182" : "gFindFloorIncludeSurfaceIntangible", - "80361184" : "gEnvironmentRegions", - "80361188" : "gEnvironmentLevels", - "803611d8" : "gDoorAdjacentRooms", - "80361250" : "gMarioCurrentRoom", - "80361252" : "D_8035FEE2", - "80361254" : "D_8035FEE4", - "80361256" : "gTHIWaterDrained", - "80361258" : "gTTCSpeedSetting", - "8036125a" : "gMarioShotFromCannon", - "8036125c" : "gCCMEnteredSlide", - "8036125e" : "gNumRoomedObjectsInMarioRoom", - "80361260" : "gNumRoomedObjectsNotInMarioRoom", - "80361262" : "gWDWWaterLevelChanging", - "80361264" : "gMarioOnMerryGoRound", - "80361270" : "sGrabReleaseState", - "80361280" : "D_8035FF10", - "80361290" : "gDebugPrintState1", - "803612a0" : "gDebugPrintState2", - "803612b0" : "sMarioOnFlyingCarpet", - "803612b2" : "sSurfaceTypeBelowShadow", - "803612b4" : "gShadowAboveWaterOrLava", - "803612b5" : "gMarioOnIceOrCarpet", - "803612c0" : "sSkyBoxInfo", - "803612e0" : "gMovetexLastTextureId", - "803612f0" : "gFlyingCarpetState", - "80361300" : "gPaintingMarioFloorType", - "80361304" : "gPaintingMarioXPos", - "80361308" : "gPaintingMarioYPos", - "8036130c" : "gPaintingMarioZPos", - "80361310" : "D_8035FFA0", - "80361314" : "D_8035FFA4", - "80361318" : "ripplingPainting", - "8036131c" : "dddStatus", - "80361320" : "sTextLabels", - "803613f0" : "gDialogColorFadeTimer", - "803613f2" : "gLastDialogLineNum", - "803613f4" : "gDialogVariable", - "803613f8" : "gDialogTextAlpha", - "803613fa" : "gCutsceneMsgXOffset", - "803613fc" : "gCutsceneMsgYOffset", - "803613fe" : "gRedCoinsCollected", - "80361400" : "gEnvFxBuffer", - "80361408" : "gSnowCylinderLastPos", - "80361414" : "gSnowParticleCount", - "80361416" : "gSnowParticleMaxCount", - "80361420" : "gEnvFxBubbleConfig", - "80361460" : "sNumActiveFirePiranhaPlants", - "80361464" : "sNumKilledFirePiranhaPlants", - "80361468" : "sObjSavedPosX", - "8036146c" : "sObjSavedPosY", - "80361470" : "sObjSavedPosZ", - "80361474" : "sMontyMoleHoleList", - "80361478" : "sMontyMoleKillStreak", - "8036147c" : "sMontyMoleLastKilledPosX", - "80361480" : "sMontyMoleLastKilledPosY", - "80361484" : "sMontyMoleLastKilledPosZ", - "80361488" : "sMasterTreadmill", - "80361490" : "gCurrAiBuffer", - "80361498" : "sSoundRequests", - "80361c98" : "D_80360928", - "80361f98" : "sUsedChannelsForSoundBank", - "80361fa8" : "sCurrentSound", - "80361fb8" : "gSoundBanks", - "80364b78" : "D_80363808", - "80364b82" : "D_80363812", - "80364b88" : "sBackgroundMusicQueue", - "80364ba0" : "D_80363830", - "80364c20" : "D_803638B0", - "80364c60" : "viMgrThread", - "80364e10" : "viMgrStack", - "80365e10" : "__osViMesgQueue", - "80365e28" : "viMgrMesgBuff", - "80365e40" : "viEventViMesg", - "80365e58" : "viEventCounterMesg", - "80365e70" : "piMgrThread", - "80366020" : "piMgrStack", - "80367020" : "__osPiMesgQueue", - "80367038" : "piMgrMesgBuff", - "80367040" : "D_80365CD0", - "80367050" : "D_80365CE0", - "8036708c" : "D_80365D1C", - "80367090" : "D_80365D20", - "80367091" : "_osCont_numControllers", - "80367098" : "D_80365D28", - "803670b8" : "_osContMesgQueue", - "803670d0" : "_osContMesgBuff", - "803670f0" : "D_80365D80", - "80367110" : "_osCurrentTime", - "80367118" : "D_80365DA8", - "8036711c" : "D_80365DAC", - "80367120" : "D_80365DB0", - "80367130" : "osPiMesgBuff", - "80367138" : "gOsPiMessageQueue", - "80367150" : "osSiMesgBuff", - "80367158" : "gOsSiMessageQueue", - "80367170" : "D_80365E00", - "803671ac" : "D_80365E3C", - "803671b0" : "D_80365E40", - "803672b0" : "gInterruptedThread", - "80367460" : "_mainSegmentNoloadEnd", - "0000cee0" : "_mainSegmentNoloadSizeLo", - "00000002" : "_mainSegmentNoloadSizeHi", - "00000001" : "ASSERT", - "80378800" : "_engineSegmentStart", - "007cc6c0" : "_engineSegmentRomStart", - "80378800" : "vec3f_copy", - "80378840" : "vec3f_set", - "8037888c" : "vec3f_add", - "803788e4" : "vec3f_sum", - "8037893c" : "vec3s_copy", - "8037897c" : "vec3s_set", - "803789c8" : "vec3s_add", - "80378a20" : "vec3s_sum", - "80378a78" : "vec3s_sub", - "80378ad0" : "vec3s_to_vec3f", - "80378b34" : "vec3f_to_vec3s", - "80378c50" : "find_vector_perpendicular_to_plane", - "80378d38" : "vec3f_cross", - "80378dc0" : "vec3f_normalize", - "80378e68" : "mtxf_copy", - "80378eb4" : "mtxf_identity", - "80378f24" : "mtxf_translate", - "80378f84" : "mtxf_lookat", - "80379440" : "mtxf_rotate_zxy_and_translate", - "803795f0" : "mtxf_rotate_xyz_and_translate", - "80379798" : "mtxf_billboard", - "80379918" : "mtxf_align_terrain_normal", - "80379aa4" : "mtxf_align_terrain_triangle", - "80379f60" : "mtxf_mul", - "8037a29c" : "mtxf_scale_vec3f", - "8037a348" : "mtxf_mul_vec3s", - "8037a434" : "mtxf_to_mtx", - "8037a4b8" : "mtxf_rotate_xy", - "8037a550" : "get_pos_from_transform_mtx", - "8037a69c" : "vec3f_get_dist_and_angle", - "8037a788" : "vec3f_set_dist_and_angle", - "8037a860" : "approach_s32", - "8037a8b4" : "approach_f32", - "8037a9a8" : "atan2s", - "8037ab88" : "atan2f", - "8037abec" : "spline_get_weights", - "8037afb8" : "anim_spline_init", - "8037afe8" : "anim_spline_poll", - "8037b220" : "init_scene_graph_node_links", - "8037b24c" : "init_graph_node_root", - "8037b30c" : "init_graph_node_ortho_projection", - "8037b380" : "init_graph_node_perspective", - "8037b448" : "init_graph_node_start", - "8037b4ac" : "init_graph_node_master_list", - "8037b530" : "init_graph_node_render_range", - "8037b5b4" : "init_graph_node_switch_case", - "8037b670" : "init_graph_node_camera", - "8037b744" : "init_graph_node_translation_rotation", - "8037b7f8" : "init_graph_node_translation", - "8037b89c" : "init_graph_node_rotation", - "8037b940" : "init_graph_node_scale", - "8037b9e0" : "init_graph_node_object", - "8037bad4" : "init_graph_node_culling_radius", - "8037bb48" : "init_graph_node_animated_part", - "8037bbec" : "init_graph_node_billboard", - "8037bc90" : "init_graph_node_display_list", - "8037bd24" : "init_graph_node_shadow", - "8037bdb4" : "init_graph_node_object_parent", - "8037be28" : "init_graph_node_generated", - "8037becc" : "init_graph_node_background", - "8037bf84" : "init_graph_node_held_object", - "8037c044" : "geo_add_child", - "8037c0bc" : "geo_remove_child", - "8037c138" : "geo_make_first_child", - "8037c1e4" : "geo_call_global_function_nodes_helper", - "8037c360" : "geo_call_global_function_nodes", - "8037c3d0" : "geo_reset_object_node", - "8037c448" : "geo_obj_init", - "8037c51c" : "geo_obj_init_spawninfo", - "8037c658" : "geo_obj_init_animation", - "8037c708" : "geo_obj_init_animation_accel", - "8037c7d8" : "retrieve_animation_index", - "8037c844" : "geo_update_animation_frame", - "8037c9e8" : "geo_retreive_animation_translation", - "8037cb10" : "geo_find_root", - "8037cb60" : "read_vec3s_to_vec3f", - "8037cbc0" : "read_vec3s", - "8037cbfc" : "read_vec3s_angle", - "8037cc74" : "register_scene_graph_node", - "8037cd60" : "geo_layout_cmd_branch_and_link", - "8037ce24" : "geo_layout_cmd_end", - "8037cee8" : "geo_layout_cmd_branch", - "8037cf70" : "geo_layout_cmd_return", - "8037cfc0" : "geo_layout_cmd_open_node", - "8037d018" : "geo_layout_cmd_close_node", - "8037d050" : "geo_layout_cmd_assign_as_view", - "8037d0d0" : "geo_layout_cmd_update_node_flags", - "8037d1d0" : "geo_layout_cmd_node_root", - "8037d328" : "geo_layout_cmd_node_ortho_projection", - "8037d3a4" : "geo_layout_cmd_node_perspective", - "8037d48c" : "geo_layout_cmd_node_start", - "8037d4dc" : "geo_layout_cmd_nop3", - "8037d500" : "geo_layout_cmd_node_master_list", - "8037d55c" : "geo_layout_cmd_node_level_of_detail", - "8037d5d4" : "geo_layout_cmd_node_switch_case", - "8037d640" : "geo_layout_cmd_node_camera", - "8037d6f0" : "geo_layout_cmd_node_translation_rotation", - "8037d8d4" : "geo_layout_cmd_node_translation", - "8037d998" : "geo_layout_cmd_node_rotation", - "8037da5c" : "geo_layout_cmd_node_scale", - "8037db50" : "geo_layout_cmd_nop2", - "8037db74" : "geo_layout_cmd_node_animated_part", - "8037dc10" : "geo_layout_cmd_node_billboard", - "8037dcd4" : "geo_layout_cmd_node_display_list", - "8037dd4c" : "geo_layout_cmd_node_shadow", - "8037dddc" : "geo_layout_cmd_node_object_parent", - "8037de34" : "geo_layout_cmd_node_generated", - "8037de94" : "geo_layout_cmd_node_background", - "8037def8" : "geo_layout_cmd_nop", - "8037df1c" : "geo_layout_cmd_copy_view", - "8037dfd4" : "geo_layout_cmd_node_held_obj", - "8037e058" : "geo_layout_cmd_node_culling_radius", - "8037e0b4" : "process_geo_layout", - "803805c8" : "level_script_execute", - "80380de8" : "f32_find_wall_collision", - "80380e8c" : "find_wall_collisions", - "80381264" : "find_ceil", - "803814b8" : "find_floor_height_and_data", - "80381794" : "find_floor_height", - "80381900" : "find_floor", - "80381ba0" : "find_water_level", - "80381d3c" : "find_poison_gas_level", - "80381f08" : "debug_surface_list_info", - "80383340" : "alloc_surface_pools", - "803833b8" : "load_area_terrain", - "803835a4" : "clear_dynamic_surfaces", - "803839cc" : "load_object_collision_model", - "80383bb0" : "RandomU16", - "80383cb4" : "RandomFloat", - "80383d1c" : "RandomSign", - "80383d68" : "func_80383D68", - "80385bf0" : "stub_80385BF0", - "80385c00" : "cur_object_exec_behavior", - "80385f90" : "identityMtx", - "80385fb0" : "zeroMtx", - "80385fd0" : "gVec3fZero", - "80385fdc" : "gVec3sZero", - "80385fe4" : "gVec3fOne", - "80385ff0" : "gVec3sOne", - "80386000" : "gSineTable", - "80387000" : "gCosineTable", - "8038b000" : "gArctanTable", - "8038b810" : "GeoLayoutJumpTable", - "8038b894" : "unused_8038B894", - "8038bc90" : "_engineSegmentEnd", - "007dfb50" : "_engineSegmentRomEnd", - "8038bc90" : "_engineSegmentNoloadStart", - "8038bc90" : "gSplineKeyframe", - "8038bc94" : "gSplineKeyframeFraction", - "8038bc98" : "gSplineState", - "8038bca0" : "gGraphNodePool", - "8038bca4" : "gCurRootGraphNode", - "8038bca8" : "D_8038BCA8", - "8038bcac" : "gGeoViews", - "8038bcb0" : "gGeoNumViews", - "8038bcb8" : "gGeoLayoutStack", - "8038bcf8" : "gCurGraphNodeList", - "8038bd78" : "gCurGraphNodeIndex", - "8038bd7a" : "gGeoLayoutStackIndex", - "8038bd7c" : "D_8038BD7C", - "8038bd7e" : "gGeoLayoutReturnIndex", - "8038bd80" : "gGeoLayoutCommand", - "8038bd88" : "gObjParentGraphNode", - "8038be30" : "sFloorGeo", - "8038be90" : "unused8038BE90", - "8038be98" : "gStaticSurfacePartition", - "8038d698" : "gDynamicSurfacePartition", - "8038ee98" : "sSurfaceNodePool", - "8038ee9c" : "sSurfacePool", - "8038eea0" : "sSurfacePoolSize", - "8038eea8" : "unused8038EEA8", - "8038eef0" : "_engineSegmentNoloadEnd", - "00000001" : "ASSERT", - "8038f800" : ".", - "8038f800" : "_framebuffersSegmentNoloadStart", - "8038f800" : "0x70800", - "8038f800" : "gFrameBuffer0", - "803b5000" : "gFrameBuffer1", - "803da800" : "gFrameBuffer2", - "80400000" : "_framebuffersSegmentNoloadEnd", - "80400000" : "__expansionRamStart", - "00000001" : "ASSERT", - "10000000" : "_entrySegmentStart", - "007cc6c0" : "_entrySegmentRomStart", - "10000000" : "level_script_entry", - "10000030" : "_entrySegmentEnd", - "007cc6f0" : "_entrySegmentRomEnd", - "02000000" : "_segment2_mio0SegmentStart", - "007cc6c0" : "_segment2_mio0SegmentRomStart", - "0200bd10" : ".", - "0200bd10" : "_segment2_mio0SegmentEnd", - "007d83d0" : "_segment2_mio0SegmentRomEnd", - "04000000" : "_group0_mio0SegmentStart", - "007cc6c0" : "_group0_mio0SegmentRomStart", - "04013260" : ".", - "04013260" : "_group0_mio0SegmentEnd", - "007df920" : "_group0_mio0SegmentRomEnd", - "17000000" : "_group0_geoSegmentStart", - "007cc6c0" : "_group0_geoSegmentRomStart", - "17000000" : "bubble_geo", - "1700001c" : "purple_marble_geo", - "17000038" : "smoke_geo", - "17000084" : "burn_smoke_geo", - "1700009c" : "spot_on_ground_geo", - "170000e0" : "mario_TODO_geo_0000E0", - "17000124" : "water_waves_surface_geo", - "17000168" : "water_waves_geo", - "170001bc" : "sparkles_geo", - "17000230" : "water_splash_geo", - "17000284" : "sparkles_animation_geo", - "170002e0" : "mario_geo_face_and_wings", - "1700041c" : "mario_geo_left_hand", - "17000494" : "mario_geo_right_hand", - "1700053c" : "mario_geo_body", - "170006f8" : "mario_geo_medium_poly_left_hand", - "17000770" : "mario_geo_medium_poly_right_hand", - "17000818" : "mario_geo_medium_poly_body", - "170009d4" : "mario_geo_low_poly_face_and_wings", - "17000b10" : "mario_geo_low_poly_left_hand", - "17000b88" : "mario_geo_low_poly_right_hand", - "17000c30" : "mario_geo_low_poly_body", - "17000dec" : "mario_vanish_geo_face_and_wings", - "17000f28" : "mario_vanish_geo_left_hand", - "17000fa0" : "mario_vanish_geo_right_hand", - "17001048" : "mario_vanish_geo_body", - "17001204" : "mario_vanish_geo_medium_poly_left_hand", - "1700127c" : "mario_vanish_geo_medium_poly_right_hand", - "17001324" : "mario_vanish_geo_medium_poly_body", - "170014e0" : "mario_vanish_geo_low_poly_face_and_wings", - "1700161c" : "mario_vanish_geo_low_poly_left_hand", - "17001694" : "mario_vanish_geo_low_poly_right_hand", - "1700173c" : "mario_vanish_geo_low_poly_body", - "170018f8" : "mario_metal_geo_face_and_wings", - "170019a4" : "mario_metal_geo_left_hand", - "17001a1c" : "mario_metal_geo_right_hand", - "17001ac4" : "mario_metal_geo_body", - "17001c80" : "mario_metal_geo_medium_poly_left_hand", - "17001cf8" : "mario_metal_geo_medium_poly_right_hand", - "17001da0" : "mario_metal_geo_medium_poly_body", - "17001f5c" : "mario_metal_geo_low_poly_face_and_wings", - "17002008" : "mario_metal_geo_low_poly_left_hand", - "17002080" : "mario_metal_geo_low_poly_right_hand", - "17002128" : "mario_metal_geo_low_poly_body", - "170022e4" : "mario_metal_vanish_geo_face_and_wings", - "17002390" : "mario_metal_vanish_geo_left_hand", - "17002408" : "mario_metal_vanish_geo_right_hand", - "170024b0" : "mario_metal_vanish_geo_body", - "1700266c" : "mario_metal_vanish_geo_medium_poly_left_hand", - "170026e4" : "mario_metal_vanish_geo_medium_poly_right_hand", - "1700278c" : "mario_metal_vanish_geo_medium_poly_body", - "17002958" : "mario_metal_vanish_geo_low_poly_face_and_wings", - "17002a04" : "mario_metal_vanish_geo_low_poly_left_hand", - "17002a7c" : "mario_metal_vanish_geo_low_poly_right_hand", - "17002b24" : "mario_metal_vanish_geo_low_poly_body", - "17002ce0" : "mario_geo_load_body", - "17002d14" : "mario_geo_load_medium_poly_body", - "17002d48" : "mario_geo_load_low_poly_body", - "17002d7c" : "mario_geo_render_body", - "17002dd4" : "mario_geo", - "17002e30" : "_group0_geoSegmentEnd", - "007cf4f0" : "_group0_geoSegmentRomEnd", - "05000000" : "_group1_mio0SegmentStart", - "007cc6c0" : "_group1_mio0SegmentRomStart", - "05008070" : ".", - "05008070" : "_group1_mio0SegmentEnd", - "007d4730" : "_group1_mio0SegmentRomEnd", - "0c000000" : "_group1_geoSegmentStart", - "007cc6c0" : "_group1_geoSegmentRomStart", - "0c000000" : "yellow_sphere_geo", - "0c000018" : "hoot_geo", - "0c0001e4" : "yoshi_egg_geo", - "0c000248" : "thwomp_geo", - "0c000264" : "bullet_bill_geo", - "0c00028c" : "heave_ho_geo", - "0c000410" : "_group1_geoSegmentEnd", - "007ccad0" : "_group1_geoSegmentRomEnd", - "05000000" : "_group2_mio0SegmentStart", - "007cc6c0" : "_group2_mio0SegmentRomStart", - "05001e10" : ".", - "05001e10" : "_group2_mio0SegmentEnd", - "007ce4d0" : "_group2_mio0SegmentRomEnd", - "0c000000" : "_group2_geoSegmentStart", - "007cc6c0" : "_group2_geoSegmentRomStart", - "0c000000" : "bully_geo", - "0c000120" : "bully_boss_geo", - "0c000240" : "blargg_geo", - "0c0002b0" : "_group2_geoSegmentEnd", - "007cc970" : "_group2_geoSegmentRomEnd", - "05000000" : "_group3_mio0SegmentStart", - "007cc6c0" : "_group3_mio0SegmentRomStart", - "050068b0" : ".", - "050068b0" : "_group3_mio0SegmentEnd", - "007d2f70" : "_group3_mio0SegmentRomEnd", - "0c000000" : "_group3_geoSegmentStart", - "007cc6c0" : "_group3_geoSegmentRomStart", - "0c000000" : "king_bobomb_geo", - "0c000308" : "water_bomb_geo", - "0c000328" : "water_bomb_shadow_geo", - "0c000340" : "_group3_geoSegmentEnd", - "007cca00" : "_group3_geoSegmentRomEnd", - "05000000" : "_group4_mio0SegmentStart", - "007cc6c0" : "_group4_mio0SegmentRomStart", - "0500a300" : ".", - "0500a300" : "_group4_mio0SegmentEnd", - "007d69c0" : "_group4_mio0SegmentRomEnd", - "0c000000" : "_group4_geoSegmentStart", - "007cc6c0" : "_group4_geoSegmentRomStart", - "0c000000" : "clam_shell_geo", - "0c000068" : "sushi_geo", - "0c00010c" : "unagi_geo", - "0c000280" : "_group4_geoSegmentEnd", - "007cc940" : "_group4_geoSegmentRomEnd", - "05000000" : "_group5_mio0SegmentStart", - "007cc6c0" : "_group5_mio0SegmentRomStart", - "0500bce0" : ".", - "0500bce0" : "_group5_mio0SegmentEnd", - "007d83a0" : "_group5_mio0SegmentRomEnd", - "0c000000" : "_group5_geoSegmentStart", - "007cc6c0" : "_group5_geoSegmentRomStart", - "0c000000" : "klepto_geo", - "0c0002ac" : "eyerok_geo_0002AC", - "0c0005a8" : "eyerok_left_hand_geo", - "0c0005e4" : "eyerok_right_hand_geo", - "0c000610" : "pokey_head_geo", - "0c000644" : "pokey_body_part_geo", - "0c000660" : "_group5_geoSegmentEnd", - "007ccd20" : "_group5_geoSegmentRomEnd", - "05000000" : "_group6_mio0SegmentStart", - "007cc6c0" : "_group6_mio0SegmentRomStart", - "0500e110" : ".", - "0500e110" : "_group6_mio0SegmentEnd", - "007da7d0" : "_group6_mio0SegmentRomEnd", - "0c000000" : "_group6_geoSegmentStart", - "007cc6c0" : "_group6_geoSegmentRomStart", - "0c000000" : "monty_mole_geo", - "0c000110" : "ukiki_geo", - "0c00036c" : "fwoosh_geo", - "0c000390" : "_group6_geoSegmentEnd", - "007cca50" : "_group6_geoSegmentRomEnd", - "05000000" : "_group7_mio0SegmentStart", - "007cc6c0" : "_group7_mio0SegmentRomStart", - "05005070" : ".", - "05005070" : "_group7_mio0SegmentEnd", - "007d1730" : "_group7_mio0SegmentRomEnd", - "0c000000" : "_group7_geoSegmentStart", - "007cc6c0" : "_group7_geoSegmentRomStart", - "0c000000" : "spindrift_geo", - "0c000104" : "penguin_geo", - "0c00021c" : "mr_blizzard_hidden_geo", - "0c000348" : "mr_blizzard_geo", - "0c000370" : "_group7_geoSegmentEnd", - "007cca30" : "_group7_geoSegmentRomEnd", - "05000000" : "_group8_mio0SegmentStart", - "007cc6c0" : "_group8_mio0SegmentRomStart", - "05001180" : ".", - "05001180" : "_group8_mio0SegmentEnd", - "007cd840" : "_group8_mio0SegmentRomEnd", - "0c000000" : "_group8_geoSegmentStart", - "007cc6c0" : "_group8_geoSegmentRomStart", - "0c000000" : "springboard_top_geo", - "0c000018" : "springboard_spring_geo", - "0c000030" : "springboard_bottom_geo", - "0c000048" : "cap_switch_geo", - "0c000090" : "_group8_geoSegmentEnd", - "007cc750" : "_group8_geoSegmentRomEnd", - "05000000" : "_group9_mio0SegmentStart", - "007cc6c0" : "_group9_mio0SegmentRomStart", - "05006960" : ".", - "05006960" : "_group9_mio0SegmentEnd", - "007d3020" : "_group9_mio0SegmentRomEnd", - "0c000000" : "_group9_geoSegmentStart", - "007cc6c0" : "_group9_geoSegmentRomStart", - "0c000000" : "bookend_part_geo", - "0c0000c0" : "bookend_geo", - "0c0000d8" : "haunted_chair_geo", - "0c000188" : "small_key_geo", - "0c0001b4" : "mad_piano_geo", - "0c000224" : "boo_geo", - "0c000274" : "haunted_cage_geo", - "0c0002b0" : "_group9_geoSegmentEnd", - "007cc970" : "_group9_geoSegmentRomEnd", - "05000000" : "_group10_mio0SegmentStart", - "007cc6c0" : "_group10_mio0SegmentRomStart", - "05012cd0" : ".", - "05012cd0" : "_group10_mio0SegmentEnd", - "007df390" : "_group10_mio0SegmentRomEnd", - "0c000000" : "_group10_geoSegmentStart", - "007cc6c0" : "_group10_geoSegmentRomStart", - "0c000000" : "birds_geo", - "0c000098" : "peach_geo_000098", - "0c000254" : "peach_geo_000254", - "0c000410" : "peach_geo", - "0c000468" : "yoshi_geo", - "0c000670" : "_group10_geoSegmentEnd", - "007ccd30" : "_group10_geoSegmentRomEnd", - "05000000" : "_group11_mio0SegmentStart", - "007cc6c0" : "_group11_mio0SegmentRomStart", - "050073f0" : ".", - "050073f0" : "_group11_mio0SegmentEnd", - "007d3ab0" : "_group11_mio0SegmentRomEnd", - "0c000000" : "_group11_geoSegmentStart", - "007cc6c0" : "_group11_geoSegmentRomStart", - "0c000000" : "bubba_geo", - "0c000030" : "wiggler_head_geo", - "0c0001bc" : "enemy_lakitu_geo", - "0c000290" : "spiny_ball_geo", - "0c000328" : "spiny_geo", - "0c0004a0" : "_group11_geoSegmentEnd", - "007ccb60" : "_group11_geoSegmentRomEnd", - "06000000" : "_group12_mio0SegmentStart", - "007cc6c0" : "_group12_mio0SegmentRomStart", - "06030c30" : ".", - "06030c30" : "_group12_mio0SegmentEnd", - "007fd2f0" : "_group12_mio0SegmentRomEnd", - "0d000000" : "_group12_geoSegmentStart", - "007cc6c0" : "_group12_geoSegmentRomStart", - "0d000000" : "bowser_flames_geo", - "0d000090" : "invisible_bowser_accessory_geo", - "0d0000b0" : "bowser_1_yellow_sphere_geo", - "0d0000d8" : "bowser_geo_0000D8", - "0d000424" : "bowser_geo_000424", - "0d000770" : "bowser_geo_000770", - "0d000ab8" : "bowser_shadow_geo", - "0d000ac4" : "bowser_geo", - "0d000b40" : "bowser2_geo", - "0d000bbc" : "bowser_bomb_geo", - "0d000bfc" : "bowser_impact_smoke_geo", - "0d000c50" : "_group12_geoSegmentEnd", - "007cd310" : "_group12_geoSegmentRomEnd", - "06000000" : "_group13_mio0SegmentStart", - "007cc6c0" : "_group13_mio0SegmentRomStart", - "0600a0f0" : ".", - "0600a0f0" : "_group13_mio0SegmentEnd", - "007d67b0" : "_group13_mio0SegmentRomEnd", - "0d000000" : "_group13_geoSegmentStart", - "007cc6c0" : "_group13_geoSegmentRomStart", - "0d000000" : "skeeter_geo", - "0d000284" : "seaweed_geo", - "0d0002f4" : "water_mine_geo", - "0d000324" : "cyan_fish_geo", - "0d00038c" : "bub_geo", - "0d000414" : "water_ring_geo", - "0d000450" : "treasure_chest_base_geo", - "0d000468" : "treasure_chest_lid_geo", - "0d000480" : "_group13_geoSegmentEnd", - "007ccb40" : "_group13_geoSegmentRomEnd", - "06000000" : "_group14_mio0SegmentStart", - "007cc6c0" : "_group14_mio0SegmentRomStart", - "06013a60" : ".", - "06013a60" : "_group14_mio0SegmentEnd", - "007e0120" : "_group14_mio0SegmentRomEnd", - "0d000000" : "_group14_geoSegmentStart", - "007cc6c0" : "_group14_geoSegmentRomStart", - "0d000000" : "koopa_flag_geo", - "0d0000b8" : "wooden_post_geo", - "0d0000d0" : "koopa_without_shell_geo", - "0d000214" : "koopa_with_shell_geo", - "0d000358" : "piranha_plant_geo", - "0d000480" : "whomp_geo", - "0d0005d0" : "metallic_ball_geo", - "0d0005ec" : "chain_chomp_geo", - "0d000680" : "_group14_geoSegmentEnd", - "007ccd40" : "_group14_geoSegmentRomEnd", - "06000000" : "_group15_mio0SegmentStart", - "007cc6c0" : "_group15_mio0SegmentRomStart", - "0600c8e0" : ".", - "0600c8e0" : "_group15_mio0SegmentEnd", - "007d8fa0" : "_group15_mio0SegmentRomEnd", - "0d000000" : "_group15_geoSegmentStart", - "007cc6c0" : "_group15_geoSegmentRomStart", - "0d000000" : "lakitu_geo", - "0d000114" : "toad_geo_000114", - "0d00027c" : "toad_geo_00027C", - "0d0003e4" : "toad_geo", - "0d000448" : "mips_geo", - "0d0005b0" : "boo_castle_geo", - "0d000600" : "_group15_geoSegmentEnd", - "007cccc0" : "_group15_geoSegmentRomEnd", - "06000000" : "_group16_mio0SegmentStart", - "007cc6c0" : "_group16_mio0SegmentRomStart", - "06002ba0" : ".", - "06002ba0" : "_group16_mio0SegmentEnd", - "007cf260" : "_group16_mio0SegmentRomEnd", - "0d000000" : "_group16_geoSegmentStart", - "007cc6c0" : "_group16_geoSegmentRomStart", - "0d000000" : "moneybag_geo_000000", - "0d000078" : "moneybag_geo_000078", - "0d0000f0" : "moneybag_geo", - "0d000150" : "_group16_geoSegmentEnd", - "007cc810" : "_group16_geoSegmentRomEnd", - "06000000" : "_group17_mio0SegmentStart", - "007cc6c0" : "_group17_mio0SegmentRomStart", - "06009c50" : ".", - "06009c50" : "_group17_mio0SegmentEnd", - "007d6310" : "_group17_mio0SegmentRomEnd", - "0d000000" : "_group17_geoSegmentStart", - "007cc6c0" : "_group17_geoSegmentRomStart", - "0d000000" : "mr_i_geo", - "0d00001c" : "mr_i_iris_geo", - "0d0000dc" : "swoop_geo", - "0d0001a0" : "snufit_geo", - "0d000230" : "dorrie_geo", - "0d000394" : "scuttlebug_geo", - "0d0006d0" : "_group17_geoSegmentEnd", - "007ccd90" : "_group17_geoSegmentRomEnd", - "08000000" : "_common0_mio0SegmentStart", - "007cc6c0" : "_common0_mio0SegmentRomStart", - "0800e6d0" : ".", - "0800e6d0" : "_common0_mio0SegmentEnd", - "007dad90" : "_common0_mio0SegmentRomEnd", - "0f000000" : "_common0_geoSegmentStart", - "007cc6c0" : "_common0_geoSegmentRomStart", - "0f000000" : "blue_coin_switch_geo", - "0f000020" : "test_platform_geo", - "0f000028" : "amp_geo", - "0f0001a8" : "cannon_base_geo", - "0f0001c0" : "cannon_barrel_geo", - "0f0001d8" : "chuckya_geo", - "0f0004cc" : "purple_switch_geo", - "0f0004e4" : "checkerboard_platform_geo", - "0f0004fc" : "heart_geo", - "0f000518" : "flyguy_geo", - "0f0005d0" : "breakable_box_geo", - "0f000610" : "breakable_box_small_geo", - "0f000640" : "bowling_ball_geo", - "0f00066c" : "bowling_ball_track_geo", - "0f000694" : "exclamation_box_geo", - "0f0006e4" : "goomba_geo", - "0f0007b8" : "black_bobomb_geo", - "0f0008f4" : "bobomb_buddy_geo", - "0f000a30" : "metal_box_geo", - "0f000a58" : "exclamation_box_outline_geo", - "0f000ab0" : "koopa_shell_geo", - "0f000adc" : "koopa_shell2_geo", - "0f000b08" : "koopa_shell3_geo", - "0f000b40" : "_common0_geoSegmentEnd", - "007cd200" : "_common0_geoSegmentRomEnd", - "03000000" : "_common1_mio0SegmentStart", - "007cc6c0" : "_common1_mio0SegmentRomStart", - "03017990" : ".", - "03017990" : "_common1_mio0SegmentEnd", - "007e4050" : "_common1_mio0SegmentRomEnd", - "16000000" : "_common1_geoSegmentStart", - "007cc6c0" : "_common1_geoSegmentRomStart", - "16000000" : "mist_geo", - "16000020" : "white_puff_geo", - "16000040" : "explosion_geo", - "160000a8" : "butterfly_geo", - "1600013c" : "yellow_coin_geo", - "160001a0" : "yellow_coin_no_shadow_geo", - "16000200" : "blue_coin_geo", - "16000264" : "blue_coin_no_shadow_geo", - "160002c4" : "red_coin_geo", - "16000328" : "red_coin_no_shadow_geo", - "16000388" : "warp_pipe_geo", - "160003a8" : "castle_door_geo", - "1600043c" : "cabin_door_geo", - "160004d0" : "wooden_door_geo", - "16000564" : "wooden_door2_geo", - "160005f8" : "metal_door_geo", - "1600068c" : "hazy_maze_door_geo", - "16000720" : "haunted_door_geo", - "160007b4" : "castle_door_0_star_geo", - "16000868" : "castle_door_1_star_geo", - "1600091c" : "castle_door_3_stars_geo", - "160009d0" : "key_door_geo", - "16000a84" : "bowser_key_geo", - "16000ab0" : "bowser_key_cutscene_geo", - "16000b10" : "red_flame_shadow_geo", - "16000b2c" : "red_flame_geo", - "16000b8c" : "blue_flame_geo", - "16000bec" : "fish_shadow_geo", - "16000c44" : "fish_geo", - "16000c8c" : "leaves_geo", - "16000ca4" : "marios_cap_geo", - "16000cf0" : "marios_metal_cap_geo", - "16000d3c" : "marios_wing_cap_geo", - "16000da8" : "marios_winged_metal_cap_geo", - "16000e14" : "number_geo", - "16000e84" : "mushroom_1up_geo", - "16000ea0" : "star_geo", - "16000ed4" : "dirt_animation_geo", - "16000f24" : "cartoon_star_geo", - "16000f6c" : "transparent_star_geo", - "16000f98" : "white_particle_geo", - "16000fb4" : "wooden_signpost_geo", - "16000fe8" : "bubbly_tree_geo", - "16001000" : "spiky_tree_geo", - "16001018" : "snow_tree_geo", - "16001030" : "spiky_tree1_geo", - "16001048" : "palm_tree_geo", - "16001060" : "_common1_geoSegmentEnd", - "007cd720" : "_common1_geoSegmentRomEnd", - "13000000" : "_behaviorSegmentStart", - "007cc6c0" : "_behaviorSegmentRomStart", - "13000000" : "bhvStarDoor", - "13000054" : "bhvMrI", - "1300008c" : "bhvMrIBody", - "130000ac" : "bhvMrIParticle", - "130000f8" : "bhvPurpleParticle", - "13000118" : "bhvGiantPole", - "13000144" : "bhvPoleGrabbing", - "13000174" : "bhvThiHugeIslandTop", - "13000194" : "bhvThiTinyIslandTop", - "130001ac" : "bhvCapSwitchBase", - "130001cc" : "bhvCapSwitch", - "130001f4" : "bhvKingBobomb", - "13000254" : "bhvBobombAnchorMario", - "13000278" : "bhvBetaChestBottom", - "1300029c" : "bhvBetaChestLid", - "130002b8" : "bhvBubbleMario", - "130002e4" : "bhvBubbleMaybe", - "13000338" : "bhvSmallWaterWave", - "13000398" : "bhvSmallWaterWave398", - "130003bc" : "bhvWaterAirBubble", - "13000400" : "bhvSmallParticle", - "13000428" : "bhvWaterWaves", - "13000444" : "bhvSmallParticleSnow", - "1300046c" : "bhvSmallParticleBubbles", - "13000494" : "bhvFishGroup", - "130004a8" : "bhvCannon", - "130004e4" : "bhvCannonBarrel", - "13000500" : "bhvCannonBaseUnused", - "13000528" : "bhvChuckya", - "13000584" : "bhvChuckyaAnchorMario", - "130005a8" : "bhvUnused05A8", - "130005b4" : "bhvRotatingPlatform", - "130005d8" : "bhvTower", - "13000600" : "bhvBulletBillCannon", - "13000624" : "bhvWfBreakableWallRight", - "13000638" : "bhvWfBreakableWallLeft", - "1300066c" : "bhvKickableBoard", - "130006a4" : "bhvTowerDoor", - "130006d8" : "bhvRotatingCounterClockwise", - "130006e0" : "bhvWfRotatingWoodenPlatform", - "13000708" : "bhvKoopaShellUnderwater", - "13000720" : "bhvExitPodiumWarp", - "1300075c" : "bhvFadingWarp", - "13000780" : "bhvWarp", - "130007a0" : "bhvWarpPipe", - "130007dc" : "bhvWhitePuffExplosion", - "130007f8" : "bhvSpawnedStar", - "1300080c" : "bhvUnused080C", - "13000830" : "bhvMrIBlueCoin", - "13000888" : "bhvCoinInsideBoo", - "130008d0" : "bhvCoinFormationSpawn", - "130008ec" : "bhvCoinFormation", - "1300090c" : "bhvOneCoin", - "1300091c" : "bhvYellowCoin", - "13000940" : "bhvTemporaryYellowCoin", - "13000964" : "bhvThreeCoinsSpawn", - "13000984" : "bhvTenCoinsSpawn", - "130009a4" : "bhvSingleCoinGetsSpawned", - "130009e0" : "bhvCoinSparkles", - "13000a14" : "bhvGoldenCoinSparkles", - "13000a34" : "bhvWallTinyStarParticle", - "13000a54" : "bhvWallTinyStarParticleSpawn", - "13000a78" : "bhvPoundTinyStarParticle", - "13000a98" : "bhvPoundTinyStarParticleSpawn", - "13000abc" : "bhvPunchTinyTriangle", - "13000ad8" : "bhvPunchTinyTriangleSpawn", - "13000afc" : "bhvDoorWarp", - "13000b0c" : "bhvDoor", - "13000b58" : "bhvGrindel", - "13000b8c" : "bhvThwomp2", - "13000bc8" : "bhvThwomp", - "13000c04" : "bhvTumblingBridgePlatform", - "13000c28" : "bhvWfTumblingBridge", - "13000c44" : "bhvBbhTumblingBridge", - "13000c64" : "bhvLllTumblingBridge", - "13000c84" : "bhvFlame", - "13000cc8" : "bhvAnotherElavator", - "13000cfc" : "bhvRrElevatorPlatform", - "13000d30" : "bhvHmcElevatorPlatform", - "13000d6c" : "bhvWaterMist", - "13000d98" : "bhvWaterMistSpawn", - "13000db4" : "bhvBreakBoxTriangle", - "13000dd8" : "bhvWaterMist2", - "13000dfc" : "bhvUnused0DFC", - "13000e24" : "bhvPoundWhitePuffs", - "13000e3c" : "bhvGroundSand", - "13000e58" : "bhvGroundSnow", - "13000e70" : "bhvWind", - "13000e88" : "bhvEndToad", - "13000eac" : "bhvEndPeach", - "13000ed0" : "bhvUnusedParticleSpawn", - "13000f08" : "bhvUkiki", - "13000f14" : "bhvUkikiCageChild", - "13000f2c" : "bhvUkikiCageStar", - "13000f48" : "bhvUkikiCage", - "13000f9c" : "bhvBitfsSinkingPlatforms", - "13000fc8" : "bhvBitfsSinkingCagePlatform", - "13001000" : "bhvDddMovingPole", - "13001030" : "bhvBitfsTiltingInvertedPyramid", - "13001064" : "bhvSquishablePlatform", - "13001098" : "bhvCutOutObject", - "130010a8" : "bhvBetaMovingFlamesSpawn", - "130010b8" : "bhvBetaMovingFlames", - "130010d8" : "bhvRrRotatingBridgePlatform", - "13001108" : "bhvFlamethrower", - "13001124" : "bhvFlamethrowerFlame", - "13001168" : "bhvBouncingFireball", - "13001184" : "bhvBouncingFireballFlame", - "130011d0" : "bhvBowserShockWave", - "130011ec" : "bhvFlameMario", - "13001214" : "bhvBlackSmokeMario", - "13001254" : "bhvBlackSmokeBowser", - "1300127c" : "bhvBlackSmokeUpward", - "13001298" : "bhvBetaFishSplashSpawner", - "130012b4" : "bhvSpindrift", - "130012f4" : "bhvTowerPlatformGroup", - "13001318" : "bhvWfSlidingTowerPlatform", - "13001340" : "bhvWfElevatorTowerPlatform", - "13001368" : "bhvWfSolidTowerPlatform", - "13001390" : "bhvSnowLeafParticleSpawn", - "130013a8" : "bhvTreeSnow", - "130013c4" : "bhvTreeLeaf", - "130013dc" : "bhvAnotherTiltingPlatform", - "13001408" : "bhvSquarishPathMoving", - "1300142c" : "bhvPiranhaPlantBubble", - "13001448" : "bhvPiranhaPlantWakingBubbles", - "13001468" : "bhvFloorSwitchAnimatesObject", - "13001478" : "bhvFloorSwitchGrills", - "13001484" : "bhvFloorSwitchHardcodedModel", - "130014ac" : "bhvFloorSwitchHiddenObjects", - "130014bc" : "bhvHiddenObject", - "130014e0" : "bhvBreakableBox", - "13001518" : "bhvPushableMetalBox", - "13001548" : "bhvHeaveHo", - "130015a4" : "bhvHeaveHoThrowMario", - "130015c0" : "bhvCcmTouchedStarSpawn", - "130015e4" : "bhvUnusedPoundablePlatform", - "13001608" : "bhvBetaTrampolineTop", - "13001634" : "bhvBetaTrampolineSpring", - "13001650" : "bhvJumpingBox", - "1300167c" : "bhvBooCage", - "130016ac" : "bhvStub", - "130016b8" : "bhvIgloo", - "130016e4" : "bhvBowserKey", - "13001714" : "bhvGrandStar", - "13001744" : "bhvBetaBooKey", - "13001778" : "bhvAlphaBooKey", - "1300179c" : "bhvBulletBill", - "130017f4" : "bhvWhitePuffSmoke", - "13001820" : "bhvUnused1820", - "13001828" : "bhvBowserTailAnchor", - "13001850" : "bhvBowser", - "130018cc" : "bhvBowserBodyAnchor", - "13001904" : "bhvBowserFlameSpawn", - "13001920" : "bhvTiltingBowserLavaPlatform", - "13001958" : "bhvFallingBowserPlatform", - "13001984" : "bhvBlueBowserFlame", - "130019c8" : "bhvFlameFloatingLanding", - "13001a0c" : "bhvBlueFlamesGroup", - "13001a30" : "bhvFlameBouncing", - "13001a74" : "bhvFlameMovingForwardGrowing", - "13001aa4" : "bhvFlameBowser", - "13001ae8" : "bhvFlameLargeBurningOut", - "13001b2c" : "bhvBlueFish", - "13001b54" : "bhvTankFishGroup", - "13001b70" : "bhvCheckerboardElevatorGroup", - "13001b88" : "bhvCheckerboardPlatformSub", - "13001bb4" : "bhvBowserKeyUnlockDoor", - "13001bd4" : "bhvBowserKeyCourseExit", - "13001bf4" : "bhvInvisibleObjectsUnderBridge", - "13001c04" : "bhvWaterLevelPillar", - "13001c34" : "bhvDddWarp", - "13001c58" : "bhvMoatGrills", - "13001c7c" : "bhvClockMinuteHand", - "13001c8c" : "bhvClockHourHand", - "13001cb0" : "bhvMacroUkiki", - "13001d0c" : "bhvStub1D0C", - "13001d14" : "bhvLllRotatingHexagonalPlatform", - "13001d40" : "bhvLllSinkingRockBlock", - "13001d70" : "bhvStub1D70", - "13001d78" : "bhvLllMovingOctagonalMeshPlatform", - "13001da4" : "bhvSnowBall", - "13001da8" : "bhvLllRotatingBlockWithFireBars", - "13001dcc" : "bhvLllRotatingHexFlame", - "13001e04" : "bhvLllWoodPiece", - "13001e30" : "bhvLllFloatingWoodBridge", - "13001e4c" : "bhvVolcanoFlames", - "13001e6c" : "bhvLllRotatingHexagonalRing", - "13001e94" : "bhvLllSinkingRectangularPlatform", - "13001ec4" : "bhvLllSinkingSquarePlatforms", - "13001ef8" : "bhvLllTiltingInvertedPyramid", - "13001f30" : "bhvUnused1F30", - "13001f3c" : "bhvKoopaShell", - "13001f68" : "bhvKoopaShellFlame", - "13001f90" : "bhvToxBox", - "13001fbc" : "bhvPiranhaPlant", - "13002018" : "bhvLllHexagonalMesh", - "13002038" : "bhvLllBowserPuzzlePiece", - "13002068" : "bhvLllBowserPuzzle", - "13002088" : "bhvTuxiesMother", - "130020d8" : "bhvPenguinBaby", - "130020e0" : "bhvUnused20E0", - "130020e8" : "bhvSmallPenguin", - "1300213c" : "bhvFish2", - "1300214c" : "bhvFish3", - "1300215c" : "bhvLargeFishGroup", - "13002178" : "bhvFishGroup2", - "13002194" : "bhvWdwExpressElevator", - "130021c0" : "bhvWdwExpressElevatorPlatform", - "130021e4" : "bhvChirpChirp", - "130021f4" : "bhvChirpChirpUnused", - "1300220c" : "bhvBub", - "13002250" : "bhvExclamationBox", - "1300227c" : "bhvRotatingExclamationMark", - "1300229c" : "bhvSoundSpawner", - "130022b8" : "bhvRockSolid", - "130022d8" : "bhvBowserSubDoor", - "13002308" : "bhvBowsersSub", - "13002338" : "bhvSushiShark", - "13002388" : "bhvSushiSharkCollisionChild", - "130023a4" : "bhvJrbSlidingBox", - "130023d0" : "bhvShipPart3", - "130023ec" : "bhvInSunkenShip3", - "1300241c" : "bhvSunkenShipPart", - "1300243c" : "bhvUnused243C", - "1300244c" : "bhvSunkenShipPart2", - "1300246c" : "bhvInSunkenShip", - "13002480" : "bhvInSunkenShip2", - "130024ac" : "bhvMarioDustGenerator", - "130024dc" : "bhvWhitePuff1", - "13002500" : "bhvWhitePuff2", - "13002528" : "bhvWhitePuffSmoke2", - "13002558" : "bhvPurpleSwitchHiddenBoxes", - "13002568" : "bhvBlueCoinSwitch", - "13002588" : "bhvHiddenBlueCoin", - "130025c0" : "bhvOpenableCageDoor", - "130025e0" : "bhvOpenableGrill", - "130025f8" : "bhvWaterLevelDiamond", - "13002620" : "bhvInitializeChangingWaterLevel", - "13002634" : "bhvTornadoSandParticle", - "13002650" : "bhvTornado", - "13002684" : "bhvMerryGoRoundBooManager", - "1300269c" : "bhvAnimatedTexture", - "130026d4" : "bhvBooInCastle", - "13002710" : "bhvBooWithCage", - "13002768" : "bhvBalconyBigBoo", - "1300277c" : "bhvMerryGoRoundBigBoo", - "13002790" : "bhvGhostHuntBigBoo", - "130027d0" : "bhvCourtyardBooTriplet", - "130027e4" : "bhvBoo", - "130027f4" : "bhvMerryGoRoundBoo", - "13002804" : "bhvGhostHuntBoo", - "1300286c" : "bhvHiddenStaircaseStep", - "13002898" : "bhvBooBossSpawnedBridge", - "130028cc" : "bhvBbhTiltingTrapPlatform", - "130028fc" : "bhvHauntedBookshelf", - "1300292c" : "bhvMeshElevator", - "13002968" : "bhvMerryGoRound", - "13002998" : "bhvPlaysMusicTrackWhenTouched", - "130029b0" : "bhvInsideCannon", - "130029b4" : "bhvBetaBowserAnchor", - "130029e4" : "bhvStaticCheckeredPlatform", - "13002a10" : "bhvUnused2A10", - "13002a20" : "bhvUnusedFakeStar", - "13002a48" : "bhvStaticObject", - "13002a54" : "bhvUnused2A54", - "13002a5c" : "bhvCastleFloorTrap", - "13002a7c" : "bhvFloorTrapInCastle", - "13002aa4" : "bhvTree", - "13002ad0" : "bhvSparkle", - "13002af0" : "bhvSparkleSpawn", - "13002b08" : "bhvSpecialTripleJumpSparkles", - "13002b5c" : "bhvScuttlebug", - "13002ba0" : "bhvScuttlebugSpawn", - "13002bb8" : "bhvWhompKingBoss", - "13002bcc" : "bhvSmallWhomp", - "13002c14" : "bhvWaterSplash", - "13002c60" : "bhvWaterDrops", - "13002c7c" : "bhvWaterSurfaceWhiteWave", - "13002cb0" : "bhvObjectBubbleRipples", - "13002ce0" : "bhvSurfaceWaves", - "13002d28" : "bhvWaterSurfaceWhiteWave2", - "13002d50" : "bhvWavesGenerator", - "13002d7c" : "bhvSurfaceWaveShrinking", - "13002db0" : "bhvWaterType", - "13002dc0" : "bhvWaveTrailOnSurface", - "13002e04" : "bhvTinyWhiteWindParticle", - "13002e20" : "bhvWindParticle", - "13002e3c" : "bhvSnowmanWindBlowing", - "13002e58" : "bhvWalkingPenguin", - "13002ea8" : "bhvYellowBall", - "13002ec0" : "bhvMario", - "13002ef8" : "bhvToadMessage", - "13002f40" : "bhvUnlockDoorStar", - "13002f60" : "bhvWarps60", - "13002f64" : "bhvWarps64", - "13002f68" : "bhvWarps68", - "13002f6c" : "bhvWarps6C", - "13002f70" : "bhvWarps70", - "13002f74" : "bhvWarps74", - "13002f78" : "bhvWarps78", - "13002f7c" : "bhvWarps7C", - "13002f80" : "bhvWarps80", - "13002f84" : "bhvWarps84", - "13002f88" : "bhvWarps88", - "13002f8c" : "bhvWarps8C", - "13002f90" : "bhvWarps90", - "13002f94" : "bhvWarps94", - "13002fa0" : "bhvRandomAnimatedTexture", - "13002fc0" : "bhvYellowBackgroundInMenu", - "13002fe4" : "bhvMenuButton", - "13003008" : "bhvMenuButtonManager", - "1300302c" : "bhvActSelectorStarType", - "13003048" : "bhvActSelector", - "13003068" : "bhvMovingYellowCoin", - "130030a4" : "bhvMovingBlueCoin", - "130030d4" : "bhvBlueCoinSliding", - "13003104" : "bhvBlueCoinJumping", - "13003134" : "bhvSeaweed", - "13003158" : "bhvSeaweedBundle", - "13003174" : "bhvBobomb", - "130031ac" : "bhvBobombFuseSmoke", - "130031dc" : "bhvBobombBuddy", - "13003228" : "bhvBobombBuddyOpensCannon", - "13003274" : "bhvCannonClosed", - "130032a8" : "bhvWhirlpool", - "130032c8" : "bhvJetStream", - "130032e0" : "bhvMessagePanel", - "13003324" : "bhvSignOnWall", - "13003354" : "bhvHomingAmp", - "13003388" : "bhvCirclingAmp", - "130033bc" : "bhvButterfly", - "130033ec" : "bhvHoot", - "13003420" : "bhvBetaHoldableObject", - "13003454" : "bhvCarrySomething1", - "1300345c" : "bhvCarrySomething2", - "13003464" : "bhvCarrySomething3", - "1300346c" : "bhvCarrySomething4", - "13003474" : "bhvCarrySomething5", - "1300347c" : "bhvCarrySomething6", - "13003484" : "bhvObjectBubble", - "130034c4" : "bhvObjectWaterWave", - "13003510" : "bhvExplosion", - "13003558" : "bhvBobombBullyDeathSmoke", - "13003588" : "bhvSmoke", - "130035b0" : "bhvBobombExplosionBubble", - "13003600" : "bhvBobombExplosionBubble3600", - "13003614" : "bhvRespawner", - "1300362c" : "bhvSmallBully", - "13003660" : "bhvBigBully", - "13003694" : "bhvBigBullyWithMinions", - "130036c8" : "bhvSmallChillBully", - "13003700" : "bhvBigChillBully", - "13003738" : "bhvJetStreamRingSpawner", - "13003750" : "bhvJetStreamWaterRing", - "13003798" : "bhvMantaRayWaterRing", - "130037e0" : "bhvMantaRayRingManager", - "130037ec" : "bhvBowserBomb", - "1300381c" : "bhvBowserBombExplosion", - "13003840" : "bhvBowserBombSmoke", - "13003868" : "bhvCelebrationStar", - "13003888" : "bhvCelebrationStarSparkle", - "130038b0" : "bhvStarKeyCollectionPuffSpawner", - "130038d0" : "bhvLllDrawbridgeSpawner", - "130038e8" : "bhvLllDrawbridge", - "13003910" : "bhvSmallBomp", - "13003940" : "bhvLargeBomp", - "13003970" : "bhvWfSlidingPlatform", - "130039a0" : "bhvMoneybag", - "130039d4" : "bhvMoneybagHidden", - "13003a08" : "bhvPitBowlingBall", - "13003a30" : "bhvFreeBowlingBall", - "13003a58" : "bhvBowlingBall", - "13003a80" : "bhvTtmBowlingBallSpawner", - "13003aa4" : "bhvBobBowlingBallSpawner", - "13003ac8" : "bhvThiBowlingBallSpawner", - "13003ae0" : "bhvRrCruiserWing", - "13003b00" : "bhvSpindel", - "13003b30" : "bhvSslMovingPyramidWall", - "13003b60" : "bhvPyramidElevator", - "13003b98" : "bhvPyramidElevatorTrajectoryMarkerBall", - "13003bb4" : "bhvPyramidTop", - "13003bec" : "bhvPyramidTopFragment", - "13003c0c" : "bhvPyramidPillarTouchDetector", - "13003c30" : "bhvWaterfallSoundLoop", - "13003c44" : "bhvVolcanoSoundLoop", - "13003c58" : "bhvCastleFlagWaving", - "13003c7c" : "bhvBirdsSoundLoop", - "13003c90" : "bhvAmbientSounds", - "13003ca4" : "bhvSandSoundLoop", - "13003cb8" : "bhvHiddenAt120Stars", - "13003ce4" : "bhvSnowmansBottom", - "13003d0c" : "bhvSnowmansHead", - "13003d34" : "bhvSnowmansBodyCheckpoint", - "13003d4c" : "bhvBigSnowmanWhole", - "13003d74" : "bhvBigBoulder", - "13003da0" : "bhvBigBoulderGenerator", - "13003db8" : "bhvWingCap", - "13003dd8" : "bhvMetalCap", - "13003df8" : "bhvNormalCap", - "13003e1c" : "bhvVanishCap", - "13003e3c" : "bhvStar", - "13003e64" : "bhvStarSpawnCoordinates", - "13003e8c" : "bhvHiddenRedCoinStar", - "13003eac" : "bhvRedCoin", - "13003ee4" : "bhvBowserCourseRedCoinStar", - "13003efc" : "bhvHiddenStar", - "13003f1c" : "bhvHiddenStarTrigger", - "13003f40" : "bhvTtmRollingLog", - "13003f78" : "bhvLllVolcanoFallingTrap", - "13003fa4" : "bhvLllRollingLog", - "13003fdc" : "bhv1upWalking", - "13004010" : "bhv1upRunningAway", - "13004044" : "bhv1upSliding", - "1300407c" : "bhv1Up", - "130040b4" : "bhv1upJumpOnApproach", - "130040ec" : "bhvHidden1up", - "13004124" : "bhvHidden1upTrigger", - "13004148" : "bhvHidden1upInPole", - "13004180" : "bhvHidden1upInPoleTrigger", - "130041a4" : "bhvHidden1upInPoleSpawner", - "130041bc" : "bhvControllablePlatform", - "130041f0" : "bhvControllablePlatformSub", - "13004218" : "bhvBreakableBoxSmall", - "13004244" : "bhvSlidingSnowMound", - "13004270" : "bhvSnowMoundSpawn", - "13004284" : "bhvWdwSquareFloatingPlatform", - "130042b4" : "bhvWdwRectangularFloatingPlatform", - "130042e4" : "bhvJrbFloatingPlatform", - "13004314" : "bhvArrowLift", - "13004348" : "bhvOrangeNumber", - "13004370" : "bhvMantaRay", - "130043a0" : "bhvFallingPillar", - "130043c4" : "bhvFallingPillarHitbox", - "130043e0" : "bhvPillarBase", - "13004400" : "bhvJrbFloatingBox", - "1300442c" : "bhvDecorativePendulum", - "1300444c" : "bhvTreasureChestsShip", - "13004470" : "bhvTreasureChestsJrb", - "13004494" : "bhvTreasureChests", - "130044b8" : "bhvTreasureChestBottom", - "130044e0" : "bhvTreasureChestTop", - "130044fc" : "bhvMips", - "13004538" : "bhvYoshi", - "13004580" : "bhvKoopa", - "130045d0" : "bhvKoopaRaceEndpoint", - "130045f8" : "bhvKoopaFlag", - "13004634" : "bhvPokey", - "13004668" : "bhvPokeyBodyPart", - "13004698" : "bhvSwoop", - "130046dc" : "bhvFlyGuy", - "1300472c" : "bhvGoomba", - "13004770" : "bhvGoombaTripletSpawner", - "1300478c" : "bhvChainChomp", - "130047e4" : "bhvChainChompChainPart", - "1300481c" : "bhvWoodenPost", - "13004868" : "bhvChainChompGate", - "13004898" : "bhvWigglerHead", - "130048e0" : "bhvWigglerBody", - "13004918" : "bhvEnemyLakitu", - "13004954" : "bhvCameraLakitu", - "13004988" : "bhvCloud", - "130049ac" : "bhvCloudPart", - "130049c8" : "bhvSpiny", - "13004a00" : "bhvMontyMole", - "13004a58" : "bhvMontyMoleHole", - "13004a78" : "bhvMontyMoleRock", - "13004ab0" : "bhvPlatformOnTrack", - "13004af4" : "bhvTrackBall", - "13004b1c" : "bhvSeesawPlatform", - "13004b44" : "bhvFerrisWheelAxle", - "13004b6c" : "bhvFerrisWheelPlatform", - "13004b8c" : "bhvWaterBombSpawner", - "13004ba8" : "bhvWaterBomb", - "13004bd4" : "bhvWaterBombShadow", - "13004bf0" : "bhvTTCRotatingSolid", - "13004c24" : "bhvTTCPendulum", - "13004c5c" : "bhvTTCTreadmill", - "13004c94" : "bhvTTCMovingBar", - "13004ccc" : "bhvTTCCog", - "13004cf8" : "bhvTTCPitBlock", - "13004d28" : "bhvTTCElevator", - "13004d64" : "bhvTTC2DRotator", - "13004d90" : "bhvTTCSpinner", - "13004dbc" : "bhvMrBlizzard", - "13004e08" : "bhvMrBlizzardSnowball", - "13004e4c" : "bhvSlidingPlatform2", - "13004e78" : "bhvOctagonalPlatformRotating", - "13004ea0" : "bhvAnimatesOnFloorSwitchPress", - "13004ecc" : "bhvActivatedBackAndForthPlatform", - "13004ef8" : "bhvRecoveryHeart", - "13004f10" : "bhvWaterBombCannon", - "13004f28" : "bhvCannonBarrelBubbles", - "13004f40" : "bhvUnagi", - "13004f78" : "bhvUnagiSubobject", - "13004f90" : "bhvDorrie", - "13004fd4" : "bhvHauntedChair", - "13005024" : "bhvMadPiano", - "1300506c" : "bhvFlyingBookend", - "130050b4" : "bhvBookendSpawn", - "130050d4" : "bhvHauntedBookshelfManager", - "130050f4" : "bhvBookSwitch", - "13005120" : "bhvFirePiranhaPlant", - "13005158" : "bhvSmallPiranhaFlame", - "1300518c" : "bhvFireSpitter", - "130051ac" : "bhvFlyguyFlame", - "130051e0" : "bhvSnufit", - "1300521c" : "bhvSnufitBalls", - "1300525c" : "bhvHorizontalGrindel", - "130052b4" : "bhvEyerokBoss", - "130052d0" : "bhvEyerokHand", - "13005310" : "bhvKlepto", - "13005354" : "bhvBird", - "13005380" : "bhvRacingPenguin", - "130053c4" : "bhvPenguinRaceFinishLine", - "130053dc" : "bhvPenguinRaceShortcutCheck", - "130053f4" : "bhvCoffinManager", - "13005414" : "bhvCoffin", - "13005440" : "bhvClamShell", - "13005468" : "bhvSkeeter", - "130054a0" : "bhvSkeeterWave", - "130054b8" : "bhvSwingPlatform", - "130054ec" : "bhvDonutPlatformSpawner", - "13005504" : "bhvDonutPlatform", - "13005528" : "bhvDDDPole", - "1300556c" : "bhvRedCoinStarMarker", - "13005598" : "bhvTripletButterfly", - "130055dc" : "bhvBubba", - "13005610" : "bhvBeginningLakitu", - "13005638" : "bhvBeginningPeach", - "1300565c" : "bhvEndBirds1", - "13005680" : "bhvEndBirds2", - "130056a4" : "bhvIntroScene", - "130056c0" : "_behaviorSegmentEnd", - "007d1d80" : "_behaviorSegmentRomEnd", - "8016f000" : "_goddardSegmentStart", - "007cc6c0" : "_goddardSegmentRomStart", - }, - - "Refresh 5" : { - "80000300" : "osTvType", - "80000308" : "osRomBase", - "8000030c" : "osResetType", - "80000318" : "osMemSize", - "8000031c" : "osAppNmiBuffer", - "80000000" : "D_80000000", - "a4000000" : "D_A4000000", - "a40004c0" : "D_A40004C0", - "a4000774" : "D_A4000774", - "a4001000" : "D_A4001000", - "a4040010" : "D_A4040010", - "a4080000" : "D_A4080000", - "a4300000" : "D_A4300000", - "a4300004" : "D_A4300004", - "a4300008" : "D_A4300008", - "a430000c" : "D_A430000C", - "a4400010" : "D_A4400010", - "a450000c" : "D_A450000C", - "a4600000" : "D_A4600000", - "a4600004" : "D_A4600004", - "a460000c" : "D_A460000C", - "a4600010" : "D_A4600010", - "a4700000" : "D_A4700000", - "a4700010" : "D_A4700010", - "a4800018" : "D_A4800018", - "b0000008" : "D_B0000008", - "b0000010" : "D_B0000010", - "b0000014" : "D_B0000014", - "c0000000" : "D_C0000000", - "c0000008" : "D_C0000008", - "c000000c" : "D_C000000C", - "802ef700" : "__osGetCurrFaultedThread", - "00000000" : "__romPos", - "04000000" : "_bootSegmentStart", - "007cc6c0" : "_bootSegmentRomStart", - "04001000" : "_bootSegmentEnd", - "007cd6c0" : "_bootSegmentRomEnd", - "80000400" : ".", - "80000400" : "_zbufferSegmentNoloadStart", - "80000400" : "0x25800", - "80000400" : "gZBuffer", - "80246000" : "_mainSegmentStart", - "007cc6c0" : "_mainSegmentRomStart", - "80246000" : "EntryPoint", - "80246050" : "handle_debug_key_sequences", - "80246170" : "Unknown80246170", - "802461cc" : "Dummy802461CC", - "802461dc" : "Dummy802461DC", - "802461ec" : "Dummy802461EC", - "802461fc" : "setup_mesg_queues", - "802462e0" : "AllocPool", - "80246338" : "create_thread", - "8024639c" : "handle_nmi_request", - "802463ec" : "receive_new_tasks", - "8024651c" : "start_sptask", - "8024659c" : "interrupt_gfx_sptask", - "802465ec" : "start_gfx_sptask", - "80246648" : "pretend_audio_sptask_done", - "8024669c" : "handle_vblank", - "802467fc" : "handle_sp_complete", - "8024694c" : "handle_dp_complete", - "802469b8" : "thread3_main", - "80246b14" : "set_vblank_handler", - "80246b74" : "SendMessage", - "80246bb4" : "dispatch_audio_sptask", - "80246c10" : "send_display_list", - "80246c9c" : "turn_on_audio", - "80246cb8" : "turn_off_audio", - "80246cf0" : "thread1_idle", - "80246df8" : "Main", - "80246e70" : "my_rdp_init", - "802471a4" : "my_rsp_init", - "80247284" : "clear_z_buffer", - "802473c8" : "display_frame_buffer", - "802474b8" : "clear_frame_buffer", - "80247620" : "clear_viewport", - "8024784c" : "draw_screen_borders", - "802479bc" : "make_viewport_clip_rect", - "80247b3c" : "create_task_structure", - "80247ccc" : "init_render_image", - "80247d14" : "end_master_display_list", - "80247db4" : "func_80247D84", - "80247f08" : "func_80247ED8", - "80247fdc" : "func_80247FAC", - "80248090" : "display_and_vsync", - "80248304" : "adjust_analog_stick", - "80248498" : "run_demo_inputs", - "80248638" : "read_controller_inputs", - "80248824" : "init_controllers", - "80248964" : "setup_game_memory", - "80248af0" : "thread5_game_loop", - "80248c40" : "func_80248C10", - "80248c58" : "func_80248C28", - "80248ce8" : "func_80248CB8", - "80248d78" : "func_80248D48", - "80248dc0" : "func_80248D90", - "80248e08" : "set_sound_mode", - "80248e54" : "play_menu_sounds", - "80248fec" : "play_painting_eject_sound", - "80249070" : "play_infinite_stairs_music", - "80249178" : "set_background_music", - "8024922c" : "func_802491FC", - "8024927c" : "func_8024924C", - "802492d0" : "play_cutscene_music", - "80249310" : "play_shell_music", - "8024934c" : "stop_shell_music", - "80249398" : "play_cap_music", - "80249404" : "fadeout_cap_music", - "80249448" : "stop_cap_music", - "802494d8" : "audio_game_loop_tick", - "80249500" : "thread4_sound", - "802495e0" : "level_control_timer", - "802496b8" : "pressed_paused", - "80249764" : "set_play_mode", - "8024978c" : "func_8024975C", - "802497b8" : "func_80249788", - "8024982c" : "nop_802497FC", - "8024983c" : "func_8024980C", - "8024995c" : "func_8024992C", - "80249a10" : "set_mario_initial_cap_powerup", - "80249ab4" : "set_mario_initial_action", - "80249cd8" : "init_mario_after_warp", - "8024a124" : "func_8024A02C", - "8024a18c" : "func_8024A094", - "8024a1d8" : "func_8024A0E0", - "8024a374" : "check_instant_warp", - "8024a584" : "func_8024A48C", - "8024a700" : "initiate_warp", - "8024a7b4" : "get_painting_warp_node", - "8024a85c" : "initiate_painting_warp", - "8024a9cc" : "level_trigger_warp", - "8024aedc" : "initiate_delayed_warp", - "8024b13c" : "update_hud_values", - "8024b390" : "basic_update", - "8024b3e4" : "play_mode_normal", - "8024b5d4" : "play_mode_paused", - "8024b6cc" : "play_mode_frame_advance", - "8024b798" : "level_set_transition", - "8024b7c0" : "play_mode_change_area", - "8024b880" : "play_mode_change_level", - "8024b9b8" : "update_level", - "8024ba8c" : "init_level", - "8024bcd8" : "lvl_init_or_update", - "8024bd5c" : "lvl_init_from_save_file", - "8024be14" : "lvl_set_current_level", - "8024bfa0" : "lvl_play_the_end_screen_sound", - "8024bff0" : "get_mario_cap_flag", - "8024c0b8" : "object_facing_mario", - "8024c16c" : "mario_angle_to_object", - "8024c1d8" : "determine_interaction", - "8024c51c" : "attack_object", - "8024c618" : "mario_stop_riding_object", - "8024c66c" : "mario_grab_used_object", - "8024c6c0" : "mario_drop_held_object", - "8024c780" : "mario_throw_held_object", - "8024c894" : "mario_stop_riding_and_holding", - "8024c8fc" : "does_mario_have_hat", - "8024c928" : "mario_blow_off_cap", - "8024ca68" : "mario_lose_cap_to_enemy", - "8024caf8" : "mario_retrieve_cap", - "8024cb58" : "able_to_grab_object", - "8024cbfc" : "mario_get_collided_object", - "8024cc7c" : "mario_check_object_grab", - "8024ce08" : "bully_knock_back_mario", - "8024d0b4" : "bounce_off_object", - "8024d130" : "hit_object_from_below", - "8024d2bc" : "determine_knockback_action", - "8024d578" : "push_mario_out_of_object", - "8024d72c" : "bounce_back_from_attack", - "8024d804" : "func_8024D664", - "8024d8b0" : "take_damage_from_interact_object", - "8024d998" : "take_damage_and_knock_back", - "8024daac" : "reset_mario_pitch", - "8024db2c" : "interact_coin", - "8024dbf0" : "interact_water_ring", - "8024dc28" : "interact_star_or_key", - "8024de4c" : "interact_bbh_entrance", - "8024df10" : "interact_warp", - "8024e0c4" : "interact_warp_door", - "8024e2fc" : "get_door_save_file_flag", - "8024e420" : "interact_door", - "8024e6ec" : "interact_cannon_base", - "8024e778" : "interact_igloo_barrier", - "8024e7d4" : "interact_tornado", - "8024e8f0" : "interact_whirlpool", - "8024e9d0" : "interact_wind", - "8024ead8" : "interact_flame", - "8024ec54" : "interact_snufit_bullet", - "8024ed84" : "interact_clam_or_bubba", - "8024ee44" : "interact_bully", - "8024eff8" : "interact_shock", - "8024f170" : "interact_mr_blizzard", - "8024f1e0" : "interact_hit_from_below", - "8024f354" : "interact_bounce_top", - "8024f4ac" : "interact_unknown_08", - "8024f55c" : "interact_damage", - "8024f5cc" : "interact_breakable", - "8024f6a4" : "interact_koopa_shell", - "8024f7a8" : "check_object_grab_mario", - "8024f8bc" : "interact_pole", - "8024fa60" : "interact_hoot", - "8024fb30" : "interact_cap", - "8024fd2c" : "interact_grabbable", - "8024fe6c" : "func_8024FC94", - "8024ff04" : "func_8024FD2C", - "80250098" : "func_8024FEC0", - "80250198" : "interact_text", - "80250230" : "check_kick_or_punch_wall", - "802503f0" : "mario_process_interactions", - "802505c8" : "check_death_barrier", - "8025065c" : "check_lava_boost", - "80250724" : "pss_begin_slide", - "80250778" : "pss_end_slide", - "802507fc" : "mario_handle_special_floors", - "80250940" : "is_anim_at_end", - "8025097c" : "is_anim_past_end", - "802509b8" : "set_mario_animation", - "80250b04" : "set_mario_anim_with_accel", - "80250c7c" : "set_anim_to_frame", - "80250d38" : "is_anim_past_frame", - "80250e54" : "find_mario_anim_flags_and_translation", - "80251020" : "update_mario_pos_for_anim", - "802510dc" : "return_mario_anim_y_translation", - "80251120" : "play_sound_if_no_flag", - "8025118c" : "play_mario_jump_sound", - "80251274" : "adjust_sound_for_speed", - "80251310" : "play_sound_and_spawn_particles", - "80251444" : "play_mario_action_sound", - "802514ac" : "play_mario_landing_sound", - "80251510" : "play_mario_landing_sound_once", - "80251574" : "play_mario_heavy_landing_sound", - "802515d8" : "play_mario_heavy_landing_sound_once", - "8025163c" : "play_mario_sound", - "80251708" : "mario_set_forward_vel", - "8025177c" : "mario_get_floor_class", - "802518a8" : "mario_get_terrain_sound_addend", - "80251a48" : "resolve_and_return_wall_collisions", - "80251afc" : "vec3f_find_ceil", - "80251b54" : "mario_facing_downhill", - "80251bd4" : "mario_floor_is_slippery", - "80251cfc" : "mario_floor_is_slope", - "80251e24" : "mario_floor_is_steep", - "80251f24" : "find_floor_height_relative_polar", - "80252000" : "find_floor_slope", - "802521a0" : "update_mario_sound_and_camera", - "8025229c" : "set_steep_jump_action", - "80252cf4" : "set_mario_action", - "80252e5c" : "set_jump_from_landing", - "802530a0" : "set_jumping_action", - "80253178" : "drop_and_set_mario_action", - "802531c4" : "hurt_and_set_mario_action", - "80253218" : "check_common_action_exits", - "80253300" : "check_common_hold_action_exits", - "802533e4" : "transition_submerged_to_walking", - "80253488" : "set_water_plunge_action", - "80253588" : "squish_mario_model", - "80253720" : "debug_print_speed_action_normal", - "80253838" : "update_mario_button_inputs", - "8025395c" : "update_mario_joystick_inputs", - "80253a60" : "update_mario_geometry_inputs", - "80253d58" : "update_mario_inputs", - "80253ec0" : "set_submerged_cam_preset_and_spawn_bubbles", - "80254060" : "update_mario_health", - "802542b4" : "update_mario_info_for_cam", - "80254338" : "mario_reset_bodystate", - "80254390" : "sink_mario_in_quicksand", - "802543e8" : "update_and_return_cap_flags", - "80254588" : "mario_update_hitbox_and_cap_model", - "80254830" : "execute_mario_action", - "80254b20" : "init_mario", - "80254f44" : "init_mario_from_save_file", - "80255080" : "get_additive_y_vel_for_jumps", - "8025509c" : "nop_80254E3C", - "802550b0" : "nop_80254E50", - "802550c0" : "transfer_bully_speed", - "80255238" : "init_bully_collision_data", - "802552fc" : "mario_bonk_reflection", - "80255414" : "mario_update_quicksand", - "80255654" : "mario_push_off_steep_floor", - "8025570c" : "mario_update_moving_sand", - "8025580c" : "mario_update_windy_ground", - "802559b0" : "stop_and_set_height_to_floor", - "80255a34" : "stationary_ground_step", - "80255d88" : "perform_ground_step", - "80255ec4" : "check_ledge_grab", - "802560ac" : "perform_air_quarter_step", - "802564e0" : "apply_twirl_gravity", - "80256584" : "should_strengthen_gravity_for_jump_ascent", - "8025661c" : "apply_gravity", - "802569f8" : "apply_vertical_wind", - "80256b24" : "perform_air_step", - "80256cd8" : "set_vel_from_pitch_and_yaw", - "80256d8c" : "set_vel_from_yaw", - "80256e00" : "get_credits_str_width", - "80256e88" : "print_displaying_credits_entry", - "80257060" : "BehEndPeachLoop", - "802570dc" : "BehEndToadLoop", - "80257198" : "geo_switch_peach_eyes", - "802572b0" : "get_star_collection_dialog", - "8025733c" : "handle_save_menu", - "80257450" : "spawn_obj_at_mario_rel_yaw", - "802574e8" : "cutscene_take_cap_off", - "80257548" : "cutscene_put_cap_on", - "802575a8" : "mario_ready_to_speak", - "80257640" : "set_mario_npc_dialog", - "80257748" : "act_reading_npc_dialog", - "80257980" : "act_waiting_for_dialog", - "80257a0c" : "act_disappeared", - "80257ab0" : "act_reading_automatic_dialog", - "80257ce4" : "act_reading_sign", - "80257eac" : "act_debug_free_move", - "80258184" : "general_star_dance_handler", - "80258420" : "act_star_dance", - "802584dc" : "act_star_dance_water", - "802585c0" : "act_fall_after_star_grab", - "802586cc" : "common_death_handler", - "80258744" : "act_standing_death", - "802587ec" : "act_electrocution", - "8025883c" : "act_suffocation", - "8025888c" : "act_death_on_back", - "802588f8" : "act_death_on_stomach", - "80258964" : "act_quicksand_death", - "80258a7c" : "act_eaten_by_bubba", - "80258b24" : "launch_mario_until_land", - "80258ba8" : "act_unlocking_key_door", - "80258dac" : "act_unlocking_star_door", - "80258f94" : "act_entering_star_door", - "80259264" : "act_going_through_door", - "802593cc" : "act_warp_door_spawn", - "802594d4" : "act_emerge_from_pipe", - "80259608" : "act_spawn_spin_airborne", - "80259740" : "act_spawn_spin_landing", - "802597ac" : "act_exit_airborne", - "80259854" : "act_falling_exit_airborne", - "802598d0" : "act_exit_land_save_dialog", - "80259c30" : "act_death_exit", - "80259ce8" : "act_unused_death_exit", - "80259d74" : "act_falling_death_exit", - "80259e00" : "act_special_exit_airborne", - "80259ef8" : "act_special_death_exit", - "80259fcc" : "act_spawn_no_spin_airborne", - "8025a040" : "act_spawn_no_spin_landing", - "8025a0bc" : "act_bbh_enter_spin", - "8025a494" : "act_bbh_enter_jump", - "8025a610" : "act_teleport_fade_out", - "8025a6fc" : "act_teleport_fade_in", - "8025a858" : "act_shocked", - "8025a9ac" : "act_squished", - "8025ae0c" : "act_putting_on_cap", - "8025aea8" : "stuck_in_ground_handler", - "8025affc" : "act_head_stuck_in_ground", - "8025b050" : "act_butt_stuck_in_ground", - "8025b0a4" : "act_feet_stuck_in_ground", - "8025d798" : "mario_execute_cutscene_action", - "8025dd70" : "add_tree_leaf_particles", - "8025de1c" : "play_climbing_sounds", - "8025df04" : "set_pole_position", - "8025e21c" : "act_holding_pole", - "8025e5a8" : "act_climbing_pole", - "8025e7a4" : "act_grab_pole_slow", - "8025e830" : "act_grab_pole_fast", - "8025e930" : "act_top_of_pole_transition", - "8025ea30" : "act_top_of_pole", - "8025eb50" : "perform_hanging_step", - "8025ecfc" : "update_hang_moving", - "8025eed0" : "update_hang_stationary", - "8025ef58" : "act_start_hanging", - "8025f0b4" : "act_hanging", - "8025f1e4" : "act_hang_moving", - "8025f384" : "let_go_of_ledge", - "8025f4b4" : "func_8025F0DC", - "8025f560" : "func_8025F188", - "8025f644" : "update_ledge_climb", - "8025f6c0" : "act_ledge_grab", - "8025f970" : "act_ledge_climb_slow", - "8025fa64" : "act_ledge_climb_down", - "8025fae8" : "act_ledge_climb_fast", - "8025fb90" : "act_grabbed", - "8025fc6c" : "act_in_cannon", - "80260154" : "act_tornado_twirling", - "80260568" : "check_common_automatic_cancels", - "802605d0" : "mario_execute_automatic_action", - "802608b0" : "func_802604E0", - "80260aac" : "func_802606DC", - "80260cb4" : "act_idle", - "80260f94" : "func_80260BC4", - "80261000" : "act_start_sleeping", - "80261268" : "act_sleeping", - "802614fc" : "act_waking_up", - "8026168c" : "act_shivering", - "802618d8" : "act_coughing", - "802619d0" : "act_hold_idle", - "80261ad0" : "act_hold_heavy_idle", - "80261bf8" : "act_standing_against_wall", - "80261cec" : "act_in_quicksand", - "80261db4" : "act_crouching", - "80261f70" : "act_panting", - "80262080" : "act_hold_panting_unused", - "8026217c" : "func_80261D70", - "802621dc" : "act_braking_stop", - "802622dc" : "act_butt_slide_stop", - "80262398" : "func_80261F8C", - "80262490" : "act_slide_kick_slide_stop", - "80262530" : "act_start_crouching", - "80262650" : "act_stop_crouching", - "80262770" : "act_start_crawling", - "80262890" : "act_stop_crawling", - "80262980" : "func_80262574", - "80262bc4" : "func_802627B8", - "80262c34" : "func_80262828", - "80262d68" : "act_jump_land_stop", - "80262dc4" : "act_double_jump_land_stop", - "80262e20" : "act_side_flip_land_stop", - "80262e94" : "act_freefall_land_stop", - "80262ef0" : "act_triple_jump_land_stop", - "80262f50" : "act_backflip_land_stop", - "80262fec" : "act_lava_boost_land", - "8026305c" : "act_long_jump_land_stop", - "802630f8" : "func_80262CEC", - "802631f0" : "func_80262DE4", - "802632e8" : "act_air_throw_land", - "802633b4" : "act_twirl_land", - "8026350c" : "act_ground_pound_land", - "802635e8" : "act_first_person", - "80263784" : "func_80263378", - "80263898" : "mario_execute_stationary_action", - "80263e60" : "func_80263A50", - "80263ee4" : "func_80263AD4", - "80264024" : "func_80263C14", - "8026409c" : "begin_walking_action", - "802640fc" : "check_ledge_climb_down", - "802642b4" : "slide_bonk", - "80264340" : "set_triple_jump_action", - "8026440c" : "update_sliding_angle", - "80264740" : "update_sliding", - "80264b54" : "apply_slope_accel", - "80264d80" : "apply_landing_accel", - "80264e18" : "update_shell_speed", - "80265080" : "apply_slope_decel", - "802651b0" : "update_decelerating_speed", - "80265244" : "update_walking_speed", - "80265458" : "should_begin_sliding", - "80265514" : "analog_stick_held_back", - "80265558" : "check_ground_dive_or_punch", - "80265620" : "begin_braking_action", - "80265700" : "func_802652F0", - "80265b1c" : "func_8026570C", - "80265d90" : "func_80265980", - "80265df8" : "func_802659E8", - "80266038" : "func_80265C28", - "802661cc" : "func_80265DBC", - "80266354" : "act_walking", - "802665b4" : "act_move_punching", - "80266734" : "act_hold_walking", - "8026699c" : "act_hold_heavy_walking", - "80266af8" : "act_turning_around", - "80266d4c" : "act_finish_turning_around", - "80266e48" : "act_braking", - "80266fc8" : "act_decelerating", - "80267240" : "act_hold_decelerating", - "80267504" : "act_riding_shell_ground", - "80267728" : "act_crawling", - "8026795c" : "act_burning_ground", - "80267c24" : "func_80267814", - "80267ce4" : "common_slide_action", - "80267fa4" : "common_slide_action_with_jump", - "80268074" : "act_butt_slide", - "802680d4" : "act_hold_butt_slide", - "80268168" : "act_crouch_slide", - "80268338" : "act_slide_kick_slide", - "802684ac" : "stomach_slide_action", - "802685c0" : "act_stomach_slide", - "80268608" : "act_hold_stomach_slide", - "80268684" : "act_dive_slide", - "802687b8" : "common_ground_knockback_action", - "802689f8" : "act_hard_backward_ground_kb", - "80268adc" : "act_hard_forward_ground_kb", - "80268b64" : "act_backward_ground_kb", - "80268bb0" : "act_forward_ground_kb", - "80268bfc" : "act_soft_backward_ground_kb", - "80268c48" : "act_soft_forward_ground_kb", - "80268c94" : "act_ground_bonk", - "80268d04" : "act_death_exit_land", - "80268dcc" : "common_landing_action", - "80268f78" : "common_landing_cancels", - "80269108" : "act_jump_land", - "80269170" : "act_freefall_land", - "802691d8" : "act_side_flip_land", - "80269264" : "act_hold_jump_land", - "80269300" : "act_hold_freefall_land", - "8026939c" : "act_long_jump_land", - "8026947c" : "act_double_jump_land", - "802694e4" : "act_triple_jump_land", - "80269588" : "act_backflip_land", - "80269640" : "quicksand_jump_land_action", - "80269788" : "act_quicksand_jump_land", - "802697dc" : "act_hold_quicksand_jump_land", - "80269830" : "check_common_moving_cancels", - "80269954" : "mario_execute_moving_action", - "80269f40" : "play_flip_sounds", - "80269fc0" : "play_far_fall_sound", - "8026a090" : "func_u_8026A090", - "8026a12c" : "lava_boost_on_wall", - "8026a224" : "check_fall_damage", - "8026a400" : "check_kick_or_dive_in_air", - "8026a494" : "should_get_stuck_in_ground", - "8026a598" : "check_fall_damage_or_get_stuck", - "8026a62c" : "check_horizontal_wind", - "8026a818" : "update_air_with_turn", - "8026aa48" : "update_air_without_turn", - "8026acd8" : "update_lava_boost_or_twirling", - "8026ae5c" : "update_flying_yaw", - "8026b004" : "update_flying_pitch", - "8026b17c" : "update_flying", - "8026b444" : "common_air_action_step", - "8026b6a0" : "act_jump", - "8026b740" : "act_double_jump", - "8026b814" : "act_triple_jump", - "8026b90c" : "act_backflip", - "8026b9ac" : "act_freefall", - "8026bab8" : "act_hold_jump", - "8026bbb4" : "act_hold_freefall", - "8026bcc0" : "act_side_flip", - "8026bdcc" : "act_wall_kick_air", - "8026be78" : "act_long_jump", - "8026bf40" : "act_riding_shell_air", - "8026c034" : "act_twirling", - "8026c1e0" : "act_dive", - "8026c4b8" : "act_air_throw", - "8026c5d0" : "act_water_jump", - "8026c738" : "act_hold_water_jump", - "8026c880" : "act_steep_jump", - "8026c9fc" : "act_ground_pound", - "8026cd0c" : "act_burning_jump", - "8026ce50" : "act_burning_fall", - "8026cf28" : "act_crazy_box_bounce", - "8026d1b0" : "common_air_knockback_step", - "8026d33c" : "func_8026CDFC", - "8026d3c8" : "act_backward_air_kb", - "8026d43c" : "act_forward_air_kb", - "8026d4b0" : "act_hard_backward_air_kb", - "8026d508" : "act_hard_forward_air_kb", - "8026d560" : "act_thrown_backward", - "8026d608" : "act_thrown_forward", - "8026d6fc" : "act_soft_bonk", - "8026d770" : "act_getting_blown", - "8026d988" : "act_air_hit_wall", - "8026db54" : "act_forward_rollout", - "8026dcf4" : "act_backward_rollout", - "8026de98" : "act_butt_slide_air", - "8026e088" : "act_hold_butt_slide_air", - "8026e2b4" : "act_lava_boost", - "8026e59c" : "act_slide_kick", - "8026e810" : "act_jump_kick", - "8026e968" : "act_shot_from_cannon", - "8026ec00" : "act_flying", - "8026f158" : "act_riding_hoot", - "8026f2ec" : "act_flying_triple_jump", - "8026f614" : "act_top_of_pole_jump", - "8026f660" : "act_vertical_wind", - "8026f840" : "act_special_triple_jump", - "8026fa18" : "check_common_airborne_cancels", - "8026fb04" : "mario_execute_airborne_action", - "8027499c" : "mario_execute_submerged_action", - "80274eb0" : "animated_stationary_ground_step", - "80274f10" : "mario_update_punch_sequence", - "80275328" : "act_punching", - "8027546c" : "act_picking_up", - "802755fc" : "act_dive_picking_up", - "802756c8" : "act_placing_down", - "80275794" : "act_throwing", - "802758c0" : "act_heavy_throw", - "802759b4" : "act_stomach_slide_stop", - "80275a80" : "act_picking_up_bowser", - "80275b34" : "act_holding_bowser", - "80275e78" : "act_releasing_bowser", - "80275f0c" : "check_common_object_cancels", - "80275fe0" : "mario_execute_object_action", - "802761d0" : "geo_enfvx_main", - "802763d4" : "geo_skybox_main", - "802764b0" : "Geo18_802764B0", - "8027684c" : "bhvToadMessage_loop", - "80276910" : "bhvToadMessage_init", - "80276bb8" : "bhvUnlockDoorStar_init", - "80276ccc" : "bhvUnlockDoorStar_loop", - "802770a4" : "Geo18_802770A4", - "80277150" : "geo_switch_mario_stand_run", - "802771bc" : "geo_switch_mario_eyes", - "80277294" : "Geo18_80277294", - "802773a4" : "Geo18_802773A4", - "802774f4" : "geo_switch_mario_hand", - "802775cc" : "Geo18_802775CC", - "802776d8" : "geo_switch_mario_cap_effect", - "80277740" : "geo_switch_mario_cap_on_off", - "80277824" : "Geo18_80277824", - "8027795c" : "geo_switch_mario_hand_grab_pos", - "80277b14" : "geo_render_mirror_mario", - "80277d6c" : "geo_mirror_mario_backface_culling", - "80277ee0" : "set_segment_base_addr", - "80277f20" : "get_segment_base_addr", - "80277f50" : "segmented_to_virtual", - "80277fa8" : "virtual_to_segmented", - "80277ff0" : "move_segment_table_to_dmem", - "80278074" : "main_pool_init", - "80278120" : "main_pool_alloc", - "80278238" : "main_pool_free", - "80278358" : "main_pool_realloc", - "802783c8" : "main_pool_available", - "802783e8" : "main_pool_push_state", - "80278498" : "main_pool_pop_state", - "8027868c" : "load_segment", - "802786f0" : "load_to_fixed_pool_addr", - "802787d8" : "load_segment_decompress", - "802788b4" : "func_80278304", - "80278974" : "load_engine_code_segment", - "80278a14" : "alloc_only_pool_init", - "80278ab8" : "alloc_only_pool_alloc", - "80278b28" : "alloc_only_pool_resize", - "80278b98" : "mem_pool_init", - "80278c58" : "mem_pool_alloc", - "80278d74" : "mem_pool_free", - "80278f2c" : "alloc_display_list", - "80279028" : "func_80278A78", - "80279084" : "func_80278AD4", - "80279840" : "save_file_do_save", - "802798fc" : "save_file_erase", - "80279960" : "save_file_copy", - "802799dc" : "save_file_load_all", - "80279bc8" : "save_file_reload", - "80279c44" : "save_file_collect_star_or_key", - "80279e44" : "save_file_exists", - "80279e80" : "save_file_get_max_coin_score", - "80279f80" : "save_file_get_course_star_count", - "8027a010" : "save_file_get_total_star_count", - "8027a0a8" : "save_file_set_flags", - "8027a0f4" : "save_file_clear_flags", - "8027a16c" : "save_file_get_flags", - "8027a1c8" : "save_file_get_star_flags", - "8027a23c" : "save_file_set_star_flags", - "8027a310" : "save_file_get_course_coin_score", - "8027a340" : "save_file_is_cannon_unlocked", - "8027a390" : "save_file_set_cannon_unlocked", - "8027a418" : "save_file_set_cap_pos", - "8027a4ac" : "save_file_get_cap_pos", - "8027a564" : "save_file_set_sound_mode", - "8027a5b4" : "save_file_get_sound_mode", - "8027a5d4" : "save_file_move_cap_to_default_location", - "8027a698" : "disable_warp_checkpoint", - "8027a6b0" : "check_if_should_set_warp_checkpoint", - "8027a718" : "check_warp_checkpoint", - "8027a7d0" : "func_8027A220", - "8027a83c" : "set_warp_transition_rgb", - "8027a8b0" : "print_intro_text", - "8027a93c" : "get_mario_spawn_type", - "8027a9c8" : "area_get_warp_node", - "8027aa28" : "func_8027A478", - "8027aa74" : "func_8027A4C4", - "8027ab04" : "clear_areas", - "8027ad74" : "func_8027A7C4", - "8027ae44" : "load_area", - "8027af48" : "func_8027A998", - "8027afbc" : "load_mario_area", - "8027b038" : "func_8027AA88", - "8027b0c0" : "change_area", - "8027b164" : "area_update_objects", - "8027b1a0" : "play_transition", - "8027b35c" : "play_transition_after_delay", - "8027b3b4" : "render_game", - "8027cf38" : "geo_set_animation_globals", - "8027da84" : "geo_process_held_object", - "8027de68" : "geo_try_process_children", - "8027dea8" : "geo_process_node_and_siblings", - "8027e130" : "geo_process_root", - "8027e3e0" : "profiler_log_thread5_time", - "8027e490" : "profiler_log_thread4_time", - "8027e520" : "profiler_log_gfx_time", - "8027e5cc" : "profiler_log_vblank_time", - "8027e65c" : "draw_profiler_bar", - "8027e958" : "draw_reference_profiler_bars", - "8027ebcc" : "draw_profiler_mode_1", - "8027eeac" : "draw_profiler_mode_0", - "8027f460" : "draw_profiler", - "8027f4e0" : "decompress", - "8027f590" : "set_camera_shake_from_hit", - "8027f8b8" : "set_environmental_camera_shake", - "8027f9f0" : "set_camera_shake_from_point", - "8027fb74" : "unused_set_camera_pitch_shake_env", - "8027fc18" : "calc_y_to_curr_floor", - "8027fe20" : "focus_on_mario", - "8027fff8" : "set_camera_height", - "80280368" : "look_down_slopes", - "802804f4" : "pan_ahead_of_player", - "802806a4" : "find_in_bounds_yaw_wdw_bob_thi", - "80280810" : "update_radial_camera", - "80280970" : "update_8_directions_camera", - "80280b00" : "radial_camera_move", - "80281188" : "lakitu_zoom", - "802813bc" : "radial_camera_input_default", - "802813ec" : "update_yaw_and_dist_from_c_up", - "8028146c" : "mode_radial_camera", - "80281588" : "mode_8_directions_camera", - "802816a0" : "update_outward_radial_camera", - "802817fc" : "mode_outward_radial_camera", - "80281904" : "update_parallel_tracking_camera", - "80282280" : "update_fixed_camera", - "802826a0" : "update_boss_fight_camera", - "80282c0c" : "unused_update_mode_5_camera", - "80282c28" : "unused_80282678", - "80282c3c" : "mode_boss_fight_camera", - "80282c7c" : "mode_parallel_tracking_camera", - "80282ce0" : "mode_fixed_camera", - "80282d78" : "update_behind_mario_camera", - "80283340" : "mode_behind_mario", - "80283578" : "update_slide_camera", - "802839e4" : "mode_behind_mario_camera", - "80283a18" : "nop_update_water_camera", - "80283a34" : "mode_water_surface_camera", - "80283a68" : "update_mario_camera", - "80283af8" : "update_default_camera", - "80284cb8" : "mode_default_camera", - "80284cfc" : "mode_lakitu_camera", - "80284d38" : "mode_mario_camera", - "80284d74" : "update_spiral_stairs_camera", - "802850ac" : "mode_spiral_stairs_camera", - "802850ec" : "update_slide_or_0f_camera", - "802851dc" : "mode_slide_camera", - "8028526c" : "store_lakitu_cam_info_for_c_up", - "802852f4" : "set_mode_c_up", - "80285370" : "exit_c_up", - "80285808" : "update_c_up", - "802858a4" : "move_mario_head_c_up", - "80285a2c" : "move_into_c_up", - "80285d20" : "mode_c_up_camera", - "80285ed8" : "update_in_cannon", - "80285f60" : "mode_cannon_camera", - "8028603c" : "transition_next_state", - "80286088" : "transition_to_camera_mode", - "80286188" : "set_camera_mode", - "80286420" : "update_lakitu", - "802868f8" : "update_camera", - "80286f68" : "reset_camera", - "8028724c" : "init_camera", - "802879ec" : "zoom_out_if_paused_and_outside", - "80287bc4" : "select_mario_cam_mode", - "80287be0" : "create_camera", - "80287cb8" : "update_graph_node_camera", - "80287d30" : "geo_camera_main", - "80287dc0" : "dummy_802877D8", - "80287dd4" : "dummy_802877EC", - "80287de8" : "vec3f_sub", - "80287e28" : "object_pos_to_vec3f", - "80287e50" : "vec3f_to_object_pos", - "80287e78" : "unused_object_angle_to_vec3s", - "80287ea0" : "evaluate_cubic_spline", - "802882e4" : "move_point_along_spline", - "80288624" : "cam_select_alt_mode", - "80288718" : "set_cam_angle", - "80288888" : "set_handheld_shake", - "802889b0" : "shake_camera_handheld", - "80288ce4" : "find_c_buttons_pressed", - "80288e68" : "update_camera_hud_status", - "80288f5c" : "collide_with_walls", - "80289198" : "vec3f_compare", - "80289214" : "clamp_pitch", - "802892d8" : "is_within_100_units_of_mario", - "8028935c" : "set_or_approach_f32_asymptotic", - "802893f4" : "approach_f32_asymptotic_bool", - "80289488" : "approach_f32_asymptotic", - "802894b4" : "approach_s16_asymptotic_bool", - "8028956c" : "approach_s16_asymptotic", - "80289610" : "approach_vec3f_asymptotic", - "80289684" : "set_or_approach_vec3f_asymptotic", - "802896f8" : "approach_vec3s_asymptotic", - "8028976c" : "camera_approach_s16_symmetric_bool", - "8028984c" : "camera_approach_s16_symmetric", - "8028993c" : "set_or_approach_s16_symmetric", - "802899cc" : "camera_approach_f32_symmetric_bool", - "80289b0c" : "camera_approach_f32_symmetric", - "80289c00" : "random_vec3s", - "80289d20" : "reduce_by_dist_from_camera", - "80289f88" : "clamp_positions_and_find_yaw", - "8028a080" : "calc_avoid_yaw", - "8028a0f4" : "is_surf_within_bounding_box", - "8028a4ec" : "is_behind_surface", - "8028a6bc" : "is_range_behind_surface", - "8028a7ec" : "is_mario_behind_surface", - "8028a834" : "scale_along_line", - "8028a8e8" : "is_pos_in_bounds", - "8028aa28" : "calculate_pitch", - "8028aad8" : "calculate_yaw", - "8028ab60" : "calculate_angles", - "8028ac28" : "calc_abs_dist", - "8028accc" : "calc_hor_dist", - "8028ad4c" : "rotate_in_xz", - "8028ae1c" : "rotate_in_yz", - "8028aef0" : "set_camera_pitch_shake", - "8028af4c" : "set_camera_yaw_shake", - "8028b00c" : "set_camera_roll_shake", - "8028b068" : "set_pitch_shake_from_point", - "8028b11c" : "set_yaw_shake_from_point", - "8028b1d0" : "increment_shake_offset", - "8028b218" : "shake_camera_pitch", - "8028b32c" : "shake_camera_yaw", - "8028b438" : "shake_camera_roll", - "8028b50c" : "offset_yaw_outward_radial", - "8028b724" : "cutscene_intro_peach_play_message_music", - "8028b754" : "cutscene_intro_peach_play_lakitu_flying_music", - "8028b784" : "play_camera_buzz_if_cdown", - "8028b7c4" : "play_camera_buzz_if_cbutton", - "8028b804" : "play_camera_buzz_if_c_sideways", - "8028b850" : "play_sound_cbutton_up", - "8028b884" : "play_sound_cbutton_down", - "8028b8b8" : "play_sound_cbutton_side", - "8028b8ec" : "play_sound_button_change_blocked", - "8028b920" : "play_sound_rbutton_changed", - "8028b954" : "play_sound_if_cam_switched_to_lakitu_or_mario", - "8028b9c4" : "radial_camera_input", - "8028bd34" : "trigger_cutscene_dialog", - "8028bd98" : "handle_c_button_movement", - "8028c038" : "clear_cutscene_vars", - "8028c13c" : "start_cutscene", - "8028c18c" : "determine_dance_cutscene", - "8028c26c" : "open_door_cutscene", - "8028c2c8" : "get_cutscene_from_mario_status", - "8028c7a0" : "warp_camera", - "8028c8f0" : "approach_camera_height", - "8028c9ac" : "unused_8028C3AC", - "8028c9cc" : "set_focus_rel_mario", - "8028cbf0" : "offset_rotated", - "8028cd94" : "offset_rotated_coords", - "8028cdec" : "determine_pushing_or_pulling_door", - "8028ce24" : "next_lakitu_state", - "8028d44c" : "set_camera_mode_fixed", - "8028d5ac" : "set_camera_mode_8_directions", - "8028d5fc" : "set_camera_mode_boss_fight", - "8028d658" : "set_camera_mode_close_cam", - "8028d698" : "set_camera_mode_radial", - "8028d79c" : "parallel_tracking_init", - "8028d888" : "set_fixed_cam_axis_sa_lobby", - "8028d92c" : "check_blocking_area_processing", - "8028da18" : "cam_rr_exit_building_side", - "8028da50" : "cam_rr_exit_building_top", - "8028daec" : "cam_rr_enter_building_window", - "8028db38" : "cam_rr_enter_building", - "8028dbb4" : "cam_rr_enter_building_side", - "8028dbf4" : "cam_cotmc_exit_waterfall", - "8028dc1c" : "cam_sl_snowman_head_8dir", - "8028dc70" : "cam_sl_free_roam", - "8028dca4" : "move_camera_through_floor_while_descending", - "8028dd48" : "cam_hmc_enter_maze", - "8028de2c" : "cam_hmc_elevator_black_hole", - "8028de5c" : "cam_hmc_elevator_maze_emergency_exit", - "8028de90" : "cam_hmc_elevator_lake", - "8028dec4" : "cam_hmc_elevator_maze", - "8028def8" : "cam_ssl_enter_pyramid_top", - "8028df24" : "cam_ssl_pyramid_center", - "8028df6c" : "cam_ssl_boss_room", - "8028dfb4" : "cam_thi_move_cam_through_tunnel", - "8028dfe8" : "cam_thi_look_through_tunnel", - "8028e01c" : "cam_bob_tower", - "8028e064" : "cam_bob_default_free_roam", - "8028e098" : "cam_castle_hmc_start_pool_cutscene", - "8028e0ec" : "cam_castle_lobby_entrance", - "8028e164" : "cam_castle_look_upstairs", - "8028e210" : "cam_castle_basement_look_downstairs", - "8028e298" : "cam_castle_enter_lobby", - "8028e300" : "cam_castle_enter_spiral_stairs", - "8028e38c" : "cam_castle_close_mode", - "8028e3b8" : "cam_castle_leave_lobby_sliding_door", - "8028e3f0" : "cam_castle_enter_lobby_sliding_door", - "8028e41c" : "cam_bbh_room_6", - "8028e450" : "cam_bbh_fall_off_roof", - "8028e47c" : "cam_bbh_fall_into_pool", - "8028e524" : "cam_bbh_room_1", - "8028e55c" : "cam_bbh_leave_front_door", - "8028e594" : "cam_bbh_room_2_lower", - "8028e5cc" : "cam_bbh_room_4", - "8028e604" : "cam_bbh_room_8", - "8028e63c" : "cam_bbh_room_5_library", - "8028e674" : "cam_bbh_room_5_library_to_hidden_transition", - "8028e6c4" : "cam_bbh_room_5_hidden_to_library_transition", - "8028e714" : "cam_bbh_room_5_hidden", - "8028e758" : "cam_bbh_room_3", - "8028e790" : "cam_bbh_room_7_mr_i", - "8028e7c8" : "cam_bbh_room_7_mr_i_to_coffins_transition", - "8028e818" : "cam_bbh_room_7_coffins_to_mr_i_transition", - "8028e868" : "cam_bbh_elevator_room_lower", - "8028e8a0" : "cam_bbh_room_0_back_entrance", - "8028e8cc" : "cam_bbh_elevator", - "8028e930" : "cam_bbh_room_12_upper", - "8028e974" : "cam_bbh_enter_front_door", - "8028e9a0" : "cam_bbh_room_2_library", - "8028e9d8" : "cam_bbh_room_2_library_to_trapdoor_transition", - "8028ea28" : "cam_bbh_room_2_trapdoor", - "8028ea60" : "cam_bbh_room_2_trapdoor_transition", - "8028eab0" : "cam_bbh_room_9_attic", - "8028eae8" : "cam_bbh_room_9_attic_transition", - "8028eb38" : "cam_bbh_room_9_mr_i_transition", - "8028eb88" : "cam_bbh_room_13_balcony", - "8028ebc0" : "cam_bbh_room_0", - "8028ec04" : "cam_ccm_enter_slide_shortcut", - "8028ec2c" : "cam_ccm_leave_slide_shortcut", - "8028ec58" : "surface_type_modes", - "8028ed30" : "set_mode_if_not_set_by_surface", - "8028ed98" : "surface_type_modes_thi", - "8028eeb0" : "camera_course_processing", - "8028f670" : "resolve_geometry_collisions", - "8028f914" : "rotate_camera_around_walls", - "8028fc9c" : "find_mario_floor_and_ceil", - "8028fe24" : "start_object_cutscene", - "8028fe58" : "start_object_cutscene_without_focus", - "8028fe84" : "unused_dialog_cutscene_response", - "8028ff04" : "cutscene_object_with_dialog", - "8028ffc8" : "cutscene_object_without_dialog", - "8029000c" : "cutscene_object", - "80290098" : "update_camera_yaw", - "802900e0" : "cutscene_reset_spline", - "80290104" : "stop_cutscene_and_retrieve_stored_info", - "80290168" : "cap_switch_save", - "802901a4" : "init_spline_point", - "802901fc" : "copy_spline_segment", - "802903b8" : "cutscene_common_set_dialog_state", - "802904a8" : "cutscene_intro_peach_start_letter_music", - "802904e4" : "cutscene_intro_peach_start_flying_music", - "8029051c" : "reset_pan_distance", - "8029053c" : "player2_rotate_cam", - "80290784" : "store_info_cannon", - "802907f4" : "retrieve_info_cannon", - "80290864" : "store_info_star", - "802908e8" : "retrieve_info_star", - "802909d0" : "pan_camera", - "80290a5c" : "cutscene_shake_explosion", - "80290abc" : "rotate_and_move_vec3f", - "80290b54" : "set_flag_post_door", - "80290ba4" : "cutscene_soften_music", - "80290bd8" : "cutscene_unsoften_music", - "80290c08" : "unused_802905C8", - "80290c1c" : "cutscene_unused_start", - "80290c30" : "cutscene_unused_loop", - "80290c44" : "cutscene_ending_mario_fall_start", - "80290c9c" : "cutscene_ending_mario_fall_focus_mario", - "80290d90" : "cutscene_ending_mario_fall", - "80290e00" : "cutscene_ending_mario_land_closeup", - "80290e74" : "cutscene_ending_reset_spline", - "80290eb0" : "cutscene_ending_fly_up_to_window", - "80290f1c" : "cutscene_ending_stars_free_peach", - "80290f8c" : "cutscene_ending_mario_land", - "80291074" : "cutscene_ending_peach_appear_closeup", - "80291108" : "cutscene_ending_peach_appears", - "802911c8" : "cutscene_ending_peach_descends_start", - "80291208" : "cutscene_ending_follow_peach_descent", - "8029127c" : "cutscene_ending_peach_descent_lower_focus", - "802912b8" : "cutscene_ending_peach_descent_back_to_mario", - "80291354" : "cutscene_ending_peach_descends", - "8029142c" : "cutscene_ending_mario_to_peach", - "802914cc" : "cutscene_ending_look_up_at_castle", - "80291514" : "cutscene_ending_peach_wakeup", - "802915d4" : "cutscene_ending_dialog", - "80291654" : "cutscene_ending_kiss_closeup", - "802916b8" : "cutscene_ending_kiss_here_we_go", - "80291774" : "cutscene_ending_kiss", - "802917e4" : "cutscene_ending_look_at_sky", - "8029184c" : "cutscene_ending_zoom_fov", - "80291870" : "cutscene_ending_cake_for_mario", - "80291924" : "cutscene_ending_stop", - "80291964" : "cutscene_grand_star_start", - "802919dc" : "cutscene_grand_star_front_of_mario", - "80291ab4" : "cutscene_grand_star_mario_jump", - "80291b18" : "cutscene_grand_star_accel_cvar2", - "80291b68" : "cutscene_grand_star_approach_mario", - "80291bf4" : "cutscene_grand_star_move_cvar2", - "80291c3c" : "cutscene_grand_star_focus_mario", - "80291cd0" : "cutscene_grand_star", - "80291db0" : "cutscene_grand_star_fly_start", - "80291e84" : "cutscene_grand_star_fly_move_to_mario", - "80291f18" : "cutscene_grand_star_fly_mario_offscreen", - "80292038" : "cutscene_grand_star_fly_app_cvars", - "80292164" : "cutscene_grand_star_fly", - "802921fc" : "focus_in_front_of_mario", - "8029228c" : "cutscene_dance_move_to_mario", - "80292324" : "cutscene_dance_rotate", - "80292370" : "cutscene_dance_rotate_move_back", - "802923b8" : "cutscene_dance_rotate_move_towards_mario", - "80292400" : "cutscene_dance_unused", - "80292414" : "cutscene_dance_default_focus_mario", - "8029244c" : "cutscene_dance_rotate_focus_mario", - "80292484" : "cutscene_dance_shake_fov", - "802924b8" : "cutscene_dance_default_rotate", - "80292628" : "star_dance_bound_yaw", - "802926dc" : "cutscene_dance_closeup_start", - "802927d0" : "cutscene_dance_closeup_focus_mario", - "80292868" : "cutscene_dance_closeup_fly_above", - "80292974" : "cutscene_dance_closeup_fly_closer", - "80292a20" : "cutscene_dance_closeup_zoom", - "80292a4c" : "cutscene_dance_closeup_shake_fov", - "80292a80" : "cutscene_dance_closeup", - "80292c00" : "cutscene_dance_fly_away_start", - "80292d80" : "cutscene_dance_fly_away_approach_mario", - "80292e2c" : "cutscene_dance_fly_away_focus_mario", - "80292ec4" : "cutscene_pan_cvar9", - "80292f40" : "cutscene_dance_fly_rotate_around_mario", - "80292f98" : "cutscene_dance_fly_away_rotate_while_flying", - "80292fe4" : "cutscene_dance_fly_away_shake_fov", - "80293018" : "cutscene_dance_fly_away", - "802930f0" : "cutscene_key_dance_jump_cvar", - "80293164" : "cutscene_key_dance_jump_closeup", - "802931c0" : "cutscene_key_dance_jump_lower_left", - "80293220" : "cutscene_key_dance_jump_above", - "8029328c" : "cutscene_key_dance_jump_last", - "802932f4" : "cutscene_key_dance_shake_fov", - "80293328" : "cutscene_key_dance_handheld_shake", - "80293354" : "cutscene_key_dance_focus_mario", - "8029338c" : "cutscene_key_dance", - "80293488" : "cutscene_bowser_area_shake_fov", - "802934b4" : "cutscene_bowser_area_start_bowser_walking", - "802934d8" : "cutscene_bowser_arena_set_pos", - "80293548" : "cutscene_bowser_arena_focus_sine", - "802935e0" : "cutscene_bowser_arena_set_focus", - "80293624" : "cutscene_bowser_arena_adjust_offsets", - "8029369c" : "cutscene_bowser_arena_pan_left", - "802936dc" : "cutscene_bowser_arena_mario_dialog", - "80293708" : "cutscene_stop_dialog", - "80293734" : "cutscene_bowser_arena_start", - "802937e8" : "bowser_fight_intro_dialog", - "8029386c" : "cutscene_bowser_arena_dialog", - "802938c8" : "cutscene_bowser_arena_end", - "80293944" : "cutscene_bowser_arena", - "80293abc" : "cutscene_star_spawn_store_info", - "80293ae8" : "cutscene_star_spawn_focus_star", - "80293b70" : "cutscene_star_spawn_update_boss_fight", - "80293bf4" : "cutscene_star_spawn_fly_back", - "80293c2c" : "cutscene_star_spawn", - "80293cb0" : "cutscene_star_spawn_back", - "80293d5c" : "cutscene_star_spawn_end", - "80293d90" : "cutscene_exit_waterfall_warp", - "80293dd4" : "cutscene_exit_to_castle_grounds_focus_mario", - "80293e7c" : "cutscene_exit_waterfall", - "80293ed8" : "cutscene_exit_to_castle_grounds_end", - "80293f2c" : "cutscene_exit_fall_to_castle_grounds_warp", - "80293f70" : "cutscene_exit_fall_to_castle_grounds", - "80293fcc" : "cutscene_red_coin_star_start", - "80294024" : "cutscene_red_coin_star_focus_xz", - "80294088" : "cutscene_red_coin_star_focus_y", - "802940cc" : "cutscene_red_coin_star_look_up_at_star", - "8029410c" : "cutscene_red_coin_star_warp", - "802942cc" : "cutscene_red_coin_star_set_fov", - "802942f0" : "cutscene_red_coin_star", - "802943d4" : "cutscene_red_coin_star_end", - "80294428" : "cutscene_goto_cvar_pos", - "80294718" : "cutscene_prepare_cannon_start", - "802947a4" : "cutscene_prepare_cannon_fly_to_cannon", - "8029480c" : "cannon_approach_prev", - "802948a0" : "cutscene_prepare_cannon_fly_back", - "80294a14" : "cutscene_prepare_cannon", - "80294a94" : "cutscene_prepare_cannon_end", - "80294ae8" : "water_death_move_to_mario_side", - "80294b78" : "death_goto_mario", - "80294bb4" : "cutscene_death_standing_start", - "80294c28" : "cutscene_death_standing_goto_mario", - "80294c5c" : "cutscene_death_standing", - "80294cc4" : "cutscene_death_stomach_start", - "80294d48" : "cutscene_death_stomach_goto_mario", - "80294db4" : "cutscene_death_stomach", - "80294e24" : "cutscene_bbh_death_start", - "80294ea8" : "cutscene_bbh_death_goto_mario", - "80294ee8" : "cutscene_bbh_death", - "80294f58" : "cutscene_quicksand_death_start", - "80294f94" : "cutscene_quicksand_death_goto_mario", - "80294fec" : "cutscene_quicksand_death", - "802950b0" : "cutscene_suffocation_fly_away", - "80295140" : "cutscene_suffocation_stay_above_gas", - "802951f0" : "cutscene_suffocation_rotate", - "80295270" : "cutscene_suffocation", - "80295310" : "cutscene_enter_pool_start", - "802953dc" : "cutscene_enter_pool_loop", - "80295418" : "cutscene_enter_pool", - "80295480" : "cutscene_pyramid_top_explode_start", - "802954ec" : "cutscene_pyramid_top_explode_zoom_in", - "80295518" : "cutscene_pyramid_top_explode_focus", - "80295580" : "cutscene_pyramid_top_explode_warp", - "80295670" : "cutscene_pyramid_top_explode_closeup", - "80295740" : "cutscene_pyramid_top_explode_cam_shake", - "8029576c" : "cutscene_pyramid_top_explode_warp_back", - "802957c8" : "cutscene_pyramid_top_explode", - "80295894" : "cutscene_pyramid_top_explode_end", - "802958d4" : "cutscene_enter_pyramid_top_start", - "80295930" : "cutscene_enter_pyramid_top", - "80295a58" : "cutscene_dialog_start", - "80295bf0" : "cutscene_dialog_move_mario_shoulder", - "80295e24" : "cutscene_dialog_create_dialog_box", - "80295e8c" : "cutscene_dialog", - "80295fb0" : "cutscene_dialog_set_flag", - "80295fd8" : "cutscene_dialog_end", - "80296020" : "cutscene_read_message_start", - "80296160" : "cutscene_read_message", - "802962c8" : "cutscene_read_message_set_flag", - "802962f0" : "cutscene_read_message_end", - "80296318" : "cutscene_exit_succ_start", - "802963b8" : "cutscene_non_painting_set_cam_pos", - "8029652c" : "cutscene_non_painting_set_cam_focus", - "8029665c" : "cutscene_exit_bowser_succ_focus_left", - "8029669c" : "cutscene_exit_bowser_key_toss_shake", - "802966e4" : "cutscene_exit_succ_shake_landing", - "80296710" : "cutscene_exit_bowser_succ", - "802967c4" : "cutscene_non_painting_end", - "8029685c" : "cutscene_exit_non_painting_succ_override_cvar", - "802968a0" : "cutscene_exit_non_painting_succ", - "8029695c" : "cutscene_non_painting_death_start", - "802969f8" : "cutscene_exit_bowser_death", - "80296a64" : "cutscene_non_painting_death_override_offset", - "80296b30" : "cutscene_non_painting_death", - "80296bc8" : "cutscene_cap_switch_press_start", - "80296c4c" : "cutscene_cap_switch_press_rotate_around_mario", - "80296d60" : "cutscene_cap_switch_press_lower_cam", - "80296da8" : "cutscene_cap_switch_press_approach_mario", - "80296eb4" : "cutscene_cap_switch_press_pan_left", - "80296f38" : "cutscene_cap_switch_press_create_dialog", - "80296fa8" : "cutscene_cap_switch_press", - "80297148" : "cutscene_unlock_key_door_start", - "8029720c" : "cutscene_unlock_key_door_approach_mario", - "80297290" : "cutscene_unlock_key_door_focus_lock", - "802972ec" : "cutscene_unlock_key_door_stub", - "80297300" : "cutscene_unlock_key_door_fly_back", - "80297384" : "cutscene_unlock_key_door_fov_shake", - "802973b0" : "cutscene_unlock_key_door", - "80297464" : "intro_peach_move_camera_start_to_pipe", - "80297560" : "peach_letter_text", - "8029758c" : "play_sound_peach_reading_letter", - "802975c4" : "cutscene_intro_peach_start_to_pipe_spline", - "8029762c" : "cutscene_intro_peach_dialog", - "802976bc" : "cutscene_intro_peach_follow_pipe_spline", - "80297728" : "cutscene_intro_peach_clear_cutscene_status", - "80297748" : "cutscene_intro_peach_zoom_fov", - "80297784" : "cutscene_intro_peach_reset_spline", - "802977c8" : "cutscene_intro_peach_handheld_shake_off", - "802977f4" : "intro_pipe_exit_text", - "80297820" : "play_sound_intro_turn_on_hud", - "8029784c" : "cutscene_intro_peach_fly_to_pipe", - "80297908" : "cutscene_intro_peach_mario_appears", - "80297a38" : "cutscene_intro_peach_reset_fov", - "80297a64" : "cutscene_intro_peach_letter", - "80297b58" : "cutscene_end_waving_start", - "80297b84" : "cutscene_end_waving", - "80297c14" : "cutscene_credits_reset_spline", - "80297c40" : "cutscene_credits", - "802980dc" : "cutscene_sliding_doors_open_start", - "8029819c" : "cutscene_sliding_doors_open_set_cvars", - "80298218" : "cutscene_sliding_doors_go_under_doorway", - "80298254" : "cutscene_sliding_doors_fly_back_up", - "80298290" : "cutscene_sliding_doors_follow_mario", - "802983b4" : "cutscene_sliding_doors_open", - "80298458" : "cutscene_double_doors_end", - "802984a0" : "cutscene_enter_painting_stub", - "802984b4" : "cutscene_enter_painting", - "802987b0" : "cutscene_exit_painting_start", - "8029894c" : "cutscene_exit_painting_move_to_mario", - "802989e8" : "cutscene_exit_painting_move_to_floor", - "80298af8" : "cutscene_exit_painting", - "80298ba0" : "cutscene_unused_exit_start", - "80298c2c" : "cutscene_unused_exit_focus_mario", - "80298ccc" : "cutscene_exit_painting_end", - "80298d44" : "cutscene_enter_cannon_end", - "80298d9c" : "cutscene_enter_cannon_raise", - "80298fe8" : "cutscene_enter_cannon_start", - "80299100" : "cutscene_door_start", - "80299154" : "cutscene_door_fix_cam", - "802991a8" : "cutscene_door_loop", - "802991f0" : "cutscene_door_move_behind_mario", - "802992cc" : "cutscene_door_follow_mario", - "80299360" : "cutscene_door_end", - "80299404" : "cutscene_door_mode", - "802994e8" : "play_cutscene", - "8029a2f8" : "cutscene_event", - "8029a37c" : "cutscene_spawn_obj", - "8029a3b4" : "set_fov_shake", - "8029a41c" : "set_fov_shake_from_point", - "8029a4d0" : "shake_camera_fov", - "8029a5e8" : "set_fov_30", - "8029a60c" : "approach_fov_20", - "8029a64c" : "set_fov_45", - "8029a670" : "set_fov_29", - "8029a694" : "zoom_fov_30", - "8029a6f4" : "fov_default", - "8029a858" : "approach_fov_30", - "8029a894" : "approach_fov_60", - "8029a8d0" : "approach_fov_45", - "8029a968" : "approach_fov_80", - "8029a9a4" : "set_fov_bbh", - "8029aa3c" : "geo_camera_fov", - "8029ab94" : "set_fov_function", - "8029abb0" : "cutscene_set_fov_shake_preset", - "8029ac30" : "set_fov_shake_from_point_preset", - "8029aef8" : "obj_rotate_towards_point", - "8029af98" : "intro_peach_set_pos_and_opacity", - "8029b08c" : "bhv_intro_peach_loop", - "8029b28c" : "intro_lakitu_set_offset_from_camera", - "8029b358" : "intro_lakitu_set_focus", - "8029b3c8" : "intro_lakitu_set_pos_and_focus", - "8029b49c" : "bhv_intro_lakitu_loop", - "8029bde4" : "bhv_end_birds_1_loop", - "8029bf64" : "bhv_end_birds_2_loop", - "8029c0e4" : "func_8029B964", - "8029c254" : "bhv_intro_scene_loop", - "8029c770" : "nop_change_course", - "8029c780" : "copy_mario_state_to_object", - "8029c9cc" : "spawn_particle", - "8029ca58" : "bhv_mario_update", - "8029cb34" : "update_objects_starting_at", - "8029cbc8" : "update_objects_during_time_stop", - "8029cd28" : "update_objects_in_list", - "8029cd98" : "unload_deactivated_objects_in_list", - "8029ce58" : "set_object_respawn_info_bits", - "8029cedc" : "unload_objects_from_area", - "8029cfb0" : "spawn_objects_from_info", - "8029d1d8" : "stub_8029CA50", - "8029d1e8" : "clear_objects", - "8029d324" : "update_terrain_objects", - "8029d374" : "update_non_terrain_objects", - "8029d428" : "unload_deactivated_objects", - "8029d690" : "update_objects", - "8029d890" : "Geo18_8029D890", - "8029d924" : "Geo18_8029D924", - "8029db48" : "geo_switch_anim_state", - "8029dbd4" : "geo_switch_area", - "8029dcd4" : "func_8029D558", - "8029dda8" : "apply_object_scale_to_matrix", - "8029de80" : "func_8029D704", - "8029e1b0" : "set_object_held_state", - "8029e27c" : "lateral_dist_between_objects", - "8029e2f8" : "dist_between_objects", - "8029e398" : "obj_forward_vel_approach_upward", - "8029e3e8" : "approach_f32_signed", - "8029e494" : "approach_f32_symmetric", - "8029e530" : "approach_s16_symmetric", - "8029e5ec" : "obj_rotate_yaw_toward", - "8029e694" : "angle_to_object", - "8029e714" : "obj_turn_toward_object", - "8029e8bc" : "set_object_parent_relative_pos", - "8029e914" : "set_object_pos", - "8029e96c" : "set_object_angle", - "8029e9ac" : "spawn_object_abs_with_rot", - "8029ea24" : "spawn_object_rel_with_rot", - "8029eaac" : "Unknown8029E330", - "8029eb04" : "spawn_water_splash", - "8029ed20" : "spawn_object_at_origin", - "8029edcc" : "spawn_object", - "8029ee24" : "try_to_spawn_object", - "8029eeb8" : "spawn_object_with_scale", - "8029ef64" : "spawn_object_relative", - "8029effc" : "spawn_object_relative_with_scale", - "8029f070" : "obj_move_using_vel", - "8029f0c8" : "copy_object_graph_y_offset", - "8029f0e0" : "copy_object_pos_and_angle", - "8029f120" : "copy_object_pos", - "8029f148" : "copy_object_angle", - "8029f188" : "func_8029EA0C", - "8029f1b0" : "Unknown8029EA34", - "8029f200" : "linear_mtxf_mul_vec3f", - "8029f274" : "linear_mtxf_transpose_mul_vec3f", - "8029f2ec" : "apply_scale_to_object_transform", - "8029f3a8" : "copy_object_scale", - "8029f3d0" : "scale_object_xyz", - "8029f404" : "scale_object", - "8029f430" : "obj_scale", - "8029f464" : "SetObjAnimation", - "8029f4b4" : "set_obj_animation_and_sound_state", - "8029f514" : "func_8029ED98", - "8029f59c" : "func_8029EE20", - "8029f600" : "obj_enable_rendering_and_become_tangible", - "8029f620" : "obj_enable_rendering", - "8029f644" : "obj_disable_rendering_and_become_intangible", - "8029f66c" : "obj_disable_rendering", - "8029f694" : "obj_unhide", - "8029f6bc" : "obj_hide", - "8029f6e0" : "obj_set_pos_relative", - "8029f7d8" : "obj_set_pos_relative_to_parent", - "8029f820" : "obj_enable_rendering_2", - "8029f848" : "obj_unused_init_on_floor", - "8029f8ec" : "obj_set_facing_to_move_angles", - "8029f914" : "get_object_list_from_behavior", - "8029f95c" : "obj_nearest_object_with_behavior", - "8029f998" : "obj_dist_to_nearest_object_with_behavior", - "8029f9ec" : "obj_find_nearest_object_with_behavior", - "8029fb1c" : "find_unimportant_object", - "8029fb68" : "count_unimportant_objects", - "8029fbdc" : "count_objects_with_behavior", - "8029fc9c" : "obj_find_nearby_held_actor", - "8029fdb4" : "obj_change_action", - "8029fe00" : "func_8029F684", - "8029fe6c" : "func_8029F6F0", - "8029fea4" : "func_8029F728", - "8029ff04" : "func_8029F788", - "8029ffa4" : "func_8029F828", - "802a0008" : "obj_check_anim_frame", - "802a0050" : "obj_check_anim_frame_in_range", - "802a00ac" : "Unknown8029F930", - "802a0114" : "mario_is_in_air_action", - "802a0154" : "mario_is_dive_sliding", - "802a0198" : "func_8029FA1C", - "802a01d8" : "func_8029FA5C", - "802a0380" : "obj_get_thrown_or_placed", - "802a0474" : "obj_get_dropped", - "802a04c0" : "obj_set_model", - "802a04f0" : "mario_set_flag", - "802a0514" : "obj_clear_interact_status_flag", - "802a0568" : "mark_object_for_deletion", - "802a057c" : "obj_disable", - "802a05b4" : "obj_become_intangible", - "802a05d4" : "obj_become_tangible", - "802a05f0" : "make_object_tangible", - "802a0604" : "obj_update_floor_height", - "802a064c" : "obj_update_floor_height_and_get_floor", - "802a079c" : "obj_apply_drag_xz", - "802a0e68" : "obj_move_y", - "802a113c" : "obj_unused_resolve_wall_collisions", - "802a11a8" : "abs_angle_diff", - "802a120c" : "obj_move_xz_using_fvel_and_yaw", - "802a12a4" : "obj_move_y_with_terminal_vel", - "802a1308" : "obj_compute_vel_xz", - "802a1370" : "func_802A0BF4", - "802a1424" : "are_objects_collided", - "802a148c" : "obj_set_behavior", - "802a14c4" : "set_object_behavior", - "802a14fc" : "obj_has_behavior", - "802a1554" : "object_has_behavior", - "802a15ac" : "obj_lateral_dist_from_mario_to_home", - "802a1634" : "obj_lateral_dist_to_home", - "802a16ac" : "obj_outside_home_square", - "802a1774" : "obj_outside_home_rectangle", - "802a184c" : "obj_set_pos_to_home", - "802a188c" : "obj_set_pos_to_home_and_stop", - "802a18dc" : "obj_shake_y", - "802a1930" : "obj_start_cam_event", - "802a1960" : "Unknown802A11E4", - "802a19ac" : "obj_set_billboard", - "802a19c8" : "obj_set_hitbox_radius_and_height", - "802a19f0" : "obj_set_hurtbox_radius_and_height", - "802a1b34" : "spawn_object_loot_blue_coins", - "802a1b8c" : "spawn_object_loot_yellow_coins", - "802a1bdc" : "obj_spawn_loot_coin_at_mario_pos", - "802a1c68" : "obj_abs_y_dist_to_home", - "802a1cc4" : "Unknown802A1548", - "802a1f3c" : "obj_resolve_wall_collisions", - "802a2320" : "obj_update_floor_and_walls", - "802a2348" : "obj_move_standard", - "802a25b4" : "obj_move_using_vel_and_gravity", - "802a2644" : "obj_move_using_fvel_and_gravity", - "802a2674" : "set_object_pos_relative", - "802a2748" : "obj_angle_to_home", - "802a27b0" : "func_802A2008", - "802a2804" : "translate_object_local", - "802a2930" : "build_object_transform_from_pos_and_angle", - "802a2a18" : "func_802A2270", - "802a2a84" : "build_object_transform_relative_to_parent", - "802a2b28" : "Unknown802A2380", - "802a2b6c" : "obj_rotate_move_angle_using_vel", - "802a2bc4" : "obj_rotate_face_angle_using_vel", - "802a2c1c" : "obj_set_face_angle_to_move_angle", - "802a2c5c" : "obj_follow_path", - "802a2ed4" : "chain_segment_init", - "802a2f14" : "random_f32_around_zero", - "802a2f5c" : "scale_object_random", - "802a2fc0" : "translate_object_xyz_random", - "802a308c" : "translate_object_xz_random", - "802a31e0" : "func_802A2A38", - "802a3268" : "obj_reflect_move_angle_off_wall", - "802a32ac" : "obj_spawn_particles", - "802a34a4" : "set_object_hitbox", - "802a3604" : "signum_positive", - "802a3634" : "absf", - "802a3674" : "absi", - "802a36a4" : "obj_wait_then_blink", - "802a3754" : "obj_is_mario_ground_pounding_platform", - "802a37ac" : "func_802A3004", - "802a37dc" : "func_802A3034", - "802a3818" : "obj_push_mario_away", - "802a390c" : "obj_push_mario_away_from_cylinder", - "802a399c" : "BehDustSmokeLoop", - "802a3a4c" : "func_802A32A4", - "802a3a88" : "func_802A32E0", - "802a3b40" : "func_802A3398", - "802a3c18" : "func_802A3470", - "802a3cfc" : "obj_is_mario_on_platform", - "802a3d40" : "obj_shake_y_until", - "802a3dd4" : "func_802A362C", - "802a3e30" : "obj_call_action_function", - "802a3ef8" : "Unknown802A3750", - "802a3f24" : "func_802A377C", - "802a3f48" : "obj_mario_far_away", - "802a404c" : "obj_is_mario_moving_fast_or_in_air", - "802a40b8" : "item_in_array", - "802a4120" : "bhv_init_room", - "802a4210" : "obj_enable_rendering_if_mario_in_room", - "802a4360" : "obj_set_hitbox_and_die_if_attacked", - "802a4440" : "func_802A3C98", - "802a44f4" : "set_object_collision_data", - "802a452c" : "obj_if_hit_wall_bounce_away", - "802a4564" : "obj_hide_if_mario_far_away_y", - "802a45e4" : "Geo18_802A45E4", - "802a462c" : "Unknown802A3E84", - "802a46cc" : "obj_is_hidden", - "802a4704" : "enable_time_stop", - "802a4728" : "disable_time_stop", - "802a4750" : "set_time_stop_flags", - "802a4774" : "clear_time_stop_flags", - "802a47a0" : "func_802A3FF8", - "802a48bc" : "obj_is_mario_in_range_and_ready_to_speak", - "802a4960" : "obj_update_dialog", - "802a4be4" : "obj_update_dialog_with_cutscene", - "802a4f04" : "obj_has_model", - "802a4f58" : "obj_align_gfx_with_floor", - "802a5034" : "mario_is_within_rectangle", - "802a50fc" : "ShakeScreen", - "802a513c" : "attack_collided_non_mario_object", - "802a51ac" : "obj_was_attacked_or_ground_pounded", - "802a5228" : "copy_object_behavior_params", - "802a5248" : "func_802A4A70", - "802a5288" : "func_802A4AB0", - "802a52c4" : "func_802A4AEC", - "802a52f8" : "obj_check_grabbed_mario", - "802a5358" : "player_performed_grab_escape_action", - "802a540c" : "obj_unused_play_footstep_sound", - "802a5460" : "enable_time_stop_including_mario", - "802a5498" : "disable_time_stop_including_mario", - "802a54d8" : "obj_check_interacted", - "802a5524" : "obj_spawn_loot_blue_coin", - "802a5588" : "obj_spawn_star_at_y_offset", - "802a5620" : "func_802A4DB0", - "802a56bc" : "bhv_star_door_loop", - "802a58dc" : "bhv_piranha_particle_loop", - "802a597c" : "ActionMrIParticle0", - "802a5a44" : "ActionMrIParticle1", - "802a5aa0" : "bhv_mr_i_particle_loop", - "802a5acc" : "func_802A525C", - "802a5bd4" : "bhv_mr_i_body_loop", - "802a5d4c" : "ActionMrI3", - "802a6518" : "ActionMrI2", - "802a68a0" : "ActionMrI1", - "802a6ad8" : "ActionMrI0", - "802a6b7c" : "bhv_mr_i_loop", - "802a6c20" : "bhv_pole_init", - "802a6c74" : "bhv_giant_pole_loop", - "802a6cf4" : "bhv_thi_huge_island_top_loop", - "802a6d64" : "bhv_thi_tiny_island_top_loop", - "802a6ee4" : "ActionActivateCapSwitch0", - "802a7020" : "ActionActivateCapSwitch1", - "802a708c" : "ActionActivateCapSwitch2", - "802a7160" : "ActionActivateCapSwitch3", - "802a7170" : "bhv_cap_switch_loop", - "802a719c" : "Geo18_802A719C", - "802a7230" : "bhv_bobomb_anchor_mario_loop", - "802a7264" : "ActionKingBobomb0", - "802a7384" : "func_802A6AF8", - "802a73d8" : "ActionKingBobomb2", - "802a7598" : "ActionKingBobomb3", - "802a7804" : "ActionKingBobomb1", - "802a78d8" : "ActionKingBobomb6", - "802a7a60" : "ActionKingBobomb7", - "802a7b1c" : "ActionKingBobomb8", - "802a7b5c" : "ActionKingBobomb4", - "802a7d14" : "ActionKingBobomb5", - "802a7fbc" : "func_802A7748", - "802a8064" : "bhv_king_bobomb_loop", - "802a816c" : "bhv_beta_chest_bottom_init", - "802a81e8" : "bhv_beta_chest_bottom_loop", - "802a821c" : "bhv_beta_chest_lid_loop", - "802a8370" : "bhv_water_air_bubble_init", - "802a83a0" : "bhv_water_air_bubble_loop", - "802a8630" : "bhv_bubble_wave_init", - "802a86bc" : "Unknown802A7E48", - "802a870c" : "bhv_bubble_maybe_loop", - "802a88a4" : "bhv_small_water_wave_loop", - "802a8a38" : "func_802A81C4", - "802a8b18" : "bhv_particle_init", - "802a8bc0" : "bhv_particle_loop", - "802a8c88" : "bhv_small_bubbles_loop", - "802a8cdc" : "bhv_fish_group_loop", - "802a8d48" : "bhv_water_waves_init", - "802a8d98" : "bhv_cannon_base_unused_loop", - "802a8dc0" : "ActionOpenedCannon0", - "802a8f40" : "ActionOpenedCannon4", - "802a9114" : "ActionOpenedCannon6", - "802a92fc" : "ActionOpenedCannon5", - "802a93f8" : "ActionOpenedCannon1", - "802a9440" : "ActionOpenedCannon2", - "802a9460" : "ActionOpenedCannon3", - "802a9498" : "bhv_cannon_base_loop", - "802a94f8" : "bhv_cannon_barrel_loop", - "802a958c" : "func_802A8D18", - "802a9708" : "bhv_chuckya_anchor_mario_loop", - "802a973c" : "Unknown802A8EC8", - "802a98c4" : "func_802A9050", - "802a9994" : "ActionChuckya0", - "802a9d08" : "ActionChuckya1", - "802a9f54" : "ActionChuckya3", - "802a9fc8" : "ActionChuckya2", - "802aa02c" : "func_802A97B8", - "802aa0ac" : "bhv_chuckya_loop", - "802aa1b8" : "bhv_wf_breakable_wall_loop", - "802aa280" : "func_802A9A0C", - "802aa3c8" : "func_802A9B54", - "802aa3f4" : "bhv_kickable_board_loop", - "802aa700" : "bhv_tower_door_loop", - "802aa774" : "bhv_wf_rotating_wooden_platform_loop", - "802aa830" : "bhv_rotating_platform_loop", - "802aa948" : "func_802AA0D4", - "802aa97c" : "bhv_koopa_shell_underwater_loop", - "802aaa60" : "bhv_warp_loop", - "802aab54" : "BehFadingWarpLoop", - "802aac48" : "bhv_white_puff_exploding_loop", - "802aae8c" : "func_802AA618", - "802aaf48" : "bhv_spawned_star_init", - "802aaffc" : "func_802AA788", - "802ab060" : "func_802AA7EC", - "802ab158" : "func_802AA8E4", - "802ab18c" : "func_802AA918", - "802ab1c8" : "bhv_spawned_star_loop", - "802ab558" : "bhv_spawn_star_no_level_exit", - "802ab5c8" : "bhv_coin_sparkles_init", - "802ab650" : "bhv_yellow_coin_init", - "802ab70c" : "bhv_yellow_coin_loop", - "802ab748" : "bhv_temp_coin_loop", - "802ab7a4" : "bhv_coin_init", - "802ab860" : "bhv_coin_loop", - "802aba40" : "bhv_coin_formation_spawn_loop", - "802abc04" : "func_802AB364", - "802abee4" : "bhv_coin_formation_init", - "802abf0c" : "bhv_coin_formation_loop", - "802ac068" : "ActionCoinInsideBoo1", - "802ac15c" : "ActionCoinInsideBoo0", - "802ac294" : "bhv_coin_inside_boo_loop", - "802ac2c0" : "bhv_coin_sparkles_loop", - "802ac2ec" : "bhv_golden_coin_sparkles_loop", - "802ac3a8" : "bhv_punch_tiny_triangle_loop", - "802ac4a0" : "bhv_punch_tiny_triangle_init", - "802ac5b4" : "bhv_wall_tiny_star_particle_loop", - "802ac678" : "bhv_tiny_star_particles_init", - "802ac78c" : "bhv_pound_tiny_star_particle_loop", - "802ac864" : "bhv_pound_tiny_star_particle_init", - "802ac910" : "func_802AC070", - "802ac958" : "func_802AC0B8", - "802ac9d0" : "func_802AC130", - "802aca6c" : "func_802AC1CC", - "802acac8" : "bhv_door_loop", - "802acc3c" : "bhv_door_init", - "802ace80" : "bhv_star_door_loop_2", - "802ad078" : "ActionGrindelThwomp4", - "802ad10c" : "ActionGrindelThwomp2", - "802ad1a4" : "ActionGrindelThwomp3", - "802ad238" : "ActionGrindelThwomp1", - "802ad2d0" : "ActionGrindelThwomp0", - "802ad34c" : "bhv_grindel_thwomp_loop", - "802ad378" : "bhv_tumbling_bridge_platform_loop", - "802ad580" : "ActionTumblingBridge1", - "802ad76c" : "ActionTumblingBridge2", - "802ad7f4" : "ActionTumblingBridge3", - "802ad828" : "ActionTumblingBridge0", - "802ad890" : "bhv_tumbling_bridge_loop", - "802ad8bc" : "func_802AD01C", - "802ad8f0" : "ActionElevator0", - "802ada4c" : "ActionElevator1", - "802adb88" : "ActionElevator2", - "802adce4" : "ActionElevator4", - "802add70" : "ActionElevator3", - "802addf8" : "bhv_elevator_init", - "802adf6c" : "bhv_elevator_loop", - "802adf98" : "bhv_water_mist_spawn_loop", - "802adfd8" : "bhv_water_mist_loop", - "802ae0cc" : "spawn_triangle_break_particles", - "802ae238" : "bhv_water_mist_2_loop", - "802ae304" : "bhv_pound_white_puffs_init", - "802ae334" : "func_802ADA94", - "802ae360" : "bhv_unused_0e40_init", - "802ae394" : "Unknown802ADAF4", - "802ae45c" : "func_802ADBBC", - "802ae48c" : "bhv_ground_snow_init", - "802ae4c0" : "func_802ADC20", - "802ae534" : "bhv_wind_loop", - "802ae85c" : "bhv_unused_particle_spawn_loop", - "802ae908" : "bhv_ukiki_cage_star_loop", - "802aea6c" : "ukiki_cage_act_wait_for_ukiki", - "802aeab8" : "ukiki_cage_act_spin", - "802aeb1c" : "ukiki_cage_act_fall", - "802aeb74" : "ukiki_cage_act_hide", - "802aeb9c" : "bhv_ukiki_cage_loop", - "802aebc8" : "bhv_squishable_platform_loop", - "802aec40" : "bhv_bitfs_sinking_platform_loop", - "802aeca8" : "bhv_ddd_moving_pole_loop", - "802aecdc" : "bhv_bitfs_sinking_cage_platform_loop", - "802aedc0" : "bhv_beta_moving_flames_spawn_loop", - "802aeea4" : "bhv_beta_moving_flames_loop", - "802aef1c" : "bhv_flamethrower_flame_loop", - "802af1e8" : "bhv_flamethrower_loop", - "802af3fc" : "bhv_rr_rotating_bridge_platform_loop", - "802af448" : "bhv_bouncing_fireball_flame_loop", - "802af5f8" : "bhv_bouncing_fireball_loop", - "802af7c4" : "bhv_bowser_shock_wave_loop", - "802af9cc" : "bhv_black_smoke_upward_loop", - "802afa0c" : "bhv_black_smoke_bowser_loop", - "802afae4" : "bhv_black_smoke_mario_loop", - "802afbf8" : "bhv_flame_mario_loop", - "802afce4" : "bhv_beta_fish_splash_spawner_loop", - "802afd1c" : "bhv_spindrift_loop", - "802afee8" : "bhv_wf_solid_tower_platform_loop", - "802aff30" : "bhv_wf_elevator_tower_platform_loop", - "802b00e4" : "bhv_wf_sliding_tower_platform_loop", - "802b0244" : "func_802AF9A4", - "802b039c" : "func_802AFAFC", - "802b04b4" : "bhv_tower_platform_group_loop", - "802b0614" : "bhv_tree_snow_or_leaf_loop", - "802b0974" : "bhv_snow_leaf_particle_spawn_init", - "802b0b9c" : "func_802B02FC", - "802b0bec" : "bhv_squarish_path_moving_loop", - "802b0d48" : "bhv_piranha_plant_waking_bubbles_loop", - "802b0df0" : "bhv_piranha_plant_bubble_loop", - "802b1278" : "bhv_purple_switch_loop", - "802b14f4" : "func_802B0C54", - "802b15e8" : "bhv_pushable_loop", - "802b1714" : "func_802B0E74", - "802b17f4" : "func_802B0F54", - "802b19d8" : "func_802B1138", - "802b1ae0" : "bhv_hidden_object_loop", - "802b1b2c" : "bhv_breakable_box_loop", - "802b1bb0" : "Geo18_802B1BB0", - "802b1c54" : "bhv_heave_ho_throw_mario_loop", - "802b1d7c" : "ActionHeaveHo1", - "802b1e6c" : "ActionHeaveHo2", - "802b1ff4" : "ActionHeaveHo3", - "802b20a0" : "ActionHeaveHo0", - "802b2154" : "func_802B18B4", - "802b2278" : "bhv_heave_ho_loop", - "802b2340" : "bhv_ccm_touched_star_spawn_loop", - "802b23e0" : "bhv_unused_poundable_platform", - "802b2494" : "bhv_beta_trampoline_spring_loop", - "802b25ac" : "bhv_beta_trampoline_top_loop", - "802b26a4" : "ActionJumpingBox0", - "802b27d8" : "ActionJumpingBox1", - "802b2824" : "func_802B1F84", - "802b288c" : "bhv_jumping_box_loop", - "802b29b8" : "bhv_boo_cage_loop", - "802b2bc8" : "func_802B2328", - "802b2d10" : "bhv_alpha_boo_key_loop", - "802b3108" : "bhv_beta_boo_key_loop", - "802b3134" : "func_802B2894", - "802b3250" : "func_802B29B0", - "802b329c" : "bhv_grand_star_loop", - "802b3600" : "bhv_bowser_key_loop", - "802b37b8" : "bhv_white_puff_smoke_init", - "802b3810" : "bhv_bullet_bill_init", - "802b3830" : "ActionBulletBill0", - "802b38b8" : "ActionBulletBill1", - "802b394c" : "ActionBulletBill2", - "802b3b08" : "ActionBulletBill3", - "802b3b24" : "ActionBulletBill4", - "802b3be0" : "bhv_bullet_bill_loop", - "802b3c2c" : "ActionBowserTailAnchor0", - "802b3cdc" : "ActionBowserTailAnchor1", - "802b3d10" : "ActionBowserTailAnchor2", - "802b3d74" : "bhv_bowser_tail_anchor_loop", - "802b3df4" : "bhv_bowser_flame_spawn_loop", - "802b4080" : "bhv_bowser_body_anchor_loop", - "802b4184" : "func_802B38B4", - "802b41fc" : "func_802B392C", - "802b4288" : "func_802B39B8", - "802b4300" : "func_802B3A30", - "802b4368" : "func_802B3A98", - "802b43dc" : "func_802B3B0C", - "802b4478" : "ActionBowser5", - "802b44bc" : "ActionBowser6", - "802b45f4" : "func_802B3D24", - "802b473c" : "func_802B3E44", - "802b48d4" : "func_802B3FDC", - "802b4a1c" : "func_802B4124", - "802b4a3c" : "func_802B4144", - "802b4af4" : "func_u_802B4AF4", - "802b4bac" : "ActionBowser18", - "802b4be8" : "ActionBowser0", - "802b4ca4" : "ActionBowser15", - "802b4d14" : "ActionBowser14", - "802b4f00" : "ActionBowser16", - "802b5104" : "ActionBowser8", - "802b5218" : "ActionBowser12", - "802b53f4" : "func_802B4A44", - "802b5444" : "func_802B4A94", - "802b5554" : "func_802B4BA4", - "802b55cc" : "ActionBowser13", - "802b5798" : "ActionBowser17", - "802b58bc" : "ActionBowser10", - "802b59cc" : "ActionBowser9", - "802b5aec" : "func_802B5108", - "802b5c00" : "ActionBowser11", - "802b5c40" : "ActionBowser7", - "802b5f6c" : "func_802B5588", - "802b5fec" : "ActionBowser1", - "802b611c" : "func_802B5738", - "802b6190" : "ActionBowser2", - "802b6568" : "ActionBowser3", - "802b65d0" : "func_802B5C78", - "802b6670" : "func_802B5D18", - "802b6730" : "func_802B5DD8", - "802b67d4" : "func_802B5E7C", - "802b6878" : "func_802B5F20", - "802b6a10" : "func_802B60B8", - "802b6a78" : "func_802B6120", - "802b6bac" : "func_802B6254", - "802b6cf0" : "ActionBowser4", - "802b6e40" : "func_802B64E8", - "802b6ee0" : "ActionBowser19", - "802b711c" : "func_802B67C4", - "802b71e4" : "func_802B688C", - "802b72d4" : "func_802B697C", - "802b7418" : "func_802B6AC0", - "802b75a4" : "bhv_bowser_loop", - "802b7878" : "bhv_bowser_init", - "802b798c" : "Geo18_802B798C", - "802b7a20" : "func_802B70C8", - "802b7c64" : "geo_switch_bowser_eyes", - "802b7d44" : "Geo18_802B7D44", - "802b7e68" : "ActionFallingBowserPlatform0", - "802b7ef0" : "ActionFallingBowserPlatform1", - "802b8024" : "ActionFallingBowserPlatform2", - "802b8384" : "bhv_falling_bowser_platform_loop", - "802b83b0" : "func_802B7A58", - "802b8434" : "func_802B7ADC", - "802b84ac" : "bhv_flame_bowser_init", - "802b85b0" : "bhv_flame_large_burning_out_init", - "802b8654" : "func_802B7CFC", - "802b8734" : "bhv_flame_bowser_loop", - "802b8960" : "bhv_flame_moving_forward_growing_init", - "802b89ec" : "bhv_flame_moving_forward_growing_loop", - "802b8b1c" : "bhv_flame_floating_landing_init", - "802b8c38" : "bhv_flame_floating_landing_loop", - "802b8d68" : "bhv_blue_bowser_flame_init", - "802b8e7c" : "bhv_blue_bowser_flame_loop", - "802b9034" : "bhv_flame_bouncing_init", - "802b90ec" : "bhv_flame_bouncing_loop", - "802b921c" : "bhv_blue_flames_group_loop", - "802b935c" : "bhv_blue_fish_loop", - "802b9790" : "bhv_tank_fish_group_loop", - "802b98d4" : "func_802B8F7C", - "802b98fc" : "bhv_checkerboard_elevator_group_init", - "802b9a78" : "func_802B9120", - "802b9af8" : "func_802B91A0", - "802b9bb4" : "bhv_checkerboard_platform_init", - "802b9bd8" : "bhv_checkerboard_platform_loop", - "802b9e94" : "bhv_ddd_warp_loop", - "802b9efc" : "func_802B95A4", - "802ba13c" : "func_802B97E4", - "802ba19c" : "bhv_water_level_pillar_init", - "802ba1e0" : "bhv_water_level_pillar_loop", - "802ba25c" : "bhv_invisible_objects_under_bridge_init", - "802ba2b0" : "Geo18_802BA2B0", - "802ba2f8" : "bhv_bowser_key_unlock_door_loop", - "802ba458" : "bhv_bowser_key_course_exit_loop", - "802ba5bc" : "bhv_moat_grills_loop", - "802ba608" : "bhv_rotating_clock_arm_loop", - "802ba7e0" : "handle_hat_ukiki_reset", - "802ba868" : "is_hat_ukiki_and_mario_has_hat", - "802ba8c4" : "unused_Geo18_8029D890", - "802ba958" : "idle_ukiki_taunt", - "802bab7c" : "ukiki_act_idle", - "802bae40" : "ukiki_act_return_home", - "802baec4" : "ukiki_act_wait_to_respawn", - "802baf10" : "ukiki_act_unused_turn", - "802baf64" : "ukiki_act_turn_to_mario", - "802bb07c" : "ukiki_act_run", - "802bb288" : "ukiki_act_jump", - "802bb3b8" : "ukiki_act_go_to_cage", - "802bb798" : "ukiki_free_loop", - "802bb888" : "cage_ukiki_held_loop", - "802bba3c" : "hat_ukiki_held_loop", - "802bbb98" : "bhv_ukiki_init", - "802bbc0c" : "bhv_ukiki_loop", - "802bbd6c" : "func_802BB414", - "802bbfd8" : "func_802BB680", - "802bc0f0" : "bhv_lll_moving_octagonal_mesh_platform_loop", - "802bc22c" : "bhv_lll_sinking_rock_block_loop", - "802bc294" : "bhv_lll_rotating_hex_flame_loop", - "802bc348" : "func_802BB9F0", - "802bc4f4" : "ActionRotatingCwFireBars0", - "802bc538" : "ActionRotatingCwFireBars1", - "802bc590" : "ActionRotatingCwFireBars2", - "802bc5fc" : "ActionRotatingCwFireBars3", - "802bc618" : "bhv_lll_rotating_block_fire_bars_loop", - "802bc660" : "bhv_lll_wood_piece_loop", - "802bc728" : "bhv_lll_floating_wood_bridge_loop", - "802bc898" : "bhv_volcano_flames_loop", - "802bc934" : "func_802BBFDC", - "802bca74" : "bhv_lll_rotating_hexagonal_ring_loop", - "802bcce8" : "func_802BC390", - "802bcda8" : "bhv_lll_sinking_rectangular_platform_loop", - "802bce58" : "bhv_lll_sinking_square_platforms_loop", - "802bce9c" : "create_transform_from_normals", - "802bcf40" : "bhv_platform_normals_init", - "802bcfc4" : "approach_by_increment", - "802bd058" : "bhv_tilting_inverted_pyramid_loop", - "802bd3e4" : "func_802BCA8C", - "802bd488" : "bhv_koopa_shell_flame_loop", - "802bd5dc" : "bhv_koopa_shell_flame_spawn", - "802bd62c" : "func_802BCCD4", - "802bd680" : "bhv_koopa_shell_loop", - "802bd8d0" : "func_802BCF78", - "802bd91c" : "func_802BCFC4", - "802bdb04" : "ActionToxBox4", - "802bdb3c" : "ActionToxBox5", - "802bdb74" : "ActionToxBox6", - "802bdbac" : "ActionToxBox7", - "802bdbe4" : "ActionToxBox1", - "802bdc7c" : "ActionToxBox2", - "802bdcc8" : "ActionToxBox3", - "802bdd14" : "ActionToxBox0", - "802bdd68" : "bhv_tox_box_loop", - "802bdd9c" : "piranha_plant_act_idle", - "802bde10" : "piranha_plant_check_interactions", - "802bdeec" : "piranha_plant_act_sleeping", - "802be034" : "piranha_plant_act_woken_up", - "802be0b8" : "piranha_plant_reset_when_far", - "802be0ec" : "piranha_plant_attacked", - "802be150" : "piranha_plant_act_shrink_and_die", - "802be234" : "piranha_plant_act_wait_to_respawn", - "802be278" : "piranha_plant_act_respawn", - "802be350" : "piranha_plant_act_biting", - "802be49c" : "mario_moving_fast_enough_to_make_piranha_plant_bite", - "802be50c" : "piranha_plant_act_stopped_biting", - "802be5a0" : "bhv_piranha_plant_loop", - "802be628" : "bhv_lll_bowser_puzzle_spawn_piece", - "802be6d4" : "bhv_lll_bowser_puzzle_spawn_pieces", - "802be79c" : "bhv_lll_bowser_puzzle_loop", - "802be8a8" : "bhv_lll_bowser_puzzle_piece_action_0", - "802be8b8" : "bhv_lll_bowser_puzzle_piece_action_1", - "802be8f4" : "bhv_lll_bowser_puzzle_piece_update", - "802be9dc" : "bhv_lll_bowser_puzzle_piece_move", - "802beb14" : "bhv_lll_bowser_puzzle_piece_idle", - "802beb54" : "bhv_lll_bowser_puzzle_piece_move_left", - "802beb8c" : "bhv_lll_bowser_puzzle_piece_move_right", - "802bebc4" : "bhv_lll_bowser_puzzle_piece_move_up", - "802bebfc" : "bhv_lll_bowser_puzzle_piece_move_down", - "802bec34" : "bhv_lll_bowser_puzzle_piece_loop", - "802becb0" : "func_802BE2E8", - "802bed7c" : "play_penguin_walking_sound", - "802bedec" : "ActionTuxiesMother2", - "802bef8c" : "ActionTuxiesMother1", - "802bf1d8" : "ActionTuxiesMother0", - "802bf3c0" : "bhv_tuxies_mother_loop", - "802bf424" : "func_802BEA58", - "802bf474" : "ActionSmallPenguin2", - "802bf57c" : "ActionSmallPenguin1", - "802bf648" : "ActionSmallPenguin3", - "802bf6e4" : "ActionSmallPenguin4", - "802bf760" : "ActionSmallPenguin0", - "802bf90c" : "ActionSmallPenguin5", - "802bfa14" : "func_802BF048", - "802bfa88" : "bhv_small_penguin_loop", - "802bfbac" : "geo_switch_tuxie_mother_eyes", - "802bfcd8" : "ActionFish0", - "802bfeb8" : "ActionFish1", - "802bff20" : "ActionFish2", - "802bff3c" : "bhv_fish_loop", - "802bff68" : "func_802BF59C", - "802c00b4" : "ActionFishGroup1", - "802c0348" : "ActionFishGroup2", - "802c06a8" : "ActionFishGroup0", - "802c0768" : "bhv_fish_group_2_loop", - "802c08a8" : "bhv_wdw_express_elevator_loop", - "802c0aac" : "ActionBirdChirpChirp0", - "802c0b50" : "ActionBirdChirpChirp1", - "802c0ba4" : "ActionBirdChirpChirp2", - "802c0bc4" : "ActionBirdChirpChirp3", - "802c0be0" : "bhv_bird_chirp_chirp_loop", - "802c0c0c" : "func_802C0240", - "802c0cd4" : "ActionCheepCheep0", - "802c0d44" : "ActionCheepCheep1", - "802c0f90" : "ActionCheepCheep2", - "802c1204" : "bhv_cheep_cheep_loop", - "802c12c0" : "bhv_rotatin_exclamation_box_loop", - "802c1308" : "ActionExclamationBox0", - "802c13ec" : "ActionExclamationBox1", - "802c14b0" : "ActionExclamationBox2", - "802c15b8" : "ActionExclamationBox3", - "802c17bc" : "func_802C0DF0", - "802c18d0" : "ActionExclamationBox4", - "802c1988" : "ActionExclamationBox5", - "802c19c0" : "bhv_exclamation_box_loop", - "802c19fc" : "bhv_sound_spawner_init", - "802c1a40" : "bhv_bowsers_sub_loop", - "802c1a80" : "bhv_sushi_shark_collision_loop", - "802c1a90" : "bhv_sushi_shark_loop", - "802c1c44" : "bhv_sunken_ship_part_loop", - "802c1cd4" : "bhv_ship_part_3_loop", - "802c1e10" : "bhv_jrb_sliding_box_loop", - "802c2190" : "bhv_white_puff_1_loop", - "802c2274" : "bhv_white_puff_2_loop", - "802c22b8" : "bhv_hidden_blue_coin_loop", - "802c242c" : "bhv_blue_coin_switch_loop", - "802c263c" : "bhv_openable_cage_door_loop", - "802c26f8" : "bhv_openable_grill_loop", - "802c2930" : "bhv_init_changing_water_level_loop", - "802c2a24" : "bhv_water_level_diamond_loop", - "802c2ce8" : "func_802C231C", - "802c2ebc" : "ActionTweester0", - "802c2fbc" : "ActionTweester1", - "802c31c4" : "ActionTweester2", - "802c329c" : "bhv_tweester_loop", - "802c32e8" : "bhv_tweester_sand_particle_loop", - "802c3440" : "bhv_boo_init", - "802c3684" : "bhv_courtyard_boo_triplet_init", - "802c4824" : "bhv_boo_loop", - "802c4f30" : "bhv_big_boo_loop", - "802c515c" : "bhv_boo_with_cage_init", - "802c51d4" : "bhv_boo_with_cage_loop", - "802c5224" : "bhv_merry_go_round_boo_manager_loop", - "802c53cc" : "obj_set_secondary_camera_focus", - "802c53ec" : "bhv_animated_texture_loop", - "802c5414" : "bhv_boo_in_castle_loop", - "802c5688" : "bhv_boo_boss_spawned_bridge_loop", - "802c5890" : "bhv_bbh_tilting_trap_platform_loop", - "802c5a38" : "bhv_haunted_bookshelf_loop", - "802c5ca8" : "bhv_merry_go_round_loop", - "802c5dc0" : "bhv_static_checkered_platform_loop", - "802c5f48" : "bhv_beta_bowser_anchor_loop", - "802c5fdc" : "bhv_play_music_track_when_touched_loop", - "802c6050" : "bhv_floor_trap_in_castle_loop", - "802c60ac" : "bhv_castle_floor_trap_init", - "802c6150" : "bhv_castle_floor_trap_open_detect", - "802c61d4" : "bhv_castle_floor_trap_open", - "802c6278" : "bhv_castle_floor_trap_close_detect", - "802c62bc" : "bhv_castle_floor_trap_close", - "802c6328" : "bhv_castle_floor_trap_rotate", - "802c6348" : "bhv_castle_floor_trap_loop", - "802c63e8" : "BehClimbDetectLoop", - "802c64a4" : "bhv_sparkle_spawn_loop", - "802c6538" : "func_802C5A64", - "802c65c0" : "bhv_scuttlebug_loop", - "802c6b6c" : "bhv_scuttlebug_spawn_loop", - "802c6ca0" : "func_802C61CC", - "802c6d6c" : "ActionWhomp0", - "802c6ec8" : "ActionWhomp7", - "802c6fb0" : "ActionWhomp1", - "802c710c" : "ActionWhomp2", - "802c7254" : "ActionWhomp3", - "802c72b4" : "ActionWhomp4", - "802c7380" : "ActionWhomp5", - "802c7428" : "func_802C6954", - "802c75fc" : "func_802C6B28", - "802c76d4" : "ActionWhomp6", - "802c7858" : "ActionWhomp8", - "802c7998" : "ActionWhomp9", - "802c79d8" : "bhv_whomp_loop", - "802c7a70" : "bhv_water_splash_loop", - "802c7b14" : "bhv_water_drops_loop", - "802c7cac" : "bhv_surface_waves_loop", - "802c7d40" : "bhv_water_surface_white_wave_init", - "802c7d90" : "bhv_object_bubble_ripples_init", - "802c7dfc" : "bhv_surface_wave_shrinking_init", - "802c7e5c" : "bhv_wave_trail_loop", - "802c7f98" : "bhv_white_wind_particle_loop", - "802c81b4" : "func_802C76E0", - "802c834c" : "bhv_snowman_wind_blowing_loop", - "802c85a4" : "func_802C7AD0", - "802c863c" : "bhv_walking_penguin_loop", - "802c89f0" : "update_mario_platform", - "802c8b4c" : "get_mario_pos", - "802c8b8c" : "set_mario_pos", - "802c8bc8" : "apply_platform_displacement", - "802c8ec0" : "apply_mario_platform_displacement", - "802c8f28" : "clear_mario_platform", - "802c8f40" : "Unknown802C8460", - "802c8fe4" : "func_802C8504", - "802c91ec" : "func_802C870C", - "802c9388" : "func_802C88A8", - "802c93f8" : "func_802C8918", - "802c94ac" : "func_802C89CC", - "802c95b4" : "func_802C8AD4", - "802c9630" : "func_802C8B50", - "802c9724" : "detect_object_collisions", - "802c99b8" : "init_free_object_list", - "802c9a3c" : "clear_object_lists", - "802c9b68" : "unload_object", - "802c9f04" : "create_object", - "802ca028" : "mark_obj_for_deletion", - "802ca040" : "exec_anim_sound_state", - "802ca144" : "create_sound_spawner", - "802ca190" : "PlaySound", - "802ca1e0" : "PlaySound2", - "802ca230" : "calc_dist_to_volume_range_1", - "802ca2d4" : "calc_dist_to_volume_range_2", - "802ca370" : "Stub802C9890", - "802ca380" : "Stub802C98A0", - "802ca390" : "Stub802C98B0", - "802ca3a0" : "Stub802C98C0", - "802ca3b0" : "get_current_clock", - "802ca3e0" : "get_clock_difference", - "802ca418" : "set_print_state_info", - "802ca460" : "print_text_array_info", - "802ca51c" : "set_text_array_x_y", - "802ca568" : "print_debug_bottom_up", - "802ca5b8" : "print_debug_top_down_objectinfo", - "802ca618" : "print_debug_top_down_mapinfo", - "802ca680" : "print_debug_top_down_normal", - "802ca6d0" : "print_mapinfo", - "802ca8e8" : "print_checkinfo", - "802ca918" : "print_surfaceinfo", - "802ca94c" : "print_stageinfo", - "802ca990" : "print_string_array_info", - "802caa6c" : "print_effectinfo", - "802caaa8" : "print_enemyinfo", - "802caae4" : "update_debug_dpadmask", - "802cabac" : "debug_unknown_level_select_check", - "802cac20" : "reset_debug_objectinfo", - "802cb0b0" : "stub_802CA5D0", - "802cb0c0" : "try_print_debug_mario_object_info", - "802cb1c0" : "try_print_debug_mario_level_info", - "802cb264" : "try_do_mario_debug_object_spawn", - "802cb564" : "Unknown802CAA84", - "802cb5c0" : "set_and_reset_transition_fade_timer", - "802cb640" : "set_transition_color_fade_alpha", - "802cb894" : "vertex_transition_color", - "802cba18" : "dl_transition_color", - "802cbbc4" : "render_fade_transition_from_color", - "802cbc20" : "render_fade_transition_into_color", - "802cbc7c" : "calc_tex_transition_radius", - "802cbd54" : "calc_tex_transition_time", - "802cbe64" : "convert_tex_transition_angle_to_pos", - "802cbee0" : "center_tex_transition_x", - "802cbf64" : "center_tex_transition_y", - "802cbfe8" : "make_tex_transition_vertex", - "802cc180" : "load_tex_transition_vertex", - "802cc4d8" : "render_textured_transition", - "802ccbe8" : "render_screen_transition", - "802ccdc8" : "render_cannon_circle_base", - "802cd1e8" : "geo_cannon_circle_base", - "802cd280" : "rotate_rectangle", - "802cd328" : "atan2_deg", - "802cd388" : "scale_shadow_with_distance", - "802cd444" : "disable_shadow_with_distance", - "802cd48c" : "dim_shadow_with_distance", - "802cd614" : "get_water_level_below_shadow", - "802cd6c4" : "init_shadow", - "802cd938" : "get_texture_coords_9_vertices", - "802cd988" : "get_texture_coords_4_vertices", - "802cd9ec" : "make_shadow_vertex_at_xyz", - "802cdb20" : "extrapolate_vertex_y_position", - "802cdb74" : "get_vertex_coords", - "802cdc40" : "calculate_vertex_xyz", - "802cde94" : "floor_local_tilt", - "802cdf3c" : "make_shadow_vertex", - "802ce128" : "add_shadow_to_display_list", - "802ce2bc" : "linearly_interpolate_solidity_positive", - "802ce3ec" : "linearly_interpolate_solidity_negative", - "802ce524" : "correct_shadow_solidity_for_animations", - "802ce690" : "correct_lava_shadow_height", - "802ce79c" : "create_shadow_player", - "802ce9d0" : "create_shadow_circle_9_verts", - "802ceae8" : "create_shadow_circle_4_verts", - "802cec04" : "create_shadow_circle_assuming_flat_ground", - "802cedc0" : "create_shadow_rectangle", - "802cef6c" : "get_shadow_height_solidity", - "802cf080" : "create_shadow_square", - "802cf1f0" : "create_shadow_hardcoded_rectangle", - "802cf34c" : "create_shadow_below_xyz", - "802cf5b0" : "calculate_skybox_scaled_x", - "802cf69c" : "calculate_skybox_scaled_y", - "802cf804" : "make_skybox_rect", - "802cfa2c" : "draw_skybox_tile_grid", - "802cfc68" : "create_skybox_ortho_matrix", - "802cfd88" : "init_skybox_display_list", - "802cfef4" : "create_skybox_facing_camera", - "802d0080" : "geo_wdw_set_initial_water_level", - "802d01e0" : "geo_movtex_pause_control", - "802d0254" : "movtex_make_quad_vertex", - "802d0484" : "movtex_gen_from_quad", - "802d0a84" : "movtex_gen_from_quad_array", - "802d0bb0" : "movtex_gen_quads_id", - "802d0c84" : "get_quad_collection_from_id", - "802d0f28" : "movtex_change_texture_format", - "802d104c" : "geo_movtex_draw_water_regions", - "802d1330" : "update_moving_texture_offset", - "802d13cc" : "movtex_write_vertex_first", - "802d1574" : "movtex_write_vertex_index", - "802d18b4" : "movtex_gen_list", - "802d1b70" : "geo_movtex_draw_nocolor", - "802d1cdc" : "geo_movtex_draw_colored", - "802d1e48" : "geo_movtex_draw_colored_no_update", - "802d1fa8" : "geo_movtex_draw_colored_2_no_update", - "802d2108" : "geo_movtex_update_horizontal", - "802d2210" : "make_vertex", - "802d22c4" : "round_float", - "802d2360" : "geo_exec_inside_castle_light", - "802d2470" : "geo_exec_flying_carpet_timer_update", - "802d2520" : "geo_exec_flying_carpet_create", - "802d28cc" : "geo_exec_cake_end_screen", - "802d29c0" : "stopAllRippleExcept", - "802d2a74" : "find_mario_y_position_on_painting", - "802d2b08" : "find_mario_z_position_on_painting", - "802d2b84" : "painting_find_vertical_ripple_location", - "802d2c40" : "find_part_of_painting_near_mario", - "802d2d80" : "find_mario_x_position_on_painting", - "802d2dfc" : "painting_find_horizontal_ripple_location", - "802d2eb8" : "painting_set_ripple_type", - "802d2ffc" : "vertical_proximity_ripple_painting_ripple", - "802d319c" : "vertical_proximity_ripple_painting_ripple_if_mario_enters", - "802d327c" : "vertical_continuous_ripple_painting_ripple", - "802d341c" : "vertical_continuous_ripple_painting_ripple_if_mario_enters", - "802d34fc" : "horizontal_proximity_ripple_painting_ripple", - "802d36ac" : "horizontal_proximity_ripple_painting_ripple_if_mario_enters", - "802d379c" : "horizontal_continuous_ripple_painting_ripple", - "802d393c" : "horizontal_continuous_ripple_painting_ripple_if_mario_enters", - "802d3a2c" : "painting_update_floors", - "802d3bec" : "painting_update_ripple_status", - "802d3cec" : "painting_calculate_point_ripple", - "802d3e6c" : "painting_conditionally_calculate_point_ripple", - "802d3ee4" : "Print1", - "802d404c" : "Print2", - "802d43f8" : "small_float_to_byte", - "802d44bc" : "func_802D39DC", - "802d47d0" : "func_802D3CF0", - "802d4edc" : "func_802D43FC", - "802d50dc" : "func_802D45FC", - "802d5354" : "func_802D4874", - "802d556c" : "display_painting_rippling", - "802d568c" : "display_painting_not_rippling", - "802d5778" : "reset_painting", - "802d57a8" : "update_ddd_painting", - "802d58e4" : "func_802D4E04", - "802d593c" : "display_painting", - "802d59a8" : "vertical_painting_ripple", - "802d5aa0" : "horizontal_painting_ripple", - "802d5b98" : "Geo18_802D5B98", - "802d5d0c" : "Geo18_802D5D0C", - "802d5e00" : "int_pow", - "802d5e54" : "format_integer", - "802d6144" : "parse_width_field", - "802d62d8" : "print_text_fmt_int", - "802d6554" : "print_text", - "802d66c0" : "print_text_centered", - "802d6858" : "char_to_glyph_index", - "802d69f8" : "add_glyph_texture", - "802d6acc" : "clip_to_bounds", - "802d6b3c" : "render_textrect", - "802d6c88" : "render_text_labels", - "802d6f20" : "create_dl_identity_matrix", - "802d7070" : "create_dl_translation_matrix", - "802d7174" : "create_dl_rotation_matrix", - "802d7280" : "create_dl_scale_matrix", - "802d7384" : "create_dl_ortho_matrix", - "802d75dc" : "render_generic_char", - "802d76c8" : "render_multi_text_string", - "802d77dc" : "print_generic_string", - "802d7b84" : "print_hud_lut_string", - "802d7e88" : "print_menu_generic_string", - "802d82d4" : "print_credits_string", - "802d862c" : "handle_menu_scrolling", - "802d8844" : "get_str_x_pos_from_center", - "802d8934" : "get_string_width", - "802d89b8" : "print_hud_my_score_coins", - "802d8a80" : "print_hud_my_score_stars", - "802d8b34" : "int_to_str", - "802d8c6c" : "get_dialog_id", - "802d8c88" : "create_dialog_box", - "802d8cc4" : "create_dialog_box_with_var", - "802d8d08" : "create_dialog_inverted_box", - "802d8d48" : "create_dialog_box_with_response", - "802d8d90" : "reset_dialog_render_state", - "802d8e2c" : "render_dialog_box_type", - "802d9148" : "change_and_flash_dialog_text_color_lines", - "802d9388" : "handle_dialog_scroll_page_state", - "802d944c" : "render_star_count_dialog_text", - "802d9634" : "render_multi_text_string_lines", - "802d9800" : "ensure_nonnegative", - "802d982c" : "handle_dialog_text_and_pages", - "802d9cb0" : "render_dialog_triangle_choice", - "802d9dfc" : "render_dialog_string_color", - "802d9f84" : "handle_special_dialog_text", - "802da1ac" : "render_dialog_entries", - "802da810" : "set_menu_mode", - "802da844" : "reset_cutscene_msg_fade", - "802da85c" : "dl_rgba16_begin_cutscene_msg_fade", - "802da8e4" : "dl_rgba16_stop_cutscene_msg_fade", - "802da964" : "ascii_to_credits_char", - "802daa34" : "print_credits_str_ascii", - "802daae4" : "set_cutscene_message", - "802dab58" : "do_cutscene_handler", - "802dad54" : "print_peach_letter_message", - "802db08c" : "render_hud_cannon_reticle", - "802db350" : "reset_red_coins_collected", - "802db368" : "change_dialog_camera_angle", - "802db3b8" : "shade_screen", - "802db498" : "print_animated_red_coin", - "802db6e8" : "render_pause_red_coins", - "802db760" : "render_pause_my_score_coins", - "802dbb24" : "render_pause_camera_options", - "802dbe68" : "render_pause_course_options", - "802dc15c" : "render_pause_castle_menu_box", - "802dc418" : "highlight_last_course_complete_stars", - "802dc478" : "print_hud_pause_colorful_str", - "802dc570" : "render_pause_castle_course_stars", - "802dc718" : "render_pause_castle_main_strings", - "802dca88" : "render_pause_courses_and_castle", - "802dcd04" : "print_hud_course_complete_string", - "802dcf30" : "print_hud_course_complete_coins", - "802dd194" : "play_star_fanfare_and_flash_hud", - "802dd210" : "render_course_complete_lvl_info_and_hud_str", - "802dd838" : "render_save_confirmation", - "802ddae0" : "render_course_complete_screen", - "802ddca4" : "render_menus_and_dialogs", - "802dddf0" : "envfx_init_snow", - "802ddf38" : "envfx_update_snowflake_count", - "802de0bc" : "envfx_cleanup_snow", - "802de114" : "orbit_from_positions", - "802de23c" : "pos_from_orbit", - "802de360" : "envfx_is_snowflake_alive", - "802de458" : "envfx_update_snow_normal", - "802de888" : "envfx_update_snow_blizzard", - "802ded38" : "envfx_update_snow_water", - "802def2c" : "rotate_triangle_vertices", - "802df334" : "append_snowflake_vertex_buffer", - "802df748" : "envfx_update_snow", - "802dfbc8" : "envfx_update_particles", - "802dfd50" : "particle_is_laterally_close", - "802dfe00" : "random_flower_offset", - "802dfe80" : "envfx_update_flower", - "802e0120" : "envfx_set_lava_bubble_position", - "802e048c" : "envfx_update_lava", - "802e065c" : "envfx_rotate_around_whirlpool", - "802e08a8" : "envfx_is_whirlpool_bubble_alive", - "802e0934" : "envfx_update_whirlpool", - "802e0e24" : "envfx_is_jestream_bubble_alive", - "802e0eb8" : "envfx_update_jetstream", - "802e1238" : "envfx_init_bubble", - "802e1414" : "envfx_bubbles_update_switch", - "802e1618" : "append_bubble_vertex_buffer", - "802e1a20" : "envfx_set_bubble_texture", - "802e1bb8" : "envfx_update_bubble_particles", - "802e1ed8" : "envfx_set_max_bubble_particles", - "802e1f48" : "envfx_update_bubbles", - "802e20a0" : "convert_rotation", - "802e2134" : "spawn_macro_abs_yrot_2params", - "802e21dc" : "spawn_macro_abs_yrot_param1", - "802e2284" : "spawn_macro_abs_special", - "802e2414" : "spawn_macro_objects", - "802e2690" : "spawn_macro_objects_hardcoded", - "802e28ec" : "spawn_special_objects", - "802e2cf0" : "render_hud_tex_lut", - "802e2e58" : "render_hud_small_tex_lut", - "802e30b4" : "render_power_meter_health_segment", - "802e3214" : "render_dl_power_meter", - "802e33b8" : "animate_power_meter_emphasized", - "802e352c" : "handle_power_meter_actions", - "802e3654" : "render_hud_power_meter", - "802e3744" : "render_hud_mario_lives", - "802e37a8" : "render_hud_coins", - "802e380c" : "render_hud_stars", - "802e38e4" : "render_hud_keys", - "802e395c" : "render_hud_timer", - "802e3b1c" : "set_hud_camera_status", - "802e3b3c" : "render_hud_camera_status", - "802e3d2c" : "render_hud", - "802e3e50" : "set_yoshi_as_not_dead", - "802e3e68" : "geo_obj_transparency_something", - "802e3f68" : "absf_2", - "802e3fac" : "turn_obj_away_from_surface", - "802e405c" : "obj_find_wall", - "802e41a4" : "turn_obj_away_from_steep_floor", - "802e42e0" : "obj_orient_graph", - "802e43e4" : "calc_obj_friction", - "802e445c" : "calc_new_obj_vel_and_pos_y", - "802e4814" : "calc_new_obj_vel_and_pos_y_underwater", - "802e4cec" : "obj_update_pos_vel_xz", - "802e4d88" : "obj_splash", - "802e4e90" : "object_step", - "802e5114" : "object_step_without_floor_orient", - "802e5160" : "obj_move_xyz_using_fvel_and_yaw", - "802e5208" : "is_point_within_radius_of_mario", - "802e52b8" : "is_point_close_to_object", - "802e5360" : "set_object_visibility", - "802e53f4" : "obj_return_home_if_safe", - "802e54b0" : "obj_return_and_displace_home", - "802e55d0" : "obj_check_if_facing_toward_angle", - "802e569c" : "obj_find_wall_displacement", - "802e5760" : "obj_spawn_yellow_coins", - "802e5824" : "obj_flicker_and_disappear", - "802e58b4" : "current_mario_room_check", - "802e5948" : "trigger_obj_dialog_when_facing", - "802e5a80" : "obj_check_floor_death", - "802e5b18" : "obj_lava_death", - "802e5c6c" : "spawn_orange_number", - "802e5d04" : "debug_sequence_tracker", - "802e5de8" : "CoinStep", - "802e5e6c" : "MovingCoinFlickerLoop", - "802e5ea4" : "CoinCollected", - "802e5ee8" : "bhv_moving_yellow_coin_init", - "802e5f64" : "bhv_moving_yellow_coin_loop", - "802e6098" : "bhv_moving_blue_coin_init", - "802e6114" : "bhv_moving_blue_coin_loop", - "802e62a4" : "bhv_blue_coin_sliding_jumping_init", - "802e631c" : "func_802E540C", - "802e63ec" : "func_802E54DC", - "802e6474" : "bhv_blue_coin_sliding_loop", - "802e6628" : "bhv_blue_coin_jumping_loop", - "802e6790" : "bhv_seaweed_init", - "802e67dc" : "bhv_seaweed_bundle_init", - "802e6a2c" : "bhv_bobomb_init", - "802e6a8c" : "func_802E5B7C", - "802e6af8" : "BobombExplodeLoop", - "802e6bd4" : "CheckBobombInteractions", - "802e6cf0" : "BobombPatrolLoop", - "802e6dc8" : "BobombChaseMarioLoop", - "802e6e84" : "BobombLaunchedLoop", - "802e6ed8" : "GenericBobombFreeLoop", - "802e7020" : "StationaryBobombFreeLoop", - "802e7134" : "BobombFreeLoop", - "802e7180" : "BobombHeldLoop", - "802e7220" : "BobombDroppedLoop", - "802e7280" : "BobombThrownLoop", - "802e7324" : "ObjRandomBlink", - "802e742c" : "bhv_bobomb_loop", - "802e75a0" : "bhv_bobomb_fuse_smoke_init", - "802e76ac" : "bhv_bobomb_buddy_init", - "802e770c" : "BobombBuddyIdleLoop", - "802e7814" : "BobombBuddyCannonLoop", - "802e79dc" : "BobombBuddyTalkLoop", - "802e7b00" : "BobombBuddyTurnToTalkLoop", - "802e7bb0" : "BobombBuddyActionLoop", - "802e7c4c" : "bhv_bobomb_buddy_loop", - "802e7c90" : "bhv_cannon_closed_init", - "802e7d4c" : "CannonTrapDoorOpeningLoop", - "802e7e54" : "bhv_cannon_closed_loop", - "802e7f70" : "bhv_whirlpool_init", - "802e7fb8" : "func_802E70A8", - "802e7fec" : "func_802E70DC", - "802e80dc" : "bhv_whirlpool_loop", - "802e82b0" : "bhv_jet_stream_loop", - "802e8388" : "bhv_homing_amp_init", - "802e89d4" : "bhv_homing_amp_loop", - "802e8ae4" : "bhv_circling_amp_init", - "802e8ecc" : "bhv_circling_amp_loop", - "802e8f68" : "bhv_butterfly_init", - "802e9018" : "ButterflyStep", - "802e9278" : "CalculateButterflyAngle", - "802e9470" : "ButterflyRestingLoop", - "802e94e4" : "ButterflyFollowMarioLoop", - "802e9548" : "ButterflyReturnHomeLoop", - "802e96c8" : "bhv_butterfly_loop", - "802e9764" : "bhv_hoot_init", - "802e97fc" : "HootFindNextFloor", - "802e98c0" : "HootFloorBounce", - "802e9a4c" : "HootFreeStep", - "802e9cf4" : "PlayerSetHootYaw", - "802e9d98" : "HootCarryStep", - "802e9f60" : "HootSurfaceCollision", - "802ea144" : "HootAscentLoop", - "802ea258" : "HootActionLoop", - "802ea3f0" : "HootTurnToHome", - "802ea4ec" : "HootAwakeLoop", - "802ea588" : "bhv_hoot_loop", - "802ea6a8" : "bhv_beta_holdable_object_init", - "802ea7e0" : "bhv_beta_holdable_object_loop", - "802ea888" : "bhv_object_bubble_init", - "802ea934" : "bhv_object_bubble_loop", - "802eaa10" : "bhv_object_water_wave_init", - "802eaa50" : "bhv_object_water_wave_loop", - "802eaa8c" : "bhv_explosion_init", - "802eaad0" : "bhv_explosion_loop", - "802eabf0" : "bhv_bobomb_bully_death_smoke_init", - "802eac3c" : "bhv_bobomb_explosion_bubble_init", - "802ead3c" : "bhv_bobomb_explosion_bubble_loop", - "802eaef8" : "bhv_respawner_loop", - "802eaf84" : "create_respawner", - "802eb05c" : "bhv_small_bully_init", - "802eb104" : "bhv_big_bully_init", - "802eb1c0" : "BullyCheckMarioCollision", - "802eb288" : "BullyChaseMarioLoop", - "802eb3f0" : "BullyKnockbackLoop", - "802eb510" : "BullyBackUpLoop", - "802eb5c4" : "BullyBackUpCheck", - "802eb630" : "PlayBullyStompingSound", - "802eb744" : "BullyStep", - "802eb7e0" : "BullySpawnCoin", - "802eb8b0" : "BullyLavaDeath", - "802eb9d0" : "bhv_bully_loop", - "802ebb74" : "BigBullySpawnMinion", - "802ebc00" : "bhv_big_bully_with_minions_init", - "802ebc88" : "BigBullyWithMinionsLavaDeath", - "802ebce0" : "bhv_big_bully_with_minions_loop", - "802ebf70" : "WaterRingCalcMarioDistInFront", - "802ec030" : "WaterRingInit", - "802ec1b0" : "bhv_jet_stream_water_ring_init", - "802ec200" : "CheckWaterRingCollection", - "802ec3d0" : "SetWaterRingScale", - "802ec4e0" : "WaterRingCollectedLoop", - "802ec59c" : "JetStreamWaterRingNotCollectedLoop", - "802ec75c" : "bhv_jet_stream_water_ring_loop", - "802ec7cc" : "Unknown802EB8A4", - "802ec818" : "JetStreamRingSpawnerActiveLoop", - "802ec908" : "bhv_jet_stream_ring_spawner_loop", - "802ec9b8" : "bhv_manta_ray_water_ring_init", - "802ec9f0" : "MantaRayWaterRingNotCollectedLoop", - "802ecba4" : "bhv_manta_ray_water_ring_loop", - "802ecc14" : "bhv_bowser_bomb_loop", - "802ecd0c" : "bhv_bowser_bomb_explosion_loop", - "802ecea0" : "bhv_bowser_bomb_smoke_loop", - "802ecfac" : "bhv_celebration_star_init", - "802ed10c" : "CelebrationStarSpinAroundMarioLoop", - "802ed28c" : "CelebrationStarFaceCameraLoop", - "802ed39c" : "bhv_celebration_star_loop", - "802ed40c" : "bhv_celebration_star_sparkle_loop", - "802ed45c" : "bhv_star_key_collection_puff_spawner_loop", - "802ed498" : "bhv_lll_drawbridge_spawner_loop", - "802ed62c" : "bhv_lll_drawbridge_loop", - "802ed78c" : "bhv_small_bomp_init", - "802ed7fc" : "bhv_small_bomp_loop", - "802edacc" : "bhv_large_bomp_init", - "802edb2c" : "bhv_large_bomp_loop", - "802eddfc" : "bhv_wf_sliding_platform_init", - "802edf28" : "bhv_wf_sliding_platform_loop", - "802ee124" : "bhv_moneybag_init", - "802ee1a0" : "MoneybagCheckMarioCollision", - "802ee268" : "MoneybagJump", - "802ee46c" : "MoneybagMoveAroundLoop", - "802ee598" : "MoneybagReturnHomeLoop", - "802ee728" : "MoneybagDisappearLoop", - "802ee778" : "MoneybagDeathLoop", - "802ee7e0" : "bhv_moneybag_loop", - "802ee8f4" : "bhv_moneybag_hidden_loop", - "802ee9cc" : "bhv_bowling_ball_init", - "802eea24" : "func_802EDA14", - "802eea7c" : "func_802EDA6C", - "802eeb64" : "bhv_bowling_ball_roll_loop", - "802eecb8" : "bhv_bowling_ball_initializeLoop", - "802eedf0" : "bhv_bowling_ball_loop", - "802eeeb4" : "bhv_generic_bowling_ball_spawner_init", - "802eef9c" : "bhv_generic_bowling_ball_spawner_loop", - "802ef0e8" : "bhv_thi_bowling_ball_spawner_loop", - "802ef21c" : "bhv_bob_pit_bowling_ball_init", - "802ef274" : "bhv_bob_pit_bowling_ball_loop", - "802ef34c" : "bhv_free_bowling_ball_init", - "802ef3f4" : "bhv_free_bowling_ball_roll_loop", - "802ef524" : "bhv_free_bowling_ball_loop", - "802ef63c" : "bhv_rr_cruiser_wing_init", - "802ef66c" : "bhv_rr_cruiser_wing_loop", - "802ef820" : "bhv_spindel_init", - "802ef858" : "bhv_spindel_loop", - "802efcd0" : "bhv_ssl_moving_pyramid_wall_init", - "802efd8c" : "bhv_ssl_moving_pyramid_wall_loop", - "802efe64" : "bhv_pyramid_elevator_init", - "802efef4" : "bhv_pyramid_elevator_loop", - "802f0104" : "bhv_pyramid_elevator_trajectory_marker_ball_loop", - "802f0168" : "bhv_pyramid_top_init", - "802f0288" : "bhv_pyramid_top_spinning", - "802f04a0" : "bhv_pyramid_top_explode", - "802f05b4" : "bhv_pyramid_top_loop", - "802f06a8" : "bhv_pyramid_top_fragment_init", - "802f0714" : "bhv_pyramid_top_fragment_loop", - "802f0788" : "bhv_pyramid_pillar_touch_detector_loop", - "802f07f4" : "bhv_waterfall_sound_loop", - "802f0820" : "bhv_volcano_sound_loop", - "802f084c" : "bhv_castle_flag_init", - "802f0898" : "bhv_birds_sound_loop", - "802f0950" : "bhv_ambient_sounds_init", - "802f09a4" : "bhv_sand_sound_loop", - "802f09f0" : "bhv_castle_cannon_grate_init", - "802f0a40" : "bhv_snowmans_bottom_init", - "802f0b7c" : "func_802EFB2C", - "802f0bd4" : "func_802EFB84", - "802f0c94" : "func_802EFC44", - "802f0df0" : "func_802EFDA0", - "802f0fa8" : "func_802EFF58", - "802f105c" : "bhv_snowmans_bottom_loop", - "802f120c" : "bhv_snowmans_head_init", - "802f1370" : "bhv_snowmans_head_loop", - "802f151c" : "bhv_snowmans_body_checkpoint_loop", - "802f15a8" : "bhv_big_boulder_init", - "802f162c" : "func_802F05DC", - "802f1714" : "bhv_big_boulder_loop", - "802f17f0" : "bhv_big_boulder_generator_loop", - "802f1954" : "func_802F0904", - "802f19c8" : "func_802F0978", - "802f1a10" : "func_802F09C0", - "802f1bb8" : "func_802F0B68", - "802f1d64" : "bhv_wing_cap_init", - "802f1dc0" : "func_802F0D70", - "802f1e5c" : "func_802F0E0C", - "802f1f3c" : "bhv_wing_vanish_cap_loop", - "802f1fd0" : "bhv_metal_cap_init", - "802f2030" : "func_802F0FE0", - "802f20ac" : "bhv_metal_cap_loop", - "802f2140" : "bhv_normal_cap_init", - "802f21e0" : "func_802F1190", - "802f2284" : "func_802F1234", - "802f23a8" : "bhv_normal_cap_loop", - "802f2498" : "bhv_vanish_cap_init", - "802f24f4" : "bhv_collect_star_init", - "802f25b0" : "bhv_collect_star_loop", - "802f2614" : "bhv_star_spawn_init", - "802f2768" : "bhv_star_spawn_loop", - "802f2aa0" : "func_802F1A50", - "802f2b88" : "create_star", - "802f2bd4" : "func_802F1B84", - "802f2c24" : "func_802F1BD4", - "802f2c84" : "bhv_hidden_red_coin_star_init", - "802f2d8c" : "bhv_hidden_red_coin_star_loop", - "802f2e6c" : "bhv_red_coin_init", - "802f2f2c" : "bhv_red_coin_loop", - "802f3014" : "bhv_hidden_star_init", - "802f30f0" : "bhv_hidden_star_loop", - "802f31bc" : "bhv_hidden_star_trigger_loop", - "802f328c" : "bhv_bowser_course_red_coin_star_loop", - "802f336c" : "bhv_ttm_rolling_log_init", - "802f341c" : "func_802F238C", - "802f36a4" : "bhv_rolling_log_loop", - "802f38b0" : "func_802F2820", - "802f39b4" : "func_802F2924", - "802f3a30" : "bhvLllVolcanoFallingTrap_loop", - "802f3b98" : "bhv_lll_rolling_log_init", - "802f3c54" : "bhv_1up_interact", - "802f3cc8" : "bhv_1up_common_init", - "802f3d30" : "bhv_1up_init", - "802f3dd0" : "func_802F2D40", - "802f3ea8" : "func_802F2E18", - "802f401c" : "func_802F2F8C", - "802f40cc" : "bhv_1up_walking_loop", - "802f4248" : "bhv_1up_running_away_loop", - "802f43b8" : "func_802F3328", - "802f44c0" : "bhv_1up_sliding_loop", - "802f45b8" : "bhv_1up_loop", - "802f45f0" : "bhv_1up_jump_on_approach_loop", - "802f4710" : "bhv_1up_hidden_loop", - "802f48f4" : "bhv_1up_hidden_trigger_loop", - "802f496c" : "bhv_1up_hidden_in_pole_loop", - "802f4b00" : "bhv_1up_hidden_in_pole_trigger_loop", - "802f4b78" : "bhv_1up_hidden_in_pole_spawner_loop", - "802f4c68" : "func_802F3BD8", - "802f4ce0" : "func_802F3C50", - "802f4d78" : "bhv_controllable_platform_sub_loop", - "802f4eb4" : "bhv_controllable_platform_init", - "802f5010" : "func_802F3F80", - "802f5068" : "func_802F3FD8", - "802f52c0" : "func_802F4230", - "802f547c" : "func_802F43EC", - "802f55a4" : "bhv_controllable_platform_loop", - "802f5cd4" : "bhv_breakable_box_small_init", - "802f5d78" : "func_802F4CE8", - "802f5e44" : "func_802F4DB4", - "802f5f48" : "breakable_box_small_released_loop", - "802f6014" : "breakable_box_small_idle_loop", - "802f60d8" : "breakable_box_small_get_dropped", - "802f6150" : "breakable_box_small_get_thrown", - "802f6228" : "bhv_breakable_box_small_loop", - "802f62e4" : "bhv_sliding_snow_mound_loop", - "802f6448" : "bhv_snow_mound_spawn_loop", - "802f6588" : "func_802F54F8", - "802f665c" : "func_802F55CC", - "802f6984" : "bhv_floating_platform_loop", - "802f6c0c" : "bhv_arrow_lift_loop", - "802f6d20" : "bhv_orange_number_init", - "802f6d58" : "bhv_orange_number_loop", - "802f6e40" : "bhv_manta_ray_init", - "802f6eb0" : "func_802F5E20", - "802f7068" : "func_802F5FD8", - "802f7264" : "bhv_manta_ray_loop", - "802f7348" : "bhv_falling_pillar_init", - "802f7398" : "bhv_falling_pillar_spawn_hitboxes", - "802f7418" : "bhv_falling_pillar_calculate_angle_in_front_of_mario", - "802f74dc" : "bhv_falling_pillar_loop", - "802f7760" : "bhv_falling_pillar_hitbox_loop", - "802f7924" : "bhv_jrb_floating_box_loop", - "802f7978" : "bhv_decorative_pendulum_init", - "802f79b0" : "bhv_decorative_pendulum_loop", - "802f7a58" : "bhv_treasure_chest_top_loop", - "802f7c9c" : "bhv_treasure_chest_bottom_init", - "802f7d04" : "bhv_treasure_chest_bottom_loop", - "802f7f1c" : "func_802F6E8C", - "802f7fa0" : "bhv_treasure_chest_ship_init", - "802f8044" : "bhv_treasure_chest_ship_loop", - "802f8158" : "bhv_treasure_chest_jrb_init", - "802f8208" : "bhv_treasure_chest_jrb_loop", - "802f82f8" : "bhv_treasure_chest_init", - "802f83a4" : "bhv_treasure_chest_loop", - "802f8490" : "bhv_mips_init", - "802f85e0" : "bhv_mips_find_furthest_waypoint_to_mario", - "802f8760" : "bhv_mips_act_wait_for_nearby_mario", - "802f8808" : "bhv_mips_act_follow_path", - "802f893c" : "bhv_mips_act_wait_for_animation_done", - "802f8988" : "bhv_mips_act_fall_down", - "802f8a34" : "bhv_mips_act_idle", - "802f8ab4" : "bhv_mips_free", - "802f8b54" : "bhv_mips_held", - "802f8c74" : "bhv_mips_dropped", - "802f8cf8" : "bhv_mips_thrown", - "802f8dac" : "bhv_mips_loop", - "802f8e54" : "bhv_yoshi_init", - "802f8f08" : "yoshi_walk_loop", - "802f9054" : "yoshi_idle_loop", - "802f923c" : "yoshi_talk_loop", - "802f93a8" : "yoshi_walk_and_jump_off_roof_loop", - "802f9500" : "yoshi_finish_jumping_and_despawn_loop", - "802f95ac" : "yoshi_give_present_loop", - "802f965c" : "BehYoshiLoop", - "802fbc4c" : "bhv_koopa_init", - "802fc414" : "shelled_koopa_attack_handler", - "802fcc00" : "obj_begin_race", - "802fd7f8" : "bhv_koopa_update", - "802fd950" : "bhv_koopa_race_endpoint_update", - "802fda28" : "bhv_pokey_body_part_update", - "802fe3b0" : "bhv_pokey_update", - "802fe8b4" : "bhv_swoop_update", - "802ff040" : "bhv_fly_guy_update", - "802ff214" : "bhv_goomba_triplet_spawner_update", - "802ff408" : "bhv_goomba_init", - "802ff94c" : "huge_goomba_weakly_attacked", - "802ff96c" : "bhv_goomba_update", - "802ffb38" : "bhv_chain_chomp_chain_part_update", - "80300e40" : "bhv_chain_chomp_update", - "80300ecc" : "bhv_wooden_post_update", - "80301148" : "bhv_chain_chomp_gate_init", - "80301180" : "bhv_chain_chomp_gate_update", - "80301210" : "bhv_wiggler_body_part_update", - "803020e4" : "wiggler_jumped_on_attack_handler", - "80302154" : "bhv_wiggler_update", - "80302910" : "bhv_spiny_update", - "80303028" : "bhv_enemy_lakitu_update", - "8030369c" : "bhv_cloud_update", - "80303744" : "bhv_cloud_part_update", - "80303984" : "bhv_camera_lakitu_init", - "80303f64" : "bhv_camera_lakitu_update", - "803043f8" : "bhv_monty_mole_hole_update", - "803044c0" : "bhv_monty_mole_init", - "80304ba8" : "bhv_monty_mole_update", - "80304fd4" : "bhv_monty_mole_rock_update", - "80305100" : "bhv_platform_on_track_init", - "80305a58" : "bhv_platform_on_track_update", - "80305bb0" : "bhv_track_ball_update", - "80305c14" : "bhv_seesaw_platform_init", - "80305c90" : "bhv_seesaw_platform_update", - "80305e2c" : "bhv_ferris_wheel_axle_init", - "80305f24" : "bhv_ferris_wheel_platform_update", - "80306084" : "bhv_water_bomb_spawner_update", - "803067e8" : "bhv_water_bomb_update", - "803068c0" : "bhv_water_bomb_shadow_update", - "8030699c" : "bhv_ttc_rotating_solid_init", - "80306a38" : "bhv_ttc_rotating_solid_update", - "80306cc4" : "bhv_ttc_pendulum_init", - "80306d38" : "bhv_ttc_pendulum_update", - "80306f48" : "bhv_ttc_treadmill_init", - "80307010" : "bhv_ttc_treadmill_update", - "803071b8" : "bhv_ttc_moving_bar_init", - "80307670" : "bhv_ttc_moving_bar_update", - "80307760" : "bhv_ttc_cog_init", - "803077e0" : "bhv_ttc_cog_update", - "80307930" : "bhv_ttc_pit_block_init", - "803079c8" : "bhv_ttc_pit_block_update", - "80307ae4" : "bhv_ttc_elevator_init", - "80307b58" : "bhv_ttc_elevator_update", - "80307c88" : "bhv_ttc_2d_rotator_init", - "80307cf8" : "bhv_ttc_2d_rotator_update", - "80307ea4" : "bhv_ttc_spinner_update", - "8030803c" : "bhv_mr_blizzard_init", - "80308d6c" : "bhv_mr_blizzard_update", - "80309154" : "bhv_mr_blizzard_snowball", - "803091e0" : "bhv_sliding_plat_2_init", - "80309354" : "bhv_sliding_plat_2_loop", - "80309454" : "bhv_rotating_octagonal_plat_init", - "803094d0" : "bhv_rotating_octagonal_plat_loop", - "803094f8" : "bhv_animates_on_floor_switch_press_init", - "80309530" : "bhv_animates_on_floor_switch_press_loop", - "803097a4" : "bhv_activated_back_and_forth_platform_init", - "803098c0" : "bhv_activated_back_and_forth_platform_update", - "80309b64" : "bhv_recovery_heart_loop", - "80309cec" : "bhv_bubble_cannon_barrel_loop", - "80309ed4" : "water_bomb_cannon_act_0", - "80309f68" : "water_bomb_cannon_act_1", - "8030a0e8" : "water_bomb_cannon_act_2", - "8030a11c" : "bhv_water_bomb_cannon_loop", - "8030a1c0" : "bhv_unagi_init", - "8030a2a8" : "unagi_act_0", - "8030a390" : "unagi_act_1_4", - "8030a514" : "unagi_act_2", - "8030a614" : "unagi_act_3", - "8030a93c" : "bhv_unagi_loop", - "8030aabc" : "bhv_unagi_subobject_loop", - "8030b2f4" : "bhv_dorrie_update", - "8030b658" : "bhv_haunted_chair_init", - "8030b6d8" : "haunted_chair_act_0", - "8030ba68" : "haunted_chair_act_1", - "8030bc90" : "bhv_haunted_chair_loop", - "8030bfd0" : "bhv_mad_piano_update", - "8030c06c" : "flying_bookend_act_0", - "8030c0f0" : "flying_bookend_act_1", - "8030c210" : "flying_bookend_act_2", - "8030c2c8" : "flying_bookend_act_3", - "8030c364" : "bhv_flying_bookend_loop", - "8030c4b0" : "bhv_bookend_spawn_loop", - "8030c564" : "bookshelf_manager_act_0", - "8030c60c" : "bookshelf_manager_act_1", - "8030c6a4" : "bookshelf_manager_act_2", - "8030c828" : "bookshelf_manager_act_3", - "8030c894" : "bookshelf_manager_act_4", - "8030c8ec" : "bhv_haunted_bookshelf_manager_loop", - "8030c98c" : "bhv_book_switch_loop", - "8030cd30" : "obj_spit_fire", - "8030cddc" : "bhv_fire_piranha_plant_init", - "8030d2f0" : "bhv_fire_piranha_plant_update", - "8030d598" : "bhv_fire_spitter_update", - "8030d640" : "bhv_small_piranha_flame_loop", - "8030d8d4" : "bhv_fly_guy_flame_loop", - "8030d93c" : "Geo18_8030D93C", - "8030d9ac" : "Geo18_8030D9AC", - "8030da14" : "snufit_act_0", - "8030db38" : "snufit_act_1", - "8030dc70" : "bhv_snufit_loop", - "8030dfc4" : "bhv_snufit_balls_loop", - "8030e14c" : "bhv_horizontal_grindel_init", - "8030e16c" : "bhv_horizontal_grindel_update", - "8030ea9c" : "bhv_eyerok_boss_loop", - "8030fff8" : "bhv_eyerok_hand_loop", - "80310498" : "bhv_klepto_init", - "8031126c" : "obj_set_speed_to_zero", - "8031129c" : "bhv_klepto_update", - "80311874" : "bhv_bird_update", - "803118e4" : "bhv_racing_penguin_init", - "80312070" : "bhv_racing_penguin_update", - "80312168" : "bhv_penguin_race_finish_line_update", - "80312200" : "bhv_penguin_race_shortcut_check_update", - "80312248" : "bhv_coffin_manager_loop", - "80312370" : "coffin_act_0", - "8031262c" : "coffin_act_1", - "8031274c" : "bhv_coffin_loop", - "80312804" : "clam_act_0", - "80312900" : "clam_act_1", - "80312a54" : "bhv_clam_loop", - "80313110" : "bhv_skeeter_update", - "803131e8" : "bhv_skeeter_wave_update", - "8031326c" : "bhv_swing_platform_init", - "80313294" : "bhv_swing_platform_update", - "80313354" : "bhv_donut_platform_spawner_update", - "80313530" : "bhv_donut_platform_update", - "803136cc" : "bhv_ddd_pole_init", - "80313754" : "bhv_ddd_pole_update", - "803137f4" : "bhv_red_coin_star_marker_init", - "80313fc0" : "bhv_triplet_butterfly_update", - "80314098" : "bubba_act_0", - "8031427c" : "bubba_act_1", - "803145d4" : "bhv_bubba_loop", - "80314a30" : "prepare_reverb_ring_buffer", - "80314cc0" : "get_volume_ramping", - "80314de4" : "synthesis_execute", - "80314f64" : "synthesis_do_one_audio_update", - "80315590" : "synthesis_process_notes", - "80316010" : "load_wave_samples", - "803160dc" : "final_resample", - "80316138" : "process_envelope", - "8031619c" : "process_envelope_inner", - "803166fc" : "note_apply_headset_pan_effects", - "80316ac8" : "note_init_volume", - "80316af4" : "note_set_vel_pan_reverb", - "80316da8" : "note_set_frequency", - "80316db4" : "note_enable", - "80316e00" : "note_disable", - "80316e80" : "reset_bank_and_seq_load_status", - "80316ec4" : "discard_bank", - "80316fb4" : "discard_sequence", - "80317040" : "soundAlloc", - "803170b4" : "sound_alloc_pool_init", - "803170d4" : "persistent_pool_clear", - "803170e8" : "temporary_pool_clear", - "80317118" : "unused_803160F8", - "80317128" : "sound_init_main_pools", - "80317184" : "session_pools_init", - "80317200" : "seq_and_bank_pool_init", - "8031727c" : "persistent_pools_init", - "80317338" : "temporary_pools_init", - "803173fc" : "alloc_bank_or_seq", - "8031782c" : "get_bank_or_seq", - "803178ec" : "decrease_reverb_gain", - "80317914" : "wait_for_audio_frames", - "80317948" : "audio_reset_session", - "80318040" : "audio_dma_copy_immediate", - "803180c4" : "audio_dma_copy_async", - "80318130" : "audio_dma_partial_copy_async", - "803181ec" : "decrease_sample_dma_ttls", - "80318300" : "dma_sample_data", - "80318634" : "init_sample_dma_buffers", - "803188f4" : "patch_audio_bank", - "80318b30" : "bank_load_immediate", - "80318c8c" : "bank_load_async", - "80318dc4" : "sequence_dma_immediate", - "80318e70" : "sequence_dma_async", - "80318fac" : "get_missing_bank", - "803190f4" : "load_banks_immediate", - "80319220" : "preload_sequence", - "80319328" : "load_sequence", - "80319388" : "load_sequence_internal", - "8031950c" : "audio_init", - "80319920" : "note_init", - "80319998" : "note_disable2", - "803199b8" : "process_notes", - "80319db8" : "seq_channel_layer_decay_release_internal", - "80319f64" : "seq_channel_layer_note_decay", - "80319f84" : "seq_channel_layer_note_release", - "80319fa4" : "build_synthetic_wave", - "8031a1d0" : "init_synthetic_wave", - "8031a254" : "init_note_list", - "8031a264" : "init_note_lists", - "8031a2b4" : "init_note_free_list", - "8031a368" : "note_pool_clear", - "8031a494" : "note_pool_fill", - "8031a5d0" : "audio_list_push_front", - "8031a610" : "audio_list_remove", - "8031a63c" : "pop_node_with_value_less_equal", - "8031a6cc" : "note_init_for_layer", - "8031a794" : "func_80319728", - "8031a7c8" : "note_release_and_take_ownership", - "8031a820" : "alloc_note_from_disabled", - "8031a89c" : "alloc_note_from_decaying", - "8031a8f0" : "alloc_note_from_active", - "8031a94c" : "alloc_note", - "8031ac34" : "reclaim_notes", - "8031adac" : "note_init_all", - "8031aee0" : "func_80319E70", - "8031aee8" : "sequence_player_process_sound", - "8031b0cc" : "get_portamento_freq_scale", - "8031b1c0" : "get_vibrato_pitch_change", - "8031b248" : "get_vibrato_freq_scale", - "8031b440" : "note_vibrato_update", - "8031b4a0" : "note_vibrato_init", - "8031b58c" : "adsr_init", - "8031b5ac" : "adsr_update", - "8031b830" : "sequence_channel_init", - "8031b940" : "seq_channel_set_layer", - "8031ba30" : "seq_channel_layer_disable", - "8031ba6c" : "seq_channel_layer_free", - "8031baf0" : "sequence_channel_disable", - "8031bb5c" : "allocate_sequence_channel", - "8031bba4" : "sequence_player_init_channels", - "8031bcd0" : "sequence_player_disable_channels", - "8031bda0" : "sequence_channel_enable", - "8031be44" : "sequence_player_disable", - "8031bf14" : "audio_list_push_back", - "8031bf54" : "audio_list_pop_back", - "8031bf94" : "init_layer_freelist", - "8031c03c" : "m64_read_u8", - "8031c050" : "m64_read_s16", - "8031c080" : "m64_read_compressed_u16", - "8031c0c4" : "seq_channel_layer_process_script", - "8031c200" : "L_U_8031C200", - "8031c23c" : "L_U_8031C23C", - "8031c298" : "L_U_8031C298", - "8031c2dc" : "L_U_8031C2DC", - "8031c328" : "L_U_8031C328", - "8031c36c" : "L_U_8031C36C", - "8031c3bc" : "L_U_8031C3BC", - "8031c3e8" : "L_U_8031C3E8", - "8031c454" : "L_U_8031C454", - "8031c4a4" : "L_U_8031C4A4", - "8031c5c8" : "L_U_8031C5C8", - "8031c698" : "L_U_8031C698", - "8031c6a0" : "L_U_8031C6A0", - "8031cbe0" : "L_U_8031CBE0", - "8031cbec" : "L_U_8031CBEC", - "8031ce54" : "get_instrument", - "8031cfd4" : "set_instrument", - "8031d068" : "sequence_channel_set_volume", - "8031d08c" : "sequence_channel_process_script", - "8031d144" : "L_U_8031D144", - "8031d1f8" : "L_U_8031D1F8", - "8031d234" : "L_U_8031D234", - "8031d26c" : "L_U_8031D26C", - "8031d2b4" : "L_U_8031D2B4", - "8031d2c4" : "L_U_8031D2C4", - "8031d31c" : "L_U_8031D31C", - "8031d344" : "L_U_8031D344", - "8031d354" : "L_U_8031D354", - "8031d370" : "L_U_8031D370", - "8031d3a8" : "L_U_8031D3A8", - "8031d3c4" : "L_U_8031D3C4", - "8031d3d4" : "L_U_8031D3D4", - "8031d3e4" : "L_U_8031D3E4", - "8031d400" : "L_U_8031D400", - "8031d424" : "L_U_8031D424", - "8031d44c" : "L_U_8031D44C", - "8031d474" : "L_U_8031D474", - "8031d498" : "L_U_8031D498", - "8031d4bc" : "L_U_8031D4BC", - "8031d4d4" : "L_U_8031D4D4", - "8031d4f0" : "L_U_8031D4F0", - "8031d500" : "L_U_8031D500", - "8031d51c" : "L_U_8031D51C", - "8031d538" : "L_U_8031D538", - "8031d56c" : "L_U_8031D56C", - "8031d5a0" : "L_U_8031D5A0", - "8031d5b4" : "L_U_8031D5B4", - "8031d5d4" : "L_U_8031D5D4", - "8031d5e4" : "L_U_8031D5E4", - "8031d640" : "L_U_8031D640", - "8031d678" : "L_U_8031D678", - "8031d6c4" : "L_U_8031D6C4", - "8031d6d4" : "L_U_8031D6D4", - "8031d6f4" : "L_U_8031D6F4", - "8031d718" : "L_U_8031D718", - "8031d728" : "L_U_8031D728", - "8031d73c" : "L_U_8031D73C", - "8031d7b8" : "L_U_8031D7B8", - "8031d7e8" : "L_U_8031D7E8", - "8031d7f8" : "L_U_8031D7F8", - "8031d814" : "L_U_8031D814", - "8031d830" : "L_U_8031D830", - "8031d87c" : "L_U_8031D87C", - "8031d898" : "L_U_8031D898", - "8031d8f8" : "L_U_8031D8F8", - "8031d900" : "L_U_8031D900", - "8031d930" : "L_U_8031D930", - "8031d94c" : "L_U_8031D94C", - "8031d974" : "L_U_8031D974", - "8031d9ec" : "sequence_player_process_sequence", - "8031e240" : "process_sequences", - "8031e2e8" : "init_sequence_player", - "8031e374" : "init_sequence_players", - "8031e4f0" : "unused_8031E4F0", - "8031e568" : "unused_8031E568", - "8031e7b8" : "create_next_audio_frame_task", - "8031eb00" : "play_sound", - "8031fd84" : "audio_signal_game_loop_tick", - "8031fdac" : "update_game_sound", - "80320544" : "play_sequence", - "80320678" : "sequence_player_fade_out", - "803206bc" : "fade_volume_scale", - "80320734" : "fade_channel_volume_scale", - "8032080c" : "func_8031F96C", - "803208ec" : "process_level_music_dynamics", - "80320a4c" : "L8031FBAC", - "80320a8c" : "L8031FBEC", - "80320acc" : "L8031FC2C", - "80320b0c" : "L8031FC6C", - "80320b4c" : "L8031FCAC", - "80320b8c" : "L8031FCEC", - "80320bcc" : "L8031FD2C", - "80320bf4" : "L8031FD54", - "80320d70" : "unused_8031FED0", - "80320e3c" : "func_8031FFB4", - "80320ec4" : "sequence_player_unlower", - "80320f68" : "func_803200E4", - "803210d4" : "set_sound_disabled", - "8032112c" : "sound_init", - "80321398" : "get_currently_playing_sound", - "80321474" : "func_803205E8", - "80321584" : "func_803206F8", - "8032171c" : "func_80320890", - "8032174c" : "sound_banks_disable", - "8032180c" : "sound_banks_enable", - "80321864" : "unused_803209D8", - "803218d8" : "func_80320A4C", - "803218f4" : "play_dialog_sound", - "803219ac" : "play_music", - "80321bac" : "stop_background_music", - "80321ce4" : "fadeout_background_music", - "80321d38" : "drop_queued_background_music", - "80321d5c" : "get_current_background_music", - "80321d9c" : "func_80320ED8", - "80321e48" : "play_secondary_music", - "80321f48" : "func_80321080", - "80321f9c" : "func_803210D4", - "80322078" : "play_course_clear", - "803220b4" : "play_peachs_jingle", - "803220f0" : "play_puzzle_jingle", - "8032212c" : "play_star_fanfare", - "80322168" : "play_power_star_jingle", - "803221b8" : "play_race_fanfare", - "803221f4" : "play_toads_jingle", - "80322230" : "sound_reset", - "8032231c" : "audio_set_sound_mode", - "80322348" : "unused_80321460", - "8032235c" : "unused_80321474", - "803223b0" : ".", - "803223b0" : "osSetTime", - "803223e0" : "osMapTLB", - "803224a0" : "osUnmapTLBAll", - "803224f0" : "sprintf", - "8032255c" : "proutSprintf", - "803225a0" : "osCreateMesgQueue", - "803225d0" : "osSetEventMesg", - "80322640" : "osViSetEvent", - "803226b0" : "osCreateThread", - "80322800" : "osRecvMesg", - "80322940" : "_VirtualToPhysicalTask", - "80322a5c" : "osSpTaskLoad", - "80322bbc" : "osSpTaskStartGo", - "80322c00" : "osSpTaskYield", - "80322c20" : "osSendMesg", - "80322d70" : "osSpTaskYielded", - "80322df0" : "osStartThread", - "80322f40" : "osWritebackDCacheAll", - "80322f70" : "osCreateViManager", - "803230f4" : "viMgrMain", - "803232d0" : "osViSetMode", - "80323340" : "osViBlack", - "803233b0" : "osViSetSpecialFeatures", - "80323570" : "osCreatePiManager", - "803236f0" : "osSetThreadPri", - "803237d0" : "osInitialize", - "80323a00" : "osViSwapBuffer", - "80323a50" : "sqrtf", - "80323a60" : "osContStartReadData", - "80323b24" : "osContGetReadData", - "80323bcc" : "__osPackReadData", - "80323cc0" : "osContInit", - "80323ebc" : "__osContGetInitData", - "80323f8c" : "__osPackRequestData", - "80324080" : "osEepromProbe", - "803240f0" : "__ull_rshift", - "8032411c" : "__ull_rem", - "80324158" : "__ull_div", - "80324194" : "__ll_lshift", - "803241c0" : "__ll_rem", - "803241fc" : "__ll_div", - "80324258" : "__ll_mul", - "80324288" : "__ull_divremi", - "803242e8" : "__ll_mod", - "80324384" : "__ll_rshift", - "803243b0" : "osInvalDCache", - "80324460" : "osPiStartDma", - "80324570" : "bzero", - "80324610" : "osInvalICache", - "80324690" : "osEepromLongRead", - "803247d0" : "osEepromLongWrite", - "80324910" : "bcopy", - "80324c20" : "guOrthoF", - "80324d74" : "guOrtho", - "80324de0" : "guPerspectiveF", - "80325010" : "guPerspective", - "80325070" : "osGetTime", - "80325100" : "__d_to_ll", - "8032511c" : "__f_to_ll", - "80325138" : "__d_to_ull", - "803251d8" : "__f_to_ull", - "80325274" : "__ll_to_d", - "8032528c" : "__ll_to_f", - "803252a4" : "__ull_to_d", - "803252d8" : "__ull_to_f", - "80325310" : "cosf", - "80325480" : "sinf", - "80325640" : "guTranslateF", - "80325688" : "guTranslate", - "803256e0" : "guRotateF", - "80325874" : "guRotate", - "803258d0" : "guScaleF", - "80325924" : "guScale", - "80325970" : "osAiSetFrequency", - "80325bd4" : "alBnkfNew", - "80325cd8" : "alSeqFileNew", - "80325d20" : "osWritebackDCache", - "80325da0" : "osAiGetLength", - "80325db0" : "osAiSetNextBuffer", - "80325e60" : "__osTimerServicesInit", - "80325eec" : "__osTimerInterrupt", - "80326064" : "__osSetTimerIntr", - "803260d8" : "__osInsertTimer", - "80326260" : "_Printf", - "803273f0" : "memcpy", - "8032741c" : "strlen", - "80327444" : "strchr", - "80327490" : "__osDequeueThread", - "803274d0" : "__osDisableInt", - "803274f0" : "__osRestoreInt", - "80327510" : "__osViInit", - "80327640" : "__osExceptionPreamble", - "80327650" : "__osException", - "803278e4" : "L80326964", - "80327904" : "L80326984", - "80327938" : "L803269B8", - "80327a68" : "L80326AE8", - "80327ac4" : "L80326B44", - "80327ae4" : "L80326B64", - "80327b1c" : "L80326B9C", - "80327b68" : "L80326BE8", - "80327b98" : "send_mesg", - "80327c80" : "__osEnqueueAndYield", - "80327d10" : "__osEnqueueThread", - "80327d58" : "__osPopThread", - "80327d68" : "__osDispatchThread", - "80327ea8" : "__osCleanupThread", - "80327eb0" : "osVirtualToPhysical", - "80327f30" : "__osSpSetStatus", - "80327f40" : "__osSpSetPc", - "80327f80" : "__osSpRawStartDma", - "80328010" : "__osSpDeviceBusy", - "80328040" : "__osSpGetStatus", - "80328050" : "osGetThreadPri", - "80328070" : "__osViGetCurrentContext", - "80328080" : "__osViSwapContext", - "803283e0" : "osGetCount", - "803283f0" : "__osPiCreateAccessQueue", - "80328440" : "__osPiGetAccess", - "80328484" : "__osPiRelAccess", - "803284b0" : "osPiRawStartDma", - "80328590" : "__osDevMgrMain", - "80328710" : "__osSetSR", - "80328720" : "__osGetSR", - "80328730" : "__osSetFpcCsr", - "80328740" : "__osSiRawReadIo", - "80328790" : "__osSiRawWriteIo", - "803287e0" : "osMapTLBRdb", - "80328840" : "osPiRawReadIo", - "803288a0" : "__osSiCreateAccessQueue", - "803288f0" : "__osSiGetAccess", - "80328934" : "__osSiRelAccess", - "80328960" : "__osSiRawStartDma", - "80328a10" : "osSetTimer", - "80328af0" : "osEepromWrite", - "80328ca0" : "__osPackEepWriteData", - "80328dac" : "__osEepStatus", - "80328fd0" : "osJamMesg", - "80329120" : "osPiGetCmdQueue", - "80329150" : "osEepromRead", - "80329340" : "__osPackEepReadData", - "80329450" : "guMtxF2L", - "80329550" : "guMtxIdentF", - "803295d8" : "guMtxIdent", - "80329608" : "guMtxL2F", - "803296c0" : "guNormalize", - "80329750" : "__osAiDeviceBusy", - "80329780" : "__osSetCompare", - "80329790" : "_Litob", - "80329a90" : "_Ldtob", - "8032a860" : "u32_to_string", - "8032a890" : "string_to_u32", - "8032a8e8" : "send_packet", - "8032a9a8" : "send", - "8032aa80" : "process_command_memory", - "8032aacc" : "process_command_register", - "8032aaf8" : "kdebugserver", - "8032ace0" : "__osSyncPutChars", - "8032ae10" : "osSetIntMask", - "8032ae70" : "osDestroyThread", - "8032af70" : "__osProbeTLB", - "8032b030" : "__osSiDeviceBusy", - "8032b060" : "lldiv", - "8032b160" : "ldiv", - "8032b1f0" : "__osGetCause", - "8032b200" : "__osAtomicDec", - "8032b260" : "rspF3DBootStart", - "8032b330" : "rspF3DBootEnd", - "8032b330" : "rspF3DStart", - "8032c738" : "rspF3DEnd", - "8032c740" : "rspAspMainStart", - "8032d560" : "rspAspMainEnd", - "8032d560" : "gVblankHandler1", - "8032d564" : "gVblankHandler2", - "8032d568" : "gActiveSPTask", - "8032d56c" : "sCurrentAudioSPTask", - "8032d570" : "sCurrentDisplaySPTask", - "8032d574" : "sNextAudioSPTask", - "8032d578" : "sNextDisplaySPTask", - "8032d57c" : "sAudioEnabled", - "8032d580" : "sNumVblanks", - "8032d584" : "gResetTimer", - "8032d588" : "D_8032C648", - "8032d58c" : "gDebugLevelSelect", - "8032d590" : "D_8032C650", - "8032d594" : "gShowProfiler", - "8032d598" : "gShowDebugText", - "8032d5d0" : "unused8032C690", - "8032d5d4" : "gGlobalTimer", - "8032d5dc" : "frameBufferIndex", - "8032d5e0" : "D_8032C6A0", - "8032d5e4" : "gPlayer1Controller", - "8032d5e8" : "gPlayer2Controller", - "8032d5ec" : "gPlayer3Controller", - "8032d5f0" : "gCurrDemoInput", - "8032d5f4" : "gDemoInputListID", - "8032d5f8" : "gRecordedDemoInput", - "8032d6d0" : "credits01", - "8032d6d8" : "credits02", - "8032d6e4" : "credits03", - "8032d6f0" : "credits04", - "8032d700" : "credits05", - "8032d710" : "credits06", - "8032d71c" : "credits07", - "8032d728" : "credits08", - "8032d738" : "credits09", - "8032d740" : "credits10", - "8032d750" : "credits11", - "8032d75c" : "credits12", - "8032d764" : "credits13", - "8032d774" : "credits14", - "8032d77c" : "credits15", - "8032d788" : "credits16", - "8032d79c" : "credits17", - "8032d7ac" : "credits18", - "8032d7bc" : "credits19", - "8032d7c4" : "credits20", - "8032d7cc" : "sCreditsSequence", - "8032d93c" : "gMarioState", - "8032d940" : "unused1", - "8032d944" : "D_8032C9E0", - "8032daa0" : "sTerrainSounds", - "8032dacc" : "sSquishScaleOverTime", - "8032dae0" : "sCapFlickerFrames", - "8032daf8" : "gWaterSurfacePseudoFloor", - "8032dc50" : "sJumpLandAction", - "8032dc68" : "sFreefallLandAction", - "8032dc80" : "sSideFlipLandAction", - "8032dc98" : "sHoldJumpLandAction", - "8032dcb0" : "sHoldFreefallLandAction", - "8032dcc8" : "sLongJumpLandAction", - "8032dce0" : "sDoubleJumpLandAction", - "8032dcf8" : "sTripleJumpLandAction", - "8032dd10" : "sBackflipLandAction", - "8032dd40" : "sPunchingForwardVelocities", - "8032dd80" : "gLastCompletedCourseNum", - "8032dd84" : "gLastCompletedStarNum", - "8032dd88" : "sUnusedGotGlobalCoinHiScore", - "8032dd8c" : "gGotFileCoinHiScore", - "8032dd90" : "gCurrCourseStarFlags", - "8032dd94" : "gSpecialTripleJump", - "8032dd98" : "gLevelToCourseNumTable", - "8032ddc0" : "gMarioSpawnInfo", - "8032ddc4" : "gLoadedGraphNodes", - "8032ddc8" : "gAreas", - "8032ddcc" : "gCurrentArea", - "8032ddd0" : "gCurrCreditsEntry", - "8032ddd4" : "D_8032CE74", - "8032ddd8" : "D_8032CE78", - "8032dddc" : "gWarpTransDelay", - "8032dde0" : "gFBSetColor", - "8032dde4" : "gWarpTransFBSetColor", - "8032dde8" : "gWarpTransRed", - "8032ddec" : "gWarpTransGreen", - "8032ddf0" : "gWarpTransBlue", - "8032ddf4" : "gCurrSaveFileNum", - "8032ddf8" : "gCurrLevelNum", - "8032ddfc" : "D_8032CE9C", - "8032de4c" : "D_8032CEEC", - "8032de60" : "D_8032CF00", - "8032de70" : "renderModeTable_1Cycle", - "8032deb0" : "renderModeTable_2Cycle", - "8032def0" : "gCurGraphNodeRoot", - "8032def4" : "gCurGraphNodeMasterList", - "8032def8" : "gCurGraphNodeCamFrustum", - "8032defc" : "gCurGraphNodeCamera", - "8032df00" : "gCurGraphNodeObject", - "8032df04" : "gCurGraphNodeHeldObject", - "8032df08" : "gAreaUpdateCounter", - "8032df10" : "gProfilerMode", - "8032df14" : "gCurrentFrameIndex1", - "8032df18" : "gCurrentFrameIndex2", - "8032df20" : "unused8032CFC0", - "8032df24" : "gCutsceneFocus", - "8032df28" : "unused8032CFC8", - "8032df2c" : "unused8032CFCC", - "8032df30" : "gSecondCameraFocus", - "8032df34" : "sYawSpeed", - "8032df38" : "gCurrLevelArea", - "8032df3c" : "gPrevLevel", - "8032df40" : "unused8032CFE0", - "8032df44" : "unused8032CFE4", - "8032df48" : "unused8032CFE8", - "8032df4c" : "gCameraZoomDist", - "8032df50" : "sObjectCutscene", - "8032df54" : "gRecentCutscene", - "8032df58" : "sFramesSinceCutsceneEnded", - "8032df5c" : "sCutsceneDialogResponse", - "8032df60" : "sMarioCamState", - "8032df64" : "sLuigiCamState", - "8032df68" : "unused8032D008", - "8032df6c" : "sFixedModeBasePosition", - "8032df78" : "sUnusedModeBasePosition_2", - "8032df84" : "sUnusedModeBasePosition_3", - "8032df90" : "sUnusedModeBasePosition_4", - "8032df9c" : "sUnusedModeBasePosition_5", - "8032dfa8" : "sModeTransitions", - "8032e008" : "unused8032D0A8", - "8032e010" : "unused8032D0B0", - "8032e018" : "sDanceCutsceneTable", - "8032e024" : "unusedDanceInfo1", - "8032e038" : "unusedDanceType", - "8032e03c" : "unusedDanceInfo2", - "8032e050" : "sBBHLibraryParTrackPath", - "8032e098" : "sCamSL", - "8032e0e0" : "sCamTHI", - "8032e128" : "sCamHMC", - "8032e1d0" : "sCamSSL", - "8032e248" : "sCamRR", - "8032e2f0" : "sCamBOB", - "8032e338" : "sCamCotMC", - "8032e368" : "sCamCCM", - "8032e3b0" : "sCamCastle", - "8032e6f8" : "sCamBBH", - "8032ecb0" : "sCameraTriggers", - "8032ed50" : "sIntroStartToPipePosition", - "8032ee08" : "sIntroStartToPipeFocus", - "8032eec0" : "sIntroPipeToDialogPosition", - "8032ef30" : "sIntroPipeToDialogFocus", - "8032efa0" : "sEndingFlyToWindowPos", - "8032eff0" : "sEndingFlyToWindowFocus", - "8032f048" : "sEndingPeachDescentCamPos", - "8032f0e8" : "sEndingMarioToPeachPos", - "8032f130" : "sEndingMarioToPeachFocus", - "8032f178" : "sEndingLookUpAtCastle", - "8032f1b8" : "sEndingLookAtSkyFocus", - "8032f214" : "gIntroLakituStartToPipeFocus", - "8032f32c" : "gIntroLakituStartToPipeOffsetFromCamera", - "8032f444" : "gEndWavingPos", - "8032f48c" : "gEndWavingFocus", - "8032f4d4" : "sCutsceneEnding", - "8032f534" : "sCutsceneGrandStar", - "8032f544" : "sCutsceneUnused", - "8032f554" : "sCutsceneDoorWarp", - "8032f564" : "sCutsceneEndWaving", - "8032f56c" : "sCutsceneCredits", - "8032f574" : "sCutsceneDoorPull", - "8032f59c" : "sCutsceneDoorPush", - "8032f5c4" : "sCutsceneDoorPullMode", - "8032f5dc" : "sCutsceneDoorPushMode", - "8032f5f4" : "sCutsceneEnterCannon", - "8032f60c" : "sCutsceneStarSpawn", - "8032f624" : "sCutsceneRedCoinStarSpawn", - "8032f634" : "sCutsceneEnterPainting", - "8032f63c" : "sCutsceneDeathExit", - "8032f64c" : "sCutsceneExitPaintingSuccess", - "8032f65c" : "sCutsceneUnusedExit", - "8032f674" : "sCutsceneIntroPeach", - "8032f69c" : "sCutscenePrepareCannon", - "8032f6ac" : "sCutsceneExitWaterfall", - "8032f6bc" : "sCutsceneFallToCastleGrounds", - "8032f6cc" : "sCutsceneEnterPyramidTop", - "8032f6dc" : "sCutscenePyramidTopExplode", - "8032f6f4" : "sCutsceneStandingDeath", - "8032f6fc" : "sCutsceneEnterPool", - "8032f70c" : "sCutsceneDeathStomach", - "8032f714" : "sCutsceneDeathOnBack", - "8032f71c" : "sCutsceneQuicksandDeath", - "8032f724" : "sCutsceneWaterDeath", - "8032f72c" : "sCutsceneSuffocation", - "8032f734" : "sCutsceneEnterBowserArena", - "8032f74c" : "sCutsceneDanceDefaultRotate", - "8032f754" : "sCutsceneDanceFlyAway", - "8032f75c" : "sCutsceneDanceCloseup", - "8032f764" : "sCutsceneKeyDance", - "8032f76c" : "sCutsceneCapSwitchPress", - "8032f774" : "sCutsceneSlidingDoorsOpen", - "8032f784" : "sCutsceneUnlockKeyDoor", - "8032f794" : "sCutsceneExitBowserSuccess", - "8032f7a4" : "sCutsceneExitBowserDeath", - "8032f7b4" : "sCutsceneExitSpecialSuccess", - "8032f7c4" : "sCutsceneNonPaintingDeath", - "8032f7d4" : "sCutsceneDialog", - "8032f7ec" : "sCutsceneReadMessage", - "8032f804" : "sDanceCutsceneIndexTable", - "8032f870" : "sZoomOutAreaMasks", - "8032f884" : "sBobCreditsSplinePositions", - "8032f8ac" : "sBobCreditsSplineFocus", - "8032f8d4" : "sWfCreditsSplinePositions", - "8032f8fc" : "sWfCreditsSplineFocus", - "8032f924" : "sJrbCreditsSplinePositions", - "8032f94c" : "sJrbCreditsSplineFocus", - "8032f974" : "sCcmSlideCreditsSplinePositions", - "8032f99c" : "sCcmSlideCreditsSplineFocus", - "8032f9c4" : "sBbhCreditsSplinePositions", - "8032f9e4" : "sBbhCreditsSplineFocus", - "8032fa04" : "sHmcCreditsSplinePositions", - "8032fa2c" : "sHmcCreditsSplineFocus", - "8032fa54" : "sThiWigglerCreditsSplinePositions", - "8032fa6c" : "sThiWigglerCreditsSplineFocus", - "8032fa84" : "sVolcanoCreditsSplinePositions", - "8032fab4" : "sVolcanoCreditsSplineFocus", - "8032fae4" : "sSslCreditsSplinePositions", - "8032fb14" : "sSslCreditsSplineFocus", - "8032fb44" : "sDddCreditsSplinePositions", - "8032fb7c" : "sDddCreditsSplineFocus", - "8032fbb4" : "sSlCreditsSplinePositions", - "8032fbd4" : "sSlCreditsSplineFocus", - "8032fbf4" : "sWdwCreditsSplinePositions", - "8032fc14" : "sWdwCreditsSplineFocus", - "8032fc34" : "sTtmCreditsSplinePositions", - "8032fc64" : "sTtmCreditsSplineFocus", - "8032fc94" : "sThiHugeCreditsSplinePositions", - "8032fccc" : "sThiHugeCreditsSplineFocus", - "8032fd04" : "sTtcCreditsSplinePositions", - "8032fd24" : "sTtcCreditsSplineFocus", - "8032fd44" : "sRrCreditsSplinePositions", - "8032fd64" : "sRrCreditsSplineFocus", - "8032fd84" : "sSaCreditsSplinePositions", - "8032fdac" : "sSaCreditsSplineFocus", - "8032fdd4" : "sCotmcCreditsSplinePositions", - "8032fdfc" : "sCotmcCreditsSplineFocus", - "8032fe24" : "sDddSubCreditsSplinePositions", - "8032fe4c" : "sDddSubCreditsSplineFocus", - "8032fe74" : "sCcmOutsideCreditsSplinePositions", - "8032fe94" : "sCcmOutsideCreditsSplineFocus", - "8032fec0" : "sObjectListUpdateOrder", - "8032fecc" : "sParticleTypes", - "80330000" : "D_8032F0A0", - "80330004" : "D_8032F0A4", - "80330020" : "D_8032F0C0", - "8033002c" : "D_8032F0CC", - "8033006c" : "sMrIParticleActions", - "80330074" : "sMrIActions", - "80330084" : "sMrIHitbox", - "80330094" : "D_8032F134", - "803300a8" : "unused8032F134", - "803300ac" : "sCapSwitchActions", - "803300bc" : "sKingBobombActions", - "803300e0" : "sKingBobombSoundStates", - "80330140" : "sOpenedCannonActions", - "8033015c" : "unused0EA1FC", - "80330198" : "sChuckyaActions", - "803301a8" : "sWFRotatingPlatformData", - "803301c0" : "sKoopaShellUnderwaterHitbox", - "803301d0" : "D_8032F270", - "803301e4" : "sSparkleSpawnStarHitbox", - "803301f4" : "sYellowCoinHitbox", - "80330204" : "D_8032F2A4", - "80330224" : "sCoinInsideBooActions", - "8033022c" : "D_8032F2CC", - "80330244" : "D_8032F2E4", - "80330260" : "D_8032F300", - "80330288" : "D_8032F328", - "80330290" : "D_8032F330", - "80330298" : "sGrindelThwompActions", - "803302ac" : "sTumblingBridgeParams", - "803302dc" : "sTumblingBridgeActions", - "803302ec" : "D_8032F38C", - "80330318" : "sElevatorActions", - "8033032c" : "D_8032F3CC", - "80330340" : "D_8032F3E0", - "80330354" : "D_8032F3F4", - "8033035c" : "D_8032F3FC", - "80330370" : "sUkikiCageActions", - "80330380" : "D_8032F420", - "80330390" : "sSpindriftHitbox", - "803303a0" : "sMetalBoxHitbox", - "803303b0" : "sBreakableBoxHitbox", - "803303c0" : "D_8032F460", - "803303e8" : "sHeaveHoActions", - "803303f8" : "sJumpingBoxHitbox", - "80330408" : "sJumpingBoxActions", - "8033042c" : "sBowserKeyHitbox", - "8033043c" : "sBulletBillActions", - "80330450" : "sBowserTailAnchorActions", - "8033045c" : "D_8032F4FC", - "8033046c" : "D_8032F50C", - "80330470" : "D_8032F510", - "80330474" : "D_8032F514", - "80330478" : "sBowserDefeatedDialogText", - "80330480" : "D_8032F520", - "803304c8" : "sBowserActions", - "80330518" : "D_8032F5B8", - "803305f0" : "D_8032F690", - "803305f4" : "D_8032F694", - "803305f8" : "D_8032F698", - "8033067c" : "sFallingBowserPlatformActions", - "80330688" : "sGrowingBowserFlameHitbox", - "80330698" : "sBowserFlameHitbox", - "803306a8" : "D_8032F748", - "803306b4" : "D_8032F754", - "803306dc" : "sCageUkikiPath", - "80330738" : "sUkikiSoundStates", - "803307a0" : "sUkikiActions", - "803307c0" : "D_8032F860", - "803307f4" : "D_8032F894", - "80330828" : "D_8032F8C8", - "80330830" : "sRotatingCwFireBarsActions", - "80330840" : "sKoopaShellHitbox", - "80330850" : "D_8032F8F0", - "80330884" : "D_8032F924", - "803308a8" : "D_8032F948", - "803308cc" : "D_8032F96C", - "803308d8" : "sToxBoxActions", - "80330900" : "TablePiranhaPlantActions", - "80330b1c" : "sBowserPuzzlePieceActions", - "80330b38" : "sTuxiesMotherActions", - "80330b44" : "sSmallPenguinActions", - "80330b5c" : "sFishActions", - "80330b68" : "sFishGroupActions", - "80330b74" : "sBirdChirpChirpActions", - "80330b84" : "sCheepCheepActions", - "80330b90" : "sExclamationBoxHitbox", - "80330ba0" : "sExclamationBoxContents", - "80330c20" : "sExclamationBoxActions", - "80330c38" : "sSkullSlidingBoxHitbox", - "80330c48" : "D_8032FCE8", - "80330c58" : "sTweesterHitbox", - "80330c68" : "sTweesterActions", - "80330cd4" : "sScuttlebugHitbox", - "80330ce4" : "sWhompActions", - "80330d0c" : "D_8032FDAC", - "80330d30" : "D_8032FDD0", - "80330d54" : "D_8032FDF4", - "80330d78" : "D_8032FE18", - "80330d9c" : "sWindParticleHitbox", - "80330dac" : "D_8032FE4C", - "80330e20" : "D_8032FEC0", - "80330e24" : "unused_8032FEC4", - "80330e34" : "gMarioPlatform", - "80330e40" : "sDebugEffectStringInfo", - "80330e64" : "sDebugEnemyStringInfo", - "80330e88" : "sDebugInfoDPadMask", - "80330e8c" : "sDebugInfoDPadUpdID", - "80330e90" : "sDebugLvSelectCheckFlag", - "80330e94" : "sDebugPage", - "80330e98" : "sNoExtraDebug", - "80330e9c" : "sDebugStringArrPrinted", - "80330ea0" : "sDebugSysCursor", - "80330ea4" : "sDebugInfoButtonSeqID", - "80330ea8" : "sDebugInfoButtonSeq", - "80330ec0" : "sTransitionColorFadeCount", - "80330ec4" : "sTransitionTextureFadeCount", - "80330ec8" : "sTextureTransitionID", - "80330ee0" : "rectangles", - "80330f00" : "sSkyboxTextures", - "80330f28" : "sSkyboxColors", - "80330f30" : "gMovtexCounter", - "80330f34" : "gMovtexCounterPrev", - "80330f38" : "gMovtexVtxColor", - "80330f3c" : "gPaintingMarioYEntry", - "80330f40" : "gWdwWaterLevelSet", - "80330f44" : "gMovtexIdToTexture", - "80330f64" : "gMovtexNonColored", - "803311a4" : "gMovtexColored", - "8033127c" : "gMovtexColored2", - "80331300" : "hmcPaintings", - "80331308" : "insideCastlePaintings", - "80331344" : "ttmPaintings", - "8033134c" : "paintingGroups", - "80331358" : "gPaintingUpdateCounter", - "8033135c" : "gLastPaintingUpdateCounter", - "80331360" : "sTextLabelsCount", - "80331370" : "gDialogCharWidths", - "80331470" : "gDialogBoxState", - "80331474" : "gDialogBoxOpenTimer", - "80331478" : "gDialogBoxScale", - "8033147c" : "gDialogScrollOffsetY", - "80331480" : "gDialogBoxType", - "80331484" : "gDialogID", - "80331488" : "gLastDialogPageStrPos", - "8033148c" : "gDialogTextPos", - "80331490" : "gDialogLineNum", - "80331494" : "gLastDialogResponse", - "80331498" : "gMenuHoldKeyIndex", - "8033149c" : "gMenuHoldKeyTimer", - "803314a0" : "gDialogResponse", - "803314b0" : "gHudSymCoin", - "803314b4" : "gHudSymX", - "803314f8" : "gMenuMode", - "803314fc" : "gEndCutsceneStrEn0", - "80331504" : "gEndCutsceneStrEn1", - "80331538" : "gEndCutsceneStrEn2", - "80331558" : "gEndCutsceneStrEn3", - "8033156c" : "gEndCutsceneStrEn4", - "80331598" : "gEndCutsceneStrEn5", - "803315ac" : "gEndCutsceneStrEn6", - "803315cc" : "gEndCutsceneStrEn7", - "803315dc" : "gEndCutsceneStrEn8", - "803315e4" : "gEndCutsceneStringsEn", - "8033160c" : "gCutsceneMsgFade", - "80331610" : "gCutsceneMsgIndex", - "80331614" : "gCutsceneMsgDuration", - "80331618" : "gCutsceneMsgTimer", - "8033161c" : "gDialogCameraAngleIndex", - "80331620" : "gDialogCourseActNum", - "803316c8" : "gCourseCompleteCoinsEqual", - "803316cc" : "gCourseDoneMenuTimer", - "803316d0" : "gCourseCompleteCoins", - "803316d4" : "gHudFlash", - "80331750" : "gEnvFxMode", - "80331754" : "D_80330644", - "80331758" : "gSnowTempVtx", - "80331788" : "gSnowFlakeVertex1", - "80331790" : "gSnowFlakeVertex2", - "80331798" : "gSnowFlakeVertex3", - "803317a0" : "D_80330690", - "803317a4" : "D_80330694", - "803317a8" : "gBubbleTempVtx", - "803317e0" : "MacroObjectPresets", - "803325fc" : "sPowerMeterVisibleTimer", - "80332614" : "sPrevCheckMarioRoom", - "80332618" : "sYoshiDead", - "8033261c" : "sDebugSequenceTracker", - "80332620" : "sDebugTimer", - "803327a8" : "sBreakableBoxSmallHitbox", - "80332b00" : "sMrBlizzardHitbox", - "80332b10" : "D_80331A00", - "80332b24" : "sMrBlizzardSnowballHitbox", - "80332b34" : "D_80331A24", - "80332b54" : "D_80331A44", - "80332b5c" : "D_80331A4C", - "80332b64" : "D_80331A54", - "80332bdc" : "D_80331ACC", - "80332bf0" : "sRecoveryHeartHitbox", - "80332c00" : "sUnagiHitbox", - "80332c10" : "sHauntedChairHitbox", - "80332c30" : "sFlyingBookendHitbox", - "80332c40" : "D_80331B30", - "80332c4c" : "sBookSwitchHitbox", - "80332c5c" : "sFirePiranhaPlantHitbox", - "80332c6c" : "D_80331B5C", - "80332c74" : "sPiranhaPlantFireHitbox", - "80332c84" : "sSnufitHitbox", - "80332c94" : "sSnufitBulletHitbox", - "80332ca4" : "sEyerokHitbox", - "80332cb4" : "D_80331BA4", - "80332d10" : "D_80331C00", - "80332d28" : "sClamShellHitbox", - "80332d38" : "sSkeeterHitbox", - "80332d48" : "D_80331C38", - "80332e50" : "gAudioErrorFlags", - "80332e54" : "sGameLoopTicked", - "80332e58" : "sDialogSpeaker", - "80332f04" : "sDialogSpeakerVoice", - "80332f40" : "sNumProcessedSoundRequests", - "80332f44" : "sSoundRequestCount", - "80332f48" : "sDynBbh", - "80332f54" : "sDynDdd", - "80332f6c" : "sDynJrb", - "80332f88" : "sDynWdw", - "80332f98" : "sDynHmc", - "80332fa8" : "sDynUnk38", - "80332fb8" : "sDynNone", - "80332fbc" : "sCurrentMusicDynamic", - "80332fc0" : "sBackgroundMusicForDynamics", - "80332fc4" : "sLevelDynamics", - "80333060" : "sMusicDynamics", - "803330c0" : "gAreaEchoLevel", - "80333138" : "D_80332028", - "80333188" : "sBackgroundMusicDefaultVolume", - "803331ac" : "sPlayer0CurSeqId", - "803331b0" : "sMusicDynamicDelay", - "803331b4" : "D_803320A4", - "803331c0" : "D_803320B0", - "803331cc" : "D_803320BC", - "803331d8" : "sMaxChannelsForSoundBank", - "803331e4" : "sNumSoundsPerBank", - "803331f0" : "gDefaultSoundArgs", - "803331fc" : "sUnusedSoundArgs", - "80333208" : "sSoundBankDisabled", - "80333218" : "D_80332108", - "8033321c" : "sHasStartedFadeOut", - "80333220" : "D_80332110", - "80333224" : "sUnused80332114", - "80333228" : "sUnused80332118", - "8033322c" : "D_8033211C", - "80333230" : "D_80332120", - "80333234" : "D_80332124", - "80333238" : "sBackgroundMusicQueueSize", - "8033323c" : "sUnused8033323C", - "803332a0" : "gAudioSessionPresets", - "80333498" : "gAudioCosineTable", - "80333598" : "gPitchBendFrequencyScale", - "80333994" : "gNoteFrequencies", - "80333b94" : "gDefaultShortNoteVelocityTable", - "80333ba4" : "gDefaultShortNoteDurationTable", - "80333bb4" : "gVibratoCurve", - "80333bc4" : "gDefaultEnvelope", - "80333bd0" : "sSineWave", - "80333c50" : "sSquareWave", - "80333cd0" : "sTriangleWave", - "80333d50" : "sSawtoothWave", - "80333dd0" : "gWaveSamples", - "80333de0" : "gHeadsetPanQuantization", - "80333df4" : "gHeadsetPanVolume", - "80333ff4" : "gStereoPanVolume", - "803341f4" : "gDefaultPanVolume", - "803343f4" : "gVolRampingLhs136", - "803345f4" : "gVolRampingRhs136", - "803347f4" : "gVolRampingLhs144", - "803349f4" : "gVolRampingRhs144", - "80334bf4" : "gVolRampingLhs128", - "80334df4" : "gVolRampingRhs128", - "80334ff4" : "gTatumsPerBeat", - "80334ff8" : "gUnusedCount80333EE8", - "80334ffc" : "gAudioHeapSize", - "80335000" : "D_80333EF0", - "80335004" : "gAudioLoadLock", - "80335008" : "sUnused8033EF8", - "80335010" : "osViModeTable", - "803358d0" : "viMgrMainArgs", - "803358f0" : "piMgrArgs", - "80335910" : "osClockRate", - "80335918" : "D_80334808", - "80335920" : "D_80334810", - "80335930" : "D_80334820", - "80335940" : "D_80334830", - "80335950" : "_spaces", - "80335974" : "_zeroes", - "803359a0" : "D_80334890", - "803359a4" : "unknown", - "803359a8" : "D_80334898", - "803359ac" : "D_8033489C", - "803359b0" : "D_803348A0", - "803359b4" : "D_803348A4", - "803359c0" : "D_803348B0", - "80335a20" : "D_80334910", - "80335a24" : "D_80334914", - "80335a28" : "D_80334918", - "80335a2c" : "D_8033491C", - "80335a30" : "D_80334920", - "80335a44" : "D_80334934", - "80335a48" : "D_80334938", - "80335a50" : "gOsPiAccessQueueCreated", - "80335a60" : "gOsSiAccessQueueCreated", - "80335aa0" : "D_80334990", - "80335af0" : "D_803349E0", - "80335b40" : "D_80334A30", - "80335b44" : "D_80334A34", - "80335b48" : "D_80334A38", - "80335b50" : "D_80334A40", - "80335b54" : "D_80334A44", - "80338da0" : "D_80337BB0", - "80338da8" : "D_80337BB8", - "80338e60" : "jtbl_80337C90", - "80338e84" : "jtbl_80337CB4", - "80338eac" : "jtbl_80337CDC", - "80338ec0" : "jtbl_80337D08", - "80338fbc" : "jtbl_80337E04", - "8033978c" : "jtbl_80338418", - "80339880" : "length_str", - "80339884" : "flags_str", - "8033988c" : "flags_arr", - "80339980" : "D_80338610", - "803399a0" : "jtbl_80338630", - "803399d0" : "NAN", - "803399e0" : "D_80338670", - "80339a40" : "D_803386D0", - "80339ac0" : "rspF3DDataStart", - "8033a2c0" : "rspF3DDataEnd", - "8033a2c0" : "rspAspMainDataStart", - "8033a580" : "rspAspMainDataEnd", - "8033a580" : "_mainSegmentEnd", - "008c0c40" : "_mainSegmentRomEnd", - "8033a580" : "_mainSegmentNoloadStart", - "8033a580" : "D_80339210", - "8033a730" : "gIdleThread", - "8033a8e0" : "gMainThread", - "8033aa90" : "gGameLoopThread", - "8033ac40" : "gSoundThread", - "8033adf0" : "gPIMesgQueue", - "8033ae08" : "gIntrMesgQueue", - "8033ae20" : "gSPTaskMesgQueue", - "8033ae38" : "gDmaMesgBuf", - "8033ae40" : "gPIMesgBuf", - "8033aec0" : "gSIEventMesgBuf", - "8033aec8" : "gIntrMesgBuf", - "8033af08" : "gUnknownMesgBuf", - "8033af48" : "gDmaIoMesg", - "8033af5c" : "D_80339BEC", - "8033af60" : "gDmaMesgQueue", - "8033af78" : "gSIEventMesgQueue", - "8033af90" : "gControllers", - "8033afe8" : "gControllerStatuses", - "8033aff8" : "gControllerPads", - "8033b010" : "gGameVblankQueue", - "8033b028" : "D_80339CB8", - "8033b040" : "D_80339CD0", - "8033b044" : "D_80339CD4", - "8033b048" : "gGameVblankHandler", - "8033b050" : "gPhysicalFrameBuffers", - "8033b05c" : "gPhysicalZBuffer", - "8033b060" : "D_80339CF0", - "8033b064" : "D_80339CF4", - "8033b068" : "gGfxSPTask", - "8033b06c" : "gDisplayListHead", - "8033b070" : "gGfxPoolEnd", - "8033b074" : "gGfxPool", - "8033b078" : "gControllerBits", - "8033b079" : "gEepromProbe", - "8033b080" : "D_80339D10", - "8033b090" : "gDemo", - "8033b0a0" : "filler80339D30", - "8033b170" : "gMarioStates", - "8033b238" : "sCurrPlayMode", - "8033b23a" : "D_80339ECA", - "8033b23c" : "sTransitionTimer", - "8033b240" : "sTransitionUpdate", - "8033b244" : "unused3", - "8033b248" : "sWarpDest", - "8033b250" : "D_80339EE0", - "8033b252" : "sDelayedWarpOp", - "8033b254" : "sDelayedWarpTimer", - "8033b256" : "sSourceWarpNodeId", - "8033b258" : "sDelayedWarpArg", - "8033b25c" : "unused4", - "8033b25e" : "sTimerRunning", - "8033b260" : "gHudDisplay", - "8033b26e" : "gShouldNotPlayCastleMusic", - "8033b270" : "sDelayInvincTimer", - "8033b272" : "sInvulnerable", - "8033b280" : "unused80339F10", - "8033b288" : "filler80339F1C", - "8033b2c0" : "D_80339F50", - "8033b350" : "D_80339FE0", - "8033b3b0" : "gBodyStates", - "8033b494" : "gEffectsMemoryPool", - "8033b4a0" : "gWarpCheckpoint", - "8033b4a5" : "gMainMenuDataModified", - "8033b4a6" : "gSaveFileModified", - "8033b4b0" : "gPlayerSpawnInfos", - "8033b4d0" : "D_8033A160", - "8033b8d0" : "gAreaData", - "8033bab0" : "gWarpTransition", - "8033bac6" : "gCurrCourseNum", - "8033bac8" : "gCurrActNum", - "8033baca" : "gCurrAreaIndex", - "8033bacc" : "gSavedCourseNum", - "8033bace" : "gPauseScreenMode", - "8033bad0" : "gSaveOptSelectIndex", - "8033bae0" : "gMatStackIndex", - "8033bae8" : "gMatStack", - "8033c2e8" : "gMatStackFixed", - "8033c368" : "gGeoTempState", - "8033c378" : "gCurAnimType", - "8033c379" : "gCurAnimEnabled", - "8033c37a" : "gCurrAnimFrame", - "8033c37c" : "gCurAnimTranslationMultiplier", - "8033c380" : "gCurrAnimAttribute", - "8033c384" : "gCurAnimData", - "8033c388" : "gDisplayListHeap", - "8033c390" : "gProfilerFrameData", - "8033c520" : "gPlayerCameraState", - "8033c568" : "sOldPosition", - "8033c578" : "sOldFocus", - "8033c588" : "sPlayer2FocusOffset", - "8033c594" : "sCreditsPlayer2Pitch", - "8033c596" : "sCreditsPlayer2Yaw", - "8033c598" : "sFramesPaused", - "8033c5a0" : "sFOVState", - "8033c5c0" : "sModeTransition", - "8033c5e8" : "sMarioGeometry", - "8033c61c" : "unusedFreeRoamWallYaw", - "8033c61e" : "sAvoidYawVel", - "8033c620" : "sCameraYawAfterDoorCutscene", - "8033c622" : "unusedSplinePitch", - "8033c624" : "unusedSplineYaw", - "8033c628" : "sHandheldShakeSpline", - "8033c668" : "sHandheldShakeMag", - "8033c66c" : "sHandheldShakeTimer", - "8033c670" : "sHandheldShakeInc", - "8033c674" : "sHandheldShakePitch", - "8033c676" : "sHandheldShakeYaw", - "8033c678" : "sHandheldShakeRoll", - "8033c67c" : "unused8033B30C", - "8033c680" : "unused8033B310", - "8033c684" : "sSelectionFlags", - "8033c686" : "unused8033B316", - "8033c688" : "s2ndRotateFlags", - "8033c68a" : "unused8033B31A", - "8033c68c" : "sCameraSoundFlags", - "8033c68e" : "sCButtonsPressed", - "8033c690" : "sCutsceneDialogID", - "8033c698" : "gLakituState", - "8033c758" : "unused8033B3E8", - "8033c75a" : "sAreaYaw", - "8033c75c" : "sAreaYawChange", - "8033c75e" : "sLakituDist", - "8033c760" : "sLakituPitch", - "8033c764" : "sZoomAmount", - "8033c768" : "sCSideButtonYaw", - "8033c76a" : "sBehindMarioSoundTimer", - "8033c76c" : "sZeroZoomDist", - "8033c770" : "sCUpCameraPitch", - "8033c772" : "sModeOffsetYaw", - "8033c774" : "sSpiralStairsYawOffset", - "8033c776" : "s8DirModeBaseYaw", - "8033c778" : "s8DirModeYawOffset", - "8033c77c" : "sPanDistance", - "8033c780" : "sCannonYOffset", - "8033c788" : "sModeInfo", - "8033c7d0" : "sCastleEntranceOffset", - "8033c7dc" : "sParTrackIndex", - "8033c7e0" : "sParTrackPath", - "8033c7e8" : "sParTrackTransOff", - "8033c808" : "sCameraStoreCUp", - "8033c828" : "sCameraStoreCutscene", - "8033c848" : "gCameraMovementFlags", - "8033c84a" : "sStatusFlags", - "8033c850" : "sCurCreditsSplinePos", - "8033c950" : "sCurCreditsSplineFocus", - "8033ca50" : "sCutsceneSplineSegment", - "8033ca54" : "sCutsceneSplineSegmentProgress", - "8033ca58" : "unused8033B6E8", - "8033ca5a" : "sCutsceneShot", - "8033ca5c" : "gCutsceneTimer", - "8033ca60" : "sCutsceneVars", - "8033cbc8" : "gObjCutsceneDone", - "8033cbcc" : "gCutsceneObjSpawn", - "8033cbd0" : "gCamera", - "8033cbe0" : "gObjectListArray", - "8033d260" : "gDebugInfoFlags", - "8033d264" : "gNumFindFloorMisses", - "8033d268" : "unused_8033BEF8", - "8033d26c" : "gUnknownWallCount", - "8033d270" : "gObjectCounter", - "8033d274" : "gNumCalls", - "8033d280" : "gDebugInfo", - "8033d380" : "gDebugInfoOverwrite", - "8033d480" : "gTimeStopState", - "8033d488" : "gObjectPool", - "80360e88" : "gMacroObjectDefaultParent", - "803610e8" : "gObjectLists", - "803610f0" : "gFreeObjectList", - "80361158" : "gMarioObject", - "8036115c" : "gLuigiObject", - "80361160" : "gCurrentObject", - "80361164" : "gBehCommand", - "80361168" : "gPrevFrameObjectCount", - "8036116c" : "gSurfaceNodesAllocated", - "80361170" : "gSurfacesAllocated", - "80361174" : "gNumStaticSurfaceNodes", - "80361178" : "gNumStaticSurfaces", - "8036117c" : "gObjectMemoryPool", - "80361180" : "gCheckingSurfaceCollisionsForCamera", - "80361182" : "gFindFloorIncludeSurfaceIntangible", - "80361184" : "gEnvironmentRegions", - "80361188" : "gEnvironmentLevels", - "803611d8" : "gDoorAdjacentRooms", - "80361250" : "gMarioCurrentRoom", - "80361252" : "D_8035FEE2", - "80361254" : "D_8035FEE4", - "80361256" : "gTHIWaterDrained", - "80361258" : "gTTCSpeedSetting", - "8036125a" : "gMarioShotFromCannon", - "8036125c" : "gCCMEnteredSlide", - "8036125e" : "gNumRoomedObjectsInMarioRoom", - "80361260" : "gNumRoomedObjectsNotInMarioRoom", - "80361262" : "gWDWWaterLevelChanging", - "80361264" : "gMarioOnMerryGoRound", - "80361270" : "sGrabReleaseState", - "80361280" : "D_8035FF10", - "80361290" : "gDebugPrintState1", - "803612a0" : "gDebugPrintState2", - "803612b0" : "sMarioOnFlyingCarpet", - "803612b2" : "sSurfaceTypeBelowShadow", - "803612b4" : "gShadowAboveWaterOrLava", - "803612b5" : "gMarioOnIceOrCarpet", - "803612c0" : "sSkyBoxInfo", - "803612e0" : "gMovetexLastTextureId", - "803612f0" : "gFlyingCarpetState", - "80361300" : "gPaintingMarioFloorType", - "80361304" : "gPaintingMarioXPos", - "80361308" : "gPaintingMarioYPos", - "8036130c" : "gPaintingMarioZPos", - "80361310" : "D_8035FFA0", - "80361314" : "D_8035FFA4", - "80361318" : "ripplingPainting", - "8036131c" : "dddStatus", - "80361320" : "sTextLabels", - "803613f0" : "gDialogColorFadeTimer", - "803613f2" : "gLastDialogLineNum", - "803613f4" : "gDialogVariable", - "803613f8" : "gDialogTextAlpha", - "803613fa" : "gCutsceneMsgXOffset", - "803613fc" : "gCutsceneMsgYOffset", - "803613fe" : "gRedCoinsCollected", - "80361400" : "gEnvFxBuffer", - "80361408" : "gSnowCylinderLastPos", - "80361414" : "gSnowParticleCount", - "80361416" : "gSnowParticleMaxCount", - "80361420" : "gEnvFxBubbleConfig", - "80361460" : "sNumActiveFirePiranhaPlants", - "80361464" : "sNumKilledFirePiranhaPlants", - "80361468" : "sObjSavedPosX", - "8036146c" : "sObjSavedPosY", - "80361470" : "sObjSavedPosZ", - "80361474" : "sMontyMoleHoleList", - "80361478" : "sMontyMoleKillStreak", - "8036147c" : "sMontyMoleLastKilledPosX", - "80361480" : "sMontyMoleLastKilledPosY", - "80361484" : "sMontyMoleLastKilledPosZ", - "80361488" : "sMasterTreadmill", - "80361490" : "gCurrAiBuffer", - "80361498" : "sSoundRequests", - "80361c98" : "D_80360928", - "80361f98" : "sUsedChannelsForSoundBank", - "80361fa8" : "sCurrentSound", - "80361fb8" : "gSoundBanks", - "80364b78" : "D_80363808", - "80364b82" : "D_80363812", - "80364b88" : "sBackgroundMusicQueue", - "80364ba0" : "D_80363830", - "80364c20" : "D_803638B0", - "80364c60" : "viMgrThread", - "80364e10" : "viMgrStack", - "80365e10" : "__osViMesgQueue", - "80365e28" : "viMgrMesgBuff", - "80365e40" : "viEventViMesg", - "80365e58" : "viEventCounterMesg", - "80365e70" : "piMgrThread", - "80366020" : "piMgrStack", - "80367020" : "__osPiMesgQueue", - "80367038" : "piMgrMesgBuff", - "80367040" : "D_80365CD0", - "80367050" : "D_80365CE0", - "8036708c" : "D_80365D1C", - "80367090" : "D_80365D20", - "80367091" : "_osCont_numControllers", - "80367098" : "D_80365D28", - "803670b8" : "_osContMesgQueue", - "803670d0" : "_osContMesgBuff", - "803670f0" : "D_80365D80", - "80367110" : "_osCurrentTime", - "80367118" : "D_80365DA8", - "8036711c" : "D_80365DAC", - "80367120" : "D_80365DB0", - "80367130" : "osPiMesgBuff", - "80367138" : "gOsPiMessageQueue", - "80367150" : "osSiMesgBuff", - "80367158" : "gOsSiMessageQueue", - "80367170" : "D_80365E00", - "803671ac" : "D_80365E3C", - "803671b0" : "D_80365E40", - "803672b0" : "gInterruptedThread", - "80367460" : "_mainSegmentNoloadEnd", - "0000cee0" : "_mainSegmentNoloadSizeLo", - "00000002" : "_mainSegmentNoloadSizeHi", - "00000001" : "ASSERT", - "80378800" : "_engineSegmentStart", - "007cc6c0" : "_engineSegmentRomStart", - "80378800" : "vec3f_copy", - "80378840" : "vec3f_set", - "8037888c" : "vec3f_add", - "803788e4" : "vec3f_sum", - "8037893c" : "vec3s_copy", - "8037897c" : "vec3s_set", - "803789c8" : "vec3s_add", - "80378a20" : "vec3s_sum", - "80378a78" : "vec3s_sub", - "80378ad0" : "vec3s_to_vec3f", - "80378b34" : "vec3f_to_vec3s", - "80378c50" : "find_vector_perpendicular_to_plane", - "80378d38" : "vec3f_cross", - "80378dc0" : "vec3f_normalize", - "80378e68" : "mtxf_copy", - "80378eb4" : "mtxf_identity", - "80378f24" : "mtxf_translate", - "80378f84" : "mtxf_lookat", - "80379440" : "mtxf_rotate_zxy_and_translate", - "803795f0" : "mtxf_rotate_xyz_and_translate", - "80379798" : "mtxf_billboard", - "80379918" : "mtxf_align_terrain_normal", - "80379aa4" : "mtxf_align_terrain_triangle", - "80379f60" : "mtxf_mul", - "8037a29c" : "mtxf_scale_vec3f", - "8037a348" : "mtxf_mul_vec3s", - "8037a434" : "mtxf_to_mtx", - "8037a4b8" : "mtxf_rotate_xy", - "8037a550" : "get_pos_from_transform_mtx", - "8037a69c" : "vec3f_get_dist_and_angle", - "8037a788" : "vec3f_set_dist_and_angle", - "8037a860" : "approach_s32", - "8037a8b4" : "approach_f32", - "8037a9a8" : "atan2s", - "8037ab88" : "atan2f", - "8037abec" : "spline_get_weights", - "8037afb8" : "anim_spline_init", - "8037afe8" : "anim_spline_poll", - "8037b220" : "init_scene_graph_node_links", - "8037b24c" : "init_graph_node_root", - "8037b30c" : "init_graph_node_ortho_projection", - "8037b380" : "init_graph_node_perspective", - "8037b448" : "init_graph_node_start", - "8037b4ac" : "init_graph_node_master_list", - "8037b530" : "init_graph_node_render_range", - "8037b5b4" : "init_graph_node_switch_case", - "8037b670" : "init_graph_node_camera", - "8037b744" : "init_graph_node_translation_rotation", - "8037b7f8" : "init_graph_node_translation", - "8037b89c" : "init_graph_node_rotation", - "8037b940" : "init_graph_node_scale", - "8037b9e0" : "init_graph_node_object", - "8037bad4" : "init_graph_node_culling_radius", - "8037bb48" : "init_graph_node_animated_part", - "8037bbec" : "init_graph_node_billboard", - "8037bc90" : "init_graph_node_display_list", - "8037bd24" : "init_graph_node_shadow", - "8037bdb4" : "init_graph_node_object_parent", - "8037be28" : "init_graph_node_generated", - "8037becc" : "init_graph_node_background", - "8037bf84" : "init_graph_node_held_object", - "8037c044" : "geo_add_child", - "8037c0bc" : "geo_remove_child", - "8037c138" : "geo_make_first_child", - "8037c1e4" : "geo_call_global_function_nodes_helper", - "8037c360" : "geo_call_global_function_nodes", - "8037c3d0" : "geo_reset_object_node", - "8037c448" : "geo_obj_init", - "8037c51c" : "geo_obj_init_spawninfo", - "8037c658" : "geo_obj_init_animation", - "8037c708" : "geo_obj_init_animation_accel", - "8037c7d8" : "retrieve_animation_index", - "8037c844" : "geo_update_animation_frame", - "8037c9e8" : "geo_retreive_animation_translation", - "8037cb10" : "geo_find_root", - "8037cb60" : "read_vec3s_to_vec3f", - "8037cbc0" : "read_vec3s", - "8037cbfc" : "read_vec3s_angle", - "8037cc74" : "register_scene_graph_node", - "8037cd60" : "geo_layout_cmd_branch_and_link", - "8037ce24" : "geo_layout_cmd_end", - "8037cee8" : "geo_layout_cmd_branch", - "8037cf70" : "geo_layout_cmd_return", - "8037cfc0" : "geo_layout_cmd_open_node", - "8037d018" : "geo_layout_cmd_close_node", - "8037d050" : "geo_layout_cmd_assign_as_view", - "8037d0d0" : "geo_layout_cmd_update_node_flags", - "8037d1d0" : "geo_layout_cmd_node_root", - "8037d328" : "geo_layout_cmd_node_ortho_projection", - "8037d3a4" : "geo_layout_cmd_node_perspective", - "8037d48c" : "geo_layout_cmd_node_start", - "8037d4dc" : "geo_layout_cmd_nop3", - "8037d500" : "geo_layout_cmd_node_master_list", - "8037d55c" : "geo_layout_cmd_node_level_of_detail", - "8037d5d4" : "geo_layout_cmd_node_switch_case", - "8037d640" : "geo_layout_cmd_node_camera", - "8037d6f0" : "geo_layout_cmd_node_translation_rotation", - "8037d8d4" : "geo_layout_cmd_node_translation", - "8037d998" : "geo_layout_cmd_node_rotation", - "8037da5c" : "geo_layout_cmd_node_scale", - "8037db50" : "geo_layout_cmd_nop2", - "8037db74" : "geo_layout_cmd_node_animated_part", - "8037dc10" : "geo_layout_cmd_node_billboard", - "8037dcd4" : "geo_layout_cmd_node_display_list", - "8037dd4c" : "geo_layout_cmd_node_shadow", - "8037dddc" : "geo_layout_cmd_node_object_parent", - "8037de34" : "geo_layout_cmd_node_generated", - "8037de94" : "geo_layout_cmd_node_background", - "8037def8" : "geo_layout_cmd_nop", - "8037df1c" : "geo_layout_cmd_copy_view", - "8037dfd4" : "geo_layout_cmd_node_held_obj", - "8037e058" : "geo_layout_cmd_node_culling_radius", - "8037e0b4" : "process_geo_layout", - "803805c8" : "level_script_execute", - "80380de8" : "f32_find_wall_collision", - "80380e8c" : "find_wall_collisions", - "80381264" : "find_ceil", - "803814b8" : "find_floor_height_and_data", - "80381794" : "find_floor_height", - "80381900" : "find_floor", - "80381ba0" : "find_water_level", - "80381d3c" : "find_poison_gas_level", - "80381f08" : "debug_surface_list_info", - "80383340" : "alloc_surface_pools", - "803833b8" : "load_area_terrain", - "803835a4" : "clear_dynamic_surfaces", - "803839cc" : "load_object_collision_model", - "80383bb0" : "RandomU16", - "80383cb4" : "RandomFloat", - "80383d1c" : "RandomSign", - "80383d68" : "func_80383D68", - "80385bf0" : "stub_80385BF0", - "80385c00" : "cur_object_exec_behavior", - "80385f90" : "identityMtx", - "80385fb0" : "zeroMtx", - "80385fd0" : "gVec3fZero", - "80385fdc" : "gVec3sZero", - "80385fe4" : "gVec3fOne", - "80385ff0" : "gVec3sOne", - "80386000" : "gSineTable", - "80387000" : "gCosineTable", - "8038b000" : "gArctanTable", - "8038b810" : "GeoLayoutJumpTable", - "8038b894" : "unused_8038B894", - "8038bc90" : "_engineSegmentEnd", - "007dfb50" : "_engineSegmentRomEnd", - "8038bc90" : "_engineSegmentNoloadStart", - "8038bc90" : "gSplineKeyframe", - "8038bc94" : "gSplineKeyframeFraction", - "8038bc98" : "gSplineState", - "8038bca0" : "gGraphNodePool", - "8038bca4" : "gCurRootGraphNode", - "8038bca8" : "D_8038BCA8", - "8038bcac" : "gGeoViews", - "8038bcb0" : "gGeoNumViews", - "8038bcb8" : "gGeoLayoutStack", - "8038bcf8" : "gCurGraphNodeList", - "8038bd78" : "gCurGraphNodeIndex", - "8038bd7a" : "gGeoLayoutStackIndex", - "8038bd7c" : "D_8038BD7C", - "8038bd7e" : "gGeoLayoutReturnIndex", - "8038bd80" : "gGeoLayoutCommand", - "8038bd88" : "gObjParentGraphNode", - "8038be30" : "sFloorGeo", - "8038be90" : "unused8038BE90", - "8038be98" : "gStaticSurfacePartition", - "8038d698" : "gDynamicSurfacePartition", - "8038ee98" : "sSurfaceNodePool", - "8038ee9c" : "sSurfacePool", - "8038eea0" : "sSurfacePoolSize", - "8038eea8" : "unused8038EEA8", - "8038eef0" : "_engineSegmentNoloadEnd", - "00000001" : "ASSERT", - "8038f800" : ".", - "8038f800" : "_framebuffersSegmentNoloadStart", - "8038f800" : "0x70800", - "8038f800" : "gFrameBuffer0", - "803b5000" : "gFrameBuffer1", - "803da800" : "gFrameBuffer2", - "80400000" : "_framebuffersSegmentNoloadEnd", - "80400000" : "__expansionRamStart", - "00000001" : "ASSERT", - "10000000" : "_entrySegmentStart", - "007cc6c0" : "_entrySegmentRomStart", - "10000000" : "level_script_entry", - "10000030" : "_entrySegmentEnd", - "007cc6f0" : "_entrySegmentRomEnd", - "02000000" : "_segment2_mio0SegmentStart", - "007cc6c0" : "_segment2_mio0SegmentRomStart", - "0200bd10" : ".", - "0200bd10" : "_segment2_mio0SegmentEnd", - "007d83d0" : "_segment2_mio0SegmentRomEnd", - "04000000" : "_group0_mio0SegmentStart", - "007cc6c0" : "_group0_mio0SegmentRomStart", - "04013260" : ".", - "04013260" : "_group0_mio0SegmentEnd", - "007df920" : "_group0_mio0SegmentRomEnd", - "17000000" : "_group0_geoSegmentStart", - "007cc6c0" : "_group0_geoSegmentRomStart", - "17000000" : "bubble_geo", - "1700001c" : "purple_marble_geo", - "17000038" : "smoke_geo", - "17000084" : "burn_smoke_geo", - "1700009c" : "spot_on_ground_geo", - "170000e0" : "mario_TODO_geo_0000E0", - "17000124" : "water_waves_surface_geo", - "17000168" : "water_waves_geo", - "170001bc" : "sparkles_geo", - "17000230" : "water_splash_geo", - "17000284" : "sparkles_animation_geo", - "170002e0" : "mario_geo_face_and_wings", - "1700041c" : "mario_geo_left_hand", - "17000494" : "mario_geo_right_hand", - "1700053c" : "mario_geo_body", - "170006f8" : "mario_geo_medium_poly_left_hand", - "17000770" : "mario_geo_medium_poly_right_hand", - "17000818" : "mario_geo_medium_poly_body", - "170009d4" : "mario_geo_low_poly_face_and_wings", - "17000b10" : "mario_geo_low_poly_left_hand", - "17000b88" : "mario_geo_low_poly_right_hand", - "17000c30" : "mario_geo_low_poly_body", - "17000dec" : "mario_vanish_geo_face_and_wings", - "17000f28" : "mario_vanish_geo_left_hand", - "17000fa0" : "mario_vanish_geo_right_hand", - "17001048" : "mario_vanish_geo_body", - "17001204" : "mario_vanish_geo_medium_poly_left_hand", - "1700127c" : "mario_vanish_geo_medium_poly_right_hand", - "17001324" : "mario_vanish_geo_medium_poly_body", - "170014e0" : "mario_vanish_geo_low_poly_face_and_wings", - "1700161c" : "mario_vanish_geo_low_poly_left_hand", - "17001694" : "mario_vanish_geo_low_poly_right_hand", - "1700173c" : "mario_vanish_geo_low_poly_body", - "170018f8" : "mario_metal_geo_face_and_wings", - "170019a4" : "mario_metal_geo_left_hand", - "17001a1c" : "mario_metal_geo_right_hand", - "17001ac4" : "mario_metal_geo_body", - "17001c80" : "mario_metal_geo_medium_poly_left_hand", - "17001cf8" : "mario_metal_geo_medium_poly_right_hand", - "17001da0" : "mario_metal_geo_medium_poly_body", - "17001f5c" : "mario_metal_geo_low_poly_face_and_wings", - "17002008" : "mario_metal_geo_low_poly_left_hand", - "17002080" : "mario_metal_geo_low_poly_right_hand", - "17002128" : "mario_metal_geo_low_poly_body", - "170022e4" : "mario_metal_vanish_geo_face_and_wings", - "17002390" : "mario_metal_vanish_geo_left_hand", - "17002408" : "mario_metal_vanish_geo_right_hand", - "170024b0" : "mario_metal_vanish_geo_body", - "1700266c" : "mario_metal_vanish_geo_medium_poly_left_hand", - "170026e4" : "mario_metal_vanish_geo_medium_poly_right_hand", - "1700278c" : "mario_metal_vanish_geo_medium_poly_body", - "17002958" : "mario_metal_vanish_geo_low_poly_face_and_wings", - "17002a04" : "mario_metal_vanish_geo_low_poly_left_hand", - "17002a7c" : "mario_metal_vanish_geo_low_poly_right_hand", - "17002b24" : "mario_metal_vanish_geo_low_poly_body", - "17002ce0" : "mario_geo_load_body", - "17002d14" : "mario_geo_load_medium_poly_body", - "17002d48" : "mario_geo_load_low_poly_body", - "17002d7c" : "mario_geo_render_body", - "17002dd4" : "mario_geo", - "17002e30" : "_group0_geoSegmentEnd", - "007cf4f0" : "_group0_geoSegmentRomEnd", - "05000000" : "_group1_mio0SegmentStart", - "007cc6c0" : "_group1_mio0SegmentRomStart", - "05008070" : ".", - "05008070" : "_group1_mio0SegmentEnd", - "007d4730" : "_group1_mio0SegmentRomEnd", - "0c000000" : "_group1_geoSegmentStart", - "007cc6c0" : "_group1_geoSegmentRomStart", - "0c000000" : "yellow_sphere_geo", - "0c000018" : "hoot_geo", - "0c0001e4" : "yoshi_egg_geo", - "0c000248" : "thwomp_geo", - "0c000264" : "bullet_bill_geo", - "0c00028c" : "heave_ho_geo", - "0c000410" : "_group1_geoSegmentEnd", - "007ccad0" : "_group1_geoSegmentRomEnd", - "05000000" : "_group2_mio0SegmentStart", - "007cc6c0" : "_group2_mio0SegmentRomStart", - "05001e10" : ".", - "05001e10" : "_group2_mio0SegmentEnd", - "007ce4d0" : "_group2_mio0SegmentRomEnd", - "0c000000" : "_group2_geoSegmentStart", - "007cc6c0" : "_group2_geoSegmentRomStart", - "0c000000" : "bully_geo", - "0c000120" : "bully_boss_geo", - "0c000240" : "blargg_geo", - "0c0002b0" : "_group2_geoSegmentEnd", - "007cc970" : "_group2_geoSegmentRomEnd", - "05000000" : "_group3_mio0SegmentStart", - "007cc6c0" : "_group3_mio0SegmentRomStart", - "050068b0" : ".", - "050068b0" : "_group3_mio0SegmentEnd", - "007d2f70" : "_group3_mio0SegmentRomEnd", - "0c000000" : "_group3_geoSegmentStart", - "007cc6c0" : "_group3_geoSegmentRomStart", - "0c000000" : "king_bobomb_geo", - "0c000308" : "water_bomb_geo", - "0c000328" : "water_bomb_shadow_geo", - "0c000340" : "_group3_geoSegmentEnd", - "007cca00" : "_group3_geoSegmentRomEnd", - "05000000" : "_group4_mio0SegmentStart", - "007cc6c0" : "_group4_mio0SegmentRomStart", - "0500a300" : ".", - "0500a300" : "_group4_mio0SegmentEnd", - "007d69c0" : "_group4_mio0SegmentRomEnd", - "0c000000" : "_group4_geoSegmentStart", - "007cc6c0" : "_group4_geoSegmentRomStart", - "0c000000" : "clam_shell_geo", - "0c000068" : "sushi_geo", - "0c00010c" : "unagi_geo", - "0c000280" : "_group4_geoSegmentEnd", - "007cc940" : "_group4_geoSegmentRomEnd", - "05000000" : "_group5_mio0SegmentStart", - "007cc6c0" : "_group5_mio0SegmentRomStart", - "0500bce0" : ".", - "0500bce0" : "_group5_mio0SegmentEnd", - "007d83a0" : "_group5_mio0SegmentRomEnd", - "0c000000" : "_group5_geoSegmentStart", - "007cc6c0" : "_group5_geoSegmentRomStart", - "0c000000" : "klepto_geo", - "0c0002ac" : "eyerok_geo_0002AC", - "0c0005a8" : "eyerok_left_hand_geo", - "0c0005e4" : "eyerok_right_hand_geo", - "0c000610" : "pokey_head_geo", - "0c000644" : "pokey_body_part_geo", - "0c000660" : "_group5_geoSegmentEnd", - "007ccd20" : "_group5_geoSegmentRomEnd", - "05000000" : "_group6_mio0SegmentStart", - "007cc6c0" : "_group6_mio0SegmentRomStart", - "0500e110" : ".", - "0500e110" : "_group6_mio0SegmentEnd", - "007da7d0" : "_group6_mio0SegmentRomEnd", - "0c000000" : "_group6_geoSegmentStart", - "007cc6c0" : "_group6_geoSegmentRomStart", - "0c000000" : "monty_mole_geo", - "0c000110" : "ukiki_geo", - "0c00036c" : "fwoosh_geo", - "0c000390" : "_group6_geoSegmentEnd", - "007cca50" : "_group6_geoSegmentRomEnd", - "05000000" : "_group7_mio0SegmentStart", - "007cc6c0" : "_group7_mio0SegmentRomStart", - "05005070" : ".", - "05005070" : "_group7_mio0SegmentEnd", - "007d1730" : "_group7_mio0SegmentRomEnd", - "0c000000" : "_group7_geoSegmentStart", - "007cc6c0" : "_group7_geoSegmentRomStart", - "0c000000" : "spindrift_geo", - "0c000104" : "penguin_geo", - "0c00021c" : "mr_blizzard_hidden_geo", - "0c000348" : "mr_blizzard_geo", - "0c000370" : "_group7_geoSegmentEnd", - "007cca30" : "_group7_geoSegmentRomEnd", - "05000000" : "_group8_mio0SegmentStart", - "007cc6c0" : "_group8_mio0SegmentRomStart", - "05001180" : ".", - "05001180" : "_group8_mio0SegmentEnd", - "007cd840" : "_group8_mio0SegmentRomEnd", - "0c000000" : "_group8_geoSegmentStart", - "007cc6c0" : "_group8_geoSegmentRomStart", - "0c000000" : "springboard_top_geo", - "0c000018" : "springboard_spring_geo", - "0c000030" : "springboard_bottom_geo", - "0c000048" : "cap_switch_geo", - "0c000090" : "_group8_geoSegmentEnd", - "007cc750" : "_group8_geoSegmentRomEnd", - "05000000" : "_group9_mio0SegmentStart", - "007cc6c0" : "_group9_mio0SegmentRomStart", - "05006960" : ".", - "05006960" : "_group9_mio0SegmentEnd", - "007d3020" : "_group9_mio0SegmentRomEnd", - "0c000000" : "_group9_geoSegmentStart", - "007cc6c0" : "_group9_geoSegmentRomStart", - "0c000000" : "bookend_part_geo", - "0c0000c0" : "bookend_geo", - "0c0000d8" : "haunted_chair_geo", - "0c000188" : "small_key_geo", - "0c0001b4" : "mad_piano_geo", - "0c000224" : "boo_geo", - "0c000274" : "haunted_cage_geo", - "0c0002b0" : "_group9_geoSegmentEnd", - "007cc970" : "_group9_geoSegmentRomEnd", - "05000000" : "_group10_mio0SegmentStart", - "007cc6c0" : "_group10_mio0SegmentRomStart", - "05012cd0" : ".", - "05012cd0" : "_group10_mio0SegmentEnd", - "007df390" : "_group10_mio0SegmentRomEnd", - "0c000000" : "_group10_geoSegmentStart", - "007cc6c0" : "_group10_geoSegmentRomStart", - "0c000000" : "birds_geo", - "0c000098" : "peach_geo_000098", - "0c000254" : "peach_geo_000254", - "0c000410" : "peach_geo", - "0c000468" : "yoshi_geo", - "0c000670" : "_group10_geoSegmentEnd", - "007ccd30" : "_group10_geoSegmentRomEnd", - "05000000" : "_group11_mio0SegmentStart", - "007cc6c0" : "_group11_mio0SegmentRomStart", - "050073f0" : ".", - "050073f0" : "_group11_mio0SegmentEnd", - "007d3ab0" : "_group11_mio0SegmentRomEnd", - "0c000000" : "_group11_geoSegmentStart", - "007cc6c0" : "_group11_geoSegmentRomStart", - "0c000000" : "bubba_geo", - "0c000030" : "wiggler_head_geo", - "0c0001bc" : "enemy_lakitu_geo", - "0c000290" : "spiny_ball_geo", - "0c000328" : "spiny_geo", - "0c0004a0" : "_group11_geoSegmentEnd", - "007ccb60" : "_group11_geoSegmentRomEnd", - "06000000" : "_group12_mio0SegmentStart", - "007cc6c0" : "_group12_mio0SegmentRomStart", - "06030c30" : ".", - "06030c30" : "_group12_mio0SegmentEnd", - "007fd2f0" : "_group12_mio0SegmentRomEnd", - "0d000000" : "_group12_geoSegmentStart", - "007cc6c0" : "_group12_geoSegmentRomStart", - "0d000000" : "bowser_flames_geo", - "0d000090" : "invisible_bowser_accessory_geo", - "0d0000b0" : "bowser_1_yellow_sphere_geo", - "0d0000d8" : "bowser_geo_0000D8", - "0d000424" : "bowser_geo_000424", - "0d000770" : "bowser_geo_000770", - "0d000ab8" : "bowser_shadow_geo", - "0d000ac4" : "bowser_geo", - "0d000b40" : "bowser2_geo", - "0d000bbc" : "bowser_bomb_geo", - "0d000bfc" : "bowser_impact_smoke_geo", - "0d000c50" : "_group12_geoSegmentEnd", - "007cd310" : "_group12_geoSegmentRomEnd", - "06000000" : "_group13_mio0SegmentStart", - "007cc6c0" : "_group13_mio0SegmentRomStart", - "0600a0f0" : ".", - "0600a0f0" : "_group13_mio0SegmentEnd", - "007d67b0" : "_group13_mio0SegmentRomEnd", - "0d000000" : "_group13_geoSegmentStart", - "007cc6c0" : "_group13_geoSegmentRomStart", - "0d000000" : "skeeter_geo", - "0d000284" : "seaweed_geo", - "0d0002f4" : "water_mine_geo", - "0d000324" : "cyan_fish_geo", - "0d00038c" : "bub_geo", - "0d000414" : "water_ring_geo", - "0d000450" : "treasure_chest_base_geo", - "0d000468" : "treasure_chest_lid_geo", - "0d000480" : "_group13_geoSegmentEnd", - "007ccb40" : "_group13_geoSegmentRomEnd", - "06000000" : "_group14_mio0SegmentStart", - "007cc6c0" : "_group14_mio0SegmentRomStart", - "06013a60" : ".", - "06013a60" : "_group14_mio0SegmentEnd", - "007e0120" : "_group14_mio0SegmentRomEnd", - "0d000000" : "_group14_geoSegmentStart", - "007cc6c0" : "_group14_geoSegmentRomStart", - "0d000000" : "koopa_flag_geo", - "0d0000b8" : "wooden_post_geo", - "0d0000d0" : "koopa_without_shell_geo", - "0d000214" : "koopa_with_shell_geo", - "0d000358" : "piranha_plant_geo", - "0d000480" : "whomp_geo", - "0d0005d0" : "metallic_ball_geo", - "0d0005ec" : "chain_chomp_geo", - "0d000680" : "_group14_geoSegmentEnd", - "007ccd40" : "_group14_geoSegmentRomEnd", - "06000000" : "_group15_mio0SegmentStart", - "007cc6c0" : "_group15_mio0SegmentRomStart", - "0600c8e0" : ".", - "0600c8e0" : "_group15_mio0SegmentEnd", - "007d8fa0" : "_group15_mio0SegmentRomEnd", - "0d000000" : "_group15_geoSegmentStart", - "007cc6c0" : "_group15_geoSegmentRomStart", - "0d000000" : "lakitu_geo", - "0d000114" : "toad_geo_000114", - "0d00027c" : "toad_geo_00027C", - "0d0003e4" : "toad_geo", - "0d000448" : "mips_geo", - "0d0005b0" : "boo_castle_geo", - "0d000600" : "_group15_geoSegmentEnd", - "007cccc0" : "_group15_geoSegmentRomEnd", - "06000000" : "_group16_mio0SegmentStart", - "007cc6c0" : "_group16_mio0SegmentRomStart", - "06002ba0" : ".", - "06002ba0" : "_group16_mio0SegmentEnd", - "007cf260" : "_group16_mio0SegmentRomEnd", - "0d000000" : "_group16_geoSegmentStart", - "007cc6c0" : "_group16_geoSegmentRomStart", - "0d000000" : "moneybag_geo_000000", - "0d000078" : "moneybag_geo_000078", - "0d0000f0" : "moneybag_geo", - "0d000150" : "_group16_geoSegmentEnd", - "007cc810" : "_group16_geoSegmentRomEnd", - "06000000" : "_group17_mio0SegmentStart", - "007cc6c0" : "_group17_mio0SegmentRomStart", - "06009c50" : ".", - "06009c50" : "_group17_mio0SegmentEnd", - "007d6310" : "_group17_mio0SegmentRomEnd", - "0d000000" : "_group17_geoSegmentStart", - "007cc6c0" : "_group17_geoSegmentRomStart", - "0d000000" : "mr_i_geo", - "0d00001c" : "mr_i_iris_geo", - "0d0000dc" : "swoop_geo", - "0d0001a0" : "snufit_geo", - "0d000230" : "dorrie_geo", - "0d000394" : "scuttlebug_geo", - "0d0006d0" : "_group17_geoSegmentEnd", - "007ccd90" : "_group17_geoSegmentRomEnd", - "08000000" : "_common0_mio0SegmentStart", - "007cc6c0" : "_common0_mio0SegmentRomStart", - "0800e6d0" : ".", - "0800e6d0" : "_common0_mio0SegmentEnd", - "007dad90" : "_common0_mio0SegmentRomEnd", - "0f000000" : "_common0_geoSegmentStart", - "007cc6c0" : "_common0_geoSegmentRomStart", - "0f000000" : "blue_coin_switch_geo", - "0f000020" : "test_platform_geo", - "0f000028" : "amp_geo", - "0f0001a8" : "cannon_base_geo", - "0f0001c0" : "cannon_barrel_geo", - "0f0001d8" : "chuckya_geo", - "0f0004cc" : "purple_switch_geo", - "0f0004e4" : "checkerboard_platform_geo", - "0f0004fc" : "heart_geo", - "0f000518" : "flyguy_geo", - "0f0005d0" : "breakable_box_geo", - "0f000610" : "breakable_box_small_geo", - "0f000640" : "bowling_ball_geo", - "0f00066c" : "bowling_ball_track_geo", - "0f000694" : "exclamation_box_geo", - "0f0006e4" : "goomba_geo", - "0f0007b8" : "black_bobomb_geo", - "0f0008f4" : "bobomb_buddy_geo", - "0f000a30" : "metal_box_geo", - "0f000a58" : "exclamation_box_outline_geo", - "0f000ab0" : "koopa_shell_geo", - "0f000adc" : "koopa_shell2_geo", - "0f000b08" : "koopa_shell3_geo", - "0f000b40" : "_common0_geoSegmentEnd", - "007cd200" : "_common0_geoSegmentRomEnd", - "03000000" : "_common1_mio0SegmentStart", - "007cc6c0" : "_common1_mio0SegmentRomStart", - "03017990" : ".", - "03017990" : "_common1_mio0SegmentEnd", - "007e4050" : "_common1_mio0SegmentRomEnd", - "16000000" : "_common1_geoSegmentStart", - "007cc6c0" : "_common1_geoSegmentRomStart", - "16000000" : "mist_geo", - "16000020" : "white_puff_geo", - "16000040" : "explosion_geo", - "160000a8" : "butterfly_geo", - "1600013c" : "yellow_coin_geo", - "160001a0" : "yellow_coin_no_shadow_geo", - "16000200" : "blue_coin_geo", - "16000264" : "blue_coin_no_shadow_geo", - "160002c4" : "red_coin_geo", - "16000328" : "red_coin_no_shadow_geo", - "16000388" : "warp_pipe_geo", - "160003a8" : "castle_door_geo", - "1600043c" : "cabin_door_geo", - "160004d0" : "wooden_door_geo", - "16000564" : "wooden_door2_geo", - "160005f8" : "metal_door_geo", - "1600068c" : "hazy_maze_door_geo", - "16000720" : "haunted_door_geo", - "160007b4" : "castle_door_0_star_geo", - "16000868" : "castle_door_1_star_geo", - "1600091c" : "castle_door_3_stars_geo", - "160009d0" : "key_door_geo", - "16000a84" : "bowser_key_geo", - "16000ab0" : "bowser_key_cutscene_geo", - "16000b10" : "red_flame_shadow_geo", - "16000b2c" : "red_flame_geo", - "16000b8c" : "blue_flame_geo", - "16000bec" : "fish_shadow_geo", - "16000c44" : "fish_geo", - "16000c8c" : "leaves_geo", - "16000ca4" : "marios_cap_geo", - "16000cf0" : "marios_metal_cap_geo", - "16000d3c" : "marios_wing_cap_geo", - "16000da8" : "marios_winged_metal_cap_geo", - "16000e14" : "number_geo", - "16000e84" : "mushroom_1up_geo", - "16000ea0" : "star_geo", - "16000ed4" : "dirt_animation_geo", - "16000f24" : "cartoon_star_geo", - "16000f6c" : "transparent_star_geo", - "16000f98" : "white_particle_geo", - "16000fb4" : "wooden_signpost_geo", - "16000fe8" : "bubbly_tree_geo", - "16001000" : "spiky_tree_geo", - "16001018" : "snow_tree_geo", - "16001030" : "spiky_tree1_geo", - "16001048" : "palm_tree_geo", - "16001060" : "_common1_geoSegmentEnd", - "007cd720" : "_common1_geoSegmentRomEnd", - "13000000" : "_behaviorSegmentStart", - "007cc6c0" : "_behaviorSegmentRomStart", - "13000000" : "bhvStarDoor", - "13000054" : "bhvMrI", - "1300008c" : "bhvMrIBody", - "130000ac" : "bhvMrIParticle", - "130000f8" : "bhvPurpleParticle", - "13000118" : "bhvGiantPole", - "13000144" : "bhvPoleGrabbing", - "13000174" : "bhvThiHugeIslandTop", - "13000194" : "bhvThiTinyIslandTop", - "130001ac" : "bhvCapSwitchBase", - "130001cc" : "bhvCapSwitch", - "130001f4" : "bhvKingBobomb", - "13000254" : "bhvBobombAnchorMario", - "13000278" : "bhvBetaChestBottom", - "1300029c" : "bhvBetaChestLid", - "130002b8" : "bhvBubbleMario", - "130002e4" : "bhvBubbleMaybe", - "13000338" : "bhvSmallWaterWave", - "13000398" : "bhvSmallWaterWave398", - "130003bc" : "bhvWaterAirBubble", - "13000400" : "bhvSmallParticle", - "13000428" : "bhvWaterWaves", - "13000444" : "bhvSmallParticleSnow", - "1300046c" : "bhvSmallParticleBubbles", - "13000494" : "bhvFishGroup", - "130004a8" : "bhvCannon", - "130004e4" : "bhvCannonBarrel", - "13000500" : "bhvCannonBaseUnused", - "13000528" : "bhvChuckya", - "13000584" : "bhvChuckyaAnchorMario", - "130005a8" : "bhvUnused05A8", - "130005b4" : "bhvRotatingPlatform", - "130005d8" : "bhvTower", - "13000600" : "bhvBulletBillCannon", - "13000624" : "bhvWfBreakableWallRight", - "13000638" : "bhvWfBreakableWallLeft", - "1300066c" : "bhvKickableBoard", - "130006a4" : "bhvTowerDoor", - "130006d8" : "bhvRotatingCounterClockwise", - "130006e0" : "bhvWfRotatingWoodenPlatform", - "13000708" : "bhvKoopaShellUnderwater", - "13000720" : "bhvExitPodiumWarp", - "1300075c" : "bhvFadingWarp", - "13000780" : "bhvWarp", - "130007a0" : "bhvWarpPipe", - "130007dc" : "bhvWhitePuffExplosion", - "130007f8" : "bhvSpawnedStar", - "1300080c" : "bhvSpawnedStarNoLevelExit", - "13000830" : "bhvMrIBlueCoin", - "13000888" : "bhvCoinInsideBoo", - "130008d0" : "bhvCoinFormationSpawn", - "130008ec" : "bhvCoinFormation", - "1300090c" : "bhvOneCoin", - "1300091c" : "bhvYellowCoin", - "13000940" : "bhvTemporaryYellowCoin", - "13000964" : "bhvThreeCoinsSpawn", - "13000984" : "bhvTenCoinsSpawn", - "130009a4" : "bhvSingleCoinGetsSpawned", - "130009e0" : "bhvCoinSparkles", - "13000a14" : "bhvGoldenCoinSparkles", - "13000a34" : "bhvWallTinyStarParticle", - "13000a54" : "bhvWallTinyStarParticleSpawn", - "13000a78" : "bhvPoundTinyStarParticle", - "13000a98" : "bhvPoundTinyStarParticleSpawn", - "13000abc" : "bhvPunchTinyTriangle", - "13000ad8" : "bhvPunchTinyTriangleSpawn", - "13000afc" : "bhvDoorWarp", - "13000b0c" : "bhvDoor", - "13000b58" : "bhvGrindel", - "13000b8c" : "bhvThwomp2", - "13000bc8" : "bhvThwomp", - "13000c04" : "bhvTumblingBridgePlatform", - "13000c28" : "bhvWfTumblingBridge", - "13000c44" : "bhvBbhTumblingBridge", - "13000c64" : "bhvLllTumblingBridge", - "13000c84" : "bhvFlame", - "13000cc8" : "bhvAnotherElavator", - "13000cfc" : "bhvRrElevatorPlatform", - "13000d30" : "bhvHmcElevatorPlatform", - "13000d6c" : "bhvWaterMist", - "13000d98" : "bhvWaterMistSpawn", - "13000db4" : "bhvBreakBoxTriangle", - "13000dd8" : "bhvWaterMist2", - "13000dfc" : "bhvUnused0DFC", - "13000e24" : "bhvPoundWhitePuffs", - "13000e3c" : "bhvGroundSand", - "13000e58" : "bhvGroundSnow", - "13000e70" : "bhvWind", - "13000e88" : "bhvEndToad", - "13000eac" : "bhvEndPeach", - "13000ed0" : "bhvUnusedParticleSpawn", - "13000f08" : "bhvUkiki", - "13000f14" : "bhvUkikiCageChild", - "13000f2c" : "bhvUkikiCageStar", - "13000f48" : "bhvUkikiCage", - "13000f9c" : "bhvBitfsSinkingPlatforms", - "13000fc8" : "bhvBitfsSinkingCagePlatform", - "13001000" : "bhvDddMovingPole", - "13001030" : "bhvBitfsTiltingInvertedPyramid", - "13001064" : "bhvSquishablePlatform", - "13001098" : "bhvCutOutObject", - "130010a8" : "bhvBetaMovingFlamesSpawn", - "130010b8" : "bhvBetaMovingFlames", - "130010d8" : "bhvRrRotatingBridgePlatform", - "13001108" : "bhvFlamethrower", - "13001124" : "bhvFlamethrowerFlame", - "13001168" : "bhvBouncingFireball", - "13001184" : "bhvBouncingFireballFlame", - "130011d0" : "bhvBowserShockWave", - "130011ec" : "bhvFlameMario", - "13001214" : "bhvBlackSmokeMario", - "13001254" : "bhvBlackSmokeBowser", - "1300127c" : "bhvBlackSmokeUpward", - "13001298" : "bhvBetaFishSplashSpawner", - "130012b4" : "bhvSpindrift", - "130012f4" : "bhvTowerPlatformGroup", - "13001318" : "bhvWfSlidingTowerPlatform", - "13001340" : "bhvWfElevatorTowerPlatform", - "13001368" : "bhvWfSolidTowerPlatform", - "13001390" : "bhvSnowLeafParticleSpawn", - "130013a8" : "bhvTreeSnow", - "130013c4" : "bhvTreeLeaf", - "130013dc" : "bhvAnotherTiltingPlatform", - "13001408" : "bhvSquarishPathMoving", - "1300142c" : "bhvPiranhaPlantBubble", - "13001448" : "bhvPiranhaPlantWakingBubbles", - "13001468" : "bhvFloorSwitchAnimatesObject", - "13001478" : "bhvFloorSwitchGrills", - "13001484" : "bhvFloorSwitchHardcodedModel", - "130014ac" : "bhvFloorSwitchHiddenObjects", - "130014bc" : "bhvHiddenObject", - "130014e0" : "bhvBreakableBox", - "13001518" : "bhvPushableMetalBox", - "13001548" : "bhvHeaveHo", - "130015a4" : "bhvHeaveHoThrowMario", - "130015c0" : "bhvCcmTouchedStarSpawn", - "130015e4" : "bhvUnusedPoundablePlatform", - "13001608" : "bhvBetaTrampolineTop", - "13001634" : "bhvBetaTrampolineSpring", - "13001650" : "bhvJumpingBox", - "1300167c" : "bhvBooCage", - "130016ac" : "bhvStub", - "130016b8" : "bhvIgloo", - "130016e4" : "bhvBowserKey", - "13001714" : "bhvGrandStar", - "13001744" : "bhvBetaBooKey", - "13001778" : "bhvAlphaBooKey", - "1300179c" : "bhvBulletBill", - "130017f4" : "bhvWhitePuffSmoke", - "13001820" : "bhvUnused1820", - "13001828" : "bhvBowserTailAnchor", - "13001850" : "bhvBowser", - "130018cc" : "bhvBowserBodyAnchor", - "13001904" : "bhvBowserFlameSpawn", - "13001920" : "bhvTiltingBowserLavaPlatform", - "13001958" : "bhvFallingBowserPlatform", - "13001984" : "bhvBlueBowserFlame", - "130019c8" : "bhvFlameFloatingLanding", - "13001a0c" : "bhvBlueFlamesGroup", - "13001a30" : "bhvFlameBouncing", - "13001a74" : "bhvFlameMovingForwardGrowing", - "13001aa4" : "bhvFlameBowser", - "13001ae8" : "bhvFlameLargeBurningOut", - "13001b2c" : "bhvBlueFish", - "13001b54" : "bhvTankFishGroup", - "13001b70" : "bhvCheckerboardElevatorGroup", - "13001b88" : "bhvCheckerboardPlatformSub", - "13001bb4" : "bhvBowserKeyUnlockDoor", - "13001bd4" : "bhvBowserKeyCourseExit", - "13001bf4" : "bhvInvisibleObjectsUnderBridge", - "13001c04" : "bhvWaterLevelPillar", - "13001c34" : "bhvDddWarp", - "13001c58" : "bhvMoatGrills", - "13001c7c" : "bhvClockMinuteHand", - "13001c8c" : "bhvClockHourHand", - "13001cb0" : "bhvMacroUkiki", - "13001d0c" : "bhvStub1D0C", - "13001d14" : "bhvLllRotatingHexagonalPlatform", - "13001d40" : "bhvLllSinkingRockBlock", - "13001d70" : "bhvStub1D70", - "13001d78" : "bhvLllMovingOctagonalMeshPlatform", - "13001da4" : "bhvSnowBall", - "13001da8" : "bhvLllRotatingBlockWithFireBars", - "13001dcc" : "bhvLllRotatingHexFlame", - "13001e04" : "bhvLllWoodPiece", - "13001e30" : "bhvLllFloatingWoodBridge", - "13001e4c" : "bhvVolcanoFlames", - "13001e6c" : "bhvLllRotatingHexagonalRing", - "13001e94" : "bhvLllSinkingRectangularPlatform", - "13001ec4" : "bhvLllSinkingSquarePlatforms", - "13001ef8" : "bhvLllTiltingInvertedPyramid", - "13001f30" : "bhvUnused1F30", - "13001f3c" : "bhvKoopaShell", - "13001f68" : "bhvKoopaShellFlame", - "13001f90" : "bhvToxBox", - "13001fbc" : "bhvPiranhaPlant", - "13002018" : "bhvLllHexagonalMesh", - "13002038" : "bhvLllBowserPuzzlePiece", - "13002068" : "bhvLllBowserPuzzle", - "13002088" : "bhvTuxiesMother", - "130020d8" : "bhvPenguinBaby", - "130020e0" : "bhvUnused20E0", - "130020e8" : "bhvSmallPenguin", - "1300213c" : "bhvFish2", - "1300214c" : "bhvFish3", - "1300215c" : "bhvLargeFishGroup", - "13002178" : "bhvFishGroup2", - "13002194" : "bhvWdwExpressElevator", - "130021c0" : "bhvWdwExpressElevatorPlatform", - "130021e4" : "bhvChirpChirp", - "130021f4" : "bhvChirpChirpUnused", - "1300220c" : "bhvBub", - "13002250" : "bhvExclamationBox", - "1300227c" : "bhvRotatingExclamationMark", - "1300229c" : "bhvSoundSpawner", - "130022b8" : "bhvRockSolid", - "130022d8" : "bhvBowserSubDoor", - "13002308" : "bhvBowsersSub", - "13002338" : "bhvSushiShark", - "13002388" : "bhvSushiSharkCollisionChild", - "130023a4" : "bhvJrbSlidingBox", - "130023d0" : "bhvShipPart3", - "130023ec" : "bhvInSunkenShip3", - "1300241c" : "bhvSunkenShipPart", - "1300243c" : "bhvSunkenShipSetRotation", - "1300244c" : "bhvSunkenShipPart2", - "1300246c" : "bhvInSunkenShip", - "13002480" : "bhvInSunkenShip2", - "130024ac" : "bhvMarioDustGenerator", - "130024dc" : "bhvWhitePuff1", - "13002500" : "bhvWhitePuff2", - "13002528" : "bhvWhitePuffSmoke2", - "13002558" : "bhvPurpleSwitchHiddenBoxes", - "13002568" : "bhvBlueCoinSwitch", - "13002588" : "bhvHiddenBlueCoin", - "130025c0" : "bhvOpenableCageDoor", - "130025e0" : "bhvOpenableGrill", - "130025f8" : "bhvWaterLevelDiamond", - "13002620" : "bhvInitializeChangingWaterLevel", - "13002634" : "bhvTornadoSandParticle", - "13002650" : "bhvTornado", - "13002684" : "bhvMerryGoRoundBooManager", - "1300269c" : "bhvAnimatedTexture", - "130026d4" : "bhvBooInCastle", - "13002710" : "bhvBooWithCage", - "13002768" : "bhvBalconyBigBoo", - "1300277c" : "bhvMerryGoRoundBigBoo", - "13002790" : "bhvGhostHuntBigBoo", - "130027d0" : "bhvCourtyardBooTriplet", - "130027e4" : "bhvBoo", - "130027f4" : "bhvMerryGoRoundBoo", - "13002804" : "bhvGhostHuntBoo", - "1300286c" : "bhvHiddenStaircaseStep", - "13002898" : "bhvBooBossSpawnedBridge", - "130028cc" : "bhvBbhTiltingTrapPlatform", - "130028fc" : "bhvHauntedBookshelf", - "1300292c" : "bhvMeshElevator", - "13002968" : "bhvMerryGoRound", - "13002998" : "bhvPlaysMusicTrackWhenTouched", - "130029b0" : "bhvInsideCannon", - "130029b4" : "bhvBetaBowserAnchor", - "130029e4" : "bhvStaticCheckeredPlatform", - "13002a10" : "bhvUnused2A10", - "13002a20" : "bhvUnusedFakeStar", - "13002a48" : "bhvStaticObject", - "13002a54" : "bhvUnused2A54", - "13002a5c" : "bhvCastleFloorTrap", - "13002a7c" : "bhvFloorTrapInCastle", - "13002aa4" : "bhvTree", - "13002ad0" : "bhvSparkle", - "13002af0" : "bhvSparkleSpawn", - "13002b08" : "bhvSpecialTripleJumpSparkles", - "13002b5c" : "bhvScuttlebug", - "13002ba0" : "bhvScuttlebugSpawn", - "13002bb8" : "bhvWhompKingBoss", - "13002bcc" : "bhvSmallWhomp", - "13002c14" : "bhvWaterSplash", - "13002c60" : "bhvWaterDrops", - "13002c7c" : "bhvWaterSurfaceWhiteWave", - "13002cb0" : "bhvObjectBubbleRipples", - "13002ce0" : "bhvSurfaceWaves", - "13002d28" : "bhvWaterSurfaceWhiteWave2", - "13002d50" : "bhvWavesGenerator", - "13002d7c" : "bhvSurfaceWaveShrinking", - "13002db0" : "bhvWaterType", - "13002dc0" : "bhvWaveTrailOnSurface", - "13002e04" : "bhvTinyWhiteWindParticle", - "13002e20" : "bhvWindParticle", - "13002e3c" : "bhvSnowmanWindBlowing", - "13002e58" : "bhvWalkingPenguin", - "13002ea8" : "bhvYellowBall", - "13002ec0" : "bhvMario", - "13002ef8" : "bhvToadMessage", - "13002f40" : "bhvUnlockDoorStar", - "13002f60" : "bhvWarps60", - "13002f64" : "bhvWarps64", - "13002f68" : "bhvWarps68", - "13002f6c" : "bhvWarps6C", - "13002f70" : "bhvWarps70", - "13002f74" : "bhvWarps74", - "13002f78" : "bhvWarps78", - "13002f7c" : "bhvWarps7C", - "13002f80" : "bhvWarps80", - "13002f84" : "bhvWarps84", - "13002f88" : "bhvWarps88", - "13002f8c" : "bhvWarps8C", - "13002f90" : "bhvWarps90", - "13002f94" : "bhvWarps94", - "13002fa0" : "bhvRandomAnimatedTexture", - "13002fc0" : "bhvYellowBackgroundInMenu", - "13002fe4" : "bhvMenuButton", - "13003008" : "bhvMenuButtonManager", - "1300302c" : "bhvActSelectorStarType", - "13003048" : "bhvActSelector", - "13003068" : "bhvMovingYellowCoin", - "130030a4" : "bhvMovingBlueCoin", - "130030d4" : "bhvBlueCoinSliding", - "13003104" : "bhvBlueCoinJumping", - "13003134" : "bhvSeaweed", - "13003158" : "bhvSeaweedBundle", - "13003174" : "bhvBobomb", - "130031ac" : "bhvBobombFuseSmoke", - "130031dc" : "bhvBobombBuddy", - "13003228" : "bhvBobombBuddyOpensCannon", - "13003274" : "bhvCannonClosed", - "130032a8" : "bhvWhirlpool", - "130032c8" : "bhvJetStream", - "130032e0" : "bhvMessagePanel", - "13003324" : "bhvSignOnWall", - "13003354" : "bhvHomingAmp", - "13003388" : "bhvCirclingAmp", - "130033bc" : "bhvButterfly", - "130033ec" : "bhvHoot", - "13003420" : "bhvBetaHoldableObject", - "13003454" : "bhvCarrySomething1", - "1300345c" : "bhvCarrySomething2", - "13003464" : "bhvCarrySomething3", - "1300346c" : "bhvCarrySomething4", - "13003474" : "bhvCarrySomething5", - "1300347c" : "bhvCarrySomething6", - "13003484" : "bhvObjectBubble", - "130034c4" : "bhvObjectWaterWave", - "13003510" : "bhvExplosion", - "13003558" : "bhvBobombBullyDeathSmoke", - "13003588" : "bhvSmoke", - "130035b0" : "bhvBobombExplosionBubble", - "13003600" : "bhvBobombExplosionBubble3600", - "13003614" : "bhvRespawner", - "1300362c" : "bhvSmallBully", - "13003660" : "bhvBigBully", - "13003694" : "bhvBigBullyWithMinions", - "130036c8" : "bhvSmallChillBully", - "13003700" : "bhvBigChillBully", - "13003738" : "bhvJetStreamRingSpawner", - "13003750" : "bhvJetStreamWaterRing", - "13003798" : "bhvMantaRayWaterRing", - "130037e0" : "bhvMantaRayRingManager", - "130037ec" : "bhvBowserBomb", - "1300381c" : "bhvBowserBombExplosion", - "13003840" : "bhvBowserBombSmoke", - "13003868" : "bhvCelebrationStar", - "13003888" : "bhvCelebrationStarSparkle", - "130038b0" : "bhvStarKeyCollectionPuffSpawner", - "130038d0" : "bhvLllDrawbridgeSpawner", - "130038e8" : "bhvLllDrawbridge", - "13003910" : "bhvSmallBomp", - "13003940" : "bhvLargeBomp", - "13003970" : "bhvWfSlidingPlatform", - "130039a0" : "bhvMoneybag", - "130039d4" : "bhvMoneybagHidden", - "13003a08" : "bhvPitBowlingBall", - "13003a30" : "bhvFreeBowlingBall", - "13003a58" : "bhvBowlingBall", - "13003a80" : "bhvTtmBowlingBallSpawner", - "13003aa4" : "bhvBobBowlingBallSpawner", - "13003ac8" : "bhvThiBowlingBallSpawner", - "13003ae0" : "bhvRrCruiserWing", - "13003b00" : "bhvSpindel", - "13003b30" : "bhvSslMovingPyramidWall", - "13003b60" : "bhvPyramidElevator", - "13003b98" : "bhvPyramidElevatorTrajectoryMarkerBall", - "13003bb4" : "bhvPyramidTop", - "13003bec" : "bhvPyramidTopFragment", - "13003c0c" : "bhvPyramidPillarTouchDetector", - "13003c30" : "bhvWaterfallSoundLoop", - "13003c44" : "bhvVolcanoSoundLoop", - "13003c58" : "bhvCastleFlagWaving", - "13003c7c" : "bhvBirdsSoundLoop", - "13003c90" : "bhvAmbientSounds", - "13003ca4" : "bhvSandSoundLoop", - "13003cb8" : "bhvHiddenAt120Stars", - "13003ce4" : "bhvSnowmansBottom", - "13003d0c" : "bhvSnowmansHead", - "13003d34" : "bhvSnowmansBodyCheckpoint", - "13003d4c" : "bhvBigSnowmanWhole", - "13003d74" : "bhvBigBoulder", - "13003da0" : "bhvBigBoulderGenerator", - "13003db8" : "bhvWingCap", - "13003dd8" : "bhvMetalCap", - "13003df8" : "bhvNormalCap", - "13003e1c" : "bhvVanishCap", - "13003e3c" : "bhvStar", - "13003e64" : "bhvStarSpawnCoordinates", - "13003e8c" : "bhvHiddenRedCoinStar", - "13003eac" : "bhvRedCoin", - "13003ee4" : "bhvBowserCourseRedCoinStar", - "13003efc" : "bhvHiddenStar", - "13003f1c" : "bhvHiddenStarTrigger", - "13003f40" : "bhvTtmRollingLog", - "13003f78" : "bhvLllVolcanoFallingTrap", - "13003fa4" : "bhvLllRollingLog", - "13003fdc" : "bhv1upWalking", - "13004010" : "bhv1upRunningAway", - "13004044" : "bhv1upSliding", - "1300407c" : "bhv1Up", - "130040b4" : "bhv1upJumpOnApproach", - "130040ec" : "bhvHidden1up", - "13004124" : "bhvHidden1upTrigger", - "13004148" : "bhvHidden1upInPole", - "13004180" : "bhvHidden1upInPoleTrigger", - "130041a4" : "bhvHidden1upInPoleSpawner", - "130041bc" : "bhvControllablePlatform", - "130041f0" : "bhvControllablePlatformSub", - "13004218" : "bhvBreakableBoxSmall", - "13004244" : "bhvSlidingSnowMound", - "13004270" : "bhvSnowMoundSpawn", - "13004284" : "bhvWdwSquareFloatingPlatform", - "130042b4" : "bhvWdwRectangularFloatingPlatform", - "130042e4" : "bhvJrbFloatingPlatform", - "13004314" : "bhvArrowLift", - "13004348" : "bhvOrangeNumber", - "13004370" : "bhvMantaRay", - "130043a0" : "bhvFallingPillar", - "130043c4" : "bhvFallingPillarHitbox", - "130043e0" : "bhvPillarBase", - "13004400" : "bhvJrbFloatingBox", - "1300442c" : "bhvDecorativePendulum", - "1300444c" : "bhvTreasureChestsShip", - "13004470" : "bhvTreasureChestsJrb", - "13004494" : "bhvTreasureChests", - "130044b8" : "bhvTreasureChestBottom", - "130044e0" : "bhvTreasureChestTop", - "130044fc" : "bhvMips", - "13004538" : "bhvYoshi", - "13004580" : "bhvKoopa", - "130045d0" : "bhvKoopaRaceEndpoint", - "130045f8" : "bhvKoopaFlag", - "13004634" : "bhvPokey", - "13004668" : "bhvPokeyBodyPart", - "13004698" : "bhvSwoop", - "130046dc" : "bhvFlyGuy", - "1300472c" : "bhvGoomba", - "13004770" : "bhvGoombaTripletSpawner", - "1300478c" : "bhvChainChomp", - "130047e4" : "bhvChainChompChainPart", - "1300481c" : "bhvWoodenPost", - "13004868" : "bhvChainChompGate", - "13004898" : "bhvWigglerHead", - "130048e0" : "bhvWigglerBody", - "13004918" : "bhvEnemyLakitu", - "13004954" : "bhvCameraLakitu", - "13004988" : "bhvCloud", - "130049ac" : "bhvCloudPart", - "130049c8" : "bhvSpiny", - "13004a00" : "bhvMontyMole", - "13004a58" : "bhvMontyMoleHole", - "13004a78" : "bhvMontyMoleRock", - "13004ab0" : "bhvPlatformOnTrack", - "13004af4" : "bhvTrackBall", - "13004b1c" : "bhvSeesawPlatform", - "13004b44" : "bhvFerrisWheelAxle", - "13004b6c" : "bhvFerrisWheelPlatform", - "13004b8c" : "bhvWaterBombSpawner", - "13004ba8" : "bhvWaterBomb", - "13004bd4" : "bhvWaterBombShadow", - "13004bf0" : "bhvTTCRotatingSolid", - "13004c24" : "bhvTTCPendulum", - "13004c5c" : "bhvTTCTreadmill", - "13004c94" : "bhvTTCMovingBar", - "13004ccc" : "bhvTTCCog", - "13004cf8" : "bhvTTCPitBlock", - "13004d28" : "bhvTTCElevator", - "13004d64" : "bhvTTC2DRotator", - "13004d90" : "bhvTTCSpinner", - "13004dbc" : "bhvMrBlizzard", - "13004e08" : "bhvMrBlizzardSnowball", - "13004e4c" : "bhvSlidingPlatform2", - "13004e78" : "bhvOctagonalPlatformRotating", - "13004ea0" : "bhvAnimatesOnFloorSwitchPress", - "13004ecc" : "bhvActivatedBackAndForthPlatform", - "13004ef8" : "bhvRecoveryHeart", - "13004f10" : "bhvWaterBombCannon", - "13004f28" : "bhvCannonBarrelBubbles", - "13004f40" : "bhvUnagi", - "13004f78" : "bhvUnagiSubobject", - "13004f90" : "bhvDorrie", - "13004fd4" : "bhvHauntedChair", - "13005024" : "bhvMadPiano", - "1300506c" : "bhvFlyingBookend", - "130050b4" : "bhvBookendSpawn", - "130050d4" : "bhvHauntedBookshelfManager", - "130050f4" : "bhvBookSwitch", - "13005120" : "bhvFirePiranhaPlant", - "13005158" : "bhvSmallPiranhaFlame", - "1300518c" : "bhvFireSpitter", - "130051ac" : "bhvFlyguyFlame", - "130051e0" : "bhvSnufit", - "1300521c" : "bhvSnufitBalls", - "1300525c" : "bhvHorizontalGrindel", - "130052b4" : "bhvEyerokBoss", - "130052d0" : "bhvEyerokHand", - "13005310" : "bhvKlepto", - "13005354" : "bhvBird", - "13005380" : "bhvRacingPenguin", - "130053c4" : "bhvPenguinRaceFinishLine", - "130053dc" : "bhvPenguinRaceShortcutCheck", - "130053f4" : "bhvCoffinManager", - "13005414" : "bhvCoffin", - "13005440" : "bhvClamShell", - "13005468" : "bhvSkeeter", - "130054a0" : "bhvSkeeterWave", - "130054b8" : "bhvSwingPlatform", - "130054ec" : "bhvDonutPlatformSpawner", - "13005504" : "bhvDonutPlatform", - "13005528" : "bhvDDDPole", - "1300556c" : "bhvRedCoinStarMarker", - "13005598" : "bhvTripletButterfly", - "130055dc" : "bhvBubba", - "13005610" : "bhvBeginningLakitu", - "13005638" : "bhvBeginningPeach", - "1300565c" : "bhvEndBirds1", - "13005680" : "bhvEndBirds2", - "130056a4" : "bhvIntroScene", - "130056c0" : "_behaviorSegmentEnd", - "007d1d80" : "_behaviorSegmentRomEnd", - "8016f000" : "_goddardSegmentStart", - "007cc6c0" : "_goddardSegmentRomStart", - }, - - "Refresh 6" : { - "80000000" : "D_80000000", - "a4000000" : "D_A4000000", - "a40004c0" : "D_A40004C0", - "a4000774" : "D_A4000774", - "a4001000" : "D_A4001000", - "a4040010" : "D_A4040010", - "a4080000" : "D_A4080000", - "a4300000" : "D_A4300000", - "a4300004" : "D_A4300004", - "a4300008" : "D_A4300008", - "a430000c" : "D_A430000C", - "a4400010" : "D_A4400010", - "a450000c" : "D_A450000C", - "a4600000" : "D_A4600000", - "a4600004" : "D_A4600004", - "a460000c" : "D_A460000C", - "a4600010" : "D_A4600010", - "a4700000" : "D_A4700000", - "a4700010" : "D_A4700010", - "a4800018" : "D_A4800018", - "b0000008" : "D_B0000008", - "b0000010" : "D_B0000010", - "b0000014" : "D_B0000014", - "c0000000" : "D_C0000000", - "c0000008" : "D_C0000008", - "c000000c" : "D_C000000C", - "00000000" : "__romPos", - "04000000" : "_bootSegmentStart", - "007cc6c0" : "_bootSegmentRomStart", - "04001000" : "_bootSegmentEnd", - "007cd6c0" : "_bootSegmentRomEnd", - "80000400" : ".", - "80000400" : "_zbufferSegmentNoloadStart", - "80000400" : "0x25800", - "80000400" : "gZBuffer", - "80246000" : "_mainSegmentStart", - "007cc6c0" : "_mainSegmentRomStart", - "80246000" : "EntryPoint", - "80246050" : "handle_debug_key_sequences", - "80246170" : "Unknown80246170", - "802461cc" : "Dummy802461CC", - "802461dc" : "Dummy802461DC", - "802461ec" : "Dummy802461EC", - "802461fc" : "setup_mesg_queues", - "802462e0" : "AllocPool", - "80246338" : "create_thread", - "8024639c" : "handle_nmi_request", - "802463ec" : "receive_new_tasks", - "8024651c" : "start_sptask", - "8024659c" : "interrupt_gfx_sptask", - "802465ec" : "start_gfx_sptask", - "80246648" : "pretend_audio_sptask_done", - "8024669c" : "handle_vblank", - "802467fc" : "handle_sp_complete", - "8024694c" : "handle_dp_complete", - "802469b8" : "thread3_main", - "80246b14" : "set_vblank_handler", - "80246b74" : "SendMessage", - "80246bb4" : "dispatch_audio_sptask", - "80246c10" : "send_display_list", - "80246c9c" : "turn_on_audio", - "80246cb8" : "turn_off_audio", - "80246cf0" : "thread1_idle", - "80246df8" : "Main", - "80246e70" : "my_rdp_init", - "802471a4" : "my_rsp_init", - "80247284" : "clear_z_buffer", - "802473c8" : "display_frame_buffer", - "802474b8" : "clear_frame_buffer", - "80247620" : "clear_viewport", - "8024784c" : "draw_screen_borders", - "802479bc" : "make_viewport_clip_rect", - "80247b3c" : "create_task_structure", - "80247ccc" : "init_render_image", - "80247d14" : "end_master_display_list", - "80247db4" : "func_80247D84", - "80247f08" : "func_80247ED8", - "80247fdc" : "func_80247FAC", - "80248090" : "display_and_vsync", - "80248304" : "adjust_analog_stick", - "80248498" : "run_demo_inputs", - "80248638" : "read_controller_inputs", - "80248824" : "init_controllers", - "80248964" : "setup_game_memory", - "80248af0" : "thread5_game_loop", - "80248c40" : "func_80248C10", - "80248c58" : "func_80248C28", - "80248ce8" : "func_80248CB8", - "80248d78" : "func_80248D48", - "80248dc0" : "func_80248D90", - "80248e08" : "set_sound_mode", - "80248e54" : "play_menu_sounds", - "80248fec" : "play_painting_eject_sound", - "80249070" : "play_infinite_stairs_music", - "80249178" : "set_background_music", - "8024922c" : "func_802491FC", - "8024927c" : "func_8024924C", - "802492d0" : "play_cutscene_music", - "80249310" : "play_shell_music", - "8024934c" : "stop_shell_music", - "80249398" : "play_cap_music", - "80249404" : "fadeout_cap_music", - "80249448" : "stop_cap_music", - "802494d8" : "audio_game_loop_tick", - "80249500" : "thread4_sound", - "802495e0" : "level_control_timer", - "802496b8" : "pressed_paused", - "80249764" : "set_play_mode", - "8024978c" : "func_8024975C", - "802497b8" : "func_80249788", - "8024982c" : "nop_802497FC", - "8024983c" : "func_8024980C", - "8024995c" : "func_8024992C", - "80249a10" : "set_mario_initial_cap_powerup", - "80249ab4" : "set_mario_initial_action", - "80249cd8" : "init_mario_after_warp", - "8024a124" : "func_8024A02C", - "8024a18c" : "func_8024A094", - "8024a1d8" : "func_8024A0E0", - "8024a374" : "check_instant_warp", - "8024a584" : "func_8024A48C", - "8024a700" : "initiate_warp", - "8024a7b4" : "get_painting_warp_node", - "8024a85c" : "initiate_painting_warp", - "8024a9cc" : "level_trigger_warp", - "8024aedc" : "initiate_delayed_warp", - "8024b13c" : "update_hud_values", - "8024b390" : "basic_update", - "8024b3e4" : "play_mode_normal", - "8024b5d4" : "play_mode_paused", - "8024b6cc" : "play_mode_frame_advance", - "8024b798" : "level_set_transition", - "8024b7c0" : "play_mode_change_area", - "8024b880" : "play_mode_change_level", - "8024b9b8" : "update_level", - "8024ba8c" : "init_level", - "8024bcd8" : "lvl_init_or_update", - "8024bd5c" : "lvl_init_from_save_file", - "8024be14" : "lvl_set_current_level", - "8024bfa0" : "lvl_play_the_end_screen_sound", - "8024bff0" : "get_mario_cap_flag", - "8024c0b8" : "object_facing_mario", - "8024c16c" : "mario_angle_to_object", - "8024c1d8" : "determine_interaction", - "8024c51c" : "attack_object", - "8024c618" : "mario_stop_riding_object", - "8024c66c" : "mario_grab_used_object", - "8024c6c0" : "mario_drop_held_object", - "8024c780" : "mario_throw_held_object", - "8024c894" : "mario_stop_riding_and_holding", - "8024c8fc" : "does_mario_have_hat", - "8024c928" : "mario_blow_off_cap", - "8024ca68" : "mario_lose_cap_to_enemy", - "8024caf8" : "mario_retrieve_cap", - "8024cb58" : "able_to_grab_object", - "8024cbfc" : "mario_get_collided_object", - "8024cc7c" : "mario_check_object_grab", - "8024ce08" : "bully_knock_back_mario", - "8024d0b4" : "bounce_off_object", - "8024d130" : "hit_object_from_below", - "8024d2bc" : "determine_knockback_action", - "8024d578" : "push_mario_out_of_object", - "8024d72c" : "bounce_back_from_attack", - "8024d804" : "func_8024D664", - "8024d8b0" : "take_damage_from_interact_object", - "8024d998" : "take_damage_and_knock_back", - "8024daac" : "reset_mario_pitch", - "8024db2c" : "interact_coin", - "8024dbf0" : "interact_water_ring", - "8024dc28" : "interact_star_or_key", - "8024de4c" : "interact_bbh_entrance", - "8024df10" : "interact_warp", - "8024e0c4" : "interact_warp_door", - "8024e2fc" : "get_door_save_file_flag", - "8024e420" : "interact_door", - "8024e6ec" : "interact_cannon_base", - "8024e778" : "interact_igloo_barrier", - "8024e7d4" : "interact_tornado", - "8024e8f0" : "interact_whirlpool", - "8024e9d0" : "interact_wind", - "8024ead8" : "interact_flame", - "8024ec54" : "interact_snufit_bullet", - "8024ed84" : "interact_clam_or_bubba", - "8024ee44" : "interact_bully", - "8024eff8" : "interact_shock", - "8024f170" : "interact_mr_blizzard", - "8024f1e0" : "interact_hit_from_below", - "8024f354" : "interact_bounce_top", - "8024f4ac" : "interact_unknown_08", - "8024f55c" : "interact_damage", - "8024f5cc" : "interact_breakable", - "8024f6a4" : "interact_koopa_shell", - "8024f7a8" : "check_object_grab_mario", - "8024f8bc" : "interact_pole", - "8024fa60" : "interact_hoot", - "8024fb30" : "interact_cap", - "8024fd2c" : "interact_grabbable", - "8024fe6c" : "func_8024FC94", - "8024ff04" : "func_8024FD2C", - "80250098" : "func_8024FEC0", - "80250198" : "interact_text", - "80250230" : "check_kick_or_punch_wall", - "802503f0" : "mario_process_interactions", - "802505c8" : "check_death_barrier", - "8025065c" : "check_lava_boost", - "80250724" : "pss_begin_slide", - "80250778" : "pss_end_slide", - "802507fc" : "mario_handle_special_floors", - "80250940" : "is_anim_at_end", - "8025097c" : "is_anim_past_end", - "802509b8" : "set_mario_animation", - "80250b04" : "set_mario_anim_with_accel", - "80250c7c" : "set_anim_to_frame", - "80250d38" : "is_anim_past_frame", - "80250e54" : "find_mario_anim_flags_and_translation", - "80251020" : "update_mario_pos_for_anim", - "802510dc" : "return_mario_anim_y_translation", - "80251120" : "play_sound_if_no_flag", - "8025118c" : "play_mario_jump_sound", - "80251274" : "adjust_sound_for_speed", - "80251310" : "play_sound_and_spawn_particles", - "80251444" : "play_mario_action_sound", - "802514ac" : "play_mario_landing_sound", - "80251510" : "play_mario_landing_sound_once", - "80251574" : "play_mario_heavy_landing_sound", - "802515d8" : "play_mario_heavy_landing_sound_once", - "8025163c" : "play_mario_sound", - "80251708" : "mario_set_forward_vel", - "8025177c" : "mario_get_floor_class", - "802518a8" : "mario_get_terrain_sound_addend", - "80251a48" : "resolve_and_return_wall_collisions", - "80251afc" : "vec3f_find_ceil", - "80251b54" : "mario_facing_downhill", - "80251bd4" : "mario_floor_is_slippery", - "80251cfc" : "mario_floor_is_slope", - "80251e24" : "mario_floor_is_steep", - "80251f24" : "find_floor_height_relative_polar", - "80252000" : "find_floor_slope", - "802521a0" : "update_mario_sound_and_camera", - "8025229c" : "set_steep_jump_action", - "80252cf4" : "set_mario_action", - "80252e5c" : "set_jump_from_landing", - "802530a0" : "set_jumping_action", - "80253178" : "drop_and_set_mario_action", - "802531c4" : "hurt_and_set_mario_action", - "80253218" : "check_common_action_exits", - "80253300" : "check_common_hold_action_exits", - "802533e4" : "transition_submerged_to_walking", - "80253488" : "set_water_plunge_action", - "80253588" : "squish_mario_model", - "80253720" : "debug_print_speed_action_normal", - "80253838" : "update_mario_button_inputs", - "8025395c" : "update_mario_joystick_inputs", - "80253a60" : "update_mario_geometry_inputs", - "80253d58" : "update_mario_inputs", - "80253ec0" : "set_submerged_cam_preset_and_spawn_bubbles", - "80254060" : "update_mario_health", - "802542b4" : "update_mario_info_for_cam", - "80254338" : "mario_reset_bodystate", - "80254390" : "sink_mario_in_quicksand", - "802543e8" : "update_and_return_cap_flags", - "80254588" : "mario_update_hitbox_and_cap_model", - "80254830" : "execute_mario_action", - "80254b20" : "init_mario", - "80254f44" : "init_mario_from_save_file", - "80255080" : "get_additive_y_vel_for_jumps", - "8025509c" : "nop_80254E3C", - "802550b0" : "nop_80254E50", - "802550c0" : "transfer_bully_speed", - "80255238" : "init_bully_collision_data", - "802552fc" : "mario_bonk_reflection", - "80255414" : "mario_update_quicksand", - "80255654" : "mario_push_off_steep_floor", - "8025570c" : "mario_update_moving_sand", - "8025580c" : "mario_update_windy_ground", - "802559b0" : "stop_and_set_height_to_floor", - "80255a34" : "stationary_ground_step", - "80255d88" : "perform_ground_step", - "80255ec4" : "check_ledge_grab", - "802560ac" : "perform_air_quarter_step", - "802564e0" : "apply_twirl_gravity", - "80256584" : "should_strengthen_gravity_for_jump_ascent", - "8025661c" : "apply_gravity", - "802569f8" : "apply_vertical_wind", - "80256b24" : "perform_air_step", - "80256cd8" : "set_vel_from_pitch_and_yaw", - "80256d8c" : "set_vel_from_yaw", - "80256e00" : "get_credits_str_width", - "80256e88" : "print_displaying_credits_entry", - "80257060" : "BehEndPeachLoop", - "802570dc" : "BehEndToadLoop", - "80257198" : "geo_switch_peach_eyes", - "802572b0" : "get_star_collection_dialog", - "8025733c" : "handle_save_menu", - "80257450" : "spawn_obj_at_mario_rel_yaw", - "802574e8" : "cutscene_take_cap_off", - "80257548" : "cutscene_put_cap_on", - "802575a8" : "mario_ready_to_speak", - "80257640" : "set_mario_npc_dialog", - "80257748" : "act_reading_npc_dialog", - "80257980" : "act_waiting_for_dialog", - "80257a0c" : "act_disappeared", - "80257ab0" : "act_reading_automatic_dialog", - "80257ce4" : "act_reading_sign", - "80257eac" : "act_debug_free_move", - "80258184" : "general_star_dance_handler", - "80258420" : "act_star_dance", - "802584dc" : "act_star_dance_water", - "802585c0" : "act_fall_after_star_grab", - "802586cc" : "common_death_handler", - "80258744" : "act_standing_death", - "802587ec" : "act_electrocution", - "8025883c" : "act_suffocation", - "8025888c" : "act_death_on_back", - "802588f8" : "act_death_on_stomach", - "80258964" : "act_quicksand_death", - "80258a7c" : "act_eaten_by_bubba", - "80258b24" : "launch_mario_until_land", - "80258ba8" : "act_unlocking_key_door", - "80258dac" : "act_unlocking_star_door", - "80258f94" : "act_entering_star_door", - "80259264" : "act_going_through_door", - "802593cc" : "act_warp_door_spawn", - "802594d4" : "act_emerge_from_pipe", - "80259608" : "act_spawn_spin_airborne", - "80259740" : "act_spawn_spin_landing", - "802597ac" : "act_exit_airborne", - "80259854" : "act_falling_exit_airborne", - "802598d0" : "act_exit_land_save_dialog", - "80259c30" : "act_death_exit", - "80259ce8" : "act_unused_death_exit", - "80259d74" : "act_falling_death_exit", - "80259e00" : "act_special_exit_airborne", - "80259ef8" : "act_special_death_exit", - "80259fcc" : "act_spawn_no_spin_airborne", - "8025a040" : "act_spawn_no_spin_landing", - "8025a0bc" : "act_bbh_enter_spin", - "8025a494" : "act_bbh_enter_jump", - "8025a610" : "act_teleport_fade_out", - "8025a6fc" : "act_teleport_fade_in", - "8025a858" : "act_shocked", - "8025a9ac" : "act_squished", - "8025ae0c" : "act_putting_on_cap", - "8025aea8" : "stuck_in_ground_handler", - "8025affc" : "act_head_stuck_in_ground", - "8025b050" : "act_butt_stuck_in_ground", - "8025b0a4" : "act_feet_stuck_in_ground", - "8025d798" : "mario_execute_cutscene_action", - "8025dd70" : "add_tree_leaf_particles", - "8025de1c" : "play_climbing_sounds", - "8025df04" : "set_pole_position", - "8025e21c" : "act_holding_pole", - "8025e5a8" : "act_climbing_pole", - "8025e7a4" : "act_grab_pole_slow", - "8025e830" : "act_grab_pole_fast", - "8025e930" : "act_top_of_pole_transition", - "8025ea30" : "act_top_of_pole", - "8025eb50" : "perform_hanging_step", - "8025ecfc" : "update_hang_moving", - "8025eed0" : "update_hang_stationary", - "8025ef58" : "act_start_hanging", - "8025f0b4" : "act_hanging", - "8025f1e4" : "act_hang_moving", - "8025f384" : "let_go_of_ledge", - "8025f4b4" : "func_8025F0DC", - "8025f560" : "func_8025F188", - "8025f644" : "update_ledge_climb", - "8025f6c0" : "act_ledge_grab", - "8025f970" : "act_ledge_climb_slow", - "8025fa64" : "act_ledge_climb_down", - "8025fae8" : "act_ledge_climb_fast", - "8025fb90" : "act_grabbed", - "8025fc6c" : "act_in_cannon", - "80260154" : "act_tornado_twirling", - "80260568" : "check_common_automatic_cancels", - "802605d0" : "mario_execute_automatic_action", - "802608b0" : "func_802604E0", - "80260aac" : "func_802606DC", - "80260cb4" : "act_idle", - "80260f94" : "func_80260BC4", - "80261000" : "act_start_sleeping", - "80261268" : "act_sleeping", - "802614fc" : "act_waking_up", - "8026168c" : "act_shivering", - "802618d8" : "act_coughing", - "802619d0" : "act_hold_idle", - "80261ad0" : "act_hold_heavy_idle", - "80261bf8" : "act_standing_against_wall", - "80261cec" : "act_in_quicksand", - "80261db4" : "act_crouching", - "80261f70" : "act_panting", - "80262080" : "act_hold_panting_unused", - "8026217c" : "func_80261D70", - "802621dc" : "act_braking_stop", - "802622dc" : "act_butt_slide_stop", - "80262398" : "func_80261F8C", - "80262490" : "act_slide_kick_slide_stop", - "80262530" : "act_start_crouching", - "80262650" : "act_stop_crouching", - "80262770" : "act_start_crawling", - "80262890" : "act_stop_crawling", - "80262980" : "func_80262574", - "80262bc4" : "func_802627B8", - "80262c34" : "func_80262828", - "80262d68" : "act_jump_land_stop", - "80262dc4" : "act_double_jump_land_stop", - "80262e20" : "act_side_flip_land_stop", - "80262e94" : "act_freefall_land_stop", - "80262ef0" : "act_triple_jump_land_stop", - "80262f50" : "act_backflip_land_stop", - "80262fec" : "act_lava_boost_land", - "8026305c" : "act_long_jump_land_stop", - "802630f8" : "func_80262CEC", - "802631f0" : "func_80262DE4", - "802632e8" : "act_air_throw_land", - "802633b4" : "act_twirl_land", - "8026350c" : "act_ground_pound_land", - "802635e8" : "act_first_person", - "80263784" : "func_80263378", - "80263898" : "mario_execute_stationary_action", - "80263e60" : "func_80263A50", - "80263ee4" : "func_80263AD4", - "80264024" : "func_80263C14", - "8026409c" : "begin_walking_action", - "802640fc" : "check_ledge_climb_down", - "802642b4" : "slide_bonk", - "80264340" : "set_triple_jump_action", - "8026440c" : "update_sliding_angle", - "80264740" : "update_sliding", - "80264b54" : "apply_slope_accel", - "80264d80" : "apply_landing_accel", - "80264e18" : "update_shell_speed", - "80265080" : "apply_slope_decel", - "802651b0" : "update_decelerating_speed", - "80265244" : "update_walking_speed", - "80265458" : "should_begin_sliding", - "80265514" : "analog_stick_held_back", - "80265558" : "check_ground_dive_or_punch", - "80265620" : "begin_braking_action", - "80265700" : "func_802652F0", - "80265b1c" : "func_8026570C", - "80265d90" : "func_80265980", - "80265df8" : "func_802659E8", - "80266038" : "func_80265C28", - "802661cc" : "func_80265DBC", - "80266354" : "act_walking", - "802665b4" : "act_move_punching", - "80266734" : "act_hold_walking", - "8026699c" : "act_hold_heavy_walking", - "80266af8" : "act_turning_around", - "80266d4c" : "act_finish_turning_around", - "80266e48" : "act_braking", - "80266fc8" : "act_decelerating", - "80267240" : "act_hold_decelerating", - "80267504" : "act_riding_shell_ground", - "80267728" : "act_crawling", - "8026795c" : "act_burning_ground", - "80267c24" : "func_80267814", - "80267ce4" : "common_slide_action", - "80267fa4" : "common_slide_action_with_jump", - "80268074" : "act_butt_slide", - "802680d4" : "act_hold_butt_slide", - "80268168" : "act_crouch_slide", - "80268338" : "act_slide_kick_slide", - "802684ac" : "stomach_slide_action", - "802685c0" : "act_stomach_slide", - "80268608" : "act_hold_stomach_slide", - "80268684" : "act_dive_slide", - "802687b8" : "common_ground_knockback_action", - "802689f8" : "act_hard_backward_ground_kb", - "80268adc" : "act_hard_forward_ground_kb", - "80268b64" : "act_backward_ground_kb", - "80268bb0" : "act_forward_ground_kb", - "80268bfc" : "act_soft_backward_ground_kb", - "80268c48" : "act_soft_forward_ground_kb", - "80268c94" : "act_ground_bonk", - "80268d04" : "act_death_exit_land", - "80268dcc" : "common_landing_action", - "80268f78" : "common_landing_cancels", - "80269108" : "act_jump_land", - "80269170" : "act_freefall_land", - "802691d8" : "act_side_flip_land", - "80269264" : "act_hold_jump_land", - "80269300" : "act_hold_freefall_land", - "8026939c" : "act_long_jump_land", - "8026947c" : "act_double_jump_land", - "802694e4" : "act_triple_jump_land", - "80269588" : "act_backflip_land", - "80269640" : "quicksand_jump_land_action", - "80269788" : "act_quicksand_jump_land", - "802697dc" : "act_hold_quicksand_jump_land", - "80269830" : "check_common_moving_cancels", - "80269954" : "mario_execute_moving_action", - "80269f40" : "play_flip_sounds", - "80269fc0" : "play_far_fall_sound", - "8026a090" : "func_u_8026A090", - "8026a12c" : "lava_boost_on_wall", - "8026a224" : "check_fall_damage", - "8026a400" : "check_kick_or_dive_in_air", - "8026a494" : "should_get_stuck_in_ground", - "8026a598" : "check_fall_damage_or_get_stuck", - "8026a62c" : "check_horizontal_wind", - "8026a818" : "update_air_with_turn", - "8026aa48" : "update_air_without_turn", - "8026acd8" : "update_lava_boost_or_twirling", - "8026ae5c" : "update_flying_yaw", - "8026b004" : "update_flying_pitch", - "8026b17c" : "update_flying", - "8026b444" : "common_air_action_step", - "8026b6a0" : "act_jump", - "8026b740" : "act_double_jump", - "8026b814" : "act_triple_jump", - "8026b90c" : "act_backflip", - "8026b9ac" : "act_freefall", - "8026bab8" : "act_hold_jump", - "8026bbb4" : "act_hold_freefall", - "8026bcc0" : "act_side_flip", - "8026bdcc" : "act_wall_kick_air", - "8026be78" : "act_long_jump", - "8026bf40" : "act_riding_shell_air", - "8026c034" : "act_twirling", - "8026c1e0" : "act_dive", - "8026c4b8" : "act_air_throw", - "8026c5d0" : "act_water_jump", - "8026c738" : "act_hold_water_jump", - "8026c880" : "act_steep_jump", - "8026c9fc" : "act_ground_pound", - "8026cd0c" : "act_burning_jump", - "8026ce50" : "act_burning_fall", - "8026cf28" : "act_crazy_box_bounce", - "8026d1b0" : "common_air_knockback_step", - "8026d33c" : "func_8026CDFC", - "8026d3c8" : "act_backward_air_kb", - "8026d43c" : "act_forward_air_kb", - "8026d4b0" : "act_hard_backward_air_kb", - "8026d508" : "act_hard_forward_air_kb", - "8026d560" : "act_thrown_backward", - "8026d608" : "act_thrown_forward", - "8026d6fc" : "act_soft_bonk", - "8026d770" : "act_getting_blown", - "8026d988" : "act_air_hit_wall", - "8026db54" : "act_forward_rollout", - "8026dcf4" : "act_backward_rollout", - "8026de98" : "act_butt_slide_air", - "8026e088" : "act_hold_butt_slide_air", - "8026e2b4" : "act_lava_boost", - "8026e59c" : "act_slide_kick", - "8026e810" : "act_jump_kick", - "8026e968" : "act_shot_from_cannon", - "8026ec00" : "act_flying", - "8026f158" : "act_riding_hoot", - "8026f2ec" : "act_flying_triple_jump", - "8026f614" : "act_top_of_pole_jump", - "8026f660" : "act_vertical_wind", - "8026f840" : "act_special_triple_jump", - "8026fa18" : "check_common_airborne_cancels", - "8026fb04" : "mario_execute_airborne_action", - "8027499c" : "mario_execute_submerged_action", - "80274eb0" : "animated_stationary_ground_step", - "80274f10" : "mario_update_punch_sequence", - "80275328" : "act_punching", - "8027546c" : "act_picking_up", - "802755fc" : "act_dive_picking_up", - "802756c8" : "act_placing_down", - "80275794" : "act_throwing", - "802758c0" : "act_heavy_throw", - "802759b4" : "act_stomach_slide_stop", - "80275a80" : "act_picking_up_bowser", - "80275b34" : "act_holding_bowser", - "80275e78" : "act_releasing_bowser", - "80275f0c" : "check_common_object_cancels", - "80275fe0" : "mario_execute_object_action", - "802761d0" : "geo_enfvx_main", - "802763d4" : "geo_skybox_main", - "802764b0" : "geo_draw_mario_head_goddard", - "8027684c" : "bhvToadMessage_loop", - "80276910" : "bhvToadMessage_init", - "80276bb8" : "bhvUnlockDoorStar_init", - "80276ccc" : "bhvUnlockDoorStar_loop", - "802770a4" : "geo_mirror_mario_set_alpha", - "80277150" : "geo_switch_mario_stand_run", - "802771bc" : "geo_switch_mario_eyes", - "80277294" : "geo_mario_tilt_torso", - "802773a4" : "geo_mario_head_rotation", - "802774f4" : "geo_switch_mario_hand", - "802775cc" : "geo_mario_hand_foot_scaler", - "802776d8" : "geo_switch_mario_cap_effect", - "80277740" : "geo_switch_mario_cap_on_off", - "80277824" : "geo_mario_rotate_wing_cap_wings", - "8027795c" : "geo_switch_mario_hand_grab_pos", - "80277b14" : "geo_render_mirror_mario", - "80277d6c" : "geo_mirror_mario_backface_culling", - "80277ee0" : "set_segment_base_addr", - "80277f20" : "get_segment_base_addr", - "80277f50" : "segmented_to_virtual", - "80277fa8" : "virtual_to_segmented", - "80277ff0" : "move_segment_table_to_dmem", - "80278074" : "main_pool_init", - "80278120" : "main_pool_alloc", - "80278238" : "main_pool_free", - "80278358" : "main_pool_realloc", - "802783c8" : "main_pool_available", - "802783e8" : "main_pool_push_state", - "80278498" : "main_pool_pop_state", - "8027868c" : "load_segment", - "802786f0" : "load_to_fixed_pool_addr", - "802787d8" : "load_segment_decompress", - "802788b4" : "func_80278304", - "80278974" : "load_engine_code_segment", - "80278a14" : "alloc_only_pool_init", - "80278ab8" : "alloc_only_pool_alloc", - "80278b28" : "alloc_only_pool_resize", - "80278b98" : "mem_pool_init", - "80278c58" : "mem_pool_alloc", - "80278d74" : "mem_pool_free", - "80278f2c" : "alloc_display_list", - "80279028" : "func_80278A78", - "80279084" : "func_80278AD4", - "80279840" : "save_file_do_save", - "802798fc" : "save_file_erase", - "80279960" : "save_file_copy", - "802799dc" : "save_file_load_all", - "80279bc8" : "save_file_reload", - "80279c44" : "save_file_collect_star_or_key", - "80279e44" : "save_file_exists", - "80279e80" : "save_file_get_max_coin_score", - "80279f80" : "save_file_get_course_star_count", - "8027a010" : "save_file_get_total_star_count", - "8027a0a8" : "save_file_set_flags", - "8027a0f4" : "save_file_clear_flags", - "8027a16c" : "save_file_get_flags", - "8027a1c8" : "save_file_get_star_flags", - "8027a23c" : "save_file_set_star_flags", - "8027a310" : "save_file_get_course_coin_score", - "8027a340" : "save_file_is_cannon_unlocked", - "8027a390" : "save_file_set_cannon_unlocked", - "8027a418" : "save_file_set_cap_pos", - "8027a4ac" : "save_file_get_cap_pos", - "8027a564" : "save_file_set_sound_mode", - "8027a5b4" : "save_file_get_sound_mode", - "8027a5d4" : "save_file_move_cap_to_default_location", - "8027a698" : "disable_warp_checkpoint", - "8027a6b0" : "check_if_should_set_warp_checkpoint", - "8027a718" : "check_warp_checkpoint", - "8027a7d0" : "func_8027A220", - "8027a83c" : "set_warp_transition_rgb", - "8027a8b0" : "print_intro_text", - "8027a93c" : "get_mario_spawn_type", - "8027a9c8" : "area_get_warp_node", - "8027aa28" : "func_8027A478", - "8027aa74" : "func_8027A4C4", - "8027ab04" : "clear_areas", - "8027ad74" : "func_8027A7C4", - "8027ae44" : "load_area", - "8027af48" : "func_8027A998", - "8027afbc" : "load_mario_area", - "8027b038" : "func_8027AA88", - "8027b0c0" : "change_area", - "8027b164" : "area_update_objects", - "8027b1a0" : "play_transition", - "8027b35c" : "play_transition_after_delay", - "8027b3b4" : "render_game", - "8027cf38" : "geo_set_animation_globals", - "8027da84" : "geo_process_held_object", - "8027de68" : "geo_try_process_children", - "8027dea8" : "geo_process_node_and_siblings", - "8027e130" : "geo_process_root", - "8027e3e0" : "profiler_log_thread5_time", - "8027e490" : "profiler_log_thread4_time", - "8027e520" : "profiler_log_gfx_time", - "8027e5cc" : "profiler_log_vblank_time", - "8027e65c" : "draw_profiler_bar", - "8027e958" : "draw_reference_profiler_bars", - "8027ebcc" : "draw_profiler_mode_1", - "8027eeac" : "draw_profiler_mode_0", - "8027f460" : "draw_profiler", - "8027f4e0" : "decompress", - "8027f590" : "set_camera_shake_from_hit", - "8027f8b8" : "set_environmental_camera_shake", - "8027f9f0" : "set_camera_shake_from_point", - "8027fb74" : "unused_set_camera_pitch_shake_env", - "8027fc18" : "calc_y_to_curr_floor", - "8027fe20" : "focus_on_mario", - "8027fff8" : "set_camera_height", - "80280368" : "look_down_slopes", - "802804f4" : "pan_ahead_of_player", - "802806a4" : "find_in_bounds_yaw_wdw_bob_thi", - "80280810" : "update_radial_camera", - "80280970" : "update_8_directions_camera", - "80280b00" : "radial_camera_move", - "80281188" : "lakitu_zoom", - "802813bc" : "radial_camera_input_default", - "802813ec" : "update_yaw_and_dist_from_c_up", - "8028146c" : "mode_radial_camera", - "80281588" : "mode_8_directions_camera", - "802816a0" : "update_outward_radial_camera", - "802817fc" : "mode_outward_radial_camera", - "80281904" : "update_parallel_tracking_camera", - "80282280" : "update_fixed_camera", - "802826a0" : "update_boss_fight_camera", - "80282c0c" : "unused_update_mode_5_camera", - "80282c3c" : "mode_boss_fight_camera", - "80282c7c" : "mode_parallel_tracking_camera", - "80282ce0" : "mode_fixed_camera", - "80282d78" : "update_behind_mario_camera", - "80283340" : "mode_behind_mario", - "80283578" : "update_slide_camera", - "802839e4" : "mode_behind_mario_camera", - "80283a18" : "nop_update_water_camera", - "80283a34" : "mode_water_surface_camera", - "80283a68" : "update_mario_camera", - "80283af8" : "update_default_camera", - "80284cb8" : "mode_default_camera", - "80284cfc" : "mode_lakitu_camera", - "80284d38" : "mode_mario_camera", - "80284d74" : "update_spiral_stairs_camera", - "802850ac" : "mode_spiral_stairs_camera", - "802850ec" : "update_slide_or_0f_camera", - "802851dc" : "mode_slide_camera", - "8028526c" : "store_lakitu_cam_info_for_c_up", - "802852f4" : "set_mode_c_up", - "80285370" : "exit_c_up", - "80285808" : "update_c_up", - "802858a4" : "move_mario_head_c_up", - "80285a2c" : "move_into_c_up", - "80285d20" : "mode_c_up_camera", - "80285ed8" : "update_in_cannon", - "80285f60" : "mode_cannon_camera", - "8028603c" : "transition_next_state", - "80286088" : "transition_to_camera_mode", - "80286188" : "set_camera_mode", - "80286420" : "update_lakitu", - "802868f8" : "update_camera", - "80286f68" : "reset_camera", - "8028724c" : "init_camera", - "802879ec" : "zoom_out_if_paused_and_outside", - "80287bc4" : "select_mario_cam_mode", - "80287be0" : "create_camera", - "80287cb8" : "update_graph_node_camera", - "80287d30" : "geo_camera_main", - "80287dc0" : "dummy_802877D8", - "80287dd4" : "dummy_802877EC", - "80287de8" : "vec3f_sub", - "80287e28" : "object_pos_to_vec3f", - "80287e50" : "vec3f_to_object_pos", - "80287e78" : "unused_object_angle_to_vec3s", - "80287ea0" : "evaluate_cubic_spline", - "802882e4" : "move_point_along_spline", - "80288624" : "cam_select_alt_mode", - "80288718" : "set_cam_angle", - "80288888" : "set_handheld_shake", - "802889b0" : "shake_camera_handheld", - "80288ce4" : "find_c_buttons_pressed", - "80288e68" : "update_camera_hud_status", - "80288f5c" : "collide_with_walls", - "80289198" : "vec3f_compare", - "80289214" : "clamp_pitch", - "802892d8" : "is_within_100_units_of_mario", - "8028935c" : "set_or_approach_f32_asymptotic", - "802893f4" : "approach_f32_asymptotic_bool", - "80289488" : "approach_f32_asymptotic", - "802894b4" : "approach_s16_asymptotic_bool", - "8028956c" : "approach_s16_asymptotic", - "80289610" : "approach_vec3f_asymptotic", - "80289684" : "set_or_approach_vec3f_asymptotic", - "802896f8" : "approach_vec3s_asymptotic", - "8028976c" : "camera_approach_s16_symmetric_bool", - "8028984c" : "camera_approach_s16_symmetric", - "8028993c" : "set_or_approach_s16_symmetric", - "802899cc" : "camera_approach_f32_symmetric_bool", - "80289b0c" : "camera_approach_f32_symmetric", - "80289c00" : "random_vec3s", - "80289d20" : "reduce_by_dist_from_camera", - "80289f88" : "clamp_positions_and_find_yaw", - "8028a080" : "calc_avoid_yaw", - "8028a0f4" : "is_surf_within_bounding_box", - "8028a4ec" : "is_behind_surface", - "8028a6bc" : "is_range_behind_surface", - "8028a7ec" : "is_mario_behind_surface", - "8028a834" : "scale_along_line", - "8028a8e8" : "is_pos_in_bounds", - "8028aa28" : "calculate_pitch", - "8028aad8" : "calculate_yaw", - "8028ab60" : "calculate_angles", - "8028ac28" : "calc_abs_dist", - "8028accc" : "calc_hor_dist", - "8028ad4c" : "rotate_in_xz", - "8028ae1c" : "rotate_in_yz", - "8028aef0" : "set_camera_pitch_shake", - "8028af4c" : "set_camera_yaw_shake", - "8028b00c" : "set_camera_roll_shake", - "8028b068" : "set_pitch_shake_from_point", - "8028b11c" : "set_yaw_shake_from_point", - "8028b1d0" : "increment_shake_offset", - "8028b218" : "shake_camera_pitch", - "8028b32c" : "shake_camera_yaw", - "8028b438" : "shake_camera_roll", - "8028b50c" : "offset_yaw_outward_radial", - "8028b724" : "cutscene_intro_peach_play_message_music", - "8028b754" : "cutscene_intro_peach_play_lakitu_flying_music", - "8028b784" : "play_camera_buzz_if_cdown", - "8028b7c4" : "play_camera_buzz_if_cbutton", - "8028b804" : "play_camera_buzz_if_c_sideways", - "8028b850" : "play_sound_cbutton_up", - "8028b884" : "play_sound_cbutton_down", - "8028b8b8" : "play_sound_cbutton_side", - "8028b8ec" : "play_sound_button_change_blocked", - "8028b920" : "play_sound_rbutton_changed", - "8028b954" : "play_sound_if_cam_switched_to_lakitu_or_mario", - "8028b9c4" : "radial_camera_input", - "8028bd34" : "trigger_cutscene_dialog", - "8028bd98" : "handle_c_button_movement", - "8028c038" : "clear_cutscene_vars", - "8028c13c" : "start_cutscene", - "8028c18c" : "determine_dance_cutscene", - "8028c26c" : "open_door_cutscene", - "8028c2c8" : "get_cutscene_from_mario_status", - "8028c7a0" : "warp_camera", - "8028c8f0" : "approach_camera_height", - "8028c9ac" : "unused_8028C3AC", - "8028c9cc" : "set_focus_rel_mario", - "8028cbf0" : "offset_rotated", - "8028cd94" : "offset_rotated_coords", - "8028cdec" : "determine_pushing_or_pulling_door", - "8028ce24" : "next_lakitu_state", - "8028d44c" : "set_camera_mode_fixed", - "8028d5ac" : "set_camera_mode_8_directions", - "8028d5fc" : "set_camera_mode_boss_fight", - "8028d658" : "set_camera_mode_close_cam", - "8028d698" : "set_camera_mode_radial", - "8028d79c" : "parallel_tracking_init", - "8028d888" : "set_fixed_cam_axis_sa_lobby", - "8028d92c" : "check_blocking_area_processing", - "8028da18" : "cam_rr_exit_building_side", - "8028da50" : "cam_rr_exit_building_top", - "8028daec" : "cam_rr_enter_building_window", - "8028db38" : "cam_rr_enter_building", - "8028dbb4" : "cam_rr_enter_building_side", - "8028dbf4" : "cam_cotmc_exit_waterfall", - "8028dc1c" : "cam_sl_snowman_head_8dir", - "8028dc70" : "cam_sl_free_roam", - "8028dca4" : "move_camera_through_floor_while_descending", - "8028dd48" : "cam_hmc_enter_maze", - "8028de2c" : "cam_hmc_elevator_black_hole", - "8028de5c" : "cam_hmc_elevator_maze_emergency_exit", - "8028de90" : "cam_hmc_elevator_lake", - "8028dec4" : "cam_hmc_elevator_maze", - "8028def8" : "cam_ssl_enter_pyramid_top", - "8028df24" : "cam_ssl_pyramid_center", - "8028df6c" : "cam_ssl_boss_room", - "8028dfb4" : "cam_thi_move_cam_through_tunnel", - "8028dfe8" : "cam_thi_look_through_tunnel", - "8028e01c" : "cam_bob_tower", - "8028e064" : "cam_bob_default_free_roam", - "8028e098" : "cam_castle_hmc_start_pool_cutscene", - "8028e0ec" : "cam_castle_lobby_entrance", - "8028e164" : "cam_castle_look_upstairs", - "8028e210" : "cam_castle_basement_look_downstairs", - "8028e298" : "cam_castle_enter_lobby", - "8028e300" : "cam_castle_enter_spiral_stairs", - "8028e38c" : "cam_castle_close_mode", - "8028e3b8" : "cam_castle_leave_lobby_sliding_door", - "8028e3f0" : "cam_castle_enter_lobby_sliding_door", - "8028e41c" : "cam_bbh_room_6", - "8028e450" : "cam_bbh_fall_off_roof", - "8028e47c" : "cam_bbh_fall_into_pool", - "8028e524" : "cam_bbh_room_1", - "8028e55c" : "cam_bbh_leave_front_door", - "8028e594" : "cam_bbh_room_2_lower", - "8028e5cc" : "cam_bbh_room_4", - "8028e604" : "cam_bbh_room_8", - "8028e63c" : "cam_bbh_room_5_library", - "8028e674" : "cam_bbh_room_5_library_to_hidden_transition", - "8028e6c4" : "cam_bbh_room_5_hidden_to_library_transition", - "8028e714" : "cam_bbh_room_5_hidden", - "8028e758" : "cam_bbh_room_3", - "8028e790" : "cam_bbh_room_7_mr_i", - "8028e7c8" : "cam_bbh_room_7_mr_i_to_coffins_transition", - "8028e818" : "cam_bbh_room_7_coffins_to_mr_i_transition", - "8028e868" : "cam_bbh_elevator_room_lower", - "8028e8a0" : "cam_bbh_room_0_back_entrance", - "8028e8cc" : "cam_bbh_elevator", - "8028e930" : "cam_bbh_room_12_upper", - "8028e974" : "cam_bbh_enter_front_door", - "8028e9a0" : "cam_bbh_room_2_library", - "8028e9d8" : "cam_bbh_room_2_library_to_trapdoor_transition", - "8028ea28" : "cam_bbh_room_2_trapdoor", - "8028ea60" : "cam_bbh_room_2_trapdoor_transition", - "8028eab0" : "cam_bbh_room_9_attic", - "8028eae8" : "cam_bbh_room_9_attic_transition", - "8028eb38" : "cam_bbh_room_9_mr_i_transition", - "8028eb88" : "cam_bbh_room_13_balcony", - "8028ebc0" : "cam_bbh_room_0", - "8028ec04" : "cam_ccm_enter_slide_shortcut", - "8028ec2c" : "cam_ccm_leave_slide_shortcut", - "8028ec58" : "surface_type_modes", - "8028ed30" : "set_mode_if_not_set_by_surface", - "8028ed98" : "surface_type_modes_thi", - "8028eeb0" : "camera_course_processing", - "8028f670" : "resolve_geometry_collisions", - "8028f914" : "rotate_camera_around_walls", - "8028fc9c" : "find_mario_floor_and_ceil", - "8028fe24" : "start_object_cutscene", - "8028fe58" : "start_object_cutscene_without_focus", - "8028fe84" : "unused_dialog_cutscene_response", - "8028ff04" : "cutscene_object_with_dialog", - "8028ffc8" : "cutscene_object_without_dialog", - "8029000c" : "cutscene_object", - "80290098" : "update_camera_yaw", - "802900e0" : "cutscene_reset_spline", - "80290104" : "stop_cutscene_and_retrieve_stored_info", - "80290168" : "cap_switch_save", - "802901a4" : "init_spline_point", - "802901fc" : "copy_spline_segment", - "802903b8" : "cutscene_common_set_dialog_state", - "802904a8" : "cutscene_intro_peach_start_letter_music", - "802904e4" : "cutscene_intro_peach_start_flying_music", - "8029051c" : "reset_pan_distance", - "8029053c" : "player2_rotate_cam", - "80290784" : "store_info_cannon", - "802907f4" : "retrieve_info_cannon", - "80290864" : "store_info_star", - "802908e8" : "retrieve_info_star", - "802909d0" : "pan_camera", - "80290a5c" : "cutscene_shake_explosion", - "80290abc" : "rotate_and_move_vec3f", - "80290b54" : "set_flag_post_door", - "80290ba4" : "cutscene_soften_music", - "80290bd8" : "cutscene_unsoften_music", - "80290c1c" : "cutscene_unused_start", - "80290c30" : "cutscene_unused_loop", - "80290c44" : "cutscene_ending_mario_fall_start", - "80290c9c" : "cutscene_ending_mario_fall_focus_mario", - "80290d90" : "cutscene_ending_mario_fall", - "80290e00" : "cutscene_ending_mario_land_closeup", - "80290e74" : "cutscene_ending_reset_spline", - "80290eb0" : "cutscene_ending_fly_up_to_window", - "80290f1c" : "cutscene_ending_stars_free_peach", - "80290f8c" : "cutscene_ending_mario_land", - "80291074" : "cutscene_ending_peach_appear_closeup", - "80291108" : "cutscene_ending_peach_appears", - "802911c8" : "cutscene_ending_peach_descends_start", - "80291208" : "cutscene_ending_follow_peach_descent", - "8029127c" : "cutscene_ending_peach_descent_lower_focus", - "802912b8" : "cutscene_ending_peach_descent_back_to_mario", - "80291354" : "cutscene_ending_peach_descends", - "8029142c" : "cutscene_ending_mario_to_peach", - "802914cc" : "cutscene_ending_look_up_at_castle", - "80291514" : "cutscene_ending_peach_wakeup", - "802915d4" : "cutscene_ending_dialog", - "80291654" : "cutscene_ending_kiss_closeup", - "802916b8" : "cutscene_ending_kiss_here_we_go", - "80291774" : "cutscene_ending_kiss", - "802917e4" : "cutscene_ending_look_at_sky", - "8029184c" : "cutscene_ending_zoom_fov", - "80291870" : "cutscene_ending_cake_for_mario", - "80291924" : "cutscene_ending_stop", - "80291964" : "cutscene_grand_star_start", - "802919dc" : "cutscene_grand_star_front_of_mario", - "80291ab4" : "cutscene_grand_star_mario_jump", - "80291b18" : "cutscene_grand_star_accel_cvar2", - "80291b68" : "cutscene_grand_star_approach_mario", - "80291bf4" : "cutscene_grand_star_move_cvar2", - "80291c3c" : "cutscene_grand_star_focus_mario", - "80291cd0" : "cutscene_grand_star", - "80291db0" : "cutscene_grand_star_fly_start", - "80291e84" : "cutscene_grand_star_fly_move_to_mario", - "80291f18" : "cutscene_grand_star_fly_mario_offscreen", - "80292038" : "cutscene_grand_star_fly_app_cvars", - "80292164" : "cutscene_grand_star_fly", - "802921fc" : "focus_in_front_of_mario", - "8029228c" : "cutscene_dance_move_to_mario", - "80292324" : "cutscene_dance_rotate", - "80292370" : "cutscene_dance_rotate_move_back", - "802923b8" : "cutscene_dance_rotate_move_towards_mario", - "80292414" : "cutscene_dance_default_focus_mario", - "8029244c" : "cutscene_dance_rotate_focus_mario", - "80292484" : "cutscene_dance_shake_fov", - "802924b8" : "cutscene_dance_default_rotate", - "80292628" : "star_dance_bound_yaw", - "802926dc" : "cutscene_dance_closeup_start", - "802927d0" : "cutscene_dance_closeup_focus_mario", - "80292868" : "cutscene_dance_closeup_fly_above", - "80292974" : "cutscene_dance_closeup_fly_closer", - "80292a20" : "cutscene_dance_closeup_zoom", - "80292a4c" : "cutscene_dance_closeup_shake_fov", - "80292a80" : "cutscene_dance_closeup", - "80292c00" : "cutscene_dance_fly_away_start", - "80292d80" : "cutscene_dance_fly_away_approach_mario", - "80292e2c" : "cutscene_dance_fly_away_focus_mario", - "80292ec4" : "cutscene_pan_cvar9", - "80292f40" : "cutscene_dance_fly_rotate_around_mario", - "80292f98" : "cutscene_dance_fly_away_rotate_while_flying", - "80292fe4" : "cutscene_dance_fly_away_shake_fov", - "80293018" : "cutscene_dance_fly_away", - "802930f0" : "cutscene_key_dance_jump_cvar", - "80293164" : "cutscene_key_dance_jump_closeup", - "802931c0" : "cutscene_key_dance_jump_lower_left", - "80293220" : "cutscene_key_dance_jump_above", - "8029328c" : "cutscene_key_dance_jump_last", - "802932f4" : "cutscene_key_dance_shake_fov", - "80293328" : "cutscene_key_dance_handheld_shake", - "80293354" : "cutscene_key_dance_focus_mario", - "8029338c" : "cutscene_key_dance", - "80293488" : "cutscene_bowser_area_shake_fov", - "802934b4" : "cutscene_bowser_area_start_bowser_walking", - "802934d8" : "cutscene_bowser_arena_set_pos", - "80293548" : "cutscene_bowser_arena_focus_sine", - "802935e0" : "cutscene_bowser_arena_set_focus", - "80293624" : "cutscene_bowser_arena_adjust_offsets", - "8029369c" : "cutscene_bowser_arena_pan_left", - "802936dc" : "cutscene_bowser_arena_mario_dialog", - "80293708" : "cutscene_stop_dialog", - "80293734" : "cutscene_bowser_arena_start", - "802937e8" : "bowser_fight_intro_dialog", - "8029386c" : "cutscene_bowser_arena_dialog", - "802938c8" : "cutscene_bowser_arena_end", - "80293944" : "cutscene_bowser_arena", - "80293abc" : "cutscene_star_spawn_store_info", - "80293ae8" : "cutscene_star_spawn_focus_star", - "80293b70" : "cutscene_star_spawn_update_boss_fight", - "80293bf4" : "cutscene_star_spawn_fly_back", - "80293c2c" : "cutscene_star_spawn", - "80293cb0" : "cutscene_star_spawn_back", - "80293d5c" : "cutscene_star_spawn_end", - "80293d90" : "cutscene_exit_waterfall_warp", - "80293dd4" : "cutscene_exit_to_castle_grounds_focus_mario", - "80293e7c" : "cutscene_exit_waterfall", - "80293ed8" : "cutscene_exit_to_castle_grounds_end", - "80293f2c" : "cutscene_exit_fall_to_castle_grounds_warp", - "80293f70" : "cutscene_exit_fall_to_castle_grounds", - "80293fcc" : "cutscene_red_coin_star_start", - "80294024" : "cutscene_red_coin_star_focus_xz", - "80294088" : "cutscene_red_coin_star_focus_y", - "802940cc" : "cutscene_red_coin_star_look_up_at_star", - "8029410c" : "cutscene_red_coin_star_warp", - "802942cc" : "cutscene_red_coin_star_set_fov", - "802942f0" : "cutscene_red_coin_star", - "802943d4" : "cutscene_red_coin_star_end", - "80294428" : "cutscene_goto_cvar_pos", - "80294718" : "cutscene_prepare_cannon_start", - "802947a4" : "cutscene_prepare_cannon_fly_to_cannon", - "8029480c" : "cannon_approach_prev", - "802948a0" : "cutscene_prepare_cannon_fly_back", - "80294a14" : "cutscene_prepare_cannon", - "80294a94" : "cutscene_prepare_cannon_end", - "80294ae8" : "water_death_move_to_mario_side", - "80294b78" : "death_goto_mario", - "80294bb4" : "cutscene_death_standing_start", - "80294c28" : "cutscene_death_standing_goto_mario", - "80294c5c" : "cutscene_death_standing", - "80294cc4" : "cutscene_death_stomach_start", - "80294d48" : "cutscene_death_stomach_goto_mario", - "80294db4" : "cutscene_death_stomach", - "80294e24" : "cutscene_bbh_death_start", - "80294ea8" : "cutscene_bbh_death_goto_mario", - "80294ee8" : "cutscene_bbh_death", - "80294f58" : "cutscene_quicksand_death_start", - "80294f94" : "cutscene_quicksand_death_goto_mario", - "80294fec" : "cutscene_quicksand_death", - "802950b0" : "cutscene_suffocation_fly_away", - "80295140" : "cutscene_suffocation_stay_above_gas", - "802951f0" : "cutscene_suffocation_rotate", - "80295270" : "cutscene_suffocation", - "80295310" : "cutscene_enter_pool_start", - "802953dc" : "cutscene_enter_pool_loop", - "80295418" : "cutscene_enter_pool", - "80295480" : "cutscene_pyramid_top_explode_start", - "802954ec" : "cutscene_pyramid_top_explode_zoom_in", - "80295518" : "cutscene_pyramid_top_explode_focus", - "80295580" : "cutscene_pyramid_top_explode_warp", - "80295670" : "cutscene_pyramid_top_explode_closeup", - "80295740" : "cutscene_pyramid_top_explode_cam_shake", - "8029576c" : "cutscene_pyramid_top_explode_warp_back", - "802957c8" : "cutscene_pyramid_top_explode", - "80295894" : "cutscene_pyramid_top_explode_end", - "802958d4" : "cutscene_enter_pyramid_top_start", - "80295930" : "cutscene_enter_pyramid_top", - "80295a58" : "cutscene_dialog_start", - "80295bf0" : "cutscene_dialog_move_mario_shoulder", - "80295e24" : "cutscene_dialog_create_dialog_box", - "80295e8c" : "cutscene_dialog", - "80295fb0" : "cutscene_dialog_set_flag", - "80295fd8" : "cutscene_dialog_end", - "80296020" : "cutscene_read_message_start", - "80296160" : "cutscene_read_message", - "802962c8" : "cutscene_read_message_set_flag", - "802962f0" : "cutscene_read_message_end", - "80296318" : "cutscene_exit_succ_start", - "802963b8" : "cutscene_non_painting_set_cam_pos", - "8029652c" : "cutscene_non_painting_set_cam_focus", - "8029665c" : "cutscene_exit_bowser_succ_focus_left", - "8029669c" : "cutscene_exit_bowser_key_toss_shake", - "802966e4" : "cutscene_exit_succ_shake_landing", - "80296710" : "cutscene_exit_bowser_succ", - "802967c4" : "cutscene_non_painting_end", - "8029685c" : "cutscene_exit_non_painting_succ_override_cvar", - "802968a0" : "cutscene_exit_non_painting_succ", - "8029695c" : "cutscene_non_painting_death_start", - "802969f8" : "cutscene_exit_bowser_death", - "80296a64" : "cutscene_non_painting_death_override_offset", - "80296b30" : "cutscene_non_painting_death", - "80296bc8" : "cutscene_cap_switch_press_start", - "80296c4c" : "cutscene_cap_switch_press_rotate_around_mario", - "80296d60" : "cutscene_cap_switch_press_lower_cam", - "80296da8" : "cutscene_cap_switch_press_approach_mario", - "80296eb4" : "cutscene_cap_switch_press_pan_left", - "80296f38" : "cutscene_cap_switch_press_create_dialog", - "80296fa8" : "cutscene_cap_switch_press", - "80297148" : "cutscene_unlock_key_door_start", - "8029720c" : "cutscene_unlock_key_door_approach_mario", - "80297290" : "cutscene_unlock_key_door_focus_lock", - "802972ec" : "cutscene_unlock_key_door_stub", - "80297300" : "cutscene_unlock_key_door_fly_back", - "80297384" : "cutscene_unlock_key_door_fov_shake", - "802973b0" : "cutscene_unlock_key_door", - "80297464" : "intro_peach_move_camera_start_to_pipe", - "80297560" : "peach_letter_text", - "8029758c" : "play_sound_peach_reading_letter", - "802975c4" : "cutscene_intro_peach_start_to_pipe_spline", - "8029762c" : "cutscene_intro_peach_dialog", - "802976bc" : "cutscene_intro_peach_follow_pipe_spline", - "80297728" : "cutscene_intro_peach_clear_cutscene_status", - "80297748" : "cutscene_intro_peach_zoom_fov", - "80297784" : "cutscene_intro_peach_reset_spline", - "802977c8" : "cutscene_intro_peach_handheld_shake_off", - "802977f4" : "intro_pipe_exit_text", - "80297820" : "play_sound_intro_turn_on_hud", - "8029784c" : "cutscene_intro_peach_fly_to_pipe", - "80297908" : "cutscene_intro_peach_mario_appears", - "80297a38" : "cutscene_intro_peach_reset_fov", - "80297a64" : "cutscene_intro_peach_letter", - "80297b58" : "cutscene_end_waving_start", - "80297b84" : "cutscene_end_waving", - "80297c14" : "cutscene_credits_reset_spline", - "80297c40" : "cutscene_credits", - "802980dc" : "cutscene_sliding_doors_open_start", - "8029819c" : "cutscene_sliding_doors_open_set_cvars", - "80298218" : "cutscene_sliding_doors_go_under_doorway", - "80298254" : "cutscene_sliding_doors_fly_back_up", - "80298290" : "cutscene_sliding_doors_follow_mario", - "802983b4" : "cutscene_sliding_doors_open", - "80298458" : "cutscene_double_doors_end", - "802984a0" : "cutscene_enter_painting_stub", - "802984b4" : "cutscene_enter_painting", - "802987b0" : "cutscene_exit_painting_start", - "8029894c" : "cutscene_exit_painting_move_to_mario", - "802989e8" : "cutscene_exit_painting_move_to_floor", - "80298af8" : "cutscene_exit_painting", - "80298ba0" : "cutscene_unused_exit_start", - "80298c2c" : "cutscene_unused_exit_focus_mario", - "80298ccc" : "cutscene_exit_painting_end", - "80298d44" : "cutscene_enter_cannon_end", - "80298d9c" : "cutscene_enter_cannon_raise", - "80298fe8" : "cutscene_enter_cannon_start", - "80299100" : "cutscene_door_start", - "80299154" : "cutscene_door_fix_cam", - "802991a8" : "cutscene_door_loop", - "802991f0" : "cutscene_door_move_behind_mario", - "802992cc" : "cutscene_door_follow_mario", - "80299360" : "cutscene_door_end", - "80299404" : "cutscene_door_mode", - "802994e8" : "play_cutscene", - "8029a2f8" : "cutscene_event", - "8029a37c" : "cutscene_spawn_obj", - "8029a3b4" : "set_fov_shake", - "8029a41c" : "set_fov_shake_from_point", - "8029a4d0" : "shake_camera_fov", - "8029a5e8" : "set_fov_30", - "8029a60c" : "approach_fov_20", - "8029a64c" : "set_fov_45", - "8029a670" : "set_fov_29", - "8029a694" : "zoom_fov_30", - "8029a6f4" : "fov_default", - "8029a858" : "approach_fov_30", - "8029a894" : "approach_fov_60", - "8029a8d0" : "approach_fov_45", - "8029a968" : "approach_fov_80", - "8029a9a4" : "set_fov_bbh", - "8029aa3c" : "geo_camera_fov", - "8029ab94" : "set_fov_function", - "8029abb0" : "cutscene_set_fov_shake_preset", - "8029ac30" : "set_fov_shake_from_point_preset", - "8029aef8" : "obj_rotate_towards_point", - "8029af98" : "intro_peach_set_pos_and_opacity", - "8029b08c" : "bhv_intro_peach_loop", - "8029b28c" : "intro_lakitu_set_offset_from_camera", - "8029b358" : "intro_lakitu_set_focus", - "8029b3c8" : "intro_lakitu_set_pos_and_focus", - "8029b49c" : "bhv_intro_lakitu_loop", - "8029bde4" : "bhv_end_birds_1_loop", - "8029bf64" : "bhv_end_birds_2_loop", - "8029c0e4" : "func_8029B964", - "8029c254" : "bhv_intro_scene_loop", - "8029c770" : "nop_change_course", - "8029c780" : "copy_mario_state_to_object", - "8029c9cc" : "spawn_particle", - "8029ca58" : "bhv_mario_update", - "8029cb34" : "update_objects_starting_at", - "8029cbc8" : "update_objects_during_time_stop", - "8029cd28" : "update_objects_in_list", - "8029cd98" : "unload_deactivated_objects_in_list", - "8029ce58" : "set_object_respawn_info_bits", - "8029cedc" : "unload_objects_from_area", - "8029cfb0" : "spawn_objects_from_info", - "8029d1d8" : "stub_8029CA50", - "8029d1e8" : "clear_objects", - "8029d324" : "update_terrain_objects", - "8029d374" : "update_non_terrain_objects", - "8029d428" : "unload_deactivated_objects", - "8029d690" : "update_objects", - "8029d890" : "Geo18_8029D890", - "8029d924" : "Geo18_8029D924", - "8029db48" : "geo_switch_anim_state", - "8029dbd4" : "geo_switch_area", - "8029dcd4" : "func_8029D558", - "8029dda8" : "apply_object_scale_to_matrix", - "8029de80" : "func_8029D704", - "8029e1b0" : "set_object_held_state", - "8029e27c" : "lateral_dist_between_objects", - "8029e2f8" : "dist_between_objects", - "8029e398" : "obj_forward_vel_approach_upward", - "8029e3e8" : "approach_f32_signed", - "8029e494" : "approach_f32_symmetric", - "8029e530" : "approach_s16_symmetric", - "8029e5ec" : "obj_rotate_yaw_toward", - "8029e694" : "angle_to_object", - "8029e714" : "obj_turn_toward_object", - "8029e8bc" : "set_object_parent_relative_pos", - "8029e914" : "set_object_pos", - "8029e96c" : "set_object_angle", - "8029e9ac" : "spawn_object_abs_with_rot", - "8029ea24" : "spawn_object_rel_with_rot", - "8029eaac" : "Unknown8029E330", - "8029eb04" : "spawn_water_splash", - "8029ed20" : "spawn_object_at_origin", - "8029edcc" : "spawn_object", - "8029ee24" : "try_to_spawn_object", - "8029eeb8" : "spawn_object_with_scale", - "8029ef64" : "spawn_object_relative", - "8029effc" : "spawn_object_relative_with_scale", - "8029f070" : "obj_move_using_vel", - "8029f0c8" : "copy_object_graph_y_offset", - "8029f0e0" : "copy_object_pos_and_angle", - "8029f120" : "copy_object_pos", - "8029f148" : "copy_object_angle", - "8029f188" : "func_8029EA0C", - "8029f1b0" : "Unknown8029EA34", - "8029f200" : "linear_mtxf_mul_vec3f", - "8029f274" : "linear_mtxf_transpose_mul_vec3f", - "8029f2ec" : "apply_scale_to_object_transform", - "8029f3a8" : "copy_object_scale", - "8029f3d0" : "scale_object_xyz", - "8029f404" : "scale_object", - "8029f430" : "obj_scale", - "8029f464" : "SetObjAnimation", - "8029f4b4" : "set_obj_animation_and_sound_state", - "8029f514" : "func_8029ED98", - "8029f59c" : "func_8029EE20", - "8029f600" : "obj_enable_rendering_and_become_tangible", - "8029f620" : "obj_enable_rendering", - "8029f644" : "obj_disable_rendering_and_become_intangible", - "8029f66c" : "obj_disable_rendering", - "8029f694" : "obj_unhide", - "8029f6bc" : "obj_hide", - "8029f6e0" : "obj_set_pos_relative", - "8029f7d8" : "obj_set_pos_relative_to_parent", - "8029f820" : "obj_enable_rendering_2", - "8029f848" : "obj_unused_init_on_floor", - "8029f8ec" : "obj_set_facing_to_move_angles", - "8029f914" : "get_object_list_from_behavior", - "8029f95c" : "obj_nearest_object_with_behavior", - "8029f998" : "obj_dist_to_nearest_object_with_behavior", - "8029f9ec" : "obj_find_nearest_object_with_behavior", - "8029fb1c" : "find_unimportant_object", - "8029fb68" : "count_unimportant_objects", - "8029fbdc" : "count_objects_with_behavior", - "8029fc9c" : "obj_find_nearby_held_actor", - "8029fdb4" : "obj_change_action", - "8029fe00" : "func_8029F684", - "8029fe6c" : "func_8029F6F0", - "8029fea4" : "func_8029F728", - "8029ff04" : "func_8029F788", - "8029ffa4" : "func_8029F828", - "802a0008" : "obj_check_anim_frame", - "802a0050" : "obj_check_anim_frame_in_range", - "802a00ac" : "Unknown8029F930", - "802a0114" : "mario_is_in_air_action", - "802a0154" : "mario_is_dive_sliding", - "802a0198" : "func_8029FA1C", - "802a01d8" : "func_8029FA5C", - "802a0380" : "obj_get_thrown_or_placed", - "802a0474" : "obj_get_dropped", - "802a04c0" : "obj_set_model", - "802a04f0" : "mario_set_flag", - "802a0514" : "obj_clear_interact_status_flag", - "802a0568" : "mark_object_for_deletion", - "802a057c" : "obj_disable", - "802a05b4" : "obj_become_intangible", - "802a05d4" : "obj_become_tangible", - "802a05f0" : "make_object_tangible", - "802a0604" : "obj_update_floor_height", - "802a064c" : "obj_update_floor_height_and_get_floor", - "802a079c" : "obj_apply_drag_xz", - "802a0e68" : "obj_move_y", - "802a113c" : "obj_unused_resolve_wall_collisions", - "802a11a8" : "abs_angle_diff", - "802a120c" : "obj_move_xz_using_fvel_and_yaw", - "802a12a4" : "obj_move_y_with_terminal_vel", - "802a1308" : "obj_compute_vel_xz", - "802a1370" : "func_802A0BF4", - "802a1424" : "are_objects_collided", - "802a148c" : "obj_set_behavior", - "802a14c4" : "set_object_behavior", - "802a14fc" : "obj_has_behavior", - "802a1554" : "object_has_behavior", - "802a15ac" : "obj_lateral_dist_from_mario_to_home", - "802a1634" : "obj_lateral_dist_to_home", - "802a16ac" : "obj_outside_home_square", - "802a1774" : "obj_outside_home_rectangle", - "802a184c" : "obj_set_pos_to_home", - "802a188c" : "obj_set_pos_to_home_and_stop", - "802a18dc" : "obj_shake_y", - "802a1930" : "obj_start_cam_event", - "802a1960" : "Unknown802A11E4", - "802a19ac" : "obj_set_billboard", - "802a19c8" : "obj_set_hitbox_radius_and_height", - "802a19f0" : "obj_set_hurtbox_radius_and_height", - "802a1b34" : "spawn_object_loot_blue_coins", - "802a1b8c" : "spawn_object_loot_yellow_coins", - "802a1bdc" : "obj_spawn_loot_coin_at_mario_pos", - "802a1c68" : "obj_abs_y_dist_to_home", - "802a1cc4" : "Unknown802A1548", - "802a1f3c" : "obj_resolve_wall_collisions", - "802a2320" : "obj_update_floor_and_walls", - "802a2348" : "obj_move_standard", - "802a25b4" : "obj_move_using_vel_and_gravity", - "802a2644" : "obj_move_using_fvel_and_gravity", - "802a2674" : "set_object_pos_relative", - "802a2748" : "obj_angle_to_home", - "802a27b0" : "func_802A2008", - "802a2804" : "translate_object_local", - "802a2930" : "build_object_transform_from_pos_and_angle", - "802a2a18" : "func_802A2270", - "802a2a84" : "build_object_transform_relative_to_parent", - "802a2b28" : "Unknown802A2380", - "802a2b6c" : "obj_rotate_move_angle_using_vel", - "802a2bc4" : "obj_rotate_face_angle_using_vel", - "802a2c1c" : "obj_set_face_angle_to_move_angle", - "802a2c5c" : "obj_follow_path", - "802a2ed4" : "chain_segment_init", - "802a2f14" : "random_f32_around_zero", - "802a2f5c" : "scale_object_random", - "802a2fc0" : "translate_object_xyz_random", - "802a308c" : "translate_object_xz_random", - "802a31e0" : "func_802A2A38", - "802a3268" : "obj_reflect_move_angle_off_wall", - "802a32ac" : "obj_spawn_particles", - "802a34a4" : "set_object_hitbox", - "802a3604" : "signum_positive", - "802a3634" : "absf", - "802a3674" : "absi", - "802a36a4" : "obj_wait_then_blink", - "802a3754" : "obj_is_mario_ground_pounding_platform", - "802a37ac" : "func_802A3004", - "802a37dc" : "func_802A3034", - "802a3818" : "obj_push_mario_away", - "802a390c" : "obj_push_mario_away_from_cylinder", - "802a399c" : "BehDustSmokeLoop", - "802a3a4c" : "func_802A32A4", - "802a3a88" : "func_802A32E0", - "802a3b28" : "nop_802A3380", - "802a3b40" : "func_802A3398", - "802a3c18" : "func_802A3470", - "802a3cec" : "nop_802A3544", - "802a3cfc" : "obj_is_mario_on_platform", - "802a3d40" : "obj_shake_y_until", - "802a3dd4" : "func_802A362C", - "802a3e30" : "obj_call_action_function", - "802a3ef8" : "Unknown802A3750", - "802a3f24" : "func_802A377C", - "802a3f48" : "obj_mario_far_away", - "802a404c" : "obj_is_mario_moving_fast_or_in_air", - "802a40b8" : "item_in_array", - "802a4120" : "bhv_init_room", - "802a4210" : "obj_enable_rendering_if_mario_in_room", - "802a4360" : "obj_set_hitbox_and_die_if_attacked", - "802a4440" : "func_802A3C98", - "802a44f4" : "set_object_collision_data", - "802a452c" : "obj_if_hit_wall_bounce_away", - "802a4564" : "obj_hide_if_mario_far_away_y", - "802a45e4" : "Geo18_802A45E4", - "802a462c" : "Unknown802A3E84", - "802a46cc" : "obj_is_hidden", - "802a4704" : "enable_time_stop", - "802a4728" : "disable_time_stop", - "802a4750" : "set_time_stop_flags", - "802a4774" : "clear_time_stop_flags", - "802a47a0" : "func_802A3FF8", - "802a48bc" : "obj_is_mario_in_range_and_ready_to_speak", - "802a4960" : "obj_update_dialog", - "802a4be4" : "obj_update_dialog_with_cutscene", - "802a4f04" : "obj_has_model", - "802a4f58" : "obj_align_gfx_with_floor", - "802a5034" : "mario_is_within_rectangle", - "802a50fc" : "ShakeScreen", - "802a513c" : "attack_collided_non_mario_object", - "802a51ac" : "obj_was_attacked_or_ground_pounded", - "802a5228" : "copy_object_behavior_params", - "802a5248" : "func_802A4A70", - "802a5288" : "func_802A4AB0", - "802a52c4" : "func_802A4AEC", - "802a52f8" : "obj_check_grabbed_mario", - "802a5358" : "player_performed_grab_escape_action", - "802a540c" : "obj_unused_play_footstep_sound", - "802a5460" : "enable_time_stop_including_mario", - "802a5498" : "disable_time_stop_including_mario", - "802a54d8" : "obj_check_interacted", - "802a5524" : "obj_spawn_loot_blue_coin", - "802a5588" : "obj_spawn_star_at_y_offset", - "802a5620" : "func_802A4DB0", - "802a56bc" : "bhv_star_door_loop", - "802a58dc" : "bhv_piranha_particle_loop", - "802a597c" : "ActionMrIParticle0", - "802a5a44" : "ActionMrIParticle1", - "802a5aa0" : "bhv_mr_i_particle_loop", - "802a5acc" : "func_802A525C", - "802a5bd4" : "bhv_mr_i_body_loop", - "802a5d4c" : "ActionMrI3", - "802a6518" : "ActionMrI2", - "802a68a0" : "ActionMrI1", - "802a6ad8" : "ActionMrI0", - "802a6b7c" : "bhv_mr_i_loop", - "802a6c20" : "bhv_pole_init", - "802a6c74" : "bhv_giant_pole_loop", - "802a6cf4" : "bhv_thi_huge_island_top_loop", - "802a6d64" : "bhv_thi_tiny_island_top_loop", - "802a6ee4" : "ActionActivateCapSwitch0", - "802a7020" : "ActionActivateCapSwitch1", - "802a708c" : "ActionActivateCapSwitch2", - "802a7160" : "ActionActivateCapSwitch3", - "802a7170" : "bhv_cap_switch_loop", - "802a719c" : "Geo18_802A719C", - "802a7230" : "bhv_bobomb_anchor_mario_loop", - "802a7264" : "ActionKingBobomb0", - "802a7384" : "func_802A6AF8", - "802a73d8" : "ActionKingBobomb2", - "802a7598" : "ActionKingBobomb3", - "802a7804" : "ActionKingBobomb1", - "802a78d8" : "ActionKingBobomb6", - "802a7a60" : "ActionKingBobomb7", - "802a7b1c" : "ActionKingBobomb8", - "802a7b5c" : "ActionKingBobomb4", - "802a7d14" : "ActionKingBobomb5", - "802a7fbc" : "func_802A7748", - "802a8064" : "bhv_king_bobomb_loop", - "802a816c" : "bhv_beta_chest_bottom_init", - "802a81e8" : "bhv_beta_chest_bottom_loop", - "802a821c" : "bhv_beta_chest_lid_loop", - "802a8370" : "bhv_water_air_bubble_init", - "802a83a0" : "bhv_water_air_bubble_loop", - "802a8630" : "bhv_bubble_wave_init", - "802a86bc" : "Unknown802A7E48", - "802a870c" : "bhv_bubble_maybe_loop", - "802a88a4" : "bhv_small_water_wave_loop", - "802a8a38" : "func_802A81C4", - "802a8b18" : "bhv_particle_init", - "802a8bc0" : "bhv_particle_loop", - "802a8c88" : "bhv_small_bubbles_loop", - "802a8cdc" : "bhv_fish_group_loop", - "802a8d48" : "bhv_water_waves_init", - "802a8d98" : "bhv_cannon_base_unused_loop", - "802a8dc0" : "ActionOpenedCannon0", - "802a8f40" : "ActionOpenedCannon4", - "802a9114" : "ActionOpenedCannon6", - "802a92fc" : "ActionOpenedCannon5", - "802a93f8" : "ActionOpenedCannon1", - "802a9440" : "ActionOpenedCannon2", - "802a9460" : "ActionOpenedCannon3", - "802a9498" : "bhv_cannon_base_loop", - "802a94f8" : "bhv_cannon_barrel_loop", - "802a958c" : "func_802A8D18", - "802a9708" : "bhv_chuckya_anchor_mario_loop", - "802a973c" : "Unknown802A8EC8", - "802a98c4" : "func_802A9050", - "802a9994" : "ActionChuckya0", - "802a9d08" : "ActionChuckya1", - "802a9f54" : "ActionChuckya3", - "802a9fc8" : "ActionChuckya2", - "802aa02c" : "func_802A97B8", - "802aa0ac" : "bhv_chuckya_loop", - "802aa1b8" : "bhv_wf_breakable_wall_loop", - "802aa280" : "func_802A9A0C", - "802aa3c8" : "func_802A9B54", - "802aa3f4" : "bhv_kickable_board_loop", - "802aa700" : "bhv_tower_door_loop", - "802aa774" : "bhv_wf_rotating_wooden_platform_loop", - "802aa830" : "bhv_rotating_platform_loop", - "802aa948" : "func_802AA0D4", - "802aa97c" : "bhv_koopa_shell_underwater_loop", - "802aaa60" : "bhv_warp_loop", - "802aab54" : "BehFadingWarpLoop", - "802aac48" : "bhv_white_puff_exploding_loop", - "802aae8c" : "func_802AA618", - "802aaf48" : "bhv_spawned_star_init", - "802aaffc" : "func_802AA788", - "802ab060" : "func_802AA7EC", - "802ab158" : "func_802AA8E4", - "802ab18c" : "func_802AA918", - "802ab1c8" : "bhv_spawned_star_loop", - "802ab558" : "bhv_spawn_star_no_level_exit", - "802ab5c8" : "bhv_coin_sparkles_init", - "802ab650" : "bhv_yellow_coin_init", - "802ab70c" : "bhv_yellow_coin_loop", - "802ab748" : "bhv_temp_coin_loop", - "802ab7a4" : "bhv_coin_init", - "802ab860" : "bhv_coin_loop", - "802aba40" : "bhv_coin_formation_spawn_loop", - "802abc04" : "func_802AB364", - "802abee4" : "bhv_coin_formation_init", - "802abf0c" : "bhv_coin_formation_loop", - "802ac068" : "ActionCoinInsideBoo1", - "802ac15c" : "ActionCoinInsideBoo0", - "802ac294" : "bhv_coin_inside_boo_loop", - "802ac2c0" : "bhv_coin_sparkles_loop", - "802ac2ec" : "bhv_golden_coin_sparkles_loop", - "802ac3a8" : "bhv_punch_tiny_triangle_loop", - "802ac4a0" : "bhv_punch_tiny_triangle_init", - "802ac5b4" : "bhv_wall_tiny_star_particle_loop", - "802ac678" : "bhv_tiny_star_particles_init", - "802ac78c" : "bhv_pound_tiny_star_particle_loop", - "802ac864" : "bhv_pound_tiny_star_particle_init", - "802ac910" : "func_802AC070", - "802ac958" : "func_802AC0B8", - "802ac9d0" : "func_802AC130", - "802aca6c" : "func_802AC1CC", - "802acac8" : "bhv_door_loop", - "802acc3c" : "bhv_door_init", - "802ace80" : "bhv_star_door_loop_2", - "802ad078" : "ActionGrindelThwomp4", - "802ad10c" : "ActionGrindelThwomp2", - "802ad1a4" : "ActionGrindelThwomp3", - "802ad238" : "ActionGrindelThwomp1", - "802ad2d0" : "ActionGrindelThwomp0", - "802ad34c" : "bhv_grindel_thwomp_loop", - "802ad378" : "bhv_tumbling_bridge_platform_loop", - "802ad580" : "ActionTumblingBridge1", - "802ad76c" : "ActionTumblingBridge2", - "802ad7f4" : "ActionTumblingBridge3", - "802ad828" : "ActionTumblingBridge0", - "802ad890" : "bhv_tumbling_bridge_loop", - "802ad8bc" : "func_802AD01C", - "802ad8f0" : "ActionElevator0", - "802ada4c" : "ActionElevator1", - "802adb88" : "ActionElevator2", - "802adce4" : "ActionElevator4", - "802add70" : "ActionElevator3", - "802addf8" : "bhv_elevator_init", - "802adf6c" : "bhv_elevator_loop", - "802adf98" : "bhv_water_mist_spawn_loop", - "802adfd8" : "bhv_water_mist_loop", - "802ae0cc" : "spawn_triangle_break_particles", - "802ae238" : "bhv_water_mist_2_loop", - "802ae304" : "bhv_pound_white_puffs_init", - "802ae334" : "func_802ADA94", - "802ae360" : "bhv_unused_0e40_init", - "802ae394" : "Unknown802ADAF4", - "802ae45c" : "func_802ADBBC", - "802ae48c" : "bhv_ground_snow_init", - "802ae4c0" : "func_802ADC20", - "802ae534" : "bhv_wind_loop", - "802ae85c" : "bhv_unused_particle_spawn_loop", - "802ae908" : "bhv_ukiki_cage_star_loop", - "802aea6c" : "ukiki_cage_act_wait_for_ukiki", - "802aeab8" : "ukiki_cage_act_spin", - "802aeb1c" : "ukiki_cage_act_fall", - "802aeb74" : "ukiki_cage_act_hide", - "802aeb9c" : "bhv_ukiki_cage_loop", - "802aebc8" : "bhv_squishable_platform_loop", - "802aec40" : "bhv_bitfs_sinking_platform_loop", - "802aeca8" : "bhv_ddd_moving_pole_loop", - "802aecdc" : "bhv_bitfs_sinking_cage_platform_loop", - "802aedc0" : "bhv_beta_moving_flames_spawn_loop", - "802aeea4" : "bhv_beta_moving_flames_loop", - "802aef1c" : "bhv_flamethrower_flame_loop", - "802af1e8" : "bhv_flamethrower_loop", - "802af3fc" : "bhv_rr_rotating_bridge_platform_loop", - "802af448" : "bhv_bouncing_fireball_flame_loop", - "802af5f8" : "bhv_bouncing_fireball_loop", - "802af7c4" : "bhv_bowser_shock_wave_loop", - "802af9cc" : "bhv_black_smoke_upward_loop", - "802afa0c" : "bhv_black_smoke_bowser_loop", - "802afae4" : "bhv_black_smoke_mario_loop", - "802afbf8" : "bhv_flame_mario_loop", - "802afce4" : "bhv_beta_fish_splash_spawner_loop", - "802afd1c" : "bhv_spindrift_loop", - "802afee8" : "bhv_wf_solid_tower_platform_loop", - "802aff30" : "bhv_wf_elevator_tower_platform_loop", - "802b00e4" : "bhv_wf_sliding_tower_platform_loop", - "802b0244" : "func_802AF9A4", - "802b039c" : "func_802AFAFC", - "802b04b4" : "bhv_tower_platform_group_loop", - "802b0614" : "bhv_tree_snow_or_leaf_loop", - "802b0974" : "bhv_snow_leaf_particle_spawn_init", - "802b0b9c" : "func_802B02FC", - "802b0bec" : "bhv_squarish_path_moving_loop", - "802b0d48" : "bhv_piranha_plant_waking_bubbles_loop", - "802b0df0" : "bhv_piranha_plant_bubble_loop", - "802b1278" : "bhv_purple_switch_loop", - "802b14f4" : "func_802B0C54", - "802b15e8" : "bhv_pushable_loop", - "802b1714" : "func_802B0E74", - "802b17f4" : "func_802B0F54", - "802b19d8" : "func_802B1138", - "802b1ae0" : "bhv_hidden_object_loop", - "802b1b2c" : "bhv_breakable_box_loop", - "802b1bb0" : "Geo18_802B1BB0", - "802b1c54" : "bhv_heave_ho_throw_mario_loop", - "802b1d7c" : "ActionHeaveHo1", - "802b1e6c" : "ActionHeaveHo2", - "802b1ff4" : "ActionHeaveHo3", - "802b20a0" : "ActionHeaveHo0", - "802b2154" : "func_802B18B4", - "802b2278" : "bhv_heave_ho_loop", - "802b2340" : "bhv_ccm_touched_star_spawn_loop", - "802b23e0" : "bhv_unused_poundable_platform", - "802b2494" : "bhv_beta_trampoline_spring_loop", - "802b25ac" : "bhv_beta_trampoline_top_loop", - "802b26a4" : "ActionJumpingBox0", - "802b27d8" : "ActionJumpingBox1", - "802b2824" : "func_802B1F84", - "802b288c" : "bhv_jumping_box_loop", - "802b29b8" : "bhv_boo_cage_loop", - "802b2bc8" : "func_802B2328", - "802b2d10" : "bhv_alpha_boo_key_loop", - "802b3108" : "bhv_beta_boo_key_loop", - "802b3134" : "func_802B2894", - "802b3250" : "func_802B29B0", - "802b329c" : "bhv_grand_star_loop", - "802b3600" : "bhv_bowser_key_loop", - "802b37b8" : "bhv_white_puff_smoke_init", - "802b3810" : "bhv_bullet_bill_init", - "802b3830" : "ActionBulletBill0", - "802b38b8" : "ActionBulletBill1", - "802b394c" : "ActionBulletBill2", - "802b3b08" : "ActionBulletBill3", - "802b3b24" : "ActionBulletBill4", - "802b3be0" : "bhv_bullet_bill_loop", - "802b3c2c" : "ActionBowserTailAnchor0", - "802b3cdc" : "ActionBowserTailAnchor1", - "802b3d10" : "ActionBowserTailAnchor2", - "802b3d74" : "bhv_bowser_tail_anchor_loop", - "802b3df4" : "bhv_bowser_flame_spawn_loop", - "802b4080" : "bhv_bowser_body_anchor_loop", - "802b4184" : "func_802B38B4", - "802b41fc" : "func_802B392C", - "802b4288" : "func_802B39B8", - "802b4300" : "func_802B3A30", - "802b4368" : "func_802B3A98", - "802b43dc" : "func_802B3B0C", - "802b4478" : "ActionBowser5", - "802b44bc" : "ActionBowser6", - "802b45f4" : "func_802B3D24", - "802b473c" : "func_802B3E44", - "802b48d4" : "func_802B3FDC", - "802b4a1c" : "func_802B4124", - "802b4a3c" : "func_802B4144", - "802b4af4" : "func_u_802B4AF4", - "802b4bac" : "ActionBowser18", - "802b4be8" : "ActionBowser0", - "802b4ca4" : "ActionBowser15", - "802b4d14" : "ActionBowser14", - "802b4f00" : "ActionBowser16", - "802b5104" : "ActionBowser8", - "802b5218" : "ActionBowser12", - "802b53f4" : "func_802B4A44", - "802b5444" : "func_802B4A94", - "802b5554" : "func_802B4BA4", - "802b55cc" : "ActionBowser13", - "802b5798" : "ActionBowser17", - "802b58bc" : "ActionBowser10", - "802b59cc" : "ActionBowser9", - "802b5aec" : "func_802B5108", - "802b5c00" : "ActionBowser11", - "802b5c40" : "ActionBowser7", - "802b5f6c" : "func_802B5588", - "802b5fec" : "ActionBowser1", - "802b611c" : "func_802B5738", - "802b6190" : "ActionBowser2", - "802b6568" : "ActionBowser3", - "802b65d0" : "func_802B5C78", - "802b6670" : "func_802B5D18", - "802b6730" : "func_802B5DD8", - "802b67d4" : "func_802B5E7C", - "802b6878" : "func_802B5F20", - "802b6a10" : "func_802B60B8", - "802b6a78" : "func_802B6120", - "802b6bac" : "func_802B6254", - "802b6cf0" : "ActionBowser4", - "802b6e40" : "func_802B64E8", - "802b6ee0" : "ActionBowser19", - "802b711c" : "func_802B67C4", - "802b71e4" : "func_802B688C", - "802b72d4" : "func_802B697C", - "802b7418" : "func_802B6AC0", - "802b75a4" : "bhv_bowser_loop", - "802b7878" : "bhv_bowser_init", - "802b798c" : "Geo18_802B798C", - "802b7a20" : "func_802B70C8", - "802b7c64" : "geo_switch_bowser_eyes", - "802b7d44" : "Geo18_802B7D44", - "802b7e68" : "ActionFallingBowserPlatform0", - "802b7ef0" : "ActionFallingBowserPlatform1", - "802b8024" : "ActionFallingBowserPlatform2", - "802b8384" : "bhv_falling_bowser_platform_loop", - "802b83b0" : "func_802B7A58", - "802b8434" : "func_802B7ADC", - "802b84ac" : "bhv_flame_bowser_init", - "802b85b0" : "bhv_flame_large_burning_out_init", - "802b8654" : "func_802B7CFC", - "802b8734" : "bhv_flame_bowser_loop", - "802b8960" : "bhv_flame_moving_forward_growing_init", - "802b89ec" : "bhv_flame_moving_forward_growing_loop", - "802b8b1c" : "bhv_flame_floating_landing_init", - "802b8c38" : "bhv_flame_floating_landing_loop", - "802b8d68" : "bhv_blue_bowser_flame_init", - "802b8e7c" : "bhv_blue_bowser_flame_loop", - "802b9034" : "bhv_flame_bouncing_init", - "802b90ec" : "bhv_flame_bouncing_loop", - "802b921c" : "bhv_blue_flames_group_loop", - "802b935c" : "bhv_blue_fish_loop", - "802b9790" : "bhv_tank_fish_group_loop", - "802b98d4" : "func_802B8F7C", - "802b98fc" : "bhv_checkerboard_elevator_group_init", - "802b9a78" : "func_802B9120", - "802b9af8" : "func_802B91A0", - "802b9bb4" : "bhv_checkerboard_platform_init", - "802b9bd8" : "bhv_checkerboard_platform_loop", - "802b9e94" : "bhv_ddd_warp_loop", - "802b9efc" : "func_802B95A4", - "802ba13c" : "func_802B97E4", - "802ba19c" : "bhv_water_level_pillar_init", - "802ba1e0" : "bhv_water_level_pillar_loop", - "802ba25c" : "bhv_invisible_objects_under_bridge_init", - "802ba2b0" : "Geo18_802BA2B0", - "802ba2f8" : "bhv_bowser_key_unlock_door_loop", - "802ba458" : "bhv_bowser_key_course_exit_loop", - "802ba5bc" : "bhv_moat_grills_loop", - "802ba608" : "bhv_rotating_clock_arm_loop", - "802ba7e0" : "handle_hat_ukiki_reset", - "802ba868" : "is_hat_ukiki_and_mario_has_hat", - "802ba8c4" : "unused_Geo18_8029D890", - "802ba958" : "idle_ukiki_taunt", - "802bab7c" : "ukiki_act_idle", - "802bae40" : "ukiki_act_return_home", - "802baec4" : "ukiki_act_wait_to_respawn", - "802baf10" : "ukiki_act_unused_turn", - "802baf64" : "ukiki_act_turn_to_mario", - "802bb07c" : "ukiki_act_run", - "802bb288" : "ukiki_act_jump", - "802bb3b8" : "ukiki_act_go_to_cage", - "802bb798" : "ukiki_free_loop", - "802bb888" : "cage_ukiki_held_loop", - "802bba3c" : "hat_ukiki_held_loop", - "802bbb98" : "bhv_ukiki_init", - "802bbc0c" : "bhv_ukiki_loop", - "802bbd6c" : "func_802BB414", - "802bbfd8" : "func_802BB680", - "802bc0f0" : "bhv_lll_moving_octagonal_mesh_platform_loop", - "802bc22c" : "bhv_lll_sinking_rock_block_loop", - "802bc294" : "bhv_lll_rotating_hex_flame_loop", - "802bc348" : "func_802BB9F0", - "802bc4f4" : "ActionRotatingCwFireBars0", - "802bc538" : "ActionRotatingCwFireBars1", - "802bc590" : "ActionRotatingCwFireBars2", - "802bc5fc" : "ActionRotatingCwFireBars3", - "802bc618" : "bhv_lll_rotating_block_fire_bars_loop", - "802bc660" : "bhv_lll_wood_piece_loop", - "802bc728" : "bhv_lll_floating_wood_bridge_loop", - "802bc898" : "bhv_volcano_flames_loop", - "802bc934" : "func_802BBFDC", - "802bca74" : "bhv_lll_rotating_hexagonal_ring_loop", - "802bcce8" : "func_802BC390", - "802bcda8" : "bhv_lll_sinking_rectangular_platform_loop", - "802bce58" : "bhv_lll_sinking_square_platforms_loop", - "802bce9c" : "create_transform_from_normals", - "802bcf40" : "bhv_platform_normals_init", - "802bcfc4" : "approach_by_increment", - "802bd058" : "bhv_tilting_inverted_pyramid_loop", - "802bd3e4" : "func_802BCA8C", - "802bd488" : "bhv_koopa_shell_flame_loop", - "802bd5dc" : "bhv_koopa_shell_flame_spawn", - "802bd62c" : "func_802BCCD4", - "802bd680" : "bhv_koopa_shell_loop", - "802bd8d0" : "func_802BCF78", - "802bd91c" : "func_802BCFC4", - "802bdb04" : "ActionToxBox4", - "802bdb3c" : "ActionToxBox5", - "802bdb74" : "ActionToxBox6", - "802bdbac" : "ActionToxBox7", - "802bdbe4" : "ActionToxBox1", - "802bdc7c" : "ActionToxBox2", - "802bdcc8" : "ActionToxBox3", - "802bdd14" : "ActionToxBox0", - "802bdd68" : "bhv_tox_box_loop", - "802bdd9c" : "piranha_plant_act_idle", - "802bde10" : "piranha_plant_check_interactions", - "802bdeec" : "piranha_plant_act_sleeping", - "802be034" : "piranha_plant_act_woken_up", - "802be0b8" : "piranha_plant_reset_when_far", - "802be0ec" : "piranha_plant_attacked", - "802be150" : "piranha_plant_act_shrink_and_die", - "802be234" : "piranha_plant_act_wait_to_respawn", - "802be278" : "piranha_plant_act_respawn", - "802be350" : "piranha_plant_act_biting", - "802be49c" : "mario_moving_fast_enough_to_make_piranha_plant_bite", - "802be50c" : "piranha_plant_act_stopped_biting", - "802be5a0" : "bhv_piranha_plant_loop", - "802be628" : "bhv_lll_bowser_puzzle_spawn_piece", - "802be6d4" : "bhv_lll_bowser_puzzle_spawn_pieces", - "802be79c" : "bhv_lll_bowser_puzzle_loop", - "802be8a8" : "bhv_lll_bowser_puzzle_piece_action_0", - "802be8b8" : "bhv_lll_bowser_puzzle_piece_action_1", - "802be8f4" : "bhv_lll_bowser_puzzle_piece_update", - "802be9dc" : "bhv_lll_bowser_puzzle_piece_move", - "802beb14" : "bhv_lll_bowser_puzzle_piece_idle", - "802beb54" : "bhv_lll_bowser_puzzle_piece_move_left", - "802beb8c" : "bhv_lll_bowser_puzzle_piece_move_right", - "802bebc4" : "bhv_lll_bowser_puzzle_piece_move_up", - "802bebfc" : "bhv_lll_bowser_puzzle_piece_move_down", - "802bec34" : "bhv_lll_bowser_puzzle_piece_loop", - "802becb0" : "func_802BE2E8", - "802bed7c" : "play_penguin_walking_sound", - "802bedec" : "ActionTuxiesMother2", - "802bef8c" : "ActionTuxiesMother1", - "802bf1d8" : "ActionTuxiesMother0", - "802bf3c0" : "bhv_tuxies_mother_loop", - "802bf424" : "func_802BEA58", - "802bf474" : "ActionSmallPenguin2", - "802bf57c" : "ActionSmallPenguin1", - "802bf648" : "ActionSmallPenguin3", - "802bf6e4" : "ActionSmallPenguin4", - "802bf760" : "ActionSmallPenguin0", - "802bf90c" : "ActionSmallPenguin5", - "802bfa14" : "func_802BF048", - "802bfa88" : "bhv_small_penguin_loop", - "802bfbac" : "geo_switch_tuxie_mother_eyes", - "802bfcd8" : "ActionFish0", - "802bfeb8" : "ActionFish1", - "802bff20" : "ActionFish2", - "802bff3c" : "bhv_fish_loop", - "802bff68" : "func_802BF59C", - "802c00b4" : "ActionFishGroup1", - "802c0348" : "ActionFishGroup2", - "802c06a8" : "ActionFishGroup0", - "802c0768" : "bhv_fish_group_2_loop", - "802c08a8" : "bhv_wdw_express_elevator_loop", - "802c0aac" : "ActionBirdChirpChirp0", - "802c0b50" : "ActionBirdChirpChirp1", - "802c0ba4" : "ActionBirdChirpChirp2", - "802c0bc4" : "ActionBirdChirpChirp3", - "802c0be0" : "bhv_bird_chirp_chirp_loop", - "802c0c0c" : "func_802C0240", - "802c0cd4" : "ActionCheepCheep0", - "802c0d44" : "ActionCheepCheep1", - "802c0f90" : "ActionCheepCheep2", - "802c1204" : "bhv_cheep_cheep_loop", - "802c12c0" : "bhv_rotatin_exclamation_box_loop", - "802c1308" : "ActionExclamationBox0", - "802c13ec" : "ActionExclamationBox1", - "802c14b0" : "ActionExclamationBox2", - "802c15b8" : "ActionExclamationBox3", - "802c17bc" : "func_802C0DF0", - "802c18d0" : "ActionExclamationBox4", - "802c1988" : "ActionExclamationBox5", - "802c19c0" : "bhv_exclamation_box_loop", - "802c19fc" : "bhv_sound_spawner_init", - "802c1a40" : "bhv_bowsers_sub_loop", - "802c1a80" : "bhv_sushi_shark_collision_loop", - "802c1a90" : "bhv_sushi_shark_loop", - "802c1c44" : "bhv_sunken_ship_part_loop", - "802c1cd4" : "bhv_ship_part_3_loop", - "802c1e10" : "bhv_jrb_sliding_box_loop", - "802c2190" : "bhv_white_puff_1_loop", - "802c2274" : "bhv_white_puff_2_loop", - "802c22b8" : "bhv_hidden_blue_coin_loop", - "802c242c" : "bhv_blue_coin_switch_loop", - "802c263c" : "bhv_openable_cage_door_loop", - "802c26f8" : "bhv_openable_grill_loop", - "802c2930" : "bhv_init_changing_water_level_loop", - "802c2a24" : "bhv_water_level_diamond_loop", - "802c2ce8" : "tweester_scale_and_move", - "802c2ebc" : "tweester_act_idle", - "802c2fbc" : "tweester_act_chase", - "802c31c4" : "tweester_act_hide", - "802c329c" : "bhv_tweester_loop", - "802c32e8" : "bhv_tweester_sand_particle_loop", - "802c3440" : "bhv_boo_init", - "802c3684" : "bhv_courtyard_boo_triplet_init", - "802c4824" : "bhv_boo_loop", - "802c4f30" : "bhv_big_boo_loop", - "802c515c" : "bhv_boo_with_cage_init", - "802c51d4" : "bhv_boo_with_cage_loop", - "802c5224" : "bhv_merry_go_round_boo_manager_loop", - "802c53cc" : "obj_set_secondary_camera_focus", - "802c53ec" : "bhv_animated_texture_loop", - "802c5414" : "bhv_boo_in_castle_loop", - "802c5688" : "bhv_boo_boss_spawned_bridge_loop", - "802c5890" : "bhv_bbh_tilting_trap_platform_loop", - "802c5a38" : "bhv_haunted_bookshelf_loop", - "802c5ca8" : "bhv_merry_go_round_loop", - "802c5dc0" : "bhv_static_checkered_platform_loop", - "802c5f48" : "bhv_beta_bowser_anchor_loop", - "802c5fdc" : "bhv_play_music_track_when_touched_loop", - "802c6050" : "bhv_floor_trap_in_castle_loop", - "802c60ac" : "bhv_castle_floor_trap_init", - "802c6150" : "bhv_castle_floor_trap_open_detect", - "802c61d4" : "bhv_castle_floor_trap_open", - "802c6278" : "bhv_castle_floor_trap_close_detect", - "802c62bc" : "bhv_castle_floor_trap_close", - "802c6328" : "bhv_castle_floor_trap_rotate", - "802c6348" : "bhv_castle_floor_trap_loop", - "802c63e8" : "BehClimbDetectLoop", - "802c64a4" : "bhv_sparkle_spawn_loop", - "802c6538" : "func_802C5A64", - "802c65c0" : "bhv_scuttlebug_loop", - "802c6b6c" : "bhv_scuttlebug_spawn_loop", - "802c6ca0" : "func_802C61CC", - "802c6d6c" : "ActionWhomp0", - "802c6ec8" : "ActionWhomp7", - "802c6fb0" : "ActionWhomp1", - "802c710c" : "ActionWhomp2", - "802c7254" : "ActionWhomp3", - "802c72b4" : "ActionWhomp4", - "802c7380" : "ActionWhomp5", - "802c7428" : "func_802C6954", - "802c75fc" : "func_802C6B28", - "802c76d4" : "ActionWhomp6", - "802c7858" : "ActionWhomp8", - "802c7998" : "ActionWhomp9", - "802c79d8" : "bhv_whomp_loop", - "802c7a70" : "bhv_water_splash_loop", - "802c7b14" : "bhv_water_drops_loop", - "802c7cac" : "bhv_surface_waves_loop", - "802c7d40" : "bhv_water_surface_white_wave_init", - "802c7d90" : "bhv_object_bubble_ripples_init", - "802c7dfc" : "bhv_surface_wave_shrinking_init", - "802c7e5c" : "bhv_wave_trail_loop", - "802c7f98" : "bhv_white_wind_particle_loop", - "802c81b4" : "func_802C76E0", - "802c834c" : "bhv_snowman_wind_blowing_loop", - "802c85a4" : "func_802C7AD0", - "802c863c" : "bhv_walking_penguin_loop", - "802c89f0" : "update_mario_platform", - "802c8b4c" : "get_mario_pos", - "802c8b8c" : "set_mario_pos", - "802c8bc8" : "apply_platform_displacement", - "802c8ec0" : "apply_mario_platform_displacement", - "802c8f28" : "clear_mario_platform", - "802c8f40" : "Unknown802C8460", - "802c8fe4" : "func_802C8504", - "802c91ec" : "func_802C870C", - "802c9388" : "func_802C88A8", - "802c93f8" : "func_802C8918", - "802c94ac" : "func_802C89CC", - "802c95b4" : "func_802C8AD4", - "802c9630" : "func_802C8B50", - "802c9724" : "detect_object_collisions", - "802c97d0" : "unused_init_free_list", - "802c9840" : "unused_try_allocate", - "802c98a4" : "try_allocate_object", - "802c9950" : "unused_deallocate", - "802c99b8" : "init_free_object_list", - "802c9a3c" : "clear_object_lists", - "802c9b68" : "unload_object", - "802c9c00" : "allocate_object", - "802c9f04" : "create_object", - "802ca028" : "mark_obj_for_deletion", - "802ca040" : "exec_anim_sound_state", - "802ca144" : "create_sound_spawner", - "802ca190" : "PlaySound", - "802ca1e0" : "PlaySound2", - "802ca230" : "calc_dist_to_volume_range_1", - "802ca2d4" : "calc_dist_to_volume_range_2", - "802ca370" : "Stub802C9890", - "802ca380" : "Stub802C98A0", - "802ca390" : "Stub802C98B0", - "802ca3a0" : "Stub802C98C0", - "802ca3b0" : "get_current_clock", - "802ca3e0" : "get_clock_difference", - "802ca418" : "set_print_state_info", - "802ca460" : "print_text_array_info", - "802ca51c" : "set_text_array_x_y", - "802ca568" : "print_debug_bottom_up", - "802ca5b8" : "print_debug_top_down_objectinfo", - "802ca618" : "print_debug_top_down_mapinfo", - "802ca680" : "print_debug_top_down_normal", - "802ca6d0" : "print_mapinfo", - "802ca8e8" : "print_checkinfo", - "802ca918" : "print_surfaceinfo", - "802ca94c" : "print_stageinfo", - "802ca990" : "print_string_array_info", - "802caa6c" : "print_effectinfo", - "802caaa8" : "print_enemyinfo", - "802caae4" : "update_debug_dpadmask", - "802cabac" : "debug_unknown_level_select_check", - "802cac20" : "reset_debug_objectinfo", - "802cb0b0" : "stub_802CA5D0", - "802cb0c0" : "try_print_debug_mario_object_info", - "802cb1c0" : "try_print_debug_mario_level_info", - "802cb264" : "try_do_mario_debug_object_spawn", - "802cb564" : "Unknown802CAA84", - "802cb5c0" : "set_and_reset_transition_fade_timer", - "802cb640" : "set_transition_color_fade_alpha", - "802cb894" : "vertex_transition_color", - "802cba18" : "dl_transition_color", - "802cbbc4" : "render_fade_transition_from_color", - "802cbc20" : "render_fade_transition_into_color", - "802cbc7c" : "calc_tex_transition_radius", - "802cbd54" : "calc_tex_transition_time", - "802cbe64" : "convert_tex_transition_angle_to_pos", - "802cbee0" : "center_tex_transition_x", - "802cbf64" : "center_tex_transition_y", - "802cbfe8" : "make_tex_transition_vertex", - "802cc180" : "load_tex_transition_vertex", - "802cc4d8" : "render_textured_transition", - "802ccbe8" : "render_screen_transition", - "802ccdc8" : "render_cannon_circle_base", - "802cd1e8" : "geo_cannon_circle_base", - "802cd280" : "rotate_rectangle", - "802cd328" : "atan2_deg", - "802cd388" : "scale_shadow_with_distance", - "802cd444" : "disable_shadow_with_distance", - "802cd48c" : "dim_shadow_with_distance", - "802cd614" : "get_water_level_below_shadow", - "802cd6c4" : "init_shadow", - "802cd938" : "get_texture_coords_9_vertices", - "802cd988" : "get_texture_coords_4_vertices", - "802cd9ec" : "make_shadow_vertex_at_xyz", - "802cdb20" : "extrapolate_vertex_y_position", - "802cdb74" : "get_vertex_coords", - "802cdc40" : "calculate_vertex_xyz", - "802cde94" : "floor_local_tilt", - "802cdf3c" : "make_shadow_vertex", - "802ce128" : "add_shadow_to_display_list", - "802ce2bc" : "linearly_interpolate_solidity_positive", - "802ce3ec" : "linearly_interpolate_solidity_negative", - "802ce524" : "correct_shadow_solidity_for_animations", - "802ce690" : "correct_lava_shadow_height", - "802ce79c" : "create_shadow_player", - "802ce9d0" : "create_shadow_circle_9_verts", - "802ceae8" : "create_shadow_circle_4_verts", - "802cec04" : "create_shadow_circle_assuming_flat_ground", - "802cedc0" : "create_shadow_rectangle", - "802cef6c" : "get_shadow_height_solidity", - "802cf080" : "create_shadow_square", - "802cf1f0" : "create_shadow_hardcoded_rectangle", - "802cf34c" : "create_shadow_below_xyz", - "802cf5b0" : "calculate_skybox_scaled_x", - "802cf69c" : "calculate_skybox_scaled_y", - "802cf804" : "make_skybox_rect", - "802cfa2c" : "draw_skybox_tile_grid", - "802cfc68" : "create_skybox_ortho_matrix", - "802cfd88" : "init_skybox_display_list", - "802cfef4" : "create_skybox_facing_camera", - "802d0080" : "geo_wdw_set_initial_water_level", - "802d01e0" : "geo_movtex_pause_control", - "802d0254" : "movtex_make_quad_vertex", - "802d0484" : "movtex_gen_from_quad", - "802d0a84" : "movtex_gen_from_quad_array", - "802d0bb0" : "movtex_gen_quads_id", - "802d0c84" : "get_quad_collection_from_id", - "802d0f28" : "movtex_change_texture_format", - "802d104c" : "geo_movtex_draw_water_regions", - "802d1330" : "update_moving_texture_offset", - "802d13cc" : "movtex_write_vertex_first", - "802d1574" : "movtex_write_vertex_index", - "802d18b4" : "movtex_gen_list", - "802d1b70" : "geo_movtex_draw_nocolor", - "802d1cdc" : "geo_movtex_draw_colored", - "802d1e48" : "geo_movtex_draw_colored_no_update", - "802d1fa8" : "geo_movtex_draw_colored_2_no_update", - "802d2108" : "geo_movtex_update_horizontal", - "802d2210" : "make_vertex", - "802d22c4" : "round_float", - "802d2360" : "geo_exec_inside_castle_light", - "802d2470" : "geo_exec_flying_carpet_timer_update", - "802d2520" : "geo_exec_flying_carpet_create", - "802d28cc" : "geo_exec_cake_end_screen", - "802d29c0" : "stopAllRippleExcept", - "802d2a74" : "find_mario_y_position_on_painting", - "802d2b08" : "find_mario_z_position_on_painting", - "802d2b84" : "painting_find_vertical_ripple_location", - "802d2c40" : "find_part_of_painting_near_mario", - "802d2d80" : "find_mario_x_position_on_painting", - "802d2dfc" : "painting_find_horizontal_ripple_location", - "802d2eb8" : "painting_set_ripple_type", - "802d2ffc" : "vertical_proximity_ripple_painting_ripple", - "802d319c" : "vertical_proximity_ripple_painting_ripple_if_mario_enters", - "802d327c" : "vertical_continuous_ripple_painting_ripple", - "802d341c" : "vertical_continuous_ripple_painting_ripple_if_mario_enters", - "802d34fc" : "horizontal_proximity_ripple_painting_ripple", - "802d36ac" : "horizontal_proximity_ripple_painting_ripple_if_mario_enters", - "802d379c" : "horizontal_continuous_ripple_painting_ripple", - "802d393c" : "horizontal_continuous_ripple_painting_ripple_if_mario_enters", - "802d3a2c" : "painting_update_floors", - "802d3bec" : "painting_update_ripple_status", - "802d3cec" : "painting_calculate_point_ripple", - "802d3e6c" : "painting_conditionally_calculate_point_ripple", - "802d3ee4" : "Print1", - "802d404c" : "Print2", - "802d43f8" : "small_float_to_byte", - "802d44bc" : "func_802D39DC", - "802d47d0" : "func_802D3CF0", - "802d4edc" : "func_802D43FC", - "802d50dc" : "func_802D45FC", - "802d5354" : "func_802D4874", - "802d556c" : "display_painting_rippling", - "802d568c" : "display_painting_not_rippling", - "802d5778" : "reset_painting", - "802d57a8" : "update_ddd_painting", - "802d58e4" : "func_802D4E04", - "802d593c" : "display_painting", - "802d59a8" : "vertical_painting_ripple", - "802d5aa0" : "horizontal_painting_ripple", - "802d5b98" : "Geo18_802D5B98", - "802d5d0c" : "Geo18_802D5D0C", - "802d5e00" : "int_pow", - "802d5e54" : "format_integer", - "802d6144" : "parse_width_field", - "802d62d8" : "print_text_fmt_int", - "802d6554" : "print_text", - "802d66c0" : "print_text_centered", - "802d6858" : "char_to_glyph_index", - "802d69f8" : "add_glyph_texture", - "802d6acc" : "clip_to_bounds", - "802d6b3c" : "render_textrect", - "802d6c88" : "render_text_labels", - "802d6f20" : "create_dl_identity_matrix", - "802d7070" : "create_dl_translation_matrix", - "802d7174" : "create_dl_rotation_matrix", - "802d7280" : "create_dl_scale_matrix", - "802d7384" : "create_dl_ortho_matrix", - "802d75dc" : "render_generic_char", - "802d76c8" : "render_multi_text_string", - "802d77dc" : "print_generic_string", - "802d7b84" : "print_hud_lut_string", - "802d7e88" : "print_menu_generic_string", - "802d82d4" : "print_credits_string", - "802d862c" : "handle_menu_scrolling", - "802d8844" : "get_str_x_pos_from_center", - "802d8934" : "get_string_width", - "802d89b8" : "print_hud_my_score_coins", - "802d8a80" : "print_hud_my_score_stars", - "802d8b34" : "int_to_str", - "802d8c6c" : "get_dialog_id", - "802d8c88" : "create_dialog_box", - "802d8cc4" : "create_dialog_box_with_var", - "802d8d08" : "create_dialog_inverted_box", - "802d8d48" : "create_dialog_box_with_response", - "802d8d90" : "reset_dialog_render_state", - "802d8e2c" : "render_dialog_box_type", - "802d9148" : "change_and_flash_dialog_text_color_lines", - "802d9388" : "handle_dialog_scroll_page_state", - "802d944c" : "render_star_count_dialog_text", - "802d9634" : "render_multi_text_string_lines", - "802d9800" : "ensure_nonnegative", - "802d982c" : "handle_dialog_text_and_pages", - "802d9cb0" : "render_dialog_triangle_choice", - "802d9dfc" : "render_dialog_string_color", - "802d9f84" : "handle_special_dialog_text", - "802da1ac" : "render_dialog_entries", - "802da810" : "set_menu_mode", - "802da844" : "reset_cutscene_msg_fade", - "802da85c" : "dl_rgba16_begin_cutscene_msg_fade", - "802da8e4" : "dl_rgba16_stop_cutscene_msg_fade", - "802da964" : "ascii_to_credits_char", - "802daa34" : "print_credits_str_ascii", - "802daae4" : "set_cutscene_message", - "802dab58" : "do_cutscene_handler", - "802dad54" : "print_peach_letter_message", - "802db08c" : "render_hud_cannon_reticle", - "802db350" : "reset_red_coins_collected", - "802db368" : "change_dialog_camera_angle", - "802db3b8" : "shade_screen", - "802db498" : "print_animated_red_coin", - "802db6e8" : "render_pause_red_coins", - "802db760" : "render_pause_my_score_coins", - "802dbb24" : "render_pause_camera_options", - "802dbe68" : "render_pause_course_options", - "802dc15c" : "render_pause_castle_menu_box", - "802dc418" : "highlight_last_course_complete_stars", - "802dc478" : "print_hud_pause_colorful_str", - "802dc570" : "render_pause_castle_course_stars", - "802dc718" : "render_pause_castle_main_strings", - "802dca88" : "render_pause_courses_and_castle", - "802dcd04" : "print_hud_course_complete_string", - "802dcf30" : "print_hud_course_complete_coins", - "802dd194" : "play_star_fanfare_and_flash_hud", - "802dd210" : "render_course_complete_lvl_info_and_hud_str", - "802dd838" : "render_save_confirmation", - "802ddae0" : "render_course_complete_screen", - "802ddca4" : "render_menus_and_dialogs", - "802dddf0" : "envfx_init_snow", - "802ddf38" : "envfx_update_snowflake_count", - "802de0bc" : "envfx_cleanup_snow", - "802de114" : "orbit_from_positions", - "802de23c" : "pos_from_orbit", - "802de360" : "envfx_is_snowflake_alive", - "802de458" : "envfx_update_snow_normal", - "802de888" : "envfx_update_snow_blizzard", - "802ded38" : "envfx_update_snow_water", - "802def2c" : "rotate_triangle_vertices", - "802df334" : "append_snowflake_vertex_buffer", - "802df748" : "envfx_update_snow", - "802dfbc8" : "envfx_update_particles", - "802dfd50" : "particle_is_laterally_close", - "802dfe00" : "random_flower_offset", - "802dfe80" : "envfx_update_flower", - "802e0120" : "envfx_set_lava_bubble_position", - "802e048c" : "envfx_update_lava", - "802e065c" : "envfx_rotate_around_whirlpool", - "802e08a8" : "envfx_is_whirlpool_bubble_alive", - "802e0934" : "envfx_update_whirlpool", - "802e0e24" : "envfx_is_jestream_bubble_alive", - "802e0eb8" : "envfx_update_jetstream", - "802e1238" : "envfx_init_bubble", - "802e1414" : "envfx_bubbles_update_switch", - "802e1618" : "append_bubble_vertex_buffer", - "802e1a20" : "envfx_set_bubble_texture", - "802e1bb8" : "envfx_update_bubble_particles", - "802e1ed8" : "envfx_set_max_bubble_particles", - "802e1f48" : "envfx_update_bubbles", - "802e20a0" : "convert_rotation", - "802e2134" : "spawn_macro_abs_yrot_2params", - "802e21dc" : "spawn_macro_abs_yrot_param1", - "802e2284" : "spawn_macro_abs_special", - "802e2414" : "spawn_macro_objects", - "802e2690" : "spawn_macro_objects_hardcoded", - "802e28ec" : "spawn_special_objects", - "802e2cf0" : "render_hud_tex_lut", - "802e2e58" : "render_hud_small_tex_lut", - "802e30b4" : "render_power_meter_health_segment", - "802e3214" : "render_dl_power_meter", - "802e33b8" : "animate_power_meter_emphasized", - "802e352c" : "handle_power_meter_actions", - "802e3654" : "render_hud_power_meter", - "802e3744" : "render_hud_mario_lives", - "802e37a8" : "render_hud_coins", - "802e380c" : "render_hud_stars", - "802e38e4" : "render_hud_keys", - "802e395c" : "render_hud_timer", - "802e3b1c" : "set_hud_camera_status", - "802e3b3c" : "render_hud_camera_status", - "802e3d2c" : "render_hud", - "802e3e50" : "set_yoshi_as_not_dead", - "802e3e68" : "geo_obj_transparency_something", - "802e3f68" : "absf_2", - "802e3fac" : "turn_obj_away_from_surface", - "802e405c" : "obj_find_wall", - "802e41a4" : "turn_obj_away_from_steep_floor", - "802e42e0" : "obj_orient_graph", - "802e43e4" : "calc_obj_friction", - "802e445c" : "calc_new_obj_vel_and_pos_y", - "802e4814" : "calc_new_obj_vel_and_pos_y_underwater", - "802e4cec" : "obj_update_pos_vel_xz", - "802e4d88" : "obj_splash", - "802e4e90" : "object_step", - "802e5114" : "object_step_without_floor_orient", - "802e5160" : "obj_move_xyz_using_fvel_and_yaw", - "802e5208" : "is_point_within_radius_of_mario", - "802e52b8" : "is_point_close_to_object", - "802e5360" : "set_object_visibility", - "802e53f4" : "obj_return_home_if_safe", - "802e54b0" : "obj_return_and_displace_home", - "802e55d0" : "obj_check_if_facing_toward_angle", - "802e569c" : "obj_find_wall_displacement", - "802e5760" : "obj_spawn_yellow_coins", - "802e5824" : "obj_flicker_and_disappear", - "802e58b4" : "current_mario_room_check", - "802e5948" : "trigger_obj_dialog_when_facing", - "802e5a80" : "obj_check_floor_death", - "802e5b18" : "obj_lava_death", - "802e5c6c" : "spawn_orange_number", - "802e5d04" : "debug_sequence_tracker", - "802e5de8" : "CoinStep", - "802e5e6c" : "MovingCoinFlickerLoop", - "802e5ea4" : "CoinCollected", - "802e5ee8" : "bhv_moving_yellow_coin_init", - "802e5f64" : "bhv_moving_yellow_coin_loop", - "802e6098" : "bhv_moving_blue_coin_init", - "802e6114" : "bhv_moving_blue_coin_loop", - "802e62a4" : "bhv_blue_coin_sliding_jumping_init", - "802e631c" : "func_802E540C", - "802e63ec" : "func_802E54DC", - "802e6474" : "bhv_blue_coin_sliding_loop", - "802e6628" : "bhv_blue_coin_jumping_loop", - "802e6790" : "bhv_seaweed_init", - "802e67dc" : "bhv_seaweed_bundle_init", - "802e6a2c" : "bhv_bobomb_init", - "802e6a8c" : "func_802E5B7C", - "802e6af8" : "BobombExplodeLoop", - "802e6bd4" : "CheckBobombInteractions", - "802e6cf0" : "BobombPatrolLoop", - "802e6dc8" : "BobombChaseMarioLoop", - "802e6e84" : "BobombLaunchedLoop", - "802e6ed8" : "GenericBobombFreeLoop", - "802e7020" : "StationaryBobombFreeLoop", - "802e7134" : "BobombFreeLoop", - "802e7180" : "BobombHeldLoop", - "802e7220" : "BobombDroppedLoop", - "802e7280" : "BobombThrownLoop", - "802e7324" : "ObjRandomBlink", - "802e742c" : "bhv_bobomb_loop", - "802e75a0" : "bhv_bobomb_fuse_smoke_init", - "802e76ac" : "bhv_bobomb_buddy_init", - "802e770c" : "BobombBuddyIdleLoop", - "802e7814" : "BobombBuddyCannonLoop", - "802e79dc" : "BobombBuddyTalkLoop", - "802e7b00" : "BobombBuddyTurnToTalkLoop", - "802e7bb0" : "BobombBuddyActionLoop", - "802e7c4c" : "bhv_bobomb_buddy_loop", - "802e7c90" : "bhv_cannon_closed_init", - "802e7d4c" : "CannonTrapDoorOpeningLoop", - "802e7e54" : "bhv_cannon_closed_loop", - "802e7f70" : "bhv_whirlpool_init", - "802e7fb8" : "func_802E70A8", - "802e7fec" : "func_802E70DC", - "802e80dc" : "bhv_whirlpool_loop", - "802e82b0" : "bhv_jet_stream_loop", - "802e8388" : "bhv_homing_amp_init", - "802e89d4" : "bhv_homing_amp_loop", - "802e8ae4" : "bhv_circling_amp_init", - "802e8ecc" : "bhv_circling_amp_loop", - "802e8f68" : "bhv_butterfly_init", - "802e9018" : "ButterflyStep", - "802e9278" : "CalculateButterflyAngle", - "802e9470" : "ButterflyRestingLoop", - "802e94e4" : "ButterflyFollowMarioLoop", - "802e9548" : "ButterflyReturnHomeLoop", - "802e96c8" : "bhv_butterfly_loop", - "802e9764" : "bhv_hoot_init", - "802e97fc" : "HootFindNextFloor", - "802e98c0" : "HootFloorBounce", - "802e9a4c" : "HootFreeStep", - "802e9cf4" : "PlayerSetHootYaw", - "802e9d98" : "HootCarryStep", - "802e9f60" : "HootSurfaceCollision", - "802ea144" : "HootAscentLoop", - "802ea258" : "HootActionLoop", - "802ea3f0" : "HootTurnToHome", - "802ea4ec" : "HootAwakeLoop", - "802ea588" : "bhv_hoot_loop", - "802ea6a8" : "bhv_beta_holdable_object_init", - "802ea7e0" : "bhv_beta_holdable_object_loop", - "802ea888" : "bhv_object_bubble_init", - "802ea934" : "bhv_object_bubble_loop", - "802eaa10" : "bhv_object_water_wave_init", - "802eaa50" : "bhv_object_water_wave_loop", - "802eaa8c" : "bhv_explosion_init", - "802eaad0" : "bhv_explosion_loop", - "802eabf0" : "bhv_bobomb_bully_death_smoke_init", - "802eac3c" : "bhv_bobomb_explosion_bubble_init", - "802ead3c" : "bhv_bobomb_explosion_bubble_loop", - "802eaef8" : "bhv_respawner_loop", - "802eaf84" : "create_respawner", - "802eb05c" : "bhv_small_bully_init", - "802eb104" : "bhv_big_bully_init", - "802eb1c0" : "BullyCheckMarioCollision", - "802eb288" : "BullyChaseMarioLoop", - "802eb3f0" : "BullyKnockbackLoop", - "802eb510" : "BullyBackUpLoop", - "802eb5c4" : "BullyBackUpCheck", - "802eb630" : "PlayBullyStompingSound", - "802eb744" : "BullyStep", - "802eb7e0" : "BullySpawnCoin", - "802eb8b0" : "BullyLavaDeath", - "802eb9d0" : "bhv_bully_loop", - "802ebb74" : "BigBullySpawnMinion", - "802ebc00" : "bhv_big_bully_with_minions_init", - "802ebc88" : "BigBullyWithMinionsLavaDeath", - "802ebce0" : "bhv_big_bully_with_minions_loop", - "802ebf70" : "WaterRingCalcMarioDistInFront", - "802ec030" : "WaterRingInit", - "802ec1b0" : "bhv_jet_stream_water_ring_init", - "802ec200" : "CheckWaterRingCollection", - "802ec3d0" : "SetWaterRingScale", - "802ec4e0" : "WaterRingCollectedLoop", - "802ec59c" : "JetStreamWaterRingNotCollectedLoop", - "802ec75c" : "bhv_jet_stream_water_ring_loop", - "802ec7cc" : "Unknown802EB8A4", - "802ec818" : "JetStreamRingSpawnerActiveLoop", - "802ec908" : "bhv_jet_stream_ring_spawner_loop", - "802ec9b8" : "bhv_manta_ray_water_ring_init", - "802ec9f0" : "MantaRayWaterRingNotCollectedLoop", - "802ecba4" : "bhv_manta_ray_water_ring_loop", - "802ecc14" : "bhv_bowser_bomb_loop", - "802ecd0c" : "bhv_bowser_bomb_explosion_loop", - "802ecea0" : "bhv_bowser_bomb_smoke_loop", - "802ecfac" : "bhv_celebration_star_init", - "802ed10c" : "CelebrationStarSpinAroundMarioLoop", - "802ed28c" : "CelebrationStarFaceCameraLoop", - "802ed39c" : "bhv_celebration_star_loop", - "802ed40c" : "bhv_celebration_star_sparkle_loop", - "802ed45c" : "bhv_star_key_collection_puff_spawner_loop", - "802ed498" : "bhv_lll_drawbridge_spawner_loop", - "802ed62c" : "bhv_lll_drawbridge_loop", - "802ed78c" : "bhv_small_bomp_init", - "802ed7fc" : "bhv_small_bomp_loop", - "802edacc" : "bhv_large_bomp_init", - "802edb2c" : "bhv_large_bomp_loop", - "802eddfc" : "bhv_wf_sliding_platform_init", - "802edf28" : "bhv_wf_sliding_platform_loop", - "802ee124" : "bhv_moneybag_init", - "802ee1a0" : "MoneybagCheckMarioCollision", - "802ee268" : "MoneybagJump", - "802ee46c" : "MoneybagMoveAroundLoop", - "802ee598" : "MoneybagReturnHomeLoop", - "802ee728" : "MoneybagDisappearLoop", - "802ee778" : "MoneybagDeathLoop", - "802ee7e0" : "bhv_moneybag_loop", - "802ee8f4" : "bhv_moneybag_hidden_loop", - "802ee9cc" : "bhv_bowling_ball_init", - "802eea24" : "func_802EDA14", - "802eea7c" : "func_802EDA6C", - "802eeb64" : "bhv_bowling_ball_roll_loop", - "802eecb8" : "bhv_bowling_ball_initializeLoop", - "802eedf0" : "bhv_bowling_ball_loop", - "802eeeb4" : "bhv_generic_bowling_ball_spawner_init", - "802eef9c" : "bhv_generic_bowling_ball_spawner_loop", - "802ef0e8" : "bhv_thi_bowling_ball_spawner_loop", - "802ef21c" : "bhv_bob_pit_bowling_ball_init", - "802ef274" : "bhv_bob_pit_bowling_ball_loop", - "802ef34c" : "bhv_free_bowling_ball_init", - "802ef3f4" : "bhv_free_bowling_ball_roll_loop", - "802ef524" : "bhv_free_bowling_ball_loop", - "802ef63c" : "bhv_rr_cruiser_wing_init", - "802ef66c" : "bhv_rr_cruiser_wing_loop", - "802ef820" : "bhv_spindel_init", - "802ef858" : "bhv_spindel_loop", - "802efcd0" : "bhv_ssl_moving_pyramid_wall_init", - "802efd8c" : "bhv_ssl_moving_pyramid_wall_loop", - "802efe64" : "bhv_pyramid_elevator_init", - "802efef4" : "bhv_pyramid_elevator_loop", - "802f0104" : "bhv_pyramid_elevator_trajectory_marker_ball_loop", - "802f0168" : "bhv_pyramid_top_init", - "802f0288" : "bhv_pyramid_top_spinning", - "802f04a0" : "bhv_pyramid_top_explode", - "802f05b4" : "bhv_pyramid_top_loop", - "802f06a8" : "bhv_pyramid_top_fragment_init", - "802f0714" : "bhv_pyramid_top_fragment_loop", - "802f0788" : "bhv_pyramid_pillar_touch_detector_loop", - "802f07f4" : "bhv_waterfall_sound_loop", - "802f0820" : "bhv_volcano_sound_loop", - "802f084c" : "bhv_castle_flag_init", - "802f0898" : "bhv_birds_sound_loop", - "802f0950" : "bhv_ambient_sounds_init", - "802f09a4" : "bhv_sand_sound_loop", - "802f09f0" : "bhv_castle_cannon_grate_init", - "802f0a40" : "bhv_snowmans_bottom_init", - "802f0b7c" : "func_802EFB2C", - "802f0bd4" : "func_802EFB84", - "802f0c94" : "func_802EFC44", - "802f0df0" : "func_802EFDA0", - "802f0fa8" : "func_802EFF58", - "802f105c" : "bhv_snowmans_bottom_loop", - "802f120c" : "bhv_snowmans_head_init", - "802f1370" : "bhv_snowmans_head_loop", - "802f151c" : "bhv_snowmans_body_checkpoint_loop", - "802f15a8" : "bhv_big_boulder_init", - "802f162c" : "func_802F05DC", - "802f1714" : "bhv_big_boulder_loop", - "802f17f0" : "bhv_big_boulder_generator_loop", - "802f1954" : "func_802F0904", - "802f19c8" : "func_802F0978", - "802f1a10" : "func_802F09C0", - "802f1bb8" : "func_802F0B68", - "802f1d64" : "bhv_wing_cap_init", - "802f1dc0" : "func_802F0D70", - "802f1e5c" : "func_802F0E0C", - "802f1f3c" : "bhv_wing_vanish_cap_loop", - "802f1fd0" : "bhv_metal_cap_init", - "802f2030" : "func_802F0FE0", - "802f20ac" : "bhv_metal_cap_loop", - "802f2140" : "bhv_normal_cap_init", - "802f21e0" : "func_802F1190", - "802f2284" : "func_802F1234", - "802f23a8" : "bhv_normal_cap_loop", - "802f2498" : "bhv_vanish_cap_init", - "802f24f4" : "bhv_collect_star_init", - "802f25b0" : "bhv_collect_star_loop", - "802f2614" : "bhv_star_spawn_init", - "802f2768" : "bhv_star_spawn_loop", - "802f2aa0" : "func_802F1A50", - "802f2b88" : "create_star", - "802f2bd4" : "func_802F1B84", - "802f2c24" : "func_802F1BD4", - "802f2c84" : "bhv_hidden_red_coin_star_init", - "802f2d8c" : "bhv_hidden_red_coin_star_loop", - "802f2e6c" : "bhv_red_coin_init", - "802f2f2c" : "bhv_red_coin_loop", - "802f3014" : "bhv_hidden_star_init", - "802f30f0" : "bhv_hidden_star_loop", - "802f31bc" : "bhv_hidden_star_trigger_loop", - "802f328c" : "bhv_bowser_course_red_coin_star_loop", - "802f336c" : "bhv_ttm_rolling_log_init", - "802f341c" : "func_802F238C", - "802f36a4" : "bhv_rolling_log_loop", - "802f38b0" : "func_802F2820", - "802f39b4" : "func_802F2924", - "802f3a30" : "bhvLllVolcanoFallingTrap_loop", - "802f3b98" : "bhv_lll_rolling_log_init", - "802f3c54" : "bhv_1up_interact", - "802f3cc8" : "bhv_1up_common_init", - "802f3d30" : "bhv_1up_init", - "802f3dd0" : "func_802F2D40", - "802f3ea8" : "func_802F2E18", - "802f401c" : "func_802F2F8C", - "802f40cc" : "bhv_1up_walking_loop", - "802f4248" : "bhv_1up_running_away_loop", - "802f43b8" : "func_802F3328", - "802f44c0" : "bhv_1up_sliding_loop", - "802f45b8" : "bhv_1up_loop", - "802f45f0" : "bhv_1up_jump_on_approach_loop", - "802f4710" : "bhv_1up_hidden_loop", - "802f48f4" : "bhv_1up_hidden_trigger_loop", - "802f496c" : "bhv_1up_hidden_in_pole_loop", - "802f4b00" : "bhv_1up_hidden_in_pole_trigger_loop", - "802f4b78" : "bhv_1up_hidden_in_pole_spawner_loop", - "802f4c68" : "func_802F3BD8", - "802f4ce0" : "func_802F3C50", - "802f4d78" : "bhv_controllable_platform_sub_loop", - "802f4eb4" : "bhv_controllable_platform_init", - "802f5010" : "func_802F3F80", - "802f5068" : "func_802F3FD8", - "802f52c0" : "func_802F4230", - "802f547c" : "func_802F43EC", - "802f55a4" : "bhv_controllable_platform_loop", - "802f5cd4" : "bhv_breakable_box_small_init", - "802f5d78" : "func_802F4CE8", - "802f5e44" : "func_802F4DB4", - "802f5f48" : "breakable_box_small_released_loop", - "802f6014" : "breakable_box_small_idle_loop", - "802f60d8" : "breakable_box_small_get_dropped", - "802f6150" : "breakable_box_small_get_thrown", - "802f6228" : "bhv_breakable_box_small_loop", - "802f62e4" : "bhv_sliding_snow_mound_loop", - "802f6448" : "bhv_snow_mound_spawn_loop", - "802f6588" : "func_802F54F8", - "802f665c" : "func_802F55CC", - "802f6984" : "bhv_floating_platform_loop", - "802f6c0c" : "bhv_arrow_lift_loop", - "802f6d20" : "bhv_orange_number_init", - "802f6d58" : "bhv_orange_number_loop", - "802f6e40" : "bhv_manta_ray_init", - "802f6eb0" : "func_802F5E20", - "802f7068" : "func_802F5FD8", - "802f7264" : "bhv_manta_ray_loop", - "802f7348" : "bhv_falling_pillar_init", - "802f7398" : "bhv_falling_pillar_spawn_hitboxes", - "802f7418" : "bhv_falling_pillar_calculate_angle_in_front_of_mario", - "802f74dc" : "bhv_falling_pillar_loop", - "802f7760" : "bhv_falling_pillar_hitbox_loop", - "802f7924" : "bhv_jrb_floating_box_loop", - "802f7978" : "bhv_decorative_pendulum_init", - "802f79b0" : "bhv_decorative_pendulum_loop", - "802f7a58" : "bhv_treasure_chest_top_loop", - "802f7c9c" : "bhv_treasure_chest_bottom_init", - "802f7d04" : "bhv_treasure_chest_bottom_loop", - "802f7f1c" : "func_802F6E8C", - "802f7fa0" : "bhv_treasure_chest_ship_init", - "802f8044" : "bhv_treasure_chest_ship_loop", - "802f8158" : "bhv_treasure_chest_jrb_init", - "802f8208" : "bhv_treasure_chest_jrb_loop", - "802f82f8" : "bhv_treasure_chest_init", - "802f83a4" : "bhv_treasure_chest_loop", - "802f8490" : "bhv_mips_init", - "802f85e0" : "bhv_mips_find_furthest_waypoint_to_mario", - "802f8760" : "bhv_mips_act_wait_for_nearby_mario", - "802f8808" : "bhv_mips_act_follow_path", - "802f893c" : "bhv_mips_act_wait_for_animation_done", - "802f8988" : "bhv_mips_act_fall_down", - "802f8a34" : "bhv_mips_act_idle", - "802f8ab4" : "bhv_mips_free", - "802f8b54" : "bhv_mips_held", - "802f8c74" : "bhv_mips_dropped", - "802f8cf8" : "bhv_mips_thrown", - "802f8dac" : "bhv_mips_loop", - "802f8e54" : "bhv_yoshi_init", - "802f8f08" : "yoshi_walk_loop", - "802f9054" : "yoshi_idle_loop", - "802f923c" : "yoshi_talk_loop", - "802f93a8" : "yoshi_walk_and_jump_off_roof_loop", - "802f9500" : "yoshi_finish_jumping_and_despawn_loop", - "802f95ac" : "yoshi_give_present_loop", - "802f965c" : "BehYoshiLoop", - "802fbc4c" : "bhv_koopa_init", - "802fc414" : "shelled_koopa_attack_handler", - "802fcc00" : "obj_begin_race", - "802fd7f8" : "bhv_koopa_update", - "802fd950" : "bhv_koopa_race_endpoint_update", - "802fda28" : "bhv_pokey_body_part_update", - "802fe3b0" : "bhv_pokey_update", - "802fe8b4" : "bhv_swoop_update", - "802ff040" : "bhv_fly_guy_update", - "802ff214" : "bhv_goomba_triplet_spawner_update", - "802ff408" : "bhv_goomba_init", - "802ff94c" : "huge_goomba_weakly_attacked", - "802ff96c" : "bhv_goomba_update", - "802ffb38" : "bhv_chain_chomp_chain_part_update", - "80300e40" : "bhv_chain_chomp_update", - "80300ecc" : "bhv_wooden_post_update", - "80301148" : "bhv_chain_chomp_gate_init", - "80301180" : "bhv_chain_chomp_gate_update", - "80301210" : "bhv_wiggler_body_part_update", - "803014cc" : "wiggler_init_segments", - "803016e0" : "wiggler_update_segments", - "803020e4" : "wiggler_jumped_on_attack_handler", - "80302154" : "bhv_wiggler_update", - "80302910" : "bhv_spiny_update", - "80303028" : "bhv_enemy_lakitu_update", - "8030369c" : "bhv_cloud_update", - "80303744" : "bhv_cloud_part_update", - "80303984" : "bhv_camera_lakitu_init", - "80303f64" : "bhv_camera_lakitu_update", - "803043f8" : "bhv_monty_mole_hole_update", - "80304474" : "monty_mole_spawn_dirt_particles", - "803044c0" : "bhv_monty_mole_init", - "80304ba8" : "bhv_monty_mole_update", - "80304fd4" : "bhv_monty_mole_rock_update", - "80305100" : "bhv_platform_on_track_init", - "80305a58" : "bhv_platform_on_track_update", - "80305bb0" : "bhv_track_ball_update", - "80305c14" : "bhv_seesaw_platform_init", - "80305c90" : "bhv_seesaw_platform_update", - "80305e2c" : "bhv_ferris_wheel_axle_init", - "80305f24" : "bhv_ferris_wheel_platform_update", - "80306084" : "bhv_water_bomb_spawner_update", - "803062a8" : "water_bomb_spawn_explode_particles", - "803067e8" : "bhv_water_bomb_update", - "803068c0" : "bhv_water_bomb_shadow_update", - "8030699c" : "bhv_ttc_rotating_solid_init", - "80306a38" : "bhv_ttc_rotating_solid_update", - "80306cc4" : "bhv_ttc_pendulum_init", - "80306d38" : "bhv_ttc_pendulum_update", - "80306f48" : "bhv_ttc_treadmill_init", - "80307010" : "bhv_ttc_treadmill_update", - "803071b8" : "bhv_ttc_moving_bar_init", - "80307670" : "bhv_ttc_moving_bar_update", - "80307760" : "bhv_ttc_cog_init", - "803077e0" : "bhv_ttc_cog_update", - "80307930" : "bhv_ttc_pit_block_init", - "803079c8" : "bhv_ttc_pit_block_update", - "80307ae4" : "bhv_ttc_elevator_init", - "80307b58" : "bhv_ttc_elevator_update", - "80307c88" : "bhv_ttc_2d_rotator_init", - "80307cf8" : "bhv_ttc_2d_rotator_update", - "80307ea4" : "bhv_ttc_spinner_update", - "80307fb8" : "func_80306ED4", - "8030803c" : "bhv_mr_blizzard_init", - "80308d6c" : "bhv_mr_blizzard_update", - "80309154" : "bhv_mr_blizzard_snowball", - "803091e0" : "bhv_sliding_plat_2_init", - "80309354" : "bhv_sliding_plat_2_loop", - "80309454" : "bhv_rotating_octagonal_plat_init", - "803094d0" : "bhv_rotating_octagonal_plat_loop", - "803094f8" : "bhv_animates_on_floor_switch_press_init", - "80309530" : "bhv_animates_on_floor_switch_press_loop", - "803097a4" : "bhv_activated_back_and_forth_platform_init", - "803098c0" : "bhv_activated_back_and_forth_platform_update", - "80309b64" : "bhv_recovery_heart_loop", - "80309cec" : "bhv_bubble_cannon_barrel_loop", - "80309ed4" : "water_bomb_cannon_act_0", - "80309f68" : "water_bomb_cannon_act_1", - "8030a0e8" : "water_bomb_cannon_act_2", - "8030a11c" : "bhv_water_bomb_cannon_loop", - "8030a1c0" : "bhv_unagi_init", - "8030a2a8" : "unagi_act_0", - "8030a390" : "unagi_act_1_4", - "8030a514" : "unagi_act_2", - "8030a614" : "unagi_act_3", - "8030a93c" : "bhv_unagi_loop", - "8030aabc" : "bhv_unagi_subobject_loop", - "8030ad04" : "dorrie_raise_head", - "8030ae9c" : "dorrie_act_move", - "8030b0b8" : "dorrie_begin_head_raise", - "8030b0f0" : "dorrie_act_lower_head", - "8030b220" : "dorrie_act_raise_head", - "8030b2f4" : "bhv_dorrie_update", - "8030b658" : "bhv_haunted_chair_init", - "8030b6d8" : "haunted_chair_act_0", - "8030ba68" : "haunted_chair_act_1", - "8030bc90" : "bhv_haunted_chair_loop", - "8030bfd0" : "bhv_mad_piano_update", - "8030c06c" : "flying_bookend_act_0", - "8030c0f0" : "flying_bookend_act_1", - "8030c210" : "flying_bookend_act_2", - "8030c2c8" : "flying_bookend_act_3", - "8030c364" : "bhv_flying_bookend_loop", - "8030c4b0" : "bhv_bookend_spawn_loop", - "8030c564" : "bookshelf_manager_act_0", - "8030c60c" : "bookshelf_manager_act_1", - "8030c6a4" : "bookshelf_manager_act_2", - "8030c828" : "bookshelf_manager_act_3", - "8030c894" : "bookshelf_manager_act_4", - "8030c8ec" : "bhv_haunted_bookshelf_manager_loop", - "8030c98c" : "bhv_book_switch_loop", - "8030cd30" : "obj_spit_fire", - "8030cddc" : "bhv_fire_piranha_plant_init", - "8030d2f0" : "bhv_fire_piranha_plant_update", - "8030d598" : "bhv_fire_spitter_update", - "8030d640" : "bhv_small_piranha_flame_loop", - "8030d8d4" : "bhv_fly_guy_flame_loop", - "8030d93c" : "Geo18_8030D93C", - "8030d9ac" : "Geo18_8030D9AC", - "8030da14" : "snufit_act_0", - "8030db38" : "snufit_act_1", - "8030dc70" : "bhv_snufit_loop", - "8030dfc4" : "bhv_snufit_balls_loop", - "8030e14c" : "bhv_horizontal_grindel_init", - "8030e16c" : "bhv_horizontal_grindel_update", - "8030ea9c" : "bhv_eyerok_boss_loop", - "8030fff8" : "bhv_eyerok_hand_loop", - "80310498" : "bhv_klepto_init", - "8031126c" : "obj_set_speed_to_zero", - "8031129c" : "bhv_klepto_update", - "80311874" : "bhv_bird_update", - "803118e4" : "bhv_racing_penguin_init", - "80312070" : "bhv_racing_penguin_update", - "80312168" : "bhv_penguin_race_finish_line_update", - "80312200" : "bhv_penguin_race_shortcut_check_update", - "80312248" : "bhv_coffin_spawner_loop", - "80312370" : "coffin_act_idle", - "8031262c" : "coffin_act_stand_up", - "8031274c" : "bhv_coffin_loop", - "80312804" : "clam_act_0", - "80312900" : "clam_act_1", - "80312a54" : "bhv_clam_loop", - "80313110" : "bhv_skeeter_update", - "803131e8" : "bhv_skeeter_wave_update", - "8031326c" : "bhv_swing_platform_init", - "80313294" : "bhv_swing_platform_update", - "80313354" : "bhv_donut_platform_spawner_update", - "80313530" : "bhv_donut_platform_update", - "803136cc" : "bhv_ddd_pole_init", - "80313754" : "bhv_ddd_pole_update", - "803137f4" : "bhv_red_coin_star_marker_init", - "80313fc0" : "bhv_triplet_butterfly_update", - "80314098" : "bubba_act_0", - "8031427c" : "bubba_act_1", - "803145d4" : "bhv_bubba_loop", - "80314a30" : "prepare_reverb_ring_buffer", - "80314cc0" : "get_volume_ramping", - "80314de4" : "synthesis_execute", - "80314f64" : "synthesis_do_one_audio_update", - "80315590" : "synthesis_process_notes", - "80316010" : "load_wave_samples", - "803160dc" : "final_resample", - "80316138" : "process_envelope", - "8031619c" : "process_envelope_inner", - "803166fc" : "note_apply_headset_pan_effects", - "80316ac8" : "note_init_volume", - "80316af4" : "note_set_vel_pan_reverb", - "80316da8" : "note_set_frequency", - "80316db4" : "note_enable", - "80316e00" : "note_disable", - "80316e80" : "reset_bank_and_seq_load_status", - "80316ec4" : "discard_bank", - "80316fb4" : "discard_sequence", - "80317040" : "soundAlloc", - "803170b4" : "sound_alloc_pool_init", - "803170d4" : "persistent_pool_clear", - "803170e8" : "temporary_pool_clear", - "80317118" : "unused_803160F8", - "80317128" : "sound_init_main_pools", - "80317184" : "session_pools_init", - "80317200" : "seq_and_bank_pool_init", - "8031727c" : "persistent_pools_init", - "80317338" : "temporary_pools_init", - "803173fc" : "alloc_bank_or_seq", - "8031782c" : "get_bank_or_seq", - "803178ec" : "decrease_reverb_gain", - "80317914" : "wait_for_audio_frames", - "80317948" : "audio_reset_session", - "80318040" : "audio_dma_copy_immediate", - "803180c4" : "audio_dma_copy_async", - "80318130" : "audio_dma_partial_copy_async", - "803181ec" : "decrease_sample_dma_ttls", - "80318300" : "dma_sample_data", - "80318634" : "init_sample_dma_buffers", - "803188f4" : "patch_audio_bank", - "80318b30" : "bank_load_immediate", - "80318c8c" : "bank_load_async", - "80318dc4" : "sequence_dma_immediate", - "80318e70" : "sequence_dma_async", - "80318fac" : "get_missing_bank", - "803190f4" : "load_banks_immediate", - "80319220" : "preload_sequence", - "80319328" : "load_sequence", - "80319388" : "load_sequence_internal", - "8031950c" : "audio_init", - "80319920" : "note_init", - "80319998" : "note_disable2", - "803199b8" : "process_notes", - "80319db8" : "seq_channel_layer_decay_release_internal", - "80319f64" : "seq_channel_layer_note_decay", - "80319f84" : "seq_channel_layer_note_release", - "80319fa4" : "build_synthetic_wave", - "8031a1d0" : "init_synthetic_wave", - "8031a254" : "init_note_list", - "8031a264" : "init_note_lists", - "8031a2b4" : "init_note_free_list", - "8031a368" : "note_pool_clear", - "8031a494" : "note_pool_fill", - "8031a5d0" : "audio_list_push_front", - "8031a610" : "audio_list_remove", - "8031a63c" : "pop_node_with_value_less_equal", - "8031a6cc" : "note_init_for_layer", - "8031a794" : "func_80319728", - "8031a7c8" : "note_release_and_take_ownership", - "8031a820" : "alloc_note_from_disabled", - "8031a89c" : "alloc_note_from_decaying", - "8031a8f0" : "alloc_note_from_active", - "8031a94c" : "alloc_note", - "8031ac34" : "reclaim_notes", - "8031adac" : "note_init_all", - "8031aee0" : "func_80319E70", - "8031aee8" : "sequence_player_process_sound", - "8031b0cc" : "get_portamento_freq_scale", - "8031b1c0" : "get_vibrato_pitch_change", - "8031b248" : "get_vibrato_freq_scale", - "8031b440" : "note_vibrato_update", - "8031b4a0" : "note_vibrato_init", - "8031b58c" : "adsr_init", - "8031b5ac" : "adsr_update", - "8031b830" : "sequence_channel_init", - "8031b940" : "seq_channel_set_layer", - "8031ba30" : "seq_channel_layer_disable", - "8031ba6c" : "seq_channel_layer_free", - "8031baf0" : "sequence_channel_disable", - "8031bb5c" : "allocate_sequence_channel", - "8031bba4" : "sequence_player_init_channels", - "8031bcd0" : "sequence_player_disable_channels", - "8031bda0" : "sequence_channel_enable", - "8031be44" : "sequence_player_disable", - "8031bf14" : "audio_list_push_back", - "8031bf54" : "audio_list_pop_back", - "8031bf94" : "init_layer_freelist", - "8031c03c" : "m64_read_u8", - "8031c050" : "m64_read_s16", - "8031c080" : "m64_read_compressed_u16", - "8031c0c4" : "seq_channel_layer_process_script", - "8031c200" : "L_U_8031C200", - "8031c23c" : "L_U_8031C23C", - "8031c298" : "L_U_8031C298", - "8031c2dc" : "L_U_8031C2DC", - "8031c328" : "L_U_8031C328", - "8031c36c" : "L_U_8031C36C", - "8031c3bc" : "L_U_8031C3BC", - "8031c3e8" : "L_U_8031C3E8", - "8031c454" : "L_U_8031C454", - "8031c4a4" : "L_U_8031C4A4", - "8031c5c8" : "L_U_8031C5C8", - "8031c698" : "L_U_8031C698", - "8031c6a0" : "L_U_8031C6A0", - "8031cbe0" : "L_U_8031CBE0", - "8031cbec" : "L_U_8031CBEC", - "8031ce54" : "get_instrument", - "8031cfd4" : "set_instrument", - "8031d068" : "sequence_channel_set_volume", - "8031d08c" : "sequence_channel_process_script", - "8031d144" : "L_U_8031D144", - "8031d1f8" : "L_U_8031D1F8", - "8031d234" : "L_U_8031D234", - "8031d26c" : "L_U_8031D26C", - "8031d2b4" : "L_U_8031D2B4", - "8031d2c4" : "L_U_8031D2C4", - "8031d31c" : "L_U_8031D31C", - "8031d344" : "L_U_8031D344", - "8031d354" : "L_U_8031D354", - "8031d370" : "L_U_8031D370", - "8031d3a8" : "L_U_8031D3A8", - "8031d3c4" : "L_U_8031D3C4", - "8031d3d4" : "L_U_8031D3D4", - "8031d3e4" : "L_U_8031D3E4", - "8031d400" : "L_U_8031D400", - "8031d424" : "L_U_8031D424", - "8031d44c" : "L_U_8031D44C", - "8031d474" : "L_U_8031D474", - "8031d498" : "L_U_8031D498", - "8031d4bc" : "L_U_8031D4BC", - "8031d4d4" : "L_U_8031D4D4", - "8031d4f0" : "L_U_8031D4F0", - "8031d500" : "L_U_8031D500", - "8031d51c" : "L_U_8031D51C", - "8031d538" : "L_U_8031D538", - "8031d56c" : "L_U_8031D56C", - "8031d5a0" : "L_U_8031D5A0", - "8031d5b4" : "L_U_8031D5B4", - "8031d5d4" : "L_U_8031D5D4", - "8031d5e4" : "L_U_8031D5E4", - "8031d640" : "L_U_8031D640", - "8031d678" : "L_U_8031D678", - "8031d6c4" : "L_U_8031D6C4", - "8031d6d4" : "L_U_8031D6D4", - "8031d6f4" : "L_U_8031D6F4", - "8031d718" : "L_U_8031D718", - "8031d728" : "L_U_8031D728", - "8031d73c" : "L_U_8031D73C", - "8031d7b8" : "L_U_8031D7B8", - "8031d7e8" : "L_U_8031D7E8", - "8031d7f8" : "L_U_8031D7F8", - "8031d814" : "L_U_8031D814", - "8031d830" : "L_U_8031D830", - "8031d87c" : "L_U_8031D87C", - "8031d898" : "L_U_8031D898", - "8031d8f8" : "L_U_8031D8F8", - "8031d900" : "L_U_8031D900", - "8031d930" : "L_U_8031D930", - "8031d94c" : "L_U_8031D94C", - "8031d974" : "L_U_8031D974", - "8031d9ec" : "sequence_player_process_sequence", - "8031e240" : "process_sequences", - "8031e2e8" : "init_sequence_player", - "8031e374" : "init_sequence_players", - "8031e4f0" : "unused_8031E4F0", - "8031e568" : "unused_8031E568", - "8031e578" : "sequence_player_fade_out_internal", - "8031e5c0" : "func_8031D690", - "8031e60c" : "func_8031D6E4", - "8031e6a4" : "func_8031D7B0", - "8031e710" : "func_8031D838", - "8031e7b8" : "create_next_audio_frame_task", - "8031eb00" : "play_sound", - "8031eb30" : "process_sound_request", - "8031edec" : "process_all_sound_requests", - "8031ee70" : "func_8031DFE8", - "8031ef6c" : "func_8031E0E4", - "8031eff4" : "func_8031E16C", - "8031f810" : "get_sound_pan", - "8031f96c" : "get_sound_dynamics", - "8031fb20" : "get_sound_freq_scale", - "8031fbe8" : "get_sound_reverb", - "8031fd84" : "audio_signal_game_loop_tick", - "8031fdac" : "update_game_sound", - "80320544" : "play_sequence", - "80320678" : "sequence_player_fade_out", - "803206bc" : "fade_volume_scale", - "80320734" : "fade_channel_volume_scale", - "8032080c" : "func_8031F96C", - "803208ec" : "process_level_music_dynamics", - "80320a4c" : "L8031FBAC", - "80320a8c" : "L8031FBEC", - "80320acc" : "L8031FC2C", - "80320b0c" : "L8031FC6C", - "80320b4c" : "L8031FCAC", - "80320b8c" : "L8031FCEC", - "80320bcc" : "L8031FD2C", - "80320bf4" : "L8031FD54", - "80320d70" : "unused_8031FED0", - "80320e3c" : "func_8031FFB4", - "80320ec4" : "sequence_player_unlower", - "80320f68" : "func_803200E4", - "803210d4" : "set_sound_disabled", - "8032112c" : "sound_init", - "80321398" : "get_currently_playing_sound", - "80321474" : "func_803205E8", - "80321584" : "func_803206F8", - "8032171c" : "func_80320890", - "8032174c" : "sound_banks_disable", - "803217a8" : "disable_all_sequence_players", - "8032180c" : "sound_banks_enable", - "80321864" : "unused_803209D8", - "803218d8" : "func_80320A4C", - "803218f4" : "play_dialog_sound", - "803219ac" : "play_music", - "80321bac" : "stop_background_music", - "80321ce4" : "fadeout_background_music", - "80321d38" : "drop_queued_background_music", - "80321d5c" : "get_current_background_music", - "80321d9c" : "func_80320ED8", - "80321e48" : "play_secondary_music", - "80321f48" : "func_80321080", - "80321f9c" : "func_803210D4", - "80322078" : "play_course_clear", - "803220b4" : "play_peachs_jingle", - "803220f0" : "play_puzzle_jingle", - "8032212c" : "play_star_fanfare", - "80322168" : "play_power_star_jingle", - "803221b8" : "play_race_fanfare", - "803221f4" : "play_toads_jingle", - "80322230" : "sound_reset", - "8032231c" : "audio_set_sound_mode", - "80322348" : "unused_80321460", - "8032235c" : "unused_80321474", - "803223b0" : "osSetTime", - "803223e0" : "osMapTLB", - "803224a0" : "osUnmapTLBAll", - "803224f0" : "sprintf", - "8032255c" : "proutSprintf", - "803225a0" : "osCreateMesgQueue", - "803225d0" : "osSetEventMesg", - "80322640" : "osViSetEvent", - "803226b0" : "osCreateThread", - "80322800" : "osRecvMesg", - "80322940" : "_VirtualToPhysicalTask", - "80322a5c" : "osSpTaskLoad", - "80322bbc" : "osSpTaskStartGo", - "80322c00" : "osSpTaskYield", - "80322c20" : "osSendMesg", - "80322d70" : "osSpTaskYielded", - "80322df0" : "osStartThread", - "80322f40" : "osWritebackDCacheAll", - "80322f70" : "osCreateViManager", - "803230f4" : "viMgrMain", - "803232d0" : "osViSetMode", - "80323340" : "osViBlack", - "803233b0" : "osViSetSpecialFeatures", - "80323570" : "osCreatePiManager", - "803236f0" : "osSetThreadPri", - "803237d0" : "osInitialize", - "80323a00" : "osViSwapBuffer", - "80323a50" : "sqrtf", - "80323a60" : "osContStartReadData", - "80323b24" : "osContGetReadData", - "80323bcc" : "__osPackReadData", - "80323cc0" : "osContInit", - "80323ebc" : "__osContGetInitData", - "80323f8c" : "__osPackRequestData", - "80324080" : "osEepromProbe", - "803240f0" : "__ull_rshift", - "8032411c" : "__ull_rem", - "80324158" : "__ull_div", - "80324194" : "__ll_lshift", - "803241c0" : "__ll_rem", - "803241fc" : "__ll_div", - "80324258" : "__ll_mul", - "80324288" : "__ull_divremi", - "803242e8" : "__ll_mod", - "80324384" : "__ll_rshift", - "803243b0" : "osInvalDCache", - "80324460" : "osPiStartDma", - "80324570" : "bzero", - "80324610" : "osInvalICache", - "80324690" : "osEepromLongRead", - "803247d0" : "osEepromLongWrite", - "80324910" : "bcopy", - "80324c20" : "guOrthoF", - "80324d74" : "guOrtho", - "80324de0" : "guPerspectiveF", - "80325010" : "guPerspective", - "80325070" : "osGetTime", - "80325100" : "__d_to_ll", - "8032511c" : "__f_to_ll", - "80325138" : "__d_to_ull", - "803251d8" : "__f_to_ull", - "80325274" : "__ll_to_d", - "8032528c" : "__ll_to_f", - "803252a4" : "__ull_to_d", - "803252d8" : "__ull_to_f", - "80325310" : "cosf", - "80325480" : "sinf", - "80325640" : "guTranslateF", - "80325688" : "guTranslate", - "803256e0" : "guRotateF", - "80325874" : "guRotate", - "803258d0" : "guScaleF", - "80325924" : "guScale", - "80325970" : "osAiSetFrequency", - "80325bd4" : "alBnkfNew", - "80325cd8" : "alSeqFileNew", - "80325d20" : "osWritebackDCache", - "80325da0" : "osAiGetLength", - "80325db0" : "osAiSetNextBuffer", - "80325e60" : "__osTimerServicesInit", - "80325eec" : "__osTimerInterrupt", - "80326064" : "__osSetTimerIntr", - "803260d8" : "__osInsertTimer", - "80326260" : "_Printf", - "803273f0" : "memcpy", - "8032741c" : "strlen", - "80327444" : "strchr", - "80327490" : "__osDequeueThread", - "803274d0" : "__osDisableInt", - "803274f0" : "__osRestoreInt", - "80327510" : "__osViInit", - "80327640" : "__osExceptionPreamble", - "80327650" : "__osException", - "803278e4" : "L80326964", - "80327904" : "L80326984", - "80327938" : "L803269B8", - "80327a68" : "L80326AE8", - "80327ac4" : "L80326B44", - "80327ae4" : "L80326B64", - "80327b1c" : "L80326B9C", - "80327b68" : "L80326BE8", - "80327b98" : "send_mesg", - "80327c80" : "__osEnqueueAndYield", - "80327d10" : "__osEnqueueThread", - "80327d58" : "__osPopThread", - "80327d68" : "__osDispatchThread", - "80327ea8" : "__osCleanupThread", - "80327eb0" : "osVirtualToPhysical", - "80327f30" : "__osSpSetStatus", - "80327f40" : "__osSpSetPc", - "80327f80" : "__osSpRawStartDma", - "80328010" : "__osSpDeviceBusy", - "80328040" : "__osSpGetStatus", - "80328050" : "osGetThreadPri", - "80328070" : "__osViGetCurrentContext", - "80328080" : "__osViSwapContext", - "803283e0" : "osGetCount", - "803283f0" : "__osPiCreateAccessQueue", - "80328440" : "__osPiGetAccess", - "80328484" : "__osPiRelAccess", - "803284b0" : "osPiRawStartDma", - "80328590" : "__osDevMgrMain", - "80328710" : "__osSetSR", - "80328720" : "__osGetSR", - "80328730" : "__osSetFpcCsr", - "80328740" : "__osSiRawReadIo", - "80328790" : "__osSiRawWriteIo", - "803287e0" : "osMapTLBRdb", - "80328840" : "osPiRawReadIo", - "803288a0" : "__osSiCreateAccessQueue", - "803288f0" : "__osSiGetAccess", - "80328934" : "__osSiRelAccess", - "80328960" : "__osSiRawStartDma", - "80328a10" : "osSetTimer", - "80328af0" : "osEepromWrite", - "80328ca0" : "__osPackEepWriteData", - "80328dac" : "__osEepStatus", - "80328fd0" : "osJamMesg", - "80329120" : "osPiGetCmdQueue", - "80329150" : "osEepromRead", - "80329340" : "__osPackEepReadData", - "80329450" : "guMtxF2L", - "80329550" : "guMtxIdentF", - "803295d8" : "guMtxIdent", - "80329608" : "guMtxL2F", - "803296c0" : "guNormalize", - "80329750" : "__osAiDeviceBusy", - "80329780" : "__osSetCompare", - "80329790" : "_Litob", - "80329a90" : "_Ldtob", - "8032a860" : "u32_to_string", - "8032a890" : "string_to_u32", - "8032a8e8" : "send_packet", - "8032a9a8" : "send", - "8032aa80" : "process_command_memory", - "8032aacc" : "process_command_register", - "8032aaf8" : "kdebugserver", - "8032ace0" : "__osSyncPutChars", - "8032ae10" : "osSetIntMask", - "8032ae70" : "osDestroyThread", - "8032af70" : "__osProbeTLB", - "8032b030" : "__osSiDeviceBusy", - "8032b060" : "lldiv", - "8032b160" : "ldiv", - "8032b1f0" : "__osGetCause", - "8032b200" : "__osAtomicDec", - "8032b260" : "rspF3DBootStart", - "8032b330" : "rspF3DBootEnd", - "8032b330" : "rspF3DStart", - "8032c738" : "rspF3DEnd", - "8032c740" : "rspAspMainStart", - "8032d560" : "rspAspMainEnd", - "8032d560" : "gVblankHandler1", - "8032d564" : "gVblankHandler2", - "8032d568" : "gActiveSPTask", - "8032d56c" : "sCurrentAudioSPTask", - "8032d570" : "sCurrentDisplaySPTask", - "8032d574" : "sNextAudioSPTask", - "8032d578" : "sNextDisplaySPTask", - "8032d57c" : "sAudioEnabled", - "8032d580" : "sNumVblanks", - "8032d584" : "gResetTimer", - "8032d588" : "D_8032C648", - "8032d58c" : "gDebugLevelSelect", - "8032d590" : "D_8032C650", - "8032d594" : "gShowProfiler", - "8032d598" : "gShowDebugText", - "8032d5d0" : "unused8032C690", - "8032d5d4" : "gGlobalTimer", - "8032d5dc" : "frameBufferIndex", - "8032d5e0" : "D_8032C6A0", - "8032d5e4" : "gPlayer1Controller", - "8032d5e8" : "gPlayer2Controller", - "8032d5ec" : "gPlayer3Controller", - "8032d5f0" : "gCurrDemoInput", - "8032d5f4" : "gDemoInputListID", - "8032d5f8" : "gRecordedDemoInput", - "8032d6d0" : "credits01", - "8032d6d8" : "credits02", - "8032d6e4" : "credits03", - "8032d6f0" : "credits04", - "8032d700" : "credits05", - "8032d710" : "credits06", - "8032d71c" : "credits07", - "8032d728" : "credits08", - "8032d738" : "credits09", - "8032d740" : "credits10", - "8032d750" : "credits11", - "8032d75c" : "credits12", - "8032d764" : "credits13", - "8032d774" : "credits14", - "8032d77c" : "credits15", - "8032d788" : "credits16", - "8032d79c" : "credits17", - "8032d7ac" : "credits18", - "8032d7bc" : "credits19", - "8032d7c4" : "credits20", - "8032d7cc" : "sCreditsSequence", - "8032d93c" : "gMarioState", - "8032d940" : "unused1", - "8032d944" : "D_8032C9E0", - "8032daa0" : "sTerrainSounds", - "8032dacc" : "sSquishScaleOverTime", - "8032dae0" : "sCapFlickerFrames", - "8032daf8" : "gWaterSurfacePseudoFloor", - "8032dc50" : "sJumpLandAction", - "8032dc68" : "sFreefallLandAction", - "8032dc80" : "sSideFlipLandAction", - "8032dc98" : "sHoldJumpLandAction", - "8032dcb0" : "sHoldFreefallLandAction", - "8032dcc8" : "sLongJumpLandAction", - "8032dce0" : "sDoubleJumpLandAction", - "8032dcf8" : "sTripleJumpLandAction", - "8032dd10" : "sBackflipLandAction", - "8032dd40" : "sPunchingForwardVelocities", - "8032dd80" : "gLastCompletedCourseNum", - "8032dd84" : "gLastCompletedStarNum", - "8032dd88" : "sUnusedGotGlobalCoinHiScore", - "8032dd8c" : "gGotFileCoinHiScore", - "8032dd90" : "gCurrCourseStarFlags", - "8032dd94" : "gSpecialTripleJump", - "8032dd98" : "gLevelToCourseNumTable", - "8032ddc0" : "gMarioSpawnInfo", - "8032ddc4" : "gLoadedGraphNodes", - "8032ddc8" : "gAreas", - "8032ddcc" : "gCurrentArea", - "8032ddd0" : "gCurrCreditsEntry", - "8032ddd4" : "D_8032CE74", - "8032ddd8" : "D_8032CE78", - "8032dddc" : "gWarpTransDelay", - "8032dde0" : "gFBSetColor", - "8032dde4" : "gWarpTransFBSetColor", - "8032dde8" : "gWarpTransRed", - "8032ddec" : "gWarpTransGreen", - "8032ddf0" : "gWarpTransBlue", - "8032ddf4" : "gCurrSaveFileNum", - "8032ddf8" : "gCurrLevelNum", - "8032ddfc" : "D_8032CE9C", - "8032de4c" : "D_8032CEEC", - "8032de60" : "D_8032CF00", - "8032de70" : "renderModeTable_1Cycle", - "8032deb0" : "renderModeTable_2Cycle", - "8032def0" : "gCurGraphNodeRoot", - "8032def4" : "gCurGraphNodeMasterList", - "8032def8" : "gCurGraphNodeCamFrustum", - "8032defc" : "gCurGraphNodeCamera", - "8032df00" : "gCurGraphNodeObject", - "8032df04" : "gCurGraphNodeHeldObject", - "8032df08" : "gAreaUpdateCounter", - "8032df10" : "gProfilerMode", - "8032df14" : "gCurrentFrameIndex1", - "8032df18" : "gCurrentFrameIndex2", - "8032df20" : "unused8032CFC0", - "8032df24" : "gCutsceneFocus", - "8032df28" : "unused8032CFC8", - "8032df2c" : "unused8032CFCC", - "8032df30" : "gSecondCameraFocus", - "8032df34" : "sYawSpeed", - "8032df38" : "gCurrLevelArea", - "8032df3c" : "gPrevLevel", - "8032df40" : "unused8032CFE0", - "8032df44" : "unused8032CFE4", - "8032df48" : "unused8032CFE8", - "8032df4c" : "gCameraZoomDist", - "8032df50" : "sObjectCutscene", - "8032df54" : "gRecentCutscene", - "8032df58" : "sFramesSinceCutsceneEnded", - "8032df5c" : "sCutsceneDialogResponse", - "8032df60" : "sMarioCamState", - "8032df64" : "sLuigiCamState", - "8032df68" : "unused8032D008", - "8032df6c" : "sFixedModeBasePosition", - "8032df78" : "sUnusedModeBasePosition_2", - "8032df84" : "sUnusedModeBasePosition_3", - "8032df90" : "sUnusedModeBasePosition_4", - "8032df9c" : "sUnusedModeBasePosition_5", - "8032dfa8" : "sModeTransitions", - "8032e008" : "unused8032D0A8", - "8032e010" : "unused8032D0B0", - "8032e018" : "sDanceCutsceneTable", - "8032e024" : "unusedDanceInfo1", - "8032e038" : "unusedDanceType", - "8032e03c" : "unusedDanceInfo2", - "8032e050" : "sBBHLibraryParTrackPath", - "8032e098" : "sCamSL", - "8032e0e0" : "sCamTHI", - "8032e128" : "sCamHMC", - "8032e1d0" : "sCamSSL", - "8032e248" : "sCamRR", - "8032e2f0" : "sCamBOB", - "8032e338" : "sCamCotMC", - "8032e368" : "sCamCCM", - "8032e3b0" : "sCamCastle", - "8032e6f8" : "sCamBBH", - "8032ecb0" : "sCameraTriggers", - "8032ed50" : "sIntroStartToPipePosition", - "8032ee08" : "sIntroStartToPipeFocus", - "8032eec0" : "sIntroPipeToDialogPosition", - "8032ef30" : "sIntroPipeToDialogFocus", - "8032efa0" : "sEndingFlyToWindowPos", - "8032eff0" : "sEndingFlyToWindowFocus", - "8032f048" : "sEndingPeachDescentCamPos", - "8032f0e8" : "sEndingMarioToPeachPos", - "8032f130" : "sEndingMarioToPeachFocus", - "8032f178" : "sEndingLookUpAtCastle", - "8032f1b8" : "sEndingLookAtSkyFocus", - "8032f214" : "gIntroLakituStartToPipeFocus", - "8032f32c" : "gIntroLakituStartToPipeOffsetFromCamera", - "8032f444" : "gEndWavingPos", - "8032f48c" : "gEndWavingFocus", - "8032f4d4" : "sCutsceneEnding", - "8032f534" : "sCutsceneGrandStar", - "8032f544" : "sCutsceneUnused", - "8032f554" : "sCutsceneDoorWarp", - "8032f564" : "sCutsceneEndWaving", - "8032f56c" : "sCutsceneCredits", - "8032f574" : "sCutsceneDoorPull", - "8032f59c" : "sCutsceneDoorPush", - "8032f5c4" : "sCutsceneDoorPullMode", - "8032f5dc" : "sCutsceneDoorPushMode", - "8032f5f4" : "sCutsceneEnterCannon", - "8032f60c" : "sCutsceneStarSpawn", - "8032f624" : "sCutsceneRedCoinStarSpawn", - "8032f634" : "sCutsceneEnterPainting", - "8032f63c" : "sCutsceneDeathExit", - "8032f64c" : "sCutsceneExitPaintingSuccess", - "8032f65c" : "sCutsceneUnusedExit", - "8032f674" : "sCutsceneIntroPeach", - "8032f69c" : "sCutscenePrepareCannon", - "8032f6ac" : "sCutsceneExitWaterfall", - "8032f6bc" : "sCutsceneFallToCastleGrounds", - "8032f6cc" : "sCutsceneEnterPyramidTop", - "8032f6dc" : "sCutscenePyramidTopExplode", - "8032f6f4" : "sCutsceneStandingDeath", - "8032f6fc" : "sCutsceneEnterPool", - "8032f70c" : "sCutsceneDeathStomach", - "8032f714" : "sCutsceneDeathOnBack", - "8032f71c" : "sCutsceneQuicksandDeath", - "8032f724" : "sCutsceneWaterDeath", - "8032f72c" : "sCutsceneSuffocation", - "8032f734" : "sCutsceneEnterBowserArena", - "8032f74c" : "sCutsceneDanceDefaultRotate", - "8032f754" : "sCutsceneDanceFlyAway", - "8032f75c" : "sCutsceneDanceCloseup", - "8032f764" : "sCutsceneKeyDance", - "8032f76c" : "sCutsceneCapSwitchPress", - "8032f774" : "sCutsceneSlidingDoorsOpen", - "8032f784" : "sCutsceneUnlockKeyDoor", - "8032f794" : "sCutsceneExitBowserSuccess", - "8032f7a4" : "sCutsceneExitBowserDeath", - "8032f7b4" : "sCutsceneExitSpecialSuccess", - "8032f7c4" : "sCutsceneNonPaintingDeath", - "8032f7d4" : "sCutsceneDialog", - "8032f7ec" : "sCutsceneReadMessage", - "8032f804" : "sDanceCutsceneIndexTable", - "8032f870" : "sZoomOutAreaMasks", - "8032f884" : "sBobCreditsSplinePositions", - "8032f8ac" : "sBobCreditsSplineFocus", - "8032f8d4" : "sWfCreditsSplinePositions", - "8032f8fc" : "sWfCreditsSplineFocus", - "8032f924" : "sJrbCreditsSplinePositions", - "8032f94c" : "sJrbCreditsSplineFocus", - "8032f974" : "sCcmSlideCreditsSplinePositions", - "8032f99c" : "sCcmSlideCreditsSplineFocus", - "8032f9c4" : "sBbhCreditsSplinePositions", - "8032f9e4" : "sBbhCreditsSplineFocus", - "8032fa04" : "sHmcCreditsSplinePositions", - "8032fa2c" : "sHmcCreditsSplineFocus", - "8032fa54" : "sThiWigglerCreditsSplinePositions", - "8032fa6c" : "sThiWigglerCreditsSplineFocus", - "8032fa84" : "sVolcanoCreditsSplinePositions", - "8032fab4" : "sVolcanoCreditsSplineFocus", - "8032fae4" : "sSslCreditsSplinePositions", - "8032fb14" : "sSslCreditsSplineFocus", - "8032fb44" : "sDddCreditsSplinePositions", - "8032fb7c" : "sDddCreditsSplineFocus", - "8032fbb4" : "sSlCreditsSplinePositions", - "8032fbd4" : "sSlCreditsSplineFocus", - "8032fbf4" : "sWdwCreditsSplinePositions", - "8032fc14" : "sWdwCreditsSplineFocus", - "8032fc34" : "sTtmCreditsSplinePositions", - "8032fc64" : "sTtmCreditsSplineFocus", - "8032fc94" : "sThiHugeCreditsSplinePositions", - "8032fccc" : "sThiHugeCreditsSplineFocus", - "8032fd04" : "sTtcCreditsSplinePositions", - "8032fd24" : "sTtcCreditsSplineFocus", - "8032fd44" : "sRrCreditsSplinePositions", - "8032fd64" : "sRrCreditsSplineFocus", - "8032fd84" : "sSaCreditsSplinePositions", - "8032fdac" : "sSaCreditsSplineFocus", - "8032fdd4" : "sCotmcCreditsSplinePositions", - "8032fdfc" : "sCotmcCreditsSplineFocus", - "8032fe24" : "sDddSubCreditsSplinePositions", - "8032fe4c" : "sDddSubCreditsSplineFocus", - "8032fe74" : "sCcmOutsideCreditsSplinePositions", - "8032fe94" : "sCcmOutsideCreditsSplineFocus", - "8032fec0" : "sObjectListUpdateOrder", - "8032fecc" : "sParticleTypes", - "80330000" : "D_8032F0A0", - "80330004" : "D_8032F0A4", - "80330020" : "D_8032F0C0", - "8033002c" : "D_8032F0CC", - "8033006c" : "sMrIParticleActions", - "80330074" : "sMrIActions", - "80330084" : "sMrIHitbox", - "80330094" : "D_8032F134", - "803300a8" : "unused8032F134", - "803300ac" : "sCapSwitchActions", - "803300bc" : "sKingBobombActions", - "803300e0" : "sKingBobombSoundStates", - "80330140" : "sOpenedCannonActions", - "8033015c" : "unused0EA1FC", - "80330198" : "sChuckyaActions", - "803301a8" : "sWFRotatingPlatformData", - "803301c0" : "sKoopaShellUnderwaterHitbox", - "803301d0" : "D_8032F270", - "803301e4" : "sSparkleSpawnStarHitbox", - "803301f4" : "sYellowCoinHitbox", - "80330204" : "D_8032F2A4", - "80330224" : "sCoinInsideBooActions", - "8033022c" : "D_8032F2CC", - "80330244" : "D_8032F2E4", - "80330260" : "D_8032F300", - "80330288" : "D_8032F328", - "80330290" : "D_8032F330", - "80330298" : "sGrindelThwompActions", - "803302ac" : "sTumblingBridgeParams", - "803302dc" : "sTumblingBridgeActions", - "803302ec" : "D_8032F38C", - "80330318" : "sElevatorActions", - "8033032c" : "D_8032F3CC", - "80330340" : "D_8032F3E0", - "80330354" : "D_8032F3F4", - "8033035c" : "D_8032F3FC", - "80330370" : "sUkikiCageActions", - "80330380" : "D_8032F420", - "80330390" : "sSpindriftHitbox", - "803303a0" : "sMetalBoxHitbox", - "803303b0" : "sBreakableBoxHitbox", - "803303c0" : "D_8032F460", - "803303e8" : "sHeaveHoActions", - "803303f8" : "sJumpingBoxHitbox", - "80330408" : "sJumpingBoxActions", - "8033042c" : "sBowserKeyHitbox", - "8033043c" : "sBulletBillActions", - "80330450" : "sBowserTailAnchorActions", - "8033045c" : "D_8032F4FC", - "8033046c" : "D_8032F50C", - "80330470" : "D_8032F510", - "80330474" : "D_8032F514", - "80330478" : "sBowserDefeatedDialogText", - "80330480" : "D_8032F520", - "803304c8" : "sBowserActions", - "80330518" : "D_8032F5B8", - "803305f0" : "D_8032F690", - "803305f4" : "D_8032F694", - "803305f8" : "D_8032F698", - "8033067c" : "sFallingBowserPlatformActions", - "80330688" : "sGrowingBowserFlameHitbox", - "80330698" : "sBowserFlameHitbox", - "803306a8" : "D_8032F748", - "803306b4" : "D_8032F754", - "803306dc" : "sCageUkikiPath", - "80330738" : "sUkikiSoundStates", - "803307a0" : "sUkikiActions", - "803307c0" : "D_8032F860", - "803307f4" : "D_8032F894", - "80330828" : "D_8032F8C8", - "80330830" : "sRotatingCwFireBarsActions", - "80330840" : "sKoopaShellHitbox", - "80330850" : "D_8032F8F0", - "80330884" : "D_8032F924", - "803308a8" : "D_8032F948", - "803308cc" : "D_8032F96C", - "803308d8" : "sToxBoxActions", - "80330900" : "TablePiranhaPlantActions", - "80330b1c" : "sBowserPuzzlePieceActions", - "80330b38" : "sTuxiesMotherActions", - "80330b44" : "sSmallPenguinActions", - "80330b5c" : "sFishActions", - "80330b68" : "sFishGroupActions", - "80330b74" : "sBirdChirpChirpActions", - "80330b84" : "sCheepCheepActions", - "80330b90" : "sExclamationBoxHitbox", - "80330ba0" : "sExclamationBoxContents", - "80330c20" : "sExclamationBoxActions", - "80330c38" : "sSkullSlidingBoxHitbox", - "80330c48" : "D_8032FCE8", - "80330c58" : "sTweesterHitbox", - "80330c68" : "sTweesterActions", - "80330cd4" : "sScuttlebugHitbox", - "80330ce4" : "sWhompActions", - "80330d0c" : "D_8032FDAC", - "80330d30" : "D_8032FDD0", - "80330d54" : "D_8032FDF4", - "80330d78" : "D_8032FE18", - "80330d9c" : "sWindParticleHitbox", - "80330dac" : "D_8032FE4C", - "80330e20" : "D_8032FEC0", - "80330e24" : "unused_8032FEC4", - "80330e34" : "gMarioPlatform", - "80330e40" : "sDebugEffectStringInfo", - "80330e64" : "sDebugEnemyStringInfo", - "80330e88" : "sDebugInfoDPadMask", - "80330e8c" : "sDebugInfoDPadUpdID", - "80330e90" : "sDebugLvSelectCheckFlag", - "80330e94" : "sDebugPage", - "80330e98" : "sNoExtraDebug", - "80330e9c" : "sDebugStringArrPrinted", - "80330ea0" : "sDebugSysCursor", - "80330ea4" : "sDebugInfoButtonSeqID", - "80330ea8" : "sDebugInfoButtonSeq", - "80330ec0" : "sTransitionColorFadeCount", - "80330ec4" : "sTransitionTextureFadeCount", - "80330ec8" : "sTextureTransitionID", - "80330ee0" : "rectangles", - "80330f00" : "sSkyboxTextures", - "80330f28" : "sSkyboxColors", - "80330f30" : "gMovtexCounter", - "80330f34" : "gMovtexCounterPrev", - "80330f38" : "gMovtexVtxColor", - "80330f3c" : "gPaintingMarioYEntry", - "80330f40" : "gWdwWaterLevelSet", - "80330f44" : "gMovtexIdToTexture", - "80330f64" : "gMovtexNonColored", - "803311a4" : "gMovtexColored", - "8033127c" : "gMovtexColored2", - "80331300" : "hmcPaintings", - "80331308" : "insideCastlePaintings", - "80331344" : "ttmPaintings", - "8033134c" : "paintingGroups", - "80331358" : "gPaintingUpdateCounter", - "8033135c" : "gLastPaintingUpdateCounter", - "80331360" : "sTextLabelsCount", - "80331370" : "gDialogCharWidths", - "80331470" : "gDialogBoxState", - "80331474" : "gDialogBoxOpenTimer", - "80331478" : "gDialogBoxScale", - "8033147c" : "gDialogScrollOffsetY", - "80331480" : "gDialogBoxType", - "80331484" : "gDialogID", - "80331488" : "gLastDialogPageStrPos", - "8033148c" : "gDialogTextPos", - "80331490" : "gDialogLineNum", - "80331494" : "gLastDialogResponse", - "80331498" : "gMenuHoldKeyIndex", - "8033149c" : "gMenuHoldKeyTimer", - "803314a0" : "gDialogResponse", - "803314b0" : "gHudSymCoin", - "803314b4" : "gHudSymX", - "803314f8" : "gMenuMode", - "803314fc" : "gEndCutsceneStrEn0", - "80331504" : "gEndCutsceneStrEn1", - "80331538" : "gEndCutsceneStrEn2", - "80331558" : "gEndCutsceneStrEn3", - "8033156c" : "gEndCutsceneStrEn4", - "80331598" : "gEndCutsceneStrEn5", - "803315ac" : "gEndCutsceneStrEn6", - "803315cc" : "gEndCutsceneStrEn7", - "803315dc" : "gEndCutsceneStrEn8", - "803315e4" : "gEndCutsceneStringsEn", - "8033160c" : "gCutsceneMsgFade", - "80331610" : "gCutsceneMsgIndex", - "80331614" : "gCutsceneMsgDuration", - "80331618" : "gCutsceneMsgTimer", - "8033161c" : "gDialogCameraAngleIndex", - "80331620" : "gDialogCourseActNum", - "803316c8" : "gCourseCompleteCoinsEqual", - "803316cc" : "gCourseDoneMenuTimer", - "803316d0" : "gCourseCompleteCoins", - "803316d4" : "gHudFlash", - "80331750" : "gEnvFxMode", - "80331754" : "D_80330644", - "80331758" : "gSnowTempVtx", - "80331788" : "gSnowFlakeVertex1", - "80331790" : "gSnowFlakeVertex2", - "80331798" : "gSnowFlakeVertex3", - "803317a0" : "D_80330690", - "803317a4" : "D_80330694", - "803317a8" : "gBubbleTempVtx", - "803317e0" : "MacroObjectPresets", - "803325fc" : "sPowerMeterVisibleTimer", - "80332614" : "sPrevCheckMarioRoom", - "80332618" : "sYoshiDead", - "8033261c" : "sDebugSequenceTracker", - "80332620" : "sDebugTimer", - "803327a8" : "sBreakableBoxSmallHitbox", - "80332b00" : "sMrBlizzardHitbox", - "80332b10" : "D_80331A00", - "80332b24" : "sMrBlizzardSnowballHitbox", - "80332b34" : "D_80331A24", - "80332b54" : "D_80331A44", - "80332b5c" : "D_80331A4C", - "80332b64" : "D_80331A54", - "80332bdc" : "D_80331ACC", - "80332bf0" : "sRecoveryHeartHitbox", - "80332c00" : "sUnagiHitbox", - "80332c10" : "sHauntedChairHitbox", - "80332c30" : "sFlyingBookendHitbox", - "80332c40" : "D_80331B30", - "80332c4c" : "sBookSwitchHitbox", - "80332c5c" : "sFirePiranhaPlantHitbox", - "80332c6c" : "D_80331B5C", - "80332c74" : "sPiranhaPlantFireHitbox", - "80332c84" : "sSnufitHitbox", - "80332c94" : "sSnufitBulletHitbox", - "80332ca4" : "sEyerokHitbox", - "80332cb4" : "D_80331BA4", - "80332d10" : "coffinRelativePos", - "80332d28" : "sClamShellHitbox", - "80332d38" : "sSkeeterHitbox", - "80332d48" : "D_80331C38", - "80332e50" : "gAudioErrorFlags", - "80332e54" : "sGameLoopTicked", - "80332e58" : "sDialogSpeaker", - "80332f04" : "sDialogSpeakerVoice", - "80332f40" : "sNumProcessedSoundRequests", - "80332f44" : "sSoundRequestCount", - "80332f48" : "sDynBbh", - "80332f54" : "sDynDdd", - "80332f6c" : "sDynJrb", - "80332f88" : "sDynWdw", - "80332f98" : "sDynHmc", - "80332fa8" : "sDynUnk38", - "80332fb8" : "sDynNone", - "80332fbc" : "sCurrentMusicDynamic", - "80332fc0" : "sBackgroundMusicForDynamics", - "80332fc4" : "sLevelDynamics", - "80333060" : "sMusicDynamics", - "803330c0" : "gAreaEchoLevel", - "80333138" : "D_80332028", - "80333188" : "sBackgroundMusicDefaultVolume", - "803331ac" : "sPlayer0CurSeqId", - "803331b0" : "sMusicDynamicDelay", - "803331b4" : "D_803320A4", - "803331c0" : "D_803320B0", - "803331cc" : "D_803320BC", - "803331d8" : "sMaxChannelsForSoundBank", - "803331e4" : "sNumSoundsPerBank", - "803331f0" : "gDefaultSoundArgs", - "803331fc" : "sUnusedSoundArgs", - "80333208" : "sSoundBankDisabled", - "80333218" : "D_80332108", - "8033321c" : "sHasStartedFadeOut", - "80333220" : "D_80332110", - "80333224" : "sUnused80332114", - "80333228" : "sUnused80332118", - "8033322c" : "D_8033211C", - "80333230" : "D_80332120", - "80333234" : "D_80332124", - "80333238" : "sBackgroundMusicQueueSize", - "8033323c" : "sUnused8033323C", - "803332a0" : "gAudioSessionPresets", - "80333498" : "gAudioCosineTable", - "80333598" : "gPitchBendFrequencyScale", - "80333994" : "gNoteFrequencies", - "80333b94" : "gDefaultShortNoteVelocityTable", - "80333ba4" : "gDefaultShortNoteDurationTable", - "80333bb4" : "gVibratoCurve", - "80333bc4" : "gDefaultEnvelope", - "80333bd0" : "sSineWave", - "80333c50" : "sSquareWave", - "80333cd0" : "sTriangleWave", - "80333d50" : "sSawtoothWave", - "80333dd0" : "gWaveSamples", - "80333de0" : "gHeadsetPanQuantization", - "80333df4" : "gHeadsetPanVolume", - "80333ff4" : "gStereoPanVolume", - "803341f4" : "gDefaultPanVolume", - "803343f4" : "gVolRampingLhs136", - "803345f4" : "gVolRampingRhs136", - "803347f4" : "gVolRampingLhs144", - "803349f4" : "gVolRampingRhs144", - "80334bf4" : "gVolRampingLhs128", - "80334df4" : "gVolRampingRhs128", - "80334ff4" : "gTatumsPerBeat", - "80334ff8" : "gUnusedCount80333EE8", - "80334ffc" : "gAudioHeapSize", - "80335000" : "D_80333EF0", - "80335004" : "gAudioLoadLock", - "80335008" : "sUnused8033EF8", - "80335010" : "osViModeTable", - "803358f0" : "piMgrArgs", - "80335910" : "osClockRate", - "80335918" : "D_80334808", - "80335920" : "D_80334810", - "80335930" : "D_80334820", - "80335940" : "D_80334830", - "80335950" : "_spaces", - "80335974" : "_zeroes", - "803359a0" : "D_80334890", - "803359a4" : "unknown", - "803359a8" : "D_80334898", - "803359ac" : "D_8033489C", - "803359b0" : "D_803348A0", - "803359b4" : "D_803348A4", - "803359c0" : "D_803348B0", - "80335a20" : "D_80334910", - "80335a24" : "D_80334914", - "80335a28" : "D_80334918", - "80335a2c" : "D_8033491C", - "80335a30" : "D_80334920", - "80335a44" : "D_80334934", - "80335a48" : "D_80334938", - "80335a50" : "gOsPiAccessQueueCreated", - "80335a60" : "gOsSiAccessQueueCreated", - "80335aa0" : "D_80334990", - "80335af0" : "D_803349E0", - "80335b40" : "D_80334A30", - "80335b44" : "D_80334A34", - "80335b48" : "D_80334A38", - "80335b50" : "D_80334A40", - "80335b54" : "D_80334A44", - "80338da0" : "D_80337BB0", - "80338da8" : "D_80337BB8", - "80338e60" : "jtbl_80337C90", - "80338e84" : "jtbl_80337CB4", - "80338eac" : "jtbl_80337CDC", - "80338ec0" : "jtbl_80337D08", - "80338fbc" : "jtbl_80337E04", - "8033978c" : "jtbl_80338418", - "80339880" : "length_str", - "80339884" : "flags_str", - "8033988c" : "flags_arr", - "80339980" : "D_80338610", - "803399a0" : "jtbl_80338630", - "803399d0" : "NAN", - "803399e0" : "D_80338670", - "80339a40" : "D_803386D0", - "80339ac0" : "rspF3DDataStart", - "8033a2c0" : "rspF3DDataEnd", - "8033a2c0" : "rspAspMainDataStart", - "8033a580" : "rspAspMainDataEnd", - "8033a580" : "_mainSegmentEnd", - "008c0c40" : "_mainSegmentRomEnd", - "8033a580" : "_mainSegmentNoloadStart", - "8033a580" : "D_80339210", - "8033a730" : "gIdleThread", - "8033a8e0" : "gMainThread", - "8033aa90" : "gGameLoopThread", - "8033ac40" : "gSoundThread", - "8033adf0" : "gPIMesgQueue", - "8033ae08" : "gIntrMesgQueue", - "8033ae20" : "gSPTaskMesgQueue", - "8033ae38" : "gDmaMesgBuf", - "8033ae40" : "gPIMesgBuf", - "8033aec0" : "gSIEventMesgBuf", - "8033aec8" : "gIntrMesgBuf", - "8033af08" : "gUnknownMesgBuf", - "8033af48" : "gDmaIoMesg", - "8033af5c" : "D_80339BEC", - "8033af60" : "gDmaMesgQueue", - "8033af78" : "gSIEventMesgQueue", - "8033af90" : "gControllers", - "8033afe8" : "gControllerStatuses", - "8033aff8" : "gControllerPads", - "8033b010" : "gGameVblankQueue", - "8033b028" : "D_80339CB8", - "8033b040" : "D_80339CD0", - "8033b044" : "D_80339CD4", - "8033b048" : "gGameVblankHandler", - "8033b050" : "gPhysicalFrameBuffers", - "8033b05c" : "gPhysicalZBuffer", - "8033b060" : "D_80339CF0", - "8033b064" : "D_80339CF4", - "8033b068" : "gGfxSPTask", - "8033b06c" : "gDisplayListHead", - "8033b070" : "gGfxPoolEnd", - "8033b074" : "gGfxPool", - "8033b078" : "gControllerBits", - "8033b079" : "gEepromProbe", - "8033b080" : "D_80339D10", - "8033b090" : "gDemo", - "8033b0a0" : "filler80339D30", - "8033b170" : "gMarioStates", - "8033b238" : "sCurrPlayMode", - "8033b23a" : "D_80339ECA", - "8033b23c" : "sTransitionTimer", - "8033b240" : "sTransitionUpdate", - "8033b244" : "unused3", - "8033b248" : "sWarpDest", - "8033b250" : "D_80339EE0", - "8033b252" : "sDelayedWarpOp", - "8033b254" : "sDelayedWarpTimer", - "8033b256" : "sSourceWarpNodeId", - "8033b258" : "sDelayedWarpArg", - "8033b25c" : "unused4", - "8033b25e" : "sTimerRunning", - "8033b260" : "gHudDisplay", - "8033b26e" : "gShouldNotPlayCastleMusic", - "8033b270" : "sDelayInvincTimer", - "8033b272" : "sInvulnerable", - "8033b280" : "unused80339F10", - "8033b288" : "filler80339F1C", - "8033b2c0" : "D_80339F50", - "8033b350" : "gMirrorMario", - "8033b3b0" : "gBodyStates", - "8033b400" : "sSegmentTable", - "8033b480" : "sPoolFreeSpace", - "8033b484" : "sPoolStart", - "8033b488" : "sPoolEnd", - "8033b48c" : "sPoolListHeadL", - "8033b490" : "sPoolListHeadR", - "8033b494" : "gEffectsMemoryPool", - "8033b4a0" : "gWarpCheckpoint", - "8033b4a5" : "gMainMenuDataModified", - "8033b4a6" : "gSaveFileModified", - "8033b4b0" : "gPlayerSpawnInfos", - "8033b4d0" : "D_8033A160", - "8033b8d0" : "gAreaData", - "8033bab0" : "gWarpTransition", - "8033bac6" : "gCurrCourseNum", - "8033bac8" : "gCurrActNum", - "8033baca" : "gCurrAreaIndex", - "8033bacc" : "gSavedCourseNum", - "8033bace" : "gPauseScreenMode", - "8033bad0" : "gSaveOptSelectIndex", - "8033bae0" : "gMatStackIndex", - "8033bae8" : "gMatStack", - "8033c2e8" : "gMatStackFixed", - "8033c368" : "gGeoTempState", - "8033c378" : "gCurAnimType", - "8033c379" : "gCurAnimEnabled", - "8033c37a" : "gCurrAnimFrame", - "8033c37c" : "gCurAnimTranslationMultiplier", - "8033c380" : "gCurrAnimAttribute", - "8033c384" : "gCurAnimData", - "8033c388" : "gDisplayListHeap", - "8033c390" : "gProfilerFrameData", - "8033c520" : "gPlayerCameraState", - "8033c568" : "sOldPosition", - "8033c578" : "sOldFocus", - "8033c588" : "sPlayer2FocusOffset", - "8033c594" : "sCreditsPlayer2Pitch", - "8033c596" : "sCreditsPlayer2Yaw", - "8033c598" : "sFramesPaused", - "8033c5a0" : "sFOVState", - "8033c5c0" : "sModeTransition", - "8033c5e8" : "sMarioGeometry", - "8033c61c" : "unusedFreeRoamWallYaw", - "8033c61e" : "sAvoidYawVel", - "8033c620" : "sCameraYawAfterDoorCutscene", - "8033c622" : "unusedSplinePitch", - "8033c624" : "unusedSplineYaw", - "8033c628" : "sHandheldShakeSpline", - "8033c668" : "sHandheldShakeMag", - "8033c66c" : "sHandheldShakeTimer", - "8033c670" : "sHandheldShakeInc", - "8033c674" : "sHandheldShakePitch", - "8033c676" : "sHandheldShakeYaw", - "8033c678" : "sHandheldShakeRoll", - "8033c67c" : "unused8033B30C", - "8033c680" : "unused8033B310", - "8033c684" : "sSelectionFlags", - "8033c686" : "unused8033B316", - "8033c688" : "s2ndRotateFlags", - "8033c68a" : "unused8033B31A", - "8033c68c" : "sCameraSoundFlags", - "8033c68e" : "sCButtonsPressed", - "8033c690" : "sCutsceneDialogID", - "8033c698" : "gLakituState", - "8033c758" : "unused8033B3E8", - "8033c75a" : "sAreaYaw", - "8033c75c" : "sAreaYawChange", - "8033c75e" : "sLakituDist", - "8033c760" : "sLakituPitch", - "8033c764" : "sZoomAmount", - "8033c768" : "sCSideButtonYaw", - "8033c76a" : "sBehindMarioSoundTimer", - "8033c76c" : "sZeroZoomDist", - "8033c770" : "sCUpCameraPitch", - "8033c772" : "sModeOffsetYaw", - "8033c774" : "sSpiralStairsYawOffset", - "8033c776" : "s8DirModeBaseYaw", - "8033c778" : "s8DirModeYawOffset", - "8033c77c" : "sPanDistance", - "8033c780" : "sCannonYOffset", - "8033c788" : "sModeInfo", - "8033c7d0" : "sCastleEntranceOffset", - "8033c7dc" : "sParTrackIndex", - "8033c7e0" : "sParTrackPath", - "8033c7e8" : "sParTrackTransOff", - "8033c808" : "sCameraStoreCUp", - "8033c828" : "sCameraStoreCutscene", - "8033c848" : "gCameraMovementFlags", - "8033c84a" : "sStatusFlags", - "8033c850" : "sCurCreditsSplinePos", - "8033c950" : "sCurCreditsSplineFocus", - "8033ca50" : "sCutsceneSplineSegment", - "8033ca54" : "sCutsceneSplineSegmentProgress", - "8033ca58" : "unused8033B6E8", - "8033ca5a" : "sCutsceneShot", - "8033ca5c" : "gCutsceneTimer", - "8033ca60" : "sCutsceneVars", - "8033cbc8" : "gObjCutsceneDone", - "8033cbcc" : "gCutsceneObjSpawn", - "8033cbd0" : "gCamera", - "8033cbe0" : "gObjectListArray", - "8033d260" : "gDebugInfoFlags", - "8033d264" : "gNumFindFloorMisses", - "8033d268" : "unused_8033BEF8", - "8033d26c" : "gUnknownWallCount", - "8033d270" : "gObjectCounter", - "8033d274" : "gNumCalls", - "8033d280" : "gDebugInfo", - "8033d380" : "gDebugInfoOverwrite", - "8033d480" : "gTimeStopState", - "8033d488" : "gObjectPool", - "80360e88" : "gMacroObjectDefaultParent", - "803610e8" : "gObjectLists", - "803610f0" : "gFreeObjectList", - "80361158" : "gMarioObject", - "8036115c" : "gLuigiObject", - "80361160" : "gCurrentObject", - "80361164" : "gBehCommand", - "80361168" : "gPrevFrameObjectCount", - "8036116c" : "gSurfaceNodesAllocated", - "80361170" : "gSurfacesAllocated", - "80361174" : "gNumStaticSurfaceNodes", - "80361178" : "gNumStaticSurfaces", - "8036117c" : "gObjectMemoryPool", - "80361180" : "gCheckingSurfaceCollisionsForCamera", - "80361182" : "gFindFloorIncludeSurfaceIntangible", - "80361184" : "gEnvironmentRegions", - "80361188" : "gEnvironmentLevels", - "803611d8" : "gDoorAdjacentRooms", - "80361250" : "gMarioCurrentRoom", - "80361252" : "D_8035FEE2", - "80361254" : "D_8035FEE4", - "80361256" : "gTHIWaterDrained", - "80361258" : "gTTCSpeedSetting", - "8036125a" : "gMarioShotFromCannon", - "8036125c" : "gCCMEnteredSlide", - "8036125e" : "gNumRoomedObjectsInMarioRoom", - "80361260" : "gNumRoomedObjectsNotInMarioRoom", - "80361262" : "gWDWWaterLevelChanging", - "80361264" : "gMarioOnMerryGoRound", - "80361270" : "sGrabReleaseState", - "80361280" : "D_8035FF10", - "80361290" : "gDebugPrintState1", - "803612a0" : "gDebugPrintState2", - "803612b0" : "sMarioOnFlyingCarpet", - "803612b2" : "sSurfaceTypeBelowShadow", - "803612b4" : "gShadowAboveWaterOrLava", - "803612b5" : "gMarioOnIceOrCarpet", - "803612c0" : "sSkyBoxInfo", - "803612e0" : "gMovetexLastTextureId", - "803612f0" : "gFlyingCarpetState", - "80361300" : "gPaintingMarioFloorType", - "80361304" : "gPaintingMarioXPos", - "80361308" : "gPaintingMarioYPos", - "8036130c" : "gPaintingMarioZPos", - "80361310" : "D_8035FFA0", - "80361314" : "D_8035FFA4", - "80361318" : "ripplingPainting", - "8036131c" : "dddStatus", - "80361320" : "sTextLabels", - "803613f0" : "gDialogColorFadeTimer", - "803613f2" : "gLastDialogLineNum", - "803613f4" : "gDialogVariable", - "803613f8" : "gDialogTextAlpha", - "803613fa" : "gCutsceneMsgXOffset", - "803613fc" : "gCutsceneMsgYOffset", - "803613fe" : "gRedCoinsCollected", - "80361400" : "gEnvFxBuffer", - "80361408" : "gSnowCylinderLastPos", - "80361414" : "gSnowParticleCount", - "80361416" : "gSnowParticleMaxCount", - "80361420" : "gEnvFxBubbleConfig", - "80361460" : "sNumActiveFirePiranhaPlants", - "80361464" : "sNumKilledFirePiranhaPlants", - "80361468" : "sObjSavedPosX", - "8036146c" : "sObjSavedPosY", - "80361470" : "sObjSavedPosZ", - "80361474" : "sMontyMoleHoleList", - "80361478" : "sMontyMoleKillStreak", - "8036147c" : "sMontyMoleLastKilledPosX", - "80361480" : "sMontyMoleLastKilledPosY", - "80361484" : "sMontyMoleLastKilledPosZ", - "80361488" : "sMasterTreadmill", - "80361490" : "gCurrAiBuffer", - "80361498" : "sSoundRequests", - "80361c98" : "D_80360928", - "80361f98" : "sUsedChannelsForSoundBank", - "80361fa8" : "sCurrentSound", - "80361fb8" : "gSoundBanks", - "80364b78" : "D_80363808", - "80364b82" : "D_80363812", - "80364b88" : "sBackgroundMusicQueue", - "80364ba0" : "D_80363830", - "80364c20" : "D_803638B0", - "80365e70" : "piMgrThread", - "80366020" : "piMgrStack", - "80367020" : "__osPiMesgQueue", - "80367038" : "piMgrMesgBuff", - "80367040" : "D_80365CD0", - "80367050" : "D_80365CE0", - "8036708c" : "D_80365D1C", - "80367090" : "D_80365D20", - "80367091" : "_osCont_numControllers", - "80367098" : "D_80365D28", - "803670b8" : "_osContMesgQueue", - "803670d0" : "_osContMesgBuff", - "803670f0" : "D_80365D80", - "80367110" : "_osCurrentTime", - "80367118" : "D_80365DA8", - "8036711c" : "__osViIntrCount", - "80367120" : "D_80365DB0", - "80367130" : "osPiMesgBuff", - "80367138" : "gOsPiMessageQueue", - "80367150" : "osSiMesgBuff", - "80367158" : "gOsSiMessageQueue", - "80367170" : "D_80365E00", - "803671ac" : "D_80365E3C", - "803671b0" : "D_80365E40", - "803672b0" : "gInterruptedThread", - "80367460" : "_mainSegmentNoloadEnd", - "0000cee0" : "_mainSegmentNoloadSizeLo", - "00000002" : "_mainSegmentNoloadSizeHi", - "00000001" : "ASSERT", - "80378800" : "_engineSegmentStart", - "007cc6c0" : "_engineSegmentRomStart", - "80378800" : "vec3f_copy", - "80378840" : "vec3f_set", - "8037888c" : "vec3f_add", - "803788e4" : "vec3f_sum", - "8037893c" : "vec3s_copy", - "8037897c" : "vec3s_set", - "803789c8" : "vec3s_add", - "80378a20" : "vec3s_sum", - "80378a78" : "vec3s_sub", - "80378ad0" : "vec3s_to_vec3f", - "80378b34" : "vec3f_to_vec3s", - "80378c50" : "find_vector_perpendicular_to_plane", - "80378d38" : "vec3f_cross", - "80378dc0" : "vec3f_normalize", - "80378e68" : "mtxf_copy", - "80378eb4" : "mtxf_identity", - "80378f24" : "mtxf_translate", - "80378f84" : "mtxf_lookat", - "80379440" : "mtxf_rotate_zxy_and_translate", - "803795f0" : "mtxf_rotate_xyz_and_translate", - "80379798" : "mtxf_billboard", - "80379918" : "mtxf_align_terrain_normal", - "80379aa4" : "mtxf_align_terrain_triangle", - "80379f60" : "mtxf_mul", - "8037a29c" : "mtxf_scale_vec3f", - "8037a348" : "mtxf_mul_vec3s", - "8037a434" : "mtxf_to_mtx", - "8037a4b8" : "mtxf_rotate_xy", - "8037a550" : "get_pos_from_transform_mtx", - "8037a69c" : "vec3f_get_dist_and_angle", - "8037a788" : "vec3f_set_dist_and_angle", - "8037a860" : "approach_s32", - "8037a8b4" : "approach_f32", - "8037a9a8" : "atan2s", - "8037ab88" : "atan2f", - "8037abec" : "spline_get_weights", - "8037afb8" : "anim_spline_init", - "8037afe8" : "anim_spline_poll", - "8037b220" : "init_scene_graph_node_links", - "8037b24c" : "init_graph_node_root", - "8037b30c" : "init_graph_node_ortho_projection", - "8037b380" : "init_graph_node_perspective", - "8037b448" : "init_graph_node_start", - "8037b4ac" : "init_graph_node_master_list", - "8037b530" : "init_graph_node_render_range", - "8037b5b4" : "init_graph_node_switch_case", - "8037b670" : "init_graph_node_camera", - "8037b744" : "init_graph_node_translation_rotation", - "8037b7f8" : "init_graph_node_translation", - "8037b89c" : "init_graph_node_rotation", - "8037b940" : "init_graph_node_scale", - "8037b9e0" : "init_graph_node_object", - "8037bad4" : "init_graph_node_culling_radius", - "8037bb48" : "init_graph_node_animated_part", - "8037bbec" : "init_graph_node_billboard", - "8037bc90" : "init_graph_node_display_list", - "8037bd24" : "init_graph_node_shadow", - "8037bdb4" : "init_graph_node_object_parent", - "8037be28" : "init_graph_node_generated", - "8037becc" : "init_graph_node_background", - "8037bf84" : "init_graph_node_held_object", - "8037c044" : "geo_add_child", - "8037c0bc" : "geo_remove_child", - "8037c138" : "geo_make_first_child", - "8037c1e4" : "geo_call_global_function_nodes_helper", - "8037c360" : "geo_call_global_function_nodes", - "8037c3d0" : "geo_reset_object_node", - "8037c448" : "geo_obj_init", - "8037c51c" : "geo_obj_init_spawninfo", - "8037c658" : "geo_obj_init_animation", - "8037c708" : "geo_obj_init_animation_accel", - "8037c7d8" : "retrieve_animation_index", - "8037c844" : "geo_update_animation_frame", - "8037c9e8" : "geo_retreive_animation_translation", - "8037cb10" : "geo_find_root", - "8037cb60" : "read_vec3s_to_vec3f", - "8037cbc0" : "read_vec3s", - "8037cbfc" : "read_vec3s_angle", - "8037cc74" : "register_scene_graph_node", - "8037cd60" : "geo_layout_cmd_branch_and_link", - "8037ce24" : "geo_layout_cmd_end", - "8037cee8" : "geo_layout_cmd_branch", - "8037cf70" : "geo_layout_cmd_return", - "8037cfc0" : "geo_layout_cmd_open_node", - "8037d018" : "geo_layout_cmd_close_node", - "8037d050" : "geo_layout_cmd_assign_as_view", - "8037d0d0" : "geo_layout_cmd_update_node_flags", - "8037d1d0" : "geo_layout_cmd_node_root", - "8037d328" : "geo_layout_cmd_node_ortho_projection", - "8037d3a4" : "geo_layout_cmd_node_perspective", - "8037d48c" : "geo_layout_cmd_node_start", - "8037d4dc" : "geo_layout_cmd_nop3", - "8037d500" : "geo_layout_cmd_node_master_list", - "8037d55c" : "geo_layout_cmd_node_level_of_detail", - "8037d5d4" : "geo_layout_cmd_node_switch_case", - "8037d640" : "geo_layout_cmd_node_camera", - "8037d6f0" : "geo_layout_cmd_node_translation_rotation", - "8037d8d4" : "geo_layout_cmd_node_translation", - "8037d998" : "geo_layout_cmd_node_rotation", - "8037da5c" : "geo_layout_cmd_node_scale", - "8037db50" : "geo_layout_cmd_nop2", - "8037db74" : "geo_layout_cmd_node_animated_part", - "8037dc10" : "geo_layout_cmd_node_billboard", - "8037dcd4" : "geo_layout_cmd_node_display_list", - "8037dd4c" : "geo_layout_cmd_node_shadow", - "8037dddc" : "geo_layout_cmd_node_object_parent", - "8037de34" : "geo_layout_cmd_node_generated", - "8037de94" : "geo_layout_cmd_node_background", - "8037def8" : "geo_layout_cmd_nop", - "8037df1c" : "geo_layout_cmd_copy_view", - "8037dfd4" : "geo_layout_cmd_node_held_obj", - "8037e058" : "geo_layout_cmd_node_culling_radius", - "8037e0b4" : "process_geo_layout", - "803805c8" : "level_script_execute", - "80380de8" : "f32_find_wall_collision", - "80380e8c" : "find_wall_collisions", - "80381264" : "find_ceil", - "80381470" : "unused_obj_find_floor_height", - "803814b8" : "find_floor_height_and_data", - "80381794" : "find_floor_height", - "803817e0" : "unused_find_dynamic_floor", - "80381900" : "find_floor", - "80381ba0" : "find_water_level", - "80381d3c" : "find_poison_gas_level", - "80381f08" : "debug_surface_list_info", - "80382294" : "unused_resolve_floor_or_ceil_collisions", - "80383340" : "alloc_surface_pools", - "803833b8" : "load_area_terrain", - "803835a4" : "clear_dynamic_surfaces", - "80383614" : "transform_object_vertices", - "80383828" : "load_object_surfaces", - "803839cc" : "load_object_collision_model", - "80383bb0" : "RandomU16", - "80383cb4" : "RandomFloat", - "80383d1c" : "RandomSign", - "80383d68" : "func_80383D68", - "80385bf0" : "stub_80385BF0", - "80385c00" : "cur_object_exec_behavior", - "80385f90" : "identityMtx", - "80385fb0" : "zeroMtx", - "80385fd0" : "gVec3fZero", - "80385fdc" : "gVec3sZero", - "80385fe4" : "gVec3fOne", - "80385ff0" : "gVec3sOne", - "80386000" : "gSineTable", - "80387000" : "gCosineTable", - "8038b000" : "gArctanTable", - "8038b810" : "GeoLayoutJumpTable", - "8038b894" : "unused_8038B894", - "8038bc90" : "_engineSegmentEnd", - "007dfb50" : "_engineSegmentRomEnd", - "8038bc90" : "_engineSegmentNoloadStart", - "8038bc90" : "gSplineKeyframe", - "8038bc94" : "gSplineKeyframeFraction", - "8038bc98" : "gSplineState", - "8038bca0" : "gGraphNodePool", - "8038bca4" : "gCurRootGraphNode", - "8038bca8" : "D_8038BCA8", - "8038bcac" : "gGeoViews", - "8038bcb0" : "gGeoNumViews", - "8038bcb8" : "gGeoLayoutStack", - "8038bcf8" : "gCurGraphNodeList", - "8038bd78" : "gCurGraphNodeIndex", - "8038bd7a" : "gGeoLayoutStackIndex", - "8038bd7c" : "D_8038BD7C", - "8038bd7e" : "gGeoLayoutReturnIndex", - "8038bd80" : "gGeoLayoutCommand", - "8038bd88" : "gObjParentGraphNode", - "8038be30" : "sFloorGeo", - "8038be90" : "unused8038BE90", - "8038be98" : "gStaticSurfacePartition", - "8038d698" : "gDynamicSurfacePartition", - "8038ee98" : "sSurfaceNodePool", - "8038ee9c" : "sSurfacePool", - "8038eea0" : "sSurfacePoolSize", - "8038eea8" : "unused8038EEA8", - "8038eef0" : "_engineSegmentNoloadEnd", - "8038f800" : ".", - "8038f800" : "_framebuffersSegmentNoloadStart", - "8038f800" : "0x70800", - "8038f800" : "gFrameBuffer0", - "803b5000" : "gFrameBuffer1", - "803da800" : "gFrameBuffer2", - "80400000" : "_framebuffersSegmentNoloadEnd", - "80400000" : "__expansionRamStart", - "00000001" : "ASSERT", - "10000000" : "_entrySegmentStart", - "007cc6c0" : "_entrySegmentRomStart", - "10000000" : "level_script_entry", - "10000030" : "_entrySegmentEnd", - "007cc6f0" : "_entrySegmentRomEnd", - "02000000" : "_segment2_mio0SegmentStart", - "007cc6c0" : "_segment2_mio0SegmentRomStart", - "0200bd10" : ".", - "0200bd10" : "_segment2_mio0SegmentEnd", - "007d83d0" : "_segment2_mio0SegmentRomEnd", - "04000000" : "_group0_mio0SegmentStart", - "007cc6c0" : "_group0_mio0SegmentRomStart", - "04013260" : ".", - "04013260" : "_group0_mio0SegmentEnd", - "007df920" : "_group0_mio0SegmentRomEnd", - "17000000" : "_group0_geoSegmentStart", - "007cc6c0" : "_group0_geoSegmentRomStart", - "17000000" : "bubble_geo", - "1700001c" : "purple_marble_geo", - "17000038" : "smoke_geo", - "17000084" : "burn_smoke_geo", - "1700009c" : "spot_on_ground_geo", - "170000e0" : "mario_TODO_geo_0000E0", - "17000124" : "water_waves_surface_geo", - "17000168" : "water_waves_geo", - "170001bc" : "sparkles_geo", - "17000230" : "water_splash_geo", - "17000284" : "sparkles_animation_geo", - "170002e0" : "mario_geo_face_and_wings", - "1700041c" : "mario_geo_left_hand", - "17000494" : "mario_geo_right_hand", - "1700053c" : "mario_geo_body", - "170006f8" : "mario_geo_medium_poly_left_hand", - "17000770" : "mario_geo_medium_poly_right_hand", - "17000818" : "mario_geo_medium_poly_body", - "170009d4" : "mario_geo_low_poly_face_and_wings", - "17000b10" : "mario_geo_low_poly_left_hand", - "17000b88" : "mario_geo_low_poly_right_hand", - "17000c30" : "mario_geo_low_poly_body", - "17000dec" : "mario_vanish_geo_face_and_wings", - "17000f28" : "mario_vanish_geo_left_hand", - "17000fa0" : "mario_vanish_geo_right_hand", - "17001048" : "mario_vanish_geo_body", - "17001204" : "mario_vanish_geo_medium_poly_left_hand", - "1700127c" : "mario_vanish_geo_medium_poly_right_hand", - "17001324" : "mario_vanish_geo_medium_poly_body", - "170014e0" : "mario_vanish_geo_low_poly_face_and_wings", - "1700161c" : "mario_vanish_geo_low_poly_left_hand", - "17001694" : "mario_vanish_geo_low_poly_right_hand", - "1700173c" : "mario_vanish_geo_low_poly_body", - "170018f8" : "mario_metal_geo_face_and_wings", - "170019a4" : "mario_metal_geo_left_hand", - "17001a1c" : "mario_metal_geo_right_hand", - "17001ac4" : "mario_metal_geo_body", - "17001c80" : "mario_metal_geo_medium_poly_left_hand", - "17001cf8" : "mario_metal_geo_medium_poly_right_hand", - "17001da0" : "mario_metal_geo_medium_poly_body", - "17001f5c" : "mario_metal_geo_low_poly_face_and_wings", - "17002008" : "mario_metal_geo_low_poly_left_hand", - "17002080" : "mario_metal_geo_low_poly_right_hand", - "17002128" : "mario_metal_geo_low_poly_body", - "170022e4" : "mario_metal_vanish_geo_face_and_wings", - "17002390" : "mario_metal_vanish_geo_left_hand", - "17002408" : "mario_metal_vanish_geo_right_hand", - "170024b0" : "mario_metal_vanish_geo_body", - "1700266c" : "mario_metal_vanish_geo_medium_poly_left_hand", - "170026e4" : "mario_metal_vanish_geo_medium_poly_right_hand", - "1700278c" : "mario_metal_vanish_geo_medium_poly_body", - "17002958" : "mario_metal_vanish_geo_low_poly_face_and_wings", - "17002a04" : "mario_metal_vanish_geo_low_poly_left_hand", - "17002a7c" : "mario_metal_vanish_geo_low_poly_right_hand", - "17002b24" : "mario_metal_vanish_geo_low_poly_body", - "17002ce0" : "mario_geo_load_body", - "17002d14" : "mario_geo_load_medium_poly_body", - "17002d48" : "mario_geo_load_low_poly_body", - "17002d7c" : "mario_geo_render_body", - "17002dd4" : "mario_geo", - "17002e30" : "_group0_geoSegmentEnd", - "007cf4f0" : "_group0_geoSegmentRomEnd", - "05000000" : "_group1_mio0SegmentStart", - "007cc6c0" : "_group1_mio0SegmentRomStart", - "05008070" : ".", - "05008070" : "_group1_mio0SegmentEnd", - "007d4730" : "_group1_mio0SegmentRomEnd", - "0c000000" : "_group1_geoSegmentStart", - "007cc6c0" : "_group1_geoSegmentRomStart", - "0c000000" : "yellow_sphere_geo", - "0c000018" : "hoot_geo", - "0c0001e4" : "yoshi_egg_geo", - "0c000248" : "thwomp_geo", - "0c000264" : "bullet_bill_geo", - "0c00028c" : "heave_ho_geo", - "0c000410" : "_group1_geoSegmentEnd", - "007ccad0" : "_group1_geoSegmentRomEnd", - "05000000" : "_group2_mio0SegmentStart", - "007cc6c0" : "_group2_mio0SegmentRomStart", - "05001e10" : ".", - "05001e10" : "_group2_mio0SegmentEnd", - "007ce4d0" : "_group2_mio0SegmentRomEnd", - "0c000000" : "_group2_geoSegmentStart", - "007cc6c0" : "_group2_geoSegmentRomStart", - "0c000000" : "bully_geo", - "0c000120" : "bully_boss_geo", - "0c000240" : "blargg_geo", - "0c0002b0" : "_group2_geoSegmentEnd", - "007cc970" : "_group2_geoSegmentRomEnd", - "05000000" : "_group3_mio0SegmentStart", - "007cc6c0" : "_group3_mio0SegmentRomStart", - "050068b0" : ".", - "050068b0" : "_group3_mio0SegmentEnd", - "007d2f70" : "_group3_mio0SegmentRomEnd", - "0c000000" : "_group3_geoSegmentStart", - "007cc6c0" : "_group3_geoSegmentRomStart", - "0c000000" : "king_bobomb_geo", - "0c000308" : "water_bomb_geo", - "0c000328" : "water_bomb_shadow_geo", - "0c000340" : "_group3_geoSegmentEnd", - "007cca00" : "_group3_geoSegmentRomEnd", - "05000000" : "_group4_mio0SegmentStart", - "007cc6c0" : "_group4_mio0SegmentRomStart", - "0500a300" : ".", - "0500a300" : "_group4_mio0SegmentEnd", - "007d69c0" : "_group4_mio0SegmentRomEnd", - "0c000000" : "_group4_geoSegmentStart", - "007cc6c0" : "_group4_geoSegmentRomStart", - "0c000000" : "clam_shell_geo", - "0c000068" : "sushi_geo", - "0c00010c" : "unagi_geo", - "0c000280" : "_group4_geoSegmentEnd", - "007cc940" : "_group4_geoSegmentRomEnd", - "05000000" : "_group5_mio0SegmentStart", - "007cc6c0" : "_group5_mio0SegmentRomStart", - "0500bce0" : ".", - "0500bce0" : "_group5_mio0SegmentEnd", - "007d83a0" : "_group5_mio0SegmentRomEnd", - "0c000000" : "_group5_geoSegmentStart", - "007cc6c0" : "_group5_geoSegmentRomStart", - "0c000000" : "klepto_geo", - "0c0002ac" : "eyerok_geo_0002AC", - "0c0005a8" : "eyerok_left_hand_geo", - "0c0005e4" : "eyerok_right_hand_geo", - "0c000610" : "pokey_head_geo", - "0c000644" : "pokey_body_part_geo", - "0c000660" : "_group5_geoSegmentEnd", - "007ccd20" : "_group5_geoSegmentRomEnd", - "05000000" : "_group6_mio0SegmentStart", - "007cc6c0" : "_group6_mio0SegmentRomStart", - "0500e110" : ".", - "0500e110" : "_group6_mio0SegmentEnd", - "007da7d0" : "_group6_mio0SegmentRomEnd", - "0c000000" : "_group6_geoSegmentStart", - "007cc6c0" : "_group6_geoSegmentRomStart", - "0c000000" : "monty_mole_geo", - "0c000110" : "ukiki_geo", - "0c00036c" : "fwoosh_geo", - "0c000390" : "_group6_geoSegmentEnd", - "007cca50" : "_group6_geoSegmentRomEnd", - "05000000" : "_group7_mio0SegmentStart", - "007cc6c0" : "_group7_mio0SegmentRomStart", - "05005070" : ".", - "05005070" : "_group7_mio0SegmentEnd", - "007d1730" : "_group7_mio0SegmentRomEnd", - "0c000000" : "_group7_geoSegmentStart", - "007cc6c0" : "_group7_geoSegmentRomStart", - "0c000000" : "spindrift_geo", - "0c000104" : "penguin_geo", - "0c00021c" : "mr_blizzard_hidden_geo", - "0c000348" : "mr_blizzard_geo", - "0c000370" : "_group7_geoSegmentEnd", - "007cca30" : "_group7_geoSegmentRomEnd", - "05000000" : "_group8_mio0SegmentStart", - "007cc6c0" : "_group8_mio0SegmentRomStart", - "05001180" : ".", - "05001180" : "_group8_mio0SegmentEnd", - "007cd840" : "_group8_mio0SegmentRomEnd", - "0c000000" : "_group8_geoSegmentStart", - "007cc6c0" : "_group8_geoSegmentRomStart", - "0c000000" : "springboard_top_geo", - "0c000018" : "springboard_spring_geo", - "0c000030" : "springboard_bottom_geo", - "0c000048" : "cap_switch_geo", - "0c000090" : "_group8_geoSegmentEnd", - "007cc750" : "_group8_geoSegmentRomEnd", - "05000000" : "_group9_mio0SegmentStart", - "007cc6c0" : "_group9_mio0SegmentRomStart", - "05006960" : ".", - "05006960" : "_group9_mio0SegmentEnd", - "007d3020" : "_group9_mio0SegmentRomEnd", - "0c000000" : "_group9_geoSegmentStart", - "007cc6c0" : "_group9_geoSegmentRomStart", - "0c000000" : "bookend_part_geo", - "0c0000c0" : "bookend_geo", - "0c0000d8" : "haunted_chair_geo", - "0c000188" : "small_key_geo", - "0c0001b4" : "mad_piano_geo", - "0c000224" : "boo_geo", - "0c000274" : "haunted_cage_geo", - "0c0002b0" : "_group9_geoSegmentEnd", - "007cc970" : "_group9_geoSegmentRomEnd", - "05000000" : "_group10_mio0SegmentStart", - "007cc6c0" : "_group10_mio0SegmentRomStart", - "05012cd0" : ".", - "05012cd0" : "_group10_mio0SegmentEnd", - "007df390" : "_group10_mio0SegmentRomEnd", - "0c000000" : "_group10_geoSegmentStart", - "007cc6c0" : "_group10_geoSegmentRomStart", - "0c000000" : "birds_geo", - "0c000098" : "peach_geo_000098", - "0c000254" : "peach_geo_000254", - "0c000410" : "peach_geo", - "0c000468" : "yoshi_geo", - "0c000670" : "_group10_geoSegmentEnd", - "007ccd30" : "_group10_geoSegmentRomEnd", - "05000000" : "_group11_mio0SegmentStart", - "007cc6c0" : "_group11_mio0SegmentRomStart", - "050073f0" : ".", - "050073f0" : "_group11_mio0SegmentEnd", - "007d3ab0" : "_group11_mio0SegmentRomEnd", - "0c000000" : "_group11_geoSegmentStart", - "007cc6c0" : "_group11_geoSegmentRomStart", - "0c000000" : "bubba_geo", - "0c000030" : "wiggler_head_geo", - "0c0001bc" : "enemy_lakitu_geo", - "0c000290" : "spiny_ball_geo", - "0c000328" : "spiny_geo", - "0c0004a0" : "_group11_geoSegmentEnd", - "007ccb60" : "_group11_geoSegmentRomEnd", - "06000000" : "_group12_mio0SegmentStart", - "007cc6c0" : "_group12_mio0SegmentRomStart", - "06030c30" : ".", - "06030c30" : "_group12_mio0SegmentEnd", - "007fd2f0" : "_group12_mio0SegmentRomEnd", - "0d000000" : "_group12_geoSegmentStart", - "007cc6c0" : "_group12_geoSegmentRomStart", - "0d000000" : "bowser_flames_geo", - "0d000090" : "invisible_bowser_accessory_geo", - "0d0000b0" : "bowser_1_yellow_sphere_geo", - "0d0000d8" : "bowser_geo_0000D8", - "0d000424" : "bowser_geo_000424", - "0d000770" : "bowser_geo_000770", - "0d000ab8" : "bowser_shadow_geo", - "0d000ac4" : "bowser_geo", - "0d000b40" : "bowser2_geo", - "0d000bbc" : "bowser_bomb_geo", - "0d000bfc" : "bowser_impact_smoke_geo", - "0d000c50" : "_group12_geoSegmentEnd", - "007cd310" : "_group12_geoSegmentRomEnd", - "06000000" : "_group13_mio0SegmentStart", - "007cc6c0" : "_group13_mio0SegmentRomStart", - "0600a0f0" : ".", - "0600a0f0" : "_group13_mio0SegmentEnd", - "007d67b0" : "_group13_mio0SegmentRomEnd", - "0d000000" : "_group13_geoSegmentStart", - "007cc6c0" : "_group13_geoSegmentRomStart", - "0d000000" : "skeeter_geo", - "0d000284" : "seaweed_geo", - "0d0002f4" : "water_mine_geo", - "0d000324" : "cyan_fish_geo", - "0d00038c" : "bub_geo", - "0d000414" : "water_ring_geo", - "0d000450" : "treasure_chest_base_geo", - "0d000468" : "treasure_chest_lid_geo", - "0d000480" : "_group13_geoSegmentEnd", - "007ccb40" : "_group13_geoSegmentRomEnd", - "06000000" : "_group14_mio0SegmentStart", - "007cc6c0" : "_group14_mio0SegmentRomStart", - "06013a60" : ".", - "06013a60" : "_group14_mio0SegmentEnd", - "007e0120" : "_group14_mio0SegmentRomEnd", - "0d000000" : "_group14_geoSegmentStart", - "007cc6c0" : "_group14_geoSegmentRomStart", - "0d000000" : "koopa_flag_geo", - "0d0000b8" : "wooden_post_geo", - "0d0000d0" : "koopa_without_shell_geo", - "0d000214" : "koopa_with_shell_geo", - "0d000358" : "piranha_plant_geo", - "0d000480" : "whomp_geo", - "0d0005d0" : "metallic_ball_geo", - "0d0005ec" : "chain_chomp_geo", - "0d000680" : "_group14_geoSegmentEnd", - "007ccd40" : "_group14_geoSegmentRomEnd", - "06000000" : "_group15_mio0SegmentStart", - "007cc6c0" : "_group15_mio0SegmentRomStart", - "0600c8e0" : ".", - "0600c8e0" : "_group15_mio0SegmentEnd", - "007d8fa0" : "_group15_mio0SegmentRomEnd", - "0d000000" : "_group15_geoSegmentStart", - "007cc6c0" : "_group15_geoSegmentRomStart", - "0d000000" : "lakitu_geo", - "0d000114" : "toad_geo_000114", - "0d00027c" : "toad_geo_00027C", - "0d0003e4" : "toad_geo", - "0d000448" : "mips_geo", - "0d0005b0" : "boo_castle_geo", - "0d000600" : "_group15_geoSegmentEnd", - "007cccc0" : "_group15_geoSegmentRomEnd", - "06000000" : "_group16_mio0SegmentStart", - "007cc6c0" : "_group16_mio0SegmentRomStart", - "06002ba0" : ".", - "06002ba0" : "_group16_mio0SegmentEnd", - "007cf260" : "_group16_mio0SegmentRomEnd", - "0d000000" : "_group16_geoSegmentStart", - "007cc6c0" : "_group16_geoSegmentRomStart", - "0d000000" : "moneybag_geo_000000", - "0d000078" : "moneybag_geo_000078", - "0d0000f0" : "moneybag_geo", - "0d000150" : "_group16_geoSegmentEnd", - "007cc810" : "_group16_geoSegmentRomEnd", - "06000000" : "_group17_mio0SegmentStart", - "007cc6c0" : "_group17_mio0SegmentRomStart", - "06009c50" : ".", - "06009c50" : "_group17_mio0SegmentEnd", - "007d6310" : "_group17_mio0SegmentRomEnd", - "0d000000" : "_group17_geoSegmentStart", - "007cc6c0" : "_group17_geoSegmentRomStart", - "0d000000" : "mr_i_geo", - "0d00001c" : "mr_i_iris_geo", - "0d0000dc" : "swoop_geo", - "0d0001a0" : "snufit_geo", - "0d000230" : "dorrie_geo", - "0d000394" : "scuttlebug_geo", - "0d0006d0" : "_group17_geoSegmentEnd", - "007ccd90" : "_group17_geoSegmentRomEnd", - "08000000" : "_common0_mio0SegmentStart", - "007cc6c0" : "_common0_mio0SegmentRomStart", - "0800e6d0" : ".", - "0800e6d0" : "_common0_mio0SegmentEnd", - "007dad90" : "_common0_mio0SegmentRomEnd", - "0f000000" : "_common0_geoSegmentStart", - "007cc6c0" : "_common0_geoSegmentRomStart", - "0f000000" : "blue_coin_switch_geo", - "0f000020" : "test_platform_geo", - "0f000028" : "amp_geo", - "0f0001a8" : "cannon_base_geo", - "0f0001c0" : "cannon_barrel_geo", - "0f0001d8" : "chuckya_geo", - "0f0004cc" : "purple_switch_geo", - "0f0004e4" : "checkerboard_platform_geo", - "0f0004fc" : "heart_geo", - "0f000518" : "flyguy_geo", - "0f0005d0" : "breakable_box_geo", - "0f000610" : "breakable_box_small_geo", - "0f000640" : "bowling_ball_geo", - "0f00066c" : "bowling_ball_track_geo", - "0f000694" : "exclamation_box_geo", - "0f0006e4" : "goomba_geo", - "0f0007b8" : "black_bobomb_geo", - "0f0008f4" : "bobomb_buddy_geo", - "0f000a30" : "metal_box_geo", - "0f000a58" : "exclamation_box_outline_geo", - "0f000ab0" : "koopa_shell_geo", - "0f000adc" : "koopa_shell2_geo", - "0f000b08" : "koopa_shell3_geo", - "0f000b40" : "_common0_geoSegmentEnd", - "007cd200" : "_common0_geoSegmentRomEnd", - "03000000" : "_common1_mio0SegmentStart", - "007cc6c0" : "_common1_mio0SegmentRomStart", - "03017990" : ".", - "03017990" : "_common1_mio0SegmentEnd", - "007e4050" : "_common1_mio0SegmentRomEnd", - "16000000" : "_common1_geoSegmentStart", - "007cc6c0" : "_common1_geoSegmentRomStart", - "16000000" : "mist_geo", - "16000020" : "white_puff_geo", - "16000040" : "explosion_geo", - "160000a8" : "butterfly_geo", - "1600013c" : "yellow_coin_geo", - "160001a0" : "yellow_coin_no_shadow_geo", - "16000200" : "blue_coin_geo", - "16000264" : "blue_coin_no_shadow_geo", - "160002c4" : "red_coin_geo", - "16000328" : "red_coin_no_shadow_geo", - "16000388" : "warp_pipe_geo", - "160003a8" : "castle_door_geo", - "1600043c" : "cabin_door_geo", - "160004d0" : "wooden_door_geo", - "16000564" : "wooden_door2_geo", - "160005f8" : "metal_door_geo", - "1600068c" : "hazy_maze_door_geo", - "16000720" : "haunted_door_geo", - "160007b4" : "castle_door_0_star_geo", - "16000868" : "castle_door_1_star_geo", - "1600091c" : "castle_door_3_stars_geo", - "160009d0" : "key_door_geo", - "16000a84" : "bowser_key_geo", - "16000ab0" : "bowser_key_cutscene_geo", - "16000b10" : "red_flame_shadow_geo", - "16000b2c" : "red_flame_geo", - "16000b8c" : "blue_flame_geo", - "16000bec" : "fish_shadow_geo", - "16000c44" : "fish_geo", - "16000c8c" : "leaves_geo", - "16000ca4" : "marios_cap_geo", - "16000cf0" : "marios_metal_cap_geo", - "16000d3c" : "marios_wing_cap_geo", - "16000da8" : "marios_winged_metal_cap_geo", - "16000e14" : "number_geo", - "16000e84" : "mushroom_1up_geo", - "16000ea0" : "star_geo", - "16000ed4" : "dirt_animation_geo", - "16000f24" : "cartoon_star_geo", - "16000f6c" : "transparent_star_geo", - "16000f98" : "white_particle_geo", - "16000fb4" : "wooden_signpost_geo", - "16000fe8" : "bubbly_tree_geo", - "16001000" : "spiky_tree_geo", - "16001018" : "snow_tree_geo", - "16001030" : "spiky_tree1_geo", - "16001048" : "palm_tree_geo", - "16001060" : "_common1_geoSegmentEnd", - "007cd720" : "_common1_geoSegmentRomEnd", - "13000000" : "_behaviorSegmentStart", - "007cc6c0" : "_behaviorSegmentRomStart", - "13000000" : "bhvStarDoor", - "13000054" : "bhvMrI", - "1300008c" : "bhvMrIBody", - "130000ac" : "bhvMrIParticle", - "130000f8" : "bhvPurpleParticle", - "13000118" : "bhvGiantPole", - "13000144" : "bhvPoleGrabbing", - "13000174" : "bhvThiHugeIslandTop", - "13000194" : "bhvThiTinyIslandTop", - "130001ac" : "bhvCapSwitchBase", - "130001cc" : "bhvCapSwitch", - "130001f4" : "bhvKingBobomb", - "13000254" : "bhvBobombAnchorMario", - "13000278" : "bhvBetaChestBottom", - "1300029c" : "bhvBetaChestLid", - "130002b8" : "bhvBubbleMario", - "130002e4" : "bhvBubbleMaybe", - "13000338" : "bhvSmallWaterWave", - "13000398" : "bhvSmallWaterWave398", - "130003bc" : "bhvWaterAirBubble", - "13000400" : "bhvSmallParticle", - "13000428" : "bhvWaterWaves", - "13000444" : "bhvSmallParticleSnow", - "1300046c" : "bhvSmallParticleBubbles", - "13000494" : "bhvFishGroup", - "130004a8" : "bhvCannon", - "130004e4" : "bhvCannonBarrel", - "13000500" : "bhvCannonBaseUnused", - "13000528" : "bhvChuckya", - "13000584" : "bhvChuckyaAnchorMario", - "130005a8" : "bhvUnused05A8", - "130005b4" : "bhvRotatingPlatform", - "130005d8" : "bhvTower", - "13000600" : "bhvBulletBillCannon", - "13000624" : "bhvWfBreakableWallRight", - "13000638" : "bhvWfBreakableWallLeft", - "1300066c" : "bhvKickableBoard", - "130006a4" : "bhvTowerDoor", - "130006d8" : "bhvRotatingCounterClockwise", - "130006e0" : "bhvWfRotatingWoodenPlatform", - "13000708" : "bhvKoopaShellUnderwater", - "13000720" : "bhvExitPodiumWarp", - "1300075c" : "bhvFadingWarp", - "13000780" : "bhvWarp", - "130007a0" : "bhvWarpPipe", - "130007dc" : "bhvWhitePuffExplosion", - "130007f8" : "bhvSpawnedStar", - "1300080c" : "bhvSpawnedStarNoLevelExit", - "13000830" : "bhvMrIBlueCoin", - "13000888" : "bhvCoinInsideBoo", - "130008d0" : "bhvCoinFormationSpawn", - "130008ec" : "bhvCoinFormation", - "1300090c" : "bhvOneCoin", - "1300091c" : "bhvYellowCoin", - "13000940" : "bhvTemporaryYellowCoin", - "13000964" : "bhvThreeCoinsSpawn", - "13000984" : "bhvTenCoinsSpawn", - "130009a4" : "bhvSingleCoinGetsSpawned", - "130009e0" : "bhvCoinSparkles", - "13000a14" : "bhvGoldenCoinSparkles", - "13000a34" : "bhvWallTinyStarParticle", - "13000a54" : "bhvWallTinyStarParticleSpawn", - "13000a78" : "bhvPoundTinyStarParticle", - "13000a98" : "bhvPoundTinyStarParticleSpawn", - "13000abc" : "bhvPunchTinyTriangle", - "13000ad8" : "bhvPunchTinyTriangleSpawn", - "13000afc" : "bhvDoorWarp", - "13000b0c" : "bhvDoor", - "13000b58" : "bhvGrindel", - "13000b8c" : "bhvThwomp2", - "13000bc8" : "bhvThwomp", - "13000c04" : "bhvTumblingBridgePlatform", - "13000c28" : "bhvWfTumblingBridge", - "13000c44" : "bhvBbhTumblingBridge", - "13000c64" : "bhvLllTumblingBridge", - "13000c84" : "bhvFlame", - "13000cc8" : "bhvAnotherElavator", - "13000cfc" : "bhvRrElevatorPlatform", - "13000d30" : "bhvHmcElevatorPlatform", - "13000d6c" : "bhvWaterMist", - "13000d98" : "bhvWaterMistSpawn", - "13000db4" : "bhvBreakBoxTriangle", - "13000dd8" : "bhvWaterMist2", - "13000dfc" : "bhvUnused0DFC", - "13000e24" : "bhvPoundWhitePuffs", - "13000e3c" : "bhvGroundSand", - "13000e58" : "bhvGroundSnow", - "13000e70" : "bhvWind", - "13000e88" : "bhvEndToad", - "13000eac" : "bhvEndPeach", - "13000ed0" : "bhvUnusedParticleSpawn", - "13000f08" : "bhvUkiki", - "13000f14" : "bhvUkikiCageChild", - "13000f2c" : "bhvUkikiCageStar", - "13000f48" : "bhvUkikiCage", - "13000f9c" : "bhvBitfsSinkingPlatforms", - "13000fc8" : "bhvBitfsSinkingCagePlatform", - "13001000" : "bhvDddMovingPole", - "13001030" : "bhvBitfsTiltingInvertedPyramid", - "13001064" : "bhvSquishablePlatform", - "13001098" : "bhvCutOutObject", - "130010a8" : "bhvBetaMovingFlamesSpawn", - "130010b8" : "bhvBetaMovingFlames", - "130010d8" : "bhvRrRotatingBridgePlatform", - "13001108" : "bhvFlamethrower", - "13001124" : "bhvFlamethrowerFlame", - "13001168" : "bhvBouncingFireball", - "13001184" : "bhvBouncingFireballFlame", - "130011d0" : "bhvBowserShockWave", - "130011ec" : "bhvFlameMario", - "13001214" : "bhvBlackSmokeMario", - "13001254" : "bhvBlackSmokeBowser", - "1300127c" : "bhvBlackSmokeUpward", - "13001298" : "bhvBetaFishSplashSpawner", - "130012b4" : "bhvSpindrift", - "130012f4" : "bhvTowerPlatformGroup", - "13001318" : "bhvWfSlidingTowerPlatform", - "13001340" : "bhvWfElevatorTowerPlatform", - "13001368" : "bhvWfSolidTowerPlatform", - "13001390" : "bhvSnowLeafParticleSpawn", - "130013a8" : "bhvTreeSnow", - "130013c4" : "bhvTreeLeaf", - "130013dc" : "bhvAnotherTiltingPlatform", - "13001408" : "bhvSquarishPathMoving", - "1300142c" : "bhvPiranhaPlantBubble", - "13001448" : "bhvPiranhaPlantWakingBubbles", - "13001468" : "bhvFloorSwitchAnimatesObject", - "13001478" : "bhvFloorSwitchGrills", - "13001484" : "bhvFloorSwitchHardcodedModel", - "130014ac" : "bhvFloorSwitchHiddenObjects", - "130014bc" : "bhvHiddenObject", - "130014e0" : "bhvBreakableBox", - "13001518" : "bhvPushableMetalBox", - "13001548" : "bhvHeaveHo", - "130015a4" : "bhvHeaveHoThrowMario", - "130015c0" : "bhvCcmTouchedStarSpawn", - "130015e4" : "bhvUnusedPoundablePlatform", - "13001608" : "bhvBetaTrampolineTop", - "13001634" : "bhvBetaTrampolineSpring", - "13001650" : "bhvJumpingBox", - "1300167c" : "bhvBooCage", - "130016ac" : "bhvStub", - "130016b8" : "bhvIgloo", - "130016e4" : "bhvBowserKey", - "13001714" : "bhvGrandStar", - "13001744" : "bhvBetaBooKey", - "13001778" : "bhvAlphaBooKey", - "1300179c" : "bhvBulletBill", - "130017f4" : "bhvWhitePuffSmoke", - "13001820" : "bhvUnused1820", - "13001828" : "bhvBowserTailAnchor", - "13001850" : "bhvBowser", - "130018cc" : "bhvBowserBodyAnchor", - "13001904" : "bhvBowserFlameSpawn", - "13001920" : "bhvTiltingBowserLavaPlatform", - "13001958" : "bhvFallingBowserPlatform", - "13001984" : "bhvBlueBowserFlame", - "130019c8" : "bhvFlameFloatingLanding", - "13001a0c" : "bhvBlueFlamesGroup", - "13001a30" : "bhvFlameBouncing", - "13001a74" : "bhvFlameMovingForwardGrowing", - "13001aa4" : "bhvFlameBowser", - "13001ae8" : "bhvFlameLargeBurningOut", - "13001b2c" : "bhvBlueFish", - "13001b54" : "bhvTankFishGroup", - "13001b70" : "bhvCheckerboardElevatorGroup", - "13001b88" : "bhvCheckerboardPlatformSub", - "13001bb4" : "bhvBowserKeyUnlockDoor", - "13001bd4" : "bhvBowserKeyCourseExit", - "13001bf4" : "bhvInvisibleObjectsUnderBridge", - "13001c04" : "bhvWaterLevelPillar", - "13001c34" : "bhvDddWarp", - "13001c58" : "bhvMoatGrills", - "13001c7c" : "bhvClockMinuteHand", - "13001c8c" : "bhvClockHourHand", - "13001cb0" : "bhvMacroUkiki", - "13001d0c" : "bhvStub1D0C", - "13001d14" : "bhvLllRotatingHexagonalPlatform", - "13001d40" : "bhvLllSinkingRockBlock", - "13001d70" : "bhvStub1D70", - "13001d78" : "bhvLllMovingOctagonalMeshPlatform", - "13001da4" : "bhvSnowBall", - "13001da8" : "bhvLllRotatingBlockWithFireBars", - "13001dcc" : "bhvLllRotatingHexFlame", - "13001e04" : "bhvLllWoodPiece", - "13001e30" : "bhvLllFloatingWoodBridge", - "13001e4c" : "bhvVolcanoFlames", - "13001e6c" : "bhvLllRotatingHexagonalRing", - "13001e94" : "bhvLllSinkingRectangularPlatform", - "13001ec4" : "bhvLllSinkingSquarePlatforms", - "13001ef8" : "bhvLllTiltingInvertedPyramid", - "13001f30" : "bhvUnused1F30", - "13001f3c" : "bhvKoopaShell", - "13001f68" : "bhvKoopaShellFlame", - "13001f90" : "bhvToxBox", - "13001fbc" : "bhvPiranhaPlant", - "13002018" : "bhvLllHexagonalMesh", - "13002038" : "bhvLllBowserPuzzlePiece", - "13002068" : "bhvLllBowserPuzzle", - "13002088" : "bhvTuxiesMother", - "130020d8" : "bhvPenguinBaby", - "130020e0" : "bhvUnused20E0", - "130020e8" : "bhvSmallPenguin", - "1300213c" : "bhvFish2", - "1300214c" : "bhvFish3", - "1300215c" : "bhvLargeFishGroup", - "13002178" : "bhvFishGroup2", - "13002194" : "bhvWdwExpressElevator", - "130021c0" : "bhvWdwExpressElevatorPlatform", - "130021e4" : "bhvChirpChirp", - "130021f4" : "bhvChirpChirpUnused", - "1300220c" : "bhvBub", - "13002250" : "bhvExclamationBox", - "1300227c" : "bhvRotatingExclamationMark", - "1300229c" : "bhvSoundSpawner", - "130022b8" : "bhvRockSolid", - "130022d8" : "bhvBowserSubDoor", - "13002308" : "bhvBowsersSub", - "13002338" : "bhvSushiShark", - "13002388" : "bhvSushiSharkCollisionChild", - "130023a4" : "bhvJrbSlidingBox", - "130023d0" : "bhvShipPart3", - "130023ec" : "bhvInSunkenShip3", - "1300241c" : "bhvSunkenShipPart", - "1300243c" : "bhvSunkenShipSetRotation", - "1300244c" : "bhvSunkenShipPart2", - "1300246c" : "bhvInSunkenShip", - "13002480" : "bhvInSunkenShip2", - "130024ac" : "bhvMarioDustGenerator", - "130024dc" : "bhvWhitePuff1", - "13002500" : "bhvWhitePuff2", - "13002528" : "bhvWhitePuffSmoke2", - "13002558" : "bhvPurpleSwitchHiddenBoxes", - "13002568" : "bhvBlueCoinSwitch", - "13002588" : "bhvHiddenBlueCoin", - "130025c0" : "bhvOpenableCageDoor", - "130025e0" : "bhvOpenableGrill", - "130025f8" : "bhvWaterLevelDiamond", - "13002620" : "bhvInitializeChangingWaterLevel", - "13002634" : "bhvTweesterSandParticle", - "13002650" : "bhvTweester", - "13002684" : "bhvMerryGoRoundBooManager", - "1300269c" : "bhvAnimatedTexture", - "130026d4" : "bhvBooInCastle", - "13002710" : "bhvBooWithCage", - "13002768" : "bhvBalconyBigBoo", - "1300277c" : "bhvMerryGoRoundBigBoo", - "13002790" : "bhvGhostHuntBigBoo", - "130027d0" : "bhvCourtyardBooTriplet", - "130027e4" : "bhvBoo", - "130027f4" : "bhvMerryGoRoundBoo", - "13002804" : "bhvGhostHuntBoo", - "1300286c" : "bhvHiddenStaircaseStep", - "13002898" : "bhvBooBossSpawnedBridge", - "130028cc" : "bhvBbhTiltingTrapPlatform", - "130028fc" : "bhvHauntedBookshelf", - "1300292c" : "bhvMeshElevator", - "13002968" : "bhvMerryGoRound", - "13002998" : "bhvPlaysMusicTrackWhenTouched", - "130029b0" : "bhvInsideCannon", - "130029b4" : "bhvBetaBowserAnchor", - "130029e4" : "bhvStaticCheckeredPlatform", - "13002a10" : "bhvUnused2A10", - "13002a20" : "bhvUnusedFakeStar", - "13002a48" : "bhvStaticObject", - "13002a54" : "bhvUnused2A54", - "13002a5c" : "bhvCastleFloorTrap", - "13002a7c" : "bhvFloorTrapInCastle", - "13002aa4" : "bhvTree", - "13002ad0" : "bhvSparkle", - "13002af0" : "bhvSparkleSpawn", - "13002b08" : "bhvSpecialTripleJumpSparkles", - "13002b5c" : "bhvScuttlebug", - "13002ba0" : "bhvScuttlebugSpawn", - "13002bb8" : "bhvWhompKingBoss", - "13002bcc" : "bhvSmallWhomp", - "13002c14" : "bhvWaterSplash", - "13002c60" : "bhvWaterDrops", - "13002c7c" : "bhvWaterSurfaceWhiteWave", - "13002cb0" : "bhvObjectBubbleRipples", - "13002ce0" : "bhvSurfaceWaves", - "13002d28" : "bhvWaterSurfaceWhiteWave2", - "13002d50" : "bhvWavesGenerator", - "13002d7c" : "bhvSurfaceWaveShrinking", - "13002db0" : "bhvWaterType", - "13002dc0" : "bhvWaveTrailOnSurface", - "13002e04" : "bhvTinyWhiteWindParticle", - "13002e20" : "bhvWindParticle", - "13002e3c" : "bhvSnowmanWindBlowing", - "13002e58" : "bhvWalkingPenguin", - "13002ea8" : "bhvYellowBall", - "13002ec0" : "bhvMario", - "13002ef8" : "bhvToadMessage", - "13002f40" : "bhvUnlockDoorStar", - "13002f60" : "bhvWarps60", - "13002f64" : "bhvWarps64", - "13002f68" : "bhvWarps68", - "13002f6c" : "bhvWarps6C", - "13002f70" : "bhvWarps70", - "13002f74" : "bhvWarps74", - "13002f78" : "bhvWarps78", - "13002f7c" : "bhvWarps7C", - "13002f80" : "bhvWarps80", - "13002f84" : "bhvWarps84", - "13002f88" : "bhvWarps88", - "13002f8c" : "bhvWarps8C", - "13002f90" : "bhvWarps90", - "13002f94" : "bhvWarps94", - "13002fa0" : "bhvRandomAnimatedTexture", - "13002fc0" : "bhvYellowBackgroundInMenu", - "13002fe4" : "bhvMenuButton", - "13003008" : "bhvMenuButtonManager", - "1300302c" : "bhvActSelectorStarType", - "13003048" : "bhvActSelector", - "13003068" : "bhvMovingYellowCoin", - "130030a4" : "bhvMovingBlueCoin", - "130030d4" : "bhvBlueCoinSliding", - "13003104" : "bhvBlueCoinJumping", - "13003134" : "bhvSeaweed", - "13003158" : "bhvSeaweedBundle", - "13003174" : "bhvBobomb", - "130031ac" : "bhvBobombFuseSmoke", - "130031dc" : "bhvBobombBuddy", - "13003228" : "bhvBobombBuddyOpensCannon", - "13003274" : "bhvCannonClosed", - "130032a8" : "bhvWhirlpool", - "130032c8" : "bhvJetStream", - "130032e0" : "bhvMessagePanel", - "13003324" : "bhvSignOnWall", - "13003354" : "bhvHomingAmp", - "13003388" : "bhvCirclingAmp", - "130033bc" : "bhvButterfly", - "130033ec" : "bhvHoot", - "13003420" : "bhvBetaHoldableObject", - "13003454" : "bhvCarrySomething1", - "1300345c" : "bhvCarrySomething2", - "13003464" : "bhvCarrySomething3", - "1300346c" : "bhvCarrySomething4", - "13003474" : "bhvCarrySomething5", - "1300347c" : "bhvCarrySomething6", - "13003484" : "bhvObjectBubble", - "130034c4" : "bhvObjectWaterWave", - "13003510" : "bhvExplosion", - "13003558" : "bhvBobombBullyDeathSmoke", - "13003588" : "bhvSmoke", - "130035b0" : "bhvBobombExplosionBubble", - "13003600" : "bhvBobombExplosionBubble3600", - "13003614" : "bhvRespawner", - "1300362c" : "bhvSmallBully", - "13003660" : "bhvBigBully", - "13003694" : "bhvBigBullyWithMinions", - "130036c8" : "bhvSmallChillBully", - "13003700" : "bhvBigChillBully", - "13003738" : "bhvJetStreamRingSpawner", - "13003750" : "bhvJetStreamWaterRing", - "13003798" : "bhvMantaRayWaterRing", - "130037e0" : "bhvMantaRayRingManager", - "130037ec" : "bhvBowserBomb", - "1300381c" : "bhvBowserBombExplosion", - "13003840" : "bhvBowserBombSmoke", - "13003868" : "bhvCelebrationStar", - "13003888" : "bhvCelebrationStarSparkle", - "130038b0" : "bhvStarKeyCollectionPuffSpawner", - "130038d0" : "bhvLllDrawbridgeSpawner", - "130038e8" : "bhvLllDrawbridge", - "13003910" : "bhvSmallBomp", - "13003940" : "bhvLargeBomp", - "13003970" : "bhvWfSlidingPlatform", - "130039a0" : "bhvMoneybag", - "130039d4" : "bhvMoneybagHidden", - "13003a08" : "bhvPitBowlingBall", - "13003a30" : "bhvFreeBowlingBall", - "13003a58" : "bhvBowlingBall", - "13003a80" : "bhvTtmBowlingBallSpawner", - "13003aa4" : "bhvBobBowlingBallSpawner", - "13003ac8" : "bhvThiBowlingBallSpawner", - "13003ae0" : "bhvRrCruiserWing", - "13003b00" : "bhvSpindel", - "13003b30" : "bhvSslMovingPyramidWall", - "13003b60" : "bhvPyramidElevator", - "13003b98" : "bhvPyramidElevatorTrajectoryMarkerBall", - "13003bb4" : "bhvPyramidTop", - "13003bec" : "bhvPyramidTopFragment", - "13003c0c" : "bhvPyramidPillarTouchDetector", - "13003c30" : "bhvWaterfallSoundLoop", - "13003c44" : "bhvVolcanoSoundLoop", - "13003c58" : "bhvCastleFlagWaving", - "13003c7c" : "bhvBirdsSoundLoop", - "13003c90" : "bhvAmbientSounds", - "13003ca4" : "bhvSandSoundLoop", - "13003cb8" : "bhvHiddenAt120Stars", - "13003ce4" : "bhvSnowmansBottom", - "13003d0c" : "bhvSnowmansHead", - "13003d34" : "bhvSnowmansBodyCheckpoint", - "13003d4c" : "bhvBigSnowmanWhole", - "13003d74" : "bhvBigBoulder", - "13003da0" : "bhvBigBoulderGenerator", - "13003db8" : "bhvWingCap", - "13003dd8" : "bhvMetalCap", - "13003df8" : "bhvNormalCap", - "13003e1c" : "bhvVanishCap", - "13003e3c" : "bhvStar", - "13003e64" : "bhvStarSpawnCoordinates", - "13003e8c" : "bhvHiddenRedCoinStar", - "13003eac" : "bhvRedCoin", - "13003ee4" : "bhvBowserCourseRedCoinStar", - "13003efc" : "bhvHiddenStar", - "13003f1c" : "bhvHiddenStarTrigger", - "13003f40" : "bhvTtmRollingLog", - "13003f78" : "bhvLllVolcanoFallingTrap", - "13003fa4" : "bhvLllRollingLog", - "13003fdc" : "bhv1upWalking", - "13004010" : "bhv1upRunningAway", - "13004044" : "bhv1upSliding", - "1300407c" : "bhv1Up", - "130040b4" : "bhv1upJumpOnApproach", - "130040ec" : "bhvHidden1up", - "13004124" : "bhvHidden1upTrigger", - "13004148" : "bhvHidden1upInPole", - "13004180" : "bhvHidden1upInPoleTrigger", - "130041a4" : "bhvHidden1upInPoleSpawner", - "130041bc" : "bhvControllablePlatform", - "130041f0" : "bhvControllablePlatformSub", - "13004218" : "bhvBreakableBoxSmall", - "13004244" : "bhvSlidingSnowMound", - "13004270" : "bhvSnowMoundSpawn", - "13004284" : "bhvWdwSquareFloatingPlatform", - "130042b4" : "bhvWdwRectangularFloatingPlatform", - "130042e4" : "bhvJrbFloatingPlatform", - "13004314" : "bhvArrowLift", - "13004348" : "bhvOrangeNumber", - "13004370" : "bhvMantaRay", - "130043a0" : "bhvFallingPillar", - "130043c4" : "bhvFallingPillarHitbox", - "130043e0" : "bhvPillarBase", - "13004400" : "bhvJrbFloatingBox", - "1300442c" : "bhvDecorativePendulum", - "1300444c" : "bhvTreasureChestsShip", - "13004470" : "bhvTreasureChestsJrb", - "13004494" : "bhvTreasureChests", - "130044b8" : "bhvTreasureChestBottom", - "130044e0" : "bhvTreasureChestTop", - "130044fc" : "bhvMips", - "13004538" : "bhvYoshi", - "13004580" : "bhvKoopa", - "130045d0" : "bhvKoopaRaceEndpoint", - "130045f8" : "bhvKoopaFlag", - "13004634" : "bhvPokey", - "13004668" : "bhvPokeyBodyPart", - "13004698" : "bhvSwoop", - "130046dc" : "bhvFlyGuy", - "1300472c" : "bhvGoomba", - "13004770" : "bhvGoombaTripletSpawner", - "1300478c" : "bhvChainChomp", - "130047e4" : "bhvChainChompChainPart", - "1300481c" : "bhvWoodenPost", - "13004868" : "bhvChainChompGate", - "13004898" : "bhvWigglerHead", - "130048e0" : "bhvWigglerBody", - "13004918" : "bhvEnemyLakitu", - "13004954" : "bhvCameraLakitu", - "13004988" : "bhvCloud", - "130049ac" : "bhvCloudPart", - "130049c8" : "bhvSpiny", - "13004a00" : "bhvMontyMole", - "13004a58" : "bhvMontyMoleHole", - "13004a78" : "bhvMontyMoleRock", - "13004ab0" : "bhvPlatformOnTrack", - "13004af4" : "bhvTrackBall", - "13004b1c" : "bhvSeesawPlatform", - "13004b44" : "bhvFerrisWheelAxle", - "13004b6c" : "bhvFerrisWheelPlatform", - "13004b8c" : "bhvWaterBombSpawner", - "13004ba8" : "bhvWaterBomb", - "13004bd4" : "bhvWaterBombShadow", - "13004bf0" : "bhvTTCRotatingSolid", - "13004c24" : "bhvTTCPendulum", - "13004c5c" : "bhvTTCTreadmill", - "13004c94" : "bhvTTCMovingBar", - "13004ccc" : "bhvTTCCog", - "13004cf8" : "bhvTTCPitBlock", - "13004d28" : "bhvTTCElevator", - "13004d64" : "bhvTTC2DRotator", - "13004d90" : "bhvTTCSpinner", - "13004dbc" : "bhvMrBlizzard", - "13004e08" : "bhvMrBlizzardSnowball", - "13004e4c" : "bhvSlidingPlatform2", - "13004e78" : "bhvOctagonalPlatformRotating", - "13004ea0" : "bhvAnimatesOnFloorSwitchPress", - "13004ecc" : "bhvActivatedBackAndForthPlatform", - "13004ef8" : "bhvRecoveryHeart", - "13004f10" : "bhvWaterBombCannon", - "13004f28" : "bhvCannonBarrelBubbles", - "13004f40" : "bhvUnagi", - "13004f78" : "bhvUnagiSubobject", - "13004f90" : "bhvDorrie", - "13004fd4" : "bhvHauntedChair", - "13005024" : "bhvMadPiano", - "1300506c" : "bhvFlyingBookend", - "130050b4" : "bhvBookendSpawn", - "130050d4" : "bhvHauntedBookshelfManager", - "130050f4" : "bhvBookSwitch", - "13005120" : "bhvFirePiranhaPlant", - "13005158" : "bhvSmallPiranhaFlame", - "1300518c" : "bhvFireSpitter", - "130051ac" : "bhvFlyguyFlame", - "130051e0" : "bhvSnufit", - "1300521c" : "bhvSnufitBalls", - "1300525c" : "bhvHorizontalGrindel", - "130052b4" : "bhvEyerokBoss", - "130052d0" : "bhvEyerokHand", - "13005310" : "bhvKlepto", - "13005354" : "bhvBird", - "13005380" : "bhvRacingPenguin", - "130053c4" : "bhvPenguinRaceFinishLine", - "130053dc" : "bhvPenguinRaceShortcutCheck", - "130053f4" : "bhvCoffinSpawner", - "13005414" : "bhvCoffin", - "13005440" : "bhvClamShell", - "13005468" : "bhvSkeeter", - "130054a0" : "bhvSkeeterWave", - "130054b8" : "bhvSwingPlatform", - "130054ec" : "bhvDonutPlatformSpawner", - "13005504" : "bhvDonutPlatform", - "13005528" : "bhvDDDPole", - "1300556c" : "bhvRedCoinStarMarker", - "13005598" : "bhvTripletButterfly", - "130055dc" : "bhvBubba", - "13005610" : "bhvBeginningLakitu", - "13005638" : "bhvBeginningPeach", - "1300565c" : "bhvEndBirds1", - "13005680" : "bhvEndBirds2", - "130056a4" : "bhvIntroScene", - "130056c0" : "_behaviorSegmentEnd", - "007d1d80" : "_behaviorSegmentRomEnd", - "8016f000" : "_goddardSegmentStart", - "007cc6c0" : "_goddardSegmentRomStart", - }, - - "Refresh 7" : { - "80000000" : "D_80000000", - "a4000000" : "D_A4000000", - "a40004c0" : "D_A40004C0", - "a4000774" : "D_A4000774", - "a4001000" : "D_A4001000", - "a4040010" : "D_A4040010", - "a4080000" : "D_A4080000", - "a4300000" : "D_A4300000", - "a4300004" : "D_A4300004", - "a4300008" : "D_A4300008", - "a430000c" : "D_A430000C", - "a4400010" : "D_A4400010", - "a450000c" : "D_A450000C", - "a4600000" : "D_A4600000", - "a4600004" : "D_A4600004", - "a460000c" : "D_A460000C", - "a4600010" : "D_A4600010", - "a4700000" : "D_A4700000", - "a4700010" : "D_A4700010", - "a4800018" : "D_A4800018", - "b0000008" : "D_B0000008", - "b0000010" : "D_B0000010", - "b0000014" : "D_B0000014", - "c0000000" : "D_C0000000", - "c0000008" : "D_C0000008", - "c000000c" : "D_C000000C", - "802f69cc" : "func_sh_802F69CC", - "8024cc7c" : "func_sh_8024CC7C", - "00000000" : "__romPos", - "04000000" : "_bootSegmentStart", - "007cc6c0" : "_bootSegmentRomStart", - "04001000" : "_bootSegmentEnd", - "007cd6c0" : "_bootSegmentRomEnd", - "80000400" : ".", - "80000400" : "_zbufferSegmentNoloadStart", - "80000400" : "0x25800", - "80000400" : "gZBuffer", - "80246000" : "_mainSegmentStart", - "007cc6c0" : "_mainSegmentRomStart", - "80246000" : "entry_point", - "80246050" : "handle_debug_key_sequences", - "80246170" : "unknown_main_func", - "802461cc" : "stub_main_1", - "802461dc" : "stub_main_2", - "802461ec" : "stub_main_3", - "802461fc" : "setup_mesg_queues", - "802462e0" : "alloc_pool", - "80246338" : "create_thread", - "8024639c" : "handle_nmi_request", - "802463ec" : "receive_new_tasks", - "8024651c" : "start_sptask", - "8024659c" : "interrupt_gfx_sptask", - "802465ec" : "start_gfx_sptask", - "80246648" : "pretend_audio_sptask_done", - "8024669c" : "handle_vblank", - "802467fc" : "handle_sp_complete", - "8024694c" : "handle_dp_complete", - "802469b8" : "thread3_main", - "80246b14" : "set_vblank_handler", - "80246b74" : "send_sp_task_message", - "80246bb4" : "dispatch_audio_sptask", - "80246c10" : "send_display_list", - "80246c9c" : "turn_on_audio", - "80246cb8" : "turn_off_audio", - "80246cf0" : "thread1_idle", - "80246df8" : "main_func", - "80246e70" : "my_rdp_init", - "802471a4" : "my_rsp_init", - "80247284" : "clear_z_buffer", - "802473c8" : "display_frame_buffer", - "802474b8" : "clear_frame_buffer", - "80247620" : "clear_viewport", - "8024784c" : "draw_screen_borders", - "802479bc" : "make_viewport_clip_rect", - "80247b3c" : "create_task_structure", - "80247ccc" : "init_render_image", - "80247d14" : "end_master_display_list", - "80247db4" : "draw_reset_bars", - "80247f08" : "rendering_init", - "80247fdc" : "config_gfx_pool", - "80248090" : "display_and_vsync", - "80248304" : "adjust_analog_stick", - "80248498" : "run_demo_inputs", - "80248638" : "read_controller_inputs", - "80248824" : "init_controllers", - "80248964" : "setup_game_memory", - "80248af0" : "thread5_game_loop", - "80248c40" : "reset_volume", - "80248c58" : "lower_background_noise", - "80248ce8" : "raise_background_noise", - "80248d78" : "disable_background_sound", - "80248dc0" : "enable_background_sound", - "80248e08" : "set_sound_mode", - "80248e54" : "play_menu_sounds", - "80248fec" : "play_painting_eject_sound", - "80249070" : "play_infinite_stairs_music", - "80249178" : "set_background_music", - "8024922c" : "fadeout_music", - "8024927c" : "fadeout_level_music", - "802492d0" : "play_cutscene_music", - "80249310" : "play_shell_music", - "8024934c" : "stop_shell_music", - "80249398" : "play_cap_music", - "80249404" : "fadeout_cap_music", - "80249448" : "stop_cap_music", - "802494d8" : "audio_game_loop_tick", - "80249500" : "thread4_sound", - "802495e0" : "level_control_timer", - "802496b8" : "pressed_pause", - "80249764" : "set_play_mode", - "8024978c" : "warp_special", - "802497b8" : "fade_into_special_warp", - "8024982c" : "stub_level_update_1", - "8024983c" : "load_level_init_text", - "8024995c" : "init_door_warp", - "80249a10" : "set_mario_initial_cap_powerup", - "80249ab4" : "set_mario_initial_action", - "80249cd8" : "init_mario_after_warp", - "8024a124" : "warp_area", - "8024a18c" : "warp_level", - "8024a1d8" : "warp_credits", - "8024a374" : "check_instant_warp", - "8024a584" : "music_changed_through_warp", - "8024a700" : "initiate_warp", - "8024a7b4" : "get_painting_warp_node", - "8024a85c" : "initiate_painting_warp", - "8024a9cc" : "level_trigger_warp", - "8024aedc" : "initiate_delayed_warp", - "8024b13c" : "update_hud_values", - "8024b390" : "basic_update", - "8024b3e4" : "play_mode_normal", - "8024b5d4" : "play_mode_paused", - "8024b6cc" : "play_mode_frame_advance", - "8024b798" : "level_set_transition", - "8024b7c0" : "play_mode_change_area", - "8024b880" : "play_mode_change_level", - "8024b9b8" : "update_level", - "8024ba8c" : "init_level", - "8024bcd8" : "lvl_init_or_update", - "8024bd5c" : "lvl_init_from_save_file", - "8024be14" : "lvl_set_current_level", - "8024bfa0" : "lvl_play_the_end_screen_sound", - "8024bff0" : "get_mario_cap_flag", - "8024c0b8" : "object_facing_mario", - "8024c16c" : "mario_obj_angle_to_object", - "8024c1d8" : "determine_interaction", - "8024c51c" : "attack_object", - "8024c618" : "mario_stop_riding_object", - "8024c66c" : "mario_grab_used_object", - "8024c6c0" : "mario_drop_held_object", - "8024c780" : "mario_throw_held_object", - "8024c894" : "mario_stop_riding_and_holding", - "8024c8fc" : "does_mario_have_hat", - "8024c928" : "mario_blow_off_cap", - "8024ca68" : "mario_lose_cap_to_enemy", - "8024caf8" : "mario_retrieve_cap", - "8024cb58" : "able_to_grab_object", - "8024cbfc" : "mario_get_collided_object", - "8024cc7c" : "mario_check_object_grab", - "8024ce08" : "bully_knock_back_mario", - "8024d0b4" : "bounce_off_object", - "8024d130" : "hit_object_from_below", - "8024d2bc" : "determine_knockback_action", - "8024d578" : "push_mario_out_of_object", - "8024d72c" : "bounce_back_from_attack", - "8024d804" : "should_push_or_pull_door", - "8024d8b0" : "take_damage_from_interact_object", - "8024d998" : "take_damage_and_knock_back", - "8024daac" : "reset_mario_pitch", - "8024db2c" : "interact_coin", - "8024dbf0" : "interact_water_ring", - "8024dc28" : "interact_star_or_key", - "8024de4c" : "interact_bbh_entrance", - "8024df10" : "interact_warp", - "8024e0c4" : "interact_warp_door", - "8024e2fc" : "get_door_save_file_flag", - "8024e420" : "interact_door", - "8024e6ec" : "interact_cannon_base", - "8024e778" : "interact_igloo_barrier", - "8024e7d4" : "interact_tornado", - "8024e8f0" : "interact_whirlpool", - "8024e9d0" : "interact_strong_wind", - "8024ead8" : "interact_flame", - "8024ec54" : "interact_snufit_bullet", - "8024ed84" : "interact_clam_or_bubba", - "8024ee44" : "interact_bully", - "8024eff8" : "interact_shock", - "8024f170" : "interact_mr_blizzard", - "8024f1e0" : "interact_hit_from_below", - "8024f354" : "interact_bounce_top", - "8024f4ac" : "interact_unknown_08", - "8024f55c" : "interact_damage", - "8024f5cc" : "interact_breakable", - "8024f6a4" : "interact_koopa_shell", - "8024f7a8" : "check_object_grab_mario", - "8024f8bc" : "interact_pole", - "8024fa60" : "interact_hoot", - "8024fb30" : "interact_cap", - "8024fd2c" : "interact_grabbable", - "8024fe6c" : "mario_can_talk", - "8024ff04" : "check_read_sign", - "80250098" : "check_npc_talk", - "80250198" : "interact_text", - "80250230" : "check_kick_or_punch_wall", - "802503f0" : "mario_process_interactions", - "802505c8" : "check_death_barrier", - "8025065c" : "check_lava_boost", - "80250724" : "pss_begin_slide", - "80250778" : "pss_end_slide", - "802507fc" : "mario_handle_special_floors", - "80250940" : "is_anim_at_end", - "8025097c" : "is_anim_past_end", - "802509b8" : "set_mario_animation", - "80250b04" : "set_mario_anim_with_accel", - "80250c7c" : "set_anim_to_frame", - "80250d38" : "is_anim_past_frame", - "80250e54" : "find_mario_anim_flags_and_translation", - "80251020" : "update_mario_pos_for_anim", - "802510dc" : "return_mario_anim_y_translation", - "80251120" : "play_sound_if_no_flag", - "8025118c" : "play_mario_jump_sound", - "80251274" : "adjust_sound_for_speed", - "80251310" : "play_sound_and_spawn_particles", - "80251444" : "play_mario_action_sound", - "802514ac" : "play_mario_landing_sound", - "80251510" : "play_mario_landing_sound_once", - "80251574" : "play_mario_heavy_landing_sound", - "802515d8" : "play_mario_heavy_landing_sound_once", - "8025163c" : "play_mario_sound", - "80251708" : "mario_set_forward_vel", - "8025177c" : "mario_get_floor_class", - "802518a8" : "mario_get_terrain_sound_addend", - "80251a48" : "resolve_and_return_wall_collisions", - "80251afc" : "vec3f_find_ceil", - "80251b54" : "mario_facing_downhill", - "80251bd4" : "mario_floor_is_slippery", - "80251cfc" : "mario_floor_is_slope", - "80251e24" : "mario_floor_is_steep", - "80251f24" : "find_floor_height_relative_polar", - "80252000" : "find_floor_slope", - "802521a0" : "update_mario_sound_and_camera", - "8025229c" : "set_steep_jump_action", - "80252cf4" : "set_mario_action", - "80252e5c" : "set_jump_from_landing", - "802530a0" : "set_jumping_action", - "80253178" : "drop_and_set_mario_action", - "802531c4" : "hurt_and_set_mario_action", - "80253218" : "check_common_action_exits", - "80253300" : "check_common_hold_action_exits", - "802533e4" : "transition_submerged_to_walking", - "80253488" : "set_water_plunge_action", - "80253588" : "squish_mario_model", - "80253720" : "debug_print_speed_action_normal", - "80253838" : "update_mario_button_inputs", - "8025395c" : "update_mario_joystick_inputs", - "80253a60" : "update_mario_geometry_inputs", - "80253d58" : "update_mario_inputs", - "80253ec0" : "set_submerged_cam_preset_and_spawn_bubbles", - "80254060" : "update_mario_health", - "802542b4" : "update_mario_info_for_cam", - "80254338" : "mario_reset_bodystate", - "80254390" : "sink_mario_in_quicksand", - "802543e8" : "update_and_return_cap_flags", - "80254588" : "mario_update_hitbox_and_cap_model", - "80254830" : "execute_mario_action", - "80254b20" : "init_mario", - "80254f44" : "init_mario_from_save_file", - "80255080" : "get_additive_y_vel_for_jumps", - "8025509c" : "stub_mario_step_1", - "802550b0" : "stub_mario_step_2", - "802550c0" : "transfer_bully_speed", - "80255238" : "init_bully_collision_data", - "802552fc" : "mario_bonk_reflection", - "80255414" : "mario_update_quicksand", - "80255654" : "mario_push_off_steep_floor", - "8025570c" : "mario_update_moving_sand", - "8025580c" : "mario_update_windy_ground", - "802559b0" : "stop_and_set_height_to_floor", - "80255a34" : "stationary_ground_step", - "80255d88" : "perform_ground_step", - "80255ec4" : "check_ledge_grab", - "802560ac" : "perform_air_quarter_step", - "802564e0" : "apply_twirl_gravity", - "80256584" : "should_strengthen_gravity_for_jump_ascent", - "8025661c" : "apply_gravity", - "802569f8" : "apply_vertical_wind", - "80256b24" : "perform_air_step", - "80256cd8" : "set_vel_from_pitch_and_yaw", - "80256d8c" : "set_vel_from_yaw", - "80256e00" : "get_credits_str_width", - "80256e88" : "print_displaying_credits_entry", - "80257060" : "bhv_end_peach_loop", - "802570dc" : "bhv_end_toad_loop", - "80257198" : "geo_switch_peach_eyes", - "802572b0" : "get_star_collection_dialog", - "8025733c" : "handle_save_menu", - "80257450" : "spawn_obj_at_mario_rel_yaw", - "802574e8" : "cutscene_take_cap_off", - "80257548" : "cutscene_put_cap_on", - "802575a8" : "mario_ready_to_speak", - "80257640" : "set_mario_npc_dialog", - "80257748" : "act_reading_npc_dialog", - "80257980" : "act_waiting_for_dialog", - "80257a0c" : "act_disappeared", - "80257ab0" : "act_reading_automatic_dialog", - "80257ce4" : "act_reading_sign", - "80257eac" : "act_debug_free_move", - "80258184" : "general_star_dance_handler", - "80258420" : "act_star_dance", - "802584dc" : "act_star_dance_water", - "802585c0" : "act_fall_after_star_grab", - "802586cc" : "common_death_handler", - "80258744" : "act_standing_death", - "802587ec" : "act_electrocution", - "8025883c" : "act_suffocation", - "8025888c" : "act_death_on_back", - "802588f8" : "act_death_on_stomach", - "80258964" : "act_quicksand_death", - "80258a7c" : "act_eaten_by_bubba", - "80258b24" : "launch_mario_until_land", - "80258ba8" : "act_unlocking_key_door", - "80258dac" : "act_unlocking_star_door", - "80258f94" : "act_entering_star_door", - "80259264" : "act_going_through_door", - "802593cc" : "act_warp_door_spawn", - "802594d4" : "act_emerge_from_pipe", - "80259608" : "act_spawn_spin_airborne", - "80259740" : "act_spawn_spin_landing", - "802597ac" : "act_exit_airborne", - "80259854" : "act_falling_exit_airborne", - "802598d0" : "act_exit_land_save_dialog", - "80259c30" : "act_death_exit", - "80259ce8" : "act_unused_death_exit", - "80259d74" : "act_falling_death_exit", - "80259e00" : "act_special_exit_airborne", - "80259ef8" : "act_special_death_exit", - "80259fcc" : "act_spawn_no_spin_airborne", - "8025a040" : "act_spawn_no_spin_landing", - "8025a0bc" : "act_bbh_enter_spin", - "8025a494" : "act_bbh_enter_jump", - "8025a610" : "act_teleport_fade_out", - "8025a6fc" : "act_teleport_fade_in", - "8025a858" : "act_shocked", - "8025a9ac" : "act_squished", - "8025ae0c" : "act_putting_on_cap", - "8025aea8" : "stuck_in_ground_handler", - "8025affc" : "act_head_stuck_in_ground", - "8025b050" : "act_butt_stuck_in_ground", - "8025b0a4" : "act_feet_stuck_in_ground", - "8025d798" : "mario_execute_cutscene_action", - "8025dd70" : "add_tree_leaf_particles", - "8025de1c" : "play_climbing_sounds", - "8025df04" : "set_pole_position", - "8025e21c" : "act_holding_pole", - "8025e5a8" : "act_climbing_pole", - "8025e7a4" : "act_grab_pole_slow", - "8025e830" : "act_grab_pole_fast", - "8025e930" : "act_top_of_pole_transition", - "8025ea30" : "act_top_of_pole", - "8025eb50" : "perform_hanging_step", - "8025ecfc" : "update_hang_moving", - "8025eed0" : "update_hang_stationary", - "8025ef58" : "act_start_hanging", - "8025f0b4" : "act_hanging", - "8025f1e4" : "act_hang_moving", - "8025f384" : "let_go_of_ledge", - "8025f4b4" : "climb_up_ledge", - "8025f560" : "update_ledge_climb_camera", - "8025f644" : "update_ledge_climb", - "8025f6c0" : "act_ledge_grab", - "8025f970" : "act_ledge_climb_slow", - "8025fa64" : "act_ledge_climb_down", - "8025fae8" : "act_ledge_climb_fast", - "8025fb90" : "act_grabbed", - "8025fc6c" : "act_in_cannon", - "80260154" : "act_tornado_twirling", - "80260568" : "check_common_automatic_cancels", - "802605d0" : "mario_execute_automatic_action", - "802608b0" : "check_common_idle_cancels", - "80260aac" : "check_common_hold_idle_cancels", - "80260cb4" : "act_idle", - "80260f94" : "play_anim_sound", - "80261000" : "act_start_sleeping", - "80261268" : "act_sleeping", - "802614fc" : "act_waking_up", - "8026168c" : "act_shivering", - "802618d8" : "act_coughing", - "802619d0" : "act_hold_idle", - "80261ad0" : "act_hold_heavy_idle", - "80261bf8" : "act_standing_against_wall", - "80261cec" : "act_in_quicksand", - "80261db4" : "act_crouching", - "80261f70" : "act_panting", - "80262080" : "act_hold_panting_unused", - "8026217c" : "stopping_step", - "802621dc" : "act_braking_stop", - "802622dc" : "act_butt_slide_stop", - "80262398" : "act_unknown_03F", - "80262490" : "act_slide_kick_slide_stop", - "80262530" : "act_start_crouching", - "80262650" : "act_stop_crouching", - "80262770" : "act_start_crawling", - "80262890" : "act_stop_crawling", - "80262980" : "act_unknown_026", - "80262bc4" : "landing_step", - "80262c34" : "check_common_landing_cancels", - "80262d68" : "act_jump_land_stop", - "80262dc4" : "act_double_jump_land_stop", - "80262e20" : "act_side_flip_land_stop", - "80262e94" : "act_freefall_land_stop", - "80262ef0" : "act_triple_jump_land_stop", - "80262f50" : "act_backflip_land_stop", - "80262fec" : "act_lava_boost_land", - "8026305c" : "act_long_jump_land_stop", - "802630f8" : "act_unknown_034", - "802631f0" : "act_unknown_035", - "802632e8" : "act_air_throw_land", - "802633b4" : "act_twirl_land", - "8026350c" : "act_ground_pound_land", - "802635e8" : "act_first_person", - "80263784" : "check_common_stationary_cancels", - "80263898" : "mario_execute_stationary_action", - "80263e60" : "tilt_body_running", - "80263ee4" : "play_step_sound", - "80264024" : "align_with_floor", - "8026409c" : "begin_walking_action", - "802640fc" : "check_ledge_climb_down", - "802642b4" : "slide_bonk", - "80264340" : "set_triple_jump_action", - "8026440c" : "update_sliding_angle", - "80264740" : "update_sliding", - "80264b54" : "apply_slope_accel", - "80264d80" : "apply_landing_accel", - "80264e18" : "update_shell_speed", - "80265080" : "apply_slope_decel", - "802651b0" : "update_decelerating_speed", - "80265244" : "update_walking_speed", - "80265458" : "should_begin_sliding", - "80265514" : "analog_stick_held_back", - "80265558" : "check_ground_dive_or_punch", - "80265620" : "begin_braking_action", - "80265700" : "anim_and_audio_for_walk", - "80265b1c" : "anim_and_audio_for_hold_walk", - "80265d90" : "anim_and_audio_for_heavy_walk", - "80265df8" : "push_or_sidle_wall", - "80266038" : "tilt_body_walking", - "802661cc" : "tilt_body_ground_shell", - "80266354" : "act_walking", - "802665b4" : "act_move_punching", - "80266734" : "act_hold_walking", - "8026699c" : "act_hold_heavy_walking", - "80266af8" : "act_turning_around", - "80266d4c" : "act_finish_turning_around", - "80266e48" : "act_braking", - "80266fc8" : "act_decelerating", - "80267240" : "act_hold_decelerating", - "80267504" : "act_riding_shell_ground", - "80267728" : "act_crawling", - "8026795c" : "act_burning_ground", - "80267c24" : "tilt_body_butt_slide", - "80267ce4" : "common_slide_action", - "80267fa4" : "common_slide_action_with_jump", - "80268074" : "act_butt_slide", - "802680d4" : "act_hold_butt_slide", - "80268168" : "act_crouch_slide", - "80268338" : "act_slide_kick_slide", - "802684ac" : "stomach_slide_action", - "802685c0" : "act_stomach_slide", - "80268608" : "act_hold_stomach_slide", - "80268684" : "act_dive_slide", - "802687b8" : "common_ground_knockback_action", - "802689f8" : "act_hard_backward_ground_kb", - "80268adc" : "act_hard_forward_ground_kb", - "80268b64" : "act_backward_ground_kb", - "80268bb0" : "act_forward_ground_kb", - "80268bfc" : "act_soft_backward_ground_kb", - "80268c48" : "act_soft_forward_ground_kb", - "80268c94" : "act_ground_bonk", - "80268d04" : "act_death_exit_land", - "80268dcc" : "common_landing_action", - "80268f78" : "common_landing_cancels", - "80269108" : "act_jump_land", - "80269170" : "act_freefall_land", - "802691d8" : "act_side_flip_land", - "80269264" : "act_hold_jump_land", - "80269300" : "act_hold_freefall_land", - "8026939c" : "act_long_jump_land", - "8026947c" : "act_double_jump_land", - "802694e4" : "act_triple_jump_land", - "80269588" : "act_backflip_land", - "80269640" : "quicksand_jump_land_action", - "80269788" : "act_quicksand_jump_land", - "802697dc" : "act_hold_quicksand_jump_land", - "80269830" : "check_common_moving_cancels", - "80269954" : "mario_execute_moving_action", - "80269f40" : "play_flip_sounds", - "80269fc0" : "play_far_fall_sound", - "8026a090" : "play_knockback_sound", - "8026a12c" : "lava_boost_on_wall", - "8026a224" : "check_fall_damage", - "8026a400" : "check_kick_or_dive_in_air", - "8026a494" : "should_get_stuck_in_ground", - "8026a598" : "check_fall_damage_or_get_stuck", - "8026a62c" : "check_horizontal_wind", - "8026a818" : "update_air_with_turn", - "8026aa48" : "update_air_without_turn", - "8026acd8" : "update_lava_boost_or_twirling", - "8026ae5c" : "update_flying_yaw", - "8026b004" : "update_flying_pitch", - "8026b17c" : "update_flying", - "8026b444" : "common_air_action_step", - "8026b6a0" : "act_jump", - "8026b740" : "act_double_jump", - "8026b814" : "act_triple_jump", - "8026b90c" : "act_backflip", - "8026b9ac" : "act_freefall", - "8026bab8" : "act_hold_jump", - "8026bbb4" : "act_hold_freefall", - "8026bcc0" : "act_side_flip", - "8026bdcc" : "act_wall_kick_air", - "8026be78" : "act_long_jump", - "8026bf40" : "act_riding_shell_air", - "8026c034" : "act_twirling", - "8026c1e0" : "act_dive", - "8026c4b8" : "act_air_throw", - "8026c5d0" : "act_water_jump", - "8026c738" : "act_hold_water_jump", - "8026c880" : "act_steep_jump", - "8026c9fc" : "act_ground_pound", - "8026cd0c" : "act_burning_jump", - "8026ce50" : "act_burning_fall", - "8026cf28" : "act_crazy_box_bounce", - "8026d1b0" : "common_air_knockback_step", - "8026d33c" : "check_wall_kick", - "8026d3c8" : "act_backward_air_kb", - "8026d43c" : "act_forward_air_kb", - "8026d4b0" : "act_hard_backward_air_kb", - "8026d508" : "act_hard_forward_air_kb", - "8026d560" : "act_thrown_backward", - "8026d608" : "act_thrown_forward", - "8026d6fc" : "act_soft_bonk", - "8026d770" : "act_getting_blown", - "8026d988" : "act_air_hit_wall", - "8026db54" : "act_forward_rollout", - "8026dcf4" : "act_backward_rollout", - "8026de98" : "act_butt_slide_air", - "8026e088" : "act_hold_butt_slide_air", - "8026e2b4" : "act_lava_boost", - "8026e59c" : "act_slide_kick", - "8026e810" : "act_jump_kick", - "8026e968" : "act_shot_from_cannon", - "8026ec00" : "act_flying", - "8026f158" : "act_riding_hoot", - "8026f2ec" : "act_flying_triple_jump", - "8026f614" : "act_top_of_pole_jump", - "8026f660" : "act_vertical_wind", - "8026f840" : "act_special_triple_jump", - "8026fa18" : "check_common_airborne_cancels", - "8026fb04" : "mario_execute_airborne_action", - "8027499c" : "mario_execute_submerged_action", - "80274eb0" : "animated_stationary_ground_step", - "80274f10" : "mario_update_punch_sequence", - "80275328" : "act_punching", - "8027546c" : "act_picking_up", - "802755fc" : "act_dive_picking_up", - "802756c8" : "act_placing_down", - "80275794" : "act_throwing", - "802758c0" : "act_heavy_throw", - "802759b4" : "act_stomach_slide_stop", - "80275a80" : "act_picking_up_bowser", - "80275b34" : "act_holding_bowser", - "80275e78" : "act_releasing_bowser", - "80275f0c" : "check_common_object_cancels", - "80275fe0" : "mario_execute_object_action", - "802761d0" : "geo_envfx_main", - "802763d4" : "geo_skybox_main", - "802764b0" : "geo_draw_mario_head_goddard", - "8027684c" : "bhv_toad_message_loop", - "80276910" : "bhv_toad_message_init", - "80276bb8" : "bhv_unlock_door_star_init", - "80276ccc" : "bhv_unlock_door_star_loop", - "802770a4" : "geo_mirror_mario_set_alpha", - "80277150" : "geo_switch_mario_stand_run", - "802771bc" : "geo_switch_mario_eyes", - "80277294" : "geo_mario_tilt_torso", - "802773a4" : "geo_mario_head_rotation", - "802774f4" : "geo_switch_mario_hand", - "802775cc" : "geo_mario_hand_foot_scaler", - "802776d8" : "geo_switch_mario_cap_effect", - "80277740" : "geo_switch_mario_cap_on_off", - "80277824" : "geo_mario_rotate_wing_cap_wings", - "8027795c" : "geo_switch_mario_hand_grab_pos", - "80277b14" : "geo_render_mirror_mario", - "80277d6c" : "geo_mirror_mario_backface_culling", - "80277ee0" : "set_segment_base_addr", - "80277f20" : "get_segment_base_addr", - "80277f50" : "segmented_to_virtual", - "80277fa8" : "virtual_to_segmented", - "80277ff0" : "move_segment_table_to_dmem", - "80278074" : "main_pool_init", - "80278120" : "main_pool_alloc", - "80278238" : "main_pool_free", - "80278358" : "main_pool_realloc", - "802783c8" : "main_pool_available", - "802783e8" : "main_pool_push_state", - "80278498" : "main_pool_pop_state", - "8027868c" : "load_segment", - "802786f0" : "load_to_fixed_pool_addr", - "802787d8" : "load_segment_decompress", - "802788b4" : "load_segment_decompress_heap", - "80278974" : "load_engine_code_segment", - "80278a14" : "alloc_only_pool_init", - "80278ab8" : "alloc_only_pool_alloc", - "80278b28" : "alloc_only_pool_resize", - "80278b98" : "mem_pool_init", - "80278c58" : "mem_pool_alloc", - "80278d74" : "mem_pool_free", - "80278f2c" : "alloc_display_list", - "80279028" : "func_80278A78", - "80279084" : "load_patchable_table", - "80279840" : "save_file_do_save", - "802798fc" : "save_file_erase", - "80279960" : "save_file_copy", - "802799dc" : "save_file_load_all", - "80279bc8" : "save_file_reload", - "80279c44" : "save_file_collect_star_or_key", - "80279e44" : "save_file_exists", - "80279e80" : "save_file_get_max_coin_score", - "80279f80" : "save_file_get_course_star_count", - "8027a010" : "save_file_get_total_star_count", - "8027a0a8" : "save_file_set_flags", - "8027a0f4" : "save_file_clear_flags", - "8027a16c" : "save_file_get_flags", - "8027a1c8" : "save_file_get_star_flags", - "8027a23c" : "save_file_set_star_flags", - "8027a310" : "save_file_get_course_coin_score", - "8027a340" : "save_file_is_cannon_unlocked", - "8027a390" : "save_file_set_cannon_unlocked", - "8027a418" : "save_file_set_cap_pos", - "8027a4ac" : "save_file_get_cap_pos", - "8027a564" : "save_file_set_sound_mode", - "8027a5b4" : "save_file_get_sound_mode", - "8027a5d4" : "save_file_move_cap_to_default_location", - "8027a698" : "disable_warp_checkpoint", - "8027a6b0" : "check_if_should_set_warp_checkpoint", - "8027a718" : "check_warp_checkpoint", - "8027a7d0" : "override_viewport_and_clip", - "8027a83c" : "set_warp_transition_rgb", - "8027a8b0" : "print_intro_text", - "8027a93c" : "get_mario_spawn_type", - "8027a9c8" : "area_get_warp_node", - "8027aa28" : "area_get_warp_node_from_params", - "8027aa74" : "load_obj_warp_nodes", - "8027ab04" : "clear_areas", - "8027ad74" : "clear_area_graph_nodes", - "8027ae44" : "load_area", - "8027af48" : "unload_area", - "8027afbc" : "load_mario_area", - "8027b038" : "unload_mario_area", - "8027b0c0" : "change_area", - "8027b164" : "area_update_objects", - "8027b1a0" : "play_transition", - "8027b35c" : "play_transition_after_delay", - "8027b3b4" : "render_game", - "8027cf38" : "geo_set_animation_globals", - "8027da84" : "geo_process_held_object", - "8027de68" : "geo_try_process_children", - "8027dea8" : "geo_process_node_and_siblings", - "8027e130" : "geo_process_root", - "8027e3e0" : "profiler_log_thread5_time", - "8027e490" : "profiler_log_thread4_time", - "8027e520" : "profiler_log_gfx_time", - "8027e5cc" : "profiler_log_vblank_time", - "8027e65c" : "draw_profiler_bar", - "8027e958" : "draw_reference_profiler_bars", - "8027ebcc" : "draw_profiler_mode_1", - "8027eeac" : "draw_profiler_mode_0", - "8027f460" : "draw_profiler", - "8027f4e0" : "decompress", - "8027f590" : "set_camera_shake_from_hit", - "8027f8b8" : "set_environmental_camera_shake", - "8027f9f0" : "set_camera_shake_from_point", - "8027fb74" : "unused_set_camera_pitch_shake_env", - "8027fc18" : "calc_y_to_curr_floor", - "8027fe20" : "focus_on_mario", - "8027fff8" : "set_camera_height", - "80280368" : "look_down_slopes", - "802804f4" : "pan_ahead_of_player", - "802806a4" : "find_in_bounds_yaw_wdw_bob_thi", - "80280810" : "update_radial_camera", - "80280970" : "update_8_directions_camera", - "80280b00" : "radial_camera_move", - "80281188" : "lakitu_zoom", - "802813bc" : "radial_camera_input_default", - "802813ec" : "update_yaw_and_dist_from_c_up", - "8028146c" : "mode_radial_camera", - "80281588" : "mode_8_directions_camera", - "802816a0" : "update_outward_radial_camera", - "802817fc" : "mode_outward_radial_camera", - "80281904" : "update_parallel_tracking_camera", - "80282280" : "update_fixed_camera", - "802826a0" : "update_boss_fight_camera", - "80282c0c" : "unused_update_mode_5_camera", - "80282c3c" : "mode_boss_fight_camera", - "80282c7c" : "mode_parallel_tracking_camera", - "80282ce0" : "mode_fixed_camera", - "80282d78" : "update_behind_mario_camera", - "80283340" : "mode_behind_mario", - "80283578" : "update_slide_camera", - "802839e4" : "mode_behind_mario_camera", - "80283a18" : "nop_update_water_camera", - "80283a34" : "mode_water_surface_camera", - "80283a68" : "update_mario_camera", - "80283af8" : "update_default_camera", - "80284cb8" : "mode_default_camera", - "80284cfc" : "mode_lakitu_camera", - "80284d38" : "mode_mario_camera", - "80284d74" : "update_spiral_stairs_camera", - "802850ac" : "mode_spiral_stairs_camera", - "802850ec" : "update_slide_or_0f_camera", - "802851dc" : "mode_slide_camera", - "8028526c" : "store_lakitu_cam_info_for_c_up", - "802852f4" : "set_mode_c_up", - "80285370" : "exit_c_up", - "80285808" : "update_c_up", - "802858a4" : "move_mario_head_c_up", - "80285a2c" : "move_into_c_up", - "80285d20" : "mode_c_up_camera", - "80285ed8" : "update_in_cannon", - "80285f60" : "mode_cannon_camera", - "8028603c" : "transition_next_state", - "80286088" : "transition_to_camera_mode", - "80286188" : "set_camera_mode", - "80286420" : "update_lakitu", - "802868f8" : "update_camera", - "80286f68" : "reset_camera", - "8028724c" : "init_camera", - "802879ec" : "zoom_out_if_paused_and_outside", - "80287bc4" : "select_mario_cam_mode", - "80287be0" : "create_camera", - "80287cb8" : "update_graph_node_camera", - "80287d30" : "geo_camera_main", - "80287dc0" : "stub_camera_2", - "80287dd4" : "stub_camera_3", - "80287de8" : "vec3f_sub", - "80287e28" : "object_pos_to_vec3f", - "80287e50" : "vec3f_to_object_pos", - "80287e78" : "unused_object_angle_to_vec3s", - "80287ea0" : "evaluate_cubic_spline", - "802882e4" : "move_point_along_spline", - "80288624" : "cam_select_alt_mode", - "80288718" : "set_cam_angle", - "80288888" : "set_handheld_shake", - "802889b0" : "shake_camera_handheld", - "80288ce4" : "find_c_buttons_pressed", - "80288e68" : "update_camera_hud_status", - "80288f5c" : "collide_with_walls", - "80289198" : "vec3f_compare", - "80289214" : "clamp_pitch", - "802892d8" : "is_within_100_units_of_mario", - "8028935c" : "set_or_approach_f32_asymptotic", - "802893f4" : "approach_f32_asymptotic_bool", - "80289488" : "approach_f32_asymptotic", - "802894b4" : "approach_s16_asymptotic_bool", - "8028956c" : "approach_s16_asymptotic", - "80289610" : "approach_vec3f_asymptotic", - "80289684" : "set_or_approach_vec3f_asymptotic", - "802896f8" : "approach_vec3s_asymptotic", - "8028976c" : "camera_approach_s16_symmetric_bool", - "8028984c" : "camera_approach_s16_symmetric", - "8028993c" : "set_or_approach_s16_symmetric", - "802899cc" : "camera_approach_f32_symmetric_bool", - "80289b0c" : "camera_approach_f32_symmetric", - "80289c00" : "random_vec3s", - "80289d20" : "reduce_by_dist_from_camera", - "80289f88" : "clamp_positions_and_find_yaw", - "8028a080" : "calc_avoid_yaw", - "8028a0f4" : "is_surf_within_bounding_box", - "8028a4ec" : "is_behind_surface", - "8028a6bc" : "is_range_behind_surface", - "8028a7ec" : "is_mario_behind_surface", - "8028a834" : "scale_along_line", - "8028a8e8" : "is_pos_in_bounds", - "8028aa28" : "calculate_pitch", - "8028aad8" : "calculate_yaw", - "8028ab60" : "calculate_angles", - "8028ac28" : "calc_abs_dist", - "8028accc" : "calc_hor_dist", - "8028ad4c" : "rotate_in_xz", - "8028ae1c" : "rotate_in_yz", - "8028aef0" : "set_camera_pitch_shake", - "8028af4c" : "set_camera_yaw_shake", - "8028b00c" : "set_camera_roll_shake", - "8028b068" : "set_pitch_shake_from_point", - "8028b11c" : "set_yaw_shake_from_point", - "8028b1d0" : "increment_shake_offset", - "8028b218" : "shake_camera_pitch", - "8028b32c" : "shake_camera_yaw", - "8028b438" : "shake_camera_roll", - "8028b50c" : "offset_yaw_outward_radial", - "8028b724" : "cutscene_intro_peach_play_message_music", - "8028b754" : "cutscene_intro_peach_play_lakitu_flying_music", - "8028b784" : "play_camera_buzz_if_cdown", - "8028b7c4" : "play_camera_buzz_if_cbutton", - "8028b804" : "play_camera_buzz_if_c_sideways", - "8028b850" : "play_sound_cbutton_up", - "8028b884" : "play_sound_cbutton_down", - "8028b8b8" : "play_sound_cbutton_side", - "8028b8ec" : "play_sound_button_change_blocked", - "8028b920" : "play_sound_rbutton_changed", - "8028b954" : "play_sound_if_cam_switched_to_lakitu_or_mario", - "8028b9c4" : "radial_camera_input", - "8028bd34" : "trigger_cutscene_dialog", - "8028bd98" : "handle_c_button_movement", - "8028c038" : "clear_cutscene_vars", - "8028c13c" : "start_cutscene", - "8028c18c" : "determine_dance_cutscene", - "8028c26c" : "open_door_cutscene", - "8028c2c8" : "get_cutscene_from_mario_status", - "8028c7a0" : "warp_camera", - "8028c8f0" : "approach_camera_height", - "8028c9ac" : "stub_camera_4", - "8028c9cc" : "set_focus_rel_mario", - "8028cbf0" : "offset_rotated", - "8028cd94" : "offset_rotated_coords", - "8028cdec" : "determine_pushing_or_pulling_door", - "8028ce24" : "next_lakitu_state", - "8028d44c" : "set_camera_mode_fixed", - "8028d5ac" : "set_camera_mode_8_directions", - "8028d5fc" : "set_camera_mode_boss_fight", - "8028d658" : "set_camera_mode_close_cam", - "8028d698" : "set_camera_mode_radial", - "8028d79c" : "parallel_tracking_init", - "8028d888" : "set_fixed_cam_axis_sa_lobby", - "8028d92c" : "check_blocking_area_processing", - "8028da18" : "cam_rr_exit_building_side", - "8028da50" : "cam_rr_exit_building_top", - "8028daec" : "cam_rr_enter_building_window", - "8028db38" : "cam_rr_enter_building", - "8028dbb4" : "cam_rr_enter_building_side", - "8028dbf4" : "cam_cotmc_exit_waterfall", - "8028dc1c" : "cam_sl_snowman_head_8dir", - "8028dc70" : "cam_sl_free_roam", - "8028dca4" : "move_camera_through_floor_while_descending", - "8028dd48" : "cam_hmc_enter_maze", - "8028de2c" : "cam_hmc_elevator_black_hole", - "8028de5c" : "cam_hmc_elevator_maze_emergency_exit", - "8028de90" : "cam_hmc_elevator_lake", - "8028dec4" : "cam_hmc_elevator_maze", - "8028def8" : "cam_ssl_enter_pyramid_top", - "8028df24" : "cam_ssl_pyramid_center", - "8028df6c" : "cam_ssl_boss_room", - "8028dfb4" : "cam_thi_move_cam_through_tunnel", - "8028dfe8" : "cam_thi_look_through_tunnel", - "8028e01c" : "cam_bob_tower", - "8028e064" : "cam_bob_default_free_roam", - "8028e098" : "cam_castle_hmc_start_pool_cutscene", - "8028e0ec" : "cam_castle_lobby_entrance", - "8028e164" : "cam_castle_look_upstairs", - "8028e210" : "cam_castle_basement_look_downstairs", - "8028e298" : "cam_castle_enter_lobby", - "8028e300" : "cam_castle_enter_spiral_stairs", - "8028e38c" : "cam_castle_close_mode", - "8028e3b8" : "cam_castle_leave_lobby_sliding_door", - "8028e3f0" : "cam_castle_enter_lobby_sliding_door", - "8028e41c" : "cam_bbh_room_6", - "8028e450" : "cam_bbh_fall_off_roof", - "8028e47c" : "cam_bbh_fall_into_pool", - "8028e524" : "cam_bbh_room_1", - "8028e55c" : "cam_bbh_leave_front_door", - "8028e594" : "cam_bbh_room_2_lower", - "8028e5cc" : "cam_bbh_room_4", - "8028e604" : "cam_bbh_room_8", - "8028e63c" : "cam_bbh_room_5_library", - "8028e674" : "cam_bbh_room_5_library_to_hidden_transition", - "8028e6c4" : "cam_bbh_room_5_hidden_to_library_transition", - "8028e714" : "cam_bbh_room_5_hidden", - "8028e758" : "cam_bbh_room_3", - "8028e790" : "cam_bbh_room_7_mr_i", - "8028e7c8" : "cam_bbh_room_7_mr_i_to_coffins_transition", - "8028e818" : "cam_bbh_room_7_coffins_to_mr_i_transition", - "8028e868" : "cam_bbh_elevator_room_lower", - "8028e8a0" : "cam_bbh_room_0_back_entrance", - "8028e8cc" : "cam_bbh_elevator", - "8028e930" : "cam_bbh_room_12_upper", - "8028e974" : "cam_bbh_enter_front_door", - "8028e9a0" : "cam_bbh_room_2_library", - "8028e9d8" : "cam_bbh_room_2_library_to_trapdoor_transition", - "8028ea28" : "cam_bbh_room_2_trapdoor", - "8028ea60" : "cam_bbh_room_2_trapdoor_transition", - "8028eab0" : "cam_bbh_room_9_attic", - "8028eae8" : "cam_bbh_room_9_attic_transition", - "8028eb38" : "cam_bbh_room_9_mr_i_transition", - "8028eb88" : "cam_bbh_room_13_balcony", - "8028ebc0" : "cam_bbh_room_0", - "8028ec04" : "cam_ccm_enter_slide_shortcut", - "8028ec2c" : "cam_ccm_leave_slide_shortcut", - "8028ec58" : "surface_type_modes", - "8028ed30" : "set_mode_if_not_set_by_surface", - "8028ed98" : "surface_type_modes_thi", - "8028eeb0" : "camera_course_processing", - "8028f670" : "resolve_geometry_collisions", - "8028f914" : "rotate_camera_around_walls", - "8028fc9c" : "find_mario_floor_and_ceil", - "8028fe24" : "start_object_cutscene", - "8028fe58" : "start_object_cutscene_without_focus", - "8028fe84" : "unused_dialog_cutscene_response", - "8028ff04" : "cutscene_object_with_dialog", - "8028ffc8" : "cutscene_object_without_dialog", - "8029000c" : "cutscene_object", - "80290098" : "update_camera_yaw", - "802900e0" : "cutscene_reset_spline", - "80290104" : "stop_cutscene_and_retrieve_stored_info", - "80290168" : "cap_switch_save", - "802901a4" : "init_spline_point", - "802901fc" : "copy_spline_segment", - "802903b8" : "cutscene_common_set_dialog_state", - "802904a8" : "cutscene_intro_peach_start_letter_music", - "802904e4" : "cutscene_intro_peach_start_flying_music", - "8029051c" : "reset_pan_distance", - "8029053c" : "player2_rotate_cam", - "80290784" : "store_info_cannon", - "802907f4" : "retrieve_info_cannon", - "80290864" : "store_info_star", - "802908e8" : "retrieve_info_star", - "802909d0" : "pan_camera", - "80290a5c" : "cutscene_shake_explosion", - "80290abc" : "rotate_and_move_vec3f", - "80290b54" : "set_flag_post_door", - "80290ba4" : "cutscene_soften_music", - "80290bd8" : "cutscene_unsoften_music", - "80290c1c" : "cutscene_unused_start", - "80290c30" : "cutscene_unused_loop", - "80290c44" : "cutscene_ending_mario_fall_start", - "80290c9c" : "cutscene_ending_mario_fall_focus_mario", - "80290d90" : "cutscene_ending_mario_fall", - "80290e00" : "cutscene_ending_mario_land_closeup", - "80290e74" : "cutscene_ending_reset_spline", - "80290eb0" : "cutscene_ending_fly_up_to_window", - "80290f1c" : "cutscene_ending_stars_free_peach", - "80290f8c" : "cutscene_ending_mario_land", - "80291074" : "cutscene_ending_peach_appear_closeup", - "80291108" : "cutscene_ending_peach_appears", - "802911c8" : "cutscene_ending_peach_descends_start", - "80291208" : "cutscene_ending_follow_peach_descent", - "8029127c" : "cutscene_ending_peach_descent_lower_focus", - "802912b8" : "cutscene_ending_peach_descent_back_to_mario", - "80291354" : "cutscene_ending_peach_descends", - "8029142c" : "cutscene_ending_mario_to_peach", - "802914cc" : "cutscene_ending_look_up_at_castle", - "80291514" : "cutscene_ending_peach_wakeup", - "802915d4" : "cutscene_ending_dialog", - "80291654" : "cutscene_ending_kiss_closeup", - "802916b8" : "cutscene_ending_kiss_here_we_go", - "80291774" : "cutscene_ending_kiss", - "802917e4" : "cutscene_ending_look_at_sky", - "8029184c" : "cutscene_ending_zoom_fov", - "80291870" : "cutscene_ending_cake_for_mario", - "80291924" : "cutscene_ending_stop", - "80291964" : "cutscene_grand_star_start", - "802919dc" : "cutscene_grand_star_front_of_mario", - "80291ab4" : "cutscene_grand_star_mario_jump", - "80291b18" : "cutscene_grand_star_accel_cvar2", - "80291b68" : "cutscene_grand_star_approach_mario", - "80291bf4" : "cutscene_grand_star_move_cvar2", - "80291c3c" : "cutscene_grand_star_focus_mario", - "80291cd0" : "cutscene_grand_star", - "80291db0" : "cutscene_grand_star_fly_start", - "80291e84" : "cutscene_grand_star_fly_move_to_mario", - "80291f18" : "cutscene_grand_star_fly_mario_offscreen", - "80292038" : "cutscene_grand_star_fly_app_cvars", - "80292164" : "cutscene_grand_star_fly", - "802921fc" : "focus_in_front_of_mario", - "8029228c" : "cutscene_dance_move_to_mario", - "80292324" : "cutscene_dance_rotate", - "80292370" : "cutscene_dance_rotate_move_back", - "802923b8" : "cutscene_dance_rotate_move_towards_mario", - "80292414" : "cutscene_dance_default_focus_mario", - "8029244c" : "cutscene_dance_rotate_focus_mario", - "80292484" : "cutscene_dance_shake_fov", - "802924b8" : "cutscene_dance_default_rotate", - "80292628" : "star_dance_bound_yaw", - "802926dc" : "cutscene_dance_closeup_start", - "802927d0" : "cutscene_dance_closeup_focus_mario", - "80292868" : "cutscene_dance_closeup_fly_above", - "80292974" : "cutscene_dance_closeup_fly_closer", - "80292a20" : "cutscene_dance_closeup_zoom", - "80292a4c" : "cutscene_dance_closeup_shake_fov", - "80292a80" : "cutscene_dance_closeup", - "80292c00" : "cutscene_dance_fly_away_start", - "80292d80" : "cutscene_dance_fly_away_approach_mario", - "80292e2c" : "cutscene_dance_fly_away_focus_mario", - "80292ec4" : "cutscene_pan_cvar9", - "80292f40" : "cutscene_dance_fly_rotate_around_mario", - "80292f98" : "cutscene_dance_fly_away_rotate_while_flying", - "80292fe4" : "cutscene_dance_fly_away_shake_fov", - "80293018" : "cutscene_dance_fly_away", - "802930f0" : "cutscene_key_dance_jump_cvar", - "80293164" : "cutscene_key_dance_jump_closeup", - "802931c0" : "cutscene_key_dance_jump_lower_left", - "80293220" : "cutscene_key_dance_jump_above", - "8029328c" : "cutscene_key_dance_jump_last", - "802932f4" : "cutscene_key_dance_shake_fov", - "80293328" : "cutscene_key_dance_handheld_shake", - "80293354" : "cutscene_key_dance_focus_mario", - "8029338c" : "cutscene_key_dance", - "80293488" : "cutscene_bowser_area_shake_fov", - "802934b4" : "cutscene_bowser_area_start_bowser_walking", - "802934d8" : "cutscene_bowser_arena_set_pos", - "80293548" : "cutscene_bowser_arena_focus_sine", - "802935e0" : "cutscene_bowser_arena_set_focus", - "80293624" : "cutscene_bowser_arena_adjust_offsets", - "8029369c" : "cutscene_bowser_arena_pan_left", - "802936dc" : "cutscene_bowser_arena_mario_dialog", - "80293708" : "cutscene_stop_dialog", - "80293734" : "cutscene_bowser_arena_start", - "802937e8" : "bowser_fight_intro_dialog", - "8029386c" : "cutscene_bowser_arena_dialog", - "802938c8" : "cutscene_bowser_arena_end", - "80293944" : "cutscene_bowser_arena", - "80293abc" : "cutscene_star_spawn_store_info", - "80293ae8" : "cutscene_star_spawn_focus_star", - "80293b70" : "cutscene_star_spawn_update_boss_fight", - "80293bf4" : "cutscene_star_spawn_fly_back", - "80293c2c" : "cutscene_star_spawn", - "80293cb0" : "cutscene_star_spawn_back", - "80293d5c" : "cutscene_star_spawn_end", - "80293d90" : "cutscene_exit_waterfall_warp", - "80293dd4" : "cutscene_exit_to_castle_grounds_focus_mario", - "80293e7c" : "cutscene_exit_waterfall", - "80293ed8" : "cutscene_exit_to_castle_grounds_end", - "80293f2c" : "cutscene_exit_fall_to_castle_grounds_warp", - "80293f70" : "cutscene_exit_fall_to_castle_grounds", - "80293fcc" : "cutscene_red_coin_star_start", - "80294024" : "cutscene_red_coin_star_focus_xz", - "80294088" : "cutscene_red_coin_star_focus_y", - "802940cc" : "cutscene_red_coin_star_look_up_at_star", - "8029410c" : "cutscene_red_coin_star_warp", - "802942cc" : "cutscene_red_coin_star_set_fov", - "802942f0" : "cutscene_red_coin_star", - "802943d4" : "cutscene_red_coin_star_end", - "80294428" : "cutscene_goto_cvar_pos", - "80294718" : "cutscene_prepare_cannon_start", - "802947a4" : "cutscene_prepare_cannon_fly_to_cannon", - "8029480c" : "cannon_approach_prev", - "802948a0" : "cutscene_prepare_cannon_fly_back", - "80294a14" : "cutscene_prepare_cannon", - "80294a94" : "cutscene_prepare_cannon_end", - "80294ae8" : "water_death_move_to_mario_side", - "80294b78" : "death_goto_mario", - "80294bb4" : "cutscene_death_standing_start", - "80294c28" : "cutscene_death_standing_goto_mario", - "80294c5c" : "cutscene_death_standing", - "80294cc4" : "cutscene_death_stomach_start", - "80294d48" : "cutscene_death_stomach_goto_mario", - "80294db4" : "cutscene_death_stomach", - "80294e24" : "cutscene_bbh_death_start", - "80294ea8" : "cutscene_bbh_death_goto_mario", - "80294ee8" : "cutscene_bbh_death", - "80294f58" : "cutscene_quicksand_death_start", - "80294f94" : "cutscene_quicksand_death_goto_mario", - "80294fec" : "cutscene_quicksand_death", - "802950b0" : "cutscene_suffocation_fly_away", - "80295140" : "cutscene_suffocation_stay_above_gas", - "802951f0" : "cutscene_suffocation_rotate", - "80295270" : "cutscene_suffocation", - "80295310" : "cutscene_enter_pool_start", - "802953dc" : "cutscene_enter_pool_loop", - "80295418" : "cutscene_enter_pool", - "80295480" : "cutscene_pyramid_top_explode_start", - "802954ec" : "cutscene_pyramid_top_explode_zoom_in", - "80295518" : "cutscene_pyramid_top_explode_focus", - "80295580" : "cutscene_pyramid_top_explode_warp", - "80295670" : "cutscene_pyramid_top_explode_closeup", - "80295740" : "cutscene_pyramid_top_explode_cam_shake", - "8029576c" : "cutscene_pyramid_top_explode_warp_back", - "802957c8" : "cutscene_pyramid_top_explode", - "80295894" : "cutscene_pyramid_top_explode_end", - "802958d4" : "cutscene_enter_pyramid_top_start", - "80295930" : "cutscene_enter_pyramid_top", - "80295a58" : "cutscene_dialog_start", - "80295bf0" : "cutscene_dialog_move_mario_shoulder", - "80295e24" : "cutscene_dialog_create_dialog_box", - "80295e8c" : "cutscene_dialog", - "80295fb0" : "cutscene_dialog_set_flag", - "80295fd8" : "cutscene_dialog_end", - "80296020" : "cutscene_read_message_start", - "80296160" : "cutscene_read_message", - "802962c8" : "cutscene_read_message_set_flag", - "802962f0" : "cutscene_read_message_end", - "80296318" : "cutscene_exit_succ_start", - "802963b8" : "cutscene_non_painting_set_cam_pos", - "8029652c" : "cutscene_non_painting_set_cam_focus", - "8029665c" : "cutscene_exit_bowser_succ_focus_left", - "8029669c" : "cutscene_exit_bowser_key_toss_shake", - "802966e4" : "cutscene_exit_succ_shake_landing", - "80296710" : "cutscene_exit_bowser_succ", - "802967c4" : "cutscene_non_painting_end", - "8029685c" : "cutscene_exit_non_painting_succ_override_cvar", - "802968a0" : "cutscene_exit_non_painting_succ", - "8029695c" : "cutscene_non_painting_death_start", - "802969f8" : "cutscene_exit_bowser_death", - "80296a64" : "cutscene_non_painting_death_override_offset", - "80296b30" : "cutscene_non_painting_death", - "80296bc8" : "cutscene_cap_switch_press_start", - "80296c4c" : "cutscene_cap_switch_press_rotate_around_mario", - "80296d60" : "cutscene_cap_switch_press_lower_cam", - "80296da8" : "cutscene_cap_switch_press_approach_mario", - "80296eb4" : "cutscene_cap_switch_press_pan_left", - "80296f38" : "cutscene_cap_switch_press_create_dialog", - "80296fa8" : "cutscene_cap_switch_press", - "80297148" : "cutscene_unlock_key_door_start", - "8029720c" : "cutscene_unlock_key_door_approach_mario", - "80297290" : "cutscene_unlock_key_door_focus_lock", - "802972ec" : "cutscene_unlock_key_door_stub", - "80297300" : "cutscene_unlock_key_door_fly_back", - "80297384" : "cutscene_unlock_key_door_fov_shake", - "802973b0" : "cutscene_unlock_key_door", - "80297464" : "intro_peach_move_camera_start_to_pipe", - "80297560" : "peach_letter_text", - "8029758c" : "play_sound_peach_reading_letter", - "802975c4" : "cutscene_intro_peach_start_to_pipe_spline", - "8029762c" : "cutscene_intro_peach_dialog", - "802976bc" : "cutscene_intro_peach_follow_pipe_spline", - "80297728" : "cutscene_intro_peach_clear_cutscene_status", - "80297748" : "cutscene_intro_peach_zoom_fov", - "80297784" : "cutscene_intro_peach_reset_spline", - "802977c8" : "cutscene_intro_peach_handheld_shake_off", - "802977f4" : "intro_pipe_exit_text", - "80297820" : "play_sound_intro_turn_on_hud", - "8029784c" : "cutscene_intro_peach_fly_to_pipe", - "80297908" : "cutscene_intro_peach_mario_appears", - "80297a38" : "cutscene_intro_peach_reset_fov", - "80297a64" : "cutscene_intro_peach_letter", - "80297b58" : "cutscene_end_waving_start", - "80297b84" : "cutscene_end_waving", - "80297c14" : "cutscene_credits_reset_spline", - "80297c40" : "cutscene_credits", - "802980dc" : "cutscene_sliding_doors_open_start", - "8029819c" : "cutscene_sliding_doors_open_set_cvars", - "80298218" : "cutscene_sliding_doors_go_under_doorway", - "80298254" : "cutscene_sliding_doors_fly_back_up", - "80298290" : "cutscene_sliding_doors_follow_mario", - "802983b4" : "cutscene_sliding_doors_open", - "80298458" : "cutscene_double_doors_end", - "802984a0" : "cutscene_enter_painting_stub", - "802984b4" : "cutscene_enter_painting", - "802987b0" : "cutscene_exit_painting_start", - "8029894c" : "cutscene_exit_painting_move_to_mario", - "802989e8" : "cutscene_exit_painting_move_to_floor", - "80298af8" : "cutscene_exit_painting", - "80298ba0" : "cutscene_unused_exit_start", - "80298c2c" : "cutscene_unused_exit_focus_mario", - "80298ccc" : "cutscene_exit_painting_end", - "80298d44" : "cutscene_enter_cannon_end", - "80298d9c" : "cutscene_enter_cannon_raise", - "80298fe8" : "cutscene_enter_cannon_start", - "80299100" : "cutscene_door_start", - "80299154" : "cutscene_door_fix_cam", - "802991a8" : "cutscene_door_loop", - "802991f0" : "cutscene_door_move_behind_mario", - "802992cc" : "cutscene_door_follow_mario", - "80299360" : "cutscene_door_end", - "80299404" : "cutscene_door_mode", - "802994e8" : "play_cutscene", - "8029a2f8" : "cutscene_event", - "8029a37c" : "cutscene_spawn_obj", - "8029a3b4" : "set_fov_shake", - "8029a41c" : "set_fov_shake_from_point", - "8029a4d0" : "shake_camera_fov", - "8029a5e8" : "set_fov_30", - "8029a60c" : "approach_fov_20", - "8029a64c" : "set_fov_45", - "8029a670" : "set_fov_29", - "8029a694" : "zoom_fov_30", - "8029a6f4" : "fov_default", - "8029a858" : "approach_fov_30", - "8029a894" : "approach_fov_60", - "8029a8d0" : "approach_fov_45", - "8029a968" : "approach_fov_80", - "8029a9a4" : "set_fov_bbh", - "8029aa3c" : "geo_camera_fov", - "8029ab94" : "set_fov_function", - "8029abb0" : "cutscene_set_fov_shake_preset", - "8029ac30" : "set_fov_shake_from_point_preset", - "8029aef8" : "obj_rotate_towards_point", - "8029af98" : "intro_peach_set_pos_and_opacity", - "8029b08c" : "bhv_intro_peach_loop", - "8029b28c" : "intro_lakitu_set_offset_from_camera", - "8029b358" : "intro_lakitu_set_focus", - "8029b3c8" : "intro_lakitu_set_pos_and_focus", - "8029b49c" : "bhv_intro_lakitu_loop", - "8029bde4" : "bhv_end_birds_1_loop", - "8029bf64" : "bhv_end_birds_2_loop", - "8029c0e4" : "spawn_child_obj_relative", - "8029c254" : "bhv_intro_scene_loop", - "8029c770" : "nop_change_course", - "8029c780" : "copy_mario_state_to_object", - "8029c9cc" : "spawn_particle", - "8029ca58" : "bhv_mario_update", - "8029cb34" : "update_objects_starting_at", - "8029cbc8" : "update_objects_during_time_stop", - "8029cd28" : "update_objects_in_list", - "8029cd98" : "unload_deactivated_objects_in_list", - "8029ce58" : "set_object_respawn_info_bits", - "8029cedc" : "unload_objects_from_area", - "8029cfb0" : "spawn_objects_from_info", - "8029d1d8" : "stub_obj_list_processor_1", - "8029d1e8" : "clear_objects", - "8029d324" : "update_terrain_objects", - "8029d374" : "update_non_terrain_objects", - "8029d428" : "unload_deactivated_objects", - "8029d690" : "update_objects", - "8029d890" : "geo_update_projectile_pos_from_parent", - "8029d924" : "geo_update_layer_transparency", - "8029db48" : "geo_switch_anim_state", - "8029dbd4" : "geo_switch_area", - "8029dcd4" : "obj_update_pos_from_parent_transformation", - "8029dda8" : "obj_apply_scale_to_matrix", - "8029de80" : "create_transformation_from_matrices", - "8029e1b0" : "obj_set_held_state", - "8029e27c" : "lateral_dist_between_objects", - "8029e2f8" : "dist_between_objects", - "8029e398" : "cur_obj_forward_vel_approach_upward", - "8029e3e8" : "approach_f32_signed", - "8029e494" : "approach_f32_symmetric", - "8029e530" : "approach_s16_symmetric", - "8029e5ec" : "cur_obj_rotate_yaw_toward", - "8029e694" : "obj_angle_to_object", - "8029e714" : "obj_turn_toward_object", - "8029e8bc" : "obj_set_parent_relative_pos", - "8029e914" : "obj_set_pos", - "8029e96c" : "obj_set_angle", - "8029e9ac" : "spawn_object_abs_with_rot", - "8029ea24" : "spawn_object_rel_with_rot", - "8029eaac" : "spawn_obj_with_transform_flags", - "8029eb04" : "spawn_water_droplet", - "8029ed20" : "spawn_object_at_origin", - "8029edcc" : "spawn_object", - "8029ee24" : "try_to_spawn_object", - "8029eeb8" : "spawn_object_with_scale", - "8029ef64" : "spawn_object_relative", - "8029effc" : "spawn_object_relative_with_scale", - "8029f070" : "cur_obj_move_using_vel", - "8029f0c8" : "obj_copy_graph_y_offset", - "8029f0e0" : "obj_copy_pos_and_angle", - "8029f120" : "obj_copy_pos", - "8029f148" : "obj_copy_angle", - "8029f188" : "obj_set_gfx_pos_from_pos", - "8029f1b0" : "obj_init_animation", - "8029f200" : "linear_mtxf_mul_vec3f", - "8029f274" : "linear_mtxf_transpose_mul_vec3f", - "8029f2ec" : "obj_apply_scale_to_transform", - "8029f3a8" : "obj_copy_scale", - "8029f3d0" : "obj_scale_xyz", - "8029f404" : "obj_scale", - "8029f430" : "cur_obj_scale", - "8029f464" : "cur_obj_init_animation", - "8029f4b4" : "cur_obj_init_animation_with_sound", - "8029f514" : "cur_obj_init_animation_with_accel_and_sound", - "8029f59c" : "obj_init_animation_with_sound", - "8029f600" : "cur_obj_enable_rendering_and_become_tangible", - "8029f620" : "cur_obj_enable_rendering", - "8029f644" : "cur_obj_disable_rendering_and_become_intangible", - "8029f66c" : "cur_obj_disable_rendering", - "8029f694" : "cur_obj_unhide", - "8029f6bc" : "cur_obj_hide", - "8029f6e0" : "cur_obj_set_pos_relative", - "8029f7d8" : "cur_obj_set_pos_relative_to_parent", - "8029f820" : "cur_obj_enable_rendering_2", - "8029f848" : "cur_obj_unused_init_on_floor", - "8029f8ec" : "obj_set_face_angle_to_move_angle", - "8029f914" : "get_object_list_from_behavior", - "8029f95c" : "cur_obj_nearest_object_with_behavior", - "8029f998" : "cur_obj_dist_to_nearest_object_with_behavior", - "8029f9ec" : "cur_obj_find_nearest_object_with_behavior", - "8029fb1c" : "find_unimportant_object", - "8029fb68" : "count_unimportant_objects", - "8029fbdc" : "count_objects_with_behavior", - "8029fc9c" : "cur_obj_find_nearby_held_actor", - "8029fdb4" : "cur_obj_change_action", - "8029fe00" : "cur_obj_set_vel_from_mario_vel", - "8029fe6c" : "cur_obj_reverse_animation", - "8029fea4" : "cur_obj_extend_animation_if_at_end", - "8029ff04" : "cur_obj_check_if_near_animation_end", - "8029ffa4" : "cur_obj_check_if_at_animation_end", - "802a0008" : "cur_obj_check_anim_frame", - "802a0050" : "cur_obj_check_anim_frame_in_range", - "802a00ac" : "cur_obj_check_frame_prior_current_frame", - "802a0114" : "mario_is_in_air_action", - "802a0154" : "mario_is_dive_sliding", - "802a0198" : "cur_obj_set_y_vel_and_animation", - "802a01d8" : "cur_obj_unrender_and_reset_state", - "802a0380" : "cur_obj_get_thrown_or_placed", - "802a0474" : "cur_obj_get_dropped", - "802a04c0" : "cur_obj_set_model", - "802a04f0" : "mario_set_flag", - "802a0514" : "cur_obj_clear_interact_status_flag", - "802a0568" : "obj_mark_for_deletion", - "802a057c" : "cur_obj_disable", - "802a05b4" : "cur_obj_become_intangible", - "802a05d4" : "cur_obj_become_tangible", - "802a05f0" : "obj_become_tangible", - "802a0604" : "cur_obj_update_floor_height", - "802a064c" : "cur_obj_update_floor_height_and_get_floor", - "802a079c" : "cur_obj_apply_drag_xz", - "802a0e68" : "cur_obj_move_y", - "802a113c" : "cur_obj_unused_resolve_wall_collisions", - "802a11a8" : "abs_angle_diff", - "802a120c" : "cur_obj_move_xz_using_fvel_and_yaw", - "802a12a4" : "cur_obj_move_y_with_terminal_vel", - "802a1308" : "cur_obj_compute_vel_xz", - "802a1370" : "increment_velocity_toward_range", - "802a1424" : "obj_check_if_collided_with_object", - "802a148c" : "cur_obj_set_behavior", - "802a14c4" : "obj_set_behavior", - "802a14fc" : "cur_obj_has_behavior", - "802a1554" : "obj_has_behavior", - "802a15ac" : "cur_obj_lateral_dist_from_mario_to_home", - "802a1634" : "cur_obj_lateral_dist_to_home", - "802a16ac" : "cur_obj_outside_home_square", - "802a1774" : "cur_obj_outside_home_rectangle", - "802a184c" : "cur_obj_set_pos_to_home", - "802a188c" : "cur_obj_set_pos_to_home_and_stop", - "802a18dc" : "cur_obj_shake_y", - "802a1930" : "cur_obj_start_cam_event", - "802a1960" : "set_mario_interact_hoot_if_in_range", - "802a19ac" : "obj_set_billboard", - "802a19c8" : "cur_obj_set_hitbox_radius_and_height", - "802a19f0" : "cur_obj_set_hurtbox_radius_and_height", - "802a1b34" : "obj_spawn_loot_blue_coins", - "802a1b8c" : "obj_spawn_loot_yellow_coins", - "802a1bdc" : "cur_obj_spawn_loot_coin_at_mario_pos", - "802a1c68" : "cur_obj_abs_y_dist_to_home", - "802a1cc4" : "cur_obj_advance_looping_anim", - "802a1f3c" : "cur_obj_resolve_wall_collisions", - "802a2320" : "cur_obj_update_floor_and_walls", - "802a2348" : "cur_obj_move_standard", - "802a25b4" : "cur_obj_move_using_vel_and_gravity", - "802a2644" : "cur_obj_move_using_fvel_and_gravity", - "802a2674" : "obj_set_pos_relative", - "802a2748" : "cur_obj_angle_to_home", - "802a27b0" : "obj_set_gfx_pos_at_obj_pos", - "802a2804" : "obj_translate_local", - "802a2930" : "obj_build_transform_from_pos_and_angle", - "802a2a18" : "obj_set_throw_matrix_from_transform", - "802a2a84" : "obj_build_transform_relative_to_parent", - "802a2b28" : "obj_create_transform_from_self", - "802a2b6c" : "cur_obj_rotate_move_angle_using_vel", - "802a2bc4" : "cur_obj_rotate_face_angle_using_vel", - "802a2c1c" : "cur_obj_set_face_angle_to_move_angle", - "802a2c5c" : "cur_obj_follow_path", - "802a2ed4" : "chain_segment_init", - "802a2f14" : "random_f32_around_zero", - "802a2f5c" : "obj_scale_random", - "802a2fc0" : "obj_translate_xyz_random", - "802a308c" : "obj_translate_xz_random", - "802a31e0" : "cur_obj_set_pos_via_transform", - "802a3268" : "cur_obj_reflect_move_angle_off_wall", - "802a32ac" : "cur_obj_spawn_particles", - "802a34a4" : "obj_set_hitbox", - "802a3604" : "signum_positive", - "802a3634" : "absf", - "802a3674" : "absi", - "802a36a4" : "cur_obj_wait_then_blink", - "802a3754" : "cur_obj_is_mario_ground_pounding_platform", - "802a37ac" : "spawn_mist_particles", - "802a37dc" : "spawn_mist_particles_with_sound", - "802a3818" : "cur_obj_push_mario_away", - "802a390c" : "cur_obj_push_mario_away_from_cylinder", - "802a399c" : "bhv_dust_smoke_loop", - "802a3a4c" : "cur_obj_set_direction_table", - "802a3a88" : "cur_obj_progress_direction_table", - "802a3b28" : "stub_obj_helpers_3", - "802a3b40" : "cur_obj_scale_over_time", - "802a3c18" : "cur_obj_set_pos_to_home_with_debug", - "802a3cec" : "stub_obj_helpers_4", - "802a3cfc" : "cur_obj_is_mario_on_platform", - "802a3d40" : "cur_obj_shake_y_until", - "802a3dd4" : "cur_obj_move_up_and_down", - "802a3e30" : "cur_obj_call_action_function", - "802a3ef8" : "spawn_base_star_with_no_lvl_exit", - "802a3f24" : "bit_shift_left", - "802a3f48" : "cur_obj_mario_far_away", - "802a404c" : "is_mario_moving_fast_or_in_air", - "802a40b8" : "is_item_in_array", - "802a4120" : "bhv_init_room", - "802a4210" : "cur_obj_enable_rendering_if_mario_in_room", - "802a4360" : "cur_obj_set_hitbox_and_die_if_attacked", - "802a4440" : "obj_explode_and_spawn_coins", - "802a44f4" : "obj_set_collision_data", - "802a452c" : "cur_obj_if_hit_wall_bounce_away", - "802a4564" : "cur_obj_hide_if_mario_far_away_y", - "802a45e4" : "geo_offset_klepto_held_object", - "802a462c" : "geo_offset_klepto_debug", - "802a46cc" : "obj_is_hidden", - "802a4704" : "enable_time_stop", - "802a4728" : "disable_time_stop", - "802a4750" : "set_time_stop_flags", - "802a4774" : "clear_time_stop_flags", - "802a47a0" : "cur_obj_can_mario_activate_textbox", - "802a48bc" : "cur_obj_can_mario_activate_textbox_2", - "802a4960" : "cur_obj_update_dialog", - "802a4be4" : "cur_obj_update_dialog_with_cutscene", - "802a4f04" : "cur_obj_has_model", - "802a4f58" : "cur_obj_align_gfx_with_floor", - "802a5034" : "mario_is_within_rectangle", - "802a50fc" : "cur_obj_shake_screen", - "802a513c" : "obj_attack_collided_from_other_object", - "802a51ac" : "cur_obj_was_attacked_or_ground_pounded", - "802a5228" : "obj_copy_behavior_params", - "802a5248" : "cur_obj_init_animation_and_anim_frame", - "802a5288" : "cur_obj_init_animation_and_check_if_near_end", - "802a52c4" : "cur_obj_init_animation_and_extend_if_at_end", - "802a52f8" : "cur_obj_check_grabbed_mario", - "802a5358" : "player_performed_grab_escape_action", - "802a540c" : "cur_obj_unused_play_footstep_sound", - "802a5460" : "enable_time_stop_including_mario", - "802a5498" : "disable_time_stop_including_mario", - "802a54d8" : "cur_obj_check_interacted", - "802a5524" : "cur_obj_spawn_loot_blue_coin", - "802a5588" : "cur_obj_spawn_star_at_y_offset", - "802a5620" : "star_door_update_pos", - "802a56bc" : "bhv_star_door_loop", - "802a58dc" : "bhv_piranha_particle_loop", - "802a597c" : "mr_i_piranha_particle_act_0", - "802a5a44" : "mr_i_piranha_particle_act_1", - "802a5aa0" : "bhv_mr_i_particle_loop", - "802a5acc" : "spawn_mr_i_particle", - "802a5bd4" : "bhv_mr_i_body_loop", - "802a5d4c" : "mr_i_act_3", - "802a6518" : "mr_i_act_2", - "802a68a0" : "mr_i_act_1", - "802a6ad8" : "mr_i_act_0", - "802a6b7c" : "bhv_mr_i_loop", - "802a6c20" : "bhv_pole_init", - "802a6c74" : "bhv_giant_pole_loop", - "802a6cf4" : "bhv_thi_huge_island_top_loop", - "802a6d64" : "bhv_thi_tiny_island_top_loop", - "802a6ee4" : "cap_switch_act_0", - "802a7020" : "cap_switch_act_1", - "802a708c" : "cap_switch_act_2", - "802a7160" : "cap_switch_act_3", - "802a7170" : "bhv_cap_switch_loop", - "802a719c" : "geo_update_held_mario_pos", - "802a7230" : "bhv_bobomb_anchor_mario_loop", - "802a7264" : "king_bobomb_act_0", - "802a7384" : "mario_is_far_below_object", - "802a73d8" : "king_bobomb_act_2", - "802a7598" : "king_bobomb_act_3", - "802a7804" : "king_bobomb_act_1", - "802a78d8" : "king_bobomb_act_6", - "802a7a60" : "king_bobomb_act_7", - "802a7b1c" : "king_bobomb_act_8", - "802a7b5c" : "king_bobomb_act_4", - "802a7d14" : "king_bobomb_act_5", - "802a7fbc" : "king_bobomb_move", - "802a8064" : "bhv_king_bobomb_loop", - "802a816c" : "bhv_beta_chest_bottom_init", - "802a81e8" : "bhv_beta_chest_bottom_loop", - "802a821c" : "bhv_beta_chest_lid_loop", - "802a8370" : "bhv_water_air_bubble_init", - "802a83a0" : "bhv_water_air_bubble_loop", - "802a8630" : "bhv_bubble_wave_init", - "802a86bc" : "scale_bubble_random", - "802a870c" : "bhv_bubble_maybe_loop", - "802a88a4" : "bhv_small_water_wave_loop", - "802a8a38" : "scale_bubble_sin", - "802a8b18" : "bhv_particle_init", - "802a8bc0" : "bhv_particle_loop", - "802a8c88" : "bhv_small_bubbles_loop", - "802a8cdc" : "bhv_fish_group_loop", - "802a8d48" : "bhv_water_waves_init", - "802a8d98" : "bhv_cannon_base_unused_loop", - "802a8dc0" : "opened_cannon_act_0", - "802a8f40" : "opened_cannon_act_4", - "802a9114" : "opened_cannon_act_6", - "802a92fc" : "opened_cannon_act_5", - "802a93f8" : "opened_cannon_act_1", - "802a9440" : "opened_cannon_act_2", - "802a9460" : "opened_cannon_act_3", - "802a9498" : "bhv_cannon_base_loop", - "802a94f8" : "bhv_cannon_barrel_loop", - "802a958c" : "common_anchor_mario_behavior", - "802a9708" : "bhv_chuckya_anchor_mario_loop", - "802a973c" : "unknown_chuckya_function", - "802a98c4" : "approach_forward_vel", - "802a9994" : "chuckya_act_0", - "802a9d08" : "chuckya_act_1", - "802a9f54" : "chuckya_act_3", - "802a9fc8" : "chuckya_act_2", - "802aa02c" : "chuckya_move", - "802aa0ac" : "bhv_chuckya_loop", - "802aa1b8" : "bhv_wf_breakable_wall_loop", - "802aa280" : "check_mario_attacking", - "802aa3c8" : "init_kickable_board_rock", - "802aa3f4" : "bhv_kickable_board_loop", - "802aa700" : "bhv_tower_door_loop", - "802aa774" : "bhv_wf_rotating_wooden_platform_loop", - "802aa830" : "bhv_rotating_platform_loop", - "802aa948" : "set_koopa_shell_underwater_hitbox", - "802aa97c" : "bhv_koopa_shell_underwater_loop", - "802aaa60" : "bhv_warp_loop", - "802aab54" : "bhv_fading_warp_loop", - "802aac48" : "bhv_white_puff_exploding_loop", - "802aae8c" : "spawn_mist_particles_variable", - "802aaf48" : "bhv_spawned_star_init", - "802aaffc" : "set_sparkle_spawn_star_hitbox", - "802ab060" : "set_home_to_mario", - "802ab158" : "set_y_home_to_pos", - "802ab18c" : "slow_star_rotation", - "802ab1c8" : "bhv_spawned_star_loop", - "802ab558" : "bhv_spawn_star_no_level_exit", - "802ab5c8" : "bhv_coin_sparkles_init", - "802ab650" : "bhv_yellow_coin_init", - "802ab70c" : "bhv_yellow_coin_loop", - "802ab748" : "bhv_temp_coin_loop", - "802ab7a4" : "bhv_coin_init", - "802ab860" : "bhv_coin_loop", - "802aba40" : "bhv_coin_formation_spawn_loop", - "802abc04" : "spawn_coin_in_formation", - "802abee4" : "bhv_coin_formation_init", - "802abf0c" : "bhv_coin_formation_loop", - "802ac068" : "coin_inside_boo_act_1", - "802ac15c" : "coin_inside_boo_act_0", - "802ac294" : "bhv_coin_inside_boo_loop", - "802ac2c0" : "bhv_coin_sparkles_loop", - "802ac2ec" : "bhv_golden_coin_sparkles_loop", - "802ac3a8" : "bhv_punch_tiny_triangle_loop", - "802ac4a0" : "bhv_punch_tiny_triangle_init", - "802ac5b4" : "bhv_wall_tiny_star_particle_loop", - "802ac678" : "bhv_tiny_star_particles_init", - "802ac78c" : "bhv_pound_tiny_star_particle_loop", - "802ac864" : "bhv_pound_tiny_star_particle_init", - "802ac910" : "door_animation_and_reset", - "802ac958" : "set_door_camera_event", - "802ac9d0" : "play_door_open_noise", - "802aca6c" : "play_warp_door_open_noise", - "802acac8" : "bhv_door_loop", - "802acc3c" : "bhv_door_init", - "802ace80" : "bhv_star_door_loop_2", - "802ad078" : "grindel_thwomp_act_4", - "802ad10c" : "grindel_thwomp_act_2", - "802ad1a4" : "grindel_thwomp_act_3", - "802ad238" : "grindel_thwomp_act_1", - "802ad2d0" : "grindel_thwomp_act_0", - "802ad34c" : "bhv_grindel_thwomp_loop", - "802ad378" : "bhv_tumbling_bridge_platform_loop", - "802ad580" : "tumbling_bridge_act_1", - "802ad76c" : "tumbling_bridge_act_2", - "802ad7f4" : "tumbling_bridge_act_3", - "802ad828" : "tumbling_bridge_act_0", - "802ad890" : "bhv_tumbling_bridge_loop", - "802ad8bc" : "elevator_starting_shake", - "802ad8f0" : "elevator_act_0", - "802ada4c" : "elevator_act_1", - "802adb88" : "elevator_act_2", - "802adce4" : "elevator_act_4", - "802add70" : "elevator_act_3", - "802addf8" : "bhv_elevator_init", - "802adf6c" : "bhv_elevator_loop", - "802adf98" : "bhv_water_mist_spawn_loop", - "802adfd8" : "bhv_water_mist_loop", - "802ae0cc" : "spawn_triangle_break_particles", - "802ae238" : "bhv_water_mist_2_loop", - "802ae304" : "bhv_pound_white_puffs_init", - "802ae334" : "spawn_mist_from_global", - "802ae360" : "bhv_ground_sand_init", - "802ae394" : "spawn_smoke_with_velocity", - "802ae45c" : "clear_particle_flags", - "802ae48c" : "bhv_ground_snow_init", - "802ae4c0" : "spawn_wind_particles", - "802ae534" : "bhv_wind_loop", - "802ae85c" : "bhv_unused_particle_spawn_loop", - "802ae908" : "bhv_ukiki_cage_star_loop", - "802aea6c" : "ukiki_cage_act_wait_for_ukiki", - "802aeab8" : "ukiki_cage_act_spin", - "802aeb1c" : "ukiki_cage_act_fall", - "802aeb74" : "ukiki_cage_act_hide", - "802aeb9c" : "bhv_ukiki_cage_loop", - "802aebc8" : "bhv_squishable_platform_loop", - "802aec40" : "bhv_bitfs_sinking_platform_loop", - "802aeca8" : "bhv_ddd_moving_pole_loop", - "802aecdc" : "bhv_bitfs_sinking_cage_platform_loop", - "802aedc0" : "bhv_beta_moving_flames_spawn_loop", - "802aeea4" : "bhv_beta_moving_flames_loop", - "802aef1c" : "bhv_flamethrower_flame_loop", - "802af1e8" : "bhv_flamethrower_loop", - "802af3fc" : "bhv_rr_rotating_bridge_platform_loop", - "802af448" : "bhv_bouncing_fireball_flame_loop", - "802af5f8" : "bhv_bouncing_fireball_loop", - "802af7c4" : "bhv_bowser_shock_wave_loop", - "802af9cc" : "bhv_black_smoke_upward_loop", - "802afa0c" : "bhv_black_smoke_bowser_loop", - "802afae4" : "bhv_black_smoke_mario_loop", - "802afbf8" : "bhv_flame_mario_loop", - "802afce4" : "bhv_beta_fish_splash_spawner_loop", - "802afd1c" : "bhv_spindrift_loop", - "802afee8" : "bhv_wf_solid_tower_platform_loop", - "802aff30" : "bhv_wf_elevator_tower_platform_loop", - "802b00e4" : "bhv_wf_sliding_tower_platform_loop", - "802b0244" : "spawn_and_init_wf_platforms", - "802b039c" : "spawn_wf_platform_group", - "802b04b4" : "bhv_tower_platform_group_loop", - "802b0614" : "bhv_tree_snow_or_leaf_loop", - "802b0974" : "bhv_snow_leaf_particle_spawn_init", - "802b0b9c" : "square_plat_set_yaw_until_timer", - "802b0bec" : "bhv_squarish_path_moving_loop", - "802b0d48" : "bhv_piranha_plant_waking_bubbles_loop", - "802b0df0" : "bhv_piranha_plant_bubble_loop", - "802b1278" : "bhv_purple_switch_loop", - "802b14f4" : "check_if_moving_over_floor", - "802b15e8" : "bhv_pushable_loop", - "802b1714" : "breakable_box_init", - "802b17f4" : "hidden_breakable_box_actions", - "802b19d8" : "hidden_unbreakable_box_actions", - "802b1ae0" : "bhv_hidden_object_loop", - "802b1b2c" : "bhv_breakable_box_loop", - "802b1bb0" : "geo_move_mario_part_from_parent", - "802b1c54" : "bhv_heave_ho_throw_mario_loop", - "802b1d7c" : "heave_ho_act_1", - "802b1e6c" : "heave_ho_act_2", - "802b1ff4" : "heave_ho_act_3", - "802b20a0" : "heave_ho_act_0", - "802b2154" : "heave_ho_move", - "802b2278" : "bhv_heave_ho_loop", - "802b2340" : "bhv_ccm_touched_star_spawn_loop", - "802b23e0" : "bhv_unused_poundable_platform", - "802b2494" : "bhv_beta_trampoline_spring_loop", - "802b25ac" : "bhv_beta_trampoline_top_loop", - "802b26a4" : "jumping_box_act_0", - "802b27d8" : "jumping_box_act_1", - "802b2824" : "jumping_box_free_update", - "802b288c" : "bhv_jumping_box_loop", - "802b29b8" : "bhv_boo_cage_loop", - "802b2bc8" : "spawn_sparkle_particles", - "802b2d10" : "bhv_alpha_boo_key_loop", - "802b3108" : "bhv_beta_boo_key_loop", - "802b3134" : "arc_to_goal_pos", - "802b3250" : "grand_star_zero_velocity", - "802b329c" : "bhv_grand_star_loop", - "802b3600" : "bhv_bowser_key_loop", - "802b37b8" : "bhv_white_puff_smoke_init", - "802b3810" : "bhv_bullet_bill_init", - "802b3830" : "bullet_bill_act_0", - "802b38b8" : "bullet_bill_act_1", - "802b394c" : "bullet_bill_act_2", - "802b3b08" : "bullet_bill_act_3", - "802b3b24" : "bullet_bill_act_4", - "802b3be0" : "bhv_bullet_bill_loop", - "802b3c2c" : "bowser_tail_anchor_act_0", - "802b3cdc" : "bowser_tail_anchor_act_1", - "802b3d10" : "bowser_tail_anchor_act_2", - "802b3d74" : "bhv_bowser_tail_anchor_loop", - "802b3df4" : "bhv_bowser_flame_spawn_loop", - "802b4080" : "bhv_bowser_body_anchor_loop", - "802b4184" : "bowser_spawn_shockwave", - "802b41fc" : "bowser_bounce", - "802b4288" : "bowser_set_anim_look_up_and_walk", - "802b4300" : "bowser_set_anim_slow_gait", - "802b4368" : "bowser_set_anim_look_down", - "802b43dc" : "bowser_initialize_action", - "802b4478" : "bowser_act_text_wait", - "802b44bc" : "bowser_act_intro_walk", - "802b45f4" : "bowser_bitdw_act_controller", - "802b473c" : "bowser_bitfs_act_controller", - "802b48d4" : "bowser_general_bits_act_controller", - "802b4a1c" : "bowser_set_act_jump", - "802b4a3c" : "bowser_bits_act_controller", - "802b4af4" : "bowser_reset_fallen_off_stage", - "802b4bac" : "bowser_act_unused_slow_walk", - "802b4be8" : "bowser_act_default", - "802b4ca4" : "bowser_act_breath_fire", - "802b4d14" : "bowser_act_walk_to_mario", - "802b4f00" : "bowser_act_teleport", - "802b5104" : "bowser_act_spit_fire_into_sky", - "802b5218" : "bowser_act_hit_mine", - "802b53f4" : "bowser_set_anim_in_air", - "802b5444" : "bowser_land", - "802b5554" : "bowser_short_second_hop", - "802b55cc" : "bowser_act_jump", - "802b5798" : "bowser_act_jump_towards_mario", - "802b58bc" : "bowser_act_hit_edge", - "802b59cc" : "bowser_act_spit_fire_onto_floor", - "802b5aec" : "bowser_turn_on_timer", - "802b5c00" : "bowser_act_turn_from_edge", - "802b5c40" : "bowser_act_charge_mario", - "802b5f6c" : "bowser_check_hit_mine", - "802b5fec" : "bowser_act_thrown_dropped", - "802b611c" : "bowser_set_goal_invisible", - "802b6190" : "bowser_act_jump_onto_stage", - "802b6568" : "bowser_act_dance", - "802b65d0" : "bowser_spawn_grand_star_key", - "802b6670" : "bowser_fly_back_dead", - "802b6730" : "bowser_dead_bounce", - "802b67d4" : "bowser_dead_wait_for_mario", - "802b6878" : "bowser_dead_twirl_into_trophy", - "802b6a10" : "bowser_dead_hide", - "802b6a78" : "bowser_dead_not_bits_end", - "802b6bac" : "bowser_dead_bits_end", - "802b6cf0" : "bowser_act_dead", - "802b6e40" : "bowser_tilt_platform", - "802b6ee0" : "bowser_act_ride_tilting_platform", - "802b711c" : "bowser_check_fallen_off_stage", - "802b71e4" : "bowser_free_update", - "802b72d4" : "bowser_held_update", - "802b7418" : "bowser_thrown_dropped_update", - "802b75a4" : "bhv_bowser_loop", - "802b7878" : "bhv_bowser_init", - "802b798c" : "geo_update_body_rot_from_parent", - "802b7a20" : "bowser_open_eye_switch", - "802b7c64" : "geo_switch_bowser_eyes", - "802b7d44" : "geo_bits_bowser_coloring", - "802b7e68" : "falling_bowser_plat_act_0", - "802b7ef0" : "falling_bowser_plat_act_1", - "802b8024" : "falling_bowser_plat_act_2", - "802b8384" : "bhv_falling_bowser_platform_loop", - "802b83b0" : "bowser_flame_despawn", - "802b8434" : "bowser_flame_should_despawn", - "802b84ac" : "bhv_flame_bowser_init", - "802b85b0" : "bhv_flame_large_burning_out_init", - "802b8654" : "bowser_flame_move", - "802b8734" : "bhv_flame_bowser_loop", - "802b8960" : "bhv_flame_moving_forward_growing_init", - "802b89ec" : "bhv_flame_moving_forward_growing_loop", - "802b8b1c" : "bhv_flame_floating_landing_init", - "802b8c38" : "bhv_flame_floating_landing_loop", - "802b8d68" : "bhv_blue_bowser_flame_init", - "802b8e7c" : "bhv_blue_bowser_flame_loop", - "802b9034" : "bhv_flame_bouncing_init", - "802b90ec" : "bhv_flame_bouncing_loop", - "802b921c" : "bhv_blue_flames_group_loop", - "802b935c" : "bhv_blue_fish_movement_loop", - "802b9790" : "bhv_tank_fish_group_loop", - "802b98d4" : "vec3f_copy_2", - "802b98fc" : "bhv_checkerboard_elevator_group_init", - "802b9a78" : "checkerboard_plat_act_move_y", - "802b9af8" : "checkerboard_plat_act_rotate", - "802b9bb4" : "bhv_checkerboard_platform_init", - "802b9bd8" : "bhv_checkerboard_platform_loop", - "802b9e94" : "bhv_ddd_warp_loop", - "802b9efc" : "water_level_pillar_undrained", - "802ba13c" : "water_level_pillar_drained", - "802ba19c" : "bhv_water_level_pillar_init", - "802ba1e0" : "bhv_water_level_pillar_loop", - "802ba25c" : "bhv_invisible_objects_under_bridge_init", - "802ba2b0" : "geo_scale_bowser_key", - "802ba2f8" : "bhv_bowser_key_unlock_door_loop", - "802ba458" : "bhv_bowser_key_course_exit_loop", - "802ba5bc" : "bhv_moat_grills_loop", - "802ba608" : "bhv_rotating_clock_arm_loop", - "802ba7e0" : "handle_hat_ukiki_reset", - "802ba868" : "is_hat_ukiki_and_mario_has_hat", - "802ba8c4" : "geo_update_projectile_pos_from_parent_copy", - "802ba958" : "idle_ukiki_taunt", - "802bab7c" : "ukiki_act_idle", - "802bae40" : "ukiki_act_return_home", - "802baec4" : "ukiki_act_wait_to_respawn", - "802baf10" : "ukiki_act_unused_turn", - "802baf64" : "ukiki_act_turn_to_mario", - "802bb07c" : "ukiki_act_run", - "802bb288" : "ukiki_act_jump", - "802bb3b8" : "ukiki_act_go_to_cage", - "802bb798" : "ukiki_free_loop", - "802bb888" : "cage_ukiki_held_loop", - "802bba3c" : "hat_ukiki_held_loop", - "802bbb98" : "bhv_ukiki_init", - "802bbc0c" : "bhv_ukiki_loop", - "802bbd6c" : "lll_octagonal_mesh_move", - "802bbfd8" : "lll_octagonal_mesh_find_y_offset", - "802bc0f0" : "bhv_lll_moving_octagonal_mesh_platform_loop", - "802bc22c" : "bhv_lll_sinking_rock_block_loop", - "802bc294" : "bhv_lll_rotating_hex_flame_loop", - "802bc348" : "fire_bar_spawn_flames", - "802bc4f4" : "fire_bar_act_0", - "802bc538" : "fire_bar_act_1", - "802bc590" : "fire_bar_act_2", - "802bc5fc" : "fire_bar_act_3", - "802bc618" : "bhv_lll_rotating_block_fire_bars_loop", - "802bc660" : "bhv_lll_wood_piece_loop", - "802bc728" : "bhv_lll_floating_wood_bridge_loop", - "802bc898" : "bhv_volcano_flames_loop", - "802bc934" : "hexagonal_ring_spawn_flames", - "802bca74" : "bhv_lll_rotating_hexagonal_ring_loop", - "802bcce8" : "sinking_rectangular_plat_actions", - "802bcda8" : "bhv_lll_sinking_rectangular_platform_loop", - "802bce58" : "bhv_lll_sinking_square_platforms_loop", - "802bce9c" : "create_transform_from_normals", - "802bcf40" : "bhv_platform_normals_init", - "802bcfc4" : "approach_by_increment", - "802bd058" : "bhv_tilting_inverted_pyramid_loop", - "802bd3e4" : "koopa_shell_spawn_water_drop", - "802bd488" : "bhv_koopa_shell_flame_loop", - "802bd5dc" : "bhv_koopa_shell_flame_spawn", - "802bd62c" : "koopa_shell_spawn_sparkles", - "802bd680" : "bhv_koopa_shell_loop", - "802bd8d0" : "tox_box_shake_screen", - "802bd91c" : "tox_box_move", - "802bdb04" : "tox_box_act_4", - "802bdb3c" : "tox_box_act_5", - "802bdb74" : "tox_box_act_6", - "802bdbac" : "tox_box_act_7", - "802bdbe4" : "tox_box_act_1", - "802bdc7c" : "tox_box_act_2", - "802bdcc8" : "tox_box_act_3", - "802bdd14" : "tox_box_act_0", - "802bdd68" : "bhv_tox_box_loop", - "802bdd9c" : "piranha_plant_act_idle", - "802bde10" : "piranha_plant_check_interactions", - "802bdeec" : "piranha_plant_act_sleeping", - "802be034" : "piranha_plant_act_woken_up", - "802be0b8" : "piranha_plant_reset_when_far", - "802be0ec" : "piranha_plant_attacked", - "802be150" : "piranha_plant_act_shrink_and_die", - "802be234" : "piranha_plant_act_wait_to_respawn", - "802be278" : "piranha_plant_act_respawn", - "802be350" : "piranha_plant_act_biting", - "802be49c" : "mario_moving_fast_enough_to_make_piranha_plant_bite", - "802be50c" : "piranha_plant_act_stopped_biting", - "802be5a0" : "bhv_piranha_plant_loop", - "802be628" : "bhv_lll_bowser_puzzle_spawn_piece", - "802be6d4" : "bhv_lll_bowser_puzzle_spawn_pieces", - "802be79c" : "bhv_lll_bowser_puzzle_loop", - "802be8a8" : "bhv_lll_bowser_puzzle_piece_action_0", - "802be8b8" : "bhv_lll_bowser_puzzle_piece_action_1", - "802be8f4" : "bhv_lll_bowser_puzzle_piece_update", - "802be9dc" : "bhv_lll_bowser_puzzle_piece_move", - "802beb14" : "bhv_lll_bowser_puzzle_piece_idle", - "802beb54" : "bhv_lll_bowser_puzzle_piece_move_left", - "802beb8c" : "bhv_lll_bowser_puzzle_piece_move_right", - "802bebc4" : "bhv_lll_bowser_puzzle_piece_move_up", - "802bebfc" : "bhv_lll_bowser_puzzle_piece_move_down", - "802bec34" : "bhv_lll_bowser_puzzle_piece_loop", - "802becb0" : "set_obj_anim_with_accel_and_sound", - "802bed7c" : "play_penguin_walking_sound", - "802bedec" : "tuxies_mother_act_2", - "802bef8c" : "tuxies_mother_act_1", - "802bf1d8" : "tuxies_mother_act_0", - "802bf3c0" : "bhv_tuxies_mother_loop", - "802bf424" : "small_penguin_dive_with_mario", - "802bf474" : "small_penguin_act_2", - "802bf57c" : "small_penguin_act_1", - "802bf648" : "small_penguin_act_3", - "802bf6e4" : "small_penguin_act_4", - "802bf760" : "small_penguin_act_0", - "802bf90c" : "small_penguin_act_5", - "802bfa14" : "small_penguin_free_actions", - "802bfa88" : "bhv_small_penguin_loop", - "802bfbac" : "geo_switch_tuxie_mother_eyes", - "802bfcd8" : "fish_act_spawn", - "802bfeb8" : "fish_act_respawn", - "802bff20" : "fish_act_init", - "802bff3c" : "bhv_large_fish_group_loop", - "802bff68" : "fish_regroup", - "802c00b4" : "fish_group_act_rotation", - "802c0348" : "fish_group_act_move", - "802c06a8" : "fish_group_act_animate", - "802c0768" : "bhv_fish_loop", - "802c08a8" : "bhv_wdw_express_elevator_loop", - "802c0aac" : "bub_spawner_act_0", - "802c0b50" : "bub_spawner_act_1", - "802c0ba4" : "bub_spawner_act_2", - "802c0bc4" : "bub_spawner_act_3", - "802c0be0" : "bhv_bub_spawner_loop", - "802c0c0c" : "bub_move_vertically", - "802c0cd4" : "bub_act_0", - "802c0d44" : "bub_act_1", - "802c0f90" : "bub_act_2", - "802c1204" : "bhv_bub_loop", - "802c12c0" : "bhv_rotating_exclamation_box_loop", - "802c1308" : "exclamation_box_act_0", - "802c13ec" : "exclamation_box_act_1", - "802c14b0" : "exclamation_box_act_2", - "802c15b8" : "exclamation_box_act_3", - "802c17bc" : "exclamation_box_spawn_contents", - "802c18d0" : "exclamation_box_act_4", - "802c1988" : "exclamation_box_act_5", - "802c19c0" : "bhv_exclamation_box_loop", - "802c19fc" : "bhv_sound_spawner_init", - "802c1a40" : "bhv_bowsers_sub_loop", - "802c1a80" : "bhv_sushi_shark_collision_loop", - "802c1a90" : "bhv_sushi_shark_loop", - "802c1c44" : "bhv_sunken_ship_part_loop", - "802c1cd4" : "bhv_ship_part_3_loop", - "802c1e10" : "bhv_jrb_sliding_box_loop", - "802c2190" : "bhv_white_puff_1_loop", - "802c2274" : "bhv_white_puff_2_loop", - "802c22b8" : "bhv_hidden_blue_coin_loop", - "802c242c" : "bhv_blue_coin_switch_loop", - "802c263c" : "bhv_openable_cage_door_loop", - "802c26f8" : "bhv_openable_grill_loop", - "802c2930" : "bhv_init_changing_water_level_loop", - "802c2a24" : "bhv_water_level_diamond_loop", - "802c2ce8" : "tweester_scale_and_move", - "802c2ebc" : "tweester_act_idle", - "802c2fbc" : "tweester_act_chase", - "802c31c4" : "tweester_act_hide", - "802c329c" : "bhv_tweester_loop", - "802c32e8" : "bhv_tweester_sand_particle_loop", - "802c3440" : "bhv_boo_init", - "802c3684" : "bhv_courtyard_boo_triplet_init", - "802c4824" : "bhv_boo_loop", - "802c4f30" : "bhv_big_boo_loop", - "802c515c" : "bhv_boo_with_cage_init", - "802c51d4" : "bhv_boo_with_cage_loop", - "802c5224" : "bhv_merry_go_round_boo_manager_loop", - "802c53cc" : "obj_set_secondary_camera_focus", - "802c53ec" : "bhv_animated_texture_loop", - "802c5414" : "bhv_boo_in_castle_loop", - "802c5688" : "bhv_boo_boss_spawned_bridge_loop", - "802c5890" : "bhv_bbh_tilting_trap_platform_loop", - "802c5a38" : "bhv_haunted_bookshelf_loop", - "802c5ca8" : "bhv_merry_go_round_loop", - "802c5dc0" : "bhv_static_checkered_platform_loop", - "802c5f48" : "bhv_beta_bowser_anchor_loop", - "802c5fdc" : "bhv_play_music_track_when_touched_loop", - "802c6050" : "bhv_floor_trap_in_castle_loop", - "802c60ac" : "bhv_castle_floor_trap_init", - "802c6150" : "bhv_castle_floor_trap_open_detect", - "802c61d4" : "bhv_castle_floor_trap_open", - "802c6278" : "bhv_castle_floor_trap_close_detect", - "802c62bc" : "bhv_castle_floor_trap_close", - "802c6328" : "bhv_castle_floor_trap_rotate", - "802c6348" : "bhv_castle_floor_trap_loop", - "802c63e8" : "bhv_pole_base_loop", - "802c64a4" : "bhv_sparkle_spawn_loop", - "802c6538" : "update_angle_from_move_flags", - "802c65c0" : "bhv_scuttlebug_loop", - "802c6b6c" : "bhv_scuttlebug_spawn_loop", - "802c6ca0" : "whomp_play_sfx_from_pound_animation", - "802c6d6c" : "whomp_act_0", - "802c6ec8" : "whomp_act_7", - "802c6fb0" : "whomp_act_1", - "802c710c" : "whomp_act_2", - "802c7254" : "whomp_act_3", - "802c72b4" : "whomp_act_4", - "802c7380" : "whomp_act_5", - "802c7428" : "king_whomp_on_ground", - "802c75fc" : "whomp_on_ground", - "802c76d4" : "whomp_act_6", - "802c7858" : "whomp_act_8", - "802c7998" : "whomp_act_9", - "802c79d8" : "bhv_whomp_loop", - "802c7a70" : "bhv_water_splash_spawn_droplets", - "802c7b14" : "bhv_water_droplet_loop", - "802c7cac" : "bhv_idle_water_wave_loop", - "802c7d40" : "bhv_water_droplet_splash_init", - "802c7d90" : "bhv_bubble_splash_init", - "802c7dfc" : "bhv_shallow_water_splash_init", - "802c7e5c" : "bhv_wave_trail_shrink", - "802c7f98" : "bhv_strong_wind_particle_loop", - "802c81b4" : "cur_obj_spawn_strong_wind_particles", - "802c834c" : "bhv_sl_snowman_wind_loop", - "802c863c" : "bhv_sl_walking_penguin_loop", - "802c89f0" : "update_mario_platform", - "802c8b4c" : "get_mario_pos", - "802c8b8c" : "set_mario_pos", - "802c8bc8" : "apply_platform_displacement", - "802c8ec0" : "apply_mario_platform_displacement", - "802c8f28" : "clear_mario_platform", - "802c8f40" : "debug_print_obj_collision", - "802c8fe4" : "detect_object_hitbox_overlap", - "802c91ec" : "detect_object_hurtbox_overlap", - "802c9388" : "clear_object_collision", - "802c93f8" : "check_collision_in_list", - "802c94ac" : "check_player_object_collision", - "802c95b4" : "check_pushable_object_collision", - "802c9630" : "check_destructive_object_collision", - "802c9724" : "detect_object_collisions", - "802c97d0" : "unused_init_free_list", - "802c9840" : "unused_try_allocate", - "802c98a4" : "try_allocate_object", - "802c9950" : "unused_deallocate", - "802c99b8" : "init_free_object_list", - "802c9a3c" : "clear_object_lists", - "802c9b68" : "unload_object", - "802c9c00" : "allocate_object", - "802c9f04" : "create_object", - "802ca028" : "mark_obj_for_deletion", - "802ca040" : "exec_anim_sound_state", - "802ca144" : "create_sound_spawner", - "802ca190" : "cur_obj_play_sound_1", - "802ca1e0" : "cur_obj_play_sound_2", - "802ca230" : "calc_dist_to_volume_range_1", - "802ca2d4" : "calc_dist_to_volume_range_2", - "802ca370" : "stub_debug_1", - "802ca380" : "stub_debug_2", - "802ca390" : "stub_debug_3", - "802ca3a0" : "stub_debug_4", - "802ca3b0" : "get_current_clock", - "802ca3e0" : "get_clock_difference", - "802ca418" : "set_print_state_info", - "802ca460" : "print_text_array_info", - "802ca51c" : "set_text_array_x_y", - "802ca568" : "print_debug_bottom_up", - "802ca5b8" : "print_debug_top_down_objectinfo", - "802ca618" : "print_debug_top_down_mapinfo", - "802ca680" : "print_debug_top_down_normal", - "802ca6d0" : "print_mapinfo", - "802ca8e8" : "print_checkinfo", - "802ca918" : "print_surfaceinfo", - "802ca94c" : "print_stageinfo", - "802ca990" : "print_string_array_info", - "802caa6c" : "print_effectinfo", - "802caaa8" : "print_enemyinfo", - "802caae4" : "update_debug_dpadmask", - "802cabac" : "debug_unknown_level_select_check", - "802cac20" : "reset_debug_objectinfo", - "802cb0b0" : "stub_debug_5", - "802cb0c0" : "try_print_debug_mario_object_info", - "802cb1c0" : "try_print_debug_mario_level_info", - "802cb264" : "try_do_mario_debug_object_spawn", - "802cb564" : "debug_enemy_unknown", - "802cb5c0" : "set_and_reset_transition_fade_timer", - "802cb640" : "set_transition_color_fade_alpha", - "802cb894" : "vertex_transition_color", - "802cba18" : "dl_transition_color", - "802cbbc4" : "render_fade_transition_from_color", - "802cbc20" : "render_fade_transition_into_color", - "802cbc7c" : "calc_tex_transition_radius", - "802cbd54" : "calc_tex_transition_time", - "802cbe64" : "convert_tex_transition_angle_to_pos", - "802cbee0" : "center_tex_transition_x", - "802cbf64" : "center_tex_transition_y", - "802cbfe8" : "make_tex_transition_vertex", - "802cc180" : "load_tex_transition_vertex", - "802cc4d8" : "render_textured_transition", - "802ccbe8" : "render_screen_transition", - "802ccdc8" : "render_cannon_circle_base", - "802cd1e8" : "geo_cannon_circle_base", - "802cd280" : "rotate_rectangle", - "802cd328" : "atan2_deg", - "802cd388" : "scale_shadow_with_distance", - "802cd444" : "disable_shadow_with_distance", - "802cd48c" : "dim_shadow_with_distance", - "802cd614" : "get_water_level_below_shadow", - "802cd6c4" : "init_shadow", - "802cd938" : "get_texture_coords_9_vertices", - "802cd988" : "get_texture_coords_4_vertices", - "802cd9ec" : "make_shadow_vertex_at_xyz", - "802cdb20" : "extrapolate_vertex_y_position", - "802cdb74" : "get_vertex_coords", - "802cdc40" : "calculate_vertex_xyz", - "802cde94" : "floor_local_tilt", - "802cdf3c" : "make_shadow_vertex", - "802ce128" : "add_shadow_to_display_list", - "802ce2bc" : "linearly_interpolate_solidity_positive", - "802ce3ec" : "linearly_interpolate_solidity_negative", - "802ce524" : "correct_shadow_solidity_for_animations", - "802ce690" : "correct_lava_shadow_height", - "802ce79c" : "create_shadow_player", - "802ce9d0" : "create_shadow_circle_9_verts", - "802ceae8" : "create_shadow_circle_4_verts", - "802cec04" : "create_shadow_circle_assuming_flat_ground", - "802cedc0" : "create_shadow_rectangle", - "802cef6c" : "get_shadow_height_solidity", - "802cf080" : "create_shadow_square", - "802cf1f0" : "create_shadow_hardcoded_rectangle", - "802cf34c" : "create_shadow_below_xyz", - "802cf5b0" : "calculate_skybox_scaled_x", - "802cf69c" : "calculate_skybox_scaled_y", - "802cf804" : "make_skybox_rect", - "802cfa2c" : "draw_skybox_tile_grid", - "802cfc68" : "create_skybox_ortho_matrix", - "802cfd88" : "init_skybox_display_list", - "802cfef4" : "create_skybox_facing_camera", - "802d0080" : "geo_wdw_set_initial_water_level", - "802d01e0" : "geo_movtex_pause_control", - "802d0254" : "movtex_make_quad_vertex", - "802d0484" : "movtex_gen_from_quad", - "802d0a84" : "movtex_gen_from_quad_array", - "802d0bb0" : "movtex_gen_quads_id", - "802d0c84" : "get_quad_collection_from_id", - "802d0f28" : "movtex_change_texture_format", - "802d104c" : "geo_movtex_draw_water_regions", - "802d1330" : "update_moving_texture_offset", - "802d13cc" : "movtex_write_vertex_first", - "802d1574" : "movtex_write_vertex_index", - "802d18b4" : "movtex_gen_list", - "802d1b70" : "geo_movtex_draw_nocolor", - "802d1cdc" : "geo_movtex_draw_colored", - "802d1e48" : "geo_movtex_draw_colored_no_update", - "802d1fa8" : "geo_movtex_draw_colored_2_no_update", - "802d2108" : "geo_movtex_update_horizontal", - "802d2210" : "make_vertex", - "802d22c4" : "round_float", - "802d2360" : "geo_exec_inside_castle_light", - "802d2470" : "geo_exec_flying_carpet_timer_update", - "802d2520" : "geo_exec_flying_carpet_create", - "802d28cc" : "geo_exec_cake_end_screen", - "802d29c0" : "stop_other_paintings", - "802d2a74" : "painting_mario_y", - "802d2b08" : "painting_mario_z", - "802d2b84" : "painting_ripple_y", - "802d2c40" : "painting_nearest_4th", - "802d2d80" : "painting_mario_x", - "802d2dfc" : "painting_ripple_x", - "802d2eb8" : "painting_state", - "802d2ffc" : "wall_painting_proximity_idle", - "802d319c" : "wall_painting_proximity_rippling", - "802d327c" : "wall_painting_continuous_idle", - "802d341c" : "wall_painting_continuous_rippling", - "802d34fc" : "floor_painting_proximity_idle", - "802d36ac" : "floor_painting_proximity_rippling", - "802d379c" : "floor_painting_continuous_idle", - "802d393c" : "floor_painting_continuous_rippling", - "802d3a2c" : "painting_update_floors", - "802d3bec" : "painting_update_ripple_state", - "802d3cec" : "calculate_ripple_at_point", - "802d3e6c" : "ripple_if_movable", - "802d3ee4" : "painting_generate_mesh", - "802d404c" : "painting_calculate_triangle_normals", - "802d43f8" : "normalize_component", - "802d44bc" : "painting_average_vertex_normals", - "802d47d0" : "render_painting", - "802d4edc" : "painting_model_view_transform", - "802d50dc" : "painting_ripple_image", - "802d5354" : "painting_ripple_env_mapped", - "802d556c" : "display_painting_rippling", - "802d568c" : "display_painting_not_rippling", - "802d5778" : "reset_painting", - "802d57a8" : "move_ddd_painting", - "802d58e4" : "set_painting_layer", - "802d593c" : "display_painting", - "802d59a8" : "wall_painting_update", - "802d5aa0" : "floor_painting_update", - "802d5b98" : "geo_painting_draw", - "802d5d0c" : "geo_painting_update", - "802d5e00" : "int_pow", - "802d5e54" : "format_integer", - "802d6144" : "parse_width_field", - "802d62d8" : "print_text_fmt_int", - "802d6554" : "print_text", - "802d66c0" : "print_text_centered", - "802d6858" : "char_to_glyph_index", - "802d69f8" : "add_glyph_texture", - "802d6acc" : "clip_to_bounds", - "802d6b3c" : "render_textrect", - "802d6c88" : "render_text_labels", - "802d6f20" : "create_dl_identity_matrix", - "802d7070" : "create_dl_translation_matrix", - "802d7174" : "create_dl_rotation_matrix", - "802d7280" : "create_dl_scale_matrix", - "802d7384" : "create_dl_ortho_matrix", - "802d75dc" : "render_generic_char", - "802d76c8" : "render_multi_text_string", - "802d77dc" : "print_generic_string", - "802d7b84" : "print_hud_lut_string", - "802d7e88" : "print_menu_generic_string", - "802d82d4" : "print_credits_string", - "802d862c" : "handle_menu_scrolling", - "802d8844" : "get_str_x_pos_from_center", - "802d8934" : "get_string_width", - "802d89b8" : "print_hud_my_score_coins", - "802d8a80" : "print_hud_my_score_stars", - "802d8b34" : "int_to_str", - "802d8c6c" : "get_dialog_id", - "802d8c88" : "create_dialog_box", - "802d8cc4" : "create_dialog_box_with_var", - "802d8d08" : "create_dialog_inverted_box", - "802d8d48" : "create_dialog_box_with_response", - "802d8d90" : "reset_dialog_render_state", - "802d8e2c" : "render_dialog_box_type", - "802d9148" : "change_and_flash_dialog_text_color_lines", - "802d9388" : "handle_dialog_scroll_page_state", - "802d944c" : "render_star_count_dialog_text", - "802d9634" : "render_multi_text_string_lines", - "802d9800" : "ensure_nonnegative", - "802d982c" : "handle_dialog_text_and_pages", - "802d9cb0" : "render_dialog_triangle_choice", - "802d9dfc" : "render_dialog_string_color", - "802d9f84" : "handle_special_dialog_text", - "802da1ac" : "render_dialog_entries", - "802da810" : "set_menu_mode", - "802da844" : "reset_cutscene_msg_fade", - "802da85c" : "dl_rgba16_begin_cutscene_msg_fade", - "802da8e4" : "dl_rgba16_stop_cutscene_msg_fade", - "802da964" : "ascii_to_credits_char", - "802daa34" : "print_credits_str_ascii", - "802daae4" : "set_cutscene_message", - "802dab58" : "do_cutscene_handler", - "802dad54" : "print_peach_letter_message", - "802db08c" : "render_hud_cannon_reticle", - "802db350" : "reset_red_coins_collected", - "802db368" : "change_dialog_camera_angle", - "802db3b8" : "shade_screen", - "802db498" : "print_animated_red_coin", - "802db6e8" : "render_pause_red_coins", - "802db760" : "render_pause_my_score_coins", - "802dbb24" : "render_pause_camera_options", - "802dbe68" : "render_pause_course_options", - "802dc15c" : "render_pause_castle_menu_box", - "802dc418" : "highlight_last_course_complete_stars", - "802dc478" : "print_hud_pause_colorful_str", - "802dc570" : "render_pause_castle_course_stars", - "802dc718" : "render_pause_castle_main_strings", - "802dca88" : "render_pause_courses_and_castle", - "802dcd04" : "print_hud_course_complete_string", - "802dcf30" : "print_hud_course_complete_coins", - "802dd194" : "play_star_fanfare_and_flash_hud", - "802dd210" : "render_course_complete_lvl_info_and_hud_str", - "802dd838" : "render_save_confirmation", - "802ddae0" : "render_course_complete_screen", - "802ddca4" : "render_menus_and_dialogs", - "802dddf0" : "envfx_init_snow", - "802ddf38" : "envfx_update_snowflake_count", - "802de0bc" : "envfx_cleanup_snow", - "802de114" : "orbit_from_positions", - "802de23c" : "pos_from_orbit", - "802de360" : "envfx_is_snowflake_alive", - "802de458" : "envfx_update_snow_normal", - "802de888" : "envfx_update_snow_blizzard", - "802ded38" : "envfx_update_snow_water", - "802def2c" : "rotate_triangle_vertices", - "802df334" : "append_snowflake_vertex_buffer", - "802df748" : "envfx_update_snow", - "802dfbc8" : "envfx_update_particles", - "802dfd50" : "particle_is_laterally_close", - "802dfe00" : "random_flower_offset", - "802dfe80" : "envfx_update_flower", - "802e0120" : "envfx_set_lava_bubble_position", - "802e048c" : "envfx_update_lava", - "802e065c" : "envfx_rotate_around_whirlpool", - "802e08a8" : "envfx_is_whirlpool_bubble_alive", - "802e0934" : "envfx_update_whirlpool", - "802e0e24" : "envfx_is_jestream_bubble_alive", - "802e0eb8" : "envfx_update_jetstream", - "802e1238" : "envfx_init_bubble", - "802e1414" : "envfx_bubbles_update_switch", - "802e1618" : "append_bubble_vertex_buffer", - "802e1a20" : "envfx_set_bubble_texture", - "802e1bb8" : "envfx_update_bubble_particles", - "802e1ed8" : "envfx_set_max_bubble_particles", - "802e1f48" : "envfx_update_bubbles", - "802e20a0" : "convert_rotation", - "802e2134" : "spawn_macro_abs_yrot_2params", - "802e21dc" : "spawn_macro_abs_yrot_param1", - "802e2284" : "spawn_macro_abs_special", - "802e2414" : "spawn_macro_objects", - "802e2690" : "spawn_macro_objects_hardcoded", - "802e28ec" : "spawn_special_objects", - "802e2cf0" : "render_hud_tex_lut", - "802e2e58" : "render_hud_small_tex_lut", - "802e30b4" : "render_power_meter_health_segment", - "802e3214" : "render_dl_power_meter", - "802e33b8" : "animate_power_meter_emphasized", - "802e352c" : "handle_power_meter_actions", - "802e3654" : "render_hud_power_meter", - "802e3744" : "render_hud_mario_lives", - "802e37a8" : "render_hud_coins", - "802e380c" : "render_hud_stars", - "802e38e4" : "render_hud_keys", - "802e395c" : "render_hud_timer", - "802e3b1c" : "set_hud_camera_status", - "802e3b3c" : "render_hud_camera_status", - "802e3d2c" : "render_hud", - "802e3e50" : "set_yoshi_as_not_dead", - "802e3e68" : "geo_obj_transparency_something", - "802e3f68" : "absf_2", - "802e3fac" : "turn_obj_away_from_surface", - "802e405c" : "obj_find_wall", - "802e41a4" : "turn_obj_away_from_steep_floor", - "802e42e0" : "obj_orient_graph", - "802e43e4" : "calc_obj_friction", - "802e445c" : "calc_new_obj_vel_and_pos_y", - "802e4814" : "calc_new_obj_vel_and_pos_y_underwater", - "802e4cec" : "obj_update_pos_vel_xz", - "802e4d88" : "obj_splash", - "802e4e90" : "object_step", - "802e5114" : "object_step_without_floor_orient", - "802e5160" : "obj_move_xyz_using_fvel_and_yaw", - "802e5208" : "is_point_within_radius_of_mario", - "802e52b8" : "is_point_close_to_object", - "802e5360" : "set_object_visibility", - "802e53f4" : "obj_return_home_if_safe", - "802e54b0" : "obj_return_and_displace_home", - "802e55d0" : "obj_check_if_facing_toward_angle", - "802e569c" : "obj_find_wall_displacement", - "802e5760" : "obj_spawn_yellow_coins", - "802e5824" : "obj_flicker_and_disappear", - "802e58b4" : "current_mario_room_check", - "802e5948" : "trigger_obj_dialog_when_facing", - "802e5a80" : "obj_check_floor_death", - "802e5b18" : "obj_lava_death", - "802e5c6c" : "spawn_orange_number", - "802e5d04" : "debug_sequence_tracker", - "802e5de8" : "coin_step", - "802e5e6c" : "moving_coin_flicker", - "802e5ea4" : "coin_collected", - "802e5ee8" : "bhv_moving_yellow_coin_init", - "802e5f64" : "bhv_moving_yellow_coin_loop", - "802e6098" : "bhv_moving_blue_coin_init", - "802e6114" : "bhv_moving_blue_coin_loop", - "802e62a4" : "bhv_blue_coin_sliding_jumping_init", - "802e631c" : "blue_coin_sliding_away_from_mario", - "802e63ec" : "blue_coin_sliding_slow_down", - "802e6474" : "bhv_blue_coin_sliding_loop", - "802e6628" : "bhv_blue_coin_jumping_loop", - "802e6790" : "bhv_seaweed_init", - "802e67dc" : "bhv_seaweed_bundle_init", - "802e6a2c" : "bhv_bobomb_init", - "802e6a8c" : "bobomb_spawn_coin", - "802e6af8" : "bobomb_act_explode", - "802e6bd4" : "bobomb_check_interactions", - "802e6cf0" : "bobomb_act_patrol", - "802e6dc8" : "bobomb_act_chase_mario", - "802e6e84" : "bobomb_act_launched", - "802e6ed8" : "generic_bobomb_free_loop", - "802e7020" : "stationary_bobomb_free_loop", - "802e7134" : "bobomb_free_loop", - "802e7180" : "bobomb_held_loop", - "802e7220" : "bobomb_dropped_loop", - "802e7280" : "bobomb_thrown_loop", - "802e7324" : "curr_obj_random_blink", - "802e742c" : "bhv_bobomb_loop", - "802e75a0" : "bhv_bobomb_fuse_smoke_init", - "802e76ac" : "bhv_bobomb_buddy_init", - "802e770c" : "bobomb_buddy_act_idle", - "802e7814" : "bobomb_buddy_cannon_dialog", - "802e79dc" : "bobomb_buddy_act_talk", - "802e7b00" : "bobomb_buddy_act_turn_to_talk", - "802e7bb0" : "bobomb_buddy_actions", - "802e7c4c" : "bhv_bobomb_buddy_loop", - "802e7c90" : "bhv_cannon_closed_init", - "802e7d4c" : "cannon_door_act_opening", - "802e7e54" : "bhv_cannon_closed_loop", - "802e7f70" : "bhv_whirlpool_init", - "802e7fb8" : "whirlpool_set_hitbox", - "802e7fec" : "whirpool_orient_graph", - "802e80dc" : "bhv_whirlpool_loop", - "802e82b0" : "bhv_jet_stream_loop", - "802e8388" : "bhv_homing_amp_init", - "802e89d4" : "bhv_homing_amp_loop", - "802e8ae4" : "bhv_circling_amp_init", - "802e8ecc" : "bhv_circling_amp_loop", - "802e8f68" : "bhv_butterfly_init", - "802e9018" : "butterfly_step", - "802e9278" : "butterfly_calculate_angle", - "802e9470" : "butterfly_act_rest", - "802e94e4" : "butterfly_act_follow_mario", - "802e9548" : "butterfly_act_return_home", - "802e96c8" : "bhv_butterfly_loop", - "802e9764" : "bhv_hoot_init", - "802e97fc" : "hoot_find_next_floor", - "802e98c0" : "hoot_floor_bounce", - "802e9a4c" : "hoot_free_step", - "802e9cf4" : "hoot_player_set_yaw", - "802e9d98" : "hoot_carry_step", - "802e9f60" : "hoot_surface_collision", - "802ea144" : "hoot_act_ascent", - "802ea258" : "hoot_action_loop", - "802ea3f0" : "hoot_turn_to_home", - "802ea4ec" : "hoot_awake_loop", - "802ea588" : "bhv_hoot_loop", - "802ea6a8" : "bhv_beta_holdable_object_init", - "802ea7e0" : "bhv_beta_holdable_object_loop", - "802ea888" : "bhv_object_bubble_init", - "802ea934" : "bhv_object_bubble_loop", - "802eaa10" : "bhv_object_water_wave_init", - "802eaa50" : "bhv_object_water_wave_loop", - "802eaa8c" : "bhv_explosion_init", - "802eaad0" : "bhv_explosion_loop", - "802eabf0" : "bhv_bobomb_bully_death_smoke_init", - "802eac3c" : "bhv_bobomb_explosion_bubble_init", - "802ead3c" : "bhv_bobomb_explosion_bubble_loop", - "802eaef8" : "bhv_respawner_loop", - "802eaf84" : "create_respawner", - "802eb05c" : "bhv_small_bully_init", - "802eb104" : "bhv_big_bully_init", - "802eb1c0" : "bully_check_mario_collision", - "802eb288" : "bully_act_chase_mario", - "802eb3f0" : "bully_act_knockback", - "802eb510" : "bully_act_back_up", - "802eb5c4" : "bully_backup_check", - "802eb630" : "bully_play_stomping_sound", - "802eb744" : "bully_step", - "802eb7e0" : "bully_spawn_coin", - "802eb8b0" : "bully_act_level_death", - "802eb9d0" : "bhv_bully_loop", - "802ebb74" : "big_bully_spawn_minion", - "802ebc00" : "bhv_big_bully_with_minions_init", - "802ebc88" : "big_bully_spawn_star", - "802ebce0" : "bhv_big_bully_with_minions_loop", - "802ebf70" : "water_ring_calc_mario_dist", - "802ec030" : "water_ring_init", - "802ec1b0" : "bhv_jet_stream_water_ring_init", - "802ec200" : "water_ring_check_collection", - "802ec3d0" : "water_ring_set_scale", - "802ec4e0" : "water_ring_act_collected", - "802ec59c" : "water_ring_act_not_collected", - "802ec75c" : "bhv_jet_stream_water_ring_loop", - "802ec7cc" : "spawn_manta_ray_ring_manager", - "802ec818" : "water_ring_spawner_act_inactive", - "802ec908" : "bhv_jet_stream_ring_spawner_loop", - "802ec9b8" : "bhv_manta_ray_water_ring_init", - "802ec9f0" : "manta_water_ring_act_not_collected", - "802ecba4" : "bhv_manta_ray_water_ring_loop", - "802ecc14" : "bhv_bowser_bomb_loop", - "802ecd0c" : "bhv_bowser_bomb_explosion_loop", - "802ecea0" : "bhv_bowser_bomb_smoke_loop", - "802ecfac" : "bhv_celebration_star_init", - "802ed10c" : "celeb_star_act_spin_around_mario", - "802ed28c" : "celeb_star_act_face_camera", - "802ed39c" : "bhv_celebration_star_loop", - "802ed40c" : "bhv_celebration_star_sparkle_loop", - "802ed45c" : "bhv_star_key_collection_puff_spawner_loop", - "802ed498" : "bhv_lll_drawbridge_spawner_loop", - "802ed62c" : "bhv_lll_drawbridge_loop", - "802ed78c" : "bhv_small_bomp_init", - "802ed7fc" : "bhv_small_bomp_loop", - "802edacc" : "bhv_large_bomp_init", - "802edb2c" : "bhv_large_bomp_loop", - "802eddfc" : "bhv_wf_sliding_platform_init", - "802edf28" : "bhv_wf_sliding_platform_loop", - "802ee124" : "bhv_moneybag_init", - "802ee1a0" : "moneybag_check_mario_collision", - "802ee268" : "moneybag_jump", - "802ee46c" : "moneybag_act_move_around", - "802ee598" : "moneybag_act_return_home", - "802ee728" : "moneybag_act_disappear", - "802ee778" : "moneybag_act_death", - "802ee7e0" : "bhv_moneybag_loop", - "802ee8f4" : "bhv_moneybag_hidden_loop", - "802ee9cc" : "bhv_bowling_ball_init", - "802eea24" : "bowling_ball_set_hitbox", - "802eea7c" : "bowling_ball_set_waypoints", - "802eeb64" : "bhv_bowling_ball_roll_loop", - "802eecb8" : "bhv_bowling_ball_initializeLoop", - "802eedf0" : "bhv_bowling_ball_loop", - "802eeeb4" : "bhv_generic_bowling_ball_spawner_init", - "802eef9c" : "bhv_generic_bowling_ball_spawner_loop", - "802ef0e8" : "bhv_thi_bowling_ball_spawner_loop", - "802ef21c" : "bhv_bob_pit_bowling_ball_init", - "802ef274" : "bhv_bob_pit_bowling_ball_loop", - "802ef34c" : "bhv_free_bowling_ball_init", - "802ef3f4" : "bhv_free_bowling_ball_roll_loop", - "802ef524" : "bhv_free_bowling_ball_loop", - "802ef63c" : "bhv_rr_cruiser_wing_init", - "802ef66c" : "bhv_rr_cruiser_wing_loop", - "802ef820" : "bhv_spindel_init", - "802ef858" : "bhv_spindel_loop", - "802efcd0" : "bhv_ssl_moving_pyramid_wall_init", - "802efd8c" : "bhv_ssl_moving_pyramid_wall_loop", - "802efe64" : "bhv_pyramid_elevator_init", - "802efef4" : "bhv_pyramid_elevator_loop", - "802f0104" : "bhv_pyramid_elevator_trajectory_marker_ball_loop", - "802f0168" : "bhv_pyramid_top_init", - "802f0288" : "bhv_pyramid_top_spinning", - "802f04a0" : "bhv_pyramid_top_explode", - "802f05b4" : "bhv_pyramid_top_loop", - "802f06a8" : "bhv_pyramid_top_fragment_init", - "802f0714" : "bhv_pyramid_top_fragment_loop", - "802f0788" : "bhv_pyramid_pillar_touch_detector_loop", - "802f07f4" : "bhv_waterfall_sound_loop", - "802f0820" : "bhv_volcano_sound_loop", - "802f084c" : "bhv_castle_flag_init", - "802f0898" : "bhv_birds_sound_loop", - "802f0950" : "bhv_ambient_sounds_init", - "802f09a4" : "bhv_sand_sound_loop", - "802f09f0" : "bhv_castle_cannon_grate_init", - "802f0a40" : "bhv_snowmans_bottom_init", - "802f0b7c" : "set_rolling_sphere_hitbox", - "802f0bd4" : "adjust_rolling_face_pitch", - "802f0c94" : "snowmans_bottom_act_1", - "802f0df0" : "snowmans_bottom_act_2", - "802f0fa8" : "snowmans_bottom_act_3", - "802f105c" : "bhv_snowmans_bottom_loop", - "802f120c" : "bhv_snowmans_head_init", - "802f1370" : "bhv_snowmans_head_loop", - "802f151c" : "bhv_snowmans_body_checkpoint_loop", - "802f15a8" : "bhv_big_boulder_init", - "802f162c" : "boulder_act_1", - "802f1714" : "bhv_big_boulder_loop", - "802f17f0" : "bhv_big_boulder_generator_loop", - "802f1954" : "cap_set_hitbox", - "802f19c8" : "cap_despawn", - "802f1a10" : "cap_check_quicksand", - "802f1bb8" : "cap_sink_quicksand", - "802f1d64" : "bhv_wing_cap_init", - "802f1dc0" : "cap_scale_vertically", - "802f1e5c" : "wing_vanish_cap_act_0", - "802f1f3c" : "bhv_wing_vanish_cap_loop", - "802f1fd0" : "bhv_metal_cap_init", - "802f2030" : "metal_cap_act_0", - "802f20ac" : "bhv_metal_cap_loop", - "802f2140" : "bhv_normal_cap_init", - "802f21e0" : "normal_cap_set_save_flags", - "802f2284" : "normal_cap_act_0", - "802f23a8" : "bhv_normal_cap_loop", - "802f2498" : "bhv_vanish_cap_init", - "802f24f4" : "bhv_collect_star_init", - "802f25b0" : "bhv_collect_star_loop", - "802f2614" : "bhv_star_spawn_init", - "802f2768" : "bhv_star_spawn_loop", - "802f2aa0" : "spawn_star", - "802f2b88" : "spawn_default_star", - "802f2bd4" : "spawn_red_coin_cutscene_star", - "802f2c24" : "spawn_no_exit_star", - "802f2c84" : "bhv_hidden_red_coin_star_init", - "802f2d8c" : "bhv_hidden_red_coin_star_loop", - "802f2e6c" : "bhv_red_coin_init", - "802f2f2c" : "bhv_red_coin_loop", - "802f3014" : "bhv_hidden_star_init", - "802f30f0" : "bhv_hidden_star_loop", - "802f31bc" : "bhv_hidden_star_trigger_loop", - "802f328c" : "bhv_bowser_course_red_coin_star_loop", - "802f336c" : "bhv_ttm_rolling_log_init", - "802f341c" : "rolling_log_roll_log", - "802f36a4" : "bhv_rolling_log_loop", - "802f38b0" : "volcano_act_1", - "802f39b4" : "volcano_act_3", - "802f3a30" : "bhv_volcano_trap_loop", - "802f3b98" : "bhv_lll_rolling_log_init", - "802f3c54" : "bhv_1up_interact", - "802f3cc8" : "bhv_1up_common_init", - "802f3d30" : "bhv_1up_init", - "802f3dd0" : "one_up_loop_in_air", - "802f3ea8" : "pole_1up_move_towards_mario", - "802f401c" : "one_up_move_away_from_mario", - "802f40cc" : "bhv_1up_walking_loop", - "802f4248" : "bhv_1up_running_away_loop", - "802f43b8" : "sliding_1up_move", - "802f44c0" : "bhv_1up_sliding_loop", - "802f45b8" : "bhv_1up_loop", - "802f45f0" : "bhv_1up_jump_on_approach_loop", - "802f4710" : "bhv_1up_hidden_loop", - "802f48f4" : "bhv_1up_hidden_trigger_loop", - "802f496c" : "bhv_1up_hidden_in_pole_loop", - "802f4b00" : "bhv_1up_hidden_in_pole_trigger_loop", - "802f4b78" : "bhv_1up_hidden_in_pole_spawner_loop", - "802f4c68" : "controllable_platform_act_1", - "802f4ce0" : "controllable_platform_act_2", - "802f4d78" : "bhv_controllable_platform_sub_loop", - "802f4eb4" : "bhv_controllable_platform_init", - "802f5010" : "controllable_platform_hit_wall", - "802f5068" : "controllable_platform_check_walls", - "802f52c0" : "controllable_platform_shake_on_wall_hit", - "802f547c" : "controllable_platform_tilt_from_mario", - "802f55a4" : "bhv_controllable_platform_loop", - "802f5cd4" : "bhv_breakable_box_small_init", - "802f5d78" : "small_breakable_box_spawn_dust", - "802f5e44" : "small_breakable_box_act_move", - "802f5f48" : "breakable_box_small_released_loop", - "802f6014" : "breakable_box_small_idle_loop", - "802f60d8" : "breakable_box_small_get_dropped", - "802f6150" : "breakable_box_small_get_thrown", - "802f6228" : "bhv_breakable_box_small_loop", - "802f62e4" : "bhv_sliding_snow_mound_loop", - "802f6448" : "bhv_snow_mound_spawn_loop", - "802f6588" : "floating_platform_find_home_y", - "802f665c" : "floating_platform_act_0", - "802f6984" : "bhv_floating_platform_loop", - "802f6c0c" : "bhv_arrow_lift_loop", - "802f6d20" : "bhv_orange_number_init", - "802f6d58" : "bhv_orange_number_loop", - "802f6e40" : "bhv_manta_ray_init", - "802f6eb0" : "manta_ray_move", - "802f7068" : "manta_ray_act_spawn_ring", - "802f7264" : "bhv_manta_ray_loop", - "802f7348" : "bhv_falling_pillar_init", - "802f7398" : "bhv_falling_pillar_spawn_hitboxes", - "802f7418" : "bhv_falling_pillar_calculate_angle_in_front_of_mario", - "802f74dc" : "bhv_falling_pillar_loop", - "802f7760" : "bhv_falling_pillar_hitbox_loop", - "802f7924" : "bhv_jrb_floating_box_loop", - "802f7978" : "bhv_decorative_pendulum_init", - "802f79b0" : "bhv_decorative_pendulum_loop", - "802f7a58" : "bhv_treasure_chest_top_loop", - "802f7c9c" : "bhv_treasure_chest_bottom_init", - "802f7d04" : "bhv_treasure_chest_bottom_loop", - "802f7f1c" : "spawn_treasure_chest", - "802f7fa0" : "bhv_treasure_chest_ship_init", - "802f8044" : "bhv_treasure_chest_ship_loop", - "802f8158" : "bhv_treasure_chest_jrb_init", - "802f8208" : "bhv_treasure_chest_jrb_loop", - "802f82f8" : "bhv_treasure_chest_init", - "802f83a4" : "bhv_treasure_chest_loop", - "802f8490" : "bhv_mips_init", - "802f85e0" : "bhv_mips_find_furthest_waypoint_to_mario", - "802f8760" : "bhv_mips_act_wait_for_nearby_mario", - "802f8808" : "bhv_mips_act_follow_path", - "802f893c" : "bhv_mips_act_wait_for_animation_done", - "802f8988" : "bhv_mips_act_fall_down", - "802f8a34" : "bhv_mips_act_idle", - "802f8ab4" : "bhv_mips_free", - "802f8b54" : "bhv_mips_held", - "802f8c74" : "bhv_mips_dropped", - "802f8cf8" : "bhv_mips_thrown", - "802f8dac" : "bhv_mips_loop", - "802f8e54" : "bhv_yoshi_init", - "802f8f08" : "yoshi_walk_loop", - "802f9054" : "yoshi_idle_loop", - "802f923c" : "yoshi_talk_loop", - "802f93a8" : "yoshi_walk_and_jump_off_roof_loop", - "802f9500" : "yoshi_finish_jumping_and_despawn_loop", - "802f95ac" : "yoshi_give_present_loop", - "802f965c" : "bhv_yoshi_loop", - "802fbc4c" : "bhv_koopa_init", - "802fc414" : "shelled_koopa_attack_handler", - "802fcc00" : "obj_begin_race", - "802fd7f8" : "bhv_koopa_update", - "802fd950" : "bhv_koopa_race_endpoint_update", - "802fda28" : "bhv_pokey_body_part_update", - "802fe3b0" : "bhv_pokey_update", - "802fe8b4" : "bhv_swoop_update", - "802ff040" : "bhv_fly_guy_update", - "802ff214" : "bhv_goomba_triplet_spawner_update", - "802ff408" : "bhv_goomba_init", - "802ff94c" : "huge_goomba_weakly_attacked", - "802ff96c" : "bhv_goomba_update", - "802ffb38" : "bhv_chain_chomp_chain_part_update", - "80300e40" : "bhv_chain_chomp_update", - "80300ecc" : "bhv_wooden_post_update", - "80301148" : "bhv_chain_chomp_gate_init", - "80301180" : "bhv_chain_chomp_gate_update", - "80301210" : "bhv_wiggler_body_part_update", - "803014cc" : "wiggler_init_segments", - "803016e0" : "wiggler_update_segments", - "803020e4" : "wiggler_jumped_on_attack_handler", - "80302154" : "bhv_wiggler_update", - "80302910" : "bhv_spiny_update", - "80303028" : "bhv_enemy_lakitu_update", - "8030369c" : "bhv_cloud_update", - "80303744" : "bhv_cloud_part_update", - "80303984" : "bhv_camera_lakitu_init", - "80303f64" : "bhv_camera_lakitu_update", - "803043f8" : "bhv_monty_mole_hole_update", - "80304474" : "monty_mole_spawn_dirt_particles", - "803044c0" : "bhv_monty_mole_init", - "80304ba8" : "bhv_monty_mole_update", - "80304fd4" : "bhv_monty_mole_rock_update", - "80305100" : "bhv_platform_on_track_init", - "80305a58" : "bhv_platform_on_track_update", - "80305bb0" : "bhv_track_ball_update", - "80305c14" : "bhv_seesaw_platform_init", - "80305c90" : "bhv_seesaw_platform_update", - "80305e2c" : "bhv_ferris_wheel_axle_init", - "80305f24" : "bhv_ferris_wheel_platform_update", - "80306084" : "bhv_water_bomb_spawner_update", - "803062a8" : "water_bomb_spawn_explode_particles", - "803067e8" : "bhv_water_bomb_update", - "803068c0" : "bhv_water_bomb_shadow_update", - "8030699c" : "bhv_ttc_rotating_solid_init", - "80306a38" : "bhv_ttc_rotating_solid_update", - "80306cc4" : "bhv_ttc_pendulum_init", - "80306d38" : "bhv_ttc_pendulum_update", - "80306f48" : "bhv_ttc_treadmill_init", - "80307010" : "bhv_ttc_treadmill_update", - "803071b8" : "bhv_ttc_moving_bar_init", - "80307670" : "bhv_ttc_moving_bar_update", - "80307760" : "bhv_ttc_cog_init", - "803077e0" : "bhv_ttc_cog_update", - "80307930" : "bhv_ttc_pit_block_init", - "803079c8" : "bhv_ttc_pit_block_update", - "80307ae4" : "bhv_ttc_elevator_init", - "80307b58" : "bhv_ttc_elevator_update", - "80307c88" : "bhv_ttc_2d_rotator_init", - "80307cf8" : "bhv_ttc_2d_rotator_update", - "80307ea4" : "bhv_ttc_spinner_update", - "80307fb8" : "func_80306ED4", - "8030803c" : "bhv_mr_blizzard_init", - "80308d6c" : "bhv_mr_blizzard_update", - "80309154" : "bhv_mr_blizzard_snowball", - "803091e0" : "bhv_sliding_plat_2_init", - "80309354" : "bhv_sliding_plat_2_loop", - "80309454" : "bhv_rotating_octagonal_plat_init", - "803094d0" : "bhv_rotating_octagonal_plat_loop", - "803094f8" : "bhv_animates_on_floor_switch_press_init", - "80309530" : "bhv_animates_on_floor_switch_press_loop", - "803097a4" : "bhv_activated_back_and_forth_platform_init", - "803098c0" : "bhv_activated_back_and_forth_platform_update", - "80309b64" : "bhv_recovery_heart_loop", - "80309cec" : "bhv_bubble_cannon_barrel_loop", - "80309ed4" : "water_bomb_cannon_act_0", - "80309f68" : "water_bomb_cannon_act_1", - "8030a0e8" : "water_bomb_cannon_act_2", - "8030a11c" : "bhv_water_bomb_cannon_loop", - "8030a1c0" : "bhv_unagi_init", - "8030a2a8" : "unagi_act_0", - "8030a390" : "unagi_act_1_4", - "8030a514" : "unagi_act_2", - "8030a614" : "unagi_act_3", - "8030a93c" : "bhv_unagi_loop", - "8030aabc" : "bhv_unagi_subobject_loop", - "8030ad04" : "dorrie_raise_head", - "8030ae9c" : "dorrie_act_move", - "8030b0b8" : "dorrie_begin_head_raise", - "8030b0f0" : "dorrie_act_lower_head", - "8030b220" : "dorrie_act_raise_head", - "8030b2f4" : "bhv_dorrie_update", - "8030b658" : "bhv_haunted_chair_init", - "8030b6d8" : "haunted_chair_act_0", - "8030ba68" : "haunted_chair_act_1", - "8030bc90" : "bhv_haunted_chair_loop", - "8030bfd0" : "bhv_mad_piano_update", - "8030c06c" : "flying_bookend_act_0", - "8030c0f0" : "flying_bookend_act_1", - "8030c210" : "flying_bookend_act_2", - "8030c2c8" : "flying_bookend_act_3", - "8030c364" : "bhv_flying_bookend_loop", - "8030c4b0" : "bhv_bookend_spawn_loop", - "8030c564" : "bookshelf_manager_act_0", - "8030c60c" : "bookshelf_manager_act_1", - "8030c6a4" : "bookshelf_manager_act_2", - "8030c828" : "bookshelf_manager_act_3", - "8030c894" : "bookshelf_manager_act_4", - "8030c8ec" : "bhv_haunted_bookshelf_manager_loop", - "8030c98c" : "bhv_book_switch_loop", - "8030cd30" : "obj_spit_fire", - "8030cddc" : "bhv_fire_piranha_plant_init", - "8030d2f0" : "bhv_fire_piranha_plant_update", - "8030d598" : "bhv_fire_spitter_update", - "8030d640" : "bhv_small_piranha_flame_loop", - "8030d8d4" : "bhv_fly_guy_flame_loop", - "8030d93c" : "geo_snufit_move_mask", - "8030d9ac" : "geo_snufit_scale_body", - "8030da14" : "snufit_act_idle", - "8030db38" : "snufit_act_shoot", - "8030dc70" : "bhv_snufit_loop", - "8030dfc4" : "bhv_snufit_balls_loop", - "8030e14c" : "bhv_horizontal_grindel_init", - "8030e16c" : "bhv_horizontal_grindel_update", - "8030ea9c" : "bhv_eyerok_boss_loop", - "8030fff8" : "bhv_eyerok_hand_loop", - "80310498" : "bhv_klepto_init", - "8031126c" : "obj_set_speed_to_zero", - "8031129c" : "bhv_klepto_update", - "80311874" : "bhv_bird_update", - "803118e4" : "bhv_racing_penguin_init", - "80312070" : "bhv_racing_penguin_update", - "80312168" : "bhv_penguin_race_finish_line_update", - "80312200" : "bhv_penguin_race_shortcut_check_update", - "80312248" : "bhv_coffin_spawner_loop", - "80312370" : "coffin_act_idle", - "8031262c" : "coffin_act_stand_up", - "8031274c" : "bhv_coffin_loop", - "80312804" : "clam_act_0", - "80312900" : "clam_act_1", - "80312a54" : "bhv_clam_loop", - "80313110" : "bhv_skeeter_update", - "803131e8" : "bhv_skeeter_wave_update", - "8031326c" : "bhv_swing_platform_init", - "80313294" : "bhv_swing_platform_update", - "80313354" : "bhv_donut_platform_spawner_update", - "80313530" : "bhv_donut_platform_update", - "803136cc" : "bhv_ddd_pole_init", - "80313754" : "bhv_ddd_pole_update", - "803137f4" : "bhv_red_coin_star_marker_init", - "80313fc0" : "bhv_triplet_butterfly_update", - "80314098" : "bubba_act_0", - "8031427c" : "bubba_act_1", - "803145d4" : "bhv_bubba_loop", - "80314a30" : "prepare_reverb_ring_buffer", - "80314cc0" : "get_volume_ramping", - "80314de4" : "synthesis_execute", - "80314f64" : "synthesis_do_one_audio_update", - "80315590" : "synthesis_process_notes", - "80316010" : "load_wave_samples", - "803160dc" : "final_resample", - "80316138" : "process_envelope", - "8031619c" : "process_envelope_inner", - "803166fc" : "note_apply_headset_pan_effects", - "80316ac8" : "note_init_volume", - "80316af4" : "note_set_vel_pan_reverb", - "80316da8" : "note_set_frequency", - "80316db4" : "note_enable", - "80316e00" : "note_disable", - "80316e80" : "reset_bank_and_seq_load_status", - "80316ec4" : "discard_bank", - "80316fb4" : "discard_sequence", - "80317040" : "soundAlloc", - "803170b4" : "sound_alloc_pool_init", - "803170d4" : "persistent_pool_clear", - "803170e8" : "temporary_pool_clear", - "80317118" : "unused_803160F8", - "80317128" : "sound_init_main_pools", - "80317184" : "session_pools_init", - "80317200" : "seq_and_bank_pool_init", - "8031727c" : "persistent_pools_init", - "80317338" : "temporary_pools_init", - "803173fc" : "alloc_bank_or_seq", - "8031782c" : "get_bank_or_seq", - "803178ec" : "decrease_reverb_gain", - "80317914" : "wait_for_audio_frames", - "80317948" : "audio_reset_session", - "80318040" : "audio_dma_copy_immediate", - "803180c4" : "audio_dma_copy_async", - "80318130" : "audio_dma_partial_copy_async", - "803181ec" : "decrease_sample_dma_ttls", - "80318300" : "dma_sample_data", - "80318634" : "init_sample_dma_buffers", - "803188f4" : "patch_audio_bank", - "80318b30" : "bank_load_immediate", - "80318c8c" : "bank_load_async", - "80318dc4" : "sequence_dma_immediate", - "80318e70" : "sequence_dma_async", - "80318fac" : "get_missing_bank", - "803190f4" : "load_banks_immediate", - "80319220" : "preload_sequence", - "80319328" : "load_sequence", - "80319388" : "load_sequence_internal", - "8031950c" : "audio_init", - "80319920" : "note_init", - "80319998" : "note_disable2", - "803199b8" : "process_notes", - "80319db8" : "seq_channel_layer_decay_release_internal", - "80319f64" : "seq_channel_layer_note_decay", - "80319f84" : "seq_channel_layer_note_release", - "80319fa4" : "build_synthetic_wave", - "8031a1d0" : "init_synthetic_wave", - "8031a254" : "init_note_list", - "8031a264" : "init_note_lists", - "8031a2b4" : "init_note_free_list", - "8031a368" : "note_pool_clear", - "8031a494" : "note_pool_fill", - "8031a5d0" : "audio_list_push_front", - "8031a610" : "audio_list_remove", - "8031a63c" : "pop_node_with_value_less_equal", - "8031a6cc" : "note_init_for_layer", - "8031a794" : "func_80319728", - "8031a7c8" : "note_release_and_take_ownership", - "8031a820" : "alloc_note_from_disabled", - "8031a89c" : "alloc_note_from_decaying", - "8031a8f0" : "alloc_note_from_active", - "8031a94c" : "alloc_note", - "8031ac34" : "reclaim_notes", - "8031adac" : "note_init_all", - "8031aee8" : "sequence_player_process_sound", - "8031b0cc" : "get_portamento_freq_scale", - "8031b1c0" : "get_vibrato_pitch_change", - "8031b248" : "get_vibrato_freq_scale", - "8031b440" : "note_vibrato_update", - "8031b4a0" : "note_vibrato_init", - "8031b58c" : "adsr_init", - "8031b5ac" : "adsr_update", - "8031b830" : "sequence_channel_init", - "8031b940" : "seq_channel_set_layer", - "8031ba30" : "seq_channel_layer_disable", - "8031ba6c" : "seq_channel_layer_free", - "8031baf0" : "sequence_channel_disable", - "8031bb5c" : "allocate_sequence_channel", - "8031bba4" : "sequence_player_init_channels", - "8031bcd0" : "sequence_player_disable_channels", - "8031bda0" : "sequence_channel_enable", - "8031be44" : "sequence_player_disable", - "8031bf14" : "audio_list_push_back", - "8031bf54" : "audio_list_pop_back", - "8031bf94" : "init_layer_freelist", - "8031c03c" : "m64_read_u8", - "8031c050" : "m64_read_s16", - "8031c080" : "m64_read_compressed_u16", - "8031c0c4" : "seq_channel_layer_process_script", - "8031c200" : "L_U_8031C200", - "8031c23c" : "L_U_8031C23C", - "8031c298" : "L_U_8031C298", - "8031c2dc" : "L_U_8031C2DC", - "8031c328" : "L_U_8031C328", - "8031c36c" : "L_U_8031C36C", - "8031c3bc" : "L_U_8031C3BC", - "8031c3e8" : "L_U_8031C3E8", - "8031c454" : "L_U_8031C454", - "8031c4a4" : "L_U_8031C4A4", - "8031c5c8" : "L_U_8031C5C8", - "8031c698" : "L_U_8031C698", - "8031c6a0" : "L_U_8031C6A0", - "8031cbe0" : "L_U_8031CBE0", - "8031cbec" : "L_U_8031CBEC", - "8031ce54" : "get_instrument", - "8031cfd4" : "set_instrument", - "8031d068" : "sequence_channel_set_volume", - "8031d08c" : "sequence_channel_process_script", - "8031d144" : "L_U_8031D144", - "8031d1f8" : "L_U_8031D1F8", - "8031d234" : "L_U_8031D234", - "8031d26c" : "L_U_8031D26C", - "8031d2b4" : "L_U_8031D2B4", - "8031d2c4" : "L_U_8031D2C4", - "8031d31c" : "L_U_8031D31C", - "8031d344" : "L_U_8031D344", - "8031d354" : "L_U_8031D354", - "8031d370" : "L_U_8031D370", - "8031d3a8" : "L_U_8031D3A8", - "8031d3c4" : "L_U_8031D3C4", - "8031d3d4" : "L_U_8031D3D4", - "8031d3e4" : "L_U_8031D3E4", - "8031d400" : "L_U_8031D400", - "8031d424" : "L_U_8031D424", - "8031d44c" : "L_U_8031D44C", - "8031d474" : "L_U_8031D474", - "8031d498" : "L_U_8031D498", - "8031d4bc" : "L_U_8031D4BC", - "8031d4d4" : "L_U_8031D4D4", - "8031d4f0" : "L_U_8031D4F0", - "8031d500" : "L_U_8031D500", - "8031d51c" : "L_U_8031D51C", - "8031d538" : "L_U_8031D538", - "8031d56c" : "L_U_8031D56C", - "8031d5a0" : "L_U_8031D5A0", - "8031d5b4" : "L_U_8031D5B4", - "8031d5d4" : "L_U_8031D5D4", - "8031d5e4" : "L_U_8031D5E4", - "8031d640" : "L_U_8031D640", - "8031d678" : "L_U_8031D678", - "8031d6c4" : "L_U_8031D6C4", - "8031d6d4" : "L_U_8031D6D4", - "8031d6f4" : "L_U_8031D6F4", - "8031d718" : "L_U_8031D718", - "8031d728" : "L_U_8031D728", - "8031d73c" : "L_U_8031D73C", - "8031d7b8" : "L_U_8031D7B8", - "8031d7e8" : "L_U_8031D7E8", - "8031d7f8" : "L_U_8031D7F8", - "8031d814" : "L_U_8031D814", - "8031d830" : "L_U_8031D830", - "8031d87c" : "L_U_8031D87C", - "8031d898" : "L_U_8031D898", - "8031d8f8" : "L_U_8031D8F8", - "8031d900" : "L_U_8031D900", - "8031d930" : "L_U_8031D930", - "8031d94c" : "L_U_8031D94C", - "8031d974" : "L_U_8031D974", - "8031d9ec" : "sequence_player_process_sequence", - "8031e240" : "process_sequences", - "8031e2e8" : "init_sequence_player", - "8031e374" : "init_sequence_players", - "8031e4f0" : "unused_8031E4F0", - "8031e568" : "unused_8031E568", - "8031e578" : "sequence_player_fade_out_internal", - "8031e5c0" : "func_8031D690", - "8031e60c" : "func_8031D6E4", - "8031e6a4" : "func_8031D7B0", - "8031e710" : "func_8031D838", - "8031e7b8" : "create_next_audio_frame_task", - "8031eb00" : "play_sound", - "8031eb30" : "process_sound_request", - "8031edec" : "process_all_sound_requests", - "8031ee70" : "func_8031DFE8", - "8031ef6c" : "func_8031E0E4", - "8031eff4" : "func_8031E16C", - "8031f810" : "get_sound_pan", - "8031f96c" : "get_sound_dynamics", - "8031fb20" : "get_sound_freq_scale", - "8031fbe8" : "get_sound_reverb", - "8031fd84" : "audio_signal_game_loop_tick", - "8031fdac" : "update_game_sound", - "80320544" : "play_sequence", - "80320678" : "sequence_player_fade_out", - "803206bc" : "fade_volume_scale", - "80320734" : "fade_channel_volume_scale", - "8032080c" : "func_8031F96C", - "803208ec" : "process_level_music_dynamics", - "80320a4c" : "L8031FBAC", - "80320a8c" : "L8031FBEC", - "80320acc" : "L8031FC2C", - "80320b0c" : "L8031FC6C", - "80320b4c" : "L8031FCAC", - "80320b8c" : "L8031FCEC", - "80320bcc" : "L8031FD2C", - "80320bf4" : "L8031FD54", - "80320d70" : "unused_8031FED0", - "80320e3c" : "func_8031FFB4", - "80320ec4" : "sequence_player_unlower", - "80320f68" : "func_803200E4", - "803210d4" : "set_sound_disabled", - "8032112c" : "sound_init", - "80321398" : "get_currently_playing_sound", - "80321474" : "func_803205E8", - "80321584" : "func_803206F8", - "8032171c" : "func_80320890", - "8032174c" : "sound_banks_disable", - "803217a8" : "disable_all_sequence_players", - "8032180c" : "sound_banks_enable", - "80321864" : "unused_803209D8", - "803218d8" : "func_80320A4C", - "803218f4" : "play_dialog_sound", - "803219ac" : "play_music", - "80321bac" : "stop_background_music", - "80321ce4" : "fadeout_background_music", - "80321d38" : "drop_queued_background_music", - "80321d5c" : "get_current_background_music", - "80321d9c" : "func_80320ED8", - "80321e48" : "play_secondary_music", - "80321f48" : "func_80321080", - "80321f9c" : "func_803210D4", - "80322078" : "play_course_clear", - "803220b4" : "play_peachs_jingle", - "803220f0" : "play_puzzle_jingle", - "8032212c" : "play_star_fanfare", - "80322168" : "play_power_star_jingle", - "803221b8" : "play_race_fanfare", - "803221f4" : "play_toads_jingle", - "80322230" : "sound_reset", - "8032231c" : "audio_set_sound_mode", - "80322348" : "unused_80321460", - "8032235c" : "unused_80321474", - "803223b0" : "osSetTime", - "803223e0" : "osMapTLB", - "803224a0" : "osUnmapTLBAll", - "803224f0" : "sprintf", - "8032255c" : "proutSprintf", - "803225a0" : "osCreateMesgQueue", - "803225d0" : "osSetEventMesg", - "80322640" : "osViSetEvent", - "803226b0" : "osCreateThread", - "80322800" : "osRecvMesg", - "80322940" : "_VirtualToPhysicalTask", - "80322a5c" : "osSpTaskLoad", - "80322bbc" : "osSpTaskStartGo", - "80322c00" : "osSpTaskYield", - "80322c20" : "osSendMesg", - "80322d70" : "osSpTaskYielded", - "80322df0" : "osStartThread", - "80322f40" : "osWritebackDCacheAll", - "80322f70" : "osCreateViManager", - "803230f4" : "viMgrMain", - "803232d0" : "osViSetMode", - "80323340" : "osViBlack", - "803233b0" : "osViSetSpecialFeatures", - "80323570" : "osCreatePiManager", - "803236f0" : "osSetThreadPri", - "803237d0" : "osInitialize", - "80323a00" : "osViSwapBuffer", - "80323a50" : "sqrtf", - "80323a60" : "osContStartReadData", - "80323b24" : "osContGetReadData", - "80323bcc" : "__osPackReadData", - "80323cc0" : "osContInit", - "80323ebc" : "__osContGetInitData", - "80323f8c" : "__osPackRequestData", - "80324080" : "osEepromProbe", - "803240f0" : "__ull_rshift", - "8032411c" : "__ull_rem", - "80324158" : "__ull_div", - "80324194" : "__ll_lshift", - "803241c0" : "__ll_rem", - "803241fc" : "__ll_div", - "80324258" : "__ll_mul", - "80324288" : "__ull_divremi", - "803242e8" : "__ll_mod", - "80324384" : "__ll_rshift", - "803243b0" : "osInvalDCache", - "80324460" : "osPiStartDma", - "80324570" : "bzero", - "80324610" : "osInvalICache", - "80324690" : "osEepromLongRead", - "803247d0" : "osEepromLongWrite", - "80324910" : "bcopy", - "80324c20" : "guOrthoF", - "80324d74" : "guOrtho", - "80324de0" : "guPerspectiveF", - "80325010" : "guPerspective", - "80325070" : "osGetTime", - "80325100" : "__d_to_ll", - "8032511c" : "__f_to_ll", - "80325138" : "__d_to_ull", - "803251d8" : "__f_to_ull", - "80325274" : "__ll_to_d", - "8032528c" : "__ll_to_f", - "803252a4" : "__ull_to_d", - "803252d8" : "__ull_to_f", - "80325310" : "cosf", - "80325480" : "sinf", - "80325640" : "guTranslateF", - "80325688" : "guTranslate", - "803256e0" : "guRotateF", - "80325874" : "guRotate", - "803258d0" : "guScaleF", - "80325924" : "guScale", - "80325970" : "osAiSetFrequency", - "80325bd4" : "alBnkfNew", - "80325cd8" : "alSeqFileNew", - "80325d20" : "osWritebackDCache", - "80325da0" : "osAiGetLength", - "80325db0" : "osAiSetNextBuffer", - "80325e60" : "__osTimerServicesInit", - "80325eec" : "__osTimerInterrupt", - "80326064" : "__osSetTimerIntr", - "803260d8" : "__osInsertTimer", - "80326260" : "_Printf", - "803273f0" : "memcpy", - "8032741c" : "strlen", - "80327444" : "strchr", - "80327490" : "__osDequeueThread", - "803274d0" : "__osDisableInt", - "803274f0" : "__osRestoreInt", - "80327510" : "__osViInit", - "80327640" : "__osExceptionPreamble", - "80327650" : "__osException", - "803278e4" : "L80326964", - "80327904" : "L80326984", - "80327938" : "L803269B8", - "80327a68" : "L80326AE8", - "80327ac4" : "L80326B44", - "80327ae4" : "L80326B64", - "80327b1c" : "L80326B9C", - "80327b68" : "L80326BE8", - "80327b98" : "send_mesg", - "80327c80" : "__osEnqueueAndYield", - "80327d10" : "__osEnqueueThread", - "80327d58" : "__osPopThread", - "80327d68" : "__osDispatchThread", - "80327ea8" : "__osCleanupThread", - "80327eb0" : "osVirtualToPhysical", - "80327f30" : "__osSpSetStatus", - "80327f40" : "__osSpSetPc", - "80327f80" : "__osSpRawStartDma", - "80328010" : "__osSpDeviceBusy", - "80328040" : "__osSpGetStatus", - "80328050" : "osGetThreadPri", - "80328070" : "__osViGetCurrentContext", - "80328080" : "__osViSwapContext", - "803283e0" : "osGetCount", - "803283f0" : "__osPiCreateAccessQueue", - "80328440" : "__osPiGetAccess", - "80328484" : "__osPiRelAccess", - "803284b0" : "osPiRawStartDma", - "80328590" : "__osDevMgrMain", - "80328710" : "__osSetSR", - "80328720" : "__osGetSR", - "80328730" : "__osSetFpcCsr", - "80328740" : "__osSiRawReadIo", - "80328790" : "__osSiRawWriteIo", - "803287e0" : "osMapTLBRdb", - "80328840" : "osPiRawReadIo", - "803288a0" : "__osSiCreateAccessQueue", - "803288f0" : "__osSiGetAccess", - "80328934" : "__osSiRelAccess", - "80328960" : "__osSiRawStartDma", - "80328a10" : "osSetTimer", - "80328af0" : "osEepromWrite", - "80328ca0" : "__osPackEepWriteData", - "80328dac" : "__osEepStatus", - "80328fd0" : "osJamMesg", - "80329120" : "osPiGetCmdQueue", - "80329150" : "osEepromRead", - "80329340" : "__osPackEepReadData", - "80329450" : "guMtxF2L", - "80329550" : "guMtxIdentF", - "803295d8" : "guMtxIdent", - "80329608" : "guMtxL2F", - "803296c0" : "guNormalize", - "80329750" : "__osAiDeviceBusy", - "80329780" : "__osSetCompare", - "80329790" : "_Litob", - "80329a90" : "_Ldtob", - "8032a860" : "u32_to_string", - "8032a890" : "string_to_u32", - "8032a8e8" : "send_packet", - "8032a9a8" : "send", - "8032aa80" : "process_command_memory", - "8032aacc" : "process_command_register", - "8032aaf8" : "kdebugserver", - "8032ace0" : "__osSyncPutChars", - "8032ae10" : "osSetIntMask", - "8032ae70" : "osDestroyThread", - "8032af70" : "__osProbeTLB", - "8032b030" : "__osSiDeviceBusy", - "8032b060" : "lldiv", - "8032b160" : "ldiv", - "8032b1f0" : "__osGetCause", - "8032b200" : "__osAtomicDec", - "8032b260" : "rspF3DBootStart", - "8032b330" : "rspF3DBootEnd", - "8032b330" : "rspF3DStart", - "8032c738" : "rspF3DEnd", - "8032c740" : "rspAspMainStart", - "8032d560" : "rspAspMainEnd", - "8032d560" : "gVblankHandler1", - "8032d564" : "gVblankHandler2", - "8032d568" : "gActiveSPTask", - "8032d56c" : "sCurrentAudioSPTask", - "8032d570" : "sCurrentDisplaySPTask", - "8032d574" : "sNextAudioSPTask", - "8032d578" : "sNextDisplaySPTask", - "8032d57c" : "sAudioEnabled", - "8032d580" : "sNumVblanks", - "8032d584" : "gResetTimer", - "8032d588" : "D_8032C648", - "8032d58c" : "gDebugLevelSelect", - "8032d590" : "D_8032C650", - "8032d594" : "gShowProfiler", - "8032d598" : "gShowDebugText", - "8032d5d0" : "unused8032C690", - "8032d5d4" : "gGlobalTimer", - "8032d5dc" : "frameBufferIndex", - "8032d5e0" : "D_8032C6A0", - "8032d5e4" : "gPlayer1Controller", - "8032d5e8" : "gPlayer2Controller", - "8032d5ec" : "gPlayer3Controller", - "8032d5f0" : "gCurrDemoInput", - "8032d5f4" : "gDemoInputListID", - "8032d5f8" : "gRecordedDemoInput", - "8032d6d0" : "credits01", - "8032d6d8" : "credits02", - "8032d6e4" : "credits03", - "8032d6f0" : "credits04", - "8032d700" : "credits05", - "8032d710" : "credits06", - "8032d71c" : "credits07", - "8032d728" : "credits08", - "8032d738" : "credits09", - "8032d740" : "credits10", - "8032d750" : "credits11", - "8032d75c" : "credits12", - "8032d764" : "credits13", - "8032d774" : "credits14", - "8032d77c" : "credits15", - "8032d788" : "credits16", - "8032d79c" : "credits17", - "8032d7ac" : "credits18", - "8032d7bc" : "credits19", - "8032d7c4" : "credits20", - "8032d7cc" : "sCreditsSequence", - "8032d93c" : "gMarioState", - "8032d940" : "unused1", - "8032d944" : "D_8032C9E0", - "8032daa0" : "sTerrainSounds", - "8032dacc" : "sSquishScaleOverTime", - "8032dae0" : "sCapFlickerFrames", - "8032daf8" : "gWaterSurfacePseudoFloor", - "8032dc50" : "sJumpLandAction", - "8032dc68" : "sFreefallLandAction", - "8032dc80" : "sSideFlipLandAction", - "8032dc98" : "sHoldJumpLandAction", - "8032dcb0" : "sHoldFreefallLandAction", - "8032dcc8" : "sLongJumpLandAction", - "8032dce0" : "sDoubleJumpLandAction", - "8032dcf8" : "sTripleJumpLandAction", - "8032dd10" : "sBackflipLandAction", - "8032dd40" : "sPunchingForwardVelocities", - "8032dd80" : "gLastCompletedCourseNum", - "8032dd84" : "gLastCompletedStarNum", - "8032dd88" : "sUnusedGotGlobalCoinHiScore", - "8032dd8c" : "gGotFileCoinHiScore", - "8032dd90" : "gCurrCourseStarFlags", - "8032dd94" : "gSpecialTripleJump", - "8032dd98" : "gLevelToCourseNumTable", - "8032ddc0" : "gMarioSpawnInfo", - "8032ddc4" : "gLoadedGraphNodes", - "8032ddc8" : "gAreas", - "8032ddcc" : "gCurrentArea", - "8032ddd0" : "gCurrCreditsEntry", - "8032ddd4" : "D_8032CE74", - "8032ddd8" : "D_8032CE78", - "8032dddc" : "gWarpTransDelay", - "8032dde0" : "gFBSetColor", - "8032dde4" : "gWarpTransFBSetColor", - "8032dde8" : "gWarpTransRed", - "8032ddec" : "gWarpTransGreen", - "8032ddf0" : "gWarpTransBlue", - "8032ddf4" : "gCurrSaveFileNum", - "8032ddf8" : "gCurrLevelNum", - "8032ddfc" : "D_8032CE9C", - "8032de4c" : "D_8032CEEC", - "8032de60" : "D_8032CF00", - "8032de70" : "renderModeTable_1Cycle", - "8032deb0" : "renderModeTable_2Cycle", - "8032def0" : "gCurGraphNodeRoot", - "8032def4" : "gCurGraphNodeMasterList", - "8032def8" : "gCurGraphNodeCamFrustum", - "8032defc" : "gCurGraphNodeCamera", - "8032df00" : "gCurGraphNodeObject", - "8032df04" : "gCurGraphNodeHeldObject", - "8032df08" : "gAreaUpdateCounter", - "8032df10" : "gProfilerMode", - "8032df14" : "gCurrentFrameIndex1", - "8032df18" : "gCurrentFrameIndex2", - "8032df20" : "unused8032CFC0", - "8032df24" : "gCutsceneFocus", - "8032df28" : "unused8032CFC8", - "8032df2c" : "unused8032CFCC", - "8032df30" : "gSecondCameraFocus", - "8032df34" : "sYawSpeed", - "8032df38" : "gCurrLevelArea", - "8032df3c" : "gPrevLevel", - "8032df40" : "unused8032CFE0", - "8032df44" : "unused8032CFE4", - "8032df48" : "unused8032CFE8", - "8032df4c" : "gCameraZoomDist", - "8032df50" : "sObjectCutscene", - "8032df54" : "gRecentCutscene", - "8032df58" : "sFramesSinceCutsceneEnded", - "8032df5c" : "sCutsceneDialogResponse", - "8032df60" : "sMarioCamState", - "8032df64" : "sLuigiCamState", - "8032df68" : "unused8032D008", - "8032df6c" : "sFixedModeBasePosition", - "8032df78" : "sUnusedModeBasePosition_2", - "8032df84" : "sUnusedModeBasePosition_3", - "8032df90" : "sUnusedModeBasePosition_4", - "8032df9c" : "sUnusedModeBasePosition_5", - "8032dfa8" : "sModeTransitions", - "8032e008" : "unused8032D0A8", - "8032e010" : "unused8032D0B0", - "8032e018" : "sDanceCutsceneTable", - "8032e024" : "unusedDanceInfo1", - "8032e038" : "unusedDanceType", - "8032e03c" : "unusedDanceInfo2", - "8032e050" : "sBBHLibraryParTrackPath", - "8032e098" : "sCamSL", - "8032e0e0" : "sCamTHI", - "8032e128" : "sCamHMC", - "8032e1d0" : "sCamSSL", - "8032e248" : "sCamRR", - "8032e2f0" : "sCamBOB", - "8032e338" : "sCamCotMC", - "8032e368" : "sCamCCM", - "8032e3b0" : "sCamCastle", - "8032e6f8" : "sCamBBH", - "8032ecb0" : "sCameraTriggers", - "8032ed50" : "sIntroStartToPipePosition", - "8032ee08" : "sIntroStartToPipeFocus", - "8032eec0" : "sIntroPipeToDialogPosition", - "8032ef30" : "sIntroPipeToDialogFocus", - "8032efa0" : "sEndingFlyToWindowPos", - "8032eff0" : "sEndingFlyToWindowFocus", - "8032f048" : "sEndingPeachDescentCamPos", - "8032f0e8" : "sEndingMarioToPeachPos", - "8032f130" : "sEndingMarioToPeachFocus", - "8032f178" : "sEndingLookUpAtCastle", - "8032f1b8" : "sEndingLookAtSkyFocus", - "8032f214" : "gIntroLakituStartToPipeFocus", - "8032f32c" : "gIntroLakituStartToPipeOffsetFromCamera", - "8032f444" : "gEndWavingPos", - "8032f48c" : "gEndWavingFocus", - "8032f4d4" : "sCutsceneEnding", - "8032f534" : "sCutsceneGrandStar", - "8032f544" : "sCutsceneUnused", - "8032f554" : "sCutsceneDoorWarp", - "8032f564" : "sCutsceneEndWaving", - "8032f56c" : "sCutsceneCredits", - "8032f574" : "sCutsceneDoorPull", - "8032f59c" : "sCutsceneDoorPush", - "8032f5c4" : "sCutsceneDoorPullMode", - "8032f5dc" : "sCutsceneDoorPushMode", - "8032f5f4" : "sCutsceneEnterCannon", - "8032f60c" : "sCutsceneStarSpawn", - "8032f624" : "sCutsceneRedCoinStarSpawn", - "8032f634" : "sCutsceneEnterPainting", - "8032f63c" : "sCutsceneDeathExit", - "8032f64c" : "sCutsceneExitPaintingSuccess", - "8032f65c" : "sCutsceneUnusedExit", - "8032f674" : "sCutsceneIntroPeach", - "8032f69c" : "sCutscenePrepareCannon", - "8032f6ac" : "sCutsceneExitWaterfall", - "8032f6bc" : "sCutsceneFallToCastleGrounds", - "8032f6cc" : "sCutsceneEnterPyramidTop", - "8032f6dc" : "sCutscenePyramidTopExplode", - "8032f6f4" : "sCutsceneStandingDeath", - "8032f6fc" : "sCutsceneEnterPool", - "8032f70c" : "sCutsceneDeathStomach", - "8032f714" : "sCutsceneDeathOnBack", - "8032f71c" : "sCutsceneQuicksandDeath", - "8032f724" : "sCutsceneWaterDeath", - "8032f72c" : "sCutsceneSuffocation", - "8032f734" : "sCutsceneEnterBowserArena", - "8032f74c" : "sCutsceneDanceDefaultRotate", - "8032f754" : "sCutsceneDanceFlyAway", - "8032f75c" : "sCutsceneDanceCloseup", - "8032f764" : "sCutsceneKeyDance", - "8032f76c" : "sCutsceneCapSwitchPress", - "8032f774" : "sCutsceneSlidingDoorsOpen", - "8032f784" : "sCutsceneUnlockKeyDoor", - "8032f794" : "sCutsceneExitBowserSuccess", - "8032f7a4" : "sCutsceneExitBowserDeath", - "8032f7b4" : "sCutsceneExitSpecialSuccess", - "8032f7c4" : "sCutsceneNonPaintingDeath", - "8032f7d4" : "sCutsceneDialog", - "8032f7ec" : "sCutsceneReadMessage", - "8032f804" : "sDanceCutsceneIndexTable", - "8032f870" : "sZoomOutAreaMasks", - "8032f884" : "sBobCreditsSplinePositions", - "8032f8ac" : "sBobCreditsSplineFocus", - "8032f8d4" : "sWfCreditsSplinePositions", - "8032f8fc" : "sWfCreditsSplineFocus", - "8032f924" : "sJrbCreditsSplinePositions", - "8032f94c" : "sJrbCreditsSplineFocus", - "8032f974" : "sCcmSlideCreditsSplinePositions", - "8032f99c" : "sCcmSlideCreditsSplineFocus", - "8032f9c4" : "sBbhCreditsSplinePositions", - "8032f9e4" : "sBbhCreditsSplineFocus", - "8032fa04" : "sHmcCreditsSplinePositions", - "8032fa2c" : "sHmcCreditsSplineFocus", - "8032fa54" : "sThiWigglerCreditsSplinePositions", - "8032fa6c" : "sThiWigglerCreditsSplineFocus", - "8032fa84" : "sVolcanoCreditsSplinePositions", - "8032fab4" : "sVolcanoCreditsSplineFocus", - "8032fae4" : "sSslCreditsSplinePositions", - "8032fb14" : "sSslCreditsSplineFocus", - "8032fb44" : "sDddCreditsSplinePositions", - "8032fb7c" : "sDddCreditsSplineFocus", - "8032fbb4" : "sSlCreditsSplinePositions", - "8032fbd4" : "sSlCreditsSplineFocus", - "8032fbf4" : "sWdwCreditsSplinePositions", - "8032fc14" : "sWdwCreditsSplineFocus", - "8032fc34" : "sTtmCreditsSplinePositions", - "8032fc64" : "sTtmCreditsSplineFocus", - "8032fc94" : "sThiHugeCreditsSplinePositions", - "8032fccc" : "sThiHugeCreditsSplineFocus", - "8032fd04" : "sTtcCreditsSplinePositions", - "8032fd24" : "sTtcCreditsSplineFocus", - "8032fd44" : "sRrCreditsSplinePositions", - "8032fd64" : "sRrCreditsSplineFocus", - "8032fd84" : "sSaCreditsSplinePositions", - "8032fdac" : "sSaCreditsSplineFocus", - "8032fdd4" : "sCotmcCreditsSplinePositions", - "8032fdfc" : "sCotmcCreditsSplineFocus", - "8032fe24" : "sDddSubCreditsSplinePositions", - "8032fe4c" : "sDddSubCreditsSplineFocus", - "8032fe74" : "sCcmOutsideCreditsSplinePositions", - "8032fe94" : "sCcmOutsideCreditsSplineFocus", - "8032fec0" : "sObjectListUpdateOrder", - "8032fecc" : "sParticleTypes", - "80330000" : "D_8032F0A0", - "80330004" : "D_8032F0A4", - "80330020" : "D_8032F0C0", - "8033002c" : "D_8032F0CC", - "8033006c" : "sMrIParticleActions", - "80330074" : "sMrIActions", - "80330084" : "sMrIHitbox", - "80330094" : "D_8032F134", - "803300a8" : "unused8032F134", - "803300ac" : "sCapSwitchActions", - "803300bc" : "sKingBobombActions", - "803300e0" : "sKingBobombSoundStates", - "80330140" : "sOpenedCannonActions", - "8033015c" : "unused0EA1FC", - "80330198" : "sChuckyaActions", - "803301a8" : "sWFRotatingPlatformData", - "803301c0" : "sKoopaShellUnderwaterHitbox", - "803301d0" : "D_8032F270", - "803301e4" : "sSparkleSpawnStarHitbox", - "803301f4" : "sYellowCoinHitbox", - "80330204" : "D_8032F2A4", - "80330224" : "sCoinInsideBooActions", - "8033022c" : "D_8032F2CC", - "80330244" : "D_8032F2E4", - "80330260" : "D_8032F300", - "80330288" : "D_8032F328", - "80330290" : "D_8032F330", - "80330298" : "sGrindelThwompActions", - "803302ac" : "sTumblingBridgeParams", - "803302dc" : "sTumblingBridgeActions", - "803302ec" : "D_8032F38C", - "80330318" : "sElevatorActions", - "8033032c" : "D_8032F3CC", - "80330340" : "D_8032F3E0", - "80330354" : "D_8032F3F4", - "8033035c" : "D_8032F3FC", - "80330370" : "sUkikiCageActions", - "80330380" : "D_8032F420", - "80330390" : "sSpindriftHitbox", - "803303a0" : "sMetalBoxHitbox", - "803303b0" : "sBreakableBoxHitbox", - "803303c0" : "D_8032F460", - "803303e8" : "sHeaveHoActions", - "803303f8" : "sJumpingBoxHitbox", - "80330408" : "sJumpingBoxActions", - "8033042c" : "sBowserKeyHitbox", - "8033043c" : "sBulletBillActions", - "80330450" : "sBowserTailAnchorActions", - "8033045c" : "D_8032F4FC", - "8033046c" : "D_8032F50C", - "80330470" : "D_8032F510", - "80330474" : "D_8032F514", - "80330478" : "sBowserDefeatedDialogText", - "80330480" : "D_8032F520", - "803304c8" : "sBowserActions", - "80330518" : "D_8032F5B8", - "803305f0" : "D_8032F690", - "803305f4" : "D_8032F694", - "803305f8" : "D_8032F698", - "8033067c" : "sFallingBowserPlatformActions", - "80330688" : "sGrowingBowserFlameHitbox", - "80330698" : "sBowserFlameHitbox", - "803306a8" : "D_8032F748", - "803306b4" : "D_8032F754", - "803306dc" : "sCageUkikiPath", - "80330738" : "sUkikiSoundStates", - "803307a0" : "sUkikiActions", - "803307c0" : "D_8032F860", - "803307f4" : "D_8032F894", - "80330828" : "D_8032F8C8", - "80330830" : "sRotatingCwFireBarsActions", - "80330840" : "sKoopaShellHitbox", - "80330850" : "D_8032F8F0", - "80330884" : "D_8032F924", - "803308a8" : "D_8032F948", - "803308cc" : "D_8032F96C", - "803308d8" : "sToxBoxActions", - "80330900" : "TablePiranhaPlantActions", - "80330b1c" : "sBowserPuzzlePieceActions", - "80330b38" : "sTuxiesMotherActions", - "80330b44" : "sSmallPenguinActions", - "80330b5c" : "sFishActions", - "80330b68" : "sFishGroupActions", - "80330b74" : "sBirdChirpChirpActions", - "80330b84" : "sCheepCheepActions", - "80330b90" : "sExclamationBoxHitbox", - "80330ba0" : "sExclamationBoxContents", - "80330c20" : "sExclamationBoxActions", - "80330c38" : "sSkullSlidingBoxHitbox", - "80330c48" : "D_8032FCE8", - "80330c58" : "sTweesterHitbox", - "80330c68" : "sTweesterActions", - "80330cd4" : "sScuttlebugHitbox", - "80330ce4" : "sWhompActions", - "80330d0c" : "sWaterSplashDropletParams", - "80330d30" : "sShallowWaterSplashDropletParams", - "80330d54" : "sWaterDropletFishParams", - "80330d78" : "sShallowWaterWaveDropletParams", - "80330d9c" : "sStrongWindParticleHitbox", - "80330dac" : "sSLWalkingPenguinErraticSteps", - "80330e20" : "D_8032FEC0", - "80330e24" : "unused_8032FEC4", - "80330e34" : "gMarioPlatform", - "80330e40" : "sDebugEffectStringInfo", - "80330e64" : "sDebugEnemyStringInfo", - "80330e88" : "sDebugInfoDPadMask", - "80330e8c" : "sDebugInfoDPadUpdID", - "80330e90" : "sDebugLvSelectCheckFlag", - "80330e94" : "sDebugPage", - "80330e98" : "sNoExtraDebug", - "80330e9c" : "sDebugStringArrPrinted", - "80330ea0" : "sDebugSysCursor", - "80330ea4" : "sDebugInfoButtonSeqID", - "80330ea8" : "sDebugInfoButtonSeq", - "80330ec0" : "sTransitionColorFadeCount", - "80330ec4" : "sTransitionTextureFadeCount", - "80330ec8" : "sTextureTransitionID", - "80330ee0" : "rectangles", - "80330f00" : "sSkyboxTextures", - "80330f28" : "sSkyboxColors", - "80330f30" : "gMovtexCounter", - "80330f34" : "gMovtexCounterPrev", - "80330f38" : "gMovtexVtxColor", - "80330f3c" : "gPaintingMarioYEntry", - "80330f40" : "gWdwWaterLevelSet", - "80330f44" : "gMovtexIdToTexture", - "80330f64" : "gMovtexNonColored", - "803311a4" : "gMovtexColored", - "8033127c" : "gMovtexColored2", - "80331300" : "sHmcPaintings", - "80331308" : "sInsideCastlePaintings", - "80331344" : "sTtmPaintings", - "8033134c" : "sPaintingGroups", - "80331358" : "gPaintingUpdateCounter", - "8033135c" : "gLastPaintingUpdateCounter", - "80331360" : "sTextLabelsCount", - "80331370" : "gDialogCharWidths", - "80331470" : "gDialogBoxState", - "80331474" : "gDialogBoxOpenTimer", - "80331478" : "gDialogBoxScale", - "8033147c" : "gDialogScrollOffsetY", - "80331480" : "gDialogBoxType", - "80331484" : "gDialogID", - "80331488" : "gLastDialogPageStrPos", - "8033148c" : "gDialogTextPos", - "80331490" : "gDialogLineNum", - "80331494" : "gLastDialogResponse", - "80331498" : "gMenuHoldKeyIndex", - "8033149c" : "gMenuHoldKeyTimer", - "803314a0" : "gDialogResponse", - "803314b0" : "gHudSymCoin", - "803314b4" : "gHudSymX", - "803314f8" : "gMenuMode", - "803314fc" : "gEndCutsceneStrEn0", - "80331504" : "gEndCutsceneStrEn1", - "80331538" : "gEndCutsceneStrEn2", - "80331558" : "gEndCutsceneStrEn3", - "8033156c" : "gEndCutsceneStrEn4", - "80331598" : "gEndCutsceneStrEn5", - "803315ac" : "gEndCutsceneStrEn6", - "803315cc" : "gEndCutsceneStrEn7", - "803315dc" : "gEndCutsceneStrEn8", - "803315e4" : "gEndCutsceneStringsEn", - "8033160c" : "gCutsceneMsgFade", - "80331610" : "gCutsceneMsgIndex", - "80331614" : "gCutsceneMsgDuration", - "80331618" : "gCutsceneMsgTimer", - "8033161c" : "gDialogCameraAngleIndex", - "80331620" : "gDialogCourseActNum", - "803316c8" : "gCourseCompleteCoinsEqual", - "803316cc" : "gCourseDoneMenuTimer", - "803316d0" : "gCourseCompleteCoins", - "803316d4" : "gHudFlash", - "80331750" : "gEnvFxMode", - "80331754" : "D_80330644", - "80331758" : "gSnowTempVtx", - "80331788" : "gSnowFlakeVertex1", - "80331790" : "gSnowFlakeVertex2", - "80331798" : "gSnowFlakeVertex3", - "803317a0" : "D_80330690", - "803317a4" : "D_80330694", - "803317a8" : "gBubbleTempVtx", - "803317e0" : "MacroObjectPresets", - "803325fc" : "sPowerMeterVisibleTimer", - "80332614" : "sPrevCheckMarioRoom", - "80332618" : "sYoshiDead", - "8033261c" : "sDebugSequenceTracker", - "80332620" : "sDebugTimer", - "803327a8" : "sBreakableBoxSmallHitbox", - "80332b00" : "sMrBlizzardHitbox", - "80332b10" : "D_80331A00", - "80332b24" : "sMrBlizzardSnowballHitbox", - "80332b34" : "D_80331A24", - "80332b54" : "D_80331A44", - "80332b5c" : "D_80331A4C", - "80332b64" : "D_80331A54", - "80332bdc" : "D_80331ACC", - "80332bf0" : "sRecoveryHeartHitbox", - "80332c00" : "sUnagiHitbox", - "80332c10" : "sHauntedChairHitbox", - "80332c30" : "sFlyingBookendHitbox", - "80332c40" : "D_80331B30", - "80332c4c" : "sBookSwitchHitbox", - "80332c5c" : "sFirePiranhaPlantHitbox", - "80332c6c" : "D_80331B5C", - "80332c74" : "sPiranhaPlantFireHitbox", - "80332c84" : "sSnufitHitbox", - "80332c94" : "sSnufitBulletHitbox", - "80332ca4" : "sEyerokHitbox", - "80332cb4" : "D_80331BA4", - "80332d10" : "coffinRelativePos", - "80332d28" : "sClamShellHitbox", - "80332d38" : "sSkeeterHitbox", - "80332d48" : "D_80331C38", - "80332e50" : "gAudioErrorFlags", - "80332e54" : "sGameLoopTicked", - "80332e58" : "sDialogSpeaker", - "80332f04" : "sDialogSpeakerVoice", - "80332f40" : "sNumProcessedSoundRequests", - "80332f44" : "sSoundRequestCount", - "80332f48" : "sDynBbh", - "80332f54" : "sDynDdd", - "80332f6c" : "sDynJrb", - "80332f88" : "sDynWdw", - "80332f98" : "sDynHmc", - "80332fa8" : "sDynUnk38", - "80332fb8" : "sDynNone", - "80332fbc" : "sCurrentMusicDynamic", - "80332fc0" : "sBackgroundMusicForDynamics", - "80332fc4" : "sLevelDynamics", - "80333060" : "sMusicDynamics", - "803330c0" : "gAreaEchoLevel", - "80333138" : "D_80332028", - "80333188" : "sBackgroundMusicDefaultVolume", - "803331ac" : "sPlayer0CurSeqId", - "803331b0" : "sMusicDynamicDelay", - "803331b4" : "D_803320A4", - "803331c0" : "D_803320B0", - "803331cc" : "D_803320BC", - "803331d8" : "sMaxChannelsForSoundBank", - "803331e4" : "sNumSoundsPerBank", - "803331f0" : "gDefaultSoundArgs", - "803331fc" : "sUnusedSoundArgs", - "80333208" : "sSoundBankDisabled", - "80333218" : "D_80332108", - "8033321c" : "sHasStartedFadeOut", - "80333220" : "D_80332110", - "80333224" : "sUnused80332114", - "80333228" : "sUnused80332118", - "8033322c" : "D_8033211C", - "80333230" : "D_80332120", - "80333234" : "D_80332124", - "80333238" : "sBackgroundMusicQueueSize", - "8033323c" : "sUnused8033323C", - "803332a0" : "gAudioSessionPresets", - "80333498" : "gAudioCosineTable", - "80333598" : "gPitchBendFrequencyScale", - "80333994" : "gNoteFrequencies", - "80333b94" : "gDefaultShortNoteVelocityTable", - "80333ba4" : "gDefaultShortNoteDurationTable", - "80333bb4" : "gVibratoCurve", - "80333bc4" : "gDefaultEnvelope", - "80333bd0" : "sSineWave", - "80333c50" : "sSquareWave", - "80333cd0" : "sTriangleWave", - "80333d50" : "sSawtoothWave", - "80333dd0" : "gWaveSamples", - "80333de0" : "gHeadsetPanQuantization", - "80333df4" : "gHeadsetPanVolume", - "80333ff4" : "gStereoPanVolume", - "803341f4" : "gDefaultPanVolume", - "803343f4" : "gVolRampingLhs136", - "803345f4" : "gVolRampingRhs136", - "803347f4" : "gVolRampingLhs144", - "803349f4" : "gVolRampingRhs144", - "80334bf4" : "gVolRampingLhs128", - "80334df4" : "gVolRampingRhs128", - "80334ff4" : "gTatumsPerBeat", - "80334ff8" : "gUnusedCount80333EE8", - "80334ffc" : "gAudioHeapSize", - "80335000" : "D_80333EF0", - "80335004" : "gAudioLoadLock", - "80335008" : "sUnused8033EF8", - "80335010" : "osViModeTable", - "803358f0" : "piMgrArgs", - "80335910" : "osClockRate", - "80335918" : "D_80334808", - "80335920" : "D_80334810", - "80335930" : "D_80334820", - "80335940" : "D_80334830", - "80335950" : "_spaces", - "80335974" : "_zeroes", - "803359a0" : "D_80334890", - "803359a4" : "unknown", - "803359a8" : "D_80334898", - "803359ac" : "D_8033489C", - "803359b0" : "D_803348A0", - "803359b4" : "D_803348A4", - "803359c0" : "D_803348B0", - "80335a20" : "D_80334910", - "80335a24" : "D_80334914", - "80335a28" : "D_80334918", - "80335a2c" : "D_8033491C", - "80335a30" : "D_80334920", - "80335a44" : "D_80334934", - "80335a48" : "D_80334938", - "80335a50" : "gOsPiAccessQueueCreated", - "80335a60" : "gOsSiAccessQueueCreated", - "80335aa0" : "D_80334990", - "80335af0" : "D_803349E0", - "80335b40" : "D_80334A30", - "80335b44" : "D_80334A34", - "80335b48" : "D_80334A38", - "80335b50" : "D_80334A40", - "80335b54" : "D_80334A44", - "80338da0" : "D_80337BB0", - "80338da8" : "D_80337BB8", - "80338e60" : "jtbl_80337C90", - "80338e84" : "jtbl_80337CB4", - "80338eac" : "jtbl_80337CDC", - "80338ec0" : "jtbl_80337D08", - "80338fbc" : "jtbl_80337E04", - "8033978c" : "jtbl_80338418", - "80339880" : "length_str", - "80339884" : "flags_str", - "8033988c" : "flags_arr", - "80339980" : "D_80338610", - "803399a0" : "jtbl_80338630", - "803399d0" : "NAN", - "803399e0" : "D_80338670", - "80339a40" : "D_803386D0", - "80339ac0" : "rspF3DDataStart", - "8033a2c0" : "rspF3DDataEnd", - "8033a2c0" : "rspAspMainDataStart", - "8033a580" : "rspAspMainDataEnd", - "8033a580" : "_mainSegmentEnd", - "008c0c40" : "_mainSegmentRomEnd", - "8033a580" : "_mainSegmentNoloadStart", - "8033a580" : "D_80339210", - "8033a730" : "gIdleThread", - "8033a8e0" : "gMainThread", - "8033aa90" : "gGameLoopThread", - "8033ac40" : "gSoundThread", - "8033adf0" : "gPIMesgQueue", - "8033ae08" : "gIntrMesgQueue", - "8033ae20" : "gSPTaskMesgQueue", - "8033ae38" : "gDmaMesgBuf", - "8033ae40" : "gPIMesgBuf", - "8033aec0" : "gSIEventMesgBuf", - "8033aec8" : "gIntrMesgBuf", - "8033af08" : "gUnknownMesgBuf", - "8033af48" : "gDmaIoMesg", - "8033af5c" : "D_80339BEC", - "8033af60" : "gDmaMesgQueue", - "8033af78" : "gSIEventMesgQueue", - "8033af90" : "gControllers", - "8033afe8" : "gControllerStatuses", - "8033aff8" : "gControllerPads", - "8033b010" : "gGameVblankQueue", - "8033b028" : "D_80339CB8", - "8033b040" : "D_80339CD0", - "8033b044" : "D_80339CD4", - "8033b048" : "gGameVblankHandler", - "8033b050" : "gPhysicalFrameBuffers", - "8033b05c" : "gPhysicalZBuffer", - "8033b060" : "D_80339CF0", - "8033b064" : "D_80339CF4", - "8033b068" : "gGfxSPTask", - "8033b06c" : "gDisplayListHead", - "8033b070" : "gGfxPoolEnd", - "8033b074" : "gGfxPool", - "8033b078" : "gControllerBits", - "8033b079" : "gEepromProbe", - "8033b080" : "D_80339D10", - "8033b090" : "gDemo", - "8033b0a0" : "filler80339D30", - "8033b170" : "gMarioStates", - "8033b238" : "sCurrPlayMode", - "8033b23a" : "D_80339ECA", - "8033b23c" : "sTransitionTimer", - "8033b240" : "sTransitionUpdate", - "8033b244" : "unused3", - "8033b248" : "sWarpDest", - "8033b250" : "D_80339EE0", - "8033b252" : "sDelayedWarpOp", - "8033b254" : "sDelayedWarpTimer", - "8033b256" : "sSourceWarpNodeId", - "8033b258" : "sDelayedWarpArg", - "8033b25c" : "unused4", - "8033b25e" : "sTimerRunning", - "8033b260" : "gHudDisplay", - "8033b26e" : "gShouldNotPlayCastleMusic", - "8033b270" : "sDelayInvincTimer", - "8033b272" : "sInvulnerable", - "8033b280" : "unused80339F10", - "8033b288" : "filler80339F1C", - "8033b2c0" : "D_80339F50", - "8033b350" : "gMirrorMario", - "8033b3b0" : "gBodyStates", - "8033b400" : "sSegmentTable", - "8033b480" : "sPoolFreeSpace", - "8033b484" : "sPoolStart", - "8033b488" : "sPoolEnd", - "8033b48c" : "sPoolListHeadL", - "8033b490" : "sPoolListHeadR", - "8033b494" : "gEffectsMemoryPool", - "8033b4a0" : "gWarpCheckpoint", - "8033b4a5" : "gMainMenuDataModified", - "8033b4a6" : "gSaveFileModified", - "8033b4b0" : "gPlayerSpawnInfos", - "8033b4d0" : "D_8033A160", - "8033b8d0" : "gAreaData", - "8033bab0" : "gWarpTransition", - "8033bac6" : "gCurrCourseNum", - "8033bac8" : "gCurrActNum", - "8033baca" : "gCurrAreaIndex", - "8033bacc" : "gSavedCourseNum", - "8033bace" : "gPauseScreenMode", - "8033bad0" : "gSaveOptSelectIndex", - "8033bae0" : "gMatStackIndex", - "8033bae8" : "gMatStack", - "8033c2e8" : "gMatStackFixed", - "8033c368" : "gGeoTempState", - "8033c378" : "gCurAnimType", - "8033c379" : "gCurAnimEnabled", - "8033c37a" : "gCurrAnimFrame", - "8033c37c" : "gCurAnimTranslationMultiplier", - "8033c380" : "gCurrAnimAttribute", - "8033c384" : "gCurAnimData", - "8033c388" : "gDisplayListHeap", - "8033c390" : "gProfilerFrameData", - "8033c520" : "gPlayerCameraState", - "8033c568" : "sOldPosition", - "8033c578" : "sOldFocus", - "8033c588" : "sPlayer2FocusOffset", - "8033c594" : "sCreditsPlayer2Pitch", - "8033c596" : "sCreditsPlayer2Yaw", - "8033c598" : "sFramesPaused", - "8033c5a0" : "sFOVState", - "8033c5c0" : "sModeTransition", - "8033c5e8" : "sMarioGeometry", - "8033c61c" : "unusedFreeRoamWallYaw", - "8033c61e" : "sAvoidYawVel", - "8033c620" : "sCameraYawAfterDoorCutscene", - "8033c622" : "unusedSplinePitch", - "8033c624" : "unusedSplineYaw", - "8033c628" : "sHandheldShakeSpline", - "8033c668" : "sHandheldShakeMag", - "8033c66c" : "sHandheldShakeTimer", - "8033c670" : "sHandheldShakeInc", - "8033c674" : "sHandheldShakePitch", - "8033c676" : "sHandheldShakeYaw", - "8033c678" : "sHandheldShakeRoll", - "8033c67c" : "unused8033B30C", - "8033c680" : "unused8033B310", - "8033c684" : "sSelectionFlags", - "8033c686" : "unused8033B316", - "8033c688" : "s2ndRotateFlags", - "8033c68a" : "unused8033B31A", - "8033c68c" : "sCameraSoundFlags", - "8033c68e" : "sCButtonsPressed", - "8033c690" : "sCutsceneDialogID", - "8033c698" : "gLakituState", - "8033c758" : "unused8033B3E8", - "8033c75a" : "sAreaYaw", - "8033c75c" : "sAreaYawChange", - "8033c75e" : "sLakituDist", - "8033c760" : "sLakituPitch", - "8033c764" : "sZoomAmount", - "8033c768" : "sCSideButtonYaw", - "8033c76a" : "sBehindMarioSoundTimer", - "8033c76c" : "sZeroZoomDist", - "8033c770" : "sCUpCameraPitch", - "8033c772" : "sModeOffsetYaw", - "8033c774" : "sSpiralStairsYawOffset", - "8033c776" : "s8DirModeBaseYaw", - "8033c778" : "s8DirModeYawOffset", - "8033c77c" : "sPanDistance", - "8033c780" : "sCannonYOffset", - "8033c788" : "sModeInfo", - "8033c7d0" : "sCastleEntranceOffset", - "8033c7dc" : "sParTrackIndex", - "8033c7e0" : "sParTrackPath", - "8033c7e8" : "sParTrackTransOff", - "8033c808" : "sCameraStoreCUp", - "8033c828" : "sCameraStoreCutscene", - "8033c848" : "gCameraMovementFlags", - "8033c84a" : "sStatusFlags", - "8033c850" : "sCurCreditsSplinePos", - "8033c950" : "sCurCreditsSplineFocus", - "8033ca50" : "sCutsceneSplineSegment", - "8033ca54" : "sCutsceneSplineSegmentProgress", - "8033ca58" : "unused8033B6E8", - "8033ca5a" : "sCutsceneShot", - "8033ca5c" : "gCutsceneTimer", - "8033ca60" : "sCutsceneVars", - "8033cbc8" : "gObjCutsceneDone", - "8033cbcc" : "gCutsceneObjSpawn", - "8033cbd0" : "gCamera", - "8033cbe0" : "gObjectListArray", - "8033d260" : "gDebugInfoFlags", - "8033d264" : "gNumFindFloorMisses", - "8033d268" : "unused_8033BEF8", - "8033d26c" : "gUnknownWallCount", - "8033d270" : "gObjectCounter", - "8033d274" : "gNumCalls", - "8033d280" : "gDebugInfo", - "8033d380" : "gDebugInfoOverwrite", - "8033d480" : "gTimeStopState", - "8033d488" : "gObjectPool", - "80360e88" : "gMacroObjectDefaultParent", - "803610e8" : "gObjectLists", - "803610f0" : "gFreeObjectList", - "80361158" : "gMarioObject", - "8036115c" : "gLuigiObject", - "80361160" : "gCurrentObject", - "80361164" : "gBehCommand", - "80361168" : "gPrevFrameObjectCount", - "8036116c" : "gSurfaceNodesAllocated", - "80361170" : "gSurfacesAllocated", - "80361174" : "gNumStaticSurfaceNodes", - "80361178" : "gNumStaticSurfaces", - "8036117c" : "gObjectMemoryPool", - "80361180" : "gCheckingSurfaceCollisionsForCamera", - "80361182" : "gFindFloorIncludeSurfaceIntangible", - "80361184" : "gEnvironmentRegions", - "80361188" : "gEnvironmentLevels", - "803611d8" : "gDoorAdjacentRooms", - "80361250" : "gMarioCurrentRoom", - "80361252" : "D_8035FEE2", - "80361254" : "D_8035FEE4", - "80361256" : "gTHIWaterDrained", - "80361258" : "gTTCSpeedSetting", - "8036125a" : "gMarioShotFromCannon", - "8036125c" : "gCCMEnteredSlide", - "8036125e" : "gNumRoomedObjectsInMarioRoom", - "80361260" : "gNumRoomedObjectsNotInMarioRoom", - "80361262" : "gWDWWaterLevelChanging", - "80361264" : "gMarioOnMerryGoRound", - "80361270" : "sGrabReleaseState", - "80361280" : "D_8035FF10", - "80361290" : "gDebugPrintState1", - "803612a0" : "gDebugPrintState2", - "803612b0" : "sMarioOnFlyingCarpet", - "803612b2" : "sSurfaceTypeBelowShadow", - "803612b4" : "gShadowAboveWaterOrLava", - "803612b5" : "gMarioOnIceOrCarpet", - "803612c0" : "sSkyBoxInfo", - "803612e0" : "gMovetexLastTextureId", - "803612f0" : "gFlyingCarpetState", - "80361300" : "gPaintingMarioFloorType", - "80361304" : "gPaintingMarioXPos", - "80361308" : "gPaintingMarioYPos", - "8036130c" : "gPaintingMarioZPos", - "80361310" : "gPaintingMesh", - "80361314" : "gPaintingTriNorms", - "80361318" : "gRipplingPainting", - "8036131c" : "gDddPaintingStatus", - "80361320" : "sTextLabels", - "803613f0" : "gDialogColorFadeTimer", - "803613f2" : "gLastDialogLineNum", - "803613f4" : "gDialogVariable", - "803613f8" : "gDialogTextAlpha", - "803613fa" : "gCutsceneMsgXOffset", - "803613fc" : "gCutsceneMsgYOffset", - "803613fe" : "gRedCoinsCollected", - "80361400" : "gEnvFxBuffer", - "80361408" : "gSnowCylinderLastPos", - "80361414" : "gSnowParticleCount", - "80361416" : "gSnowParticleMaxCount", - "80361420" : "gEnvFxBubbleConfig", - "80361460" : "sNumActiveFirePiranhaPlants", - "80361464" : "sNumKilledFirePiranhaPlants", - "80361468" : "sObjSavedPosX", - "8036146c" : "sObjSavedPosY", - "80361470" : "sObjSavedPosZ", - "80361474" : "sMontyMoleHoleList", - "80361478" : "sMontyMoleKillStreak", - "8036147c" : "sMontyMoleLastKilledPosX", - "80361480" : "sMontyMoleLastKilledPosY", - "80361484" : "sMontyMoleLastKilledPosZ", - "80361488" : "sMasterTreadmill", - "80361490" : "gCurrAiBuffer", - "80361498" : "sSoundRequests", - "80361c98" : "D_80360928", - "80361f98" : "sUsedChannelsForSoundBank", - "80361fa8" : "sCurrentSound", - "80361fb8" : "gSoundBanks", - "80364b78" : "D_80363808", - "80364b82" : "D_80363812", - "80364b88" : "sBackgroundMusicQueue", - "80364ba0" : "D_80363830", - "80364c20" : "D_803638B0", - "80365e70" : "piMgrThread", - "80366020" : "piMgrStack", - "80367020" : "__osPiMesgQueue", - "80367038" : "piMgrMesgBuff", - "80367040" : "D_80365CD0", - "80367050" : "D_80365CE0", - "8036708c" : "D_80365D1C", - "80367090" : "D_80365D20", - "80367091" : "_osCont_numControllers", - "80367098" : "D_80365D28", - "803670b8" : "_osContMesgQueue", - "803670d0" : "_osContMesgBuff", - "803670f0" : "D_80365D80", - "80367110" : "_osCurrentTime", - "80367118" : "D_80365DA8", - "8036711c" : "__osViIntrCount", - "80367120" : "D_80365DB0", - "80367130" : "osPiMesgBuff", - "80367138" : "gOsPiMessageQueue", - "80367150" : "osSiMesgBuff", - "80367158" : "gOsSiMessageQueue", - "80367170" : "D_80365E00", - "803671ac" : "D_80365E3C", - "803671b0" : "D_80365E40", - "803672b0" : "gInterruptedThread", - "80367460" : "_mainSegmentNoloadEnd", - "0000cee0" : "_mainSegmentNoloadSizeLo", - "00000002" : "_mainSegmentNoloadSizeHi", - "00000001" : "ASSERT", - "80378800" : "_engineSegmentStart", - "007cc6c0" : "_engineSegmentRomStart", - "80378800" : "vec3f_copy", - "80378840" : "vec3f_set", - "8037888c" : "vec3f_add", - "803788e4" : "vec3f_sum", - "8037893c" : "vec3s_copy", - "8037897c" : "vec3s_set", - "803789c8" : "vec3s_add", - "80378a20" : "vec3s_sum", - "80378a78" : "vec3s_sub", - "80378ad0" : "vec3s_to_vec3f", - "80378b34" : "vec3f_to_vec3s", - "80378c50" : "find_vector_perpendicular_to_plane", - "80378d38" : "vec3f_cross", - "80378dc0" : "vec3f_normalize", - "80378e68" : "mtxf_copy", - "80378eb4" : "mtxf_identity", - "80378f24" : "mtxf_translate", - "80378f84" : "mtxf_lookat", - "80379440" : "mtxf_rotate_zxy_and_translate", - "803795f0" : "mtxf_rotate_xyz_and_translate", - "80379798" : "mtxf_billboard", - "80379918" : "mtxf_align_terrain_normal", - "80379aa4" : "mtxf_align_terrain_triangle", - "80379f60" : "mtxf_mul", - "8037a29c" : "mtxf_scale_vec3f", - "8037a348" : "mtxf_mul_vec3s", - "8037a434" : "mtxf_to_mtx", - "8037a4b8" : "mtxf_rotate_xy", - "8037a550" : "get_pos_from_transform_mtx", - "8037a69c" : "vec3f_get_dist_and_angle", - "8037a788" : "vec3f_set_dist_and_angle", - "8037a860" : "approach_s32", - "8037a8b4" : "approach_f32", - "8037a9a8" : "atan2s", - "8037ab88" : "atan2f", - "8037abec" : "spline_get_weights", - "8037afb8" : "anim_spline_init", - "8037afe8" : "anim_spline_poll", - "8037b220" : "init_scene_graph_node_links", - "8037b24c" : "init_graph_node_root", - "8037b30c" : "init_graph_node_ortho_projection", - "8037b380" : "init_graph_node_perspective", - "8037b448" : "init_graph_node_start", - "8037b4ac" : "init_graph_node_master_list", - "8037b530" : "init_graph_node_render_range", - "8037b5b4" : "init_graph_node_switch_case", - "8037b670" : "init_graph_node_camera", - "8037b744" : "init_graph_node_translation_rotation", - "8037b7f8" : "init_graph_node_translation", - "8037b89c" : "init_graph_node_rotation", - "8037b940" : "init_graph_node_scale", - "8037b9e0" : "init_graph_node_object", - "8037bad4" : "init_graph_node_culling_radius", - "8037bb48" : "init_graph_node_animated_part", - "8037bbec" : "init_graph_node_billboard", - "8037bc90" : "init_graph_node_display_list", - "8037bd24" : "init_graph_node_shadow", - "8037bdb4" : "init_graph_node_object_parent", - "8037be28" : "init_graph_node_generated", - "8037becc" : "init_graph_node_background", - "8037bf84" : "init_graph_node_held_object", - "8037c044" : "geo_add_child", - "8037c0bc" : "geo_remove_child", - "8037c138" : "geo_make_first_child", - "8037c1e4" : "geo_call_global_function_nodes_helper", - "8037c360" : "geo_call_global_function_nodes", - "8037c3d0" : "geo_reset_object_node", - "8037c448" : "geo_obj_init", - "8037c51c" : "geo_obj_init_spawninfo", - "8037c658" : "geo_obj_init_animation", - "8037c708" : "geo_obj_init_animation_accel", - "8037c7d8" : "retrieve_animation_index", - "8037c844" : "geo_update_animation_frame", - "8037c9e8" : "geo_retreive_animation_translation", - "8037cb10" : "geo_find_root", - "8037cb60" : "read_vec3s_to_vec3f", - "8037cbc0" : "read_vec3s", - "8037cbfc" : "read_vec3s_angle", - "8037cc74" : "register_scene_graph_node", - "8037cd60" : "geo_layout_cmd_branch_and_link", - "8037ce24" : "geo_layout_cmd_end", - "8037cee8" : "geo_layout_cmd_branch", - "8037cf70" : "geo_layout_cmd_return", - "8037cfc0" : "geo_layout_cmd_open_node", - "8037d018" : "geo_layout_cmd_close_node", - "8037d050" : "geo_layout_cmd_assign_as_view", - "8037d0d0" : "geo_layout_cmd_update_node_flags", - "8037d1d0" : "geo_layout_cmd_node_root", - "8037d328" : "geo_layout_cmd_node_ortho_projection", - "8037d3a4" : "geo_layout_cmd_node_perspective", - "8037d48c" : "geo_layout_cmd_node_start", - "8037d4dc" : "geo_layout_cmd_nop3", - "8037d500" : "geo_layout_cmd_node_master_list", - "8037d55c" : "geo_layout_cmd_node_level_of_detail", - "8037d5d4" : "geo_layout_cmd_node_switch_case", - "8037d640" : "geo_layout_cmd_node_camera", - "8037d6f0" : "geo_layout_cmd_node_translation_rotation", - "8037d8d4" : "geo_layout_cmd_node_translation", - "8037d998" : "geo_layout_cmd_node_rotation", - "8037da5c" : "geo_layout_cmd_node_scale", - "8037db50" : "geo_layout_cmd_nop2", - "8037db74" : "geo_layout_cmd_node_animated_part", - "8037dc10" : "geo_layout_cmd_node_billboard", - "8037dcd4" : "geo_layout_cmd_node_display_list", - "8037dd4c" : "geo_layout_cmd_node_shadow", - "8037dddc" : "geo_layout_cmd_node_object_parent", - "8037de34" : "geo_layout_cmd_node_generated", - "8037de94" : "geo_layout_cmd_node_background", - "8037def8" : "geo_layout_cmd_nop", - "8037df1c" : "geo_layout_cmd_copy_view", - "8037dfd4" : "geo_layout_cmd_node_held_obj", - "8037e058" : "geo_layout_cmd_node_culling_radius", - "8037e0b4" : "process_geo_layout", - "803805c8" : "level_script_execute", - "80380de8" : "f32_find_wall_collision", - "80380e8c" : "find_wall_collisions", - "80381264" : "find_ceil", - "80381470" : "unused_obj_find_floor_height", - "803814b8" : "find_floor_height_and_data", - "80381794" : "find_floor_height", - "803817e0" : "unused_find_dynamic_floor", - "80381900" : "find_floor", - "80381ba0" : "find_water_level", - "80381d3c" : "find_poison_gas_level", - "80381f08" : "debug_surface_list_info", - "80382294" : "unused_resolve_floor_or_ceil_collisions", - "80383340" : "alloc_surface_pools", - "803833b8" : "load_area_terrain", - "803835a4" : "clear_dynamic_surfaces", - "80383614" : "transform_object_vertices", - "80383828" : "load_object_surfaces", - "803839cc" : "load_object_collision_model", - "80383bb0" : "RandomU16", - "80383cb4" : "RandomFloat", - "80383d1c" : "RandomSign", - "80383d68" : "func_80383D68", - "80385bf0" : "stub_80385BF0", - "80385c00" : "cur_object_exec_behavior", - "80385f90" : "identityMtx", - "80385fb0" : "zeroMtx", - "80385fd0" : "gVec3fZero", - "80385fdc" : "gVec3sZero", - "80385fe4" : "gVec3fOne", - "80385ff0" : "gVec3sOne", - "80386000" : "gSineTable", - "80387000" : "gCosineTable", - "8038b000" : "gArctanTable", - "8038b810" : "GeoLayoutJumpTable", - "8038b894" : "unused_8038B894", - "8038bc90" : "_engineSegmentEnd", - "007dfb50" : "_engineSegmentRomEnd", - "8038bc90" : "_engineSegmentNoloadStart", - "8038bc90" : "gSplineKeyframe", - "8038bc94" : "gSplineKeyframeFraction", - "8038bc98" : "gSplineState", - "8038bca0" : "gGraphNodePool", - "8038bca4" : "gCurRootGraphNode", - "8038bca8" : "D_8038BCA8", - "8038bcac" : "gGeoViews", - "8038bcb0" : "gGeoNumViews", - "8038bcb8" : "gGeoLayoutStack", - "8038bcf8" : "gCurGraphNodeList", - "8038bd78" : "gCurGraphNodeIndex", - "8038bd7a" : "gGeoLayoutStackIndex", - "8038bd7c" : "D_8038BD7C", - "8038bd7e" : "gGeoLayoutReturnIndex", - "8038bd80" : "gGeoLayoutCommand", - "8038bd88" : "gObjParentGraphNode", - "8038be30" : "sFloorGeo", - "8038be90" : "unused8038BE90", - "8038be98" : "gStaticSurfacePartition", - "8038d698" : "gDynamicSurfacePartition", - "8038ee98" : "sSurfaceNodePool", - "8038ee9c" : "sSurfacePool", - "8038eea0" : "sSurfacePoolSize", - "8038eea8" : "unused8038EEA8", - "8038eef0" : "_engineSegmentNoloadEnd", - "8038f800" : ".", - "8038f800" : "_framebuffersSegmentNoloadStart", - "8038f800" : "0x70800", - "8038f800" : "gFrameBuffer0", - "803b5000" : "gFrameBuffer1", - "803da800" : "gFrameBuffer2", - "80400000" : "_framebuffersSegmentNoloadEnd", - "80400000" : "__expansionRamStart", - "00000001" : "ASSERT", - "10000000" : "_entrySegmentStart", - "007cc6c0" : "_entrySegmentRomStart", - "10000000" : "level_script_entry", - "10000030" : "_entrySegmentEnd", - "007cc6f0" : "_entrySegmentRomEnd", - "02000000" : "_segment2_mio0SegmentStart", - "007cc6c0" : "_segment2_mio0SegmentRomStart", - "0200bd10" : ".", - "0200bd10" : "_segment2_mio0SegmentEnd", - "007d83d0" : "_segment2_mio0SegmentRomEnd", - "04000000" : "_group0_mio0SegmentStart", - "007cc6c0" : "_group0_mio0SegmentRomStart", - "04013260" : ".", - "04013260" : "_group0_mio0SegmentEnd", - "007df920" : "_group0_mio0SegmentRomEnd", - "17000000" : "_group0_geoSegmentStart", - "007cc6c0" : "_group0_geoSegmentRomStart", - "17000000" : "bubble_geo", - "1700001c" : "purple_marble_geo", - "17000038" : "smoke_geo", - "17000084" : "burn_smoke_geo", - "1700009c" : "small_water_splash_geo", - "170000e0" : "mario_TODO_geo_0000E0", - "17000124" : "idle_water_wave_geo", - "17000168" : "wave_trail_geo", - "170001bc" : "sparkles_geo", - "17000230" : "water_splash_geo", - "17000284" : "sparkles_animation_geo", - "170002e0" : "mario_geo_face_and_wings", - "1700041c" : "mario_geo_left_hand", - "17000494" : "mario_geo_right_hand", - "1700053c" : "mario_geo_body", - "170006f8" : "mario_geo_medium_poly_left_hand", - "17000770" : "mario_geo_medium_poly_right_hand", - "17000818" : "mario_geo_medium_poly_body", - "170009d4" : "mario_geo_low_poly_face_and_wings", - "17000b10" : "mario_geo_low_poly_left_hand", - "17000b88" : "mario_geo_low_poly_right_hand", - "17000c30" : "mario_geo_low_poly_body", - "17000dec" : "mario_vanish_geo_face_and_wings", - "17000f28" : "mario_vanish_geo_left_hand", - "17000fa0" : "mario_vanish_geo_right_hand", - "17001048" : "mario_vanish_geo_body", - "17001204" : "mario_vanish_geo_medium_poly_left_hand", - "1700127c" : "mario_vanish_geo_medium_poly_right_hand", - "17001324" : "mario_vanish_geo_medium_poly_body", - "170014e0" : "mario_vanish_geo_low_poly_face_and_wings", - "1700161c" : "mario_vanish_geo_low_poly_left_hand", - "17001694" : "mario_vanish_geo_low_poly_right_hand", - "1700173c" : "mario_vanish_geo_low_poly_body", - "170018f8" : "mario_metal_geo_face_and_wings", - "170019a4" : "mario_metal_geo_left_hand", - "17001a1c" : "mario_metal_geo_right_hand", - "17001ac4" : "mario_metal_geo_body", - "17001c80" : "mario_metal_geo_medium_poly_left_hand", - "17001cf8" : "mario_metal_geo_medium_poly_right_hand", - "17001da0" : "mario_metal_geo_medium_poly_body", - "17001f5c" : "mario_metal_geo_low_poly_face_and_wings", - "17002008" : "mario_metal_geo_low_poly_left_hand", - "17002080" : "mario_metal_geo_low_poly_right_hand", - "17002128" : "mario_metal_geo_low_poly_body", - "170022e4" : "mario_metal_vanish_geo_face_and_wings", - "17002390" : "mario_metal_vanish_geo_left_hand", - "17002408" : "mario_metal_vanish_geo_right_hand", - "170024b0" : "mario_metal_vanish_geo_body", - "1700266c" : "mario_metal_vanish_geo_medium_poly_left_hand", - "170026e4" : "mario_metal_vanish_geo_medium_poly_right_hand", - "1700278c" : "mario_metal_vanish_geo_medium_poly_body", - "17002958" : "mario_metal_vanish_geo_low_poly_face_and_wings", - "17002a04" : "mario_metal_vanish_geo_low_poly_left_hand", - "17002a7c" : "mario_metal_vanish_geo_low_poly_right_hand", - "17002b24" : "mario_metal_vanish_geo_low_poly_body", - "17002ce0" : "mario_geo_load_body", - "17002d14" : "mario_geo_load_medium_poly_body", - "17002d48" : "mario_geo_load_low_poly_body", - "17002d7c" : "mario_geo_render_body", - "17002dd4" : "mario_geo", - "17002e30" : "_group0_geoSegmentEnd", - "007cf4f0" : "_group0_geoSegmentRomEnd", - "05000000" : "_group1_mio0SegmentStart", - "007cc6c0" : "_group1_mio0SegmentRomStart", - "05008070" : ".", - "05008070" : "_group1_mio0SegmentEnd", - "007d4730" : "_group1_mio0SegmentRomEnd", - "0c000000" : "_group1_geoSegmentStart", - "007cc6c0" : "_group1_geoSegmentRomStart", - "0c000000" : "yellow_sphere_geo", - "0c000018" : "hoot_geo", - "0c0001e4" : "yoshi_egg_geo", - "0c000248" : "thwomp_geo", - "0c000264" : "bullet_bill_geo", - "0c00028c" : "heave_ho_geo", - "0c000410" : "_group1_geoSegmentEnd", - "007ccad0" : "_group1_geoSegmentRomEnd", - "05000000" : "_group2_mio0SegmentStart", - "007cc6c0" : "_group2_mio0SegmentRomStart", - "05001e10" : ".", - "05001e10" : "_group2_mio0SegmentEnd", - "007ce4d0" : "_group2_mio0SegmentRomEnd", - "0c000000" : "_group2_geoSegmentStart", - "007cc6c0" : "_group2_geoSegmentRomStart", - "0c000000" : "bully_geo", - "0c000120" : "bully_boss_geo", - "0c000240" : "blargg_geo", - "0c0002b0" : "_group2_geoSegmentEnd", - "007cc970" : "_group2_geoSegmentRomEnd", - "05000000" : "_group3_mio0SegmentStart", - "007cc6c0" : "_group3_mio0SegmentRomStart", - "050068b0" : ".", - "050068b0" : "_group3_mio0SegmentEnd", - "007d2f70" : "_group3_mio0SegmentRomEnd", - "0c000000" : "_group3_geoSegmentStart", - "007cc6c0" : "_group3_geoSegmentRomStart", - "0c000000" : "king_bobomb_geo", - "0c000308" : "water_bomb_geo", - "0c000328" : "water_bomb_shadow_geo", - "0c000340" : "_group3_geoSegmentEnd", - "007cca00" : "_group3_geoSegmentRomEnd", - "05000000" : "_group4_mio0SegmentStart", - "007cc6c0" : "_group4_mio0SegmentRomStart", - "0500a300" : ".", - "0500a300" : "_group4_mio0SegmentEnd", - "007d69c0" : "_group4_mio0SegmentRomEnd", - "0c000000" : "_group4_geoSegmentStart", - "007cc6c0" : "_group4_geoSegmentRomStart", - "0c000000" : "clam_shell_geo", - "0c000068" : "sushi_geo", - "0c00010c" : "unagi_geo", - "0c000280" : "_group4_geoSegmentEnd", - "007cc940" : "_group4_geoSegmentRomEnd", - "05000000" : "_group5_mio0SegmentStart", - "007cc6c0" : "_group5_mio0SegmentRomStart", - "0500bce0" : ".", - "0500bce0" : "_group5_mio0SegmentEnd", - "007d83a0" : "_group5_mio0SegmentRomEnd", - "0c000000" : "_group5_geoSegmentStart", - "007cc6c0" : "_group5_geoSegmentRomStart", - "0c000000" : "klepto_geo", - "0c0002ac" : "eyerok_geo_0002AC", - "0c0005a8" : "eyerok_left_hand_geo", - "0c0005e4" : "eyerok_right_hand_geo", - "0c000610" : "pokey_head_geo", - "0c000644" : "pokey_body_part_geo", - "0c000660" : "_group5_geoSegmentEnd", - "007ccd20" : "_group5_geoSegmentRomEnd", - "05000000" : "_group6_mio0SegmentStart", - "007cc6c0" : "_group6_mio0SegmentRomStart", - "0500e110" : ".", - "0500e110" : "_group6_mio0SegmentEnd", - "007da7d0" : "_group6_mio0SegmentRomEnd", - "0c000000" : "_group6_geoSegmentStart", - "007cc6c0" : "_group6_geoSegmentRomStart", - "0c000000" : "monty_mole_geo", - "0c000110" : "ukiki_geo", - "0c00036c" : "fwoosh_geo", - "0c000390" : "_group6_geoSegmentEnd", - "007cca50" : "_group6_geoSegmentRomEnd", - "05000000" : "_group7_mio0SegmentStart", - "007cc6c0" : "_group7_mio0SegmentRomStart", - "05005070" : ".", - "05005070" : "_group7_mio0SegmentEnd", - "007d1730" : "_group7_mio0SegmentRomEnd", - "0c000000" : "_group7_geoSegmentStart", - "007cc6c0" : "_group7_geoSegmentRomStart", - "0c000000" : "spindrift_geo", - "0c000104" : "penguin_geo", - "0c00021c" : "mr_blizzard_hidden_geo", - "0c000348" : "mr_blizzard_geo", - "0c000370" : "_group7_geoSegmentEnd", - "007cca30" : "_group7_geoSegmentRomEnd", - "05000000" : "_group8_mio0SegmentStart", - "007cc6c0" : "_group8_mio0SegmentRomStart", - "05001180" : ".", - "05001180" : "_group8_mio0SegmentEnd", - "007cd840" : "_group8_mio0SegmentRomEnd", - "0c000000" : "_group8_geoSegmentStart", - "007cc6c0" : "_group8_geoSegmentRomStart", - "0c000000" : "springboard_top_geo", - "0c000018" : "springboard_spring_geo", - "0c000030" : "springboard_bottom_geo", - "0c000048" : "cap_switch_geo", - "0c000090" : "_group8_geoSegmentEnd", - "007cc750" : "_group8_geoSegmentRomEnd", - "05000000" : "_group9_mio0SegmentStart", - "007cc6c0" : "_group9_mio0SegmentRomStart", - "05006960" : ".", - "05006960" : "_group9_mio0SegmentEnd", - "007d3020" : "_group9_mio0SegmentRomEnd", - "0c000000" : "_group9_geoSegmentStart", - "007cc6c0" : "_group9_geoSegmentRomStart", - "0c000000" : "bookend_part_geo", - "0c0000c0" : "bookend_geo", - "0c0000d8" : "haunted_chair_geo", - "0c000188" : "small_key_geo", - "0c0001b4" : "mad_piano_geo", - "0c000224" : "boo_geo", - "0c000274" : "haunted_cage_geo", - "0c0002b0" : "_group9_geoSegmentEnd", - "007cc970" : "_group9_geoSegmentRomEnd", - "05000000" : "_group10_mio0SegmentStart", - "007cc6c0" : "_group10_mio0SegmentRomStart", - "05012cd0" : ".", - "05012cd0" : "_group10_mio0SegmentEnd", - "007df390" : "_group10_mio0SegmentRomEnd", - "0c000000" : "_group10_geoSegmentStart", - "007cc6c0" : "_group10_geoSegmentRomStart", - "0c000000" : "birds_geo", - "0c000098" : "peach_geo_000098", - "0c000254" : "peach_geo_000254", - "0c000410" : "peach_geo", - "0c000468" : "yoshi_geo", - "0c000670" : "_group10_geoSegmentEnd", - "007ccd30" : "_group10_geoSegmentRomEnd", - "05000000" : "_group11_mio0SegmentStart", - "007cc6c0" : "_group11_mio0SegmentRomStart", - "050073f0" : ".", - "050073f0" : "_group11_mio0SegmentEnd", - "007d3ab0" : "_group11_mio0SegmentRomEnd", - "0c000000" : "_group11_geoSegmentStart", - "007cc6c0" : "_group11_geoSegmentRomStart", - "0c000000" : "bubba_geo", - "0c000030" : "wiggler_head_geo", - "0c0001bc" : "enemy_lakitu_geo", - "0c000290" : "spiny_ball_geo", - "0c000328" : "spiny_geo", - "0c0004a0" : "_group11_geoSegmentEnd", - "007ccb60" : "_group11_geoSegmentRomEnd", - "06000000" : "_group12_mio0SegmentStart", - "007cc6c0" : "_group12_mio0SegmentRomStart", - "06030c30" : ".", - "06030c30" : "_group12_mio0SegmentEnd", - "007fd2f0" : "_group12_mio0SegmentRomEnd", - "0d000000" : "_group12_geoSegmentStart", - "007cc6c0" : "_group12_geoSegmentRomStart", - "0d000000" : "bowser_flames_geo", - "0d000090" : "invisible_bowser_accessory_geo", - "0d0000b0" : "bowser_1_yellow_sphere_geo", - "0d0000d8" : "bowser_geo_0000D8", - "0d000424" : "bowser_geo_000424", - "0d000770" : "bowser_geo_000770", - "0d000ab8" : "bowser_shadow_geo", - "0d000ac4" : "bowser_geo", - "0d000b40" : "bowser2_geo", - "0d000bbc" : "bowser_bomb_geo", - "0d000bfc" : "bowser_impact_smoke_geo", - "0d000c50" : "_group12_geoSegmentEnd", - "007cd310" : "_group12_geoSegmentRomEnd", - "06000000" : "_group13_mio0SegmentStart", - "007cc6c0" : "_group13_mio0SegmentRomStart", - "0600a0f0" : ".", - "0600a0f0" : "_group13_mio0SegmentEnd", - "007d67b0" : "_group13_mio0SegmentRomEnd", - "0d000000" : "_group13_geoSegmentStart", - "007cc6c0" : "_group13_geoSegmentRomStart", - "0d000000" : "skeeter_geo", - "0d000284" : "seaweed_geo", - "0d0002f4" : "water_mine_geo", - "0d000324" : "cyan_fish_geo", - "0d00038c" : "bub_geo", - "0d000414" : "water_ring_geo", - "0d000450" : "treasure_chest_base_geo", - "0d000468" : "treasure_chest_lid_geo", - "0d000480" : "_group13_geoSegmentEnd", - "007ccb40" : "_group13_geoSegmentRomEnd", - "06000000" : "_group14_mio0SegmentStart", - "007cc6c0" : "_group14_mio0SegmentRomStart", - "06013a60" : ".", - "06013a60" : "_group14_mio0SegmentEnd", - "007e0120" : "_group14_mio0SegmentRomEnd", - "0d000000" : "_group14_geoSegmentStart", - "007cc6c0" : "_group14_geoSegmentRomStart", - "0d000000" : "koopa_flag_geo", - "0d0000b8" : "wooden_post_geo", - "0d0000d0" : "koopa_without_shell_geo", - "0d000214" : "koopa_with_shell_geo", - "0d000358" : "piranha_plant_geo", - "0d000480" : "whomp_geo", - "0d0005d0" : "metallic_ball_geo", - "0d0005ec" : "chain_chomp_geo", - "0d000680" : "_group14_geoSegmentEnd", - "007ccd40" : "_group14_geoSegmentRomEnd", - "06000000" : "_group15_mio0SegmentStart", - "007cc6c0" : "_group15_mio0SegmentRomStart", - "0600c8e0" : ".", - "0600c8e0" : "_group15_mio0SegmentEnd", - "007d8fa0" : "_group15_mio0SegmentRomEnd", - "0d000000" : "_group15_geoSegmentStart", - "007cc6c0" : "_group15_geoSegmentRomStart", - "0d000000" : "lakitu_geo", - "0d000114" : "toad_geo_000114", - "0d00027c" : "toad_geo_00027C", - "0d0003e4" : "toad_geo", - "0d000448" : "mips_geo", - "0d0005b0" : "boo_castle_geo", - "0d000600" : "_group15_geoSegmentEnd", - "007cccc0" : "_group15_geoSegmentRomEnd", - "06000000" : "_group16_mio0SegmentStart", - "007cc6c0" : "_group16_mio0SegmentRomStart", - "06002ba0" : ".", - "06002ba0" : "_group16_mio0SegmentEnd", - "007cf260" : "_group16_mio0SegmentRomEnd", - "0d000000" : "_group16_geoSegmentStart", - "007cc6c0" : "_group16_geoSegmentRomStart", - "0d000000" : "moneybag_geo_000000", - "0d000078" : "moneybag_geo_000078", - "0d0000f0" : "moneybag_geo", - "0d000150" : "_group16_geoSegmentEnd", - "007cc810" : "_group16_geoSegmentRomEnd", - "06000000" : "_group17_mio0SegmentStart", - "007cc6c0" : "_group17_mio0SegmentRomStart", - "06009c50" : ".", - "06009c50" : "_group17_mio0SegmentEnd", - "007d6310" : "_group17_mio0SegmentRomEnd", - "0d000000" : "_group17_geoSegmentStart", - "007cc6c0" : "_group17_geoSegmentRomStart", - "0d000000" : "mr_i_geo", - "0d00001c" : "mr_i_iris_geo", - "0d0000dc" : "swoop_geo", - "0d0001a0" : "snufit_geo", - "0d000230" : "dorrie_geo", - "0d000394" : "scuttlebug_geo", - "0d0006d0" : "_group17_geoSegmentEnd", - "007ccd90" : "_group17_geoSegmentRomEnd", - "08000000" : "_common0_mio0SegmentStart", - "007cc6c0" : "_common0_mio0SegmentRomStart", - "0800e6d0" : ".", - "0800e6d0" : "_common0_mio0SegmentEnd", - "007dad90" : "_common0_mio0SegmentRomEnd", - "0f000000" : "_common0_geoSegmentStart", - "007cc6c0" : "_common0_geoSegmentRomStart", - "0f000000" : "blue_coin_switch_geo", - "0f000020" : "test_platform_geo", - "0f000028" : "amp_geo", - "0f0001a8" : "cannon_base_geo", - "0f0001c0" : "cannon_barrel_geo", - "0f0001d8" : "chuckya_geo", - "0f0004cc" : "purple_switch_geo", - "0f0004e4" : "checkerboard_platform_geo", - "0f0004fc" : "heart_geo", - "0f000518" : "flyguy_geo", - "0f0005d0" : "breakable_box_geo", - "0f000610" : "breakable_box_small_geo", - "0f000640" : "bowling_ball_geo", - "0f00066c" : "bowling_ball_track_geo", - "0f000694" : "exclamation_box_geo", - "0f0006e4" : "goomba_geo", - "0f0007b8" : "black_bobomb_geo", - "0f0008f4" : "bobomb_buddy_geo", - "0f000a30" : "metal_box_geo", - "0f000a58" : "exclamation_box_outline_geo", - "0f000ab0" : "koopa_shell_geo", - "0f000adc" : "koopa_shell2_geo", - "0f000b08" : "koopa_shell3_geo", - "0f000b40" : "_common0_geoSegmentEnd", - "007cd200" : "_common0_geoSegmentRomEnd", - "03000000" : "_common1_mio0SegmentStart", - "007cc6c0" : "_common1_mio0SegmentRomStart", - "03017990" : ".", - "03017990" : "_common1_mio0SegmentEnd", - "007e4050" : "_common1_mio0SegmentRomEnd", - "16000000" : "_common1_geoSegmentStart", - "007cc6c0" : "_common1_geoSegmentRomStart", - "16000000" : "mist_geo", - "16000020" : "white_puff_geo", - "16000040" : "explosion_geo", - "160000a8" : "butterfly_geo", - "1600013c" : "yellow_coin_geo", - "160001a0" : "yellow_coin_no_shadow_geo", - "16000200" : "blue_coin_geo", - "16000264" : "blue_coin_no_shadow_geo", - "160002c4" : "red_coin_geo", - "16000328" : "red_coin_no_shadow_geo", - "16000388" : "warp_pipe_geo", - "160003a8" : "castle_door_geo", - "1600043c" : "cabin_door_geo", - "160004d0" : "wooden_door_geo", - "16000564" : "wooden_door2_geo", - "160005f8" : "metal_door_geo", - "1600068c" : "hazy_maze_door_geo", - "16000720" : "haunted_door_geo", - "160007b4" : "castle_door_0_star_geo", - "16000868" : "castle_door_1_star_geo", - "1600091c" : "castle_door_3_stars_geo", - "160009d0" : "key_door_geo", - "16000a84" : "bowser_key_geo", - "16000ab0" : "bowser_key_cutscene_geo", - "16000b10" : "red_flame_shadow_geo", - "16000b2c" : "red_flame_geo", - "16000b8c" : "blue_flame_geo", - "16000bec" : "fish_shadow_geo", - "16000c44" : "fish_geo", - "16000c8c" : "leaves_geo", - "16000ca4" : "marios_cap_geo", - "16000cf0" : "marios_metal_cap_geo", - "16000d3c" : "marios_wing_cap_geo", - "16000da8" : "marios_winged_metal_cap_geo", - "16000e14" : "number_geo", - "16000e84" : "mushroom_1up_geo", - "16000ea0" : "star_geo", - "16000ed4" : "dirt_animation_geo", - "16000f24" : "cartoon_star_geo", - "16000f6c" : "transparent_star_geo", - "16000f98" : "white_particle_geo", - "16000fb4" : "wooden_signpost_geo", - "16000fe8" : "bubbly_tree_geo", - "16001000" : "spiky_tree_geo", - "16001018" : "snow_tree_geo", - "16001030" : "spiky_tree1_geo", - "16001048" : "palm_tree_geo", - "16001060" : "_common1_geoSegmentEnd", - "007cd720" : "_common1_geoSegmentRomEnd", - "13000000" : "_behaviorSegmentStart", - "007cc6c0" : "_behaviorSegmentRomStart", - "13000000" : "bhvStarDoor", - "13000054" : "bhvMrI", - "1300008c" : "bhvMrIBody", - "130000ac" : "bhvMrIParticle", - "130000f8" : "bhvPurpleParticle", - "13000118" : "bhvGiantPole", - "13000144" : "bhvPoleGrabbing", - "13000174" : "bhvThiHugeIslandTop", - "13000194" : "bhvThiTinyIslandTop", - "130001ac" : "bhvCapSwitchBase", - "130001cc" : "bhvCapSwitch", - "130001f4" : "bhvKingBobomb", - "13000254" : "bhvBobombAnchorMario", - "13000278" : "bhvBetaChestBottom", - "1300029c" : "bhvBetaChestLid", - "130002b8" : "bhvBubbleMario", - "130002e4" : "bhvBubbleMaybe", - "13000338" : "bhvSmallWaterWave", - "13000398" : "bhvSmallWaterWave398", - "130003bc" : "bhvWaterAirBubble", - "13000400" : "bhvSmallParticle", - "13000428" : "bhvWaterWaves", - "13000444" : "bhvSmallParticleSnow", - "1300046c" : "bhvSmallParticleBubbles", - "13000494" : "bhvFishGroup", - "130004a8" : "bhvCannon", - "130004e4" : "bhvCannonBarrel", - "13000500" : "bhvCannonBaseUnused", - "13000528" : "bhvChuckya", - "13000584" : "bhvChuckyaAnchorMario", - "130005a8" : "bhvUnused05A8", - "130005b4" : "bhvRotatingPlatform", - "130005d8" : "bhvTower", - "13000600" : "bhvBulletBillCannon", - "13000624" : "bhvWfBreakableWallRight", - "13000638" : "bhvWfBreakableWallLeft", - "1300066c" : "bhvKickableBoard", - "130006a4" : "bhvTowerDoor", - "130006d8" : "bhvRotatingCounterClockwise", - "130006e0" : "bhvWfRotatingWoodenPlatform", - "13000708" : "bhvKoopaShellUnderwater", - "13000720" : "bhvExitPodiumWarp", - "1300075c" : "bhvFadingWarp", - "13000780" : "bhvWarp", - "130007a0" : "bhvWarpPipe", - "130007dc" : "bhvWhitePuffExplosion", - "130007f8" : "bhvSpawnedStar", - "1300080c" : "bhvSpawnedStarNoLevelExit", - "13000830" : "bhvMrIBlueCoin", - "13000888" : "bhvCoinInsideBoo", - "130008d0" : "bhvCoinFormationSpawn", - "130008ec" : "bhvCoinFormation", - "1300090c" : "bhvOneCoin", - "1300091c" : "bhvYellowCoin", - "13000940" : "bhvTemporaryYellowCoin", - "13000964" : "bhvThreeCoinsSpawn", - "13000984" : "bhvTenCoinsSpawn", - "130009a4" : "bhvSingleCoinGetsSpawned", - "130009e0" : "bhvCoinSparkles", - "13000a14" : "bhvGoldenCoinSparkles", - "13000a34" : "bhvWallTinyStarParticle", - "13000a54" : "bhvWallTinyStarParticleSpawn", - "13000a78" : "bhvPoundTinyStarParticle", - "13000a98" : "bhvPoundTinyStarParticleSpawn", - "13000abc" : "bhvPunchTinyTriangle", - "13000ad8" : "bhvPunchTinyTriangleSpawn", - "13000afc" : "bhvDoorWarp", - "13000b0c" : "bhvDoor", - "13000b58" : "bhvGrindel", - "13000b8c" : "bhvThwomp2", - "13000bc8" : "bhvThwomp", - "13000c04" : "bhvTumblingBridgePlatform", - "13000c28" : "bhvWfTumblingBridge", - "13000c44" : "bhvBbhTumblingBridge", - "13000c64" : "bhvLllTumblingBridge", - "13000c84" : "bhvFlame", - "13000cc8" : "bhvAnotherElavator", - "13000cfc" : "bhvRrElevatorPlatform", - "13000d30" : "bhvHmcElevatorPlatform", - "13000d6c" : "bhvWaterMist", - "13000d98" : "bhvWaterMistSpawn", - "13000db4" : "bhvBreakBoxTriangle", - "13000dd8" : "bhvWaterMist2", - "13000dfc" : "bhvUnused0DFC", - "13000e24" : "bhvPoundWhitePuffs", - "13000e3c" : "bhvGroundSand", - "13000e58" : "bhvGroundSnow", - "13000e70" : "bhvWind", - "13000e88" : "bhvEndToad", - "13000eac" : "bhvEndPeach", - "13000ed0" : "bhvUnusedParticleSpawn", - "13000f08" : "bhvUkiki", - "13000f14" : "bhvUkikiCageChild", - "13000f2c" : "bhvUkikiCageStar", - "13000f48" : "bhvUkikiCage", - "13000f9c" : "bhvBitfsSinkingPlatforms", - "13000fc8" : "bhvBitfsSinkingCagePlatform", - "13001000" : "bhvDddMovingPole", - "13001030" : "bhvBitfsTiltingInvertedPyramid", - "13001064" : "bhvSquishablePlatform", - "13001098" : "bhvCutOutObject", - "130010a8" : "bhvBetaMovingFlamesSpawn", - "130010b8" : "bhvBetaMovingFlames", - "130010d8" : "bhvRrRotatingBridgePlatform", - "13001108" : "bhvFlamethrower", - "13001124" : "bhvFlamethrowerFlame", - "13001168" : "bhvBouncingFireball", - "13001184" : "bhvBouncingFireballFlame", - "130011d0" : "bhvBowserShockWave", - "130011ec" : "bhvFlameMario", - "13001214" : "bhvBlackSmokeMario", - "13001254" : "bhvBlackSmokeBowser", - "1300127c" : "bhvBlackSmokeUpward", - "13001298" : "bhvBetaFishSplashSpawner", - "130012b4" : "bhvSpindrift", - "130012f4" : "bhvTowerPlatformGroup", - "13001318" : "bhvWfSlidingTowerPlatform", - "13001340" : "bhvWfElevatorTowerPlatform", - "13001368" : "bhvWfSolidTowerPlatform", - "13001390" : "bhvSnowLeafParticleSpawn", - "130013a8" : "bhvTreeSnow", - "130013c4" : "bhvTreeLeaf", - "130013dc" : "bhvAnotherTiltingPlatform", - "13001408" : "bhvSquarishPathMoving", - "1300142c" : "bhvPiranhaPlantBubble", - "13001448" : "bhvPiranhaPlantWakingBubbles", - "13001468" : "bhvFloorSwitchAnimatesObject", - "13001478" : "bhvFloorSwitchGrills", - "13001484" : "bhvFloorSwitchHardcodedModel", - "130014ac" : "bhvFloorSwitchHiddenObjects", - "130014bc" : "bhvHiddenObject", - "130014e0" : "bhvBreakableBox", - "13001518" : "bhvPushableMetalBox", - "13001548" : "bhvHeaveHo", - "130015a4" : "bhvHeaveHoThrowMario", - "130015c0" : "bhvCcmTouchedStarSpawn", - "130015e4" : "bhvUnusedPoundablePlatform", - "13001608" : "bhvBetaTrampolineTop", - "13001634" : "bhvBetaTrampolineSpring", - "13001650" : "bhvJumpingBox", - "1300167c" : "bhvBooCage", - "130016ac" : "bhvStub", - "130016b8" : "bhvIgloo", - "130016e4" : "bhvBowserKey", - "13001714" : "bhvGrandStar", - "13001744" : "bhvBetaBooKey", - "13001778" : "bhvAlphaBooKey", - "1300179c" : "bhvBulletBill", - "130017f4" : "bhvWhitePuffSmoke", - "13001820" : "bhvUnused1820", - "13001828" : "bhvBowserTailAnchor", - "13001850" : "bhvBowser", - "130018cc" : "bhvBowserBodyAnchor", - "13001904" : "bhvBowserFlameSpawn", - "13001920" : "bhvTiltingBowserLavaPlatform", - "13001958" : "bhvFallingBowserPlatform", - "13001984" : "bhvBlueBowserFlame", - "130019c8" : "bhvFlameFloatingLanding", - "13001a0c" : "bhvBlueFlamesGroup", - "13001a30" : "bhvFlameBouncing", - "13001a74" : "bhvFlameMovingForwardGrowing", - "13001aa4" : "bhvFlameBowser", - "13001ae8" : "bhvFlameLargeBurningOut", - "13001b2c" : "bhvBlueFish", - "13001b54" : "bhvTankFishGroup", - "13001b70" : "bhvCheckerboardElevatorGroup", - "13001b88" : "bhvCheckerboardPlatformSub", - "13001bb4" : "bhvBowserKeyUnlockDoor", - "13001bd4" : "bhvBowserKeyCourseExit", - "13001bf4" : "bhvInvisibleObjectsUnderBridge", - "13001c04" : "bhvWaterLevelPillar", - "13001c34" : "bhvDddWarp", - "13001c58" : "bhvMoatGrills", - "13001c7c" : "bhvClockMinuteHand", - "13001c8c" : "bhvClockHourHand", - "13001cb0" : "bhvMacroUkiki", - "13001d0c" : "bhvStub1D0C", - "13001d14" : "bhvLllRotatingHexagonalPlatform", - "13001d40" : "bhvLllSinkingRockBlock", - "13001d70" : "bhvStub1D70", - "13001d78" : "bhvLllMovingOctagonalMeshPlatform", - "13001da4" : "bhvSnowBall", - "13001da8" : "bhvLllRotatingBlockWithFireBars", - "13001dcc" : "bhvLllRotatingHexFlame", - "13001e04" : "bhvLllWoodPiece", - "13001e30" : "bhvLllFloatingWoodBridge", - "13001e4c" : "bhvVolcanoFlames", - "13001e6c" : "bhvLllRotatingHexagonalRing", - "13001e94" : "bhvLllSinkingRectangularPlatform", - "13001ec4" : "bhvLllSinkingSquarePlatforms", - "13001ef8" : "bhvLllTiltingInvertedPyramid", - "13001f30" : "bhvUnused1F30", - "13001f3c" : "bhvKoopaShell", - "13001f68" : "bhvKoopaShellFlame", - "13001f90" : "bhvToxBox", - "13001fbc" : "bhvPiranhaPlant", - "13002018" : "bhvLllHexagonalMesh", - "13002038" : "bhvLllBowserPuzzlePiece", - "13002068" : "bhvLllBowserPuzzle", - "13002088" : "bhvTuxiesMother", - "130020d8" : "bhvPenguinBaby", - "130020e0" : "bhvUnused20E0", - "130020e8" : "bhvSmallPenguin", - "1300213c" : "bhvFish2", - "1300214c" : "bhvFish3", - "1300215c" : "bhvLargeFishGroup", - "13002178" : "bhvFish", - "13002194" : "bhvWdwExpressElevator", - "130021c0" : "bhvWdwExpressElevatorPlatform", - "130021e4" : "bhvChirpChirp", - "130021f4" : "bhvChirpChirpUnused", - "1300220c" : "bhvBub", - "13002250" : "bhvExclamationBox", - "1300227c" : "bhvRotatingExclamationMark", - "1300229c" : "bhvSoundSpawner", - "130022b8" : "bhvRockSolid", - "130022d8" : "bhvBowserSubDoor", - "13002308" : "bhvBowsersSub", - "13002338" : "bhvSushiShark", - "13002388" : "bhvSushiSharkCollisionChild", - "130023a4" : "bhvJrbSlidingBox", - "130023d0" : "bhvShipPart3", - "130023ec" : "bhvInSunkenShip3", - "1300241c" : "bhvSunkenShipPart", - "1300243c" : "bhvSunkenShipSetRotation", - "1300244c" : "bhvSunkenShipPart2", - "1300246c" : "bhvInSunkenShip", - "13002480" : "bhvInSunkenShip2", - "130024ac" : "bhvMarioDustGenerator", - "130024dc" : "bhvWhitePuff1", - "13002500" : "bhvWhitePuff2", - "13002528" : "bhvWhitePuffSmoke2", - "13002558" : "bhvPurpleSwitchHiddenBoxes", - "13002568" : "bhvBlueCoinSwitch", - "13002588" : "bhvHiddenBlueCoin", - "130025c0" : "bhvOpenableCageDoor", - "130025e0" : "bhvOpenableGrill", - "130025f8" : "bhvWaterLevelDiamond", - "13002620" : "bhvInitializeChangingWaterLevel", - "13002634" : "bhvTweesterSandParticle", - "13002650" : "bhvTweester", - "13002684" : "bhvMerryGoRoundBooManager", - "1300269c" : "bhvAnimatedTexture", - "130026d4" : "bhvBooInCastle", - "13002710" : "bhvBooWithCage", - "13002768" : "bhvBalconyBigBoo", - "1300277c" : "bhvMerryGoRoundBigBoo", - "13002790" : "bhvGhostHuntBigBoo", - "130027d0" : "bhvCourtyardBooTriplet", - "130027e4" : "bhvBoo", - "130027f4" : "bhvMerryGoRoundBoo", - "13002804" : "bhvGhostHuntBoo", - "1300286c" : "bhvHiddenStaircaseStep", - "13002898" : "bhvBooBossSpawnedBridge", - "130028cc" : "bhvBbhTiltingTrapPlatform", - "130028fc" : "bhvHauntedBookshelf", - "1300292c" : "bhvMeshElevator", - "13002968" : "bhvMerryGoRound", - "13002998" : "bhvPlaysMusicTrackWhenTouched", - "130029b0" : "bhvInsideCannon", - "130029b4" : "bhvBetaBowserAnchor", - "130029e4" : "bhvStaticCheckeredPlatform", - "13002a10" : "bhvUnused2A10", - "13002a20" : "bhvUnusedFakeStar", - "13002a48" : "bhvStaticObject", - "13002a54" : "bhvUnused2A54", - "13002a5c" : "bhvCastleFloorTrap", - "13002a7c" : "bhvFloorTrapInCastle", - "13002aa4" : "bhvTree", - "13002ad0" : "bhvSparkle", - "13002af0" : "bhvSparkleSpawn", - "13002b08" : "bhvSpecialTripleJumpSparkles", - "13002b5c" : "bhvScuttlebug", - "13002ba0" : "bhvScuttlebugSpawn", - "13002bb8" : "bhvWhompKingBoss", - "13002bcc" : "bhvSmallWhomp", - "13002c14" : "bhvWaterSplash", - "13002c60" : "bhvWaterDroplet", - "13002c7c" : "bhvWaterDropletSplash", - "13002cb0" : "bhvBubbleSplash", - "13002ce0" : "bhvIdleWaterWave", - "13002d28" : "bhvObjectWaterSplash", - "13002d50" : "bhvShallowWaterWave", - "13002d7c" : "bhvShallowWaterSplash", - "13002db0" : "bhvObjectWaveTrail", - "13002dc0" : "bhvWaveTrail", - "13002e04" : "bhvTinyStrongWindParticle", - "13002e20" : "bhvStrongWindParticle", - "13002e3c" : "bhvSLSnowmanWind", - "13002e58" : "bhvSLWalkingPenguin", - "13002ea8" : "bhvYellowBall", - "13002ec0" : "bhvMario", - "13002ef8" : "bhvToadMessage", - "13002f40" : "bhvUnlockDoorStar", - "13002f60" : "bhvWarps60", - "13002f64" : "bhvWarps64", - "13002f68" : "bhvWarps68", - "13002f6c" : "bhvWarps6C", - "13002f70" : "bhvWarps70", - "13002f74" : "bhvWarps74", - "13002f78" : "bhvWarps78", - "13002f7c" : "bhvWarps7C", - "13002f80" : "bhvWarps80", - "13002f84" : "bhvWarps84", - "13002f88" : "bhvWarps88", - "13002f8c" : "bhvWarps8C", - "13002f90" : "bhvWarps90", - "13002f94" : "bhvWarps94", - "13002fa0" : "bhvRandomAnimatedTexture", - "13002fc0" : "bhvYellowBackgroundInMenu", - "13002fe4" : "bhvMenuButton", - "13003008" : "bhvMenuButtonManager", - "1300302c" : "bhvActSelectorStarType", - "13003048" : "bhvActSelector", - "13003068" : "bhvMovingYellowCoin", - "130030a4" : "bhvMovingBlueCoin", - "130030d4" : "bhvBlueCoinSliding", - "13003104" : "bhvBlueCoinJumping", - "13003134" : "bhvSeaweed", - "13003158" : "bhvSeaweedBundle", - "13003174" : "bhvBobomb", - "130031ac" : "bhvBobombFuseSmoke", - "130031dc" : "bhvBobombBuddy", - "13003228" : "bhvBobombBuddyOpensCannon", - "13003274" : "bhvCannonClosed", - "130032a8" : "bhvWhirlpool", - "130032c8" : "bhvJetStream", - "130032e0" : "bhvMessagePanel", - "13003324" : "bhvSignOnWall", - "13003354" : "bhvHomingAmp", - "13003388" : "bhvCirclingAmp", - "130033bc" : "bhvButterfly", - "130033ec" : "bhvHoot", - "13003420" : "bhvBetaHoldableObject", - "13003454" : "bhvCarrySomething1", - "1300345c" : "bhvCarrySomething2", - "13003464" : "bhvCarrySomething3", - "1300346c" : "bhvCarrySomething4", - "13003474" : "bhvCarrySomething5", - "1300347c" : "bhvCarrySomething6", - "13003484" : "bhvObjectBubble", - "130034c4" : "bhvObjectWaterWave", - "13003510" : "bhvExplosion", - "13003558" : "bhvBobombBullyDeathSmoke", - "13003588" : "bhvSmoke", - "130035b0" : "bhvBobombExplosionBubble", - "13003600" : "bhvBobombExplosionBubble3600", - "13003614" : "bhvRespawner", - "1300362c" : "bhvSmallBully", - "13003660" : "bhvBigBully", - "13003694" : "bhvBigBullyWithMinions", - "130036c8" : "bhvSmallChillBully", - "13003700" : "bhvBigChillBully", - "13003738" : "bhvJetStreamRingSpawner", - "13003750" : "bhvJetStreamWaterRing", - "13003798" : "bhvMantaRayWaterRing", - "130037e0" : "bhvMantaRayRingManager", - "130037ec" : "bhvBowserBomb", - "1300381c" : "bhvBowserBombExplosion", - "13003840" : "bhvBowserBombSmoke", - "13003868" : "bhvCelebrationStar", - "13003888" : "bhvCelebrationStarSparkle", - "130038b0" : "bhvStarKeyCollectionPuffSpawner", - "130038d0" : "bhvLllDrawbridgeSpawner", - "130038e8" : "bhvLllDrawbridge", - "13003910" : "bhvSmallBomp", - "13003940" : "bhvLargeBomp", - "13003970" : "bhvWfSlidingPlatform", - "130039a0" : "bhvMoneybag", - "130039d4" : "bhvMoneybagHidden", - "13003a08" : "bhvPitBowlingBall", - "13003a30" : "bhvFreeBowlingBall", - "13003a58" : "bhvBowlingBall", - "13003a80" : "bhvTtmBowlingBallSpawner", - "13003aa4" : "bhvBobBowlingBallSpawner", - "13003ac8" : "bhvThiBowlingBallSpawner", - "13003ae0" : "bhvRrCruiserWing", - "13003b00" : "bhvSpindel", - "13003b30" : "bhvSslMovingPyramidWall", - "13003b60" : "bhvPyramidElevator", - "13003b98" : "bhvPyramidElevatorTrajectoryMarkerBall", - "13003bb4" : "bhvPyramidTop", - "13003bec" : "bhvPyramidTopFragment", - "13003c0c" : "bhvPyramidPillarTouchDetector", - "13003c30" : "bhvWaterfallSoundLoop", - "13003c44" : "bhvVolcanoSoundLoop", - "13003c58" : "bhvCastleFlagWaving", - "13003c7c" : "bhvBirdsSoundLoop", - "13003c90" : "bhvAmbientSounds", - "13003ca4" : "bhvSandSoundLoop", - "13003cb8" : "bhvHiddenAt120Stars", - "13003ce4" : "bhvSnowmansBottom", - "13003d0c" : "bhvSnowmansHead", - "13003d34" : "bhvSnowmansBodyCheckpoint", - "13003d4c" : "bhvBigSnowmanWhole", - "13003d74" : "bhvBigBoulder", - "13003da0" : "bhvBigBoulderGenerator", - "13003db8" : "bhvWingCap", - "13003dd8" : "bhvMetalCap", - "13003df8" : "bhvNormalCap", - "13003e1c" : "bhvVanishCap", - "13003e3c" : "bhvStar", - "13003e64" : "bhvStarSpawnCoordinates", - "13003e8c" : "bhvHiddenRedCoinStar", - "13003eac" : "bhvRedCoin", - "13003ee4" : "bhvBowserCourseRedCoinStar", - "13003efc" : "bhvHiddenStar", - "13003f1c" : "bhvHiddenStarTrigger", - "13003f40" : "bhvTtmRollingLog", - "13003f78" : "bhvLllVolcanoFallingTrap", - "13003fa4" : "bhvLllRollingLog", - "13003fdc" : "bhv1upWalking", - "13004010" : "bhv1upRunningAway", - "13004044" : "bhv1upSliding", - "1300407c" : "bhv1Up", - "130040b4" : "bhv1upJumpOnApproach", - "130040ec" : "bhvHidden1up", - "13004124" : "bhvHidden1upTrigger", - "13004148" : "bhvHidden1upInPole", - "13004180" : "bhvHidden1upInPoleTrigger", - "130041a4" : "bhvHidden1upInPoleSpawner", - "130041bc" : "bhvControllablePlatform", - "130041f0" : "bhvControllablePlatformSub", - "13004218" : "bhvBreakableBoxSmall", - "13004244" : "bhvSlidingSnowMound", - "13004270" : "bhvSnowMoundSpawn", - "13004284" : "bhvWdwSquareFloatingPlatform", - "130042b4" : "bhvWdwRectangularFloatingPlatform", - "130042e4" : "bhvJrbFloatingPlatform", - "13004314" : "bhvArrowLift", - "13004348" : "bhvOrangeNumber", - "13004370" : "bhvMantaRay", - "130043a0" : "bhvFallingPillar", - "130043c4" : "bhvFallingPillarHitbox", - "130043e0" : "bhvPillarBase", - "13004400" : "bhvJrbFloatingBox", - "1300442c" : "bhvDecorativePendulum", - "1300444c" : "bhvTreasureChestsShip", - "13004470" : "bhvTreasureChestsJrb", - "13004494" : "bhvTreasureChests", - "130044b8" : "bhvTreasureChestBottom", - "130044e0" : "bhvTreasureChestTop", - "130044fc" : "bhvMips", - "13004538" : "bhvYoshi", - "13004580" : "bhvKoopa", - "130045d0" : "bhvKoopaRaceEndpoint", - "130045f8" : "bhvKoopaFlag", - "13004634" : "bhvPokey", - "13004668" : "bhvPokeyBodyPart", - "13004698" : "bhvSwoop", - "130046dc" : "bhvFlyGuy", - "1300472c" : "bhvGoomba", - "13004770" : "bhvGoombaTripletSpawner", - "1300478c" : "bhvChainChomp", - "130047e4" : "bhvChainChompChainPart", - "1300481c" : "bhvWoodenPost", - "13004868" : "bhvChainChompGate", - "13004898" : "bhvWigglerHead", - "130048e0" : "bhvWigglerBody", - "13004918" : "bhvEnemyLakitu", - "13004954" : "bhvCameraLakitu", - "13004988" : "bhvCloud", - "130049ac" : "bhvCloudPart", - "130049c8" : "bhvSpiny", - "13004a00" : "bhvMontyMole", - "13004a58" : "bhvMontyMoleHole", - "13004a78" : "bhvMontyMoleRock", - "13004ab0" : "bhvPlatformOnTrack", - "13004af4" : "bhvTrackBall", - "13004b1c" : "bhvSeesawPlatform", - "13004b44" : "bhvFerrisWheelAxle", - "13004b6c" : "bhvFerrisWheelPlatform", - "13004b8c" : "bhvWaterBombSpawner", - "13004ba8" : "bhvWaterBomb", - "13004bd4" : "bhvWaterBombShadow", - "13004bf0" : "bhvTTCRotatingSolid", - "13004c24" : "bhvTTCPendulum", - "13004c5c" : "bhvTTCTreadmill", - "13004c94" : "bhvTTCMovingBar", - "13004ccc" : "bhvTTCCog", - "13004cf8" : "bhvTTCPitBlock", - "13004d28" : "bhvTTCElevator", - "13004d64" : "bhvTTC2DRotator", - "13004d90" : "bhvTTCSpinner", - "13004dbc" : "bhvMrBlizzard", - "13004e08" : "bhvMrBlizzardSnowball", - "13004e4c" : "bhvSlidingPlatform2", - "13004e78" : "bhvOctagonalPlatformRotating", - "13004ea0" : "bhvAnimatesOnFloorSwitchPress", - "13004ecc" : "bhvActivatedBackAndForthPlatform", - "13004ef8" : "bhvRecoveryHeart", - "13004f10" : "bhvWaterBombCannon", - "13004f28" : "bhvCannonBarrelBubbles", - "13004f40" : "bhvUnagi", - "13004f78" : "bhvUnagiSubobject", - "13004f90" : "bhvDorrie", - "13004fd4" : "bhvHauntedChair", - "13005024" : "bhvMadPiano", - "1300506c" : "bhvFlyingBookend", - "130050b4" : "bhvBookendSpawn", - "130050d4" : "bhvHauntedBookshelfManager", - "130050f4" : "bhvBookSwitch", - "13005120" : "bhvFirePiranhaPlant", - "13005158" : "bhvSmallPiranhaFlame", - "1300518c" : "bhvFireSpitter", - "130051ac" : "bhvFlyguyFlame", - "130051e0" : "bhvSnufit", - "1300521c" : "bhvSnufitBalls", - "1300525c" : "bhvHorizontalGrindel", - "130052b4" : "bhvEyerokBoss", - "130052d0" : "bhvEyerokHand", - "13005310" : "bhvKlepto", - "13005354" : "bhvBird", - "13005380" : "bhvRacingPenguin", - "130053c4" : "bhvPenguinRaceFinishLine", - "130053dc" : "bhvPenguinRaceShortcutCheck", - "130053f4" : "bhvCoffinSpawner", - "13005414" : "bhvCoffin", - "13005440" : "bhvClamShell", - "13005468" : "bhvSkeeter", - "130054a0" : "bhvSkeeterWave", - "130054b8" : "bhvSwingPlatform", - "130054ec" : "bhvDonutPlatformSpawner", - "13005504" : "bhvDonutPlatform", - "13005528" : "bhvDDDPole", - "1300556c" : "bhvRedCoinStarMarker", - "13005598" : "bhvTripletButterfly", - "130055dc" : "bhvBubba", - "13005610" : "bhvBeginningLakitu", - "13005638" : "bhvBeginningPeach", - "1300565c" : "bhvEndBirds1", - "13005680" : "bhvEndBirds2", - "130056a4" : "bhvIntroScene", - "130056c0" : "_behaviorSegmentEnd", - "007d1d80" : "_behaviorSegmentRomEnd", - "8016f000" : "_goddardSegmentStart", - "007cc6c0" : "_goddardSegmentRomStart", - }, - - "Refresh 8" : { - "80000000" : "EXCEPTION_TLB_MISS", - "a4000000" : "SP_DMEM", - "a40004c0" : "SP_DMEM_UNK0", - "a4000774" : "SP_DMEM_UNK1", - "a4001000" : "SP_IMEM", - "a4040010" : "SP_STATUS_REG", - "a4080000" : "SP_PC", - "a4300000" : "MI_MODE_REG", - "a4300004" : "MI_VERSION_REG", - "a4300008" : "MI_INTR_REG", - "a430000c" : "MI_INTR_MASK_REG", - "a4400010" : "VI_CURRENT_REG", - "a450000c" : "AI_STATUS_REG", - "a4600000" : "PI_DRAM_ADDR_REG", - "a4600004" : "PI_CART_ADDR_REG", - "a460000c" : "PI_WR_LEN_REG", - "a4600010" : "PI_STATUS_REG", - "a4700000" : "RI_MODE_REG", - "a4700010" : "RI_REFRESH_REG", - "a4800018" : "SI_STATUS_REG", - "b0000008" : "D_B0000008", - "b0000010" : "D_B0000010", - "b0000014" : "D_B0000014", - "c0000000" : "D_C0000000", - "c0000008" : "D_C0000008", - "c000000c" : "D_C000000C", - "802f69cc" : "func_sh_802F69CC", - "80302ef0" : "osMotorStop", - "80303090" : "osMotorStart", - "803033ac" : "osMotorInit", - "803016a0" : "func_sh_803016A0", - "803016d0" : "func_sh_803016D0", - "80301820" : "func_sh_80301820", - "00000000" : "__romPos", - "04000000" : "_bootSegmentStart", - "007cc6c0" : "_bootSegmentRomStart", - "04000040" : "ipl3_entry", - "04000b70" : "ipl3_font", - "04001000" : "_bootSegmentEnd", - "007cd6c0" : "_bootSegmentRomEnd", - "80000400" : ".", - "80000400" : "_zbufferSegmentNoloadStart", - "80000400" : "0x25800", - "80000400" : "gZBuffer", - "80246000" : "_mainSegmentStart", - "007cc6c0" : "_mainSegmentRomStart", - "80246000" : "entry_point", - "80246050" : "handle_debug_key_sequences", - "80246170" : "unknown_main_func", - "802461cc" : "stub_main_1", - "802461dc" : "stub_main_2", - "802461ec" : "stub_main_3", - "802461fc" : "setup_mesg_queues", - "802462e0" : "alloc_pool", - "80246338" : "create_thread", - "8024639c" : "handle_nmi_request", - "802463ec" : "receive_new_tasks", - "8024651c" : "start_sptask", - "8024659c" : "interrupt_gfx_sptask", - "802465ec" : "start_gfx_sptask", - "80246648" : "pretend_audio_sptask_done", - "8024669c" : "handle_vblank", - "802467fc" : "handle_sp_complete", - "8024694c" : "handle_dp_complete", - "802469b8" : "thread3_main", - "80246b14" : "set_vblank_handler", - "80246b74" : "send_sp_task_message", - "80246bb4" : "dispatch_audio_sptask", - "80246c10" : "send_display_list", - "80246c9c" : "turn_on_audio", - "80246cb8" : "turn_off_audio", - "80246cf0" : "thread1_idle", - "80246df8" : "main_func", - "80246e70" : "my_rdp_init", - "802471a4" : "my_rsp_init", - "80247284" : "clear_z_buffer", - "802473c8" : "display_frame_buffer", - "802474b8" : "clear_frame_buffer", - "80247620" : "clear_viewport", - "8024784c" : "draw_screen_borders", - "802479bc" : "make_viewport_clip_rect", - "80247b3c" : "create_task_structure", - "80247ccc" : "init_render_image", - "80247d14" : "end_master_display_list", - "80247db4" : "draw_reset_bars", - "80247f08" : "rendering_init", - "80247fdc" : "config_gfx_pool", - "80248090" : "display_and_vsync", - "80248304" : "adjust_analog_stick", - "80248498" : "run_demo_inputs", - "80248638" : "read_controller_inputs", - "80248824" : "init_controllers", - "80248964" : "setup_game_memory", - "80248af0" : "thread5_game_loop", - "80248c40" : "reset_volume", - "80248c58" : "lower_background_noise", - "80248ce8" : "raise_background_noise", - "80248d78" : "disable_background_sound", - "80248dc0" : "enable_background_sound", - "80248e08" : "set_sound_mode", - "80248e54" : "play_menu_sounds", - "80248fec" : "play_painting_eject_sound", - "80249070" : "play_infinite_stairs_music", - "80249178" : "set_background_music", - "8024922c" : "fadeout_music", - "8024927c" : "fadeout_level_music", - "802492d0" : "play_cutscene_music", - "80249310" : "play_shell_music", - "8024934c" : "stop_shell_music", - "80249398" : "play_cap_music", - "80249404" : "fadeout_cap_music", - "80249448" : "stop_cap_music", - "80249494" : "play_menu_sounds_extra", - "802494d8" : "audio_game_loop_tick", - "80249500" : "thread4_sound", - "802495e0" : "level_control_timer", - "802496b8" : "pressed_pause", - "80249764" : "set_play_mode", - "8024978c" : "warp_special", - "802497b8" : "fade_into_special_warp", - "8024982c" : "stub_level_update_1", - "8024983c" : "load_level_init_text", - "8024995c" : "init_door_warp", - "80249a10" : "set_mario_initial_cap_powerup", - "80249ab4" : "set_mario_initial_action", - "80249cd8" : "init_mario_after_warp", - "8024a124" : "warp_area", - "8024a18c" : "warp_level", - "8024a1d8" : "warp_credits", - "8024a374" : "check_instant_warp", - "8024a584" : "music_changed_through_warp", - "8024a700" : "initiate_warp", - "8024a7b4" : "get_painting_warp_node", - "8024a85c" : "initiate_painting_warp", - "8024a9cc" : "level_trigger_warp", - "8024aedc" : "initiate_delayed_warp", - "8024b13c" : "update_hud_values", - "8024b390" : "basic_update", - "8024b3e4" : "play_mode_normal", - "8024b5d4" : "play_mode_paused", - "8024b6cc" : "play_mode_frame_advance", - "8024b798" : "level_set_transition", - "8024b7c0" : "play_mode_change_area", - "8024b880" : "play_mode_change_level", - "8024b9b8" : "update_level", - "8024ba8c" : "init_level", - "8024bcd8" : "lvl_init_or_update", - "8024bd5c" : "lvl_init_from_save_file", - "8024be14" : "lvl_set_current_level", - "8024bfa0" : "lvl_play_the_end_screen_sound", - "8024bff0" : "get_mario_cap_flag", - "8024c0b8" : "object_facing_mario", - "8024c16c" : "mario_obj_angle_to_object", - "8024c1d8" : "determine_interaction", - "8024c51c" : "attack_object", - "8024c618" : "mario_stop_riding_object", - "8024c66c" : "mario_grab_used_object", - "8024c6c0" : "mario_drop_held_object", - "8024c780" : "mario_throw_held_object", - "8024c894" : "mario_stop_riding_and_holding", - "8024c8fc" : "does_mario_have_hat", - "8024c928" : "mario_blow_off_cap", - "8024ca68" : "mario_lose_cap_to_enemy", - "8024caf8" : "mario_retrieve_cap", - "8024cb58" : "able_to_grab_object", - "8024cbfc" : "mario_get_collided_object", - "8024cc7c" : "mario_check_object_grab", - "8024ce08" : "bully_knock_back_mario", - "8024d0b4" : "bounce_off_object", - "8024d130" : "hit_object_from_below", - "8024d2bc" : "determine_knockback_action", - "8024d578" : "push_mario_out_of_object", - "8024d72c" : "bounce_back_from_attack", - "8024d804" : "should_push_or_pull_door", - "8024d8b0" : "take_damage_from_interact_object", - "8024d998" : "take_damage_and_knock_back", - "8024daac" : "reset_mario_pitch", - "8024db2c" : "interact_coin", - "8024dbf0" : "interact_water_ring", - "8024dc28" : "interact_star_or_key", - "8024de4c" : "interact_bbh_entrance", - "8024df10" : "interact_warp", - "8024e0c4" : "interact_warp_door", - "8024e2fc" : "get_door_save_file_flag", - "8024e420" : "interact_door", - "8024e6ec" : "interact_cannon_base", - "8024e778" : "interact_igloo_barrier", - "8024e7d4" : "interact_tornado", - "8024e8f0" : "interact_whirlpool", - "8024e9d0" : "interact_strong_wind", - "8024ead8" : "interact_flame", - "8024ec54" : "interact_snufit_bullet", - "8024ed84" : "interact_clam_or_bubba", - "8024ee44" : "interact_bully", - "8024eff8" : "interact_shock", - "8024f170" : "interact_mr_blizzard", - "8024f1e0" : "interact_hit_from_below", - "8024f354" : "interact_bounce_top", - "8024f4ac" : "interact_unknown_08", - "8024f55c" : "interact_damage", - "8024f5cc" : "interact_breakable", - "8024f6a4" : "interact_koopa_shell", - "8024f7a8" : "check_object_grab_mario", - "8024f8bc" : "interact_pole", - "8024fa60" : "interact_hoot", - "8024fb30" : "interact_cap", - "8024fd2c" : "interact_grabbable", - "8024fe6c" : "mario_can_talk", - "8024ff04" : "check_read_sign", - "80250098" : "check_npc_talk", - "80250198" : "interact_text", - "80250230" : "check_kick_or_punch_wall", - "802503f0" : "mario_process_interactions", - "802505c8" : "check_death_barrier", - "8025065c" : "check_lava_boost", - "80250724" : "pss_begin_slide", - "80250778" : "pss_end_slide", - "802507fc" : "mario_handle_special_floors", - "80250940" : "is_anim_at_end", - "8025097c" : "is_anim_past_end", - "802509b8" : "set_mario_animation", - "80250b04" : "set_mario_anim_with_accel", - "80250c7c" : "set_anim_to_frame", - "80250d38" : "is_anim_past_frame", - "80250e54" : "find_mario_anim_flags_and_translation", - "80251020" : "update_mario_pos_for_anim", - "802510dc" : "return_mario_anim_y_translation", - "80251120" : "play_sound_if_no_flag", - "8025118c" : "play_mario_jump_sound", - "80251274" : "adjust_sound_for_speed", - "80251310" : "play_sound_and_spawn_particles", - "80251444" : "play_mario_action_sound", - "802514ac" : "play_mario_landing_sound", - "80251510" : "play_mario_landing_sound_once", - "80251574" : "play_mario_heavy_landing_sound", - "802515d8" : "play_mario_heavy_landing_sound_once", - "8025163c" : "play_mario_sound", - "80251708" : "mario_set_forward_vel", - "8025177c" : "mario_get_floor_class", - "802518a8" : "mario_get_terrain_sound_addend", - "80251a48" : "resolve_and_return_wall_collisions", - "80251afc" : "vec3f_find_ceil", - "80251b54" : "mario_facing_downhill", - "80251bd4" : "mario_floor_is_slippery", - "80251cfc" : "mario_floor_is_slope", - "80251e24" : "mario_floor_is_steep", - "80251f24" : "find_floor_height_relative_polar", - "80252000" : "find_floor_slope", - "802521a0" : "update_mario_sound_and_camera", - "8025229c" : "set_steep_jump_action", - "80252cf4" : "set_mario_action", - "80252e5c" : "set_jump_from_landing", - "802530a0" : "set_jumping_action", - "80253178" : "drop_and_set_mario_action", - "802531c4" : "hurt_and_set_mario_action", - "80253218" : "check_common_action_exits", - "80253300" : "check_common_hold_action_exits", - "802533e4" : "transition_submerged_to_walking", - "80253488" : "set_water_plunge_action", - "80253588" : "squish_mario_model", - "80253720" : "debug_print_speed_action_normal", - "80253838" : "update_mario_button_inputs", - "8025395c" : "update_mario_joystick_inputs", - "80253a60" : "update_mario_geometry_inputs", - "80253d58" : "update_mario_inputs", - "80253ec0" : "set_submerged_cam_preset_and_spawn_bubbles", - "80254060" : "update_mario_health", - "802542b4" : "update_mario_info_for_cam", - "80254338" : "mario_reset_bodystate", - "80254390" : "sink_mario_in_quicksand", - "802543e8" : "update_and_return_cap_flags", - "80254588" : "mario_update_hitbox_and_cap_model", - "80254830" : "execute_mario_action", - "80254b20" : "init_mario", - "80254f44" : "init_mario_from_save_file", - "80255080" : "get_additive_y_vel_for_jumps", - "8025509c" : "stub_mario_step_1", - "802550b0" : "stub_mario_step_2", - "802550c0" : "transfer_bully_speed", - "80255238" : "init_bully_collision_data", - "802552fc" : "mario_bonk_reflection", - "80255414" : "mario_update_quicksand", - "80255654" : "mario_push_off_steep_floor", - "8025570c" : "mario_update_moving_sand", - "8025580c" : "mario_update_windy_ground", - "802559b0" : "stop_and_set_height_to_floor", - "80255a34" : "stationary_ground_step", - "80255d88" : "perform_ground_step", - "80255ec4" : "check_ledge_grab", - "802560ac" : "perform_air_quarter_step", - "802564e0" : "apply_twirl_gravity", - "80256584" : "should_strengthen_gravity_for_jump_ascent", - "8025661c" : "apply_gravity", - "802569f8" : "apply_vertical_wind", - "80256b24" : "perform_air_step", - "80256cd8" : "set_vel_from_pitch_and_yaw", - "80256d8c" : "set_vel_from_yaw", - "80256e00" : "get_credits_str_width", - "80256e88" : "print_displaying_credits_entry", - "80257060" : "bhv_end_peach_loop", - "802570dc" : "bhv_end_toad_loop", - "80257198" : "geo_switch_peach_eyes", - "802572b0" : "get_star_collection_dialog", - "8025733c" : "handle_save_menu", - "80257450" : "spawn_obj_at_mario_rel_yaw", - "802574e8" : "cutscene_take_cap_off", - "80257548" : "cutscene_put_cap_on", - "802575a8" : "mario_ready_to_speak", - "80257640" : "set_mario_npc_dialog", - "80257748" : "act_reading_npc_dialog", - "80257980" : "act_waiting_for_dialog", - "80257a0c" : "act_disappeared", - "80257ab0" : "act_reading_automatic_dialog", - "80257ce4" : "act_reading_sign", - "80257eac" : "act_debug_free_move", - "80258184" : "general_star_dance_handler", - "80258420" : "act_star_dance", - "802584dc" : "act_star_dance_water", - "802585c0" : "act_fall_after_star_grab", - "802586cc" : "common_death_handler", - "80258744" : "act_standing_death", - "802587ec" : "act_electrocution", - "8025883c" : "act_suffocation", - "8025888c" : "act_death_on_back", - "802588f8" : "act_death_on_stomach", - "80258964" : "act_quicksand_death", - "80258a7c" : "act_eaten_by_bubba", - "80258b24" : "launch_mario_until_land", - "80258ba8" : "act_unlocking_key_door", - "80258dac" : "act_unlocking_star_door", - "80258f94" : "act_entering_star_door", - "80259264" : "act_going_through_door", - "802593cc" : "act_warp_door_spawn", - "802594d4" : "act_emerge_from_pipe", - "80259608" : "act_spawn_spin_airborne", - "80259740" : "act_spawn_spin_landing", - "802597ac" : "act_exit_airborne", - "80259854" : "act_falling_exit_airborne", - "802598d0" : "act_exit_land_save_dialog", - "80259c30" : "act_death_exit", - "80259ce8" : "act_unused_death_exit", - "80259d74" : "act_falling_death_exit", - "80259e00" : "act_special_exit_airborne", - "80259ef8" : "act_special_death_exit", - "80259fcc" : "act_spawn_no_spin_airborne", - "8025a040" : "act_spawn_no_spin_landing", - "8025a0bc" : "act_bbh_enter_spin", - "8025a494" : "act_bbh_enter_jump", - "8025a610" : "act_teleport_fade_out", - "8025a6fc" : "act_teleport_fade_in", - "8025a858" : "act_shocked", - "8025a9ac" : "act_squished", - "8025ae0c" : "act_putting_on_cap", - "8025aea8" : "stuck_in_ground_handler", - "8025affc" : "act_head_stuck_in_ground", - "8025b050" : "act_butt_stuck_in_ground", - "8025b0a4" : "act_feet_stuck_in_ground", - "8025bc80" : "generate_yellow_sparkles", - "8025d798" : "mario_execute_cutscene_action", - "8025dd70" : "add_tree_leaf_particles", - "8025de1c" : "play_climbing_sounds", - "8025df04" : "set_pole_position", - "8025e21c" : "act_holding_pole", - "8025e5a8" : "act_climbing_pole", - "8025e7a4" : "act_grab_pole_slow", - "8025e830" : "act_grab_pole_fast", - "8025e930" : "act_top_of_pole_transition", - "8025ea30" : "act_top_of_pole", - "8025eb50" : "perform_hanging_step", - "8025ecfc" : "update_hang_moving", - "8025eed0" : "update_hang_stationary", - "8025ef58" : "act_start_hanging", - "8025f0b4" : "act_hanging", - "8025f1e4" : "act_hang_moving", - "8025f384" : "let_go_of_ledge", - "8025f4b4" : "climb_up_ledge", - "8025f560" : "update_ledge_climb_camera", - "8025f644" : "update_ledge_climb", - "8025f6c0" : "act_ledge_grab", - "8025f970" : "act_ledge_climb_slow", - "8025fa64" : "act_ledge_climb_down", - "8025fae8" : "act_ledge_climb_fast", - "8025fb90" : "act_grabbed", - "8025fc6c" : "act_in_cannon", - "80260154" : "act_tornado_twirling", - "80260568" : "check_common_automatic_cancels", - "802605d0" : "mario_execute_automatic_action", - "802608b0" : "check_common_idle_cancels", - "80260aac" : "check_common_hold_idle_cancels", - "80260cb4" : "act_idle", - "80260f94" : "play_anim_sound", - "80261000" : "act_start_sleeping", - "80261268" : "act_sleeping", - "802614fc" : "act_waking_up", - "8026168c" : "act_shivering", - "802618d8" : "act_coughing", - "802619d0" : "act_hold_idle", - "80261ad0" : "act_hold_heavy_idle", - "80261bf8" : "act_standing_against_wall", - "80261cec" : "act_in_quicksand", - "80261db4" : "act_crouching", - "80261f70" : "act_panting", - "80262080" : "act_hold_panting_unused", - "8026217c" : "stopping_step", - "802621dc" : "act_braking_stop", - "802622dc" : "act_butt_slide_stop", - "80262398" : "act_hold_butt_slide_stop", - "80262490" : "act_slide_kick_slide_stop", - "80262530" : "act_start_crouching", - "80262650" : "act_stop_crouching", - "80262770" : "act_start_crawling", - "80262890" : "act_stop_crawling", - "80262980" : "act_shockwave_bounce", - "80262bc4" : "landing_step", - "80262c34" : "check_common_landing_cancels", - "80262d68" : "act_jump_land_stop", - "80262dc4" : "act_double_jump_land_stop", - "80262e20" : "act_side_flip_land_stop", - "80262e94" : "act_freefall_land_stop", - "80262ef0" : "act_triple_jump_land_stop", - "80262f50" : "act_backflip_land_stop", - "80262fec" : "act_lava_boost_land", - "8026305c" : "act_long_jump_land_stop", - "802630f8" : "act_hold_jump_land_stop", - "802631f0" : "act_hold_freefall_land_stop", - "802632e8" : "act_air_throw_land", - "802633b4" : "act_twirl_land", - "8026350c" : "act_ground_pound_land", - "802635e8" : "act_first_person", - "80263784" : "check_common_stationary_cancels", - "80263898" : "mario_execute_stationary_action", - "80263e60" : "tilt_body_running", - "80263ee4" : "play_step_sound", - "80264024" : "align_with_floor", - "8026409c" : "begin_walking_action", - "802640fc" : "check_ledge_climb_down", - "802642b4" : "slide_bonk", - "80264340" : "set_triple_jump_action", - "8026440c" : "update_sliding_angle", - "80264740" : "update_sliding", - "80264b54" : "apply_slope_accel", - "80264d80" : "apply_landing_accel", - "80264e18" : "update_shell_speed", - "80265080" : "apply_slope_decel", - "802651b0" : "update_decelerating_speed", - "80265244" : "update_walking_speed", - "80265458" : "should_begin_sliding", - "80265514" : "analog_stick_held_back", - "80265558" : "check_ground_dive_or_punch", - "80265620" : "begin_braking_action", - "80265700" : "anim_and_audio_for_walk", - "80265b1c" : "anim_and_audio_for_hold_walk", - "80265d90" : "anim_and_audio_for_heavy_walk", - "80265df8" : "push_or_sidle_wall", - "80266038" : "tilt_body_walking", - "802661cc" : "tilt_body_ground_shell", - "80266354" : "act_walking", - "802665b4" : "act_move_punching", - "80266734" : "act_hold_walking", - "8026699c" : "act_hold_heavy_walking", - "80266af8" : "act_turning_around", - "80266d4c" : "act_finish_turning_around", - "80266e48" : "act_braking", - "80266fc8" : "act_decelerating", - "80267240" : "act_hold_decelerating", - "80267504" : "act_riding_shell_ground", - "80267728" : "act_crawling", - "8026795c" : "act_burning_ground", - "80267c24" : "tilt_body_butt_slide", - "80267ce4" : "common_slide_action", - "80267fa4" : "common_slide_action_with_jump", - "80268074" : "act_butt_slide", - "802680d4" : "act_hold_butt_slide", - "80268168" : "act_crouch_slide", - "80268338" : "act_slide_kick_slide", - "802684ac" : "stomach_slide_action", - "802685c0" : "act_stomach_slide", - "80268608" : "act_hold_stomach_slide", - "80268684" : "act_dive_slide", - "802687b8" : "common_ground_knockback_action", - "802689f8" : "act_hard_backward_ground_kb", - "80268adc" : "act_hard_forward_ground_kb", - "80268b64" : "act_backward_ground_kb", - "80268bb0" : "act_forward_ground_kb", - "80268bfc" : "act_soft_backward_ground_kb", - "80268c48" : "act_soft_forward_ground_kb", - "80268c94" : "act_ground_bonk", - "80268d04" : "act_death_exit_land", - "80268dcc" : "common_landing_action", - "80268f78" : "common_landing_cancels", - "80269108" : "act_jump_land", - "80269170" : "act_freefall_land", - "802691d8" : "act_side_flip_land", - "80269264" : "act_hold_jump_land", - "80269300" : "act_hold_freefall_land", - "8026939c" : "act_long_jump_land", - "8026947c" : "act_double_jump_land", - "802694e4" : "act_triple_jump_land", - "80269588" : "act_backflip_land", - "80269640" : "quicksand_jump_land_action", - "80269788" : "act_quicksand_jump_land", - "802697dc" : "act_hold_quicksand_jump_land", - "80269830" : "check_common_moving_cancels", - "80269954" : "mario_execute_moving_action", - "80269f40" : "play_flip_sounds", - "80269fc0" : "play_far_fall_sound", - "8026a090" : "play_knockback_sound", - "8026a12c" : "lava_boost_on_wall", - "8026a224" : "check_fall_damage", - "8026a400" : "check_kick_or_dive_in_air", - "8026a494" : "should_get_stuck_in_ground", - "8026a598" : "check_fall_damage_or_get_stuck", - "8026a62c" : "check_horizontal_wind", - "8026a818" : "update_air_with_turn", - "8026aa48" : "update_air_without_turn", - "8026acd8" : "update_lava_boost_or_twirling", - "8026ae5c" : "update_flying_yaw", - "8026b004" : "update_flying_pitch", - "8026b17c" : "update_flying", - "8026b444" : "common_air_action_step", - "8026b6a0" : "act_jump", - "8026b740" : "act_double_jump", - "8026b814" : "act_triple_jump", - "8026b90c" : "act_backflip", - "8026b9ac" : "act_freefall", - "8026bab8" : "act_hold_jump", - "8026bbb4" : "act_hold_freefall", - "8026bcc0" : "act_side_flip", - "8026bdcc" : "act_wall_kick_air", - "8026be78" : "act_long_jump", - "8026bf40" : "act_riding_shell_air", - "8026c034" : "act_twirling", - "8026c1e0" : "act_dive", - "8026c4b8" : "act_air_throw", - "8026c5d0" : "act_water_jump", - "8026c738" : "act_hold_water_jump", - "8026c880" : "act_steep_jump", - "8026c9fc" : "act_ground_pound", - "8026cd0c" : "act_burning_jump", - "8026ce50" : "act_burning_fall", - "8026cf28" : "act_crazy_box_bounce", - "8026d1b0" : "common_air_knockback_step", - "8026d33c" : "check_wall_kick", - "8026d3c8" : "act_backward_air_kb", - "8026d43c" : "act_forward_air_kb", - "8026d4b0" : "act_hard_backward_air_kb", - "8026d508" : "act_hard_forward_air_kb", - "8026d560" : "act_thrown_backward", - "8026d608" : "act_thrown_forward", - "8026d6fc" : "act_soft_bonk", - "8026d770" : "act_getting_blown", - "8026d988" : "act_air_hit_wall", - "8026db54" : "act_forward_rollout", - "8026dcf4" : "act_backward_rollout", - "8026de98" : "act_butt_slide_air", - "8026e088" : "act_hold_butt_slide_air", - "8026e2b4" : "act_lava_boost", - "8026e59c" : "act_slide_kick", - "8026e810" : "act_jump_kick", - "8026e968" : "act_shot_from_cannon", - "8026ec00" : "act_flying", - "8026f158" : "act_riding_hoot", - "8026f2ec" : "act_flying_triple_jump", - "8026f614" : "act_top_of_pole_jump", - "8026f660" : "act_vertical_wind", - "8026f840" : "act_special_triple_jump", - "8026fa18" : "check_common_airborne_cancels", - "8026fb04" : "mario_execute_airborne_action", - "8027499c" : "mario_execute_submerged_action", - "80274eb0" : "animated_stationary_ground_step", - "80274f10" : "mario_update_punch_sequence", - "80275328" : "act_punching", - "8027546c" : "act_picking_up", - "802755fc" : "act_dive_picking_up", - "802756c8" : "act_placing_down", - "80275794" : "act_throwing", - "802758c0" : "act_heavy_throw", - "802759b4" : "act_stomach_slide_stop", - "80275a80" : "act_picking_up_bowser", - "80275b34" : "act_holding_bowser", - "80275e78" : "act_releasing_bowser", - "80275f0c" : "check_common_object_cancels", - "80275fe0" : "mario_execute_object_action", - "802761d0" : "geo_envfx_main", - "802763d4" : "geo_skybox_main", - "802764b0" : "geo_draw_mario_head_goddard", - "8027684c" : "bhv_toad_message_loop", - "80276910" : "bhv_toad_message_init", - "80276bb8" : "bhv_unlock_door_star_init", - "80276ccc" : "bhv_unlock_door_star_loop", - "802770a4" : "geo_mirror_mario_set_alpha", - "80277150" : "geo_switch_mario_stand_run", - "802771bc" : "geo_switch_mario_eyes", - "80277294" : "geo_mario_tilt_torso", - "802773a4" : "geo_mario_head_rotation", - "802774f4" : "geo_switch_mario_hand", - "802775cc" : "geo_mario_hand_foot_scaler", - "802776d8" : "geo_switch_mario_cap_effect", - "80277740" : "geo_switch_mario_cap_on_off", - "80277824" : "geo_mario_rotate_wing_cap_wings", - "8027795c" : "geo_switch_mario_hand_grab_pos", - "80277b14" : "geo_render_mirror_mario", - "80277d6c" : "geo_mirror_mario_backface_culling", - "80277ee0" : "set_segment_base_addr", - "80277f20" : "get_segment_base_addr", - "80277f50" : "segmented_to_virtual", - "80277fa8" : "virtual_to_segmented", - "80277ff0" : "move_segment_table_to_dmem", - "80278074" : "main_pool_init", - "80278120" : "main_pool_alloc", - "80278238" : "main_pool_free", - "80278358" : "main_pool_realloc", - "802783c8" : "main_pool_available", - "802783e8" : "main_pool_push_state", - "80278498" : "main_pool_pop_state", - "8027868c" : "load_segment", - "802786f0" : "load_to_fixed_pool_addr", - "802787d8" : "load_segment_decompress", - "802788b4" : "load_segment_decompress_heap", - "80278974" : "load_engine_code_segment", - "80278a14" : "alloc_only_pool_init", - "80278ab8" : "alloc_only_pool_alloc", - "80278b28" : "alloc_only_pool_resize", - "80278b98" : "mem_pool_init", - "80278c58" : "mem_pool_alloc", - "80278d74" : "mem_pool_free", - "80278f2c" : "alloc_display_list", - "80279028" : "func_80278A78", - "80279084" : "load_patchable_table", - "80279840" : "save_file_do_save", - "802798fc" : "save_file_erase", - "80279960" : "save_file_copy", - "802799dc" : "save_file_load_all", - "80279bc8" : "save_file_reload", - "80279c44" : "save_file_collect_star_or_key", - "80279e44" : "save_file_exists", - "80279e80" : "save_file_get_max_coin_score", - "80279f80" : "save_file_get_course_star_count", - "8027a010" : "save_file_get_total_star_count", - "8027a0a8" : "save_file_set_flags", - "8027a0f4" : "save_file_clear_flags", - "8027a16c" : "save_file_get_flags", - "8027a1c8" : "save_file_get_star_flags", - "8027a23c" : "save_file_set_star_flags", - "8027a310" : "save_file_get_course_coin_score", - "8027a340" : "save_file_is_cannon_unlocked", - "8027a390" : "save_file_set_cannon_unlocked", - "8027a418" : "save_file_set_cap_pos", - "8027a4ac" : "save_file_get_cap_pos", - "8027a564" : "save_file_set_sound_mode", - "8027a5b4" : "save_file_get_sound_mode", - "8027a5d4" : "save_file_move_cap_to_default_location", - "8027a698" : "disable_warp_checkpoint", - "8027a6b0" : "check_if_should_set_warp_checkpoint", - "8027a718" : "check_warp_checkpoint", - "8027a7d0" : "override_viewport_and_clip", - "8027a83c" : "set_warp_transition_rgb", - "8027a8b0" : "print_intro_text", - "8027a93c" : "get_mario_spawn_type", - "8027a9c8" : "area_get_warp_node", - "8027aa28" : "area_get_warp_node_from_params", - "8027aa74" : "load_obj_warp_nodes", - "8027ab04" : "clear_areas", - "8027ad74" : "clear_area_graph_nodes", - "8027ae44" : "load_area", - "8027af48" : "unload_area", - "8027afbc" : "load_mario_area", - "8027b038" : "unload_mario_area", - "8027b0c0" : "change_area", - "8027b164" : "area_update_objects", - "8027b1a0" : "play_transition", - "8027b35c" : "play_transition_after_delay", - "8027b3b4" : "render_game", - "8027cf38" : "geo_set_animation_globals", - "8027da84" : "geo_process_held_object", - "8027de68" : "geo_try_process_children", - "8027dea8" : "geo_process_node_and_siblings", - "8027e130" : "geo_process_root", - "8027e3e0" : "profiler_log_thread5_time", - "8027e490" : "profiler_log_thread4_time", - "8027e520" : "profiler_log_gfx_time", - "8027e5cc" : "profiler_log_vblank_time", - "8027e65c" : "draw_profiler_bar", - "8027e958" : "draw_reference_profiler_bars", - "8027ebcc" : "draw_profiler_mode_1", - "8027eeac" : "draw_profiler_mode_0", - "8027f460" : "draw_profiler", - "8027f4e0" : "decompress", - "8027f590" : "set_camera_shake_from_hit", - "8027f8b8" : "set_environmental_camera_shake", - "8027f9f0" : "set_camera_shake_from_point", - "8027fb74" : "unused_set_camera_pitch_shake_env", - "8027fc18" : "calc_y_to_curr_floor", - "8027fe20" : "focus_on_mario", - "8027fff8" : "set_camera_height", - "80280368" : "look_down_slopes", - "802804f4" : "pan_ahead_of_player", - "802806a4" : "find_in_bounds_yaw_wdw_bob_thi", - "80280810" : "update_radial_camera", - "80280970" : "update_8_directions_camera", - "80280b00" : "radial_camera_move", - "80281188" : "lakitu_zoom", - "802813bc" : "radial_camera_input_default", - "802813ec" : "update_yaw_and_dist_from_c_up", - "8028146c" : "mode_radial_camera", - "80281588" : "mode_8_directions_camera", - "802816a0" : "update_outward_radial_camera", - "802817fc" : "mode_outward_radial_camera", - "80281904" : "update_parallel_tracking_camera", - "80282280" : "update_fixed_camera", - "802826a0" : "update_boss_fight_camera", - "80282c0c" : "unused_update_mode_5_camera", - "80282c3c" : "mode_boss_fight_camera", - "80282c7c" : "mode_parallel_tracking_camera", - "80282ce0" : "mode_fixed_camera", - "80282d78" : "update_behind_mario_camera", - "80283340" : "mode_behind_mario", - "80283578" : "update_slide_camera", - "802839e4" : "mode_behind_mario_camera", - "80283a18" : "nop_update_water_camera", - "80283a34" : "mode_water_surface_camera", - "80283a68" : "update_mario_camera", - "80283af8" : "update_default_camera", - "80284cb8" : "mode_default_camera", - "80284cfc" : "mode_lakitu_camera", - "80284d38" : "mode_mario_camera", - "80284d74" : "update_spiral_stairs_camera", - "802850ac" : "mode_spiral_stairs_camera", - "802850ec" : "update_slide_or_0f_camera", - "802851dc" : "mode_slide_camera", - "8028526c" : "store_lakitu_cam_info_for_c_up", - "802852f4" : "set_mode_c_up", - "80285370" : "exit_c_up", - "80285808" : "update_c_up", - "802858a4" : "move_mario_head_c_up", - "80285a2c" : "move_into_c_up", - "80285d20" : "mode_c_up_camera", - "80285ed8" : "update_in_cannon", - "80285f60" : "mode_cannon_camera", - "8028603c" : "transition_next_state", - "80286088" : "transition_to_camera_mode", - "80286188" : "set_camera_mode", - "80286420" : "update_lakitu", - "802868f8" : "update_camera", - "80286f68" : "reset_camera", - "8028724c" : "init_camera", - "802879ec" : "zoom_out_if_paused_and_outside", - "80287bc4" : "select_mario_cam_mode", - "80287be0" : "create_camera", - "80287cb8" : "update_graph_node_camera", - "80287d30" : "geo_camera_main", - "80287dc0" : "stub_camera_2", - "80287dd4" : "stub_camera_3", - "80287de8" : "vec3f_sub", - "80287e28" : "object_pos_to_vec3f", - "80287e50" : "vec3f_to_object_pos", - "80287e78" : "unused_object_angle_to_vec3s", - "80287ea0" : "evaluate_cubic_spline", - "802882e4" : "move_point_along_spline", - "80288624" : "cam_select_alt_mode", - "80288718" : "set_cam_angle", - "80288888" : "set_handheld_shake", - "802889b0" : "shake_camera_handheld", - "80288ce4" : "find_c_buttons_pressed", - "80288e68" : "update_camera_hud_status", - "80288f5c" : "collide_with_walls", - "80289198" : "vec3f_compare", - "80289214" : "clamp_pitch", - "802892d8" : "is_within_100_units_of_mario", - "8028935c" : "set_or_approach_f32_asymptotic", - "802893f4" : "approach_f32_asymptotic_bool", - "80289488" : "approach_f32_asymptotic", - "802894b4" : "approach_s16_asymptotic_bool", - "8028956c" : "approach_s16_asymptotic", - "80289610" : "approach_vec3f_asymptotic", - "80289684" : "set_or_approach_vec3f_asymptotic", - "802896f8" : "approach_vec3s_asymptotic", - "8028976c" : "camera_approach_s16_symmetric_bool", - "8028984c" : "camera_approach_s16_symmetric", - "8028993c" : "set_or_approach_s16_symmetric", - "802899cc" : "camera_approach_f32_symmetric_bool", - "80289b0c" : "camera_approach_f32_symmetric", - "80289c00" : "random_vec3s", - "80289d20" : "reduce_by_dist_from_camera", - "80289f88" : "clamp_positions_and_find_yaw", - "8028a080" : "calc_avoid_yaw", - "8028a0f4" : "is_surf_within_bounding_box", - "8028a4ec" : "is_behind_surface", - "8028a6bc" : "is_range_behind_surface", - "8028a7ec" : "is_mario_behind_surface", - "8028a834" : "scale_along_line", - "8028a8e8" : "is_pos_in_bounds", - "8028aa28" : "calculate_pitch", - "8028aad8" : "calculate_yaw", - "8028ab60" : "calculate_angles", - "8028ac28" : "calc_abs_dist", - "8028accc" : "calc_hor_dist", - "8028ad4c" : "rotate_in_xz", - "8028ae1c" : "rotate_in_yz", - "8028aef0" : "set_camera_pitch_shake", - "8028af4c" : "set_camera_yaw_shake", - "8028b00c" : "set_camera_roll_shake", - "8028b068" : "set_pitch_shake_from_point", - "8028b11c" : "set_yaw_shake_from_point", - "8028b1d0" : "increment_shake_offset", - "8028b218" : "shake_camera_pitch", - "8028b32c" : "shake_camera_yaw", - "8028b438" : "shake_camera_roll", - "8028b50c" : "offset_yaw_outward_radial", - "8028b724" : "cutscene_intro_peach_play_message_music", - "8028b754" : "cutscene_intro_peach_play_lakitu_flying_music", - "8028b784" : "play_camera_buzz_if_cdown", - "8028b7c4" : "play_camera_buzz_if_cbutton", - "8028b804" : "play_camera_buzz_if_c_sideways", - "8028b850" : "play_sound_cbutton_up", - "8028b884" : "play_sound_cbutton_down", - "8028b8b8" : "play_sound_cbutton_side", - "8028b8ec" : "play_sound_button_change_blocked", - "8028b920" : "play_sound_rbutton_changed", - "8028b954" : "play_sound_if_cam_switched_to_lakitu_or_mario", - "8028b9c4" : "radial_camera_input", - "8028bd34" : "trigger_cutscene_dialog", - "8028bd98" : "handle_c_button_movement", - "8028c038" : "clear_cutscene_vars", - "8028c13c" : "start_cutscene", - "8028c18c" : "determine_dance_cutscene", - "8028c26c" : "open_door_cutscene", - "8028c2c8" : "get_cutscene_from_mario_status", - "8028c7a0" : "warp_camera", - "8028c8f0" : "approach_camera_height", - "8028c9ac" : "stub_camera_4", - "8028c9cc" : "set_focus_rel_mario", - "8028cbf0" : "offset_rotated", - "8028cd94" : "offset_rotated_coords", - "8028cdec" : "determine_pushing_or_pulling_door", - "8028ce24" : "next_lakitu_state", - "8028d44c" : "set_camera_mode_fixed", - "8028d5ac" : "set_camera_mode_8_directions", - "8028d5fc" : "set_camera_mode_boss_fight", - "8028d658" : "set_camera_mode_close_cam", - "8028d698" : "set_camera_mode_radial", - "8028d79c" : "parallel_tracking_init", - "8028d888" : "set_fixed_cam_axis_sa_lobby", - "8028d92c" : "check_blocking_area_processing", - "8028da18" : "cam_rr_exit_building_side", - "8028da50" : "cam_rr_exit_building_top", - "8028daec" : "cam_rr_enter_building_window", - "8028db38" : "cam_rr_enter_building", - "8028dbb4" : "cam_rr_enter_building_side", - "8028dbf4" : "cam_cotmc_exit_waterfall", - "8028dc1c" : "cam_sl_snowman_head_8dir", - "8028dc70" : "cam_sl_free_roam", - "8028dca4" : "move_camera_through_floor_while_descending", - "8028dd48" : "cam_hmc_enter_maze", - "8028de2c" : "cam_hmc_elevator_black_hole", - "8028de5c" : "cam_hmc_elevator_maze_emergency_exit", - "8028de90" : "cam_hmc_elevator_lake", - "8028dec4" : "cam_hmc_elevator_maze", - "8028def8" : "cam_ssl_enter_pyramid_top", - "8028df24" : "cam_ssl_pyramid_center", - "8028df6c" : "cam_ssl_boss_room", - "8028dfb4" : "cam_thi_move_cam_through_tunnel", - "8028dfe8" : "cam_thi_look_through_tunnel", - "8028e01c" : "cam_bob_tower", - "8028e064" : "cam_bob_default_free_roam", - "8028e098" : "cam_castle_hmc_start_pool_cutscene", - "8028e0ec" : "cam_castle_lobby_entrance", - "8028e164" : "cam_castle_look_upstairs", - "8028e210" : "cam_castle_basement_look_downstairs", - "8028e298" : "cam_castle_enter_lobby", - "8028e300" : "cam_castle_enter_spiral_stairs", - "8028e38c" : "cam_castle_close_mode", - "8028e3b8" : "cam_castle_leave_lobby_sliding_door", - "8028e3f0" : "cam_castle_enter_lobby_sliding_door", - "8028e41c" : "cam_bbh_room_6", - "8028e450" : "cam_bbh_fall_off_roof", - "8028e47c" : "cam_bbh_fall_into_pool", - "8028e524" : "cam_bbh_room_1", - "8028e55c" : "cam_bbh_leave_front_door", - "8028e594" : "cam_bbh_room_2_lower", - "8028e5cc" : "cam_bbh_room_4", - "8028e604" : "cam_bbh_room_8", - "8028e63c" : "cam_bbh_room_5_library", - "8028e674" : "cam_bbh_room_5_library_to_hidden_transition", - "8028e6c4" : "cam_bbh_room_5_hidden_to_library_transition", - "8028e714" : "cam_bbh_room_5_hidden", - "8028e758" : "cam_bbh_room_3", - "8028e790" : "cam_bbh_room_7_mr_i", - "8028e7c8" : "cam_bbh_room_7_mr_i_to_coffins_transition", - "8028e818" : "cam_bbh_room_7_coffins_to_mr_i_transition", - "8028e868" : "cam_bbh_elevator_room_lower", - "8028e8a0" : "cam_bbh_room_0_back_entrance", - "8028e8cc" : "cam_bbh_elevator", - "8028e930" : "cam_bbh_room_12_upper", - "8028e974" : "cam_bbh_enter_front_door", - "8028e9a0" : "cam_bbh_room_2_library", - "8028e9d8" : "cam_bbh_room_2_library_to_trapdoor_transition", - "8028ea28" : "cam_bbh_room_2_trapdoor", - "8028ea60" : "cam_bbh_room_2_trapdoor_transition", - "8028eab0" : "cam_bbh_room_9_attic", - "8028eae8" : "cam_bbh_room_9_attic_transition", - "8028eb38" : "cam_bbh_room_9_mr_i_transition", - "8028eb88" : "cam_bbh_room_13_balcony", - "8028ebc0" : "cam_bbh_room_0", - "8028ec04" : "cam_ccm_enter_slide_shortcut", - "8028ec2c" : "cam_ccm_leave_slide_shortcut", - "8028ec58" : "surface_type_modes", - "8028ed30" : "set_mode_if_not_set_by_surface", - "8028ed98" : "surface_type_modes_thi", - "8028eeb0" : "camera_course_processing", - "8028f670" : "resolve_geometry_collisions", - "8028f914" : "rotate_camera_around_walls", - "8028fc9c" : "find_mario_floor_and_ceil", - "8028fe24" : "start_object_cutscene", - "8028fe58" : "start_object_cutscene_without_focus", - "8028fe84" : "unused_dialog_cutscene_response", - "8028ff04" : "cutscene_object_with_dialog", - "8028ffc8" : "cutscene_object_without_dialog", - "8029000c" : "cutscene_object", - "80290098" : "update_camera_yaw", - "802900e0" : "cutscene_reset_spline", - "80290104" : "stop_cutscene_and_retrieve_stored_info", - "80290168" : "cap_switch_save", - "802901a4" : "init_spline_point", - "802901fc" : "copy_spline_segment", - "802903b8" : "cutscene_common_set_dialog_state", - "802904a8" : "cutscene_intro_peach_start_letter_music", - "802904e4" : "cutscene_intro_peach_start_flying_music", - "8029051c" : "reset_pan_distance", - "8029053c" : "player2_rotate_cam", - "80290784" : "store_info_cannon", - "802907f4" : "retrieve_info_cannon", - "80290864" : "store_info_star", - "802908e8" : "retrieve_info_star", - "802909d0" : "pan_camera", - "80290a5c" : "cutscene_shake_explosion", - "80290abc" : "rotate_and_move_vec3f", - "80290b54" : "set_flag_post_door", - "80290ba4" : "cutscene_soften_music", - "80290bd8" : "cutscene_unsoften_music", - "80290c1c" : "cutscene_unused_start", - "80290c30" : "cutscene_unused_loop", - "80290c44" : "cutscene_ending_mario_fall_start", - "80290c9c" : "cutscene_ending_mario_fall_focus_mario", - "80290d90" : "cutscene_ending_mario_fall", - "80290e00" : "cutscene_ending_mario_land_closeup", - "80290e74" : "cutscene_ending_reset_spline", - "80290eb0" : "cutscene_ending_fly_up_to_window", - "80290f1c" : "cutscene_ending_stars_free_peach", - "80290f8c" : "cutscene_ending_mario_land", - "80291074" : "cutscene_ending_peach_appear_closeup", - "80291108" : "cutscene_ending_peach_appears", - "802911c8" : "cutscene_ending_peach_descends_start", - "80291208" : "cutscene_ending_follow_peach_descent", - "8029127c" : "cutscene_ending_peach_descent_lower_focus", - "802912b8" : "cutscene_ending_peach_descent_back_to_mario", - "80291354" : "cutscene_ending_peach_descends", - "8029142c" : "cutscene_ending_mario_to_peach", - "802914cc" : "cutscene_ending_look_up_at_castle", - "80291514" : "cutscene_ending_peach_wakeup", - "802915d4" : "cutscene_ending_dialog", - "80291654" : "cutscene_ending_kiss_closeup", - "802916b8" : "cutscene_ending_kiss_here_we_go", - "80291774" : "cutscene_ending_kiss", - "802917e4" : "cutscene_ending_look_at_sky", - "8029184c" : "cutscene_ending_zoom_fov", - "80291870" : "cutscene_ending_cake_for_mario", - "80291924" : "cutscene_ending_stop", - "80291964" : "cutscene_grand_star_start", - "802919dc" : "cutscene_grand_star_front_of_mario", - "80291ab4" : "cutscene_grand_star_mario_jump", - "80291b18" : "cutscene_grand_star_accel_cvar2", - "80291b68" : "cutscene_grand_star_approach_mario", - "80291bf4" : "cutscene_grand_star_move_cvar2", - "80291c3c" : "cutscene_grand_star_focus_mario", - "80291cd0" : "cutscene_grand_star", - "80291db0" : "cutscene_grand_star_fly_start", - "80291e84" : "cutscene_grand_star_fly_move_to_mario", - "80291f18" : "cutscene_grand_star_fly_mario_offscreen", - "80292038" : "cutscene_grand_star_fly_app_cvars", - "80292164" : "cutscene_grand_star_fly", - "802921fc" : "focus_in_front_of_mario", - "8029228c" : "cutscene_dance_move_to_mario", - "80292324" : "cutscene_dance_rotate", - "80292370" : "cutscene_dance_rotate_move_back", - "802923b8" : "cutscene_dance_rotate_move_towards_mario", - "80292414" : "cutscene_dance_default_focus_mario", - "8029244c" : "cutscene_dance_rotate_focus_mario", - "80292484" : "cutscene_dance_shake_fov", - "802924b8" : "cutscene_dance_default_rotate", - "80292628" : "star_dance_bound_yaw", - "802926dc" : "cutscene_dance_closeup_start", - "802927d0" : "cutscene_dance_closeup_focus_mario", - "80292868" : "cutscene_dance_closeup_fly_above", - "80292974" : "cutscene_dance_closeup_fly_closer", - "80292a20" : "cutscene_dance_closeup_zoom", - "80292a4c" : "cutscene_dance_closeup_shake_fov", - "80292a80" : "cutscene_dance_closeup", - "80292c00" : "cutscene_dance_fly_away_start", - "80292d80" : "cutscene_dance_fly_away_approach_mario", - "80292e2c" : "cutscene_dance_fly_away_focus_mario", - "80292ec4" : "cutscene_pan_cvar9", - "80292f40" : "cutscene_dance_fly_rotate_around_mario", - "80292f98" : "cutscene_dance_fly_away_rotate_while_flying", - "80292fe4" : "cutscene_dance_fly_away_shake_fov", - "80293018" : "cutscene_dance_fly_away", - "802930f0" : "cutscene_key_dance_jump_cvar", - "80293164" : "cutscene_key_dance_jump_closeup", - "802931c0" : "cutscene_key_dance_jump_lower_left", - "80293220" : "cutscene_key_dance_jump_above", - "8029328c" : "cutscene_key_dance_jump_last", - "802932f4" : "cutscene_key_dance_shake_fov", - "80293328" : "cutscene_key_dance_handheld_shake", - "80293354" : "cutscene_key_dance_focus_mario", - "8029338c" : "cutscene_key_dance", - "80293488" : "cutscene_bowser_area_shake_fov", - "802934b4" : "cutscene_bowser_area_start_bowser_walking", - "802934d8" : "cutscene_bowser_arena_set_pos", - "80293548" : "cutscene_bowser_arena_focus_sine", - "802935e0" : "cutscene_bowser_arena_set_focus", - "80293624" : "cutscene_bowser_arena_adjust_offsets", - "8029369c" : "cutscene_bowser_arena_pan_left", - "802936dc" : "cutscene_bowser_arena_mario_dialog", - "80293708" : "cutscene_stop_dialog", - "80293734" : "cutscene_bowser_arena_start", - "802937e8" : "bowser_fight_intro_dialog", - "8029386c" : "cutscene_bowser_arena_dialog", - "802938c8" : "cutscene_bowser_arena_end", - "80293944" : "cutscene_bowser_arena", - "80293abc" : "cutscene_star_spawn_store_info", - "80293ae8" : "cutscene_star_spawn_focus_star", - "80293b70" : "cutscene_star_spawn_update_boss_fight", - "80293bf4" : "cutscene_star_spawn_fly_back", - "80293c2c" : "cutscene_star_spawn", - "80293cb0" : "cutscene_star_spawn_back", - "80293d5c" : "cutscene_star_spawn_end", - "80293d90" : "cutscene_exit_waterfall_warp", - "80293dd4" : "cutscene_exit_to_castle_grounds_focus_mario", - "80293e7c" : "cutscene_exit_waterfall", - "80293ed8" : "cutscene_exit_to_castle_grounds_end", - "80293f2c" : "cutscene_exit_fall_to_castle_grounds_warp", - "80293f70" : "cutscene_exit_fall_to_castle_grounds", - "80293fcc" : "cutscene_red_coin_star_start", - "80294024" : "cutscene_red_coin_star_focus_xz", - "80294088" : "cutscene_red_coin_star_focus_y", - "802940cc" : "cutscene_red_coin_star_look_up_at_star", - "8029410c" : "cutscene_red_coin_star_warp", - "802942cc" : "cutscene_red_coin_star_set_fov", - "802942f0" : "cutscene_red_coin_star", - "802943d4" : "cutscene_red_coin_star_end", - "80294428" : "cutscene_goto_cvar_pos", - "80294718" : "cutscene_prepare_cannon_start", - "802947a4" : "cutscene_prepare_cannon_fly_to_cannon", - "8029480c" : "cannon_approach_prev", - "802948a0" : "cutscene_prepare_cannon_fly_back", - "80294a14" : "cutscene_prepare_cannon", - "80294a94" : "cutscene_prepare_cannon_end", - "80294ae8" : "water_death_move_to_mario_side", - "80294b78" : "death_goto_mario", - "80294bb4" : "cutscene_death_standing_start", - "80294c28" : "cutscene_death_standing_goto_mario", - "80294c5c" : "cutscene_death_standing", - "80294cc4" : "cutscene_death_stomach_start", - "80294d48" : "cutscene_death_stomach_goto_mario", - "80294db4" : "cutscene_death_stomach", - "80294e24" : "cutscene_bbh_death_start", - "80294ea8" : "cutscene_bbh_death_goto_mario", - "80294ee8" : "cutscene_bbh_death", - "80294f58" : "cutscene_quicksand_death_start", - "80294f94" : "cutscene_quicksand_death_goto_mario", - "80294fec" : "cutscene_quicksand_death", - "802950b0" : "cutscene_suffocation_fly_away", - "80295140" : "cutscene_suffocation_stay_above_gas", - "802951f0" : "cutscene_suffocation_rotate", - "80295270" : "cutscene_suffocation", - "80295310" : "cutscene_enter_pool_start", - "802953dc" : "cutscene_enter_pool_loop", - "80295418" : "cutscene_enter_pool", - "80295480" : "cutscene_pyramid_top_explode_start", - "802954ec" : "cutscene_pyramid_top_explode_zoom_in", - "80295518" : "cutscene_pyramid_top_explode_focus", - "80295580" : "cutscene_pyramid_top_explode_warp", - "80295670" : "cutscene_pyramid_top_explode_closeup", - "80295740" : "cutscene_pyramid_top_explode_cam_shake", - "8029576c" : "cutscene_pyramid_top_explode_warp_back", - "802957c8" : "cutscene_pyramid_top_explode", - "80295894" : "cutscene_pyramid_top_explode_end", - "802958d4" : "cutscene_enter_pyramid_top_start", - "80295930" : "cutscene_enter_pyramid_top", - "80295a58" : "cutscene_dialog_start", - "80295bf0" : "cutscene_dialog_move_mario_shoulder", - "80295e24" : "cutscene_dialog_create_dialog_box", - "80295e8c" : "cutscene_dialog", - "80295fb0" : "cutscene_dialog_set_flag", - "80295fd8" : "cutscene_dialog_end", - "80296020" : "cutscene_read_message_start", - "80296160" : "cutscene_read_message", - "802962c8" : "cutscene_read_message_set_flag", - "802962f0" : "cutscene_read_message_end", - "80296318" : "cutscene_exit_succ_start", - "802963b8" : "cutscene_non_painting_set_cam_pos", - "8029652c" : "cutscene_non_painting_set_cam_focus", - "8029665c" : "cutscene_exit_bowser_succ_focus_left", - "8029669c" : "cutscene_exit_bowser_key_toss_shake", - "802966e4" : "cutscene_exit_succ_shake_landing", - "80296710" : "cutscene_exit_bowser_succ", - "802967c4" : "cutscene_non_painting_end", - "8029685c" : "cutscene_exit_non_painting_succ_override_cvar", - "802968a0" : "cutscene_exit_non_painting_succ", - "8029695c" : "cutscene_non_painting_death_start", - "802969f8" : "cutscene_exit_bowser_death", - "80296a64" : "cutscene_non_painting_death_override_offset", - "80296b30" : "cutscene_non_painting_death", - "80296bc8" : "cutscene_cap_switch_press_start", - "80296c4c" : "cutscene_cap_switch_press_rotate_around_mario", - "80296d60" : "cutscene_cap_switch_press_lower_cam", - "80296da8" : "cutscene_cap_switch_press_approach_mario", - "80296eb4" : "cutscene_cap_switch_press_pan_left", - "80296f38" : "cutscene_cap_switch_press_create_dialog", - "80296fa8" : "cutscene_cap_switch_press", - "80297148" : "cutscene_unlock_key_door_start", - "8029720c" : "cutscene_unlock_key_door_approach_mario", - "80297290" : "cutscene_unlock_key_door_focus_lock", - "802972ec" : "cutscene_unlock_key_door_stub", - "80297300" : "cutscene_unlock_key_door_fly_back", - "80297384" : "cutscene_unlock_key_door_fov_shake", - "802973b0" : "cutscene_unlock_key_door", - "80297464" : "intro_peach_move_camera_start_to_pipe", - "80297560" : "peach_letter_text", - "8029758c" : "play_sound_peach_reading_letter", - "802975c4" : "cutscene_intro_peach_start_to_pipe_spline", - "8029762c" : "cutscene_intro_peach_dialog", - "802976bc" : "cutscene_intro_peach_follow_pipe_spline", - "80297728" : "cutscene_intro_peach_clear_cutscene_status", - "80297748" : "cutscene_intro_peach_zoom_fov", - "80297784" : "cutscene_intro_peach_reset_spline", - "802977c8" : "cutscene_intro_peach_handheld_shake_off", - "802977f4" : "intro_pipe_exit_text", - "80297820" : "play_sound_intro_turn_on_hud", - "8029784c" : "cutscene_intro_peach_fly_to_pipe", - "80297908" : "cutscene_intro_peach_mario_appears", - "80297a38" : "cutscene_intro_peach_reset_fov", - "80297a64" : "cutscene_intro_peach_letter", - "80297b58" : "cutscene_end_waving_start", - "80297b84" : "cutscene_end_waving", - "80297c14" : "cutscene_credits_reset_spline", - "80297c40" : "cutscene_credits", - "802980dc" : "cutscene_sliding_doors_open_start", - "8029819c" : "cutscene_sliding_doors_open_set_cvars", - "80298218" : "cutscene_sliding_doors_go_under_doorway", - "80298254" : "cutscene_sliding_doors_fly_back_up", - "80298290" : "cutscene_sliding_doors_follow_mario", - "802983b4" : "cutscene_sliding_doors_open", - "80298458" : "cutscene_double_doors_end", - "802984a0" : "cutscene_enter_painting_stub", - "802984b4" : "cutscene_enter_painting", - "802987b0" : "cutscene_exit_painting_start", - "8029894c" : "cutscene_exit_painting_move_to_mario", - "802989e8" : "cutscene_exit_painting_move_to_floor", - "80298af8" : "cutscene_exit_painting", - "80298ba0" : "cutscene_unused_exit_start", - "80298c2c" : "cutscene_unused_exit_focus_mario", - "80298ccc" : "cutscene_exit_painting_end", - "80298d44" : "cutscene_enter_cannon_end", - "80298d9c" : "cutscene_enter_cannon_raise", - "80298fe8" : "cutscene_enter_cannon_start", - "80299100" : "cutscene_door_start", - "80299154" : "cutscene_door_fix_cam", - "802991a8" : "cutscene_door_loop", - "802991f0" : "cutscene_door_move_behind_mario", - "802992cc" : "cutscene_door_follow_mario", - "80299360" : "cutscene_door_end", - "80299404" : "cutscene_door_mode", - "802994e8" : "play_cutscene", - "8029a2f8" : "cutscene_event", - "8029a37c" : "cutscene_spawn_obj", - "8029a3b4" : "set_fov_shake", - "8029a41c" : "set_fov_shake_from_point", - "8029a4d0" : "shake_camera_fov", - "8029a5e8" : "set_fov_30", - "8029a60c" : "approach_fov_20", - "8029a64c" : "set_fov_45", - "8029a670" : "set_fov_29", - "8029a694" : "zoom_fov_30", - "8029a6f4" : "fov_default", - "8029a858" : "approach_fov_30", - "8029a894" : "approach_fov_60", - "8029a8d0" : "approach_fov_45", - "8029a968" : "approach_fov_80", - "8029a9a4" : "set_fov_bbh", - "8029aa3c" : "geo_camera_fov", - "8029ab94" : "set_fov_function", - "8029abb0" : "cutscene_set_fov_shake_preset", - "8029ac30" : "set_fov_shake_from_point_preset", - "8029aef8" : "obj_rotate_towards_point", - "8029af98" : "intro_peach_set_pos_and_opacity", - "8029b08c" : "bhv_intro_peach_loop", - "8029b28c" : "intro_lakitu_set_offset_from_camera", - "8029b358" : "intro_lakitu_set_focus", - "8029b3c8" : "intro_lakitu_set_pos_and_focus", - "8029b49c" : "bhv_intro_lakitu_loop", - "8029bde4" : "bhv_end_birds_1_loop", - "8029bf64" : "bhv_end_birds_2_loop", - "8029c0e4" : "spawn_child_obj_relative", - "8029c254" : "bhv_intro_scene_loop", - "8029c770" : "nop_change_course", - "8029c780" : "copy_mario_state_to_object", - "8029c9cc" : "spawn_particle", - "8029ca58" : "bhv_mario_update", - "8029cb34" : "update_objects_starting_at", - "8029cbc8" : "update_objects_during_time_stop", - "8029cd28" : "update_objects_in_list", - "8029cd98" : "unload_deactivated_objects_in_list", - "8029ce58" : "set_object_respawn_info_bits", - "8029cedc" : "unload_objects_from_area", - "8029cfb0" : "spawn_objects_from_info", - "8029d1d8" : "stub_obj_list_processor_1", - "8029d1e8" : "clear_objects", - "8029d324" : "update_terrain_objects", - "8029d374" : "update_non_terrain_objects", - "8029d428" : "unload_deactivated_objects", - "8029d690" : "update_objects", - "8029d890" : "geo_update_projectile_pos_from_parent", - "8029d924" : "geo_update_layer_transparency", - "8029db48" : "geo_switch_anim_state", - "8029dbd4" : "geo_switch_area", - "8029dcd4" : "obj_update_pos_from_parent_transformation", - "8029dda8" : "obj_apply_scale_to_matrix", - "8029de80" : "create_transformation_from_matrices", - "8029e1b0" : "obj_set_held_state", - "8029e27c" : "lateral_dist_between_objects", - "8029e2f8" : "dist_between_objects", - "8029e398" : "cur_obj_forward_vel_approach_upward", - "8029e3e8" : "approach_f32_signed", - "8029e494" : "approach_f32_symmetric", - "8029e530" : "approach_s16_symmetric", - "8029e5ec" : "cur_obj_rotate_yaw_toward", - "8029e694" : "obj_angle_to_object", - "8029e714" : "obj_turn_toward_object", - "8029e8bc" : "obj_set_parent_relative_pos", - "8029e914" : "obj_set_pos", - "8029e96c" : "obj_set_angle", - "8029e9ac" : "spawn_object_abs_with_rot", - "8029ea24" : "spawn_object_rel_with_rot", - "8029eaac" : "spawn_obj_with_transform_flags", - "8029eb04" : "spawn_water_droplet", - "8029ed20" : "spawn_object_at_origin", - "8029edcc" : "spawn_object", - "8029ee24" : "try_to_spawn_object", - "8029eeb8" : "spawn_object_with_scale", - "8029ef64" : "spawn_object_relative", - "8029effc" : "spawn_object_relative_with_scale", - "8029f070" : "cur_obj_move_using_vel", - "8029f0c8" : "obj_copy_graph_y_offset", - "8029f0e0" : "obj_copy_pos_and_angle", - "8029f120" : "obj_copy_pos", - "8029f148" : "obj_copy_angle", - "8029f188" : "obj_set_gfx_pos_from_pos", - "8029f1b0" : "obj_init_animation", - "8029f200" : "linear_mtxf_mul_vec3f", - "8029f274" : "linear_mtxf_transpose_mul_vec3f", - "8029f2ec" : "obj_apply_scale_to_transform", - "8029f3a8" : "obj_copy_scale", - "8029f3d0" : "obj_scale_xyz", - "8029f404" : "obj_scale", - "8029f430" : "cur_obj_scale", - "8029f464" : "cur_obj_init_animation", - "8029f4b4" : "cur_obj_init_animation_with_sound", - "8029f514" : "cur_obj_init_animation_with_accel_and_sound", - "8029f59c" : "obj_init_animation_with_sound", - "8029f600" : "cur_obj_enable_rendering_and_become_tangible", - "8029f620" : "cur_obj_enable_rendering", - "8029f644" : "cur_obj_disable_rendering_and_become_intangible", - "8029f66c" : "cur_obj_disable_rendering", - "8029f694" : "cur_obj_unhide", - "8029f6bc" : "cur_obj_hide", - "8029f6e0" : "cur_obj_set_pos_relative", - "8029f7d8" : "cur_obj_set_pos_relative_to_parent", - "8029f820" : "cur_obj_enable_rendering_2", - "8029f848" : "cur_obj_unused_init_on_floor", - "8029f8ec" : "obj_set_face_angle_to_move_angle", - "8029f914" : "get_object_list_from_behavior", - "8029f95c" : "cur_obj_nearest_object_with_behavior", - "8029f998" : "cur_obj_dist_to_nearest_object_with_behavior", - "8029f9ec" : "cur_obj_find_nearest_object_with_behavior", - "8029fb1c" : "find_unimportant_object", - "8029fb68" : "count_unimportant_objects", - "8029fbdc" : "count_objects_with_behavior", - "8029fc9c" : "cur_obj_find_nearby_held_actor", - "8029fdb4" : "cur_obj_change_action", - "8029fe00" : "cur_obj_set_vel_from_mario_vel", - "8029fe6c" : "cur_obj_reverse_animation", - "8029fea4" : "cur_obj_extend_animation_if_at_end", - "8029ff04" : "cur_obj_check_if_near_animation_end", - "8029ffa4" : "cur_obj_check_if_at_animation_end", - "802a0008" : "cur_obj_check_anim_frame", - "802a0050" : "cur_obj_check_anim_frame_in_range", - "802a00ac" : "cur_obj_check_frame_prior_current_frame", - "802a0114" : "mario_is_in_air_action", - "802a0154" : "mario_is_dive_sliding", - "802a0198" : "cur_obj_set_y_vel_and_animation", - "802a01d8" : "cur_obj_unrender_and_reset_state", - "802a0380" : "cur_obj_get_thrown_or_placed", - "802a0474" : "cur_obj_get_dropped", - "802a04c0" : "cur_obj_set_model", - "802a04f0" : "mario_set_flag", - "802a0514" : "cur_obj_clear_interact_status_flag", - "802a0568" : "obj_mark_for_deletion", - "802a057c" : "cur_obj_disable", - "802a05b4" : "cur_obj_become_intangible", - "802a05d4" : "cur_obj_become_tangible", - "802a05f0" : "obj_become_tangible", - "802a0604" : "cur_obj_update_floor_height", - "802a064c" : "cur_obj_update_floor_height_and_get_floor", - "802a079c" : "cur_obj_apply_drag_xz", - "802a0e68" : "cur_obj_move_y", - "802a113c" : "cur_obj_unused_resolve_wall_collisions", - "802a11a8" : "abs_angle_diff", - "802a120c" : "cur_obj_move_xz_using_fvel_and_yaw", - "802a12a4" : "cur_obj_move_y_with_terminal_vel", - "802a1308" : "cur_obj_compute_vel_xz", - "802a1370" : "increment_velocity_toward_range", - "802a1424" : "obj_check_if_collided_with_object", - "802a148c" : "cur_obj_set_behavior", - "802a14c4" : "obj_set_behavior", - "802a14fc" : "cur_obj_has_behavior", - "802a1554" : "obj_has_behavior", - "802a15ac" : "cur_obj_lateral_dist_from_mario_to_home", - "802a1634" : "cur_obj_lateral_dist_to_home", - "802a16ac" : "cur_obj_outside_home_square", - "802a1774" : "cur_obj_outside_home_rectangle", - "802a184c" : "cur_obj_set_pos_to_home", - "802a188c" : "cur_obj_set_pos_to_home_and_stop", - "802a18dc" : "cur_obj_shake_y", - "802a1930" : "cur_obj_start_cam_event", - "802a1960" : "set_mario_interact_hoot_if_in_range", - "802a19ac" : "obj_set_billboard", - "802a19c8" : "cur_obj_set_hitbox_radius_and_height", - "802a19f0" : "cur_obj_set_hurtbox_radius_and_height", - "802a1b34" : "obj_spawn_loot_blue_coins", - "802a1b8c" : "obj_spawn_loot_yellow_coins", - "802a1bdc" : "cur_obj_spawn_loot_coin_at_mario_pos", - "802a1c68" : "cur_obj_abs_y_dist_to_home", - "802a1cc4" : "cur_obj_advance_looping_anim", - "802a1f3c" : "cur_obj_resolve_wall_collisions", - "802a2320" : "cur_obj_update_floor_and_walls", - "802a2348" : "cur_obj_move_standard", - "802a25b4" : "cur_obj_move_using_vel_and_gravity", - "802a2644" : "cur_obj_move_using_fvel_and_gravity", - "802a2674" : "obj_set_pos_relative", - "802a2748" : "cur_obj_angle_to_home", - "802a27b0" : "obj_set_gfx_pos_at_obj_pos", - "802a2804" : "obj_translate_local", - "802a2930" : "obj_build_transform_from_pos_and_angle", - "802a2a18" : "obj_set_throw_matrix_from_transform", - "802a2a84" : "obj_build_transform_relative_to_parent", - "802a2b28" : "obj_create_transform_from_self", - "802a2b6c" : "cur_obj_rotate_move_angle_using_vel", - "802a2bc4" : "cur_obj_rotate_face_angle_using_vel", - "802a2c1c" : "cur_obj_set_face_angle_to_move_angle", - "802a2c5c" : "cur_obj_follow_path", - "802a2ed4" : "chain_segment_init", - "802a2f14" : "random_f32_around_zero", - "802a2f5c" : "obj_scale_random", - "802a2fc0" : "obj_translate_xyz_random", - "802a308c" : "obj_translate_xz_random", - "802a31e0" : "cur_obj_set_pos_via_transform", - "802a3268" : "cur_obj_reflect_move_angle_off_wall", - "802a32ac" : "cur_obj_spawn_particles", - "802a34a4" : "obj_set_hitbox", - "802a3604" : "signum_positive", - "802a3634" : "absf", - "802a3674" : "absi", - "802a36a4" : "cur_obj_wait_then_blink", - "802a3754" : "cur_obj_is_mario_ground_pounding_platform", - "802a37ac" : "spawn_mist_particles", - "802a37dc" : "spawn_mist_particles_with_sound", - "802a3818" : "cur_obj_push_mario_away", - "802a390c" : "cur_obj_push_mario_away_from_cylinder", - "802a399c" : "bhv_dust_smoke_loop", - "802a3a4c" : "cur_obj_set_direction_table", - "802a3a88" : "cur_obj_progress_direction_table", - "802a3b28" : "stub_obj_helpers_3", - "802a3b40" : "cur_obj_scale_over_time", - "802a3c18" : "cur_obj_set_pos_to_home_with_debug", - "802a3cec" : "stub_obj_helpers_4", - "802a3cfc" : "cur_obj_is_mario_on_platform", - "802a3d40" : "cur_obj_shake_y_until", - "802a3dd4" : "cur_obj_move_up_and_down", - "802a3e30" : "cur_obj_call_action_function", - "802a3ef8" : "spawn_base_star_with_no_lvl_exit", - "802a3f24" : "bit_shift_left", - "802a3f48" : "cur_obj_mario_far_away", - "802a404c" : "is_mario_moving_fast_or_in_air", - "802a40b8" : "is_item_in_array", - "802a4120" : "bhv_init_room", - "802a4210" : "cur_obj_enable_rendering_if_mario_in_room", - "802a4360" : "cur_obj_set_hitbox_and_die_if_attacked", - "802a4440" : "obj_explode_and_spawn_coins", - "802a44f4" : "obj_set_collision_data", - "802a452c" : "cur_obj_if_hit_wall_bounce_away", - "802a4564" : "cur_obj_hide_if_mario_far_away_y", - "802a45e4" : "geo_offset_klepto_held_object", - "802a462c" : "geo_offset_klepto_debug", - "802a46cc" : "obj_is_hidden", - "802a4704" : "enable_time_stop", - "802a4728" : "disable_time_stop", - "802a4750" : "set_time_stop_flags", - "802a4774" : "clear_time_stop_flags", - "802a47a0" : "cur_obj_can_mario_activate_textbox", - "802a48bc" : "cur_obj_can_mario_activate_textbox_2", - "802a4960" : "cur_obj_update_dialog", - "802a4be4" : "cur_obj_update_dialog_with_cutscene", - "802a4f04" : "cur_obj_has_model", - "802a4f58" : "cur_obj_align_gfx_with_floor", - "802a5034" : "mario_is_within_rectangle", - "802a50fc" : "cur_obj_shake_screen", - "802a513c" : "obj_attack_collided_from_other_object", - "802a51ac" : "cur_obj_was_attacked_or_ground_pounded", - "802a5228" : "obj_copy_behavior_params", - "802a5248" : "cur_obj_init_animation_and_anim_frame", - "802a5288" : "cur_obj_init_animation_and_check_if_near_end", - "802a52c4" : "cur_obj_init_animation_and_extend_if_at_end", - "802a52f8" : "cur_obj_check_grabbed_mario", - "802a5358" : "player_performed_grab_escape_action", - "802a540c" : "cur_obj_unused_play_footstep_sound", - "802a5460" : "enable_time_stop_including_mario", - "802a5498" : "disable_time_stop_including_mario", - "802a54d8" : "cur_obj_check_interacted", - "802a5524" : "cur_obj_spawn_loot_blue_coin", - "802a5588" : "cur_obj_spawn_star_at_y_offset", - "802a5620" : "star_door_update_pos", - "802a56bc" : "bhv_star_door_loop", - "802a58dc" : "bhv_piranha_particle_loop", - "802a597c" : "mr_i_piranha_particle_act_0", - "802a5a44" : "mr_i_piranha_particle_act_1", - "802a5aa0" : "bhv_mr_i_particle_loop", - "802a5acc" : "spawn_mr_i_particle", - "802a5bd4" : "bhv_mr_i_body_loop", - "802a5d4c" : "mr_i_act_3", - "802a6518" : "mr_i_act_2", - "802a68a0" : "mr_i_act_1", - "802a6ad8" : "mr_i_act_0", - "802a6b7c" : "bhv_mr_i_loop", - "802a6c20" : "bhv_pole_init", - "802a6c74" : "bhv_giant_pole_loop", - "802a6cf4" : "bhv_thi_huge_island_top_loop", - "802a6d64" : "bhv_thi_tiny_island_top_loop", - "802a6ee4" : "cap_switch_act_0", - "802a7020" : "cap_switch_act_1", - "802a708c" : "cap_switch_act_2", - "802a7160" : "cap_switch_act_3", - "802a7170" : "bhv_cap_switch_loop", - "802a719c" : "geo_update_held_mario_pos", - "802a7230" : "bhv_bobomb_anchor_mario_loop", - "802a7264" : "king_bobomb_act_0", - "802a7384" : "mario_is_far_below_object", - "802a73d8" : "king_bobomb_act_2", - "802a7598" : "king_bobomb_act_3", - "802a7804" : "king_bobomb_act_1", - "802a78d8" : "king_bobomb_act_6", - "802a7a60" : "king_bobomb_act_7", - "802a7b1c" : "king_bobomb_act_8", - "802a7b5c" : "king_bobomb_act_4", - "802a7d14" : "king_bobomb_act_5", - "802a7fbc" : "king_bobomb_move", - "802a8064" : "bhv_king_bobomb_loop", - "802a816c" : "bhv_beta_chest_bottom_init", - "802a81e8" : "bhv_beta_chest_bottom_loop", - "802a821c" : "bhv_beta_chest_lid_loop", - "802a8370" : "bhv_water_air_bubble_init", - "802a83a0" : "bhv_water_air_bubble_loop", - "802a8630" : "bhv_bubble_wave_init", - "802a86bc" : "scale_bubble_random", - "802a870c" : "bhv_bubble_maybe_loop", - "802a88a4" : "bhv_small_water_wave_loop", - "802a8a38" : "scale_bubble_sin", - "802a8b18" : "bhv_particle_init", - "802a8bc0" : "bhv_particle_loop", - "802a8c88" : "bhv_small_bubbles_loop", - "802a8cdc" : "bhv_fish_group_loop", - "802a8d48" : "bhv_water_waves_init", - "802a8d98" : "bhv_cannon_base_unused_loop", - "802a8dc0" : "opened_cannon_act_0", - "802a8f40" : "opened_cannon_act_4", - "802a9114" : "opened_cannon_act_6", - "802a92fc" : "opened_cannon_act_5", - "802a93f8" : "opened_cannon_act_1", - "802a9440" : "opened_cannon_act_2", - "802a9460" : "opened_cannon_act_3", - "802a9498" : "bhv_cannon_base_loop", - "802a94f8" : "bhv_cannon_barrel_loop", - "802a958c" : "common_anchor_mario_behavior", - "802a9708" : "bhv_chuckya_anchor_mario_loop", - "802a973c" : "unknown_chuckya_function", - "802a98c4" : "approach_forward_vel", - "802a9994" : "chuckya_act_0", - "802a9d08" : "chuckya_act_1", - "802a9f54" : "chuckya_act_3", - "802a9fc8" : "chuckya_act_2", - "802aa02c" : "chuckya_move", - "802aa0ac" : "bhv_chuckya_loop", - "802aa1b8" : "bhv_wf_breakable_wall_loop", - "802aa280" : "check_mario_attacking", - "802aa3c8" : "init_kickable_board_rock", - "802aa3f4" : "bhv_kickable_board_loop", - "802aa700" : "bhv_tower_door_loop", - "802aa774" : "bhv_wf_rotating_wooden_platform_loop", - "802aa830" : "bhv_rotating_platform_loop", - "802aa948" : "set_koopa_shell_underwater_hitbox", - "802aa97c" : "bhv_koopa_shell_underwater_loop", - "802aaa60" : "bhv_warp_loop", - "802aab54" : "bhv_fading_warp_loop", - "802aac48" : "bhv_white_puff_exploding_loop", - "802aae8c" : "spawn_mist_particles_variable", - "802aaf48" : "bhv_spawned_star_init", - "802aaffc" : "set_sparkle_spawn_star_hitbox", - "802ab060" : "set_home_to_mario", - "802ab158" : "set_y_home_to_pos", - "802ab18c" : "slow_star_rotation", - "802ab1c8" : "bhv_spawned_star_loop", - "802ab558" : "bhv_spawn_star_no_level_exit", - "802ab5c8" : "bhv_coin_sparkles_init", - "802ab650" : "bhv_yellow_coin_init", - "802ab70c" : "bhv_yellow_coin_loop", - "802ab748" : "bhv_temp_coin_loop", - "802ab7a4" : "bhv_coin_init", - "802ab860" : "bhv_coin_loop", - "802aba40" : "bhv_coin_formation_spawn_loop", - "802abc04" : "spawn_coin_in_formation", - "802abee4" : "bhv_coin_formation_init", - "802abf0c" : "bhv_coin_formation_loop", - "802ac068" : "coin_inside_boo_act_1", - "802ac15c" : "coin_inside_boo_act_0", - "802ac294" : "bhv_coin_inside_boo_loop", - "802ac2c0" : "bhv_coin_sparkles_loop", - "802ac2ec" : "bhv_golden_coin_sparkles_loop", - "802ac3a8" : "bhv_punch_tiny_triangle_loop", - "802ac4a0" : "bhv_punch_tiny_triangle_init", - "802ac5b4" : "bhv_wall_tiny_star_particle_loop", - "802ac678" : "bhv_tiny_star_particles_init", - "802ac78c" : "bhv_pound_tiny_star_particle_loop", - "802ac864" : "bhv_pound_tiny_star_particle_init", - "802ac910" : "door_animation_and_reset", - "802ac958" : "set_door_camera_event", - "802ac9d0" : "play_door_open_noise", - "802aca6c" : "play_warp_door_open_noise", - "802acac8" : "bhv_door_loop", - "802acc3c" : "bhv_door_init", - "802ace80" : "bhv_star_door_loop_2", - "802ad078" : "grindel_thwomp_act_4", - "802ad10c" : "grindel_thwomp_act_2", - "802ad1a4" : "grindel_thwomp_act_3", - "802ad238" : "grindel_thwomp_act_1", - "802ad2d0" : "grindel_thwomp_act_0", - "802ad34c" : "bhv_grindel_thwomp_loop", - "802ad378" : "bhv_tumbling_bridge_platform_loop", - "802ad580" : "tumbling_bridge_act_1", - "802ad76c" : "tumbling_bridge_act_2", - "802ad7f4" : "tumbling_bridge_act_3", - "802ad828" : "tumbling_bridge_act_0", - "802ad890" : "bhv_tumbling_bridge_loop", - "802ad8bc" : "elevator_starting_shake", - "802ad8f0" : "elevator_act_0", - "802ada4c" : "elevator_act_1", - "802adb88" : "elevator_act_2", - "802adce4" : "elevator_act_4", - "802add70" : "elevator_act_3", - "802addf8" : "bhv_elevator_init", - "802adf6c" : "bhv_elevator_loop", - "802adf98" : "bhv_water_mist_spawn_loop", - "802adfd8" : "bhv_water_mist_loop", - "802ae0cc" : "spawn_triangle_break_particles", - "802ae238" : "bhv_water_mist_2_loop", - "802ae304" : "bhv_pound_white_puffs_init", - "802ae334" : "spawn_mist_from_global", - "802ae360" : "bhv_ground_sand_init", - "802ae394" : "spawn_smoke_with_velocity", - "802ae45c" : "clear_particle_flags", - "802ae48c" : "bhv_ground_snow_init", - "802ae4c0" : "spawn_wind_particles", - "802ae534" : "bhv_wind_loop", - "802ae85c" : "bhv_unused_particle_spawn_loop", - "802ae908" : "bhv_ukiki_cage_star_loop", - "802aea6c" : "ukiki_cage_act_wait_for_ukiki", - "802aeab8" : "ukiki_cage_act_spin", - "802aeb1c" : "ukiki_cage_act_fall", - "802aeb74" : "ukiki_cage_act_hide", - "802aeb9c" : "bhv_ukiki_cage_loop", - "802aebc8" : "bhv_squishable_platform_loop", - "802aec40" : "bhv_bitfs_sinking_platform_loop", - "802aeca8" : "bhv_ddd_moving_pole_loop", - "802aecdc" : "bhv_bitfs_sinking_cage_platform_loop", - "802aedc0" : "bhv_beta_moving_flames_spawn_loop", - "802aeea4" : "bhv_beta_moving_flames_loop", - "802aef1c" : "bhv_flamethrower_flame_loop", - "802af1e8" : "bhv_flamethrower_loop", - "802af3fc" : "bhv_rr_rotating_bridge_platform_loop", - "802af448" : "bhv_bouncing_fireball_flame_loop", - "802af5f8" : "bhv_bouncing_fireball_loop", - "802af7c4" : "bhv_bowser_shock_wave_loop", - "802af9cc" : "bhv_black_smoke_upward_loop", - "802afa0c" : "bhv_black_smoke_bowser_loop", - "802afae4" : "bhv_black_smoke_mario_loop", - "802afbf8" : "bhv_flame_mario_loop", - "802afce4" : "bhv_beta_fish_splash_spawner_loop", - "802afd1c" : "bhv_spindrift_loop", - "802afee8" : "bhv_wf_solid_tower_platform_loop", - "802aff30" : "bhv_wf_elevator_tower_platform_loop", - "802b00e4" : "bhv_wf_sliding_tower_platform_loop", - "802b0244" : "spawn_and_init_wf_platforms", - "802b039c" : "spawn_wf_platform_group", - "802b04b4" : "bhv_tower_platform_group_loop", - "802b0614" : "bhv_tree_snow_or_leaf_loop", - "802b0974" : "bhv_snow_leaf_particle_spawn_init", - "802b0b9c" : "square_plat_set_yaw_until_timer", - "802b0bec" : "bhv_squarish_path_moving_loop", - "802b0d48" : "bhv_piranha_plant_waking_bubbles_loop", - "802b0df0" : "bhv_piranha_plant_bubble_loop", - "802b1278" : "bhv_purple_switch_loop", - "802b14f4" : "check_if_moving_over_floor", - "802b15e8" : "bhv_pushable_loop", - "802b1714" : "breakable_box_init", - "802b17f4" : "hidden_breakable_box_actions", - "802b19d8" : "hidden_unbreakable_box_actions", - "802b1ae0" : "bhv_hidden_object_loop", - "802b1b2c" : "bhv_breakable_box_loop", - "802b1bb0" : "geo_move_mario_part_from_parent", - "802b1c54" : "bhv_heave_ho_throw_mario_loop", - "802b1d7c" : "heave_ho_act_1", - "802b1e6c" : "heave_ho_act_2", - "802b1ff4" : "heave_ho_act_3", - "802b20a0" : "heave_ho_act_0", - "802b2154" : "heave_ho_move", - "802b2278" : "bhv_heave_ho_loop", - "802b2340" : "bhv_ccm_touched_star_spawn_loop", - "802b23e0" : "bhv_unused_poundable_platform", - "802b2494" : "bhv_beta_trampoline_spring_loop", - "802b25ac" : "bhv_beta_trampoline_top_loop", - "802b26a4" : "jumping_box_act_0", - "802b27d8" : "jumping_box_act_1", - "802b2824" : "jumping_box_free_update", - "802b288c" : "bhv_jumping_box_loop", - "802b29b8" : "bhv_boo_cage_loop", - "802b2bc8" : "spawn_sparkle_particles", - "802b2d10" : "bhv_alpha_boo_key_loop", - "802b3108" : "bhv_beta_boo_key_loop", - "802b3134" : "arc_to_goal_pos", - "802b3250" : "grand_star_zero_velocity", - "802b329c" : "bhv_grand_star_loop", - "802b3600" : "bhv_bowser_key_loop", - "802b37b8" : "bhv_white_puff_smoke_init", - "802b3810" : "bhv_bullet_bill_init", - "802b3830" : "bullet_bill_act_0", - "802b38b8" : "bullet_bill_act_1", - "802b394c" : "bullet_bill_act_2", - "802b3b08" : "bullet_bill_act_3", - "802b3b24" : "bullet_bill_act_4", - "802b3be0" : "bhv_bullet_bill_loop", - "802b3c2c" : "bowser_tail_anchor_act_0", - "802b3cdc" : "bowser_tail_anchor_act_1", - "802b3d10" : "bowser_tail_anchor_act_2", - "802b3d74" : "bhv_bowser_tail_anchor_loop", - "802b3df4" : "bhv_bowser_flame_spawn_loop", - "802b4080" : "bhv_bowser_body_anchor_loop", - "802b4184" : "bowser_spawn_shockwave", - "802b41fc" : "bowser_bounce", - "802b4288" : "bowser_set_anim_look_up_and_walk", - "802b4300" : "bowser_set_anim_slow_gait", - "802b4368" : "bowser_set_anim_look_down", - "802b43dc" : "bowser_initialize_action", - "802b4478" : "bowser_act_text_wait", - "802b44bc" : "bowser_act_intro_walk", - "802b45f4" : "bowser_bitdw_act_controller", - "802b473c" : "bowser_bitfs_act_controller", - "802b48d4" : "bowser_general_bits_act_controller", - "802b4a1c" : "bowser_set_act_jump", - "802b4a3c" : "bowser_bits_act_controller", - "802b4af4" : "bowser_reset_fallen_off_stage", - "802b4bac" : "bowser_act_unused_slow_walk", - "802b4be8" : "bowser_act_default", - "802b4ca4" : "bowser_act_breath_fire", - "802b4d14" : "bowser_act_walk_to_mario", - "802b4f00" : "bowser_act_teleport", - "802b5104" : "bowser_act_spit_fire_into_sky", - "802b5218" : "bowser_act_hit_mine", - "802b53f4" : "bowser_set_anim_in_air", - "802b5444" : "bowser_land", - "802b5554" : "bowser_short_second_hop", - "802b55cc" : "bowser_act_jump", - "802b5798" : "bowser_act_jump_towards_mario", - "802b58bc" : "bowser_act_hit_edge", - "802b59cc" : "bowser_act_spit_fire_onto_floor", - "802b5aec" : "bowser_turn_on_timer", - "802b5c00" : "bowser_act_turn_from_edge", - "802b5c40" : "bowser_act_charge_mario", - "802b5f6c" : "bowser_check_hit_mine", - "802b5fec" : "bowser_act_thrown_dropped", - "802b611c" : "bowser_set_goal_invisible", - "802b6190" : "bowser_act_jump_onto_stage", - "802b6568" : "bowser_act_dance", - "802b65d0" : "bowser_spawn_grand_star_key", - "802b6670" : "bowser_fly_back_dead", - "802b6730" : "bowser_dead_bounce", - "802b67d4" : "bowser_dead_wait_for_mario", - "802b6878" : "bowser_dead_twirl_into_trophy", - "802b6a10" : "bowser_dead_hide", - "802b6a78" : "bowser_dead_not_bits_end", - "802b6bac" : "bowser_dead_bits_end", - "802b6cf0" : "bowser_act_dead", - "802b6e40" : "bowser_tilt_platform", - "802b6ee0" : "bowser_act_ride_tilting_platform", - "802b711c" : "bowser_check_fallen_off_stage", - "802b71e4" : "bowser_free_update", - "802b72d4" : "bowser_held_update", - "802b7418" : "bowser_thrown_dropped_update", - "802b75a4" : "bhv_bowser_loop", - "802b7878" : "bhv_bowser_init", - "802b798c" : "geo_update_body_rot_from_parent", - "802b7a20" : "bowser_open_eye_switch", - "802b7c64" : "geo_switch_bowser_eyes", - "802b7d44" : "geo_bits_bowser_coloring", - "802b7e68" : "falling_bowser_plat_act_0", - "802b7ef0" : "falling_bowser_plat_act_1", - "802b8024" : "falling_bowser_plat_act_2", - "802b8384" : "bhv_falling_bowser_platform_loop", - "802b83b0" : "bowser_flame_despawn", - "802b8434" : "bowser_flame_should_despawn", - "802b84ac" : "bhv_flame_bowser_init", - "802b85b0" : "bhv_flame_large_burning_out_init", - "802b8654" : "bowser_flame_move", - "802b8734" : "bhv_flame_bowser_loop", - "802b8960" : "bhv_flame_moving_forward_growing_init", - "802b89ec" : "bhv_flame_moving_forward_growing_loop", - "802b8b1c" : "bhv_flame_floating_landing_init", - "802b8c38" : "bhv_flame_floating_landing_loop", - "802b8d68" : "bhv_blue_bowser_flame_init", - "802b8e7c" : "bhv_blue_bowser_flame_loop", - "802b9034" : "bhv_flame_bouncing_init", - "802b90ec" : "bhv_flame_bouncing_loop", - "802b921c" : "bhv_blue_flames_group_loop", - "802b935c" : "bhv_blue_fish_movement_loop", - "802b9790" : "bhv_tank_fish_group_loop", - "802b98d4" : "vec3f_copy_2", - "802b98fc" : "bhv_checkerboard_elevator_group_init", - "802b9a78" : "checkerboard_plat_act_move_y", - "802b9af8" : "checkerboard_plat_act_rotate", - "802b9bb4" : "bhv_checkerboard_platform_init", - "802b9bd8" : "bhv_checkerboard_platform_loop", - "802b9e94" : "bhv_ddd_warp_loop", - "802b9efc" : "water_level_pillar_undrained", - "802ba13c" : "water_level_pillar_drained", - "802ba19c" : "bhv_water_level_pillar_init", - "802ba1e0" : "bhv_water_level_pillar_loop", - "802ba25c" : "bhv_invisible_objects_under_bridge_init", - "802ba2b0" : "geo_scale_bowser_key", - "802ba2f8" : "bhv_bowser_key_unlock_door_loop", - "802ba458" : "bhv_bowser_key_course_exit_loop", - "802ba5bc" : "bhv_moat_grills_loop", - "802ba608" : "bhv_rotating_clock_arm_loop", - "802ba7e0" : "handle_hat_ukiki_reset", - "802ba868" : "is_hat_ukiki_and_mario_has_hat", - "802ba8c4" : "geo_update_projectile_pos_from_parent_copy", - "802ba958" : "idle_ukiki_taunt", - "802bab7c" : "ukiki_act_idle", - "802bae40" : "ukiki_act_return_home", - "802baec4" : "ukiki_act_wait_to_respawn", - "802baf10" : "ukiki_act_unused_turn", - "802baf64" : "ukiki_act_turn_to_mario", - "802bb07c" : "ukiki_act_run", - "802bb288" : "ukiki_act_jump", - "802bb3b8" : "ukiki_act_go_to_cage", - "802bb798" : "ukiki_free_loop", - "802bb888" : "cage_ukiki_held_loop", - "802bba3c" : "hat_ukiki_held_loop", - "802bbb98" : "bhv_ukiki_init", - "802bbc0c" : "bhv_ukiki_loop", - "802bbd6c" : "lll_octagonal_mesh_move", - "802bbfd8" : "lll_octagonal_mesh_find_y_offset", - "802bc0f0" : "bhv_lll_moving_octagonal_mesh_platform_loop", - "802bc22c" : "bhv_lll_sinking_rock_block_loop", - "802bc294" : "bhv_lll_rotating_hex_flame_loop", - "802bc348" : "fire_bar_spawn_flames", - "802bc4f4" : "fire_bar_act_0", - "802bc538" : "fire_bar_act_1", - "802bc590" : "fire_bar_act_2", - "802bc5fc" : "fire_bar_act_3", - "802bc618" : "bhv_lll_rotating_block_fire_bars_loop", - "802bc660" : "bhv_lll_wood_piece_loop", - "802bc728" : "bhv_lll_floating_wood_bridge_loop", - "802bc898" : "bhv_volcano_flames_loop", - "802bc934" : "hexagonal_ring_spawn_flames", - "802bca74" : "bhv_lll_rotating_hexagonal_ring_loop", - "802bcce8" : "sinking_rectangular_plat_actions", - "802bcda8" : "bhv_lll_sinking_rectangular_platform_loop", - "802bce58" : "bhv_lll_sinking_square_platforms_loop", - "802bce9c" : "create_transform_from_normals", - "802bcf40" : "bhv_platform_normals_init", - "802bcfc4" : "approach_by_increment", - "802bd058" : "bhv_tilting_inverted_pyramid_loop", - "802bd3e4" : "koopa_shell_spawn_water_drop", - "802bd488" : "bhv_koopa_shell_flame_loop", - "802bd5dc" : "bhv_koopa_shell_flame_spawn", - "802bd62c" : "koopa_shell_spawn_sparkles", - "802bd680" : "bhv_koopa_shell_loop", - "802bd8d0" : "tox_box_shake_screen", - "802bd91c" : "tox_box_move", - "802bdb04" : "tox_box_act_4", - "802bdb3c" : "tox_box_act_5", - "802bdb74" : "tox_box_act_6", - "802bdbac" : "tox_box_act_7", - "802bdbe4" : "tox_box_act_1", - "802bdc7c" : "tox_box_act_2", - "802bdcc8" : "tox_box_act_3", - "802bdd14" : "tox_box_act_0", - "802bdd68" : "bhv_tox_box_loop", - "802bdd9c" : "piranha_plant_act_idle", - "802bde10" : "piranha_plant_check_interactions", - "802bdeec" : "piranha_plant_act_sleeping", - "802be034" : "piranha_plant_act_woken_up", - "802be0b8" : "piranha_plant_reset_when_far", - "802be0ec" : "piranha_plant_attacked", - "802be150" : "piranha_plant_act_shrink_and_die", - "802be234" : "piranha_plant_act_wait_to_respawn", - "802be278" : "piranha_plant_act_respawn", - "802be350" : "piranha_plant_act_biting", - "802be49c" : "mario_moving_fast_enough_to_make_piranha_plant_bite", - "802be50c" : "piranha_plant_act_stopped_biting", - "802be5a0" : "bhv_piranha_plant_loop", - "802be628" : "bhv_lll_bowser_puzzle_spawn_piece", - "802be6d4" : "bhv_lll_bowser_puzzle_spawn_pieces", - "802be79c" : "bhv_lll_bowser_puzzle_loop", - "802be8a8" : "bhv_lll_bowser_puzzle_piece_action_0", - "802be8b8" : "bhv_lll_bowser_puzzle_piece_action_1", - "802be8f4" : "bhv_lll_bowser_puzzle_piece_update", - "802be9dc" : "bhv_lll_bowser_puzzle_piece_move", - "802beb14" : "bhv_lll_bowser_puzzle_piece_idle", - "802beb54" : "bhv_lll_bowser_puzzle_piece_move_left", - "802beb8c" : "bhv_lll_bowser_puzzle_piece_move_right", - "802bebc4" : "bhv_lll_bowser_puzzle_piece_move_up", - "802bebfc" : "bhv_lll_bowser_puzzle_piece_move_down", - "802bec34" : "bhv_lll_bowser_puzzle_piece_loop", - "802becb0" : "set_obj_anim_with_accel_and_sound", - "802bed7c" : "play_penguin_walking_sound", - "802bedec" : "tuxies_mother_act_2", - "802bef8c" : "tuxies_mother_act_1", - "802bf1d8" : "tuxies_mother_act_0", - "802bf3c0" : "bhv_tuxies_mother_loop", - "802bf424" : "small_penguin_dive_with_mario", - "802bf474" : "small_penguin_act_2", - "802bf57c" : "small_penguin_act_1", - "802bf648" : "small_penguin_act_3", - "802bf6e4" : "small_penguin_act_4", - "802bf760" : "small_penguin_act_0", - "802bf90c" : "small_penguin_act_5", - "802bfa14" : "small_penguin_free_actions", - "802bfa88" : "bhv_small_penguin_loop", - "802bfbac" : "geo_switch_tuxie_mother_eyes", - "802bfcd8" : "fish_act_spawn", - "802bfeb8" : "fish_act_respawn", - "802bff20" : "fish_act_init", - "802bff3c" : "bhv_large_fish_group_loop", - "802bff68" : "fish_regroup", - "802c00b4" : "fish_group_act_rotation", - "802c0348" : "fish_group_act_move", - "802c06a8" : "fish_group_act_animate", - "802c0768" : "bhv_fish_loop", - "802c08a8" : "bhv_wdw_express_elevator_loop", - "802c0aac" : "bub_spawner_act_0", - "802c0b50" : "bub_spawner_act_1", - "802c0ba4" : "bub_spawner_act_2", - "802c0bc4" : "bub_spawner_act_3", - "802c0be0" : "bhv_bub_spawner_loop", - "802c0c0c" : "bub_move_vertically", - "802c0cd4" : "bub_act_0", - "802c0d44" : "bub_act_1", - "802c0f90" : "bub_act_2", - "802c1204" : "bhv_bub_loop", - "802c12c0" : "bhv_rotating_exclamation_box_loop", - "802c1308" : "exclamation_box_act_0", - "802c13ec" : "exclamation_box_act_1", - "802c14b0" : "exclamation_box_act_2", - "802c15b8" : "exclamation_box_act_3", - "802c17bc" : "exclamation_box_spawn_contents", - "802c18d0" : "exclamation_box_act_4", - "802c1988" : "exclamation_box_act_5", - "802c19c0" : "bhv_exclamation_box_loop", - "802c19fc" : "bhv_sound_spawner_init", - "802c1a40" : "bhv_bowsers_sub_loop", - "802c1a80" : "bhv_sushi_shark_collision_loop", - "802c1a90" : "bhv_sushi_shark_loop", - "802c1c44" : "bhv_sunken_ship_part_loop", - "802c1cd4" : "bhv_ship_part_3_loop", - "802c1e10" : "bhv_jrb_sliding_box_loop", - "802c2190" : "bhv_white_puff_1_loop", - "802c2274" : "bhv_white_puff_2_loop", - "802c22b8" : "bhv_hidden_blue_coin_loop", - "802c242c" : "bhv_blue_coin_switch_loop", - "802c263c" : "bhv_openable_cage_door_loop", - "802c26f8" : "bhv_openable_grill_loop", - "802c2930" : "bhv_init_changing_water_level_loop", - "802c2a24" : "bhv_water_level_diamond_loop", - "802c2ce8" : "tweester_scale_and_move", - "802c2ebc" : "tweester_act_idle", - "802c2fbc" : "tweester_act_chase", - "802c31c4" : "tweester_act_hide", - "802c329c" : "bhv_tweester_loop", - "802c32e8" : "bhv_tweester_sand_particle_loop", - "802c3440" : "bhv_boo_init", - "802c3684" : "bhv_courtyard_boo_triplet_init", - "802c4824" : "bhv_boo_loop", - "802c4f30" : "bhv_big_boo_loop", - "802c515c" : "bhv_boo_with_cage_init", - "802c51d4" : "bhv_boo_with_cage_loop", - "802c5224" : "bhv_merry_go_round_boo_manager_loop", - "802c53cc" : "obj_set_secondary_camera_focus", - "802c53ec" : "bhv_animated_texture_loop", - "802c5414" : "bhv_boo_in_castle_loop", - "802c5688" : "bhv_boo_boss_spawned_bridge_loop", - "802c5890" : "bhv_bbh_tilting_trap_platform_loop", - "802c5a38" : "bhv_haunted_bookshelf_loop", - "802c5ca8" : "bhv_merry_go_round_loop", - "802c5dc0" : "bhv_static_checkered_platform_loop", - "802c5f48" : "bhv_beta_bowser_anchor_loop", - "802c5fdc" : "bhv_play_music_track_when_touched_loop", - "802c6050" : "bhv_floor_trap_in_castle_loop", - "802c60ac" : "bhv_castle_floor_trap_init", - "802c6150" : "bhv_castle_floor_trap_open_detect", - "802c61d4" : "bhv_castle_floor_trap_open", - "802c6278" : "bhv_castle_floor_trap_close_detect", - "802c62bc" : "bhv_castle_floor_trap_close", - "802c6328" : "bhv_castle_floor_trap_rotate", - "802c6348" : "bhv_castle_floor_trap_loop", - "802c63e8" : "bhv_pole_base_loop", - "802c64a4" : "bhv_sparkle_spawn_loop", - "802c6538" : "update_angle_from_move_flags", - "802c65c0" : "bhv_scuttlebug_loop", - "802c6b6c" : "bhv_scuttlebug_spawn_loop", - "802c6ca0" : "whomp_play_sfx_from_pound_animation", - "802c6d6c" : "whomp_act_0", - "802c6ec8" : "whomp_act_7", - "802c6fb0" : "whomp_act_1", - "802c710c" : "whomp_act_2", - "802c7254" : "whomp_act_3", - "802c72b4" : "whomp_act_4", - "802c7380" : "whomp_act_5", - "802c7428" : "king_whomp_on_ground", - "802c75fc" : "whomp_on_ground", - "802c76d4" : "whomp_act_6", - "802c7858" : "whomp_act_8", - "802c7998" : "whomp_act_9", - "802c79d8" : "bhv_whomp_loop", - "802c7a70" : "bhv_water_splash_spawn_droplets", - "802c7b14" : "bhv_water_droplet_loop", - "802c7cac" : "bhv_idle_water_wave_loop", - "802c7d40" : "bhv_water_droplet_splash_init", - "802c7d90" : "bhv_bubble_splash_init", - "802c7dfc" : "bhv_shallow_water_splash_init", - "802c7e5c" : "bhv_wave_trail_shrink", - "802c7f98" : "bhv_strong_wind_particle_loop", - "802c81b4" : "cur_obj_spawn_strong_wind_particles", - "802c834c" : "bhv_sl_snowman_wind_loop", - "802c863c" : "bhv_sl_walking_penguin_loop", - "802c89f0" : "update_mario_platform", - "802c8b4c" : "get_mario_pos", - "802c8b8c" : "set_mario_pos", - "802c8bc8" : "apply_platform_displacement", - "802c8ec0" : "apply_mario_platform_displacement", - "802c8f28" : "clear_mario_platform", - "802c8f40" : "debug_print_obj_collision", - "802c8fe4" : "detect_object_hitbox_overlap", - "802c91ec" : "detect_object_hurtbox_overlap", - "802c9388" : "clear_object_collision", - "802c93f8" : "check_collision_in_list", - "802c94ac" : "check_player_object_collision", - "802c95b4" : "check_pushable_object_collision", - "802c9630" : "check_destructive_object_collision", - "802c9724" : "detect_object_collisions", - "802c97d0" : "unused_init_free_list", - "802c9840" : "unused_try_allocate", - "802c98a4" : "try_allocate_object", - "802c9950" : "unused_deallocate", - "802c99b8" : "init_free_object_list", - "802c9a3c" : "clear_object_lists", - "802c9b68" : "unload_object", - "802c9c00" : "allocate_object", - "802c9f04" : "create_object", - "802ca028" : "mark_obj_for_deletion", - "802ca040" : "exec_anim_sound_state", - "802ca144" : "create_sound_spawner", - "802ca190" : "cur_obj_play_sound_1", - "802ca1e0" : "cur_obj_play_sound_2", - "802ca230" : "calc_dist_to_volume_range_1", - "802ca2d4" : "calc_dist_to_volume_range_2", - "802ca370" : "stub_debug_1", - "802ca380" : "stub_debug_2", - "802ca390" : "stub_debug_3", - "802ca3a0" : "stub_debug_4", - "802ca3b0" : "get_current_clock", - "802ca3e0" : "get_clock_difference", - "802ca418" : "set_print_state_info", - "802ca460" : "print_text_array_info", - "802ca51c" : "set_text_array_x_y", - "802ca568" : "print_debug_bottom_up", - "802ca5b8" : "print_debug_top_down_objectinfo", - "802ca618" : "print_debug_top_down_mapinfo", - "802ca680" : "print_debug_top_down_normal", - "802ca6d0" : "print_mapinfo", - "802ca8e8" : "print_checkinfo", - "802ca918" : "print_surfaceinfo", - "802ca94c" : "print_stageinfo", - "802ca990" : "print_string_array_info", - "802caa6c" : "print_effectinfo", - "802caaa8" : "print_enemyinfo", - "802caae4" : "update_debug_dpadmask", - "802cabac" : "debug_unknown_level_select_check", - "802cac20" : "reset_debug_objectinfo", - "802cb0b0" : "stub_debug_5", - "802cb0c0" : "try_print_debug_mario_object_info", - "802cb1c0" : "try_print_debug_mario_level_info", - "802cb264" : "try_do_mario_debug_object_spawn", - "802cb564" : "debug_enemy_unknown", - "802cb5c0" : "set_and_reset_transition_fade_timer", - "802cb640" : "set_transition_color_fade_alpha", - "802cb894" : "vertex_transition_color", - "802cba18" : "dl_transition_color", - "802cbbc4" : "render_fade_transition_from_color", - "802cbc20" : "render_fade_transition_into_color", - "802cbc7c" : "calc_tex_transition_radius", - "802cbd54" : "calc_tex_transition_time", - "802cbe64" : "convert_tex_transition_angle_to_pos", - "802cbee0" : "center_tex_transition_x", - "802cbf64" : "center_tex_transition_y", - "802cbfe8" : "make_tex_transition_vertex", - "802cc180" : "load_tex_transition_vertex", - "802cc4d8" : "render_textured_transition", - "802ccbe8" : "render_screen_transition", - "802ccdc8" : "render_cannon_circle_base", - "802cd1e8" : "geo_cannon_circle_base", - "802cd280" : "rotate_rectangle", - "802cd328" : "atan2_deg", - "802cd388" : "scale_shadow_with_distance", - "802cd444" : "disable_shadow_with_distance", - "802cd48c" : "dim_shadow_with_distance", - "802cd614" : "get_water_level_below_shadow", - "802cd6c4" : "init_shadow", - "802cd938" : "get_texture_coords_9_vertices", - "802cd988" : "get_texture_coords_4_vertices", - "802cd9ec" : "make_shadow_vertex_at_xyz", - "802cdb20" : "extrapolate_vertex_y_position", - "802cdb74" : "get_vertex_coords", - "802cdc40" : "calculate_vertex_xyz", - "802cde94" : "floor_local_tilt", - "802cdf3c" : "make_shadow_vertex", - "802ce128" : "add_shadow_to_display_list", - "802ce2bc" : "linearly_interpolate_solidity_positive", - "802ce3ec" : "linearly_interpolate_solidity_negative", - "802ce524" : "correct_shadow_solidity_for_animations", - "802ce690" : "correct_lava_shadow_height", - "802ce79c" : "create_shadow_player", - "802ce9d0" : "create_shadow_circle_9_verts", - "802ceae8" : "create_shadow_circle_4_verts", - "802cec04" : "create_shadow_circle_assuming_flat_ground", - "802cedc0" : "create_shadow_rectangle", - "802cef6c" : "get_shadow_height_solidity", - "802cf080" : "create_shadow_square", - "802cf1f0" : "create_shadow_hardcoded_rectangle", - "802cf34c" : "create_shadow_below_xyz", - "802cf5b0" : "calculate_skybox_scaled_x", - "802cf69c" : "calculate_skybox_scaled_y", - "802cf804" : "make_skybox_rect", - "802cfa2c" : "draw_skybox_tile_grid", - "802cfc68" : "create_skybox_ortho_matrix", - "802cfd88" : "init_skybox_display_list", - "802cfef4" : "create_skybox_facing_camera", - "802d0080" : "geo_wdw_set_initial_water_level", - "802d01e0" : "geo_movtex_pause_control", - "802d0254" : "movtex_make_quad_vertex", - "802d0484" : "movtex_gen_from_quad", - "802d0a84" : "movtex_gen_from_quad_array", - "802d0bb0" : "movtex_gen_quads_id", - "802d0c84" : "get_quad_collection_from_id", - "802d0f28" : "movtex_change_texture_format", - "802d104c" : "geo_movtex_draw_water_regions", - "802d1330" : "update_moving_texture_offset", - "802d13cc" : "movtex_write_vertex_first", - "802d1574" : "movtex_write_vertex_index", - "802d18b4" : "movtex_gen_list", - "802d1b70" : "geo_movtex_draw_nocolor", - "802d1cdc" : "geo_movtex_draw_colored", - "802d1e48" : "geo_movtex_draw_colored_no_update", - "802d1fa8" : "geo_movtex_draw_colored_2_no_update", - "802d2108" : "geo_movtex_update_horizontal", - "802d2210" : "make_vertex", - "802d22c4" : "round_float", - "802d2360" : "geo_exec_inside_castle_light", - "802d2470" : "geo_exec_flying_carpet_timer_update", - "802d2520" : "geo_exec_flying_carpet_create", - "802d28cc" : "geo_exec_cake_end_screen", - "802d29c0" : "stop_other_paintings", - "802d2a74" : "painting_mario_y", - "802d2b08" : "painting_mario_z", - "802d2b84" : "painting_ripple_y", - "802d2c40" : "painting_nearest_4th", - "802d2d80" : "painting_mario_x", - "802d2dfc" : "painting_ripple_x", - "802d2eb8" : "painting_state", - "802d2ffc" : "wall_painting_proximity_idle", - "802d319c" : "wall_painting_proximity_rippling", - "802d327c" : "wall_painting_continuous_idle", - "802d341c" : "wall_painting_continuous_rippling", - "802d34fc" : "floor_painting_proximity_idle", - "802d36ac" : "floor_painting_proximity_rippling", - "802d379c" : "floor_painting_continuous_idle", - "802d393c" : "floor_painting_continuous_rippling", - "802d3a2c" : "painting_update_floors", - "802d3bec" : "painting_update_ripple_state", - "802d3cec" : "calculate_ripple_at_point", - "802d3e6c" : "ripple_if_movable", - "802d3ee4" : "painting_generate_mesh", - "802d404c" : "painting_calculate_triangle_normals", - "802d43f8" : "normalize_component", - "802d44bc" : "painting_average_vertex_normals", - "802d47d0" : "render_painting", - "802d4edc" : "painting_model_view_transform", - "802d50dc" : "painting_ripple_image", - "802d5354" : "painting_ripple_env_mapped", - "802d556c" : "display_painting_rippling", - "802d568c" : "display_painting_not_rippling", - "802d5778" : "reset_painting", - "802d57a8" : "move_ddd_painting", - "802d58e4" : "set_painting_layer", - "802d593c" : "display_painting", - "802d59a8" : "wall_painting_update", - "802d5aa0" : "floor_painting_update", - "802d5b98" : "geo_painting_draw", - "802d5d0c" : "geo_painting_update", - "802d5e00" : "int_pow", - "802d5e54" : "format_integer", - "802d6144" : "parse_width_field", - "802d62d8" : "print_text_fmt_int", - "802d6554" : "print_text", - "802d66c0" : "print_text_centered", - "802d6858" : "char_to_glyph_index", - "802d69f8" : "add_glyph_texture", - "802d6acc" : "clip_to_bounds", - "802d6b3c" : "render_textrect", - "802d6c88" : "render_text_labels", - "802d6f20" : "create_dl_identity_matrix", - "802d7070" : "create_dl_translation_matrix", - "802d7174" : "create_dl_rotation_matrix", - "802d7280" : "create_dl_scale_matrix", - "802d7384" : "create_dl_ortho_matrix", - "802d75dc" : "render_generic_char", - "802d76c8" : "render_multi_text_string", - "802d77dc" : "print_generic_string", - "802d7b84" : "print_hud_lut_string", - "802d7e88" : "print_menu_generic_string", - "802d82d4" : "print_credits_string", - "802d862c" : "handle_menu_scrolling", - "802d8844" : "get_str_x_pos_from_center", - "802d8934" : "get_string_width", - "802d89b8" : "print_hud_my_score_coins", - "802d8a80" : "print_hud_my_score_stars", - "802d8b34" : "int_to_str", - "802d8c6c" : "get_dialog_id", - "802d8c88" : "create_dialog_box", - "802d8cc4" : "create_dialog_box_with_var", - "802d8d08" : "create_dialog_inverted_box", - "802d8d48" : "create_dialog_box_with_response", - "802d8d90" : "reset_dialog_render_state", - "802d8e2c" : "render_dialog_box_type", - "802d9148" : "change_and_flash_dialog_text_color_lines", - "802d9388" : "handle_dialog_scroll_page_state", - "802d944c" : "render_star_count_dialog_text", - "802d9634" : "render_multi_text_string_lines", - "802d9800" : "ensure_nonnegative", - "802d982c" : "handle_dialog_text_and_pages", - "802d9cb0" : "render_dialog_triangle_choice", - "802d9dfc" : "render_dialog_string_color", - "802d9f84" : "handle_special_dialog_text", - "802da1ac" : "render_dialog_entries", - "802da810" : "set_menu_mode", - "802da844" : "reset_cutscene_msg_fade", - "802da85c" : "dl_rgba16_begin_cutscene_msg_fade", - "802da8e4" : "dl_rgba16_stop_cutscene_msg_fade", - "802da964" : "ascii_to_credits_char", - "802daa34" : "print_credits_str_ascii", - "802daae4" : "set_cutscene_message", - "802dab58" : "do_cutscene_handler", - "802dad54" : "print_peach_letter_message", - "802db08c" : "render_hud_cannon_reticle", - "802db350" : "reset_red_coins_collected", - "802db368" : "change_dialog_camera_angle", - "802db3b8" : "shade_screen", - "802db498" : "print_animated_red_coin", - "802db6e8" : "render_pause_red_coins", - "802db760" : "render_pause_my_score_coins", - "802dbb24" : "render_pause_camera_options", - "802dbe68" : "render_pause_course_options", - "802dc15c" : "render_pause_castle_menu_box", - "802dc418" : "highlight_last_course_complete_stars", - "802dc478" : "print_hud_pause_colorful_str", - "802dc570" : "render_pause_castle_course_stars", - "802dc718" : "render_pause_castle_main_strings", - "802dca88" : "render_pause_courses_and_castle", - "802dcd04" : "print_hud_course_complete_string", - "802dcf30" : "print_hud_course_complete_coins", - "802dd194" : "play_star_fanfare_and_flash_hud", - "802dd210" : "render_course_complete_lvl_info_and_hud_str", - "802dd838" : "render_save_confirmation", - "802ddae0" : "render_course_complete_screen", - "802ddca4" : "render_menus_and_dialogs", - "802dddf0" : "envfx_init_snow", - "802ddf38" : "envfx_update_snowflake_count", - "802de0bc" : "envfx_cleanup_snow", - "802de114" : "orbit_from_positions", - "802de23c" : "pos_from_orbit", - "802de360" : "envfx_is_snowflake_alive", - "802de458" : "envfx_update_snow_normal", - "802de888" : "envfx_update_snow_blizzard", - "802ded38" : "envfx_update_snow_water", - "802def2c" : "rotate_triangle_vertices", - "802df334" : "append_snowflake_vertex_buffer", - "802df748" : "envfx_update_snow", - "802dfbc8" : "envfx_update_particles", - "802dfd50" : "particle_is_laterally_close", - "802dfe00" : "random_flower_offset", - "802dfe80" : "envfx_update_flower", - "802e0120" : "envfx_set_lava_bubble_position", - "802e048c" : "envfx_update_lava", - "802e065c" : "envfx_rotate_around_whirlpool", - "802e08a8" : "envfx_is_whirlpool_bubble_alive", - "802e0934" : "envfx_update_whirlpool", - "802e0e24" : "envfx_is_jestream_bubble_alive", - "802e0eb8" : "envfx_update_jetstream", - "802e1238" : "envfx_init_bubble", - "802e1414" : "envfx_bubbles_update_switch", - "802e1618" : "append_bubble_vertex_buffer", - "802e1a20" : "envfx_set_bubble_texture", - "802e1bb8" : "envfx_update_bubble_particles", - "802e1ed8" : "envfx_set_max_bubble_particles", - "802e1f48" : "envfx_update_bubbles", - "802e20a0" : "convert_rotation", - "802e2134" : "spawn_macro_abs_yrot_2params", - "802e21dc" : "spawn_macro_abs_yrot_param1", - "802e2284" : "spawn_macro_abs_special", - "802e2414" : "spawn_macro_objects", - "802e2690" : "spawn_macro_objects_hardcoded", - "802e28ec" : "spawn_special_objects", - "802e2cf0" : "render_hud_tex_lut", - "802e2e58" : "render_hud_small_tex_lut", - "802e30b4" : "render_power_meter_health_segment", - "802e3214" : "render_dl_power_meter", - "802e33b8" : "animate_power_meter_emphasized", - "802e352c" : "handle_power_meter_actions", - "802e3654" : "render_hud_power_meter", - "802e3744" : "render_hud_mario_lives", - "802e37a8" : "render_hud_coins", - "802e380c" : "render_hud_stars", - "802e38e4" : "render_hud_keys", - "802e395c" : "render_hud_timer", - "802e3b1c" : "set_hud_camera_status", - "802e3b3c" : "render_hud_camera_status", - "802e3d2c" : "render_hud", - "802e3e50" : "set_yoshi_as_not_dead", - "802e3e68" : "geo_obj_transparency_something", - "802e3f68" : "absf_2", - "802e3fac" : "turn_obj_away_from_surface", - "802e405c" : "obj_find_wall", - "802e41a4" : "turn_obj_away_from_steep_floor", - "802e42e0" : "obj_orient_graph", - "802e43e4" : "calc_obj_friction", - "802e445c" : "calc_new_obj_vel_and_pos_y", - "802e4814" : "calc_new_obj_vel_and_pos_y_underwater", - "802e4cec" : "obj_update_pos_vel_xz", - "802e4d88" : "obj_splash", - "802e4e90" : "object_step", - "802e5114" : "object_step_without_floor_orient", - "802e5160" : "obj_move_xyz_using_fvel_and_yaw", - "802e5208" : "is_point_within_radius_of_mario", - "802e52b8" : "is_point_close_to_object", - "802e5360" : "set_object_visibility", - "802e53f4" : "obj_return_home_if_safe", - "802e54b0" : "obj_return_and_displace_home", - "802e55d0" : "obj_check_if_facing_toward_angle", - "802e569c" : "obj_find_wall_displacement", - "802e5760" : "obj_spawn_yellow_coins", - "802e5824" : "obj_flicker_and_disappear", - "802e58b4" : "current_mario_room_check", - "802e5948" : "trigger_obj_dialog_when_facing", - "802e5a80" : "obj_check_floor_death", - "802e5b18" : "obj_lava_death", - "802e5c6c" : "spawn_orange_number", - "802e5d04" : "debug_sequence_tracker", - "802e5de8" : "coin_step", - "802e5e6c" : "moving_coin_flicker", - "802e5ea4" : "coin_collected", - "802e5ee8" : "bhv_moving_yellow_coin_init", - "802e5f64" : "bhv_moving_yellow_coin_loop", - "802e6098" : "bhv_moving_blue_coin_init", - "802e6114" : "bhv_moving_blue_coin_loop", - "802e62a4" : "bhv_blue_coin_sliding_jumping_init", - "802e631c" : "blue_coin_sliding_away_from_mario", - "802e63ec" : "blue_coin_sliding_slow_down", - "802e6474" : "bhv_blue_coin_sliding_loop", - "802e6628" : "bhv_blue_coin_jumping_loop", - "802e6790" : "bhv_seaweed_init", - "802e67dc" : "bhv_seaweed_bundle_init", - "802e6a2c" : "bhv_bobomb_init", - "802e6a8c" : "bobomb_spawn_coin", - "802e6af8" : "bobomb_act_explode", - "802e6bd4" : "bobomb_check_interactions", - "802e6cf0" : "bobomb_act_patrol", - "802e6dc8" : "bobomb_act_chase_mario", - "802e6e84" : "bobomb_act_launched", - "802e6ed8" : "generic_bobomb_free_loop", - "802e7020" : "stationary_bobomb_free_loop", - "802e7134" : "bobomb_free_loop", - "802e7180" : "bobomb_held_loop", - "802e7220" : "bobomb_dropped_loop", - "802e7280" : "bobomb_thrown_loop", - "802e7324" : "curr_obj_random_blink", - "802e742c" : "bhv_bobomb_loop", - "802e75a0" : "bhv_bobomb_fuse_smoke_init", - "802e76ac" : "bhv_bobomb_buddy_init", - "802e770c" : "bobomb_buddy_act_idle", - "802e7814" : "bobomb_buddy_cannon_dialog", - "802e79dc" : "bobomb_buddy_act_talk", - "802e7b00" : "bobomb_buddy_act_turn_to_talk", - "802e7bb0" : "bobomb_buddy_actions", - "802e7c4c" : "bhv_bobomb_buddy_loop", - "802e7c90" : "bhv_cannon_closed_init", - "802e7d4c" : "cannon_door_act_opening", - "802e7e54" : "bhv_cannon_closed_loop", - "802e7f70" : "bhv_whirlpool_init", - "802e7fb8" : "whirlpool_set_hitbox", - "802e7fec" : "whirpool_orient_graph", - "802e80dc" : "bhv_whirlpool_loop", - "802e82b0" : "bhv_jet_stream_loop", - "802e8388" : "bhv_homing_amp_init", - "802e89d4" : "bhv_homing_amp_loop", - "802e8ae4" : "bhv_circling_amp_init", - "802e8ecc" : "bhv_circling_amp_loop", - "802e8f68" : "bhv_butterfly_init", - "802e9018" : "butterfly_step", - "802e9278" : "butterfly_calculate_angle", - "802e9470" : "butterfly_act_rest", - "802e94e4" : "butterfly_act_follow_mario", - "802e9548" : "butterfly_act_return_home", - "802e96c8" : "bhv_butterfly_loop", - "802e9764" : "bhv_hoot_init", - "802e97fc" : "hoot_find_next_floor", - "802e98c0" : "hoot_floor_bounce", - "802e9a4c" : "hoot_free_step", - "802e9cf4" : "hoot_player_set_yaw", - "802e9d98" : "hoot_carry_step", - "802e9f60" : "hoot_surface_collision", - "802ea144" : "hoot_act_ascent", - "802ea258" : "hoot_action_loop", - "802ea3f0" : "hoot_turn_to_home", - "802ea4ec" : "hoot_awake_loop", - "802ea588" : "bhv_hoot_loop", - "802ea6a8" : "bhv_beta_holdable_object_init", - "802ea7e0" : "bhv_beta_holdable_object_loop", - "802ea888" : "bhv_object_bubble_init", - "802ea934" : "bhv_object_bubble_loop", - "802eaa10" : "bhv_object_water_wave_init", - "802eaa50" : "bhv_object_water_wave_loop", - "802eaa8c" : "bhv_explosion_init", - "802eaad0" : "bhv_explosion_loop", - "802eabf0" : "bhv_bobomb_bully_death_smoke_init", - "802eac3c" : "bhv_bobomb_explosion_bubble_init", - "802ead3c" : "bhv_bobomb_explosion_bubble_loop", - "802eaef8" : "bhv_respawner_loop", - "802eaf84" : "create_respawner", - "802eb05c" : "bhv_small_bully_init", - "802eb104" : "bhv_big_bully_init", - "802eb1c0" : "bully_check_mario_collision", - "802eb288" : "bully_act_chase_mario", - "802eb3f0" : "bully_act_knockback", - "802eb510" : "bully_act_back_up", - "802eb5c4" : "bully_backup_check", - "802eb630" : "bully_play_stomping_sound", - "802eb744" : "bully_step", - "802eb7e0" : "bully_spawn_coin", - "802eb8b0" : "bully_act_level_death", - "802eb9d0" : "bhv_bully_loop", - "802ebb74" : "big_bully_spawn_minion", - "802ebc00" : "bhv_big_bully_with_minions_init", - "802ebc88" : "big_bully_spawn_star", - "802ebce0" : "bhv_big_bully_with_minions_loop", - "802ebf70" : "water_ring_calc_mario_dist", - "802ec030" : "water_ring_init", - "802ec1b0" : "bhv_jet_stream_water_ring_init", - "802ec200" : "water_ring_check_collection", - "802ec3d0" : "water_ring_set_scale", - "802ec4e0" : "water_ring_act_collected", - "802ec59c" : "water_ring_act_not_collected", - "802ec75c" : "bhv_jet_stream_water_ring_loop", - "802ec7cc" : "spawn_manta_ray_ring_manager", - "802ec818" : "water_ring_spawner_act_inactive", - "802ec908" : "bhv_jet_stream_ring_spawner_loop", - "802ec9b8" : "bhv_manta_ray_water_ring_init", - "802ec9f0" : "manta_water_ring_act_not_collected", - "802ecba4" : "bhv_manta_ray_water_ring_loop", - "802ecc14" : "bhv_bowser_bomb_loop", - "802ecd0c" : "bhv_bowser_bomb_explosion_loop", - "802ecea0" : "bhv_bowser_bomb_smoke_loop", - "802ecfac" : "bhv_celebration_star_init", - "802ed10c" : "celeb_star_act_spin_around_mario", - "802ed28c" : "celeb_star_act_face_camera", - "802ed39c" : "bhv_celebration_star_loop", - "802ed40c" : "bhv_celebration_star_sparkle_loop", - "802ed45c" : "bhv_star_key_collection_puff_spawner_loop", - "802ed498" : "bhv_lll_drawbridge_spawner_loop", - "802ed62c" : "bhv_lll_drawbridge_loop", - "802ed78c" : "bhv_small_bomp_init", - "802ed7fc" : "bhv_small_bomp_loop", - "802edacc" : "bhv_large_bomp_init", - "802edb2c" : "bhv_large_bomp_loop", - "802eddfc" : "bhv_wf_sliding_platform_init", - "802edf28" : "bhv_wf_sliding_platform_loop", - "802ee124" : "bhv_moneybag_init", - "802ee1a0" : "moneybag_check_mario_collision", - "802ee268" : "moneybag_jump", - "802ee46c" : "moneybag_act_move_around", - "802ee598" : "moneybag_act_return_home", - "802ee728" : "moneybag_act_disappear", - "802ee778" : "moneybag_act_death", - "802ee7e0" : "bhv_moneybag_loop", - "802ee8f4" : "bhv_moneybag_hidden_loop", - "802ee9cc" : "bhv_bowling_ball_init", - "802eea24" : "bowling_ball_set_hitbox", - "802eea7c" : "bowling_ball_set_waypoints", - "802eeb64" : "bhv_bowling_ball_roll_loop", - "802eecb8" : "bhv_bowling_ball_initializeLoop", - "802eedf0" : "bhv_bowling_ball_loop", - "802eeeb4" : "bhv_generic_bowling_ball_spawner_init", - "802eef9c" : "bhv_generic_bowling_ball_spawner_loop", - "802ef0e8" : "bhv_thi_bowling_ball_spawner_loop", - "802ef21c" : "bhv_bob_pit_bowling_ball_init", - "802ef274" : "bhv_bob_pit_bowling_ball_loop", - "802ef34c" : "bhv_free_bowling_ball_init", - "802ef3f4" : "bhv_free_bowling_ball_roll_loop", - "802ef524" : "bhv_free_bowling_ball_loop", - "802ef63c" : "bhv_rr_cruiser_wing_init", - "802ef66c" : "bhv_rr_cruiser_wing_loop", - "802ef820" : "bhv_spindel_init", - "802ef858" : "bhv_spindel_loop", - "802efcd0" : "bhv_ssl_moving_pyramid_wall_init", - "802efd8c" : "bhv_ssl_moving_pyramid_wall_loop", - "802efe64" : "bhv_pyramid_elevator_init", - "802efef4" : "bhv_pyramid_elevator_loop", - "802f0104" : "bhv_pyramid_elevator_trajectory_marker_ball_loop", - "802f0168" : "bhv_pyramid_top_init", - "802f0288" : "bhv_pyramid_top_spinning", - "802f04a0" : "bhv_pyramid_top_explode", - "802f05b4" : "bhv_pyramid_top_loop", - "802f06a8" : "bhv_pyramid_top_fragment_init", - "802f0714" : "bhv_pyramid_top_fragment_loop", - "802f0788" : "bhv_pyramid_pillar_touch_detector_loop", - "802f07f4" : "bhv_waterfall_sound_loop", - "802f0820" : "bhv_volcano_sound_loop", - "802f084c" : "bhv_castle_flag_init", - "802f0898" : "bhv_birds_sound_loop", - "802f0950" : "bhv_ambient_sounds_init", - "802f09a4" : "bhv_sand_sound_loop", - "802f09f0" : "bhv_castle_cannon_grate_init", - "802f0a40" : "bhv_snowmans_bottom_init", - "802f0b7c" : "set_rolling_sphere_hitbox", - "802f0bd4" : "adjust_rolling_face_pitch", - "802f0c94" : "snowmans_bottom_act_1", - "802f0df0" : "snowmans_bottom_act_2", - "802f0fa8" : "snowmans_bottom_act_3", - "802f105c" : "bhv_snowmans_bottom_loop", - "802f120c" : "bhv_snowmans_head_init", - "802f1370" : "bhv_snowmans_head_loop", - "802f151c" : "bhv_snowmans_body_checkpoint_loop", - "802f15a8" : "bhv_big_boulder_init", - "802f162c" : "boulder_act_1", - "802f1714" : "bhv_big_boulder_loop", - "802f17f0" : "bhv_big_boulder_generator_loop", - "802f1954" : "cap_set_hitbox", - "802f19c8" : "cap_despawn", - "802f1a10" : "cap_check_quicksand", - "802f1bb8" : "cap_sink_quicksand", - "802f1d64" : "bhv_wing_cap_init", - "802f1dc0" : "cap_scale_vertically", - "802f1e5c" : "wing_vanish_cap_act_0", - "802f1f3c" : "bhv_wing_vanish_cap_loop", - "802f1fd0" : "bhv_metal_cap_init", - "802f2030" : "metal_cap_act_0", - "802f20ac" : "bhv_metal_cap_loop", - "802f2140" : "bhv_normal_cap_init", - "802f21e0" : "normal_cap_set_save_flags", - "802f2284" : "normal_cap_act_0", - "802f23a8" : "bhv_normal_cap_loop", - "802f2498" : "bhv_vanish_cap_init", - "802f24f4" : "bhv_collect_star_init", - "802f25b0" : "bhv_collect_star_loop", - "802f2614" : "bhv_star_spawn_init", - "802f2768" : "bhv_star_spawn_loop", - "802f2aa0" : "spawn_star", - "802f2b88" : "spawn_default_star", - "802f2bd4" : "spawn_red_coin_cutscene_star", - "802f2c24" : "spawn_no_exit_star", - "802f2c84" : "bhv_hidden_red_coin_star_init", - "802f2d8c" : "bhv_hidden_red_coin_star_loop", - "802f2e6c" : "bhv_red_coin_init", - "802f2f2c" : "bhv_red_coin_loop", - "802f3014" : "bhv_hidden_star_init", - "802f30f0" : "bhv_hidden_star_loop", - "802f31bc" : "bhv_hidden_star_trigger_loop", - "802f328c" : "bhv_bowser_course_red_coin_star_loop", - "802f336c" : "bhv_ttm_rolling_log_init", - "802f341c" : "rolling_log_roll_log", - "802f36a4" : "bhv_rolling_log_loop", - "802f38b0" : "volcano_act_1", - "802f39b4" : "volcano_act_3", - "802f3a30" : "bhv_volcano_trap_loop", - "802f3b98" : "bhv_lll_rolling_log_init", - "802f3c54" : "bhv_1up_interact", - "802f3cc8" : "bhv_1up_common_init", - "802f3d30" : "bhv_1up_init", - "802f3dd0" : "one_up_loop_in_air", - "802f3ea8" : "pole_1up_move_towards_mario", - "802f401c" : "one_up_move_away_from_mario", - "802f40cc" : "bhv_1up_walking_loop", - "802f4248" : "bhv_1up_running_away_loop", - "802f43b8" : "sliding_1up_move", - "802f44c0" : "bhv_1up_sliding_loop", - "802f45b8" : "bhv_1up_loop", - "802f45f0" : "bhv_1up_jump_on_approach_loop", - "802f4710" : "bhv_1up_hidden_loop", - "802f48f4" : "bhv_1up_hidden_trigger_loop", - "802f496c" : "bhv_1up_hidden_in_pole_loop", - "802f4b00" : "bhv_1up_hidden_in_pole_trigger_loop", - "802f4b78" : "bhv_1up_hidden_in_pole_spawner_loop", - "802f4c68" : "controllable_platform_act_1", - "802f4ce0" : "controllable_platform_act_2", - "802f4d78" : "bhv_controllable_platform_sub_loop", - "802f4eb4" : "bhv_controllable_platform_init", - "802f5010" : "controllable_platform_hit_wall", - "802f5068" : "controllable_platform_check_walls", - "802f52c0" : "controllable_platform_shake_on_wall_hit", - "802f547c" : "controllable_platform_tilt_from_mario", - "802f55a4" : "bhv_controllable_platform_loop", - "802f5cd4" : "bhv_breakable_box_small_init", - "802f5d78" : "small_breakable_box_spawn_dust", - "802f5e44" : "small_breakable_box_act_move", - "802f5f48" : "breakable_box_small_released_loop", - "802f6014" : "breakable_box_small_idle_loop", - "802f60d8" : "breakable_box_small_get_dropped", - "802f6150" : "breakable_box_small_get_thrown", - "802f6228" : "bhv_breakable_box_small_loop", - "802f62e4" : "bhv_sliding_snow_mound_loop", - "802f6448" : "bhv_snow_mound_spawn_loop", - "802f6588" : "floating_platform_find_home_y", - "802f665c" : "floating_platform_act_0", - "802f6984" : "bhv_floating_platform_loop", - "802f6c0c" : "bhv_arrow_lift_loop", - "802f6d20" : "bhv_orange_number_init", - "802f6d58" : "bhv_orange_number_loop", - "802f6e40" : "bhv_manta_ray_init", - "802f6eb0" : "manta_ray_move", - "802f7068" : "manta_ray_act_spawn_ring", - "802f7264" : "bhv_manta_ray_loop", - "802f7348" : "bhv_falling_pillar_init", - "802f7398" : "bhv_falling_pillar_spawn_hitboxes", - "802f7418" : "bhv_falling_pillar_calculate_angle_in_front_of_mario", - "802f74dc" : "bhv_falling_pillar_loop", - "802f7760" : "bhv_falling_pillar_hitbox_loop", - "802f7924" : "bhv_jrb_floating_box_loop", - "802f7978" : "bhv_decorative_pendulum_init", - "802f79b0" : "bhv_decorative_pendulum_loop", - "802f7a58" : "bhv_treasure_chest_top_loop", - "802f7c9c" : "bhv_treasure_chest_bottom_init", - "802f7d04" : "bhv_treasure_chest_bottom_loop", - "802f7f1c" : "spawn_treasure_chest", - "802f7fa0" : "bhv_treasure_chest_ship_init", - "802f8044" : "bhv_treasure_chest_ship_loop", - "802f8158" : "bhv_treasure_chest_jrb_init", - "802f8208" : "bhv_treasure_chest_jrb_loop", - "802f82f8" : "bhv_treasure_chest_init", - "802f83a4" : "bhv_treasure_chest_loop", - "802f8490" : "bhv_mips_init", - "802f85e0" : "bhv_mips_find_furthest_waypoint_to_mario", - "802f8760" : "bhv_mips_act_wait_for_nearby_mario", - "802f8808" : "bhv_mips_act_follow_path", - "802f893c" : "bhv_mips_act_wait_for_animation_done", - "802f8988" : "bhv_mips_act_fall_down", - "802f8a34" : "bhv_mips_act_idle", - "802f8ab4" : "bhv_mips_free", - "802f8b54" : "bhv_mips_held", - "802f8c74" : "bhv_mips_dropped", - "802f8cf8" : "bhv_mips_thrown", - "802f8dac" : "bhv_mips_loop", - "802f8e54" : "bhv_yoshi_init", - "802f8f08" : "yoshi_walk_loop", - "802f9054" : "yoshi_idle_loop", - "802f923c" : "yoshi_talk_loop", - "802f93a8" : "yoshi_walk_and_jump_off_roof_loop", - "802f9500" : "yoshi_finish_jumping_and_despawn_loop", - "802f95ac" : "yoshi_give_present_loop", - "802f965c" : "bhv_yoshi_loop", - "802fbc4c" : "bhv_koopa_init", - "802fc414" : "shelled_koopa_attack_handler", - "802fcc00" : "obj_begin_race", - "802fd7f8" : "bhv_koopa_update", - "802fd950" : "bhv_koopa_race_endpoint_update", - "802fda28" : "bhv_pokey_body_part_update", - "802fe3b0" : "bhv_pokey_update", - "802fe8b4" : "bhv_swoop_update", - "802ff040" : "bhv_fly_guy_update", - "802ff214" : "bhv_goomba_triplet_spawner_update", - "802ff408" : "bhv_goomba_init", - "802ff94c" : "huge_goomba_weakly_attacked", - "802ff96c" : "bhv_goomba_update", - "802ffb38" : "bhv_chain_chomp_chain_part_update", - "80300e40" : "bhv_chain_chomp_update", - "80300ecc" : "bhv_wooden_post_update", - "80301148" : "bhv_chain_chomp_gate_init", - "80301180" : "bhv_chain_chomp_gate_update", - "80301210" : "bhv_wiggler_body_part_update", - "803014cc" : "wiggler_init_segments", - "803016e0" : "wiggler_update_segments", - "803020e4" : "wiggler_jumped_on_attack_handler", - "80302154" : "bhv_wiggler_update", - "80302910" : "bhv_spiny_update", - "80303028" : "bhv_enemy_lakitu_update", - "8030369c" : "bhv_cloud_update", - "80303744" : "bhv_cloud_part_update", - "80303984" : "bhv_camera_lakitu_init", - "80303f64" : "bhv_camera_lakitu_update", - "803043f8" : "bhv_monty_mole_hole_update", - "80304474" : "monty_mole_spawn_dirt_particles", - "803044c0" : "bhv_monty_mole_init", - "80304ba8" : "bhv_monty_mole_update", - "80304fd4" : "bhv_monty_mole_rock_update", - "80305100" : "bhv_platform_on_track_init", - "80305a58" : "bhv_platform_on_track_update", - "80305bb0" : "bhv_track_ball_update", - "80305c14" : "bhv_seesaw_platform_init", - "80305c90" : "bhv_seesaw_platform_update", - "80305e2c" : "bhv_ferris_wheel_axle_init", - "80305f24" : "bhv_ferris_wheel_platform_update", - "80306084" : "bhv_water_bomb_spawner_update", - "803062a8" : "water_bomb_spawn_explode_particles", - "803067e8" : "bhv_water_bomb_update", - "803068c0" : "bhv_water_bomb_shadow_update", - "8030699c" : "bhv_ttc_rotating_solid_init", - "80306a38" : "bhv_ttc_rotating_solid_update", - "80306cc4" : "bhv_ttc_pendulum_init", - "80306d38" : "bhv_ttc_pendulum_update", - "80306f48" : "bhv_ttc_treadmill_init", - "80307010" : "bhv_ttc_treadmill_update", - "803071b8" : "bhv_ttc_moving_bar_init", - "80307670" : "bhv_ttc_moving_bar_update", - "80307760" : "bhv_ttc_cog_init", - "803077e0" : "bhv_ttc_cog_update", - "80307930" : "bhv_ttc_pit_block_init", - "803079c8" : "bhv_ttc_pit_block_update", - "80307ae4" : "bhv_ttc_elevator_init", - "80307b58" : "bhv_ttc_elevator_update", - "80307c88" : "bhv_ttc_2d_rotator_init", - "80307cf8" : "bhv_ttc_2d_rotator_update", - "80307ea4" : "bhv_ttc_spinner_update", - "80307fb8" : "mr_blizzard_spawn_white_particles", - "8030803c" : "bhv_mr_blizzard_init", - "80308d6c" : "bhv_mr_blizzard_update", - "80309154" : "bhv_mr_blizzard_snowball", - "803091e0" : "bhv_sliding_plat_2_init", - "80309354" : "bhv_sliding_plat_2_loop", - "80309454" : "bhv_rotating_octagonal_plat_init", - "803094d0" : "bhv_rotating_octagonal_plat_loop", - "803094f8" : "bhv_animates_on_floor_switch_press_init", - "80309530" : "bhv_animates_on_floor_switch_press_loop", - "803097a4" : "bhv_activated_back_and_forth_platform_init", - "803098c0" : "bhv_activated_back_and_forth_platform_update", - "80309b64" : "bhv_recovery_heart_loop", - "80309cec" : "bhv_bubble_cannon_barrel_loop", - "80309ed4" : "water_bomb_cannon_act_0", - "80309f68" : "water_bomb_cannon_act_1", - "8030a0e8" : "water_bomb_cannon_act_2", - "8030a11c" : "bhv_water_bomb_cannon_loop", - "8030a1c0" : "bhv_unagi_init", - "8030a2a8" : "unagi_act_0", - "8030a390" : "unagi_act_1_4", - "8030a514" : "unagi_act_2", - "8030a614" : "unagi_act_3", - "8030a93c" : "bhv_unagi_loop", - "8030aabc" : "bhv_unagi_subobject_loop", - "8030ad04" : "dorrie_raise_head", - "8030ae9c" : "dorrie_act_move", - "8030b0b8" : "dorrie_begin_head_raise", - "8030b0f0" : "dorrie_act_lower_head", - "8030b220" : "dorrie_act_raise_head", - "8030b2f4" : "bhv_dorrie_update", - "8030b658" : "bhv_haunted_chair_init", - "8030b6d8" : "haunted_chair_act_0", - "8030ba68" : "haunted_chair_act_1", - "8030bc90" : "bhv_haunted_chair_loop", - "8030bfd0" : "bhv_mad_piano_update", - "8030c06c" : "flying_bookend_act_0", - "8030c0f0" : "flying_bookend_act_1", - "8030c210" : "flying_bookend_act_2", - "8030c2c8" : "flying_bookend_act_3", - "8030c364" : "bhv_flying_bookend_loop", - "8030c4b0" : "bhv_bookend_spawn_loop", - "8030c564" : "bookshelf_manager_act_0", - "8030c60c" : "bookshelf_manager_act_1", - "8030c6a4" : "bookshelf_manager_act_2", - "8030c828" : "bookshelf_manager_act_3", - "8030c894" : "bookshelf_manager_act_4", - "8030c8ec" : "bhv_haunted_bookshelf_manager_loop", - "8030c98c" : "bhv_book_switch_loop", - "8030cd30" : "obj_spit_fire", - "8030cddc" : "bhv_fire_piranha_plant_init", - "8030d2f0" : "bhv_fire_piranha_plant_update", - "8030d598" : "bhv_fire_spitter_update", - "8030d640" : "bhv_small_piranha_flame_loop", - "8030d8d4" : "bhv_fly_guy_flame_loop", - "8030d93c" : "geo_snufit_move_mask", - "8030d9ac" : "geo_snufit_scale_body", - "8030da14" : "snufit_act_idle", - "8030db38" : "snufit_act_shoot", - "8030dc70" : "bhv_snufit_loop", - "8030dfc4" : "bhv_snufit_balls_loop", - "8030e14c" : "bhv_horizontal_grindel_init", - "8030e16c" : "bhv_horizontal_grindel_update", - "8030ea9c" : "bhv_eyerok_boss_loop", - "8030fff8" : "bhv_eyerok_hand_loop", - "80310498" : "bhv_klepto_init", - "8031126c" : "obj_set_speed_to_zero", - "8031129c" : "bhv_klepto_update", - "80311874" : "bhv_bird_update", - "803118e4" : "bhv_racing_penguin_init", - "80312070" : "bhv_racing_penguin_update", - "80312168" : "bhv_penguin_race_finish_line_update", - "80312200" : "bhv_penguin_race_shortcut_check_update", - "80312248" : "bhv_coffin_spawner_loop", - "80312370" : "coffin_act_idle", - "8031262c" : "coffin_act_stand_up", - "8031274c" : "bhv_coffin_loop", - "80312804" : "clam_act_0", - "80312900" : "clam_act_1", - "80312a54" : "bhv_clam_loop", - "80313110" : "bhv_skeeter_update", - "803131e8" : "bhv_skeeter_wave_update", - "8031326c" : "bhv_swing_platform_init", - "80313294" : "bhv_swing_platform_update", - "80313354" : "bhv_donut_platform_spawner_update", - "80313530" : "bhv_donut_platform_update", - "803136cc" : "bhv_ddd_pole_init", - "80313754" : "bhv_ddd_pole_update", - "803137f4" : "bhv_red_coin_star_marker_init", - "80313fc0" : "bhv_triplet_butterfly_update", - "80314098" : "bubba_act_0", - "8031427c" : "bubba_act_1", - "803145d4" : "bhv_bubba_loop", - "80314a30" : "prepare_reverb_ring_buffer", - "80314cc0" : "get_volume_ramping", - "80314de4" : "synthesis_execute", - "80314f64" : "synthesis_do_one_audio_update", - "80315590" : "synthesis_process_notes", - "80316010" : "load_wave_samples", - "803160dc" : "final_resample", - "80316138" : "process_envelope", - "8031619c" : "process_envelope_inner", - "803166fc" : "note_apply_headset_pan_effects", - "80316ac8" : "note_init_volume", - "80316af4" : "note_set_vel_pan_reverb", - "80316da8" : "note_set_frequency", - "80316db4" : "note_enable", - "80316e00" : "note_disable", - "80316e80" : "reset_bank_and_seq_load_status", - "80316ec4" : "discard_bank", - "80316fb4" : "discard_sequence", - "80317040" : "soundAlloc", - "803170b4" : "sound_alloc_pool_init", - "803170d4" : "persistent_pool_clear", - "803170e8" : "temporary_pool_clear", - "80317118" : "unused_803160F8", - "80317128" : "sound_init_main_pools", - "80317184" : "session_pools_init", - "80317200" : "seq_and_bank_pool_init", - "8031727c" : "persistent_pools_init", - "80317338" : "temporary_pools_init", - "803173fc" : "alloc_bank_or_seq", - "8031782c" : "get_bank_or_seq", - "803178ec" : "decrease_reverb_gain", - "80317914" : "wait_for_audio_frames", - "80317948" : "audio_reset_session", - "80318040" : "audio_dma_copy_immediate", - "803180c4" : "audio_dma_copy_async", - "80318130" : "audio_dma_partial_copy_async", - "803181ec" : "decrease_sample_dma_ttls", - "80318300" : "dma_sample_data", - "80318634" : "init_sample_dma_buffers", - "803188f4" : "patch_audio_bank", - "80318b30" : "bank_load_immediate", - "80318c8c" : "bank_load_async", - "80318dc4" : "sequence_dma_immediate", - "80318e70" : "sequence_dma_async", - "80318fac" : "get_missing_bank", - "803190f4" : "load_banks_immediate", - "80319220" : "preload_sequence", - "80319328" : "load_sequence", - "80319388" : "load_sequence_internal", - "8031950c" : "audio_init", - "80319920" : "note_init", - "80319998" : "note_disable2", - "803199b8" : "process_notes", - "80319db8" : "seq_channel_layer_decay_release_internal", - "80319f64" : "seq_channel_layer_note_decay", - "80319f84" : "seq_channel_layer_note_release", - "80319fa4" : "build_synthetic_wave", - "8031a1d0" : "init_synthetic_wave", - "8031a254" : "init_note_list", - "8031a264" : "init_note_lists", - "8031a2b4" : "init_note_free_list", - "8031a368" : "note_pool_clear", - "8031a494" : "note_pool_fill", - "8031a5d0" : "audio_list_push_front", - "8031a610" : "audio_list_remove", - "8031a63c" : "pop_node_with_value_less_equal", - "8031a6cc" : "note_init_for_layer", - "8031a794" : "func_80319728", - "8031a7c8" : "note_release_and_take_ownership", - "8031a820" : "alloc_note_from_disabled", - "8031a89c" : "alloc_note_from_decaying", - "8031a8f0" : "alloc_note_from_active", - "8031a94c" : "alloc_note", - "8031ac34" : "reclaim_notes", - "8031adac" : "note_init_all", - "8031aee8" : "sequence_player_process_sound", - "8031b0cc" : "get_portamento_freq_scale", - "8031b1c0" : "get_vibrato_pitch_change", - "8031b248" : "get_vibrato_freq_scale", - "8031b440" : "note_vibrato_update", - "8031b4a0" : "note_vibrato_init", - "8031b58c" : "adsr_init", - "8031b5ac" : "adsr_update", - "8031b830" : "sequence_channel_init", - "8031b940" : "seq_channel_set_layer", - "8031ba30" : "seq_channel_layer_disable", - "8031ba6c" : "seq_channel_layer_free", - "8031baf0" : "sequence_channel_disable", - "8031bb5c" : "allocate_sequence_channel", - "8031bba4" : "sequence_player_init_channels", - "8031bcd0" : "sequence_player_disable_channels", - "8031bda0" : "sequence_channel_enable", - "8031be44" : "sequence_player_disable", - "8031bf14" : "audio_list_push_back", - "8031bf54" : "audio_list_pop_back", - "8031bf94" : "init_layer_freelist", - "8031c03c" : "m64_read_u8", - "8031c050" : "m64_read_s16", - "8031c080" : "m64_read_compressed_u16", - "8031c0c4" : "seq_channel_layer_process_script", - "8031c200" : "L_U_8031C200", - "8031c23c" : "L_U_8031C23C", - "8031c298" : "L_U_8031C298", - "8031c2dc" : "L_U_8031C2DC", - "8031c328" : "L_U_8031C328", - "8031c36c" : "L_U_8031C36C", - "8031c3bc" : "L_U_8031C3BC", - "8031c3e8" : "L_U_8031C3E8", - "8031c454" : "L_U_8031C454", - "8031c4a4" : "L_U_8031C4A4", - "8031c5c8" : "L_U_8031C5C8", - "8031c698" : "L_U_8031C698", - "8031c6a0" : "L_U_8031C6A0", - "8031cbe0" : "L_U_8031CBE0", - "8031cbec" : "L_U_8031CBEC", - "8031ce54" : "get_instrument", - "8031cfd4" : "set_instrument", - "8031d068" : "sequence_channel_set_volume", - "8031d08c" : "sequence_channel_process_script", - "8031d144" : "L_U_8031D144", - "8031d1f8" : "L_U_8031D1F8", - "8031d234" : "L_U_8031D234", - "8031d26c" : "L_U_8031D26C", - "8031d2b4" : "L_U_8031D2B4", - "8031d2c4" : "L_U_8031D2C4", - "8031d31c" : "L_U_8031D31C", - "8031d344" : "L_U_8031D344", - "8031d354" : "L_U_8031D354", - "8031d370" : "L_U_8031D370", - "8031d3a8" : "L_U_8031D3A8", - "8031d3c4" : "L_U_8031D3C4", - "8031d3d4" : "L_U_8031D3D4", - "8031d3e4" : "L_U_8031D3E4", - "8031d400" : "L_U_8031D400", - "8031d424" : "L_U_8031D424", - "8031d44c" : "L_U_8031D44C", - "8031d474" : "L_U_8031D474", - "8031d498" : "L_U_8031D498", - "8031d4bc" : "L_U_8031D4BC", - "8031d4d4" : "L_U_8031D4D4", - "8031d4f0" : "L_U_8031D4F0", - "8031d500" : "L_U_8031D500", - "8031d51c" : "L_U_8031D51C", - "8031d538" : "L_U_8031D538", - "8031d56c" : "L_U_8031D56C", - "8031d5a0" : "L_U_8031D5A0", - "8031d5b4" : "L_U_8031D5B4", - "8031d5d4" : "L_U_8031D5D4", - "8031d5e4" : "L_U_8031D5E4", - "8031d640" : "L_U_8031D640", - "8031d678" : "L_U_8031D678", - "8031d6c4" : "L_U_8031D6C4", - "8031d6d4" : "L_U_8031D6D4", - "8031d6f4" : "L_U_8031D6F4", - "8031d718" : "L_U_8031D718", - "8031d728" : "L_U_8031D728", - "8031d73c" : "L_U_8031D73C", - "8031d7b8" : "L_U_8031D7B8", - "8031d7e8" : "L_U_8031D7E8", - "8031d7f8" : "L_U_8031D7F8", - "8031d814" : "L_U_8031D814", - "8031d830" : "L_U_8031D830", - "8031d87c" : "L_U_8031D87C", - "8031d898" : "L_U_8031D898", - "8031d8f8" : "L_U_8031D8F8", - "8031d900" : "L_U_8031D900", - "8031d930" : "L_U_8031D930", - "8031d94c" : "L_U_8031D94C", - "8031d974" : "L_U_8031D974", - "8031d9ec" : "sequence_player_process_sequence", - "8031e240" : "process_sequences", - "8031e2e8" : "init_sequence_player", - "8031e374" : "init_sequence_players", - "8031e4f0" : "unused_8031E4F0", - "8031e568" : "unused_8031E568", - "8031e578" : "sequence_player_fade_out_internal", - "8031e5c0" : "func_8031D690", - "8031e60c" : "func_8031D6E4", - "8031e6a4" : "func_8031D7B0", - "8031e710" : "func_8031D838", - "8031e7b8" : "create_next_audio_frame_task", - "8031eb00" : "play_sound", - "8031eb30" : "process_sound_request", - "8031edec" : "process_all_sound_requests", - "8031ee70" : "func_8031DFE8", - "8031ef6c" : "func_8031E0E4", - "8031eff4" : "func_8031E16C", - "8031f810" : "get_sound_pan", - "8031f96c" : "get_sound_dynamics", - "8031fb20" : "get_sound_freq_scale", - "8031fbe8" : "get_sound_reverb", - "8031fd84" : "audio_signal_game_loop_tick", - "8031fdac" : "update_game_sound", - "80320544" : "play_sequence", - "80320678" : "sequence_player_fade_out", - "803206bc" : "fade_volume_scale", - "80320734" : "fade_channel_volume_scale", - "8032080c" : "func_8031F96C", - "803208ec" : "process_level_music_dynamics", - "80320a4c" : "L8031FBAC", - "80320a8c" : "L8031FBEC", - "80320acc" : "L8031FC2C", - "80320b0c" : "L8031FC6C", - "80320b4c" : "L8031FCAC", - "80320b8c" : "L8031FCEC", - "80320bcc" : "L8031FD2C", - "80320bf4" : "L8031FD54", - "80320d70" : "unused_8031FED0", - "80320e3c" : "func_8031FFB4", - "80320ec4" : "sequence_player_unlower", - "80320f68" : "func_803200E4", - "803210d4" : "set_sound_disabled", - "8032112c" : "sound_init", - "80321398" : "get_currently_playing_sound", - "80321474" : "func_803205E8", - "80321584" : "func_803206F8", - "8032171c" : "func_80320890", - "8032174c" : "sound_banks_disable", - "803217a8" : "disable_all_sequence_players", - "8032180c" : "sound_banks_enable", - "80321864" : "unused_803209D8", - "803218d8" : "func_80320A4C", - "803218f4" : "play_dialog_sound", - "803219ac" : "play_music", - "80321bac" : "stop_background_music", - "80321ce4" : "fadeout_background_music", - "80321d38" : "drop_queued_background_music", - "80321d5c" : "get_current_background_music", - "80321d9c" : "func_80320ED8", - "80321e48" : "play_secondary_music", - "80321f48" : "func_80321080", - "80321f9c" : "func_803210D4", - "80322078" : "play_course_clear", - "803220b4" : "play_peachs_jingle", - "803220f0" : "play_puzzle_jingle", - "8032212c" : "play_star_fanfare", - "80322168" : "play_power_star_jingle", - "803221b8" : "play_race_fanfare", - "803221f4" : "play_toads_jingle", - "80322230" : "sound_reset", - "8032231c" : "audio_set_sound_mode", - "80322348" : "unused_80321460", - "8032235c" : "unused_80321474", - "803223b0" : "osSetTime", - "803223e0" : "osMapTLB", - "803224a0" : "osUnmapTLBAll", - "803224f0" : "sprintf", - "8032255c" : "proutSprintf", - "803225a0" : "osCreateMesgQueue", - "803225d0" : "osSetEventMesg", - "80322640" : "osViSetEvent", - "803226b0" : "osCreateThread", - "80322800" : "osRecvMesg", - "80322940" : "_VirtualToPhysicalTask", - "80322a5c" : "osSpTaskLoad", - "80322bbc" : "osSpTaskStartGo", - "80322c00" : "osSpTaskYield", - "80322c20" : "osSendMesg", - "80322d70" : "osSpTaskYielded", - "80322df0" : "osStartThread", - "80322f40" : "osWritebackDCacheAll", - "80322f70" : "osCreateViManager", - "803230f4" : "viMgrMain", - "803232d0" : "osViSetMode", - "80323340" : "osViBlack", - "803233b0" : "osViSetSpecialFeatures", - "80323570" : "osCreatePiManager", - "803236f0" : "osSetThreadPri", - "803237d0" : "osInitialize", - "80323a00" : "osViSwapBuffer", - "80323a50" : "sqrtf", - "80323a60" : "osContStartReadData", - "80323b24" : "osContGetReadData", - "80323bcc" : "__osPackReadData", - "80323cc0" : "osContInit", - "80323ebc" : "__osContGetInitData", - "80323f8c" : "__osPackRequestData", - "80324080" : "osEepromProbe", - "803240f0" : "__ull_rshift", - "8032411c" : "__ull_rem", - "80324158" : "__ull_div", - "80324194" : "__ll_lshift", - "803241c0" : "__ll_rem", - "803241fc" : "__ll_div", - "80324258" : "__ll_mul", - "80324288" : "__ull_divremi", - "803242e8" : "__ll_mod", - "80324384" : "__ll_rshift", - "803243b0" : "osInvalDCache", - "80324460" : "osPiStartDma", - "80324570" : "bzero", - "80324610" : "osInvalICache", - "80324690" : "osEepromLongRead", - "803247d0" : "osEepromLongWrite", - "80324910" : "bcopy", - "80324c20" : "guOrthoF", - "80324d74" : "guOrtho", - "80324de0" : "guPerspectiveF", - "80325010" : "guPerspective", - "80325070" : "osGetTime", - "80325100" : "__d_to_ll", - "8032511c" : "__f_to_ll", - "80325138" : "__d_to_ull", - "803251d8" : "__f_to_ull", - "80325274" : "__ll_to_d", - "8032528c" : "__ll_to_f", - "803252a4" : "__ull_to_d", - "803252d8" : "__ull_to_f", - "80325310" : "cosf", - "80325480" : "sinf", - "80325640" : "guTranslateF", - "80325688" : "guTranslate", - "803256e0" : "guRotateF", - "80325874" : "guRotate", - "803258d0" : "guScaleF", - "80325924" : "guScale", - "80325970" : "osAiSetFrequency", - "80325bd4" : "alBnkfNew", - "80325cd8" : "alSeqFileNew", - "80325d20" : "osWritebackDCache", - "80325da0" : "osAiGetLength", - "80325db0" : "osAiSetNextBuffer", - "80325e60" : "__osTimerServicesInit", - "80325eec" : "__osTimerInterrupt", - "80326064" : "__osSetTimerIntr", - "803260d8" : "__osInsertTimer", - "80326260" : "_Printf", - "803273f0" : "memcpy", - "8032741c" : "strlen", - "80327444" : "strchr", - "80327490" : "__osDequeueThread", - "803274d0" : "__osDisableInt", - "803274f0" : "__osRestoreInt", - "80327510" : "__osViInit", - "80327640" : "__osExceptionPreamble", - "80327650" : "__osException", - "803278e4" : "L80326964", - "80327904" : "L80326984", - "80327938" : "L803269B8", - "80327a68" : "L80326AE8", - "80327ac4" : "L80326B44", - "80327ae4" : "L80326B64", - "80327b1c" : "L80326B9C", - "80327b68" : "L80326BE8", - "80327b98" : "send_mesg", - "80327c80" : "__osEnqueueAndYield", - "80327d10" : "__osEnqueueThread", - "80327d58" : "__osPopThread", - "80327d68" : "__osDispatchThread", - "80327ea8" : "__osCleanupThread", - "80327eb0" : "osVirtualToPhysical", - "80327f30" : "__osSpSetStatus", - "80327f40" : "__osSpSetPc", - "80327f80" : "__osSpRawStartDma", - "80328010" : "__osSpDeviceBusy", - "80328040" : "__osSpGetStatus", - "80328050" : "osGetThreadPri", - "80328070" : "__osViGetCurrentContext", - "80328080" : "__osViSwapContext", - "803283e0" : "osGetCount", - "803283f0" : "__osPiCreateAccessQueue", - "80328440" : "__osPiGetAccess", - "80328484" : "__osPiRelAccess", - "803284b0" : "osPiRawStartDma", - "80328590" : "__osDevMgrMain", - "80328710" : "__osSetSR", - "80328720" : "__osGetSR", - "80328730" : "__osSetFpcCsr", - "80328740" : "__osSiRawReadIo", - "80328790" : "__osSiRawWriteIo", - "803287e0" : "osMapTLBRdb", - "80328840" : "osPiRawReadIo", - "803288a0" : "__osSiCreateAccessQueue", - "803288f0" : "__osSiGetAccess", - "80328934" : "__osSiRelAccess", - "80328960" : "__osSiRawStartDma", - "80328a10" : "osSetTimer", - "80328af0" : "osEepromWrite", - "80328ca0" : "__osPackEepWriteData", - "80328dac" : "__osEepStatus", - "80328fd0" : "osJamMesg", - "80329120" : "osPiGetCmdQueue", - "80329150" : "osEepromRead", - "80329340" : "__osPackEepReadData", - "80329450" : "guMtxF2L", - "80329550" : "guMtxIdentF", - "803295d8" : "guMtxIdent", - "80329608" : "guMtxL2F", - "803296c0" : "guNormalize", - "80329750" : "__osAiDeviceBusy", - "80329780" : "__osSetCompare", - "80329790" : "_Litob", - "80329a90" : "_Ldtob", - "8032a860" : "u32_to_string", - "8032a890" : "string_to_u32", - "8032a8e8" : "send_packet", - "8032a9a8" : "send", - "8032aa80" : "process_command_memory", - "8032aacc" : "process_command_register", - "8032aaf8" : "kdebugserver", - "8032ace0" : "__osSyncPutChars", - "8032ae10" : "osSetIntMask", - "8032ae70" : "osDestroyThread", - "8032af70" : "__osProbeTLB", - "8032b030" : "__osSiDeviceBusy", - "8032b060" : "lldiv", - "8032b160" : "ldiv", - "8032b1f0" : "__osGetCause", - "8032b200" : "__osAtomicDec", - "8032b260" : "rspF3DBootStart", - "8032b330" : "rspF3DBootEnd", - "8032b330" : "rspF3DStart", - "8032c738" : "rspF3DEnd", - "8032c740" : "rspAspMainStart", - "8032d560" : "rspAspMainEnd", - "8032d560" : "gVblankHandler1", - "8032d564" : "gVblankHandler2", - "8032d568" : "gActiveSPTask", - "8032d56c" : "sCurrentAudioSPTask", - "8032d570" : "sCurrentDisplaySPTask", - "8032d574" : "sNextAudioSPTask", - "8032d578" : "sNextDisplaySPTask", - "8032d57c" : "sAudioEnabled", - "8032d580" : "sNumVblanks", - "8032d584" : "gResetTimer", - "8032d588" : "D_8032C648", - "8032d58c" : "gDebugLevelSelect", - "8032d590" : "D_8032C650", - "8032d594" : "gShowProfiler", - "8032d598" : "gShowDebugText", - "8032d5d0" : "unused8032C690", - "8032d5d4" : "gGlobalTimer", - "8032d5dc" : "frameBufferIndex", - "8032d5e0" : "D_8032C6A0", - "8032d5e4" : "gPlayer1Controller", - "8032d5e8" : "gPlayer2Controller", - "8032d5ec" : "gPlayer3Controller", - "8032d5f0" : "gCurrDemoInput", - "8032d5f4" : "gDemoInputListID", - "8032d5f8" : "gRecordedDemoInput", - "8032d6d0" : "credits01", - "8032d6d8" : "credits02", - "8032d6e4" : "credits03", - "8032d6f0" : "credits04", - "8032d700" : "credits05", - "8032d710" : "credits06", - "8032d71c" : "credits07", - "8032d728" : "credits08", - "8032d738" : "credits09", - "8032d740" : "credits10", - "8032d750" : "credits11", - "8032d75c" : "credits12", - "8032d764" : "credits13", - "8032d774" : "credits14", - "8032d77c" : "credits15", - "8032d788" : "credits16", - "8032d79c" : "credits17", - "8032d7ac" : "credits18", - "8032d7bc" : "credits19", - "8032d7c4" : "credits20", - "8032d7cc" : "sCreditsSequence", - "8032d93c" : "gMarioState", - "8032d940" : "unused1", - "8032d944" : "D_8032C9E0", - "8032daa0" : "sTerrainSounds", - "8032dacc" : "sSquishScaleOverTime", - "8032dae0" : "sCapFlickerFrames", - "8032daf8" : "gWaterSurfacePseudoFloor", - "8032dc50" : "sJumpLandAction", - "8032dc68" : "sFreefallLandAction", - "8032dc80" : "sSideFlipLandAction", - "8032dc98" : "sHoldJumpLandAction", - "8032dcb0" : "sHoldFreefallLandAction", - "8032dcc8" : "sLongJumpLandAction", - "8032dce0" : "sDoubleJumpLandAction", - "8032dcf8" : "sTripleJumpLandAction", - "8032dd10" : "sBackflipLandAction", - "8032dd40" : "sPunchingForwardVelocities", - "8032dd80" : "gLastCompletedCourseNum", - "8032dd84" : "gLastCompletedStarNum", - "8032dd88" : "sUnusedGotGlobalCoinHiScore", - "8032dd8c" : "gGotFileCoinHiScore", - "8032dd90" : "gCurrCourseStarFlags", - "8032dd94" : "gSpecialTripleJump", - "8032dd98" : "gLevelToCourseNumTable", - "8032ddc0" : "gMarioSpawnInfo", - "8032ddc4" : "gLoadedGraphNodes", - "8032ddc8" : "gAreas", - "8032ddcc" : "gCurrentArea", - "8032ddd0" : "gCurrCreditsEntry", - "8032ddd4" : "D_8032CE74", - "8032ddd8" : "D_8032CE78", - "8032dddc" : "gWarpTransDelay", - "8032dde0" : "gFBSetColor", - "8032dde4" : "gWarpTransFBSetColor", - "8032dde8" : "gWarpTransRed", - "8032ddec" : "gWarpTransGreen", - "8032ddf0" : "gWarpTransBlue", - "8032ddf4" : "gCurrSaveFileNum", - "8032ddf8" : "gCurrLevelNum", - "8032ddfc" : "sWarpBhvSpawnTable", - "8032de4c" : "sSpawnTypeFromWarpBhv", - "8032de60" : "D_8032CF00", - "8032de70" : "renderModeTable_1Cycle", - "8032deb0" : "renderModeTable_2Cycle", - "8032def0" : "gCurGraphNodeRoot", - "8032def4" : "gCurGraphNodeMasterList", - "8032def8" : "gCurGraphNodeCamFrustum", - "8032defc" : "gCurGraphNodeCamera", - "8032df00" : "gCurGraphNodeObject", - "8032df04" : "gCurGraphNodeHeldObject", - "8032df08" : "gAreaUpdateCounter", - "8032df10" : "gProfilerMode", - "8032df14" : "gCurrentFrameIndex1", - "8032df18" : "gCurrentFrameIndex2", - "8032df20" : "unused8032CFC0", - "8032df24" : "gCutsceneFocus", - "8032df28" : "unused8032CFC8", - "8032df2c" : "unused8032CFCC", - "8032df30" : "gSecondCameraFocus", - "8032df34" : "sYawSpeed", - "8032df38" : "gCurrLevelArea", - "8032df3c" : "gPrevLevel", - "8032df40" : "unused8032CFE0", - "8032df44" : "unused8032CFE4", - "8032df48" : "unused8032CFE8", - "8032df4c" : "gCameraZoomDist", - "8032df50" : "sObjectCutscene", - "8032df54" : "gRecentCutscene", - "8032df58" : "sFramesSinceCutsceneEnded", - "8032df5c" : "sCutsceneDialogResponse", - "8032df60" : "sMarioCamState", - "8032df64" : "sLuigiCamState", - "8032df68" : "unused8032D008", - "8032df6c" : "sFixedModeBasePosition", - "8032df78" : "sUnusedModeBasePosition_2", - "8032df84" : "sUnusedModeBasePosition_3", - "8032df90" : "sUnusedModeBasePosition_4", - "8032df9c" : "sUnusedModeBasePosition_5", - "8032dfa8" : "sModeTransitions", - "8032e008" : "unused8032D0A8", - "8032e010" : "unused8032D0B0", - "8032e018" : "sDanceCutsceneTable", - "8032e024" : "unusedDanceInfo1", - "8032e038" : "unusedDanceType", - "8032e03c" : "unusedDanceInfo2", - "8032e050" : "sBBHLibraryParTrackPath", - "8032e098" : "sCamSL", - "8032e0e0" : "sCamTHI", - "8032e128" : "sCamHMC", - "8032e1d0" : "sCamSSL", - "8032e248" : "sCamRR", - "8032e2f0" : "sCamBOB", - "8032e338" : "sCamCotMC", - "8032e368" : "sCamCCM", - "8032e3b0" : "sCamCastle", - "8032e6f8" : "sCamBBH", - "8032ecb0" : "sCameraTriggers", - "8032ed50" : "sIntroStartToPipePosition", - "8032ee08" : "sIntroStartToPipeFocus", - "8032eec0" : "sIntroPipeToDialogPosition", - "8032ef30" : "sIntroPipeToDialogFocus", - "8032efa0" : "sEndingFlyToWindowPos", - "8032eff0" : "sEndingFlyToWindowFocus", - "8032f048" : "sEndingPeachDescentCamPos", - "8032f0e8" : "sEndingMarioToPeachPos", - "8032f130" : "sEndingMarioToPeachFocus", - "8032f178" : "sEndingLookUpAtCastle", - "8032f1b8" : "sEndingLookAtSkyFocus", - "8032f214" : "gIntroLakituStartToPipeFocus", - "8032f32c" : "gIntroLakituStartToPipeOffsetFromCamera", - "8032f444" : "gEndWavingPos", - "8032f48c" : "gEndWavingFocus", - "8032f4d4" : "sCutsceneEnding", - "8032f534" : "sCutsceneGrandStar", - "8032f544" : "sCutsceneUnused", - "8032f554" : "sCutsceneDoorWarp", - "8032f564" : "sCutsceneEndWaving", - "8032f56c" : "sCutsceneCredits", - "8032f574" : "sCutsceneDoorPull", - "8032f59c" : "sCutsceneDoorPush", - "8032f5c4" : "sCutsceneDoorPullMode", - "8032f5dc" : "sCutsceneDoorPushMode", - "8032f5f4" : "sCutsceneEnterCannon", - "8032f60c" : "sCutsceneStarSpawn", - "8032f624" : "sCutsceneRedCoinStarSpawn", - "8032f634" : "sCutsceneEnterPainting", - "8032f63c" : "sCutsceneDeathExit", - "8032f64c" : "sCutsceneExitPaintingSuccess", - "8032f65c" : "sCutsceneUnusedExit", - "8032f674" : "sCutsceneIntroPeach", - "8032f69c" : "sCutscenePrepareCannon", - "8032f6ac" : "sCutsceneExitWaterfall", - "8032f6bc" : "sCutsceneFallToCastleGrounds", - "8032f6cc" : "sCutsceneEnterPyramidTop", - "8032f6dc" : "sCutscenePyramidTopExplode", - "8032f6f4" : "sCutsceneStandingDeath", - "8032f6fc" : "sCutsceneEnterPool", - "8032f70c" : "sCutsceneDeathStomach", - "8032f714" : "sCutsceneDeathOnBack", - "8032f71c" : "sCutsceneQuicksandDeath", - "8032f724" : "sCutsceneWaterDeath", - "8032f72c" : "sCutsceneSuffocation", - "8032f734" : "sCutsceneEnterBowserArena", - "8032f74c" : "sCutsceneDanceDefaultRotate", - "8032f754" : "sCutsceneDanceFlyAway", - "8032f75c" : "sCutsceneDanceCloseup", - "8032f764" : "sCutsceneKeyDance", - "8032f76c" : "sCutsceneCapSwitchPress", - "8032f774" : "sCutsceneSlidingDoorsOpen", - "8032f784" : "sCutsceneUnlockKeyDoor", - "8032f794" : "sCutsceneExitBowserSuccess", - "8032f7a4" : "sCutsceneExitBowserDeath", - "8032f7b4" : "sCutsceneExitSpecialSuccess", - "8032f7c4" : "sCutsceneNonPaintingDeath", - "8032f7d4" : "sCutsceneDialog", - "8032f7ec" : "sCutsceneReadMessage", - "8032f804" : "sDanceCutsceneIndexTable", - "8032f870" : "sZoomOutAreaMasks", - "8032f884" : "sBobCreditsSplinePositions", - "8032f8ac" : "sBobCreditsSplineFocus", - "8032f8d4" : "sWfCreditsSplinePositions", - "8032f8fc" : "sWfCreditsSplineFocus", - "8032f924" : "sJrbCreditsSplinePositions", - "8032f94c" : "sJrbCreditsSplineFocus", - "8032f974" : "sCcmSlideCreditsSplinePositions", - "8032f99c" : "sCcmSlideCreditsSplineFocus", - "8032f9c4" : "sBbhCreditsSplinePositions", - "8032f9e4" : "sBbhCreditsSplineFocus", - "8032fa04" : "sHmcCreditsSplinePositions", - "8032fa2c" : "sHmcCreditsSplineFocus", - "8032fa54" : "sThiWigglerCreditsSplinePositions", - "8032fa6c" : "sThiWigglerCreditsSplineFocus", - "8032fa84" : "sVolcanoCreditsSplinePositions", - "8032fab4" : "sVolcanoCreditsSplineFocus", - "8032fae4" : "sSslCreditsSplinePositions", - "8032fb14" : "sSslCreditsSplineFocus", - "8032fb44" : "sDddCreditsSplinePositions", - "8032fb7c" : "sDddCreditsSplineFocus", - "8032fbb4" : "sSlCreditsSplinePositions", - "8032fbd4" : "sSlCreditsSplineFocus", - "8032fbf4" : "sWdwCreditsSplinePositions", - "8032fc14" : "sWdwCreditsSplineFocus", - "8032fc34" : "sTtmCreditsSplinePositions", - "8032fc64" : "sTtmCreditsSplineFocus", - "8032fc94" : "sThiHugeCreditsSplinePositions", - "8032fccc" : "sThiHugeCreditsSplineFocus", - "8032fd04" : "sTtcCreditsSplinePositions", - "8032fd24" : "sTtcCreditsSplineFocus", - "8032fd44" : "sRrCreditsSplinePositions", - "8032fd64" : "sRrCreditsSplineFocus", - "8032fd84" : "sSaCreditsSplinePositions", - "8032fdac" : "sSaCreditsSplineFocus", - "8032fdd4" : "sCotmcCreditsSplinePositions", - "8032fdfc" : "sCotmcCreditsSplineFocus", - "8032fe24" : "sDddSubCreditsSplinePositions", - "8032fe4c" : "sDddSubCreditsSplineFocus", - "8032fe74" : "sCcmOutsideCreditsSplinePositions", - "8032fe94" : "sCcmOutsideCreditsSplineFocus", - "8032fec0" : "sObjectListUpdateOrder", - "8032fecc" : "sParticleTypes", - "80330000" : "D_8032F0A0", - "80330004" : "D_8032F0A4", - "80330020" : "D_8032F0C0", - "8033002c" : "D_8032F0CC", - "8033006c" : "sMrIParticleActions", - "80330074" : "sMrIActions", - "80330084" : "sMrIHitbox", - "80330094" : "D_8032F134", - "803300a8" : "unused8032F134", - "803300ac" : "sCapSwitchActions", - "803300bc" : "sKingBobombActions", - "803300e0" : "sKingBobombSoundStates", - "80330140" : "sOpenedCannonActions", - "8033015c" : "unused0EA1FC", - "80330198" : "sChuckyaActions", - "803301a8" : "sWFRotatingPlatformData", - "803301c0" : "sKoopaShellUnderwaterHitbox", - "803301d0" : "D_8032F270", - "803301e4" : "sSparkleSpawnStarHitbox", - "803301f4" : "sYellowCoinHitbox", - "80330204" : "D_8032F2A4", - "80330224" : "sCoinInsideBooActions", - "8033022c" : "D_8032F2CC", - "80330244" : "D_8032F2E4", - "80330260" : "D_8032F300", - "80330288" : "D_8032F328", - "80330290" : "D_8032F330", - "80330298" : "sGrindelThwompActions", - "803302ac" : "sTumblingBridgeParams", - "803302dc" : "sTumblingBridgeActions", - "803302ec" : "D_8032F38C", - "80330318" : "sElevatorActions", - "8033032c" : "D_8032F3CC", - "80330340" : "D_8032F3E0", - "80330354" : "D_8032F3F4", - "8033035c" : "D_8032F3FC", - "80330370" : "sUkikiCageActions", - "80330380" : "D_8032F420", - "80330390" : "sSpindriftHitbox", - "803303a0" : "sMetalBoxHitbox", - "803303b0" : "sBreakableBoxHitbox", - "803303c0" : "D_8032F460", - "803303e8" : "sHeaveHoActions", - "803303f8" : "sJumpingBoxHitbox", - "80330408" : "sJumpingBoxActions", - "8033042c" : "sBowserKeyHitbox", - "8033043c" : "sBulletBillActions", - "80330450" : "sBowserTailAnchorActions", - "8033045c" : "D_8032F4FC", - "8033046c" : "D_8032F50C", - "80330470" : "D_8032F510", - "80330474" : "D_8032F514", - "80330478" : "sBowserDefeatedDialogText", - "80330480" : "D_8032F520", - "803304c8" : "sBowserActions", - "80330518" : "D_8032F5B8", - "803305f0" : "D_8032F690", - "803305f4" : "D_8032F694", - "803305f8" : "D_8032F698", - "8033067c" : "sFallingBowserPlatformActions", - "80330688" : "sGrowingBowserFlameHitbox", - "80330698" : "sBowserFlameHitbox", - "803306a8" : "D_8032F748", - "803306b4" : "D_8032F754", - "803306dc" : "sCageUkikiPath", - "80330738" : "sUkikiSoundStates", - "803307a0" : "sUkikiActions", - "803307c0" : "D_8032F860", - "803307f4" : "D_8032F894", - "80330828" : "D_8032F8C8", - "80330830" : "sRotatingCwFireBarsActions", - "80330840" : "sKoopaShellHitbox", - "80330850" : "D_8032F8F0", - "80330884" : "D_8032F924", - "803308a8" : "D_8032F948", - "803308cc" : "D_8032F96C", - "803308d8" : "sToxBoxActions", - "80330900" : "TablePiranhaPlantActions", - "80330b1c" : "sBowserPuzzlePieceActions", - "80330b38" : "sTuxiesMotherActions", - "80330b44" : "sSmallPenguinActions", - "80330b5c" : "sFishActions", - "80330b68" : "sFishGroupActions", - "80330b74" : "sBirdChirpChirpActions", - "80330b84" : "sCheepCheepActions", - "80330b90" : "sExclamationBoxHitbox", - "80330ba0" : "sExclamationBoxContents", - "80330c20" : "sExclamationBoxActions", - "80330c38" : "sSkullSlidingBoxHitbox", - "80330c48" : "D_8032FCE8", - "80330c58" : "sTweesterHitbox", - "80330c68" : "sTweesterActions", - "80330cd4" : "sScuttlebugHitbox", - "80330ce4" : "sWhompActions", - "80330d0c" : "sWaterSplashDropletParams", - "80330d30" : "sShallowWaterSplashDropletParams", - "80330d54" : "sWaterDropletFishParams", - "80330d78" : "sShallowWaterWaveDropletParams", - "80330d9c" : "sStrongWindParticleHitbox", - "80330dac" : "sSLWalkingPenguinErraticSteps", - "80330e20" : "D_8032FEC0", - "80330e24" : "unused_8032FEC4", - "80330e34" : "gMarioPlatform", - "80330e40" : "sDebugEffectStringInfo", - "80330e64" : "sDebugEnemyStringInfo", - "80330e88" : "sDebugInfoDPadMask", - "80330e8c" : "sDebugInfoDPadUpdID", - "80330e90" : "sDebugLvSelectCheckFlag", - "80330e94" : "sDebugPage", - "80330e98" : "sNoExtraDebug", - "80330e9c" : "sDebugStringArrPrinted", - "80330ea0" : "sDebugSysCursor", - "80330ea4" : "sDebugInfoButtonSeqID", - "80330ea8" : "sDebugInfoButtonSeq", - "80330ec0" : "sTransitionColorFadeCount", - "80330ec4" : "sTransitionTextureFadeCount", - "80330ec8" : "sTextureTransitionID", - "80330ee0" : "rectangles", - "80330f00" : "sSkyboxTextures", - "80330f28" : "sSkyboxColors", - "80330f30" : "gMovtexCounter", - "80330f34" : "gMovtexCounterPrev", - "80330f38" : "gMovtexVtxColor", - "80330f3c" : "gPaintingMarioYEntry", - "80330f40" : "gWdwWaterLevelSet", - "80330f44" : "gMovtexIdToTexture", - "80330f64" : "gMovtexNonColored", - "803311a4" : "gMovtexColored", - "8033127c" : "gMovtexColored2", - "80331300" : "sHmcPaintings", - "80331308" : "sInsideCastlePaintings", - "80331344" : "sTtmPaintings", - "8033134c" : "sPaintingGroups", - "80331358" : "gPaintingUpdateCounter", - "8033135c" : "gLastPaintingUpdateCounter", - "80331360" : "sTextLabelsCount", - "80331370" : "gDialogCharWidths", - "80331470" : "gDialogBoxState", - "80331474" : "gDialogBoxOpenTimer", - "80331478" : "gDialogBoxScale", - "8033147c" : "gDialogScrollOffsetY", - "80331480" : "gDialogBoxType", - "80331484" : "gDialogID", - "80331488" : "gLastDialogPageStrPos", - "8033148c" : "gDialogTextPos", - "80331490" : "gDialogLineNum", - "80331494" : "gLastDialogResponse", - "80331498" : "gMenuHoldKeyIndex", - "8033149c" : "gMenuHoldKeyTimer", - "803314a0" : "gDialogResponse", - "803314b0" : "gHudSymCoin", - "803314b4" : "gHudSymX", - "803314f8" : "gMenuMode", - "803314fc" : "gEndCutsceneStrEn0", - "80331504" : "gEndCutsceneStrEn1", - "80331538" : "gEndCutsceneStrEn2", - "80331558" : "gEndCutsceneStrEn3", - "8033156c" : "gEndCutsceneStrEn4", - "80331598" : "gEndCutsceneStrEn5", - "803315ac" : "gEndCutsceneStrEn6", - "803315cc" : "gEndCutsceneStrEn7", - "803315dc" : "gEndCutsceneStrEn8", - "803315e4" : "gEndCutsceneStringsEn", - "8033160c" : "gCutsceneMsgFade", - "80331610" : "gCutsceneMsgIndex", - "80331614" : "gCutsceneMsgDuration", - "80331618" : "gCutsceneMsgTimer", - "8033161c" : "gDialogCameraAngleIndex", - "80331620" : "gDialogCourseActNum", - "803316c8" : "gCourseCompleteCoinsEqual", - "803316cc" : "gCourseDoneMenuTimer", - "803316d0" : "gCourseCompleteCoins", - "803316d4" : "gHudFlash", - "80331750" : "gEnvFxMode", - "80331754" : "D_80330644", - "80331758" : "gSnowTempVtx", - "80331788" : "gSnowFlakeVertex1", - "80331790" : "gSnowFlakeVertex2", - "80331798" : "gSnowFlakeVertex3", - "803317a0" : "D_80330690", - "803317a4" : "D_80330694", - "803317a8" : "gBubbleTempVtx", - "803317e0" : "MacroObjectPresets", - "803325fc" : "sPowerMeterVisibleTimer", - "80332614" : "sPrevCheckMarioRoom", - "80332618" : "sYoshiDead", - "8033261c" : "sDebugSequenceTracker", - "80332620" : "sDebugTimer", - "803327a8" : "sBreakableBoxSmallHitbox", - "80332b00" : "sMrBlizzardHitbox", - "80332b24" : "sMrBlizzardSnowballHitbox", - "80332b34" : "D_80331A24", - "80332b54" : "D_80331A44", - "80332b5c" : "D_80331A4C", - "80332b64" : "D_80331A54", - "80332bdc" : "D_80331ACC", - "80332bf0" : "sRecoveryHeartHitbox", - "80332c00" : "sUnagiHitbox", - "80332c10" : "sHauntedChairHitbox", - "80332c30" : "sFlyingBookendHitbox", - "80332c40" : "D_80331B30", - "80332c4c" : "sBookSwitchHitbox", - "80332c5c" : "sFirePiranhaPlantHitbox", - "80332c6c" : "D_80331B5C", - "80332c74" : "sPiranhaPlantFireHitbox", - "80332c84" : "sSnufitHitbox", - "80332c94" : "sSnufitBulletHitbox", - "80332ca4" : "sEyerokHitbox", - "80332cb4" : "D_80331BA4", - "80332d10" : "coffinRelativePos", - "80332d28" : "sClamShellHitbox", - "80332d38" : "sSkeeterHitbox", - "80332d48" : "D_80331C38", - "80332e50" : "gAudioErrorFlags", - "80332e54" : "sGameLoopTicked", - "80332e58" : "sDialogSpeaker", - "80332f04" : "sDialogSpeakerVoice", - "80332f40" : "sNumProcessedSoundRequests", - "80332f44" : "sSoundRequestCount", - "80332f48" : "sDynBbh", - "80332f54" : "sDynDdd", - "80332f6c" : "sDynJrb", - "80332f88" : "sDynWdw", - "80332f98" : "sDynHmc", - "80332fa8" : "sDynUnk38", - "80332fb8" : "sDynNone", - "80332fbc" : "sCurrentMusicDynamic", - "80332fc0" : "sBackgroundMusicForDynamics", - "80332fc4" : "sLevelDynamics", - "80333060" : "sMusicDynamics", - "803330c0" : "gAreaEchoLevel", - "80333138" : "D_80332028", - "80333188" : "sBackgroundMusicDefaultVolume", - "803331ac" : "sPlayer0CurSeqId", - "803331b0" : "sMusicDynamicDelay", - "803331b4" : "D_803320A4", - "803331c0" : "D_803320B0", - "803331cc" : "D_803320BC", - "803331d8" : "sMaxChannelsForSoundBank", - "803331e4" : "sNumSoundsPerBank", - "803331f0" : "gDefaultSoundArgs", - "803331fc" : "sUnusedSoundArgs", - "80333208" : "sSoundBankDisabled", - "80333218" : "D_80332108", - "8033321c" : "sHasStartedFadeOut", - "80333220" : "D_80332110", - "80333224" : "sUnused80332114", - "80333228" : "sUnused80332118", - "8033322c" : "D_8033211C", - "80333230" : "D_80332120", - "80333234" : "D_80332124", - "80333238" : "sBackgroundMusicQueueSize", - "8033323c" : "sUnused8033323C", - "803332a0" : "gAudioSessionPresets", - "80333498" : "gAudioCosineTable", - "80333598" : "gPitchBendFrequencyScale", - "80333994" : "gNoteFrequencies", - "80333b94" : "gDefaultShortNoteVelocityTable", - "80333ba4" : "gDefaultShortNoteDurationTable", - "80333bb4" : "gVibratoCurve", - "80333bc4" : "gDefaultEnvelope", - "80333bd0" : "sSineWave", - "80333c50" : "sSquareWave", - "80333cd0" : "sTriangleWave", - "80333d50" : "sSawtoothWave", - "80333dd0" : "gWaveSamples", - "80333de0" : "gHeadsetPanQuantization", - "80333df4" : "gHeadsetPanVolume", - "80333ff4" : "gStereoPanVolume", - "803341f4" : "gDefaultPanVolume", - "803343f4" : "gVolRampingLhs136", - "803345f4" : "gVolRampingRhs136", - "803347f4" : "gVolRampingLhs144", - "803349f4" : "gVolRampingRhs144", - "80334bf4" : "gVolRampingLhs128", - "80334df4" : "gVolRampingRhs128", - "80334ff4" : "gTatumsPerBeat", - "80334ff8" : "gUnusedCount80333EE8", - "80334ffc" : "gAudioHeapSize", - "80335000" : "D_80333EF0", - "80335004" : "gAudioLoadLock", - "80335008" : "sUnused8033EF8", - "80335010" : "osViModeTable", - "803358f0" : "piMgrArgs", - "80335910" : "osClockRate", - "80335918" : "D_80334808", - "80335920" : "D_80334810", - "80335930" : "D_80334820", - "80335940" : "D_80334830", - "80335950" : "_spaces", - "80335974" : "_zeroes", - "803359a0" : "D_80334890", - "803359a4" : "D_80334894", - "803359a8" : "D_80334898", - "803359ac" : "D_8033489C", - "803359b0" : "D_803348A0", - "803359b4" : "D_803348A4", - "803359c0" : "D_803348B0", - "80335a20" : "D_80334910", - "80335a24" : "D_80334914", - "80335a28" : "D_80334918", - "80335a2c" : "D_8033491C", - "80335a30" : "D_80334920", - "80335a44" : "D_80334934", - "80335a48" : "D_80334938", - "80335a50" : "gOsPiAccessQueueCreated", - "80335a60" : "gOsSiAccessQueueCreated", - "80335aa0" : "D_80334990", - "80335af0" : "D_803349E0", - "80335b40" : "D_80334A30", - "80335b44" : "D_80334A34", - "80335b48" : "D_80334A38", - "80335b50" : "D_80334A40", - "80335b54" : "D_80334A44", - "80338e60" : "jtbl_80337C90", - "80338e84" : "jtbl_80337CB4", - "80338eac" : "jtbl_80337CDC", - "80338ec0" : "jtbl_80337D08", - "80338fbc" : "jtbl_80337E04", - "8033978c" : "jtbl_80338418", - "80339880" : "length_str", - "80339884" : "flags_str", - "8033988c" : "flags_arr", - "80339980" : "D_80338610", - "803399a0" : "jtbl_80338630", - "803399d0" : "NAN", - "803399e0" : "D_80338670", - "80339a40" : "D_803386D0", - "80339ac0" : "rspF3DDataStart", - "8033a2c0" : "rspF3DDataEnd", - "8033a2c0" : "rspAspMainDataStart", - "8033a580" : "rspAspMainDataEnd", - "8033a580" : "_mainSegmentEnd", - "008c0c40" : "_mainSegmentRomEnd", - "8033a580" : "_mainSegmentNoloadStart", - "8033a580" : "D_80339210", - "8033a730" : "gIdleThread", - "8033a8e0" : "gMainThread", - "8033aa90" : "gGameLoopThread", - "8033ac40" : "gSoundThread", - "8033adf0" : "gPIMesgQueue", - "8033ae08" : "gIntrMesgQueue", - "8033ae20" : "gSPTaskMesgQueue", - "8033ae38" : "gDmaMesgBuf", - "8033ae40" : "gPIMesgBuf", - "8033aec0" : "gSIEventMesgBuf", - "8033aec8" : "gIntrMesgBuf", - "8033af08" : "gUnknownMesgBuf", - "8033af48" : "gDmaIoMesg", - "8033af5c" : "D_80339BEC", - "8033af60" : "gDmaMesgQueue", - "8033af78" : "gSIEventMesgQueue", - "8033af90" : "gControllers", - "8033afe8" : "gControllerStatuses", - "8033aff8" : "gControllerPads", - "8033b010" : "gGameVblankQueue", - "8033b028" : "D_80339CB8", - "8033b040" : "D_80339CD0", - "8033b044" : "D_80339CD4", - "8033b048" : "gGameVblankHandler", - "8033b050" : "gPhysicalFrameBuffers", - "8033b05c" : "gPhysicalZBuffer", - "8033b060" : "D_80339CF0", - "8033b064" : "D_80339CF4", - "8033b068" : "gGfxSPTask", - "8033b06c" : "gDisplayListHead", - "8033b070" : "gGfxPoolEnd", - "8033b074" : "gGfxPool", - "8033b078" : "gControllerBits", - "8033b079" : "gEepromProbe", - "8033b080" : "D_80339D10", - "8033b090" : "gDemo", - "8033b0a0" : "filler80339D30", - "8033b170" : "gMarioStates", - "8033b238" : "sCurrPlayMode", - "8033b23a" : "D_80339ECA", - "8033b23c" : "sTransitionTimer", - "8033b240" : "sTransitionUpdate", - "8033b244" : "unused3", - "8033b248" : "sWarpDest", - "8033b250" : "D_80339EE0", - "8033b252" : "sDelayedWarpOp", - "8033b254" : "sDelayedWarpTimer", - "8033b256" : "sSourceWarpNodeId", - "8033b258" : "sDelayedWarpArg", - "8033b25c" : "unused4", - "8033b25e" : "sTimerRunning", - "8033b260" : "gHudDisplay", - "8033b26e" : "gShouldNotPlayCastleMusic", - "8033b270" : "sDelayInvincTimer", - "8033b272" : "sInvulnerable", - "8033b280" : "unused80339F10", - "8033b288" : "filler80339F1C", - "8033b2c0" : "D_80339F50", - "8033b350" : "gMirrorMario", - "8033b3b0" : "gBodyStates", - "8033b400" : "sSegmentTable", - "8033b480" : "sPoolFreeSpace", - "8033b484" : "sPoolStart", - "8033b488" : "sPoolEnd", - "8033b48c" : "sPoolListHeadL", - "8033b490" : "sPoolListHeadR", - "8033b494" : "gEffectsMemoryPool", - "8033b4a0" : "gWarpCheckpoint", - "8033b4a5" : "gMainMenuDataModified", - "8033b4a6" : "gSaveFileModified", - "8033b4b0" : "gPlayerSpawnInfos", - "8033b4d0" : "D_8033A160", - "8033b8d0" : "gAreaData", - "8033bab0" : "gWarpTransition", - "8033bac6" : "gCurrCourseNum", - "8033bac8" : "gCurrActNum", - "8033baca" : "gCurrAreaIndex", - "8033bacc" : "gSavedCourseNum", - "8033bace" : "gPauseScreenMode", - "8033bad0" : "gSaveOptSelectIndex", - "8033bae0" : "gMatStackIndex", - "8033bae8" : "gMatStack", - "8033c2e8" : "gMatStackFixed", - "8033c368" : "gGeoTempState", - "8033c378" : "gCurAnimType", - "8033c379" : "gCurAnimEnabled", - "8033c37a" : "gCurrAnimFrame", - "8033c37c" : "gCurAnimTranslationMultiplier", - "8033c380" : "gCurrAnimAttribute", - "8033c384" : "gCurAnimData", - "8033c388" : "gDisplayListHeap", - "8033c390" : "gProfilerFrameData", - "8033c520" : "gPlayerCameraState", - "8033c568" : "sOldPosition", - "8033c578" : "sOldFocus", - "8033c588" : "sPlayer2FocusOffset", - "8033c594" : "sCreditsPlayer2Pitch", - "8033c596" : "sCreditsPlayer2Yaw", - "8033c598" : "sFramesPaused", - "8033c5a0" : "sFOVState", - "8033c5c0" : "sModeTransition", - "8033c5e8" : "sMarioGeometry", - "8033c61c" : "unusedFreeRoamWallYaw", - "8033c61e" : "sAvoidYawVel", - "8033c620" : "sCameraYawAfterDoorCutscene", - "8033c622" : "unusedSplinePitch", - "8033c624" : "unusedSplineYaw", - "8033c628" : "sHandheldShakeSpline", - "8033c668" : "sHandheldShakeMag", - "8033c66c" : "sHandheldShakeTimer", - "8033c670" : "sHandheldShakeInc", - "8033c674" : "sHandheldShakePitch", - "8033c676" : "sHandheldShakeYaw", - "8033c678" : "sHandheldShakeRoll", - "8033c67c" : "unused8033B30C", - "8033c680" : "unused8033B310", - "8033c684" : "sSelectionFlags", - "8033c686" : "unused8033B316", - "8033c688" : "s2ndRotateFlags", - "8033c68a" : "unused8033B31A", - "8033c68c" : "sCameraSoundFlags", - "8033c68e" : "sCButtonsPressed", - "8033c690" : "sCutsceneDialogID", - "8033c698" : "gLakituState", - "8033c758" : "unused8033B3E8", - "8033c75a" : "sAreaYaw", - "8033c75c" : "sAreaYawChange", - "8033c75e" : "sLakituDist", - "8033c760" : "sLakituPitch", - "8033c764" : "sZoomAmount", - "8033c768" : "sCSideButtonYaw", - "8033c76a" : "sBehindMarioSoundTimer", - "8033c76c" : "sZeroZoomDist", - "8033c770" : "sCUpCameraPitch", - "8033c772" : "sModeOffsetYaw", - "8033c774" : "sSpiralStairsYawOffset", - "8033c776" : "s8DirModeBaseYaw", - "8033c778" : "s8DirModeYawOffset", - "8033c77c" : "sPanDistance", - "8033c780" : "sCannonYOffset", - "8033c788" : "sModeInfo", - "8033c7d0" : "sCastleEntranceOffset", - "8033c7dc" : "sParTrackIndex", - "8033c7e0" : "sParTrackPath", - "8033c7e8" : "sParTrackTransOff", - "8033c808" : "sCameraStoreCUp", - "8033c828" : "sCameraStoreCutscene", - "8033c848" : "gCameraMovementFlags", - "8033c84a" : "sStatusFlags", - "8033c850" : "sCurCreditsSplinePos", - "8033c950" : "sCurCreditsSplineFocus", - "8033ca50" : "sCutsceneSplineSegment", - "8033ca54" : "sCutsceneSplineSegmentProgress", - "8033ca58" : "unused8033B6E8", - "8033ca5a" : "sCutsceneShot", - "8033ca5c" : "gCutsceneTimer", - "8033ca60" : "sCutsceneVars", - "8033cbc8" : "gObjCutsceneDone", - "8033cbcc" : "gCutsceneObjSpawn", - "8033cbd0" : "gCamera", - "8033cbe0" : "gObjectListArray", - "8033d260" : "gDebugInfoFlags", - "8033d264" : "gNumFindFloorMisses", - "8033d268" : "unused_8033BEF8", - "8033d26c" : "gUnknownWallCount", - "8033d270" : "gObjectCounter", - "8033d274" : "gNumCalls", - "8033d280" : "gDebugInfo", - "8033d380" : "gDebugInfoOverwrite", - "8033d480" : "gTimeStopState", - "8033d488" : "gObjectPool", - "80360e88" : "gMacroObjectDefaultParent", - "803610e8" : "gObjectLists", - "803610f0" : "gFreeObjectList", - "80361158" : "gMarioObject", - "8036115c" : "gLuigiObject", - "80361160" : "gCurrentObject", - "80361164" : "gCurBhvCommand", - "80361168" : "gPrevFrameObjectCount", - "8036116c" : "gSurfaceNodesAllocated", - "80361170" : "gSurfacesAllocated", - "80361174" : "gNumStaticSurfaceNodes", - "80361178" : "gNumStaticSurfaces", - "8036117c" : "gObjectMemoryPool", - "80361180" : "gCheckingSurfaceCollisionsForCamera", - "80361182" : "gFindFloorIncludeSurfaceIntangible", - "80361184" : "gEnvironmentRegions", - "80361188" : "gEnvironmentLevels", - "803611d8" : "gDoorAdjacentRooms", - "80361250" : "gMarioCurrentRoom", - "80361252" : "D_8035FEE2", - "80361254" : "D_8035FEE4", - "80361256" : "gTHIWaterDrained", - "80361258" : "gTTCSpeedSetting", - "8036125a" : "gMarioShotFromCannon", - "8036125c" : "gCCMEnteredSlide", - "8036125e" : "gNumRoomedObjectsInMarioRoom", - "80361260" : "gNumRoomedObjectsNotInMarioRoom", - "80361262" : "gWDWWaterLevelChanging", - "80361264" : "gMarioOnMerryGoRound", - "80361280" : "D_8035FF10", - "80361290" : "gDebugPrintState1", - "803612a0" : "gDebugPrintState2", - "803612b0" : "sMarioOnFlyingCarpet", - "803612b2" : "sSurfaceTypeBelowShadow", - "803612b4" : "gShadowAboveWaterOrLava", - "803612b5" : "gMarioOnIceOrCarpet", - "803612c0" : "sSkyBoxInfo", - "803612e0" : "gMovetexLastTextureId", - "803612f0" : "gFlyingCarpetState", - "80361300" : "gPaintingMarioFloorType", - "80361304" : "gPaintingMarioXPos", - "80361308" : "gPaintingMarioYPos", - "8036130c" : "gPaintingMarioZPos", - "80361310" : "gPaintingMesh", - "80361314" : "gPaintingTriNorms", - "80361318" : "gRipplingPainting", - "8036131c" : "gDddPaintingStatus", - "80361320" : "sTextLabels", - "803613f0" : "gDialogColorFadeTimer", - "803613f2" : "gLastDialogLineNum", - "803613f4" : "gDialogVariable", - "803613f8" : "gDialogTextAlpha", - "803613fa" : "gCutsceneMsgXOffset", - "803613fc" : "gCutsceneMsgYOffset", - "803613fe" : "gRedCoinsCollected", - "80361400" : "gEnvFxBuffer", - "80361408" : "gSnowCylinderLastPos", - "80361414" : "gSnowParticleCount", - "80361416" : "gSnowParticleMaxCount", - "80361420" : "gEnvFxBubbleConfig", - "80361460" : "sNumActiveFirePiranhaPlants", - "80361464" : "sNumKilledFirePiranhaPlants", - "80361468" : "sObjSavedPosX", - "8036146c" : "sObjSavedPosY", - "80361470" : "sObjSavedPosZ", - "80361474" : "sMontyMoleHoleList", - "80361478" : "sMontyMoleKillStreak", - "8036147c" : "sMontyMoleLastKilledPosX", - "80361480" : "sMontyMoleLastKilledPosY", - "80361484" : "sMontyMoleLastKilledPosZ", - "80361488" : "sMasterTreadmill", - "80361490" : "gCurrAiBuffer", - "80361498" : "sSoundRequests", - "80361c98" : "D_80360928", - "80361f98" : "sUsedChannelsForSoundBank", - "80361fa8" : "sCurrentSound", - "80361fb8" : "gSoundBanks", - "80364b78" : "D_80363808", - "80364b82" : "D_80363812", - "80364b88" : "sBackgroundMusicQueue", - "80364ba0" : "D_80363830", - "80364c20" : "D_803638B0", - "80365e70" : "piMgrThread", - "80366020" : "piMgrStack", - "80367020" : "__osPiMesgQueue", - "80367038" : "piMgrMesgBuff", - "80367040" : "D_80365CD0", - "80367050" : "D_80365CE0", - "8036708c" : "D_80365D1C", - "80367090" : "D_80365D20", - "80367091" : "_osCont_numControllers", - "80367098" : "D_80365D28", - "803670b8" : "_osContMesgQueue", - "803670d0" : "_osContMesgBuff", - "803670f0" : "D_80365D80", - "80367110" : "_osCurrentTime", - "80367118" : "D_80365DA8", - "8036711c" : "__osViIntrCount", - "80367120" : "D_80365DB0", - "80367130" : "osPiMesgBuff", - "80367138" : "gOsPiMessageQueue", - "80367150" : "osSiMesgBuff", - "80367158" : "gOsSiMessageQueue", - "80367170" : "D_80365E00", - "803671ac" : "D_80365E3C", - "803671b0" : "D_80365E40", - "803672b0" : "gInterruptedThread", - "80367460" : ".", - "80367460" : "_mainSegmentNoloadEnd", - "0000cee0" : "_mainSegmentNoloadSizeLo", - "00000002" : "_mainSegmentNoloadSizeHi", - "00000001" : "ASSERT", - "80378800" : "_engineSegmentStart", - "007cc6c0" : "_engineSegmentRomStart", - "80378800" : "vec3f_copy", - "80378840" : "vec3f_set", - "8037888c" : "vec3f_add", - "803788e4" : "vec3f_sum", - "8037893c" : "vec3s_copy", - "8037897c" : "vec3s_set", - "803789c8" : "vec3s_add", - "80378a20" : "vec3s_sum", - "80378a78" : "vec3s_sub", - "80378ad0" : "vec3s_to_vec3f", - "80378b34" : "vec3f_to_vec3s", - "80378c50" : "find_vector_perpendicular_to_plane", - "80378d38" : "vec3f_cross", - "80378dc0" : "vec3f_normalize", - "80378e68" : "mtxf_copy", - "80378eb4" : "mtxf_identity", - "80378f24" : "mtxf_translate", - "80378f84" : "mtxf_lookat", - "80379440" : "mtxf_rotate_zxy_and_translate", - "803795f0" : "mtxf_rotate_xyz_and_translate", - "80379798" : "mtxf_billboard", - "80379918" : "mtxf_align_terrain_normal", - "80379aa4" : "mtxf_align_terrain_triangle", - "80379f60" : "mtxf_mul", - "8037a29c" : "mtxf_scale_vec3f", - "8037a348" : "mtxf_mul_vec3s", - "8037a434" : "mtxf_to_mtx", - "8037a4b8" : "mtxf_rotate_xy", - "8037a550" : "get_pos_from_transform_mtx", - "8037a69c" : "vec3f_get_dist_and_angle", - "8037a788" : "vec3f_set_dist_and_angle", - "8037a860" : "approach_s32", - "8037a8b4" : "approach_f32", - "8037a9a8" : "atan2s", - "8037ab88" : "atan2f", - "8037abec" : "spline_get_weights", - "8037afb8" : "anim_spline_init", - "8037afe8" : "anim_spline_poll", - "8037b220" : "init_scene_graph_node_links", - "8037b24c" : "init_graph_node_root", - "8037b30c" : "init_graph_node_ortho_projection", - "8037b380" : "init_graph_node_perspective", - "8037b448" : "init_graph_node_start", - "8037b4ac" : "init_graph_node_master_list", - "8037b530" : "init_graph_node_render_range", - "8037b5b4" : "init_graph_node_switch_case", - "8037b670" : "init_graph_node_camera", - "8037b744" : "init_graph_node_translation_rotation", - "8037b7f8" : "init_graph_node_translation", - "8037b89c" : "init_graph_node_rotation", - "8037b940" : "init_graph_node_scale", - "8037b9e0" : "init_graph_node_object", - "8037bad4" : "init_graph_node_culling_radius", - "8037bb48" : "init_graph_node_animated_part", - "8037bbec" : "init_graph_node_billboard", - "8037bc90" : "init_graph_node_display_list", - "8037bd24" : "init_graph_node_shadow", - "8037bdb4" : "init_graph_node_object_parent", - "8037be28" : "init_graph_node_generated", - "8037becc" : "init_graph_node_background", - "8037bf84" : "init_graph_node_held_object", - "8037c044" : "geo_add_child", - "8037c0bc" : "geo_remove_child", - "8037c138" : "geo_make_first_child", - "8037c1e4" : "geo_call_global_function_nodes_helper", - "8037c360" : "geo_call_global_function_nodes", - "8037c3d0" : "geo_reset_object_node", - "8037c448" : "geo_obj_init", - "8037c51c" : "geo_obj_init_spawninfo", - "8037c658" : "geo_obj_init_animation", - "8037c708" : "geo_obj_init_animation_accel", - "8037c7d8" : "retrieve_animation_index", - "8037c844" : "geo_update_animation_frame", - "8037c9e8" : "geo_retreive_animation_translation", - "8037cb10" : "geo_find_root", - "8037cb60" : "read_vec3s_to_vec3f", - "8037cbc0" : "read_vec3s", - "8037cbfc" : "read_vec3s_angle", - "8037cc74" : "register_scene_graph_node", - "8037cd60" : "geo_layout_cmd_branch_and_link", - "8037ce24" : "geo_layout_cmd_end", - "8037cee8" : "geo_layout_cmd_branch", - "8037cf70" : "geo_layout_cmd_return", - "8037cfc0" : "geo_layout_cmd_open_node", - "8037d018" : "geo_layout_cmd_close_node", - "8037d050" : "geo_layout_cmd_assign_as_view", - "8037d0d0" : "geo_layout_cmd_update_node_flags", - "8037d1d0" : "geo_layout_cmd_node_root", - "8037d328" : "geo_layout_cmd_node_ortho_projection", - "8037d3a4" : "geo_layout_cmd_node_perspective", - "8037d48c" : "geo_layout_cmd_node_start", - "8037d4dc" : "geo_layout_cmd_nop3", - "8037d500" : "geo_layout_cmd_node_master_list", - "8037d55c" : "geo_layout_cmd_node_level_of_detail", - "8037d5d4" : "geo_layout_cmd_node_switch_case", - "8037d640" : "geo_layout_cmd_node_camera", - "8037d6f0" : "geo_layout_cmd_node_translation_rotation", - "8037d8d4" : "geo_layout_cmd_node_translation", - "8037d998" : "geo_layout_cmd_node_rotation", - "8037da5c" : "geo_layout_cmd_node_scale", - "8037db50" : "geo_layout_cmd_nop2", - "8037db74" : "geo_layout_cmd_node_animated_part", - "8037dc10" : "geo_layout_cmd_node_billboard", - "8037dcd4" : "geo_layout_cmd_node_display_list", - "8037dd4c" : "geo_layout_cmd_node_shadow", - "8037dddc" : "geo_layout_cmd_node_object_parent", - "8037de34" : "geo_layout_cmd_node_generated", - "8037de94" : "geo_layout_cmd_node_background", - "8037def8" : "geo_layout_cmd_nop", - "8037df1c" : "geo_layout_cmd_copy_view", - "8037dfd4" : "geo_layout_cmd_node_held_obj", - "8037e058" : "geo_layout_cmd_node_culling_radius", - "8037e0b4" : "process_geo_layout", - "803805c8" : "level_script_execute", - "80380de8" : "f32_find_wall_collision", - "80380e8c" : "find_wall_collisions", - "80381264" : "find_ceil", - "80381470" : "unused_obj_find_floor_height", - "803814b8" : "find_floor_height_and_data", - "80381794" : "find_floor_height", - "803817e0" : "unused_find_dynamic_floor", - "80381900" : "find_floor", - "80381ba0" : "find_water_level", - "80381d3c" : "find_poison_gas_level", - "80381f08" : "debug_surface_list_info", - "80382294" : "unused_resolve_floor_or_ceil_collisions", - "80383340" : "alloc_surface_pools", - "803833b8" : "load_area_terrain", - "803835a4" : "clear_dynamic_surfaces", - "80383614" : "transform_object_vertices", - "80383828" : "load_object_surfaces", - "803839cc" : "load_object_collision_model", - "80383bb0" : "random_u16", - "80383cb4" : "random_float", - "80383d1c" : "random_sign", - "80383d68" : "obj_update_gfx_pos_and_angle", - "80385bf0" : "stub_behavior_script_2", - "80385c00" : "cur_obj_update", - "80385f90" : "identityMtx", - "80385fb0" : "zeroMtx", - "80385fd0" : "gVec3fZero", - "80385fdc" : "gVec3sZero", - "80385fe4" : "gVec3fOne", - "80385ff0" : "gVec3sOne", - "80386000" : "gSineTable", - "80387000" : "gCosineTable", - "8038b000" : "gArctanTable", - "8038b810" : "GeoLayoutJumpTable", - "8038b894" : "unused_8038B894", - "8038bc90" : "_engineSegmentEnd", - "007dfb50" : "_engineSegmentRomEnd", - "8038bc90" : "_engineSegmentNoloadStart", - "8038bc90" : "gSplineKeyframe", - "8038bc94" : "gSplineKeyframeFraction", - "8038bc98" : "gSplineState", - "8038bca0" : "gGraphNodePool", - "8038bca4" : "gCurRootGraphNode", - "8038bca8" : "D_8038BCA8", - "8038bcac" : "gGeoViews", - "8038bcb0" : "gGeoNumViews", - "8038bcb8" : "gGeoLayoutStack", - "8038bcf8" : "gCurGraphNodeList", - "8038bd78" : "gCurGraphNodeIndex", - "8038bd7a" : "gGeoLayoutStackIndex", - "8038bd7c" : "D_8038BD7C", - "8038bd7e" : "gGeoLayoutReturnIndex", - "8038bd80" : "gGeoLayoutCommand", - "8038bd88" : "gObjParentGraphNode", - "8038be30" : "sFloorGeo", - "8038be90" : "unused8038BE90", - "8038be98" : "gStaticSurfacePartition", - "8038d698" : "gDynamicSurfacePartition", - "8038ee98" : "sSurfaceNodePool", - "8038ee9c" : "sSurfacePool", - "8038eea0" : "sSurfacePoolSize", - "8038eea8" : "unused8038EEA8", - "8038eef0" : "_engineSegmentNoloadEnd", - "8038f800" : ".", - "8038f800" : "_framebuffersSegmentNoloadStart", - "8038f800" : "0x70800", - "8038f800" : "gFrameBuffer0", - "803b5000" : "gFrameBuffer1", - "803da800" : "gFrameBuffer2", - "80400000" : "_framebuffersSegmentNoloadEnd", - "80400000" : "__expansionRamStart", - "00000001" : "ASSERT", - "10000000" : "_entrySegmentStart", - "007cc6c0" : "_entrySegmentRomStart", - "10000000" : "level_script_entry", - "10000030" : "_entrySegmentEnd", - "007cc6f0" : "_entrySegmentRomEnd", - "02000000" : "_segment2_mio0SegmentStart", - "007cc6c0" : "_segment2_mio0SegmentRomStart", - "0200bd10" : ".", - "0200bd10" : "_segment2_mio0SegmentEnd", - "007d83d0" : "_segment2_mio0SegmentRomEnd", - "04000000" : "_group0_mio0SegmentStart", - "007cc6c0" : "_group0_mio0SegmentRomStart", - "04013260" : ".", - "04013260" : "_group0_mio0SegmentEnd", - "007df920" : "_group0_mio0SegmentRomEnd", - "17000000" : "_group0_geoSegmentStart", - "007cc6c0" : "_group0_geoSegmentRomStart", - "17000000" : "bubble_geo", - "1700001c" : "purple_marble_geo", - "17000038" : "smoke_geo", - "17000084" : "burn_smoke_geo", - "1700009c" : "small_water_splash_geo", - "170000e0" : "mario_TODO_geo_0000E0", - "17000124" : "idle_water_wave_geo", - "17000168" : "wave_trail_geo", - "170001bc" : "sparkles_geo", - "17000230" : "water_splash_geo", - "17000284" : "sparkles_animation_geo", - "170002e0" : "mario_geo_face_and_wings", - "1700041c" : "mario_geo_left_hand", - "17000494" : "mario_geo_right_hand", - "1700053c" : "mario_geo_body", - "170006f8" : "mario_geo_medium_poly_left_hand", - "17000770" : "mario_geo_medium_poly_right_hand", - "17000818" : "mario_geo_medium_poly_body", - "170009d4" : "mario_geo_low_poly_face_and_wings", - "17000b10" : "mario_geo_low_poly_left_hand", - "17000b88" : "mario_geo_low_poly_right_hand", - "17000c30" : "mario_geo_low_poly_body", - "17000dec" : "mario_vanish_geo_face_and_wings", - "17000f28" : "mario_vanish_geo_left_hand", - "17000fa0" : "mario_vanish_geo_right_hand", - "17001048" : "mario_vanish_geo_body", - "17001204" : "mario_vanish_geo_medium_poly_left_hand", - "1700127c" : "mario_vanish_geo_medium_poly_right_hand", - "17001324" : "mario_vanish_geo_medium_poly_body", - "170014e0" : "mario_vanish_geo_low_poly_face_and_wings", - "1700161c" : "mario_vanish_geo_low_poly_left_hand", - "17001694" : "mario_vanish_geo_low_poly_right_hand", - "1700173c" : "mario_vanish_geo_low_poly_body", - "170018f8" : "mario_metal_geo_face_and_wings", - "170019a4" : "mario_metal_geo_left_hand", - "17001a1c" : "mario_metal_geo_right_hand", - "17001ac4" : "mario_metal_geo_body", - "17001c80" : "mario_metal_geo_medium_poly_left_hand", - "17001cf8" : "mario_metal_geo_medium_poly_right_hand", - "17001da0" : "mario_metal_geo_medium_poly_body", - "17001f5c" : "mario_metal_geo_low_poly_face_and_wings", - "17002008" : "mario_metal_geo_low_poly_left_hand", - "17002080" : "mario_metal_geo_low_poly_right_hand", - "17002128" : "mario_metal_geo_low_poly_body", - "170022e4" : "mario_metal_vanish_geo_face_and_wings", - "17002390" : "mario_metal_vanish_geo_left_hand", - "17002408" : "mario_metal_vanish_geo_right_hand", - "170024b0" : "mario_metal_vanish_geo_body", - "1700266c" : "mario_metal_vanish_geo_medium_poly_left_hand", - "170026e4" : "mario_metal_vanish_geo_medium_poly_right_hand", - "1700278c" : "mario_metal_vanish_geo_medium_poly_body", - "17002958" : "mario_metal_vanish_geo_low_poly_face_and_wings", - "17002a04" : "mario_metal_vanish_geo_low_poly_left_hand", - "17002a7c" : "mario_metal_vanish_geo_low_poly_right_hand", - "17002b24" : "mario_metal_vanish_geo_low_poly_body", - "17002ce0" : "mario_geo_load_body", - "17002d14" : "mario_geo_load_medium_poly_body", - "17002d48" : "mario_geo_load_low_poly_body", - "17002d7c" : "mario_geo_render_body", - "17002dd4" : "mario_geo", - "17002e30" : "_group0_geoSegmentEnd", - "007cf4f0" : "_group0_geoSegmentRomEnd", - "05000000" : "_group1_mio0SegmentStart", - "007cc6c0" : "_group1_mio0SegmentRomStart", - "05008070" : ".", - "05008070" : "_group1_mio0SegmentEnd", - "007d4730" : "_group1_mio0SegmentRomEnd", - "0c000000" : "_group1_geoSegmentStart", - "007cc6c0" : "_group1_geoSegmentRomStart", - "0c000000" : "yellow_sphere_geo", - "0c000018" : "hoot_geo", - "0c0001e4" : "yoshi_egg_geo", - "0c000248" : "thwomp_geo", - "0c000264" : "bullet_bill_geo", - "0c00028c" : "heave_ho_geo", - "0c000410" : "_group1_geoSegmentEnd", - "007ccad0" : "_group1_geoSegmentRomEnd", - "05000000" : "_group2_mio0SegmentStart", - "007cc6c0" : "_group2_mio0SegmentRomStart", - "05001e10" : ".", - "05001e10" : "_group2_mio0SegmentEnd", - "007ce4d0" : "_group2_mio0SegmentRomEnd", - "0c000000" : "_group2_geoSegmentStart", - "007cc6c0" : "_group2_geoSegmentRomStart", - "0c000000" : "bully_geo", - "0c000120" : "bully_boss_geo", - "0c000240" : "blargg_geo", - "0c0002b0" : "_group2_geoSegmentEnd", - "007cc970" : "_group2_geoSegmentRomEnd", - "05000000" : "_group3_mio0SegmentStart", - "007cc6c0" : "_group3_mio0SegmentRomStart", - "050068b0" : ".", - "050068b0" : "_group3_mio0SegmentEnd", - "007d2f70" : "_group3_mio0SegmentRomEnd", - "0c000000" : "_group3_geoSegmentStart", - "007cc6c0" : "_group3_geoSegmentRomStart", - "0c000000" : "king_bobomb_geo", - "0c000308" : "water_bomb_geo", - "0c000328" : "water_bomb_shadow_geo", - "0c000340" : "_group3_geoSegmentEnd", - "007cca00" : "_group3_geoSegmentRomEnd", - "05000000" : "_group4_mio0SegmentStart", - "007cc6c0" : "_group4_mio0SegmentRomStart", - "0500a300" : ".", - "0500a300" : "_group4_mio0SegmentEnd", - "007d69c0" : "_group4_mio0SegmentRomEnd", - "0c000000" : "_group4_geoSegmentStart", - "007cc6c0" : "_group4_geoSegmentRomStart", - "0c000000" : "clam_shell_geo", - "0c000068" : "sushi_geo", - "0c00010c" : "unagi_geo", - "0c000280" : "_group4_geoSegmentEnd", - "007cc940" : "_group4_geoSegmentRomEnd", - "05000000" : "_group5_mio0SegmentStart", - "007cc6c0" : "_group5_mio0SegmentRomStart", - "0500bce0" : ".", - "0500bce0" : "_group5_mio0SegmentEnd", - "007d83a0" : "_group5_mio0SegmentRomEnd", - "0c000000" : "_group5_geoSegmentStart", - "007cc6c0" : "_group5_geoSegmentRomStart", - "0c000000" : "klepto_geo", - "0c0002ac" : "eyerok_geo_0002AC", - "0c0005a8" : "eyerok_left_hand_geo", - "0c0005e4" : "eyerok_right_hand_geo", - "0c000610" : "pokey_head_geo", - "0c000644" : "pokey_body_part_geo", - "0c000660" : "_group5_geoSegmentEnd", - "007ccd20" : "_group5_geoSegmentRomEnd", - "05000000" : "_group6_mio0SegmentStart", - "007cc6c0" : "_group6_mio0SegmentRomStart", - "0500e110" : ".", - "0500e110" : "_group6_mio0SegmentEnd", - "007da7d0" : "_group6_mio0SegmentRomEnd", - "0c000000" : "_group6_geoSegmentStart", - "007cc6c0" : "_group6_geoSegmentRomStart", - "0c000000" : "monty_mole_geo", - "0c000110" : "ukiki_geo", - "0c00036c" : "fwoosh_geo", - "0c000390" : "_group6_geoSegmentEnd", - "007cca50" : "_group6_geoSegmentRomEnd", - "05000000" : "_group7_mio0SegmentStart", - "007cc6c0" : "_group7_mio0SegmentRomStart", - "05005070" : ".", - "05005070" : "_group7_mio0SegmentEnd", - "007d1730" : "_group7_mio0SegmentRomEnd", - "0c000000" : "_group7_geoSegmentStart", - "007cc6c0" : "_group7_geoSegmentRomStart", - "0c000000" : "spindrift_geo", - "0c000104" : "penguin_geo", - "0c00021c" : "mr_blizzard_hidden_geo", - "0c000348" : "mr_blizzard_geo", - "0c000370" : "_group7_geoSegmentEnd", - "007cca30" : "_group7_geoSegmentRomEnd", - "05000000" : "_group8_mio0SegmentStart", - "007cc6c0" : "_group8_mio0SegmentRomStart", - "05001180" : ".", - "05001180" : "_group8_mio0SegmentEnd", - "007cd840" : "_group8_mio0SegmentRomEnd", - "0c000000" : "_group8_geoSegmentStart", - "007cc6c0" : "_group8_geoSegmentRomStart", - "0c000000" : "springboard_top_geo", - "0c000018" : "springboard_spring_geo", - "0c000030" : "springboard_bottom_geo", - "0c000048" : "cap_switch_geo", - "0c000090" : "_group8_geoSegmentEnd", - "007cc750" : "_group8_geoSegmentRomEnd", - "05000000" : "_group9_mio0SegmentStart", - "007cc6c0" : "_group9_mio0SegmentRomStart", - "05006960" : ".", - "05006960" : "_group9_mio0SegmentEnd", - "007d3020" : "_group9_mio0SegmentRomEnd", - "0c000000" : "_group9_geoSegmentStart", - "007cc6c0" : "_group9_geoSegmentRomStart", - "0c000000" : "bookend_part_geo", - "0c0000c0" : "bookend_geo", - "0c0000d8" : "haunted_chair_geo", - "0c000188" : "small_key_geo", - "0c0001b4" : "mad_piano_geo", - "0c000224" : "boo_geo", - "0c000274" : "haunted_cage_geo", - "0c0002b0" : "_group9_geoSegmentEnd", - "007cc970" : "_group9_geoSegmentRomEnd", - "05000000" : "_group10_mio0SegmentStart", - "007cc6c0" : "_group10_mio0SegmentRomStart", - "05012cd0" : ".", - "05012cd0" : "_group10_mio0SegmentEnd", - "007df390" : "_group10_mio0SegmentRomEnd", - "0c000000" : "_group10_geoSegmentStart", - "007cc6c0" : "_group10_geoSegmentRomStart", - "0c000000" : "birds_geo", - "0c000098" : "peach_geo_000098", - "0c000254" : "peach_geo_000254", - "0c000410" : "peach_geo", - "0c000468" : "yoshi_geo", - "0c000670" : "_group10_geoSegmentEnd", - "007ccd30" : "_group10_geoSegmentRomEnd", - "05000000" : "_group11_mio0SegmentStart", - "007cc6c0" : "_group11_mio0SegmentRomStart", - "050073f0" : ".", - "050073f0" : "_group11_mio0SegmentEnd", - "007d3ab0" : "_group11_mio0SegmentRomEnd", - "0c000000" : "_group11_geoSegmentStart", - "007cc6c0" : "_group11_geoSegmentRomStart", - "0c000000" : "bubba_geo", - "0c000030" : "wiggler_head_geo", - "0c0001bc" : "enemy_lakitu_geo", - "0c000290" : "spiny_ball_geo", - "0c000328" : "spiny_geo", - "0c0004a0" : "_group11_geoSegmentEnd", - "007ccb60" : "_group11_geoSegmentRomEnd", - "06000000" : "_group12_mio0SegmentStart", - "007cc6c0" : "_group12_mio0SegmentRomStart", - "06030c30" : ".", - "06030c30" : "_group12_mio0SegmentEnd", - "007fd2f0" : "_group12_mio0SegmentRomEnd", - "0d000000" : "_group12_geoSegmentStart", - "007cc6c0" : "_group12_geoSegmentRomStart", - "0d000000" : "bowser_flames_geo", - "0d000090" : "invisible_bowser_accessory_geo", - "0d0000b0" : "bowser_1_yellow_sphere_geo", - "0d0000d8" : "bowser_geo_0000D8", - "0d000424" : "bowser_geo_000424", - "0d000770" : "bowser_geo_000770", - "0d000ab8" : "bowser_shadow_geo", - "0d000ac4" : "bowser_geo", - "0d000b40" : "bowser2_geo", - "0d000bbc" : "bowser_bomb_geo", - "0d000bfc" : "bowser_impact_smoke_geo", - "0d000c50" : "_group12_geoSegmentEnd", - "007cd310" : "_group12_geoSegmentRomEnd", - "06000000" : "_group13_mio0SegmentStart", - "007cc6c0" : "_group13_mio0SegmentRomStart", - "0600a0f0" : ".", - "0600a0f0" : "_group13_mio0SegmentEnd", - "007d67b0" : "_group13_mio0SegmentRomEnd", - "0d000000" : "_group13_geoSegmentStart", - "007cc6c0" : "_group13_geoSegmentRomStart", - "0d000000" : "skeeter_geo", - "0d000284" : "seaweed_geo", - "0d0002f4" : "water_mine_geo", - "0d000324" : "cyan_fish_geo", - "0d00038c" : "bub_geo", - "0d000414" : "water_ring_geo", - "0d000450" : "treasure_chest_base_geo", - "0d000468" : "treasure_chest_lid_geo", - "0d000480" : "_group13_geoSegmentEnd", - "007ccb40" : "_group13_geoSegmentRomEnd", - "06000000" : "_group14_mio0SegmentStart", - "007cc6c0" : "_group14_mio0SegmentRomStart", - "06013a60" : ".", - "06013a60" : "_group14_mio0SegmentEnd", - "007e0120" : "_group14_mio0SegmentRomEnd", - "0d000000" : "_group14_geoSegmentStart", - "007cc6c0" : "_group14_geoSegmentRomStart", - "0d000000" : "koopa_flag_geo", - "0d0000b8" : "wooden_post_geo", - "0d0000d0" : "koopa_without_shell_geo", - "0d000214" : "koopa_with_shell_geo", - "0d000358" : "piranha_plant_geo", - "0d000480" : "whomp_geo", - "0d0005d0" : "metallic_ball_geo", - "0d0005ec" : "chain_chomp_geo", - "0d000680" : "_group14_geoSegmentEnd", - "007ccd40" : "_group14_geoSegmentRomEnd", - "06000000" : "_group15_mio0SegmentStart", - "007cc6c0" : "_group15_mio0SegmentRomStart", - "0600c8e0" : ".", - "0600c8e0" : "_group15_mio0SegmentEnd", - "007d8fa0" : "_group15_mio0SegmentRomEnd", - "0d000000" : "_group15_geoSegmentStart", - "007cc6c0" : "_group15_geoSegmentRomStart", - "0d000000" : "lakitu_geo", - "0d000114" : "toad_geo_000114", - "0d00027c" : "toad_geo_00027C", - "0d0003e4" : "toad_geo", - "0d000448" : "mips_geo", - "0d0005b0" : "boo_castle_geo", - "0d000600" : "_group15_geoSegmentEnd", - "007cccc0" : "_group15_geoSegmentRomEnd", - "06000000" : "_group16_mio0SegmentStart", - "007cc6c0" : "_group16_mio0SegmentRomStart", - "06002ba0" : ".", - "06002ba0" : "_group16_mio0SegmentEnd", - "007cf260" : "_group16_mio0SegmentRomEnd", - "0d000000" : "_group16_geoSegmentStart", - "007cc6c0" : "_group16_geoSegmentRomStart", - "0d000000" : "moneybag_geo_000000", - "0d000078" : "moneybag_geo_000078", - "0d0000f0" : "moneybag_geo", - "0d000150" : "_group16_geoSegmentEnd", - "007cc810" : "_group16_geoSegmentRomEnd", - "06000000" : "_group17_mio0SegmentStart", - "007cc6c0" : "_group17_mio0SegmentRomStart", - "06009c50" : ".", - "06009c50" : "_group17_mio0SegmentEnd", - "007d6310" : "_group17_mio0SegmentRomEnd", - "0d000000" : "_group17_geoSegmentStart", - "007cc6c0" : "_group17_geoSegmentRomStart", - "0d000000" : "mr_i_geo", - "0d00001c" : "mr_i_iris_geo", - "0d0000dc" : "swoop_geo", - "0d0001a0" : "snufit_geo", - "0d000230" : "dorrie_geo", - "0d000394" : "scuttlebug_geo", - "0d0006d0" : "_group17_geoSegmentEnd", - "007ccd90" : "_group17_geoSegmentRomEnd", - "08000000" : "_common0_mio0SegmentStart", - "007cc6c0" : "_common0_mio0SegmentRomStart", - "0800e6d0" : ".", - "0800e6d0" : "_common0_mio0SegmentEnd", - "007dad90" : "_common0_mio0SegmentRomEnd", - "0f000000" : "_common0_geoSegmentStart", - "007cc6c0" : "_common0_geoSegmentRomStart", - "0f000000" : "blue_coin_switch_geo", - "0f000020" : "test_platform_geo", - "0f000028" : "amp_geo", - "0f0001a8" : "cannon_base_geo", - "0f0001c0" : "cannon_barrel_geo", - "0f0001d8" : "chuckya_geo", - "0f0004cc" : "purple_switch_geo", - "0f0004e4" : "checkerboard_platform_geo", - "0f0004fc" : "heart_geo", - "0f000518" : "flyguy_geo", - "0f0005d0" : "breakable_box_geo", - "0f000610" : "breakable_box_small_geo", - "0f000640" : "bowling_ball_geo", - "0f00066c" : "bowling_ball_track_geo", - "0f000694" : "exclamation_box_geo", - "0f0006e4" : "goomba_geo", - "0f0007b8" : "black_bobomb_geo", - "0f0008f4" : "bobomb_buddy_geo", - "0f000a30" : "metal_box_geo", - "0f000a58" : "exclamation_box_outline_geo", - "0f000ab0" : "koopa_shell_geo", - "0f000adc" : "koopa_shell2_geo", - "0f000b08" : "koopa_shell3_geo", - "0f000b40" : "_common0_geoSegmentEnd", - "007cd200" : "_common0_geoSegmentRomEnd", - "03000000" : "_common1_mio0SegmentStart", - "007cc6c0" : "_common1_mio0SegmentRomStart", - "03017990" : ".", - "03017990" : "_common1_mio0SegmentEnd", - "007e4050" : "_common1_mio0SegmentRomEnd", - "16000000" : "_common1_geoSegmentStart", - "007cc6c0" : "_common1_geoSegmentRomStart", - "16000000" : "mist_geo", - "16000020" : "white_puff_geo", - "16000040" : "explosion_geo", - "160000a8" : "butterfly_geo", - "1600013c" : "yellow_coin_geo", - "160001a0" : "yellow_coin_no_shadow_geo", - "16000200" : "blue_coin_geo", - "16000264" : "blue_coin_no_shadow_geo", - "160002c4" : "red_coin_geo", - "16000328" : "red_coin_no_shadow_geo", - "16000388" : "warp_pipe_geo", - "160003a8" : "castle_door_geo", - "1600043c" : "cabin_door_geo", - "160004d0" : "wooden_door_geo", - "16000564" : "wooden_door2_geo", - "160005f8" : "metal_door_geo", - "1600068c" : "hazy_maze_door_geo", - "16000720" : "haunted_door_geo", - "160007b4" : "castle_door_0_star_geo", - "16000868" : "castle_door_1_star_geo", - "1600091c" : "castle_door_3_stars_geo", - "160009d0" : "key_door_geo", - "16000a84" : "bowser_key_geo", - "16000ab0" : "bowser_key_cutscene_geo", - "16000b10" : "red_flame_shadow_geo", - "16000b2c" : "red_flame_geo", - "16000b8c" : "blue_flame_geo", - "16000bec" : "fish_shadow_geo", - "16000c44" : "fish_geo", - "16000c8c" : "leaves_geo", - "16000ca4" : "marios_cap_geo", - "16000cf0" : "marios_metal_cap_geo", - "16000d3c" : "marios_wing_cap_geo", - "16000da8" : "marios_winged_metal_cap_geo", - "16000e14" : "number_geo", - "16000e84" : "mushroom_1up_geo", - "16000ea0" : "star_geo", - "16000ed4" : "dirt_animation_geo", - "16000f24" : "cartoon_star_geo", - "16000f6c" : "transparent_star_geo", - "16000f98" : "white_particle_geo", - "16000fb4" : "wooden_signpost_geo", - "16000fe8" : "bubbly_tree_geo", - "16001000" : "spiky_tree_geo", - "16001018" : "snow_tree_geo", - "16001030" : "spiky_tree1_geo", - "16001048" : "palm_tree_geo", - "16001060" : "_common1_geoSegmentEnd", - "007cd720" : "_common1_geoSegmentRomEnd", - "13000000" : "_behaviorSegmentStart", - "007cc6c0" : "_behaviorSegmentRomStart", - "13000000" : "bhvStarDoor", - "13000054" : "bhvMrI", - "1300008c" : "bhvMrIBody", - "130000ac" : "bhvMrIParticle", - "130000f8" : "bhvPurpleParticle", - "13000118" : "bhvGiantPole", - "13000144" : "bhvPoleGrabbing", - "13000174" : "bhvThiHugeIslandTop", - "13000194" : "bhvThiTinyIslandTop", - "130001ac" : "bhvCapSwitchBase", - "130001cc" : "bhvCapSwitch", - "130001f4" : "bhvKingBobomb", - "13000254" : "bhvBobombAnchorMario", - "13000278" : "bhvBetaChestBottom", - "1300029c" : "bhvBetaChestLid", - "130002b8" : "bhvBubbleParticleSpawner", - "130002e4" : "bhvBubbleMaybe", - "13000338" : "bhvSmallWaterWave", - "13000398" : "bhvSmallWaterWave398", - "130003bc" : "bhvWaterAirBubble", - "13000400" : "bhvSmallParticle", - "13000428" : "bhvPlungeBubble", - "13000444" : "bhvSmallParticleSnow", - "1300046c" : "bhvSmallParticleBubbles", - "13000494" : "bhvFishGroup", - "130004a8" : "bhvCannon", - "130004e4" : "bhvCannonBarrel", - "13000500" : "bhvCannonBaseUnused", - "13000528" : "bhvChuckya", - "13000584" : "bhvChuckyaAnchorMario", - "130005a8" : "bhvUnused05A8", - "130005b4" : "bhvRotatingPlatform", - "130005d8" : "bhvTower", - "13000600" : "bhvBulletBillCannon", - "13000624" : "bhvWfBreakableWallRight", - "13000638" : "bhvWfBreakableWallLeft", - "1300066c" : "bhvKickableBoard", - "130006a4" : "bhvTowerDoor", - "130006d8" : "bhvRotatingCounterClockwise", - "130006e0" : "bhvWfRotatingWoodenPlatform", - "13000708" : "bhvKoopaShellUnderwater", - "13000720" : "bhvExitPodiumWarp", - "1300075c" : "bhvFadingWarp", - "13000780" : "bhvWarp", - "130007a0" : "bhvWarpPipe", - "130007dc" : "bhvWhitePuffExplosion", - "130007f8" : "bhvSpawnedStar", - "1300080c" : "bhvSpawnedStarNoLevelExit", - "13000830" : "bhvMrIBlueCoin", - "13000888" : "bhvCoinInsideBoo", - "130008d0" : "bhvCoinFormationSpawn", - "130008ec" : "bhvCoinFormation", - "1300090c" : "bhvOneCoin", - "1300091c" : "bhvYellowCoin", - "13000940" : "bhvTemporaryYellowCoin", - "13000964" : "bhvThreeCoinsSpawn", - "13000984" : "bhvTenCoinsSpawn", - "130009a4" : "bhvSingleCoinGetsSpawned", - "130009e0" : "bhvCoinSparkles", - "13000a14" : "bhvGoldenCoinSparkles", - "13000a34" : "bhvWallTinyStarParticle", - "13000a54" : "bhvVertStarParticleSpawner", - "13000a78" : "bhvPoundTinyStarParticle", - "13000a98" : "bhvHorStarParticleSpawner", - "13000abc" : "bhvPunchTinyTriangle", - "13000ad8" : "bhvTriangleParticleSpawner", - "13000afc" : "bhvDoorWarp", - "13000b0c" : "bhvDoor", - "13000b58" : "bhvGrindel", - "13000b8c" : "bhvThwomp2", - "13000bc8" : "bhvThwomp", - "13000c04" : "bhvTumblingBridgePlatform", - "13000c28" : "bhvWfTumblingBridge", - "13000c44" : "bhvBbhTumblingBridge", - "13000c64" : "bhvLllTumblingBridge", - "13000c84" : "bhvFlame", - "13000cc8" : "bhvAnotherElavator", - "13000cfc" : "bhvRrElevatorPlatform", - "13000d30" : "bhvHmcElevatorPlatform", - "13000d6c" : "bhvWaterMist", - "13000d98" : "bhvBreathParticleSpawner", - "13000db4" : "bhvBreakBoxTriangle", - "13000dd8" : "bhvWaterMist2", - "13000dfc" : "bhvUnused0DFC", - "13000e24" : "bhvMistCircParticleSpawner", - "13000e3c" : "bhvDirtParticleSpawner", - "13000e58" : "bhvSnowParticleSpawner", - "13000e70" : "bhvWind", - "13000e88" : "bhvEndToad", - "13000eac" : "bhvEndPeach", - "13000ed0" : "bhvUnusedParticleSpawn", - "13000f08" : "bhvUkiki", - "13000f14" : "bhvUkikiCageChild", - "13000f2c" : "bhvUkikiCageStar", - "13000f48" : "bhvUkikiCage", - "13000f9c" : "bhvBitfsSinkingPlatforms", - "13000fc8" : "bhvBitfsSinkingCagePlatform", - "13001000" : "bhvDddMovingPole", - "13001030" : "bhvBitfsTiltingInvertedPyramid", - "13001064" : "bhvSquishablePlatform", - "13001098" : "bhvCutOutObject", - "130010a8" : "bhvBetaMovingFlamesSpawn", - "130010b8" : "bhvBetaMovingFlames", - "130010d8" : "bhvRrRotatingBridgePlatform", - "13001108" : "bhvFlamethrower", - "13001124" : "bhvFlamethrowerFlame", - "13001168" : "bhvBouncingFireball", - "13001184" : "bhvBouncingFireballFlame", - "130011d0" : "bhvBowserShockWave", - "130011ec" : "bhvFireParticleSpawner", - "13001214" : "bhvBlackSmokeMario", - "13001254" : "bhvBlackSmokeBowser", - "1300127c" : "bhvBlackSmokeUpward", - "13001298" : "bhvBetaFishSplashSpawner", - "130012b4" : "bhvSpindrift", - "130012f4" : "bhvTowerPlatformGroup", - "13001318" : "bhvWfSlidingTowerPlatform", - "13001340" : "bhvWfElevatorTowerPlatform", - "13001368" : "bhvWfSolidTowerPlatform", - "13001390" : "bhvLeafParticleSpawner", - "130013a8" : "bhvTreeSnow", - "130013c4" : "bhvTreeLeaf", - "130013dc" : "bhvAnotherTiltingPlatform", - "13001408" : "bhvSquarishPathMoving", - "1300142c" : "bhvPiranhaPlantBubble", - "13001448" : "bhvPiranhaPlantWakingBubbles", - "13001468" : "bhvFloorSwitchAnimatesObject", - "13001478" : "bhvFloorSwitchGrills", - "13001484" : "bhvFloorSwitchHardcodedModel", - "130014ac" : "bhvFloorSwitchHiddenObjects", - "130014bc" : "bhvHiddenObject", - "130014e0" : "bhvBreakableBox", - "13001518" : "bhvPushableMetalBox", - "13001548" : "bhvHeaveHo", - "130015a4" : "bhvHeaveHoThrowMario", - "130015c0" : "bhvCcmTouchedStarSpawn", - "130015e4" : "bhvUnusedPoundablePlatform", - "13001608" : "bhvBetaTrampolineTop", - "13001634" : "bhvBetaTrampolineSpring", - "13001650" : "bhvJumpingBox", - "1300167c" : "bhvBooCage", - "130016ac" : "bhvStub", - "130016b8" : "bhvIgloo", - "130016e4" : "bhvBowserKey", - "13001714" : "bhvGrandStar", - "13001744" : "bhvBetaBooKey", - "13001778" : "bhvAlphaBooKey", - "1300179c" : "bhvBulletBill", - "130017f4" : "bhvWhitePuffSmoke", - "13001820" : "bhvUnused1820", - "13001828" : "bhvBowserTailAnchor", - "13001850" : "bhvBowser", - "130018cc" : "bhvBowserBodyAnchor", - "13001904" : "bhvBowserFlameSpawn", - "13001920" : "bhvTiltingBowserLavaPlatform", - "13001958" : "bhvFallingBowserPlatform", - "13001984" : "bhvBlueBowserFlame", - "130019c8" : "bhvFlameFloatingLanding", - "13001a0c" : "bhvBlueFlamesGroup", - "13001a30" : "bhvFlameBouncing", - "13001a74" : "bhvFlameMovingForwardGrowing", - "13001aa4" : "bhvFlameBowser", - "13001ae8" : "bhvFlameLargeBurningOut", - "13001b2c" : "bhvBlueFish", - "13001b54" : "bhvTankFishGroup", - "13001b70" : "bhvCheckerboardElevatorGroup", - "13001b88" : "bhvCheckerboardPlatformSub", - "13001bb4" : "bhvBowserKeyUnlockDoor", - "13001bd4" : "bhvBowserKeyCourseExit", - "13001bf4" : "bhvInvisibleObjectsUnderBridge", - "13001c04" : "bhvWaterLevelPillar", - "13001c34" : "bhvDddWarp", - "13001c58" : "bhvMoatGrills", - "13001c7c" : "bhvClockMinuteHand", - "13001c8c" : "bhvClockHourHand", - "13001cb0" : "bhvMacroUkiki", - "13001d0c" : "bhvStub1D0C", - "13001d14" : "bhvLllRotatingHexagonalPlatform", - "13001d40" : "bhvLllSinkingRockBlock", - "13001d70" : "bhvStub1D70", - "13001d78" : "bhvLllMovingOctagonalMeshPlatform", - "13001da4" : "bhvSnowBall", - "13001da8" : "bhvLllRotatingBlockWithFireBars", - "13001dcc" : "bhvLllRotatingHexFlame", - "13001e04" : "bhvLllWoodPiece", - "13001e30" : "bhvLllFloatingWoodBridge", - "13001e4c" : "bhvVolcanoFlames", - "13001e6c" : "bhvLllRotatingHexagonalRing", - "13001e94" : "bhvLllSinkingRectangularPlatform", - "13001ec4" : "bhvLllSinkingSquarePlatforms", - "13001ef8" : "bhvLllTiltingInvertedPyramid", - "13001f30" : "bhvUnused1F30", - "13001f3c" : "bhvKoopaShell", - "13001f68" : "bhvKoopaShellFlame", - "13001f90" : "bhvToxBox", - "13001fbc" : "bhvPiranhaPlant", - "13002018" : "bhvLllHexagonalMesh", - "13002038" : "bhvLllBowserPuzzlePiece", - "13002068" : "bhvLllBowserPuzzle", - "13002088" : "bhvTuxiesMother", - "130020d8" : "bhvPenguinBaby", - "130020e0" : "bhvUnused20E0", - "130020e8" : "bhvSmallPenguin", - "1300213c" : "bhvFish2", - "1300214c" : "bhvFish3", - "1300215c" : "bhvLargeFishGroup", - "13002178" : "bhvFish", - "13002194" : "bhvWdwExpressElevator", - "130021c0" : "bhvWdwExpressElevatorPlatform", - "130021e4" : "bhvChirpChirp", - "130021f4" : "bhvChirpChirpUnused", - "1300220c" : "bhvBub", - "13002250" : "bhvExclamationBox", - "1300227c" : "bhvRotatingExclamationMark", - "1300229c" : "bhvSoundSpawner", - "130022b8" : "bhvRockSolid", - "130022d8" : "bhvBowserSubDoor", - "13002308" : "bhvBowsersSub", - "13002338" : "bhvSushiShark", - "13002388" : "bhvSushiSharkCollisionChild", - "130023a4" : "bhvJrbSlidingBox", - "130023d0" : "bhvShipPart3", - "130023ec" : "bhvInSunkenShip3", - "1300241c" : "bhvSunkenShipPart", - "1300243c" : "bhvSunkenShipSetRotation", - "1300244c" : "bhvSunkenShipPart2", - "1300246c" : "bhvInSunkenShip", - "13002480" : "bhvInSunkenShip2", - "130024ac" : "bhvMistParticleSpawner", - "130024dc" : "bhvWhitePuff1", - "13002500" : "bhvWhitePuff2", - "13002528" : "bhvWhitePuffSmoke2", - "13002558" : "bhvPurpleSwitchHiddenBoxes", - "13002568" : "bhvBlueCoinSwitch", - "13002588" : "bhvHiddenBlueCoin", - "130025c0" : "bhvOpenableCageDoor", - "130025e0" : "bhvOpenableGrill", - "130025f8" : "bhvWaterLevelDiamond", - "13002620" : "bhvInitializeChangingWaterLevel", - "13002634" : "bhvTweesterSandParticle", - "13002650" : "bhvTweester", - "13002684" : "bhvMerryGoRoundBooManager", - "1300269c" : "bhvAnimatedTexture", - "130026d4" : "bhvBooInCastle", - "13002710" : "bhvBooWithCage", - "13002768" : "bhvBalconyBigBoo", - "1300277c" : "bhvMerryGoRoundBigBoo", - "13002790" : "bhvGhostHuntBigBoo", - "130027d0" : "bhvCourtyardBooTriplet", - "130027e4" : "bhvBoo", - "130027f4" : "bhvMerryGoRoundBoo", - "13002804" : "bhvGhostHuntBoo", - "1300286c" : "bhvHiddenStaircaseStep", - "13002898" : "bhvBooBossSpawnedBridge", - "130028cc" : "bhvBbhTiltingTrapPlatform", - "130028fc" : "bhvHauntedBookshelf", - "1300292c" : "bhvMeshElevator", - "13002968" : "bhvMerryGoRound", - "13002998" : "bhvPlaysMusicTrackWhenTouched", - "130029b0" : "bhvInsideCannon", - "130029b4" : "bhvBetaBowserAnchor", - "130029e4" : "bhvStaticCheckeredPlatform", - "13002a10" : "bhvUnused2A10", - "13002a20" : "bhvUnusedFakeStar", - "13002a48" : "bhvStaticObject", - "13002a54" : "bhvUnused2A54", - "13002a5c" : "bhvCastleFloorTrap", - "13002a7c" : "bhvFloorTrapInCastle", - "13002aa4" : "bhvTree", - "13002ad0" : "bhvSparkle", - "13002af0" : "bhvSparkleSpawn", - "13002b08" : "bhvSparkleParticleSpawner", - "13002b5c" : "bhvScuttlebug", - "13002ba0" : "bhvScuttlebugSpawn", - "13002bb8" : "bhvWhompKingBoss", - "13002bcc" : "bhvSmallWhomp", - "13002c14" : "bhvWaterSplash", - "13002c60" : "bhvWaterDroplet", - "13002c7c" : "bhvWaterDropletSplash", - "13002cb0" : "bhvBubbleSplash", - "13002ce0" : "bhvIdleWaterWave", - "13002d28" : "bhvObjectWaterSplash", - "13002d50" : "bhvShallowWaterWave", - "13002d7c" : "bhvShallowWaterSplash", - "13002db0" : "bhvObjectWaveTrail", - "13002dc0" : "bhvWaveTrail", - "13002e04" : "bhvTinyStrongWindParticle", - "13002e20" : "bhvStrongWindParticle", - "13002e3c" : "bhvSLSnowmanWind", - "13002e58" : "bhvSLWalkingPenguin", - "13002ea8" : "bhvYellowBall", - "13002ec0" : "bhvMario", - "13002ef8" : "bhvToadMessage", - "13002f40" : "bhvUnlockDoorStar", - "13002f60" : "bhvWarps60", - "13002f64" : "bhvWarps64", - "13002f68" : "bhvWarps68", - "13002f6c" : "bhvWarps6C", - "13002f70" : "bhvDeathWarp", - "13002f74" : "bhvWarps74", - "13002f78" : "bhvWarps78", - "13002f7c" : "bhvWarps7C", - "13002f80" : "bhvPaintingDeathWarp", - "13002f84" : "bhvWarps84", - "13002f88" : "bhvWarps88", - "13002f8c" : "bhvWarps8C", - "13002f90" : "bhvWarps90", - "13002f94" : "bhvWarps94", - "13002fa0" : "bhvRandomAnimatedTexture", - "13002fc0" : "bhvYellowBackgroundInMenu", - "13002fe4" : "bhvMenuButton", - "13003008" : "bhvMenuButtonManager", - "1300302c" : "bhvActSelectorStarType", - "13003048" : "bhvActSelector", - "13003068" : "bhvMovingYellowCoin", - "130030a4" : "bhvMovingBlueCoin", - "130030d4" : "bhvBlueCoinSliding", - "13003104" : "bhvBlueCoinJumping", - "13003134" : "bhvSeaweed", - "13003158" : "bhvSeaweedBundle", - "13003174" : "bhvBobomb", - "130031ac" : "bhvBobombFuseSmoke", - "130031dc" : "bhvBobombBuddy", - "13003228" : "bhvBobombBuddyOpensCannon", - "13003274" : "bhvCannonClosed", - "130032a8" : "bhvWhirlpool", - "130032c8" : "bhvJetStream", - "130032e0" : "bhvMessagePanel", - "13003324" : "bhvSignOnWall", - "13003354" : "bhvHomingAmp", - "13003388" : "bhvCirclingAmp", - "130033bc" : "bhvButterfly", - "130033ec" : "bhvHoot", - "13003420" : "bhvBetaHoldableObject", - "13003454" : "bhvCarrySomething1", - "1300345c" : "bhvCarrySomething2", - "13003464" : "bhvCarrySomething3", - "1300346c" : "bhvCarrySomething4", - "13003474" : "bhvCarrySomething5", - "1300347c" : "bhvCarrySomething6", - "13003484" : "bhvObjectBubble", - "130034c4" : "bhvObjectWaterWave", - "13003510" : "bhvExplosion", - "13003558" : "bhvBobombBullyDeathSmoke", - "13003588" : "bhvSmoke", - "130035b0" : "bhvBobombExplosionBubble", - "13003600" : "bhvBobombExplosionBubble3600", - "13003614" : "bhvRespawner", - "1300362c" : "bhvSmallBully", - "13003660" : "bhvBigBully", - "13003694" : "bhvBigBullyWithMinions", - "130036c8" : "bhvSmallChillBully", - "13003700" : "bhvBigChillBully", - "13003738" : "bhvJetStreamRingSpawner", - "13003750" : "bhvJetStreamWaterRing", - "13003798" : "bhvMantaRayWaterRing", - "130037e0" : "bhvMantaRayRingManager", - "130037ec" : "bhvBowserBomb", - "1300381c" : "bhvBowserBombExplosion", - "13003840" : "bhvBowserBombSmoke", - "13003868" : "bhvCelebrationStar", - "13003888" : "bhvCelebrationStarSparkle", - "130038b0" : "bhvStarKeyCollectionPuffSpawner", - "130038d0" : "bhvLllDrawbridgeSpawner", - "130038e8" : "bhvLllDrawbridge", - "13003910" : "bhvSmallBomp", - "13003940" : "bhvLargeBomp", - "13003970" : "bhvWfSlidingPlatform", - "130039a0" : "bhvMoneybag", - "130039d4" : "bhvMoneybagHidden", - "13003a08" : "bhvPitBowlingBall", - "13003a30" : "bhvFreeBowlingBall", - "13003a58" : "bhvBowlingBall", - "13003a80" : "bhvTtmBowlingBallSpawner", - "13003aa4" : "bhvBobBowlingBallSpawner", - "13003ac8" : "bhvThiBowlingBallSpawner", - "13003ae0" : "bhvRrCruiserWing", - "13003b00" : "bhvSpindel", - "13003b30" : "bhvSslMovingPyramidWall", - "13003b60" : "bhvPyramidElevator", - "13003b98" : "bhvPyramidElevatorTrajectoryMarkerBall", - "13003bb4" : "bhvPyramidTop", - "13003bec" : "bhvPyramidTopFragment", - "13003c0c" : "bhvPyramidPillarTouchDetector", - "13003c30" : "bhvWaterfallSoundLoop", - "13003c44" : "bhvVolcanoSoundLoop", - "13003c58" : "bhvCastleFlagWaving", - "13003c7c" : "bhvBirdsSoundLoop", - "13003c90" : "bhvAmbientSounds", - "13003ca4" : "bhvSandSoundLoop", - "13003cb8" : "bhvHiddenAt120Stars", - "13003ce4" : "bhvSnowmansBottom", - "13003d0c" : "bhvSnowmansHead", - "13003d34" : "bhvSnowmansBodyCheckpoint", - "13003d4c" : "bhvBigSnowmanWhole", - "13003d74" : "bhvBigBoulder", - "13003da0" : "bhvBigBoulderGenerator", - "13003db8" : "bhvWingCap", - "13003dd8" : "bhvMetalCap", - "13003df8" : "bhvNormalCap", - "13003e1c" : "bhvVanishCap", - "13003e3c" : "bhvStar", - "13003e64" : "bhvStarSpawnCoordinates", - "13003e8c" : "bhvHiddenRedCoinStar", - "13003eac" : "bhvRedCoin", - "13003ee4" : "bhvBowserCourseRedCoinStar", - "13003efc" : "bhvHiddenStar", - "13003f1c" : "bhvHiddenStarTrigger", - "13003f40" : "bhvTtmRollingLog", - "13003f78" : "bhvLllVolcanoFallingTrap", - "13003fa4" : "bhvLllRollingLog", - "13003fdc" : "bhv1upWalking", - "13004010" : "bhv1upRunningAway", - "13004044" : "bhv1upSliding", - "1300407c" : "bhv1Up", - "130040b4" : "bhv1upJumpOnApproach", - "130040ec" : "bhvHidden1up", - "13004124" : "bhvHidden1upTrigger", - "13004148" : "bhvHidden1upInPole", - "13004180" : "bhvHidden1upInPoleTrigger", - "130041a4" : "bhvHidden1upInPoleSpawner", - "130041bc" : "bhvControllablePlatform", - "130041f0" : "bhvControllablePlatformSub", - "13004218" : "bhvBreakableBoxSmall", - "13004244" : "bhvSlidingSnowMound", - "13004270" : "bhvSnowMoundSpawn", - "13004284" : "bhvWdwSquareFloatingPlatform", - "130042b4" : "bhvWdwRectangularFloatingPlatform", - "130042e4" : "bhvJrbFloatingPlatform", - "13004314" : "bhvArrowLift", - "13004348" : "bhvOrangeNumber", - "13004370" : "bhvMantaRay", - "130043a0" : "bhvFallingPillar", - "130043c4" : "bhvFallingPillarHitbox", - "130043e0" : "bhvPillarBase", - "13004400" : "bhvJrbFloatingBox", - "1300442c" : "bhvDecorativePendulum", - "1300444c" : "bhvTreasureChestsShip", - "13004470" : "bhvTreasureChestsJrb", - "13004494" : "bhvTreasureChests", - "130044b8" : "bhvTreasureChestBottom", - "130044e0" : "bhvTreasureChestTop", - "130044fc" : "bhvMips", - "13004538" : "bhvYoshi", - "13004580" : "bhvKoopa", - "130045d0" : "bhvKoopaRaceEndpoint", - "130045f8" : "bhvKoopaFlag", - "13004634" : "bhvPokey", - "13004668" : "bhvPokeyBodyPart", - "13004698" : "bhvSwoop", - "130046dc" : "bhvFlyGuy", - "1300472c" : "bhvGoomba", - "13004770" : "bhvGoombaTripletSpawner", - "1300478c" : "bhvChainChomp", - "130047e4" : "bhvChainChompChainPart", - "1300481c" : "bhvWoodenPost", - "13004868" : "bhvChainChompGate", - "13004898" : "bhvWigglerHead", - "130048e0" : "bhvWigglerBody", - "13004918" : "bhvEnemyLakitu", - "13004954" : "bhvCameraLakitu", - "13004988" : "bhvCloud", - "130049ac" : "bhvCloudPart", - "130049c8" : "bhvSpiny", - "13004a00" : "bhvMontyMole", - "13004a58" : "bhvMontyMoleHole", - "13004a78" : "bhvMontyMoleRock", - "13004ab0" : "bhvPlatformOnTrack", - "13004af4" : "bhvTrackBall", - "13004b1c" : "bhvSeesawPlatform", - "13004b44" : "bhvFerrisWheelAxle", - "13004b6c" : "bhvFerrisWheelPlatform", - "13004b8c" : "bhvWaterBombSpawner", - "13004ba8" : "bhvWaterBomb", - "13004bd4" : "bhvWaterBombShadow", - "13004bf0" : "bhvTTCRotatingSolid", - "13004c24" : "bhvTTCPendulum", - "13004c5c" : "bhvTTCTreadmill", - "13004c94" : "bhvTTCMovingBar", - "13004ccc" : "bhvTTCCog", - "13004cf8" : "bhvTTCPitBlock", - "13004d28" : "bhvTTCElevator", - "13004d64" : "bhvTTC2DRotator", - "13004d90" : "bhvTTCSpinner", - "13004dbc" : "bhvMrBlizzard", - "13004e08" : "bhvMrBlizzardSnowball", - "13004e4c" : "bhvSlidingPlatform2", - "13004e78" : "bhvOctagonalPlatformRotating", - "13004ea0" : "bhvAnimatesOnFloorSwitchPress", - "13004ecc" : "bhvActivatedBackAndForthPlatform", - "13004ef8" : "bhvRecoveryHeart", - "13004f10" : "bhvWaterBombCannon", - "13004f28" : "bhvCannonBarrelBubbles", - "13004f40" : "bhvUnagi", - "13004f78" : "bhvUnagiSubobject", - "13004f90" : "bhvDorrie", - "13004fd4" : "bhvHauntedChair", - "13005024" : "bhvMadPiano", - "1300506c" : "bhvFlyingBookend", - "130050b4" : "bhvBookendSpawn", - "130050d4" : "bhvHauntedBookshelfManager", - "130050f4" : "bhvBookSwitch", - "13005120" : "bhvFirePiranhaPlant", - "13005158" : "bhvSmallPiranhaFlame", - "1300518c" : "bhvFireSpitter", - "130051ac" : "bhvFlyguyFlame", - "130051e0" : "bhvSnufit", - "1300521c" : "bhvSnufitBalls", - "1300525c" : "bhvHorizontalGrindel", - "130052b4" : "bhvEyerokBoss", - "130052d0" : "bhvEyerokHand", - "13005310" : "bhvKlepto", - "13005354" : "bhvBird", - "13005380" : "bhvRacingPenguin", - "130053c4" : "bhvPenguinRaceFinishLine", - "130053dc" : "bhvPenguinRaceShortcutCheck", - "130053f4" : "bhvCoffinSpawner", - "13005414" : "bhvCoffin", - "13005440" : "bhvClamShell", - "13005468" : "bhvSkeeter", - "130054a0" : "bhvSkeeterWave", - "130054b8" : "bhvSwingPlatform", - "130054ec" : "bhvDonutPlatformSpawner", - "13005504" : "bhvDonutPlatform", - "13005528" : "bhvDDDPole", - "1300556c" : "bhvRedCoinStarMarker", - "13005598" : "bhvTripletButterfly", - "130055dc" : "bhvBubba", - "13005610" : "bhvBeginningLakitu", - "13005638" : "bhvBeginningPeach", - "1300565c" : "bhvEndBirds1", - "13005680" : "bhvEndBirds2", - "130056a4" : "bhvIntroScene", - "130056c0" : "_behaviorSegmentEnd", - "007d1d80" : "_behaviorSegmentRomEnd", - "8016f000" : "_goddardSegmentStart", - "007cc6c0" : "_goddardSegmentRomStart", - }, - "Refresh 10" : { - "80000000" : "EXCEPTION_TLB_MISS", - "a4000000" : "SP_DMEM", - "a40004c0" : "SP_DMEM_UNK0", - "a4000774" : "SP_DMEM_UNK1", - "a4001000" : "SP_IMEM", - "a4040010" : "SP_STATUS_REG", - "a4080000" : "SP_PC", - "a4300000" : "MI_MODE_REG", - "a4300004" : "MI_VERSION_REG", - "a4300008" : "MI_INTR_REG", - "a430000c" : "MI_INTR_MASK_REG", - "a4400010" : "VI_CURRENT_REG", - "a450000c" : "AI_STATUS_REG", - "a4600000" : "PI_DRAM_ADDR_REG", - "a4600004" : "PI_CART_ADDR_REG", - "a460000c" : "PI_WR_LEN_REG", - "a4600010" : "PI_STATUS_REG", - "a4700000" : "RI_MODE_REG", - "a4700010" : "RI_REFRESH_REG", - "a4800018" : "SI_STATUS_REG", - "b0000008" : "D_B0000008", - "b0000010" : "D_B0000010", - "b0000014" : "D_B0000014", - "c0000000" : "D_C0000000", - "c0000008" : "D_C0000008", - "c000000c" : "D_C000000C", - "802f69cc" : "func_sh_802F69CC", - "80302ef0" : "osMotorStop", - "80303090" : "osMotorStart", - "803033ac" : "osMotorInit", - "803016a0" : "func_sh_803016A0", - "803016d0" : "func_sh_803016D0", - "80301820" : "func_sh_80301820", - "00000000" : "__romPos", - "04000000" : "_bootSegmentStart", - "007cc6c0" : "_bootSegmentRomStart", - "04000040" : "ipl3_entry", - "04000b70" : "ipl3_font", - "04001000" : "_bootSegmentEnd", - "007cd6c0" : "_bootSegmentRomEnd", - "80000400" : ".", - "80000400" : "_zbufferSegmentNoloadStart", - "80000400" : "0x25800", - "80000400" : "gZBuffer", - "80246000" : "_mainSegmentStart", - "007cc6c0" : "_mainSegmentRomStart", - "80246000" : "entry_point", - "80246050" : "handle_debug_key_sequences", - "80246170" : "unknown_main_func", - "802461cc" : "stub_main_1", - "802461dc" : "stub_main_2", - "802461ec" : "stub_main_3", - "802461fc" : "setup_mesg_queues", - "802462e0" : "alloc_pool", - "80246338" : "create_thread", - "8024639c" : "handle_nmi_request", - "802463ec" : "receive_new_tasks", - "8024651c" : "start_sptask", - "8024659c" : "interrupt_gfx_sptask", - "802465ec" : "start_gfx_sptask", - "80246648" : "pretend_audio_sptask_done", - "8024669c" : "handle_vblank", - "802467fc" : "handle_sp_complete", - "8024694c" : "handle_dp_complete", - "802469b8" : "thread3_main", - "80246b14" : "set_vblank_handler", - "80246b74" : "send_sp_task_message", - "80246bb4" : "dispatch_audio_sptask", - "80246c10" : "send_display_list", - "80246c9c" : "turn_on_audio", - "80246cb8" : "turn_off_audio", - "80246cf0" : "thread1_idle", - "80246df8" : "main_func", - "80246e70" : "my_rdp_init", - "802471a4" : "my_rsp_init", - "80247284" : "clear_z_buffer", - "802473c8" : "display_frame_buffer", - "802474b8" : "clear_frame_buffer", - "80247620" : "clear_viewport", - "8024784c" : "draw_screen_borders", - "802479bc" : "make_viewport_clip_rect", - "80247b3c" : "create_task_structure", - "80247ccc" : "init_render_image", - "80247d14" : "end_master_display_list", - "80247db4" : "draw_reset_bars", - "80247f08" : "rendering_init", - "80247fdc" : "config_gfx_pool", - "80248090" : "display_and_vsync", - "80248304" : "adjust_analog_stick", - "80248498" : "run_demo_inputs", - "80248638" : "read_controller_inputs", - "80248824" : "init_controllers", - "80248964" : "setup_game_memory", - "80248af0" : "thread5_game_loop", - "80248c40" : "reset_volume", - "80248c58" : "lower_background_noise", - "80248ce8" : "raise_background_noise", - "80248d78" : "disable_background_sound", - "80248dc0" : "enable_background_sound", - "80248e08" : "set_sound_mode", - "80248e54" : "play_menu_sounds", - "80248fec" : "play_painting_eject_sound", - "80249070" : "play_infinite_stairs_music", - "80249178" : "set_background_music", - "8024922c" : "fadeout_music", - "8024927c" : "fadeout_level_music", - "802492d0" : "play_cutscene_music", - "80249310" : "play_shell_music", - "8024934c" : "stop_shell_music", - "80249398" : "play_cap_music", - "80249404" : "fadeout_cap_music", - "80249448" : "stop_cap_music", - "80249494" : "play_menu_sounds_extra", - "802494d8" : "audio_game_loop_tick", - "80249500" : "thread4_sound", - "802495e0" : "level_control_timer", - "802496b8" : "pressed_pause", - "80249764" : "set_play_mode", - "8024978c" : "warp_special", - "802497b8" : "fade_into_special_warp", - "8024982c" : "stub_level_update_1", - "8024983c" : "load_level_init_text", - "8024995c" : "init_door_warp", - "80249a10" : "set_mario_initial_cap_powerup", - "80249ab4" : "set_mario_initial_action", - "80249cd8" : "init_mario_after_warp", - "8024a124" : "warp_area", - "8024a18c" : "warp_level", - "8024a1d8" : "warp_credits", - "8024a374" : "check_instant_warp", - "8024a584" : "music_changed_through_warp", - "8024a700" : "initiate_warp", - "8024a7b4" : "get_painting_warp_node", - "8024a85c" : "initiate_painting_warp", - "8024a9cc" : "level_trigger_warp", - "8024aedc" : "initiate_delayed_warp", - "8024b13c" : "update_hud_values", - "8024b390" : "basic_update", - "8024b3e4" : "play_mode_normal", - "8024b5d4" : "play_mode_paused", - "8024b6cc" : "play_mode_frame_advance", - "8024b798" : "level_set_transition", - "8024b7c0" : "play_mode_change_area", - "8024b880" : "play_mode_change_level", - "8024b9b8" : "update_level", - "8024ba8c" : "init_level", - "8024bcd8" : "lvl_init_or_update", - "8024bd5c" : "lvl_init_from_save_file", - "8024be14" : "lvl_set_current_level", - "8024bfa0" : "lvl_play_the_end_screen_sound", - "8024bff0" : "get_mario_cap_flag", - "8024c0b8" : "object_facing_mario", - "8024c16c" : "mario_obj_angle_to_object", - "8024c1d8" : "determine_interaction", - "8024c51c" : "attack_object", - "8024c618" : "mario_stop_riding_object", - "8024c66c" : "mario_grab_used_object", - "8024c6c0" : "mario_drop_held_object", - "8024c780" : "mario_throw_held_object", - "8024c894" : "mario_stop_riding_and_holding", - "8024c8fc" : "does_mario_have_hat", - "8024c928" : "mario_blow_off_cap", - "8024ca68" : "mario_lose_cap_to_enemy", - "8024caf8" : "mario_retrieve_cap", - "8024cb58" : "able_to_grab_object", - "8024cbfc" : "mario_get_collided_object", - "8024cc7c" : "mario_check_object_grab", - "8024ce08" : "bully_knock_back_mario", - "8024d0b4" : "bounce_off_object", - "8024d130" : "hit_object_from_below", - "8024d2bc" : "determine_knockback_action", - "8024d578" : "push_mario_out_of_object", - "8024d72c" : "bounce_back_from_attack", - "8024d804" : "should_push_or_pull_door", - "8024d8b0" : "take_damage_from_interact_object", - "8024d998" : "take_damage_and_knock_back", - "8024daac" : "reset_mario_pitch", - "8024db2c" : "interact_coin", - "8024dbf0" : "interact_water_ring", - "8024dc28" : "interact_star_or_key", - "8024de4c" : "interact_bbh_entrance", - "8024df10" : "interact_warp", - "8024e0c4" : "interact_warp_door", - "8024e2fc" : "get_door_save_file_flag", - "8024e420" : "interact_door", - "8024e6ec" : "interact_cannon_base", - "8024e778" : "interact_igloo_barrier", - "8024e7d4" : "interact_tornado", - "8024e8f0" : "interact_whirlpool", - "8024e9d0" : "interact_strong_wind", - "8024ead8" : "interact_flame", - "8024ec54" : "interact_snufit_bullet", - "8024ed84" : "interact_clam_or_bubba", - "8024ee44" : "interact_bully", - "8024eff8" : "interact_shock", - "8024f170" : "interact_mr_blizzard", - "8024f1e0" : "interact_hit_from_below", - "8024f354" : "interact_bounce_top", - "8024f4ac" : "interact_unknown_08", - "8024f55c" : "interact_damage", - "8024f5cc" : "interact_breakable", - "8024f6a4" : "interact_koopa_shell", - "8024f7a8" : "check_object_grab_mario", - "8024f8bc" : "interact_pole", - "8024fa60" : "interact_hoot", - "8024fb30" : "interact_cap", - "8024fd2c" : "interact_grabbable", - "8024fe6c" : "mario_can_talk", - "8024ff04" : "check_read_sign", - "80250098" : "check_npc_talk", - "80250198" : "interact_text", - "80250230" : "check_kick_or_punch_wall", - "802503f0" : "mario_process_interactions", - "802505c8" : "check_death_barrier", - "8025065c" : "check_lava_boost", - "80250724" : "pss_begin_slide", - "80250778" : "pss_end_slide", - "802507fc" : "mario_handle_special_floors", - "80250940" : "is_anim_at_end", - "8025097c" : "is_anim_past_end", - "802509b8" : "set_mario_animation", - "80250b04" : "set_mario_anim_with_accel", - "80250c7c" : "set_anim_to_frame", - "80250d38" : "is_anim_past_frame", - "80250e54" : "find_mario_anim_flags_and_translation", - "80251020" : "update_mario_pos_for_anim", - "802510dc" : "return_mario_anim_y_translation", - "80251120" : "play_sound_if_no_flag", - "8025118c" : "play_mario_jump_sound", - "80251274" : "adjust_sound_for_speed", - "80251310" : "play_sound_and_spawn_particles", - "80251444" : "play_mario_action_sound", - "802514ac" : "play_mario_landing_sound", - "80251510" : "play_mario_landing_sound_once", - "80251574" : "play_mario_heavy_landing_sound", - "802515d8" : "play_mario_heavy_landing_sound_once", - "8025163c" : "play_mario_sound", - "80251708" : "mario_set_forward_vel", - "8025177c" : "mario_get_floor_class", - "802518a8" : "mario_get_terrain_sound_addend", - "80251a48" : "resolve_and_return_wall_collisions", - "80251afc" : "vec3f_find_ceil", - "80251b54" : "mario_facing_downhill", - "80251bd4" : "mario_floor_is_slippery", - "80251cfc" : "mario_floor_is_slope", - "80251e24" : "mario_floor_is_steep", - "80251f24" : "find_floor_height_relative_polar", - "80252000" : "find_floor_slope", - "802521a0" : "update_mario_sound_and_camera", - "8025229c" : "set_steep_jump_action", - "80252cf4" : "set_mario_action", - "80252e5c" : "set_jump_from_landing", - "802530a0" : "set_jumping_action", - "80253178" : "drop_and_set_mario_action", - "802531c4" : "hurt_and_set_mario_action", - "80253218" : "check_common_action_exits", - "80253300" : "check_common_hold_action_exits", - "802533e4" : "transition_submerged_to_walking", - "80253488" : "set_water_plunge_action", - "80253588" : "squish_mario_model", - "80253720" : "debug_print_speed_action_normal", - "80253838" : "update_mario_button_inputs", - "8025395c" : "update_mario_joystick_inputs", - "80253a60" : "update_mario_geometry_inputs", - "80253d58" : "update_mario_inputs", - "80253ec0" : "set_submerged_cam_preset_and_spawn_bubbles", - "80254060" : "update_mario_health", - "802542b4" : "update_mario_info_for_cam", - "80254338" : "mario_reset_bodystate", - "80254390" : "sink_mario_in_quicksand", - "802543e8" : "update_and_return_cap_flags", - "80254588" : "mario_update_hitbox_and_cap_model", - "80254830" : "execute_mario_action", - "80254b20" : "init_mario", - "80254f44" : "init_mario_from_save_file", - "80255080" : "get_additive_y_vel_for_jumps", - "8025509c" : "stub_mario_step_1", - "802550b0" : "stub_mario_step_2", - "802550c0" : "transfer_bully_speed", - "80255238" : "init_bully_collision_data", - "802552fc" : "mario_bonk_reflection", - "80255414" : "mario_update_quicksand", - "80255654" : "mario_push_off_steep_floor", - "8025570c" : "mario_update_moving_sand", - "8025580c" : "mario_update_windy_ground", - "802559b0" : "stop_and_set_height_to_floor", - "80255a34" : "stationary_ground_step", - "80255d88" : "perform_ground_step", - "80255ec4" : "check_ledge_grab", - "802560ac" : "perform_air_quarter_step", - "802564e0" : "apply_twirl_gravity", - "80256584" : "should_strengthen_gravity_for_jump_ascent", - "8025661c" : "apply_gravity", - "802569f8" : "apply_vertical_wind", - "80256b24" : "perform_air_step", - "80256cd8" : "set_vel_from_pitch_and_yaw", - "80256d8c" : "set_vel_from_yaw", - "80256e00" : "get_credits_str_width", - "80256e88" : "print_displaying_credits_entry", - "80257060" : "bhv_end_peach_loop", - "802570dc" : "bhv_end_toad_loop", - "80257198" : "geo_switch_peach_eyes", - "802572b0" : "get_star_collection_dialog", - "8025733c" : "handle_save_menu", - "80257450" : "spawn_obj_at_mario_rel_yaw", - "802574e8" : "cutscene_take_cap_off", - "80257548" : "cutscene_put_cap_on", - "802575a8" : "mario_ready_to_speak", - "80257640" : "set_mario_npc_dialog", - "80257748" : "act_reading_npc_dialog", - "80257980" : "act_waiting_for_dialog", - "80257a0c" : "act_disappeared", - "80257ab0" : "act_reading_automatic_dialog", - "80257ce4" : "act_reading_sign", - "80257eac" : "act_debug_free_move", - "80258184" : "general_star_dance_handler", - "80258420" : "act_star_dance", - "802584dc" : "act_star_dance_water", - "802585c0" : "act_fall_after_star_grab", - "802586cc" : "common_death_handler", - "80258744" : "act_standing_death", - "802587ec" : "act_electrocution", - "8025883c" : "act_suffocation", - "8025888c" : "act_death_on_back", - "802588f8" : "act_death_on_stomach", - "80258964" : "act_quicksand_death", - "80258a7c" : "act_eaten_by_bubba", - "80258b24" : "launch_mario_until_land", - "80258ba8" : "act_unlocking_key_door", - "80258dac" : "act_unlocking_star_door", - "80258f94" : "act_entering_star_door", - "80259264" : "act_going_through_door", - "802593cc" : "act_warp_door_spawn", - "802594d4" : "act_emerge_from_pipe", - "80259608" : "act_spawn_spin_airborne", - "80259740" : "act_spawn_spin_landing", - "802597ac" : "act_exit_airborne", - "80259854" : "act_falling_exit_airborne", - "802598d0" : "act_exit_land_save_dialog", - "80259c30" : "act_death_exit", - "80259ce8" : "act_unused_death_exit", - "80259d74" : "act_falling_death_exit", - "80259e00" : "act_special_exit_airborne", - "80259ef8" : "act_special_death_exit", - "80259fcc" : "act_spawn_no_spin_airborne", - "8025a040" : "act_spawn_no_spin_landing", - "8025a0bc" : "act_bbh_enter_spin", - "8025a494" : "act_bbh_enter_jump", - "8025a610" : "act_teleport_fade_out", - "8025a6fc" : "act_teleport_fade_in", - "8025a858" : "act_shocked", - "8025a9ac" : "act_squished", - "8025ae0c" : "act_putting_on_cap", - "8025aea8" : "stuck_in_ground_handler", - "8025affc" : "act_head_stuck_in_ground", - "8025b050" : "act_butt_stuck_in_ground", - "8025b0a4" : "act_feet_stuck_in_ground", - "8025bc80" : "generate_yellow_sparkles", - "8025d798" : "mario_execute_cutscene_action", - "8025dd70" : "add_tree_leaf_particles", - "8025de1c" : "play_climbing_sounds", - "8025df04" : "set_pole_position", - "8025e21c" : "act_holding_pole", - "8025e5a8" : "act_climbing_pole", - "8025e7a4" : "act_grab_pole_slow", - "8025e830" : "act_grab_pole_fast", - "8025e930" : "act_top_of_pole_transition", - "8025ea30" : "act_top_of_pole", - "8025eb50" : "perform_hanging_step", - "8025ecfc" : "update_hang_moving", - "8025eed0" : "update_hang_stationary", - "8025ef58" : "act_start_hanging", - "8025f0b4" : "act_hanging", - "8025f1e4" : "act_hang_moving", - "8025f384" : "let_go_of_ledge", - "8025f4b4" : "climb_up_ledge", - "8025f560" : "update_ledge_climb_camera", - "8025f644" : "update_ledge_climb", - "8025f6c0" : "act_ledge_grab", - "8025f970" : "act_ledge_climb_slow", - "8025fa64" : "act_ledge_climb_down", - "8025fae8" : "act_ledge_climb_fast", - "8025fb90" : "act_grabbed", - "8025fc6c" : "act_in_cannon", - "80260154" : "act_tornado_twirling", - "80260568" : "check_common_automatic_cancels", - "802605d0" : "mario_execute_automatic_action", - "802608b0" : "check_common_idle_cancels", - "80260aac" : "check_common_hold_idle_cancels", - "80260cb4" : "act_idle", - "80260f94" : "play_anim_sound", - "80261000" : "act_start_sleeping", - "80261268" : "act_sleeping", - "802614fc" : "act_waking_up", - "8026168c" : "act_shivering", - "802618d8" : "act_coughing", - "802619d0" : "act_hold_idle", - "80261ad0" : "act_hold_heavy_idle", - "80261bf8" : "act_standing_against_wall", - "80261cec" : "act_in_quicksand", - "80261db4" : "act_crouching", - "80261f70" : "act_panting", - "80262080" : "act_hold_panting_unused", - "8026217c" : "stopping_step", - "802621dc" : "act_braking_stop", - "802622dc" : "act_butt_slide_stop", - "80262398" : "act_hold_butt_slide_stop", - "80262490" : "act_slide_kick_slide_stop", - "80262530" : "act_start_crouching", - "80262650" : "act_stop_crouching", - "80262770" : "act_start_crawling", - "80262890" : "act_stop_crawling", - "80262980" : "act_shockwave_bounce", - "80262bc4" : "landing_step", - "80262c34" : "check_common_landing_cancels", - "80262d68" : "act_jump_land_stop", - "80262dc4" : "act_double_jump_land_stop", - "80262e20" : "act_side_flip_land_stop", - "80262e94" : "act_freefall_land_stop", - "80262ef0" : "act_triple_jump_land_stop", - "80262f50" : "act_backflip_land_stop", - "80262fec" : "act_lava_boost_land", - "8026305c" : "act_long_jump_land_stop", - "802630f8" : "act_hold_jump_land_stop", - "802631f0" : "act_hold_freefall_land_stop", - "802632e8" : "act_air_throw_land", - "802633b4" : "act_twirl_land", - "8026350c" : "act_ground_pound_land", - "802635e8" : "act_first_person", - "80263784" : "check_common_stationary_cancels", - "80263898" : "mario_execute_stationary_action", - "80263e60" : "tilt_body_running", - "80263ee4" : "play_step_sound", - "80264024" : "align_with_floor", - "8026409c" : "begin_walking_action", - "802640fc" : "check_ledge_climb_down", - "802642b4" : "slide_bonk", - "80264340" : "set_triple_jump_action", - "8026440c" : "update_sliding_angle", - "80264740" : "update_sliding", - "80264b54" : "apply_slope_accel", - "80264d80" : "apply_landing_accel", - "80264e18" : "update_shell_speed", - "80265080" : "apply_slope_decel", - "802651b0" : "update_decelerating_speed", - "80265244" : "update_walking_speed", - "80265458" : "should_begin_sliding", - "80265514" : "analog_stick_held_back", - "80265558" : "check_ground_dive_or_punch", - "80265620" : "begin_braking_action", - "80265700" : "anim_and_audio_for_walk", - "80265b1c" : "anim_and_audio_for_hold_walk", - "80265d90" : "anim_and_audio_for_heavy_walk", - "80265df8" : "push_or_sidle_wall", - "80266038" : "tilt_body_walking", - "802661cc" : "tilt_body_ground_shell", - "80266354" : "act_walking", - "802665b4" : "act_move_punching", - "80266734" : "act_hold_walking", - "8026699c" : "act_hold_heavy_walking", - "80266af8" : "act_turning_around", - "80266d4c" : "act_finish_turning_around", - "80266e48" : "act_braking", - "80266fc8" : "act_decelerating", - "80267240" : "act_hold_decelerating", - "80267504" : "act_riding_shell_ground", - "80267728" : "act_crawling", - "8026795c" : "act_burning_ground", - "80267c24" : "tilt_body_butt_slide", - "80267ce4" : "common_slide_action", - "80267fa4" : "common_slide_action_with_jump", - "80268074" : "act_butt_slide", - "802680d4" : "act_hold_butt_slide", - "80268168" : "act_crouch_slide", - "80268338" : "act_slide_kick_slide", - "802684ac" : "stomach_slide_action", - "802685c0" : "act_stomach_slide", - "80268608" : "act_hold_stomach_slide", - "80268684" : "act_dive_slide", - "802687b8" : "common_ground_knockback_action", - "802689f8" : "act_hard_backward_ground_kb", - "80268adc" : "act_hard_forward_ground_kb", - "80268b64" : "act_backward_ground_kb", - "80268bb0" : "act_forward_ground_kb", - "80268bfc" : "act_soft_backward_ground_kb", - "80268c48" : "act_soft_forward_ground_kb", - "80268c94" : "act_ground_bonk", - "80268d04" : "act_death_exit_land", - "80268dcc" : "common_landing_action", - "80268f78" : "common_landing_cancels", - "80269108" : "act_jump_land", - "80269170" : "act_freefall_land", - "802691d8" : "act_side_flip_land", - "80269264" : "act_hold_jump_land", - "80269300" : "act_hold_freefall_land", - "8026939c" : "act_long_jump_land", - "8026947c" : "act_double_jump_land", - "802694e4" : "act_triple_jump_land", - "80269588" : "act_backflip_land", - "80269640" : "quicksand_jump_land_action", - "80269788" : "act_quicksand_jump_land", - "802697dc" : "act_hold_quicksand_jump_land", - "80269830" : "check_common_moving_cancels", - "80269954" : "mario_execute_moving_action", - "80269f40" : "play_flip_sounds", - "80269fc0" : "play_far_fall_sound", - "8026a090" : "play_knockback_sound", - "8026a12c" : "lava_boost_on_wall", - "8026a224" : "check_fall_damage", - "8026a400" : "check_kick_or_dive_in_air", - "8026a494" : "should_get_stuck_in_ground", - "8026a598" : "check_fall_damage_or_get_stuck", - "8026a62c" : "check_horizontal_wind", - "8026a818" : "update_air_with_turn", - "8026aa48" : "update_air_without_turn", - "8026acd8" : "update_lava_boost_or_twirling", - "8026ae5c" : "update_flying_yaw", - "8026b004" : "update_flying_pitch", - "8026b17c" : "update_flying", - "8026b444" : "common_air_action_step", - "8026b6a0" : "act_jump", - "8026b740" : "act_double_jump", - "8026b814" : "act_triple_jump", - "8026b90c" : "act_backflip", - "8026b9ac" : "act_freefall", - "8026bab8" : "act_hold_jump", - "8026bbb4" : "act_hold_freefall", - "8026bcc0" : "act_side_flip", - "8026bdcc" : "act_wall_kick_air", - "8026be78" : "act_long_jump", - "8026bf40" : "act_riding_shell_air", - "8026c034" : "act_twirling", - "8026c1e0" : "act_dive", - "8026c4b8" : "act_air_throw", - "8026c5d0" : "act_water_jump", - "8026c738" : "act_hold_water_jump", - "8026c880" : "act_steep_jump", - "8026c9fc" : "act_ground_pound", - "8026cd0c" : "act_burning_jump", - "8026ce50" : "act_burning_fall", - "8026cf28" : "act_crazy_box_bounce", - "8026d1b0" : "common_air_knockback_step", - "8026d33c" : "check_wall_kick", - "8026d3c8" : "act_backward_air_kb", - "8026d43c" : "act_forward_air_kb", - "8026d4b0" : "act_hard_backward_air_kb", - "8026d508" : "act_hard_forward_air_kb", - "8026d560" : "act_thrown_backward", - "8026d608" : "act_thrown_forward", - "8026d6fc" : "act_soft_bonk", - "8026d770" : "act_getting_blown", - "8026d988" : "act_air_hit_wall", - "8026db54" : "act_forward_rollout", - "8026dcf4" : "act_backward_rollout", - "8026de98" : "act_butt_slide_air", - "8026e088" : "act_hold_butt_slide_air", - "8026e2b4" : "act_lava_boost", - "8026e59c" : "act_slide_kick", - "8026e810" : "act_jump_kick", - "8026e968" : "act_shot_from_cannon", - "8026ec00" : "act_flying", - "8026f158" : "act_riding_hoot", - "8026f2ec" : "act_flying_triple_jump", - "8026f614" : "act_top_of_pole_jump", - "8026f660" : "act_vertical_wind", - "8026f840" : "act_special_triple_jump", - "8026fa18" : "check_common_airborne_cancels", - "8026fb04" : "mario_execute_airborne_action", - "8027499c" : "mario_execute_submerged_action", - "80274eb0" : "animated_stationary_ground_step", - "80274f10" : "mario_update_punch_sequence", - "80275328" : "act_punching", - "8027546c" : "act_picking_up", - "802755fc" : "act_dive_picking_up", - "802756c8" : "act_placing_down", - "80275794" : "act_throwing", - "802758c0" : "act_heavy_throw", - "802759b4" : "act_stomach_slide_stop", - "80275a80" : "act_picking_up_bowser", - "80275b34" : "act_holding_bowser", - "80275e78" : "act_releasing_bowser", - "80275f0c" : "check_common_object_cancels", - "80275fe0" : "mario_execute_object_action", - "802761d0" : "geo_envfx_main", - "802763d4" : "geo_skybox_main", - "802764b0" : "geo_draw_mario_head_goddard", - "8027684c" : "bhv_toad_message_loop", - "80276910" : "bhv_toad_message_init", - "80276bb8" : "bhv_unlock_door_star_init", - "80276ccc" : "bhv_unlock_door_star_loop", - "802770a4" : "geo_mirror_mario_set_alpha", - "80277150" : "geo_switch_mario_stand_run", - "802771bc" : "geo_switch_mario_eyes", - "80277294" : "geo_mario_tilt_torso", - "802773a4" : "geo_mario_head_rotation", - "802774f4" : "geo_switch_mario_hand", - "802775cc" : "geo_mario_hand_foot_scaler", - "802776d8" : "geo_switch_mario_cap_effect", - "80277740" : "geo_switch_mario_cap_on_off", - "80277824" : "geo_mario_rotate_wing_cap_wings", - "8027795c" : "geo_switch_mario_hand_grab_pos", - "80277b14" : "geo_render_mirror_mario", - "80277d6c" : "geo_mirror_mario_backface_culling", - "80277ee0" : "set_segment_base_addr", - "80277f20" : "get_segment_base_addr", - "80277f50" : "segmented_to_virtual", - "80277fa8" : "virtual_to_segmented", - "80277ff0" : "move_segment_table_to_dmem", - "80278074" : "main_pool_init", - "80278120" : "main_pool_alloc", - "80278238" : "main_pool_free", - "80278358" : "main_pool_realloc", - "802783c8" : "main_pool_available", - "802783e8" : "main_pool_push_state", - "80278498" : "main_pool_pop_state", - "8027868c" : "load_segment", - "802786f0" : "load_to_fixed_pool_addr", - "802787d8" : "load_segment_decompress", - "802788b4" : "load_segment_decompress_heap", - "80278974" : "load_engine_code_segment", - "80278a14" : "alloc_only_pool_init", - "80278ab8" : "alloc_only_pool_alloc", - "80278b28" : "alloc_only_pool_resize", - "80278b98" : "mem_pool_init", - "80278c58" : "mem_pool_alloc", - "80278d74" : "mem_pool_free", - "80278f2c" : "alloc_display_list", - "80279028" : "func_80278A78", - "80279084" : "load_patchable_table", - "80279840" : "save_file_do_save", - "802798fc" : "save_file_erase", - "80279960" : "save_file_copy", - "802799dc" : "save_file_load_all", - "80279bc8" : "save_file_reload", - "80279c44" : "save_file_collect_star_or_key", - "80279e44" : "save_file_exists", - "80279e80" : "save_file_get_max_coin_score", - "80279f80" : "save_file_get_course_star_count", - "8027a010" : "save_file_get_total_star_count", - "8027a0a8" : "save_file_set_flags", - "8027a0f4" : "save_file_clear_flags", - "8027a16c" : "save_file_get_flags", - "8027a1c8" : "save_file_get_star_flags", - "8027a23c" : "save_file_set_star_flags", - "8027a310" : "save_file_get_course_coin_score", - "8027a340" : "save_file_is_cannon_unlocked", - "8027a390" : "save_file_set_cannon_unlocked", - "8027a418" : "save_file_set_cap_pos", - "8027a4ac" : "save_file_get_cap_pos", - "8027a564" : "save_file_set_sound_mode", - "8027a5b4" : "save_file_get_sound_mode", - "8027a5d4" : "save_file_move_cap_to_default_location", - "8027a698" : "disable_warp_checkpoint", - "8027a6b0" : "check_if_should_set_warp_checkpoint", - "8027a718" : "check_warp_checkpoint", - "8027a7d0" : "override_viewport_and_clip", - "8027a83c" : "set_warp_transition_rgb", - "8027a8b0" : "print_intro_text", - "8027a93c" : "get_mario_spawn_type", - "8027a9c8" : "area_get_warp_node", - "8027aa28" : "area_get_warp_node_from_params", - "8027aa74" : "load_obj_warp_nodes", - "8027ab04" : "clear_areas", - "8027ad74" : "clear_area_graph_nodes", - "8027ae44" : "load_area", - "8027af48" : "unload_area", - "8027afbc" : "load_mario_area", - "8027b038" : "unload_mario_area", - "8027b0c0" : "change_area", - "8027b164" : "area_update_objects", - "8027b1a0" : "play_transition", - "8027b35c" : "play_transition_after_delay", - "8027b3b4" : "render_game", - "8027cf38" : "geo_set_animation_globals", - "8027da84" : "geo_process_held_object", - "8027de68" : "geo_try_process_children", - "8027dea8" : "geo_process_node_and_siblings", - "8027e130" : "geo_process_root", - "8027e3e0" : "profiler_log_thread5_time", - "8027e490" : "profiler_log_thread4_time", - "8027e520" : "profiler_log_gfx_time", - "8027e5cc" : "profiler_log_vblank_time", - "8027e65c" : "draw_profiler_bar", - "8027e958" : "draw_reference_profiler_bars", - "8027ebcc" : "draw_profiler_mode_1", - "8027eeac" : "draw_profiler_mode_0", - "8027f460" : "draw_profiler", - "8027f4e0" : "decompress", - "8027f590" : "set_camera_shake_from_hit", - "8027f8b8" : "set_environmental_camera_shake", - "8027f9f0" : "set_camera_shake_from_point", - "8027fb74" : "unused_set_camera_pitch_shake_env", - "8027fc18" : "calc_y_to_curr_floor", - "8027fe20" : "focus_on_mario", - "8027fff8" : "set_camera_height", - "80280368" : "look_down_slopes", - "802804f4" : "pan_ahead_of_player", - "802806a4" : "find_in_bounds_yaw_wdw_bob_thi", - "80280810" : "update_radial_camera", - "80280970" : "update_8_directions_camera", - "80280b00" : "radial_camera_move", - "80281188" : "lakitu_zoom", - "802813bc" : "radial_camera_input_default", - "802813ec" : "update_yaw_and_dist_from_c_up", - "8028146c" : "mode_radial_camera", - "80281588" : "mode_8_directions_camera", - "802816a0" : "update_outward_radial_camera", - "802817fc" : "mode_outward_radial_camera", - "80281904" : "update_parallel_tracking_camera", - "80282280" : "update_fixed_camera", - "802826a0" : "update_boss_fight_camera", - "80282c0c" : "unused_update_mode_5_camera", - "80282c3c" : "mode_boss_fight_camera", - "80282c7c" : "mode_parallel_tracking_camera", - "80282ce0" : "mode_fixed_camera", - "80282d78" : "update_behind_mario_camera", - "80283340" : "mode_behind_mario", - "80283578" : "update_slide_camera", - "802839e4" : "mode_behind_mario_camera", - "80283a18" : "nop_update_water_camera", - "80283a34" : "mode_water_surface_camera", - "80283a68" : "update_mario_camera", - "80283af8" : "update_default_camera", - "80284cb8" : "mode_default_camera", - "80284cfc" : "mode_lakitu_camera", - "80284d38" : "mode_mario_camera", - "80284d74" : "update_spiral_stairs_camera", - "802850ac" : "mode_spiral_stairs_camera", - "802850ec" : "update_slide_or_0f_camera", - "802851dc" : "mode_slide_camera", - "8028526c" : "store_lakitu_cam_info_for_c_up", - "802852f4" : "set_mode_c_up", - "80285370" : "exit_c_up", - "80285808" : "update_c_up", - "802858a4" : "move_mario_head_c_up", - "80285a2c" : "move_into_c_up", - "80285d20" : "mode_c_up_camera", - "80285ed8" : "update_in_cannon", - "80285f60" : "mode_cannon_camera", - "8028603c" : "transition_next_state", - "80286088" : "transition_to_camera_mode", - "80286188" : "set_camera_mode", - "80286420" : "update_lakitu", - "802868f8" : "update_camera", - "80286f68" : "reset_camera", - "8028724c" : "init_camera", - "802879ec" : "zoom_out_if_paused_and_outside", - "80287bc4" : "select_mario_cam_mode", - "80287be0" : "create_camera", - "80287cb8" : "update_graph_node_camera", - "80287d30" : "geo_camera_main", - "80287dc0" : "stub_camera_2", - "80287dd4" : "stub_camera_3", - "80287de8" : "vec3f_sub", - "80287e28" : "object_pos_to_vec3f", - "80287e50" : "vec3f_to_object_pos", - "80287e78" : "unused_object_angle_to_vec3s", - "80287ea0" : "evaluate_cubic_spline", - "802882e4" : "move_point_along_spline", - "80288624" : "cam_select_alt_mode", - "80288718" : "set_cam_angle", - "80288888" : "set_handheld_shake", - "802889b0" : "shake_camera_handheld", - "80288ce4" : "find_c_buttons_pressed", - "80288e68" : "update_camera_hud_status", - "80288f5c" : "collide_with_walls", - "80289198" : "vec3f_compare", - "80289214" : "clamp_pitch", - "802892d8" : "is_within_100_units_of_mario", - "8028935c" : "set_or_approach_f32_asymptotic", - "802893f4" : "approach_f32_asymptotic_bool", - "80289488" : "approach_f32_asymptotic", - "802894b4" : "approach_s16_asymptotic_bool", - "8028956c" : "approach_s16_asymptotic", - "80289610" : "approach_vec3f_asymptotic", - "80289684" : "set_or_approach_vec3f_asymptotic", - "802896f8" : "approach_vec3s_asymptotic", - "8028976c" : "camera_approach_s16_symmetric_bool", - "8028984c" : "camera_approach_s16_symmetric", - "8028993c" : "set_or_approach_s16_symmetric", - "802899cc" : "camera_approach_f32_symmetric_bool", - "80289b0c" : "camera_approach_f32_symmetric", - "80289c00" : "random_vec3s", - "80289d20" : "reduce_by_dist_from_camera", - "80289f88" : "clamp_positions_and_find_yaw", - "8028a080" : "calc_avoid_yaw", - "8028a0f4" : "is_surf_within_bounding_box", - "8028a4ec" : "is_behind_surface", - "8028a6bc" : "is_range_behind_surface", - "8028a7ec" : "is_mario_behind_surface", - "8028a834" : "scale_along_line", - "8028a8e8" : "is_pos_in_bounds", - "8028aa28" : "calculate_pitch", - "8028aad8" : "calculate_yaw", - "8028ab60" : "calculate_angles", - "8028ac28" : "calc_abs_dist", - "8028accc" : "calc_hor_dist", - "8028ad4c" : "rotate_in_xz", - "8028ae1c" : "rotate_in_yz", - "8028aef0" : "set_camera_pitch_shake", - "8028af4c" : "set_camera_yaw_shake", - "8028b00c" : "set_camera_roll_shake", - "8028b068" : "set_pitch_shake_from_point", - "8028b11c" : "set_yaw_shake_from_point", - "8028b1d0" : "increment_shake_offset", - "8028b218" : "shake_camera_pitch", - "8028b32c" : "shake_camera_yaw", - "8028b438" : "shake_camera_roll", - "8028b50c" : "offset_yaw_outward_radial", - "8028b724" : "cutscene_intro_peach_play_message_music", - "8028b754" : "cutscene_intro_peach_play_lakitu_flying_music", - "8028b784" : "play_camera_buzz_if_cdown", - "8028b7c4" : "play_camera_buzz_if_cbutton", - "8028b804" : "play_camera_buzz_if_c_sideways", - "8028b850" : "play_sound_cbutton_up", - "8028b884" : "play_sound_cbutton_down", - "8028b8b8" : "play_sound_cbutton_side", - "8028b8ec" : "play_sound_button_change_blocked", - "8028b920" : "play_sound_rbutton_changed", - "8028b954" : "play_sound_if_cam_switched_to_lakitu_or_mario", - "8028b9c4" : "radial_camera_input", - "8028bd34" : "trigger_cutscene_dialog", - "8028bd98" : "handle_c_button_movement", - "8028c038" : "clear_cutscene_vars", - "8028c13c" : "start_cutscene", - "8028c18c" : "determine_dance_cutscene", - "8028c26c" : "open_door_cutscene", - "8028c2c8" : "get_cutscene_from_mario_status", - "8028c7a0" : "warp_camera", - "8028c8f0" : "approach_camera_height", - "8028c9ac" : "stub_camera_4", - "8028c9cc" : "set_focus_rel_mario", - "8028cbf0" : "offset_rotated", - "8028cd94" : "offset_rotated_coords", - "8028cdec" : "determine_pushing_or_pulling_door", - "8028ce24" : "next_lakitu_state", - "8028d44c" : "set_camera_mode_fixed", - "8028d5ac" : "set_camera_mode_8_directions", - "8028d5fc" : "set_camera_mode_boss_fight", - "8028d658" : "set_camera_mode_close_cam", - "8028d698" : "set_camera_mode_radial", - "8028d79c" : "parallel_tracking_init", - "8028d888" : "set_fixed_cam_axis_sa_lobby", - "8028d92c" : "check_blocking_area_processing", - "8028da18" : "cam_rr_exit_building_side", - "8028da50" : "cam_rr_exit_building_top", - "8028daec" : "cam_rr_enter_building_window", - "8028db38" : "cam_rr_enter_building", - "8028dbb4" : "cam_rr_enter_building_side", - "8028dbf4" : "cam_cotmc_exit_waterfall", - "8028dc1c" : "cam_sl_snowman_head_8dir", - "8028dc70" : "cam_sl_free_roam", - "8028dca4" : "move_camera_through_floor_while_descending", - "8028dd48" : "cam_hmc_enter_maze", - "8028de2c" : "cam_hmc_elevator_black_hole", - "8028de5c" : "cam_hmc_elevator_maze_emergency_exit", - "8028de90" : "cam_hmc_elevator_lake", - "8028dec4" : "cam_hmc_elevator_maze", - "8028def8" : "cam_ssl_enter_pyramid_top", - "8028df24" : "cam_ssl_pyramid_center", - "8028df6c" : "cam_ssl_boss_room", - "8028dfb4" : "cam_thi_move_cam_through_tunnel", - "8028dfe8" : "cam_thi_look_through_tunnel", - "8028e01c" : "cam_bob_tower", - "8028e064" : "cam_bob_default_free_roam", - "8028e098" : "cam_castle_hmc_start_pool_cutscene", - "8028e0ec" : "cam_castle_lobby_entrance", - "8028e164" : "cam_castle_look_upstairs", - "8028e210" : "cam_castle_basement_look_downstairs", - "8028e298" : "cam_castle_enter_lobby", - "8028e300" : "cam_castle_enter_spiral_stairs", - "8028e38c" : "cam_castle_close_mode", - "8028e3b8" : "cam_castle_leave_lobby_sliding_door", - "8028e3f0" : "cam_castle_enter_lobby_sliding_door", - "8028e41c" : "cam_bbh_room_6", - "8028e450" : "cam_bbh_fall_off_roof", - "8028e47c" : "cam_bbh_fall_into_pool", - "8028e524" : "cam_bbh_room_1", - "8028e55c" : "cam_bbh_leave_front_door", - "8028e594" : "cam_bbh_room_2_lower", - "8028e5cc" : "cam_bbh_room_4", - "8028e604" : "cam_bbh_room_8", - "8028e63c" : "cam_bbh_room_5_library", - "8028e674" : "cam_bbh_room_5_library_to_hidden_transition", - "8028e6c4" : "cam_bbh_room_5_hidden_to_library_transition", - "8028e714" : "cam_bbh_room_5_hidden", - "8028e758" : "cam_bbh_room_3", - "8028e790" : "cam_bbh_room_7_mr_i", - "8028e7c8" : "cam_bbh_room_7_mr_i_to_coffins_transition", - "8028e818" : "cam_bbh_room_7_coffins_to_mr_i_transition", - "8028e868" : "cam_bbh_elevator_room_lower", - "8028e8a0" : "cam_bbh_room_0_back_entrance", - "8028e8cc" : "cam_bbh_elevator", - "8028e930" : "cam_bbh_room_12_upper", - "8028e974" : "cam_bbh_enter_front_door", - "8028e9a0" : "cam_bbh_room_2_library", - "8028e9d8" : "cam_bbh_room_2_library_to_trapdoor_transition", - "8028ea28" : "cam_bbh_room_2_trapdoor", - "8028ea60" : "cam_bbh_room_2_trapdoor_transition", - "8028eab0" : "cam_bbh_room_9_attic", - "8028eae8" : "cam_bbh_room_9_attic_transition", - "8028eb38" : "cam_bbh_room_9_mr_i_transition", - "8028eb88" : "cam_bbh_room_13_balcony", - "8028ebc0" : "cam_bbh_room_0", - "8028ec04" : "cam_ccm_enter_slide_shortcut", - "8028ec2c" : "cam_ccm_leave_slide_shortcut", - "8028ec58" : "surface_type_modes", - "8028ed30" : "set_mode_if_not_set_by_surface", - "8028ed98" : "surface_type_modes_thi", - "8028eeb0" : "camera_course_processing", - "8028f670" : "resolve_geometry_collisions", - "8028f914" : "rotate_camera_around_walls", - "8028fc9c" : "find_mario_floor_and_ceil", - "8028fe24" : "start_object_cutscene", - "8028fe58" : "start_object_cutscene_without_focus", - "8028fe84" : "unused_dialog_cutscene_response", - "8028ff04" : "cutscene_object_with_dialog", - "8028ffc8" : "cutscene_object_without_dialog", - "8029000c" : "cutscene_object", - "80290098" : "update_camera_yaw", - "802900e0" : "cutscene_reset_spline", - "80290104" : "stop_cutscene_and_retrieve_stored_info", - "80290168" : "cap_switch_save", - "802901a4" : "init_spline_point", - "802901fc" : "copy_spline_segment", - "802903b8" : "cutscene_common_set_dialog_state", - "802904a8" : "cutscene_intro_peach_start_letter_music", - "802904e4" : "cutscene_intro_peach_start_flying_music", - "8029051c" : "reset_pan_distance", - "8029053c" : "player2_rotate_cam", - "80290784" : "store_info_cannon", - "802907f4" : "retrieve_info_cannon", - "80290864" : "store_info_star", - "802908e8" : "retrieve_info_star", - "802909d0" : "pan_camera", - "80290a5c" : "cutscene_shake_explosion", - "80290abc" : "rotate_and_move_vec3f", - "80290b54" : "set_flag_post_door", - "80290ba4" : "cutscene_soften_music", - "80290bd8" : "cutscene_unsoften_music", - "80290c1c" : "cutscene_unused_start", - "80290c30" : "cutscene_unused_loop", - "80290c44" : "cutscene_ending_mario_fall_start", - "80290c9c" : "cutscene_ending_mario_fall_focus_mario", - "80290d90" : "cutscene_ending_mario_fall", - "80290e00" : "cutscene_ending_mario_land_closeup", - "80290e74" : "cutscene_ending_reset_spline", - "80290eb0" : "cutscene_ending_fly_up_to_window", - "80290f1c" : "cutscene_ending_stars_free_peach", - "80290f8c" : "cutscene_ending_mario_land", - "80291074" : "cutscene_ending_peach_appear_closeup", - "80291108" : "cutscene_ending_peach_appears", - "802911c8" : "cutscene_ending_peach_descends_start", - "80291208" : "cutscene_ending_follow_peach_descent", - "8029127c" : "cutscene_ending_peach_descent_lower_focus", - "802912b8" : "cutscene_ending_peach_descent_back_to_mario", - "80291354" : "cutscene_ending_peach_descends", - "8029142c" : "cutscene_ending_mario_to_peach", - "802914cc" : "cutscene_ending_look_up_at_castle", - "80291514" : "cutscene_ending_peach_wakeup", - "802915d4" : "cutscene_ending_dialog", - "80291654" : "cutscene_ending_kiss_closeup", - "802916b8" : "cutscene_ending_kiss_here_we_go", - "80291774" : "cutscene_ending_kiss", - "802917e4" : "cutscene_ending_look_at_sky", - "8029184c" : "cutscene_ending_zoom_fov", - "80291870" : "cutscene_ending_cake_for_mario", - "80291924" : "cutscene_ending_stop", - "80291964" : "cutscene_grand_star_start", - "802919dc" : "cutscene_grand_star_front_of_mario", - "80291ab4" : "cutscene_grand_star_mario_jump", - "80291b18" : "cutscene_grand_star_accel_cvar2", - "80291b68" : "cutscene_grand_star_approach_mario", - "80291bf4" : "cutscene_grand_star_move_cvar2", - "80291c3c" : "cutscene_grand_star_focus_mario", - "80291cd0" : "cutscene_grand_star", - "80291db0" : "cutscene_grand_star_fly_start", - "80291e84" : "cutscene_grand_star_fly_move_to_mario", - "80291f18" : "cutscene_grand_star_fly_mario_offscreen", - "80292038" : "cutscene_grand_star_fly_app_cvars", - "80292164" : "cutscene_grand_star_fly", - "802921fc" : "focus_in_front_of_mario", - "8029228c" : "cutscene_dance_move_to_mario", - "80292324" : "cutscene_dance_rotate", - "80292370" : "cutscene_dance_rotate_move_back", - "802923b8" : "cutscene_dance_rotate_move_towards_mario", - "80292414" : "cutscene_dance_default_focus_mario", - "8029244c" : "cutscene_dance_rotate_focus_mario", - "80292484" : "cutscene_dance_shake_fov", - "802924b8" : "cutscene_dance_default_rotate", - "80292628" : "star_dance_bound_yaw", - "802926dc" : "cutscene_dance_closeup_start", - "802927d0" : "cutscene_dance_closeup_focus_mario", - "80292868" : "cutscene_dance_closeup_fly_above", - "80292974" : "cutscene_dance_closeup_fly_closer", - "80292a20" : "cutscene_dance_closeup_zoom", - "80292a4c" : "cutscene_dance_closeup_shake_fov", - "80292a80" : "cutscene_dance_closeup", - "80292c00" : "cutscene_dance_fly_away_start", - "80292d80" : "cutscene_dance_fly_away_approach_mario", - "80292e2c" : "cutscene_dance_fly_away_focus_mario", - "80292ec4" : "cutscene_pan_cvar9", - "80292f40" : "cutscene_dance_fly_rotate_around_mario", - "80292f98" : "cutscene_dance_fly_away_rotate_while_flying", - "80292fe4" : "cutscene_dance_fly_away_shake_fov", - "80293018" : "cutscene_dance_fly_away", - "802930f0" : "cutscene_key_dance_jump_cvar", - "80293164" : "cutscene_key_dance_jump_closeup", - "802931c0" : "cutscene_key_dance_jump_lower_left", - "80293220" : "cutscene_key_dance_jump_above", - "8029328c" : "cutscene_key_dance_jump_last", - "802932f4" : "cutscene_key_dance_shake_fov", - "80293328" : "cutscene_key_dance_handheld_shake", - "80293354" : "cutscene_key_dance_focus_mario", - "8029338c" : "cutscene_key_dance", - "80293488" : "cutscene_bowser_area_shake_fov", - "802934b4" : "cutscene_bowser_area_start_bowser_walking", - "802934d8" : "cutscene_bowser_arena_set_pos", - "80293548" : "cutscene_bowser_arena_focus_sine", - "802935e0" : "cutscene_bowser_arena_set_focus", - "80293624" : "cutscene_bowser_arena_adjust_offsets", - "8029369c" : "cutscene_bowser_arena_pan_left", - "802936dc" : "cutscene_bowser_arena_mario_dialog", - "80293708" : "cutscene_stop_dialog", - "80293734" : "cutscene_bowser_arena_start", - "802937e8" : "bowser_fight_intro_dialog", - "8029386c" : "cutscene_bowser_arena_dialog", - "802938c8" : "cutscene_bowser_arena_end", - "80293944" : "cutscene_bowser_arena", - "80293abc" : "cutscene_star_spawn_store_info", - "80293ae8" : "cutscene_star_spawn_focus_star", - "80293b70" : "cutscene_star_spawn_update_boss_fight", - "80293bf4" : "cutscene_star_spawn_fly_back", - "80293c2c" : "cutscene_star_spawn", - "80293cb0" : "cutscene_star_spawn_back", - "80293d5c" : "cutscene_star_spawn_end", - "80293d90" : "cutscene_exit_waterfall_warp", - "80293dd4" : "cutscene_exit_to_castle_grounds_focus_mario", - "80293e7c" : "cutscene_exit_waterfall", - "80293ed8" : "cutscene_exit_to_castle_grounds_end", - "80293f2c" : "cutscene_exit_fall_to_castle_grounds_warp", - "80293f70" : "cutscene_exit_fall_to_castle_grounds", - "80293fcc" : "cutscene_red_coin_star_start", - "80294024" : "cutscene_red_coin_star_focus_xz", - "80294088" : "cutscene_red_coin_star_focus_y", - "802940cc" : "cutscene_red_coin_star_look_up_at_star", - "8029410c" : "cutscene_red_coin_star_warp", - "802942cc" : "cutscene_red_coin_star_set_fov", - "802942f0" : "cutscene_red_coin_star", - "802943d4" : "cutscene_red_coin_star_end", - "80294428" : "cutscene_goto_cvar_pos", - "80294718" : "cutscene_prepare_cannon_start", - "802947a4" : "cutscene_prepare_cannon_fly_to_cannon", - "8029480c" : "cannon_approach_prev", - "802948a0" : "cutscene_prepare_cannon_fly_back", - "80294a14" : "cutscene_prepare_cannon", - "80294a94" : "cutscene_prepare_cannon_end", - "80294ae8" : "water_death_move_to_mario_side", - "80294b78" : "death_goto_mario", - "80294bb4" : "cutscene_death_standing_start", - "80294c28" : "cutscene_death_standing_goto_mario", - "80294c5c" : "cutscene_death_standing", - "80294cc4" : "cutscene_death_stomach_start", - "80294d48" : "cutscene_death_stomach_goto_mario", - "80294db4" : "cutscene_death_stomach", - "80294e24" : "cutscene_bbh_death_start", - "80294ea8" : "cutscene_bbh_death_goto_mario", - "80294ee8" : "cutscene_bbh_death", - "80294f58" : "cutscene_quicksand_death_start", - "80294f94" : "cutscene_quicksand_death_goto_mario", - "80294fec" : "cutscene_quicksand_death", - "802950b0" : "cutscene_suffocation_fly_away", - "80295140" : "cutscene_suffocation_stay_above_gas", - "802951f0" : "cutscene_suffocation_rotate", - "80295270" : "cutscene_suffocation", - "80295310" : "cutscene_enter_pool_start", - "802953dc" : "cutscene_enter_pool_loop", - "80295418" : "cutscene_enter_pool", - "80295480" : "cutscene_pyramid_top_explode_start", - "802954ec" : "cutscene_pyramid_top_explode_zoom_in", - "80295518" : "cutscene_pyramid_top_explode_focus", - "80295580" : "cutscene_pyramid_top_explode_warp", - "80295670" : "cutscene_pyramid_top_explode_closeup", - "80295740" : "cutscene_pyramid_top_explode_cam_shake", - "8029576c" : "cutscene_pyramid_top_explode_warp_back", - "802957c8" : "cutscene_pyramid_top_explode", - "80295894" : "cutscene_pyramid_top_explode_end", - "802958d4" : "cutscene_enter_pyramid_top_start", - "80295930" : "cutscene_enter_pyramid_top", - "80295a58" : "cutscene_dialog_start", - "80295bf0" : "cutscene_dialog_move_mario_shoulder", - "80295e24" : "cutscene_dialog_create_dialog_box", - "80295e8c" : "cutscene_dialog", - "80295fb0" : "cutscene_dialog_set_flag", - "80295fd8" : "cutscene_dialog_end", - "80296020" : "cutscene_read_message_start", - "80296160" : "cutscene_read_message", - "802962c8" : "cutscene_read_message_set_flag", - "802962f0" : "cutscene_read_message_end", - "80296318" : "cutscene_exit_succ_start", - "802963b8" : "cutscene_non_painting_set_cam_pos", - "8029652c" : "cutscene_non_painting_set_cam_focus", - "8029665c" : "cutscene_exit_bowser_succ_focus_left", - "8029669c" : "cutscene_exit_bowser_key_toss_shake", - "802966e4" : "cutscene_exit_succ_shake_landing", - "80296710" : "cutscene_exit_bowser_succ", - "802967c4" : "cutscene_non_painting_end", - "8029685c" : "cutscene_exit_non_painting_succ_override_cvar", - "802968a0" : "cutscene_exit_non_painting_succ", - "8029695c" : "cutscene_non_painting_death_start", - "802969f8" : "cutscene_exit_bowser_death", - "80296a64" : "cutscene_non_painting_death_override_offset", - "80296b30" : "cutscene_non_painting_death", - "80296bc8" : "cutscene_cap_switch_press_start", - "80296c4c" : "cutscene_cap_switch_press_rotate_around_mario", - "80296d60" : "cutscene_cap_switch_press_lower_cam", - "80296da8" : "cutscene_cap_switch_press_approach_mario", - "80296eb4" : "cutscene_cap_switch_press_pan_left", - "80296f38" : "cutscene_cap_switch_press_create_dialog", - "80296fa8" : "cutscene_cap_switch_press", - "80297148" : "cutscene_unlock_key_door_start", - "8029720c" : "cutscene_unlock_key_door_approach_mario", - "80297290" : "cutscene_unlock_key_door_focus_lock", - "802972ec" : "cutscene_unlock_key_door_stub", - "80297300" : "cutscene_unlock_key_door_fly_back", - "80297384" : "cutscene_unlock_key_door_fov_shake", - "802973b0" : "cutscene_unlock_key_door", - "80297464" : "intro_peach_move_camera_start_to_pipe", - "80297560" : "peach_letter_text", - "8029758c" : "play_sound_peach_reading_letter", - "802975c4" : "cutscene_intro_peach_start_to_pipe_spline", - "8029762c" : "cutscene_intro_peach_dialog", - "802976bc" : "cutscene_intro_peach_follow_pipe_spline", - "80297728" : "cutscene_intro_peach_clear_cutscene_status", - "80297748" : "cutscene_intro_peach_zoom_fov", - "80297784" : "cutscene_intro_peach_reset_spline", - "802977c8" : "cutscene_intro_peach_handheld_shake_off", - "802977f4" : "intro_pipe_exit_text", - "80297820" : "play_sound_intro_turn_on_hud", - "8029784c" : "cutscene_intro_peach_fly_to_pipe", - "80297908" : "cutscene_intro_peach_mario_appears", - "80297a38" : "cutscene_intro_peach_reset_fov", - "80297a64" : "cutscene_intro_peach_letter", - "80297b58" : "cutscene_end_waving_start", - "80297b84" : "cutscene_end_waving", - "80297c14" : "cutscene_credits_reset_spline", - "80297c40" : "cutscene_credits", - "802980dc" : "cutscene_sliding_doors_open_start", - "8029819c" : "cutscene_sliding_doors_open_set_cvars", - "80298218" : "cutscene_sliding_doors_go_under_doorway", - "80298254" : "cutscene_sliding_doors_fly_back_up", - "80298290" : "cutscene_sliding_doors_follow_mario", - "802983b4" : "cutscene_sliding_doors_open", - "80298458" : "cutscene_double_doors_end", - "802984a0" : "cutscene_enter_painting_stub", - "802984b4" : "cutscene_enter_painting", - "802987b0" : "cutscene_exit_painting_start", - "8029894c" : "cutscene_exit_painting_move_to_mario", - "802989e8" : "cutscene_exit_painting_move_to_floor", - "80298af8" : "cutscene_exit_painting", - "80298ba0" : "cutscene_unused_exit_start", - "80298c2c" : "cutscene_unused_exit_focus_mario", - "80298ccc" : "cutscene_exit_painting_end", - "80298d44" : "cutscene_enter_cannon_end", - "80298d9c" : "cutscene_enter_cannon_raise", - "80298fe8" : "cutscene_enter_cannon_start", - "80299100" : "cutscene_door_start", - "80299154" : "cutscene_door_fix_cam", - "802991a8" : "cutscene_door_loop", - "802991f0" : "cutscene_door_move_behind_mario", - "802992cc" : "cutscene_door_follow_mario", - "80299360" : "cutscene_door_end", - "80299404" : "cutscene_door_mode", - "802994e8" : "play_cutscene", - "8029a2f8" : "cutscene_event", - "8029a37c" : "cutscene_spawn_obj", - "8029a3b4" : "set_fov_shake", - "8029a41c" : "set_fov_shake_from_point", - "8029a4d0" : "shake_camera_fov", - "8029a5e8" : "set_fov_30", - "8029a60c" : "approach_fov_20", - "8029a64c" : "set_fov_45", - "8029a670" : "set_fov_29", - "8029a694" : "zoom_fov_30", - "8029a6f4" : "fov_default", - "8029a858" : "approach_fov_30", - "8029a894" : "approach_fov_60", - "8029a8d0" : "approach_fov_45", - "8029a968" : "approach_fov_80", - "8029a9a4" : "set_fov_bbh", - "8029aa3c" : "geo_camera_fov", - "8029ab94" : "set_fov_function", - "8029abb0" : "cutscene_set_fov_shake_preset", - "8029ac30" : "set_fov_shake_from_point_preset", - "8029aef8" : "obj_rotate_towards_point", - "8029af98" : "intro_peach_set_pos_and_opacity", - "8029b08c" : "bhv_intro_peach_loop", - "8029b28c" : "intro_lakitu_set_offset_from_camera", - "8029b358" : "intro_lakitu_set_focus", - "8029b3c8" : "intro_lakitu_set_pos_and_focus", - "8029b49c" : "bhv_intro_lakitu_loop", - "8029bde4" : "bhv_end_birds_1_loop", - "8029bf64" : "bhv_end_birds_2_loop", - "8029c0e4" : "spawn_child_obj_relative", - "8029c254" : "bhv_intro_scene_loop", - "8029c770" : "nop_change_course", - "8029c780" : "copy_mario_state_to_object", - "8029c9cc" : "spawn_particle", - "8029ca58" : "bhv_mario_update", - "8029cb34" : "update_objects_starting_at", - "8029cbc8" : "update_objects_during_time_stop", - "8029cd28" : "update_objects_in_list", - "8029cd98" : "unload_deactivated_objects_in_list", - "8029ce58" : "set_object_respawn_info_bits", - "8029cedc" : "unload_objects_from_area", - "8029cfb0" : "spawn_objects_from_info", - "8029d1d8" : "stub_obj_list_processor_1", - "8029d1e8" : "clear_objects", - "8029d324" : "update_terrain_objects", - "8029d374" : "update_non_terrain_objects", - "8029d428" : "unload_deactivated_objects", - "8029d690" : "update_objects", - "8029d890" : "geo_update_projectile_pos_from_parent", - "8029d924" : "geo_update_layer_transparency", - "8029db48" : "geo_switch_anim_state", - "8029dbd4" : "geo_switch_area", - "8029dcd4" : "obj_update_pos_from_parent_transformation", - "8029dda8" : "obj_apply_scale_to_matrix", - "8029de80" : "create_transformation_from_matrices", - "8029e1b0" : "obj_set_held_state", - "8029e27c" : "lateral_dist_between_objects", - "8029e2f8" : "dist_between_objects", - "8029e398" : "cur_obj_forward_vel_approach_upward", - "8029e3e8" : "approach_f32_signed", - "8029e494" : "approach_f32_symmetric", - "8029e530" : "approach_s16_symmetric", - "8029e5ec" : "cur_obj_rotate_yaw_toward", - "8029e694" : "obj_angle_to_object", - "8029e714" : "obj_turn_toward_object", - "8029e8bc" : "obj_set_parent_relative_pos", - "8029e914" : "obj_set_pos", - "8029e96c" : "obj_set_angle", - "8029e9ac" : "spawn_object_abs_with_rot", - "8029ea24" : "spawn_object_rel_with_rot", - "8029eaac" : "spawn_obj_with_transform_flags", - "8029eb04" : "spawn_water_droplet", - "8029ed20" : "spawn_object_at_origin", - "8029edcc" : "spawn_object", - "8029ee24" : "try_to_spawn_object", - "8029eeb8" : "spawn_object_with_scale", - "8029ef64" : "spawn_object_relative", - "8029effc" : "spawn_object_relative_with_scale", - "8029f070" : "cur_obj_move_using_vel", - "8029f0c8" : "obj_copy_graph_y_offset", - "8029f0e0" : "obj_copy_pos_and_angle", - "8029f120" : "obj_copy_pos", - "8029f148" : "obj_copy_angle", - "8029f188" : "obj_set_gfx_pos_from_pos", - "8029f1b0" : "obj_init_animation", - "8029f200" : "linear_mtxf_mul_vec3f", - "8029f274" : "linear_mtxf_transpose_mul_vec3f", - "8029f2ec" : "obj_apply_scale_to_transform", - "8029f3a8" : "obj_copy_scale", - "8029f3d0" : "obj_scale_xyz", - "8029f404" : "obj_scale", - "8029f430" : "cur_obj_scale", - "8029f464" : "cur_obj_init_animation", - "8029f4b4" : "cur_obj_init_animation_with_sound", - "8029f514" : "cur_obj_init_animation_with_accel_and_sound", - "8029f59c" : "obj_init_animation_with_sound", - "8029f600" : "cur_obj_enable_rendering_and_become_tangible", - "8029f620" : "cur_obj_enable_rendering", - "8029f644" : "cur_obj_disable_rendering_and_become_intangible", - "8029f66c" : "cur_obj_disable_rendering", - "8029f694" : "cur_obj_unhide", - "8029f6bc" : "cur_obj_hide", - "8029f6e0" : "cur_obj_set_pos_relative", - "8029f7d8" : "cur_obj_set_pos_relative_to_parent", - "8029f820" : "cur_obj_enable_rendering_2", - "8029f848" : "cur_obj_unused_init_on_floor", - "8029f8ec" : "obj_set_face_angle_to_move_angle", - "8029f914" : "get_object_list_from_behavior", - "8029f95c" : "cur_obj_nearest_object_with_behavior", - "8029f998" : "cur_obj_dist_to_nearest_object_with_behavior", - "8029f9ec" : "cur_obj_find_nearest_object_with_behavior", - "8029fb1c" : "find_unimportant_object", - "8029fb68" : "count_unimportant_objects", - "8029fbdc" : "count_objects_with_behavior", - "8029fc9c" : "cur_obj_find_nearby_held_actor", - "8029fdb4" : "cur_obj_change_action", - "8029fe00" : "cur_obj_set_vel_from_mario_vel", - "8029fe6c" : "cur_obj_reverse_animation", - "8029fea4" : "cur_obj_extend_animation_if_at_end", - "8029ff04" : "cur_obj_check_if_near_animation_end", - "8029ffa4" : "cur_obj_check_if_at_animation_end", - "802a0008" : "cur_obj_check_anim_frame", - "802a0050" : "cur_obj_check_anim_frame_in_range", - "802a00ac" : "cur_obj_check_frame_prior_current_frame", - "802a0114" : "mario_is_in_air_action", - "802a0154" : "mario_is_dive_sliding", - "802a0198" : "cur_obj_set_y_vel_and_animation", - "802a01d8" : "cur_obj_unrender_and_reset_state", - "802a0380" : "cur_obj_get_thrown_or_placed", - "802a0474" : "cur_obj_get_dropped", - "802a04c0" : "cur_obj_set_model", - "802a04f0" : "mario_set_flag", - "802a0514" : "cur_obj_clear_interact_status_flag", - "802a0568" : "obj_mark_for_deletion", - "802a057c" : "cur_obj_disable", - "802a05b4" : "cur_obj_become_intangible", - "802a05d4" : "cur_obj_become_tangible", - "802a05f0" : "obj_become_tangible", - "802a0604" : "cur_obj_update_floor_height", - "802a064c" : "cur_obj_update_floor_height_and_get_floor", - "802a079c" : "cur_obj_apply_drag_xz", - "802a0e68" : "cur_obj_move_y", - "802a113c" : "cur_obj_unused_resolve_wall_collisions", - "802a11a8" : "abs_angle_diff", - "802a120c" : "cur_obj_move_xz_using_fvel_and_yaw", - "802a12a4" : "cur_obj_move_y_with_terminal_vel", - "802a1308" : "cur_obj_compute_vel_xz", - "802a1370" : "increment_velocity_toward_range", - "802a1424" : "obj_check_if_collided_with_object", - "802a148c" : "cur_obj_set_behavior", - "802a14c4" : "obj_set_behavior", - "802a14fc" : "cur_obj_has_behavior", - "802a1554" : "obj_has_behavior", - "802a15ac" : "cur_obj_lateral_dist_from_mario_to_home", - "802a1634" : "cur_obj_lateral_dist_to_home", - "802a16ac" : "cur_obj_outside_home_square", - "802a1774" : "cur_obj_outside_home_rectangle", - "802a184c" : "cur_obj_set_pos_to_home", - "802a188c" : "cur_obj_set_pos_to_home_and_stop", - "802a18dc" : "cur_obj_shake_y", - "802a1930" : "cur_obj_start_cam_event", - "802a1960" : "set_mario_interact_hoot_if_in_range", - "802a19ac" : "obj_set_billboard", - "802a19c8" : "cur_obj_set_hitbox_radius_and_height", - "802a19f0" : "cur_obj_set_hurtbox_radius_and_height", - "802a1b34" : "obj_spawn_loot_blue_coins", - "802a1b8c" : "obj_spawn_loot_yellow_coins", - "802a1bdc" : "cur_obj_spawn_loot_coin_at_mario_pos", - "802a1c68" : "cur_obj_abs_y_dist_to_home", - "802a1cc4" : "cur_obj_advance_looping_anim", - "802a1f3c" : "cur_obj_resolve_wall_collisions", - "802a2320" : "cur_obj_update_floor_and_walls", - "802a2348" : "cur_obj_move_standard", - "802a25b4" : "cur_obj_move_using_vel_and_gravity", - "802a2644" : "cur_obj_move_using_fvel_and_gravity", - "802a2674" : "obj_set_pos_relative", - "802a2748" : "cur_obj_angle_to_home", - "802a27b0" : "obj_set_gfx_pos_at_obj_pos", - "802a2804" : "obj_translate_local", - "802a2930" : "obj_build_transform_from_pos_and_angle", - "802a2a18" : "obj_set_throw_matrix_from_transform", - "802a2a84" : "obj_build_transform_relative_to_parent", - "802a2b28" : "obj_create_transform_from_self", - "802a2b6c" : "cur_obj_rotate_move_angle_using_vel", - "802a2bc4" : "cur_obj_rotate_face_angle_using_vel", - "802a2c1c" : "cur_obj_set_face_angle_to_move_angle", - "802a2c5c" : "cur_obj_follow_path", - "802a2ed4" : "chain_segment_init", - "802a2f14" : "random_f32_around_zero", - "802a2f5c" : "obj_scale_random", - "802a2fc0" : "obj_translate_xyz_random", - "802a308c" : "obj_translate_xz_random", - "802a31e0" : "cur_obj_set_pos_via_transform", - "802a3268" : "cur_obj_reflect_move_angle_off_wall", - "802a32ac" : "cur_obj_spawn_particles", - "802a34a4" : "obj_set_hitbox", - "802a3604" : "signum_positive", - "802a3634" : "absf", - "802a3674" : "absi", - "802a36a4" : "cur_obj_wait_then_blink", - "802a3754" : "cur_obj_is_mario_ground_pounding_platform", - "802a37ac" : "spawn_mist_particles", - "802a37dc" : "spawn_mist_particles_with_sound", - "802a3818" : "cur_obj_push_mario_away", - "802a390c" : "cur_obj_push_mario_away_from_cylinder", - "802a399c" : "bhv_dust_smoke_loop", - "802a3a4c" : "cur_obj_set_direction_table", - "802a3a88" : "cur_obj_progress_direction_table", - "802a3b28" : "stub_obj_helpers_3", - "802a3b40" : "cur_obj_scale_over_time", - "802a3c18" : "cur_obj_set_pos_to_home_with_debug", - "802a3cec" : "stub_obj_helpers_4", - "802a3cfc" : "cur_obj_is_mario_on_platform", - "802a3d40" : "cur_obj_shake_y_until", - "802a3dd4" : "cur_obj_move_up_and_down", - "802a3e30" : "cur_obj_call_action_function", - "802a3ef8" : "spawn_base_star_with_no_lvl_exit", - "802a3f24" : "bit_shift_left", - "802a3f48" : "cur_obj_mario_far_away", - "802a404c" : "is_mario_moving_fast_or_in_air", - "802a40b8" : "is_item_in_array", - "802a4120" : "bhv_init_room", - "802a4210" : "cur_obj_enable_rendering_if_mario_in_room", - "802a4360" : "cur_obj_set_hitbox_and_die_if_attacked", - "802a4440" : "obj_explode_and_spawn_coins", - "802a44f4" : "obj_set_collision_data", - "802a452c" : "cur_obj_if_hit_wall_bounce_away", - "802a4564" : "cur_obj_hide_if_mario_far_away_y", - "802a45e4" : "geo_offset_klepto_held_object", - "802a462c" : "geo_offset_klepto_debug", - "802a46cc" : "obj_is_hidden", - "802a4704" : "enable_time_stop", - "802a4728" : "disable_time_stop", - "802a4750" : "set_time_stop_flags", - "802a4774" : "clear_time_stop_flags", - "802a47a0" : "cur_obj_can_mario_activate_textbox", - "802a48bc" : "cur_obj_can_mario_activate_textbox_2", - "802a4960" : "cur_obj_update_dialog", - "802a4be4" : "cur_obj_update_dialog_with_cutscene", - "802a4f04" : "cur_obj_has_model", - "802a4f58" : "cur_obj_align_gfx_with_floor", - "802a5034" : "mario_is_within_rectangle", - "802a50fc" : "cur_obj_shake_screen", - "802a513c" : "obj_attack_collided_from_other_object", - "802a51ac" : "cur_obj_was_attacked_or_ground_pounded", - "802a5228" : "obj_copy_behavior_params", - "802a5248" : "cur_obj_init_animation_and_anim_frame", - "802a5288" : "cur_obj_init_animation_and_check_if_near_end", - "802a52c4" : "cur_obj_init_animation_and_extend_if_at_end", - "802a52f8" : "cur_obj_check_grabbed_mario", - "802a5358" : "player_performed_grab_escape_action", - "802a540c" : "cur_obj_unused_play_footstep_sound", - "802a5460" : "enable_time_stop_including_mario", - "802a5498" : "disable_time_stop_including_mario", - "802a54d8" : "cur_obj_check_interacted", - "802a5524" : "cur_obj_spawn_loot_blue_coin", - "802a5588" : "cur_obj_spawn_star_at_y_offset", - "802a5620" : "star_door_update_pos", - "802a56bc" : "bhv_star_door_loop", - "802a58dc" : "bhv_piranha_particle_loop", - "802a597c" : "mr_i_piranha_particle_act_0", - "802a5a44" : "mr_i_piranha_particle_act_1", - "802a5aa0" : "bhv_mr_i_particle_loop", - "802a5acc" : "spawn_mr_i_particle", - "802a5bd4" : "bhv_mr_i_body_loop", - "802a5d4c" : "mr_i_act_3", - "802a6518" : "mr_i_act_2", - "802a68a0" : "mr_i_act_1", - "802a6ad8" : "mr_i_act_0", - "802a6b7c" : "bhv_mr_i_loop", - "802a6c20" : "bhv_pole_init", - "802a6c74" : "bhv_giant_pole_loop", - "802a6cf4" : "bhv_thi_huge_island_top_loop", - "802a6d64" : "bhv_thi_tiny_island_top_loop", - "802a6ee4" : "cap_switch_act_0", - "802a7020" : "cap_switch_act_1", - "802a708c" : "cap_switch_act_2", - "802a7160" : "cap_switch_act_3", - "802a7170" : "bhv_cap_switch_loop", - "802a719c" : "geo_update_held_mario_pos", - "802a7230" : "bhv_bobomb_anchor_mario_loop", - "802a7264" : "king_bobomb_act_0", - "802a7384" : "mario_is_far_below_object", - "802a73d8" : "king_bobomb_act_2", - "802a7598" : "king_bobomb_act_3", - "802a7804" : "king_bobomb_act_1", - "802a78d8" : "king_bobomb_act_6", - "802a7a60" : "king_bobomb_act_7", - "802a7b1c" : "king_bobomb_act_8", - "802a7b5c" : "king_bobomb_act_4", - "802a7d14" : "king_bobomb_act_5", - "802a7fbc" : "king_bobomb_move", - "802a8064" : "bhv_king_bobomb_loop", - "802a816c" : "bhv_beta_chest_bottom_init", - "802a81e8" : "bhv_beta_chest_bottom_loop", - "802a821c" : "bhv_beta_chest_lid_loop", - "802a8370" : "bhv_water_air_bubble_init", - "802a83a0" : "bhv_water_air_bubble_loop", - "802a8630" : "bhv_bubble_wave_init", - "802a86bc" : "scale_bubble_random", - "802a870c" : "bhv_bubble_maybe_loop", - "802a88a4" : "bhv_small_water_wave_loop", - "802a8a38" : "scale_bubble_sin", - "802a8b18" : "bhv_particle_init", - "802a8bc0" : "bhv_particle_loop", - "802a8c88" : "bhv_small_bubbles_loop", - "802a8cdc" : "bhv_fish_group_loop", - "802a8d48" : "bhv_water_waves_init", - "802a8d98" : "bhv_cannon_base_unused_loop", - "802a8dc0" : "opened_cannon_act_0", - "802a8f40" : "opened_cannon_act_4", - "802a9114" : "opened_cannon_act_6", - "802a92fc" : "opened_cannon_act_5", - "802a93f8" : "opened_cannon_act_1", - "802a9440" : "opened_cannon_act_2", - "802a9460" : "opened_cannon_act_3", - "802a9498" : "bhv_cannon_base_loop", - "802a94f8" : "bhv_cannon_barrel_loop", - "802a958c" : "common_anchor_mario_behavior", - "802a9708" : "bhv_chuckya_anchor_mario_loop", - "802a973c" : "unknown_chuckya_function", - "802a98c4" : "approach_forward_vel", - "802a9994" : "chuckya_act_0", - "802a9d08" : "chuckya_act_1", - "802a9f54" : "chuckya_act_3", - "802a9fc8" : "chuckya_act_2", - "802aa02c" : "chuckya_move", - "802aa0ac" : "bhv_chuckya_loop", - "802aa1b8" : "bhv_wf_breakable_wall_loop", - "802aa280" : "check_mario_attacking", - "802aa3c8" : "init_kickable_board_rock", - "802aa3f4" : "bhv_kickable_board_loop", - "802aa700" : "bhv_tower_door_loop", - "802aa774" : "bhv_wf_rotating_wooden_platform_loop", - "802aa830" : "bhv_rotating_platform_loop", - "802aa948" : "set_koopa_shell_underwater_hitbox", - "802aa97c" : "bhv_koopa_shell_underwater_loop", - "802aaa60" : "bhv_warp_loop", - "802aab54" : "bhv_fading_warp_loop", - "802aac48" : "bhv_white_puff_exploding_loop", - "802aae8c" : "spawn_mist_particles_variable", - "802aaf48" : "bhv_spawned_star_init", - "802aaffc" : "set_sparkle_spawn_star_hitbox", - "802ab060" : "set_home_to_mario", - "802ab158" : "set_y_home_to_pos", - "802ab18c" : "slow_star_rotation", - "802ab1c8" : "bhv_spawned_star_loop", - "802ab558" : "bhv_spawn_star_no_level_exit", - "802ab5c8" : "bhv_coin_sparkles_init", - "802ab650" : "bhv_yellow_coin_init", - "802ab70c" : "bhv_yellow_coin_loop", - "802ab748" : "bhv_temp_coin_loop", - "802ab7a4" : "bhv_coin_init", - "802ab860" : "bhv_coin_loop", - "802aba40" : "bhv_coin_formation_spawn_loop", - "802abc04" : "spawn_coin_in_formation", - "802abee4" : "bhv_coin_formation_init", - "802abf0c" : "bhv_coin_formation_loop", - "802ac068" : "coin_inside_boo_act_1", - "802ac15c" : "coin_inside_boo_act_0", - "802ac294" : "bhv_coin_inside_boo_loop", - "802ac2c0" : "bhv_coin_sparkles_loop", - "802ac2ec" : "bhv_golden_coin_sparkles_loop", - "802ac3a8" : "bhv_punch_tiny_triangle_loop", - "802ac4a0" : "bhv_punch_tiny_triangle_init", - "802ac5b4" : "bhv_wall_tiny_star_particle_loop", - "802ac678" : "bhv_tiny_star_particles_init", - "802ac78c" : "bhv_pound_tiny_star_particle_loop", - "802ac864" : "bhv_pound_tiny_star_particle_init", - "802ac910" : "door_animation_and_reset", - "802ac958" : "set_door_camera_event", - "802ac9d0" : "play_door_open_noise", - "802aca6c" : "play_warp_door_open_noise", - "802acac8" : "bhv_door_loop", - "802acc3c" : "bhv_door_init", - "802ace80" : "bhv_star_door_loop_2", - "802ad078" : "grindel_thwomp_act_4", - "802ad10c" : "grindel_thwomp_act_2", - "802ad1a4" : "grindel_thwomp_act_3", - "802ad238" : "grindel_thwomp_act_1", - "802ad2d0" : "grindel_thwomp_act_0", - "802ad34c" : "bhv_grindel_thwomp_loop", - "802ad378" : "bhv_tumbling_bridge_platform_loop", - "802ad580" : "tumbling_bridge_act_1", - "802ad76c" : "tumbling_bridge_act_2", - "802ad7f4" : "tumbling_bridge_act_3", - "802ad828" : "tumbling_bridge_act_0", - "802ad890" : "bhv_tumbling_bridge_loop", - "802ad8bc" : "elevator_starting_shake", - "802ad8f0" : "elevator_act_0", - "802ada4c" : "elevator_act_1", - "802adb88" : "elevator_act_2", - "802adce4" : "elevator_act_4", - "802add70" : "elevator_act_3", - "802addf8" : "bhv_elevator_init", - "802adf6c" : "bhv_elevator_loop", - "802adf98" : "bhv_water_mist_spawn_loop", - "802adfd8" : "bhv_water_mist_loop", - "802ae0cc" : "spawn_triangle_break_particles", - "802ae238" : "bhv_water_mist_2_loop", - "802ae304" : "bhv_pound_white_puffs_init", - "802ae334" : "spawn_mist_from_global", - "802ae360" : "bhv_ground_sand_init", - "802ae394" : "spawn_smoke_with_velocity", - "802ae45c" : "clear_particle_flags", - "802ae48c" : "bhv_ground_snow_init", - "802ae4c0" : "spawn_wind_particles", - "802ae534" : "bhv_wind_loop", - "802ae85c" : "bhv_unused_particle_spawn_loop", - "802ae908" : "bhv_ukiki_cage_star_loop", - "802aea6c" : "ukiki_cage_act_wait_for_ukiki", - "802aeab8" : "ukiki_cage_act_spin", - "802aeb1c" : "ukiki_cage_act_fall", - "802aeb74" : "ukiki_cage_act_hide", - "802aeb9c" : "bhv_ukiki_cage_loop", - "802aebc8" : "bhv_squishable_platform_loop", - "802aec40" : "bhv_bitfs_sinking_platform_loop", - "802aeca8" : "bhv_ddd_moving_pole_loop", - "802aecdc" : "bhv_bitfs_sinking_cage_platform_loop", - "802aedc0" : "bhv_beta_moving_flames_spawn_loop", - "802aeea4" : "bhv_beta_moving_flames_loop", - "802aef1c" : "bhv_flamethrower_flame_loop", - "802af1e8" : "bhv_flamethrower_loop", - "802af3fc" : "bhv_rr_rotating_bridge_platform_loop", - "802af448" : "bhv_bouncing_fireball_flame_loop", - "802af5f8" : "bhv_bouncing_fireball_loop", - "802af7c4" : "bhv_bowser_shock_wave_loop", - "802af9cc" : "bhv_black_smoke_upward_loop", - "802afa0c" : "bhv_black_smoke_bowser_loop", - "802afae4" : "bhv_black_smoke_mario_loop", - "802afbf8" : "bhv_flame_mario_loop", - "802afce4" : "bhv_beta_fish_splash_spawner_loop", - "802afd1c" : "bhv_spindrift_loop", - "802afee8" : "bhv_wf_solid_tower_platform_loop", - "802aff30" : "bhv_wf_elevator_tower_platform_loop", - "802b00e4" : "bhv_wf_sliding_tower_platform_loop", - "802b0244" : "spawn_and_init_wf_platforms", - "802b039c" : "spawn_wf_platform_group", - "802b04b4" : "bhv_tower_platform_group_loop", - "802b0614" : "bhv_tree_snow_or_leaf_loop", - "802b0974" : "bhv_snow_leaf_particle_spawn_init", - "802b0b9c" : "square_plat_set_yaw_until_timer", - "802b0bec" : "bhv_squarish_path_moving_loop", - "802b0d48" : "bhv_piranha_plant_waking_bubbles_loop", - "802b0df0" : "bhv_piranha_plant_bubble_loop", - "802b1278" : "bhv_purple_switch_loop", - "802b14f4" : "check_if_moving_over_floor", - "802b15e8" : "bhv_pushable_loop", - "802b1714" : "breakable_box_init", - "802b17f4" : "hidden_breakable_box_actions", - "802b19d8" : "hidden_unbreakable_box_actions", - "802b1ae0" : "bhv_hidden_object_loop", - "802b1b2c" : "bhv_breakable_box_loop", - "802b1bb0" : "geo_move_mario_part_from_parent", - "802b1c54" : "bhv_heave_ho_throw_mario_loop", - "802b1d7c" : "heave_ho_act_1", - "802b1e6c" : "heave_ho_act_2", - "802b1ff4" : "heave_ho_act_3", - "802b20a0" : "heave_ho_act_0", - "802b2154" : "heave_ho_move", - "802b2278" : "bhv_heave_ho_loop", - "802b2340" : "bhv_ccm_touched_star_spawn_loop", - "802b23e0" : "bhv_unused_poundable_platform", - "802b2494" : "bhv_beta_trampoline_spring_loop", - "802b25ac" : "bhv_beta_trampoline_top_loop", - "802b26a4" : "jumping_box_act_0", - "802b27d8" : "jumping_box_act_1", - "802b2824" : "jumping_box_free_update", - "802b288c" : "bhv_jumping_box_loop", - "802b29b8" : "bhv_boo_cage_loop", - "802b2bc8" : "spawn_sparkle_particles", - "802b2d10" : "bhv_alpha_boo_key_loop", - "802b3108" : "bhv_beta_boo_key_loop", - "802b3134" : "arc_to_goal_pos", - "802b3250" : "grand_star_zero_velocity", - "802b329c" : "bhv_grand_star_loop", - "802b3600" : "bhv_bowser_key_loop", - "802b37b8" : "bhv_white_puff_smoke_init", - "802b3810" : "bhv_bullet_bill_init", - "802b3830" : "bullet_bill_act_0", - "802b38b8" : "bullet_bill_act_1", - "802b394c" : "bullet_bill_act_2", - "802b3b08" : "bullet_bill_act_3", - "802b3b24" : "bullet_bill_act_4", - "802b3be0" : "bhv_bullet_bill_loop", - "802b3c2c" : "bowser_tail_anchor_act_0", - "802b3cdc" : "bowser_tail_anchor_act_1", - "802b3d10" : "bowser_tail_anchor_act_2", - "802b3d74" : "bhv_bowser_tail_anchor_loop", - "802b3df4" : "bhv_bowser_flame_spawn_loop", - "802b4080" : "bhv_bowser_body_anchor_loop", - "802b4184" : "bowser_spawn_shockwave", - "802b41fc" : "bowser_bounce", - "802b4288" : "bowser_set_anim_look_up_and_walk", - "802b4300" : "bowser_set_anim_slow_gait", - "802b4368" : "bowser_set_anim_look_down", - "802b43dc" : "bowser_initialize_action", - "802b4478" : "bowser_act_text_wait", - "802b44bc" : "bowser_act_intro_walk", - "802b45f4" : "bowser_bitdw_act_controller", - "802b473c" : "bowser_bitfs_act_controller", - "802b48d4" : "bowser_general_bits_act_controller", - "802b4a1c" : "bowser_set_act_jump", - "802b4a3c" : "bowser_bits_act_controller", - "802b4af4" : "bowser_reset_fallen_off_stage", - "802b4bac" : "bowser_act_unused_slow_walk", - "802b4be8" : "bowser_act_default", - "802b4ca4" : "bowser_act_breath_fire", - "802b4d14" : "bowser_act_walk_to_mario", - "802b4f00" : "bowser_act_teleport", - "802b5104" : "bowser_act_spit_fire_into_sky", - "802b5218" : "bowser_act_hit_mine", - "802b53f4" : "bowser_set_anim_in_air", - "802b5444" : "bowser_land", - "802b5554" : "bowser_short_second_hop", - "802b55cc" : "bowser_act_jump", - "802b5798" : "bowser_act_jump_towards_mario", - "802b58bc" : "bowser_act_hit_edge", - "802b59cc" : "bowser_act_spit_fire_onto_floor", - "802b5aec" : "bowser_turn_on_timer", - "802b5c00" : "bowser_act_turn_from_edge", - "802b5c40" : "bowser_act_charge_mario", - "802b5f6c" : "bowser_check_hit_mine", - "802b5fec" : "bowser_act_thrown_dropped", - "802b611c" : "bowser_set_goal_invisible", - "802b6190" : "bowser_act_jump_onto_stage", - "802b6568" : "bowser_act_dance", - "802b65d0" : "bowser_spawn_grand_star_key", - "802b6670" : "bowser_fly_back_dead", - "802b6730" : "bowser_dead_bounce", - "802b67d4" : "bowser_dead_wait_for_mario", - "802b6878" : "bowser_dead_twirl_into_trophy", - "802b6a10" : "bowser_dead_hide", - "802b6a78" : "bowser_dead_not_bits_end", - "802b6bac" : "bowser_dead_bits_end", - "802b6cf0" : "bowser_act_dead", - "802b6e40" : "bowser_tilt_platform", - "802b6ee0" : "bowser_act_ride_tilting_platform", - "802b711c" : "bowser_check_fallen_off_stage", - "802b71e4" : "bowser_free_update", - "802b72d4" : "bowser_held_update", - "802b7418" : "bowser_thrown_dropped_update", - "802b75a4" : "bhv_bowser_loop", - "802b7878" : "bhv_bowser_init", - "802b798c" : "geo_update_body_rot_from_parent", - "802b7a20" : "bowser_open_eye_switch", - "802b7c64" : "geo_switch_bowser_eyes", - "802b7d44" : "geo_bits_bowser_coloring", - "802b7e68" : "falling_bowser_plat_act_0", - "802b7ef0" : "falling_bowser_plat_act_1", - "802b8024" : "falling_bowser_plat_act_2", - "802b8384" : "bhv_falling_bowser_platform_loop", - "802b83b0" : "bowser_flame_despawn", - "802b8434" : "bowser_flame_should_despawn", - "802b84ac" : "bhv_flame_bowser_init", - "802b85b0" : "bhv_flame_large_burning_out_init", - "802b8654" : "bowser_flame_move", - "802b8734" : "bhv_flame_bowser_loop", - "802b8960" : "bhv_flame_moving_forward_growing_init", - "802b89ec" : "bhv_flame_moving_forward_growing_loop", - "802b8b1c" : "bhv_flame_floating_landing_init", - "802b8c38" : "bhv_flame_floating_landing_loop", - "802b8d68" : "bhv_blue_bowser_flame_init", - "802b8e7c" : "bhv_blue_bowser_flame_loop", - "802b9034" : "bhv_flame_bouncing_init", - "802b90ec" : "bhv_flame_bouncing_loop", - "802b921c" : "bhv_blue_flames_group_loop", - "802b935c" : "bhv_blue_fish_movement_loop", - "802b9790" : "bhv_tank_fish_group_loop", - "802b98d4" : "vec3f_copy_2", - "802b98fc" : "bhv_checkerboard_elevator_group_init", - "802b9a78" : "checkerboard_plat_act_move_y", - "802b9af8" : "checkerboard_plat_act_rotate", - "802b9bb4" : "bhv_checkerboard_platform_init", - "802b9bd8" : "bhv_checkerboard_platform_loop", - "802b9e94" : "bhv_ddd_warp_loop", - "802b9efc" : "water_level_pillar_undrained", - "802ba13c" : "water_level_pillar_drained", - "802ba19c" : "bhv_water_level_pillar_init", - "802ba1e0" : "bhv_water_level_pillar_loop", - "802ba25c" : "bhv_invisible_objects_under_bridge_init", - "802ba2b0" : "geo_scale_bowser_key", - "802ba2f8" : "bhv_bowser_key_unlock_door_loop", - "802ba458" : "bhv_bowser_key_course_exit_loop", - "802ba5bc" : "bhv_moat_grills_loop", - "802ba608" : "bhv_rotating_clock_arm_loop", - "802ba7e0" : "handle_hat_ukiki_reset", - "802ba868" : "is_hat_ukiki_and_mario_has_hat", - "802ba8c4" : "geo_update_projectile_pos_from_parent_copy", - "802ba958" : "idle_ukiki_taunt", - "802bab7c" : "ukiki_act_idle", - "802bae40" : "ukiki_act_return_home", - "802baec4" : "ukiki_act_wait_to_respawn", - "802baf10" : "ukiki_act_unused_turn", - "802baf64" : "ukiki_act_turn_to_mario", - "802bb07c" : "ukiki_act_run", - "802bb288" : "ukiki_act_jump", - "802bb3b8" : "ukiki_act_go_to_cage", - "802bb798" : "ukiki_free_loop", - "802bb888" : "cage_ukiki_held_loop", - "802bba3c" : "hat_ukiki_held_loop", - "802bbb98" : "bhv_ukiki_init", - "802bbc0c" : "bhv_ukiki_loop", - "802bbd6c" : "lll_octagonal_mesh_move", - "802bbfd8" : "lll_octagonal_mesh_find_y_offset", - "802bc0f0" : "bhv_lll_moving_octagonal_mesh_platform_loop", - "802bc22c" : "bhv_lll_sinking_rock_block_loop", - "802bc294" : "bhv_lll_rotating_hex_flame_loop", - "802bc348" : "fire_bar_spawn_flames", - "802bc4f4" : "fire_bar_act_0", - "802bc538" : "fire_bar_act_1", - "802bc590" : "fire_bar_act_2", - "802bc5fc" : "fire_bar_act_3", - "802bc618" : "bhv_lll_rotating_block_fire_bars_loop", - "802bc660" : "bhv_lll_wood_piece_loop", - "802bc728" : "bhv_lll_floating_wood_bridge_loop", - "802bc898" : "bhv_volcano_flames_loop", - "802bc934" : "hexagonal_ring_spawn_flames", - "802bca74" : "bhv_lll_rotating_hexagonal_ring_loop", - "802bcce8" : "sinking_rectangular_plat_actions", - "802bcda8" : "bhv_lll_sinking_rectangular_platform_loop", - "802bce58" : "bhv_lll_sinking_square_platforms_loop", - "802bce9c" : "create_transform_from_normals", - "802bcf40" : "bhv_platform_normals_init", - "802bcfc4" : "approach_by_increment", - "802bd058" : "bhv_tilting_inverted_pyramid_loop", - "802bd3e4" : "koopa_shell_spawn_water_drop", - "802bd488" : "bhv_koopa_shell_flame_loop", - "802bd5dc" : "bhv_koopa_shell_flame_spawn", - "802bd62c" : "koopa_shell_spawn_sparkles", - "802bd680" : "bhv_koopa_shell_loop", - "802bd8d0" : "tox_box_shake_screen", - "802bd91c" : "tox_box_move", - "802bdb04" : "tox_box_act_4", - "802bdb3c" : "tox_box_act_5", - "802bdb74" : "tox_box_act_6", - "802bdbac" : "tox_box_act_7", - "802bdbe4" : "tox_box_act_1", - "802bdc7c" : "tox_box_act_2", - "802bdcc8" : "tox_box_act_3", - "802bdd14" : "tox_box_act_0", - "802bdd68" : "bhv_tox_box_loop", - "802bdd9c" : "piranha_plant_act_idle", - "802bde10" : "piranha_plant_check_interactions", - "802bdeec" : "piranha_plant_act_sleeping", - "802be034" : "piranha_plant_act_woken_up", - "802be0b8" : "piranha_plant_reset_when_far", - "802be0ec" : "piranha_plant_attacked", - "802be150" : "piranha_plant_act_shrink_and_die", - "802be234" : "piranha_plant_act_wait_to_respawn", - "802be278" : "piranha_plant_act_respawn", - "802be350" : "piranha_plant_act_biting", - "802be49c" : "mario_moving_fast_enough_to_make_piranha_plant_bite", - "802be50c" : "piranha_plant_act_stopped_biting", - "802be5a0" : "bhv_piranha_plant_loop", - "802be628" : "bhv_lll_bowser_puzzle_spawn_piece", - "802be6d4" : "bhv_lll_bowser_puzzle_spawn_pieces", - "802be79c" : "bhv_lll_bowser_puzzle_loop", - "802be8a8" : "bhv_lll_bowser_puzzle_piece_action_0", - "802be8b8" : "bhv_lll_bowser_puzzle_piece_action_1", - "802be8f4" : "bhv_lll_bowser_puzzle_piece_update", - "802be9dc" : "bhv_lll_bowser_puzzle_piece_move", - "802beb14" : "bhv_lll_bowser_puzzle_piece_idle", - "802beb54" : "bhv_lll_bowser_puzzle_piece_move_left", - "802beb8c" : "bhv_lll_bowser_puzzle_piece_move_right", - "802bebc4" : "bhv_lll_bowser_puzzle_piece_move_up", - "802bebfc" : "bhv_lll_bowser_puzzle_piece_move_down", - "802bec34" : "bhv_lll_bowser_puzzle_piece_loop", - "802becb0" : "set_obj_anim_with_accel_and_sound", - "802bed7c" : "play_penguin_walking_sound", - "802bedec" : "tuxies_mother_act_2", - "802bef8c" : "tuxies_mother_act_1", - "802bf1d8" : "tuxies_mother_act_0", - "802bf3c0" : "bhv_tuxies_mother_loop", - "802bf424" : "small_penguin_dive_with_mario", - "802bf474" : "small_penguin_act_2", - "802bf57c" : "small_penguin_act_1", - "802bf648" : "small_penguin_act_3", - "802bf6e4" : "small_penguin_act_4", - "802bf760" : "small_penguin_act_0", - "802bf90c" : "small_penguin_act_5", - "802bfa14" : "small_penguin_free_actions", - "802bfa88" : "bhv_small_penguin_loop", - "802bfbac" : "geo_switch_tuxie_mother_eyes", - "802bfcd8" : "fish_act_spawn", - "802bfeb8" : "fish_act_respawn", - "802bff20" : "fish_act_init", - "802bff3c" : "bhv_large_fish_group_loop", - "802bff68" : "fish_regroup", - "802c00b4" : "fish_group_act_rotation", - "802c0348" : "fish_group_act_move", - "802c06a8" : "fish_group_act_animate", - "802c0768" : "bhv_fish_loop", - "802c08a8" : "bhv_wdw_express_elevator_loop", - "802c0aac" : "bub_spawner_act_0", - "802c0b50" : "bub_spawner_act_1", - "802c0ba4" : "bub_spawner_act_2", - "802c0bc4" : "bub_spawner_act_3", - "802c0be0" : "bhv_bub_spawner_loop", - "802c0c0c" : "bub_move_vertically", - "802c0cd4" : "bub_act_0", - "802c0d44" : "bub_act_1", - "802c0f90" : "bub_act_2", - "802c1204" : "bhv_bub_loop", - "802c12c0" : "bhv_rotating_exclamation_box_loop", - "802c1308" : "exclamation_box_act_0", - "802c13ec" : "exclamation_box_act_1", - "802c14b0" : "exclamation_box_act_2", - "802c15b8" : "exclamation_box_act_3", - "802c17bc" : "exclamation_box_spawn_contents", - "802c18d0" : "exclamation_box_act_4", - "802c1988" : "exclamation_box_act_5", - "802c19c0" : "bhv_exclamation_box_loop", - "802c19fc" : "bhv_sound_spawner_init", - "802c1a40" : "bhv_bowsers_sub_loop", - "802c1a80" : "bhv_sushi_shark_collision_loop", - "802c1a90" : "bhv_sushi_shark_loop", - "802c1c44" : "bhv_sunken_ship_part_loop", - "802c1cd4" : "bhv_ship_part_3_loop", - "802c1e10" : "bhv_jrb_sliding_box_loop", - "802c2190" : "bhv_white_puff_1_loop", - "802c2274" : "bhv_white_puff_2_loop", - "802c22b8" : "bhv_hidden_blue_coin_loop", - "802c242c" : "bhv_blue_coin_switch_loop", - "802c263c" : "bhv_openable_cage_door_loop", - "802c26f8" : "bhv_openable_grill_loop", - "802c2930" : "bhv_init_changing_water_level_loop", - "802c2a24" : "bhv_water_level_diamond_loop", - "802c2ce8" : "tweester_scale_and_move", - "802c2ebc" : "tweester_act_idle", - "802c2fbc" : "tweester_act_chase", - "802c31c4" : "tweester_act_hide", - "802c329c" : "bhv_tweester_loop", - "802c32e8" : "bhv_tweester_sand_particle_loop", - "802c3440" : "bhv_boo_init", - "802c3684" : "bhv_courtyard_boo_triplet_init", - "802c4824" : "bhv_boo_loop", - "802c4f30" : "bhv_big_boo_loop", - "802c515c" : "bhv_boo_with_cage_init", - "802c51d4" : "bhv_boo_with_cage_loop", - "802c5224" : "bhv_merry_go_round_boo_manager_loop", - "802c53cc" : "obj_set_secondary_camera_focus", - "802c53ec" : "bhv_animated_texture_loop", - "802c5414" : "bhv_boo_in_castle_loop", - "802c5688" : "bhv_boo_boss_spawned_bridge_loop", - "802c5890" : "bhv_bbh_tilting_trap_platform_loop", - "802c5a38" : "bhv_haunted_bookshelf_loop", - "802c5ca8" : "bhv_merry_go_round_loop", - "802c5dc0" : "bhv_static_checkered_platform_loop", - "802c5f48" : "bhv_beta_bowser_anchor_loop", - "802c5fdc" : "bhv_play_music_track_when_touched_loop", - "802c6050" : "bhv_floor_trap_in_castle_loop", - "802c60ac" : "bhv_castle_floor_trap_init", - "802c6150" : "bhv_castle_floor_trap_open_detect", - "802c61d4" : "bhv_castle_floor_trap_open", - "802c6278" : "bhv_castle_floor_trap_close_detect", - "802c62bc" : "bhv_castle_floor_trap_close", - "802c6328" : "bhv_castle_floor_trap_rotate", - "802c6348" : "bhv_castle_floor_trap_loop", - "802c63e8" : "bhv_pole_base_loop", - "802c64a4" : "bhv_sparkle_spawn_loop", - "802c6538" : "update_angle_from_move_flags", - "802c65c0" : "bhv_scuttlebug_loop", - "802c6b6c" : "bhv_scuttlebug_spawn_loop", - "802c6ca0" : "whomp_play_sfx_from_pound_animation", - "802c6d6c" : "whomp_act_0", - "802c6ec8" : "whomp_act_7", - "802c6fb0" : "whomp_act_1", - "802c710c" : "whomp_act_2", - "802c7254" : "whomp_act_3", - "802c72b4" : "whomp_act_4", - "802c7380" : "whomp_act_5", - "802c7428" : "king_whomp_on_ground", - "802c75fc" : "whomp_on_ground", - "802c76d4" : "whomp_act_6", - "802c7858" : "whomp_act_8", - "802c7998" : "whomp_act_9", - "802c79d8" : "bhv_whomp_loop", - "802c7a70" : "bhv_water_splash_spawn_droplets", - "802c7b14" : "bhv_water_droplet_loop", - "802c7cac" : "bhv_idle_water_wave_loop", - "802c7d40" : "bhv_water_droplet_splash_init", - "802c7d90" : "bhv_bubble_splash_init", - "802c7dfc" : "bhv_shallow_water_splash_init", - "802c7e5c" : "bhv_wave_trail_shrink", - "802c7f98" : "bhv_strong_wind_particle_loop", - "802c81b4" : "cur_obj_spawn_strong_wind_particles", - "802c834c" : "bhv_sl_snowman_wind_loop", - "802c863c" : "bhv_sl_walking_penguin_loop", - "802c89f0" : "update_mario_platform", - "802c8b4c" : "get_mario_pos", - "802c8b8c" : "set_mario_pos", - "802c8bc8" : "apply_platform_displacement", - "802c8ec0" : "apply_mario_platform_displacement", - "802c8f28" : "clear_mario_platform", - "802c8f40" : "debug_print_obj_collision", - "802c8fe4" : "detect_object_hitbox_overlap", - "802c91ec" : "detect_object_hurtbox_overlap", - "802c9388" : "clear_object_collision", - "802c93f8" : "check_collision_in_list", - "802c94ac" : "check_player_object_collision", - "802c95b4" : "check_pushable_object_collision", - "802c9630" : "check_destructive_object_collision", - "802c9724" : "detect_object_collisions", - "802c97d0" : "unused_init_free_list", - "802c9840" : "unused_try_allocate", - "802c98a4" : "try_allocate_object", - "802c9950" : "unused_deallocate", - "802c99b8" : "init_free_object_list", - "802c9a3c" : "clear_object_lists", - "802c9b68" : "unload_object", - "802c9c00" : "allocate_object", - "802c9f04" : "create_object", - "802ca028" : "mark_obj_for_deletion", - "802ca040" : "exec_anim_sound_state", - "802ca144" : "create_sound_spawner", - "802ca190" : "cur_obj_play_sound_1", - "802ca1e0" : "cur_obj_play_sound_2", - "802ca230" : "calc_dist_to_volume_range_1", - "802ca2d4" : "calc_dist_to_volume_range_2", - "802ca370" : "stub_debug_1", - "802ca380" : "stub_debug_2", - "802ca390" : "stub_debug_3", - "802ca3a0" : "stub_debug_4", - "802ca3b0" : "get_current_clock", - "802ca3e0" : "get_clock_difference", - "802ca418" : "set_print_state_info", - "802ca460" : "print_text_array_info", - "802ca51c" : "set_text_array_x_y", - "802ca568" : "print_debug_bottom_up", - "802ca5b8" : "print_debug_top_down_objectinfo", - "802ca618" : "print_debug_top_down_mapinfo", - "802ca680" : "print_debug_top_down_normal", - "802ca6d0" : "print_mapinfo", - "802ca8e8" : "print_checkinfo", - "802ca918" : "print_surfaceinfo", - "802ca94c" : "print_stageinfo", - "802ca990" : "print_string_array_info", - "802caa6c" : "print_effectinfo", - "802caaa8" : "print_enemyinfo", - "802caae4" : "update_debug_dpadmask", - "802cabac" : "debug_unknown_level_select_check", - "802cac20" : "reset_debug_objectinfo", - "802cb0b0" : "stub_debug_5", - "802cb0c0" : "try_print_debug_mario_object_info", - "802cb1c0" : "try_print_debug_mario_level_info", - "802cb264" : "try_do_mario_debug_object_spawn", - "802cb564" : "debug_enemy_unknown", - "802cb5c0" : "set_and_reset_transition_fade_timer", - "802cb640" : "set_transition_color_fade_alpha", - "802cb894" : "vertex_transition_color", - "802cba18" : "dl_transition_color", - "802cbbc4" : "render_fade_transition_from_color", - "802cbc20" : "render_fade_transition_into_color", - "802cbc7c" : "calc_tex_transition_radius", - "802cbd54" : "calc_tex_transition_time", - "802cbe64" : "convert_tex_transition_angle_to_pos", - "802cbee0" : "center_tex_transition_x", - "802cbf64" : "center_tex_transition_y", - "802cbfe8" : "make_tex_transition_vertex", - "802cc180" : "load_tex_transition_vertex", - "802cc4d8" : "render_textured_transition", - "802ccbe8" : "render_screen_transition", - "802ccdc8" : "render_cannon_circle_base", - "802cd1e8" : "geo_cannon_circle_base", - "802cd280" : "rotate_rectangle", - "802cd328" : "atan2_deg", - "802cd388" : "scale_shadow_with_distance", - "802cd444" : "disable_shadow_with_distance", - "802cd48c" : "dim_shadow_with_distance", - "802cd614" : "get_water_level_below_shadow", - "802cd6c4" : "init_shadow", - "802cd938" : "get_texture_coords_9_vertices", - "802cd988" : "get_texture_coords_4_vertices", - "802cd9ec" : "make_shadow_vertex_at_xyz", - "802cdb20" : "extrapolate_vertex_y_position", - "802cdb74" : "get_vertex_coords", - "802cdc40" : "calculate_vertex_xyz", - "802cde94" : "floor_local_tilt", - "802cdf3c" : "make_shadow_vertex", - "802ce128" : "add_shadow_to_display_list", - "802ce2bc" : "linearly_interpolate_solidity_positive", - "802ce3ec" : "linearly_interpolate_solidity_negative", - "802ce524" : "correct_shadow_solidity_for_animations", - "802ce690" : "correct_lava_shadow_height", - "802ce79c" : "create_shadow_player", - "802ce9d0" : "create_shadow_circle_9_verts", - "802ceae8" : "create_shadow_circle_4_verts", - "802cec04" : "create_shadow_circle_assuming_flat_ground", - "802cedc0" : "create_shadow_rectangle", - "802cef6c" : "get_shadow_height_solidity", - "802cf080" : "create_shadow_square", - "802cf1f0" : "create_shadow_hardcoded_rectangle", - "802cf34c" : "create_shadow_below_xyz", - "802cf5b0" : "calculate_skybox_scaled_x", - "802cf69c" : "calculate_skybox_scaled_y", - "802cf804" : "make_skybox_rect", - "802cfa2c" : "draw_skybox_tile_grid", - "802cfc68" : "create_skybox_ortho_matrix", - "802cfd88" : "init_skybox_display_list", - "802cfef4" : "create_skybox_facing_camera", - "802d0080" : "geo_wdw_set_initial_water_level", - "802d01e0" : "geo_movtex_pause_control", - "802d0254" : "movtex_make_quad_vertex", - "802d0484" : "movtex_gen_from_quad", - "802d0a84" : "movtex_gen_from_quad_array", - "802d0bb0" : "movtex_gen_quads_id", - "802d0c84" : "get_quad_collection_from_id", - "802d0f28" : "movtex_change_texture_format", - "802d104c" : "geo_movtex_draw_water_regions", - "802d1330" : "update_moving_texture_offset", - "802d13cc" : "movtex_write_vertex_first", - "802d1574" : "movtex_write_vertex_index", - "802d18b4" : "movtex_gen_list", - "802d1b70" : "geo_movtex_draw_nocolor", - "802d1cdc" : "geo_movtex_draw_colored", - "802d1e48" : "geo_movtex_draw_colored_no_update", - "802d1fa8" : "geo_movtex_draw_colored_2_no_update", - "802d2108" : "geo_movtex_update_horizontal", - "802d2210" : "make_vertex", - "802d22c4" : "round_float", - "802d2360" : "geo_exec_inside_castle_light", - "802d2470" : "geo_exec_flying_carpet_timer_update", - "802d2520" : "geo_exec_flying_carpet_create", - "802d28cc" : "geo_exec_cake_end_screen", - "802d29c0" : "stop_other_paintings", - "802d2a74" : "painting_mario_y", - "802d2b08" : "painting_mario_z", - "802d2b84" : "painting_ripple_y", - "802d2c40" : "painting_nearest_4th", - "802d2d80" : "painting_mario_x", - "802d2dfc" : "painting_ripple_x", - "802d2eb8" : "painting_state", - "802d2ffc" : "wall_painting_proximity_idle", - "802d319c" : "wall_painting_proximity_rippling", - "802d327c" : "wall_painting_continuous_idle", - "802d341c" : "wall_painting_continuous_rippling", - "802d34fc" : "floor_painting_proximity_idle", - "802d36ac" : "floor_painting_proximity_rippling", - "802d379c" : "floor_painting_continuous_idle", - "802d393c" : "floor_painting_continuous_rippling", - "802d3a2c" : "painting_update_floors", - "802d3bec" : "painting_update_ripple_state", - "802d3cec" : "calculate_ripple_at_point", - "802d3e6c" : "ripple_if_movable", - "802d3ee4" : "painting_generate_mesh", - "802d404c" : "painting_calculate_triangle_normals", - "802d43f8" : "normalize_component", - "802d44bc" : "painting_average_vertex_normals", - "802d47d0" : "render_painting", - "802d4edc" : "painting_model_view_transform", - "802d50dc" : "painting_ripple_image", - "802d5354" : "painting_ripple_env_mapped", - "802d556c" : "display_painting_rippling", - "802d568c" : "display_painting_not_rippling", - "802d5778" : "reset_painting", - "802d57a8" : "move_ddd_painting", - "802d58e4" : "set_painting_layer", - "802d593c" : "display_painting", - "802d59a8" : "wall_painting_update", - "802d5aa0" : "floor_painting_update", - "802d5b98" : "geo_painting_draw", - "802d5d0c" : "geo_painting_update", - "802d5e00" : "int_pow", - "802d5e54" : "format_integer", - "802d6144" : "parse_width_field", - "802d62d8" : "print_text_fmt_int", - "802d6554" : "print_text", - "802d66c0" : "print_text_centered", - "802d6858" : "char_to_glyph_index", - "802d69f8" : "add_glyph_texture", - "802d6acc" : "clip_to_bounds", - "802d6b3c" : "render_textrect", - "802d6c88" : "render_text_labels", - "802d6f20" : "create_dl_identity_matrix", - "802d7070" : "create_dl_translation_matrix", - "802d7174" : "create_dl_rotation_matrix", - "802d7280" : "create_dl_scale_matrix", - "802d7384" : "create_dl_ortho_matrix", - "802d75dc" : "render_generic_char", - "802d76c8" : "render_multi_text_string", - "802d77dc" : "print_generic_string", - "802d7b84" : "print_hud_lut_string", - "802d7e88" : "print_menu_generic_string", - "802d82d4" : "print_credits_string", - "802d862c" : "handle_menu_scrolling", - "802d8844" : "get_str_x_pos_from_center", - "802d8934" : "get_string_width", - "802d89b8" : "print_hud_my_score_coins", - "802d8a80" : "print_hud_my_score_stars", - "802d8b34" : "int_to_str", - "802d8c6c" : "get_dialog_id", - "802d8c88" : "create_dialog_box", - "802d8cc4" : "create_dialog_box_with_var", - "802d8d08" : "create_dialog_inverted_box", - "802d8d48" : "create_dialog_box_with_response", - "802d8d90" : "reset_dialog_render_state", - "802d8e2c" : "render_dialog_box_type", - "802d9148" : "change_and_flash_dialog_text_color_lines", - "802d9388" : "handle_dialog_scroll_page_state", - "802d944c" : "render_star_count_dialog_text", - "802d9634" : "render_multi_text_string_lines", - "802d9800" : "ensure_nonnegative", - "802d982c" : "handle_dialog_text_and_pages", - "802d9cb0" : "render_dialog_triangle_choice", - "802d9dfc" : "render_dialog_string_color", - "802d9f84" : "handle_special_dialog_text", - "802da1ac" : "render_dialog_entries", - "802da810" : "set_menu_mode", - "802da844" : "reset_cutscene_msg_fade", - "802da85c" : "dl_rgba16_begin_cutscene_msg_fade", - "802da8e4" : "dl_rgba16_stop_cutscene_msg_fade", - "802da964" : "ascii_to_credits_char", - "802daa34" : "print_credits_str_ascii", - "802daae4" : "set_cutscene_message", - "802dab58" : "do_cutscene_handler", - "802dad54" : "print_peach_letter_message", - "802db08c" : "render_hud_cannon_reticle", - "802db350" : "reset_red_coins_collected", - "802db368" : "change_dialog_camera_angle", - "802db3b8" : "shade_screen", - "802db498" : "print_animated_red_coin", - "802db6e8" : "render_pause_red_coins", - "802db760" : "render_pause_my_score_coins", - "802dbb24" : "render_pause_camera_options", - "802dbe68" : "render_pause_course_options", - "802dc15c" : "render_pause_castle_menu_box", - "802dc418" : "highlight_last_course_complete_stars", - "802dc478" : "print_hud_pause_colorful_str", - "802dc570" : "render_pause_castle_course_stars", - "802dc718" : "render_pause_castle_main_strings", - "802dca88" : "render_pause_courses_and_castle", - "802dcd04" : "print_hud_course_complete_string", - "802dcf30" : "print_hud_course_complete_coins", - "802dd194" : "play_star_fanfare_and_flash_hud", - "802dd210" : "render_course_complete_lvl_info_and_hud_str", - "802dd838" : "render_save_confirmation", - "802ddae0" : "render_course_complete_screen", - "802ddca4" : "render_menus_and_dialogs", - "802dddf0" : "envfx_init_snow", - "802ddf38" : "envfx_update_snowflake_count", - "802de0bc" : "envfx_cleanup_snow", - "802de114" : "orbit_from_positions", - "802de23c" : "pos_from_orbit", - "802de360" : "envfx_is_snowflake_alive", - "802de458" : "envfx_update_snow_normal", - "802de888" : "envfx_update_snow_blizzard", - "802ded38" : "envfx_update_snow_water", - "802def2c" : "rotate_triangle_vertices", - "802df334" : "append_snowflake_vertex_buffer", - "802df748" : "envfx_update_snow", - "802dfbc8" : "envfx_update_particles", - "802dfd50" : "particle_is_laterally_close", - "802dfe00" : "random_flower_offset", - "802dfe80" : "envfx_update_flower", - "802e0120" : "envfx_set_lava_bubble_position", - "802e048c" : "envfx_update_lava", - "802e065c" : "envfx_rotate_around_whirlpool", - "802e08a8" : "envfx_is_whirlpool_bubble_alive", - "802e0934" : "envfx_update_whirlpool", - "802e0e24" : "envfx_is_jestream_bubble_alive", - "802e0eb8" : "envfx_update_jetstream", - "802e1238" : "envfx_init_bubble", - "802e1414" : "envfx_bubbles_update_switch", - "802e1618" : "append_bubble_vertex_buffer", - "802e1a20" : "envfx_set_bubble_texture", - "802e1bb8" : "envfx_update_bubble_particles", - "802e1ed8" : "envfx_set_max_bubble_particles", - "802e1f48" : "envfx_update_bubbles", - "802e20a0" : "convert_rotation", - "802e2134" : "spawn_macro_abs_yrot_2params", - "802e21dc" : "spawn_macro_abs_yrot_param1", - "802e2284" : "spawn_macro_abs_special", - "802e2414" : "spawn_macro_objects", - "802e2690" : "spawn_macro_objects_hardcoded", - "802e28ec" : "spawn_special_objects", - "802e2cf0" : "render_hud_tex_lut", - "802e2e58" : "render_hud_small_tex_lut", - "802e30b4" : "render_power_meter_health_segment", - "802e3214" : "render_dl_power_meter", - "802e33b8" : "animate_power_meter_emphasized", - "802e352c" : "handle_power_meter_actions", - "802e3654" : "render_hud_power_meter", - "802e3744" : "render_hud_mario_lives", - "802e37a8" : "render_hud_coins", - "802e380c" : "render_hud_stars", - "802e38e4" : "render_hud_keys", - "802e395c" : "render_hud_timer", - "802e3b1c" : "set_hud_camera_status", - "802e3b3c" : "render_hud_camera_status", - "802e3d2c" : "render_hud", - "802e3e50" : "set_yoshi_as_not_dead", - "802e3e68" : "geo_obj_transparency_something", - "802e3f68" : "absf_2", - "802e3fac" : "turn_obj_away_from_surface", - "802e405c" : "obj_find_wall", - "802e41a4" : "turn_obj_away_from_steep_floor", - "802e42e0" : "obj_orient_graph", - "802e43e4" : "calc_obj_friction", - "802e445c" : "calc_new_obj_vel_and_pos_y", - "802e4814" : "calc_new_obj_vel_and_pos_y_underwater", - "802e4cec" : "obj_update_pos_vel_xz", - "802e4d88" : "obj_splash", - "802e4e90" : "object_step", - "802e5114" : "object_step_without_floor_orient", - "802e5160" : "obj_move_xyz_using_fvel_and_yaw", - "802e5208" : "is_point_within_radius_of_mario", - "802e52b8" : "is_point_close_to_object", - "802e5360" : "set_object_visibility", - "802e53f4" : "obj_return_home_if_safe", - "802e54b0" : "obj_return_and_displace_home", - "802e55d0" : "obj_check_if_facing_toward_angle", - "802e569c" : "obj_find_wall_displacement", - "802e5760" : "obj_spawn_yellow_coins", - "802e5824" : "obj_flicker_and_disappear", - "802e58b4" : "current_mario_room_check", - "802e5948" : "trigger_obj_dialog_when_facing", - "802e5a80" : "obj_check_floor_death", - "802e5b18" : "obj_lava_death", - "802e5c6c" : "spawn_orange_number", - "802e5d04" : "debug_sequence_tracker", - "802e5de8" : "coin_step", - "802e5e6c" : "moving_coin_flicker", - "802e5ea4" : "coin_collected", - "802e5ee8" : "bhv_moving_yellow_coin_init", - "802e5f64" : "bhv_moving_yellow_coin_loop", - "802e6098" : "bhv_moving_blue_coin_init", - "802e6114" : "bhv_moving_blue_coin_loop", - "802e62a4" : "bhv_blue_coin_sliding_jumping_init", - "802e631c" : "blue_coin_sliding_away_from_mario", - "802e63ec" : "blue_coin_sliding_slow_down", - "802e6474" : "bhv_blue_coin_sliding_loop", - "802e6628" : "bhv_blue_coin_jumping_loop", - "802e6790" : "bhv_seaweed_init", - "802e67dc" : "bhv_seaweed_bundle_init", - "802e6a2c" : "bhv_bobomb_init", - "802e6a8c" : "bobomb_spawn_coin", - "802e6af8" : "bobomb_act_explode", - "802e6bd4" : "bobomb_check_interactions", - "802e6cf0" : "bobomb_act_patrol", - "802e6dc8" : "bobomb_act_chase_mario", - "802e6e84" : "bobomb_act_launched", - "802e6ed8" : "generic_bobomb_free_loop", - "802e7020" : "stationary_bobomb_free_loop", - "802e7134" : "bobomb_free_loop", - "802e7180" : "bobomb_held_loop", - "802e7220" : "bobomb_dropped_loop", - "802e7280" : "bobomb_thrown_loop", - "802e7324" : "curr_obj_random_blink", - "802e742c" : "bhv_bobomb_loop", - "802e75a0" : "bhv_bobomb_fuse_smoke_init", - "802e76ac" : "bhv_bobomb_buddy_init", - "802e770c" : "bobomb_buddy_act_idle", - "802e7814" : "bobomb_buddy_cannon_dialog", - "802e79dc" : "bobomb_buddy_act_talk", - "802e7b00" : "bobomb_buddy_act_turn_to_talk", - "802e7bb0" : "bobomb_buddy_actions", - "802e7c4c" : "bhv_bobomb_buddy_loop", - "802e7c90" : "bhv_cannon_closed_init", - "802e7d4c" : "cannon_door_act_opening", - "802e7e54" : "bhv_cannon_closed_loop", - "802e7f70" : "bhv_whirlpool_init", - "802e7fb8" : "whirlpool_set_hitbox", - "802e7fec" : "whirpool_orient_graph", - "802e80dc" : "bhv_whirlpool_loop", - "802e82b0" : "bhv_jet_stream_loop", - "802e8388" : "bhv_homing_amp_init", - "802e89d4" : "bhv_homing_amp_loop", - "802e8ae4" : "bhv_circling_amp_init", - "802e8ecc" : "bhv_circling_amp_loop", - "802e8f68" : "bhv_butterfly_init", - "802e9018" : "butterfly_step", - "802e9278" : "butterfly_calculate_angle", - "802e9470" : "butterfly_act_rest", - "802e94e4" : "butterfly_act_follow_mario", - "802e9548" : "butterfly_act_return_home", - "802e96c8" : "bhv_butterfly_loop", - "802e9764" : "bhv_hoot_init", - "802e97fc" : "hoot_find_next_floor", - "802e98c0" : "hoot_floor_bounce", - "802e9a4c" : "hoot_free_step", - "802e9cf4" : "hoot_player_set_yaw", - "802e9d98" : "hoot_carry_step", - "802e9f60" : "hoot_surface_collision", - "802ea144" : "hoot_act_ascent", - "802ea258" : "hoot_action_loop", - "802ea3f0" : "hoot_turn_to_home", - "802ea4ec" : "hoot_awake_loop", - "802ea588" : "bhv_hoot_loop", - "802ea6a8" : "bhv_beta_holdable_object_init", - "802ea7e0" : "bhv_beta_holdable_object_loop", - "802ea888" : "bhv_object_bubble_init", - "802ea934" : "bhv_object_bubble_loop", - "802eaa10" : "bhv_object_water_wave_init", - "802eaa50" : "bhv_object_water_wave_loop", - "802eaa8c" : "bhv_explosion_init", - "802eaad0" : "bhv_explosion_loop", - "802eabf0" : "bhv_bobomb_bully_death_smoke_init", - "802eac3c" : "bhv_bobomb_explosion_bubble_init", - "802ead3c" : "bhv_bobomb_explosion_bubble_loop", - "802eaef8" : "bhv_respawner_loop", - "802eaf84" : "create_respawner", - "802eb05c" : "bhv_small_bully_init", - "802eb104" : "bhv_big_bully_init", - "802eb1c0" : "bully_check_mario_collision", - "802eb288" : "bully_act_chase_mario", - "802eb3f0" : "bully_act_knockback", - "802eb510" : "bully_act_back_up", - "802eb5c4" : "bully_backup_check", - "802eb630" : "bully_play_stomping_sound", - "802eb744" : "bully_step", - "802eb7e0" : "bully_spawn_coin", - "802eb8b0" : "bully_act_level_death", - "802eb9d0" : "bhv_bully_loop", - "802ebb74" : "big_bully_spawn_minion", - "802ebc00" : "bhv_big_bully_with_minions_init", - "802ebc88" : "big_bully_spawn_star", - "802ebce0" : "bhv_big_bully_with_minions_loop", - "802ebf70" : "water_ring_calc_mario_dist", - "802ec030" : "water_ring_init", - "802ec1b0" : "bhv_jet_stream_water_ring_init", - "802ec200" : "water_ring_check_collection", - "802ec3d0" : "water_ring_set_scale", - "802ec4e0" : "water_ring_act_collected", - "802ec59c" : "water_ring_act_not_collected", - "802ec75c" : "bhv_jet_stream_water_ring_loop", - "802ec7cc" : "spawn_manta_ray_ring_manager", - "802ec818" : "water_ring_spawner_act_inactive", - "802ec908" : "bhv_jet_stream_ring_spawner_loop", - "802ec9b8" : "bhv_manta_ray_water_ring_init", - "802ec9f0" : "manta_water_ring_act_not_collected", - "802ecba4" : "bhv_manta_ray_water_ring_loop", - "802ecc14" : "bhv_bowser_bomb_loop", - "802ecd0c" : "bhv_bowser_bomb_explosion_loop", - "802ecea0" : "bhv_bowser_bomb_smoke_loop", - "802ecfac" : "bhv_celebration_star_init", - "802ed10c" : "celeb_star_act_spin_around_mario", - "802ed28c" : "celeb_star_act_face_camera", - "802ed39c" : "bhv_celebration_star_loop", - "802ed40c" : "bhv_celebration_star_sparkle_loop", - "802ed45c" : "bhv_star_key_collection_puff_spawner_loop", - "802ed498" : "bhv_lll_drawbridge_spawner_loop", - "802ed62c" : "bhv_lll_drawbridge_loop", - "802ed78c" : "bhv_small_bomp_init", - "802ed7fc" : "bhv_small_bomp_loop", - "802edacc" : "bhv_large_bomp_init", - "802edb2c" : "bhv_large_bomp_loop", - "802eddfc" : "bhv_wf_sliding_platform_init", - "802edf28" : "bhv_wf_sliding_platform_loop", - "802ee124" : "bhv_moneybag_init", - "802ee1a0" : "moneybag_check_mario_collision", - "802ee268" : "moneybag_jump", - "802ee46c" : "moneybag_act_move_around", - "802ee598" : "moneybag_act_return_home", - "802ee728" : "moneybag_act_disappear", - "802ee778" : "moneybag_act_death", - "802ee7e0" : "bhv_moneybag_loop", - "802ee8f4" : "bhv_moneybag_hidden_loop", - "802ee9cc" : "bhv_bowling_ball_init", - "802eea24" : "bowling_ball_set_hitbox", - "802eea7c" : "bowling_ball_set_waypoints", - "802eeb64" : "bhv_bowling_ball_roll_loop", - "802eecb8" : "bhv_bowling_ball_initializeLoop", - "802eedf0" : "bhv_bowling_ball_loop", - "802eeeb4" : "bhv_generic_bowling_ball_spawner_init", - "802eef9c" : "bhv_generic_bowling_ball_spawner_loop", - "802ef0e8" : "bhv_thi_bowling_ball_spawner_loop", - "802ef21c" : "bhv_bob_pit_bowling_ball_init", - "802ef274" : "bhv_bob_pit_bowling_ball_loop", - "802ef34c" : "bhv_free_bowling_ball_init", - "802ef3f4" : "bhv_free_bowling_ball_roll_loop", - "802ef524" : "bhv_free_bowling_ball_loop", - "802ef63c" : "bhv_rr_cruiser_wing_init", - "802ef66c" : "bhv_rr_cruiser_wing_loop", - "802ef820" : "bhv_spindel_init", - "802ef858" : "bhv_spindel_loop", - "802efcd0" : "bhv_ssl_moving_pyramid_wall_init", - "802efd8c" : "bhv_ssl_moving_pyramid_wall_loop", - "802efe64" : "bhv_pyramid_elevator_init", - "802efef4" : "bhv_pyramid_elevator_loop", - "802f0104" : "bhv_pyramid_elevator_trajectory_marker_ball_loop", - "802f0168" : "bhv_pyramid_top_init", - "802f0288" : "bhv_pyramid_top_spinning", - "802f04a0" : "bhv_pyramid_top_explode", - "802f05b4" : "bhv_pyramid_top_loop", - "802f06a8" : "bhv_pyramid_top_fragment_init", - "802f0714" : "bhv_pyramid_top_fragment_loop", - "802f0788" : "bhv_pyramid_pillar_touch_detector_loop", - "802f07f4" : "bhv_waterfall_sound_loop", - "802f0820" : "bhv_volcano_sound_loop", - "802f084c" : "bhv_castle_flag_init", - "802f0898" : "bhv_birds_sound_loop", - "802f0950" : "bhv_ambient_sounds_init", - "802f09a4" : "bhv_sand_sound_loop", - "802f09f0" : "bhv_castle_cannon_grate_init", - "802f0a40" : "bhv_snowmans_bottom_init", - "802f0b7c" : "set_rolling_sphere_hitbox", - "802f0bd4" : "adjust_rolling_face_pitch", - "802f0c94" : "snowmans_bottom_act_1", - "802f0df0" : "snowmans_bottom_act_2", - "802f0fa8" : "snowmans_bottom_act_3", - "802f105c" : "bhv_snowmans_bottom_loop", - "802f120c" : "bhv_snowmans_head_init", - "802f1370" : "bhv_snowmans_head_loop", - "802f151c" : "bhv_snowmans_body_checkpoint_loop", - "802f15a8" : "bhv_big_boulder_init", - "802f162c" : "boulder_act_1", - "802f1714" : "bhv_big_boulder_loop", - "802f17f0" : "bhv_big_boulder_generator_loop", - "802f1954" : "cap_set_hitbox", - "802f19c8" : "cap_despawn", - "802f1a10" : "cap_check_quicksand", - "802f1bb8" : "cap_sink_quicksand", - "802f1d64" : "bhv_wing_cap_init", - "802f1dc0" : "cap_scale_vertically", - "802f1e5c" : "wing_vanish_cap_act_0", - "802f1f3c" : "bhv_wing_vanish_cap_loop", - "802f1fd0" : "bhv_metal_cap_init", - "802f2030" : "metal_cap_act_0", - "802f20ac" : "bhv_metal_cap_loop", - "802f2140" : "bhv_normal_cap_init", - "802f21e0" : "normal_cap_set_save_flags", - "802f2284" : "normal_cap_act_0", - "802f23a8" : "bhv_normal_cap_loop", - "802f2498" : "bhv_vanish_cap_init", - "802f24f4" : "bhv_collect_star_init", - "802f25b0" : "bhv_collect_star_loop", - "802f2614" : "bhv_star_spawn_init", - "802f2768" : "bhv_star_spawn_loop", - "802f2aa0" : "spawn_star", - "802f2b88" : "spawn_default_star", - "802f2bd4" : "spawn_red_coin_cutscene_star", - "802f2c24" : "spawn_no_exit_star", - "802f2c84" : "bhv_hidden_red_coin_star_init", - "802f2d8c" : "bhv_hidden_red_coin_star_loop", - "802f2e6c" : "bhv_red_coin_init", - "802f2f2c" : "bhv_red_coin_loop", - "802f3014" : "bhv_hidden_star_init", - "802f30f0" : "bhv_hidden_star_loop", - "802f31bc" : "bhv_hidden_star_trigger_loop", - "802f328c" : "bhv_bowser_course_red_coin_star_loop", - "802f336c" : "bhv_ttm_rolling_log_init", - "802f341c" : "rolling_log_roll_log", - "802f36a4" : "bhv_rolling_log_loop", - "802f38b0" : "volcano_act_1", - "802f39b4" : "volcano_act_3", - "802f3a30" : "bhv_volcano_trap_loop", - "802f3b98" : "bhv_lll_rolling_log_init", - "802f3c54" : "bhv_1up_interact", - "802f3cc8" : "bhv_1up_common_init", - "802f3d30" : "bhv_1up_init", - "802f3dd0" : "one_up_loop_in_air", - "802f3ea8" : "pole_1up_move_towards_mario", - "802f401c" : "one_up_move_away_from_mario", - "802f40cc" : "bhv_1up_walking_loop", - "802f4248" : "bhv_1up_running_away_loop", - "802f43b8" : "sliding_1up_move", - "802f44c0" : "bhv_1up_sliding_loop", - "802f45b8" : "bhv_1up_loop", - "802f45f0" : "bhv_1up_jump_on_approach_loop", - "802f4710" : "bhv_1up_hidden_loop", - "802f48f4" : "bhv_1up_hidden_trigger_loop", - "802f496c" : "bhv_1up_hidden_in_pole_loop", - "802f4b00" : "bhv_1up_hidden_in_pole_trigger_loop", - "802f4b78" : "bhv_1up_hidden_in_pole_spawner_loop", - "802f4c68" : "controllable_platform_act_1", - "802f4ce0" : "controllable_platform_act_2", - "802f4d78" : "bhv_controllable_platform_sub_loop", - "802f4eb4" : "bhv_controllable_platform_init", - "802f5010" : "controllable_platform_hit_wall", - "802f5068" : "controllable_platform_check_walls", - "802f52c0" : "controllable_platform_shake_on_wall_hit", - "802f547c" : "controllable_platform_tilt_from_mario", - "802f55a4" : "bhv_controllable_platform_loop", - "802f5cd4" : "bhv_breakable_box_small_init", - "802f5d78" : "small_breakable_box_spawn_dust", - "802f5e44" : "small_breakable_box_act_move", - "802f5f48" : "breakable_box_small_released_loop", - "802f6014" : "breakable_box_small_idle_loop", - "802f60d8" : "breakable_box_small_get_dropped", - "802f6150" : "breakable_box_small_get_thrown", - "802f6228" : "bhv_breakable_box_small_loop", - "802f62e4" : "bhv_sliding_snow_mound_loop", - "802f6448" : "bhv_snow_mound_spawn_loop", - "802f6588" : "floating_platform_find_home_y", - "802f665c" : "floating_platform_act_0", - "802f6984" : "bhv_floating_platform_loop", - "802f6c0c" : "bhv_arrow_lift_loop", - "802f6d20" : "bhv_orange_number_init", - "802f6d58" : "bhv_orange_number_loop", - "802f6e40" : "bhv_manta_ray_init", - "802f6eb0" : "manta_ray_move", - "802f7068" : "manta_ray_act_spawn_ring", - "802f7264" : "bhv_manta_ray_loop", - "802f7348" : "bhv_falling_pillar_init", - "802f7398" : "bhv_falling_pillar_spawn_hitboxes", - "802f7418" : "bhv_falling_pillar_calculate_angle_in_front_of_mario", - "802f74dc" : "bhv_falling_pillar_loop", - "802f7760" : "bhv_falling_pillar_hitbox_loop", - "802f7924" : "bhv_jrb_floating_box_loop", - "802f7978" : "bhv_decorative_pendulum_init", - "802f79b0" : "bhv_decorative_pendulum_loop", - "802f7a58" : "bhv_treasure_chest_top_loop", - "802f7c9c" : "bhv_treasure_chest_bottom_init", - "802f7d04" : "bhv_treasure_chest_bottom_loop", - "802f7f1c" : "spawn_treasure_chest", - "802f7fa0" : "bhv_treasure_chest_ship_init", - "802f8044" : "bhv_treasure_chest_ship_loop", - "802f8158" : "bhv_treasure_chest_jrb_init", - "802f8208" : "bhv_treasure_chest_jrb_loop", - "802f82f8" : "bhv_treasure_chest_init", - "802f83a4" : "bhv_treasure_chest_loop", - "802f8490" : "bhv_mips_init", - "802f85e0" : "bhv_mips_find_furthest_waypoint_to_mario", - "802f8760" : "bhv_mips_act_wait_for_nearby_mario", - "802f8808" : "bhv_mips_act_follow_path", - "802f893c" : "bhv_mips_act_wait_for_animation_done", - "802f8988" : "bhv_mips_act_fall_down", - "802f8a34" : "bhv_mips_act_idle", - "802f8ab4" : "bhv_mips_free", - "802f8b54" : "bhv_mips_held", - "802f8c74" : "bhv_mips_dropped", - "802f8cf8" : "bhv_mips_thrown", - "802f8dac" : "bhv_mips_loop", - "802f8e54" : "bhv_yoshi_init", - "802f8f08" : "yoshi_walk_loop", - "802f9054" : "yoshi_idle_loop", - "802f923c" : "yoshi_talk_loop", - "802f93a8" : "yoshi_walk_and_jump_off_roof_loop", - "802f9500" : "yoshi_finish_jumping_and_despawn_loop", - "802f95ac" : "yoshi_give_present_loop", - "802f965c" : "bhv_yoshi_loop", - "802fbc4c" : "bhv_koopa_init", - "802fc414" : "shelled_koopa_attack_handler", - "802fcc00" : "obj_begin_race", - "802fd7f8" : "bhv_koopa_update", - "802fd950" : "bhv_koopa_race_endpoint_update", - "802fda28" : "bhv_pokey_body_part_update", - "802fe3b0" : "bhv_pokey_update", - "802fe8b4" : "bhv_swoop_update", - "802ff040" : "bhv_fly_guy_update", - "802ff214" : "bhv_goomba_triplet_spawner_update", - "802ff408" : "bhv_goomba_init", - "802ff94c" : "huge_goomba_weakly_attacked", - "802ff96c" : "bhv_goomba_update", - "802ffb38" : "bhv_chain_chomp_chain_part_update", - "80300e40" : "bhv_chain_chomp_update", - "80300ecc" : "bhv_wooden_post_update", - "80301148" : "bhv_chain_chomp_gate_init", - "80301180" : "bhv_chain_chomp_gate_update", - "80301210" : "bhv_wiggler_body_part_update", - "803014cc" : "wiggler_init_segments", - "803016e0" : "wiggler_update_segments", - "803020e4" : "wiggler_jumped_on_attack_handler", - "80302154" : "bhv_wiggler_update", - "80302910" : "bhv_spiny_update", - "80303028" : "bhv_enemy_lakitu_update", - "8030369c" : "bhv_cloud_update", - "80303744" : "bhv_cloud_part_update", - "80303984" : "bhv_camera_lakitu_init", - "80303f64" : "bhv_camera_lakitu_update", - "803043f8" : "bhv_monty_mole_hole_update", - "80304474" : "monty_mole_spawn_dirt_particles", - "803044c0" : "bhv_monty_mole_init", - "80304ba8" : "bhv_monty_mole_update", - "80304fd4" : "bhv_monty_mole_rock_update", - "80305100" : "bhv_platform_on_track_init", - "80305a58" : "bhv_platform_on_track_update", - "80305bb0" : "bhv_track_ball_update", - "80305c14" : "bhv_seesaw_platform_init", - "80305c90" : "bhv_seesaw_platform_update", - "80305e2c" : "bhv_ferris_wheel_axle_init", - "80305f24" : "bhv_ferris_wheel_platform_update", - "80306084" : "bhv_water_bomb_spawner_update", - "803062a8" : "water_bomb_spawn_explode_particles", - "803067e8" : "bhv_water_bomb_update", - "803068c0" : "bhv_water_bomb_shadow_update", - "8030699c" : "bhv_ttc_rotating_solid_init", - "80306a38" : "bhv_ttc_rotating_solid_update", - "80306cc4" : "bhv_ttc_pendulum_init", - "80306d38" : "bhv_ttc_pendulum_update", - "80306f48" : "bhv_ttc_treadmill_init", - "80307010" : "bhv_ttc_treadmill_update", - "803071b8" : "bhv_ttc_moving_bar_init", - "80307670" : "bhv_ttc_moving_bar_update", - "80307760" : "bhv_ttc_cog_init", - "803077e0" : "bhv_ttc_cog_update", - "80307930" : "bhv_ttc_pit_block_init", - "803079c8" : "bhv_ttc_pit_block_update", - "80307ae4" : "bhv_ttc_elevator_init", - "80307b58" : "bhv_ttc_elevator_update", - "80307c88" : "bhv_ttc_2d_rotator_init", - "80307cf8" : "bhv_ttc_2d_rotator_update", - "80307ea4" : "bhv_ttc_spinner_update", - "80307fb8" : "mr_blizzard_spawn_white_particles", - "8030803c" : "bhv_mr_blizzard_init", - "80308d6c" : "bhv_mr_blizzard_update", - "80309154" : "bhv_mr_blizzard_snowball", - "803091e0" : "bhv_sliding_plat_2_init", - "80309354" : "bhv_sliding_plat_2_loop", - "80309454" : "bhv_rotating_octagonal_plat_init", - "803094d0" : "bhv_rotating_octagonal_plat_loop", - "803094f8" : "bhv_animates_on_floor_switch_press_init", - "80309530" : "bhv_animates_on_floor_switch_press_loop", - "803097a4" : "bhv_activated_back_and_forth_platform_init", - "803098c0" : "bhv_activated_back_and_forth_platform_update", - "80309b64" : "bhv_recovery_heart_loop", - "80309cec" : "bhv_bubble_cannon_barrel_loop", - "80309ed4" : "water_bomb_cannon_act_0", - "80309f68" : "water_bomb_cannon_act_1", - "8030a0e8" : "water_bomb_cannon_act_2", - "8030a11c" : "bhv_water_bomb_cannon_loop", - "8030a1c0" : "bhv_unagi_init", - "8030a2a8" : "unagi_act_0", - "8030a390" : "unagi_act_1_4", - "8030a514" : "unagi_act_2", - "8030a614" : "unagi_act_3", - "8030a93c" : "bhv_unagi_loop", - "8030aabc" : "bhv_unagi_subobject_loop", - "8030ad04" : "dorrie_raise_head", - "8030ae9c" : "dorrie_act_move", - "8030b0b8" : "dorrie_begin_head_raise", - "8030b0f0" : "dorrie_act_lower_head", - "8030b220" : "dorrie_act_raise_head", - "8030b2f4" : "bhv_dorrie_update", - "8030b658" : "bhv_haunted_chair_init", - "8030b6d8" : "haunted_chair_act_0", - "8030ba68" : "haunted_chair_act_1", - "8030bc90" : "bhv_haunted_chair_loop", - "8030bfd0" : "bhv_mad_piano_update", - "8030c06c" : "flying_bookend_act_0", - "8030c0f0" : "flying_bookend_act_1", - "8030c210" : "flying_bookend_act_2", - "8030c2c8" : "flying_bookend_act_3", - "8030c364" : "bhv_flying_bookend_loop", - "8030c4b0" : "bhv_bookend_spawn_loop", - "8030c564" : "bookshelf_manager_act_0", - "8030c60c" : "bookshelf_manager_act_1", - "8030c6a4" : "bookshelf_manager_act_2", - "8030c828" : "bookshelf_manager_act_3", - "8030c894" : "bookshelf_manager_act_4", - "8030c8ec" : "bhv_haunted_bookshelf_manager_loop", - "8030c98c" : "bhv_book_switch_loop", - "8030cd30" : "obj_spit_fire", - "8030cddc" : "bhv_fire_piranha_plant_init", - "8030d2f0" : "bhv_fire_piranha_plant_update", - "8030d598" : "bhv_fire_spitter_update", - "8030d640" : "bhv_small_piranha_flame_loop", - "8030d8d4" : "bhv_fly_guy_flame_loop", - "8030d93c" : "geo_snufit_move_mask", - "8030d9ac" : "geo_snufit_scale_body", - "8030da14" : "snufit_act_idle", - "8030db38" : "snufit_act_shoot", - "8030dc70" : "bhv_snufit_loop", - "8030dfc4" : "bhv_snufit_balls_loop", - "8030e14c" : "bhv_horizontal_grindel_init", - "8030e16c" : "bhv_horizontal_grindel_update", - "8030ea9c" : "bhv_eyerok_boss_loop", - "8030fff8" : "bhv_eyerok_hand_loop", - "80310498" : "bhv_klepto_init", - "8031126c" : "obj_set_speed_to_zero", - "8031129c" : "bhv_klepto_update", - "80311874" : "bhv_bird_update", - "803118e4" : "bhv_racing_penguin_init", - "80312070" : "bhv_racing_penguin_update", - "80312168" : "bhv_penguin_race_finish_line_update", - "80312200" : "bhv_penguin_race_shortcut_check_update", - "80312248" : "bhv_coffin_spawner_loop", - "80312370" : "coffin_act_idle", - "8031262c" : "coffin_act_stand_up", - "8031274c" : "bhv_coffin_loop", - "80312804" : "clam_act_0", - "80312900" : "clam_act_1", - "80312a54" : "bhv_clam_loop", - "80313110" : "bhv_skeeter_update", - "803131e8" : "bhv_skeeter_wave_update", - "8031326c" : "bhv_swing_platform_init", - "80313294" : "bhv_swing_platform_update", - "80313354" : "bhv_donut_platform_spawner_update", - "80313530" : "bhv_donut_platform_update", - "803136cc" : "bhv_ddd_pole_init", - "80313754" : "bhv_ddd_pole_update", - "803137f4" : "bhv_red_coin_star_marker_init", - "80313fc0" : "bhv_triplet_butterfly_update", - "80314098" : "bubba_act_0", - "8031427c" : "bubba_act_1", - "803145d4" : "bhv_bubba_loop", - "80314a30" : "prepare_reverb_ring_buffer", - "80314cc0" : "get_volume_ramping", - "80314de4" : "synthesis_execute", - "80314f64" : "synthesis_do_one_audio_update", - "80315590" : "synthesis_process_notes", - "80316010" : "load_wave_samples", - "803160dc" : "final_resample", - "80316138" : "process_envelope", - "8031619c" : "process_envelope_inner", - "803166fc" : "note_apply_headset_pan_effects", - "80316ac8" : "note_init_volume", - "80316af4" : "note_set_vel_pan_reverb", - "80316da8" : "note_set_frequency", - "80316db4" : "note_enable", - "80316e00" : "note_disable", - "80316e80" : "reset_bank_and_seq_load_status", - "80316ec4" : "discard_bank", - "80316fb4" : "discard_sequence", - "80317040" : "soundAlloc", - "803170b4" : "sound_alloc_pool_init", - "803170d4" : "persistent_pool_clear", - "803170e8" : "temporary_pool_clear", - "80317118" : "unused_803160F8", - "80317128" : "sound_init_main_pools", - "80317184" : "session_pools_init", - "80317200" : "seq_and_bank_pool_init", - "8031727c" : "persistent_pools_init", - "80317338" : "temporary_pools_init", - "803173fc" : "alloc_bank_or_seq", - "8031782c" : "get_bank_or_seq", - "803178ec" : "decrease_reverb_gain", - "80317914" : "wait_for_audio_frames", - "80317948" : "audio_reset_session", - "80318040" : "audio_dma_copy_immediate", - "803180c4" : "audio_dma_copy_async", - "80318130" : "audio_dma_partial_copy_async", - "803181ec" : "decrease_sample_dma_ttls", - "80318300" : "dma_sample_data", - "80318634" : "init_sample_dma_buffers", - "803188f4" : "patch_audio_bank", - "80318b30" : "bank_load_immediate", - "80318c8c" : "bank_load_async", - "80318dc4" : "sequence_dma_immediate", - "80318e70" : "sequence_dma_async", - "80318fac" : "get_missing_bank", - "803190f4" : "load_banks_immediate", - "80319220" : "preload_sequence", - "80319328" : "load_sequence", - "80319388" : "load_sequence_internal", - "8031950c" : "audio_init", - "80319920" : "note_init", - "80319998" : "note_disable2", - "803199b8" : "process_notes", - "80319db8" : "seq_channel_layer_decay_release_internal", - "80319f64" : "seq_channel_layer_note_decay", - "80319f84" : "seq_channel_layer_note_release", - "80319fa4" : "build_synthetic_wave", - "8031a1d0" : "init_synthetic_wave", - "8031a254" : "init_note_list", - "8031a264" : "init_note_lists", - "8031a2b4" : "init_note_free_list", - "8031a368" : "note_pool_clear", - "8031a494" : "note_pool_fill", - "8031a5d0" : "audio_list_push_front", - "8031a610" : "audio_list_remove", - "8031a63c" : "pop_node_with_value_less_equal", - "8031a6cc" : "note_init_for_layer", - "8031a794" : "func_80319728", - "8031a7c8" : "note_release_and_take_ownership", - "8031a820" : "alloc_note_from_disabled", - "8031a89c" : "alloc_note_from_decaying", - "8031a8f0" : "alloc_note_from_active", - "8031a94c" : "alloc_note", - "8031ac34" : "reclaim_notes", - "8031adac" : "note_init_all", - "8031aee8" : "sequence_player_process_sound", - "8031b0cc" : "get_portamento_freq_scale", - "8031b1c0" : "get_vibrato_pitch_change", - "8031b248" : "get_vibrato_freq_scale", - "8031b440" : "note_vibrato_update", - "8031b4a0" : "note_vibrato_init", - "8031b58c" : "adsr_init", - "8031b5ac" : "adsr_update", - "8031b830" : "sequence_channel_init", - "8031b940" : "seq_channel_set_layer", - "8031ba30" : "seq_channel_layer_disable", - "8031ba6c" : "seq_channel_layer_free", - "8031baf0" : "sequence_channel_disable", - "8031bb5c" : "allocate_sequence_channel", - "8031bba4" : "sequence_player_init_channels", - "8031bcd0" : "sequence_player_disable_channels", - "8031bda0" : "sequence_channel_enable", - "8031be44" : "sequence_player_disable", - "8031bf14" : "audio_list_push_back", - "8031bf54" : "audio_list_pop_back", - "8031bf94" : "init_layer_freelist", - "8031c03c" : "m64_read_u8", - "8031c050" : "m64_read_s16", - "8031c080" : "m64_read_compressed_u16", - "8031c0c4" : "seq_channel_layer_process_script", - "8031c200" : "L8031C200", - "8031c23c" : "L8031C23C", - "8031c298" : "L8031C298", - "8031c2dc" : "L8031C2DC", - "8031c328" : "L8031C328", - "8031c36c" : "L8031C36C", - "8031c3bc" : "L8031C3BC", - "8031c3e8" : "L8031C3E8", - "8031c454" : "L8031C454", - "8031c4a4" : "L8031C4A4", - "8031c5c8" : "L8031C5C8", - "8031c698" : "L8031C698", - "8031c6a0" : "L8031C6A0", - "8031cbe0" : "L8031CBE0", - "8031cbec" : "L8031CBEC", - "8031ce54" : "get_instrument", - "8031cfd4" : "set_instrument", - "8031d068" : "sequence_channel_set_volume", - "8031d08c" : "sequence_channel_process_script", - "8031d144" : "L_U_8031D144", - "8031d1f8" : "L_U_8031D1F8", - "8031d234" : "L_U_8031D234", - "8031d26c" : "L_U_8031D26C", - "8031d2b4" : "L_U_8031D2B4", - "8031d2c4" : "L_U_8031D2C4", - "8031d31c" : "L_U_8031D31C", - "8031d344" : "L_U_8031D344", - "8031d354" : "L_U_8031D354", - "8031d370" : "L_U_8031D370", - "8031d3a8" : "L_U_8031D3A8", - "8031d3c4" : "L_U_8031D3C4", - "8031d3d4" : "L_U_8031D3D4", - "8031d3e4" : "L_U_8031D3E4", - "8031d400" : "L_U_8031D400", - "8031d424" : "L_U_8031D424", - "8031d44c" : "L_U_8031D44C", - "8031d474" : "L_U_8031D474", - "8031d498" : "L_U_8031D498", - "8031d4bc" : "L_U_8031D4BC", - "8031d4d4" : "L_U_8031D4D4", - "8031d4f0" : "L_U_8031D4F0", - "8031d500" : "L_U_8031D500", - "8031d51c" : "L_U_8031D51C", - "8031d538" : "L_U_8031D538", - "8031d56c" : "L_U_8031D56C", - "8031d5a0" : "L_U_8031D5A0", - "8031d5b4" : "L_U_8031D5B4", - "8031d5d4" : "L_U_8031D5D4", - "8031d5e4" : "L_U_8031D5E4", - "8031d640" : "L_U_8031D640", - "8031d678" : "L_U_8031D678", - "8031d6c4" : "L_U_8031D6C4", - "8031d6d4" : "L_U_8031D6D4", - "8031d6f4" : "L_U_8031D6F4", - "8031d718" : "L_U_8031D718", - "8031d728" : "L_U_8031D728", - "8031d73c" : "L_U_8031D73C", - "8031d7b8" : "L_U_8031D7B8", - "8031d7e8" : "L_U_8031D7E8", - "8031d7f8" : "L_U_8031D7F8", - "8031d814" : "L_U_8031D814", - "8031d830" : "L_U_8031D830", - "8031d87c" : "L_U_8031D87C", - "8031d898" : "L_U_8031D898", - "8031d8f8" : "L_U_8031D8F8", - "8031d900" : "L_U_8031D900", - "8031d930" : "L_U_8031D930", - "8031d94c" : "L_U_8031D94C", - "8031d974" : "L_U_8031D974", - "8031d9ec" : "sequence_player_process_sequence", - "8031e240" : "process_sequences", - "8031e2e8" : "init_sequence_player", - "8031e374" : "init_sequence_players", - "8031e4f0" : "unused_8031E4F0", - "8031e568" : "unused_8031E568", - "8031e578" : "sequence_player_fade_out_internal", - "8031e5c0" : "func_8031D690", - "8031e60c" : "func_8031D6E4", - "8031e6a4" : "func_8031D7B0", - "8031e710" : "func_8031D838", - "8031e7b8" : "create_next_audio_frame_task", - "8031eb00" : "play_sound", - "8031eb30" : "process_sound_request", - "8031edec" : "process_all_sound_requests", - "8031ee70" : "func_8031DFE8", - "8031ef6c" : "func_8031E0E4", - "8031eff4" : "func_8031E16C", - "8031f810" : "get_sound_pan", - "8031f96c" : "get_sound_dynamics", - "8031fb20" : "get_sound_freq_scale", - "8031fbe8" : "get_sound_reverb", - "8031fd84" : "audio_signal_game_loop_tick", - "8031fdac" : "update_game_sound", - "80320544" : "play_sequence", - "80320678" : "sequence_player_fade_out", - "803206bc" : "fade_volume_scale", - "80320734" : "fade_channel_volume_scale", - "8032080c" : "func_8031F96C", - "803208ec" : "process_level_music_dynamics", - "80320a4c" : "L8031FBAC", - "80320a8c" : "L8031FBEC", - "80320acc" : "L8031FC2C", - "80320b0c" : "L8031FC6C", - "80320b4c" : "L8031FCAC", - "80320b8c" : "L8031FCEC", - "80320bcc" : "L8031FD2C", - "80320bf4" : "L8031FD54", - "80320d70" : "unused_8031FED0", - "80320e3c" : "func_8031FFB4", - "80320ec4" : "sequence_player_unlower", - "80320f68" : "func_803200E4", - "803210d4" : "set_sound_disabled", - "8032112c" : "sound_init", - "80321398" : "get_currently_playing_sound", - "80321474" : "func_803205E8", - "80321584" : "func_803206F8", - "8032171c" : "func_80320890", - "8032174c" : "sound_banks_disable", - "803217a8" : "disable_all_sequence_players", - "8032180c" : "sound_banks_enable", - "80321864" : "unused_803209D8", - "803218d8" : "func_80320A4C", - "803218f4" : "play_dialog_sound", - "803219ac" : "play_music", - "80321bac" : "stop_background_music", - "80321ce4" : "fadeout_background_music", - "80321d38" : "drop_queued_background_music", - "80321d5c" : "get_current_background_music", - "80321d9c" : "func_80320ED8", - "80321e48" : "play_secondary_music", - "80321f48" : "func_80321080", - "80321f9c" : "func_803210D4", - "80322078" : "play_course_clear", - "803220b4" : "play_peachs_jingle", - "803220f0" : "play_puzzle_jingle", - "8032212c" : "play_star_fanfare", - "80322168" : "play_power_star_jingle", - "803221b8" : "play_race_fanfare", - "803221f4" : "play_toads_jingle", - "80322230" : "sound_reset", - "8032231c" : "audio_set_sound_mode", - "80322348" : "unused_80321460", - "8032235c" : "unused_80321474", - "803223b0" : "osSetTime", - "803223e0" : "osMapTLB", - "803224a0" : "osUnmapTLBAll", - "803224f0" : "sprintf", - "8032255c" : "proutSprintf", - "803225a0" : "osCreateMesgQueue", - "803225d0" : "osSetEventMesg", - "80322640" : "osViSetEvent", - "803226b0" : "osCreateThread", - "80322800" : "osRecvMesg", - "80322940" : "_VirtualToPhysicalTask", - "80322a5c" : "osSpTaskLoad", - "80322bbc" : "osSpTaskStartGo", - "80322c00" : "osSpTaskYield", - "80322c20" : "osSendMesg", - "80322d70" : "osSpTaskYielded", - "80322df0" : "osStartThread", - "80322f40" : "osWritebackDCacheAll", - "80322f70" : "osCreateViManager", - "803230f4" : "viMgrMain", - "803232d0" : "osViSetMode", - "80323340" : "osViBlack", - "803233b0" : "osViSetSpecialFeatures", - "80323570" : "osCreatePiManager", - "803236f0" : "osSetThreadPri", - "803237d0" : "osInitialize", - "80323a00" : "osViSwapBuffer", - "80323a50" : "sqrtf", - "80323a60" : "osContStartReadData", - "80323b24" : "osContGetReadData", - "80323bcc" : "__osPackReadData", - "80323cc0" : "osContInit", - "80323ebc" : "__osContGetInitData", - "80323f8c" : "__osPackRequestData", - "80324080" : "osEepromProbe", - "803240f0" : "__ull_rshift", - "8032411c" : "__ull_rem", - "80324158" : "__ull_div", - "80324194" : "__ll_lshift", - "803241c0" : "__ll_rem", - "803241fc" : "__ll_div", - "80324258" : "__ll_mul", - "80324288" : "__ull_divremi", - "803242e8" : "__ll_mod", - "80324384" : "__ll_rshift", - "803243b0" : "osInvalDCache", - "80324460" : "osPiStartDma", - "80324570" : "bzero", - "80324610" : "osInvalICache", - "80324690" : "osEepromLongRead", - "803247d0" : "osEepromLongWrite", - "80324910" : "bcopy", - "80324c20" : "guOrthoF", - "80324d74" : "guOrtho", - "80324de0" : "guPerspectiveF", - "80325010" : "guPerspective", - "80325070" : "osGetTime", - "80325100" : "__d_to_ll", - "8032511c" : "__f_to_ll", - "80325138" : "__d_to_ull", - "803251d8" : "__f_to_ull", - "80325274" : "__ll_to_d", - "8032528c" : "__ll_to_f", - "803252a4" : "__ull_to_d", - "803252d8" : "__ull_to_f", - "80325310" : "cosf", - "80325480" : "sinf", - "80325640" : "guTranslateF", - "80325688" : "guTranslate", - "803256e0" : "guRotateF", - "80325874" : "guRotate", - "803258d0" : "guScaleF", - "80325924" : "guScale", - "80325970" : "osAiSetFrequency", - "80325bd4" : "alBnkfNew", - "80325cd8" : "alSeqFileNew", - "80325d20" : "osWritebackDCache", - "80325da0" : "osAiGetLength", - "80325db0" : "osAiSetNextBuffer", - "80325e60" : "__osTimerServicesInit", - "80325eec" : "__osTimerInterrupt", - "80326064" : "__osSetTimerIntr", - "803260d8" : "__osInsertTimer", - "80326260" : "_Printf", - "803273f0" : "memcpy", - "8032741c" : "strlen", - "80327444" : "strchr", - "80327490" : "__osDequeueThread", - "803274d0" : "__osDisableInt", - "803274f0" : "__osRestoreInt", - "80327510" : "__osViInit", - "80327640" : "__osExceptionPreamble", - "80327650" : "__osException", - "803278e4" : "L80326964", - "80327904" : "L80326984", - "80327938" : "L803269B8", - "80327a68" : "L80326AE8", - "80327ac4" : "L80326B44", - "80327ae4" : "L80326B64", - "80327b1c" : "L80326B9C", - "80327b68" : "L80326BE8", - "80327b98" : "send_mesg", - "80327c80" : "__osEnqueueAndYield", - "80327d10" : "__osEnqueueThread", - "80327d58" : "__osPopThread", - "80327d68" : "__osDispatchThread", - "80327ea8" : "__osCleanupThread", - "80327eb0" : "osVirtualToPhysical", - "80327f30" : "__osSpSetStatus", - "80327f40" : "__osSpSetPc", - "80327f80" : "__osSpRawStartDma", - "80328010" : "__osSpDeviceBusy", - "80328040" : "__osSpGetStatus", - "80328050" : "osGetThreadPri", - "80328070" : "__osViGetCurrentContext", - "80328080" : "__osViSwapContext", - "803283e0" : "osGetCount", - "803283f0" : "__osPiCreateAccessQueue", - "80328440" : "__osPiGetAccess", - "80328484" : "__osPiRelAccess", - "803284b0" : "osPiRawStartDma", - "80328590" : "__osDevMgrMain", - "80328710" : "__osSetSR", - "80328720" : "__osGetSR", - "80328730" : "__osSetFpcCsr", - "80328740" : "__osSiRawReadIo", - "80328790" : "__osSiRawWriteIo", - "803287e0" : "osMapTLBRdb", - "80328840" : "osPiRawReadIo", - "803288a0" : "__osSiCreateAccessQueue", - "803288f0" : "__osSiGetAccess", - "80328934" : "__osSiRelAccess", - "80328960" : "__osSiRawStartDma", - "80328a10" : "osSetTimer", - "80328af0" : "osEepromWrite", - "80328ca0" : "__osPackEepWriteData", - "80328dac" : "__osEepStatus", - "80328fd0" : "osJamMesg", - "80329120" : "osPiGetCmdQueue", - "80329150" : "osEepromRead", - "80329340" : "__osPackEepReadData", - "80329450" : "guMtxF2L", - "80329550" : "guMtxIdentF", - "803295d8" : "guMtxIdent", - "80329608" : "guMtxL2F", - "803296c0" : "guNormalize", - "80329750" : "__osAiDeviceBusy", - "80329780" : "__osSetCompare", - "80329790" : "_Litob", - "80329a90" : "_Ldtob", - "8032a860" : "u32_to_string", - "8032a890" : "string_to_u32", - "8032a8e8" : "send_packet", - "8032a9a8" : "send", - "8032aa80" : "process_command_memory", - "8032aacc" : "process_command_register", - "8032aaf8" : "kdebugserver", - "8032ace0" : "__osSyncPutChars", - "8032ae10" : "osSetIntMask", - "8032ae70" : "osDestroyThread", - "8032af70" : "__osProbeTLB", - "8032b030" : "__osSiDeviceBusy", - "8032b060" : "lldiv", - "8032b160" : "ldiv", - "8032b1f0" : "__osGetCause", - "8032b200" : "__osAtomicDec", - "8032b260" : "rspF3DBootStart", - "8032b330" : "rspF3DBootEnd", - "8032b330" : "rspF3DStart", - "8032c738" : "rspF3DEnd", - "8032c740" : "rspAspMainStart", - "8032d560" : "rspAspMainEnd", - "8032d560" : "gVblankHandler1", - "8032d564" : "gVblankHandler2", - "8032d568" : "gActiveSPTask", - "8032d56c" : "sCurrentAudioSPTask", - "8032d570" : "sCurrentDisplaySPTask", - "8032d574" : "sNextAudioSPTask", - "8032d578" : "sNextDisplaySPTask", - "8032d57c" : "sAudioEnabled", - "8032d580" : "sNumVblanks", - "8032d584" : "gResetTimer", - "8032d588" : "D_8032C648", - "8032d58c" : "gDebugLevelSelect", - "8032d590" : "D_8032C650", - "8032d594" : "gShowProfiler", - "8032d598" : "gShowDebugText", - "8032d5d0" : "unused8032C690", - "8032d5d4" : "gGlobalTimer", - "8032d5dc" : "frameBufferIndex", - "8032d5e0" : "D_8032C6A0", - "8032d5e4" : "gPlayer1Controller", - "8032d5e8" : "gPlayer2Controller", - "8032d5ec" : "gPlayer3Controller", - "8032d5f0" : "gCurrDemoInput", - "8032d5f4" : "gDemoInputListID", - "8032d5f8" : "gRecordedDemoInput", - "8032d6d0" : "credits01", - "8032d6d8" : "credits02", - "8032d6e4" : "credits03", - "8032d6f0" : "credits04", - "8032d700" : "credits05", - "8032d710" : "credits06", - "8032d71c" : "credits07", - "8032d728" : "credits08", - "8032d738" : "credits09", - "8032d740" : "credits10", - "8032d750" : "credits11", - "8032d75c" : "credits12", - "8032d764" : "credits13", - "8032d774" : "credits14", - "8032d77c" : "credits15", - "8032d788" : "credits16", - "8032d79c" : "credits17", - "8032d7ac" : "credits18", - "8032d7bc" : "credits19", - "8032d7c4" : "credits20", - "8032d7cc" : "sCreditsSequence", - "8032d93c" : "gMarioState", - "8032d940" : "unused1", - "8032d944" : "D_8032C9E0", - "8032daa0" : "sTerrainSounds", - "8032dacc" : "sSquishScaleOverTime", - "8032dae0" : "sCapFlickerFrames", - "8032daf8" : "gWaterSurfacePseudoFloor", - "8032dc50" : "sJumpLandAction", - "8032dc68" : "sFreefallLandAction", - "8032dc80" : "sSideFlipLandAction", - "8032dc98" : "sHoldJumpLandAction", - "8032dcb0" : "sHoldFreefallLandAction", - "8032dcc8" : "sLongJumpLandAction", - "8032dce0" : "sDoubleJumpLandAction", - "8032dcf8" : "sTripleJumpLandAction", - "8032dd10" : "sBackflipLandAction", - "8032dd40" : "sPunchingForwardVelocities", - "8032dd80" : "gLastCompletedCourseNum", - "8032dd84" : "gLastCompletedStarNum", - "8032dd88" : "sUnusedGotGlobalCoinHiScore", - "8032dd8c" : "gGotFileCoinHiScore", - "8032dd90" : "gCurrCourseStarFlags", - "8032dd94" : "gSpecialTripleJump", - "8032dd98" : "gLevelToCourseNumTable", - "8032ddc0" : "gMarioSpawnInfo", - "8032ddc4" : "gLoadedGraphNodes", - "8032ddc8" : "gAreas", - "8032ddcc" : "gCurrentArea", - "8032ddd0" : "gCurrCreditsEntry", - "8032ddd4" : "D_8032CE74", - "8032ddd8" : "D_8032CE78", - "8032dddc" : "gWarpTransDelay", - "8032dde0" : "gFBSetColor", - "8032dde4" : "gWarpTransFBSetColor", - "8032dde8" : "gWarpTransRed", - "8032ddec" : "gWarpTransGreen", - "8032ddf0" : "gWarpTransBlue", - "8032ddf4" : "gCurrSaveFileNum", - "8032ddf8" : "gCurrLevelNum", - "8032ddfc" : "sWarpBhvSpawnTable", - "8032de4c" : "sSpawnTypeFromWarpBhv", - "8032de60" : "D_8032CF00", - "8032de70" : "renderModeTable_1Cycle", - "8032deb0" : "renderModeTable_2Cycle", - "8032def0" : "gCurGraphNodeRoot", - "8032def4" : "gCurGraphNodeMasterList", - "8032def8" : "gCurGraphNodeCamFrustum", - "8032defc" : "gCurGraphNodeCamera", - "8032df00" : "gCurGraphNodeObject", - "8032df04" : "gCurGraphNodeHeldObject", - "8032df08" : "gAreaUpdateCounter", - "8032df10" : "gProfilerMode", - "8032df14" : "gCurrentFrameIndex1", - "8032df18" : "gCurrentFrameIndex2", - "8032df20" : "unused8032CFC0", - "8032df24" : "gCutsceneFocus", - "8032df28" : "unused8032CFC8", - "8032df2c" : "unused8032CFCC", - "8032df30" : "gSecondCameraFocus", - "8032df34" : "sYawSpeed", - "8032df38" : "gCurrLevelArea", - "8032df3c" : "gPrevLevel", - "8032df40" : "unused8032CFE0", - "8032df44" : "unused8032CFE4", - "8032df48" : "unused8032CFE8", - "8032df4c" : "gCameraZoomDist", - "8032df50" : "sObjectCutscene", - "8032df54" : "gRecentCutscene", - "8032df58" : "sFramesSinceCutsceneEnded", - "8032df5c" : "sCutsceneDialogResponse", - "8032df60" : "sMarioCamState", - "8032df64" : "sLuigiCamState", - "8032df68" : "unused8032D008", - "8032df6c" : "sFixedModeBasePosition", - "8032df78" : "sUnusedModeBasePosition_2", - "8032df84" : "sUnusedModeBasePosition_3", - "8032df90" : "sUnusedModeBasePosition_4", - "8032df9c" : "sUnusedModeBasePosition_5", - "8032dfa8" : "sModeTransitions", - "8032e008" : "unused8032D0A8", - "8032e010" : "unused8032D0B0", - "8032e018" : "sDanceCutsceneTable", - "8032e024" : "unusedDanceInfo1", - "8032e038" : "unusedDanceType", - "8032e03c" : "unusedDanceInfo2", - "8032e050" : "sBBHLibraryParTrackPath", - "8032e098" : "sCamSL", - "8032e0e0" : "sCamTHI", - "8032e128" : "sCamHMC", - "8032e1d0" : "sCamSSL", - "8032e248" : "sCamRR", - "8032e2f0" : "sCamBOB", - "8032e338" : "sCamCotMC", - "8032e368" : "sCamCCM", - "8032e3b0" : "sCamCastle", - "8032e6f8" : "sCamBBH", - "8032ecb0" : "sCameraTriggers", - "8032ed50" : "sIntroStartToPipePosition", - "8032ee08" : "sIntroStartToPipeFocus", - "8032eec0" : "sIntroPipeToDialogPosition", - "8032ef30" : "sIntroPipeToDialogFocus", - "8032efa0" : "sEndingFlyToWindowPos", - "8032eff0" : "sEndingFlyToWindowFocus", - "8032f048" : "sEndingPeachDescentCamPos", - "8032f0e8" : "sEndingMarioToPeachPos", - "8032f130" : "sEndingMarioToPeachFocus", - "8032f178" : "sEndingLookUpAtCastle", - "8032f1b8" : "sEndingLookAtSkyFocus", - "8032f214" : "gIntroLakituStartToPipeFocus", - "8032f32c" : "gIntroLakituStartToPipeOffsetFromCamera", - "8032f444" : "gEndWavingPos", - "8032f48c" : "gEndWavingFocus", - "8032f4d4" : "sCutsceneEnding", - "8032f534" : "sCutsceneGrandStar", - "8032f544" : "sCutsceneUnused", - "8032f554" : "sCutsceneDoorWarp", - "8032f564" : "sCutsceneEndWaving", - "8032f56c" : "sCutsceneCredits", - "8032f574" : "sCutsceneDoorPull", - "8032f59c" : "sCutsceneDoorPush", - "8032f5c4" : "sCutsceneDoorPullMode", - "8032f5dc" : "sCutsceneDoorPushMode", - "8032f5f4" : "sCutsceneEnterCannon", - "8032f60c" : "sCutsceneStarSpawn", - "8032f624" : "sCutsceneRedCoinStarSpawn", - "8032f634" : "sCutsceneEnterPainting", - "8032f63c" : "sCutsceneDeathExit", - "8032f64c" : "sCutsceneExitPaintingSuccess", - "8032f65c" : "sCutsceneUnusedExit", - "8032f674" : "sCutsceneIntroPeach", - "8032f69c" : "sCutscenePrepareCannon", - "8032f6ac" : "sCutsceneExitWaterfall", - "8032f6bc" : "sCutsceneFallToCastleGrounds", - "8032f6cc" : "sCutsceneEnterPyramidTop", - "8032f6dc" : "sCutscenePyramidTopExplode", - "8032f6f4" : "sCutsceneStandingDeath", - "8032f6fc" : "sCutsceneEnterPool", - "8032f70c" : "sCutsceneDeathStomach", - "8032f714" : "sCutsceneDeathOnBack", - "8032f71c" : "sCutsceneQuicksandDeath", - "8032f724" : "sCutsceneWaterDeath", - "8032f72c" : "sCutsceneSuffocation", - "8032f734" : "sCutsceneEnterBowserArena", - "8032f74c" : "sCutsceneDanceDefaultRotate", - "8032f754" : "sCutsceneDanceFlyAway", - "8032f75c" : "sCutsceneDanceCloseup", - "8032f764" : "sCutsceneKeyDance", - "8032f76c" : "sCutsceneCapSwitchPress", - "8032f774" : "sCutsceneSlidingDoorsOpen", - "8032f784" : "sCutsceneUnlockKeyDoor", - "8032f794" : "sCutsceneExitBowserSuccess", - "8032f7a4" : "sCutsceneExitBowserDeath", - "8032f7b4" : "sCutsceneExitSpecialSuccess", - "8032f7c4" : "sCutsceneNonPaintingDeath", - "8032f7d4" : "sCutsceneDialog", - "8032f7ec" : "sCutsceneReadMessage", - "8032f804" : "sDanceCutsceneIndexTable", - "8032f870" : "sZoomOutAreaMasks", - "8032f884" : "sBobCreditsSplinePositions", - "8032f8ac" : "sBobCreditsSplineFocus", - "8032f8d4" : "sWfCreditsSplinePositions", - "8032f8fc" : "sWfCreditsSplineFocus", - "8032f924" : "sJrbCreditsSplinePositions", - "8032f94c" : "sJrbCreditsSplineFocus", - "8032f974" : "sCcmSlideCreditsSplinePositions", - "8032f99c" : "sCcmSlideCreditsSplineFocus", - "8032f9c4" : "sBbhCreditsSplinePositions", - "8032f9e4" : "sBbhCreditsSplineFocus", - "8032fa04" : "sHmcCreditsSplinePositions", - "8032fa2c" : "sHmcCreditsSplineFocus", - "8032fa54" : "sThiWigglerCreditsSplinePositions", - "8032fa6c" : "sThiWigglerCreditsSplineFocus", - "8032fa84" : "sVolcanoCreditsSplinePositions", - "8032fab4" : "sVolcanoCreditsSplineFocus", - "8032fae4" : "sSslCreditsSplinePositions", - "8032fb14" : "sSslCreditsSplineFocus", - "8032fb44" : "sDddCreditsSplinePositions", - "8032fb7c" : "sDddCreditsSplineFocus", - "8032fbb4" : "sSlCreditsSplinePositions", - "8032fbd4" : "sSlCreditsSplineFocus", - "8032fbf4" : "sWdwCreditsSplinePositions", - "8032fc14" : "sWdwCreditsSplineFocus", - "8032fc34" : "sTtmCreditsSplinePositions", - "8032fc64" : "sTtmCreditsSplineFocus", - "8032fc94" : "sThiHugeCreditsSplinePositions", - "8032fccc" : "sThiHugeCreditsSplineFocus", - "8032fd04" : "sTtcCreditsSplinePositions", - "8032fd24" : "sTtcCreditsSplineFocus", - "8032fd44" : "sRrCreditsSplinePositions", - "8032fd64" : "sRrCreditsSplineFocus", - "8032fd84" : "sSaCreditsSplinePositions", - "8032fdac" : "sSaCreditsSplineFocus", - "8032fdd4" : "sCotmcCreditsSplinePositions", - "8032fdfc" : "sCotmcCreditsSplineFocus", - "8032fe24" : "sDddSubCreditsSplinePositions", - "8032fe4c" : "sDddSubCreditsSplineFocus", - "8032fe74" : "sCcmOutsideCreditsSplinePositions", - "8032fe94" : "sCcmOutsideCreditsSplineFocus", - "8032fec0" : "sObjectListUpdateOrder", - "8032fecc" : "sParticleTypes", - "80330000" : "D_8032F0A0", - "80330004" : "D_8032F0A4", - "80330020" : "D_8032F0C0", - "8033002c" : "D_8032F0CC", - "8033006c" : "sMrIParticleActions", - "80330074" : "sMrIActions", - "80330084" : "sMrIHitbox", - "80330094" : "D_8032F134", - "803300a8" : "unused8032F134", - "803300ac" : "sCapSwitchActions", - "803300bc" : "sKingBobombActions", - "803300e0" : "sKingBobombSoundStates", - "80330140" : "sOpenedCannonActions", - "8033015c" : "unused0EA1FC", - "80330198" : "sChuckyaActions", - "803301a8" : "sWFRotatingPlatformData", - "803301c0" : "sKoopaShellUnderwaterHitbox", - "803301d0" : "D_8032F270", - "803301e4" : "sSparkleSpawnStarHitbox", - "803301f4" : "sYellowCoinHitbox", - "80330204" : "D_8032F2A4", - "80330224" : "sCoinInsideBooActions", - "8033022c" : "D_8032F2CC", - "80330244" : "D_8032F2E4", - "80330260" : "D_8032F300", - "80330288" : "D_8032F328", - "80330290" : "D_8032F330", - "80330298" : "sGrindelThwompActions", - "803302ac" : "sTumblingBridgeParams", - "803302dc" : "sTumblingBridgeActions", - "803302ec" : "D_8032F38C", - "80330318" : "sElevatorActions", - "8033032c" : "D_8032F3CC", - "80330340" : "D_8032F3E0", - "80330354" : "D_8032F3F4", - "8033035c" : "D_8032F3FC", - "80330370" : "sUkikiCageActions", - "80330380" : "D_8032F420", - "80330390" : "sSpindriftHitbox", - "803303a0" : "sMetalBoxHitbox", - "803303b0" : "sBreakableBoxHitbox", - "803303c0" : "D_8032F460", - "803303e8" : "sHeaveHoActions", - "803303f8" : "sJumpingBoxHitbox", - "80330408" : "sJumpingBoxActions", - "8033042c" : "sBowserKeyHitbox", - "8033043c" : "sBulletBillActions", - "80330450" : "sBowserTailAnchorActions", - "8033045c" : "D_8032F4FC", - "8033046c" : "D_8032F50C", - "80330470" : "D_8032F510", - "80330474" : "D_8032F514", - "80330478" : "sBowserDefeatedDialogText", - "80330480" : "D_8032F520", - "803304c8" : "sBowserActions", - "80330518" : "D_8032F5B8", - "803305f0" : "D_8032F690", - "803305f4" : "D_8032F694", - "803305f8" : "D_8032F698", - "8033067c" : "sFallingBowserPlatformActions", - "80330688" : "sGrowingBowserFlameHitbox", - "80330698" : "sBowserFlameHitbox", - "803306a8" : "D_8032F748", - "803306b4" : "D_8032F754", - "803306dc" : "sCageUkikiPath", - "80330738" : "sUkikiSoundStates", - "803307a0" : "sUkikiActions", - "803307c0" : "D_8032F860", - "803307f4" : "D_8032F894", - "80330828" : "D_8032F8C8", - "80330830" : "sRotatingCwFireBarsActions", - "80330840" : "sKoopaShellHitbox", - "80330850" : "D_8032F8F0", - "80330884" : "D_8032F924", - "803308a8" : "D_8032F948", - "803308cc" : "D_8032F96C", - "803308d8" : "sToxBoxActions", - "80330900" : "TablePiranhaPlantActions", - "80330b1c" : "sBowserPuzzlePieceActions", - "80330b38" : "sTuxiesMotherActions", - "80330b44" : "sSmallPenguinActions", - "80330b5c" : "sFishActions", - "80330b68" : "sFishGroupActions", - "80330b74" : "sBirdChirpChirpActions", - "80330b84" : "sCheepCheepActions", - "80330b90" : "sExclamationBoxHitbox", - "80330ba0" : "sExclamationBoxContents", - "80330c20" : "sExclamationBoxActions", - "80330c38" : "sSkullSlidingBoxHitbox", - "80330c48" : "gOpenableGrills", - "80330c58" : "sTweesterHitbox", - "80330c68" : "sTweesterActions", - "80330cd4" : "sScuttlebugHitbox", - "80330ce4" : "sWhompActions", - "80330d0c" : "sWaterSplashDropletParams", - "80330d30" : "gShallowWaterSplashDropletParams", - "80330d54" : "sWaterDropletFishParams", - "80330d78" : "gShallowWaterWaveDropletParams", - "80330d9c" : "sStrongWindParticleHitbox", - "80330dac" : "sSLWalkingPenguinErraticSteps", - "80330e20" : "D_8032FEC0", - "80330e24" : "unused_8032FEC4", - "80330e34" : "gMarioPlatform", - "80330e40" : "sDebugEffectStringInfo", - "80330e64" : "sDebugEnemyStringInfo", - "80330e88" : "sDebugInfoDPadMask", - "80330e8c" : "sDebugInfoDPadUpdID", - "80330e90" : "sDebugLvSelectCheckFlag", - "80330e94" : "sDebugPage", - "80330e98" : "sNoExtraDebug", - "80330e9c" : "sDebugStringArrPrinted", - "80330ea0" : "sDebugSysCursor", - "80330ea4" : "sDebugInfoButtonSeqID", - "80330ea8" : "sDebugInfoButtonSeq", - "80330ec0" : "sTransitionColorFadeCount", - "80330ec4" : "sTransitionTextureFadeCount", - "80330ec8" : "sTextureTransitionID", - "80330ee0" : "rectangles", - "80330f00" : "sSkyboxTextures", - "80330f28" : "sSkyboxColors", - "80330f30" : "gMovtexCounter", - "80330f34" : "gMovtexCounterPrev", - "80330f38" : "gMovtexVtxColor", - "80330f3c" : "gPaintingMarioYEntry", - "80330f40" : "gWdwWaterLevelSet", - "80330f44" : "gMovtexIdToTexture", - "80330f64" : "gMovtexNonColored", - "803311a4" : "gMovtexColored", - "8033127c" : "gMovtexColored2", - "80331300" : "sHmcPaintings", - "80331308" : "sInsideCastlePaintings", - "80331344" : "sTtmPaintings", - "8033134c" : "sPaintingGroups", - "80331358" : "gPaintingUpdateCounter", - "8033135c" : "gLastPaintingUpdateCounter", - "80331360" : "sTextLabelsCount", - "80331370" : "gDialogCharWidths", - "80331470" : "gDialogBoxState", - "80331474" : "gDialogBoxOpenTimer", - "80331478" : "gDialogBoxScale", - "8033147c" : "gDialogScrollOffsetY", - "80331480" : "gDialogBoxType", - "80331484" : "gDialogID", - "80331488" : "gLastDialogPageStrPos", - "8033148c" : "gDialogTextPos", - "80331490" : "gDialogLineNum", - "80331494" : "gLastDialogResponse", - "80331498" : "gMenuHoldKeyIndex", - "8033149c" : "gMenuHoldKeyTimer", - "803314a0" : "gDialogResponse", - "803314b0" : "gHudSymCoin", - "803314b4" : "gHudSymX", - "803314f8" : "gMenuMode", - "803314fc" : "gEndCutsceneStrEn0", - "80331504" : "gEndCutsceneStrEn1", - "80331538" : "gEndCutsceneStrEn2", - "80331558" : "gEndCutsceneStrEn3", - "8033156c" : "gEndCutsceneStrEn4", - "80331598" : "gEndCutsceneStrEn5", - "803315ac" : "gEndCutsceneStrEn6", - "803315cc" : "gEndCutsceneStrEn7", - "803315dc" : "gEndCutsceneStrEn8", - "803315e4" : "gEndCutsceneStringsEn", - "8033160c" : "gCutsceneMsgFade", - "80331610" : "gCutsceneMsgIndex", - "80331614" : "gCutsceneMsgDuration", - "80331618" : "gCutsceneMsgTimer", - "8033161c" : "gDialogCameraAngleIndex", - "80331620" : "gDialogCourseActNum", - "803316c8" : "gCourseCompleteCoinsEqual", - "803316cc" : "gCourseDoneMenuTimer", - "803316d0" : "gCourseCompleteCoins", - "803316d4" : "gHudFlash", - "80331750" : "gEnvFxMode", - "80331754" : "D_80330644", - "80331758" : "gSnowTempVtx", - "80331788" : "gSnowFlakeVertex1", - "80331790" : "gSnowFlakeVertex2", - "80331798" : "gSnowFlakeVertex3", - "803317a0" : "D_80330690", - "803317a4" : "D_80330694", - "803317a8" : "gBubbleTempVtx", - "803317e0" : "MacroObjectPresets", - "803325fc" : "sPowerMeterVisibleTimer", - "80332614" : "sPrevCheckMarioRoom", - "80332618" : "sYoshiDead", - "8033261c" : "sDebugSequenceTracker", - "80332620" : "sDebugTimer", - "803327a8" : "sBreakableBoxSmallHitbox", - "80332b00" : "sMrBlizzardHitbox", - "80332b24" : "sMrBlizzardSnowballHitbox", - "80332b34" : "D_80331A24", - "80332b54" : "D_80331A44", - "80332b5c" : "D_80331A4C", - "80332b64" : "D_80331A54", - "80332bdc" : "D_80331ACC", - "80332bf0" : "sRecoveryHeartHitbox", - "80332c00" : "sUnagiHitbox", - "80332c10" : "sHauntedChairHitbox", - "80332c30" : "sFlyingBookendHitbox", - "80332c40" : "D_80331B30", - "80332c4c" : "sBookSwitchHitbox", - "80332c5c" : "sFirePiranhaPlantHitbox", - "80332c6c" : "D_80331B5C", - "80332c74" : "sPiranhaPlantFireHitbox", - "80332c84" : "sSnufitHitbox", - "80332c94" : "sSnufitBulletHitbox", - "80332ca4" : "sEyerokHitbox", - "80332cb4" : "D_80331BA4", - "80332d10" : "coffinRelativePos", - "80332d28" : "sClamShellHitbox", - "80332d38" : "sSkeeterHitbox", - "80332d48" : "D_80331C38", - "80332e50" : "gAudioErrorFlags", - "80332e54" : "sGameLoopTicked", - "80332e58" : "sDialogSpeaker", - "80332f04" : "sDialogSpeakerVoice", - "80332f40" : "sNumProcessedSoundRequests", - "80332f44" : "sSoundRequestCount", - "80332f48" : "sDynBbh", - "80332f54" : "sDynDdd", - "80332f6c" : "sDynJrb", - "80332f88" : "sDynWdw", - "80332f98" : "sDynHmc", - "80332fa8" : "sDynUnk38", - "80332fb8" : "sDynNone", - "80332fbc" : "sCurrentMusicDynamic", - "80332fc0" : "sBackgroundMusicForDynamics", - "80332fc4" : "sLevelDynamics", - "80333060" : "sMusicDynamics", - "803330c0" : "gAreaEchoLevel", - "80333138" : "D_80332028", - "80333188" : "sBackgroundMusicDefaultVolume", - "803331ac" : "sPlayer0CurSeqId", - "803331b0" : "sMusicDynamicDelay", - "803331b4" : "D_803320A4", - "803331c0" : "D_803320B0", - "803331cc" : "D_803320BC", - "803331d8" : "sMaxChannelsForSoundBank", - "803331e4" : "sNumSoundsPerBank", - "803331f0" : "gDefaultSoundArgs", - "803331fc" : "sUnusedSoundArgs", - "80333208" : "sSoundBankDisabled", - "80333218" : "D_80332108", - "8033321c" : "sHasStartedFadeOut", - "80333220" : "D_80332110", - "80333224" : "sUnused80332114", - "80333228" : "sUnused80332118", - "8033322c" : "D_8033211C", - "80333230" : "D_80332120", - "80333234" : "D_80332124", - "80333238" : "sBackgroundMusicQueueSize", - "8033323c" : "sUnused8033323C", - "803332a0" : "gAudioSessionPresets", - "80333498" : "gAudioCosineTable", - "80333598" : "gPitchBendFrequencyScale", - "80333994" : "gNoteFrequencies", - "80333b94" : "gDefaultShortNoteVelocityTable", - "80333ba4" : "gDefaultShortNoteDurationTable", - "80333bb4" : "gVibratoCurve", - "80333bc4" : "gDefaultEnvelope", - "80333bd0" : "sSineWave", - "80333c50" : "sSquareWave", - "80333cd0" : "sTriangleWave", - "80333d50" : "sSawtoothWave", - "80333dd0" : "gWaveSamples", - "80333de0" : "gHeadsetPanQuantization", - "80333df4" : "gHeadsetPanVolume", - "80333ff4" : "gStereoPanVolume", - "803341f4" : "gDefaultPanVolume", - "803343f4" : "gVolRampingLhs136", - "803345f4" : "gVolRampingRhs136", - "803347f4" : "gVolRampingLhs144", - "803349f4" : "gVolRampingRhs144", - "80334bf4" : "gVolRampingLhs128", - "80334df4" : "gVolRampingRhs128", - "80334ff4" : "gTatumsPerBeat", - "80334ff8" : "gUnusedCount80333EE8", - "80334ffc" : "gAudioHeapSize", - "80335000" : "D_80333EF0", - "80335004" : "gAudioLoadLock", - "80335008" : "sUnused8033EF8", - "80335010" : "osViModeTable", - "803358f0" : "piMgrArgs", - "80335910" : "osClockRate", - "80335918" : "D_80334808", - "80335920" : "_osContInitialized", - "80335930" : "D_80334820", - "80335940" : "D_80334830", - "80335950" : "_spaces", - "80335974" : "_zeroes", - "803359a0" : "D_80334890", - "803359a4" : "D_80334894", - "803359a8" : "D_80334898", - "803359ac" : "D_8033489C", - "803359b0" : "D_803348A0", - "803359b4" : "D_803348A4", - "803359c0" : "D_803348B0", - "80335a20" : "D_80334910", - "80335a24" : "D_80334914", - "80335a28" : "D_80334918", - "80335a2c" : "D_8033491C", - "80335a30" : "D_80334920", - "80335a44" : "D_80334934", - "80335a48" : "D_80334938", - "80335a50" : "gOsPiAccessQueueCreated", - "80335a60" : "gOsSiAccessQueueCreated", - "80335aa0" : "D_80334990", - "80335af0" : "D_803349E0", - "80335b40" : "D_80334A30", - "80335b44" : "D_80334A34", - "80335b48" : "D_80334A38", - "80335b50" : "D_80334A40", - "80335b54" : "D_80334A44", - "80338e60" : "jtbl_80337C90", - "80338e84" : "jtbl_80337CB4", - "80338eac" : "jtbl_80337CDC", - "80338ec0" : "jtbl_80337D08", - "80338fbc" : "jtbl_80337E04", - "8033978c" : "jtbl_80338418", - "80339880" : "length_str", - "80339884" : "flags_str", - "8033988c" : "flags_arr", - "80339980" : "D_80338610", - "803399a0" : "jtbl_80338630", - "803399d0" : "NAN", - "803399e0" : "D_80338670", - "80339a40" : "D_803386D0", - "80339ac0" : "rspF3DDataStart", - "8033a2c0" : "rspF3DDataEnd", - "8033a2c0" : "rspAspMainDataStart", - "8033a580" : "rspAspMainDataEnd", - "8033a580" : "_mainSegmentEnd", - "008c0c40" : "_mainSegmentRomEnd", - "8033a580" : "_mainSegmentNoloadStart", - "8033a580" : "D_80339210", - "8033a730" : "gIdleThread", - "8033a8e0" : "gMainThread", - "8033aa90" : "gGameLoopThread", - "8033ac40" : "gSoundThread", - "8033adf0" : "gPIMesgQueue", - "8033ae08" : "gIntrMesgQueue", - "8033ae20" : "gSPTaskMesgQueue", - "8033ae38" : "gDmaMesgBuf", - "8033ae40" : "gPIMesgBuf", - "8033aec0" : "gSIEventMesgBuf", - "8033aec8" : "gIntrMesgBuf", - "8033af08" : "gUnknownMesgBuf", - "8033af48" : "gDmaIoMesg", - "8033af5c" : "D_80339BEC", - "8033af60" : "gDmaMesgQueue", - "8033af78" : "gSIEventMesgQueue", - "8033af90" : "gControllers", - "8033afe8" : "gControllerStatuses", - "8033aff8" : "gControllerPads", - "8033b010" : "gGameVblankQueue", - "8033b028" : "D_80339CB8", - "8033b040" : "D_80339CD0", - "8033b044" : "D_80339CD4", - "8033b048" : "gGameVblankHandler", - "8033b050" : "gPhysicalFrameBuffers", - "8033b05c" : "gPhysicalZBuffer", - "8033b060" : "D_80339CF0", - "8033b064" : "D_80339CF4", - "8033b068" : "gGfxSPTask", - "8033b06c" : "gDisplayListHead", - "8033b070" : "gGfxPoolEnd", - "8033b074" : "gGfxPool", - "8033b078" : "gControllerBits", - "8033b079" : "gEepromProbe", - "8033b080" : "D_80339D10", - "8033b090" : "gDemo", - "8033b0a0" : "filler80339D30", - "8033b170" : "gMarioStates", - "8033b238" : "sCurrPlayMode", - "8033b23a" : "D_80339ECA", - "8033b23c" : "sTransitionTimer", - "8033b240" : "sTransitionUpdate", - "8033b244" : "unused3", - "8033b248" : "sWarpDest", - "8033b250" : "D_80339EE0", - "8033b252" : "sDelayedWarpOp", - "8033b254" : "sDelayedWarpTimer", - "8033b256" : "sSourceWarpNodeId", - "8033b258" : "sDelayedWarpArg", - "8033b25c" : "unused4", - "8033b25e" : "sTimerRunning", - "8033b260" : "gHudDisplay", - "8033b26e" : "gShouldNotPlayCastleMusic", - "8033b270" : "sDelayInvincTimer", - "8033b272" : "sInvulnerable", - "8033b280" : "unused80339F10", - "8033b288" : "filler80339F1C", - "8033b2c0" : "D_80339F50", - "8033b350" : "gMirrorMario", - "8033b3b0" : "gBodyStates", - "8033b400" : "sSegmentTable", - "8033b480" : "sPoolFreeSpace", - "8033b484" : "sPoolStart", - "8033b488" : "sPoolEnd", - "8033b48c" : "sPoolListHeadL", - "8033b490" : "sPoolListHeadR", - "8033b494" : "gEffectsMemoryPool", - "8033b4a0" : "gWarpCheckpoint", - "8033b4a5" : "gMainMenuDataModified", - "8033b4a6" : "gSaveFileModified", - "8033b4b0" : "gPlayerSpawnInfos", - "8033b4d0" : "D_8033A160", - "8033b8d0" : "gAreaData", - "8033bab0" : "gWarpTransition", - "8033bac6" : "gCurrCourseNum", - "8033bac8" : "gCurrActNum", - "8033baca" : "gCurrAreaIndex", - "8033bacc" : "gSavedCourseNum", - "8033bace" : "gPauseScreenMode", - "8033bad0" : "gSaveOptSelectIndex", - "8033bae0" : "gMatStackIndex", - "8033bae8" : "gMatStack", - "8033c2e8" : "gMatStackFixed", - "8033c368" : "gGeoTempState", - "8033c378" : "gCurAnimType", - "8033c379" : "gCurAnimEnabled", - "8033c37a" : "gCurrAnimFrame", - "8033c37c" : "gCurAnimTranslationMultiplier", - "8033c380" : "gCurrAnimAttribute", - "8033c384" : "gCurAnimData", - "8033c388" : "gDisplayListHeap", - "8033c390" : "gProfilerFrameData", - "8033c520" : "gPlayerCameraState", - "8033c568" : "sOldPosition", - "8033c578" : "sOldFocus", - "8033c588" : "sPlayer2FocusOffset", - "8033c594" : "sCreditsPlayer2Pitch", - "8033c596" : "sCreditsPlayer2Yaw", - "8033c598" : "sFramesPaused", - "8033c5a0" : "sFOVState", - "8033c5c0" : "sModeTransition", - "8033c5e8" : "sMarioGeometry", - "8033c61c" : "unusedFreeRoamWallYaw", - "8033c61e" : "sAvoidYawVel", - "8033c620" : "sCameraYawAfterDoorCutscene", - "8033c622" : "unusedSplinePitch", - "8033c624" : "unusedSplineYaw", - "8033c628" : "sHandheldShakeSpline", - "8033c668" : "sHandheldShakeMag", - "8033c66c" : "sHandheldShakeTimer", - "8033c670" : "sHandheldShakeInc", - "8033c674" : "sHandheldShakePitch", - "8033c676" : "sHandheldShakeYaw", - "8033c678" : "sHandheldShakeRoll", - "8033c67c" : "unused8033B30C", - "8033c680" : "unused8033B310", - "8033c684" : "sSelectionFlags", - "8033c686" : "unused8033B316", - "8033c688" : "s2ndRotateFlags", - "8033c68a" : "unused8033B31A", - "8033c68c" : "sCameraSoundFlags", - "8033c68e" : "sCButtonsPressed", - "8033c690" : "sCutsceneDialogID", - "8033c698" : "gLakituState", - "8033c758" : "unused8033B3E8", - "8033c75a" : "sAreaYaw", - "8033c75c" : "sAreaYawChange", - "8033c75e" : "sLakituDist", - "8033c760" : "sLakituPitch", - "8033c764" : "sZoomAmount", - "8033c768" : "sCSideButtonYaw", - "8033c76a" : "sBehindMarioSoundTimer", - "8033c76c" : "sZeroZoomDist", - "8033c770" : "sCUpCameraPitch", - "8033c772" : "sModeOffsetYaw", - "8033c774" : "sSpiralStairsYawOffset", - "8033c776" : "s8DirModeBaseYaw", - "8033c778" : "s8DirModeYawOffset", - "8033c77c" : "sPanDistance", - "8033c780" : "sCannonYOffset", - "8033c788" : "sModeInfo", - "8033c7d0" : "sCastleEntranceOffset", - "8033c7dc" : "sParTrackIndex", - "8033c7e0" : "sParTrackPath", - "8033c7e8" : "sParTrackTransOff", - "8033c808" : "sCameraStoreCUp", - "8033c828" : "sCameraStoreCutscene", - "8033c848" : "gCameraMovementFlags", - "8033c84a" : "sStatusFlags", - "8033c850" : "sCurCreditsSplinePos", - "8033c950" : "sCurCreditsSplineFocus", - "8033ca50" : "sCutsceneSplineSegment", - "8033ca54" : "sCutsceneSplineSegmentProgress", - "8033ca58" : "unused8033B6E8", - "8033ca5a" : "sCutsceneShot", - "8033ca5c" : "gCutsceneTimer", - "8033ca60" : "sCutsceneVars", - "8033cbc8" : "gObjCutsceneDone", - "8033cbcc" : "gCutsceneObjSpawn", - "8033cbd0" : "gCamera", - "8033cbe0" : "gObjectListArray", - "8033d260" : "gDebugInfoFlags", - "8033d264" : "gNumFindFloorMisses", - "8033d268" : "unused_8033BEF8", - "8033d26c" : "gUnknownWallCount", - "8033d270" : "gObjectCounter", - "8033d274" : "gNumCalls", - "8033d280" : "gDebugInfo", - "8033d380" : "gDebugInfoOverwrite", - "8033d480" : "gTimeStopState", - "8033d488" : "gObjectPool", - "80360e88" : "gMacroObjectDefaultParent", - "803610e8" : "gObjectLists", - "803610f0" : "gFreeObjectList", - "80361158" : "gMarioObject", - "8036115c" : "gLuigiObject", - "80361160" : "gCurrentObject", - "80361164" : "gCurBhvCommand", - "80361168" : "gPrevFrameObjectCount", - "8036116c" : "gSurfaceNodesAllocated", - "80361170" : "gSurfacesAllocated", - "80361174" : "gNumStaticSurfaceNodes", - "80361178" : "gNumStaticSurfaces", - "8036117c" : "gObjectMemoryPool", - "80361180" : "gCheckingSurfaceCollisionsForCamera", - "80361182" : "gFindFloorIncludeSurfaceIntangible", - "80361184" : "gEnvironmentRegions", - "80361188" : "gEnvironmentLevels", - "803611d8" : "gDoorAdjacentRooms", - "80361250" : "gMarioCurrentRoom", - "80361252" : "D_8035FEE2", - "80361254" : "D_8035FEE4", - "80361256" : "gTHIWaterDrained", - "80361258" : "gTTCSpeedSetting", - "8036125a" : "gMarioShotFromCannon", - "8036125c" : "gCCMEnteredSlide", - "8036125e" : "gNumRoomedObjectsInMarioRoom", - "80361260" : "gNumRoomedObjectsNotInMarioRoom", - "80361262" : "gWDWWaterLevelChanging", - "80361264" : "gMarioOnMerryGoRound", - "80361280" : "D_8035FF10", - "80361290" : "gDebugPrintState1", - "803612a0" : "gDebugPrintState2", - "803612b0" : "sMarioOnFlyingCarpet", - "803612b2" : "sSurfaceTypeBelowShadow", - "803612b4" : "gShadowAboveWaterOrLava", - "803612b5" : "gMarioOnIceOrCarpet", - "803612c0" : "sSkyBoxInfo", - "803612e0" : "gMovetexLastTextureId", - "803612f0" : "gFlyingCarpetState", - "80361300" : "gPaintingMarioFloorType", - "80361304" : "gPaintingMarioXPos", - "80361308" : "gPaintingMarioYPos", - "8036130c" : "gPaintingMarioZPos", - "80361310" : "gPaintingMesh", - "80361314" : "gPaintingTriNorms", - "80361318" : "gRipplingPainting", - "8036131c" : "gDddPaintingStatus", - "80361320" : "sTextLabels", - "803613f0" : "gDialogColorFadeTimer", - "803613f2" : "gLastDialogLineNum", - "803613f4" : "gDialogVariable", - "803613f8" : "gDialogTextAlpha", - "803613fa" : "gCutsceneMsgXOffset", - "803613fc" : "gCutsceneMsgYOffset", - "803613fe" : "gRedCoinsCollected", - "80361400" : "gEnvFxBuffer", - "80361408" : "gSnowCylinderLastPos", - "80361414" : "gSnowParticleCount", - "80361416" : "gSnowParticleMaxCount", - "80361420" : "gEnvFxBubbleConfig", - "80361460" : "sNumActiveFirePiranhaPlants", - "80361464" : "sNumKilledFirePiranhaPlants", - "80361468" : "sObjSavedPosX", - "8036146c" : "sObjSavedPosY", - "80361470" : "sObjSavedPosZ", - "80361474" : "sMontyMoleHoleList", - "80361478" : "sMontyMoleKillStreak", - "8036147c" : "sMontyMoleLastKilledPosX", - "80361480" : "sMontyMoleLastKilledPosY", - "80361484" : "sMontyMoleLastKilledPosZ", - "80361488" : "sMasterTreadmill", - "80361490" : "gCurrAiBuffer", - "80361498" : "sSoundRequests", - "80361c98" : "D_80360928", - "80361f98" : "sUsedChannelsForSoundBank", - "80361fa8" : "sCurrentSound", - "80361fb8" : "gSoundBanks", - "80364b78" : "D_80363808", - "80364b82" : "D_80363812", - "80364b88" : "sBackgroundMusicQueue", - "80364ba0" : "D_80363830", - "80364c20" : "D_803638B0", - "80365e70" : "piMgrThread", - "80366020" : "piMgrStack", - "80367020" : "__osPiMesgQueue", - "80367038" : "piMgrMesgBuff", - "80367040" : "D_80365CD0", - "80367050" : "_osContCmdBuf", - "8036708c" : "_osContPifCtrl", - "80367090" : "_osLastSentSiCmd", - "80367091" : "_osContNumControllers", - "80367098" : "D_80365D28", - "803670b8" : "_osContMesgQueue", - "803670d0" : "_osContMesgBuff", - "803670f0" : "D_80365D80", - "80367110" : "_osCurrentTime", - "80367118" : "D_80365DA8", - "8036711c" : "__osViIntrCount", - "80367120" : "D_80365DB0", - "80367130" : "osPiMesgBuff", - "80367138" : "gOsPiMessageQueue", - "80367150" : "osSiMesgBuff", - "80367158" : "gOsSiMessageQueue", - "80367170" : "D_80365E00", - "803671ac" : "D_80365E3C", - "803671b0" : "D_80365E40", - "803672b0" : "gInterruptedThread", - "80367460" : ".", - "80367460" : "_mainSegmentNoloadEnd", - "0000cee0" : "_mainSegmentNoloadSizeLo", - "00000002" : "_mainSegmentNoloadSizeHi", - "00000001" : "ASSERT", - "80378800" : "_engineSegmentStart", - "007cc6c0" : "_engineSegmentRomStart", - "80378800" : "vec3f_copy", - "80378840" : "vec3f_set", - "8037888c" : "vec3f_add", - "803788e4" : "vec3f_sum", - "8037893c" : "vec3s_copy", - "8037897c" : "vec3s_set", - "803789c8" : "vec3s_add", - "80378a20" : "vec3s_sum", - "80378a78" : "vec3s_sub", - "80378ad0" : "vec3s_to_vec3f", - "80378b34" : "vec3f_to_vec3s", - "80378c50" : "find_vector_perpendicular_to_plane", - "80378d38" : "vec3f_cross", - "80378dc0" : "vec3f_normalize", - "80378e68" : "mtxf_copy", - "80378eb4" : "mtxf_identity", - "80378f24" : "mtxf_translate", - "80378f84" : "mtxf_lookat", - "80379440" : "mtxf_rotate_zxy_and_translate", - "803795f0" : "mtxf_rotate_xyz_and_translate", - "80379798" : "mtxf_billboard", - "80379918" : "mtxf_align_terrain_normal", - "80379aa4" : "mtxf_align_terrain_triangle", - "80379f60" : "mtxf_mul", - "8037a29c" : "mtxf_scale_vec3f", - "8037a348" : "mtxf_mul_vec3s", - "8037a434" : "mtxf_to_mtx", - "8037a4b8" : "mtxf_rotate_xy", - "8037a550" : "get_pos_from_transform_mtx", - "8037a69c" : "vec3f_get_dist_and_angle", - "8037a788" : "vec3f_set_dist_and_angle", - "8037a860" : "approach_s32", - "8037a8b4" : "approach_f32", - "8037a9a8" : "atan2s", - "8037ab88" : "atan2f", - "8037abec" : "spline_get_weights", - "8037afb8" : "anim_spline_init", - "8037afe8" : "anim_spline_poll", - "8037b220" : "init_scene_graph_node_links", - "8037b24c" : "init_graph_node_root", - "8037b30c" : "init_graph_node_ortho_projection", - "8037b380" : "init_graph_node_perspective", - "8037b448" : "init_graph_node_start", - "8037b4ac" : "init_graph_node_master_list", - "8037b530" : "init_graph_node_render_range", - "8037b5b4" : "init_graph_node_switch_case", - "8037b670" : "init_graph_node_camera", - "8037b744" : "init_graph_node_translation_rotation", - "8037b7f8" : "init_graph_node_translation", - "8037b89c" : "init_graph_node_rotation", - "8037b940" : "init_graph_node_scale", - "8037b9e0" : "init_graph_node_object", - "8037bad4" : "init_graph_node_culling_radius", - "8037bb48" : "init_graph_node_animated_part", - "8037bbec" : "init_graph_node_billboard", - "8037bc90" : "init_graph_node_display_list", - "8037bd24" : "init_graph_node_shadow", - "8037bdb4" : "init_graph_node_object_parent", - "8037be28" : "init_graph_node_generated", - "8037becc" : "init_graph_node_background", - "8037bf84" : "init_graph_node_held_object", - "8037c044" : "geo_add_child", - "8037c0bc" : "geo_remove_child", - "8037c138" : "geo_make_first_child", - "8037c1e4" : "geo_call_global_function_nodes_helper", - "8037c360" : "geo_call_global_function_nodes", - "8037c3d0" : "geo_reset_object_node", - "8037c448" : "geo_obj_init", - "8037c51c" : "geo_obj_init_spawninfo", - "8037c658" : "geo_obj_init_animation", - "8037c708" : "geo_obj_init_animation_accel", - "8037c7d8" : "retrieve_animation_index", - "8037c844" : "geo_update_animation_frame", - "8037c9e8" : "geo_retreive_animation_translation", - "8037cb10" : "geo_find_root", - "8037cb60" : "read_vec3s_to_vec3f", - "8037cbc0" : "read_vec3s", - "8037cbfc" : "read_vec3s_angle", - "8037cc74" : "register_scene_graph_node", - "8037cd60" : "geo_layout_cmd_branch_and_link", - "8037ce24" : "geo_layout_cmd_end", - "8037cee8" : "geo_layout_cmd_branch", - "8037cf70" : "geo_layout_cmd_return", - "8037cfc0" : "geo_layout_cmd_open_node", - "8037d018" : "geo_layout_cmd_close_node", - "8037d050" : "geo_layout_cmd_assign_as_view", - "8037d0d0" : "geo_layout_cmd_update_node_flags", - "8037d1d0" : "geo_layout_cmd_node_root", - "8037d328" : "geo_layout_cmd_node_ortho_projection", - "8037d3a4" : "geo_layout_cmd_node_perspective", - "8037d48c" : "geo_layout_cmd_node_start", - "8037d4dc" : "geo_layout_cmd_nop3", - "8037d500" : "geo_layout_cmd_node_master_list", - "8037d55c" : "geo_layout_cmd_node_level_of_detail", - "8037d5d4" : "geo_layout_cmd_node_switch_case", - "8037d640" : "geo_layout_cmd_node_camera", - "8037d6f0" : "geo_layout_cmd_node_translation_rotation", - "8037d8d4" : "geo_layout_cmd_node_translation", - "8037d998" : "geo_layout_cmd_node_rotation", - "8037da5c" : "geo_layout_cmd_node_scale", - "8037db50" : "geo_layout_cmd_nop2", - "8037db74" : "geo_layout_cmd_node_animated_part", - "8037dc10" : "geo_layout_cmd_node_billboard", - "8037dcd4" : "geo_layout_cmd_node_display_list", - "8037dd4c" : "geo_layout_cmd_node_shadow", - "8037dddc" : "geo_layout_cmd_node_object_parent", - "8037de34" : "geo_layout_cmd_node_generated", - "8037de94" : "geo_layout_cmd_node_background", - "8037def8" : "geo_layout_cmd_nop", - "8037df1c" : "geo_layout_cmd_copy_view", - "8037dfd4" : "geo_layout_cmd_node_held_obj", - "8037e058" : "geo_layout_cmd_node_culling_radius", - "8037e0b4" : "process_geo_layout", - "803805c8" : "level_script_execute", - "80380de8" : "f32_find_wall_collision", - "80380e8c" : "find_wall_collisions", - "80381264" : "find_ceil", - "80381470" : "unused_obj_find_floor_height", - "803814b8" : "find_floor_height_and_data", - "80381794" : "find_floor_height", - "803817e0" : "unused_find_dynamic_floor", - "80381900" : "find_floor", - "80381ba0" : "find_water_level", - "80381d3c" : "find_poison_gas_level", - "80381f08" : "debug_surface_list_info", - "80382294" : "unused_resolve_floor_or_ceil_collisions", - "80383340" : "alloc_surface_pools", - "803833b8" : "load_area_terrain", - "803835a4" : "clear_dynamic_surfaces", - "80383614" : "transform_object_vertices", - "80383828" : "load_object_surfaces", - "803839cc" : "load_object_collision_model", - "80383bb0" : "random_u16", - "80383cb4" : "random_float", - "80383d1c" : "random_sign", - "80383d68" : "obj_update_gfx_pos_and_angle", - "80385bf0" : "stub_behavior_script_2", - "80385c00" : "cur_obj_update", - "80385f90" : "identityMtx", - "80385fb0" : "zeroMtx", - "80385fd0" : "gVec3fZero", - "80385fdc" : "gVec3sZero", - "80385fe4" : "gVec3fOne", - "80385ff0" : "gVec3sOne", - "80386000" : "gSineTable", - "80387000" : "gCosineTable", - "8038b000" : "gArctanTable", - "8038b810" : "GeoLayoutJumpTable", - "8038b894" : "unused_8038B894", - "8038bc90" : "_engineSegmentEnd", - "007dfb50" : "_engineSegmentRomEnd", - "8038bc90" : "_engineSegmentNoloadStart", - "8038bc90" : "gSplineKeyframe", - "8038bc94" : "gSplineKeyframeFraction", - "8038bc98" : "gSplineState", - "8038bca0" : "gGraphNodePool", - "8038bca4" : "gCurRootGraphNode", - "8038bca8" : "D_8038BCA8", - "8038bcac" : "gGeoViews", - "8038bcb0" : "gGeoNumViews", - "8038bcb8" : "gGeoLayoutStack", - "8038bcf8" : "gCurGraphNodeList", - "8038bd78" : "gCurGraphNodeIndex", - "8038bd7a" : "gGeoLayoutStackIndex", - "8038bd7c" : "D_8038BD7C", - "8038bd7e" : "gGeoLayoutReturnIndex", - "8038bd80" : "gGeoLayoutCommand", - "8038bd88" : "gObjParentGraphNode", - "8038be30" : "sFloorGeo", - "8038be90" : "unused8038BE90", - "8038be98" : "gStaticSurfacePartition", - "8038d698" : "gDynamicSurfacePartition", - "8038ee98" : "sSurfaceNodePool", - "8038ee9c" : "sSurfacePool", - "8038eea0" : "sSurfacePoolSize", - "8038eea8" : "unused8038EEA8", - "8038eef0" : "_engineSegmentNoloadEnd", - "00000001" : "ASSERT", - "8038f800" : ".", - "8038f800" : "_framebuffersSegmentNoloadStart", - "8038f800" : "0x70800", - "8038f800" : "gFrameBuffer0", - "803b5000" : "gFrameBuffer1", - "803da800" : "gFrameBuffer2", - "80400000" : "_framebuffersSegmentNoloadEnd", - "80400000" : "__expansionRamStart", - "00000001" : "ASSERT", - "10000000" : "_entrySegmentStart", - "007cc6c0" : "_entrySegmentRomStart", - "10000000" : "level_script_entry", - "10000030" : "_entrySegmentEnd", - "007cc6f0" : "_entrySegmentRomEnd", - "02000000" : "_segment2_mio0SegmentStart", - "007cc6c0" : "_segment2_mio0SegmentRomStart", - "0200bd10" : ".", - "0200bd10" : "_segment2_mio0SegmentEnd", - "007d83d0" : "_segment2_mio0SegmentRomEnd", - "04000000" : "_group0_mio0SegmentStart", - "007cc6c0" : "_group0_mio0SegmentRomStart", - "04013260" : ".", - "04013260" : "_group0_mio0SegmentEnd", - "007df920" : "_group0_mio0SegmentRomEnd", - "17000000" : "_group0_geoSegmentStart", - "007cc6c0" : "_group0_geoSegmentRomStart", - "17000000" : "bubble_geo", - "1700001c" : "purple_marble_geo", - "17000038" : "smoke_geo", - "17000084" : "burn_smoke_geo", - "1700009c" : "small_water_splash_geo", - "170000e0" : "mario_TODO_geo_0000E0", - "17000124" : "idle_water_wave_geo", - "17000168" : "wave_trail_geo", - "170001bc" : "sparkles_geo", - "17000230" : "water_splash_geo", - "17000284" : "sparkles_animation_geo", - "170002e0" : "mario_geo_face_and_wings", - "1700041c" : "mario_geo_left_hand", - "17000494" : "mario_geo_right_hand", - "1700053c" : "mario_geo_body", - "170006f8" : "mario_geo_medium_poly_left_hand", - "17000770" : "mario_geo_medium_poly_right_hand", - "17000818" : "mario_geo_medium_poly_body", - "170009d4" : "mario_geo_low_poly_face_and_wings", - "17000b10" : "mario_geo_low_poly_left_hand", - "17000b88" : "mario_geo_low_poly_right_hand", - "17000c30" : "mario_geo_low_poly_body", - "17000dec" : "mario_vanish_geo_face_and_wings", - "17000f28" : "mario_vanish_geo_left_hand", - "17000fa0" : "mario_vanish_geo_right_hand", - "17001048" : "mario_vanish_geo_body", - "17001204" : "mario_vanish_geo_medium_poly_left_hand", - "1700127c" : "mario_vanish_geo_medium_poly_right_hand", - "17001324" : "mario_vanish_geo_medium_poly_body", - "170014e0" : "mario_vanish_geo_low_poly_face_and_wings", - "1700161c" : "mario_vanish_geo_low_poly_left_hand", - "17001694" : "mario_vanish_geo_low_poly_right_hand", - "1700173c" : "mario_vanish_geo_low_poly_body", - "170018f8" : "mario_metal_geo_face_and_wings", - "170019a4" : "mario_metal_geo_left_hand", - "17001a1c" : "mario_metal_geo_right_hand", - "17001ac4" : "mario_metal_geo_body", - "17001c80" : "mario_metal_geo_medium_poly_left_hand", - "17001cf8" : "mario_metal_geo_medium_poly_right_hand", - "17001da0" : "mario_metal_geo_medium_poly_body", - "17001f5c" : "mario_metal_geo_low_poly_face_and_wings", - "17002008" : "mario_metal_geo_low_poly_left_hand", - "17002080" : "mario_metal_geo_low_poly_right_hand", - "17002128" : "mario_metal_geo_low_poly_body", - "170022e4" : "mario_metal_vanish_geo_face_and_wings", - "17002390" : "mario_metal_vanish_geo_left_hand", - "17002408" : "mario_metal_vanish_geo_right_hand", - "170024b0" : "mario_metal_vanish_geo_body", - "1700266c" : "mario_metal_vanish_geo_medium_poly_left_hand", - "170026e4" : "mario_metal_vanish_geo_medium_poly_right_hand", - "1700278c" : "mario_metal_vanish_geo_medium_poly_body", - "17002958" : "mario_metal_vanish_geo_low_poly_face_and_wings", - "17002a04" : "mario_metal_vanish_geo_low_poly_left_hand", - "17002a7c" : "mario_metal_vanish_geo_low_poly_right_hand", - "17002b24" : "mario_metal_vanish_geo_low_poly_body", - "17002ce0" : "mario_geo_load_body", - "17002d14" : "mario_geo_load_medium_poly_body", - "17002d48" : "mario_geo_load_low_poly_body", - "17002d7c" : "mario_geo_render_body", - "17002dd4" : "mario_geo", - "17002e30" : "_group0_geoSegmentEnd", - "007cf4f0" : "_group0_geoSegmentRomEnd", - "05000000" : "_group1_mio0SegmentStart", - "007cc6c0" : "_group1_mio0SegmentRomStart", - "05008070" : ".", - "05008070" : "_group1_mio0SegmentEnd", - "007d4730" : "_group1_mio0SegmentRomEnd", - "0c000000" : "_group1_geoSegmentStart", - "007cc6c0" : "_group1_geoSegmentRomStart", - "0c000000" : "yellow_sphere_geo", - "0c000018" : "hoot_geo", - "0c0001e4" : "yoshi_egg_geo", - "0c000248" : "thwomp_geo", - "0c000264" : "bullet_bill_geo", - "0c00028c" : "heave_ho_geo", - "0c000410" : "_group1_geoSegmentEnd", - "007ccad0" : "_group1_geoSegmentRomEnd", - "05000000" : "_group2_mio0SegmentStart", - "007cc6c0" : "_group2_mio0SegmentRomStart", - "05001e10" : ".", - "05001e10" : "_group2_mio0SegmentEnd", - "007ce4d0" : "_group2_mio0SegmentRomEnd", - "0c000000" : "_group2_geoSegmentStart", - "007cc6c0" : "_group2_geoSegmentRomStart", - "0c000000" : "bully_geo", - "0c000120" : "bully_boss_geo", - "0c000240" : "blargg_geo", - "0c0002b0" : "_group2_geoSegmentEnd", - "007cc970" : "_group2_geoSegmentRomEnd", - "05000000" : "_group3_mio0SegmentStart", - "007cc6c0" : "_group3_mio0SegmentRomStart", - "050068b0" : ".", - "050068b0" : "_group3_mio0SegmentEnd", - "007d2f70" : "_group3_mio0SegmentRomEnd", - "0c000000" : "_group3_geoSegmentStart", - "007cc6c0" : "_group3_geoSegmentRomStart", - "0c000000" : "king_bobomb_geo", - "0c000308" : "water_bomb_geo", - "0c000328" : "water_bomb_shadow_geo", - "0c000340" : "_group3_geoSegmentEnd", - "007cca00" : "_group3_geoSegmentRomEnd", - "05000000" : "_group4_mio0SegmentStart", - "007cc6c0" : "_group4_mio0SegmentRomStart", - "0500a300" : ".", - "0500a300" : "_group4_mio0SegmentEnd", - "007d69c0" : "_group4_mio0SegmentRomEnd", - "0c000000" : "_group4_geoSegmentStart", - "007cc6c0" : "_group4_geoSegmentRomStart", - "0c000000" : "clam_shell_geo", - "0c000068" : "sushi_geo", - "0c00010c" : "unagi_geo", - "0c000280" : "_group4_geoSegmentEnd", - "007cc940" : "_group4_geoSegmentRomEnd", - "05000000" : "_group5_mio0SegmentStart", - "007cc6c0" : "_group5_mio0SegmentRomStart", - "0500bce0" : ".", - "0500bce0" : "_group5_mio0SegmentEnd", - "007d83a0" : "_group5_mio0SegmentRomEnd", - "0c000000" : "_group5_geoSegmentStart", - "007cc6c0" : "_group5_geoSegmentRomStart", - "0c000000" : "klepto_geo", - "0c0002ac" : "eyerok_geo_0002AC", - "0c0005a8" : "eyerok_left_hand_geo", - "0c0005e4" : "eyerok_right_hand_geo", - "0c000610" : "pokey_head_geo", - "0c000644" : "pokey_body_part_geo", - "0c000660" : "_group5_geoSegmentEnd", - "007ccd20" : "_group5_geoSegmentRomEnd", - "05000000" : "_group6_mio0SegmentStart", - "007cc6c0" : "_group6_mio0SegmentRomStart", - "0500e110" : ".", - "0500e110" : "_group6_mio0SegmentEnd", - "007da7d0" : "_group6_mio0SegmentRomEnd", - "0c000000" : "_group6_geoSegmentStart", - "007cc6c0" : "_group6_geoSegmentRomStart", - "0c000000" : "monty_mole_geo", - "0c000110" : "ukiki_geo", - "0c00036c" : "fwoosh_geo", - "0c000390" : "_group6_geoSegmentEnd", - "007cca50" : "_group6_geoSegmentRomEnd", - "05000000" : "_group7_mio0SegmentStart", - "007cc6c0" : "_group7_mio0SegmentRomStart", - "05005070" : ".", - "05005070" : "_group7_mio0SegmentEnd", - "007d1730" : "_group7_mio0SegmentRomEnd", - "0c000000" : "_group7_geoSegmentStart", - "007cc6c0" : "_group7_geoSegmentRomStart", - "0c000000" : "spindrift_geo", - "0c000104" : "penguin_geo", - "0c00021c" : "mr_blizzard_hidden_geo", - "0c000348" : "mr_blizzard_geo", - "0c000370" : "_group7_geoSegmentEnd", - "007cca30" : "_group7_geoSegmentRomEnd", - "05000000" : "_group8_mio0SegmentStart", - "007cc6c0" : "_group8_mio0SegmentRomStart", - "05001180" : ".", - "05001180" : "_group8_mio0SegmentEnd", - "007cd840" : "_group8_mio0SegmentRomEnd", - "0c000000" : "_group8_geoSegmentStart", - "007cc6c0" : "_group8_geoSegmentRomStart", - "0c000000" : "springboard_top_geo", - "0c000018" : "springboard_spring_geo", - "0c000030" : "springboard_bottom_geo", - "0c000048" : "cap_switch_geo", - "0c000090" : "_group8_geoSegmentEnd", - "007cc750" : "_group8_geoSegmentRomEnd", - "05000000" : "_group9_mio0SegmentStart", - "007cc6c0" : "_group9_mio0SegmentRomStart", - "05006960" : ".", - "05006960" : "_group9_mio0SegmentEnd", - "007d3020" : "_group9_mio0SegmentRomEnd", - "0c000000" : "_group9_geoSegmentStart", - "007cc6c0" : "_group9_geoSegmentRomStart", - "0c000000" : "bookend_part_geo", - "0c0000c0" : "bookend_geo", - "0c0000d8" : "haunted_chair_geo", - "0c000188" : "small_key_geo", - "0c0001b4" : "mad_piano_geo", - "0c000224" : "boo_geo", - "0c000274" : "haunted_cage_geo", - "0c0002b0" : "_group9_geoSegmentEnd", - "007cc970" : "_group9_geoSegmentRomEnd", - "05000000" : "_group10_mio0SegmentStart", - "007cc6c0" : "_group10_mio0SegmentRomStart", - "05012cd0" : ".", - "05012cd0" : "_group10_mio0SegmentEnd", - "007df390" : "_group10_mio0SegmentRomEnd", - "0c000000" : "_group10_geoSegmentStart", - "007cc6c0" : "_group10_geoSegmentRomStart", - "0c000000" : "birds_geo", - "0c000098" : "peach_geo_000098", - "0c000254" : "peach_geo_000254", - "0c000410" : "peach_geo", - "0c000468" : "yoshi_geo", - "0c000670" : "_group10_geoSegmentEnd", - "007ccd30" : "_group10_geoSegmentRomEnd", - "05000000" : "_group11_mio0SegmentStart", - "007cc6c0" : "_group11_mio0SegmentRomStart", - "050073f0" : ".", - "050073f0" : "_group11_mio0SegmentEnd", - "007d3ab0" : "_group11_mio0SegmentRomEnd", - "0c000000" : "_group11_geoSegmentStart", - "007cc6c0" : "_group11_geoSegmentRomStart", - "0c000000" : "bubba_geo", - "0c000030" : "wiggler_head_geo", - "0c0001bc" : "enemy_lakitu_geo", - "0c000290" : "spiny_ball_geo", - "0c000328" : "spiny_geo", - "0c0004a0" : "_group11_geoSegmentEnd", - "007ccb60" : "_group11_geoSegmentRomEnd", - "06000000" : "_group12_mio0SegmentStart", - "007cc6c0" : "_group12_mio0SegmentRomStart", - "06030c30" : ".", - "06030c30" : "_group12_mio0SegmentEnd", - "007fd2f0" : "_group12_mio0SegmentRomEnd", - "0d000000" : "_group12_geoSegmentStart", - "007cc6c0" : "_group12_geoSegmentRomStart", - "0d000000" : "bowser_flames_geo", - "0d000090" : "invisible_bowser_accessory_geo", - "0d0000b0" : "bowser_1_yellow_sphere_geo", - "0d0000d8" : "bowser_geo_0000D8", - "0d000424" : "bowser_geo_000424", - "0d000770" : "bowser_geo_000770", - "0d000ab8" : "bowser_shadow_geo", - "0d000ac4" : "bowser_geo", - "0d000b40" : "bowser2_geo", - "0d000bbc" : "bowser_bomb_geo", - "0d000bfc" : "bowser_impact_smoke_geo", - "0d000c50" : "_group12_geoSegmentEnd", - "007cd310" : "_group12_geoSegmentRomEnd", - "06000000" : "_group13_mio0SegmentStart", - "007cc6c0" : "_group13_mio0SegmentRomStart", - "0600a0f0" : ".", - "0600a0f0" : "_group13_mio0SegmentEnd", - "007d67b0" : "_group13_mio0SegmentRomEnd", - "0d000000" : "_group13_geoSegmentStart", - "007cc6c0" : "_group13_geoSegmentRomStart", - "0d000000" : "skeeter_geo", - "0d000284" : "seaweed_geo", - "0d0002f4" : "water_mine_geo", - "0d000324" : "cyan_fish_geo", - "0d00038c" : "bub_geo", - "0d000414" : "water_ring_geo", - "0d000450" : "treasure_chest_base_geo", - "0d000468" : "treasure_chest_lid_geo", - "0d000480" : "_group13_geoSegmentEnd", - "007ccb40" : "_group13_geoSegmentRomEnd", - "06000000" : "_group14_mio0SegmentStart", - "007cc6c0" : "_group14_mio0SegmentRomStart", - "06013a60" : ".", - "06013a60" : "_group14_mio0SegmentEnd", - "007e0120" : "_group14_mio0SegmentRomEnd", - "0d000000" : "_group14_geoSegmentStart", - "007cc6c0" : "_group14_geoSegmentRomStart", - "0d000000" : "koopa_flag_geo", - "0d0000b8" : "wooden_post_geo", - "0d0000d0" : "koopa_without_shell_geo", - "0d000214" : "koopa_with_shell_geo", - "0d000358" : "piranha_plant_geo", - "0d000480" : "whomp_geo", - "0d0005d0" : "metallic_ball_geo", - "0d0005ec" : "chain_chomp_geo", - "0d000680" : "_group14_geoSegmentEnd", - "007ccd40" : "_group14_geoSegmentRomEnd", - "06000000" : "_group15_mio0SegmentStart", - "007cc6c0" : "_group15_mio0SegmentRomStart", - "0600c8e0" : ".", - "0600c8e0" : "_group15_mio0SegmentEnd", - "007d8fa0" : "_group15_mio0SegmentRomEnd", - "0d000000" : "_group15_geoSegmentStart", - "007cc6c0" : "_group15_geoSegmentRomStart", - "0d000000" : "lakitu_geo", - "0d000114" : "toad_geo_000114", - "0d00027c" : "toad_geo_00027C", - "0d0003e4" : "toad_geo", - "0d000448" : "mips_geo", - "0d0005b0" : "boo_castle_geo", - "0d000600" : "_group15_geoSegmentEnd", - "007cccc0" : "_group15_geoSegmentRomEnd", - "06000000" : "_group16_mio0SegmentStart", - "007cc6c0" : "_group16_mio0SegmentRomStart", - "06002ba0" : ".", - "06002ba0" : "_group16_mio0SegmentEnd", - "007cf260" : "_group16_mio0SegmentRomEnd", - "0d000000" : "_group16_geoSegmentStart", - "007cc6c0" : "_group16_geoSegmentRomStart", - "0d000000" : "moneybag_geo_000000", - "0d000078" : "moneybag_geo_000078", - "0d0000f0" : "moneybag_geo", - "0d000150" : "_group16_geoSegmentEnd", - "007cc810" : "_group16_geoSegmentRomEnd", - "06000000" : "_group17_mio0SegmentStart", - "007cc6c0" : "_group17_mio0SegmentRomStart", - "06009c50" : ".", - "06009c50" : "_group17_mio0SegmentEnd", - "007d6310" : "_group17_mio0SegmentRomEnd", - "0d000000" : "_group17_geoSegmentStart", - "007cc6c0" : "_group17_geoSegmentRomStart", - "0d000000" : "mr_i_geo", - "0d00001c" : "mr_i_iris_geo", - "0d0000dc" : "swoop_geo", - "0d0001a0" : "snufit_geo", - "0d000230" : "dorrie_geo", - "0d000394" : "scuttlebug_geo", - "0d0006d0" : "_group17_geoSegmentEnd", - "007ccd90" : "_group17_geoSegmentRomEnd", - "08000000" : "_common0_mio0SegmentStart", - "007cc6c0" : "_common0_mio0SegmentRomStart", - "0800e6d0" : ".", - "0800e6d0" : "_common0_mio0SegmentEnd", - "007dad90" : "_common0_mio0SegmentRomEnd", - "0f000000" : "_common0_geoSegmentStart", - "007cc6c0" : "_common0_geoSegmentRomStart", - "0f000000" : "blue_coin_switch_geo", - "0f000020" : "test_platform_geo", - "0f000028" : "amp_geo", - "0f0001a8" : "cannon_base_geo", - "0f0001c0" : "cannon_barrel_geo", - "0f0001d8" : "chuckya_geo", - "0f0004cc" : "purple_switch_geo", - "0f0004e4" : "checkerboard_platform_geo", - "0f0004fc" : "heart_geo", - "0f000518" : "flyguy_geo", - "0f0005d0" : "breakable_box_geo", - "0f000610" : "breakable_box_small_geo", - "0f000640" : "bowling_ball_geo", - "0f00066c" : "bowling_ball_track_geo", - "0f000694" : "exclamation_box_geo", - "0f0006e4" : "goomba_geo", - "0f0007b8" : "black_bobomb_geo", - "0f0008f4" : "bobomb_buddy_geo", - "0f000a30" : "metal_box_geo", - "0f000a58" : "exclamation_box_outline_geo", - "0f000ab0" : "koopa_shell_geo", - "0f000adc" : "koopa_shell2_geo", - "0f000b08" : "koopa_shell3_geo", - "0f000b40" : "_common0_geoSegmentEnd", - "007cd200" : "_common0_geoSegmentRomEnd", - "03000000" : "_common1_mio0SegmentStart", - "007cc6c0" : "_common1_mio0SegmentRomStart", - "03017990" : ".", - "03017990" : "_common1_mio0SegmentEnd", - "007e4050" : "_common1_mio0SegmentRomEnd", - "16000000" : "_common1_geoSegmentStart", - "007cc6c0" : "_common1_geoSegmentRomStart", - "16000000" : "mist_geo", - "16000020" : "white_puff_geo", - "16000040" : "explosion_geo", - "160000a8" : "butterfly_geo", - "1600013c" : "yellow_coin_geo", - "160001a0" : "yellow_coin_no_shadow_geo", - "16000200" : "blue_coin_geo", - "16000264" : "blue_coin_no_shadow_geo", - "160002c4" : "red_coin_geo", - "16000328" : "red_coin_no_shadow_geo", - "16000388" : "warp_pipe_geo", - "160003a8" : "castle_door_geo", - "1600043c" : "cabin_door_geo", - "160004d0" : "wooden_door_geo", - "16000564" : "wooden_door2_geo", - "160005f8" : "metal_door_geo", - "1600068c" : "hazy_maze_door_geo", - "16000720" : "haunted_door_geo", - "160007b4" : "castle_door_0_star_geo", - "16000868" : "castle_door_1_star_geo", - "1600091c" : "castle_door_3_stars_geo", - "160009d0" : "key_door_geo", - "16000a84" : "bowser_key_geo", - "16000ab0" : "bowser_key_cutscene_geo", - "16000b10" : "red_flame_shadow_geo", - "16000b2c" : "red_flame_geo", - "16000b8c" : "blue_flame_geo", - "16000bec" : "fish_shadow_geo", - "16000c44" : "fish_geo", - "16000c8c" : "leaves_geo", - "16000ca4" : "marios_cap_geo", - "16000cf0" : "marios_metal_cap_geo", - "16000d3c" : "marios_wing_cap_geo", - "16000da8" : "marios_winged_metal_cap_geo", - "16000e14" : "number_geo", - "16000e84" : "mushroom_1up_geo", - "16000ea0" : "star_geo", - "16000ed4" : "dirt_animation_geo", - "16000f24" : "cartoon_star_geo", - "16000f6c" : "transparent_star_geo", - "16000f98" : "white_particle_geo", - "16000fb4" : "wooden_signpost_geo", - "16000fe8" : "bubbly_tree_geo", - "16001000" : "spiky_tree_geo", - "16001018" : "snow_tree_geo", - "16001030" : "spiky_tree1_geo", - "16001048" : "palm_tree_geo", - "16001060" : "_common1_geoSegmentEnd", - "007cd720" : "_common1_geoSegmentRomEnd", - "13000000" : "_behaviorSegmentStart", - "007cc6c0" : "_behaviorSegmentRomStart", - "13000000" : "bhvStarDoor", - "13000054" : "bhvMrI", - "1300008c" : "bhvMrIBody", - "130000ac" : "bhvMrIParticle", - "130000f8" : "bhvPurpleParticle", - "13000118" : "bhvGiantPole", - "13000144" : "bhvPoleGrabbing", - "13000174" : "bhvThiHugeIslandTop", - "13000194" : "bhvThiTinyIslandTop", - "130001ac" : "bhvCapSwitchBase", - "130001cc" : "bhvCapSwitch", - "130001f4" : "bhvKingBobomb", - "13000254" : "bhvBobombAnchorMario", - "13000278" : "bhvBetaChestBottom", - "1300029c" : "bhvBetaChestLid", - "130002b8" : "bhvBubbleParticleSpawner", - "130002e4" : "bhvBubbleMaybe", - "13000338" : "bhvSmallWaterWave", - "13000398" : "bhvSmallWaterWave398", - "130003bc" : "bhvWaterAirBubble", - "13000400" : "bhvSmallParticle", - "13000428" : "bhvPlungeBubble", - "13000444" : "bhvSmallParticleSnow", - "1300046c" : "bhvSmallParticleBubbles", - "13000494" : "bhvFishGroup", - "130004a8" : "bhvCannon", - "130004e4" : "bhvCannonBarrel", - "13000500" : "bhvCannonBaseUnused", - "13000528" : "bhvChuckya", - "13000584" : "bhvChuckyaAnchorMario", - "130005a8" : "bhvUnused05A8", - "130005b4" : "bhvRotatingPlatform", - "130005d8" : "bhvTower", - "13000600" : "bhvBulletBillCannon", - "13000624" : "bhvWfBreakableWallRight", - "13000638" : "bhvWfBreakableWallLeft", - "1300066c" : "bhvKickableBoard", - "130006a4" : "bhvTowerDoor", - "130006d8" : "bhvRotatingCounterClockwise", - "130006e0" : "bhvWfRotatingWoodenPlatform", - "13000708" : "bhvKoopaShellUnderwater", - "13000720" : "bhvExitPodiumWarp", - "1300075c" : "bhvFadingWarp", - "13000780" : "bhvWarp", - "130007a0" : "bhvWarpPipe", - "130007dc" : "bhvWhitePuffExplosion", - "130007f8" : "bhvSpawnedStar", - "1300080c" : "bhvSpawnedStarNoLevelExit", - "13000830" : "bhvMrIBlueCoin", - "13000888" : "bhvCoinInsideBoo", - "130008d0" : "bhvCoinFormationSpawn", - "130008ec" : "bhvCoinFormation", - "1300090c" : "bhvOneCoin", - "1300091c" : "bhvYellowCoin", - "13000940" : "bhvTemporaryYellowCoin", - "13000964" : "bhvThreeCoinsSpawn", - "13000984" : "bhvTenCoinsSpawn", - "130009a4" : "bhvSingleCoinGetsSpawned", - "130009e0" : "bhvCoinSparkles", - "13000a14" : "bhvGoldenCoinSparkles", - "13000a34" : "bhvWallTinyStarParticle", - "13000a54" : "bhvVertStarParticleSpawner", - "13000a78" : "bhvPoundTinyStarParticle", - "13000a98" : "bhvHorStarParticleSpawner", - "13000abc" : "bhvPunchTinyTriangle", - "13000ad8" : "bhvTriangleParticleSpawner", - "13000afc" : "bhvDoorWarp", - "13000b0c" : "bhvDoor", - "13000b58" : "bhvGrindel", - "13000b8c" : "bhvThwomp2", - "13000bc8" : "bhvThwomp", - "13000c04" : "bhvTumblingBridgePlatform", - "13000c28" : "bhvWfTumblingBridge", - "13000c44" : "bhvBbhTumblingBridge", - "13000c64" : "bhvLllTumblingBridge", - "13000c84" : "bhvFlame", - "13000cc8" : "bhvAnotherElavator", - "13000cfc" : "bhvRrElevatorPlatform", - "13000d30" : "bhvHmcElevatorPlatform", - "13000d6c" : "bhvWaterMist", - "13000d98" : "bhvBreathParticleSpawner", - "13000db4" : "bhvBreakBoxTriangle", - "13000dd8" : "bhvWaterMist2", - "13000dfc" : "bhvUnused0DFC", - "13000e24" : "bhvMistCircParticleSpawner", - "13000e3c" : "bhvDirtParticleSpawner", - "13000e58" : "bhvSnowParticleSpawner", - "13000e70" : "bhvWind", - "13000e88" : "bhvEndToad", - "13000eac" : "bhvEndPeach", - "13000ed0" : "bhvUnusedParticleSpawn", - "13000f08" : "bhvUkiki", - "13000f14" : "bhvUkikiCageChild", - "13000f2c" : "bhvUkikiCageStar", - "13000f48" : "bhvUkikiCage", - "13000f9c" : "bhvBitfsSinkingPlatforms", - "13000fc8" : "bhvBitfsSinkingCagePlatform", - "13001000" : "bhvDddMovingPole", - "13001030" : "bhvBitfsTiltingInvertedPyramid", - "13001064" : "bhvSquishablePlatform", - "13001098" : "bhvCutOutObject", - "130010a8" : "bhvBetaMovingFlamesSpawn", - "130010b8" : "bhvBetaMovingFlames", - "130010d8" : "bhvRrRotatingBridgePlatform", - "13001108" : "bhvFlamethrower", - "13001124" : "bhvFlamethrowerFlame", - "13001168" : "bhvBouncingFireball", - "13001184" : "bhvBouncingFireballFlame", - "130011d0" : "bhvBowserShockWave", - "130011ec" : "bhvFireParticleSpawner", - "13001214" : "bhvBlackSmokeMario", - "13001254" : "bhvBlackSmokeBowser", - "1300127c" : "bhvBlackSmokeUpward", - "13001298" : "bhvBetaFishSplashSpawner", - "130012b4" : "bhvSpindrift", - "130012f4" : "bhvTowerPlatformGroup", - "13001318" : "bhvWfSlidingTowerPlatform", - "13001340" : "bhvWfElevatorTowerPlatform", - "13001368" : "bhvWfSolidTowerPlatform", - "13001390" : "bhvLeafParticleSpawner", - "130013a8" : "bhvTreeSnow", - "130013c4" : "bhvTreeLeaf", - "130013dc" : "bhvAnotherTiltingPlatform", - "13001408" : "bhvSquarishPathMoving", - "1300142c" : "bhvPiranhaPlantBubble", - "13001448" : "bhvPiranhaPlantWakingBubbles", - "13001468" : "bhvFloorSwitchAnimatesObject", - "13001478" : "bhvFloorSwitchGrills", - "13001484" : "bhvFloorSwitchHardcodedModel", - "130014ac" : "bhvFloorSwitchHiddenObjects", - "130014bc" : "bhvHiddenObject", - "130014e0" : "bhvBreakableBox", - "13001518" : "bhvPushableMetalBox", - "13001548" : "bhvHeaveHo", - "130015a4" : "bhvHeaveHoThrowMario", - "130015c0" : "bhvCcmTouchedStarSpawn", - "130015e4" : "bhvUnusedPoundablePlatform", - "13001608" : "bhvBetaTrampolineTop", - "13001634" : "bhvBetaTrampolineSpring", - "13001650" : "bhvJumpingBox", - "1300167c" : "bhvBooCage", - "130016ac" : "bhvStub", - "130016b8" : "bhvIgloo", - "130016e4" : "bhvBowserKey", - "13001714" : "bhvGrandStar", - "13001744" : "bhvBetaBooKey", - "13001778" : "bhvAlphaBooKey", - "1300179c" : "bhvBulletBill", - "130017f4" : "bhvWhitePuffSmoke", - "13001820" : "bhvUnused1820", - "13001828" : "bhvBowserTailAnchor", - "13001850" : "bhvBowser", - "130018cc" : "bhvBowserBodyAnchor", - "13001904" : "bhvBowserFlameSpawn", - "13001920" : "bhvTiltingBowserLavaPlatform", - "13001958" : "bhvFallingBowserPlatform", - "13001984" : "bhvBlueBowserFlame", - "130019c8" : "bhvFlameFloatingLanding", - "13001a0c" : "bhvBlueFlamesGroup", - "13001a30" : "bhvFlameBouncing", - "13001a74" : "bhvFlameMovingForwardGrowing", - "13001aa4" : "bhvFlameBowser", - "13001ae8" : "bhvFlameLargeBurningOut", - "13001b2c" : "bhvBlueFish", - "13001b54" : "bhvTankFishGroup", - "13001b70" : "bhvCheckerboardElevatorGroup", - "13001b88" : "bhvCheckerboardPlatformSub", - "13001bb4" : "bhvBowserKeyUnlockDoor", - "13001bd4" : "bhvBowserKeyCourseExit", - "13001bf4" : "bhvInvisibleObjectsUnderBridge", - "13001c04" : "bhvWaterLevelPillar", - "13001c34" : "bhvDddWarp", - "13001c58" : "bhvMoatGrills", - "13001c7c" : "bhvClockMinuteHand", - "13001c8c" : "bhvClockHourHand", - "13001cb0" : "bhvMacroUkiki", - "13001d0c" : "bhvStub1D0C", - "13001d14" : "bhvLllRotatingHexagonalPlatform", - "13001d40" : "bhvLllSinkingRockBlock", - "13001d70" : "bhvStub1D70", - "13001d78" : "bhvLllMovingOctagonalMeshPlatform", - "13001da4" : "bhvSnowBall", - "13001da8" : "bhvLllRotatingBlockWithFireBars", - "13001dcc" : "bhvLllRotatingHexFlame", - "13001e04" : "bhvLllWoodPiece", - "13001e30" : "bhvLllFloatingWoodBridge", - "13001e4c" : "bhvVolcanoFlames", - "13001e6c" : "bhvLllRotatingHexagonalRing", - "13001e94" : "bhvLllSinkingRectangularPlatform", - "13001ec4" : "bhvLllSinkingSquarePlatforms", - "13001ef8" : "bhvLllTiltingInvertedPyramid", - "13001f30" : "bhvUnused1F30", - "13001f3c" : "bhvKoopaShell", - "13001f68" : "bhvKoopaShellFlame", - "13001f90" : "bhvToxBox", - "13001fbc" : "bhvPiranhaPlant", - "13002018" : "bhvLllHexagonalMesh", - "13002038" : "bhvLllBowserPuzzlePiece", - "13002068" : "bhvLllBowserPuzzle", - "13002088" : "bhvTuxiesMother", - "130020d8" : "bhvPenguinBaby", - "130020e0" : "bhvUnused20E0", - "130020e8" : "bhvSmallPenguin", - "1300213c" : "bhvFish2", - "1300214c" : "bhvFish3", - "1300215c" : "bhvLargeFishGroup", - "13002178" : "bhvFish", - "13002194" : "bhvWdwExpressElevator", - "130021c0" : "bhvWdwExpressElevatorPlatform", - "130021e4" : "bhvChirpChirp", - "130021f4" : "bhvChirpChirpUnused", - "1300220c" : "bhvBub", - "13002250" : "bhvExclamationBox", - "1300227c" : "bhvRotatingExclamationMark", - "1300229c" : "bhvSoundSpawner", - "130022b8" : "bhvRockSolid", - "130022d8" : "bhvBowserSubDoor", - "13002308" : "bhvBowsersSub", - "13002338" : "bhvSushiShark", - "13002388" : "bhvSushiSharkCollisionChild", - "130023a4" : "bhvJrbSlidingBox", - "130023d0" : "bhvShipPart3", - "130023ec" : "bhvInSunkenShip3", - "1300241c" : "bhvSunkenShipPart", - "1300243c" : "bhvSunkenShipSetRotation", - "1300244c" : "bhvSunkenShipPart2", - "1300246c" : "bhvInSunkenShip", - "13002480" : "bhvInSunkenShip2", - "130024ac" : "bhvMistParticleSpawner", - "130024dc" : "bhvWhitePuff1", - "13002500" : "bhvWhitePuff2", - "13002528" : "bhvWhitePuffSmoke2", - "13002558" : "bhvPurpleSwitchHiddenBoxes", - "13002568" : "bhvBlueCoinSwitch", - "13002588" : "bhvHiddenBlueCoin", - "130025c0" : "bhvOpenableCageDoor", - "130025e0" : "bhvOpenableGrill", - "130025f8" : "bhvWaterLevelDiamond", - "13002620" : "bhvInitializeChangingWaterLevel", - "13002634" : "bhvTweesterSandParticle", - "13002650" : "bhvTweester", - "13002684" : "bhvMerryGoRoundBooManager", - "1300269c" : "bhvAnimatedTexture", - "130026d4" : "bhvBooInCastle", - "13002710" : "bhvBooWithCage", - "13002768" : "bhvBalconyBigBoo", - "1300277c" : "bhvMerryGoRoundBigBoo", - "13002790" : "bhvGhostHuntBigBoo", - "130027d0" : "bhvCourtyardBooTriplet", - "130027e4" : "bhvBoo", - "130027f4" : "bhvMerryGoRoundBoo", - "13002804" : "bhvGhostHuntBoo", - "1300286c" : "bhvHiddenStaircaseStep", - "13002898" : "bhvBooBossSpawnedBridge", - "130028cc" : "bhvBbhTiltingTrapPlatform", - "130028fc" : "bhvHauntedBookshelf", - "1300292c" : "bhvMeshElevator", - "13002968" : "bhvMerryGoRound", - "13002998" : "bhvPlaysMusicTrackWhenTouched", - "130029b0" : "bhvInsideCannon", - "130029b4" : "bhvBetaBowserAnchor", - "130029e4" : "bhvStaticCheckeredPlatform", - "13002a10" : "bhvUnused2A10", - "13002a20" : "bhvUnusedFakeStar", - "13002a48" : "bhvStaticObject", - "13002a54" : "bhvUnused2A54", - "13002a5c" : "bhvCastleFloorTrap", - "13002a7c" : "bhvFloorTrapInCastle", - "13002aa4" : "bhvTree", - "13002ad0" : "bhvSparkle", - "13002af0" : "bhvSparkleSpawn", - "13002b08" : "bhvSparkleParticleSpawner", - "13002b5c" : "bhvScuttlebug", - "13002ba0" : "bhvScuttlebugSpawn", - "13002bb8" : "bhvWhompKingBoss", - "13002bcc" : "bhvSmallWhomp", - "13002c14" : "bhvWaterSplash", - "13002c60" : "bhvWaterDroplet", - "13002c7c" : "bhvWaterDropletSplash", - "13002cb0" : "bhvBubbleSplash", - "13002ce0" : "bhvIdleWaterWave", - "13002d28" : "bhvObjectWaterSplash", - "13002d50" : "bhvShallowWaterWave", - "13002d7c" : "bhvShallowWaterSplash", - "13002db0" : "bhvObjectWaveTrail", - "13002dc0" : "bhvWaveTrail", - "13002e04" : "bhvTinyStrongWindParticle", - "13002e20" : "bhvStrongWindParticle", - "13002e3c" : "bhvSLSnowmanWind", - "13002e58" : "bhvSLWalkingPenguin", - "13002ea8" : "bhvYellowBall", - "13002ec0" : "bhvMario", - "13002ef8" : "bhvToadMessage", - "13002f40" : "bhvUnlockDoorStar", - "13002f60" : "bhvInstantActiveWarp", - "13002f64" : "bhvAirborneWarp", - "13002f68" : "bhvHardAirKnockBackWarp", - "13002f6c" : "bhvSpinAirborneCircleWarp", - "13002f70" : "bhvDeathWarp", - "13002f74" : "bhvSpinAirborneWarp", - "13002f78" : "bhvFlyingWarp", - "13002f7c" : "bhvPaintingStarCollectWarp", - "13002f80" : "bhvPaintingDeathWarp", - "13002f84" : "bhvAirborneDeathWarp", - "13002f88" : "bhvAirborneStarCollectWarp", - "13002f8c" : "bhvLaunchStarCollectWarp", - "13002f90" : "bhvLaunchDeathWarp", - "13002f94" : "bhvSwimmingWarp", - "13002fa0" : "bhvRandomAnimatedTexture", - "13002fc0" : "bhvYellowBackgroundInMenu", - "13002fe4" : "bhvMenuButton", - "13003008" : "bhvMenuButtonManager", - "1300302c" : "bhvActSelectorStarType", - "13003048" : "bhvActSelector", - "13003068" : "bhvMovingYellowCoin", - "130030a4" : "bhvMovingBlueCoin", - "130030d4" : "bhvBlueCoinSliding", - "13003104" : "bhvBlueCoinJumping", - "13003134" : "bhvSeaweed", - "13003158" : "bhvSeaweedBundle", - "13003174" : "bhvBobomb", - "130031ac" : "bhvBobombFuseSmoke", - "130031dc" : "bhvBobombBuddy", - "13003228" : "bhvBobombBuddyOpensCannon", - "13003274" : "bhvCannonClosed", - "130032a8" : "bhvWhirlpool", - "130032c8" : "bhvJetStream", - "130032e0" : "bhvMessagePanel", - "13003324" : "bhvSignOnWall", - "13003354" : "bhvHomingAmp", - "13003388" : "bhvCirclingAmp", - "130033bc" : "bhvButterfly", - "130033ec" : "bhvHoot", - "13003420" : "bhvBetaHoldableObject", - "13003454" : "bhvCarrySomething1", - "1300345c" : "bhvCarrySomething2", - "13003464" : "bhvCarrySomething3", - "1300346c" : "bhvCarrySomething4", - "13003474" : "bhvCarrySomething5", - "1300347c" : "bhvCarrySomething6", - "13003484" : "bhvObjectBubble", - "130034c4" : "bhvObjectWaterWave", - "13003510" : "bhvExplosion", - "13003558" : "bhvBobombBullyDeathSmoke", - "13003588" : "bhvSmoke", - "130035b0" : "bhvBobombExplosionBubble", - "13003600" : "bhvBobombExplosionBubble3600", - "13003614" : "bhvRespawner", - "1300362c" : "bhvSmallBully", - "13003660" : "bhvBigBully", - "13003694" : "bhvBigBullyWithMinions", - "130036c8" : "bhvSmallChillBully", - "13003700" : "bhvBigChillBully", - "13003738" : "bhvJetStreamRingSpawner", - "13003750" : "bhvJetStreamWaterRing", - "13003798" : "bhvMantaRayWaterRing", - "130037e0" : "bhvMantaRayRingManager", - "130037ec" : "bhvBowserBomb", - "1300381c" : "bhvBowserBombExplosion", - "13003840" : "bhvBowserBombSmoke", - "13003868" : "bhvCelebrationStar", - "13003888" : "bhvCelebrationStarSparkle", - "130038b0" : "bhvStarKeyCollectionPuffSpawner", - "130038d0" : "bhvLllDrawbridgeSpawner", - "130038e8" : "bhvLllDrawbridge", - "13003910" : "bhvSmallBomp", - "13003940" : "bhvLargeBomp", - "13003970" : "bhvWfSlidingPlatform", - "130039a0" : "bhvMoneybag", - "130039d4" : "bhvMoneybagHidden", - "13003a08" : "bhvPitBowlingBall", - "13003a30" : "bhvFreeBowlingBall", - "13003a58" : "bhvBowlingBall", - "13003a80" : "bhvTtmBowlingBallSpawner", - "13003aa4" : "bhvBobBowlingBallSpawner", - "13003ac8" : "bhvThiBowlingBallSpawner", - "13003ae0" : "bhvRrCruiserWing", - "13003b00" : "bhvSpindel", - "13003b30" : "bhvSslMovingPyramidWall", - "13003b60" : "bhvPyramidElevator", - "13003b98" : "bhvPyramidElevatorTrajectoryMarkerBall", - "13003bb4" : "bhvPyramidTop", - "13003bec" : "bhvPyramidTopFragment", - "13003c0c" : "bhvPyramidPillarTouchDetector", - "13003c30" : "bhvWaterfallSoundLoop", - "13003c44" : "bhvVolcanoSoundLoop", - "13003c58" : "bhvCastleFlagWaving", - "13003c7c" : "bhvBirdsSoundLoop", - "13003c90" : "bhvAmbientSounds", - "13003ca4" : "bhvSandSoundLoop", - "13003cb8" : "bhvHiddenAt120Stars", - "13003ce4" : "bhvSnowmansBottom", - "13003d0c" : "bhvSnowmansHead", - "13003d34" : "bhvSnowmansBodyCheckpoint", - "13003d4c" : "bhvBigSnowmanWhole", - "13003d74" : "bhvBigBoulder", - "13003da0" : "bhvBigBoulderGenerator", - "13003db8" : "bhvWingCap", - "13003dd8" : "bhvMetalCap", - "13003df8" : "bhvNormalCap", - "13003e1c" : "bhvVanishCap", - "13003e3c" : "bhvStar", - "13003e64" : "bhvStarSpawnCoordinates", - "13003e8c" : "bhvHiddenRedCoinStar", - "13003eac" : "bhvRedCoin", - "13003ee4" : "bhvBowserCourseRedCoinStar", - "13003efc" : "bhvHiddenStar", - "13003f1c" : "bhvHiddenStarTrigger", - "13003f40" : "bhvTtmRollingLog", - "13003f78" : "bhvLllVolcanoFallingTrap", - "13003fa4" : "bhvLllRollingLog", - "13003fdc" : "bhv1upWalking", - "13004010" : "bhv1upRunningAway", - "13004044" : "bhv1upSliding", - "1300407c" : "bhv1Up", - "130040b4" : "bhv1upJumpOnApproach", - "130040ec" : "bhvHidden1up", - "13004124" : "bhvHidden1upTrigger", - "13004148" : "bhvHidden1upInPole", - "13004180" : "bhvHidden1upInPoleTrigger", - "130041a4" : "bhvHidden1upInPoleSpawner", - "130041bc" : "bhvControllablePlatform", - "130041f0" : "bhvControllablePlatformSub", - "13004218" : "bhvBreakableBoxSmall", - "13004244" : "bhvSlidingSnowMound", - "13004270" : "bhvSnowMoundSpawn", - "13004284" : "bhvWdwSquareFloatingPlatform", - "130042b4" : "bhvWdwRectangularFloatingPlatform", - "130042e4" : "bhvJrbFloatingPlatform", - "13004314" : "bhvArrowLift", - "13004348" : "bhvOrangeNumber", - "13004370" : "bhvMantaRay", - "130043a0" : "bhvFallingPillar", - "130043c4" : "bhvFallingPillarHitbox", - "130043e0" : "bhvPillarBase", - "13004400" : "bhvJrbFloatingBox", - "1300442c" : "bhvDecorativePendulum", - "1300444c" : "bhvTreasureChestsShip", - "13004470" : "bhvTreasureChestsJrb", - "13004494" : "bhvTreasureChests", - "130044b8" : "bhvTreasureChestBottom", - "130044e0" : "bhvTreasureChestTop", - "130044fc" : "bhvMips", - "13004538" : "bhvYoshi", - "13004580" : "bhvKoopa", - "130045d0" : "bhvKoopaRaceEndpoint", - "130045f8" : "bhvKoopaFlag", - "13004634" : "bhvPokey", - "13004668" : "bhvPokeyBodyPart", - "13004698" : "bhvSwoop", - "130046dc" : "bhvFlyGuy", - "1300472c" : "bhvGoomba", - "13004770" : "bhvGoombaTripletSpawner", - "1300478c" : "bhvChainChomp", - "130047e4" : "bhvChainChompChainPart", - "1300481c" : "bhvWoodenPost", - "13004868" : "bhvChainChompGate", - "13004898" : "bhvWigglerHead", - "130048e0" : "bhvWigglerBody", - "13004918" : "bhvEnemyLakitu", - "13004954" : "bhvCameraLakitu", - "13004988" : "bhvCloud", - "130049ac" : "bhvCloudPart", - "130049c8" : "bhvSpiny", - "13004a00" : "bhvMontyMole", - "13004a58" : "bhvMontyMoleHole", - "13004a78" : "bhvMontyMoleRock", - "13004ab0" : "bhvPlatformOnTrack", - "13004af4" : "bhvTrackBall", - "13004b1c" : "bhvSeesawPlatform", - "13004b44" : "bhvFerrisWheelAxle", - "13004b6c" : "bhvFerrisWheelPlatform", - "13004b8c" : "bhvWaterBombSpawner", - "13004ba8" : "bhvWaterBomb", - "13004bd4" : "bhvWaterBombShadow", - "13004bf0" : "bhvTTCRotatingSolid", - "13004c24" : "bhvTTCPendulum", - "13004c5c" : "bhvTTCTreadmill", - "13004c94" : "bhvTTCMovingBar", - "13004ccc" : "bhvTTCCog", - "13004cf8" : "bhvTTCPitBlock", - "13004d28" : "bhvTTCElevator", - "13004d64" : "bhvTTC2DRotator", - "13004d90" : "bhvTTCSpinner", - "13004dbc" : "bhvMrBlizzard", - "13004e08" : "bhvMrBlizzardSnowball", - "13004e4c" : "bhvSlidingPlatform2", - "13004e78" : "bhvOctagonalPlatformRotating", - "13004ea0" : "bhvAnimatesOnFloorSwitchPress", - "13004ecc" : "bhvActivatedBackAndForthPlatform", - "13004ef8" : "bhvRecoveryHeart", - "13004f10" : "bhvWaterBombCannon", - "13004f28" : "bhvCannonBarrelBubbles", - "13004f40" : "bhvUnagi", - "13004f78" : "bhvUnagiSubobject", - "13004f90" : "bhvDorrie", - "13004fd4" : "bhvHauntedChair", - "13005024" : "bhvMadPiano", - "1300506c" : "bhvFlyingBookend", - "130050b4" : "bhvBookendSpawn", - "130050d4" : "bhvHauntedBookshelfManager", - "130050f4" : "bhvBookSwitch", - "13005120" : "bhvFirePiranhaPlant", - "13005158" : "bhvSmallPiranhaFlame", - "1300518c" : "bhvFireSpitter", - "130051ac" : "bhvFlyguyFlame", - "130051e0" : "bhvSnufit", - "1300521c" : "bhvSnufitBalls", - "1300525c" : "bhvHorizontalGrindel", - "130052b4" : "bhvEyerokBoss", - "130052d0" : "bhvEyerokHand", - "13005310" : "bhvKlepto", - "13005354" : "bhvBird", - "13005380" : "bhvRacingPenguin", - "130053c4" : "bhvPenguinRaceFinishLine", - "130053dc" : "bhvPenguinRaceShortcutCheck", - "130053f4" : "bhvCoffinSpawner", - "13005414" : "bhvCoffin", - "13005440" : "bhvClamShell", - "13005468" : "bhvSkeeter", - "130054a0" : "bhvSkeeterWave", - "130054b8" : "bhvSwingPlatform", - "130054ec" : "bhvDonutPlatformSpawner", - "13005504" : "bhvDonutPlatform", - "13005528" : "bhvDDDPole", - "1300556c" : "bhvRedCoinStarMarker", - "13005598" : "bhvTripletButterfly", - "130055dc" : "bhvBubba", - "13005610" : "bhvBeginningLakitu", - "13005638" : "bhvBeginningPeach", - "1300565c" : "bhvEndBirds1", - "13005680" : "bhvEndBirds2", - "130056a4" : "bhvIntroScene", - "130056c0" : "_behaviorSegmentEnd", - "007d1d80" : "_behaviorSegmentRomEnd", - "8016f000" : "_goddardSegmentStart", - "007cc6c0" : "_goddardSegmentRomStart", - }, - "Refresh 11" : { - "80000000" : "EXCEPTION_TLB_MISS", - "a4000000" : "SP_DMEM", - "a40004c0" : "SP_DMEM_UNK0", - "a4000774" : "SP_DMEM_UNK1", - "a4001000" : "SP_IMEM", - "a4040010" : "SP_STATUS_REG", - "a4080000" : "SP_PC", - "a4300000" : "MI_MODE_REG", - "a4300004" : "MI_VERSION_REG", - "a4300008" : "MI_INTR_REG", - "a430000c" : "MI_INTR_MASK_REG", - "a4400010" : "VI_CURRENT_REG", - "a450000c" : "AI_STATUS_REG", - "a4600000" : "PI_DRAM_ADDR_REG", - "a4600004" : "PI_CART_ADDR_REG", - "a460000c" : "PI_WR_LEN_REG", - "a4600010" : "PI_STATUS_REG", - "a4700000" : "RI_MODE_REG", - "a4700010" : "RI_REFRESH_REG", - "a4800018" : "SI_STATUS_REG", - "b0000008" : "D_B0000008", - "b0000010" : "D_B0000010", - "b0000014" : "D_B0000014", - "c0000000" : "D_C0000000", - "c0000008" : "D_C0000008", - "c000000c" : "D_C000000C", - "802f69cc" : "func_sh_802F69CC", - "80302ef0" : "osMotorStop", - "80303090" : "osMotorStart", - "803033ac" : "osMotorInit", - "803016a0" : "func_sh_803016A0", - "803016d0" : "func_sh_803016D0", - "80301820" : "func_sh_80301820", - "00000000" : "__romPos", - "04000000" : "_bootSegmentStart", - "007cc6c0" : "_bootSegmentRomStart", - "04000040" : "ipl3_entry", - "04000b70" : "ipl3_font", - "04001000" : "_bootSegmentEnd", - "007cd6c0" : "_bootSegmentRomEnd", - "80000400" : ".", - "80000400" : "_zbufferSegmentNoloadStart", - "80000400" : "0x25800", - "80000400" : "gZBuffer", - "80246000" : "_mainSegmentStart", - "007cc6c0" : "_mainSegmentRomStart", - "80246000" : "entry_point", - "80246050" : "handle_debug_key_sequences", - "80246170" : "unknown_main_func", - "802461cc" : "stub_main_1", - "802461dc" : "stub_main_2", - "802461ec" : "stub_main_3", - "802461fc" : "setup_mesg_queues", - "802462e0" : "alloc_pool", - "80246338" : "create_thread", - "8024639c" : "handle_nmi_request", - "802463ec" : "receive_new_tasks", - "8024651c" : "start_sptask", - "8024659c" : "interrupt_gfx_sptask", - "802465ec" : "start_gfx_sptask", - "80246648" : "pretend_audio_sptask_done", - "8024669c" : "handle_vblank", - "802467fc" : "handle_sp_complete", - "8024694c" : "handle_dp_complete", - "802469b8" : "thread3_main", - "80246b14" : "set_vblank_handler", - "80246b74" : "send_sp_task_message", - "80246bb4" : "dispatch_audio_sptask", - "80246c10" : "send_display_list", - "80246c9c" : "turn_on_audio", - "80246cb8" : "turn_off_audio", - "80246cf0" : "thread1_idle", - "80246df8" : "main_func", - "80246e70" : "my_rdp_init", - "802471a4" : "my_rsp_init", - "80247284" : "clear_z_buffer", - "802473c8" : "display_frame_buffer", - "802474b8" : "clear_frame_buffer", - "80247620" : "clear_viewport", - "8024784c" : "draw_screen_borders", - "802479bc" : "make_viewport_clip_rect", - "80247b3c" : "create_task_structure", - "80247ccc" : "init_render_image", - "80247d14" : "end_master_display_list", - "80247db4" : "draw_reset_bars", - "80247f08" : "rendering_init", - "80247fdc" : "config_gfx_pool", - "80248090" : "display_and_vsync", - "80248304" : "adjust_analog_stick", - "80248498" : "run_demo_inputs", - "80248638" : "read_controller_inputs", - "80248824" : "init_controllers", - "80248964" : "setup_game_memory", - "80248af0" : "thread5_game_loop", - "80248c40" : "reset_volume", - "80248c58" : "lower_background_noise", - "80248ce8" : "raise_background_noise", - "80248d78" : "disable_background_sound", - "80248dc0" : "enable_background_sound", - "80248e08" : "set_sound_mode", - "80248e54" : "play_menu_sounds", - "80248fec" : "play_painting_eject_sound", - "80249070" : "play_infinite_stairs_music", - "80249178" : "set_background_music", - "8024922c" : "fadeout_music", - "8024927c" : "fadeout_level_music", - "802492d0" : "play_cutscene_music", - "80249310" : "play_shell_music", - "8024934c" : "stop_shell_music", - "80249398" : "play_cap_music", - "80249404" : "fadeout_cap_music", - "80249448" : "stop_cap_music", - "80249494" : "play_menu_sounds_extra", - "802494d8" : "audio_game_loop_tick", - "80249500" : "thread4_sound", - "802495e0" : "level_control_timer", - "802496b8" : "pressed_pause", - "80249764" : "set_play_mode", - "8024978c" : "warp_special", - "802497b8" : "fade_into_special_warp", - "8024982c" : "stub_level_update_1", - "8024983c" : "load_level_init_text", - "8024995c" : "init_door_warp", - "80249a10" : "set_mario_initial_cap_powerup", - "80249ab4" : "set_mario_initial_action", - "80249cd8" : "init_mario_after_warp", - "8024a124" : "warp_area", - "8024a18c" : "warp_level", - "8024a1d8" : "warp_credits", - "8024a374" : "check_instant_warp", - "8024a584" : "music_changed_through_warp", - "8024a700" : "initiate_warp", - "8024a7b4" : "get_painting_warp_node", - "8024a85c" : "initiate_painting_warp", - "8024a9cc" : "level_trigger_warp", - "8024aedc" : "initiate_delayed_warp", - "8024b13c" : "update_hud_values", - "8024b390" : "basic_update", - "8024b3e4" : "play_mode_normal", - "8024b5d4" : "play_mode_paused", - "8024b6cc" : "play_mode_frame_advance", - "8024b798" : "level_set_transition", - "8024b7c0" : "play_mode_change_area", - "8024b880" : "play_mode_change_level", - "8024b9b8" : "update_level", - "8024ba8c" : "init_level", - "8024bcd8" : "lvl_init_or_update", - "8024bd5c" : "lvl_init_from_save_file", - "8024be14" : "lvl_set_current_level", - "8024bfa0" : "lvl_play_the_end_screen_sound", - "8024bff0" : "get_mario_cap_flag", - "8024c0b8" : "object_facing_mario", - "8024c16c" : "mario_obj_angle_to_object", - "8024c1d8" : "determine_interaction", - "8024c51c" : "attack_object", - "8024c618" : "mario_stop_riding_object", - "8024c66c" : "mario_grab_used_object", - "8024c6c0" : "mario_drop_held_object", - "8024c780" : "mario_throw_held_object", - "8024c894" : "mario_stop_riding_and_holding", - "8024c8fc" : "does_mario_have_hat", - "8024c928" : "mario_blow_off_cap", - "8024ca68" : "mario_lose_cap_to_enemy", - "8024caf8" : "mario_retrieve_cap", - "8024cb58" : "able_to_grab_object", - "8024cbfc" : "mario_get_collided_object", - "8024cc7c" : "mario_check_object_grab", - "8024ce08" : "bully_knock_back_mario", - "8024d0b4" : "bounce_off_object", - "8024d130" : "hit_object_from_below", - "8024d2bc" : "determine_knockback_action", - "8024d578" : "push_mario_out_of_object", - "8024d72c" : "bounce_back_from_attack", - "8024d804" : "should_push_or_pull_door", - "8024d8b0" : "take_damage_from_interact_object", - "8024d998" : "take_damage_and_knock_back", - "8024daac" : "reset_mario_pitch", - "8024db2c" : "interact_coin", - "8024dbf0" : "interact_water_ring", - "8024dc28" : "interact_star_or_key", - "8024de4c" : "interact_bbh_entrance", - "8024df10" : "interact_warp", - "8024e0c4" : "interact_warp_door", - "8024e2fc" : "get_door_save_file_flag", - "8024e420" : "interact_door", - "8024e6ec" : "interact_cannon_base", - "8024e778" : "interact_igloo_barrier", - "8024e7d4" : "interact_tornado", - "8024e8f0" : "interact_whirlpool", - "8024e9d0" : "interact_strong_wind", - "8024ead8" : "interact_flame", - "8024ec54" : "interact_snufit_bullet", - "8024ed84" : "interact_clam_or_bubba", - "8024ee44" : "interact_bully", - "8024eff8" : "interact_shock", - "8024f170" : "interact_mr_blizzard", - "8024f1e0" : "interact_hit_from_below", - "8024f354" : "interact_bounce_top", - "8024f4ac" : "interact_unknown_08", - "8024f55c" : "interact_damage", - "8024f5cc" : "interact_breakable", - "8024f6a4" : "interact_koopa_shell", - "8024f7a8" : "check_object_grab_mario", - "8024f8bc" : "interact_pole", - "8024fa60" : "interact_hoot", - "8024fb30" : "interact_cap", - "8024fd2c" : "interact_grabbable", - "8024fe6c" : "mario_can_talk", - "8024ff04" : "check_read_sign", - "80250098" : "check_npc_talk", - "80250198" : "interact_text", - "80250230" : "check_kick_or_punch_wall", - "802503f0" : "mario_process_interactions", - "802505c8" : "check_death_barrier", - "8025065c" : "check_lava_boost", - "80250724" : "pss_begin_slide", - "80250778" : "pss_end_slide", - "802507fc" : "mario_handle_special_floors", - "80250940" : "is_anim_at_end", - "8025097c" : "is_anim_past_end", - "802509b8" : "set_mario_animation", - "80250b04" : "set_mario_anim_with_accel", - "80250c7c" : "set_anim_to_frame", - "80250d38" : "is_anim_past_frame", - "80250e54" : "find_mario_anim_flags_and_translation", - "80251020" : "update_mario_pos_for_anim", - "802510dc" : "return_mario_anim_y_translation", - "80251120" : "play_sound_if_no_flag", - "8025118c" : "play_mario_jump_sound", - "80251274" : "adjust_sound_for_speed", - "80251310" : "play_sound_and_spawn_particles", - "80251444" : "play_mario_action_sound", - "802514ac" : "play_mario_landing_sound", - "80251510" : "play_mario_landing_sound_once", - "80251574" : "play_mario_heavy_landing_sound", - "802515d8" : "play_mario_heavy_landing_sound_once", - "8025163c" : "play_mario_sound", - "80251708" : "mario_set_forward_vel", - "8025177c" : "mario_get_floor_class", - "802518a8" : "mario_get_terrain_sound_addend", - "80251a48" : "resolve_and_return_wall_collisions", - "80251afc" : "vec3f_find_ceil", - "80251b54" : "mario_facing_downhill", - "80251bd4" : "mario_floor_is_slippery", - "80251cfc" : "mario_floor_is_slope", - "80251e24" : "mario_floor_is_steep", - "80251f24" : "find_floor_height_relative_polar", - "80252000" : "find_floor_slope", - "802521a0" : "update_mario_sound_and_camera", - "8025229c" : "set_steep_jump_action", - "80252cf4" : "set_mario_action", - "80252e5c" : "set_jump_from_landing", - "802530a0" : "set_jumping_action", - "80253178" : "drop_and_set_mario_action", - "802531c4" : "hurt_and_set_mario_action", - "80253218" : "check_common_action_exits", - "80253300" : "check_common_hold_action_exits", - "802533e4" : "transition_submerged_to_walking", - "80253488" : "set_water_plunge_action", - "80253588" : "squish_mario_model", - "80253720" : "debug_print_speed_action_normal", - "80253838" : "update_mario_button_inputs", - "8025395c" : "update_mario_joystick_inputs", - "80253a60" : "update_mario_geometry_inputs", - "80253d58" : "update_mario_inputs", - "80253ec0" : "set_submerged_cam_preset_and_spawn_bubbles", - "80254060" : "update_mario_health", - "802542b4" : "update_mario_info_for_cam", - "80254338" : "mario_reset_bodystate", - "80254390" : "sink_mario_in_quicksand", - "802543e8" : "update_and_return_cap_flags", - "80254588" : "mario_update_hitbox_and_cap_model", - "80254830" : "execute_mario_action", - "80254b20" : "init_mario", - "80254f44" : "init_mario_from_save_file", - "80255080" : "get_additive_y_vel_for_jumps", - "8025509c" : "stub_mario_step_1", - "802550b0" : "stub_mario_step_2", - "802550c0" : "transfer_bully_speed", - "80255238" : "init_bully_collision_data", - "802552fc" : "mario_bonk_reflection", - "80255414" : "mario_update_quicksand", - "80255654" : "mario_push_off_steep_floor", - "8025570c" : "mario_update_moving_sand", - "8025580c" : "mario_update_windy_ground", - "802559b0" : "stop_and_set_height_to_floor", - "80255a34" : "stationary_ground_step", - "80255d88" : "perform_ground_step", - "80255ec4" : "check_ledge_grab", - "802560ac" : "perform_air_quarter_step", - "802564e0" : "apply_twirl_gravity", - "80256584" : "should_strengthen_gravity_for_jump_ascent", - "8025661c" : "apply_gravity", - "802569f8" : "apply_vertical_wind", - "80256b24" : "perform_air_step", - "80256cd8" : "set_vel_from_pitch_and_yaw", - "80256d8c" : "set_vel_from_yaw", - "80256e00" : "get_credits_str_width", - "80256e88" : "print_displaying_credits_entry", - "80257060" : "bhv_end_peach_loop", - "802570dc" : "bhv_end_toad_loop", - "80257198" : "geo_switch_peach_eyes", - "802572b0" : "get_star_collection_dialog", - "8025733c" : "handle_save_menu", - "80257450" : "spawn_obj_at_mario_rel_yaw", - "802574e8" : "cutscene_take_cap_off", - "80257548" : "cutscene_put_cap_on", - "802575a8" : "mario_ready_to_speak", - "80257640" : "set_mario_npc_dialog", - "80257748" : "act_reading_npc_dialog", - "80257980" : "act_waiting_for_dialog", - "80257a0c" : "act_disappeared", - "80257ab0" : "act_reading_automatic_dialog", - "80257ce4" : "act_reading_sign", - "80257eac" : "act_debug_free_move", - "80258184" : "general_star_dance_handler", - "80258420" : "act_star_dance", - "802584dc" : "act_star_dance_water", - "802585c0" : "act_fall_after_star_grab", - "802586cc" : "common_death_handler", - "80258744" : "act_standing_death", - "802587ec" : "act_electrocution", - "8025883c" : "act_suffocation", - "8025888c" : "act_death_on_back", - "802588f8" : "act_death_on_stomach", - "80258964" : "act_quicksand_death", - "80258a7c" : "act_eaten_by_bubba", - "80258b24" : "launch_mario_until_land", - "80258ba8" : "act_unlocking_key_door", - "80258dac" : "act_unlocking_star_door", - "80258f94" : "act_entering_star_door", - "80259264" : "act_going_through_door", - "802593cc" : "act_warp_door_spawn", - "802594d4" : "act_emerge_from_pipe", - "80259608" : "act_spawn_spin_airborne", - "80259740" : "act_spawn_spin_landing", - "802597ac" : "act_exit_airborne", - "80259854" : "act_falling_exit_airborne", - "802598d0" : "act_exit_land_save_dialog", - "80259c30" : "act_death_exit", - "80259ce8" : "act_unused_death_exit", - "80259d74" : "act_falling_death_exit", - "80259e00" : "act_special_exit_airborne", - "80259ef8" : "act_special_death_exit", - "80259fcc" : "act_spawn_no_spin_airborne", - "8025a040" : "act_spawn_no_spin_landing", - "8025a0bc" : "act_bbh_enter_spin", - "8025a494" : "act_bbh_enter_jump", - "8025a610" : "act_teleport_fade_out", - "8025a6fc" : "act_teleport_fade_in", - "8025a858" : "act_shocked", - "8025a9ac" : "act_squished", - "8025ae0c" : "act_putting_on_cap", - "8025aea8" : "stuck_in_ground_handler", - "8025affc" : "act_head_stuck_in_ground", - "8025b050" : "act_butt_stuck_in_ground", - "8025b0a4" : "act_feet_stuck_in_ground", - "8025bc80" : "generate_yellow_sparkles", - "8025d798" : "mario_execute_cutscene_action", - "8025dd70" : "add_tree_leaf_particles", - "8025de1c" : "play_climbing_sounds", - "8025df04" : "set_pole_position", - "8025e21c" : "act_holding_pole", - "8025e5a8" : "act_climbing_pole", - "8025e7a4" : "act_grab_pole_slow", - "8025e830" : "act_grab_pole_fast", - "8025e930" : "act_top_of_pole_transition", - "8025ea30" : "act_top_of_pole", - "8025eb50" : "perform_hanging_step", - "8025ecfc" : "update_hang_moving", - "8025eed0" : "update_hang_stationary", - "8025ef58" : "act_start_hanging", - "8025f0b4" : "act_hanging", - "8025f1e4" : "act_hang_moving", - "8025f384" : "let_go_of_ledge", - "8025f4b4" : "climb_up_ledge", - "8025f560" : "update_ledge_climb_camera", - "8025f644" : "update_ledge_climb", - "8025f6c0" : "act_ledge_grab", - "8025f970" : "act_ledge_climb_slow", - "8025fa64" : "act_ledge_climb_down", - "8025fae8" : "act_ledge_climb_fast", - "8025fb90" : "act_grabbed", - "8025fc6c" : "act_in_cannon", - "80260154" : "act_tornado_twirling", - "80260568" : "check_common_automatic_cancels", - "802605d0" : "mario_execute_automatic_action", - "802608b0" : "check_common_idle_cancels", - "80260aac" : "check_common_hold_idle_cancels", - "80260cb4" : "act_idle", - "80260f94" : "play_anim_sound", - "80261000" : "act_start_sleeping", - "80261268" : "act_sleeping", - "802614fc" : "act_waking_up", - "8026168c" : "act_shivering", - "802618d8" : "act_coughing", - "802619d0" : "act_hold_idle", - "80261ad0" : "act_hold_heavy_idle", - "80261bf8" : "act_standing_against_wall", - "80261cec" : "act_in_quicksand", - "80261db4" : "act_crouching", - "80261f70" : "act_panting", - "80262080" : "act_hold_panting_unused", - "8026217c" : "stopping_step", - "802621dc" : "act_braking_stop", - "802622dc" : "act_butt_slide_stop", - "80262398" : "act_hold_butt_slide_stop", - "80262490" : "act_slide_kick_slide_stop", - "80262530" : "act_start_crouching", - "80262650" : "act_stop_crouching", - "80262770" : "act_start_crawling", - "80262890" : "act_stop_crawling", - "80262980" : "act_shockwave_bounce", - "80262bc4" : "landing_step", - "80262c34" : "check_common_landing_cancels", - "80262d68" : "act_jump_land_stop", - "80262dc4" : "act_double_jump_land_stop", - "80262e20" : "act_side_flip_land_stop", - "80262e94" : "act_freefall_land_stop", - "80262ef0" : "act_triple_jump_land_stop", - "80262f50" : "act_backflip_land_stop", - "80262fec" : "act_lava_boost_land", - "8026305c" : "act_long_jump_land_stop", - "802630f8" : "act_hold_jump_land_stop", - "802631f0" : "act_hold_freefall_land_stop", - "802632e8" : "act_air_throw_land", - "802633b4" : "act_twirl_land", - "8026350c" : "act_ground_pound_land", - "802635e8" : "act_first_person", - "80263784" : "check_common_stationary_cancels", - "80263898" : "mario_execute_stationary_action", - "80263e60" : "tilt_body_running", - "80263ee4" : "play_step_sound", - "80264024" : "align_with_floor", - "8026409c" : "begin_walking_action", - "802640fc" : "check_ledge_climb_down", - "802642b4" : "slide_bonk", - "80264340" : "set_triple_jump_action", - "8026440c" : "update_sliding_angle", - "80264740" : "update_sliding", - "80264b54" : "apply_slope_accel", - "80264d80" : "apply_landing_accel", - "80264e18" : "update_shell_speed", - "80265080" : "apply_slope_decel", - "802651b0" : "update_decelerating_speed", - "80265244" : "update_walking_speed", - "80265458" : "should_begin_sliding", - "80265514" : "analog_stick_held_back", - "80265558" : "check_ground_dive_or_punch", - "80265620" : "begin_braking_action", - "80265700" : "anim_and_audio_for_walk", - "80265b1c" : "anim_and_audio_for_hold_walk", - "80265d90" : "anim_and_audio_for_heavy_walk", - "80265df8" : "push_or_sidle_wall", - "80266038" : "tilt_body_walking", - "802661cc" : "tilt_body_ground_shell", - "80266354" : "act_walking", - "802665b4" : "act_move_punching", - "80266734" : "act_hold_walking", - "8026699c" : "act_hold_heavy_walking", - "80266af8" : "act_turning_around", - "80266d4c" : "act_finish_turning_around", - "80266e48" : "act_braking", - "80266fc8" : "act_decelerating", - "80267240" : "act_hold_decelerating", - "80267504" : "act_riding_shell_ground", - "80267728" : "act_crawling", - "8026795c" : "act_burning_ground", - "80267c24" : "tilt_body_butt_slide", - "80267ce4" : "common_slide_action", - "80267fa4" : "common_slide_action_with_jump", - "80268074" : "act_butt_slide", - "802680d4" : "act_hold_butt_slide", - "80268168" : "act_crouch_slide", - "80268338" : "act_slide_kick_slide", - "802684ac" : "stomach_slide_action", - "802685c0" : "act_stomach_slide", - "80268608" : "act_hold_stomach_slide", - "80268684" : "act_dive_slide", - "802687b8" : "common_ground_knockback_action", - "802689f8" : "act_hard_backward_ground_kb", - "80268adc" : "act_hard_forward_ground_kb", - "80268b64" : "act_backward_ground_kb", - "80268bb0" : "act_forward_ground_kb", - "80268bfc" : "act_soft_backward_ground_kb", - "80268c48" : "act_soft_forward_ground_kb", - "80268c94" : "act_ground_bonk", - "80268d04" : "act_death_exit_land", - "80268dcc" : "common_landing_action", - "80268f78" : "common_landing_cancels", - "80269108" : "act_jump_land", - "80269170" : "act_freefall_land", - "802691d8" : "act_side_flip_land", - "80269264" : "act_hold_jump_land", - "80269300" : "act_hold_freefall_land", - "8026939c" : "act_long_jump_land", - "8026947c" : "act_double_jump_land", - "802694e4" : "act_triple_jump_land", - "80269588" : "act_backflip_land", - "80269640" : "quicksand_jump_land_action", - "80269788" : "act_quicksand_jump_land", - "802697dc" : "act_hold_quicksand_jump_land", - "80269830" : "check_common_moving_cancels", - "80269954" : "mario_execute_moving_action", - "80269f40" : "play_flip_sounds", - "80269fc0" : "play_far_fall_sound", - "8026a090" : "play_knockback_sound", - "8026a12c" : "lava_boost_on_wall", - "8026a224" : "check_fall_damage", - "8026a400" : "check_kick_or_dive_in_air", - "8026a494" : "should_get_stuck_in_ground", - "8026a598" : "check_fall_damage_or_get_stuck", - "8026a62c" : "check_horizontal_wind", - "8026a818" : "update_air_with_turn", - "8026aa48" : "update_air_without_turn", - "8026acd8" : "update_lava_boost_or_twirling", - "8026ae5c" : "update_flying_yaw", - "8026b004" : "update_flying_pitch", - "8026b17c" : "update_flying", - "8026b444" : "common_air_action_step", - "8026b6a0" : "act_jump", - "8026b740" : "act_double_jump", - "8026b814" : "act_triple_jump", - "8026b90c" : "act_backflip", - "8026b9ac" : "act_freefall", - "8026bab8" : "act_hold_jump", - "8026bbb4" : "act_hold_freefall", - "8026bcc0" : "act_side_flip", - "8026bdcc" : "act_wall_kick_air", - "8026be78" : "act_long_jump", - "8026bf40" : "act_riding_shell_air", - "8026c034" : "act_twirling", - "8026c1e0" : "act_dive", - "8026c4b8" : "act_air_throw", - "8026c5d0" : "act_water_jump", - "8026c738" : "act_hold_water_jump", - "8026c880" : "act_steep_jump", - "8026c9fc" : "act_ground_pound", - "8026cd0c" : "act_burning_jump", - "8026ce50" : "act_burning_fall", - "8026cf28" : "act_crazy_box_bounce", - "8026d1b0" : "common_air_knockback_step", - "8026d33c" : "check_wall_kick", - "8026d3c8" : "act_backward_air_kb", - "8026d43c" : "act_forward_air_kb", - "8026d4b0" : "act_hard_backward_air_kb", - "8026d508" : "act_hard_forward_air_kb", - "8026d560" : "act_thrown_backward", - "8026d608" : "act_thrown_forward", - "8026d6fc" : "act_soft_bonk", - "8026d770" : "act_getting_blown", - "8026d988" : "act_air_hit_wall", - "8026db54" : "act_forward_rollout", - "8026dcf4" : "act_backward_rollout", - "8026de98" : "act_butt_slide_air", - "8026e088" : "act_hold_butt_slide_air", - "8026e2b4" : "act_lava_boost", - "8026e59c" : "act_slide_kick", - "8026e810" : "act_jump_kick", - "8026e968" : "act_shot_from_cannon", - "8026ec00" : "act_flying", - "8026f158" : "act_riding_hoot", - "8026f2ec" : "act_flying_triple_jump", - "8026f614" : "act_top_of_pole_jump", - "8026f660" : "act_vertical_wind", - "8026f840" : "act_special_triple_jump", - "8026fa18" : "check_common_airborne_cancels", - "8026fb04" : "mario_execute_airborne_action", - "8027499c" : "mario_execute_submerged_action", - "80274eb0" : "animated_stationary_ground_step", - "80274f10" : "mario_update_punch_sequence", - "80275328" : "act_punching", - "8027546c" : "act_picking_up", - "802755fc" : "act_dive_picking_up", - "802756c8" : "act_placing_down", - "80275794" : "act_throwing", - "802758c0" : "act_heavy_throw", - "802759b4" : "act_stomach_slide_stop", - "80275a80" : "act_picking_up_bowser", - "80275b34" : "act_holding_bowser", - "80275e78" : "act_releasing_bowser", - "80275f0c" : "check_common_object_cancels", - "80275fe0" : "mario_execute_object_action", - "802761d0" : "geo_envfx_main", - "802763d4" : "geo_skybox_main", - "802764b0" : "geo_draw_mario_head_goddard", - "8027684c" : "bhv_toad_message_loop", - "80276910" : "bhv_toad_message_init", - "80276bb8" : "bhv_unlock_door_star_init", - "80276ccc" : "bhv_unlock_door_star_loop", - "802770a4" : "geo_mirror_mario_set_alpha", - "80277150" : "geo_switch_mario_stand_run", - "802771bc" : "geo_switch_mario_eyes", - "80277294" : "geo_mario_tilt_torso", - "802773a4" : "geo_mario_head_rotation", - "802774f4" : "geo_switch_mario_hand", - "802775cc" : "geo_mario_hand_foot_scaler", - "802776d8" : "geo_switch_mario_cap_effect", - "80277740" : "geo_switch_mario_cap_on_off", - "80277824" : "geo_mario_rotate_wing_cap_wings", - "8027795c" : "geo_switch_mario_hand_grab_pos", - "80277b14" : "geo_render_mirror_mario", - "80277d6c" : "geo_mirror_mario_backface_culling", - "80277ee0" : "set_segment_base_addr", - "80277f20" : "get_segment_base_addr", - "80277f50" : "segmented_to_virtual", - "80277fa8" : "virtual_to_segmented", - "80277ff0" : "move_segment_table_to_dmem", - "80278074" : "main_pool_init", - "80278120" : "main_pool_alloc", - "80278238" : "main_pool_free", - "80278358" : "main_pool_realloc", - "802783c8" : "main_pool_available", - "802783e8" : "main_pool_push_state", - "80278498" : "main_pool_pop_state", - "8027868c" : "load_segment", - "802786f0" : "load_to_fixed_pool_addr", - "802787d8" : "load_segment_decompress", - "802788b4" : "load_segment_decompress_heap", - "80278974" : "load_engine_code_segment", - "80278a14" : "alloc_only_pool_init", - "80278ab8" : "alloc_only_pool_alloc", - "80278b28" : "alloc_only_pool_resize", - "80278b98" : "mem_pool_init", - "80278c58" : "mem_pool_alloc", - "80278d74" : "mem_pool_free", - "80278f2c" : "alloc_display_list", - "80279028" : "func_80278A78", - "80279084" : "load_patchable_table", - "80279840" : "save_file_do_save", - "802798fc" : "save_file_erase", - "80279960" : "save_file_copy", - "802799dc" : "save_file_load_all", - "80279bc8" : "save_file_reload", - "80279c44" : "save_file_collect_star_or_key", - "80279e44" : "save_file_exists", - "80279e80" : "save_file_get_max_coin_score", - "80279f80" : "save_file_get_course_star_count", - "8027a010" : "save_file_get_total_star_count", - "8027a0a8" : "save_file_set_flags", - "8027a0f4" : "save_file_clear_flags", - "8027a16c" : "save_file_get_flags", - "8027a1c8" : "save_file_get_star_flags", - "8027a23c" : "save_file_set_star_flags", - "8027a310" : "save_file_get_course_coin_score", - "8027a340" : "save_file_is_cannon_unlocked", - "8027a390" : "save_file_set_cannon_unlocked", - "8027a418" : "save_file_set_cap_pos", - "8027a4ac" : "save_file_get_cap_pos", - "8027a564" : "save_file_set_sound_mode", - "8027a5b4" : "save_file_get_sound_mode", - "8027a5d4" : "save_file_move_cap_to_default_location", - "8027a698" : "disable_warp_checkpoint", - "8027a6b0" : "check_if_should_set_warp_checkpoint", - "8027a718" : "check_warp_checkpoint", - "8027a7d0" : "override_viewport_and_clip", - "8027a83c" : "set_warp_transition_rgb", - "8027a8b0" : "print_intro_text", - "8027a93c" : "get_mario_spawn_type", - "8027a9c8" : "area_get_warp_node", - "8027aa28" : "area_get_warp_node_from_params", - "8027aa74" : "load_obj_warp_nodes", - "8027ab04" : "clear_areas", - "8027ad74" : "clear_area_graph_nodes", - "8027ae44" : "load_area", - "8027af48" : "unload_area", - "8027afbc" : "load_mario_area", - "8027b038" : "unload_mario_area", - "8027b0c0" : "change_area", - "8027b164" : "area_update_objects", - "8027b1a0" : "play_transition", - "8027b35c" : "play_transition_after_delay", - "8027b3b4" : "render_game", - "8027cf38" : "geo_set_animation_globals", - "8027da84" : "geo_process_held_object", - "8027de68" : "geo_try_process_children", - "8027dea8" : "geo_process_node_and_siblings", - "8027e130" : "geo_process_root", - "8027e3e0" : "profiler_log_thread5_time", - "8027e490" : "profiler_log_thread4_time", - "8027e520" : "profiler_log_gfx_time", - "8027e5cc" : "profiler_log_vblank_time", - "8027e65c" : "draw_profiler_bar", - "8027e958" : "draw_reference_profiler_bars", - "8027ebcc" : "draw_profiler_mode_1", - "8027eeac" : "draw_profiler_mode_0", - "8027f460" : "draw_profiler", - "8027f4e0" : "decompress", - "8027f590" : "set_camera_shake_from_hit", - "8027f8b8" : "set_environmental_camera_shake", - "8027f9f0" : "set_camera_shake_from_point", - "8027fb74" : "unused_set_camera_pitch_shake_env", - "8027fc18" : "calc_y_to_curr_floor", - "8027fe20" : "focus_on_mario", - "8027fff8" : "set_camera_height", - "80280368" : "look_down_slopes", - "802804f4" : "pan_ahead_of_player", - "802806a4" : "find_in_bounds_yaw_wdw_bob_thi", - "80280810" : "update_radial_camera", - "80280970" : "update_8_directions_camera", - "80280b00" : "radial_camera_move", - "80281188" : "lakitu_zoom", - "802813bc" : "radial_camera_input_default", - "802813ec" : "update_yaw_and_dist_from_c_up", - "8028146c" : "mode_radial_camera", - "80281588" : "mode_8_directions_camera", - "802816a0" : "update_outward_radial_camera", - "802817fc" : "mode_outward_radial_camera", - "80281904" : "update_parallel_tracking_camera", - "80282280" : "update_fixed_camera", - "802826a0" : "update_boss_fight_camera", - "80282c0c" : "unused_update_mode_5_camera", - "80282c3c" : "mode_boss_fight_camera", - "80282c7c" : "mode_parallel_tracking_camera", - "80282ce0" : "mode_fixed_camera", - "80282d78" : "update_behind_mario_camera", - "80283340" : "mode_behind_mario", - "80283578" : "update_slide_camera", - "802839e4" : "mode_behind_mario_camera", - "80283a18" : "nop_update_water_camera", - "80283a34" : "mode_water_surface_camera", - "80283a68" : "update_mario_camera", - "80283af8" : "update_default_camera", - "80284cb8" : "mode_default_camera", - "80284cfc" : "mode_lakitu_camera", - "80284d38" : "mode_mario_camera", - "80284d74" : "update_spiral_stairs_camera", - "802850ac" : "mode_spiral_stairs_camera", - "802850ec" : "update_slide_or_0f_camera", - "802851dc" : "mode_slide_camera", - "8028526c" : "store_lakitu_cam_info_for_c_up", - "802852f4" : "set_mode_c_up", - "80285370" : "exit_c_up", - "80285808" : "update_c_up", - "802858a4" : "move_mario_head_c_up", - "80285a2c" : "move_into_c_up", - "80285d20" : "mode_c_up_camera", - "80285ed8" : "update_in_cannon", - "80285f60" : "mode_cannon_camera", - "8028603c" : "transition_next_state", - "80286088" : "transition_to_camera_mode", - "80286188" : "set_camera_mode", - "80286420" : "update_lakitu", - "802868f8" : "update_camera", - "80286f68" : "reset_camera", - "8028724c" : "init_camera", - "802879ec" : "zoom_out_if_paused_and_outside", - "80287bc4" : "select_mario_cam_mode", - "80287be0" : "create_camera", - "80287cb8" : "update_graph_node_camera", - "80287d30" : "geo_camera_main", - "80287dc0" : "stub_camera_2", - "80287dd4" : "stub_camera_3", - "80287de8" : "vec3f_sub", - "80287e28" : "object_pos_to_vec3f", - "80287e50" : "vec3f_to_object_pos", - "80287e78" : "unused_object_angle_to_vec3s", - "80287ea0" : "evaluate_cubic_spline", - "802882e4" : "move_point_along_spline", - "80288624" : "cam_select_alt_mode", - "80288718" : "set_cam_angle", - "80288888" : "set_handheld_shake", - "802889b0" : "shake_camera_handheld", - "80288ce4" : "find_c_buttons_pressed", - "80288e68" : "update_camera_hud_status", - "80288f5c" : "collide_with_walls", - "80289198" : "vec3f_compare", - "80289214" : "clamp_pitch", - "802892d8" : "is_within_100_units_of_mario", - "8028935c" : "set_or_approach_f32_asymptotic", - "802893f4" : "approach_f32_asymptotic_bool", - "80289488" : "approach_f32_asymptotic", - "802894b4" : "approach_s16_asymptotic_bool", - "8028956c" : "approach_s16_asymptotic", - "80289610" : "approach_vec3f_asymptotic", - "80289684" : "set_or_approach_vec3f_asymptotic", - "802896f8" : "approach_vec3s_asymptotic", - "8028976c" : "camera_approach_s16_symmetric_bool", - "8028984c" : "camera_approach_s16_symmetric", - "8028993c" : "set_or_approach_s16_symmetric", - "802899cc" : "camera_approach_f32_symmetric_bool", - "80289b0c" : "camera_approach_f32_symmetric", - "80289c00" : "random_vec3s", - "80289d20" : "reduce_by_dist_from_camera", - "80289f88" : "clamp_positions_and_find_yaw", - "8028a080" : "calc_avoid_yaw", - "8028a0f4" : "is_surf_within_bounding_box", - "8028a4ec" : "is_behind_surface", - "8028a6bc" : "is_range_behind_surface", - "8028a7ec" : "is_mario_behind_surface", - "8028a834" : "scale_along_line", - "8028a8e8" : "is_pos_in_bounds", - "8028aa28" : "calculate_pitch", - "8028aad8" : "calculate_yaw", - "8028ab60" : "calculate_angles", - "8028ac28" : "calc_abs_dist", - "8028accc" : "calc_hor_dist", - "8028ad4c" : "rotate_in_xz", - "8028ae1c" : "rotate_in_yz", - "8028aef0" : "set_camera_pitch_shake", - "8028af4c" : "set_camera_yaw_shake", - "8028b00c" : "set_camera_roll_shake", - "8028b068" : "set_pitch_shake_from_point", - "8028b11c" : "set_yaw_shake_from_point", - "8028b1d0" : "increment_shake_offset", - "8028b218" : "shake_camera_pitch", - "8028b32c" : "shake_camera_yaw", - "8028b438" : "shake_camera_roll", - "8028b50c" : "offset_yaw_outward_radial", - "8028b724" : "cutscene_intro_peach_play_message_music", - "8028b754" : "cutscene_intro_peach_play_lakitu_flying_music", - "8028b784" : "play_camera_buzz_if_cdown", - "8028b7c4" : "play_camera_buzz_if_cbutton", - "8028b804" : "play_camera_buzz_if_c_sideways", - "8028b850" : "play_sound_cbutton_up", - "8028b884" : "play_sound_cbutton_down", - "8028b8b8" : "play_sound_cbutton_side", - "8028b8ec" : "play_sound_button_change_blocked", - "8028b920" : "play_sound_rbutton_changed", - "8028b954" : "play_sound_if_cam_switched_to_lakitu_or_mario", - "8028b9c4" : "radial_camera_input", - "8028bd34" : "trigger_cutscene_dialog", - "8028bd98" : "handle_c_button_movement", - "8028c038" : "clear_cutscene_vars", - "8028c13c" : "start_cutscene", - "8028c18c" : "determine_dance_cutscene", - "8028c26c" : "open_door_cutscene", - "8028c2c8" : "get_cutscene_from_mario_status", - "8028c7a0" : "warp_camera", - "8028c8f0" : "approach_camera_height", - "8028c9ac" : "stub_camera_4", - "8028c9cc" : "set_focus_rel_mario", - "8028cbf0" : "offset_rotated", - "8028cd94" : "offset_rotated_coords", - "8028cdec" : "determine_pushing_or_pulling_door", - "8028ce24" : "next_lakitu_state", - "8028d44c" : "set_camera_mode_fixed", - "8028d5ac" : "set_camera_mode_8_directions", - "8028d5fc" : "set_camera_mode_boss_fight", - "8028d658" : "set_camera_mode_close_cam", - "8028d698" : "set_camera_mode_radial", - "8028d79c" : "parallel_tracking_init", - "8028d888" : "set_fixed_cam_axis_sa_lobby", - "8028d92c" : "check_blocking_area_processing", - "8028da18" : "cam_rr_exit_building_side", - "8028da50" : "cam_rr_exit_building_top", - "8028daec" : "cam_rr_enter_building_window", - "8028db38" : "cam_rr_enter_building", - "8028dbb4" : "cam_rr_enter_building_side", - "8028dbf4" : "cam_cotmc_exit_waterfall", - "8028dc1c" : "cam_sl_snowman_head_8dir", - "8028dc70" : "cam_sl_free_roam", - "8028dca4" : "move_camera_through_floor_while_descending", - "8028dd48" : "cam_hmc_enter_maze", - "8028de2c" : "cam_hmc_elevator_black_hole", - "8028de5c" : "cam_hmc_elevator_maze_emergency_exit", - "8028de90" : "cam_hmc_elevator_lake", - "8028dec4" : "cam_hmc_elevator_maze", - "8028def8" : "cam_ssl_enter_pyramid_top", - "8028df24" : "cam_ssl_pyramid_center", - "8028df6c" : "cam_ssl_boss_room", - "8028dfb4" : "cam_thi_move_cam_through_tunnel", - "8028dfe8" : "cam_thi_look_through_tunnel", - "8028e01c" : "cam_bob_tower", - "8028e064" : "cam_bob_default_free_roam", - "8028e098" : "cam_castle_hmc_start_pool_cutscene", - "8028e0ec" : "cam_castle_lobby_entrance", - "8028e164" : "cam_castle_look_upstairs", - "8028e210" : "cam_castle_basement_look_downstairs", - "8028e298" : "cam_castle_enter_lobby", - "8028e300" : "cam_castle_enter_spiral_stairs", - "8028e38c" : "cam_castle_close_mode", - "8028e3b8" : "cam_castle_leave_lobby_sliding_door", - "8028e3f0" : "cam_castle_enter_lobby_sliding_door", - "8028e41c" : "cam_bbh_room_6", - "8028e450" : "cam_bbh_fall_off_roof", - "8028e47c" : "cam_bbh_fall_into_pool", - "8028e524" : "cam_bbh_room_1", - "8028e55c" : "cam_bbh_leave_front_door", - "8028e594" : "cam_bbh_room_2_lower", - "8028e5cc" : "cam_bbh_room_4", - "8028e604" : "cam_bbh_room_8", - "8028e63c" : "cam_bbh_room_5_library", - "8028e674" : "cam_bbh_room_5_library_to_hidden_transition", - "8028e6c4" : "cam_bbh_room_5_hidden_to_library_transition", - "8028e714" : "cam_bbh_room_5_hidden", - "8028e758" : "cam_bbh_room_3", - "8028e790" : "cam_bbh_room_7_mr_i", - "8028e7c8" : "cam_bbh_room_7_mr_i_to_coffins_transition", - "8028e818" : "cam_bbh_room_7_coffins_to_mr_i_transition", - "8028e868" : "cam_bbh_elevator_room_lower", - "8028e8a0" : "cam_bbh_room_0_back_entrance", - "8028e8cc" : "cam_bbh_elevator", - "8028e930" : "cam_bbh_room_12_upper", - "8028e974" : "cam_bbh_enter_front_door", - "8028e9a0" : "cam_bbh_room_2_library", - "8028e9d8" : "cam_bbh_room_2_library_to_trapdoor_transition", - "8028ea28" : "cam_bbh_room_2_trapdoor", - "8028ea60" : "cam_bbh_room_2_trapdoor_transition", - "8028eab0" : "cam_bbh_room_9_attic", - "8028eae8" : "cam_bbh_room_9_attic_transition", - "8028eb38" : "cam_bbh_room_9_mr_i_transition", - "8028eb88" : "cam_bbh_room_13_balcony", - "8028ebc0" : "cam_bbh_room_0", - "8028ec04" : "cam_ccm_enter_slide_shortcut", - "8028ec2c" : "cam_ccm_leave_slide_shortcut", - "8028ec58" : "surface_type_modes", - "8028ed30" : "set_mode_if_not_set_by_surface", - "8028ed98" : "surface_type_modes_thi", - "8028eeb0" : "camera_course_processing", - "8028f670" : "resolve_geometry_collisions", - "8028f914" : "rotate_camera_around_walls", - "8028fc9c" : "find_mario_floor_and_ceil", - "8028fe24" : "start_object_cutscene", - "8028fe58" : "start_object_cutscene_without_focus", - "8028fe84" : "unused_dialog_cutscene_response", - "8028ff04" : "cutscene_object_with_dialog", - "8028ffc8" : "cutscene_object_without_dialog", - "8029000c" : "cutscene_object", - "80290098" : "update_camera_yaw", - "802900e0" : "cutscene_reset_spline", - "80290104" : "stop_cutscene_and_retrieve_stored_info", - "80290168" : "cap_switch_save", - "802901a4" : "init_spline_point", - "802901fc" : "copy_spline_segment", - "802903b8" : "cutscene_common_set_dialog_state", - "802904a8" : "cutscene_intro_peach_start_letter_music", - "802904e4" : "cutscene_intro_peach_start_flying_music", - "8029051c" : "reset_pan_distance", - "8029053c" : "player2_rotate_cam", - "80290784" : "store_info_cannon", - "802907f4" : "retrieve_info_cannon", - "80290864" : "store_info_star", - "802908e8" : "retrieve_info_star", - "802909d0" : "pan_camera", - "80290a5c" : "cutscene_shake_explosion", - "80290abc" : "rotate_and_move_vec3f", - "80290b54" : "set_flag_post_door", - "80290ba4" : "cutscene_soften_music", - "80290bd8" : "cutscene_unsoften_music", - "80290c1c" : "cutscene_unused_start", - "80290c30" : "cutscene_unused_loop", - "80290c44" : "cutscene_ending_mario_fall_start", - "80290c9c" : "cutscene_ending_mario_fall_focus_mario", - "80290d90" : "cutscene_ending_mario_fall", - "80290e00" : "cutscene_ending_mario_land_closeup", - "80290e74" : "cutscene_ending_reset_spline", - "80290eb0" : "cutscene_ending_fly_up_to_window", - "80290f1c" : "cutscene_ending_stars_free_peach", - "80290f8c" : "cutscene_ending_mario_land", - "80291074" : "cutscene_ending_peach_appear_closeup", - "80291108" : "cutscene_ending_peach_appears", - "802911c8" : "cutscene_ending_peach_descends_start", - "80291208" : "cutscene_ending_follow_peach_descent", - "8029127c" : "cutscene_ending_peach_descent_lower_focus", - "802912b8" : "cutscene_ending_peach_descent_back_to_mario", - "80291354" : "cutscene_ending_peach_descends", - "8029142c" : "cutscene_ending_mario_to_peach", - "802914cc" : "cutscene_ending_look_up_at_castle", - "80291514" : "cutscene_ending_peach_wakeup", - "802915d4" : "cutscene_ending_dialog", - "80291654" : "cutscene_ending_kiss_closeup", - "802916b8" : "cutscene_ending_kiss_here_we_go", - "80291774" : "cutscene_ending_kiss", - "802917e4" : "cutscene_ending_look_at_sky", - "8029184c" : "cutscene_ending_zoom_fov", - "80291870" : "cutscene_ending_cake_for_mario", - "80291924" : "cutscene_ending_stop", - "80291964" : "cutscene_grand_star_start", - "802919dc" : "cutscene_grand_star_front_of_mario", - "80291ab4" : "cutscene_grand_star_mario_jump", - "80291b18" : "cutscene_grand_star_accel_cvar2", - "80291b68" : "cutscene_grand_star_approach_mario", - "80291bf4" : "cutscene_grand_star_move_cvar2", - "80291c3c" : "cutscene_grand_star_focus_mario", - "80291cd0" : "cutscene_grand_star", - "80291db0" : "cutscene_grand_star_fly_start", - "80291e84" : "cutscene_grand_star_fly_move_to_mario", - "80291f18" : "cutscene_grand_star_fly_mario_offscreen", - "80292038" : "cutscene_grand_star_fly_app_cvars", - "80292164" : "cutscene_grand_star_fly", - "802921fc" : "focus_in_front_of_mario", - "8029228c" : "cutscene_dance_move_to_mario", - "80292324" : "cutscene_dance_rotate", - "80292370" : "cutscene_dance_rotate_move_back", - "802923b8" : "cutscene_dance_rotate_move_towards_mario", - "80292414" : "cutscene_dance_default_focus_mario", - "8029244c" : "cutscene_dance_rotate_focus_mario", - "80292484" : "cutscene_dance_shake_fov", - "802924b8" : "cutscene_dance_default_rotate", - "80292628" : "star_dance_bound_yaw", - "802926dc" : "cutscene_dance_closeup_start", - "802927d0" : "cutscene_dance_closeup_focus_mario", - "80292868" : "cutscene_dance_closeup_fly_above", - "80292974" : "cutscene_dance_closeup_fly_closer", - "80292a20" : "cutscene_dance_closeup_zoom", - "80292a4c" : "cutscene_dance_closeup_shake_fov", - "80292a80" : "cutscene_dance_closeup", - "80292c00" : "cutscene_dance_fly_away_start", - "80292d80" : "cutscene_dance_fly_away_approach_mario", - "80292e2c" : "cutscene_dance_fly_away_focus_mario", - "80292ec4" : "cutscene_pan_cvar9", - "80292f40" : "cutscene_dance_fly_rotate_around_mario", - "80292f98" : "cutscene_dance_fly_away_rotate_while_flying", - "80292fe4" : "cutscene_dance_fly_away_shake_fov", - "80293018" : "cutscene_dance_fly_away", - "802930f0" : "cutscene_key_dance_jump_cvar", - "80293164" : "cutscene_key_dance_jump_closeup", - "802931c0" : "cutscene_key_dance_jump_lower_left", - "80293220" : "cutscene_key_dance_jump_above", - "8029328c" : "cutscene_key_dance_jump_last", - "802932f4" : "cutscene_key_dance_shake_fov", - "80293328" : "cutscene_key_dance_handheld_shake", - "80293354" : "cutscene_key_dance_focus_mario", - "8029338c" : "cutscene_key_dance", - "80293488" : "cutscene_bowser_area_shake_fov", - "802934b4" : "cutscene_bowser_area_start_bowser_walking", - "802934d8" : "cutscene_bowser_arena_set_pos", - "80293548" : "cutscene_bowser_arena_focus_sine", - "802935e0" : "cutscene_bowser_arena_set_focus", - "80293624" : "cutscene_bowser_arena_adjust_offsets", - "8029369c" : "cutscene_bowser_arena_pan_left", - "802936dc" : "cutscene_bowser_arena_mario_dialog", - "80293708" : "cutscene_stop_dialog", - "80293734" : "cutscene_bowser_arena_start", - "802937e8" : "bowser_fight_intro_dialog", - "8029386c" : "cutscene_bowser_arena_dialog", - "802938c8" : "cutscene_bowser_arena_end", - "80293944" : "cutscene_bowser_arena", - "80293abc" : "cutscene_star_spawn_store_info", - "80293ae8" : "cutscene_star_spawn_focus_star", - "80293b70" : "cutscene_star_spawn_update_boss_fight", - "80293bf4" : "cutscene_star_spawn_fly_back", - "80293c2c" : "cutscene_star_spawn", - "80293cb0" : "cutscene_star_spawn_back", - "80293d5c" : "cutscene_star_spawn_end", - "80293d90" : "cutscene_exit_waterfall_warp", - "80293dd4" : "cutscene_exit_to_castle_grounds_focus_mario", - "80293e7c" : "cutscene_exit_waterfall", - "80293ed8" : "cutscene_exit_to_castle_grounds_end", - "80293f2c" : "cutscene_exit_fall_to_castle_grounds_warp", - "80293f70" : "cutscene_exit_fall_to_castle_grounds", - "80293fcc" : "cutscene_red_coin_star_start", - "80294024" : "cutscene_red_coin_star_focus_xz", - "80294088" : "cutscene_red_coin_star_focus_y", - "802940cc" : "cutscene_red_coin_star_look_up_at_star", - "8029410c" : "cutscene_red_coin_star_warp", - "802942cc" : "cutscene_red_coin_star_set_fov", - "802942f0" : "cutscene_red_coin_star", - "802943d4" : "cutscene_red_coin_star_end", - "80294428" : "cutscene_goto_cvar_pos", - "80294718" : "cutscene_prepare_cannon_start", - "802947a4" : "cutscene_prepare_cannon_fly_to_cannon", - "8029480c" : "cannon_approach_prev", - "802948a0" : "cutscene_prepare_cannon_fly_back", - "80294a14" : "cutscene_prepare_cannon", - "80294a94" : "cutscene_prepare_cannon_end", - "80294ae8" : "water_death_move_to_mario_side", - "80294b78" : "death_goto_mario", - "80294bb4" : "cutscene_death_standing_start", - "80294c28" : "cutscene_death_standing_goto_mario", - "80294c5c" : "cutscene_death_standing", - "80294cc4" : "cutscene_death_stomach_start", - "80294d48" : "cutscene_death_stomach_goto_mario", - "80294db4" : "cutscene_death_stomach", - "80294e24" : "cutscene_bbh_death_start", - "80294ea8" : "cutscene_bbh_death_goto_mario", - "80294ee8" : "cutscene_bbh_death", - "80294f58" : "cutscene_quicksand_death_start", - "80294f94" : "cutscene_quicksand_death_goto_mario", - "80294fec" : "cutscene_quicksand_death", - "802950b0" : "cutscene_suffocation_fly_away", - "80295140" : "cutscene_suffocation_stay_above_gas", - "802951f0" : "cutscene_suffocation_rotate", - "80295270" : "cutscene_suffocation", - "80295310" : "cutscene_enter_pool_start", - "802953dc" : "cutscene_enter_pool_loop", - "80295418" : "cutscene_enter_pool", - "80295480" : "cutscene_pyramid_top_explode_start", - "802954ec" : "cutscene_pyramid_top_explode_zoom_in", - "80295518" : "cutscene_pyramid_top_explode_focus", - "80295580" : "cutscene_pyramid_top_explode_warp", - "80295670" : "cutscene_pyramid_top_explode_closeup", - "80295740" : "cutscene_pyramid_top_explode_cam_shake", - "8029576c" : "cutscene_pyramid_top_explode_warp_back", - "802957c8" : "cutscene_pyramid_top_explode", - "80295894" : "cutscene_pyramid_top_explode_end", - "802958d4" : "cutscene_enter_pyramid_top_start", - "80295930" : "cutscene_enter_pyramid_top", - "80295a58" : "cutscene_dialog_start", - "80295bf0" : "cutscene_dialog_move_mario_shoulder", - "80295e24" : "cutscene_dialog_create_dialog_box", - "80295e8c" : "cutscene_dialog", - "80295fb0" : "cutscene_dialog_set_flag", - "80295fd8" : "cutscene_dialog_end", - "80296020" : "cutscene_read_message_start", - "80296160" : "cutscene_read_message", - "802962c8" : "cutscene_read_message_set_flag", - "802962f0" : "cutscene_read_message_end", - "80296318" : "cutscene_exit_succ_start", - "802963b8" : "cutscene_non_painting_set_cam_pos", - "8029652c" : "cutscene_non_painting_set_cam_focus", - "8029665c" : "cutscene_exit_bowser_succ_focus_left", - "8029669c" : "cutscene_exit_bowser_key_toss_shake", - "802966e4" : "cutscene_exit_succ_shake_landing", - "80296710" : "cutscene_exit_bowser_succ", - "802967c4" : "cutscene_non_painting_end", - "8029685c" : "cutscene_exit_non_painting_succ_override_cvar", - "802968a0" : "cutscene_exit_non_painting_succ", - "8029695c" : "cutscene_non_painting_death_start", - "802969f8" : "cutscene_exit_bowser_death", - "80296a64" : "cutscene_non_painting_death_override_offset", - "80296b30" : "cutscene_non_painting_death", - "80296bc8" : "cutscene_cap_switch_press_start", - "80296c4c" : "cutscene_cap_switch_press_rotate_around_mario", - "80296d60" : "cutscene_cap_switch_press_lower_cam", - "80296da8" : "cutscene_cap_switch_press_approach_mario", - "80296eb4" : "cutscene_cap_switch_press_pan_left", - "80296f38" : "cutscene_cap_switch_press_create_dialog", - "80296fa8" : "cutscene_cap_switch_press", - "80297148" : "cutscene_unlock_key_door_start", - "8029720c" : "cutscene_unlock_key_door_approach_mario", - "80297290" : "cutscene_unlock_key_door_focus_lock", - "802972ec" : "cutscene_unlock_key_door_stub", - "80297300" : "cutscene_unlock_key_door_fly_back", - "80297384" : "cutscene_unlock_key_door_fov_shake", - "802973b0" : "cutscene_unlock_key_door", - "80297464" : "intro_peach_move_camera_start_to_pipe", - "80297560" : "peach_letter_text", - "8029758c" : "play_sound_peach_reading_letter", - "802975c4" : "cutscene_intro_peach_start_to_pipe_spline", - "8029762c" : "cutscene_intro_peach_dialog", - "802976bc" : "cutscene_intro_peach_follow_pipe_spline", - "80297728" : "cutscene_intro_peach_clear_cutscene_status", - "80297748" : "cutscene_intro_peach_zoom_fov", - "80297784" : "cutscene_intro_peach_reset_spline", - "802977c8" : "cutscene_intro_peach_handheld_shake_off", - "802977f4" : "intro_pipe_exit_text", - "80297820" : "play_sound_intro_turn_on_hud", - "8029784c" : "cutscene_intro_peach_fly_to_pipe", - "80297908" : "cutscene_intro_peach_mario_appears", - "80297a38" : "cutscene_intro_peach_reset_fov", - "80297a64" : "cutscene_intro_peach_letter", - "80297b58" : "cutscene_end_waving_start", - "80297b84" : "cutscene_end_waving", - "80297c14" : "cutscene_credits_reset_spline", - "80297c40" : "cutscene_credits", - "802980dc" : "cutscene_sliding_doors_open_start", - "8029819c" : "cutscene_sliding_doors_open_set_cvars", - "80298218" : "cutscene_sliding_doors_go_under_doorway", - "80298254" : "cutscene_sliding_doors_fly_back_up", - "80298290" : "cutscene_sliding_doors_follow_mario", - "802983b4" : "cutscene_sliding_doors_open", - "80298458" : "cutscene_double_doors_end", - "802984a0" : "cutscene_enter_painting_stub", - "802984b4" : "cutscene_enter_painting", - "802987b0" : "cutscene_exit_painting_start", - "8029894c" : "cutscene_exit_painting_move_to_mario", - "802989e8" : "cutscene_exit_painting_move_to_floor", - "80298af8" : "cutscene_exit_painting", - "80298ba0" : "cutscene_unused_exit_start", - "80298c2c" : "cutscene_unused_exit_focus_mario", - "80298ccc" : "cutscene_exit_painting_end", - "80298d44" : "cutscene_enter_cannon_end", - "80298d9c" : "cutscene_enter_cannon_raise", - "80298fe8" : "cutscene_enter_cannon_start", - "80299100" : "cutscene_door_start", - "80299154" : "cutscene_door_fix_cam", - "802991a8" : "cutscene_door_loop", - "802991f0" : "cutscene_door_move_behind_mario", - "802992cc" : "cutscene_door_follow_mario", - "80299360" : "cutscene_door_end", - "80299404" : "cutscene_door_mode", - "802994e8" : "play_cutscene", - "8029a2f8" : "cutscene_event", - "8029a37c" : "cutscene_spawn_obj", - "8029a3b4" : "set_fov_shake", - "8029a41c" : "set_fov_shake_from_point", - "8029a4d0" : "shake_camera_fov", - "8029a5e8" : "set_fov_30", - "8029a60c" : "approach_fov_20", - "8029a64c" : "set_fov_45", - "8029a670" : "set_fov_29", - "8029a694" : "zoom_fov_30", - "8029a6f4" : "fov_default", - "8029a858" : "approach_fov_30", - "8029a894" : "approach_fov_60", - "8029a8d0" : "approach_fov_45", - "8029a968" : "approach_fov_80", - "8029a9a4" : "set_fov_bbh", - "8029aa3c" : "geo_camera_fov", - "8029ab94" : "set_fov_function", - "8029abb0" : "cutscene_set_fov_shake_preset", - "8029ac30" : "set_fov_shake_from_point_preset", - "8029aef8" : "obj_rotate_towards_point", - "8029af98" : "intro_peach_set_pos_and_opacity", - "8029b08c" : "bhv_intro_peach_loop", - "8029b28c" : "intro_lakitu_set_offset_from_camera", - "8029b358" : "intro_lakitu_set_focus", - "8029b3c8" : "intro_lakitu_set_pos_and_focus", - "8029b49c" : "bhv_intro_lakitu_loop", - "8029bde4" : "bhv_end_birds_1_loop", - "8029bf64" : "bhv_end_birds_2_loop", - "8029c0e4" : "spawn_child_obj_relative", - "8029c254" : "bhv_intro_scene_loop", - "8029c770" : "nop_change_course", - "8029c780" : "copy_mario_state_to_object", - "8029c9cc" : "spawn_particle", - "8029ca58" : "bhv_mario_update", - "8029cb34" : "update_objects_starting_at", - "8029cbc8" : "update_objects_during_time_stop", - "8029cd28" : "update_objects_in_list", - "8029cd98" : "unload_deactivated_objects_in_list", - "8029ce58" : "set_object_respawn_info_bits", - "8029cedc" : "unload_objects_from_area", - "8029cfb0" : "spawn_objects_from_info", - "8029d1d8" : "stub_obj_list_processor_1", - "8029d1e8" : "clear_objects", - "8029d324" : "update_terrain_objects", - "8029d374" : "update_non_terrain_objects", - "8029d428" : "unload_deactivated_objects", - "8029d690" : "update_objects", - "8029d890" : "geo_update_projectile_pos_from_parent", - "8029d924" : "geo_update_layer_transparency", - "8029db48" : "geo_switch_anim_state", - "8029dbd4" : "geo_switch_area", - "8029dcd4" : "obj_update_pos_from_parent_transformation", - "8029dda8" : "obj_apply_scale_to_matrix", - "8029de80" : "create_transformation_from_matrices", - "8029e1b0" : "obj_set_held_state", - "8029e27c" : "lateral_dist_between_objects", - "8029e2f8" : "dist_between_objects", - "8029e398" : "cur_obj_forward_vel_approach_upward", - "8029e3e8" : "approach_f32_signed", - "8029e494" : "approach_f32_symmetric", - "8029e530" : "approach_s16_symmetric", - "8029e5ec" : "cur_obj_rotate_yaw_toward", - "8029e694" : "obj_angle_to_object", - "8029e714" : "obj_turn_toward_object", - "8029e8bc" : "obj_set_parent_relative_pos", - "8029e914" : "obj_set_pos", - "8029e96c" : "obj_set_angle", - "8029e9ac" : "spawn_object_abs_with_rot", - "8029ea24" : "spawn_object_rel_with_rot", - "8029eaac" : "spawn_obj_with_transform_flags", - "8029eb04" : "spawn_water_droplet", - "8029ed20" : "spawn_object_at_origin", - "8029edcc" : "spawn_object", - "8029ee24" : "try_to_spawn_object", - "8029eeb8" : "spawn_object_with_scale", - "8029ef64" : "spawn_object_relative", - "8029effc" : "spawn_object_relative_with_scale", - "8029f070" : "cur_obj_move_using_vel", - "8029f0c8" : "obj_copy_graph_y_offset", - "8029f0e0" : "obj_copy_pos_and_angle", - "8029f120" : "obj_copy_pos", - "8029f148" : "obj_copy_angle", - "8029f188" : "obj_set_gfx_pos_from_pos", - "8029f1b0" : "obj_init_animation", - "8029f200" : "linear_mtxf_mul_vec3f", - "8029f274" : "linear_mtxf_transpose_mul_vec3f", - "8029f2ec" : "obj_apply_scale_to_transform", - "8029f3a8" : "obj_copy_scale", - "8029f3d0" : "obj_scale_xyz", - "8029f404" : "obj_scale", - "8029f430" : "cur_obj_scale", - "8029f464" : "cur_obj_init_animation", - "8029f4b4" : "cur_obj_init_animation_with_sound", - "8029f514" : "cur_obj_init_animation_with_accel_and_sound", - "8029f59c" : "obj_init_animation_with_sound", - "8029f600" : "cur_obj_enable_rendering_and_become_tangible", - "8029f620" : "cur_obj_enable_rendering", - "8029f644" : "cur_obj_disable_rendering_and_become_intangible", - "8029f66c" : "cur_obj_disable_rendering", - "8029f694" : "cur_obj_unhide", - "8029f6bc" : "cur_obj_hide", - "8029f6e0" : "cur_obj_set_pos_relative", - "8029f7d8" : "cur_obj_set_pos_relative_to_parent", - "8029f820" : "cur_obj_enable_rendering_2", - "8029f848" : "cur_obj_unused_init_on_floor", - "8029f8ec" : "obj_set_face_angle_to_move_angle", - "8029f914" : "get_object_list_from_behavior", - "8029f95c" : "cur_obj_nearest_object_with_behavior", - "8029f998" : "cur_obj_dist_to_nearest_object_with_behavior", - "8029f9ec" : "cur_obj_find_nearest_object_with_behavior", - "8029fb1c" : "find_unimportant_object", - "8029fb68" : "count_unimportant_objects", - "8029fbdc" : "count_objects_with_behavior", - "8029fc9c" : "cur_obj_find_nearby_held_actor", - "8029fdb4" : "cur_obj_change_action", - "8029fe00" : "cur_obj_set_vel_from_mario_vel", - "8029fe6c" : "cur_obj_reverse_animation", - "8029fea4" : "cur_obj_extend_animation_if_at_end", - "8029ff04" : "cur_obj_check_if_near_animation_end", - "8029ffa4" : "cur_obj_check_if_at_animation_end", - "802a0008" : "cur_obj_check_anim_frame", - "802a0050" : "cur_obj_check_anim_frame_in_range", - "802a00ac" : "cur_obj_check_frame_prior_current_frame", - "802a0114" : "mario_is_in_air_action", - "802a0154" : "mario_is_dive_sliding", - "802a0198" : "cur_obj_set_y_vel_and_animation", - "802a01d8" : "cur_obj_unrender_and_reset_state", - "802a0380" : "cur_obj_get_thrown_or_placed", - "802a0474" : "cur_obj_get_dropped", - "802a04c0" : "cur_obj_set_model", - "802a04f0" : "mario_set_flag", - "802a0514" : "cur_obj_clear_interact_status_flag", - "802a0568" : "obj_mark_for_deletion", - "802a057c" : "cur_obj_disable", - "802a05b4" : "cur_obj_become_intangible", - "802a05d4" : "cur_obj_become_tangible", - "802a05f0" : "obj_become_tangible", - "802a0604" : "cur_obj_update_floor_height", - "802a064c" : "cur_obj_update_floor_height_and_get_floor", - "802a079c" : "cur_obj_apply_drag_xz", - "802a0e68" : "cur_obj_move_y", - "802a113c" : "cur_obj_unused_resolve_wall_collisions", - "802a11a8" : "abs_angle_diff", - "802a120c" : "cur_obj_move_xz_using_fvel_and_yaw", - "802a12a4" : "cur_obj_move_y_with_terminal_vel", - "802a1308" : "cur_obj_compute_vel_xz", - "802a1370" : "increment_velocity_toward_range", - "802a1424" : "obj_check_if_collided_with_object", - "802a148c" : "cur_obj_set_behavior", - "802a14c4" : "obj_set_behavior", - "802a14fc" : "cur_obj_has_behavior", - "802a1554" : "obj_has_behavior", - "802a15ac" : "cur_obj_lateral_dist_from_mario_to_home", - "802a1634" : "cur_obj_lateral_dist_to_home", - "802a16ac" : "cur_obj_outside_home_square", - "802a1774" : "cur_obj_outside_home_rectangle", - "802a184c" : "cur_obj_set_pos_to_home", - "802a188c" : "cur_obj_set_pos_to_home_and_stop", - "802a18dc" : "cur_obj_shake_y", - "802a1930" : "cur_obj_start_cam_event", - "802a1960" : "set_mario_interact_hoot_if_in_range", - "802a19ac" : "obj_set_billboard", - "802a19c8" : "cur_obj_set_hitbox_radius_and_height", - "802a19f0" : "cur_obj_set_hurtbox_radius_and_height", - "802a1b34" : "obj_spawn_loot_blue_coins", - "802a1b8c" : "obj_spawn_loot_yellow_coins", - "802a1bdc" : "cur_obj_spawn_loot_coin_at_mario_pos", - "802a1c68" : "cur_obj_abs_y_dist_to_home", - "802a1cc4" : "cur_obj_advance_looping_anim", - "802a1f3c" : "cur_obj_resolve_wall_collisions", - "802a2320" : "cur_obj_update_floor_and_walls", - "802a2348" : "cur_obj_move_standard", - "802a25b4" : "cur_obj_move_using_vel_and_gravity", - "802a2644" : "cur_obj_move_using_fvel_and_gravity", - "802a2674" : "obj_set_pos_relative", - "802a2748" : "cur_obj_angle_to_home", - "802a27b0" : "obj_set_gfx_pos_at_obj_pos", - "802a2804" : "obj_translate_local", - "802a2930" : "obj_build_transform_from_pos_and_angle", - "802a2a18" : "obj_set_throw_matrix_from_transform", - "802a2a84" : "obj_build_transform_relative_to_parent", - "802a2b28" : "obj_create_transform_from_self", - "802a2b6c" : "cur_obj_rotate_move_angle_using_vel", - "802a2bc4" : "cur_obj_rotate_face_angle_using_vel", - "802a2c1c" : "cur_obj_set_face_angle_to_move_angle", - "802a2c5c" : "cur_obj_follow_path", - "802a2ed4" : "chain_segment_init", - "802a2f14" : "random_f32_around_zero", - "802a2f5c" : "obj_scale_random", - "802a2fc0" : "obj_translate_xyz_random", - "802a308c" : "obj_translate_xz_random", - "802a31e0" : "cur_obj_set_pos_via_transform", - "802a3268" : "cur_obj_reflect_move_angle_off_wall", - "802a32ac" : "cur_obj_spawn_particles", - "802a34a4" : "obj_set_hitbox", - "802a3604" : "signum_positive", - "802a3634" : "absf", - "802a3674" : "absi", - "802a36a4" : "cur_obj_wait_then_blink", - "802a3754" : "cur_obj_is_mario_ground_pounding_platform", - "802a37ac" : "spawn_mist_particles", - "802a37dc" : "spawn_mist_particles_with_sound", - "802a3818" : "cur_obj_push_mario_away", - "802a390c" : "cur_obj_push_mario_away_from_cylinder", - "802a399c" : "bhv_dust_smoke_loop", - "802a3a4c" : "cur_obj_set_direction_table", - "802a3a88" : "cur_obj_progress_direction_table", - "802a3b28" : "stub_obj_helpers_3", - "802a3b40" : "cur_obj_scale_over_time", - "802a3c18" : "cur_obj_set_pos_to_home_with_debug", - "802a3cec" : "stub_obj_helpers_4", - "802a3cfc" : "cur_obj_is_mario_on_platform", - "802a3d40" : "cur_obj_shake_y_until", - "802a3dd4" : "cur_obj_move_up_and_down", - "802a3e30" : "cur_obj_call_action_function", - "802a3ef8" : "spawn_base_star_with_no_lvl_exit", - "802a3f24" : "bit_shift_left", - "802a3f48" : "cur_obj_mario_far_away", - "802a404c" : "is_mario_moving_fast_or_in_air", - "802a40b8" : "is_item_in_array", - "802a4120" : "bhv_init_room", - "802a4210" : "cur_obj_enable_rendering_if_mario_in_room", - "802a4360" : "cur_obj_set_hitbox_and_die_if_attacked", - "802a4440" : "obj_explode_and_spawn_coins", - "802a44f4" : "obj_set_collision_data", - "802a452c" : "cur_obj_if_hit_wall_bounce_away", - "802a4564" : "cur_obj_hide_if_mario_far_away_y", - "802a45e4" : "geo_offset_klepto_held_object", - "802a462c" : "geo_offset_klepto_debug", - "802a46cc" : "obj_is_hidden", - "802a4704" : "enable_time_stop", - "802a4728" : "disable_time_stop", - "802a4750" : "set_time_stop_flags", - "802a4774" : "clear_time_stop_flags", - "802a47a0" : "cur_obj_can_mario_activate_textbox", - "802a48bc" : "cur_obj_can_mario_activate_textbox_2", - "802a4960" : "cur_obj_update_dialog", - "802a4be4" : "cur_obj_update_dialog_with_cutscene", - "802a4f04" : "cur_obj_has_model", - "802a4f58" : "cur_obj_align_gfx_with_floor", - "802a5034" : "mario_is_within_rectangle", - "802a50fc" : "cur_obj_shake_screen", - "802a513c" : "obj_attack_collided_from_other_object", - "802a51ac" : "cur_obj_was_attacked_or_ground_pounded", - "802a5228" : "obj_copy_behavior_params", - "802a5248" : "cur_obj_init_animation_and_anim_frame", - "802a5288" : "cur_obj_init_animation_and_check_if_near_end", - "802a52c4" : "cur_obj_init_animation_and_extend_if_at_end", - "802a52f8" : "cur_obj_check_grabbed_mario", - "802a5358" : "player_performed_grab_escape_action", - "802a540c" : "cur_obj_unused_play_footstep_sound", - "802a5460" : "enable_time_stop_including_mario", - "802a5498" : "disable_time_stop_including_mario", - "802a54d8" : "cur_obj_check_interacted", - "802a5524" : "cur_obj_spawn_loot_blue_coin", - "802a5588" : "cur_obj_spawn_star_at_y_offset", - "802a5620" : "star_door_update_pos", - "802a56bc" : "bhv_star_door_loop", - "802a58dc" : "bhv_piranha_particle_loop", - "802a597c" : "mr_i_piranha_particle_act_0", - "802a5a44" : "mr_i_piranha_particle_act_1", - "802a5aa0" : "bhv_mr_i_particle_loop", - "802a5acc" : "spawn_mr_i_particle", - "802a5bd4" : "bhv_mr_i_body_loop", - "802a5d4c" : "mr_i_act_3", - "802a6518" : "mr_i_act_2", - "802a68a0" : "mr_i_act_1", - "802a6ad8" : "mr_i_act_0", - "802a6b7c" : "bhv_mr_i_loop", - "802a6c20" : "bhv_pole_init", - "802a6c74" : "bhv_giant_pole_loop", - "802a6cf4" : "bhv_thi_huge_island_top_loop", - "802a6d64" : "bhv_thi_tiny_island_top_loop", - "802a6ee4" : "cap_switch_act_0", - "802a7020" : "cap_switch_act_1", - "802a708c" : "cap_switch_act_2", - "802a7160" : "cap_switch_act_3", - "802a7170" : "bhv_cap_switch_loop", - "802a719c" : "geo_update_held_mario_pos", - "802a7230" : "bhv_bobomb_anchor_mario_loop", - "802a7264" : "king_bobomb_act_0", - "802a7384" : "mario_is_far_below_object", - "802a73d8" : "king_bobomb_act_2", - "802a7598" : "king_bobomb_act_3", - "802a7804" : "king_bobomb_act_1", - "802a78d8" : "king_bobomb_act_6", - "802a7a60" : "king_bobomb_act_7", - "802a7b1c" : "king_bobomb_act_8", - "802a7b5c" : "king_bobomb_act_4", - "802a7d14" : "king_bobomb_act_5", - "802a7fbc" : "king_bobomb_move", - "802a8064" : "bhv_king_bobomb_loop", - "802a816c" : "bhv_beta_chest_bottom_init", - "802a81e8" : "bhv_beta_chest_bottom_loop", - "802a821c" : "bhv_beta_chest_lid_loop", - "802a8370" : "bhv_water_air_bubble_init", - "802a83a0" : "bhv_water_air_bubble_loop", - "802a8630" : "bhv_bubble_wave_init", - "802a86bc" : "scale_bubble_random", - "802a870c" : "bhv_bubble_maybe_loop", - "802a88a4" : "bhv_small_water_wave_loop", - "802a8a38" : "scale_bubble_sin", - "802a8b18" : "bhv_particle_init", - "802a8bc0" : "bhv_particle_loop", - "802a8c88" : "bhv_small_bubbles_loop", - "802a8cdc" : "bhv_fish_group_loop", - "802a8d48" : "bhv_water_waves_init", - "802a8d98" : "bhv_cannon_base_unused_loop", - "802a8dc0" : "opened_cannon_act_0", - "802a8f40" : "opened_cannon_act_4", - "802a9114" : "opened_cannon_act_6", - "802a92fc" : "opened_cannon_act_5", - "802a93f8" : "opened_cannon_act_1", - "802a9440" : "opened_cannon_act_2", - "802a9460" : "opened_cannon_act_3", - "802a9498" : "bhv_cannon_base_loop", - "802a94f8" : "bhv_cannon_barrel_loop", - "802a958c" : "common_anchor_mario_behavior", - "802a9708" : "bhv_chuckya_anchor_mario_loop", - "802a973c" : "unknown_chuckya_function", - "802a98c4" : "approach_forward_vel", - "802a9994" : "chuckya_act_0", - "802a9d08" : "chuckya_act_1", - "802a9f54" : "chuckya_act_3", - "802a9fc8" : "chuckya_act_2", - "802aa02c" : "chuckya_move", - "802aa0ac" : "bhv_chuckya_loop", - "802aa1b8" : "bhv_wf_breakable_wall_loop", - "802aa280" : "check_mario_attacking", - "802aa3c8" : "init_kickable_board_rock", - "802aa3f4" : "bhv_kickable_board_loop", - "802aa700" : "bhv_tower_door_loop", - "802aa774" : "bhv_wf_rotating_wooden_platform_loop", - "802aa830" : "bhv_rotating_platform_loop", - "802aa948" : "set_koopa_shell_underwater_hitbox", - "802aa97c" : "bhv_koopa_shell_underwater_loop", - "802aaa60" : "bhv_warp_loop", - "802aab54" : "bhv_fading_warp_loop", - "802aac48" : "bhv_white_puff_exploding_loop", - "802aae8c" : "spawn_mist_particles_variable", - "802aaf48" : "bhv_spawned_star_init", - "802aaffc" : "set_sparkle_spawn_star_hitbox", - "802ab060" : "set_home_to_mario", - "802ab158" : "set_y_home_to_pos", - "802ab18c" : "slow_star_rotation", - "802ab1c8" : "bhv_spawned_star_loop", - "802ab558" : "bhv_spawn_star_no_level_exit", - "802ab5c8" : "bhv_coin_sparkles_init", - "802ab650" : "bhv_yellow_coin_init", - "802ab70c" : "bhv_yellow_coin_loop", - "802ab748" : "bhv_temp_coin_loop", - "802ab7a4" : "bhv_coin_init", - "802ab860" : "bhv_coin_loop", - "802aba40" : "bhv_coin_formation_spawn_loop", - "802abc04" : "spawn_coin_in_formation", - "802abee4" : "bhv_coin_formation_init", - "802abf0c" : "bhv_coin_formation_loop", - "802ac068" : "coin_inside_boo_act_1", - "802ac15c" : "coin_inside_boo_act_0", - "802ac294" : "bhv_coin_inside_boo_loop", - "802ac2c0" : "bhv_coin_sparkles_loop", - "802ac2ec" : "bhv_golden_coin_sparkles_loop", - "802ac3a8" : "bhv_punch_tiny_triangle_loop", - "802ac4a0" : "bhv_punch_tiny_triangle_init", - "802ac5b4" : "bhv_wall_tiny_star_particle_loop", - "802ac678" : "bhv_tiny_star_particles_init", - "802ac78c" : "bhv_pound_tiny_star_particle_loop", - "802ac864" : "bhv_pound_tiny_star_particle_init", - "802ac910" : "door_animation_and_reset", - "802ac958" : "set_door_camera_event", - "802ac9d0" : "play_door_open_noise", - "802aca6c" : "play_warp_door_open_noise", - "802acac8" : "bhv_door_loop", - "802acc3c" : "bhv_door_init", - "802ace80" : "bhv_star_door_loop_2", - "802ad078" : "grindel_thwomp_act_4", - "802ad10c" : "grindel_thwomp_act_2", - "802ad1a4" : "grindel_thwomp_act_3", - "802ad238" : "grindel_thwomp_act_1", - "802ad2d0" : "grindel_thwomp_act_0", - "802ad34c" : "bhv_grindel_thwomp_loop", - "802ad378" : "bhv_tumbling_bridge_platform_loop", - "802ad580" : "tumbling_bridge_act_1", - "802ad76c" : "tumbling_bridge_act_2", - "802ad7f4" : "tumbling_bridge_act_3", - "802ad828" : "tumbling_bridge_act_0", - "802ad890" : "bhv_tumbling_bridge_loop", - "802ad8bc" : "elevator_starting_shake", - "802ad8f0" : "elevator_act_0", - "802ada4c" : "elevator_act_1", - "802adb88" : "elevator_act_2", - "802adce4" : "elevator_act_4", - "802add70" : "elevator_act_3", - "802addf8" : "bhv_elevator_init", - "802adf6c" : "bhv_elevator_loop", - "802adf98" : "bhv_water_mist_spawn_loop", - "802adfd8" : "bhv_water_mist_loop", - "802ae0cc" : "spawn_triangle_break_particles", - "802ae238" : "bhv_water_mist_2_loop", - "802ae304" : "bhv_pound_white_puffs_init", - "802ae334" : "spawn_mist_from_global", - "802ae360" : "bhv_ground_sand_init", - "802ae394" : "spawn_smoke_with_velocity", - "802ae45c" : "clear_particle_flags", - "802ae48c" : "bhv_ground_snow_init", - "802ae4c0" : "spawn_wind_particles", - "802ae534" : "bhv_wind_loop", - "802ae85c" : "bhv_unused_particle_spawn_loop", - "802ae908" : "bhv_ukiki_cage_star_loop", - "802aea6c" : "ukiki_cage_act_wait_for_ukiki", - "802aeab8" : "ukiki_cage_act_spin", - "802aeb1c" : "ukiki_cage_act_fall", - "802aeb74" : "ukiki_cage_act_hide", - "802aeb9c" : "bhv_ukiki_cage_loop", - "802aebc8" : "bhv_squishable_platform_loop", - "802aec40" : "bhv_bitfs_sinking_platform_loop", - "802aeca8" : "bhv_ddd_moving_pole_loop", - "802aecdc" : "bhv_bitfs_sinking_cage_platform_loop", - "802aedc0" : "bhv_beta_moving_flames_spawn_loop", - "802aeea4" : "bhv_beta_moving_flames_loop", - "802aef1c" : "bhv_flamethrower_flame_loop", - "802af1e8" : "bhv_flamethrower_loop", - "802af3fc" : "bhv_rr_rotating_bridge_platform_loop", - "802af448" : "bhv_bouncing_fireball_flame_loop", - "802af5f8" : "bhv_bouncing_fireball_loop", - "802af7c4" : "bhv_bowser_shock_wave_loop", - "802af9cc" : "bhv_black_smoke_upward_loop", - "802afa0c" : "bhv_black_smoke_bowser_loop", - "802afae4" : "bhv_black_smoke_mario_loop", - "802afbf8" : "bhv_flame_mario_loop", - "802afce4" : "bhv_beta_fish_splash_spawner_loop", - "802afd1c" : "bhv_spindrift_loop", - "802afee8" : "bhv_wf_solid_tower_platform_loop", - "802aff30" : "bhv_wf_elevator_tower_platform_loop", - "802b00e4" : "bhv_wf_sliding_tower_platform_loop", - "802b0244" : "spawn_and_init_wf_platforms", - "802b039c" : "spawn_wf_platform_group", - "802b04b4" : "bhv_tower_platform_group_loop", - "802b0614" : "bhv_tree_snow_or_leaf_loop", - "802b0974" : "bhv_snow_leaf_particle_spawn_init", - "802b0b9c" : "square_plat_set_yaw_until_timer", - "802b0bec" : "bhv_squarish_path_moving_loop", - "802b0d48" : "bhv_piranha_plant_waking_bubbles_loop", - "802b0df0" : "bhv_piranha_plant_bubble_loop", - "802b1278" : "bhv_purple_switch_loop", - "802b14f4" : "check_if_moving_over_floor", - "802b15e8" : "bhv_pushable_loop", - "802b1714" : "breakable_box_init", - "802b17f4" : "hidden_breakable_box_actions", - "802b19d8" : "hidden_unbreakable_box_actions", - "802b1ae0" : "bhv_hidden_object_loop", - "802b1b2c" : "bhv_breakable_box_loop", - "802b1bb0" : "geo_move_mario_part_from_parent", - "802b1c54" : "bhv_heave_ho_throw_mario_loop", - "802b1d7c" : "heave_ho_act_1", - "802b1e6c" : "heave_ho_act_2", - "802b1ff4" : "heave_ho_act_3", - "802b20a0" : "heave_ho_act_0", - "802b2154" : "heave_ho_move", - "802b2278" : "bhv_heave_ho_loop", - "802b2340" : "bhv_ccm_touched_star_spawn_loop", - "802b23e0" : "bhv_unused_poundable_platform", - "802b2494" : "bhv_beta_trampoline_spring_loop", - "802b25ac" : "bhv_beta_trampoline_top_loop", - "802b26a4" : "jumping_box_act_0", - "802b27d8" : "jumping_box_act_1", - "802b2824" : "jumping_box_free_update", - "802b288c" : "bhv_jumping_box_loop", - "802b29b8" : "bhv_boo_cage_loop", - "802b2bc8" : "spawn_sparkle_particles", - "802b2d10" : "bhv_alpha_boo_key_loop", - "802b3108" : "bhv_beta_boo_key_loop", - "802b3134" : "arc_to_goal_pos", - "802b3250" : "grand_star_zero_velocity", - "802b329c" : "bhv_grand_star_loop", - "802b3600" : "bhv_bowser_key_loop", - "802b37b8" : "bhv_white_puff_smoke_init", - "802b3810" : "bhv_bullet_bill_init", - "802b3830" : "bullet_bill_act_0", - "802b38b8" : "bullet_bill_act_1", - "802b394c" : "bullet_bill_act_2", - "802b3b08" : "bullet_bill_act_3", - "802b3b24" : "bullet_bill_act_4", - "802b3be0" : "bhv_bullet_bill_loop", - "802b3c2c" : "bowser_tail_anchor_act_0", - "802b3cdc" : "bowser_tail_anchor_act_1", - "802b3d10" : "bowser_tail_anchor_act_2", - "802b3d74" : "bhv_bowser_tail_anchor_loop", - "802b3df4" : "bhv_bowser_flame_spawn_loop", - "802b4080" : "bhv_bowser_body_anchor_loop", - "802b4184" : "bowser_spawn_shockwave", - "802b41fc" : "bowser_bounce", - "802b4288" : "bowser_set_anim_look_up_and_walk", - "802b4300" : "bowser_set_anim_slow_gait", - "802b4368" : "bowser_set_anim_look_down", - "802b43dc" : "bowser_initialize_action", - "802b4478" : "bowser_act_text_wait", - "802b44bc" : "bowser_act_intro_walk", - "802b45f4" : "bowser_bitdw_act_controller", - "802b473c" : "bowser_bitfs_act_controller", - "802b48d4" : "bowser_general_bits_act_controller", - "802b4a1c" : "bowser_set_act_jump", - "802b4a3c" : "bowser_bits_act_controller", - "802b4af4" : "bowser_reset_fallen_off_stage", - "802b4bac" : "bowser_act_unused_slow_walk", - "802b4be8" : "bowser_act_default", - "802b4ca4" : "bowser_act_breath_fire", - "802b4d14" : "bowser_act_walk_to_mario", - "802b4f00" : "bowser_act_teleport", - "802b5104" : "bowser_act_spit_fire_into_sky", - "802b5218" : "bowser_act_hit_mine", - "802b53f4" : "bowser_set_anim_in_air", - "802b5444" : "bowser_land", - "802b5554" : "bowser_short_second_hop", - "802b55cc" : "bowser_act_jump", - "802b5798" : "bowser_act_jump_towards_mario", - "802b58bc" : "bowser_act_hit_edge", - "802b59cc" : "bowser_act_spit_fire_onto_floor", - "802b5aec" : "bowser_turn_on_timer", - "802b5c00" : "bowser_act_turn_from_edge", - "802b5c40" : "bowser_act_charge_mario", - "802b5f6c" : "bowser_check_hit_mine", - "802b5fec" : "bowser_act_thrown_dropped", - "802b611c" : "bowser_set_goal_invisible", - "802b6190" : "bowser_act_jump_onto_stage", - "802b6568" : "bowser_act_dance", - "802b65d0" : "bowser_spawn_grand_star_key", - "802b6670" : "bowser_fly_back_dead", - "802b6730" : "bowser_dead_bounce", - "802b67d4" : "bowser_dead_wait_for_mario", - "802b6878" : "bowser_dead_twirl_into_trophy", - "802b6a10" : "bowser_dead_hide", - "802b6a78" : "bowser_dead_not_bits_end", - "802b6bac" : "bowser_dead_bits_end", - "802b6cf0" : "bowser_act_dead", - "802b6e40" : "bowser_tilt_platform", - "802b6ee0" : "bowser_act_ride_tilting_platform", - "802b711c" : "bowser_check_fallen_off_stage", - "802b71e4" : "bowser_free_update", - "802b72d4" : "bowser_held_update", - "802b7418" : "bowser_thrown_dropped_update", - "802b75a4" : "bhv_bowser_loop", - "802b7878" : "bhv_bowser_init", - "802b798c" : "geo_update_body_rot_from_parent", - "802b7a20" : "bowser_open_eye_switch", - "802b7c64" : "geo_switch_bowser_eyes", - "802b7d44" : "geo_bits_bowser_coloring", - "802b7e68" : "falling_bowser_plat_act_0", - "802b7ef0" : "falling_bowser_plat_act_1", - "802b8024" : "falling_bowser_plat_act_2", - "802b8384" : "bhv_falling_bowser_platform_loop", - "802b83b0" : "bowser_flame_despawn", - "802b8434" : "bowser_flame_should_despawn", - "802b84ac" : "bhv_flame_bowser_init", - "802b85b0" : "bhv_flame_large_burning_out_init", - "802b8654" : "bowser_flame_move", - "802b8734" : "bhv_flame_bowser_loop", - "802b8960" : "bhv_flame_moving_forward_growing_init", - "802b89ec" : "bhv_flame_moving_forward_growing_loop", - "802b8b1c" : "bhv_flame_floating_landing_init", - "802b8c38" : "bhv_flame_floating_landing_loop", - "802b8d68" : "bhv_blue_bowser_flame_init", - "802b8e7c" : "bhv_blue_bowser_flame_loop", - "802b9034" : "bhv_flame_bouncing_init", - "802b90ec" : "bhv_flame_bouncing_loop", - "802b921c" : "bhv_blue_flames_group_loop", - "802b935c" : "bhv_blue_fish_movement_loop", - "802b9790" : "bhv_tank_fish_group_loop", - "802b98d4" : "vec3f_copy_2", - "802b98fc" : "bhv_checkerboard_elevator_group_init", - "802b9a78" : "checkerboard_plat_act_move_y", - "802b9af8" : "checkerboard_plat_act_rotate", - "802b9bb4" : "bhv_checkerboard_platform_init", - "802b9bd8" : "bhv_checkerboard_platform_loop", - "802b9e94" : "bhv_ddd_warp_loop", - "802b9efc" : "water_level_pillar_undrained", - "802ba13c" : "water_level_pillar_drained", - "802ba19c" : "bhv_water_level_pillar_init", - "802ba1e0" : "bhv_water_level_pillar_loop", - "802ba25c" : "bhv_invisible_objects_under_bridge_init", - "802ba2b0" : "geo_scale_bowser_key", - "802ba2f8" : "bhv_bowser_key_unlock_door_loop", - "802ba458" : "bhv_bowser_key_course_exit_loop", - "802ba5bc" : "bhv_moat_grills_loop", - "802ba608" : "bhv_rotating_clock_arm_loop", - "802ba7e0" : "handle_hat_ukiki_reset", - "802ba868" : "is_hat_ukiki_and_mario_has_hat", - "802ba8c4" : "geo_update_projectile_pos_from_parent_copy", - "802ba958" : "idle_ukiki_taunt", - "802bab7c" : "ukiki_act_idle", - "802bae40" : "ukiki_act_return_home", - "802baec4" : "ukiki_act_wait_to_respawn", - "802baf10" : "ukiki_act_unused_turn", - "802baf64" : "ukiki_act_turn_to_mario", - "802bb07c" : "ukiki_act_run", - "802bb288" : "ukiki_act_jump", - "802bb3b8" : "ukiki_act_go_to_cage", - "802bb798" : "ukiki_free_loop", - "802bb888" : "cage_ukiki_held_loop", - "802bba3c" : "hat_ukiki_held_loop", - "802bbb98" : "bhv_ukiki_init", - "802bbc0c" : "bhv_ukiki_loop", - "802bbd6c" : "lll_octagonal_mesh_move", - "802bbfd8" : "lll_octagonal_mesh_find_y_offset", - "802bc0f0" : "bhv_lll_moving_octagonal_mesh_platform_loop", - "802bc22c" : "bhv_lll_sinking_rock_block_loop", - "802bc294" : "bhv_lll_rotating_hex_flame_loop", - "802bc348" : "fire_bar_spawn_flames", - "802bc4f4" : "fire_bar_act_0", - "802bc538" : "fire_bar_act_1", - "802bc590" : "fire_bar_act_2", - "802bc5fc" : "fire_bar_act_3", - "802bc618" : "bhv_lll_rotating_block_fire_bars_loop", - "802bc660" : "bhv_lll_wood_piece_loop", - "802bc728" : "bhv_lll_floating_wood_bridge_loop", - "802bc898" : "bhv_volcano_flames_loop", - "802bc934" : "hexagonal_ring_spawn_flames", - "802bca74" : "bhv_lll_rotating_hexagonal_ring_loop", - "802bcce8" : "sinking_rectangular_plat_actions", - "802bcda8" : "bhv_lll_sinking_rectangular_platform_loop", - "802bce58" : "bhv_lll_sinking_square_platforms_loop", - "802bce9c" : "create_transform_from_normals", - "802bcf40" : "bhv_platform_normals_init", - "802bcfc4" : "approach_by_increment", - "802bd058" : "bhv_tilting_inverted_pyramid_loop", - "802bd3e4" : "koopa_shell_spawn_water_drop", - "802bd488" : "bhv_koopa_shell_flame_loop", - "802bd5dc" : "bhv_koopa_shell_flame_spawn", - "802bd62c" : "koopa_shell_spawn_sparkles", - "802bd680" : "bhv_koopa_shell_loop", - "802bd8d0" : "tox_box_shake_screen", - "802bd91c" : "tox_box_move", - "802bdb04" : "tox_box_act_4", - "802bdb3c" : "tox_box_act_5", - "802bdb74" : "tox_box_act_6", - "802bdbac" : "tox_box_act_7", - "802bdbe4" : "tox_box_act_1", - "802bdc7c" : "tox_box_act_2", - "802bdcc8" : "tox_box_act_3", - "802bdd14" : "tox_box_act_0", - "802bdd68" : "bhv_tox_box_loop", - "802bdd9c" : "piranha_plant_act_idle", - "802bde10" : "piranha_plant_check_interactions", - "802bdeec" : "piranha_plant_act_sleeping", - "802be034" : "piranha_plant_act_woken_up", - "802be0b8" : "piranha_plant_reset_when_far", - "802be0ec" : "piranha_plant_attacked", - "802be150" : "piranha_plant_act_shrink_and_die", - "802be234" : "piranha_plant_act_wait_to_respawn", - "802be278" : "piranha_plant_act_respawn", - "802be350" : "piranha_plant_act_biting", - "802be49c" : "mario_moving_fast_enough_to_make_piranha_plant_bite", - "802be50c" : "piranha_plant_act_stopped_biting", - "802be5a0" : "bhv_piranha_plant_loop", - "802be628" : "bhv_lll_bowser_puzzle_spawn_piece", - "802be6d4" : "bhv_lll_bowser_puzzle_spawn_pieces", - "802be79c" : "bhv_lll_bowser_puzzle_loop", - "802be8a8" : "bhv_lll_bowser_puzzle_piece_action_0", - "802be8b8" : "bhv_lll_bowser_puzzle_piece_action_1", - "802be8f4" : "bhv_lll_bowser_puzzle_piece_update", - "802be9dc" : "bhv_lll_bowser_puzzle_piece_move", - "802beb14" : "bhv_lll_bowser_puzzle_piece_idle", - "802beb54" : "bhv_lll_bowser_puzzle_piece_move_left", - "802beb8c" : "bhv_lll_bowser_puzzle_piece_move_right", - "802bebc4" : "bhv_lll_bowser_puzzle_piece_move_up", - "802bebfc" : "bhv_lll_bowser_puzzle_piece_move_down", - "802bec34" : "bhv_lll_bowser_puzzle_piece_loop", - "802becb0" : "set_obj_anim_with_accel_and_sound", - "802bed7c" : "play_penguin_walking_sound", - "802bedec" : "tuxies_mother_act_2", - "802bef8c" : "tuxies_mother_act_1", - "802bf1d8" : "tuxies_mother_act_0", - "802bf3c0" : "bhv_tuxies_mother_loop", - "802bf424" : "small_penguin_dive_with_mario", - "802bf474" : "small_penguin_act_2", - "802bf57c" : "small_penguin_act_1", - "802bf648" : "small_penguin_act_3", - "802bf6e4" : "small_penguin_act_4", - "802bf760" : "small_penguin_act_0", - "802bf90c" : "small_penguin_act_5", - "802bfa14" : "small_penguin_free_actions", - "802bfa88" : "bhv_small_penguin_loop", - "802bfbac" : "geo_switch_tuxie_mother_eyes", - "802bfcd8" : "fish_act_spawn", - "802bfeb8" : "fish_act_respawn", - "802bff20" : "fish_act_init", - "802bff3c" : "bhv_large_fish_group_loop", - "802bff68" : "fish_regroup", - "802c00b4" : "fish_group_act_rotation", - "802c0348" : "fish_group_act_move", - "802c06a8" : "fish_group_act_animate", - "802c0768" : "bhv_fish_loop", - "802c08a8" : "bhv_wdw_express_elevator_loop", - "802c0aac" : "bub_spawner_act_0", - "802c0b50" : "bub_spawner_act_1", - "802c0ba4" : "bub_spawner_act_2", - "802c0bc4" : "bub_spawner_act_3", - "802c0be0" : "bhv_bub_spawner_loop", - "802c0c0c" : "bub_move_vertically", - "802c0cd4" : "bub_act_0", - "802c0d44" : "bub_act_1", - "802c0f90" : "bub_act_2", - "802c1204" : "bhv_bub_loop", - "802c12c0" : "bhv_rotating_exclamation_box_loop", - "802c1308" : "exclamation_box_act_0", - "802c13ec" : "exclamation_box_act_1", - "802c14b0" : "exclamation_box_act_2", - "802c15b8" : "exclamation_box_act_3", - "802c17bc" : "exclamation_box_spawn_contents", - "802c18d0" : "exclamation_box_act_4", - "802c1988" : "exclamation_box_act_5", - "802c19c0" : "bhv_exclamation_box_loop", - "802c19fc" : "bhv_sound_spawner_init", - "802c1a40" : "bhv_bowsers_sub_loop", - "802c1a80" : "bhv_sushi_shark_collision_loop", - "802c1a90" : "bhv_sushi_shark_loop", - "802c1c44" : "bhv_sunken_ship_part_loop", - "802c1cd4" : "bhv_ship_part_3_loop", - "802c1e10" : "bhv_jrb_sliding_box_loop", - "802c2190" : "bhv_white_puff_1_loop", - "802c2274" : "bhv_white_puff_2_loop", - "802c22b8" : "bhv_hidden_blue_coin_loop", - "802c242c" : "bhv_blue_coin_switch_loop", - "802c263c" : "bhv_openable_cage_door_loop", - "802c26f8" : "bhv_openable_grill_loop", - "802c2930" : "bhv_init_changing_water_level_loop", - "802c2a24" : "bhv_water_level_diamond_loop", - "802c2ce8" : "tweester_scale_and_move", - "802c2ebc" : "tweester_act_idle", - "802c2fbc" : "tweester_act_chase", - "802c31c4" : "tweester_act_hide", - "802c329c" : "bhv_tweester_loop", - "802c32e8" : "bhv_tweester_sand_particle_loop", - "802c3440" : "bhv_boo_init", - "802c3684" : "bhv_courtyard_boo_triplet_init", - "802c4824" : "bhv_boo_loop", - "802c4f30" : "bhv_big_boo_loop", - "802c515c" : "bhv_boo_with_cage_init", - "802c51d4" : "bhv_boo_with_cage_loop", - "802c5224" : "bhv_merry_go_round_boo_manager_loop", - "802c53cc" : "obj_set_secondary_camera_focus", - "802c53ec" : "bhv_animated_texture_loop", - "802c5414" : "bhv_boo_in_castle_loop", - "802c5688" : "bhv_boo_boss_spawned_bridge_loop", - "802c5890" : "bhv_bbh_tilting_trap_platform_loop", - "802c5a38" : "bhv_haunted_bookshelf_loop", - "802c5ca8" : "bhv_merry_go_round_loop", - "802c5dc0" : "bhv_static_checkered_platform_loop", - "802c5f48" : "bhv_beta_bowser_anchor_loop", - "802c5fdc" : "bhv_play_music_track_when_touched_loop", - "802c6050" : "bhv_floor_trap_in_castle_loop", - "802c60ac" : "bhv_castle_floor_trap_init", - "802c6150" : "bhv_castle_floor_trap_open_detect", - "802c61d4" : "bhv_castle_floor_trap_open", - "802c6278" : "bhv_castle_floor_trap_close_detect", - "802c62bc" : "bhv_castle_floor_trap_close", - "802c6328" : "bhv_castle_floor_trap_rotate", - "802c6348" : "bhv_castle_floor_trap_loop", - "802c63e8" : "bhv_pole_base_loop", - "802c64a4" : "bhv_sparkle_spawn_loop", - "802c6538" : "update_angle_from_move_flags", - "802c65c0" : "bhv_scuttlebug_loop", - "802c6b6c" : "bhv_scuttlebug_spawn_loop", - "802c6ca0" : "whomp_play_sfx_from_pound_animation", - "802c6d6c" : "whomp_act_0", - "802c6ec8" : "whomp_act_7", - "802c6fb0" : "whomp_act_1", - "802c710c" : "whomp_act_2", - "802c7254" : "whomp_act_3", - "802c72b4" : "whomp_act_4", - "802c7380" : "whomp_act_5", - "802c7428" : "king_whomp_on_ground", - "802c75fc" : "whomp_on_ground", - "802c76d4" : "whomp_act_6", - "802c7858" : "whomp_act_8", - "802c7998" : "whomp_act_9", - "802c79d8" : "bhv_whomp_loop", - "802c7a70" : "bhv_water_splash_spawn_droplets", - "802c7b14" : "bhv_water_droplet_loop", - "802c7cac" : "bhv_idle_water_wave_loop", - "802c7d40" : "bhv_water_droplet_splash_init", - "802c7d90" : "bhv_bubble_splash_init", - "802c7dfc" : "bhv_shallow_water_splash_init", - "802c7e5c" : "bhv_wave_trail_shrink", - "802c7f98" : "bhv_strong_wind_particle_loop", - "802c81b4" : "cur_obj_spawn_strong_wind_particles", - "802c834c" : "bhv_sl_snowman_wind_loop", - "802c863c" : "bhv_sl_walking_penguin_loop", - "802c89f0" : "update_mario_platform", - "802c8b4c" : "get_mario_pos", - "802c8b8c" : "set_mario_pos", - "802c8bc8" : "apply_platform_displacement", - "802c8ec0" : "apply_mario_platform_displacement", - "802c8f28" : "clear_mario_platform", - "802c8f40" : "debug_print_obj_collision", - "802c8fe4" : "detect_object_hitbox_overlap", - "802c91ec" : "detect_object_hurtbox_overlap", - "802c9388" : "clear_object_collision", - "802c93f8" : "check_collision_in_list", - "802c94ac" : "check_player_object_collision", - "802c95b4" : "check_pushable_object_collision", - "802c9630" : "check_destructive_object_collision", - "802c9724" : "detect_object_collisions", - "802c97d0" : "unused_init_free_list", - "802c9840" : "unused_try_allocate", - "802c98a4" : "try_allocate_object", - "802c9950" : "unused_deallocate", - "802c99b8" : "init_free_object_list", - "802c9a3c" : "clear_object_lists", - "802c9b68" : "unload_object", - "802c9c00" : "allocate_object", - "802c9f04" : "create_object", - "802ca028" : "mark_obj_for_deletion", - "802ca040" : "exec_anim_sound_state", - "802ca144" : "create_sound_spawner", - "802ca190" : "cur_obj_play_sound_1", - "802ca1e0" : "cur_obj_play_sound_2", - "802ca230" : "calc_dist_to_volume_range_1", - "802ca2d4" : "calc_dist_to_volume_range_2", - "802ca370" : "stub_debug_1", - "802ca380" : "stub_debug_2", - "802ca390" : "stub_debug_3", - "802ca3a0" : "stub_debug_4", - "802ca3b0" : "get_current_clock", - "802ca3e0" : "get_clock_difference", - "802ca418" : "set_print_state_info", - "802ca460" : "print_text_array_info", - "802ca51c" : "set_text_array_x_y", - "802ca568" : "print_debug_bottom_up", - "802ca5b8" : "print_debug_top_down_objectinfo", - "802ca618" : "print_debug_top_down_mapinfo", - "802ca680" : "print_debug_top_down_normal", - "802ca6d0" : "print_mapinfo", - "802ca8e8" : "print_checkinfo", - "802ca918" : "print_surfaceinfo", - "802ca94c" : "print_stageinfo", - "802ca990" : "print_string_array_info", - "802caa6c" : "print_effectinfo", - "802caaa8" : "print_enemyinfo", - "802caae4" : "update_debug_dpadmask", - "802cabac" : "debug_unknown_level_select_check", - "802cac20" : "reset_debug_objectinfo", - "802cb0b0" : "stub_debug_5", - "802cb0c0" : "try_print_debug_mario_object_info", - "802cb1c0" : "try_print_debug_mario_level_info", - "802cb264" : "try_do_mario_debug_object_spawn", - "802cb564" : "debug_enemy_unknown", - "802cb5c0" : "set_and_reset_transition_fade_timer", - "802cb640" : "set_transition_color_fade_alpha", - "802cb894" : "vertex_transition_color", - "802cba18" : "dl_transition_color", - "802cbbc4" : "render_fade_transition_from_color", - "802cbc20" : "render_fade_transition_into_color", - "802cbc7c" : "calc_tex_transition_radius", - "802cbd54" : "calc_tex_transition_time", - "802cbe64" : "convert_tex_transition_angle_to_pos", - "802cbee0" : "center_tex_transition_x", - "802cbf64" : "center_tex_transition_y", - "802cbfe8" : "make_tex_transition_vertex", - "802cc180" : "load_tex_transition_vertex", - "802cc4d8" : "render_textured_transition", - "802ccbe8" : "render_screen_transition", - "802ccdc8" : "render_cannon_circle_base", - "802cd1e8" : "geo_cannon_circle_base", - "802cd280" : "rotate_rectangle", - "802cd328" : "atan2_deg", - "802cd388" : "scale_shadow_with_distance", - "802cd444" : "disable_shadow_with_distance", - "802cd48c" : "dim_shadow_with_distance", - "802cd614" : "get_water_level_below_shadow", - "802cd6c4" : "init_shadow", - "802cd938" : "get_texture_coords_9_vertices", - "802cd988" : "get_texture_coords_4_vertices", - "802cd9ec" : "make_shadow_vertex_at_xyz", - "802cdb20" : "extrapolate_vertex_y_position", - "802cdb74" : "get_vertex_coords", - "802cdc40" : "calculate_vertex_xyz", - "802cde94" : "floor_local_tilt", - "802cdf3c" : "make_shadow_vertex", - "802ce128" : "add_shadow_to_display_list", - "802ce2bc" : "linearly_interpolate_solidity_positive", - "802ce3ec" : "linearly_interpolate_solidity_negative", - "802ce524" : "correct_shadow_solidity_for_animations", - "802ce690" : "correct_lava_shadow_height", - "802ce79c" : "create_shadow_player", - "802ce9d0" : "create_shadow_circle_9_verts", - "802ceae8" : "create_shadow_circle_4_verts", - "802cec04" : "create_shadow_circle_assuming_flat_ground", - "802cedc0" : "create_shadow_rectangle", - "802cef6c" : "get_shadow_height_solidity", - "802cf080" : "create_shadow_square", - "802cf1f0" : "create_shadow_hardcoded_rectangle", - "802cf34c" : "create_shadow_below_xyz", - "802cf5b0" : "calculate_skybox_scaled_x", - "802cf69c" : "calculate_skybox_scaled_y", - "802cf804" : "make_skybox_rect", - "802cfa2c" : "draw_skybox_tile_grid", - "802cfc68" : "create_skybox_ortho_matrix", - "802cfd88" : "init_skybox_display_list", - "802cfef4" : "create_skybox_facing_camera", - "802d0080" : "geo_wdw_set_initial_water_level", - "802d01e0" : "geo_movtex_pause_control", - "802d0254" : "movtex_make_quad_vertex", - "802d0484" : "movtex_gen_from_quad", - "802d0a84" : "movtex_gen_from_quad_array", - "802d0bb0" : "movtex_gen_quads_id", - "802d0c84" : "get_quad_collection_from_id", - "802d0f28" : "movtex_change_texture_format", - "802d104c" : "geo_movtex_draw_water_regions", - "802d1330" : "update_moving_texture_offset", - "802d13cc" : "movtex_write_vertex_first", - "802d1574" : "movtex_write_vertex_index", - "802d18b4" : "movtex_gen_list", - "802d1b70" : "geo_movtex_draw_nocolor", - "802d1cdc" : "geo_movtex_draw_colored", - "802d1e48" : "geo_movtex_draw_colored_no_update", - "802d1fa8" : "geo_movtex_draw_colored_2_no_update", - "802d2108" : "geo_movtex_update_horizontal", - "802d2210" : "make_vertex", - "802d22c4" : "round_float", - "802d2360" : "geo_exec_inside_castle_light", - "802d2470" : "geo_exec_flying_carpet_timer_update", - "802d2520" : "geo_exec_flying_carpet_create", - "802d28cc" : "geo_exec_cake_end_screen", - "802d29c0" : "stop_other_paintings", - "802d2a74" : "painting_mario_y", - "802d2b08" : "painting_mario_z", - "802d2b84" : "painting_ripple_y", - "802d2c40" : "painting_nearest_4th", - "802d2d80" : "painting_mario_x", - "802d2dfc" : "painting_ripple_x", - "802d2eb8" : "painting_state", - "802d2ffc" : "wall_painting_proximity_idle", - "802d319c" : "wall_painting_proximity_rippling", - "802d327c" : "wall_painting_continuous_idle", - "802d341c" : "wall_painting_continuous_rippling", - "802d34fc" : "floor_painting_proximity_idle", - "802d36ac" : "floor_painting_proximity_rippling", - "802d379c" : "floor_painting_continuous_idle", - "802d393c" : "floor_painting_continuous_rippling", - "802d3a2c" : "painting_update_floors", - "802d3bec" : "painting_update_ripple_state", - "802d3cec" : "calculate_ripple_at_point", - "802d3e6c" : "ripple_if_movable", - "802d3ee4" : "painting_generate_mesh", - "802d404c" : "painting_calculate_triangle_normals", - "802d43f8" : "normalize_component", - "802d44bc" : "painting_average_vertex_normals", - "802d47d0" : "render_painting", - "802d4edc" : "painting_model_view_transform", - "802d50dc" : "painting_ripple_image", - "802d5354" : "painting_ripple_env_mapped", - "802d556c" : "display_painting_rippling", - "802d568c" : "display_painting_not_rippling", - "802d5778" : "reset_painting", - "802d57a8" : "move_ddd_painting", - "802d58e4" : "set_painting_layer", - "802d593c" : "display_painting", - "802d59a8" : "wall_painting_update", - "802d5aa0" : "floor_painting_update", - "802d5b98" : "geo_painting_draw", - "802d5d0c" : "geo_painting_update", - "802d5e00" : "int_pow", - "802d5e54" : "format_integer", - "802d6144" : "parse_width_field", - "802d62d8" : "print_text_fmt_int", - "802d6554" : "print_text", - "802d66c0" : "print_text_centered", - "802d6858" : "char_to_glyph_index", - "802d69f8" : "add_glyph_texture", - "802d6acc" : "clip_to_bounds", - "802d6b3c" : "render_textrect", - "802d6c88" : "render_text_labels", - "802d6f20" : "create_dl_identity_matrix", - "802d7070" : "create_dl_translation_matrix", - "802d7174" : "create_dl_rotation_matrix", - "802d7280" : "create_dl_scale_matrix", - "802d7384" : "create_dl_ortho_matrix", - "802d75dc" : "render_generic_char", - "802d76c8" : "render_multi_text_string", - "802d77dc" : "print_generic_string", - "802d7b84" : "print_hud_lut_string", - "802d7e88" : "print_menu_generic_string", - "802d82d4" : "print_credits_string", - "802d862c" : "handle_menu_scrolling", - "802d8844" : "get_str_x_pos_from_center", - "802d8934" : "get_string_width", - "802d89b8" : "print_hud_my_score_coins", - "802d8a80" : "print_hud_my_score_stars", - "802d8b34" : "int_to_str", - "802d8c6c" : "get_dialog_id", - "802d8c88" : "create_dialog_box", - "802d8cc4" : "create_dialog_box_with_var", - "802d8d08" : "create_dialog_inverted_box", - "802d8d48" : "create_dialog_box_with_response", - "802d8d90" : "reset_dialog_render_state", - "802d8e2c" : "render_dialog_box_type", - "802d9148" : "change_and_flash_dialog_text_color_lines", - "802d9388" : "handle_dialog_scroll_page_state", - "802d944c" : "render_star_count_dialog_text", - "802d9634" : "render_multi_text_string_lines", - "802d9800" : "ensure_nonnegative", - "802d982c" : "handle_dialog_text_and_pages", - "802d9cb0" : "render_dialog_triangle_choice", - "802d9dfc" : "render_dialog_string_color", - "802d9f84" : "handle_special_dialog_text", - "802da1ac" : "render_dialog_entries", - "802da810" : "set_menu_mode", - "802da844" : "reset_cutscene_msg_fade", - "802da85c" : "dl_rgba16_begin_cutscene_msg_fade", - "802da8e4" : "dl_rgba16_stop_cutscene_msg_fade", - "802da964" : "ascii_to_credits_char", - "802daa34" : "print_credits_str_ascii", - "802daae4" : "set_cutscene_message", - "802dab58" : "do_cutscene_handler", - "802dad54" : "print_peach_letter_message", - "802db08c" : "render_hud_cannon_reticle", - "802db350" : "reset_red_coins_collected", - "802db368" : "change_dialog_camera_angle", - "802db3b8" : "shade_screen", - "802db498" : "print_animated_red_coin", - "802db6e8" : "render_pause_red_coins", - "802db760" : "render_pause_my_score_coins", - "802dbb24" : "render_pause_camera_options", - "802dbe68" : "render_pause_course_options", - "802dc15c" : "render_pause_castle_menu_box", - "802dc418" : "highlight_last_course_complete_stars", - "802dc478" : "print_hud_pause_colorful_str", - "802dc570" : "render_pause_castle_course_stars", - "802dc718" : "render_pause_castle_main_strings", - "802dca88" : "render_pause_courses_and_castle", - "802dcd04" : "print_hud_course_complete_string", - "802dcf30" : "print_hud_course_complete_coins", - "802dd194" : "play_star_fanfare_and_flash_hud", - "802dd210" : "render_course_complete_lvl_info_and_hud_str", - "802dd838" : "render_save_confirmation", - "802ddae0" : "render_course_complete_screen", - "802ddca4" : "render_menus_and_dialogs", - "802dddf0" : "envfx_init_snow", - "802ddf38" : "envfx_update_snowflake_count", - "802de0bc" : "envfx_cleanup_snow", - "802de114" : "orbit_from_positions", - "802de23c" : "pos_from_orbit", - "802de360" : "envfx_is_snowflake_alive", - "802de458" : "envfx_update_snow_normal", - "802de888" : "envfx_update_snow_blizzard", - "802ded38" : "envfx_update_snow_water", - "802def2c" : "rotate_triangle_vertices", - "802df334" : "append_snowflake_vertex_buffer", - "802df748" : "envfx_update_snow", - "802dfbc8" : "envfx_update_particles", - "802dfd50" : "particle_is_laterally_close", - "802dfe00" : "random_flower_offset", - "802dfe80" : "envfx_update_flower", - "802e0120" : "envfx_set_lava_bubble_position", - "802e048c" : "envfx_update_lava", - "802e065c" : "envfx_rotate_around_whirlpool", - "802e08a8" : "envfx_is_whirlpool_bubble_alive", - "802e0934" : "envfx_update_whirlpool", - "802e0e24" : "envfx_is_jestream_bubble_alive", - "802e0eb8" : "envfx_update_jetstream", - "802e1238" : "envfx_init_bubble", - "802e1414" : "envfx_bubbles_update_switch", - "802e1618" : "append_bubble_vertex_buffer", - "802e1a20" : "envfx_set_bubble_texture", - "802e1bb8" : "envfx_update_bubble_particles", - "802e1ed8" : "envfx_set_max_bubble_particles", - "802e1f48" : "envfx_update_bubbles", - "802e20a0" : "convert_rotation", - "802e2134" : "spawn_macro_abs_yrot_2params", - "802e21dc" : "spawn_macro_abs_yrot_param1", - "802e2284" : "spawn_macro_abs_special", - "802e2414" : "spawn_macro_objects", - "802e2690" : "spawn_macro_objects_hardcoded", - "802e28ec" : "spawn_special_objects", - "802e2cf0" : "render_hud_tex_lut", - "802e2e58" : "render_hud_small_tex_lut", - "802e30b4" : "render_power_meter_health_segment", - "802e3214" : "render_dl_power_meter", - "802e33b8" : "animate_power_meter_emphasized", - "802e352c" : "handle_power_meter_actions", - "802e3654" : "render_hud_power_meter", - "802e3744" : "render_hud_mario_lives", - "802e37a8" : "render_hud_coins", - "802e380c" : "render_hud_stars", - "802e38e4" : "render_hud_keys", - "802e395c" : "render_hud_timer", - "802e3b1c" : "set_hud_camera_status", - "802e3b3c" : "render_hud_camera_status", - "802e3d2c" : "render_hud", - "802e3e50" : "set_yoshi_as_not_dead", - "802e3e68" : "geo_obj_transparency_something", - "802e3f68" : "absf_2", - "802e3fac" : "turn_obj_away_from_surface", - "802e405c" : "obj_find_wall", - "802e41a4" : "turn_obj_away_from_steep_floor", - "802e42e0" : "obj_orient_graph", - "802e43e4" : "calc_obj_friction", - "802e445c" : "calc_new_obj_vel_and_pos_y", - "802e4814" : "calc_new_obj_vel_and_pos_y_underwater", - "802e4cec" : "obj_update_pos_vel_xz", - "802e4d88" : "obj_splash", - "802e4e90" : "object_step", - "802e5114" : "object_step_without_floor_orient", - "802e5160" : "obj_move_xyz_using_fvel_and_yaw", - "802e5208" : "is_point_within_radius_of_mario", - "802e52b8" : "is_point_close_to_object", - "802e5360" : "set_object_visibility", - "802e53f4" : "obj_return_home_if_safe", - "802e54b0" : "obj_return_and_displace_home", - "802e55d0" : "obj_check_if_facing_toward_angle", - "802e569c" : "obj_find_wall_displacement", - "802e5760" : "obj_spawn_yellow_coins", - "802e5824" : "obj_flicker_and_disappear", - "802e58b4" : "current_mario_room_check", - "802e5948" : "trigger_obj_dialog_when_facing", - "802e5a80" : "obj_check_floor_death", - "802e5b18" : "obj_lava_death", - "802e5c6c" : "spawn_orange_number", - "802e5d04" : "debug_sequence_tracker", - "802e5de8" : "coin_step", - "802e5e6c" : "moving_coin_flicker", - "802e5ea4" : "coin_collected", - "802e5ee8" : "bhv_moving_yellow_coin_init", - "802e5f64" : "bhv_moving_yellow_coin_loop", - "802e6098" : "bhv_moving_blue_coin_init", - "802e6114" : "bhv_moving_blue_coin_loop", - "802e62a4" : "bhv_blue_coin_sliding_jumping_init", - "802e631c" : "blue_coin_sliding_away_from_mario", - "802e63ec" : "blue_coin_sliding_slow_down", - "802e6474" : "bhv_blue_coin_sliding_loop", - "802e6628" : "bhv_blue_coin_jumping_loop", - "802e6790" : "bhv_seaweed_init", - "802e67dc" : "bhv_seaweed_bundle_init", - "802e6a2c" : "bhv_bobomb_init", - "802e6a8c" : "bobomb_spawn_coin", - "802e6af8" : "bobomb_act_explode", - "802e6bd4" : "bobomb_check_interactions", - "802e6cf0" : "bobomb_act_patrol", - "802e6dc8" : "bobomb_act_chase_mario", - "802e6e84" : "bobomb_act_launched", - "802e6ed8" : "generic_bobomb_free_loop", - "802e7020" : "stationary_bobomb_free_loop", - "802e7134" : "bobomb_free_loop", - "802e7180" : "bobomb_held_loop", - "802e7220" : "bobomb_dropped_loop", - "802e7280" : "bobomb_thrown_loop", - "802e7324" : "curr_obj_random_blink", - "802e742c" : "bhv_bobomb_loop", - "802e75a0" : "bhv_bobomb_fuse_smoke_init", - "802e76ac" : "bhv_bobomb_buddy_init", - "802e770c" : "bobomb_buddy_act_idle", - "802e7814" : "bobomb_buddy_cannon_dialog", - "802e79dc" : "bobomb_buddy_act_talk", - "802e7b00" : "bobomb_buddy_act_turn_to_talk", - "802e7bb0" : "bobomb_buddy_actions", - "802e7c4c" : "bhv_bobomb_buddy_loop", - "802e7c90" : "bhv_cannon_closed_init", - "802e7d4c" : "cannon_door_act_opening", - "802e7e54" : "bhv_cannon_closed_loop", - "802e7f70" : "bhv_whirlpool_init", - "802e7fb8" : "whirlpool_set_hitbox", - "802e7fec" : "whirpool_orient_graph", - "802e80dc" : "bhv_whirlpool_loop", - "802e82b0" : "bhv_jet_stream_loop", - "802e8388" : "bhv_homing_amp_init", - "802e89d4" : "bhv_homing_amp_loop", - "802e8ae4" : "bhv_circling_amp_init", - "802e8ecc" : "bhv_circling_amp_loop", - "802e8f68" : "bhv_butterfly_init", - "802e9018" : "butterfly_step", - "802e9278" : "butterfly_calculate_angle", - "802e9470" : "butterfly_act_rest", - "802e94e4" : "butterfly_act_follow_mario", - "802e9548" : "butterfly_act_return_home", - "802e96c8" : "bhv_butterfly_loop", - "802e9764" : "bhv_hoot_init", - "802e97fc" : "hoot_find_next_floor", - "802e98c0" : "hoot_floor_bounce", - "802e9a4c" : "hoot_free_step", - "802e9cf4" : "hoot_player_set_yaw", - "802e9d98" : "hoot_carry_step", - "802e9f60" : "hoot_surface_collision", - "802ea144" : "hoot_act_ascent", - "802ea258" : "hoot_action_loop", - "802ea3f0" : "hoot_turn_to_home", - "802ea4ec" : "hoot_awake_loop", - "802ea588" : "bhv_hoot_loop", - "802ea6a8" : "bhv_beta_holdable_object_init", - "802ea7e0" : "bhv_beta_holdable_object_loop", - "802ea888" : "bhv_object_bubble_init", - "802ea934" : "bhv_object_bubble_loop", - "802eaa10" : "bhv_object_water_wave_init", - "802eaa50" : "bhv_object_water_wave_loop", - "802eaa8c" : "bhv_explosion_init", - "802eaad0" : "bhv_explosion_loop", - "802eabf0" : "bhv_bobomb_bully_death_smoke_init", - "802eac3c" : "bhv_bobomb_explosion_bubble_init", - "802ead3c" : "bhv_bobomb_explosion_bubble_loop", - "802eaef8" : "bhv_respawner_loop", - "802eaf84" : "create_respawner", - "802eb05c" : "bhv_small_bully_init", - "802eb104" : "bhv_big_bully_init", - "802eb1c0" : "bully_check_mario_collision", - "802eb288" : "bully_act_chase_mario", - "802eb3f0" : "bully_act_knockback", - "802eb510" : "bully_act_back_up", - "802eb5c4" : "bully_backup_check", - "802eb630" : "bully_play_stomping_sound", - "802eb744" : "bully_step", - "802eb7e0" : "bully_spawn_coin", - "802eb8b0" : "bully_act_level_death", - "802eb9d0" : "bhv_bully_loop", - "802ebb74" : "big_bully_spawn_minion", - "802ebc00" : "bhv_big_bully_with_minions_init", - "802ebc88" : "big_bully_spawn_star", - "802ebce0" : "bhv_big_bully_with_minions_loop", - "802ebf70" : "water_ring_calc_mario_dist", - "802ec030" : "water_ring_init", - "802ec1b0" : "bhv_jet_stream_water_ring_init", - "802ec200" : "water_ring_check_collection", - "802ec3d0" : "water_ring_set_scale", - "802ec4e0" : "water_ring_act_collected", - "802ec59c" : "water_ring_act_not_collected", - "802ec75c" : "bhv_jet_stream_water_ring_loop", - "802ec7cc" : "spawn_manta_ray_ring_manager", - "802ec818" : "water_ring_spawner_act_inactive", - "802ec908" : "bhv_jet_stream_ring_spawner_loop", - "802ec9b8" : "bhv_manta_ray_water_ring_init", - "802ec9f0" : "manta_water_ring_act_not_collected", - "802ecba4" : "bhv_manta_ray_water_ring_loop", - "802ecc14" : "bhv_bowser_bomb_loop", - "802ecd0c" : "bhv_bowser_bomb_explosion_loop", - "802ecea0" : "bhv_bowser_bomb_smoke_loop", - "802ecfac" : "bhv_celebration_star_init", - "802ed10c" : "celeb_star_act_spin_around_mario", - "802ed28c" : "celeb_star_act_face_camera", - "802ed39c" : "bhv_celebration_star_loop", - "802ed40c" : "bhv_celebration_star_sparkle_loop", - "802ed45c" : "bhv_star_key_collection_puff_spawner_loop", - "802ed498" : "bhv_lll_drawbridge_spawner_loop", - "802ed62c" : "bhv_lll_drawbridge_loop", - "802ed78c" : "bhv_small_bomp_init", - "802ed7fc" : "bhv_small_bomp_loop", - "802edacc" : "bhv_large_bomp_init", - "802edb2c" : "bhv_large_bomp_loop", - "802eddfc" : "bhv_wf_sliding_platform_init", - "802edf28" : "bhv_wf_sliding_platform_loop", - "802ee124" : "bhv_moneybag_init", - "802ee1a0" : "moneybag_check_mario_collision", - "802ee268" : "moneybag_jump", - "802ee46c" : "moneybag_act_move_around", - "802ee598" : "moneybag_act_return_home", - "802ee728" : "moneybag_act_disappear", - "802ee778" : "moneybag_act_death", - "802ee7e0" : "bhv_moneybag_loop", - "802ee8f4" : "bhv_moneybag_hidden_loop", - "802ee9cc" : "bhv_bowling_ball_init", - "802eea24" : "bowling_ball_set_hitbox", - "802eea7c" : "bowling_ball_set_waypoints", - "802eeb64" : "bhv_bowling_ball_roll_loop", - "802eecb8" : "bhv_bowling_ball_initializeLoop", - "802eedf0" : "bhv_bowling_ball_loop", - "802eeeb4" : "bhv_generic_bowling_ball_spawner_init", - "802eef9c" : "bhv_generic_bowling_ball_spawner_loop", - "802ef0e8" : "bhv_thi_bowling_ball_spawner_loop", - "802ef21c" : "bhv_bob_pit_bowling_ball_init", - "802ef274" : "bhv_bob_pit_bowling_ball_loop", - "802ef34c" : "bhv_free_bowling_ball_init", - "802ef3f4" : "bhv_free_bowling_ball_roll_loop", - "802ef524" : "bhv_free_bowling_ball_loop", - "802ef63c" : "bhv_rr_cruiser_wing_init", - "802ef66c" : "bhv_rr_cruiser_wing_loop", - "802ef820" : "bhv_spindel_init", - "802ef858" : "bhv_spindel_loop", - "802efcd0" : "bhv_ssl_moving_pyramid_wall_init", - "802efd8c" : "bhv_ssl_moving_pyramid_wall_loop", - "802efe64" : "bhv_pyramid_elevator_init", - "802efef4" : "bhv_pyramid_elevator_loop", - "802f0104" : "bhv_pyramid_elevator_trajectory_marker_ball_loop", - "802f0168" : "bhv_pyramid_top_init", - "802f0288" : "bhv_pyramid_top_spinning", - "802f04a0" : "bhv_pyramid_top_explode", - "802f05b4" : "bhv_pyramid_top_loop", - "802f06a8" : "bhv_pyramid_top_fragment_init", - "802f0714" : "bhv_pyramid_top_fragment_loop", - "802f0788" : "bhv_pyramid_pillar_touch_detector_loop", - "802f07f4" : "bhv_waterfall_sound_loop", - "802f0820" : "bhv_volcano_sound_loop", - "802f084c" : "bhv_castle_flag_init", - "802f0898" : "bhv_birds_sound_loop", - "802f0950" : "bhv_ambient_sounds_init", - "802f09a4" : "bhv_sand_sound_loop", - "802f09f0" : "bhv_castle_cannon_grate_init", - "802f0a40" : "bhv_snowmans_bottom_init", - "802f0b7c" : "set_rolling_sphere_hitbox", - "802f0bd4" : "adjust_rolling_face_pitch", - "802f0c94" : "snowmans_bottom_act_1", - "802f0df0" : "snowmans_bottom_act_2", - "802f0fa8" : "snowmans_bottom_act_3", - "802f105c" : "bhv_snowmans_bottom_loop", - "802f120c" : "bhv_snowmans_head_init", - "802f1370" : "bhv_snowmans_head_loop", - "802f151c" : "bhv_snowmans_body_checkpoint_loop", - "802f15a8" : "bhv_big_boulder_init", - "802f162c" : "boulder_act_1", - "802f1714" : "bhv_big_boulder_loop", - "802f17f0" : "bhv_big_boulder_generator_loop", - "802f1954" : "cap_set_hitbox", - "802f19c8" : "cap_despawn", - "802f1a10" : "cap_check_quicksand", - "802f1bb8" : "cap_sink_quicksand", - "802f1d64" : "bhv_wing_cap_init", - "802f1dc0" : "cap_scale_vertically", - "802f1e5c" : "wing_vanish_cap_act_0", - "802f1f3c" : "bhv_wing_vanish_cap_loop", - "802f1fd0" : "bhv_metal_cap_init", - "802f2030" : "metal_cap_act_0", - "802f20ac" : "bhv_metal_cap_loop", - "802f2140" : "bhv_normal_cap_init", - "802f21e0" : "normal_cap_set_save_flags", - "802f2284" : "normal_cap_act_0", - "802f23a8" : "bhv_normal_cap_loop", - "802f2498" : "bhv_vanish_cap_init", - "802f24f4" : "bhv_collect_star_init", - "802f25b0" : "bhv_collect_star_loop", - "802f2614" : "bhv_star_spawn_init", - "802f2768" : "bhv_star_spawn_loop", - "802f2aa0" : "spawn_star", - "802f2b88" : "spawn_default_star", - "802f2bd4" : "spawn_red_coin_cutscene_star", - "802f2c24" : "spawn_no_exit_star", - "802f2c84" : "bhv_hidden_red_coin_star_init", - "802f2d8c" : "bhv_hidden_red_coin_star_loop", - "802f2e6c" : "bhv_red_coin_init", - "802f2f2c" : "bhv_red_coin_loop", - "802f3014" : "bhv_hidden_star_init", - "802f30f0" : "bhv_hidden_star_loop", - "802f31bc" : "bhv_hidden_star_trigger_loop", - "802f328c" : "bhv_bowser_course_red_coin_star_loop", - "802f336c" : "bhv_ttm_rolling_log_init", - "802f341c" : "rolling_log_roll_log", - "802f36a4" : "bhv_rolling_log_loop", - "802f38b0" : "volcano_act_1", - "802f39b4" : "volcano_act_3", - "802f3a30" : "bhv_volcano_trap_loop", - "802f3b98" : "bhv_lll_rolling_log_init", - "802f3c54" : "bhv_1up_interact", - "802f3cc8" : "bhv_1up_common_init", - "802f3d30" : "bhv_1up_init", - "802f3dd0" : "one_up_loop_in_air", - "802f3ea8" : "pole_1up_move_towards_mario", - "802f401c" : "one_up_move_away_from_mario", - "802f40cc" : "bhv_1up_walking_loop", - "802f4248" : "bhv_1up_running_away_loop", - "802f43b8" : "sliding_1up_move", - "802f44c0" : "bhv_1up_sliding_loop", - "802f45b8" : "bhv_1up_loop", - "802f45f0" : "bhv_1up_jump_on_approach_loop", - "802f4710" : "bhv_1up_hidden_loop", - "802f48f4" : "bhv_1up_hidden_trigger_loop", - "802f496c" : "bhv_1up_hidden_in_pole_loop", - "802f4b00" : "bhv_1up_hidden_in_pole_trigger_loop", - "802f4b78" : "bhv_1up_hidden_in_pole_spawner_loop", - "802f4c68" : "controllable_platform_act_1", - "802f4ce0" : "controllable_platform_act_2", - "802f4d78" : "bhv_controllable_platform_sub_loop", - "802f4eb4" : "bhv_controllable_platform_init", - "802f5010" : "controllable_platform_hit_wall", - "802f5068" : "controllable_platform_check_walls", - "802f52c0" : "controllable_platform_shake_on_wall_hit", - "802f547c" : "controllable_platform_tilt_from_mario", - "802f55a4" : "bhv_controllable_platform_loop", - "802f5cd4" : "bhv_breakable_box_small_init", - "802f5d78" : "small_breakable_box_spawn_dust", - "802f5e44" : "small_breakable_box_act_move", - "802f5f48" : "breakable_box_small_released_loop", - "802f6014" : "breakable_box_small_idle_loop", - "802f60d8" : "breakable_box_small_get_dropped", - "802f6150" : "breakable_box_small_get_thrown", - "802f6228" : "bhv_breakable_box_small_loop", - "802f62e4" : "bhv_sliding_snow_mound_loop", - "802f6448" : "bhv_snow_mound_spawn_loop", - "802f6588" : "floating_platform_find_home_y", - "802f665c" : "floating_platform_act_0", - "802f6984" : "bhv_floating_platform_loop", - "802f6c0c" : "bhv_arrow_lift_loop", - "802f6d20" : "bhv_orange_number_init", - "802f6d58" : "bhv_orange_number_loop", - "802f6e40" : "bhv_manta_ray_init", - "802f6eb0" : "manta_ray_move", - "802f7068" : "manta_ray_act_spawn_ring", - "802f7264" : "bhv_manta_ray_loop", - "802f7348" : "bhv_falling_pillar_init", - "802f7398" : "bhv_falling_pillar_spawn_hitboxes", - "802f7418" : "bhv_falling_pillar_calculate_angle_in_front_of_mario", - "802f74dc" : "bhv_falling_pillar_loop", - "802f7760" : "bhv_falling_pillar_hitbox_loop", - "802f7924" : "bhv_jrb_floating_box_loop", - "802f7978" : "bhv_decorative_pendulum_init", - "802f79b0" : "bhv_decorative_pendulum_loop", - "802f7a58" : "bhv_treasure_chest_top_loop", - "802f7c9c" : "bhv_treasure_chest_bottom_init", - "802f7d04" : "bhv_treasure_chest_bottom_loop", - "802f7f1c" : "spawn_treasure_chest", - "802f7fa0" : "bhv_treasure_chest_ship_init", - "802f8044" : "bhv_treasure_chest_ship_loop", - "802f8158" : "bhv_treasure_chest_jrb_init", - "802f8208" : "bhv_treasure_chest_jrb_loop", - "802f82f8" : "bhv_treasure_chest_init", - "802f83a4" : "bhv_treasure_chest_loop", - "802f8490" : "bhv_mips_init", - "802f85e0" : "bhv_mips_find_furthest_waypoint_to_mario", - "802f8760" : "bhv_mips_act_wait_for_nearby_mario", - "802f8808" : "bhv_mips_act_follow_path", - "802f893c" : "bhv_mips_act_wait_for_animation_done", - "802f8988" : "bhv_mips_act_fall_down", - "802f8a34" : "bhv_mips_act_idle", - "802f8ab4" : "bhv_mips_free", - "802f8b54" : "bhv_mips_held", - "802f8c74" : "bhv_mips_dropped", - "802f8cf8" : "bhv_mips_thrown", - "802f8dac" : "bhv_mips_loop", - "802f8e54" : "bhv_yoshi_init", - "802f8f08" : "yoshi_walk_loop", - "802f9054" : "yoshi_idle_loop", - "802f923c" : "yoshi_talk_loop", - "802f93a8" : "yoshi_walk_and_jump_off_roof_loop", - "802f9500" : "yoshi_finish_jumping_and_despawn_loop", - "802f95ac" : "yoshi_give_present_loop", - "802f965c" : "bhv_yoshi_loop", - "802fbc4c" : "bhv_koopa_init", - "802fc414" : "shelled_koopa_attack_handler", - "802fcc00" : "obj_begin_race", - "802fd7f8" : "bhv_koopa_update", - "802fd950" : "bhv_koopa_race_endpoint_update", - "802fda28" : "bhv_pokey_body_part_update", - "802fe3b0" : "bhv_pokey_update", - "802fe8b4" : "bhv_swoop_update", - "802ff040" : "bhv_fly_guy_update", - "802ff214" : "bhv_goomba_triplet_spawner_update", - "802ff408" : "bhv_goomba_init", - "802ff94c" : "huge_goomba_weakly_attacked", - "802ff96c" : "bhv_goomba_update", - "802ffb38" : "bhv_chain_chomp_chain_part_update", - "80300e40" : "bhv_chain_chomp_update", - "80300ecc" : "bhv_wooden_post_update", - "80301148" : "bhv_chain_chomp_gate_init", - "80301180" : "bhv_chain_chomp_gate_update", - "80301210" : "bhv_wiggler_body_part_update", - "803014cc" : "wiggler_init_segments", - "803016e0" : "wiggler_update_segments", - "803020e4" : "wiggler_jumped_on_attack_handler", - "80302154" : "bhv_wiggler_update", - "80302910" : "bhv_spiny_update", - "80303028" : "bhv_enemy_lakitu_update", - "8030369c" : "bhv_cloud_update", - "80303744" : "bhv_cloud_part_update", - "80303984" : "bhv_camera_lakitu_init", - "80303f64" : "bhv_camera_lakitu_update", - "803043f8" : "bhv_monty_mole_hole_update", - "80304474" : "monty_mole_spawn_dirt_particles", - "803044c0" : "bhv_monty_mole_init", - "80304ba8" : "bhv_monty_mole_update", - "80304fd4" : "bhv_monty_mole_rock_update", - "80305100" : "bhv_platform_on_track_init", - "80305a58" : "bhv_platform_on_track_update", - "80305bb0" : "bhv_track_ball_update", - "80305c14" : "bhv_seesaw_platform_init", - "80305c90" : "bhv_seesaw_platform_update", - "80305e2c" : "bhv_ferris_wheel_axle_init", - "80305f24" : "bhv_ferris_wheel_platform_update", - "80306084" : "bhv_water_bomb_spawner_update", - "803062a8" : "water_bomb_spawn_explode_particles", - "803067e8" : "bhv_water_bomb_update", - "803068c0" : "bhv_water_bomb_shadow_update", - "8030699c" : "bhv_ttc_rotating_solid_init", - "80306a38" : "bhv_ttc_rotating_solid_update", - "80306cc4" : "bhv_ttc_pendulum_init", - "80306d38" : "bhv_ttc_pendulum_update", - "80306f48" : "bhv_ttc_treadmill_init", - "80307010" : "bhv_ttc_treadmill_update", - "803071b8" : "bhv_ttc_moving_bar_init", - "80307670" : "bhv_ttc_moving_bar_update", - "80307760" : "bhv_ttc_cog_init", - "803077e0" : "bhv_ttc_cog_update", - "80307930" : "bhv_ttc_pit_block_init", - "803079c8" : "bhv_ttc_pit_block_update", - "80307ae4" : "bhv_ttc_elevator_init", - "80307b58" : "bhv_ttc_elevator_update", - "80307c88" : "bhv_ttc_2d_rotator_init", - "80307cf8" : "bhv_ttc_2d_rotator_update", - "80307ea4" : "bhv_ttc_spinner_update", - "80307fb8" : "mr_blizzard_spawn_white_particles", - "8030803c" : "bhv_mr_blizzard_init", - "80308d6c" : "bhv_mr_blizzard_update", - "80309154" : "bhv_mr_blizzard_snowball", - "803091e0" : "bhv_sliding_plat_2_init", - "80309354" : "bhv_sliding_plat_2_loop", - "80309454" : "bhv_rotating_octagonal_plat_init", - "803094d0" : "bhv_rotating_octagonal_plat_loop", - "803094f8" : "bhv_animates_on_floor_switch_press_init", - "80309530" : "bhv_animates_on_floor_switch_press_loop", - "803097a4" : "bhv_activated_back_and_forth_platform_init", - "803098c0" : "bhv_activated_back_and_forth_platform_update", - "80309b64" : "bhv_recovery_heart_loop", - "80309cec" : "bhv_bubble_cannon_barrel_loop", - "80309ed4" : "water_bomb_cannon_act_0", - "80309f68" : "water_bomb_cannon_act_1", - "8030a0e8" : "water_bomb_cannon_act_2", - "8030a11c" : "bhv_water_bomb_cannon_loop", - "8030a1c0" : "bhv_unagi_init", - "8030a2a8" : "unagi_act_0", - "8030a390" : "unagi_act_1_4", - "8030a514" : "unagi_act_2", - "8030a614" : "unagi_act_3", - "8030a93c" : "bhv_unagi_loop", - "8030aabc" : "bhv_unagi_subobject_loop", - "8030ad04" : "dorrie_raise_head", - "8030ae9c" : "dorrie_act_move", - "8030b0b8" : "dorrie_begin_head_raise", - "8030b0f0" : "dorrie_act_lower_head", - "8030b220" : "dorrie_act_raise_head", - "8030b2f4" : "bhv_dorrie_update", - "8030b658" : "bhv_haunted_chair_init", - "8030b6d8" : "haunted_chair_act_0", - "8030ba68" : "haunted_chair_act_1", - "8030bc90" : "bhv_haunted_chair_loop", - "8030bfd0" : "bhv_mad_piano_update", - "8030c06c" : "flying_bookend_act_0", - "8030c0f0" : "flying_bookend_act_1", - "8030c210" : "flying_bookend_act_2", - "8030c2c8" : "flying_bookend_act_3", - "8030c364" : "bhv_flying_bookend_loop", - "8030c4b0" : "bhv_bookend_spawn_loop", - "8030c564" : "bookshelf_manager_act_0", - "8030c60c" : "bookshelf_manager_act_1", - "8030c6a4" : "bookshelf_manager_act_2", - "8030c828" : "bookshelf_manager_act_3", - "8030c894" : "bookshelf_manager_act_4", - "8030c8ec" : "bhv_haunted_bookshelf_manager_loop", - "8030c98c" : "bhv_book_switch_loop", - "8030cd30" : "obj_spit_fire", - "8030cddc" : "bhv_fire_piranha_plant_init", - "8030d2f0" : "bhv_fire_piranha_plant_update", - "8030d598" : "bhv_fire_spitter_update", - "8030d640" : "bhv_small_piranha_flame_loop", - "8030d8d4" : "bhv_fly_guy_flame_loop", - "8030d93c" : "geo_snufit_move_mask", - "8030d9ac" : "geo_snufit_scale_body", - "8030da14" : "snufit_act_idle", - "8030db38" : "snufit_act_shoot", - "8030dc70" : "bhv_snufit_loop", - "8030dfc4" : "bhv_snufit_balls_loop", - "8030e14c" : "bhv_horizontal_grindel_init", - "8030e16c" : "bhv_horizontal_grindel_update", - "8030ea9c" : "bhv_eyerok_boss_loop", - "8030fff8" : "bhv_eyerok_hand_loop", - "80310498" : "bhv_klepto_init", - "8031126c" : "obj_set_speed_to_zero", - "8031129c" : "bhv_klepto_update", - "80311874" : "bhv_bird_update", - "803118e4" : "bhv_racing_penguin_init", - "80312070" : "bhv_racing_penguin_update", - "80312168" : "bhv_penguin_race_finish_line_update", - "80312200" : "bhv_penguin_race_shortcut_check_update", - "80312248" : "bhv_coffin_spawner_loop", - "80312370" : "coffin_act_idle", - "8031262c" : "coffin_act_stand_up", - "8031274c" : "bhv_coffin_loop", - "80312804" : "clam_act_0", - "80312900" : "clam_act_1", - "80312a54" : "bhv_clam_loop", - "80313110" : "bhv_skeeter_update", - "803131e8" : "bhv_skeeter_wave_update", - "8031326c" : "bhv_swing_platform_init", - "80313294" : "bhv_swing_platform_update", - "80313354" : "bhv_donut_platform_spawner_update", - "80313530" : "bhv_donut_platform_update", - "803136cc" : "bhv_ddd_pole_init", - "80313754" : "bhv_ddd_pole_update", - "803137f4" : "bhv_red_coin_star_marker_init", - "80313fc0" : "bhv_triplet_butterfly_update", - "80314098" : "bubba_act_0", - "8031427c" : "bubba_act_1", - "803145d4" : "bhv_bubba_loop", - "80314a30" : "prepare_reverb_ring_buffer", - "80314cc0" : "get_volume_ramping", - "80314de4" : "synthesis_execute", - "80314f64" : "synthesis_do_one_audio_update", - "80315590" : "synthesis_process_notes", - "80316010" : "load_wave_samples", - "803160dc" : "final_resample", - "80316138" : "process_envelope", - "8031619c" : "process_envelope_inner", - "803166fc" : "note_apply_headset_pan_effects", - "80316ac8" : "note_init_volume", - "80316af4" : "note_set_vel_pan_reverb", - "80316da8" : "note_set_frequency", - "80316db4" : "note_enable", - "80316e00" : "note_disable", - "80316e80" : "reset_bank_and_seq_load_status", - "80316ec4" : "discard_bank", - "80316fb4" : "discard_sequence", - "80317040" : "soundAlloc", - "803170b4" : "sound_alloc_pool_init", - "803170d4" : "persistent_pool_clear", - "803170e8" : "temporary_pool_clear", - "80317118" : "unused_803160F8", - "80317128" : "sound_init_main_pools", - "80317184" : "session_pools_init", - "80317200" : "seq_and_bank_pool_init", - "8031727c" : "persistent_pools_init", - "80317338" : "temporary_pools_init", - "803173fc" : "alloc_bank_or_seq", - "8031782c" : "get_bank_or_seq", - "803178ec" : "decrease_reverb_gain", - "80317914" : "wait_for_audio_frames", - "80317948" : "audio_reset_session", - "80318040" : "audio_dma_copy_immediate", - "803180c4" : "audio_dma_copy_async", - "80318130" : "audio_dma_partial_copy_async", - "803181ec" : "decrease_sample_dma_ttls", - "80318300" : "dma_sample_data", - "80318634" : "init_sample_dma_buffers", - "803188f4" : "patch_audio_bank", - "80318b30" : "bank_load_immediate", - "80318c8c" : "bank_load_async", - "80318dc4" : "sequence_dma_immediate", - "80318e70" : "sequence_dma_async", - "80318fac" : "get_missing_bank", - "803190f4" : "load_banks_immediate", - "80319220" : "preload_sequence", - "80319328" : "load_sequence", - "80319388" : "load_sequence_internal", - "8031950c" : "audio_init", - "80319920" : "note_init", - "80319998" : "note_disable2", - "803199b8" : "process_notes", - "80319db8" : "seq_channel_layer_decay_release_internal", - "80319f64" : "seq_channel_layer_note_decay", - "80319f84" : "seq_channel_layer_note_release", - "80319fa4" : "build_synthetic_wave", - "8031a1d0" : "init_synthetic_wave", - "8031a254" : "init_note_list", - "8031a264" : "init_note_lists", - "8031a2b4" : "init_note_free_list", - "8031a368" : "note_pool_clear", - "8031a494" : "note_pool_fill", - "8031a5d0" : "audio_list_push_front", - "8031a610" : "audio_list_remove", - "8031a63c" : "pop_node_with_value_less_equal", - "8031a6cc" : "note_init_for_layer", - "8031a794" : "func_80319728", - "8031a7c8" : "note_release_and_take_ownership", - "8031a820" : "alloc_note_from_disabled", - "8031a89c" : "alloc_note_from_decaying", - "8031a8f0" : "alloc_note_from_active", - "8031a94c" : "alloc_note", - "8031ac34" : "reclaim_notes", - "8031adac" : "note_init_all", - "8031aee8" : "sequence_player_process_sound", - "8031b0cc" : "get_portamento_freq_scale", - "8031b1c0" : "get_vibrato_pitch_change", - "8031b248" : "get_vibrato_freq_scale", - "8031b440" : "note_vibrato_update", - "8031b4a0" : "note_vibrato_init", - "8031b58c" : "adsr_init", - "8031b5ac" : "adsr_update", - "8031b830" : "sequence_channel_init", - "8031b940" : "seq_channel_set_layer", - "8031ba30" : "seq_channel_layer_disable", - "8031ba6c" : "seq_channel_layer_free", - "8031baf0" : "sequence_channel_disable", - "8031bb5c" : "allocate_sequence_channel", - "8031bba4" : "sequence_player_init_channels", - "8031bcd0" : "sequence_player_disable_channels", - "8031bda0" : "sequence_channel_enable", - "8031be44" : "sequence_player_disable", - "8031bf14" : "audio_list_push_back", - "8031bf54" : "audio_list_pop_back", - "8031bf94" : "init_layer_freelist", - "8031c03c" : "m64_read_u8", - "8031c050" : "m64_read_s16", - "8031c080" : "m64_read_compressed_u16", - "8031c0c4" : "seq_channel_layer_process_script", - "8031c200" : "L8031C200", - "8031c23c" : "L8031C23C", - "8031c298" : "L8031C298", - "8031c2dc" : "L8031C2DC", - "8031c328" : "L8031C328", - "8031c36c" : "L8031C36C", - "8031c3bc" : "L8031C3BC", - "8031c3e8" : "L8031C3E8", - "8031c454" : "L8031C454", - "8031c4a4" : "L8031C4A4", - "8031c5c8" : "L8031C5C8", - "8031c698" : "L8031C698", - "8031c6a0" : "L8031C6A0", - "8031cbe0" : "L8031CBE0", - "8031cbec" : "L8031CBEC", - "8031ce54" : "get_instrument", - "8031cfd4" : "set_instrument", - "8031d068" : "sequence_channel_set_volume", - "8031d08c" : "sequence_channel_process_script", - "8031d144" : "L_U_8031D144", - "8031d1f8" : "L_U_8031D1F8", - "8031d234" : "L_U_8031D234", - "8031d26c" : "L_U_8031D26C", - "8031d2b4" : "L_U_8031D2B4", - "8031d2c4" : "L_U_8031D2C4", - "8031d31c" : "L_U_8031D31C", - "8031d344" : "L_U_8031D344", - "8031d354" : "L_U_8031D354", - "8031d370" : "L_U_8031D370", - "8031d3a8" : "L_U_8031D3A8", - "8031d3c4" : "L_U_8031D3C4", - "8031d3d4" : "L_U_8031D3D4", - "8031d3e4" : "L_U_8031D3E4", - "8031d400" : "L_U_8031D400", - "8031d424" : "L_U_8031D424", - "8031d44c" : "L_U_8031D44C", - "8031d474" : "L_U_8031D474", - "8031d498" : "L_U_8031D498", - "8031d4bc" : "L_U_8031D4BC", - "8031d4d4" : "L_U_8031D4D4", - "8031d4f0" : "L_U_8031D4F0", - "8031d500" : "L_U_8031D500", - "8031d51c" : "L_U_8031D51C", - "8031d538" : "L_U_8031D538", - "8031d56c" : "L_U_8031D56C", - "8031d5a0" : "L_U_8031D5A0", - "8031d5b4" : "L_U_8031D5B4", - "8031d5d4" : "L_U_8031D5D4", - "8031d5e4" : "L_U_8031D5E4", - "8031d640" : "L_U_8031D640", - "8031d678" : "L_U_8031D678", - "8031d6c4" : "L_U_8031D6C4", - "8031d6d4" : "L_U_8031D6D4", - "8031d6f4" : "L_U_8031D6F4", - "8031d718" : "L_U_8031D718", - "8031d728" : "L_U_8031D728", - "8031d73c" : "L_U_8031D73C", - "8031d7b8" : "L_U_8031D7B8", - "8031d7e8" : "L_U_8031D7E8", - "8031d7f8" : "L_U_8031D7F8", - "8031d814" : "L_U_8031D814", - "8031d830" : "L_U_8031D830", - "8031d87c" : "L_U_8031D87C", - "8031d898" : "L_U_8031D898", - "8031d8f8" : "L_U_8031D8F8", - "8031d900" : "L_U_8031D900", - "8031d930" : "L_U_8031D930", - "8031d94c" : "L_U_8031D94C", - "8031d974" : "L_U_8031D974", - "8031d9ec" : "sequence_player_process_sequence", - "8031e240" : "process_sequences", - "8031e2e8" : "init_sequence_player", - "8031e374" : "init_sequence_players", - "8031e4f0" : "unused_8031E4F0", - "8031e568" : "unused_8031E568", - "8031e578" : "sequence_player_fade_out_internal", - "8031e5c0" : "func_8031D690", - "8031e60c" : "func_8031D6E4", - "8031e6a4" : "func_8031D7B0", - "8031e710" : "func_8031D838", - "8031e7b8" : "create_next_audio_frame_task", - "8031eb00" : "play_sound", - "8031eb30" : "process_sound_request", - "8031edec" : "process_all_sound_requests", - "8031ee70" : "func_8031DFE8", - "8031ef6c" : "func_8031E0E4", - "8031eff4" : "func_8031E16C", - "8031f810" : "get_sound_pan", - "8031f96c" : "get_sound_dynamics", - "8031fb20" : "get_sound_freq_scale", - "8031fbe8" : "get_sound_reverb", - "8031fd84" : "audio_signal_game_loop_tick", - "8031fdac" : "update_game_sound", - "80320544" : "play_sequence", - "80320678" : "sequence_player_fade_out", - "803206bc" : "fade_volume_scale", - "80320734" : "fade_channel_volume_scale", - "8032080c" : "func_8031F96C", - "803208ec" : "process_level_music_dynamics", - "80320a4c" : "L8031FBAC", - "80320a8c" : "L8031FBEC", - "80320acc" : "L8031FC2C", - "80320b0c" : "L8031FC6C", - "80320b4c" : "L8031FCAC", - "80320b8c" : "L8031FCEC", - "80320bcc" : "L8031FD2C", - "80320bf4" : "L8031FD54", - "80320d70" : "unused_8031FED0", - "80320e3c" : "func_8031FFB4", - "80320ec4" : "sequence_player_unlower", - "80320f68" : "func_803200E4", - "803210d4" : "set_sound_disabled", - "8032112c" : "sound_init", - "80321398" : "get_currently_playing_sound", - "80321474" : "func_803205E8", - "80321584" : "func_803206F8", - "8032171c" : "func_80320890", - "8032174c" : "sound_banks_disable", - "803217a8" : "disable_all_sequence_players", - "8032180c" : "sound_banks_enable", - "80321864" : "unused_803209D8", - "803218d8" : "func_80320A4C", - "803218f4" : "play_dialog_sound", - "803219ac" : "play_music", - "80321bac" : "stop_background_music", - "80321ce4" : "fadeout_background_music", - "80321d38" : "drop_queued_background_music", - "80321d5c" : "get_current_background_music", - "80321d9c" : "func_80320ED8", - "80321e48" : "play_secondary_music", - "80321f48" : "func_80321080", - "80321f9c" : "func_803210D4", - "80322078" : "play_course_clear", - "803220b4" : "play_peachs_jingle", - "803220f0" : "play_puzzle_jingle", - "8032212c" : "play_star_fanfare", - "80322168" : "play_power_star_jingle", - "803221b8" : "play_race_fanfare", - "803221f4" : "play_toads_jingle", - "80322230" : "sound_reset", - "8032231c" : "audio_set_sound_mode", - "80322348" : "unused_80321460", - "8032235c" : "unused_80321474", - "803223b0" : "osSetTime", - "803223e0" : "osMapTLB", - "803224a0" : "osUnmapTLBAll", - "803224f0" : "sprintf", - "8032255c" : "proutSprintf", - "803225a0" : "osCreateMesgQueue", - "803225d0" : "osSetEventMesg", - "80322640" : "osViSetEvent", - "803226b0" : "osCreateThread", - "80322800" : "osRecvMesg", - "80322940" : "_VirtualToPhysicalTask", - "80322a5c" : "osSpTaskLoad", - "80322bbc" : "osSpTaskStartGo", - "80322c00" : "osSpTaskYield", - "80322c20" : "osSendMesg", - "80322d70" : "osSpTaskYielded", - "80322df0" : "osStartThread", - "80322f40" : "osWritebackDCacheAll", - "80322f70" : "osCreateViManager", - "803230f4" : "viMgrMain", - "803232d0" : "osViSetMode", - "80323340" : "osViBlack", - "803233b0" : "osViSetSpecialFeatures", - "80323570" : "osCreatePiManager", - "803236f0" : "osSetThreadPri", - "803237d0" : "osInitialize", - "80323a00" : "osViSwapBuffer", - "80323a50" : "sqrtf", - "80323a60" : "osContStartReadData", - "80323b24" : "osContGetReadData", - "80323bcc" : "__osPackReadData", - "80323cc0" : "osContInit", - "80323ebc" : "__osContGetInitData", - "80323f8c" : "__osPackRequestData", - "80324080" : "osEepromProbe", - "803240f0" : "__ull_rshift", - "8032411c" : "__ull_rem", - "80324158" : "__ull_div", - "80324194" : "__ll_lshift", - "803241c0" : "__ll_rem", - "803241fc" : "__ll_div", - "80324258" : "__ll_mul", - "80324288" : "__ull_divremi", - "803242e8" : "__ll_mod", - "80324384" : "__ll_rshift", - "803243b0" : "osInvalDCache", - "80324460" : "osPiStartDma", - "80324570" : "bzero", - "80324610" : "osInvalICache", - "80324690" : "osEepromLongRead", - "803247d0" : "osEepromLongWrite", - "80324910" : "bcopy", - "80324c20" : "guOrthoF", - "80324d74" : "guOrtho", - "80324de0" : "guPerspectiveF", - "80325010" : "guPerspective", - "80325070" : "osGetTime", - "80325100" : "__d_to_ll", - "8032511c" : "__f_to_ll", - "80325138" : "__d_to_ull", - "803251d8" : "__f_to_ull", - "80325274" : "__ll_to_d", - "8032528c" : "__ll_to_f", - "803252a4" : "__ull_to_d", - "803252d8" : "__ull_to_f", - "80325310" : "cosf", - "80325480" : "sinf", - "80325640" : "guTranslateF", - "80325688" : "guTranslate", - "803256e0" : "guRotateF", - "80325874" : "guRotate", - "803258d0" : "guScaleF", - "80325924" : "guScale", - "80325970" : "osAiSetFrequency", - "80325bd4" : "alBnkfNew", - "80325cd8" : "alSeqFileNew", - "80325d20" : "osWritebackDCache", - "80325da0" : "osAiGetLength", - "80325db0" : "osAiSetNextBuffer", - "80325e60" : "__osTimerServicesInit", - "80325eec" : "__osTimerInterrupt", - "80326064" : "__osSetTimerIntr", - "803260d8" : "__osInsertTimer", - "80326260" : "_Printf", - "803273f0" : "memcpy", - "8032741c" : "strlen", - "80327444" : "strchr", - "80327490" : "__osDequeueThread", - "803274d0" : "__osDisableInt", - "803274f0" : "__osRestoreInt", - "80327510" : "__osViInit", - "80327640" : "__osExceptionPreamble", - "80327650" : "__osException", - "803278e4" : "L80326964", - "80327904" : "L80326984", - "80327938" : "L803269B8", - "80327a68" : "L80326AE8", - "80327ac4" : "L80326B44", - "80327ae4" : "L80326B64", - "80327b1c" : "L80326B9C", - "80327b68" : "L80326BE8", - "80327b98" : "send_mesg", - "80327c80" : "__osEnqueueAndYield", - "80327d10" : "__osEnqueueThread", - "80327d58" : "__osPopThread", - "80327d68" : "__osDispatchThread", - "80327ea8" : "__osCleanupThread", - "80327eb0" : "osVirtualToPhysical", - "80327f30" : "__osSpSetStatus", - "80327f40" : "__osSpSetPc", - "80327f80" : "__osSpRawStartDma", - "80328010" : "__osSpDeviceBusy", - "80328040" : "__osSpGetStatus", - "80328050" : "osGetThreadPri", - "80328070" : "__osViGetCurrentContext", - "80328080" : "__osViSwapContext", - "803283e0" : "osGetCount", - "803283f0" : "__osPiCreateAccessQueue", - "80328440" : "__osPiGetAccess", - "80328484" : "__osPiRelAccess", - "803284b0" : "osPiRawStartDma", - "80328590" : "__osDevMgrMain", - "80328710" : "__osSetSR", - "80328720" : "__osGetSR", - "80328730" : "__osSetFpcCsr", - "80328740" : "__osSiRawReadIo", - "80328790" : "__osSiRawWriteIo", - "803287e0" : "osMapTLBRdb", - "80328840" : "osPiRawReadIo", - "803288a0" : "__osSiCreateAccessQueue", - "803288f0" : "__osSiGetAccess", - "80328934" : "__osSiRelAccess", - "80328960" : "__osSiRawStartDma", - "80328a10" : "osSetTimer", - "80328af0" : "osEepromWrite", - "80328ca0" : "__osPackEepWriteData", - "80328dac" : "__osEepStatus", - "80328fd0" : "osJamMesg", - "80329120" : "osPiGetCmdQueue", - "80329150" : "osEepromRead", - "80329340" : "__osPackEepReadData", - "80329450" : "guMtxF2L", - "80329550" : "guMtxIdentF", - "803295d8" : "guMtxIdent", - "80329608" : "guMtxL2F", - "803296c0" : "guNormalize", - "80329750" : "__osAiDeviceBusy", - "80329780" : "__osSetCompare", - "80329790" : "_Litob", - "80329a90" : "_Ldtob", - "8032a860" : "u32_to_string", - "8032a890" : "string_to_u32", - "8032a8e8" : "send_packet", - "8032a9a8" : "send", - "8032aa80" : "process_command_memory", - "8032aacc" : "process_command_register", - "8032aaf8" : "kdebugserver", - "8032ace0" : "__osSyncPutChars", - "8032ae10" : "osSetIntMask", - "8032ae70" : "osDestroyThread", - "8032af70" : "__osProbeTLB", - "8032b030" : "__osSiDeviceBusy", - "8032b060" : "lldiv", - "8032b160" : "ldiv", - "8032b1f0" : "__osGetCause", - "8032b200" : "__osAtomicDec", - "8032b260" : "rspF3DBootStart", - "8032b330" : "rspF3DBootEnd", - "8032b330" : "rspF3DStart", - "8032c738" : "rspF3DEnd", - "8032c740" : "rspAspMainStart", - "8032d560" : "rspAspMainEnd", - "8032d560" : "gVblankHandler1", - "8032d564" : "gVblankHandler2", - "8032d568" : "gActiveSPTask", - "8032d56c" : "sCurrentAudioSPTask", - "8032d570" : "sCurrentDisplaySPTask", - "8032d574" : "sNextAudioSPTask", - "8032d578" : "sNextDisplaySPTask", - "8032d57c" : "sAudioEnabled", - "8032d580" : "sNumVblanks", - "8032d584" : "gResetTimer", - "8032d588" : "D_8032C648", - "8032d58c" : "gDebugLevelSelect", - "8032d590" : "D_8032C650", - "8032d594" : "gShowProfiler", - "8032d598" : "gShowDebugText", - "8032d5d0" : "unused8032C690", - "8032d5d4" : "gGlobalTimer", - "8032d5dc" : "frameBufferIndex", - "8032d5e0" : "D_8032C6A0", - "8032d5e4" : "gPlayer1Controller", - "8032d5e8" : "gPlayer2Controller", - "8032d5ec" : "gPlayer3Controller", - "8032d5f0" : "gCurrDemoInput", - "8032d5f4" : "gDemoInputListID", - "8032d5f8" : "gRecordedDemoInput", - "8032d6d0" : "credits01", - "8032d6d8" : "credits02", - "8032d6e4" : "credits03", - "8032d6f0" : "credits04", - "8032d700" : "credits05", - "8032d710" : "credits06", - "8032d71c" : "credits07", - "8032d728" : "credits08", - "8032d738" : "credits09", - "8032d740" : "credits10", - "8032d750" : "credits11", - "8032d75c" : "credits12", - "8032d764" : "credits13", - "8032d774" : "credits14", - "8032d77c" : "credits15", - "8032d788" : "credits16", - "8032d79c" : "credits17", - "8032d7ac" : "credits18", - "8032d7bc" : "credits19", - "8032d7c4" : "credits20", - "8032d7cc" : "sCreditsSequence", - "8032d93c" : "gMarioState", - "8032d940" : "unused1", - "8032d944" : "D_8032C9E0", - "8032daa0" : "sTerrainSounds", - "8032dacc" : "sSquishScaleOverTime", - "8032dae0" : "sCapFlickerFrames", - "8032daf8" : "gWaterSurfacePseudoFloor", - "8032dc50" : "sJumpLandAction", - "8032dc68" : "sFreefallLandAction", - "8032dc80" : "sSideFlipLandAction", - "8032dc98" : "sHoldJumpLandAction", - "8032dcb0" : "sHoldFreefallLandAction", - "8032dcc8" : "sLongJumpLandAction", - "8032dce0" : "sDoubleJumpLandAction", - "8032dcf8" : "sTripleJumpLandAction", - "8032dd10" : "sBackflipLandAction", - "8032dd40" : "sPunchingForwardVelocities", - "8032dd80" : "gLastCompletedCourseNum", - "8032dd84" : "gLastCompletedStarNum", - "8032dd88" : "sUnusedGotGlobalCoinHiScore", - "8032dd8c" : "gGotFileCoinHiScore", - "8032dd90" : "gCurrCourseStarFlags", - "8032dd94" : "gSpecialTripleJump", - "8032dd98" : "gLevelToCourseNumTable", - "8032ddc0" : "gMarioSpawnInfo", - "8032ddc4" : "gLoadedGraphNodes", - "8032ddc8" : "gAreas", - "8032ddcc" : "gCurrentArea", - "8032ddd0" : "gCurrCreditsEntry", - "8032ddd4" : "D_8032CE74", - "8032ddd8" : "D_8032CE78", - "8032dddc" : "gWarpTransDelay", - "8032dde0" : "gFBSetColor", - "8032dde4" : "gWarpTransFBSetColor", - "8032dde8" : "gWarpTransRed", - "8032ddec" : "gWarpTransGreen", - "8032ddf0" : "gWarpTransBlue", - "8032ddf4" : "gCurrSaveFileNum", - "8032ddf8" : "gCurrLevelNum", - "8032ddfc" : "sWarpBhvSpawnTable", - "8032de4c" : "sSpawnTypeFromWarpBhv", - "8032de60" : "D_8032CF00", - "8032de70" : "renderModeTable_1Cycle", - "8032deb0" : "renderModeTable_2Cycle", - "8032def0" : "gCurGraphNodeRoot", - "8032def4" : "gCurGraphNodeMasterList", - "8032def8" : "gCurGraphNodeCamFrustum", - "8032defc" : "gCurGraphNodeCamera", - "8032df00" : "gCurGraphNodeObject", - "8032df04" : "gCurGraphNodeHeldObject", - "8032df08" : "gAreaUpdateCounter", - "8032df10" : "gProfilerMode", - "8032df14" : "gCurrentFrameIndex1", - "8032df18" : "gCurrentFrameIndex2", - "8032df20" : "unused8032CFC0", - "8032df24" : "gCutsceneFocus", - "8032df28" : "unused8032CFC8", - "8032df2c" : "unused8032CFCC", - "8032df30" : "gSecondCameraFocus", - "8032df34" : "sYawSpeed", - "8032df38" : "gCurrLevelArea", - "8032df3c" : "gPrevLevel", - "8032df40" : "unused8032CFE0", - "8032df44" : "unused8032CFE4", - "8032df48" : "unused8032CFE8", - "8032df4c" : "gCameraZoomDist", - "8032df50" : "sObjectCutscene", - "8032df54" : "gRecentCutscene", - "8032df58" : "sFramesSinceCutsceneEnded", - "8032df5c" : "sCutsceneDialogResponse", - "8032df60" : "sMarioCamState", - "8032df64" : "sLuigiCamState", - "8032df68" : "unused8032D008", - "8032df6c" : "sFixedModeBasePosition", - "8032df78" : "sUnusedModeBasePosition_2", - "8032df84" : "sUnusedModeBasePosition_3", - "8032df90" : "sUnusedModeBasePosition_4", - "8032df9c" : "sUnusedModeBasePosition_5", - "8032dfa8" : "sModeTransitions", - "8032e008" : "unused8032D0A8", - "8032e010" : "unused8032D0B0", - "8032e018" : "sDanceCutsceneTable", - "8032e024" : "unusedDanceInfo1", - "8032e038" : "unusedDanceType", - "8032e03c" : "unusedDanceInfo2", - "8032e050" : "sBBHLibraryParTrackPath", - "8032e098" : "sCamSL", - "8032e0e0" : "sCamTHI", - "8032e128" : "sCamHMC", - "8032e1d0" : "sCamSSL", - "8032e248" : "sCamRR", - "8032e2f0" : "sCamBOB", - "8032e338" : "sCamCotMC", - "8032e368" : "sCamCCM", - "8032e3b0" : "sCamCastle", - "8032e6f8" : "sCamBBH", - "8032ecb0" : "sCameraTriggers", - "8032ed50" : "sIntroStartToPipePosition", - "8032ee08" : "sIntroStartToPipeFocus", - "8032eec0" : "sIntroPipeToDialogPosition", - "8032ef30" : "sIntroPipeToDialogFocus", - "8032efa0" : "sEndingFlyToWindowPos", - "8032eff0" : "sEndingFlyToWindowFocus", - "8032f048" : "sEndingPeachDescentCamPos", - "8032f0e8" : "sEndingMarioToPeachPos", - "8032f130" : "sEndingMarioToPeachFocus", - "8032f178" : "sEndingLookUpAtCastle", - "8032f1b8" : "sEndingLookAtSkyFocus", - "8032f214" : "gIntroLakituStartToPipeFocus", - "8032f32c" : "gIntroLakituStartToPipeOffsetFromCamera", - "8032f444" : "gEndWavingPos", - "8032f48c" : "gEndWavingFocus", - "8032f4d4" : "sCutsceneEnding", - "8032f534" : "sCutsceneGrandStar", - "8032f544" : "sCutsceneUnused", - "8032f554" : "sCutsceneDoorWarp", - "8032f564" : "sCutsceneEndWaving", - "8032f56c" : "sCutsceneCredits", - "8032f574" : "sCutsceneDoorPull", - "8032f59c" : "sCutsceneDoorPush", - "8032f5c4" : "sCutsceneDoorPullMode", - "8032f5dc" : "sCutsceneDoorPushMode", - "8032f5f4" : "sCutsceneEnterCannon", - "8032f60c" : "sCutsceneStarSpawn", - "8032f624" : "sCutsceneRedCoinStarSpawn", - "8032f634" : "sCutsceneEnterPainting", - "8032f63c" : "sCutsceneDeathExit", - "8032f64c" : "sCutsceneExitPaintingSuccess", - "8032f65c" : "sCutsceneUnusedExit", - "8032f674" : "sCutsceneIntroPeach", - "8032f69c" : "sCutscenePrepareCannon", - "8032f6ac" : "sCutsceneExitWaterfall", - "8032f6bc" : "sCutsceneFallToCastleGrounds", - "8032f6cc" : "sCutsceneEnterPyramidTop", - "8032f6dc" : "sCutscenePyramidTopExplode", - "8032f6f4" : "sCutsceneStandingDeath", - "8032f6fc" : "sCutsceneEnterPool", - "8032f70c" : "sCutsceneDeathStomach", - "8032f714" : "sCutsceneDeathOnBack", - "8032f71c" : "sCutsceneQuicksandDeath", - "8032f724" : "sCutsceneWaterDeath", - "8032f72c" : "sCutsceneSuffocation", - "8032f734" : "sCutsceneEnterBowserArena", - "8032f74c" : "sCutsceneDanceDefaultRotate", - "8032f754" : "sCutsceneDanceFlyAway", - "8032f75c" : "sCutsceneDanceCloseup", - "8032f764" : "sCutsceneKeyDance", - "8032f76c" : "sCutsceneCapSwitchPress", - "8032f774" : "sCutsceneSlidingDoorsOpen", - "8032f784" : "sCutsceneUnlockKeyDoor", - "8032f794" : "sCutsceneExitBowserSuccess", - "8032f7a4" : "sCutsceneExitBowserDeath", - "8032f7b4" : "sCutsceneExitSpecialSuccess", - "8032f7c4" : "sCutsceneNonPaintingDeath", - "8032f7d4" : "sCutsceneDialog", - "8032f7ec" : "sCutsceneReadMessage", - "8032f804" : "sDanceCutsceneIndexTable", - "8032f870" : "sZoomOutAreaMasks", - "8032f884" : "sBobCreditsSplinePositions", - "8032f8ac" : "sBobCreditsSplineFocus", - "8032f8d4" : "sWfCreditsSplinePositions", - "8032f8fc" : "sWfCreditsSplineFocus", - "8032f924" : "sJrbCreditsSplinePositions", - "8032f94c" : "sJrbCreditsSplineFocus", - "8032f974" : "sCcmSlideCreditsSplinePositions", - "8032f99c" : "sCcmSlideCreditsSplineFocus", - "8032f9c4" : "sBbhCreditsSplinePositions", - "8032f9e4" : "sBbhCreditsSplineFocus", - "8032fa04" : "sHmcCreditsSplinePositions", - "8032fa2c" : "sHmcCreditsSplineFocus", - "8032fa54" : "sThiWigglerCreditsSplinePositions", - "8032fa6c" : "sThiWigglerCreditsSplineFocus", - "8032fa84" : "sVolcanoCreditsSplinePositions", - "8032fab4" : "sVolcanoCreditsSplineFocus", - "8032fae4" : "sSslCreditsSplinePositions", - "8032fb14" : "sSslCreditsSplineFocus", - "8032fb44" : "sDddCreditsSplinePositions", - "8032fb7c" : "sDddCreditsSplineFocus", - "8032fbb4" : "sSlCreditsSplinePositions", - "8032fbd4" : "sSlCreditsSplineFocus", - "8032fbf4" : "sWdwCreditsSplinePositions", - "8032fc14" : "sWdwCreditsSplineFocus", - "8032fc34" : "sTtmCreditsSplinePositions", - "8032fc64" : "sTtmCreditsSplineFocus", - "8032fc94" : "sThiHugeCreditsSplinePositions", - "8032fccc" : "sThiHugeCreditsSplineFocus", - "8032fd04" : "sTtcCreditsSplinePositions", - "8032fd24" : "sTtcCreditsSplineFocus", - "8032fd44" : "sRrCreditsSplinePositions", - "8032fd64" : "sRrCreditsSplineFocus", - "8032fd84" : "sSaCreditsSplinePositions", - "8032fdac" : "sSaCreditsSplineFocus", - "8032fdd4" : "sCotmcCreditsSplinePositions", - "8032fdfc" : "sCotmcCreditsSplineFocus", - "8032fe24" : "sDddSubCreditsSplinePositions", - "8032fe4c" : "sDddSubCreditsSplineFocus", - "8032fe74" : "sCcmOutsideCreditsSplinePositions", - "8032fe94" : "sCcmOutsideCreditsSplineFocus", - "8032fec0" : "sObjectListUpdateOrder", - "8032fecc" : "sParticleTypes", - "80330000" : "D_8032F0A0", - "80330004" : "D_8032F0A4", - "80330020" : "D_8032F0C0", - "8033002c" : "D_8032F0CC", - "8033006c" : "sMrIParticleActions", - "80330074" : "sMrIActions", - "80330084" : "sMrIHitbox", - "80330094" : "D_8032F134", - "803300a8" : "unused8032F134", - "803300ac" : "sCapSwitchActions", - "803300bc" : "sKingBobombActions", - "803300e0" : "sKingBobombSoundStates", - "80330140" : "sOpenedCannonActions", - "8033015c" : "unused0EA1FC", - "80330198" : "sChuckyaActions", - "803301a8" : "sWFRotatingPlatformData", - "803301c0" : "sKoopaShellUnderwaterHitbox", - "803301d0" : "D_8032F270", - "803301e4" : "sSparkleSpawnStarHitbox", - "803301f4" : "sYellowCoinHitbox", - "80330204" : "D_8032F2A4", - "80330224" : "sCoinInsideBooActions", - "8033022c" : "D_8032F2CC", - "80330244" : "D_8032F2E4", - "80330260" : "D_8032F300", - "80330288" : "D_8032F328", - "80330290" : "D_8032F330", - "80330298" : "sGrindelThwompActions", - "803302ac" : "sTumblingBridgeParams", - "803302dc" : "sTumblingBridgeActions", - "803302ec" : "D_8032F38C", - "80330318" : "sElevatorActions", - "8033032c" : "D_8032F3CC", - "80330340" : "D_8032F3E0", - "80330354" : "D_8032F3F4", - "8033035c" : "D_8032F3FC", - "80330370" : "sUkikiCageActions", - "80330380" : "D_8032F420", - "80330390" : "sSpindriftHitbox", - "803303a0" : "sMetalBoxHitbox", - "803303b0" : "sBreakableBoxHitbox", - "803303c0" : "D_8032F460", - "803303e8" : "sHeaveHoActions", - "803303f8" : "sJumpingBoxHitbox", - "80330408" : "sJumpingBoxActions", - "8033042c" : "sBowserKeyHitbox", - "8033043c" : "sBulletBillActions", - "80330450" : "sBowserTailAnchorActions", - "8033045c" : "D_8032F4FC", - "8033046c" : "D_8032F50C", - "80330470" : "D_8032F510", - "80330474" : "D_8032F514", - "80330478" : "sBowserDefeatedDialogText", - "80330480" : "D_8032F520", - "803304c8" : "sBowserActions", - "80330518" : "D_8032F5B8", - "803305f0" : "D_8032F690", - "803305f4" : "D_8032F694", - "803305f8" : "D_8032F698", - "8033067c" : "sFallingBowserPlatformActions", - "80330688" : "sGrowingBowserFlameHitbox", - "80330698" : "sBowserFlameHitbox", - "803306a8" : "D_8032F748", - "803306b4" : "D_8032F754", - "80330738" : "sUkikiSoundStates", - "803307a0" : "sUkikiActions", - "803307c0" : "D_8032F860", - "803307f4" : "D_8032F894", - "80330828" : "D_8032F8C8", - "80330830" : "sRotatingCwFireBarsActions", - "80330840" : "sKoopaShellHitbox", - "80330850" : "D_8032F8F0", - "80330884" : "D_8032F924", - "803308a8" : "D_8032F948", - "803308cc" : "D_8032F96C", - "803308d8" : "sToxBoxActions", - "80330900" : "TablePiranhaPlantActions", - "80330b1c" : "sBowserPuzzlePieceActions", - "80330b38" : "sTuxiesMotherActions", - "80330b44" : "sSmallPenguinActions", - "80330b5c" : "sFishActions", - "80330b68" : "sFishGroupActions", - "80330b74" : "sBirdChirpChirpActions", - "80330b84" : "sCheepCheepActions", - "80330b90" : "sExclamationBoxHitbox", - "80330ba0" : "sExclamationBoxContents", - "80330c20" : "sExclamationBoxActions", - "80330c38" : "sSkullSlidingBoxHitbox", - "80330c48" : "gOpenableGrills", - "80330c58" : "sTweesterHitbox", - "80330c68" : "sTweesterActions", - "80330cd4" : "sScuttlebugHitbox", - "80330ce4" : "sWhompActions", - "80330d0c" : "sWaterSplashDropletParams", - "80330d30" : "gShallowWaterSplashDropletParams", - "80330d54" : "sWaterDropletFishParams", - "80330d78" : "gShallowWaterWaveDropletParams", - "80330d9c" : "sStrongWindParticleHitbox", - "80330dac" : "sSLWalkingPenguinErraticSteps", - "80330e20" : "D_8032FEC0", - "80330e24" : "unused_8032FEC4", - "80330e34" : "gMarioPlatform", - "80330e40" : "sDebugEffectStringInfo", - "80330e64" : "sDebugEnemyStringInfo", - "80330e88" : "sDebugInfoDPadMask", - "80330e8c" : "sDebugInfoDPadUpdID", - "80330e90" : "sDebugLvSelectCheckFlag", - "80330e94" : "sDebugPage", - "80330e98" : "sNoExtraDebug", - "80330e9c" : "sDebugStringArrPrinted", - "80330ea0" : "sDebugSysCursor", - "80330ea4" : "sDebugInfoButtonSeqID", - "80330ea8" : "sDebugInfoButtonSeq", - "80330ec0" : "sTransitionColorFadeCount", - "80330ec4" : "sTransitionTextureFadeCount", - "80330ec8" : "sTextureTransitionID", - "80330ee0" : "rectangles", - "80330f00" : "sSkyboxTextures", - "80330f28" : "sSkyboxColors", - "80330f30" : "gMovtexCounter", - "80330f34" : "gMovtexCounterPrev", - "80330f38" : "gMovtexVtxColor", - "80330f3c" : "gPaintingMarioYEntry", - "80330f40" : "gWdwWaterLevelSet", - "80330f44" : "gMovtexIdToTexture", - "80330f64" : "gMovtexNonColored", - "803311a4" : "gMovtexColored", - "8033127c" : "gMovtexColored2", - "80331300" : "sHmcPaintings", - "80331308" : "sInsideCastlePaintings", - "80331344" : "sTtmPaintings", - "8033134c" : "sPaintingGroups", - "80331358" : "gPaintingUpdateCounter", - "8033135c" : "gLastPaintingUpdateCounter", - "80331360" : "sTextLabelsCount", - "80331370" : "gDialogCharWidths", - "80331470" : "gDialogBoxState", - "80331474" : "gDialogBoxOpenTimer", - "80331478" : "gDialogBoxScale", - "8033147c" : "gDialogScrollOffsetY", - "80331480" : "gDialogBoxType", - "80331484" : "gDialogID", - "80331488" : "gLastDialogPageStrPos", - "8033148c" : "gDialogTextPos", - "80331490" : "gDialogLineNum", - "80331494" : "gLastDialogResponse", - "80331498" : "gMenuHoldKeyIndex", - "8033149c" : "gMenuHoldKeyTimer", - "803314a0" : "gDialogResponse", - "803314b0" : "gHudSymCoin", - "803314b4" : "gHudSymX", - "803314f8" : "gMenuMode", - "803314fc" : "gEndCutsceneStrEn0", - "80331504" : "gEndCutsceneStrEn1", - "80331538" : "gEndCutsceneStrEn2", - "80331558" : "gEndCutsceneStrEn3", - "8033156c" : "gEndCutsceneStrEn4", - "80331598" : "gEndCutsceneStrEn5", - "803315ac" : "gEndCutsceneStrEn6", - "803315cc" : "gEndCutsceneStrEn7", - "803315dc" : "gEndCutsceneStrEn8", - "803315e4" : "gEndCutsceneStringsEn", - "8033160c" : "gCutsceneMsgFade", - "80331610" : "gCutsceneMsgIndex", - "80331614" : "gCutsceneMsgDuration", - "80331618" : "gCutsceneMsgTimer", - "8033161c" : "gDialogCameraAngleIndex", - "80331620" : "gDialogCourseActNum", - "803316c8" : "gCourseCompleteCoinsEqual", - "803316cc" : "gCourseDoneMenuTimer", - "803316d0" : "gCourseCompleteCoins", - "803316d4" : "gHudFlash", - "80331750" : "gEnvFxMode", - "80331754" : "D_80330644", - "80331758" : "gSnowTempVtx", - "80331788" : "gSnowFlakeVertex1", - "80331790" : "gSnowFlakeVertex2", - "80331798" : "gSnowFlakeVertex3", - "803317a0" : "D_80330690", - "803317a4" : "D_80330694", - "803317a8" : "gBubbleTempVtx", - "803317e0" : "MacroObjectPresets", - "803325fc" : "sPowerMeterVisibleTimer", - "80332614" : "sPrevCheckMarioRoom", - "80332618" : "sYoshiDead", - "8033261c" : "sDebugSequenceTracker", - "80332620" : "sDebugTimer", - "803327a8" : "sBreakableBoxSmallHitbox", - "80332b00" : "sMrBlizzardHitbox", - "80332b24" : "sMrBlizzardSnowballHitbox", - "80332b34" : "D_80331A24", - "80332b54" : "D_80331A44", - "80332b5c" : "D_80331A4C", - "80332b64" : "D_80331A54", - "80332bdc" : "D_80331ACC", - "80332bf0" : "sRecoveryHeartHitbox", - "80332c00" : "sUnagiHitbox", - "80332c10" : "sHauntedChairHitbox", - "80332c30" : "sFlyingBookendHitbox", - "80332c40" : "D_80331B30", - "80332c4c" : "sBookSwitchHitbox", - "80332c5c" : "sFirePiranhaPlantHitbox", - "80332c6c" : "D_80331B5C", - "80332c74" : "sPiranhaPlantFireHitbox", - "80332c84" : "sSnufitHitbox", - "80332c94" : "sSnufitBulletHitbox", - "80332ca4" : "sEyerokHitbox", - "80332cb4" : "D_80331BA4", - "80332d10" : "coffinRelativePos", - "80332d28" : "sClamShellHitbox", - "80332d38" : "sSkeeterHitbox", - "80332d48" : "D_80331C38", - "80332e50" : "gAudioErrorFlags", - "80332e54" : "sGameLoopTicked", - "80332e58" : "sDialogSpeaker", - "80332f04" : "sDialogSpeakerVoice", - "80332f40" : "sNumProcessedSoundRequests", - "80332f44" : "sSoundRequestCount", - "80332f48" : "sDynBbh", - "80332f54" : "sDynDdd", - "80332f6c" : "sDynJrb", - "80332f88" : "sDynWdw", - "80332f98" : "sDynHmc", - "80332fa8" : "sDynUnk38", - "80332fb8" : "sDynNone", - "80332fbc" : "sCurrentMusicDynamic", - "80332fc0" : "sBackgroundMusicForDynamics", - "80332fc4" : "sLevelDynamics", - "80333060" : "sMusicDynamics", - "803330c0" : "gAreaEchoLevel", - "80333138" : "D_80332028", - "80333188" : "sBackgroundMusicDefaultVolume", - "803331ac" : "sPlayer0CurSeqId", - "803331b0" : "sMusicDynamicDelay", - "803331b4" : "D_803320A4", - "803331c0" : "D_803320B0", - "803331cc" : "D_803320BC", - "803331d8" : "sMaxChannelsForSoundBank", - "803331e4" : "sNumSoundsPerBank", - "803331f0" : "gDefaultSoundArgs", - "803331fc" : "sUnusedSoundArgs", - "80333208" : "sSoundBankDisabled", - "80333218" : "D_80332108", - "8033321c" : "sHasStartedFadeOut", - "80333220" : "D_80332110", - "80333224" : "sUnused80332114", - "80333228" : "sUnused80332118", - "8033322c" : "D_8033211C", - "80333230" : "D_80332120", - "80333234" : "D_80332124", - "80333238" : "sBackgroundMusicQueueSize", - "8033323c" : "sUnused8033323C", - "803332a0" : "gAudioSessionPresets", - "80333498" : "gAudioCosineTable", - "80333598" : "gPitchBendFrequencyScale", - "80333994" : "gNoteFrequencies", - "80333b94" : "gDefaultShortNoteVelocityTable", - "80333ba4" : "gDefaultShortNoteDurationTable", - "80333bb4" : "gVibratoCurve", - "80333bc4" : "gDefaultEnvelope", - "80333bd0" : "sSineWave", - "80333c50" : "sSquareWave", - "80333cd0" : "sTriangleWave", - "80333d50" : "sSawtoothWave", - "80333dd0" : "gWaveSamples", - "80333de0" : "gHeadsetPanQuantization", - "80333df4" : "gHeadsetPanVolume", - "80333ff4" : "gStereoPanVolume", - "803341f4" : "gDefaultPanVolume", - "803343f4" : "gVolRampingLhs136", - "803345f4" : "gVolRampingRhs136", - "803347f4" : "gVolRampingLhs144", - "803349f4" : "gVolRampingRhs144", - "80334bf4" : "gVolRampingLhs128", - "80334df4" : "gVolRampingRhs128", - "80334ff4" : "gTatumsPerBeat", - "80334ff8" : "gUnusedCount80333EE8", - "80334ffc" : "gAudioHeapSize", - "80335000" : "D_80333EF0", - "80335004" : "gAudioLoadLock", - "80335008" : "sUnused8033EF8", - "80335010" : "osViModeTable", - "803358f0" : "piMgrArgs", - "80335910" : "osClockRate", - "80335918" : "D_80334808", - "80335920" : "_osContInitialized", - "80335930" : "D_80334820", - "80335940" : "D_80334830", - "80335950" : "_spaces", - "80335974" : "_zeroes", - "803359a0" : "D_80334890", - "803359a4" : "D_80334894", - "803359a8" : "D_80334898", - "803359ac" : "D_8033489C", - "803359b0" : "D_803348A0", - "803359b4" : "D_803348A4", - "803359c0" : "D_803348B0", - "80335a20" : "D_80334910", - "80335a24" : "D_80334914", - "80335a28" : "D_80334918", - "80335a2c" : "D_8033491C", - "80335a30" : "D_80334920", - "80335a44" : "D_80334934", - "80335a48" : "D_80334938", - "80335a50" : "gOsPiAccessQueueCreated", - "80335a60" : "gOsSiAccessQueueCreated", - "80335aa0" : "D_80334990", - "80335af0" : "D_803349E0", - "80335b40" : "D_80334A30", - "80335b44" : "D_80334A34", - "80335b48" : "D_80334A38", - "80335b50" : "D_80334A40", - "80335b54" : "D_80334A44", - "80338e60" : "jtbl_80337C90", - "80338e84" : "jtbl_80337CB4", - "80338eac" : "jtbl_80337CDC", - "80338ec0" : "jtbl_80337D08", - "80338fbc" : "jtbl_80337E04", - "8033978c" : "jtbl_80338418", - "80339880" : "length_str", - "80339884" : "flags_str", - "8033988c" : "flags_arr", - "80339980" : "D_80338610", - "803399a0" : "jtbl_80338630", - "803399d0" : "NAN", - "803399e0" : "D_80338670", - "80339a40" : "D_803386D0", - "80339ac0" : "rspF3DDataStart", - "8033a2c0" : "rspF3DDataEnd", - "8033a2c0" : "rspAspMainDataStart", - "8033a580" : "rspAspMainDataEnd", - "8033a580" : "_mainSegmentEnd", - "008c0c40" : "_mainSegmentRomEnd", - "8033a580" : "_mainSegmentNoloadStart", - "8033a580" : "D_80339210", - "8033a730" : "gIdleThread", - "8033a8e0" : "gMainThread", - "8033aa90" : "gGameLoopThread", - "8033ac40" : "gSoundThread", - "8033adf0" : "gPIMesgQueue", - "8033ae08" : "gIntrMesgQueue", - "8033ae20" : "gSPTaskMesgQueue", - "8033ae38" : "gDmaMesgBuf", - "8033ae40" : "gPIMesgBuf", - "8033aec0" : "gSIEventMesgBuf", - "8033aec8" : "gIntrMesgBuf", - "8033af08" : "gUnknownMesgBuf", - "8033af48" : "gDmaIoMesg", - "8033af5c" : "D_80339BEC", - "8033af60" : "gDmaMesgQueue", - "8033af78" : "gSIEventMesgQueue", - "8033af90" : "gControllers", - "8033afe8" : "gControllerStatuses", - "8033aff8" : "gControllerPads", - "8033b010" : "gGameVblankQueue", - "8033b028" : "D_80339CB8", - "8033b040" : "D_80339CD0", - "8033b044" : "D_80339CD4", - "8033b048" : "gGameVblankHandler", - "8033b050" : "gPhysicalFrameBuffers", - "8033b05c" : "gPhysicalZBuffer", - "8033b060" : "D_80339CF0", - "8033b064" : "D_80339CF4", - "8033b068" : "gGfxSPTask", - "8033b06c" : "gDisplayListHead", - "8033b070" : "gGfxPoolEnd", - "8033b074" : "gGfxPool", - "8033b078" : "gControllerBits", - "8033b079" : "gEepromProbe", - "8033b080" : "D_80339D10", - "8033b090" : "gDemo", - "8033b0a0" : "filler80339D30", - "8033b170" : "gMarioStates", - "8033b238" : "sCurrPlayMode", - "8033b23a" : "D_80339ECA", - "8033b23c" : "sTransitionTimer", - "8033b240" : "sTransitionUpdate", - "8033b244" : "unused3", - "8033b248" : "sWarpDest", - "8033b250" : "D_80339EE0", - "8033b252" : "sDelayedWarpOp", - "8033b254" : "sDelayedWarpTimer", - "8033b256" : "sSourceWarpNodeId", - "8033b258" : "sDelayedWarpArg", - "8033b25c" : "unused4", - "8033b25e" : "sTimerRunning", - "8033b260" : "gHudDisplay", - "8033b26e" : "gShouldNotPlayCastleMusic", - "8033b270" : "sDelayInvincTimer", - "8033b272" : "sInvulnerable", - "8033b280" : "unused80339F10", - "8033b288" : "filler80339F1C", - "8033b2c0" : "sFloorAlignMatrix", - "8033b350" : "gMirrorMario", - "8033b3b0" : "gBodyStates", - "8033b400" : "sSegmentTable", - "8033b480" : "sPoolFreeSpace", - "8033b484" : "sPoolStart", - "8033b488" : "sPoolEnd", - "8033b48c" : "sPoolListHeadL", - "8033b490" : "sPoolListHeadR", - "8033b494" : "gEffectsMemoryPool", - "8033b4a0" : "gWarpCheckpoint", - "8033b4a5" : "gMainMenuDataModified", - "8033b4a6" : "gSaveFileModified", - "8033b4b0" : "gPlayerSpawnInfos", - "8033b4d0" : "D_8033A160", - "8033b8d0" : "gAreaData", - "8033bab0" : "gWarpTransition", - "8033bac6" : "gCurrCourseNum", - "8033bac8" : "gCurrActNum", - "8033baca" : "gCurrAreaIndex", - "8033bacc" : "gSavedCourseNum", - "8033bace" : "gPauseScreenMode", - "8033bad0" : "gSaveOptSelectIndex", - "8033bae0" : "gMatStackIndex", - "8033bae8" : "gMatStack", - "8033c2e8" : "gMatStackFixed", - "8033c368" : "gGeoTempState", - "8033c378" : "gCurAnimType", - "8033c379" : "gCurAnimEnabled", - "8033c37a" : "gCurrAnimFrame", - "8033c37c" : "gCurAnimTranslationMultiplier", - "8033c380" : "gCurrAnimAttribute", - "8033c384" : "gCurAnimData", - "8033c388" : "gDisplayListHeap", - "8033c390" : "gProfilerFrameData", - "8033c520" : "gPlayerCameraState", - "8033c568" : "sOldPosition", - "8033c578" : "sOldFocus", - "8033c588" : "sPlayer2FocusOffset", - "8033c594" : "sCreditsPlayer2Pitch", - "8033c596" : "sCreditsPlayer2Yaw", - "8033c598" : "sFramesPaused", - "8033c5a0" : "sFOVState", - "8033c5c0" : "sModeTransition", - "8033c5e8" : "sMarioGeometry", - "8033c61c" : "unusedFreeRoamWallYaw", - "8033c61e" : "sAvoidYawVel", - "8033c620" : "sCameraYawAfterDoorCutscene", - "8033c622" : "unusedSplinePitch", - "8033c624" : "unusedSplineYaw", - "8033c628" : "sHandheldShakeSpline", - "8033c668" : "sHandheldShakeMag", - "8033c66c" : "sHandheldShakeTimer", - "8033c670" : "sHandheldShakeInc", - "8033c674" : "sHandheldShakePitch", - "8033c676" : "sHandheldShakeYaw", - "8033c678" : "sHandheldShakeRoll", - "8033c67c" : "unused8033B30C", - "8033c680" : "unused8033B310", - "8033c684" : "sSelectionFlags", - "8033c686" : "unused8033B316", - "8033c688" : "s2ndRotateFlags", - "8033c68a" : "unused8033B31A", - "8033c68c" : "sCameraSoundFlags", - "8033c68e" : "sCButtonsPressed", - "8033c690" : "sCutsceneDialogID", - "8033c698" : "gLakituState", - "8033c758" : "unused8033B3E8", - "8033c75a" : "sAreaYaw", - "8033c75c" : "sAreaYawChange", - "8033c75e" : "sLakituDist", - "8033c760" : "sLakituPitch", - "8033c764" : "sZoomAmount", - "8033c768" : "sCSideButtonYaw", - "8033c76a" : "sBehindMarioSoundTimer", - "8033c76c" : "sZeroZoomDist", - "8033c770" : "sCUpCameraPitch", - "8033c772" : "sModeOffsetYaw", - "8033c774" : "sSpiralStairsYawOffset", - "8033c776" : "s8DirModeBaseYaw", - "8033c778" : "s8DirModeYawOffset", - "8033c77c" : "sPanDistance", - "8033c780" : "sCannonYOffset", - "8033c788" : "sModeInfo", - "8033c7d0" : "sCastleEntranceOffset", - "8033c7dc" : "sParTrackIndex", - "8033c7e0" : "sParTrackPath", - "8033c7e8" : "sParTrackTransOff", - "8033c808" : "sCameraStoreCUp", - "8033c828" : "sCameraStoreCutscene", - "8033c848" : "gCameraMovementFlags", - "8033c84a" : "sStatusFlags", - "8033c850" : "sCurCreditsSplinePos", - "8033c950" : "sCurCreditsSplineFocus", - "8033ca50" : "sCutsceneSplineSegment", - "8033ca54" : "sCutsceneSplineSegmentProgress", - "8033ca58" : "unused8033B6E8", - "8033ca5a" : "sCutsceneShot", - "8033ca5c" : "gCutsceneTimer", - "8033ca60" : "sCutsceneVars", - "8033cbc8" : "gObjCutsceneDone", - "8033cbcc" : "gCutsceneObjSpawn", - "8033cbd0" : "gCamera", - "8033cbe0" : "gObjectListArray", - "8033d260" : "gDebugInfoFlags", - "8033d264" : "gNumFindFloorMisses", - "8033d268" : "unused_8033BEF8", - "8033d26c" : "gUnknownWallCount", - "8033d270" : "gObjectCounter", - "8033d274" : "gNumCalls", - "8033d280" : "gDebugInfo", - "8033d380" : "gDebugInfoOverwrite", - "8033d480" : "gTimeStopState", - "8033d488" : "gObjectPool", - "80360e88" : "gMacroObjectDefaultParent", - "803610e8" : "gObjectLists", - "803610f0" : "gFreeObjectList", - "80361158" : "gMarioObject", - "8036115c" : "gLuigiObject", - "80361160" : "gCurrentObject", - "80361164" : "gCurBhvCommand", - "80361168" : "gPrevFrameObjectCount", - "8036116c" : "gSurfaceNodesAllocated", - "80361170" : "gSurfacesAllocated", - "80361174" : "gNumStaticSurfaceNodes", - "80361178" : "gNumStaticSurfaces", - "8036117c" : "gObjectMemoryPool", - "80361180" : "gCheckingSurfaceCollisionsForCamera", - "80361182" : "gFindFloorIncludeSurfaceIntangible", - "80361184" : "gEnvironmentRegions", - "80361188" : "gEnvironmentLevels", - "803611d8" : "gDoorAdjacentRooms", - "80361250" : "gMarioCurrentRoom", - "80361252" : "D_8035FEE2", - "80361254" : "D_8035FEE4", - "80361256" : "gTHIWaterDrained", - "80361258" : "gTTCSpeedSetting", - "8036125a" : "gMarioShotFromCannon", - "8036125c" : "gCCMEnteredSlide", - "8036125e" : "gNumRoomedObjectsInMarioRoom", - "80361260" : "gNumRoomedObjectsNotInMarioRoom", - "80361262" : "gWDWWaterLevelChanging", - "80361264" : "gMarioOnMerryGoRound", - "80361280" : "D_8035FF10", - "80361290" : "gDebugPrintState1", - "803612a0" : "gDebugPrintState2", - "803612b0" : "sMarioOnFlyingCarpet", - "803612b2" : "sSurfaceTypeBelowShadow", - "803612b4" : "gShadowAboveWaterOrLava", - "803612b5" : "gMarioOnIceOrCarpet", - "803612c0" : "sSkyBoxInfo", - "803612e0" : "gMovetexLastTextureId", - "803612f0" : "gFlyingCarpetState", - "80361300" : "gPaintingMarioFloorType", - "80361304" : "gPaintingMarioXPos", - "80361308" : "gPaintingMarioYPos", - "8036130c" : "gPaintingMarioZPos", - "80361310" : "gPaintingMesh", - "80361314" : "gPaintingTriNorms", - "80361318" : "gRipplingPainting", - "8036131c" : "gDddPaintingStatus", - "80361320" : "sTextLabels", - "803613f0" : "gDialogColorFadeTimer", - "803613f2" : "gLastDialogLineNum", - "803613f4" : "gDialogVariable", - "803613f8" : "gDialogTextAlpha", - "803613fa" : "gCutsceneMsgXOffset", - "803613fc" : "gCutsceneMsgYOffset", - "803613fe" : "gRedCoinsCollected", - "80361400" : "gEnvFxBuffer", - "80361408" : "gSnowCylinderLastPos", - "80361414" : "gSnowParticleCount", - "80361416" : "gSnowParticleMaxCount", - "80361420" : "gEnvFxBubbleConfig", - "80361460" : "sNumActiveFirePiranhaPlants", - "80361464" : "sNumKilledFirePiranhaPlants", - "80361468" : "sObjSavedPosX", - "8036146c" : "sObjSavedPosY", - "80361470" : "sObjSavedPosZ", - "80361474" : "sMontyMoleHoleList", - "80361478" : "sMontyMoleKillStreak", - "8036147c" : "sMontyMoleLastKilledPosX", - "80361480" : "sMontyMoleLastKilledPosY", - "80361484" : "sMontyMoleLastKilledPosZ", - "80361488" : "sMasterTreadmill", - "80361490" : "gCurrAiBuffer", - "80361498" : "sSoundRequests", - "80361c98" : "D_80360928", - "80361f98" : "sUsedChannelsForSoundBank", - "80361fa8" : "sCurrentSound", - "80361fb8" : "gSoundBanks", - "80364b78" : "D_80363808", - "80364b82" : "D_80363812", - "80364b88" : "sBackgroundMusicQueue", - "80364ba0" : "D_80363830", - "80364c20" : "D_803638B0", - "80365e70" : "piMgrThread", - "80366020" : "piMgrStack", - "80367020" : "__osPiMesgQueue", - "80367038" : "piMgrMesgBuff", - "80367040" : "D_80365CD0", - "80367050" : "_osContCmdBuf", - "8036708c" : "_osContPifCtrl", - "80367090" : "_osLastSentSiCmd", - "80367091" : "_osContNumControllers", - "80367098" : "D_80365D28", - "803670b8" : "_osContMesgQueue", - "803670d0" : "_osContMesgBuff", - "803670f0" : "D_80365D80", - "80367110" : "_osCurrentTime", - "80367118" : "D_80365DA8", - "8036711c" : "__osViIntrCount", - "80367120" : "D_80365DB0", - "80367130" : "osPiMesgBuff", - "80367138" : "gOsPiMessageQueue", - "80367150" : "osSiMesgBuff", - "80367158" : "gOsSiMessageQueue", - "80367170" : "D_80365E00", - "803671ac" : "D_80365E3C", - "803671b0" : "D_80365E40", - "803672b0" : "gInterruptedThread", - "80367460" : ".", - "80367460" : "_mainSegmentNoloadEnd", - "0000cee0" : "_mainSegmentNoloadSizeLo", - "00000002" : "_mainSegmentNoloadSizeHi", - "00000001" : "ASSERT", - "80378800" : "_engineSegmentStart", - "007cc6c0" : "_engineSegmentRomStart", - "80378800" : "vec3f_copy", - "80378840" : "vec3f_set", - "8037888c" : "vec3f_add", - "803788e4" : "vec3f_sum", - "8037893c" : "vec3s_copy", - "8037897c" : "vec3s_set", - "803789c8" : "vec3s_add", - "80378a20" : "vec3s_sum", - "80378a78" : "vec3s_sub", - "80378ad0" : "vec3s_to_vec3f", - "80378b34" : "vec3f_to_vec3s", - "80378c50" : "find_vector_perpendicular_to_plane", - "80378d38" : "vec3f_cross", - "80378dc0" : "vec3f_normalize", - "80378e68" : "mtxf_copy", - "80378eb4" : "mtxf_identity", - "80378f24" : "mtxf_translate", - "80378f84" : "mtxf_lookat", - "80379440" : "mtxf_rotate_zxy_and_translate", - "803795f0" : "mtxf_rotate_xyz_and_translate", - "80379798" : "mtxf_billboard", - "80379918" : "mtxf_align_terrain_normal", - "80379aa4" : "mtxf_align_terrain_triangle", - "80379f60" : "mtxf_mul", - "8037a29c" : "mtxf_scale_vec3f", - "8037a348" : "mtxf_mul_vec3s", - "8037a434" : "mtxf_to_mtx", - "8037a4b8" : "mtxf_rotate_xy", - "8037a550" : "get_pos_from_transform_mtx", - "8037a69c" : "vec3f_get_dist_and_angle", - "8037a788" : "vec3f_set_dist_and_angle", - "8037a860" : "approach_s32", - "8037a8b4" : "approach_f32", - "8037a9a8" : "atan2s", - "8037ab88" : "atan2f", - "8037abec" : "spline_get_weights", - "8037afb8" : "anim_spline_init", - "8037afe8" : "anim_spline_poll", - "8037b220" : "init_scene_graph_node_links", - "8037b24c" : "init_graph_node_root", - "8037b30c" : "init_graph_node_ortho_projection", - "8037b380" : "init_graph_node_perspective", - "8037b448" : "init_graph_node_start", - "8037b4ac" : "init_graph_node_master_list", - "8037b530" : "init_graph_node_render_range", - "8037b5b4" : "init_graph_node_switch_case", - "8037b670" : "init_graph_node_camera", - "8037b744" : "init_graph_node_translation_rotation", - "8037b7f8" : "init_graph_node_translation", - "8037b89c" : "init_graph_node_rotation", - "8037b940" : "init_graph_node_scale", - "8037b9e0" : "init_graph_node_object", - "8037bad4" : "init_graph_node_culling_radius", - "8037bb48" : "init_graph_node_animated_part", - "8037bbec" : "init_graph_node_billboard", - "8037bc90" : "init_graph_node_display_list", - "8037bd24" : "init_graph_node_shadow", - "8037bdb4" : "init_graph_node_object_parent", - "8037be28" : "init_graph_node_generated", - "8037becc" : "init_graph_node_background", - "8037bf84" : "init_graph_node_held_object", - "8037c044" : "geo_add_child", - "8037c0bc" : "geo_remove_child", - "8037c138" : "geo_make_first_child", - "8037c1e4" : "geo_call_global_function_nodes_helper", - "8037c360" : "geo_call_global_function_nodes", - "8037c3d0" : "geo_reset_object_node", - "8037c448" : "geo_obj_init", - "8037c51c" : "geo_obj_init_spawninfo", - "8037c658" : "geo_obj_init_animation", - "8037c708" : "geo_obj_init_animation_accel", - "8037c7d8" : "retrieve_animation_index", - "8037c844" : "geo_update_animation_frame", - "8037c9e8" : "geo_retreive_animation_translation", - "8037cb10" : "geo_find_root", - "8037cb60" : "read_vec3s_to_vec3f", - "8037cbc0" : "read_vec3s", - "8037cbfc" : "read_vec3s_angle", - "8037cc74" : "register_scene_graph_node", - "8037cd60" : "geo_layout_cmd_branch_and_link", - "8037ce24" : "geo_layout_cmd_end", - "8037cee8" : "geo_layout_cmd_branch", - "8037cf70" : "geo_layout_cmd_return", - "8037cfc0" : "geo_layout_cmd_open_node", - "8037d018" : "geo_layout_cmd_close_node", - "8037d050" : "geo_layout_cmd_assign_as_view", - "8037d0d0" : "geo_layout_cmd_update_node_flags", - "8037d1d0" : "geo_layout_cmd_node_root", - "8037d328" : "geo_layout_cmd_node_ortho_projection", - "8037d3a4" : "geo_layout_cmd_node_perspective", - "8037d48c" : "geo_layout_cmd_node_start", - "8037d4dc" : "geo_layout_cmd_nop3", - "8037d500" : "geo_layout_cmd_node_master_list", - "8037d55c" : "geo_layout_cmd_node_level_of_detail", - "8037d5d4" : "geo_layout_cmd_node_switch_case", - "8037d640" : "geo_layout_cmd_node_camera", - "8037d6f0" : "geo_layout_cmd_node_translation_rotation", - "8037d8d4" : "geo_layout_cmd_node_translation", - "8037d998" : "geo_layout_cmd_node_rotation", - "8037da5c" : "geo_layout_cmd_node_scale", - "8037db50" : "geo_layout_cmd_nop2", - "8037db74" : "geo_layout_cmd_node_animated_part", - "8037dc10" : "geo_layout_cmd_node_billboard", - "8037dcd4" : "geo_layout_cmd_node_display_list", - "8037dd4c" : "geo_layout_cmd_node_shadow", - "8037dddc" : "geo_layout_cmd_node_object_parent", - "8037de34" : "geo_layout_cmd_node_generated", - "8037de94" : "geo_layout_cmd_node_background", - "8037def8" : "geo_layout_cmd_nop", - "8037df1c" : "geo_layout_cmd_copy_view", - "8037dfd4" : "geo_layout_cmd_node_held_obj", - "8037e058" : "geo_layout_cmd_node_culling_radius", - "8037e0b4" : "process_geo_layout", - "803805c8" : "level_script_execute", - "80380de8" : "f32_find_wall_collision", - "80380e8c" : "find_wall_collisions", - "80381264" : "find_ceil", - "80381470" : "unused_obj_find_floor_height", - "803814b8" : "find_floor_height_and_data", - "80381794" : "find_floor_height", - "803817e0" : "unused_find_dynamic_floor", - "80381900" : "find_floor", - "80381ba0" : "find_water_level", - "80381d3c" : "find_poison_gas_level", - "80381f08" : "debug_surface_list_info", - "80382294" : "unused_resolve_floor_or_ceil_collisions", - "80383340" : "alloc_surface_pools", - "803833b8" : "load_area_terrain", - "803835a4" : "clear_dynamic_surfaces", - "80383614" : "transform_object_vertices", - "80383828" : "load_object_surfaces", - "803839cc" : "load_object_collision_model", - "80383bb0" : "random_u16", - "80383cb4" : "random_float", - "80383d1c" : "random_sign", - "80383d68" : "obj_update_gfx_pos_and_angle", - "80385bf0" : "stub_behavior_script_2", - "80385c00" : "cur_obj_update", - "80385f90" : "identityMtx", - "80385fb0" : "zeroMtx", - "80385fd0" : "gVec3fZero", - "80385fdc" : "gVec3sZero", - "80385fe4" : "gVec3fOne", - "80385ff0" : "gVec3sOne", - "80386000" : "gSineTable", - "80387000" : "gCosineTable", - "8038b000" : "gArctanTable", - "8038b810" : "GeoLayoutJumpTable", - "8038b894" : "unused_8038B894", - "8038bc90" : "_engineSegmentEnd", - "007dfb50" : "_engineSegmentRomEnd", - "8038bc90" : "_engineSegmentNoloadStart", - "8038bc90" : "gSplineKeyframe", - "8038bc94" : "gSplineKeyframeFraction", - "8038bc98" : "gSplineState", - "8038bca0" : "gGraphNodePool", - "8038bca4" : "gCurRootGraphNode", - "8038bca8" : "D_8038BCA8", - "8038bcac" : "gGeoViews", - "8038bcb0" : "gGeoNumViews", - "8038bcb8" : "gGeoLayoutStack", - "8038bcf8" : "gCurGraphNodeList", - "8038bd78" : "gCurGraphNodeIndex", - "8038bd7a" : "gGeoLayoutStackIndex", - "8038bd7c" : "D_8038BD7C", - "8038bd7e" : "gGeoLayoutReturnIndex", - "8038bd80" : "gGeoLayoutCommand", - "8038bd88" : "gObjParentGraphNode", - "8038be30" : "sFloorGeo", - "8038be90" : "unused8038BE90", - "8038be98" : "gStaticSurfacePartition", - "8038d698" : "gDynamicSurfacePartition", - "8038ee98" : "sSurfaceNodePool", - "8038ee9c" : "sSurfacePool", - "8038eea0" : "sSurfacePoolSize", - "8038eea8" : "unused8038EEA8", - "8038eef0" : "_engineSegmentNoloadEnd", - "00000001" : "ASSERT", - "8038f800" : ".", - "8038f800" : "_framebuffersSegmentNoloadStart", - "8038f800" : "0x70800", - "8038f800" : "gFrameBuffer0", - "803b5000" : "gFrameBuffer1", - "803da800" : "gFrameBuffer2", - "80400000" : "_framebuffersSegmentNoloadEnd", - "80400000" : "__expansionRamStart", - "00000001" : "ASSERT", - "10000000" : "_entrySegmentStart", - "007cc6c0" : "_entrySegmentRomStart", - "10000000" : "level_script_entry", - "10000030" : "_entrySegmentEnd", - "007cc6f0" : "_entrySegmentRomEnd", - "02000000" : "_segment2_mio0SegmentStart", - "007cc6c0" : "_segment2_mio0SegmentRomStart", - "0200bd10" : ".", - "0200bd10" : "_segment2_mio0SegmentEnd", - "007d83d0" : "_segment2_mio0SegmentRomEnd", - "04000000" : "_group0_mio0SegmentStart", - "007cc6c0" : "_group0_mio0SegmentRomStart", - "04013260" : ".", - "04013260" : "_group0_mio0SegmentEnd", - "007df920" : "_group0_mio0SegmentRomEnd", - "17000000" : "_group0_geoSegmentStart", - "007cc6c0" : "_group0_geoSegmentRomStart", - "17000000" : "bubble_geo", - "1700001c" : "purple_marble_geo", - "17000038" : "smoke_geo", - "17000084" : "burn_smoke_geo", - "1700009c" : "small_water_splash_geo", - "170000e0" : "mario_TODO_geo_0000E0", - "17000124" : "idle_water_wave_geo", - "17000168" : "wave_trail_geo", - "170001bc" : "sparkles_geo", - "17000230" : "water_splash_geo", - "17000284" : "sparkles_animation_geo", - "170002e0" : "mario_geo_face_and_wings", - "1700041c" : "mario_geo_left_hand", - "17000494" : "mario_geo_right_hand", - "1700053c" : "mario_geo_body", - "170006f8" : "mario_geo_medium_poly_left_hand", - "17000770" : "mario_geo_medium_poly_right_hand", - "17000818" : "mario_geo_medium_poly_body", - "170009d4" : "mario_geo_low_poly_face_and_wings", - "17000b10" : "mario_geo_low_poly_left_hand", - "17000b88" : "mario_geo_low_poly_right_hand", - "17000c30" : "mario_geo_low_poly_body", - "17000dec" : "mario_vanish_geo_face_and_wings", - "17000f28" : "mario_vanish_geo_left_hand", - "17000fa0" : "mario_vanish_geo_right_hand", - "17001048" : "mario_vanish_geo_body", - "17001204" : "mario_vanish_geo_medium_poly_left_hand", - "1700127c" : "mario_vanish_geo_medium_poly_right_hand", - "17001324" : "mario_vanish_geo_medium_poly_body", - "170014e0" : "mario_vanish_geo_low_poly_face_and_wings", - "1700161c" : "mario_vanish_geo_low_poly_left_hand", - "17001694" : "mario_vanish_geo_low_poly_right_hand", - "1700173c" : "mario_vanish_geo_low_poly_body", - "170018f8" : "mario_metal_geo_face_and_wings", - "170019a4" : "mario_metal_geo_left_hand", - "17001a1c" : "mario_metal_geo_right_hand", - "17001ac4" : "mario_metal_geo_body", - "17001c80" : "mario_metal_geo_medium_poly_left_hand", - "17001cf8" : "mario_metal_geo_medium_poly_right_hand", - "17001da0" : "mario_metal_geo_medium_poly_body", - "17001f5c" : "mario_metal_geo_low_poly_face_and_wings", - "17002008" : "mario_metal_geo_low_poly_left_hand", - "17002080" : "mario_metal_geo_low_poly_right_hand", - "17002128" : "mario_metal_geo_low_poly_body", - "170022e4" : "mario_metal_vanish_geo_face_and_wings", - "17002390" : "mario_metal_vanish_geo_left_hand", - "17002408" : "mario_metal_vanish_geo_right_hand", - "170024b0" : "mario_metal_vanish_geo_body", - "1700266c" : "mario_metal_vanish_geo_medium_poly_left_hand", - "170026e4" : "mario_metal_vanish_geo_medium_poly_right_hand", - "1700278c" : "mario_metal_vanish_geo_medium_poly_body", - "17002958" : "mario_metal_vanish_geo_low_poly_face_and_wings", - "17002a04" : "mario_metal_vanish_geo_low_poly_left_hand", - "17002a7c" : "mario_metal_vanish_geo_low_poly_right_hand", - "17002b24" : "mario_metal_vanish_geo_low_poly_body", - "17002ce0" : "mario_geo_load_body", - "17002d14" : "mario_geo_load_medium_poly_body", - "17002d48" : "mario_geo_load_low_poly_body", - "17002d7c" : "mario_geo_render_body", - "17002dd4" : "mario_geo", - "17002e30" : "_group0_geoSegmentEnd", - "007cf4f0" : "_group0_geoSegmentRomEnd", - "05000000" : "_group1_mio0SegmentStart", - "007cc6c0" : "_group1_mio0SegmentRomStart", - "05008070" : ".", - "05008070" : "_group1_mio0SegmentEnd", - "007d4730" : "_group1_mio0SegmentRomEnd", - "0c000000" : "_group1_geoSegmentStart", - "007cc6c0" : "_group1_geoSegmentRomStart", - "0c000000" : "yellow_sphere_geo", - "0c000018" : "hoot_geo", - "0c0001e4" : "yoshi_egg_geo", - "0c000248" : "thwomp_geo", - "0c000264" : "bullet_bill_geo", - "0c00028c" : "heave_ho_geo", - "0c000410" : "_group1_geoSegmentEnd", - "007ccad0" : "_group1_geoSegmentRomEnd", - "05000000" : "_group2_mio0SegmentStart", - "007cc6c0" : "_group2_mio0SegmentRomStart", - "05001e10" : ".", - "05001e10" : "_group2_mio0SegmentEnd", - "007ce4d0" : "_group2_mio0SegmentRomEnd", - "0c000000" : "_group2_geoSegmentStart", - "007cc6c0" : "_group2_geoSegmentRomStart", - "0c000000" : "bully_geo", - "0c000120" : "bully_boss_geo", - "0c000240" : "blargg_geo", - "0c0002b0" : "_group2_geoSegmentEnd", - "007cc970" : "_group2_geoSegmentRomEnd", - "05000000" : "_group3_mio0SegmentStart", - "007cc6c0" : "_group3_mio0SegmentRomStart", - "050068b0" : ".", - "050068b0" : "_group3_mio0SegmentEnd", - "007d2f70" : "_group3_mio0SegmentRomEnd", - "0c000000" : "_group3_geoSegmentStart", - "007cc6c0" : "_group3_geoSegmentRomStart", - "0c000000" : "king_bobomb_geo", - "0c000308" : "water_bomb_geo", - "0c000328" : "water_bomb_shadow_geo", - "0c000340" : "_group3_geoSegmentEnd", - "007cca00" : "_group3_geoSegmentRomEnd", - "05000000" : "_group4_mio0SegmentStart", - "007cc6c0" : "_group4_mio0SegmentRomStart", - "0500a300" : ".", - "0500a300" : "_group4_mio0SegmentEnd", - "007d69c0" : "_group4_mio0SegmentRomEnd", - "0c000000" : "_group4_geoSegmentStart", - "007cc6c0" : "_group4_geoSegmentRomStart", - "0c000000" : "clam_shell_geo", - "0c000068" : "sushi_geo", - "0c00010c" : "unagi_geo", - "0c000280" : "_group4_geoSegmentEnd", - "007cc940" : "_group4_geoSegmentRomEnd", - "05000000" : "_group5_mio0SegmentStart", - "007cc6c0" : "_group5_mio0SegmentRomStart", - "0500bce0" : ".", - "0500bce0" : "_group5_mio0SegmentEnd", - "007d83a0" : "_group5_mio0SegmentRomEnd", - "0c000000" : "_group5_geoSegmentStart", - "007cc6c0" : "_group5_geoSegmentRomStart", - "0c000000" : "klepto_geo", - "0c0002ac" : "eyerok_geo_0002AC", - "0c0005a8" : "eyerok_left_hand_geo", - "0c0005e4" : "eyerok_right_hand_geo", - "0c000610" : "pokey_head_geo", - "0c000644" : "pokey_body_part_geo", - "0c000660" : "_group5_geoSegmentEnd", - "007ccd20" : "_group5_geoSegmentRomEnd", - "05000000" : "_group6_mio0SegmentStart", - "007cc6c0" : "_group6_mio0SegmentRomStart", - "0500e110" : ".", - "0500e110" : "_group6_mio0SegmentEnd", - "007da7d0" : "_group6_mio0SegmentRomEnd", - "0c000000" : "_group6_geoSegmentStart", - "007cc6c0" : "_group6_geoSegmentRomStart", - "0c000000" : "monty_mole_geo", - "0c000110" : "ukiki_geo", - "0c00036c" : "fwoosh_geo", - "0c000390" : "_group6_geoSegmentEnd", - "007cca50" : "_group6_geoSegmentRomEnd", - "05000000" : "_group7_mio0SegmentStart", - "007cc6c0" : "_group7_mio0SegmentRomStart", - "05005070" : ".", - "05005070" : "_group7_mio0SegmentEnd", - "007d1730" : "_group7_mio0SegmentRomEnd", - "0c000000" : "_group7_geoSegmentStart", - "007cc6c0" : "_group7_geoSegmentRomStart", - "0c000000" : "spindrift_geo", - "0c000104" : "penguin_geo", - "0c00021c" : "mr_blizzard_hidden_geo", - "0c000348" : "mr_blizzard_geo", - "0c000370" : "_group7_geoSegmentEnd", - "007cca30" : "_group7_geoSegmentRomEnd", - "05000000" : "_group8_mio0SegmentStart", - "007cc6c0" : "_group8_mio0SegmentRomStart", - "05001180" : ".", - "05001180" : "_group8_mio0SegmentEnd", - "007cd840" : "_group8_mio0SegmentRomEnd", - "0c000000" : "_group8_geoSegmentStart", - "007cc6c0" : "_group8_geoSegmentRomStart", - "0c000000" : "springboard_top_geo", - "0c000018" : "springboard_spring_geo", - "0c000030" : "springboard_bottom_geo", - "0c000048" : "cap_switch_geo", - "0c000090" : "_group8_geoSegmentEnd", - "007cc750" : "_group8_geoSegmentRomEnd", - "05000000" : "_group9_mio0SegmentStart", - "007cc6c0" : "_group9_mio0SegmentRomStart", - "05006960" : ".", - "05006960" : "_group9_mio0SegmentEnd", - "007d3020" : "_group9_mio0SegmentRomEnd", - "0c000000" : "_group9_geoSegmentStart", - "007cc6c0" : "_group9_geoSegmentRomStart", - "0c000000" : "bookend_part_geo", - "0c0000c0" : "bookend_geo", - "0c0000d8" : "haunted_chair_geo", - "0c000188" : "small_key_geo", - "0c0001b4" : "mad_piano_geo", - "0c000224" : "boo_geo", - "0c000274" : "haunted_cage_geo", - "0c0002b0" : "_group9_geoSegmentEnd", - "007cc970" : "_group9_geoSegmentRomEnd", - "05000000" : "_group10_mio0SegmentStart", - "007cc6c0" : "_group10_mio0SegmentRomStart", - "05012cd0" : ".", - "05012cd0" : "_group10_mio0SegmentEnd", - "007df390" : "_group10_mio0SegmentRomEnd", - "0c000000" : "_group10_geoSegmentStart", - "007cc6c0" : "_group10_geoSegmentRomStart", - "0c000000" : "birds_geo", - "0c000098" : "peach_geo_000098", - "0c000254" : "peach_geo_000254", - "0c000410" : "peach_geo", - "0c000468" : "yoshi_geo", - "0c000670" : "_group10_geoSegmentEnd", - "007ccd30" : "_group10_geoSegmentRomEnd", - "05000000" : "_group11_mio0SegmentStart", - "007cc6c0" : "_group11_mio0SegmentRomStart", - "050073f0" : ".", - "050073f0" : "_group11_mio0SegmentEnd", - "007d3ab0" : "_group11_mio0SegmentRomEnd", - "0c000000" : "_group11_geoSegmentStart", - "007cc6c0" : "_group11_geoSegmentRomStart", - "0c000000" : "bubba_geo", - "0c000030" : "wiggler_head_geo", - "0c0001bc" : "enemy_lakitu_geo", - "0c000290" : "spiny_ball_geo", - "0c000328" : "spiny_geo", - "0c0004a0" : "_group11_geoSegmentEnd", - "007ccb60" : "_group11_geoSegmentRomEnd", - "06000000" : "_group12_mio0SegmentStart", - "007cc6c0" : "_group12_mio0SegmentRomStart", - "06030c30" : ".", - "06030c30" : "_group12_mio0SegmentEnd", - "007fd2f0" : "_group12_mio0SegmentRomEnd", - "0d000000" : "_group12_geoSegmentStart", - "007cc6c0" : "_group12_geoSegmentRomStart", - "0d000000" : "bowser_flames_geo", - "0d000090" : "invisible_bowser_accessory_geo", - "0d0000b0" : "bowser_1_yellow_sphere_geo", - "0d0000d8" : "bowser_geo_0000D8", - "0d000424" : "bowser_geo_000424", - "0d000770" : "bowser_geo_000770", - "0d000ab8" : "bowser_shadow_geo", - "0d000ac4" : "bowser_geo", - "0d000b40" : "bowser2_geo", - "0d000bbc" : "bowser_bomb_geo", - "0d000bfc" : "bowser_impact_smoke_geo", - "0d000c50" : "_group12_geoSegmentEnd", - "007cd310" : "_group12_geoSegmentRomEnd", - "06000000" : "_group13_mio0SegmentStart", - "007cc6c0" : "_group13_mio0SegmentRomStart", - "0600a0f0" : ".", - "0600a0f0" : "_group13_mio0SegmentEnd", - "007d67b0" : "_group13_mio0SegmentRomEnd", - "0d000000" : "_group13_geoSegmentStart", - "007cc6c0" : "_group13_geoSegmentRomStart", - "0d000000" : "skeeter_geo", - "0d000284" : "seaweed_geo", - "0d0002f4" : "water_mine_geo", - "0d000324" : "cyan_fish_geo", - "0d00038c" : "bub_geo", - "0d000414" : "water_ring_geo", - "0d000450" : "treasure_chest_base_geo", - "0d000468" : "treasure_chest_lid_geo", - "0d000480" : "_group13_geoSegmentEnd", - "007ccb40" : "_group13_geoSegmentRomEnd", - "06000000" : "_group14_mio0SegmentStart", - "007cc6c0" : "_group14_mio0SegmentRomStart", - "06013a60" : ".", - "06013a60" : "_group14_mio0SegmentEnd", - "007e0120" : "_group14_mio0SegmentRomEnd", - "0d000000" : "_group14_geoSegmentStart", - "007cc6c0" : "_group14_geoSegmentRomStart", - "0d000000" : "koopa_flag_geo", - "0d0000b8" : "wooden_post_geo", - "0d0000d0" : "koopa_without_shell_geo", - "0d000214" : "koopa_with_shell_geo", - "0d000358" : "piranha_plant_geo", - "0d000480" : "whomp_geo", - "0d0005d0" : "metallic_ball_geo", - "0d0005ec" : "chain_chomp_geo", - "0d000680" : "_group14_geoSegmentEnd", - "007ccd40" : "_group14_geoSegmentRomEnd", - "06000000" : "_group15_mio0SegmentStart", - "007cc6c0" : "_group15_mio0SegmentRomStart", - "0600c8e0" : ".", - "0600c8e0" : "_group15_mio0SegmentEnd", - "007d8fa0" : "_group15_mio0SegmentRomEnd", - "0d000000" : "_group15_geoSegmentStart", - "007cc6c0" : "_group15_geoSegmentRomStart", - "0d000000" : "lakitu_geo", - "0d000114" : "toad_geo_000114", - "0d00027c" : "toad_geo_00027C", - "0d0003e4" : "toad_geo", - "0d000448" : "mips_geo", - "0d0005b0" : "boo_castle_geo", - "0d000600" : "_group15_geoSegmentEnd", - "007cccc0" : "_group15_geoSegmentRomEnd", - "06000000" : "_group16_mio0SegmentStart", - "007cc6c0" : "_group16_mio0SegmentRomStart", - "06002ba0" : ".", - "06002ba0" : "_group16_mio0SegmentEnd", - "007cf260" : "_group16_mio0SegmentRomEnd", - "0d000000" : "_group16_geoSegmentStart", - "007cc6c0" : "_group16_geoSegmentRomStart", - "0d000000" : "moneybag_geo_000000", - "0d000078" : "moneybag_geo_000078", - "0d0000f0" : "moneybag_geo", - "0d000150" : "_group16_geoSegmentEnd", - "007cc810" : "_group16_geoSegmentRomEnd", - "06000000" : "_group17_mio0SegmentStart", - "007cc6c0" : "_group17_mio0SegmentRomStart", - "06009c50" : ".", - "06009c50" : "_group17_mio0SegmentEnd", - "007d6310" : "_group17_mio0SegmentRomEnd", - "0d000000" : "_group17_geoSegmentStart", - "007cc6c0" : "_group17_geoSegmentRomStart", - "0d000000" : "mr_i_geo", - "0d00001c" : "mr_i_iris_geo", - "0d0000dc" : "swoop_geo", - "0d0001a0" : "snufit_geo", - "0d000230" : "dorrie_geo", - "0d000394" : "scuttlebug_geo", - "0d0006d0" : "_group17_geoSegmentEnd", - "007ccd90" : "_group17_geoSegmentRomEnd", - "08000000" : "_common0_mio0SegmentStart", - "007cc6c0" : "_common0_mio0SegmentRomStart", - "0800e6d0" : ".", - "0800e6d0" : "_common0_mio0SegmentEnd", - "007dad90" : "_common0_mio0SegmentRomEnd", - "0f000000" : "_common0_geoSegmentStart", - "007cc6c0" : "_common0_geoSegmentRomStart", - "0f000000" : "blue_coin_switch_geo", - "0f000020" : "test_platform_geo", - "0f000028" : "amp_geo", - "0f0001a8" : "cannon_base_geo", - "0f0001c0" : "cannon_barrel_geo", - "0f0001d8" : "chuckya_geo", - "0f0004cc" : "purple_switch_geo", - "0f0004e4" : "checkerboard_platform_geo", - "0f0004fc" : "heart_geo", - "0f000518" : "flyguy_geo", - "0f0005d0" : "breakable_box_geo", - "0f000610" : "breakable_box_small_geo", - "0f000640" : "bowling_ball_geo", - "0f00066c" : "bowling_ball_track_geo", - "0f000694" : "exclamation_box_geo", - "0f0006e4" : "goomba_geo", - "0f0007b8" : "black_bobomb_geo", - "0f0008f4" : "bobomb_buddy_geo", - "0f000a30" : "metal_box_geo", - "0f000a58" : "exclamation_box_outline_geo", - "0f000ab0" : "koopa_shell_geo", - "0f000adc" : "koopa_shell2_geo", - "0f000b08" : "koopa_shell3_geo", - "0f000b40" : "_common0_geoSegmentEnd", - "007cd200" : "_common0_geoSegmentRomEnd", - "03000000" : "_common1_mio0SegmentStart", - "007cc6c0" : "_common1_mio0SegmentRomStart", - "03017990" : ".", - "03017990" : "_common1_mio0SegmentEnd", - "007e4050" : "_common1_mio0SegmentRomEnd", - "16000000" : "_common1_geoSegmentStart", - "007cc6c0" : "_common1_geoSegmentRomStart", - "16000000" : "mist_geo", - "16000020" : "white_puff_geo", - "16000040" : "explosion_geo", - "160000a8" : "butterfly_geo", - "1600013c" : "yellow_coin_geo", - "160001a0" : "yellow_coin_no_shadow_geo", - "16000200" : "blue_coin_geo", - "16000264" : "blue_coin_no_shadow_geo", - "160002c4" : "red_coin_geo", - "16000328" : "red_coin_no_shadow_geo", - "16000388" : "warp_pipe_geo", - "160003a8" : "castle_door_geo", - "1600043c" : "cabin_door_geo", - "160004d0" : "wooden_door_geo", - "16000564" : "wooden_door2_geo", - "160005f8" : "metal_door_geo", - "1600068c" : "hazy_maze_door_geo", - "16000720" : "haunted_door_geo", - "160007b4" : "castle_door_0_star_geo", - "16000868" : "castle_door_1_star_geo", - "1600091c" : "castle_door_3_stars_geo", - "160009d0" : "key_door_geo", - "16000a84" : "bowser_key_geo", - "16000ab0" : "bowser_key_cutscene_geo", - "16000b10" : "red_flame_shadow_geo", - "16000b2c" : "red_flame_geo", - "16000b8c" : "blue_flame_geo", - "16000bec" : "fish_shadow_geo", - "16000c44" : "fish_geo", - "16000c8c" : "leaves_geo", - "16000ca4" : "marios_cap_geo", - "16000cf0" : "marios_metal_cap_geo", - "16000d3c" : "marios_wing_cap_geo", - "16000da8" : "marios_winged_metal_cap_geo", - "16000e14" : "number_geo", - "16000e84" : "mushroom_1up_geo", - "16000ea0" : "star_geo", - "16000ed4" : "dirt_animation_geo", - "16000f24" : "cartoon_star_geo", - "16000f6c" : "transparent_star_geo", - "16000f98" : "white_particle_geo", - "16000fb4" : "wooden_signpost_geo", - "16000fe8" : "bubbly_tree_geo", - "16001000" : "spiky_tree_geo", - "16001018" : "snow_tree_geo", - "16001030" : "spiky_tree1_geo", - "16001048" : "palm_tree_geo", - "16001060" : "_common1_geoSegmentEnd", - "007cd720" : "_common1_geoSegmentRomEnd", - "13000000" : "_behaviorSegmentStart", - "007cc6c0" : "_behaviorSegmentRomStart", - "13000000" : "bhvStarDoor", - "13000054" : "bhvMrI", - "1300008c" : "bhvMrIBody", - "130000ac" : "bhvMrIParticle", - "130000f8" : "bhvPurpleParticle", - "13000118" : "bhvGiantPole", - "13000144" : "bhvPoleGrabbing", - "13000174" : "bhvThiHugeIslandTop", - "13000194" : "bhvThiTinyIslandTop", - "130001ac" : "bhvCapSwitchBase", - "130001cc" : "bhvCapSwitch", - "130001f4" : "bhvKingBobomb", - "13000254" : "bhvBobombAnchorMario", - "13000278" : "bhvBetaChestBottom", - "1300029c" : "bhvBetaChestLid", - "130002b8" : "bhvBubbleParticleSpawner", - "130002e4" : "bhvBubbleMaybe", - "13000338" : "bhvSmallWaterWave", - "13000398" : "bhvSmallWaterWave398", - "130003bc" : "bhvWaterAirBubble", - "13000400" : "bhvSmallParticle", - "13000428" : "bhvPlungeBubble", - "13000444" : "bhvSmallParticleSnow", - "1300046c" : "bhvSmallParticleBubbles", - "13000494" : "bhvFishGroup", - "130004a8" : "bhvCannon", - "130004e4" : "bhvCannonBarrel", - "13000500" : "bhvCannonBaseUnused", - "13000528" : "bhvChuckya", - "13000584" : "bhvChuckyaAnchorMario", - "130005a8" : "bhvUnused05A8", - "130005b4" : "bhvRotatingPlatform", - "130005d8" : "bhvTower", - "13000600" : "bhvBulletBillCannon", - "13000624" : "bhvWfBreakableWallRight", - "13000638" : "bhvWfBreakableWallLeft", - "1300066c" : "bhvKickableBoard", - "130006a4" : "bhvTowerDoor", - "130006d8" : "bhvRotatingCounterClockwise", - "130006e0" : "bhvWfRotatingWoodenPlatform", - "13000708" : "bhvKoopaShellUnderwater", - "13000720" : "bhvExitPodiumWarp", - "1300075c" : "bhvFadingWarp", - "13000780" : "bhvWarp", - "130007a0" : "bhvWarpPipe", - "130007dc" : "bhvWhitePuffExplosion", - "130007f8" : "bhvSpawnedStar", - "1300080c" : "bhvSpawnedStarNoLevelExit", - "13000830" : "bhvMrIBlueCoin", - "13000888" : "bhvCoinInsideBoo", - "130008d0" : "bhvCoinFormationSpawn", - "130008ec" : "bhvCoinFormation", - "1300090c" : "bhvOneCoin", - "1300091c" : "bhvYellowCoin", - "13000940" : "bhvTemporaryYellowCoin", - "13000964" : "bhvThreeCoinsSpawn", - "13000984" : "bhvTenCoinsSpawn", - "130009a4" : "bhvSingleCoinGetsSpawned", - "130009e0" : "bhvCoinSparkles", - "13000a14" : "bhvGoldenCoinSparkles", - "13000a34" : "bhvWallTinyStarParticle", - "13000a54" : "bhvVertStarParticleSpawner", - "13000a78" : "bhvPoundTinyStarParticle", - "13000a98" : "bhvHorStarParticleSpawner", - "13000abc" : "bhvPunchTinyTriangle", - "13000ad8" : "bhvTriangleParticleSpawner", - "13000afc" : "bhvDoorWarp", - "13000b0c" : "bhvDoor", - "13000b58" : "bhvGrindel", - "13000b8c" : "bhvThwomp2", - "13000bc8" : "bhvThwomp", - "13000c04" : "bhvTumblingBridgePlatform", - "13000c28" : "bhvWfTumblingBridge", - "13000c44" : "bhvBbhTumblingBridge", - "13000c64" : "bhvLllTumblingBridge", - "13000c84" : "bhvFlame", - "13000cc8" : "bhvAnotherElavator", - "13000cfc" : "bhvRrElevatorPlatform", - "13000d30" : "bhvHmcElevatorPlatform", - "13000d6c" : "bhvWaterMist", - "13000d98" : "bhvBreathParticleSpawner", - "13000db4" : "bhvBreakBoxTriangle", - "13000dd8" : "bhvWaterMist2", - "13000dfc" : "bhvUnused0DFC", - "13000e24" : "bhvMistCircParticleSpawner", - "13000e3c" : "bhvDirtParticleSpawner", - "13000e58" : "bhvSnowParticleSpawner", - "13000e70" : "bhvWind", - "13000e88" : "bhvEndToad", - "13000eac" : "bhvEndPeach", - "13000ed0" : "bhvUnusedParticleSpawn", - "13000f08" : "bhvUkiki", - "13000f14" : "bhvUkikiCageChild", - "13000f2c" : "bhvUkikiCageStar", - "13000f48" : "bhvUkikiCage", - "13000f9c" : "bhvBitfsSinkingPlatforms", - "13000fc8" : "bhvBitfsSinkingCagePlatform", - "13001000" : "bhvDddMovingPole", - "13001030" : "bhvBitfsTiltingInvertedPyramid", - "13001064" : "bhvSquishablePlatform", - "13001098" : "bhvCutOutObject", - "130010a8" : "bhvBetaMovingFlamesSpawn", - "130010b8" : "bhvBetaMovingFlames", - "130010d8" : "bhvRrRotatingBridgePlatform", - "13001108" : "bhvFlamethrower", - "13001124" : "bhvFlamethrowerFlame", - "13001168" : "bhvBouncingFireball", - "13001184" : "bhvBouncingFireballFlame", - "130011d0" : "bhvBowserShockWave", - "130011ec" : "bhvFireParticleSpawner", - "13001214" : "bhvBlackSmokeMario", - "13001254" : "bhvBlackSmokeBowser", - "1300127c" : "bhvBlackSmokeUpward", - "13001298" : "bhvBetaFishSplashSpawner", - "130012b4" : "bhvSpindrift", - "130012f4" : "bhvTowerPlatformGroup", - "13001318" : "bhvWfSlidingTowerPlatform", - "13001340" : "bhvWfElevatorTowerPlatform", - "13001368" : "bhvWfSolidTowerPlatform", - "13001390" : "bhvLeafParticleSpawner", - "130013a8" : "bhvTreeSnow", - "130013c4" : "bhvTreeLeaf", - "130013dc" : "bhvAnotherTiltingPlatform", - "13001408" : "bhvSquarishPathMoving", - "1300142c" : "bhvPiranhaPlantBubble", - "13001448" : "bhvPiranhaPlantWakingBubbles", - "13001468" : "bhvFloorSwitchAnimatesObject", - "13001478" : "bhvFloorSwitchGrills", - "13001484" : "bhvFloorSwitchHardcodedModel", - "130014ac" : "bhvFloorSwitchHiddenObjects", - "130014bc" : "bhvHiddenObject", - "130014e0" : "bhvBreakableBox", - "13001518" : "bhvPushableMetalBox", - "13001548" : "bhvHeaveHo", - "130015a4" : "bhvHeaveHoThrowMario", - "130015c0" : "bhvCcmTouchedStarSpawn", - "130015e4" : "bhvUnusedPoundablePlatform", - "13001608" : "bhvBetaTrampolineTop", - "13001634" : "bhvBetaTrampolineSpring", - "13001650" : "bhvJumpingBox", - "1300167c" : "bhvBooCage", - "130016ac" : "bhvStub", - "130016b8" : "bhvIgloo", - "130016e4" : "bhvBowserKey", - "13001714" : "bhvGrandStar", - "13001744" : "bhvBetaBooKey", - "13001778" : "bhvAlphaBooKey", - "1300179c" : "bhvBulletBill", - "130017f4" : "bhvWhitePuffSmoke", - "13001820" : "bhvUnused1820", - "13001828" : "bhvBowserTailAnchor", - "13001850" : "bhvBowser", - "130018cc" : "bhvBowserBodyAnchor", - "13001904" : "bhvBowserFlameSpawn", - "13001920" : "bhvTiltingBowserLavaPlatform", - "13001958" : "bhvFallingBowserPlatform", - "13001984" : "bhvBlueBowserFlame", - "130019c8" : "bhvFlameFloatingLanding", - "13001a0c" : "bhvBlueFlamesGroup", - "13001a30" : "bhvFlameBouncing", - "13001a74" : "bhvFlameMovingForwardGrowing", - "13001aa4" : "bhvFlameBowser", - "13001ae8" : "bhvFlameLargeBurningOut", - "13001b2c" : "bhvBlueFish", - "13001b54" : "bhvTankFishGroup", - "13001b70" : "bhvCheckerboardElevatorGroup", - "13001b88" : "bhvCheckerboardPlatformSub", - "13001bb4" : "bhvBowserKeyUnlockDoor", - "13001bd4" : "bhvBowserKeyCourseExit", - "13001bf4" : "bhvInvisibleObjectsUnderBridge", - "13001c04" : "bhvWaterLevelPillar", - "13001c34" : "bhvDddWarp", - "13001c58" : "bhvMoatGrills", - "13001c7c" : "bhvClockMinuteHand", - "13001c8c" : "bhvClockHourHand", - "13001cb0" : "bhvMacroUkiki", - "13001d0c" : "bhvStub1D0C", - "13001d14" : "bhvLllRotatingHexagonalPlatform", - "13001d40" : "bhvLllSinkingRockBlock", - "13001d70" : "bhvStub1D70", - "13001d78" : "bhvLllMovingOctagonalMeshPlatform", - "13001da4" : "bhvSnowBall", - "13001da8" : "bhvLllRotatingBlockWithFireBars", - "13001dcc" : "bhvLllRotatingHexFlame", - "13001e04" : "bhvLllWoodPiece", - "13001e30" : "bhvLllFloatingWoodBridge", - "13001e4c" : "bhvVolcanoFlames", - "13001e6c" : "bhvLllRotatingHexagonalRing", - "13001e94" : "bhvLllSinkingRectangularPlatform", - "13001ec4" : "bhvLllSinkingSquarePlatforms", - "13001ef8" : "bhvLllTiltingInvertedPyramid", - "13001f30" : "bhvUnused1F30", - "13001f3c" : "bhvKoopaShell", - "13001f68" : "bhvKoopaShellFlame", - "13001f90" : "bhvToxBox", - "13001fbc" : "bhvPiranhaPlant", - "13002018" : "bhvLllHexagonalMesh", - "13002038" : "bhvLllBowserPuzzlePiece", - "13002068" : "bhvLllBowserPuzzle", - "13002088" : "bhvTuxiesMother", - "130020d8" : "bhvPenguinBaby", - "130020e0" : "bhvUnused20E0", - "130020e8" : "bhvSmallPenguin", - "1300213c" : "bhvFish2", - "1300214c" : "bhvFish3", - "1300215c" : "bhvLargeFishGroup", - "13002178" : "bhvFish", - "13002194" : "bhvWdwExpressElevator", - "130021c0" : "bhvWdwExpressElevatorPlatform", - "130021e4" : "bhvChirpChirp", - "130021f4" : "bhvChirpChirpUnused", - "1300220c" : "bhvBub", - "13002250" : "bhvExclamationBox", - "1300227c" : "bhvRotatingExclamationMark", - "1300229c" : "bhvSoundSpawner", - "130022b8" : "bhvRockSolid", - "130022d8" : "bhvBowserSubDoor", - "13002308" : "bhvBowsersSub", - "13002338" : "bhvSushiShark", - "13002388" : "bhvSushiSharkCollisionChild", - "130023a4" : "bhvJrbSlidingBox", - "130023d0" : "bhvShipPart3", - "130023ec" : "bhvInSunkenShip3", - "1300241c" : "bhvSunkenShipPart", - "1300243c" : "bhvSunkenShipSetRotation", - "1300244c" : "bhvSunkenShipPart2", - "1300246c" : "bhvInSunkenShip", - "13002480" : "bhvInSunkenShip2", - "130024ac" : "bhvMistParticleSpawner", - "130024dc" : "bhvWhitePuff1", - "13002500" : "bhvWhitePuff2", - "13002528" : "bhvWhitePuffSmoke2", - "13002558" : "bhvPurpleSwitchHiddenBoxes", - "13002568" : "bhvBlueCoinSwitch", - "13002588" : "bhvHiddenBlueCoin", - "130025c0" : "bhvOpenableCageDoor", - "130025e0" : "bhvOpenableGrill", - "130025f8" : "bhvWaterLevelDiamond", - "13002620" : "bhvInitializeChangingWaterLevel", - "13002634" : "bhvTweesterSandParticle", - "13002650" : "bhvTweester", - "13002684" : "bhvMerryGoRoundBooManager", - "1300269c" : "bhvAnimatedTexture", - "130026d4" : "bhvBooInCastle", - "13002710" : "bhvBooWithCage", - "13002768" : "bhvBalconyBigBoo", - "1300277c" : "bhvMerryGoRoundBigBoo", - "13002790" : "bhvGhostHuntBigBoo", - "130027d0" : "bhvCourtyardBooTriplet", - "130027e4" : "bhvBoo", - "130027f4" : "bhvMerryGoRoundBoo", - "13002804" : "bhvGhostHuntBoo", - "1300286c" : "bhvHiddenStaircaseStep", - "13002898" : "bhvBooBossSpawnedBridge", - "130028cc" : "bhvBbhTiltingTrapPlatform", - "130028fc" : "bhvHauntedBookshelf", - "1300292c" : "bhvMeshElevator", - "13002968" : "bhvMerryGoRound", - "13002998" : "bhvPlaysMusicTrackWhenTouched", - "130029b0" : "bhvInsideCannon", - "130029b4" : "bhvBetaBowserAnchor", - "130029e4" : "bhvStaticCheckeredPlatform", - "13002a10" : "bhvUnused2A10", - "13002a20" : "bhvUnusedFakeStar", - "13002a48" : "bhvStaticObject", - "13002a54" : "bhvUnused2A54", - "13002a5c" : "bhvCastleFloorTrap", - "13002a7c" : "bhvFloorTrapInCastle", - "13002aa4" : "bhvTree", - "13002ad0" : "bhvSparkle", - "13002af0" : "bhvSparkleSpawn", - "13002b08" : "bhvSparkleParticleSpawner", - "13002b5c" : "bhvScuttlebug", - "13002ba0" : "bhvScuttlebugSpawn", - "13002bb8" : "bhvWhompKingBoss", - "13002bcc" : "bhvSmallWhomp", - "13002c14" : "bhvWaterSplash", - "13002c60" : "bhvWaterDroplet", - "13002c7c" : "bhvWaterDropletSplash", - "13002cb0" : "bhvBubbleSplash", - "13002ce0" : "bhvIdleWaterWave", - "13002d28" : "bhvObjectWaterSplash", - "13002d50" : "bhvShallowWaterWave", - "13002d7c" : "bhvShallowWaterSplash", - "13002db0" : "bhvObjectWaveTrail", - "13002dc0" : "bhvWaveTrail", - "13002e04" : "bhvTinyStrongWindParticle", - "13002e20" : "bhvStrongWindParticle", - "13002e3c" : "bhvSLSnowmanWind", - "13002e58" : "bhvSLWalkingPenguin", - "13002ea8" : "bhvYellowBall", - "13002ec0" : "bhvMario", - "13002ef8" : "bhvToadMessage", - "13002f40" : "bhvUnlockDoorStar", - "13002f60" : "bhvInstantActiveWarp", - "13002f64" : "bhvAirborneWarp", - "13002f68" : "bhvHardAirKnockBackWarp", - "13002f6c" : "bhvSpinAirborneCircleWarp", - "13002f70" : "bhvDeathWarp", - "13002f74" : "bhvSpinAirborneWarp", - "13002f78" : "bhvFlyingWarp", - "13002f7c" : "bhvPaintingStarCollectWarp", - "13002f80" : "bhvPaintingDeathWarp", - "13002f84" : "bhvAirborneDeathWarp", - "13002f88" : "bhvAirborneStarCollectWarp", - "13002f8c" : "bhvLaunchStarCollectWarp", - "13002f90" : "bhvLaunchDeathWarp", - "13002f94" : "bhvSwimmingWarp", - "13002fa0" : "bhvRandomAnimatedTexture", - "13002fc0" : "bhvYellowBackgroundInMenu", - "13002fe4" : "bhvMenuButton", - "13003008" : "bhvMenuButtonManager", - "1300302c" : "bhvActSelectorStarType", - "13003048" : "bhvActSelector", - "13003068" : "bhvMovingYellowCoin", - "130030a4" : "bhvMovingBlueCoin", - "130030d4" : "bhvBlueCoinSliding", - "13003104" : "bhvBlueCoinJumping", - "13003134" : "bhvSeaweed", - "13003158" : "bhvSeaweedBundle", - "13003174" : "bhvBobomb", - "130031ac" : "bhvBobombFuseSmoke", - "130031dc" : "bhvBobombBuddy", - "13003228" : "bhvBobombBuddyOpensCannon", - "13003274" : "bhvCannonClosed", - "130032a8" : "bhvWhirlpool", - "130032c8" : "bhvJetStream", - "130032e0" : "bhvMessagePanel", - "13003324" : "bhvSignOnWall", - "13003354" : "bhvHomingAmp", - "13003388" : "bhvCirclingAmp", - "130033bc" : "bhvButterfly", - "130033ec" : "bhvHoot", - "13003420" : "bhvBetaHoldableObject", - "13003454" : "bhvCarrySomething1", - "1300345c" : "bhvCarrySomething2", - "13003464" : "bhvCarrySomething3", - "1300346c" : "bhvCarrySomething4", - "13003474" : "bhvCarrySomething5", - "1300347c" : "bhvCarrySomething6", - "13003484" : "bhvObjectBubble", - "130034c4" : "bhvObjectWaterWave", - "13003510" : "bhvExplosion", - "13003558" : "bhvBobombBullyDeathSmoke", - "13003588" : "bhvSmoke", - "130035b0" : "bhvBobombExplosionBubble", - "13003600" : "bhvBobombExplosionBubble3600", - "13003614" : "bhvRespawner", - "1300362c" : "bhvSmallBully", - "13003660" : "bhvBigBully", - "13003694" : "bhvBigBullyWithMinions", - "130036c8" : "bhvSmallChillBully", - "13003700" : "bhvBigChillBully", - "13003738" : "bhvJetStreamRingSpawner", - "13003750" : "bhvJetStreamWaterRing", - "13003798" : "bhvMantaRayWaterRing", - "130037e0" : "bhvMantaRayRingManager", - "130037ec" : "bhvBowserBomb", - "1300381c" : "bhvBowserBombExplosion", - "13003840" : "bhvBowserBombSmoke", - "13003868" : "bhvCelebrationStar", - "13003888" : "bhvCelebrationStarSparkle", - "130038b0" : "bhvStarKeyCollectionPuffSpawner", - "130038d0" : "bhvLllDrawbridgeSpawner", - "130038e8" : "bhvLllDrawbridge", - "13003910" : "bhvSmallBomp", - "13003940" : "bhvLargeBomp", - "13003970" : "bhvWfSlidingPlatform", - "130039a0" : "bhvMoneybag", - "130039d4" : "bhvMoneybagHidden", - "13003a08" : "bhvPitBowlingBall", - "13003a30" : "bhvFreeBowlingBall", - "13003a58" : "bhvBowlingBall", - "13003a80" : "bhvTtmBowlingBallSpawner", - "13003aa4" : "bhvBobBowlingBallSpawner", - "13003ac8" : "bhvThiBowlingBallSpawner", - "13003ae0" : "bhvRrCruiserWing", - "13003b00" : "bhvSpindel", - "13003b30" : "bhvSslMovingPyramidWall", - "13003b60" : "bhvPyramidElevator", - "13003b98" : "bhvPyramidElevatorTrajectoryMarkerBall", - "13003bb4" : "bhvPyramidTop", - "13003bec" : "bhvPyramidTopFragment", - "13003c0c" : "bhvPyramidPillarTouchDetector", - "13003c30" : "bhvWaterfallSoundLoop", - "13003c44" : "bhvVolcanoSoundLoop", - "13003c58" : "bhvCastleFlagWaving", - "13003c7c" : "bhvBirdsSoundLoop", - "13003c90" : "bhvAmbientSounds", - "13003ca4" : "bhvSandSoundLoop", - "13003cb8" : "bhvHiddenAt120Stars", - "13003ce4" : "bhvSnowmansBottom", - "13003d0c" : "bhvSnowmansHead", - "13003d34" : "bhvSnowmansBodyCheckpoint", - "13003d4c" : "bhvBigSnowmanWhole", - "13003d74" : "bhvBigBoulder", - "13003da0" : "bhvBigBoulderGenerator", - "13003db8" : "bhvWingCap", - "13003dd8" : "bhvMetalCap", - "13003df8" : "bhvNormalCap", - "13003e1c" : "bhvVanishCap", - "13003e3c" : "bhvStar", - "13003e64" : "bhvStarSpawnCoordinates", - "13003e8c" : "bhvHiddenRedCoinStar", - "13003eac" : "bhvRedCoin", - "13003ee4" : "bhvBowserCourseRedCoinStar", - "13003efc" : "bhvHiddenStar", - "13003f1c" : "bhvHiddenStarTrigger", - "13003f40" : "bhvTtmRollingLog", - "13003f78" : "bhvLllVolcanoFallingTrap", - "13003fa4" : "bhvLllRollingLog", - "13003fdc" : "bhv1upWalking", - "13004010" : "bhv1upRunningAway", - "13004044" : "bhv1upSliding", - "1300407c" : "bhv1Up", - "130040b4" : "bhv1upJumpOnApproach", - "130040ec" : "bhvHidden1up", - "13004124" : "bhvHidden1upTrigger", - "13004148" : "bhvHidden1upInPole", - "13004180" : "bhvHidden1upInPoleTrigger", - "130041a4" : "bhvHidden1upInPoleSpawner", - "130041bc" : "bhvControllablePlatform", - "130041f0" : "bhvControllablePlatformSub", - "13004218" : "bhvBreakableBoxSmall", - "13004244" : "bhvSlidingSnowMound", - "13004270" : "bhvSnowMoundSpawn", - "13004284" : "bhvWdwSquareFloatingPlatform", - "130042b4" : "bhvWdwRectangularFloatingPlatform", - "130042e4" : "bhvJrbFloatingPlatform", - "13004314" : "bhvArrowLift", - "13004348" : "bhvOrangeNumber", - "13004370" : "bhvMantaRay", - "130043a0" : "bhvFallingPillar", - "130043c4" : "bhvFallingPillarHitbox", - "130043e0" : "bhvPillarBase", - "13004400" : "bhvJrbFloatingBox", - "1300442c" : "bhvDecorativePendulum", - "1300444c" : "bhvTreasureChestsShip", - "13004470" : "bhvTreasureChestsJrb", - "13004494" : "bhvTreasureChests", - "130044b8" : "bhvTreasureChestBottom", - "130044e0" : "bhvTreasureChestTop", - "130044fc" : "bhvMips", - "13004538" : "bhvYoshi", - "13004580" : "bhvKoopa", - "130045d0" : "bhvKoopaRaceEndpoint", - "130045f8" : "bhvKoopaFlag", - "13004634" : "bhvPokey", - "13004668" : "bhvPokeyBodyPart", - "13004698" : "bhvSwoop", - "130046dc" : "bhvFlyGuy", - "1300472c" : "bhvGoomba", - "13004770" : "bhvGoombaTripletSpawner", - "1300478c" : "bhvChainChomp", - "130047e4" : "bhvChainChompChainPart", - "1300481c" : "bhvWoodenPost", - "13004868" : "bhvChainChompGate", - "13004898" : "bhvWigglerHead", - "130048e0" : "bhvWigglerBody", - "13004918" : "bhvEnemyLakitu", - "13004954" : "bhvCameraLakitu", - "13004988" : "bhvCloud", - "130049ac" : "bhvCloudPart", - "130049c8" : "bhvSpiny", - "13004a00" : "bhvMontyMole", - "13004a58" : "bhvMontyMoleHole", - "13004a78" : "bhvMontyMoleRock", - "13004ab0" : "bhvPlatformOnTrack", - "13004af4" : "bhvTrackBall", - "13004b1c" : "bhvSeesawPlatform", - "13004b44" : "bhvFerrisWheelAxle", - "13004b6c" : "bhvFerrisWheelPlatform", - "13004b8c" : "bhvWaterBombSpawner", - "13004ba8" : "bhvWaterBomb", - "13004bd4" : "bhvWaterBombShadow", - "13004bf0" : "bhvTTCRotatingSolid", - "13004c24" : "bhvTTCPendulum", - "13004c5c" : "bhvTTCTreadmill", - "13004c94" : "bhvTTCMovingBar", - "13004ccc" : "bhvTTCCog", - "13004cf8" : "bhvTTCPitBlock", - "13004d28" : "bhvTTCElevator", - "13004d64" : "bhvTTC2DRotator", - "13004d90" : "bhvTTCSpinner", - "13004dbc" : "bhvMrBlizzard", - "13004e08" : "bhvMrBlizzardSnowball", - "13004e4c" : "bhvSlidingPlatform2", - "13004e78" : "bhvOctagonalPlatformRotating", - "13004ea0" : "bhvAnimatesOnFloorSwitchPress", - "13004ecc" : "bhvActivatedBackAndForthPlatform", - "13004ef8" : "bhvRecoveryHeart", - "13004f10" : "bhvWaterBombCannon", - "13004f28" : "bhvCannonBarrelBubbles", - "13004f40" : "bhvUnagi", - "13004f78" : "bhvUnagiSubobject", - "13004f90" : "bhvDorrie", - "13004fd4" : "bhvHauntedChair", - "13005024" : "bhvMadPiano", - "1300506c" : "bhvFlyingBookend", - "130050b4" : "bhvBookendSpawn", - "130050d4" : "bhvHauntedBookshelfManager", - "130050f4" : "bhvBookSwitch", - "13005120" : "bhvFirePiranhaPlant", - "13005158" : "bhvSmallPiranhaFlame", - "1300518c" : "bhvFireSpitter", - "130051ac" : "bhvFlyguyFlame", - "130051e0" : "bhvSnufit", - "1300521c" : "bhvSnufitBalls", - "1300525c" : "bhvHorizontalGrindel", - "130052b4" : "bhvEyerokBoss", - "130052d0" : "bhvEyerokHand", - "13005310" : "bhvKlepto", - "13005354" : "bhvBird", - "13005380" : "bhvRacingPenguin", - "130053c4" : "bhvPenguinRaceFinishLine", - "130053dc" : "bhvPenguinRaceShortcutCheck", - "130053f4" : "bhvCoffinSpawner", - "13005414" : "bhvCoffin", - "13005440" : "bhvClamShell", - "13005468" : "bhvSkeeter", - "130054a0" : "bhvSkeeterWave", - "130054b8" : "bhvSwingPlatform", - "130054ec" : "bhvDonutPlatformSpawner", - "13005504" : "bhvDonutPlatform", - "13005528" : "bhvDDDPole", - "1300556c" : "bhvRedCoinStarMarker", - "13005598" : "bhvTripletButterfly", - "130055dc" : "bhvBubba", - "13005610" : "bhvBeginningLakitu", - "13005638" : "bhvBeginningPeach", - "1300565c" : "bhvEndBirds1", - "13005680" : "bhvEndBirds2", - "130056a4" : "bhvIntroScene", - "130056c0" : "_behaviorSegmentEnd", - "007d1d80" : "_behaviorSegmentRomEnd", - "8016f000" : "_goddardSegmentStart", - "007cc6c0" : "_goddardSegmentRomStart", - }, - - "Refresh 12" : { - "80000000" : "EXCEPTION_TLB_MISS", - "a4000000" : "SP_DMEM", - "a40004c0" : "SP_DMEM_UNK0", - "a4000774" : "SP_DMEM_UNK1", - "a4001000" : "SP_IMEM", - "a4040010" : "SP_STATUS_REG", - "a4080000" : "SP_PC", - "a4300000" : "MI_MODE_REG", - "a4300004" : "MI_VERSION_REG", - "a4300008" : "MI_INTR_REG", - "a430000c" : "MI_INTR_MASK_REG", - "a4400010" : "VI_CURRENT_REG", - "a450000c" : "AI_STATUS_REG", - "a4600000" : "PI_DRAM_ADDR_REG", - "a4600004" : "PI_CART_ADDR_REG", - "a460000c" : "PI_WR_LEN_REG", - "a4600010" : "PI_STATUS_REG", - "a4700000" : "RI_MODE_REG", - "a4700010" : "RI_REFRESH_REG", - "a4800018" : "SI_STATUS_REG", - "b0000008" : "D_B0000008", - "b0000010" : "D_B0000010", - "b0000014" : "D_B0000014", - "c0000000" : "D_C0000000", - "c0000008" : "D_C0000008", - "c000000c" : "D_C000000C", - "802f69cc" : "func_sh_802F69CC", - "80302ef0" : "osMotorStop", - "80303090" : "osMotorStart", - "803033ac" : "osMotorInit", - "803016a0" : "func_sh_803016A0", - "803016d0" : "func_sh_803016D0", - "80301820" : "func_sh_80301820", - "00000000" : "__romPos", - "04000000" : "_bootSegmentStart", - "007cc6c0" : "_bootSegmentRomStart", - "04000040" : "ipl3_entry", - "04000b70" : "ipl3_font", - "04001000" : "_bootSegmentEnd", - "007cd6c0" : "_bootSegmentRomEnd", - "80000400" : ".", - "80000400" : "_zbufferSegmentNoloadStart", - "80000400" : "0x25800", - "80000400" : "gZBuffer", - "80246000" : "_mainSegmentStart", - "007cc6c0" : "_mainSegmentRomStart", - "80246000" : "entry_point", - "80246050" : "handle_debug_key_sequences", - "80246170" : "unknown_main_func", - "802461cc" : "stub_main_1", - "802461dc" : "stub_main_2", - "802461ec" : "stub_main_3", - "802461fc" : "setup_mesg_queues", - "802462e0" : "alloc_pool", - "80246338" : "create_thread", - "8024639c" : "handle_nmi_request", - "802463ec" : "receive_new_tasks", - "8024651c" : "start_sptask", - "8024659c" : "interrupt_gfx_sptask", - "802465ec" : "start_gfx_sptask", - "80246648" : "pretend_audio_sptask_done", - "8024669c" : "handle_vblank", - "802467fc" : "handle_sp_complete", - "8024694c" : "handle_dp_complete", - "802469b8" : "thread3_main", - "80246b14" : "set_vblank_handler", - "80246b74" : "send_sp_task_message", - "80246bb4" : "dispatch_audio_sptask", - "80246c10" : "send_display_list", - "80246c9c" : "turn_on_audio", - "80246cb8" : "turn_off_audio", - "80246cf0" : "thread1_idle", - "80246df8" : "main_func", - "80246e70" : "my_rdp_init", - "802471a4" : "my_rsp_init", - "80247284" : "clear_z_buffer", - "802473c8" : "display_frame_buffer", - "802474b8" : "clear_frame_buffer", - "80247620" : "clear_viewport", - "8024784c" : "draw_screen_borders", - "802479bc" : "make_viewport_clip_rect", - "80247b3c" : "create_task_structure", - "80247ccc" : "init_render_image", - "80247d14" : "end_master_display_list", - "80247db4" : "draw_reset_bars", - "80247f08" : "rendering_init", - "80247fdc" : "config_gfx_pool", - "80248090" : "display_and_vsync", - "80248304" : "adjust_analog_stick", - "80248498" : "run_demo_inputs", - "80248638" : "read_controller_inputs", - "80248824" : "init_controllers", - "80248964" : "setup_game_memory", - "80248af0" : "thread5_game_loop", - "80248c40" : "reset_volume", - "80248c58" : "lower_background_noise", - "80248ce8" : "raise_background_noise", - "80248d78" : "disable_background_sound", - "80248dc0" : "enable_background_sound", - "80248e08" : "set_sound_mode", - "80248e54" : "play_menu_sounds", - "80248fec" : "play_painting_eject_sound", - "80249070" : "play_infinite_stairs_music", - "80249178" : "set_background_music", - "8024922c" : "fadeout_music", - "8024927c" : "fadeout_level_music", - "802492d0" : "play_cutscene_music", - "80249310" : "play_shell_music", - "8024934c" : "stop_shell_music", - "80249398" : "play_cap_music", - "80249404" : "fadeout_cap_music", - "80249448" : "stop_cap_music", - "80249494" : "play_menu_sounds_extra", - "802494d8" : "audio_game_loop_tick", - "80249500" : "thread4_sound", - "802495e0" : "level_control_timer", - "802496b8" : "pressed_pause", - "80249764" : "set_play_mode", - "8024978c" : "warp_special", - "802497b8" : "fade_into_special_warp", - "8024982c" : "stub_level_update_1", - "8024983c" : "load_level_init_text", - "8024995c" : "init_door_warp", - "80249a10" : "set_mario_initial_cap_powerup", - "80249ab4" : "set_mario_initial_action", - "80249cd8" : "init_mario_after_warp", - "8024a124" : "warp_area", - "8024a18c" : "warp_level", - "8024a1d8" : "warp_credits", - "8024a374" : "check_instant_warp", - "8024a584" : "music_changed_through_warp", - "8024a700" : "initiate_warp", - "8024a7b4" : "get_painting_warp_node", - "8024a85c" : "initiate_painting_warp", - "8024a9cc" : "level_trigger_warp", - "8024aedc" : "initiate_delayed_warp", - "8024b13c" : "update_hud_values", - "8024b390" : "basic_update", - "8024b3e4" : "play_mode_normal", - "8024b5d4" : "play_mode_paused", - "8024b6cc" : "play_mode_frame_advance", - "8024b798" : "level_set_transition", - "8024b7c0" : "play_mode_change_area", - "8024b880" : "play_mode_change_level", - "8024b9b8" : "update_level", - "8024ba8c" : "init_level", - "8024bcd8" : "lvl_init_or_update", - "8024bd5c" : "lvl_init_from_save_file", - "8024be14" : "lvl_set_current_level", - "8024bfa0" : "lvl_play_the_end_screen_sound", - "8024bff0" : "get_mario_cap_flag", - "8024c0b8" : "object_facing_mario", - "8024c16c" : "mario_obj_angle_to_object", - "8024c1d8" : "determine_interaction", - "8024c51c" : "attack_object", - "8024c618" : "mario_stop_riding_object", - "8024c66c" : "mario_grab_used_object", - "8024c6c0" : "mario_drop_held_object", - "8024c780" : "mario_throw_held_object", - "8024c894" : "mario_stop_riding_and_holding", - "8024c8fc" : "does_mario_have_normal_cap_on_head", - "8024c928" : "mario_blow_off_cap", - "8024ca68" : "mario_lose_cap_to_enemy", - "8024caf8" : "mario_retrieve_cap", - "8024cb58" : "able_to_grab_object", - "8024cbfc" : "mario_get_collided_object", - "8024cc7c" : "mario_check_object_grab", - "8024ce08" : "bully_knock_back_mario", - "8024d0b4" : "bounce_off_object", - "8024d130" : "hit_object_from_below", - "8024d2bc" : "determine_knockback_action", - "8024d578" : "push_mario_out_of_object", - "8024d72c" : "bounce_back_from_attack", - "8024d804" : "should_push_or_pull_door", - "8024d8b0" : "take_damage_from_interact_object", - "8024d998" : "take_damage_and_knock_back", - "8024daac" : "reset_mario_pitch", - "8024db2c" : "interact_coin", - "8024dbf0" : "interact_water_ring", - "8024dc28" : "interact_star_or_key", - "8024de4c" : "interact_bbh_entrance", - "8024df10" : "interact_warp", - "8024e0c4" : "interact_warp_door", - "8024e2fc" : "get_door_save_file_flag", - "8024e420" : "interact_door", - "8024e6ec" : "interact_cannon_base", - "8024e778" : "interact_igloo_barrier", - "8024e7d4" : "interact_tornado", - "8024e8f0" : "interact_whirlpool", - "8024e9d0" : "interact_strong_wind", - "8024ead8" : "interact_flame", - "8024ec54" : "interact_snufit_bullet", - "8024ed84" : "interact_clam_or_bubba", - "8024ee44" : "interact_bully", - "8024eff8" : "interact_shock", - "8024f170" : "interact_mr_blizzard", - "8024f1e0" : "interact_hit_from_below", - "8024f354" : "interact_bounce_top", - "8024f4ac" : "interact_unknown_08", - "8024f55c" : "interact_damage", - "8024f5cc" : "interact_breakable", - "8024f6a4" : "interact_koopa_shell", - "8024f7a8" : "check_object_grab_mario", - "8024f8bc" : "interact_pole", - "8024fa60" : "interact_hoot", - "8024fb30" : "interact_cap", - "8024fd2c" : "interact_grabbable", - "8024fe6c" : "mario_can_talk", - "8024ff04" : "check_read_sign", - "80250098" : "check_npc_talk", - "80250198" : "interact_text", - "80250230" : "check_kick_or_punch_wall", - "802503f0" : "mario_process_interactions", - "802505c8" : "check_death_barrier", - "8025065c" : "check_lava_boost", - "80250724" : "pss_begin_slide", - "80250778" : "pss_end_slide", - "802507fc" : "mario_handle_special_floors", - "80250940" : "is_anim_at_end", - "8025097c" : "is_anim_past_end", - "802509b8" : "set_mario_animation", - "80250b04" : "set_mario_anim_with_accel", - "80250c7c" : "set_anim_to_frame", - "80250d38" : "is_anim_past_frame", - "80250e54" : "find_mario_anim_flags_and_translation", - "80251020" : "update_mario_pos_for_anim", - "802510dc" : "return_mario_anim_y_translation", - "80251120" : "play_sound_if_no_flag", - "8025118c" : "play_mario_jump_sound", - "80251274" : "adjust_sound_for_speed", - "80251310" : "play_sound_and_spawn_particles", - "80251444" : "play_mario_action_sound", - "802514ac" : "play_mario_landing_sound", - "80251510" : "play_mario_landing_sound_once", - "80251574" : "play_mario_heavy_landing_sound", - "802515d8" : "play_mario_heavy_landing_sound_once", - "8025163c" : "play_mario_sound", - "80251708" : "mario_set_forward_vel", - "8025177c" : "mario_get_floor_class", - "802518a8" : "mario_get_terrain_sound_addend", - "80251a48" : "resolve_and_return_wall_collisions", - "80251afc" : "vec3f_find_ceil", - "80251b54" : "mario_facing_downhill", - "80251bd4" : "mario_floor_is_slippery", - "80251cfc" : "mario_floor_is_slope", - "80251e24" : "mario_floor_is_steep", - "80251f24" : "find_floor_height_relative_polar", - "80252000" : "find_floor_slope", - "802521a0" : "update_mario_sound_and_camera", - "8025229c" : "set_steep_jump_action", - "80252cf4" : "set_mario_action", - "80252e5c" : "set_jump_from_landing", - "802530a0" : "set_jumping_action", - "80253178" : "drop_and_set_mario_action", - "802531c4" : "hurt_and_set_mario_action", - "80253218" : "check_common_action_exits", - "80253300" : "check_common_hold_action_exits", - "802533e4" : "transition_submerged_to_walking", - "80253488" : "set_water_plunge_action", - "80253588" : "squish_mario_model", - "80253720" : "debug_print_speed_action_normal", - "80253838" : "update_mario_button_inputs", - "8025395c" : "update_mario_joystick_inputs", - "80253a60" : "update_mario_geometry_inputs", - "80253d58" : "update_mario_inputs", - "80253ec0" : "set_submerged_cam_preset_and_spawn_bubbles", - "80254060" : "update_mario_health", - "802542b4" : "update_mario_info_for_cam", - "80254338" : "mario_reset_bodystate", - "80254390" : "sink_mario_in_quicksand", - "802543e8" : "update_and_return_cap_flags", - "80254588" : "mario_update_hitbox_and_cap_model", - "80254830" : "execute_mario_action", - "80254b20" : "init_mario", - "80254f44" : "init_mario_from_save_file", - "80255080" : "get_additive_y_vel_for_jumps", - "8025509c" : "stub_mario_step_1", - "802550b0" : "stub_mario_step_2", - "802550c0" : "transfer_bully_speed", - "80255238" : "init_bully_collision_data", - "802552fc" : "mario_bonk_reflection", - "80255414" : "mario_update_quicksand", - "80255654" : "mario_push_off_steep_floor", - "8025570c" : "mario_update_moving_sand", - "8025580c" : "mario_update_windy_ground", - "802559b0" : "stop_and_set_height_to_floor", - "80255a34" : "stationary_ground_step", - "80255d88" : "perform_ground_step", - "80255ec4" : "check_ledge_grab", - "802560ac" : "perform_air_quarter_step", - "802564e0" : "apply_twirl_gravity", - "80256584" : "should_strengthen_gravity_for_jump_ascent", - "8025661c" : "apply_gravity", - "802569f8" : "apply_vertical_wind", - "80256b24" : "perform_air_step", - "80256cd8" : "set_vel_from_pitch_and_yaw", - "80256d8c" : "set_vel_from_yaw", - "80256e00" : "get_credits_str_width", - "80256e88" : "print_displaying_credits_entry", - "80257060" : "bhv_end_peach_loop", - "802570dc" : "bhv_end_toad_loop", - "80257198" : "geo_switch_peach_eyes", - "802572b0" : "get_star_collection_dialog", - "8025733c" : "handle_save_menu", - "80257450" : "spawn_obj_at_mario_rel_yaw", - "802574e8" : "cutscene_take_cap_off", - "80257548" : "cutscene_put_cap_on", - "802575a8" : "mario_ready_to_speak", - "80257640" : "set_mario_npc_dialog", - "80257748" : "act_reading_npc_dialog", - "80257980" : "act_waiting_for_dialog", - "80257a0c" : "act_disappeared", - "80257ab0" : "act_reading_automatic_dialog", - "80257ce4" : "act_reading_sign", - "80257eac" : "act_debug_free_move", - "80258184" : "general_star_dance_handler", - "80258420" : "act_star_dance", - "802584dc" : "act_star_dance_water", - "802585c0" : "act_fall_after_star_grab", - "802586cc" : "common_death_handler", - "80258744" : "act_standing_death", - "802587ec" : "act_electrocution", - "8025883c" : "act_suffocation", - "8025888c" : "act_death_on_back", - "802588f8" : "act_death_on_stomach", - "80258964" : "act_quicksand_death", - "80258a7c" : "act_eaten_by_bubba", - "80258b24" : "launch_mario_until_land", - "80258ba8" : "act_unlocking_key_door", - "80258dac" : "act_unlocking_star_door", - "80258f94" : "act_entering_star_door", - "80259264" : "act_going_through_door", - "802593cc" : "act_warp_door_spawn", - "802594d4" : "act_emerge_from_pipe", - "80259608" : "act_spawn_spin_airborne", - "80259740" : "act_spawn_spin_landing", - "802597ac" : "act_exit_airborne", - "80259854" : "act_falling_exit_airborne", - "802598d0" : "act_exit_land_save_dialog", - "80259c30" : "act_death_exit", - "80259ce8" : "act_unused_death_exit", - "80259d74" : "act_falling_death_exit", - "80259e00" : "act_special_exit_airborne", - "80259ef8" : "act_special_death_exit", - "80259fcc" : "act_spawn_no_spin_airborne", - "8025a040" : "act_spawn_no_spin_landing", - "8025a0bc" : "act_bbh_enter_spin", - "8025a494" : "act_bbh_enter_jump", - "8025a610" : "act_teleport_fade_out", - "8025a6fc" : "act_teleport_fade_in", - "8025a858" : "act_shocked", - "8025a9ac" : "act_squished", - "8025ae0c" : "act_putting_on_cap", - "8025aea8" : "stuck_in_ground_handler", - "8025affc" : "act_head_stuck_in_ground", - "8025b050" : "act_butt_stuck_in_ground", - "8025b0a4" : "act_feet_stuck_in_ground", - "8025bc80" : "generate_yellow_sparkles", - "8025d798" : "mario_execute_cutscene_action", - "8025dd70" : "add_tree_leaf_particles", - "8025de1c" : "play_climbing_sounds", - "8025df04" : "set_pole_position", - "8025e21c" : "act_holding_pole", - "8025e5a8" : "act_climbing_pole", - "8025e7a4" : "act_grab_pole_slow", - "8025e830" : "act_grab_pole_fast", - "8025e930" : "act_top_of_pole_transition", - "8025ea30" : "act_top_of_pole", - "8025eb50" : "perform_hanging_step", - "8025ecfc" : "update_hang_moving", - "8025eed0" : "update_hang_stationary", - "8025ef58" : "act_start_hanging", - "8025f0b4" : "act_hanging", - "8025f1e4" : "act_hang_moving", - "8025f384" : "let_go_of_ledge", - "8025f4b4" : "climb_up_ledge", - "8025f560" : "update_ledge_climb_camera", - "8025f644" : "update_ledge_climb", - "8025f6c0" : "act_ledge_grab", - "8025f970" : "act_ledge_climb_slow", - "8025fa64" : "act_ledge_climb_down", - "8025fae8" : "act_ledge_climb_fast", - "8025fb90" : "act_grabbed", - "8025fc6c" : "act_in_cannon", - "80260154" : "act_tornado_twirling", - "80260568" : "check_common_automatic_cancels", - "802605d0" : "mario_execute_automatic_action", - "802608b0" : "check_common_idle_cancels", - "80260aac" : "check_common_hold_idle_cancels", - "80260cb4" : "act_idle", - "80260f94" : "play_anim_sound", - "80261000" : "act_start_sleeping", - "80261268" : "act_sleeping", - "802614fc" : "act_waking_up", - "8026168c" : "act_shivering", - "802618d8" : "act_coughing", - "802619d0" : "act_hold_idle", - "80261ad0" : "act_hold_heavy_idle", - "80261bf8" : "act_standing_against_wall", - "80261cec" : "act_in_quicksand", - "80261db4" : "act_crouching", - "80261f70" : "act_panting", - "80262080" : "act_hold_panting_unused", - "8026217c" : "stopping_step", - "802621dc" : "act_braking_stop", - "802622dc" : "act_butt_slide_stop", - "80262398" : "act_hold_butt_slide_stop", - "80262490" : "act_slide_kick_slide_stop", - "80262530" : "act_start_crouching", - "80262650" : "act_stop_crouching", - "80262770" : "act_start_crawling", - "80262890" : "act_stop_crawling", - "80262980" : "act_shockwave_bounce", - "80262bc4" : "landing_step", - "80262c34" : "check_common_landing_cancels", - "80262d68" : "act_jump_land_stop", - "80262dc4" : "act_double_jump_land_stop", - "80262e20" : "act_side_flip_land_stop", - "80262e94" : "act_freefall_land_stop", - "80262ef0" : "act_triple_jump_land_stop", - "80262f50" : "act_backflip_land_stop", - "80262fec" : "act_lava_boost_land", - "8026305c" : "act_long_jump_land_stop", - "802630f8" : "act_hold_jump_land_stop", - "802631f0" : "act_hold_freefall_land_stop", - "802632e8" : "act_air_throw_land", - "802633b4" : "act_twirl_land", - "8026350c" : "act_ground_pound_land", - "802635e8" : "act_first_person", - "80263784" : "check_common_stationary_cancels", - "80263898" : "mario_execute_stationary_action", - "80263e60" : "tilt_body_running", - "80263ee4" : "play_step_sound", - "80264024" : "align_with_floor", - "8026409c" : "begin_walking_action", - "802640fc" : "check_ledge_climb_down", - "802642b4" : "slide_bonk", - "80264340" : "set_triple_jump_action", - "8026440c" : "update_sliding_angle", - "80264740" : "update_sliding", - "80264b54" : "apply_slope_accel", - "80264d80" : "apply_landing_accel", - "80264e18" : "update_shell_speed", - "80265080" : "apply_slope_decel", - "802651b0" : "update_decelerating_speed", - "80265244" : "update_walking_speed", - "80265458" : "should_begin_sliding", - "80265514" : "analog_stick_held_back", - "80265558" : "check_ground_dive_or_punch", - "80265620" : "begin_braking_action", - "80265700" : "anim_and_audio_for_walk", - "80265b1c" : "anim_and_audio_for_hold_walk", - "80265d90" : "anim_and_audio_for_heavy_walk", - "80265df8" : "push_or_sidle_wall", - "80266038" : "tilt_body_walking", - "802661cc" : "tilt_body_ground_shell", - "80266354" : "act_walking", - "802665b4" : "act_move_punching", - "80266734" : "act_hold_walking", - "8026699c" : "act_hold_heavy_walking", - "80266af8" : "act_turning_around", - "80266d4c" : "act_finish_turning_around", - "80266e48" : "act_braking", - "80266fc8" : "act_decelerating", - "80267240" : "act_hold_decelerating", - "80267504" : "act_riding_shell_ground", - "80267728" : "act_crawling", - "8026795c" : "act_burning_ground", - "80267c24" : "tilt_body_butt_slide", - "80267ce4" : "common_slide_action", - "80267fa4" : "common_slide_action_with_jump", - "80268074" : "act_butt_slide", - "802680d4" : "act_hold_butt_slide", - "80268168" : "act_crouch_slide", - "80268338" : "act_slide_kick_slide", - "802684ac" : "stomach_slide_action", - "802685c0" : "act_stomach_slide", - "80268608" : "act_hold_stomach_slide", - "80268684" : "act_dive_slide", - "802687b8" : "common_ground_knockback_action", - "802689f8" : "act_hard_backward_ground_kb", - "80268adc" : "act_hard_forward_ground_kb", - "80268b64" : "act_backward_ground_kb", - "80268bb0" : "act_forward_ground_kb", - "80268bfc" : "act_soft_backward_ground_kb", - "80268c48" : "act_soft_forward_ground_kb", - "80268c94" : "act_ground_bonk", - "80268d04" : "act_death_exit_land", - "80268dcc" : "common_landing_action", - "80268f78" : "common_landing_cancels", - "80269108" : "act_jump_land", - "80269170" : "act_freefall_land", - "802691d8" : "act_side_flip_land", - "80269264" : "act_hold_jump_land", - "80269300" : "act_hold_freefall_land", - "8026939c" : "act_long_jump_land", - "8026947c" : "act_double_jump_land", - "802694e4" : "act_triple_jump_land", - "80269588" : "act_backflip_land", - "80269640" : "quicksand_jump_land_action", - "80269788" : "act_quicksand_jump_land", - "802697dc" : "act_hold_quicksand_jump_land", - "80269830" : "check_common_moving_cancels", - "80269954" : "mario_execute_moving_action", - "80269f40" : "play_flip_sounds", - "80269fc0" : "play_far_fall_sound", - "8026a090" : "play_knockback_sound", - "8026a12c" : "lava_boost_on_wall", - "8026a224" : "check_fall_damage", - "8026a400" : "check_kick_or_dive_in_air", - "8026a494" : "should_get_stuck_in_ground", - "8026a598" : "check_fall_damage_or_get_stuck", - "8026a62c" : "check_horizontal_wind", - "8026a818" : "update_air_with_turn", - "8026aa48" : "update_air_without_turn", - "8026acd8" : "update_lava_boost_or_twirling", - "8026ae5c" : "update_flying_yaw", - "8026b004" : "update_flying_pitch", - "8026b17c" : "update_flying", - "8026b444" : "common_air_action_step", - "8026b6a0" : "act_jump", - "8026b740" : "act_double_jump", - "8026b814" : "act_triple_jump", - "8026b90c" : "act_backflip", - "8026b9ac" : "act_freefall", - "8026bab8" : "act_hold_jump", - "8026bbb4" : "act_hold_freefall", - "8026bcc0" : "act_side_flip", - "8026bdcc" : "act_wall_kick_air", - "8026be78" : "act_long_jump", - "8026bf40" : "act_riding_shell_air", - "8026c034" : "act_twirling", - "8026c1e0" : "act_dive", - "8026c4b8" : "act_air_throw", - "8026c5d0" : "act_water_jump", - "8026c738" : "act_hold_water_jump", - "8026c880" : "act_steep_jump", - "8026c9fc" : "act_ground_pound", - "8026cd0c" : "act_burning_jump", - "8026ce50" : "act_burning_fall", - "8026cf28" : "act_crazy_box_bounce", - "8026d1b0" : "common_air_knockback_step", - "8026d33c" : "check_wall_kick", - "8026d3c8" : "act_backward_air_kb", - "8026d43c" : "act_forward_air_kb", - "8026d4b0" : "act_hard_backward_air_kb", - "8026d508" : "act_hard_forward_air_kb", - "8026d560" : "act_thrown_backward", - "8026d608" : "act_thrown_forward", - "8026d6fc" : "act_soft_bonk", - "8026d770" : "act_getting_blown", - "8026d988" : "act_air_hit_wall", - "8026db54" : "act_forward_rollout", - "8026dcf4" : "act_backward_rollout", - "8026de98" : "act_butt_slide_air", - "8026e088" : "act_hold_butt_slide_air", - "8026e2b4" : "act_lava_boost", - "8026e59c" : "act_slide_kick", - "8026e810" : "act_jump_kick", - "8026e968" : "act_shot_from_cannon", - "8026ec00" : "act_flying", - "8026f158" : "act_riding_hoot", - "8026f2ec" : "act_flying_triple_jump", - "8026f614" : "act_top_of_pole_jump", - "8026f660" : "act_vertical_wind", - "8026f840" : "act_special_triple_jump", - "8026fa18" : "check_common_airborne_cancels", - "8026fb04" : "mario_execute_airborne_action", - "8027499c" : "mario_execute_submerged_action", - "80274eb0" : "animated_stationary_ground_step", - "80274f10" : "mario_update_punch_sequence", - "80275328" : "act_punching", - "8027546c" : "act_picking_up", - "802755fc" : "act_dive_picking_up", - "802756c8" : "act_placing_down", - "80275794" : "act_throwing", - "802758c0" : "act_heavy_throw", - "802759b4" : "act_stomach_slide_stop", - "80275a80" : "act_picking_up_bowser", - "80275b34" : "act_holding_bowser", - "80275e78" : "act_releasing_bowser", - "80275f0c" : "check_common_object_cancels", - "80275fe0" : "mario_execute_object_action", - "802761d0" : "geo_envfx_main", - "802763d4" : "geo_skybox_main", - "802764b0" : "geo_draw_mario_head_goddard", - "8027684c" : "bhv_toad_message_loop", - "80276910" : "bhv_toad_message_init", - "80276bb8" : "bhv_unlock_door_star_init", - "80276ccc" : "bhv_unlock_door_star_loop", - "802770a4" : "geo_mirror_mario_set_alpha", - "80277150" : "geo_switch_mario_stand_run", - "802771bc" : "geo_switch_mario_eyes", - "80277294" : "geo_mario_tilt_torso", - "802773a4" : "geo_mario_head_rotation", - "802774f4" : "geo_switch_mario_hand", - "802775cc" : "geo_mario_hand_foot_scaler", - "802776d8" : "geo_switch_mario_cap_effect", - "80277740" : "geo_switch_mario_cap_on_off", - "80277824" : "geo_mario_rotate_wing_cap_wings", - "8027795c" : "geo_switch_mario_hand_grab_pos", - "80277b14" : "geo_render_mirror_mario", - "80277d6c" : "geo_mirror_mario_backface_culling", - "80277ee0" : "set_segment_base_addr", - "80277f20" : "get_segment_base_addr", - "80277f50" : "segmented_to_virtual", - "80277fa8" : "virtual_to_segmented", - "80277ff0" : "move_segment_table_to_dmem", - "80278074" : "main_pool_init", - "80278120" : "main_pool_alloc", - "80278238" : "main_pool_free", - "80278358" : "main_pool_realloc", - "802783c8" : "main_pool_available", - "802783e8" : "main_pool_push_state", - "80278498" : "main_pool_pop_state", - "8027868c" : "load_segment", - "802786f0" : "load_to_fixed_pool_addr", - "802787d8" : "load_segment_decompress", - "802788b4" : "load_segment_decompress_heap", - "80278974" : "load_engine_code_segment", - "80278a14" : "alloc_only_pool_init", - "80278ab8" : "alloc_only_pool_alloc", - "80278b28" : "alloc_only_pool_resize", - "80278b98" : "mem_pool_init", - "80278c58" : "mem_pool_alloc", - "80278d74" : "mem_pool_free", - "80278f2c" : "alloc_display_list", - "80279028" : "func_80278A78", - "80279084" : "load_patchable_table", - "80279840" : "save_file_do_save", - "802798fc" : "save_file_erase", - "80279960" : "save_file_copy", - "802799dc" : "save_file_load_all", - "80279bc8" : "save_file_reload", - "80279c44" : "save_file_collect_star_or_key", - "80279e44" : "save_file_exists", - "80279e80" : "save_file_get_max_coin_score", - "80279f80" : "save_file_get_course_star_count", - "8027a010" : "save_file_get_total_star_count", - "8027a0a8" : "save_file_set_flags", - "8027a0f4" : "save_file_clear_flags", - "8027a16c" : "save_file_get_flags", - "8027a1c8" : "save_file_get_star_flags", - "8027a23c" : "save_file_set_star_flags", - "8027a310" : "save_file_get_course_coin_score", - "8027a340" : "save_file_is_cannon_unlocked", - "8027a390" : "save_file_set_cannon_unlocked", - "8027a418" : "save_file_set_cap_pos", - "8027a4ac" : "save_file_get_cap_pos", - "8027a564" : "save_file_set_sound_mode", - "8027a5b4" : "save_file_get_sound_mode", - "8027a5d4" : "save_file_move_cap_to_default_location", - "8027a698" : "disable_warp_checkpoint", - "8027a6b0" : "check_if_should_set_warp_checkpoint", - "8027a718" : "check_warp_checkpoint", - "8027a7d0" : "override_viewport_and_clip", - "8027a83c" : "set_warp_transition_rgb", - "8027a8b0" : "print_intro_text", - "8027a93c" : "get_mario_spawn_type", - "8027a9c8" : "area_get_warp_node", - "8027aa28" : "area_get_warp_node_from_params", - "8027aa74" : "load_obj_warp_nodes", - "8027ab04" : "clear_areas", - "8027ad74" : "clear_area_graph_nodes", - "8027ae44" : "load_area", - "8027af48" : "unload_area", - "8027afbc" : "load_mario_area", - "8027b038" : "unload_mario_area", - "8027b0c0" : "change_area", - "8027b164" : "area_update_objects", - "8027b1a0" : "play_transition", - "8027b35c" : "play_transition_after_delay", - "8027b3b4" : "render_game", - "8027cf38" : "geo_set_animation_globals", - "8027da84" : "geo_process_held_object", - "8027de68" : "geo_try_process_children", - "8027dea8" : "geo_process_node_and_siblings", - "8027e130" : "geo_process_root", - "8027e3e0" : "profiler_log_thread5_time", - "8027e490" : "profiler_log_thread4_time", - "8027e520" : "profiler_log_gfx_time", - "8027e5cc" : "profiler_log_vblank_time", - "8027e65c" : "draw_profiler_bar", - "8027e958" : "draw_reference_profiler_bars", - "8027ebcc" : "draw_profiler_mode_1", - "8027eeac" : "draw_profiler_mode_0", - "8027f460" : "draw_profiler", - "8027f4e0" : "decompress", - "8027f590" : "set_camera_shake_from_hit", - "8027f8b8" : "set_environmental_camera_shake", - "8027f9f0" : "set_camera_shake_from_point", - "8027fb74" : "unused_set_camera_pitch_shake_env", - "8027fc18" : "calc_y_to_curr_floor", - "8027fe20" : "focus_on_mario", - "8027fff8" : "set_camera_height", - "80280368" : "look_down_slopes", - "802804f4" : "pan_ahead_of_player", - "802806a4" : "find_in_bounds_yaw_wdw_bob_thi", - "80280810" : "update_radial_camera", - "80280970" : "update_8_directions_camera", - "80280b00" : "radial_camera_move", - "80281188" : "lakitu_zoom", - "802813bc" : "radial_camera_input_default", - "802813ec" : "update_yaw_and_dist_from_c_up", - "8028146c" : "mode_radial_camera", - "80281588" : "mode_8_directions_camera", - "802816a0" : "update_outward_radial_camera", - "802817fc" : "mode_outward_radial_camera", - "80281904" : "update_parallel_tracking_camera", - "80282280" : "update_fixed_camera", - "802826a0" : "update_boss_fight_camera", - "80282c0c" : "unused_update_mode_5_camera", - "80282c3c" : "mode_boss_fight_camera", - "80282c7c" : "mode_parallel_tracking_camera", - "80282ce0" : "mode_fixed_camera", - "80282d78" : "update_behind_mario_camera", - "80283340" : "mode_behind_mario", - "80283578" : "update_slide_camera", - "802839e4" : "mode_behind_mario_camera", - "80283a18" : "nop_update_water_camera", - "80283a34" : "mode_water_surface_camera", - "80283a68" : "update_mario_camera", - "80283af8" : "update_default_camera", - "80284cb8" : "mode_default_camera", - "80284cfc" : "mode_lakitu_camera", - "80284d38" : "mode_mario_camera", - "80284d74" : "update_spiral_stairs_camera", - "802850ac" : "mode_spiral_stairs_camera", - "802850ec" : "update_slide_or_0f_camera", - "802851dc" : "mode_slide_camera", - "8028526c" : "store_lakitu_cam_info_for_c_up", - "802852f4" : "set_mode_c_up", - "80285370" : "exit_c_up", - "80285808" : "update_c_up", - "802858a4" : "move_mario_head_c_up", - "80285a2c" : "move_into_c_up", - "80285d20" : "mode_c_up_camera", - "80285ed8" : "update_in_cannon", - "80285f60" : "mode_cannon_camera", - "8028603c" : "transition_next_state", - "80286088" : "transition_to_camera_mode", - "80286188" : "set_camera_mode", - "80286420" : "update_lakitu", - "802868f8" : "update_camera", - "80286f68" : "reset_camera", - "8028724c" : "init_camera", - "802879ec" : "zoom_out_if_paused_and_outside", - "80287bc4" : "select_mario_cam_mode", - "80287be0" : "create_camera", - "80287cb8" : "update_graph_node_camera", - "80287d30" : "geo_camera_main", - "80287dc0" : "stub_camera_2", - "80287dd4" : "stub_camera_3", - "80287de8" : "vec3f_sub", - "80287e28" : "object_pos_to_vec3f", - "80287e50" : "vec3f_to_object_pos", - "80287e78" : "unused_object_angle_to_vec3s", - "80287ea0" : "evaluate_cubic_spline", - "802882e4" : "move_point_along_spline", - "80288624" : "cam_select_alt_mode", - "80288718" : "set_cam_angle", - "80288888" : "set_handheld_shake", - "802889b0" : "shake_camera_handheld", - "80288ce4" : "find_c_buttons_pressed", - "80288e68" : "update_camera_hud_status", - "80288f5c" : "collide_with_walls", - "80289198" : "vec3f_compare", - "80289214" : "clamp_pitch", - "802892d8" : "is_within_100_units_of_mario", - "8028935c" : "set_or_approach_f32_asymptotic", - "802893f4" : "approach_f32_asymptotic_bool", - "80289488" : "approach_f32_asymptotic", - "802894b4" : "approach_s16_asymptotic_bool", - "8028956c" : "approach_s16_asymptotic", - "80289610" : "approach_vec3f_asymptotic", - "80289684" : "set_or_approach_vec3f_asymptotic", - "802896f8" : "approach_vec3s_asymptotic", - "8028976c" : "camera_approach_s16_symmetric_bool", - "8028984c" : "camera_approach_s16_symmetric", - "8028993c" : "set_or_approach_s16_symmetric", - "802899cc" : "camera_approach_f32_symmetric_bool", - "80289b0c" : "camera_approach_f32_symmetric", - "80289c00" : "random_vec3s", - "80289d20" : "reduce_by_dist_from_camera", - "80289f88" : "clamp_positions_and_find_yaw", - "8028a080" : "calc_avoid_yaw", - "8028a0f4" : "is_surf_within_bounding_box", - "8028a4ec" : "is_behind_surface", - "8028a6bc" : "is_range_behind_surface", - "8028a7ec" : "is_mario_behind_surface", - "8028a834" : "scale_along_line", - "8028a8e8" : "is_pos_in_bounds", - "8028aa28" : "calculate_pitch", - "8028aad8" : "calculate_yaw", - "8028ab60" : "calculate_angles", - "8028ac28" : "calc_abs_dist", - "8028accc" : "calc_hor_dist", - "8028ad4c" : "rotate_in_xz", - "8028ae1c" : "rotate_in_yz", - "8028aef0" : "set_camera_pitch_shake", - "8028af4c" : "set_camera_yaw_shake", - "8028b00c" : "set_camera_roll_shake", - "8028b068" : "set_pitch_shake_from_point", - "8028b11c" : "set_yaw_shake_from_point", - "8028b1d0" : "increment_shake_offset", - "8028b218" : "shake_camera_pitch", - "8028b32c" : "shake_camera_yaw", - "8028b438" : "shake_camera_roll", - "8028b50c" : "offset_yaw_outward_radial", - "8028b724" : "cutscene_intro_peach_play_message_music", - "8028b754" : "cutscene_intro_peach_play_lakitu_flying_music", - "8028b784" : "play_camera_buzz_if_cdown", - "8028b7c4" : "play_camera_buzz_if_cbutton", - "8028b804" : "play_camera_buzz_if_c_sideways", - "8028b850" : "play_sound_cbutton_up", - "8028b884" : "play_sound_cbutton_down", - "8028b8b8" : "play_sound_cbutton_side", - "8028b8ec" : "play_sound_button_change_blocked", - "8028b920" : "play_sound_rbutton_changed", - "8028b954" : "play_sound_if_cam_switched_to_lakitu_or_mario", - "8028b9c4" : "radial_camera_input", - "8028bd34" : "trigger_cutscene_dialog", - "8028bd98" : "handle_c_button_movement", - "8028c038" : "clear_cutscene_vars", - "8028c13c" : "start_cutscene", - "8028c18c" : "determine_dance_cutscene", - "8028c26c" : "open_door_cutscene", - "8028c2c8" : "get_cutscene_from_mario_status", - "8028c7a0" : "warp_camera", - "8028c8f0" : "approach_camera_height", - "8028c9ac" : "stub_camera_4", - "8028c9cc" : "set_focus_rel_mario", - "8028cbf0" : "offset_rotated", - "8028cd94" : "offset_rotated_coords", - "8028cdec" : "determine_pushing_or_pulling_door", - "8028ce24" : "next_lakitu_state", - "8028d44c" : "set_camera_mode_fixed", - "8028d5ac" : "set_camera_mode_8_directions", - "8028d5fc" : "set_camera_mode_boss_fight", - "8028d658" : "set_camera_mode_close_cam", - "8028d698" : "set_camera_mode_radial", - "8028d79c" : "parallel_tracking_init", - "8028d888" : "set_fixed_cam_axis_sa_lobby", - "8028d92c" : "check_blocking_area_processing", - "8028da18" : "cam_rr_exit_building_side", - "8028da50" : "cam_rr_exit_building_top", - "8028daec" : "cam_rr_enter_building_window", - "8028db38" : "cam_rr_enter_building", - "8028dbb4" : "cam_rr_enter_building_side", - "8028dbf4" : "cam_cotmc_exit_waterfall", - "8028dc1c" : "cam_sl_snowman_head_8dir", - "8028dc70" : "cam_sl_free_roam", - "8028dca4" : "move_camera_through_floor_while_descending", - "8028dd48" : "cam_hmc_enter_maze", - "8028de2c" : "cam_hmc_elevator_black_hole", - "8028de5c" : "cam_hmc_elevator_maze_emergency_exit", - "8028de90" : "cam_hmc_elevator_lake", - "8028dec4" : "cam_hmc_elevator_maze", - "8028def8" : "cam_ssl_enter_pyramid_top", - "8028df24" : "cam_ssl_pyramid_center", - "8028df6c" : "cam_ssl_boss_room", - "8028dfb4" : "cam_thi_move_cam_through_tunnel", - "8028dfe8" : "cam_thi_look_through_tunnel", - "8028e01c" : "cam_bob_tower", - "8028e064" : "cam_bob_default_free_roam", - "8028e098" : "cam_castle_hmc_start_pool_cutscene", - "8028e0ec" : "cam_castle_lobby_entrance", - "8028e164" : "cam_castle_look_upstairs", - "8028e210" : "cam_castle_basement_look_downstairs", - "8028e298" : "cam_castle_enter_lobby", - "8028e300" : "cam_castle_enter_spiral_stairs", - "8028e38c" : "cam_castle_close_mode", - "8028e3b8" : "cam_castle_leave_lobby_sliding_door", - "8028e3f0" : "cam_castle_enter_lobby_sliding_door", - "8028e41c" : "cam_bbh_room_6", - "8028e450" : "cam_bbh_fall_off_roof", - "8028e47c" : "cam_bbh_fall_into_pool", - "8028e524" : "cam_bbh_room_1", - "8028e55c" : "cam_bbh_leave_front_door", - "8028e594" : "cam_bbh_room_2_lower", - "8028e5cc" : "cam_bbh_room_4", - "8028e604" : "cam_bbh_room_8", - "8028e63c" : "cam_bbh_room_5_library", - "8028e674" : "cam_bbh_room_5_library_to_hidden_transition", - "8028e6c4" : "cam_bbh_room_5_hidden_to_library_transition", - "8028e714" : "cam_bbh_room_5_hidden", - "8028e758" : "cam_bbh_room_3", - "8028e790" : "cam_bbh_room_7_mr_i", - "8028e7c8" : "cam_bbh_room_7_mr_i_to_coffins_transition", - "8028e818" : "cam_bbh_room_7_coffins_to_mr_i_transition", - "8028e868" : "cam_bbh_elevator_room_lower", - "8028e8a0" : "cam_bbh_room_0_back_entrance", - "8028e8cc" : "cam_bbh_elevator", - "8028e930" : "cam_bbh_room_12_upper", - "8028e974" : "cam_bbh_enter_front_door", - "8028e9a0" : "cam_bbh_room_2_library", - "8028e9d8" : "cam_bbh_room_2_library_to_trapdoor_transition", - "8028ea28" : "cam_bbh_room_2_trapdoor", - "8028ea60" : "cam_bbh_room_2_trapdoor_transition", - "8028eab0" : "cam_bbh_room_9_attic", - "8028eae8" : "cam_bbh_room_9_attic_transition", - "8028eb38" : "cam_bbh_room_9_mr_i_transition", - "8028eb88" : "cam_bbh_room_13_balcony", - "8028ebc0" : "cam_bbh_room_0", - "8028ec04" : "cam_ccm_enter_slide_shortcut", - "8028ec2c" : "cam_ccm_leave_slide_shortcut", - "8028ec58" : "surface_type_modes", - "8028ed30" : "set_mode_if_not_set_by_surface", - "8028ed98" : "surface_type_modes_thi", - "8028eeb0" : "camera_course_processing", - "8028f670" : "resolve_geometry_collisions", - "8028f914" : "rotate_camera_around_walls", - "8028fc9c" : "find_mario_floor_and_ceil", - "8028fe24" : "start_object_cutscene", - "8028fe58" : "start_object_cutscene_without_focus", - "8028fe84" : "unused_dialog_cutscene_response", - "8028ff04" : "cutscene_object_with_dialog", - "8028ffc8" : "cutscene_object_without_dialog", - "8029000c" : "cutscene_object", - "80290098" : "update_camera_yaw", - "802900e0" : "cutscene_reset_spline", - "80290104" : "stop_cutscene_and_retrieve_stored_info", - "80290168" : "cap_switch_save", - "802901a4" : "init_spline_point", - "802901fc" : "copy_spline_segment", - "802903b8" : "cutscene_common_set_dialog_state", - "802904a8" : "cutscene_intro_peach_start_letter_music", - "802904e4" : "cutscene_intro_peach_start_flying_music", - "8029051c" : "reset_pan_distance", - "8029053c" : "player2_rotate_cam", - "80290784" : "store_info_cannon", - "802907f4" : "retrieve_info_cannon", - "80290864" : "store_info_star", - "802908e8" : "retrieve_info_star", - "802909d0" : "pan_camera", - "80290a5c" : "cutscene_shake_explosion", - "80290abc" : "rotate_and_move_vec3f", - "80290b54" : "set_flag_post_door", - "80290ba4" : "cutscene_soften_music", - "80290bd8" : "cutscene_unsoften_music", - "80290c1c" : "cutscene_unused_start", - "80290c30" : "cutscene_unused_loop", - "80290c44" : "cutscene_ending_mario_fall_start", - "80290c9c" : "cutscene_ending_mario_fall_focus_mario", - "80290d90" : "cutscene_ending_mario_fall", - "80290e00" : "cutscene_ending_mario_land_closeup", - "80290e74" : "cutscene_ending_reset_spline", - "80290eb0" : "cutscene_ending_fly_up_to_window", - "80290f1c" : "cutscene_ending_stars_free_peach", - "80290f8c" : "cutscene_ending_mario_land", - "80291074" : "cutscene_ending_peach_appear_closeup", - "80291108" : "cutscene_ending_peach_appears", - "802911c8" : "cutscene_ending_peach_descends_start", - "80291208" : "cutscene_ending_follow_peach_descent", - "8029127c" : "cutscene_ending_peach_descent_lower_focus", - "802912b8" : "cutscene_ending_peach_descent_back_to_mario", - "80291354" : "cutscene_ending_peach_descends", - "8029142c" : "cutscene_ending_mario_to_peach", - "802914cc" : "cutscene_ending_look_up_at_castle", - "80291514" : "cutscene_ending_peach_wakeup", - "802915d4" : "cutscene_ending_dialog", - "80291654" : "cutscene_ending_kiss_closeup", - "802916b8" : "cutscene_ending_kiss_here_we_go", - "80291774" : "cutscene_ending_kiss", - "802917e4" : "cutscene_ending_look_at_sky", - "8029184c" : "cutscene_ending_zoom_fov", - "80291870" : "cutscene_ending_cake_for_mario", - "80291924" : "cutscene_ending_stop", - "80291964" : "cutscene_grand_star_start", - "802919dc" : "cutscene_grand_star_front_of_mario", - "80291ab4" : "cutscene_grand_star_mario_jump", - "80291b18" : "cutscene_grand_star_accel_cvar2", - "80291b68" : "cutscene_grand_star_approach_mario", - "80291bf4" : "cutscene_grand_star_move_cvar2", - "80291c3c" : "cutscene_grand_star_focus_mario", - "80291cd0" : "cutscene_grand_star", - "80291db0" : "cutscene_grand_star_fly_start", - "80291e84" : "cutscene_grand_star_fly_move_to_mario", - "80291f18" : "cutscene_grand_star_fly_mario_offscreen", - "80292038" : "cutscene_grand_star_fly_app_cvars", - "80292164" : "cutscene_grand_star_fly", - "802921fc" : "focus_in_front_of_mario", - "8029228c" : "cutscene_dance_move_to_mario", - "80292324" : "cutscene_dance_rotate", - "80292370" : "cutscene_dance_rotate_move_back", - "802923b8" : "cutscene_dance_rotate_move_towards_mario", - "80292414" : "cutscene_dance_default_focus_mario", - "8029244c" : "cutscene_dance_rotate_focus_mario", - "80292484" : "cutscene_dance_shake_fov", - "802924b8" : "cutscene_dance_default_rotate", - "80292628" : "star_dance_bound_yaw", - "802926dc" : "cutscene_dance_closeup_start", - "802927d0" : "cutscene_dance_closeup_focus_mario", - "80292868" : "cutscene_dance_closeup_fly_above", - "80292974" : "cutscene_dance_closeup_fly_closer", - "80292a20" : "cutscene_dance_closeup_zoom", - "80292a4c" : "cutscene_dance_closeup_shake_fov", - "80292a80" : "cutscene_dance_closeup", - "80292c00" : "cutscene_dance_fly_away_start", - "80292d80" : "cutscene_dance_fly_away_approach_mario", - "80292e2c" : "cutscene_dance_fly_away_focus_mario", - "80292ec4" : "cutscene_pan_cvar9", - "80292f40" : "cutscene_dance_fly_rotate_around_mario", - "80292f98" : "cutscene_dance_fly_away_rotate_while_flying", - "80292fe4" : "cutscene_dance_fly_away_shake_fov", - "80293018" : "cutscene_dance_fly_away", - "802930f0" : "cutscene_key_dance_jump_cvar", - "80293164" : "cutscene_key_dance_jump_closeup", - "802931c0" : "cutscene_key_dance_jump_lower_left", - "80293220" : "cutscene_key_dance_jump_above", - "8029328c" : "cutscene_key_dance_jump_last", - "802932f4" : "cutscene_key_dance_shake_fov", - "80293328" : "cutscene_key_dance_handheld_shake", - "80293354" : "cutscene_key_dance_focus_mario", - "8029338c" : "cutscene_key_dance", - "80293488" : "cutscene_bowser_area_shake_fov", - "802934b4" : "cutscene_bowser_area_start_bowser_walking", - "802934d8" : "cutscene_bowser_arena_set_pos", - "80293548" : "cutscene_bowser_arena_focus_sine", - "802935e0" : "cutscene_bowser_arena_set_focus", - "80293624" : "cutscene_bowser_arena_adjust_offsets", - "8029369c" : "cutscene_bowser_arena_pan_left", - "802936dc" : "cutscene_bowser_arena_mario_dialog", - "80293708" : "cutscene_stop_dialog", - "80293734" : "cutscene_bowser_arena_start", - "802937e8" : "bowser_fight_intro_dialog", - "8029386c" : "cutscene_bowser_arena_dialog", - "802938c8" : "cutscene_bowser_arena_end", - "80293944" : "cutscene_bowser_arena", - "80293abc" : "cutscene_star_spawn_store_info", - "80293ae8" : "cutscene_star_spawn_focus_star", - "80293b70" : "cutscene_star_spawn_update_boss_fight", - "80293bf4" : "cutscene_star_spawn_fly_back", - "80293c2c" : "cutscene_star_spawn", - "80293cb0" : "cutscene_star_spawn_back", - "80293d5c" : "cutscene_star_spawn_end", - "80293d90" : "cutscene_exit_waterfall_warp", - "80293dd4" : "cutscene_exit_to_castle_grounds_focus_mario", - "80293e7c" : "cutscene_exit_waterfall", - "80293ed8" : "cutscene_exit_to_castle_grounds_end", - "80293f2c" : "cutscene_exit_fall_to_castle_grounds_warp", - "80293f70" : "cutscene_exit_fall_to_castle_grounds", - "80293fcc" : "cutscene_red_coin_star_start", - "80294024" : "cutscene_red_coin_star_focus_xz", - "80294088" : "cutscene_red_coin_star_focus_y", - "802940cc" : "cutscene_red_coin_star_look_up_at_star", - "8029410c" : "cutscene_red_coin_star_warp", - "802942cc" : "cutscene_red_coin_star_set_fov", - "802942f0" : "cutscene_red_coin_star", - "802943d4" : "cutscene_red_coin_star_end", - "80294428" : "cutscene_goto_cvar_pos", - "80294718" : "cutscene_prepare_cannon_start", - "802947a4" : "cutscene_prepare_cannon_fly_to_cannon", - "8029480c" : "cannon_approach_prev", - "802948a0" : "cutscene_prepare_cannon_fly_back", - "80294a14" : "cutscene_prepare_cannon", - "80294a94" : "cutscene_prepare_cannon_end", - "80294ae8" : "water_death_move_to_mario_side", - "80294b78" : "death_goto_mario", - "80294bb4" : "cutscene_death_standing_start", - "80294c28" : "cutscene_death_standing_goto_mario", - "80294c5c" : "cutscene_death_standing", - "80294cc4" : "cutscene_death_stomach_start", - "80294d48" : "cutscene_death_stomach_goto_mario", - "80294db4" : "cutscene_death_stomach", - "80294e24" : "cutscene_bbh_death_start", - "80294ea8" : "cutscene_bbh_death_goto_mario", - "80294ee8" : "cutscene_bbh_death", - "80294f58" : "cutscene_quicksand_death_start", - "80294f94" : "cutscene_quicksand_death_goto_mario", - "80294fec" : "cutscene_quicksand_death", - "802950b0" : "cutscene_suffocation_fly_away", - "80295140" : "cutscene_suffocation_stay_above_gas", - "802951f0" : "cutscene_suffocation_rotate", - "80295270" : "cutscene_suffocation", - "80295310" : "cutscene_enter_pool_start", - "802953dc" : "cutscene_enter_pool_loop", - "80295418" : "cutscene_enter_pool", - "80295480" : "cutscene_pyramid_top_explode_start", - "802954ec" : "cutscene_pyramid_top_explode_zoom_in", - "80295518" : "cutscene_pyramid_top_explode_focus", - "80295580" : "cutscene_pyramid_top_explode_warp", - "80295670" : "cutscene_pyramid_top_explode_closeup", - "80295740" : "cutscene_pyramid_top_explode_cam_shake", - "8029576c" : "cutscene_pyramid_top_explode_warp_back", - "802957c8" : "cutscene_pyramid_top_explode", - "80295894" : "cutscene_pyramid_top_explode_end", - "802958d4" : "cutscene_enter_pyramid_top_start", - "80295930" : "cutscene_enter_pyramid_top", - "80295a58" : "cutscene_dialog_start", - "80295bf0" : "cutscene_dialog_move_mario_shoulder", - "80295e24" : "cutscene_dialog_create_dialog_box", - "80295e8c" : "cutscene_dialog", - "80295fb0" : "cutscene_dialog_set_flag", - "80295fd8" : "cutscene_dialog_end", - "80296020" : "cutscene_read_message_start", - "80296160" : "cutscene_read_message", - "802962c8" : "cutscene_read_message_set_flag", - "802962f0" : "cutscene_read_message_end", - "80296318" : "cutscene_exit_succ_start", - "802963b8" : "cutscene_non_painting_set_cam_pos", - "8029652c" : "cutscene_non_painting_set_cam_focus", - "8029665c" : "cutscene_exit_bowser_succ_focus_left", - "8029669c" : "cutscene_exit_bowser_key_toss_shake", - "802966e4" : "cutscene_exit_succ_shake_landing", - "80296710" : "cutscene_exit_bowser_succ", - "802967c4" : "cutscene_non_painting_end", - "8029685c" : "cutscene_exit_non_painting_succ_override_cvar", - "802968a0" : "cutscene_exit_non_painting_succ", - "8029695c" : "cutscene_non_painting_death_start", - "802969f8" : "cutscene_exit_bowser_death", - "80296a64" : "cutscene_non_painting_death_override_offset", - "80296b30" : "cutscene_non_painting_death", - "80296bc8" : "cutscene_cap_switch_press_start", - "80296c4c" : "cutscene_cap_switch_press_rotate_around_mario", - "80296d60" : "cutscene_cap_switch_press_lower_cam", - "80296da8" : "cutscene_cap_switch_press_approach_mario", - "80296eb4" : "cutscene_cap_switch_press_pan_left", - "80296f38" : "cutscene_cap_switch_press_create_dialog", - "80296fa8" : "cutscene_cap_switch_press", - "80297148" : "cutscene_unlock_key_door_start", - "8029720c" : "cutscene_unlock_key_door_approach_mario", - "80297290" : "cutscene_unlock_key_door_focus_lock", - "802972ec" : "cutscene_unlock_key_door_stub", - "80297300" : "cutscene_unlock_key_door_fly_back", - "80297384" : "cutscene_unlock_key_door_fov_shake", - "802973b0" : "cutscene_unlock_key_door", - "80297464" : "intro_peach_move_camera_start_to_pipe", - "80297560" : "peach_letter_text", - "8029758c" : "play_sound_peach_reading_letter", - "802975c4" : "cutscene_intro_peach_start_to_pipe_spline", - "8029762c" : "cutscene_intro_peach_dialog", - "802976bc" : "cutscene_intro_peach_follow_pipe_spline", - "80297728" : "cutscene_intro_peach_clear_cutscene_status", - "80297748" : "cutscene_intro_peach_zoom_fov", - "80297784" : "cutscene_intro_peach_reset_spline", - "802977c8" : "cutscene_intro_peach_handheld_shake_off", - "802977f4" : "intro_pipe_exit_text", - "80297820" : "play_sound_intro_turn_on_hud", - "8029784c" : "cutscene_intro_peach_fly_to_pipe", - "80297908" : "cutscene_intro_peach_mario_appears", - "80297a38" : "cutscene_intro_peach_reset_fov", - "80297a64" : "cutscene_intro_peach_letter", - "80297b58" : "cutscene_end_waving_start", - "80297b84" : "cutscene_end_waving", - "80297c14" : "cutscene_credits_reset_spline", - "80297c40" : "cutscene_credits", - "802980dc" : "cutscene_sliding_doors_open_start", - "8029819c" : "cutscene_sliding_doors_open_set_cvars", - "80298218" : "cutscene_sliding_doors_go_under_doorway", - "80298254" : "cutscene_sliding_doors_fly_back_up", - "80298290" : "cutscene_sliding_doors_follow_mario", - "802983b4" : "cutscene_sliding_doors_open", - "80298458" : "cutscene_double_doors_end", - "802984a0" : "cutscene_enter_painting_stub", - "802984b4" : "cutscene_enter_painting", - "802987b0" : "cutscene_exit_painting_start", - "8029894c" : "cutscene_exit_painting_move_to_mario", - "802989e8" : "cutscene_exit_painting_move_to_floor", - "80298af8" : "cutscene_exit_painting", - "80298ba0" : "cutscene_unused_exit_start", - "80298c2c" : "cutscene_unused_exit_focus_mario", - "80298ccc" : "cutscene_exit_painting_end", - "80298d44" : "cutscene_enter_cannon_end", - "80298d9c" : "cutscene_enter_cannon_raise", - "80298fe8" : "cutscene_enter_cannon_start", - "80299100" : "cutscene_door_start", - "80299154" : "cutscene_door_fix_cam", - "802991a8" : "cutscene_door_loop", - "802991f0" : "cutscene_door_move_behind_mario", - "802992cc" : "cutscene_door_follow_mario", - "80299360" : "cutscene_door_end", - "80299404" : "cutscene_door_mode", - "802994e8" : "play_cutscene", - "8029a2f8" : "cutscene_event", - "8029a37c" : "cutscene_spawn_obj", - "8029a3b4" : "set_fov_shake", - "8029a41c" : "set_fov_shake_from_point", - "8029a4d0" : "shake_camera_fov", - "8029a5e8" : "set_fov_30", - "8029a60c" : "approach_fov_20", - "8029a64c" : "set_fov_45", - "8029a670" : "set_fov_29", - "8029a694" : "zoom_fov_30", - "8029a6f4" : "fov_default", - "8029a858" : "approach_fov_30", - "8029a894" : "approach_fov_60", - "8029a8d0" : "approach_fov_45", - "8029a968" : "approach_fov_80", - "8029a9a4" : "set_fov_bbh", - "8029aa3c" : "geo_camera_fov", - "8029ab94" : "set_fov_function", - "8029abb0" : "cutscene_set_fov_shake_preset", - "8029ac30" : "set_fov_shake_from_point_preset", - "8029aef8" : "obj_rotate_towards_point", - "8029af98" : "intro_peach_set_pos_and_opacity", - "8029b08c" : "bhv_intro_peach_loop", - "8029b28c" : "intro_lakitu_set_offset_from_camera", - "8029b358" : "intro_lakitu_set_focus", - "8029b3c8" : "intro_lakitu_set_pos_and_focus", - "8029b49c" : "bhv_intro_lakitu_loop", - "8029bde4" : "bhv_end_birds_1_loop", - "8029bf64" : "bhv_end_birds_2_loop", - "8029c0e4" : "spawn_child_obj_relative", - "8029c254" : "bhv_intro_scene_loop", - "8029c770" : "nop_change_course", - "8029c780" : "copy_mario_state_to_object", - "8029c9cc" : "spawn_particle", - "8029ca58" : "bhv_mario_update", - "8029cb34" : "update_objects_starting_at", - "8029cbc8" : "update_objects_during_time_stop", - "8029cd28" : "update_objects_in_list", - "8029cd98" : "unload_deactivated_objects_in_list", - "8029ce58" : "set_object_respawn_info_bits", - "8029cedc" : "unload_objects_from_area", - "8029cfb0" : "spawn_objects_from_info", - "8029d1d8" : "stub_obj_list_processor_1", - "8029d1e8" : "clear_objects", - "8029d324" : "update_terrain_objects", - "8029d374" : "update_non_terrain_objects", - "8029d428" : "unload_deactivated_objects", - "8029d690" : "update_objects", - "8029d890" : "geo_update_projectile_pos_from_parent", - "8029d924" : "geo_update_layer_transparency", - "8029db48" : "geo_switch_anim_state", - "8029dbd4" : "geo_switch_area", - "8029dcd4" : "obj_update_pos_from_parent_transformation", - "8029dda8" : "obj_apply_scale_to_matrix", - "8029de80" : "create_transformation_from_matrices", - "8029e1b0" : "obj_set_held_state", - "8029e27c" : "lateral_dist_between_objects", - "8029e2f8" : "dist_between_objects", - "8029e398" : "cur_obj_forward_vel_approach_upward", - "8029e3e8" : "approach_f32_signed", - "8029e494" : "approach_f32_symmetric", - "8029e530" : "approach_s16_symmetric", - "8029e5ec" : "cur_obj_rotate_yaw_toward", - "8029e694" : "obj_angle_to_object", - "8029e714" : "obj_turn_toward_object", - "8029e8bc" : "obj_set_parent_relative_pos", - "8029e914" : "obj_set_pos", - "8029e96c" : "obj_set_angle", - "8029e9ac" : "spawn_object_abs_with_rot", - "8029ea24" : "spawn_object_rel_with_rot", - "8029eaac" : "spawn_obj_with_transform_flags", - "8029eb04" : "spawn_water_droplet", - "8029ed20" : "spawn_object_at_origin", - "8029edcc" : "spawn_object", - "8029ee24" : "try_to_spawn_object", - "8029eeb8" : "spawn_object_with_scale", - "8029ef64" : "spawn_object_relative", - "8029effc" : "spawn_object_relative_with_scale", - "8029f070" : "cur_obj_move_using_vel", - "8029f0c8" : "obj_copy_graph_y_offset", - "8029f0e0" : "obj_copy_pos_and_angle", - "8029f120" : "obj_copy_pos", - "8029f148" : "obj_copy_angle", - "8029f188" : "obj_set_gfx_pos_from_pos", - "8029f1b0" : "obj_init_animation", - "8029f200" : "linear_mtxf_mul_vec3f", - "8029f274" : "linear_mtxf_transpose_mul_vec3f", - "8029f2ec" : "obj_apply_scale_to_transform", - "8029f3a8" : "obj_copy_scale", - "8029f3d0" : "obj_scale_xyz", - "8029f404" : "obj_scale", - "8029f430" : "cur_obj_scale", - "8029f464" : "cur_obj_init_animation", - "8029f4b4" : "cur_obj_init_animation_with_sound", - "8029f514" : "cur_obj_init_animation_with_accel_and_sound", - "8029f59c" : "obj_init_animation_with_sound", - "8029f600" : "cur_obj_enable_rendering_and_become_tangible", - "8029f620" : "cur_obj_enable_rendering", - "8029f644" : "cur_obj_disable_rendering_and_become_intangible", - "8029f66c" : "cur_obj_disable_rendering", - "8029f694" : "cur_obj_unhide", - "8029f6bc" : "cur_obj_hide", - "8029f6e0" : "cur_obj_set_pos_relative", - "8029f7d8" : "cur_obj_set_pos_relative_to_parent", - "8029f820" : "cur_obj_enable_rendering_2", - "8029f848" : "cur_obj_unused_init_on_floor", - "8029f8ec" : "obj_set_face_angle_to_move_angle", - "8029f914" : "get_object_list_from_behavior", - "8029f95c" : "cur_obj_nearest_object_with_behavior", - "8029f998" : "cur_obj_dist_to_nearest_object_with_behavior", - "8029f9ec" : "cur_obj_find_nearest_object_with_behavior", - "8029fb1c" : "find_unimportant_object", - "8029fb68" : "count_unimportant_objects", - "8029fbdc" : "count_objects_with_behavior", - "8029fc9c" : "cur_obj_find_nearby_held_actor", - "8029fdb4" : "cur_obj_change_action", - "8029fe00" : "cur_obj_set_vel_from_mario_vel", - "8029fe6c" : "cur_obj_reverse_animation", - "8029fea4" : "cur_obj_extend_animation_if_at_end", - "8029ff04" : "cur_obj_check_if_near_animation_end", - "8029ffa4" : "cur_obj_check_if_at_animation_end", - "802a0008" : "cur_obj_check_anim_frame", - "802a0050" : "cur_obj_check_anim_frame_in_range", - "802a00ac" : "cur_obj_check_frame_prior_current_frame", - "802a0114" : "mario_is_in_air_action", - "802a0154" : "mario_is_dive_sliding", - "802a0198" : "cur_obj_set_y_vel_and_animation", - "802a01d8" : "cur_obj_unrender_and_reset_state", - "802a0380" : "cur_obj_get_thrown_or_placed", - "802a0474" : "cur_obj_get_dropped", - "802a04c0" : "cur_obj_set_model", - "802a04f0" : "mario_set_flag", - "802a0514" : "cur_obj_clear_interact_status_flag", - "802a0568" : "obj_mark_for_deletion", - "802a057c" : "cur_obj_disable", - "802a05b4" : "cur_obj_become_intangible", - "802a05d4" : "cur_obj_become_tangible", - "802a05f0" : "obj_become_tangible", - "802a0604" : "cur_obj_update_floor_height", - "802a064c" : "cur_obj_update_floor_height_and_get_floor", - "802a079c" : "cur_obj_apply_drag_xz", - "802a0e68" : "cur_obj_move_y", - "802a113c" : "cur_obj_unused_resolve_wall_collisions", - "802a11a8" : "abs_angle_diff", - "802a120c" : "cur_obj_move_xz_using_fvel_and_yaw", - "802a12a4" : "cur_obj_move_y_with_terminal_vel", - "802a1308" : "cur_obj_compute_vel_xz", - "802a1370" : "increment_velocity_toward_range", - "802a1424" : "obj_check_if_collided_with_object", - "802a148c" : "cur_obj_set_behavior", - "802a14c4" : "obj_set_behavior", - "802a14fc" : "cur_obj_has_behavior", - "802a1554" : "obj_has_behavior", - "802a15ac" : "cur_obj_lateral_dist_from_mario_to_home", - "802a1634" : "cur_obj_lateral_dist_to_home", - "802a16ac" : "cur_obj_outside_home_square", - "802a1774" : "cur_obj_outside_home_rectangle", - "802a184c" : "cur_obj_set_pos_to_home", - "802a188c" : "cur_obj_set_pos_to_home_and_stop", - "802a18dc" : "cur_obj_shake_y", - "802a1930" : "cur_obj_start_cam_event", - "802a1960" : "set_mario_interact_hoot_if_in_range", - "802a19ac" : "obj_set_billboard", - "802a19c8" : "cur_obj_set_hitbox_radius_and_height", - "802a19f0" : "cur_obj_set_hurtbox_radius_and_height", - "802a1b34" : "obj_spawn_loot_blue_coins", - "802a1b8c" : "obj_spawn_loot_yellow_coins", - "802a1bdc" : "cur_obj_spawn_loot_coin_at_mario_pos", - "802a1c68" : "cur_obj_abs_y_dist_to_home", - "802a1cc4" : "cur_obj_advance_looping_anim", - "802a1f3c" : "cur_obj_resolve_wall_collisions", - "802a2320" : "cur_obj_update_floor_and_walls", - "802a2348" : "cur_obj_move_standard", - "802a25b4" : "cur_obj_move_using_vel_and_gravity", - "802a2644" : "cur_obj_move_using_fvel_and_gravity", - "802a2674" : "obj_set_pos_relative", - "802a2748" : "cur_obj_angle_to_home", - "802a27b0" : "obj_set_gfx_pos_at_obj_pos", - "802a2804" : "obj_translate_local", - "802a2930" : "obj_build_transform_from_pos_and_angle", - "802a2a18" : "obj_set_throw_matrix_from_transform", - "802a2a84" : "obj_build_transform_relative_to_parent", - "802a2b28" : "obj_create_transform_from_self", - "802a2b6c" : "cur_obj_rotate_move_angle_using_vel", - "802a2bc4" : "cur_obj_rotate_face_angle_using_vel", - "802a2c1c" : "cur_obj_set_face_angle_to_move_angle", - "802a2c5c" : "cur_obj_follow_path", - "802a2ed4" : "chain_segment_init", - "802a2f14" : "random_f32_around_zero", - "802a2f5c" : "obj_scale_random", - "802a2fc0" : "obj_translate_xyz_random", - "802a308c" : "obj_translate_xz_random", - "802a31e0" : "cur_obj_set_pos_via_transform", - "802a3268" : "cur_obj_reflect_move_angle_off_wall", - "802a32ac" : "cur_obj_spawn_particles", - "802a34a4" : "obj_set_hitbox", - "802a3604" : "signum_positive", - "802a3634" : "absf", - "802a3674" : "absi", - "802a36a4" : "cur_obj_wait_then_blink", - "802a3754" : "cur_obj_is_mario_ground_pounding_platform", - "802a37ac" : "spawn_mist_particles", - "802a37dc" : "spawn_mist_particles_with_sound", - "802a3818" : "cur_obj_push_mario_away", - "802a390c" : "cur_obj_push_mario_away_from_cylinder", - "802a399c" : "bhv_dust_smoke_loop", - "802a3a4c" : "cur_obj_set_direction_table", - "802a3a88" : "cur_obj_progress_direction_table", - "802a3b28" : "stub_obj_helpers_3", - "802a3b40" : "cur_obj_scale_over_time", - "802a3c18" : "cur_obj_set_pos_to_home_with_debug", - "802a3cec" : "stub_obj_helpers_4", - "802a3cfc" : "cur_obj_is_mario_on_platform", - "802a3d40" : "cur_obj_shake_y_until", - "802a3dd4" : "cur_obj_move_up_and_down", - "802a3e30" : "cur_obj_call_action_function", - "802a3ef8" : "spawn_base_star_with_no_lvl_exit", - "802a3f24" : "bit_shift_left", - "802a3f48" : "cur_obj_mario_far_away", - "802a404c" : "is_mario_moving_fast_or_in_air", - "802a40b8" : "is_item_in_array", - "802a4120" : "bhv_init_room", - "802a4210" : "cur_obj_enable_rendering_if_mario_in_room", - "802a4360" : "cur_obj_set_hitbox_and_die_if_attacked", - "802a4440" : "obj_explode_and_spawn_coins", - "802a44f4" : "obj_set_collision_data", - "802a452c" : "cur_obj_if_hit_wall_bounce_away", - "802a4564" : "cur_obj_hide_if_mario_far_away_y", - "802a45e4" : "geo_offset_klepto_held_object", - "802a462c" : "geo_offset_klepto_debug", - "802a46cc" : "obj_is_hidden", - "802a4704" : "enable_time_stop", - "802a4728" : "disable_time_stop", - "802a4750" : "set_time_stop_flags", - "802a4774" : "clear_time_stop_flags", - "802a47a0" : "cur_obj_can_mario_activate_textbox", - "802a48bc" : "cur_obj_can_mario_activate_textbox_2", - "802a4960" : "cur_obj_update_dialog", - "802a4be4" : "cur_obj_update_dialog_with_cutscene", - "802a4f04" : "cur_obj_has_model", - "802a4f58" : "cur_obj_align_gfx_with_floor", - "802a5034" : "mario_is_within_rectangle", - "802a50fc" : "cur_obj_shake_screen", - "802a513c" : "obj_attack_collided_from_other_object", - "802a51ac" : "cur_obj_was_attacked_or_ground_pounded", - "802a5228" : "obj_copy_behavior_params", - "802a5248" : "cur_obj_init_animation_and_anim_frame", - "802a5288" : "cur_obj_init_animation_and_check_if_near_end", - "802a52c4" : "cur_obj_init_animation_and_extend_if_at_end", - "802a52f8" : "cur_obj_check_grabbed_mario", - "802a5358" : "player_performed_grab_escape_action", - "802a540c" : "cur_obj_unused_play_footstep_sound", - "802a5460" : "enable_time_stop_including_mario", - "802a5498" : "disable_time_stop_including_mario", - "802a54d8" : "cur_obj_check_interacted", - "802a5524" : "cur_obj_spawn_loot_blue_coin", - "802a5588" : "cur_obj_spawn_star_at_y_offset", - "802a5620" : "star_door_update_pos", - "802a56bc" : "bhv_star_door_loop", - "802a58dc" : "bhv_piranha_particle_loop", - "802a597c" : "mr_i_piranha_particle_act_0", - "802a5a44" : "mr_i_piranha_particle_act_1", - "802a5aa0" : "bhv_mr_i_particle_loop", - "802a5acc" : "spawn_mr_i_particle", - "802a5bd4" : "bhv_mr_i_body_loop", - "802a5d4c" : "mr_i_act_3", - "802a6518" : "mr_i_act_2", - "802a68a0" : "mr_i_act_1", - "802a6ad8" : "mr_i_act_0", - "802a6b7c" : "bhv_mr_i_loop", - "802a6c20" : "bhv_pole_init", - "802a6c74" : "bhv_giant_pole_loop", - "802a6cf4" : "bhv_thi_huge_island_top_loop", - "802a6d64" : "bhv_thi_tiny_island_top_loop", - "802a6ee4" : "cap_switch_act_0", - "802a7020" : "cap_switch_act_1", - "802a708c" : "cap_switch_act_2", - "802a7160" : "cap_switch_act_3", - "802a7170" : "bhv_cap_switch_loop", - "802a719c" : "geo_update_held_mario_pos", - "802a7230" : "bhv_bobomb_anchor_mario_loop", - "802a7264" : "king_bobomb_act_0", - "802a7384" : "mario_is_far_below_object", - "802a73d8" : "king_bobomb_act_2", - "802a7598" : "king_bobomb_act_3", - "802a7804" : "king_bobomb_act_1", - "802a78d8" : "king_bobomb_act_6", - "802a7a60" : "king_bobomb_act_7", - "802a7b1c" : "king_bobomb_act_8", - "802a7b5c" : "king_bobomb_act_4", - "802a7d14" : "king_bobomb_act_5", - "802a7fbc" : "king_bobomb_move", - "802a8064" : "bhv_king_bobomb_loop", - "802a816c" : "bhv_beta_chest_bottom_init", - "802a81e8" : "bhv_beta_chest_bottom_loop", - "802a821c" : "bhv_beta_chest_lid_loop", - "802a8370" : "bhv_water_air_bubble_init", - "802a83a0" : "bhv_water_air_bubble_loop", - "802a8630" : "bhv_bubble_wave_init", - "802a86bc" : "scale_bubble_random", - "802a870c" : "bhv_bubble_maybe_loop", - "802a88a4" : "bhv_small_water_wave_loop", - "802a8a38" : "scale_bubble_sin", - "802a8b18" : "bhv_particle_init", - "802a8bc0" : "bhv_particle_loop", - "802a8c88" : "bhv_small_bubbles_loop", - "802a8cdc" : "bhv_fish_group_loop", - "802a8d48" : "bhv_water_waves_init", - "802a8d98" : "bhv_cannon_base_unused_loop", - "802a8dc0" : "opened_cannon_act_0", - "802a8f40" : "opened_cannon_act_4", - "802a9114" : "opened_cannon_act_6", - "802a92fc" : "opened_cannon_act_5", - "802a93f8" : "opened_cannon_act_1", - "802a9440" : "opened_cannon_act_2", - "802a9460" : "opened_cannon_act_3", - "802a9498" : "bhv_cannon_base_loop", - "802a94f8" : "bhv_cannon_barrel_loop", - "802a958c" : "common_anchor_mario_behavior", - "802a9708" : "bhv_chuckya_anchor_mario_loop", - "802a973c" : "unknown_chuckya_function", - "802a98c4" : "approach_forward_vel", - "802a9994" : "chuckya_act_0", - "802a9d08" : "chuckya_act_1", - "802a9f54" : "chuckya_act_3", - "802a9fc8" : "chuckya_act_2", - "802aa02c" : "chuckya_move", - "802aa0ac" : "bhv_chuckya_loop", - "802aa1b8" : "bhv_wf_breakable_wall_loop", - "802aa280" : "check_mario_attacking", - "802aa3c8" : "init_kickable_board_rock", - "802aa3f4" : "bhv_kickable_board_loop", - "802aa700" : "bhv_tower_door_loop", - "802aa774" : "bhv_wf_rotating_wooden_platform_loop", - "802aa830" : "bhv_rotating_platform_loop", - "802aa948" : "set_koopa_shell_underwater_hitbox", - "802aa97c" : "bhv_koopa_shell_underwater_loop", - "802aaa60" : "bhv_warp_loop", - "802aab54" : "bhv_fading_warp_loop", - "802aac48" : "bhv_white_puff_exploding_loop", - "802aae8c" : "spawn_mist_particles_variable", - "802aaf48" : "bhv_spawned_star_init", - "802aaffc" : "set_sparkle_spawn_star_hitbox", - "802ab060" : "set_home_to_mario", - "802ab158" : "set_y_home_to_pos", - "802ab18c" : "slow_star_rotation", - "802ab1c8" : "bhv_spawned_star_loop", - "802ab558" : "bhv_spawn_star_no_level_exit", - "802ab5c8" : "bhv_coin_sparkles_init", - "802ab650" : "bhv_yellow_coin_init", - "802ab70c" : "bhv_yellow_coin_loop", - "802ab748" : "bhv_temp_coin_loop", - "802ab7a4" : "bhv_coin_init", - "802ab860" : "bhv_coin_loop", - "802aba40" : "bhv_coin_formation_spawn_loop", - "802abc04" : "spawn_coin_in_formation", - "802abee4" : "bhv_coin_formation_init", - "802abf0c" : "bhv_coin_formation_loop", - "802ac068" : "coin_inside_boo_act_1", - "802ac15c" : "coin_inside_boo_act_0", - "802ac294" : "bhv_coin_inside_boo_loop", - "802ac2c0" : "bhv_coin_sparkles_loop", - "802ac2ec" : "bhv_golden_coin_sparkles_loop", - "802ac3a8" : "bhv_punch_tiny_triangle_loop", - "802ac4a0" : "bhv_punch_tiny_triangle_init", - "802ac5b4" : "bhv_wall_tiny_star_particle_loop", - "802ac678" : "bhv_tiny_star_particles_init", - "802ac78c" : "bhv_pound_tiny_star_particle_loop", - "802ac864" : "bhv_pound_tiny_star_particle_init", - "802ac910" : "door_animation_and_reset", - "802ac958" : "set_door_camera_event", - "802ac9d0" : "play_door_open_noise", - "802aca6c" : "play_warp_door_open_noise", - "802acac8" : "bhv_door_loop", - "802acc3c" : "bhv_door_init", - "802ace80" : "bhv_star_door_loop_2", - "802ad078" : "grindel_thwomp_act_4", - "802ad10c" : "grindel_thwomp_act_2", - "802ad1a4" : "grindel_thwomp_act_3", - "802ad238" : "grindel_thwomp_act_1", - "802ad2d0" : "grindel_thwomp_act_0", - "802ad34c" : "bhv_grindel_thwomp_loop", - "802ad378" : "bhv_tumbling_bridge_platform_loop", - "802ad580" : "tumbling_bridge_act_1", - "802ad76c" : "tumbling_bridge_act_2", - "802ad7f4" : "tumbling_bridge_act_3", - "802ad828" : "tumbling_bridge_act_0", - "802ad890" : "bhv_tumbling_bridge_loop", - "802ad8bc" : "elevator_starting_shake", - "802ad8f0" : "elevator_act_0", - "802ada4c" : "elevator_act_1", - "802adb88" : "elevator_act_2", - "802adce4" : "elevator_act_4", - "802add70" : "elevator_act_3", - "802addf8" : "bhv_elevator_init", - "802adf6c" : "bhv_elevator_loop", - "802adf98" : "bhv_water_mist_spawn_loop", - "802adfd8" : "bhv_water_mist_loop", - "802ae0cc" : "spawn_triangle_break_particles", - "802ae238" : "bhv_water_mist_2_loop", - "802ae304" : "bhv_pound_white_puffs_init", - "802ae334" : "spawn_mist_from_global", - "802ae360" : "bhv_ground_sand_init", - "802ae394" : "spawn_smoke_with_velocity", - "802ae45c" : "clear_particle_flags", - "802ae48c" : "bhv_ground_snow_init", - "802ae4c0" : "spawn_wind_particles", - "802ae534" : "bhv_wind_loop", - "802ae85c" : "bhv_unused_particle_spawn_loop", - "802ae908" : "bhv_ukiki_cage_star_loop", - "802aea6c" : "ukiki_cage_act_wait_for_ukiki", - "802aeab8" : "ukiki_cage_act_spin", - "802aeb1c" : "ukiki_cage_act_fall", - "802aeb74" : "ukiki_cage_act_hide", - "802aeb9c" : "bhv_ukiki_cage_loop", - "802aebc8" : "bhv_squishable_platform_loop", - "802aec40" : "bhv_bitfs_sinking_platform_loop", - "802aeca8" : "bhv_ddd_moving_pole_loop", - "802aecdc" : "bhv_bitfs_sinking_cage_platform_loop", - "802aedc0" : "bhv_beta_moving_flames_spawn_loop", - "802aeea4" : "bhv_beta_moving_flames_loop", - "802aef1c" : "bhv_flamethrower_flame_loop", - "802af1e8" : "bhv_flamethrower_loop", - "802af3fc" : "bhv_rr_rotating_bridge_platform_loop", - "802af448" : "bhv_bouncing_fireball_flame_loop", - "802af5f8" : "bhv_bouncing_fireball_loop", - "802af7c4" : "bhv_bowser_shock_wave_loop", - "802af9cc" : "bhv_black_smoke_upward_loop", - "802afa0c" : "bhv_black_smoke_bowser_loop", - "802afae4" : "bhv_black_smoke_mario_loop", - "802afbf8" : "bhv_flame_mario_loop", - "802afce4" : "bhv_beta_fish_splash_spawner_loop", - "802afd1c" : "bhv_spindrift_loop", - "802afee8" : "bhv_wf_solid_tower_platform_loop", - "802aff30" : "bhv_wf_elevator_tower_platform_loop", - "802b00e4" : "bhv_wf_sliding_tower_platform_loop", - "802b0244" : "spawn_and_init_wf_platforms", - "802b039c" : "spawn_wf_platform_group", - "802b04b4" : "bhv_tower_platform_group_loop", - "802b0614" : "bhv_tree_snow_or_leaf_loop", - "802b0974" : "bhv_snow_leaf_particle_spawn_init", - "802b0b9c" : "square_plat_set_yaw_until_timer", - "802b0bec" : "bhv_squarish_path_moving_loop", - "802b0d48" : "bhv_piranha_plant_waking_bubbles_loop", - "802b0df0" : "bhv_piranha_plant_bubble_loop", - "802b1278" : "bhv_purple_switch_loop", - "802b14f4" : "check_if_moving_over_floor", - "802b15e8" : "bhv_pushable_loop", - "802b1714" : "breakable_box_init", - "802b17f4" : "hidden_breakable_box_actions", - "802b19d8" : "hidden_unbreakable_box_actions", - "802b1ae0" : "bhv_hidden_object_loop", - "802b1b2c" : "bhv_breakable_box_loop", - "802b1bb0" : "geo_move_mario_part_from_parent", - "802b1c54" : "bhv_heave_ho_throw_mario_loop", - "802b1d7c" : "heave_ho_act_1", - "802b1e6c" : "heave_ho_act_2", - "802b1ff4" : "heave_ho_act_3", - "802b20a0" : "heave_ho_act_0", - "802b2154" : "heave_ho_move", - "802b2278" : "bhv_heave_ho_loop", - "802b2340" : "bhv_ccm_touched_star_spawn_loop", - "802b23e0" : "bhv_unused_poundable_platform", - "802b2494" : "bhv_beta_trampoline_spring_loop", - "802b25ac" : "bhv_beta_trampoline_top_loop", - "802b26a4" : "jumping_box_act_0", - "802b27d8" : "jumping_box_act_1", - "802b2824" : "jumping_box_free_update", - "802b288c" : "bhv_jumping_box_loop", - "802b29b8" : "bhv_boo_cage_loop", - "802b2bc8" : "spawn_sparkle_particles", - "802b2d10" : "bhv_alpha_boo_key_loop", - "802b3108" : "bhv_beta_boo_key_loop", - "802b3134" : "arc_to_goal_pos", - "802b3250" : "grand_star_zero_velocity", - "802b329c" : "bhv_grand_star_loop", - "802b3600" : "bhv_bowser_key_loop", - "802b37b8" : "bhv_white_puff_smoke_init", - "802b3810" : "bhv_bullet_bill_init", - "802b3830" : "bullet_bill_act_0", - "802b38b8" : "bullet_bill_act_1", - "802b394c" : "bullet_bill_act_2", - "802b3b08" : "bullet_bill_act_3", - "802b3b24" : "bullet_bill_act_4", - "802b3be0" : "bhv_bullet_bill_loop", - "802b3c2c" : "bowser_tail_anchor_act_0", - "802b3cdc" : "bowser_tail_anchor_act_1", - "802b3d10" : "bowser_tail_anchor_act_2", - "802b3d74" : "bhv_bowser_tail_anchor_loop", - "802b3df4" : "bhv_bowser_flame_spawn_loop", - "802b4080" : "bhv_bowser_body_anchor_loop", - "802b4184" : "bowser_spawn_shockwave", - "802b41fc" : "bowser_bounce", - "802b4288" : "bowser_set_anim_look_up_and_walk", - "802b4300" : "bowser_set_anim_slow_gait", - "802b4368" : "bowser_set_anim_look_down", - "802b43dc" : "bowser_initialize_action", - "802b4478" : "bowser_act_text_wait", - "802b44bc" : "bowser_act_intro_walk", - "802b45f4" : "bowser_bitdw_act_controller", - "802b473c" : "bowser_bitfs_act_controller", - "802b48d4" : "bowser_general_bits_act_controller", - "802b4a1c" : "bowser_set_act_jump", - "802b4a3c" : "bowser_bits_act_controller", - "802b4af4" : "bowser_reset_fallen_off_stage", - "802b4bac" : "bowser_act_unused_slow_walk", - "802b4be8" : "bowser_act_default", - "802b4ca4" : "bowser_act_breath_fire", - "802b4d14" : "bowser_act_walk_to_mario", - "802b4f00" : "bowser_act_teleport", - "802b5104" : "bowser_act_spit_fire_into_sky", - "802b5218" : "bowser_act_hit_mine", - "802b53f4" : "bowser_set_anim_in_air", - "802b5444" : "bowser_land", - "802b5554" : "bowser_short_second_hop", - "802b55cc" : "bowser_act_jump", - "802b5798" : "bowser_act_jump_towards_mario", - "802b58bc" : "bowser_act_hit_edge", - "802b59cc" : "bowser_act_spit_fire_onto_floor", - "802b5aec" : "bowser_turn_on_timer", - "802b5c00" : "bowser_act_turn_from_edge", - "802b5c40" : "bowser_act_charge_mario", - "802b5f6c" : "bowser_check_hit_mine", - "802b5fec" : "bowser_act_thrown_dropped", - "802b611c" : "bowser_set_goal_invisible", - "802b6190" : "bowser_act_jump_onto_stage", - "802b6568" : "bowser_act_dance", - "802b65d0" : "bowser_spawn_grand_star_key", - "802b6670" : "bowser_fly_back_dead", - "802b6730" : "bowser_dead_bounce", - "802b67d4" : "bowser_dead_wait_for_mario", - "802b6878" : "bowser_dead_twirl_into_trophy", - "802b6a10" : "bowser_dead_hide", - "802b6a78" : "bowser_dead_not_bits_end", - "802b6bac" : "bowser_dead_bits_end", - "802b6cf0" : "bowser_act_dead", - "802b6e40" : "bowser_tilt_platform", - "802b6ee0" : "bowser_act_ride_tilting_platform", - "802b711c" : "bowser_check_fallen_off_stage", - "802b71e4" : "bowser_free_update", - "802b72d4" : "bowser_held_update", - "802b7418" : "bowser_thrown_dropped_update", - "802b75a4" : "bhv_bowser_loop", - "802b7878" : "bhv_bowser_init", - "802b798c" : "geo_update_body_rot_from_parent", - "802b7a20" : "bowser_open_eye_switch", - "802b7c64" : "geo_switch_bowser_eyes", - "802b7d44" : "geo_bits_bowser_coloring", - "802b7e68" : "falling_bowser_plat_act_0", - "802b7ef0" : "falling_bowser_plat_act_1", - "802b8024" : "falling_bowser_plat_act_2", - "802b8384" : "bhv_falling_bowser_platform_loop", - "802b83b0" : "bowser_flame_despawn", - "802b8434" : "bowser_flame_should_despawn", - "802b84ac" : "bhv_flame_bowser_init", - "802b85b0" : "bhv_flame_large_burning_out_init", - "802b8654" : "bowser_flame_move", - "802b8734" : "bhv_flame_bowser_loop", - "802b8960" : "bhv_flame_moving_forward_growing_init", - "802b89ec" : "bhv_flame_moving_forward_growing_loop", - "802b8b1c" : "bhv_flame_floating_landing_init", - "802b8c38" : "bhv_flame_floating_landing_loop", - "802b8d68" : "bhv_blue_bowser_flame_init", - "802b8e7c" : "bhv_blue_bowser_flame_loop", - "802b9034" : "bhv_flame_bouncing_init", - "802b90ec" : "bhv_flame_bouncing_loop", - "802b921c" : "bhv_blue_flames_group_loop", - "802b935c" : "bhv_blue_fish_movement_loop", - "802b9790" : "bhv_tank_fish_group_loop", - "802b98d4" : "vec3f_copy_2", - "802b98fc" : "bhv_checkerboard_elevator_group_init", - "802b9a78" : "checkerboard_plat_act_move_y", - "802b9af8" : "checkerboard_plat_act_rotate", - "802b9bb4" : "bhv_checkerboard_platform_init", - "802b9bd8" : "bhv_checkerboard_platform_loop", - "802b9e94" : "bhv_ddd_warp_loop", - "802b9efc" : "water_level_pillar_undrained", - "802ba13c" : "water_level_pillar_drained", - "802ba19c" : "bhv_water_level_pillar_init", - "802ba1e0" : "bhv_water_level_pillar_loop", - "802ba25c" : "bhv_invisible_objects_under_bridge_init", - "802ba2b0" : "geo_scale_bowser_key", - "802ba2f8" : "bhv_bowser_key_unlock_door_loop", - "802ba458" : "bhv_bowser_key_course_exit_loop", - "802ba5bc" : "bhv_moat_grills_loop", - "802ba608" : "bhv_rotating_clock_arm_loop", - "802ba7e0" : "handle_cap_ukiki_reset", - "802ba868" : "is_cap_ukiki_and_mario_has_normal_cap_on_head", - "802ba8c4" : "geo_update_projectile_pos_from_parent_copy", - "802ba958" : "idle_ukiki_taunt", - "802bab7c" : "ukiki_act_idle", - "802bae40" : "ukiki_act_return_home", - "802baec4" : "ukiki_act_wait_to_respawn", - "802baf10" : "ukiki_act_unused_turn", - "802baf64" : "ukiki_act_turn_to_mario", - "802bb07c" : "ukiki_act_run", - "802bb288" : "ukiki_act_jump", - "802bb3b8" : "ukiki_act_go_to_cage", - "802bb798" : "ukiki_free_loop", - "802bb888" : "cage_ukiki_held_loop", - "802bba3c" : "cap_ukiki_held_loop", - "802bbb98" : "bhv_ukiki_init", - "802bbc0c" : "bhv_ukiki_loop", - "802bbd6c" : "lll_octagonal_mesh_move", - "802bbfd8" : "lll_octagonal_mesh_find_y_offset", - "802bc0f0" : "bhv_lll_moving_octagonal_mesh_platform_loop", - "802bc22c" : "bhv_lll_sinking_rock_block_loop", - "802bc294" : "bhv_lll_rotating_hex_flame_loop", - "802bc348" : "fire_bar_spawn_flames", - "802bc4f4" : "fire_bar_act_0", - "802bc538" : "fire_bar_act_1", - "802bc590" : "fire_bar_act_2", - "802bc5fc" : "fire_bar_act_3", - "802bc618" : "bhv_lll_rotating_block_fire_bars_loop", - "802bc660" : "bhv_lll_wood_piece_loop", - "802bc728" : "bhv_lll_floating_wood_bridge_loop", - "802bc898" : "bhv_volcano_flames_loop", - "802bc934" : "hexagonal_ring_spawn_flames", - "802bca74" : "bhv_lll_rotating_hexagonal_ring_loop", - "802bcce8" : "sinking_rectangular_plat_actions", - "802bcda8" : "bhv_lll_sinking_rectangular_platform_loop", - "802bce58" : "bhv_lll_sinking_square_platforms_loop", - "802bce9c" : "create_transform_from_normals", - "802bcf40" : "bhv_platform_normals_init", - "802bcfc4" : "approach_by_increment", - "802bd058" : "bhv_tilting_inverted_pyramid_loop", - "802bd3e4" : "koopa_shell_spawn_water_drop", - "802bd488" : "bhv_koopa_shell_flame_loop", - "802bd5dc" : "bhv_koopa_shell_flame_spawn", - "802bd62c" : "koopa_shell_spawn_sparkles", - "802bd680" : "bhv_koopa_shell_loop", - "802bd8d0" : "tox_box_shake_screen", - "802bd91c" : "tox_box_move", - "802bdb04" : "tox_box_act_4", - "802bdb3c" : "tox_box_act_5", - "802bdb74" : "tox_box_act_6", - "802bdbac" : "tox_box_act_7", - "802bdbe4" : "tox_box_act_1", - "802bdc7c" : "tox_box_act_2", - "802bdcc8" : "tox_box_act_3", - "802bdd14" : "tox_box_act_0", - "802bdd68" : "bhv_tox_box_loop", - "802bdd9c" : "piranha_plant_act_idle", - "802bde10" : "piranha_plant_check_interactions", - "802bdeec" : "piranha_plant_act_sleeping", - "802be034" : "piranha_plant_act_woken_up", - "802be0b8" : "piranha_plant_reset_when_far", - "802be0ec" : "piranha_plant_attacked", - "802be150" : "piranha_plant_act_shrink_and_die", - "802be234" : "piranha_plant_act_wait_to_respawn", - "802be278" : "piranha_plant_act_respawn", - "802be350" : "piranha_plant_act_biting", - "802be49c" : "mario_moving_fast_enough_to_make_piranha_plant_bite", - "802be50c" : "piranha_plant_act_stopped_biting", - "802be5a0" : "bhv_piranha_plant_loop", - "802be628" : "bhv_lll_bowser_puzzle_spawn_piece", - "802be6d4" : "bhv_lll_bowser_puzzle_spawn_pieces", - "802be79c" : "bhv_lll_bowser_puzzle_loop", - "802be8a8" : "bhv_lll_bowser_puzzle_piece_action_0", - "802be8b8" : "bhv_lll_bowser_puzzle_piece_action_1", - "802be8f4" : "bhv_lll_bowser_puzzle_piece_update", - "802be9dc" : "bhv_lll_bowser_puzzle_piece_move", - "802beb14" : "bhv_lll_bowser_puzzle_piece_idle", - "802beb54" : "bhv_lll_bowser_puzzle_piece_move_left", - "802beb8c" : "bhv_lll_bowser_puzzle_piece_move_right", - "802bebc4" : "bhv_lll_bowser_puzzle_piece_move_up", - "802bebfc" : "bhv_lll_bowser_puzzle_piece_move_down", - "802bec34" : "bhv_lll_bowser_puzzle_piece_loop", - "802becb0" : "set_obj_anim_with_accel_and_sound", - "802bed7c" : "play_penguin_walking_sound", - "802bedec" : "tuxies_mother_act_2", - "802bef8c" : "tuxies_mother_act_1", - "802bf1d8" : "tuxies_mother_act_0", - "802bf3c0" : "bhv_tuxies_mother_loop", - "802bf424" : "small_penguin_dive_with_mario", - "802bf474" : "small_penguin_act_2", - "802bf57c" : "small_penguin_act_1", - "802bf648" : "small_penguin_act_3", - "802bf6e4" : "small_penguin_act_4", - "802bf760" : "small_penguin_act_0", - "802bf90c" : "small_penguin_act_5", - "802bfa14" : "small_penguin_free_actions", - "802bfa88" : "bhv_small_penguin_loop", - "802bfbac" : "geo_switch_tuxie_mother_eyes", - "802bfcd8" : "fish_act_spawn", - "802bfeb8" : "fish_act_respawn", - "802bff20" : "fish_act_init", - "802bff3c" : "bhv_large_fish_group_loop", - "802bff68" : "fish_regroup", - "802c00b4" : "fish_group_act_rotation", - "802c0348" : "fish_group_act_move", - "802c06a8" : "fish_group_act_animate", - "802c0768" : "bhv_fish_loop", - "802c08a8" : "bhv_wdw_express_elevator_loop", - "802c0aac" : "bub_spawner_act_0", - "802c0b50" : "bub_spawner_act_1", - "802c0ba4" : "bub_spawner_act_2", - "802c0bc4" : "bub_spawner_act_3", - "802c0be0" : "bhv_bub_spawner_loop", - "802c0c0c" : "bub_move_vertically", - "802c0cd4" : "bub_act_0", - "802c0d44" : "bub_act_1", - "802c0f90" : "bub_act_2", - "802c1204" : "bhv_bub_loop", - "802c12c0" : "bhv_rotating_exclamation_box_loop", - "802c1308" : "exclamation_box_act_0", - "802c13ec" : "exclamation_box_act_1", - "802c14b0" : "exclamation_box_act_2", - "802c15b8" : "exclamation_box_act_3", - "802c17bc" : "exclamation_box_spawn_contents", - "802c18d0" : "exclamation_box_act_4", - "802c1988" : "exclamation_box_act_5", - "802c19c0" : "bhv_exclamation_box_loop", - "802c19fc" : "bhv_sound_spawner_init", - "802c1a40" : "bhv_bowsers_sub_loop", - "802c1a80" : "bhv_sushi_shark_collision_loop", - "802c1a90" : "bhv_sushi_shark_loop", - "802c1c44" : "bhv_sunken_ship_part_loop", - "802c1cd4" : "bhv_ship_part_3_loop", - "802c1e10" : "bhv_jrb_sliding_box_loop", - "802c2190" : "bhv_white_puff_1_loop", - "802c2274" : "bhv_white_puff_2_loop", - "802c22b8" : "bhv_hidden_blue_coin_loop", - "802c242c" : "bhv_blue_coin_switch_loop", - "802c263c" : "bhv_openable_cage_door_loop", - "802c26f8" : "bhv_openable_grill_loop", - "802c2930" : "bhv_init_changing_water_level_loop", - "802c2a24" : "bhv_water_level_diamond_loop", - "802c2ce8" : "tweester_scale_and_move", - "802c2ebc" : "tweester_act_idle", - "802c2fbc" : "tweester_act_chase", - "802c31c4" : "tweester_act_hide", - "802c329c" : "bhv_tweester_loop", - "802c32e8" : "bhv_tweester_sand_particle_loop", - "802c3440" : "bhv_boo_init", - "802c3684" : "bhv_courtyard_boo_triplet_init", - "802c4824" : "bhv_boo_loop", - "802c4f30" : "bhv_big_boo_loop", - "802c515c" : "bhv_boo_with_cage_init", - "802c51d4" : "bhv_boo_with_cage_loop", - "802c5224" : "bhv_merry_go_round_boo_manager_loop", - "802c53cc" : "obj_set_secondary_camera_focus", - "802c53ec" : "bhv_animated_texture_loop", - "802c5414" : "bhv_boo_in_castle_loop", - "802c5688" : "bhv_boo_boss_spawned_bridge_loop", - "802c5890" : "bhv_bbh_tilting_trap_platform_loop", - "802c5a38" : "bhv_haunted_bookshelf_loop", - "802c5ca8" : "bhv_merry_go_round_loop", - "802c5dc0" : "bhv_static_checkered_platform_loop", - "802c5f48" : "bhv_beta_bowser_anchor_loop", - "802c5fdc" : "bhv_play_music_track_when_touched_loop", - "802c6050" : "bhv_floor_trap_in_castle_loop", - "802c60ac" : "bhv_castle_floor_trap_init", - "802c6150" : "bhv_castle_floor_trap_open_detect", - "802c61d4" : "bhv_castle_floor_trap_open", - "802c6278" : "bhv_castle_floor_trap_close_detect", - "802c62bc" : "bhv_castle_floor_trap_close", - "802c6328" : "bhv_castle_floor_trap_rotate", - "802c6348" : "bhv_castle_floor_trap_loop", - "802c63e8" : "bhv_pole_base_loop", - "802c64a4" : "bhv_sparkle_spawn_loop", - "802c6538" : "update_angle_from_move_flags", - "802c65c0" : "bhv_scuttlebug_loop", - "802c6b6c" : "bhv_scuttlebug_spawn_loop", - "802c6ca0" : "whomp_play_sfx_from_pound_animation", - "802c6d6c" : "whomp_act_0", - "802c6ec8" : "whomp_act_7", - "802c6fb0" : "whomp_act_1", - "802c710c" : "whomp_act_2", - "802c7254" : "whomp_act_3", - "802c72b4" : "whomp_act_4", - "802c7380" : "whomp_act_5", - "802c7428" : "king_whomp_on_ground", - "802c75fc" : "whomp_on_ground", - "802c76d4" : "whomp_act_6", - "802c7858" : "whomp_act_8", - "802c7998" : "whomp_act_9", - "802c79d8" : "bhv_whomp_loop", - "802c7a70" : "bhv_water_splash_spawn_droplets", - "802c7b14" : "bhv_water_droplet_loop", - "802c7cac" : "bhv_idle_water_wave_loop", - "802c7d40" : "bhv_water_droplet_splash_init", - "802c7d90" : "bhv_bubble_splash_init", - "802c7dfc" : "bhv_shallow_water_splash_init", - "802c7e5c" : "bhv_wave_trail_shrink", - "802c7f98" : "bhv_strong_wind_particle_loop", - "802c81b4" : "cur_obj_spawn_strong_wind_particles", - "802c834c" : "bhv_sl_snowman_wind_loop", - "802c863c" : "bhv_sl_walking_penguin_loop", - "802c89f0" : "update_mario_platform", - "802c8b4c" : "get_mario_pos", - "802c8b8c" : "set_mario_pos", - "802c8bc8" : "apply_platform_displacement", - "802c8ec0" : "apply_mario_platform_displacement", - "802c8f28" : "clear_mario_platform", - "802c8f40" : "debug_print_obj_collision", - "802c8fe4" : "detect_object_hitbox_overlap", - "802c91ec" : "detect_object_hurtbox_overlap", - "802c9388" : "clear_object_collision", - "802c93f8" : "check_collision_in_list", - "802c94ac" : "check_player_object_collision", - "802c95b4" : "check_pushable_object_collision", - "802c9630" : "check_destructive_object_collision", - "802c9724" : "detect_object_collisions", - "802c97d0" : "unused_init_free_list", - "802c9840" : "unused_try_allocate", - "802c98a4" : "try_allocate_object", - "802c9950" : "unused_deallocate", - "802c99b8" : "init_free_object_list", - "802c9a3c" : "clear_object_lists", - "802c9b68" : "unload_object", - "802c9c00" : "allocate_object", - "802c9f04" : "create_object", - "802ca028" : "mark_obj_for_deletion", - "802ca040" : "exec_anim_sound_state", - "802ca144" : "create_sound_spawner", - "802ca190" : "cur_obj_play_sound_1", - "802ca1e0" : "cur_obj_play_sound_2", - "802ca230" : "calc_dist_to_volume_range_1", - "802ca2d4" : "calc_dist_to_volume_range_2", - "802ca370" : "stub_debug_1", - "802ca380" : "stub_debug_2", - "802ca390" : "stub_debug_3", - "802ca3a0" : "stub_debug_4", - "802ca3b0" : "get_current_clock", - "802ca3e0" : "get_clock_difference", - "802ca418" : "set_print_state_info", - "802ca460" : "print_text_array_info", - "802ca51c" : "set_text_array_x_y", - "802ca568" : "print_debug_bottom_up", - "802ca5b8" : "print_debug_top_down_objectinfo", - "802ca618" : "print_debug_top_down_mapinfo", - "802ca680" : "print_debug_top_down_normal", - "802ca6d0" : "print_mapinfo", - "802ca8e8" : "print_checkinfo", - "802ca918" : "print_surfaceinfo", - "802ca94c" : "print_stageinfo", - "802ca990" : "print_string_array_info", - "802caa6c" : "print_effectinfo", - "802caaa8" : "print_enemyinfo", - "802caae4" : "update_debug_dpadmask", - "802cabac" : "debug_unknown_level_select_check", - "802cac20" : "reset_debug_objectinfo", - "802cb0b0" : "stub_debug_5", - "802cb0c0" : "try_print_debug_mario_object_info", - "802cb1c0" : "try_print_debug_mario_level_info", - "802cb264" : "try_do_mario_debug_object_spawn", - "802cb564" : "debug_enemy_unknown", - "802cb5c0" : "set_and_reset_transition_fade_timer", - "802cb640" : "set_transition_color_fade_alpha", - "802cb894" : "vertex_transition_color", - "802cba18" : "dl_transition_color", - "802cbbc4" : "render_fade_transition_from_color", - "802cbc20" : "render_fade_transition_into_color", - "802cbc7c" : "calc_tex_transition_radius", - "802cbd54" : "calc_tex_transition_time", - "802cbe64" : "convert_tex_transition_angle_to_pos", - "802cbee0" : "center_tex_transition_x", - "802cbf64" : "center_tex_transition_y", - "802cbfe8" : "make_tex_transition_vertex", - "802cc180" : "load_tex_transition_vertex", - "802cc4d8" : "render_textured_transition", - "802ccbe8" : "render_screen_transition", - "802ccdc8" : "render_cannon_circle_base", - "802cd1e8" : "geo_cannon_circle_base", - "802cd280" : "rotate_rectangle", - "802cd328" : "atan2_deg", - "802cd388" : "scale_shadow_with_distance", - "802cd444" : "disable_shadow_with_distance", - "802cd48c" : "dim_shadow_with_distance", - "802cd614" : "get_water_level_below_shadow", - "802cd6c4" : "init_shadow", - "802cd938" : "get_texture_coords_9_vertices", - "802cd988" : "get_texture_coords_4_vertices", - "802cd9ec" : "make_shadow_vertex_at_xyz", - "802cdb20" : "extrapolate_vertex_y_position", - "802cdb74" : "get_vertex_coords", - "802cdc40" : "calculate_vertex_xyz", - "802cde94" : "floor_local_tilt", - "802cdf3c" : "make_shadow_vertex", - "802ce128" : "add_shadow_to_display_list", - "802ce2bc" : "linearly_interpolate_solidity_positive", - "802ce3ec" : "linearly_interpolate_solidity_negative", - "802ce524" : "correct_shadow_solidity_for_animations", - "802ce690" : "correct_lava_shadow_height", - "802ce79c" : "create_shadow_player", - "802ce9d0" : "create_shadow_circle_9_verts", - "802ceae8" : "create_shadow_circle_4_verts", - "802cec04" : "create_shadow_circle_assuming_flat_ground", - "802cedc0" : "create_shadow_rectangle", - "802cef6c" : "get_shadow_height_solidity", - "802cf080" : "create_shadow_square", - "802cf1f0" : "create_shadow_hardcoded_rectangle", - "802cf34c" : "create_shadow_below_xyz", - "802cf5b0" : "calculate_skybox_scaled_x", - "802cf69c" : "calculate_skybox_scaled_y", - "802cf804" : "make_skybox_rect", - "802cfa2c" : "draw_skybox_tile_grid", - "802cfc68" : "create_skybox_ortho_matrix", - "802cfd88" : "init_skybox_display_list", - "802cfef4" : "create_skybox_facing_camera", - "802d0080" : "geo_wdw_set_initial_water_level", - "802d01e0" : "geo_movtex_pause_control", - "802d0254" : "movtex_make_quad_vertex", - "802d0484" : "movtex_gen_from_quad", - "802d0a84" : "movtex_gen_from_quad_array", - "802d0bb0" : "movtex_gen_quads_id", - "802d0c84" : "get_quad_collection_from_id", - "802d0f28" : "movtex_change_texture_format", - "802d104c" : "geo_movtex_draw_water_regions", - "802d1330" : "update_moving_texture_offset", - "802d13cc" : "movtex_write_vertex_first", - "802d1574" : "movtex_write_vertex_index", - "802d18b4" : "movtex_gen_list", - "802d1b70" : "geo_movtex_draw_nocolor", - "802d1cdc" : "geo_movtex_draw_colored", - "802d1e48" : "geo_movtex_draw_colored_no_update", - "802d1fa8" : "geo_movtex_draw_colored_2_no_update", - "802d2108" : "geo_movtex_update_horizontal", - "802d2210" : "make_vertex", - "802d22c4" : "round_float", - "802d2360" : "geo_exec_inside_castle_light", - "802d2470" : "geo_exec_flying_carpet_timer_update", - "802d2520" : "geo_exec_flying_carpet_create", - "802d28cc" : "geo_exec_cake_end_screen", - "802d29c0" : "stop_other_paintings", - "802d2a74" : "painting_mario_y", - "802d2b08" : "painting_mario_z", - "802d2b84" : "painting_ripple_y", - "802d2c40" : "painting_nearest_4th", - "802d2d80" : "painting_mario_x", - "802d2dfc" : "painting_ripple_x", - "802d2eb8" : "painting_state", - "802d2ffc" : "wall_painting_proximity_idle", - "802d319c" : "wall_painting_proximity_rippling", - "802d327c" : "wall_painting_continuous_idle", - "802d341c" : "wall_painting_continuous_rippling", - "802d34fc" : "floor_painting_proximity_idle", - "802d36ac" : "floor_painting_proximity_rippling", - "802d379c" : "floor_painting_continuous_idle", - "802d393c" : "floor_painting_continuous_rippling", - "802d3a2c" : "painting_update_floors", - "802d3bec" : "painting_update_ripple_state", - "802d3cec" : "calculate_ripple_at_point", - "802d3e6c" : "ripple_if_movable", - "802d3ee4" : "painting_generate_mesh", - "802d404c" : "painting_calculate_triangle_normals", - "802d43f8" : "normalize_component", - "802d44bc" : "painting_average_vertex_normals", - "802d47d0" : "render_painting", - "802d4edc" : "painting_model_view_transform", - "802d50dc" : "painting_ripple_image", - "802d5354" : "painting_ripple_env_mapped", - "802d556c" : "display_painting_rippling", - "802d568c" : "display_painting_not_rippling", - "802d5778" : "reset_painting", - "802d57a8" : "move_ddd_painting", - "802d58e4" : "set_painting_layer", - "802d593c" : "display_painting", - "802d59a8" : "wall_painting_update", - "802d5aa0" : "floor_painting_update", - "802d5b98" : "geo_painting_draw", - "802d5d0c" : "geo_painting_update", - "802d5e00" : "int_pow", - "802d5e54" : "format_integer", - "802d6144" : "parse_width_field", - "802d62d8" : "print_text_fmt_int", - "802d6554" : "print_text", - "802d66c0" : "print_text_centered", - "802d6858" : "char_to_glyph_index", - "802d69f8" : "add_glyph_texture", - "802d6acc" : "clip_to_bounds", - "802d6b3c" : "render_textrect", - "802d6c88" : "render_text_labels", - "802d6f20" : "create_dl_identity_matrix", - "802d7070" : "create_dl_translation_matrix", - "802d7174" : "create_dl_rotation_matrix", - "802d7280" : "create_dl_scale_matrix", - "802d7384" : "create_dl_ortho_matrix", - "802d75dc" : "render_generic_char", - "802d76c8" : "render_multi_text_string", - "802d77dc" : "print_generic_string", - "802d7b84" : "print_hud_lut_string", - "802d7e88" : "print_menu_generic_string", - "802d82d4" : "print_credits_string", - "802d862c" : "handle_menu_scrolling", - "802d8844" : "get_str_x_pos_from_center", - "802d8934" : "get_string_width", - "802d89b8" : "print_hud_my_score_coins", - "802d8a80" : "print_hud_my_score_stars", - "802d8b34" : "int_to_str", - "802d8c6c" : "get_dialog_id", - "802d8c88" : "create_dialog_box", - "802d8cc4" : "create_dialog_box_with_var", - "802d8d08" : "create_dialog_inverted_box", - "802d8d48" : "create_dialog_box_with_response", - "802d8d90" : "reset_dialog_render_state", - "802d8e2c" : "render_dialog_box_type", - "802d9148" : "change_and_flash_dialog_text_color_lines", - "802d9388" : "handle_dialog_scroll_page_state", - "802d944c" : "render_star_count_dialog_text", - "802d9634" : "render_multi_text_string_lines", - "802d9800" : "ensure_nonnegative", - "802d982c" : "handle_dialog_text_and_pages", - "802d9cb0" : "render_dialog_triangle_choice", - "802d9dfc" : "render_dialog_string_color", - "802d9f84" : "handle_special_dialog_text", - "802da1ac" : "render_dialog_entries", - "802da810" : "set_menu_mode", - "802da844" : "reset_cutscene_msg_fade", - "802da85c" : "dl_rgba16_begin_cutscene_msg_fade", - "802da8e4" : "dl_rgba16_stop_cutscene_msg_fade", - "802da964" : "ascii_to_credits_char", - "802daa34" : "print_credits_str_ascii", - "802daae4" : "set_cutscene_message", - "802dab58" : "do_cutscene_handler", - "802dad54" : "print_peach_letter_message", - "802db08c" : "render_hud_cannon_reticle", - "802db350" : "reset_red_coins_collected", - "802db368" : "change_dialog_camera_angle", - "802db3b8" : "shade_screen", - "802db498" : "print_animated_red_coin", - "802db6e8" : "render_pause_red_coins", - "802db760" : "render_pause_my_score_coins", - "802dbb24" : "render_pause_camera_options", - "802dbe68" : "render_pause_course_options", - "802dc15c" : "render_pause_castle_menu_box", - "802dc418" : "highlight_last_course_complete_stars", - "802dc478" : "print_hud_pause_colorful_str", - "802dc570" : "render_pause_castle_course_stars", - "802dc718" : "render_pause_castle_main_strings", - "802dca88" : "render_pause_courses_and_castle", - "802dcd04" : "print_hud_course_complete_string", - "802dcf30" : "print_hud_course_complete_coins", - "802dd194" : "play_star_fanfare_and_flash_hud", - "802dd210" : "render_course_complete_lvl_info_and_hud_str", - "802dd838" : "render_save_confirmation", - "802ddae0" : "render_course_complete_screen", - "802ddca4" : "render_menus_and_dialogs", - "802dddf0" : "envfx_init_snow", - "802ddf38" : "envfx_update_snowflake_count", - "802de0bc" : "envfx_cleanup_snow", - "802de114" : "orbit_from_positions", - "802de23c" : "pos_from_orbit", - "802de360" : "envfx_is_snowflake_alive", - "802de458" : "envfx_update_snow_normal", - "802de888" : "envfx_update_snow_blizzard", - "802ded38" : "envfx_update_snow_water", - "802def2c" : "rotate_triangle_vertices", - "802df334" : "append_snowflake_vertex_buffer", - "802df748" : "envfx_update_snow", - "802dfbc8" : "envfx_update_particles", - "802dfd50" : "particle_is_laterally_close", - "802dfe00" : "random_flower_offset", - "802dfe80" : "envfx_update_flower", - "802e0120" : "envfx_set_lava_bubble_position", - "802e048c" : "envfx_update_lava", - "802e065c" : "envfx_rotate_around_whirlpool", - "802e08a8" : "envfx_is_whirlpool_bubble_alive", - "802e0934" : "envfx_update_whirlpool", - "802e0e24" : "envfx_is_jestream_bubble_alive", - "802e0eb8" : "envfx_update_jetstream", - "802e1238" : "envfx_init_bubble", - "802e1414" : "envfx_bubbles_update_switch", - "802e1618" : "append_bubble_vertex_buffer", - "802e1a20" : "envfx_set_bubble_texture", - "802e1bb8" : "envfx_update_bubble_particles", - "802e1ed8" : "envfx_set_max_bubble_particles", - "802e1f48" : "envfx_update_bubbles", - "802e20a0" : "convert_rotation", - "802e2134" : "spawn_macro_abs_yrot_2params", - "802e21dc" : "spawn_macro_abs_yrot_param1", - "802e2284" : "spawn_macro_abs_special", - "802e2414" : "spawn_macro_objects", - "802e2690" : "spawn_macro_objects_hardcoded", - "802e28ec" : "spawn_special_objects", - "802e2cf0" : "render_hud_tex_lut", - "802e2e58" : "render_hud_small_tex_lut", - "802e30b4" : "render_power_meter_health_segment", - "802e3214" : "render_dl_power_meter", - "802e33b8" : "animate_power_meter_emphasized", - "802e352c" : "handle_power_meter_actions", - "802e3654" : "render_hud_power_meter", - "802e3744" : "render_hud_mario_lives", - "802e37a8" : "render_hud_coins", - "802e380c" : "render_hud_stars", - "802e38e4" : "render_hud_keys", - "802e395c" : "render_hud_timer", - "802e3b1c" : "set_hud_camera_status", - "802e3b3c" : "render_hud_camera_status", - "802e3d2c" : "render_hud", - "802e3e50" : "set_yoshi_as_not_dead", - "802e3e68" : "geo_obj_transparency_something", - "802e3f68" : "absf_2", - "802e3fac" : "turn_obj_away_from_surface", - "802e405c" : "obj_find_wall", - "802e41a4" : "turn_obj_away_from_steep_floor", - "802e42e0" : "obj_orient_graph", - "802e43e4" : "calc_obj_friction", - "802e445c" : "calc_new_obj_vel_and_pos_y", - "802e4814" : "calc_new_obj_vel_and_pos_y_underwater", - "802e4cec" : "obj_update_pos_vel_xz", - "802e4d88" : "obj_splash", - "802e4e90" : "object_step", - "802e5114" : "object_step_without_floor_orient", - "802e5160" : "obj_move_xyz_using_fvel_and_yaw", - "802e5208" : "is_point_within_radius_of_mario", - "802e52b8" : "is_point_close_to_object", - "802e5360" : "set_object_visibility", - "802e53f4" : "obj_return_home_if_safe", - "802e54b0" : "obj_return_and_displace_home", - "802e55d0" : "obj_check_if_facing_toward_angle", - "802e569c" : "obj_find_wall_displacement", - "802e5760" : "obj_spawn_yellow_coins", - "802e5824" : "obj_flicker_and_disappear", - "802e58b4" : "current_mario_room_check", - "802e5948" : "trigger_obj_dialog_when_facing", - "802e5a80" : "obj_check_floor_death", - "802e5b18" : "obj_lava_death", - "802e5c6c" : "spawn_orange_number", - "802e5d04" : "debug_sequence_tracker", - "802e5de8" : "coin_step", - "802e5e6c" : "moving_coin_flicker", - "802e5ea4" : "coin_collected", - "802e5ee8" : "bhv_moving_yellow_coin_init", - "802e5f64" : "bhv_moving_yellow_coin_loop", - "802e6098" : "bhv_moving_blue_coin_init", - "802e6114" : "bhv_moving_blue_coin_loop", - "802e62a4" : "bhv_blue_coin_sliding_jumping_init", - "802e631c" : "blue_coin_sliding_away_from_mario", - "802e63ec" : "blue_coin_sliding_slow_down", - "802e6474" : "bhv_blue_coin_sliding_loop", - "802e6628" : "bhv_blue_coin_jumping_loop", - "802e6790" : "bhv_seaweed_init", - "802e67dc" : "bhv_seaweed_bundle_init", - "802e6a2c" : "bhv_bobomb_init", - "802e6a8c" : "bobomb_spawn_coin", - "802e6af8" : "bobomb_act_explode", - "802e6bd4" : "bobomb_check_interactions", - "802e6cf0" : "bobomb_act_patrol", - "802e6dc8" : "bobomb_act_chase_mario", - "802e6e84" : "bobomb_act_launched", - "802e6ed8" : "generic_bobomb_free_loop", - "802e7020" : "stationary_bobomb_free_loop", - "802e7134" : "bobomb_free_loop", - "802e7180" : "bobomb_held_loop", - "802e7220" : "bobomb_dropped_loop", - "802e7280" : "bobomb_thrown_loop", - "802e7324" : "curr_obj_random_blink", - "802e742c" : "bhv_bobomb_loop", - "802e75a0" : "bhv_bobomb_fuse_smoke_init", - "802e76ac" : "bhv_bobomb_buddy_init", - "802e770c" : "bobomb_buddy_act_idle", - "802e7814" : "bobomb_buddy_cannon_dialog", - "802e79dc" : "bobomb_buddy_act_talk", - "802e7b00" : "bobomb_buddy_act_turn_to_talk", - "802e7bb0" : "bobomb_buddy_actions", - "802e7c4c" : "bhv_bobomb_buddy_loop", - "802e7c90" : "bhv_cannon_closed_init", - "802e7d4c" : "cannon_door_act_opening", - "802e7e54" : "bhv_cannon_closed_loop", - "802e7f70" : "bhv_whirlpool_init", - "802e7fb8" : "whirlpool_set_hitbox", - "802e7fec" : "whirpool_orient_graph", - "802e80dc" : "bhv_whirlpool_loop", - "802e82b0" : "bhv_jet_stream_loop", - "802e8388" : "bhv_homing_amp_init", - "802e89d4" : "bhv_homing_amp_loop", - "802e8ae4" : "bhv_circling_amp_init", - "802e8ecc" : "bhv_circling_amp_loop", - "802e8f68" : "bhv_butterfly_init", - "802e9018" : "butterfly_step", - "802e9278" : "butterfly_calculate_angle", - "802e9470" : "butterfly_act_rest", - "802e94e4" : "butterfly_act_follow_mario", - "802e9548" : "butterfly_act_return_home", - "802e96c8" : "bhv_butterfly_loop", - "802e9764" : "bhv_hoot_init", - "802e97fc" : "hoot_find_next_floor", - "802e98c0" : "hoot_floor_bounce", - "802e9a4c" : "hoot_free_step", - "802e9cf4" : "hoot_player_set_yaw", - "802e9d98" : "hoot_carry_step", - "802e9f60" : "hoot_surface_collision", - "802ea144" : "hoot_act_ascent", - "802ea258" : "hoot_action_loop", - "802ea3f0" : "hoot_turn_to_home", - "802ea4ec" : "hoot_awake_loop", - "802ea588" : "bhv_hoot_loop", - "802ea6a8" : "bhv_beta_holdable_object_init", - "802ea7e0" : "bhv_beta_holdable_object_loop", - "802ea888" : "bhv_object_bubble_init", - "802ea934" : "bhv_object_bubble_loop", - "802eaa10" : "bhv_object_water_wave_init", - "802eaa50" : "bhv_object_water_wave_loop", - "802eaa8c" : "bhv_explosion_init", - "802eaad0" : "bhv_explosion_loop", - "802eabf0" : "bhv_bobomb_bully_death_smoke_init", - "802eac3c" : "bhv_bobomb_explosion_bubble_init", - "802ead3c" : "bhv_bobomb_explosion_bubble_loop", - "802eaef8" : "bhv_respawner_loop", - "802eaf84" : "create_respawner", - "802eb05c" : "bhv_small_bully_init", - "802eb104" : "bhv_big_bully_init", - "802eb1c0" : "bully_check_mario_collision", - "802eb288" : "bully_act_chase_mario", - "802eb3f0" : "bully_act_knockback", - "802eb510" : "bully_act_back_up", - "802eb5c4" : "bully_backup_check", - "802eb630" : "bully_play_stomping_sound", - "802eb744" : "bully_step", - "802eb7e0" : "bully_spawn_coin", - "802eb8b0" : "bully_act_level_death", - "802eb9d0" : "bhv_bully_loop", - "802ebb74" : "big_bully_spawn_minion", - "802ebc00" : "bhv_big_bully_with_minions_init", - "802ebc88" : "big_bully_spawn_star", - "802ebce0" : "bhv_big_bully_with_minions_loop", - "802ebf70" : "water_ring_calc_mario_dist", - "802ec030" : "water_ring_init", - "802ec1b0" : "bhv_jet_stream_water_ring_init", - "802ec200" : "water_ring_check_collection", - "802ec3d0" : "water_ring_set_scale", - "802ec4e0" : "water_ring_act_collected", - "802ec59c" : "water_ring_act_not_collected", - "802ec75c" : "bhv_jet_stream_water_ring_loop", - "802ec7cc" : "spawn_manta_ray_ring_manager", - "802ec818" : "water_ring_spawner_act_inactive", - "802ec908" : "bhv_jet_stream_ring_spawner_loop", - "802ec9b8" : "bhv_manta_ray_water_ring_init", - "802ec9f0" : "manta_water_ring_act_not_collected", - "802ecba4" : "bhv_manta_ray_water_ring_loop", - "802ecc14" : "bhv_bowser_bomb_loop", - "802ecd0c" : "bhv_bowser_bomb_explosion_loop", - "802ecea0" : "bhv_bowser_bomb_smoke_loop", - "802ecfac" : "bhv_celebration_star_init", - "802ed10c" : "celeb_star_act_spin_around_mario", - "802ed28c" : "celeb_star_act_face_camera", - "802ed39c" : "bhv_celebration_star_loop", - "802ed40c" : "bhv_celebration_star_sparkle_loop", - "802ed45c" : "bhv_star_key_collection_puff_spawner_loop", - "802ed498" : "bhv_lll_drawbridge_spawner_loop", - "802ed62c" : "bhv_lll_drawbridge_loop", - "802ed78c" : "bhv_small_bomp_init", - "802ed7fc" : "bhv_small_bomp_loop", - "802edacc" : "bhv_large_bomp_init", - "802edb2c" : "bhv_large_bomp_loop", - "802eddfc" : "bhv_wf_sliding_platform_init", - "802edf28" : "bhv_wf_sliding_platform_loop", - "802ee124" : "bhv_moneybag_init", - "802ee1a0" : "moneybag_check_mario_collision", - "802ee268" : "moneybag_jump", - "802ee46c" : "moneybag_act_move_around", - "802ee598" : "moneybag_act_return_home", - "802ee728" : "moneybag_act_disappear", - "802ee778" : "moneybag_act_death", - "802ee7e0" : "bhv_moneybag_loop", - "802ee8f4" : "bhv_moneybag_hidden_loop", - "802ee9cc" : "bhv_bowling_ball_init", - "802eea24" : "bowling_ball_set_hitbox", - "802eea7c" : "bowling_ball_set_waypoints", - "802eeb64" : "bhv_bowling_ball_roll_loop", - "802eecb8" : "bhv_bowling_ball_initializeLoop", - "802eedf0" : "bhv_bowling_ball_loop", - "802eeeb4" : "bhv_generic_bowling_ball_spawner_init", - "802eef9c" : "bhv_generic_bowling_ball_spawner_loop", - "802ef0e8" : "bhv_thi_bowling_ball_spawner_loop", - "802ef21c" : "bhv_bob_pit_bowling_ball_init", - "802ef274" : "bhv_bob_pit_bowling_ball_loop", - "802ef34c" : "bhv_free_bowling_ball_init", - "802ef3f4" : "bhv_free_bowling_ball_roll_loop", - "802ef524" : "bhv_free_bowling_ball_loop", - "802ef63c" : "bhv_rr_cruiser_wing_init", - "802ef66c" : "bhv_rr_cruiser_wing_loop", - "802ef820" : "bhv_spindel_init", - "802ef858" : "bhv_spindel_loop", - "802efcd0" : "bhv_ssl_moving_pyramid_wall_init", - "802efd8c" : "bhv_ssl_moving_pyramid_wall_loop", - "802efe64" : "bhv_pyramid_elevator_init", - "802efef4" : "bhv_pyramid_elevator_loop", - "802f0104" : "bhv_pyramid_elevator_trajectory_marker_ball_loop", - "802f0168" : "bhv_pyramid_top_init", - "802f0288" : "bhv_pyramid_top_spinning", - "802f04a0" : "bhv_pyramid_top_explode", - "802f05b4" : "bhv_pyramid_top_loop", - "802f06a8" : "bhv_pyramid_top_fragment_init", - "802f0714" : "bhv_pyramid_top_fragment_loop", - "802f0788" : "bhv_pyramid_pillar_touch_detector_loop", - "802f07f4" : "bhv_waterfall_sound_loop", - "802f0820" : "bhv_volcano_sound_loop", - "802f084c" : "bhv_castle_flag_init", - "802f0898" : "bhv_birds_sound_loop", - "802f0950" : "bhv_ambient_sounds_init", - "802f09a4" : "bhv_sand_sound_loop", - "802f09f0" : "bhv_castle_cannon_grate_init", - "802f0a40" : "bhv_snowmans_bottom_init", - "802f0b7c" : "set_rolling_sphere_hitbox", - "802f0bd4" : "adjust_rolling_face_pitch", - "802f0c94" : "snowmans_bottom_act_1", - "802f0df0" : "snowmans_bottom_act_2", - "802f0fa8" : "snowmans_bottom_act_3", - "802f105c" : "bhv_snowmans_bottom_loop", - "802f120c" : "bhv_snowmans_head_init", - "802f1370" : "bhv_snowmans_head_loop", - "802f151c" : "bhv_snowmans_body_checkpoint_loop", - "802f15a8" : "bhv_big_boulder_init", - "802f162c" : "boulder_act_1", - "802f1714" : "bhv_big_boulder_loop", - "802f17f0" : "bhv_big_boulder_generator_loop", - "802f1954" : "cap_set_hitbox", - "802f19c8" : "cap_despawn", - "802f1a10" : "cap_check_quicksand", - "802f1bb8" : "cap_sink_quicksand", - "802f1d64" : "bhv_wing_cap_init", - "802f1dc0" : "cap_scale_vertically", - "802f1e5c" : "wing_vanish_cap_act_0", - "802f1f3c" : "bhv_wing_vanish_cap_loop", - "802f1fd0" : "bhv_metal_cap_init", - "802f2030" : "metal_cap_act_0", - "802f20ac" : "bhv_metal_cap_loop", - "802f2140" : "bhv_normal_cap_init", - "802f21e0" : "normal_cap_set_save_flags", - "802f2284" : "normal_cap_act_0", - "802f23a8" : "bhv_normal_cap_loop", - "802f2498" : "bhv_vanish_cap_init", - "802f24f4" : "bhv_collect_star_init", - "802f25b0" : "bhv_collect_star_loop", - "802f2614" : "bhv_star_spawn_init", - "802f2768" : "bhv_star_spawn_loop", - "802f2aa0" : "spawn_star", - "802f2b88" : "spawn_default_star", - "802f2bd4" : "spawn_red_coin_cutscene_star", - "802f2c24" : "spawn_no_exit_star", - "802f2c84" : "bhv_hidden_red_coin_star_init", - "802f2d8c" : "bhv_hidden_red_coin_star_loop", - "802f2e6c" : "bhv_red_coin_init", - "802f2f2c" : "bhv_red_coin_loop", - "802f3014" : "bhv_hidden_star_init", - "802f30f0" : "bhv_hidden_star_loop", - "802f31bc" : "bhv_hidden_star_trigger_loop", - "802f328c" : "bhv_bowser_course_red_coin_star_loop", - "802f336c" : "bhv_ttm_rolling_log_init", - "802f341c" : "rolling_log_roll_log", - "802f36a4" : "bhv_rolling_log_loop", - "802f38b0" : "volcano_act_1", - "802f39b4" : "volcano_act_3", - "802f3a30" : "bhv_volcano_trap_loop", - "802f3b98" : "bhv_lll_rolling_log_init", - "802f3c54" : "bhv_1up_interact", - "802f3cc8" : "bhv_1up_common_init", - "802f3d30" : "bhv_1up_init", - "802f3dd0" : "one_up_loop_in_air", - "802f3ea8" : "pole_1up_move_towards_mario", - "802f401c" : "one_up_move_away_from_mario", - "802f40cc" : "bhv_1up_walking_loop", - "802f4248" : "bhv_1up_running_away_loop", - "802f43b8" : "sliding_1up_move", - "802f44c0" : "bhv_1up_sliding_loop", - "802f45b8" : "bhv_1up_loop", - "802f45f0" : "bhv_1up_jump_on_approach_loop", - "802f4710" : "bhv_1up_hidden_loop", - "802f48f4" : "bhv_1up_hidden_trigger_loop", - "802f496c" : "bhv_1up_hidden_in_pole_loop", - "802f4b00" : "bhv_1up_hidden_in_pole_trigger_loop", - "802f4b78" : "bhv_1up_hidden_in_pole_spawner_loop", - "802f4c68" : "controllable_platform_act_1", - "802f4ce0" : "controllable_platform_act_2", - "802f4d78" : "bhv_controllable_platform_sub_loop", - "802f4eb4" : "bhv_controllable_platform_init", - "802f5010" : "controllable_platform_hit_wall", - "802f5068" : "controllable_platform_check_walls", - "802f52c0" : "controllable_platform_shake_on_wall_hit", - "802f547c" : "controllable_platform_tilt_from_mario", - "802f55a4" : "bhv_controllable_platform_loop", - "802f5cd4" : "bhv_breakable_box_small_init", - "802f5d78" : "small_breakable_box_spawn_dust", - "802f5e44" : "small_breakable_box_act_move", - "802f5f48" : "breakable_box_small_released_loop", - "802f6014" : "breakable_box_small_idle_loop", - "802f60d8" : "breakable_box_small_get_dropped", - "802f6150" : "breakable_box_small_get_thrown", - "802f6228" : "bhv_breakable_box_small_loop", - "802f62e4" : "bhv_sliding_snow_mound_loop", - "802f6448" : "bhv_snow_mound_spawn_loop", - "802f6588" : "floating_platform_find_home_y", - "802f665c" : "floating_platform_act_0", - "802f6984" : "bhv_floating_platform_loop", - "802f6c0c" : "bhv_arrow_lift_loop", - "802f6d20" : "bhv_orange_number_init", - "802f6d58" : "bhv_orange_number_loop", - "802f6e40" : "bhv_manta_ray_init", - "802f6eb0" : "manta_ray_move", - "802f7068" : "manta_ray_act_spawn_ring", - "802f7264" : "bhv_manta_ray_loop", - "802f7348" : "bhv_falling_pillar_init", - "802f7398" : "bhv_falling_pillar_spawn_hitboxes", - "802f7418" : "bhv_falling_pillar_calculate_angle_in_front_of_mario", - "802f74dc" : "bhv_falling_pillar_loop", - "802f7760" : "bhv_falling_pillar_hitbox_loop", - "802f7924" : "bhv_jrb_floating_box_loop", - "802f7978" : "bhv_decorative_pendulum_init", - "802f79b0" : "bhv_decorative_pendulum_loop", - "802f7a58" : "bhv_treasure_chest_top_loop", - "802f7c9c" : "bhv_treasure_chest_bottom_init", - "802f7d04" : "bhv_treasure_chest_bottom_loop", - "802f7f1c" : "spawn_treasure_chest", - "802f7fa0" : "bhv_treasure_chest_ship_init", - "802f8044" : "bhv_treasure_chest_ship_loop", - "802f8158" : "bhv_treasure_chest_jrb_init", - "802f8208" : "bhv_treasure_chest_jrb_loop", - "802f82f8" : "bhv_treasure_chest_init", - "802f83a4" : "bhv_treasure_chest_loop", - "802f8490" : "bhv_mips_init", - "802f85e0" : "bhv_mips_find_furthest_waypoint_to_mario", - "802f8760" : "bhv_mips_act_wait_for_nearby_mario", - "802f8808" : "bhv_mips_act_follow_path", - "802f893c" : "bhv_mips_act_wait_for_animation_done", - "802f8988" : "bhv_mips_act_fall_down", - "802f8a34" : "bhv_mips_act_idle", - "802f8ab4" : "bhv_mips_free", - "802f8b54" : "bhv_mips_held", - "802f8c74" : "bhv_mips_dropped", - "802f8cf8" : "bhv_mips_thrown", - "802f8dac" : "bhv_mips_loop", - "802f8e54" : "bhv_yoshi_init", - "802f8f08" : "yoshi_walk_loop", - "802f9054" : "yoshi_idle_loop", - "802f923c" : "yoshi_talk_loop", - "802f93a8" : "yoshi_walk_and_jump_off_roof_loop", - "802f9500" : "yoshi_finish_jumping_and_despawn_loop", - "802f95ac" : "yoshi_give_present_loop", - "802f965c" : "bhv_yoshi_loop", - "802fbc4c" : "bhv_koopa_init", - "802fc414" : "shelled_koopa_attack_handler", - "802fcc00" : "obj_begin_race", - "802fd7f8" : "bhv_koopa_update", - "802fd950" : "bhv_koopa_race_endpoint_update", - "802fda28" : "bhv_pokey_body_part_update", - "802fe3b0" : "bhv_pokey_update", - "802fe8b4" : "bhv_swoop_update", - "802ff040" : "bhv_fly_guy_update", - "802ff214" : "bhv_goomba_triplet_spawner_update", - "802ff408" : "bhv_goomba_init", - "802ff94c" : "huge_goomba_weakly_attacked", - "802ff96c" : "bhv_goomba_update", - "802ffb38" : "bhv_chain_chomp_chain_part_update", - "80300e40" : "bhv_chain_chomp_update", - "80300ecc" : "bhv_wooden_post_update", - "80301148" : "bhv_chain_chomp_gate_init", - "80301180" : "bhv_chain_chomp_gate_update", - "80301210" : "bhv_wiggler_body_part_update", - "803014cc" : "wiggler_init_segments", - "803016e0" : "wiggler_update_segments", - "803020e4" : "wiggler_jumped_on_attack_handler", - "80302154" : "bhv_wiggler_update", - "80302910" : "bhv_spiny_update", - "80303028" : "bhv_enemy_lakitu_update", - "8030369c" : "bhv_cloud_update", - "80303744" : "bhv_cloud_part_update", - "80303984" : "bhv_camera_lakitu_init", - "80303f64" : "bhv_camera_lakitu_update", - "803043f8" : "bhv_monty_mole_hole_update", - "80304474" : "monty_mole_spawn_dirt_particles", - "803044c0" : "bhv_monty_mole_init", - "80304ba8" : "bhv_monty_mole_update", - "80304fd4" : "bhv_monty_mole_rock_update", - "80305100" : "bhv_platform_on_track_init", - "80305a58" : "bhv_platform_on_track_update", - "80305bb0" : "bhv_track_ball_update", - "80305c14" : "bhv_seesaw_platform_init", - "80305c90" : "bhv_seesaw_platform_update", - "80305e2c" : "bhv_ferris_wheel_axle_init", - "80305f24" : "bhv_ferris_wheel_platform_update", - "80306084" : "bhv_water_bomb_spawner_update", - "803062a8" : "water_bomb_spawn_explode_particles", - "803067e8" : "bhv_water_bomb_update", - "803068c0" : "bhv_water_bomb_shadow_update", - "8030699c" : "bhv_ttc_rotating_solid_init", - "80306a38" : "bhv_ttc_rotating_solid_update", - "80306cc4" : "bhv_ttc_pendulum_init", - "80306d38" : "bhv_ttc_pendulum_update", - "80306f48" : "bhv_ttc_treadmill_init", - "80307010" : "bhv_ttc_treadmill_update", - "803071b8" : "bhv_ttc_moving_bar_init", - "80307670" : "bhv_ttc_moving_bar_update", - "80307760" : "bhv_ttc_cog_init", - "803077e0" : "bhv_ttc_cog_update", - "80307930" : "bhv_ttc_pit_block_init", - "803079c8" : "bhv_ttc_pit_block_update", - "80307ae4" : "bhv_ttc_elevator_init", - "80307b58" : "bhv_ttc_elevator_update", - "80307c88" : "bhv_ttc_2d_rotator_init", - "80307cf8" : "bhv_ttc_2d_rotator_update", - "80307ea4" : "bhv_ttc_spinner_update", - "80307fb8" : "mr_blizzard_spawn_white_particles", - "8030803c" : "bhv_mr_blizzard_init", - "80308d6c" : "bhv_mr_blizzard_update", - "80309154" : "bhv_mr_blizzard_snowball", - "803091e0" : "bhv_sliding_plat_2_init", - "80309354" : "bhv_sliding_plat_2_loop", - "80309454" : "bhv_rotating_octagonal_plat_init", - "803094d0" : "bhv_rotating_octagonal_plat_loop", - "803094f8" : "bhv_animates_on_floor_switch_press_init", - "80309530" : "bhv_animates_on_floor_switch_press_loop", - "803097a4" : "bhv_activated_back_and_forth_platform_init", - "803098c0" : "bhv_activated_back_and_forth_platform_update", - "80309b64" : "bhv_recovery_heart_loop", - "80309cec" : "bhv_bubble_cannon_barrel_loop", - "80309ed4" : "water_bomb_cannon_act_0", - "80309f68" : "water_bomb_cannon_act_1", - "8030a0e8" : "water_bomb_cannon_act_2", - "8030a11c" : "bhv_water_bomb_cannon_loop", - "8030a1c0" : "bhv_unagi_init", - "8030a2a8" : "unagi_act_0", - "8030a390" : "unagi_act_1_4", - "8030a514" : "unagi_act_2", - "8030a614" : "unagi_act_3", - "8030a93c" : "bhv_unagi_loop", - "8030aabc" : "bhv_unagi_subobject_loop", - "8030ad04" : "dorrie_raise_head", - "8030ae9c" : "dorrie_act_move", - "8030b0b8" : "dorrie_begin_head_raise", - "8030b0f0" : "dorrie_act_lower_head", - "8030b220" : "dorrie_act_raise_head", - "8030b2f4" : "bhv_dorrie_update", - "8030b658" : "bhv_haunted_chair_init", - "8030b6d8" : "haunted_chair_act_0", - "8030ba68" : "haunted_chair_act_1", - "8030bc90" : "bhv_haunted_chair_loop", - "8030bfd0" : "bhv_mad_piano_update", - "8030c06c" : "flying_bookend_act_0", - "8030c0f0" : "flying_bookend_act_1", - "8030c210" : "flying_bookend_act_2", - "8030c2c8" : "flying_bookend_act_3", - "8030c364" : "bhv_flying_bookend_loop", - "8030c4b0" : "bhv_bookend_spawn_loop", - "8030c564" : "bookshelf_manager_act_0", - "8030c60c" : "bookshelf_manager_act_1", - "8030c6a4" : "bookshelf_manager_act_2", - "8030c828" : "bookshelf_manager_act_3", - "8030c894" : "bookshelf_manager_act_4", - "8030c8ec" : "bhv_haunted_bookshelf_manager_loop", - "8030c98c" : "bhv_book_switch_loop", - "8030cd30" : "obj_spit_fire", - "8030cddc" : "bhv_fire_piranha_plant_init", - "8030d2f0" : "bhv_fire_piranha_plant_update", - "8030d598" : "bhv_fire_spitter_update", - "8030d640" : "bhv_small_piranha_flame_loop", - "8030d8d4" : "bhv_fly_guy_flame_loop", - "8030d93c" : "geo_snufit_move_mask", - "8030d9ac" : "geo_snufit_scale_body", - "8030da14" : "snufit_act_idle", - "8030db38" : "snufit_act_shoot", - "8030dc70" : "bhv_snufit_loop", - "8030dfc4" : "bhv_snufit_balls_loop", - "8030e14c" : "bhv_horizontal_grindel_init", - "8030e16c" : "bhv_horizontal_grindel_update", - "8030ea9c" : "bhv_eyerok_boss_loop", - "8030fff8" : "bhv_eyerok_hand_loop", - "80310498" : "bhv_klepto_init", - "8031126c" : "obj_set_speed_to_zero", - "8031129c" : "bhv_klepto_update", - "80311874" : "bhv_bird_update", - "803118e4" : "bhv_racing_penguin_init", - "80312070" : "bhv_racing_penguin_update", - "80312168" : "bhv_penguin_race_finish_line_update", - "80312200" : "bhv_penguin_race_shortcut_check_update", - "80312248" : "bhv_coffin_spawner_loop", - "80312370" : "coffin_act_idle", - "8031262c" : "coffin_act_stand_up", - "8031274c" : "bhv_coffin_loop", - "80312804" : "clam_act_0", - "80312900" : "clam_act_1", - "80312a54" : "bhv_clam_loop", - "80313110" : "bhv_skeeter_update", - "803131e8" : "bhv_skeeter_wave_update", - "8031326c" : "bhv_swing_platform_init", - "80313294" : "bhv_swing_platform_update", - "80313354" : "bhv_donut_platform_spawner_update", - "80313530" : "bhv_donut_platform_update", - "803136cc" : "bhv_ddd_pole_init", - "80313754" : "bhv_ddd_pole_update", - "803137f4" : "bhv_red_coin_star_marker_init", - "80313fc0" : "bhv_triplet_butterfly_update", - "80314098" : "bubba_act_0", - "8031427c" : "bubba_act_1", - "803145d4" : "bhv_bubba_loop", - "80314a30" : "prepare_reverb_ring_buffer", - "80314cc0" : "get_volume_ramping", - "80314de4" : "synthesis_execute", - "80314f64" : "synthesis_do_one_audio_update", - "80315590" : "synthesis_process_notes", - "80316010" : "load_wave_samples", - "803160dc" : "final_resample", - "80316138" : "process_envelope", - "8031619c" : "process_envelope_inner", - "803166fc" : "note_apply_headset_pan_effects", - "80316ac8" : "note_init_volume", - "80316af4" : "note_set_vel_pan_reverb", - "80316da8" : "note_set_frequency", - "80316db4" : "note_enable", - "80316e00" : "note_disable", - "80316e80" : "reset_bank_and_seq_load_status", - "80316ec4" : "discard_bank", - "80316fb4" : "discard_sequence", - "80317040" : "soundAlloc", - "803170b4" : "sound_alloc_pool_init", - "803170d4" : "persistent_pool_clear", - "803170e8" : "temporary_pool_clear", - "80317118" : "unused_803160F8", - "80317128" : "sound_init_main_pools", - "80317184" : "session_pools_init", - "80317200" : "seq_and_bank_pool_init", - "8031727c" : "persistent_pools_init", - "80317338" : "temporary_pools_init", - "803173fc" : "alloc_bank_or_seq", - "8031782c" : "get_bank_or_seq", - "803178ec" : "decrease_reverb_gain", - "80317914" : "wait_for_audio_frames", - "80317948" : "audio_reset_session", - "80318040" : "audio_dma_copy_immediate", - "803180c4" : "audio_dma_copy_async", - "80318130" : "audio_dma_partial_copy_async", - "803181ec" : "decrease_sample_dma_ttls", - "80318300" : "dma_sample_data", - "80318634" : "init_sample_dma_buffers", - "803188f4" : "patch_audio_bank", - "80318b30" : "bank_load_immediate", - "80318c8c" : "bank_load_async", - "80318dc4" : "sequence_dma_immediate", - "80318e70" : "sequence_dma_async", - "80318fac" : "get_missing_bank", - "803190f4" : "load_banks_immediate", - "80319220" : "preload_sequence", - "80319328" : "load_sequence", - "80319388" : "load_sequence_internal", - "8031950c" : "audio_init", - "80319920" : "note_init", - "80319998" : "note_disable2", - "803199b8" : "process_notes", - "80319db8" : "seq_channel_layer_decay_release_internal", - "80319f64" : "seq_channel_layer_note_decay", - "80319f84" : "seq_channel_layer_note_release", - "80319fa4" : "build_synthetic_wave", - "8031a1d0" : "init_synthetic_wave", - "8031a254" : "init_note_list", - "8031a264" : "init_note_lists", - "8031a2b4" : "init_note_free_list", - "8031a368" : "note_pool_clear", - "8031a494" : "note_pool_fill", - "8031a5d0" : "audio_list_push_front", - "8031a610" : "audio_list_remove", - "8031a63c" : "pop_node_with_lower_prio", - "8031a6cc" : "note_init_for_layer", - "8031a794" : "func_80319728", - "8031a7c8" : "note_release_and_take_ownership", - "8031a820" : "alloc_note_from_disabled", - "8031a89c" : "alloc_note_from_decaying", - "8031a8f0" : "alloc_note_from_active", - "8031a94c" : "alloc_note", - "8031ac34" : "reclaim_notes", - "8031adac" : "note_init_all", - "8031aee8" : "sequence_player_process_sound", - "8031b0cc" : "get_portamento_freq_scale", - "8031b1c0" : "get_vibrato_pitch_change", - "8031b248" : "get_vibrato_freq_scale", - "8031b440" : "note_vibrato_update", - "8031b4a0" : "note_vibrato_init", - "8031b58c" : "adsr_init", - "8031b5ac" : "adsr_update", - "8031b830" : "sequence_channel_init", - "8031b940" : "seq_channel_set_layer", - "8031ba30" : "seq_channel_layer_disable", - "8031ba6c" : "seq_channel_layer_free", - "8031baf0" : "sequence_channel_disable", - "8031bb5c" : "allocate_sequence_channel", - "8031bba4" : "sequence_player_init_channels", - "8031bcd0" : "sequence_player_disable_channels", - "8031bda0" : "sequence_channel_enable", - "8031be44" : "sequence_player_disable", - "8031bf14" : "audio_list_push_back", - "8031bf54" : "audio_list_pop_back", - "8031bf94" : "init_layer_freelist", - "8031c03c" : "m64_read_u8", - "8031c050" : "m64_read_s16", - "8031c080" : "m64_read_compressed_u16", - "8031c0c4" : "seq_channel_layer_process_script", - "8031c200" : "L8031C200", - "8031c23c" : "L8031C23C", - "8031c298" : "L8031C298", - "8031c2dc" : "L8031C2DC", - "8031c328" : "L8031C328", - "8031c36c" : "L8031C36C", - "8031c3bc" : "L8031C3BC", - "8031c3e8" : "L8031C3E8", - "8031c454" : "L8031C454", - "8031c4a4" : "L8031C4A4", - "8031c5c8" : "L8031C5C8", - "8031c698" : "L8031C698", - "8031c6a0" : "L8031C6A0", - "8031cbe0" : "L8031CBE0", - "8031cbec" : "L8031CBEC", - "8031ce54" : "get_instrument", - "8031cfd4" : "set_instrument", - "8031d068" : "sequence_channel_set_volume", - "8031d08c" : "sequence_channel_process_script", - "8031d144" : "L_U_8031D144", - "8031d1f8" : "L_U_8031D1F8", - "8031d234" : "L_U_8031D234", - "8031d26c" : "L_U_8031D26C", - "8031d2b4" : "L_U_8031D2B4", - "8031d2c4" : "L_U_8031D2C4", - "8031d31c" : "L_U_8031D31C", - "8031d344" : "L_U_8031D344", - "8031d354" : "L_U_8031D354", - "8031d370" : "L_U_8031D370", - "8031d3a8" : "L_U_8031D3A8", - "8031d3c4" : "L_U_8031D3C4", - "8031d3d4" : "L_U_8031D3D4", - "8031d3e4" : "L_U_8031D3E4", - "8031d400" : "L_U_8031D400", - "8031d424" : "L_U_8031D424", - "8031d44c" : "L_U_8031D44C", - "8031d474" : "L_U_8031D474", - "8031d498" : "L_U_8031D498", - "8031d4bc" : "L_U_8031D4BC", - "8031d4d4" : "L_U_8031D4D4", - "8031d4f0" : "L_U_8031D4F0", - "8031d500" : "L_U_8031D500", - "8031d51c" : "L_U_8031D51C", - "8031d538" : "L_U_8031D538", - "8031d56c" : "L_U_8031D56C", - "8031d5a0" : "L_U_8031D5A0", - "8031d5b4" : "L_U_8031D5B4", - "8031d5d4" : "L_U_8031D5D4", - "8031d5e4" : "L_U_8031D5E4", - "8031d640" : "L_U_8031D640", - "8031d678" : "L_U_8031D678", - "8031d6c4" : "L_U_8031D6C4", - "8031d6d4" : "L_U_8031D6D4", - "8031d6f4" : "L_U_8031D6F4", - "8031d718" : "L_U_8031D718", - "8031d728" : "L_U_8031D728", - "8031d73c" : "L_U_8031D73C", - "8031d7b8" : "L_U_8031D7B8", - "8031d7e8" : "L_U_8031D7E8", - "8031d7f8" : "L_U_8031D7F8", - "8031d814" : "L_U_8031D814", - "8031d830" : "L_U_8031D830", - "8031d87c" : "L_U_8031D87C", - "8031d898" : "L_U_8031D898", - "8031d8f8" : "L_U_8031D8F8", - "8031d900" : "L_U_8031D900", - "8031d930" : "L_U_8031D930", - "8031d94c" : "L_U_8031D94C", - "8031d974" : "L_U_8031D974", - "8031d9ec" : "sequence_player_process_sequence", - "8031e240" : "process_sequences", - "8031e2e8" : "init_sequence_player", - "8031e374" : "init_sequence_players", - "8031e4f0" : "unused_8031E4F0", - "8031e568" : "unused_8031E568", - "8031e578" : "sequence_player_fade_out_internal", - "8031e5c0" : "func_8031D690", - "8031e60c" : "func_8031D6E4", - "8031e6a4" : "func_8031D7B0", - "8031e710" : "func_8031D838", - "8031e7b8" : "create_next_audio_frame_task", - "8031eb00" : "play_sound", - "8031eb30" : "process_sound_request", - "8031edec" : "process_all_sound_requests", - "8031ee70" : "func_8031DFE8", - "8031ef6c" : "func_8031E0E4", - "8031eff4" : "func_8031E16C", - "8031f810" : "get_sound_pan", - "8031f96c" : "get_sound_dynamics", - "8031fb20" : "get_sound_freq_scale", - "8031fbe8" : "get_sound_reverb", - "8031fd84" : "audio_signal_game_loop_tick", - "8031fdac" : "update_game_sound", - "80320544" : "play_sequence", - "80320678" : "sequence_player_fade_out", - "803206bc" : "fade_volume_scale", - "80320734" : "fade_channel_volume_scale", - "8032080c" : "func_8031F96C", - "803208ec" : "process_level_music_dynamics", - "80320a4c" : "L8031FBAC", - "80320a8c" : "L8031FBEC", - "80320acc" : "L8031FC2C", - "80320b0c" : "L8031FC6C", - "80320b4c" : "L8031FCAC", - "80320b8c" : "L8031FCEC", - "80320bcc" : "L8031FD2C", - "80320bf4" : "L8031FD54", - "80320d70" : "unused_8031FED0", - "80320e3c" : "func_8031FFB4", - "80320ec4" : "sequence_player_unlower", - "80320f68" : "func_803200E4", - "803210d4" : "set_sound_disabled", - "8032112c" : "sound_init", - "80321398" : "get_currently_playing_sound", - "80321474" : "func_803205E8", - "80321584" : "func_803206F8", - "8032171c" : "func_80320890", - "8032174c" : "sound_banks_disable", - "803217a8" : "disable_all_sequence_players", - "8032180c" : "sound_banks_enable", - "80321864" : "unused_803209D8", - "803218d8" : "func_80320A4C", - "803218f4" : "play_dialog_sound", - "803219ac" : "play_music", - "80321bac" : "stop_background_music", - "80321ce4" : "fadeout_background_music", - "80321d38" : "drop_queued_background_music", - "80321d5c" : "get_current_background_music", - "80321d9c" : "func_80320ED8", - "80321e48" : "play_secondary_music", - "80321f48" : "func_80321080", - "80321f9c" : "func_803210D4", - "80322078" : "play_course_clear", - "803220b4" : "play_peachs_jingle", - "803220f0" : "play_puzzle_jingle", - "8032212c" : "play_star_fanfare", - "80322168" : "play_power_star_jingle", - "803221b8" : "play_race_fanfare", - "803221f4" : "play_toads_jingle", - "80322230" : "sound_reset", - "8032231c" : "audio_set_sound_mode", - "80322348" : "unused_80321460", - "8032235c" : "unused_80321474", - "803223b0" : "osSetTime", - "803223e0" : "osMapTLB", - "803224a0" : "osUnmapTLBAll", - "803224f0" : "sprintf", - "8032255c" : "proutSprintf", - "803225a0" : "osCreateMesgQueue", - "803225d0" : "osSetEventMesg", - "80322640" : "osViSetEvent", - "803226b0" : "osCreateThread", - "80322800" : "osRecvMesg", - "80322940" : "_VirtualToPhysicalTask", - "80322a5c" : "osSpTaskLoad", - "80322bbc" : "osSpTaskStartGo", - "80322c00" : "osSpTaskYield", - "80322c20" : "osSendMesg", - "80322d70" : "osSpTaskYielded", - "80322df0" : "osStartThread", - "80322f40" : "osWritebackDCacheAll", - "80322f70" : "osCreateViManager", - "803230f4" : "viMgrMain", - "803232d0" : "osViSetMode", - "80323340" : "osViBlack", - "803233b0" : "osViSetSpecialFeatures", - "80323570" : "osCreatePiManager", - "803236f0" : "osSetThreadPri", - "803237d0" : "osInitialize", - "80323a00" : "osViSwapBuffer", - "80323a50" : "sqrtf", - "80323a60" : "osContStartReadData", - "80323b24" : "osContGetReadData", - "80323bcc" : "__osPackReadData", - "80323cc0" : "osContInit", - "80323ebc" : "__osContGetInitData", - "80323f8c" : "__osPackRequestData", - "80324080" : "osEepromProbe", - "803240f0" : "__ull_rshift", - "8032411c" : "__ull_rem", - "80324158" : "__ull_div", - "80324194" : "__ll_lshift", - "803241c0" : "__ll_rem", - "803241fc" : "__ll_div", - "80324258" : "__ll_mul", - "80324288" : "__ull_divremi", - "803242e8" : "__ll_mod", - "80324384" : "__ll_rshift", - "803243b0" : "osInvalDCache", - "80324460" : "osPiStartDma", - "80324570" : "bzero", - "80324610" : "osInvalICache", - "80324690" : "osEepromLongRead", - "803247d0" : "osEepromLongWrite", - "80324910" : "bcopy", - "80324c20" : "guOrthoF", - "80324d74" : "guOrtho", - "80324de0" : "guPerspectiveF", - "80325010" : "guPerspective", - "80325070" : "osGetTime", - "80325100" : "__d_to_ll", - "8032511c" : "__f_to_ll", - "80325138" : "__d_to_ull", - "803251d8" : "__f_to_ull", - "80325274" : "__ll_to_d", - "8032528c" : "__ll_to_f", - "803252a4" : "__ull_to_d", - "803252d8" : "__ull_to_f", - "80325310" : "cosf", - "80325480" : "sinf", - "80325640" : "guTranslateF", - "80325688" : "guTranslate", - "803256e0" : "guRotateF", - "80325874" : "guRotate", - "803258d0" : "guScaleF", - "80325924" : "guScale", - "80325970" : "osAiSetFrequency", - "80325bd4" : "alBnkfNew", - "80325cd8" : "alSeqFileNew", - "80325d20" : "osWritebackDCache", - "80325da0" : "osAiGetLength", - "80325db0" : "osAiSetNextBuffer", - "80325e60" : "__osTimerServicesInit", - "80325eec" : "__osTimerInterrupt", - "80326064" : "__osSetTimerIntr", - "803260d8" : "__osInsertTimer", - "80326260" : "_Printf", - "803273f0" : "memcpy", - "8032741c" : "strlen", - "80327444" : "strchr", - "80327490" : "__osDequeueThread", - "803274d0" : "__osDisableInt", - "803274f0" : "__osRestoreInt", - "80327510" : "__osViInit", - "80327640" : "__osExceptionPreamble", - "80327650" : "__osException", - "803278e4" : "L80326964", - "80327904" : "L80326984", - "80327938" : "L803269B8", - "80327a68" : "L80326AE8", - "80327ac4" : "L80326B44", - "80327ae4" : "L80326B64", - "80327b1c" : "L80326B9C", - "80327b68" : "L80326BE8", - "80327b98" : "send_mesg", - "80327c80" : "__osEnqueueAndYield", - "80327d10" : "__osEnqueueThread", - "80327d58" : "__osPopThread", - "80327d68" : "__osDispatchThread", - "80327ea8" : "__osCleanupThread", - "80327eb0" : "osVirtualToPhysical", - "80327f30" : "__osSpSetStatus", - "80327f40" : "__osSpSetPc", - "80327f80" : "__osSpRawStartDma", - "80328010" : "__osSpDeviceBusy", - "80328040" : "__osSpGetStatus", - "80328050" : "osGetThreadPri", - "80328070" : "__osViGetCurrentContext", - "80328080" : "__osViSwapContext", - "803283e0" : "osGetCount", - "803283f0" : "__osPiCreateAccessQueue", - "80328440" : "__osPiGetAccess", - "80328484" : "__osPiRelAccess", - "803284b0" : "osPiRawStartDma", - "80328590" : "__osDevMgrMain", - "80328710" : "__osSetSR", - "80328720" : "__osGetSR", - "80328730" : "__osSetFpcCsr", - "80328740" : "__osSiRawReadIo", - "80328790" : "__osSiRawWriteIo", - "803287e0" : "osMapTLBRdb", - "80328840" : "osPiRawReadIo", - "803288a0" : "__osSiCreateAccessQueue", - "803288f0" : "__osSiGetAccess", - "80328934" : "__osSiRelAccess", - "80328960" : "__osSiRawStartDma", - "80328a10" : "osSetTimer", - "80328af0" : "osEepromWrite", - "80328ca0" : "__osPackEepWriteData", - "80328dac" : "__osEepStatus", - "80328fd0" : "osJamMesg", - "80329120" : "osPiGetCmdQueue", - "80329150" : "osEepromRead", - "80329340" : "__osPackEepReadData", - "80329450" : "guMtxF2L", - "80329550" : "guMtxIdentF", - "803295d8" : "guMtxIdent", - "80329608" : "guMtxL2F", - "803296c0" : "guNormalize", - "80329750" : "__osAiDeviceBusy", - "80329780" : "__osSetCompare", - "80329790" : "_Litob", - "80329a90" : "_Ldtob", - "8032a860" : "u32_to_string", - "8032a890" : "string_to_u32", - "8032a8e8" : "send_packet", - "8032a9a8" : "send", - "8032aa80" : "process_command_memory", - "8032aacc" : "process_command_register", - "8032aaf8" : "kdebugserver", - "8032ace0" : "__osSyncPutChars", - "8032ae10" : "osSetIntMask", - "8032ae70" : "osDestroyThread", - "8032af70" : "__osProbeTLB", - "8032b030" : "__osSiDeviceBusy", - "8032b060" : "lldiv", - "8032b160" : "ldiv", - "8032b1f0" : "__osGetCause", - "8032b200" : "__osAtomicDec", - "8032b260" : "rspF3DBootStart", - "8032b330" : "rspF3DBootEnd", - "8032b330" : "rspF3DStart", - "8032c738" : "rspF3DEnd", - "8032c740" : "rspAspMainStart", - "8032d560" : "rspAspMainEnd", - "8032d560" : "gVblankHandler1", - "8032d564" : "gVblankHandler2", - "8032d568" : "gActiveSPTask", - "8032d56c" : "sCurrentAudioSPTask", - "8032d570" : "sCurrentDisplaySPTask", - "8032d574" : "sNextAudioSPTask", - "8032d578" : "sNextDisplaySPTask", - "8032d57c" : "sAudioEnabled", - "8032d580" : "sNumVblanks", - "8032d584" : "gResetTimer", - "8032d588" : "D_8032C648", - "8032d58c" : "gDebugLevelSelect", - "8032d590" : "D_8032C650", - "8032d594" : "gShowProfiler", - "8032d598" : "gShowDebugText", - "8032d5d0" : "unused8032C690", - "8032d5d4" : "gGlobalTimer", - "8032d5dc" : "frameBufferIndex", - "8032d5e0" : "D_8032C6A0", - "8032d5e4" : "gPlayer1Controller", - "8032d5e8" : "gPlayer2Controller", - "8032d5ec" : "gPlayer3Controller", - "8032d5f0" : "gCurrDemoInput", - "8032d5f4" : "gDemoInputListID", - "8032d5f8" : "gRecordedDemoInput", - "8032d6d0" : "credits01", - "8032d6d8" : "credits02", - "8032d6e4" : "credits03", - "8032d6f0" : "credits04", - "8032d700" : "credits05", - "8032d710" : "credits06", - "8032d71c" : "credits07", - "8032d728" : "credits08", - "8032d738" : "credits09", - "8032d740" : "credits10", - "8032d750" : "credits11", - "8032d75c" : "credits12", - "8032d764" : "credits13", - "8032d774" : "credits14", - "8032d77c" : "credits15", - "8032d788" : "credits16", - "8032d79c" : "credits17", - "8032d7ac" : "credits18", - "8032d7bc" : "credits19", - "8032d7c4" : "credits20", - "8032d7cc" : "sCreditsSequence", - "8032d93c" : "gMarioState", - "8032d940" : "unused1", - "8032d944" : "sWarpCheckpointActive", - "8032daa0" : "sTerrainSounds", - "8032dacc" : "sSquishScaleOverTime", - "8032dae0" : "sCapFlickerFrames", - "8032daf8" : "gWaterSurfacePseudoFloor", - "8032dc50" : "sJumpLandAction", - "8032dc68" : "sFreefallLandAction", - "8032dc80" : "sSideFlipLandAction", - "8032dc98" : "sHoldJumpLandAction", - "8032dcb0" : "sHoldFreefallLandAction", - "8032dcc8" : "sLongJumpLandAction", - "8032dce0" : "sDoubleJumpLandAction", - "8032dcf8" : "sTripleJumpLandAction", - "8032dd10" : "sBackflipLandAction", - "8032dd40" : "sPunchingForwardVelocities", - "8032dd80" : "gLastCompletedCourseNum", - "8032dd84" : "gLastCompletedStarNum", - "8032dd88" : "sUnusedGotGlobalCoinHiScore", - "8032dd8c" : "gGotFileCoinHiScore", - "8032dd90" : "gCurrCourseStarFlags", - "8032dd94" : "gSpecialTripleJump", - "8032dd98" : "gLevelToCourseNumTable", - "8032ddc0" : "gMarioSpawnInfo", - "8032ddc4" : "gLoadedGraphNodes", - "8032ddc8" : "gAreas", - "8032ddcc" : "gCurrentArea", - "8032ddd0" : "gCurrCreditsEntry", - "8032ddd4" : "D_8032CE74", - "8032ddd8" : "D_8032CE78", - "8032dddc" : "gWarpTransDelay", - "8032dde0" : "gFBSetColor", - "8032dde4" : "gWarpTransFBSetColor", - "8032dde8" : "gWarpTransRed", - "8032ddec" : "gWarpTransGreen", - "8032ddf0" : "gWarpTransBlue", - "8032ddf4" : "gCurrSaveFileNum", - "8032ddf8" : "gCurrLevelNum", - "8032ddfc" : "sWarpBhvSpawnTable", - "8032de4c" : "sSpawnTypeFromWarpBhv", - "8032de60" : "D_8032CF00", - "8032de70" : "renderModeTable_1Cycle", - "8032deb0" : "renderModeTable_2Cycle", - "8032def0" : "gCurGraphNodeRoot", - "8032def4" : "gCurGraphNodeMasterList", - "8032def8" : "gCurGraphNodeCamFrustum", - "8032defc" : "gCurGraphNodeCamera", - "8032df00" : "gCurGraphNodeObject", - "8032df04" : "gCurGraphNodeHeldObject", - "8032df08" : "gAreaUpdateCounter", - "8032df10" : "gProfilerMode", - "8032df14" : "gCurrentFrameIndex1", - "8032df18" : "gCurrentFrameIndex2", - "8032df20" : "unused8032CFC0", - "8032df24" : "gCutsceneFocus", - "8032df28" : "unused8032CFC8", - "8032df2c" : "unused8032CFCC", - "8032df30" : "gSecondCameraFocus", - "8032df34" : "sYawSpeed", - "8032df38" : "gCurrLevelArea", - "8032df3c" : "gPrevLevel", - "8032df40" : "unused8032CFE0", - "8032df44" : "unused8032CFE4", - "8032df48" : "unused8032CFE8", - "8032df4c" : "gCameraZoomDist", - "8032df50" : "sObjectCutscene", - "8032df54" : "gRecentCutscene", - "8032df58" : "sFramesSinceCutsceneEnded", - "8032df5c" : "sCutsceneDialogResponse", - "8032df60" : "sMarioCamState", - "8032df64" : "sLuigiCamState", - "8032df68" : "unused8032D008", - "8032df6c" : "sFixedModeBasePosition", - "8032df78" : "sUnusedModeBasePosition_2", - "8032df84" : "sUnusedModeBasePosition_3", - "8032df90" : "sUnusedModeBasePosition_4", - "8032df9c" : "sUnusedModeBasePosition_5", - "8032dfa8" : "sModeTransitions", - "8032e008" : "unused8032D0A8", - "8032e010" : "unused8032D0B0", - "8032e018" : "sDanceCutsceneTable", - "8032e024" : "unusedDanceInfo1", - "8032e038" : "unusedDanceType", - "8032e03c" : "unusedDanceInfo2", - "8032e050" : "sBBHLibraryParTrackPath", - "8032e098" : "sCamSL", - "8032e0e0" : "sCamTHI", - "8032e128" : "sCamHMC", - "8032e1d0" : "sCamSSL", - "8032e248" : "sCamRR", - "8032e2f0" : "sCamBOB", - "8032e338" : "sCamCotMC", - "8032e368" : "sCamCCM", - "8032e3b0" : "sCamCastle", - "8032e6f8" : "sCamBBH", - "8032ecb0" : "sCameraTriggers", - "8032ed50" : "sIntroStartToPipePosition", - "8032ee08" : "sIntroStartToPipeFocus", - "8032eec0" : "sIntroPipeToDialogPosition", - "8032ef30" : "sIntroPipeToDialogFocus", - "8032efa0" : "sEndingFlyToWindowPos", - "8032eff0" : "sEndingFlyToWindowFocus", - "8032f048" : "sEndingPeachDescentCamPos", - "8032f0e8" : "sEndingMarioToPeachPos", - "8032f130" : "sEndingMarioToPeachFocus", - "8032f178" : "sEndingLookUpAtCastle", - "8032f1b8" : "sEndingLookAtSkyFocus", - "8032f214" : "gIntroLakituStartToPipeFocus", - "8032f32c" : "gIntroLakituStartToPipeOffsetFromCamera", - "8032f444" : "gEndWavingPos", - "8032f48c" : "gEndWavingFocus", - "8032f4d4" : "sCutsceneEnding", - "8032f534" : "sCutsceneGrandStar", - "8032f544" : "sCutsceneUnused", - "8032f554" : "sCutsceneDoorWarp", - "8032f564" : "sCutsceneEndWaving", - "8032f56c" : "sCutsceneCredits", - "8032f574" : "sCutsceneDoorPull", - "8032f59c" : "sCutsceneDoorPush", - "8032f5c4" : "sCutsceneDoorPullMode", - "8032f5dc" : "sCutsceneDoorPushMode", - "8032f5f4" : "sCutsceneEnterCannon", - "8032f60c" : "sCutsceneStarSpawn", - "8032f624" : "sCutsceneRedCoinStarSpawn", - "8032f634" : "sCutsceneEnterPainting", - "8032f63c" : "sCutsceneDeathExit", - "8032f64c" : "sCutsceneExitPaintingSuccess", - "8032f65c" : "sCutsceneUnusedExit", - "8032f674" : "sCutsceneIntroPeach", - "8032f69c" : "sCutscenePrepareCannon", - "8032f6ac" : "sCutsceneExitWaterfall", - "8032f6bc" : "sCutsceneFallToCastleGrounds", - "8032f6cc" : "sCutsceneEnterPyramidTop", - "8032f6dc" : "sCutscenePyramidTopExplode", - "8032f6f4" : "sCutsceneStandingDeath", - "8032f6fc" : "sCutsceneEnterPool", - "8032f70c" : "sCutsceneDeathStomach", - "8032f714" : "sCutsceneDeathOnBack", - "8032f71c" : "sCutsceneQuicksandDeath", - "8032f724" : "sCutsceneWaterDeath", - "8032f72c" : "sCutsceneSuffocation", - "8032f734" : "sCutsceneEnterBowserArena", - "8032f74c" : "sCutsceneDanceDefaultRotate", - "8032f754" : "sCutsceneDanceFlyAway", - "8032f75c" : "sCutsceneDanceCloseup", - "8032f764" : "sCutsceneKeyDance", - "8032f76c" : "sCutsceneCapSwitchPress", - "8032f774" : "sCutsceneSlidingDoorsOpen", - "8032f784" : "sCutsceneUnlockKeyDoor", - "8032f794" : "sCutsceneExitBowserSuccess", - "8032f7a4" : "sCutsceneExitBowserDeath", - "8032f7b4" : "sCutsceneExitSpecialSuccess", - "8032f7c4" : "sCutsceneNonPaintingDeath", - "8032f7d4" : "sCutsceneDialog", - "8032f7ec" : "sCutsceneReadMessage", - "8032f804" : "sDanceCutsceneIndexTable", - "8032f870" : "sZoomOutAreaMasks", - "8032f884" : "sBobCreditsSplinePositions", - "8032f8ac" : "sBobCreditsSplineFocus", - "8032f8d4" : "sWfCreditsSplinePositions", - "8032f8fc" : "sWfCreditsSplineFocus", - "8032f924" : "sJrbCreditsSplinePositions", - "8032f94c" : "sJrbCreditsSplineFocus", - "8032f974" : "sCcmSlideCreditsSplinePositions", - "8032f99c" : "sCcmSlideCreditsSplineFocus", - "8032f9c4" : "sBbhCreditsSplinePositions", - "8032f9e4" : "sBbhCreditsSplineFocus", - "8032fa04" : "sHmcCreditsSplinePositions", - "8032fa2c" : "sHmcCreditsSplineFocus", - "8032fa54" : "sThiWigglerCreditsSplinePositions", - "8032fa6c" : "sThiWigglerCreditsSplineFocus", - "8032fa84" : "sVolcanoCreditsSplinePositions", - "8032fab4" : "sVolcanoCreditsSplineFocus", - "8032fae4" : "sSslCreditsSplinePositions", - "8032fb14" : "sSslCreditsSplineFocus", - "8032fb44" : "sDddCreditsSplinePositions", - "8032fb7c" : "sDddCreditsSplineFocus", - "8032fbb4" : "sSlCreditsSplinePositions", - "8032fbd4" : "sSlCreditsSplineFocus", - "8032fbf4" : "sWdwCreditsSplinePositions", - "8032fc14" : "sWdwCreditsSplineFocus", - "8032fc34" : "sTtmCreditsSplinePositions", - "8032fc64" : "sTtmCreditsSplineFocus", - "8032fc94" : "sThiHugeCreditsSplinePositions", - "8032fccc" : "sThiHugeCreditsSplineFocus", - "8032fd04" : "sTtcCreditsSplinePositions", - "8032fd24" : "sTtcCreditsSplineFocus", - "8032fd44" : "sRrCreditsSplinePositions", - "8032fd64" : "sRrCreditsSplineFocus", - "8032fd84" : "sSaCreditsSplinePositions", - "8032fdac" : "sSaCreditsSplineFocus", - "8032fdd4" : "sCotmcCreditsSplinePositions", - "8032fdfc" : "sCotmcCreditsSplineFocus", - "8032fe24" : "sDddSubCreditsSplinePositions", - "8032fe4c" : "sDddSubCreditsSplineFocus", - "8032fe74" : "sCcmOutsideCreditsSplinePositions", - "8032fe94" : "sCcmOutsideCreditsSplineFocus", - "8032fec0" : "sObjectListUpdateOrder", - "8032fecc" : "sParticleTypes", - "80330000" : "D_8032F0A0", - "80330004" : "D_8032F0A4", - "80330020" : "D_8032F0C0", - "8033002c" : "D_8032F0CC", - "8033006c" : "sMrIParticleActions", - "80330074" : "sMrIActions", - "80330084" : "sMrIHitbox", - "80330094" : "D_8032F134", - "803300a8" : "unused8032F134", - "803300ac" : "sCapSwitchActions", - "803300bc" : "sKingBobombActions", - "803300e0" : "sKingBobombSoundStates", - "80330140" : "sOpenedCannonActions", - "8033015c" : "unused0EA1FC", - "80330198" : "sChuckyaActions", - "803301a8" : "sWFRotatingPlatformData", - "803301c0" : "sKoopaShellUnderwaterHitbox", - "803301d0" : "D_8032F270", - "803301e4" : "sSparkleSpawnStarHitbox", - "803301f4" : "sYellowCoinHitbox", - "80330204" : "D_8032F2A4", - "80330224" : "sCoinInsideBooActions", - "8033022c" : "D_8032F2CC", - "80330244" : "D_8032F2E4", - "80330260" : "D_8032F300", - "80330288" : "D_8032F328", - "80330290" : "D_8032F330", - "80330298" : "sGrindelThwompActions", - "803302ac" : "sTumblingBridgeParams", - "803302dc" : "sTumblingBridgeActions", - "803302ec" : "D_8032F38C", - "80330318" : "sElevatorActions", - "8033032c" : "D_8032F3CC", - "80330340" : "D_8032F3E0", - "80330354" : "D_8032F3F4", - "8033035c" : "D_8032F3FC", - "80330370" : "sUkikiCageActions", - "80330380" : "D_8032F420", - "80330390" : "sSpindriftHitbox", - "803303a0" : "sMetalBoxHitbox", - "803303b0" : "sBreakableBoxHitbox", - "803303c0" : "D_8032F460", - "803303e8" : "sHeaveHoActions", - "803303f8" : "sJumpingBoxHitbox", - "80330408" : "sJumpingBoxActions", - "8033042c" : "sBowserKeyHitbox", - "8033043c" : "sBulletBillActions", - "80330450" : "sBowserTailAnchorActions", - "8033045c" : "D_8032F4FC", - "8033046c" : "D_8032F50C", - "80330470" : "D_8032F510", - "80330474" : "D_8032F514", - "80330478" : "sBowserDefeatedDialogText", - "80330480" : "D_8032F520", - "803304c8" : "sBowserActions", - "80330518" : "D_8032F5B8", - "803305f0" : "D_8032F690", - "803305f4" : "D_8032F694", - "803305f8" : "D_8032F698", - "8033067c" : "sFallingBowserPlatformActions", - "80330688" : "sGrowingBowserFlameHitbox", - "80330698" : "sBowserFlameHitbox", - "803306a8" : "D_8032F748", - "803306b4" : "D_8032F754", - "80330738" : "sUkikiSoundStates", - "803307a0" : "sUkikiActions", - "803307c0" : "D_8032F860", - "803307f4" : "D_8032F894", - "80330828" : "D_8032F8C8", - "80330830" : "sRotatingCwFireBarsActions", - "80330840" : "sKoopaShellHitbox", - "80330850" : "D_8032F8F0", - "80330884" : "D_8032F924", - "803308a8" : "D_8032F948", - "803308cc" : "D_8032F96C", - "803308d8" : "sToxBoxActions", - "80330900" : "TablePiranhaPlantActions", - "80330b1c" : "sBowserPuzzlePieceActions", - "80330b38" : "sTuxiesMotherActions", - "80330b44" : "sSmallPenguinActions", - "80330b5c" : "sFishActions", - "80330b68" : "sFishGroupActions", - "80330b74" : "sBirdChirpChirpActions", - "80330b84" : "sCheepCheepActions", - "80330b90" : "sExclamationBoxHitbox", - "80330ba0" : "sExclamationBoxContents", - "80330c20" : "sExclamationBoxActions", - "80330c38" : "sSkullSlidingBoxHitbox", - "80330c48" : "gOpenableGrills", - "80330c58" : "sTweesterHitbox", - "80330c68" : "sTweesterActions", - "80330cd4" : "sScuttlebugHitbox", - "80330ce4" : "sWhompActions", - "80330d0c" : "sWaterSplashDropletParams", - "80330d30" : "gShallowWaterSplashDropletParams", - "80330d54" : "sWaterDropletFishParams", - "80330d78" : "gShallowWaterWaveDropletParams", - "80330d9c" : "sStrongWindParticleHitbox", - "80330dac" : "sSLWalkingPenguinErraticSteps", - "80330e20" : "D_8032FEC0", - "80330e24" : "unused_8032FEC4", - "80330e34" : "gMarioPlatform", - "80330e40" : "sDebugEffectStringInfo", - "80330e64" : "sDebugEnemyStringInfo", - "80330e88" : "sDebugInfoDPadMask", - "80330e8c" : "sDebugInfoDPadUpdID", - "80330e90" : "sDebugLvSelectCheckFlag", - "80330e94" : "sDebugPage", - "80330e98" : "sNoExtraDebug", - "80330e9c" : "sDebugStringArrPrinted", - "80330ea0" : "sDebugSysCursor", - "80330ea4" : "sDebugInfoButtonSeqID", - "80330ea8" : "sDebugInfoButtonSeq", - "80330ec0" : "sTransitionColorFadeCount", - "80330ec4" : "sTransitionTextureFadeCount", - "80330ec8" : "sTextureTransitionID", - "80330ee0" : "rectangles", - "80330f00" : "sSkyboxTextures", - "80330f28" : "sSkyboxColors", - "80330f30" : "gMovtexCounter", - "80330f34" : "gMovtexCounterPrev", - "80330f38" : "gMovtexVtxColor", - "80330f3c" : "gPaintingMarioYEntry", - "80330f40" : "gWdwWaterLevelSet", - "80330f44" : "gMovtexIdToTexture", - "80330f64" : "gMovtexNonColored", - "803311a4" : "gMovtexColored", - "8033127c" : "gMovtexColored2", - "80331300" : "sHmcPaintings", - "80331308" : "sInsideCastlePaintings", - "80331344" : "sTtmPaintings", - "8033134c" : "sPaintingGroups", - "80331358" : "gPaintingUpdateCounter", - "8033135c" : "gLastPaintingUpdateCounter", - "80331360" : "sTextLabelsCount", - "80331370" : "gDialogCharWidths", - "80331470" : "gDialogBoxState", - "80331474" : "gDialogBoxOpenTimer", - "80331478" : "gDialogBoxScale", - "8033147c" : "gDialogScrollOffsetY", - "80331480" : "gDialogBoxType", - "80331484" : "gDialogID", - "80331488" : "gLastDialogPageStrPos", - "8033148c" : "gDialogTextPos", - "80331490" : "gDialogLineNum", - "80331494" : "gLastDialogResponse", - "80331498" : "gMenuHoldKeyIndex", - "8033149c" : "gMenuHoldKeyTimer", - "803314a0" : "gDialogResponse", - "803314b0" : "gHudSymCoin", - "803314b4" : "gHudSymX", - "803314f8" : "gMenuMode", - "803314fc" : "gEndCutsceneStrEn0", - "80331504" : "gEndCutsceneStrEn1", - "80331538" : "gEndCutsceneStrEn2", - "80331558" : "gEndCutsceneStrEn3", - "8033156c" : "gEndCutsceneStrEn4", - "80331598" : "gEndCutsceneStrEn5", - "803315ac" : "gEndCutsceneStrEn6", - "803315cc" : "gEndCutsceneStrEn7", - "803315dc" : "gEndCutsceneStrEn8", - "803315e4" : "gEndCutsceneStringsEn", - "8033160c" : "gCutsceneMsgFade", - "80331610" : "gCutsceneMsgIndex", - "80331614" : "gCutsceneMsgDuration", - "80331618" : "gCutsceneMsgTimer", - "8033161c" : "gDialogCameraAngleIndex", - "80331620" : "gDialogCourseActNum", - "803316c8" : "gCourseCompleteCoinsEqual", - "803316cc" : "gCourseDoneMenuTimer", - "803316d0" : "gCourseCompleteCoins", - "803316d4" : "gHudFlash", - "80331750" : "gEnvFxMode", - "80331754" : "D_80330644", - "80331758" : "gSnowTempVtx", - "80331788" : "gSnowFlakeVertex1", - "80331790" : "gSnowFlakeVertex2", - "80331798" : "gSnowFlakeVertex3", - "803317a0" : "D_80330690", - "803317a4" : "D_80330694", - "803317a8" : "gBubbleTempVtx", - "803317e0" : "MacroObjectPresets", - "803325fc" : "sPowerMeterVisibleTimer", - "80332614" : "sPrevCheckMarioRoom", - "80332618" : "sYoshiDead", - "8033261c" : "sDebugSequenceTracker", - "80332620" : "sDebugTimer", - "803327a8" : "sBreakableBoxSmallHitbox", - "80332b00" : "sMrBlizzardHitbox", - "80332b24" : "sMrBlizzardSnowballHitbox", - "80332b34" : "D_80331A24", - "80332b54" : "D_80331A44", - "80332b5c" : "D_80331A4C", - "80332b64" : "D_80331A54", - "80332bdc" : "D_80331ACC", - "80332bf0" : "sRecoveryHeartHitbox", - "80332c00" : "sUnagiHitbox", - "80332c10" : "sHauntedChairHitbox", - "80332c30" : "sFlyingBookendHitbox", - "80332c40" : "D_80331B30", - "80332c4c" : "sBookSwitchHitbox", - "80332c5c" : "sFirePiranhaPlantHitbox", - "80332c6c" : "D_80331B5C", - "80332c74" : "sPiranhaPlantFireHitbox", - "80332c84" : "sSnufitHitbox", - "80332c94" : "sSnufitBulletHitbox", - "80332ca4" : "sEyerokHitbox", - "80332cb4" : "D_80331BA4", - "80332d10" : "coffinRelativePos", - "80332d28" : "sClamShellHitbox", - "80332d38" : "sSkeeterHitbox", - "80332d48" : "D_80331C38", - "80332e50" : "gAudioErrorFlags", - "80332e54" : "sGameLoopTicked", - "80332e58" : "sDialogSpeaker", - "80332f04" : "sDialogSpeakerVoice", - "80332f40" : "sNumProcessedSoundRequests", - "80332f44" : "sSoundRequestCount", - "80332f48" : "sDynBbh", - "80332f54" : "sDynDdd", - "80332f6c" : "sDynJrb", - "80332f88" : "sDynWdw", - "80332f98" : "sDynHmc", - "80332fa8" : "sDynUnk38", - "80332fb8" : "sDynNone", - "80332fbc" : "sCurrentMusicDynamic", - "80332fc0" : "sBackgroundMusicForDynamics", - "80332fc4" : "sLevelDynamics", - "80333060" : "sMusicDynamics", - "803330c0" : "gAreaEchoLevel", - "80333138" : "D_80332028", - "80333188" : "sBackgroundMusicDefaultVolume", - "803331ac" : "sPlayer0CurSeqId", - "803331b0" : "sMusicDynamicDelay", - "803331b4" : "D_803320A4", - "803331c0" : "D_803320B0", - "803331cc" : "D_803320BC", - "803331d8" : "sMaxChannelsForSoundBank", - "803331e4" : "sNumSoundsPerBank", - "803331f0" : "gDefaultSoundArgs", - "803331fc" : "sUnusedSoundArgs", - "80333208" : "sSoundBankDisabled", - "80333218" : "D_80332108", - "8033321c" : "sHasStartedFadeOut", - "80333220" : "D_80332110", - "80333224" : "sUnused80332114", - "80333228" : "sUnused80332118", - "8033322c" : "D_8033211C", - "80333230" : "D_80332120", - "80333234" : "D_80332124", - "80333238" : "sBackgroundMusicQueueSize", - "8033323c" : "sUnused8033323C", - "803332a0" : "gAudioSessionPresets", - "80333498" : "gAudioCosineTable", - "80333598" : "gPitchBendFrequencyScale", - "80333994" : "gNoteFrequencies", - "80333b94" : "gDefaultShortNoteVelocityTable", - "80333ba4" : "gDefaultShortNoteDurationTable", - "80333bb4" : "gVibratoCurve", - "80333bc4" : "gDefaultEnvelope", - "80333bd0" : "sSineWave", - "80333c50" : "sSquareWave", - "80333cd0" : "sTriangleWave", - "80333d50" : "sSawtoothWave", - "80333dd0" : "gWaveSamples", - "80333de0" : "gHeadsetPanQuantization", - "80333df4" : "gHeadsetPanVolume", - "80333ff4" : "gStereoPanVolume", - "803341f4" : "gDefaultPanVolume", - "803343f4" : "gVolRampingLhs136", - "803345f4" : "gVolRampingRhs136", - "803347f4" : "gVolRampingLhs144", - "803349f4" : "gVolRampingRhs144", - "80334bf4" : "gVolRampingLhs128", - "80334df4" : "gVolRampingRhs128", - "80334ff4" : "gTatumsPerBeat", - "80334ff8" : "gUnusedCount80333EE8", - "80334ffc" : "gAudioHeapSize", - "80335000" : "gAudioInitPoolSize", - "80335004" : "gAudioLoadLock", - "80335008" : "sUnused8033EF8", - "80335010" : "osViModeTable", - "803358f0" : "piMgrArgs", - "80335910" : "osClockRate", - "80335918" : "D_80334808", - "80335920" : "_osContInitialized", - "80335930" : "D_80334820", - "80335940" : "D_80334830", - "80335950" : "_spaces", - "80335974" : "_zeroes", - "803359a0" : "D_80334890", - "803359a4" : "D_80334894", - "803359a8" : "D_80334898", - "803359ac" : "D_8033489C", - "803359b0" : "D_803348A0", - "803359b4" : "D_803348A4", - "803359c0" : "D_803348B0", - "80335a20" : "D_80334910", - "80335a24" : "D_80334914", - "80335a28" : "D_80334918", - "80335a2c" : "D_8033491C", - "80335a30" : "D_80334920", - "80335a44" : "D_80334934", - "80335a48" : "D_80334938", - "80335a50" : "gOsPiAccessQueueCreated", - "80335a60" : "gOsSiAccessQueueCreated", - "80335aa0" : "D_80334990", - "80335af0" : "D_803349E0", - "80335b40" : "D_80334A30", - "80335b44" : "D_80334A34", - "80335b48" : "D_80334A38", - "80335b50" : "D_80334A40", - "80335b54" : "D_80334A44", - "80338e60" : "jtbl_80337C90", - "80338e84" : "jtbl_80337CB4", - "80338eac" : "jtbl_80337CDC", - "80338ec0" : "jtbl_80337D08", - "80338fbc" : "jtbl_80337E04", - "8033978c" : "jtbl_80338418", - "80339880" : "length_str", - "80339884" : "flags_str", - "8033988c" : "flags_arr", - "80339980" : "D_80338610", - "803399a0" : "jtbl_80338630", - "803399d0" : "NAN", - "803399e0" : "D_80338670", - "80339a40" : "D_803386D0", - "80339ac0" : "rspF3DDataStart", - "8033a2c0" : "rspF3DDataEnd", - "8033a2c0" : "rspAspMainDataStart", - "8033a580" : "rspAspMainDataEnd", - "8033a580" : "_mainSegmentEnd", - "008c0c40" : "_mainSegmentRomEnd", - "8033a580" : "_mainSegmentNoloadStart", - "8033a580" : "D_80339210", - "8033a730" : "gIdleThread", - "8033a8e0" : "gMainThread", - "8033aa90" : "gGameLoopThread", - "8033ac40" : "gSoundThread", - "8033adf0" : "gPIMesgQueue", - "8033ae08" : "gIntrMesgQueue", - "8033ae20" : "gSPTaskMesgQueue", - "8033ae38" : "gDmaMesgBuf", - "8033ae40" : "gPIMesgBuf", - "8033aec0" : "gSIEventMesgBuf", - "8033aec8" : "gIntrMesgBuf", - "8033af08" : "gUnknownMesgBuf", - "8033af48" : "gDmaIoMesg", - "8033af5c" : "D_80339BEC", - "8033af60" : "gDmaMesgQueue", - "8033af78" : "gSIEventMesgQueue", - "8033af90" : "gControllers", - "8033afe8" : "gControllerStatuses", - "8033aff8" : "gControllerPads", - "8033b010" : "gGameVblankQueue", - "8033b028" : "D_80339CB8", - "8033b040" : "D_80339CD0", - "8033b044" : "D_80339CD4", - "8033b048" : "gGameVblankHandler", - "8033b050" : "gPhysicalFrameBuffers", - "8033b05c" : "gPhysicalZBuffer", - "8033b060" : "D_80339CF0", - "8033b064" : "D_80339CF4", - "8033b068" : "gGfxSPTask", - "8033b06c" : "gDisplayListHead", - "8033b070" : "gGfxPoolEnd", - "8033b074" : "gGfxPool", - "8033b078" : "gControllerBits", - "8033b079" : "gEepromProbe", - "8033b080" : "D_80339D10", - "8033b090" : "gDemo", - "8033b0a0" : "filler80339D30", - "8033b170" : "gMarioStates", - "8033b238" : "sCurrPlayMode", - "8033b23a" : "D_80339ECA", - "8033b23c" : "sTransitionTimer", - "8033b240" : "sTransitionUpdate", - "8033b244" : "unused3", - "8033b248" : "sWarpDest", - "8033b250" : "D_80339EE0", - "8033b252" : "sDelayedWarpOp", - "8033b254" : "sDelayedWarpTimer", - "8033b256" : "sSourceWarpNodeId", - "8033b258" : "sDelayedWarpArg", - "8033b25c" : "unused4", - "8033b25e" : "sTimerRunning", - "8033b260" : "gHudDisplay", - "8033b26e" : "gNeverEnteredCastle", - "8033b270" : "sDelayInvincTimer", - "8033b272" : "sInvulnerable", - "8033b280" : "unused80339F10", - "8033b288" : "filler80339F1C", - "8033b2c0" : "sFloorAlignMatrix", - "8033b350" : "gMirrorMario", - "8033b3b0" : "gBodyStates", - "8033b400" : "sSegmentTable", - "8033b480" : "sPoolFreeSpace", - "8033b484" : "sPoolStart", - "8033b488" : "sPoolEnd", - "8033b48c" : "sPoolListHeadL", - "8033b490" : "sPoolListHeadR", - "8033b494" : "gEffectsMemoryPool", - "8033b4a0" : "gWarpCheckpoint", - "8033b4a5" : "gMainMenuDataModified", - "8033b4a6" : "gSaveFileModified", - "8033b4b0" : "gPlayerSpawnInfos", - "8033b4d0" : "D_8033A160", - "8033b8d0" : "gAreaData", - "8033bab0" : "gWarpTransition", - "8033bac6" : "gCurrCourseNum", - "8033bac8" : "gCurrActNum", - "8033baca" : "gCurrAreaIndex", - "8033bacc" : "gSavedCourseNum", - "8033bace" : "gPauseScreenMode", - "8033bad0" : "gSaveOptSelectIndex", - "8033bae0" : "gMatStackIndex", - "8033bae8" : "gMatStack", - "8033c2e8" : "gMatStackFixed", - "8033c368" : "gGeoTempState", - "8033c378" : "gCurAnimType", - "8033c379" : "gCurAnimEnabled", - "8033c37a" : "gCurrAnimFrame", - "8033c37c" : "gCurAnimTranslationMultiplier", - "8033c380" : "gCurrAnimAttribute", - "8033c384" : "gCurAnimData", - "8033c388" : "gDisplayListHeap", - "8033c390" : "gProfilerFrameData", - "8033c520" : "gPlayerCameraState", - "8033c568" : "sOldPosition", - "8033c578" : "sOldFocus", - "8033c588" : "sPlayer2FocusOffset", - "8033c594" : "sCreditsPlayer2Pitch", - "8033c596" : "sCreditsPlayer2Yaw", - "8033c598" : "sFramesPaused", - "8033c5a0" : "sFOVState", - "8033c5c0" : "sModeTransition", - "8033c5e8" : "sMarioGeometry", - "8033c61c" : "unusedFreeRoamWallYaw", - "8033c61e" : "sAvoidYawVel", - "8033c620" : "sCameraYawAfterDoorCutscene", - "8033c622" : "unusedSplinePitch", - "8033c624" : "unusedSplineYaw", - "8033c628" : "sHandheldShakeSpline", - "8033c668" : "sHandheldShakeMag", - "8033c66c" : "sHandheldShakeTimer", - "8033c670" : "sHandheldShakeInc", - "8033c674" : "sHandheldShakePitch", - "8033c676" : "sHandheldShakeYaw", - "8033c678" : "sHandheldShakeRoll", - "8033c67c" : "unused8033B30C", - "8033c680" : "unused8033B310", - "8033c684" : "sSelectionFlags", - "8033c686" : "unused8033B316", - "8033c688" : "s2ndRotateFlags", - "8033c68a" : "unused8033B31A", - "8033c68c" : "sCameraSoundFlags", - "8033c68e" : "sCButtonsPressed", - "8033c690" : "sCutsceneDialogID", - "8033c698" : "gLakituState", - "8033c758" : "unused8033B3E8", - "8033c75a" : "sAreaYaw", - "8033c75c" : "sAreaYawChange", - "8033c75e" : "sLakituDist", - "8033c760" : "sLakituPitch", - "8033c764" : "sZoomAmount", - "8033c768" : "sCSideButtonYaw", - "8033c76a" : "sBehindMarioSoundTimer", - "8033c76c" : "sZeroZoomDist", - "8033c770" : "sCUpCameraPitch", - "8033c772" : "sModeOffsetYaw", - "8033c774" : "sSpiralStairsYawOffset", - "8033c776" : "s8DirModeBaseYaw", - "8033c778" : "s8DirModeYawOffset", - "8033c77c" : "sPanDistance", - "8033c780" : "sCannonYOffset", - "8033c788" : "sModeInfo", - "8033c7d0" : "sCastleEntranceOffset", - "8033c7dc" : "sParTrackIndex", - "8033c7e0" : "sParTrackPath", - "8033c7e8" : "sParTrackTransOff", - "8033c808" : "sCameraStoreCUp", - "8033c828" : "sCameraStoreCutscene", - "8033c848" : "gCameraMovementFlags", - "8033c84a" : "sStatusFlags", - "8033c850" : "sCurCreditsSplinePos", - "8033c950" : "sCurCreditsSplineFocus", - "8033ca50" : "sCutsceneSplineSegment", - "8033ca54" : "sCutsceneSplineSegmentProgress", - "8033ca58" : "unused8033B6E8", - "8033ca5a" : "sCutsceneShot", - "8033ca5c" : "gCutsceneTimer", - "8033ca60" : "sCutsceneVars", - "8033cbc8" : "gObjCutsceneDone", - "8033cbcc" : "gCutsceneObjSpawn", - "8033cbd0" : "gCamera", - "8033cbe0" : "gObjectListArray", - "8033d260" : "gDebugInfoFlags", - "8033d264" : "gNumFindFloorMisses", - "8033d268" : "unused_8033BEF8", - "8033d26c" : "gUnknownWallCount", - "8033d270" : "gObjectCounter", - "8033d274" : "gNumCalls", - "8033d280" : "gDebugInfo", - "8033d380" : "gDebugInfoOverwrite", - "8033d480" : "gTimeStopState", - "8033d488" : "gObjectPool", - "80360e88" : "gMacroObjectDefaultParent", - "803610e8" : "gObjectLists", - "803610f0" : "gFreeObjectList", - "80361158" : "gMarioObject", - "8036115c" : "gLuigiObject", - "80361160" : "gCurrentObject", - "80361164" : "gCurBhvCommand", - "80361168" : "gPrevFrameObjectCount", - "8036116c" : "gSurfaceNodesAllocated", - "80361170" : "gSurfacesAllocated", - "80361174" : "gNumStaticSurfaceNodes", - "80361178" : "gNumStaticSurfaces", - "8036117c" : "gObjectMemoryPool", - "80361180" : "gCheckingSurfaceCollisionsForCamera", - "80361182" : "gFindFloorIncludeSurfaceIntangible", - "80361184" : "gEnvironmentRegions", - "80361188" : "gEnvironmentLevels", - "803611d8" : "gDoorAdjacentRooms", - "80361250" : "gMarioCurrentRoom", - "80361252" : "D_8035FEE2", - "80361254" : "D_8035FEE4", - "80361256" : "gTHIWaterDrained", - "80361258" : "gTTCSpeedSetting", - "8036125a" : "gMarioShotFromCannon", - "8036125c" : "gCCMEnteredSlide", - "8036125e" : "gNumRoomedObjectsInMarioRoom", - "80361260" : "gNumRoomedObjectsNotInMarioRoom", - "80361262" : "gWDWWaterLevelChanging", - "80361264" : "gMarioOnMerryGoRound", - "80361280" : "D_8035FF10", - "80361290" : "gDebugPrintState1", - "803612a0" : "gDebugPrintState2", - "803612b0" : "sMarioOnFlyingCarpet", - "803612b2" : "sSurfaceTypeBelowShadow", - "803612b4" : "gShadowAboveWaterOrLava", - "803612b5" : "gMarioOnIceOrCarpet", - "803612c0" : "sSkyBoxInfo", - "803612e0" : "gMovetexLastTextureId", - "803612f0" : "gFlyingCarpetState", - "80361300" : "gPaintingMarioFloorType", - "80361304" : "gPaintingMarioXPos", - "80361308" : "gPaintingMarioYPos", - "8036130c" : "gPaintingMarioZPos", - "80361310" : "gPaintingMesh", - "80361314" : "gPaintingTriNorms", - "80361318" : "gRipplingPainting", - "8036131c" : "gDddPaintingStatus", - "80361320" : "sTextLabels", - "803613f0" : "gDialogColorFadeTimer", - "803613f2" : "gLastDialogLineNum", - "803613f4" : "gDialogVariable", - "803613f8" : "gDialogTextAlpha", - "803613fa" : "gCutsceneMsgXOffset", - "803613fc" : "gCutsceneMsgYOffset", - "803613fe" : "gRedCoinsCollected", - "80361400" : "gEnvFxBuffer", - "80361408" : "gSnowCylinderLastPos", - "80361414" : "gSnowParticleCount", - "80361416" : "gSnowParticleMaxCount", - "80361420" : "gEnvFxBubbleConfig", - "80361460" : "sNumActiveFirePiranhaPlants", - "80361464" : "sNumKilledFirePiranhaPlants", - "80361468" : "sObjSavedPosX", - "8036146c" : "sObjSavedPosY", - "80361470" : "sObjSavedPosZ", - "80361474" : "sMontyMoleHoleList", - "80361478" : "sMontyMoleKillStreak", - "8036147c" : "sMontyMoleLastKilledPosX", - "80361480" : "sMontyMoleLastKilledPosY", - "80361484" : "sMontyMoleLastKilledPosZ", - "80361488" : "sMasterTreadmill", - "80361490" : "gCurrAiBuffer", - "80361498" : "sSoundRequests", - "80361c98" : "D_80360928", - "80361f98" : "sUsedChannelsForSoundBank", - "80361fa8" : "sCurrentSound", - "80361fb8" : "gSoundBanks", - "80364b78" : "D_80363808", - "80364b82" : "D_80363812", - "80364b88" : "sBackgroundMusicQueue", - "80364ba0" : "D_80363830", - "80364c20" : "D_803638B0", - "80365e70" : "piMgrThread", - "80366020" : "piMgrStack", - "80367020" : "__osPiMesgQueue", - "80367038" : "piMgrMesgBuff", - "80367040" : "D_80365CD0", - "80367050" : "_osContCmdBuf", - "8036708c" : "_osContPifCtrl", - "80367090" : "_osLastSentSiCmd", - "80367091" : "_osContNumControllers", - "80367098" : "D_80365D28", - "803670b8" : "_osContMesgQueue", - "803670d0" : "_osContMesgBuff", - "803670f0" : "D_80365D80", - "80367110" : "_osCurrentTime", - "80367118" : "D_80365DA8", - "8036711c" : "__osViIntrCount", - "80367120" : "D_80365DB0", - "80367130" : "osPiMesgBuff", - "80367138" : "gOsPiMessageQueue", - "80367150" : "osSiMesgBuff", - "80367158" : "gOsSiMessageQueue", - "80367170" : "D_80365E00", - "803671ac" : "D_80365E3C", - "803671b0" : "D_80365E40", - "803672b0" : "gInterruptedThread", - "80367460" : ".", - "80367460" : "_mainSegmentNoloadEnd", - "0000cee0" : "_mainSegmentNoloadSizeLo", - "00000002" : "_mainSegmentNoloadSizeHi", - "00000001" : "ASSERT", - "80378800" : "_engineSegmentStart", - "007cc6c0" : "_engineSegmentRomStart", - "80378800" : "vec3f_copy", - "80378840" : "vec3f_set", - "8037888c" : "vec3f_add", - "803788e4" : "vec3f_sum", - "8037893c" : "vec3s_copy", - "8037897c" : "vec3s_set", - "803789c8" : "vec3s_add", - "80378a20" : "vec3s_sum", - "80378a78" : "vec3s_sub", - "80378ad0" : "vec3s_to_vec3f", - "80378b34" : "vec3f_to_vec3s", - "80378c50" : "find_vector_perpendicular_to_plane", - "80378d38" : "vec3f_cross", - "80378dc0" : "vec3f_normalize", - "80378e68" : "mtxf_copy", - "80378eb4" : "mtxf_identity", - "80378f24" : "mtxf_translate", - "80378f84" : "mtxf_lookat", - "80379440" : "mtxf_rotate_zxy_and_translate", - "803795f0" : "mtxf_rotate_xyz_and_translate", - "80379798" : "mtxf_billboard", - "80379918" : "mtxf_align_terrain_normal", - "80379aa4" : "mtxf_align_terrain_triangle", - "80379f60" : "mtxf_mul", - "8037a29c" : "mtxf_scale_vec3f", - "8037a348" : "mtxf_mul_vec3s", - "8037a434" : "mtxf_to_mtx", - "8037a4b8" : "mtxf_rotate_xy", - "8037a550" : "get_pos_from_transform_mtx", - "8037a69c" : "vec3f_get_dist_and_angle", - "8037a788" : "vec3f_set_dist_and_angle", - "8037a860" : "approach_s32", - "8037a8b4" : "approach_f32", - "8037a9a8" : "atan2s", - "8037ab88" : "atan2f", - "8037abec" : "spline_get_weights", - "8037afb8" : "anim_spline_init", - "8037afe8" : "anim_spline_poll", - "8037b220" : "init_scene_graph_node_links", - "8037b24c" : "init_graph_node_root", - "8037b30c" : "init_graph_node_ortho_projection", - "8037b380" : "init_graph_node_perspective", - "8037b448" : "init_graph_node_start", - "8037b4ac" : "init_graph_node_master_list", - "8037b530" : "init_graph_node_render_range", - "8037b5b4" : "init_graph_node_switch_case", - "8037b670" : "init_graph_node_camera", - "8037b744" : "init_graph_node_translation_rotation", - "8037b7f8" : "init_graph_node_translation", - "8037b89c" : "init_graph_node_rotation", - "8037b940" : "init_graph_node_scale", - "8037b9e0" : "init_graph_node_object", - "8037bad4" : "init_graph_node_culling_radius", - "8037bb48" : "init_graph_node_animated_part", - "8037bbec" : "init_graph_node_billboard", - "8037bc90" : "init_graph_node_display_list", - "8037bd24" : "init_graph_node_shadow", - "8037bdb4" : "init_graph_node_object_parent", - "8037be28" : "init_graph_node_generated", - "8037becc" : "init_graph_node_background", - "8037bf84" : "init_graph_node_held_object", - "8037c044" : "geo_add_child", - "8037c0bc" : "geo_remove_child", - "8037c138" : "geo_make_first_child", - "8037c1e4" : "geo_call_global_function_nodes_helper", - "8037c360" : "geo_call_global_function_nodes", - "8037c3d0" : "geo_reset_object_node", - "8037c448" : "geo_obj_init", - "8037c51c" : "geo_obj_init_spawninfo", - "8037c658" : "geo_obj_init_animation", - "8037c708" : "geo_obj_init_animation_accel", - "8037c7d8" : "retrieve_animation_index", - "8037c844" : "geo_update_animation_frame", - "8037c9e8" : "geo_retreive_animation_translation", - "8037cb10" : "geo_find_root", - "8037cb60" : "read_vec3s_to_vec3f", - "8037cbc0" : "read_vec3s", - "8037cbfc" : "read_vec3s_angle", - "8037cc74" : "register_scene_graph_node", - "8037cd60" : "geo_layout_cmd_branch_and_link", - "8037ce24" : "geo_layout_cmd_end", - "8037cee8" : "geo_layout_cmd_branch", - "8037cf70" : "geo_layout_cmd_return", - "8037cfc0" : "geo_layout_cmd_open_node", - "8037d018" : "geo_layout_cmd_close_node", - "8037d050" : "geo_layout_cmd_assign_as_view", - "8037d0d0" : "geo_layout_cmd_update_node_flags", - "8037d1d0" : "geo_layout_cmd_node_root", - "8037d328" : "geo_layout_cmd_node_ortho_projection", - "8037d3a4" : "geo_layout_cmd_node_perspective", - "8037d48c" : "geo_layout_cmd_node_start", - "8037d4dc" : "geo_layout_cmd_nop3", - "8037d500" : "geo_layout_cmd_node_master_list", - "8037d55c" : "geo_layout_cmd_node_level_of_detail", - "8037d5d4" : "geo_layout_cmd_node_switch_case", - "8037d640" : "geo_layout_cmd_node_camera", - "8037d6f0" : "geo_layout_cmd_node_translation_rotation", - "8037d8d4" : "geo_layout_cmd_node_translation", - "8037d998" : "geo_layout_cmd_node_rotation", - "8037da5c" : "geo_layout_cmd_node_scale", - "8037db50" : "geo_layout_cmd_nop2", - "8037db74" : "geo_layout_cmd_node_animated_part", - "8037dc10" : "geo_layout_cmd_node_billboard", - "8037dcd4" : "geo_layout_cmd_node_display_list", - "8037dd4c" : "geo_layout_cmd_node_shadow", - "8037dddc" : "geo_layout_cmd_node_object_parent", - "8037de34" : "geo_layout_cmd_node_generated", - "8037de94" : "geo_layout_cmd_node_background", - "8037def8" : "geo_layout_cmd_nop", - "8037df1c" : "geo_layout_cmd_copy_view", - "8037dfd4" : "geo_layout_cmd_node_held_obj", - "8037e058" : "geo_layout_cmd_node_culling_radius", - "8037e0b4" : "process_geo_layout", - "803805c8" : "level_script_execute", - "80380de8" : "f32_find_wall_collision", - "80380e8c" : "find_wall_collisions", - "80381264" : "find_ceil", - "80381470" : "unused_obj_find_floor_height", - "803814b8" : "find_floor_height_and_data", - "80381794" : "find_floor_height", - "803817e0" : "unused_find_dynamic_floor", - "80381900" : "find_floor", - "80381ba0" : "find_water_level", - "80381d3c" : "find_poison_gas_level", - "80381f08" : "debug_surface_list_info", - "80382294" : "unused_resolve_floor_or_ceil_collisions", - "80383340" : "alloc_surface_pools", - "803833b8" : "load_area_terrain", - "803835a4" : "clear_dynamic_surfaces", - "80383614" : "transform_object_vertices", - "80383828" : "load_object_surfaces", - "803839cc" : "load_object_collision_model", - "80383bb0" : "random_u16", - "80383cb4" : "random_float", - "80383d1c" : "random_sign", - "80383d68" : "obj_update_gfx_pos_and_angle", - "80385bf0" : "stub_behavior_script_2", - "80385c00" : "cur_obj_update", - "80385f90" : "identityMtx", - "80385fb0" : "zeroMtx", - "80385fd0" : "gVec3fZero", - "80385fdc" : "gVec3sZero", - "80385fe4" : "gVec3fOne", - "80385ff0" : "gVec3sOne", - "80386000" : "gSineTable", - "80387000" : "gCosineTable", - "8038b000" : "gArctanTable", - "8038b810" : "GeoLayoutJumpTable", - "8038b894" : "unused_8038B894", - "8038bc90" : "_engineSegmentEnd", - "007dfb50" : "_engineSegmentRomEnd", - "8038bc90" : "_engineSegmentNoloadStart", - "8038bc90" : "gSplineKeyframe", - "8038bc94" : "gSplineKeyframeFraction", - "8038bc98" : "gSplineState", - "8038bca0" : "gGraphNodePool", - "8038bca4" : "gCurRootGraphNode", - "8038bca8" : "D_8038BCA8", - "8038bcac" : "gGeoViews", - "8038bcb0" : "gGeoNumViews", - "8038bcb8" : "gGeoLayoutStack", - "8038bcf8" : "gCurGraphNodeList", - "8038bd78" : "gCurGraphNodeIndex", - "8038bd7a" : "gGeoLayoutStackIndex", - "8038bd7c" : "D_8038BD7C", - "8038bd7e" : "gGeoLayoutReturnIndex", - "8038bd80" : "gGeoLayoutCommand", - "8038bd88" : "gObjParentGraphNode", - "8038be30" : "sFloorGeo", - "8038be90" : "unused8038BE90", - "8038be98" : "gStaticSurfacePartition", - "8038d698" : "gDynamicSurfacePartition", - "8038ee98" : "sSurfaceNodePool", - "8038ee9c" : "sSurfacePool", - "8038eea0" : "sSurfacePoolSize", - "8038eea8" : "unused8038EEA8", - "8038eef0" : "_engineSegmentNoloadEnd", - "00000001" : "ASSERT", - "8038f800" : ".", - "8038f800" : "_framebuffersSegmentNoloadStart", - "8038f800" : "0x70800", - "8038f800" : "gFrameBuffer0", - "803b5000" : "gFrameBuffer1", - "803da800" : "gFrameBuffer2", - "80400000" : "_framebuffersSegmentNoloadEnd", - "80400000" : "__expansionRamStart", - "00000001" : "ASSERT", - "10000000" : "_entrySegmentStart", - "007cc6c0" : "_entrySegmentRomStart", - "10000000" : "level_script_entry", - "10000030" : "_entrySegmentEnd", - "007cc6f0" : "_entrySegmentRomEnd", - "02000000" : "_segment2_mio0SegmentStart", - "007cc6c0" : "_segment2_mio0SegmentRomStart", - "0200bd10" : ".", - "0200bd10" : "_segment2_mio0SegmentEnd", - "007d83d0" : "_segment2_mio0SegmentRomEnd", - "04000000" : "_group0_mio0SegmentStart", - "007cc6c0" : "_group0_mio0SegmentRomStart", - "04013260" : ".", - "04013260" : "_group0_mio0SegmentEnd", - "007df920" : "_group0_mio0SegmentRomEnd", - "17000000" : "_group0_geoSegmentStart", - "007cc6c0" : "_group0_geoSegmentRomStart", - "17000000" : "bubble_geo", - "1700001c" : "purple_marble_geo", - "17000038" : "smoke_geo", - "17000084" : "burn_smoke_geo", - "1700009c" : "small_water_splash_geo", - "170000e0" : "mario_TODO_geo_0000E0", - "17000124" : "idle_water_wave_geo", - "17000168" : "wave_trail_geo", - "170001bc" : "sparkles_geo", - "17000230" : "water_splash_geo", - "17000284" : "sparkles_animation_geo", - "170002e0" : "mario_geo_face_and_wings", - "1700041c" : "mario_geo_left_hand", - "17000494" : "mario_geo_right_hand", - "1700053c" : "mario_geo_body", - "170006f8" : "mario_geo_medium_poly_left_hand", - "17000770" : "mario_geo_medium_poly_right_hand", - "17000818" : "mario_geo_medium_poly_body", - "170009d4" : "mario_geo_low_poly_face_and_wings", - "17000b10" : "mario_geo_low_poly_left_hand", - "17000b88" : "mario_geo_low_poly_right_hand", - "17000c30" : "mario_geo_low_poly_body", - "17000dec" : "mario_vanish_geo_face_and_wings", - "17000f28" : "mario_vanish_geo_left_hand", - "17000fa0" : "mario_vanish_geo_right_hand", - "17001048" : "mario_vanish_geo_body", - "17001204" : "mario_vanish_geo_medium_poly_left_hand", - "1700127c" : "mario_vanish_geo_medium_poly_right_hand", - "17001324" : "mario_vanish_geo_medium_poly_body", - "170014e0" : "mario_vanish_geo_low_poly_face_and_wings", - "1700161c" : "mario_vanish_geo_low_poly_left_hand", - "17001694" : "mario_vanish_geo_low_poly_right_hand", - "1700173c" : "mario_vanish_geo_low_poly_body", - "170018f8" : "mario_metal_geo_face_and_wings", - "170019a4" : "mario_metal_geo_left_hand", - "17001a1c" : "mario_metal_geo_right_hand", - "17001ac4" : "mario_metal_geo_body", - "17001c80" : "mario_metal_geo_medium_poly_left_hand", - "17001cf8" : "mario_metal_geo_medium_poly_right_hand", - "17001da0" : "mario_metal_geo_medium_poly_body", - "17001f5c" : "mario_metal_geo_low_poly_face_and_wings", - "17002008" : "mario_metal_geo_low_poly_left_hand", - "17002080" : "mario_metal_geo_low_poly_right_hand", - "17002128" : "mario_metal_geo_low_poly_body", - "170022e4" : "mario_metal_vanish_geo_face_and_wings", - "17002390" : "mario_metal_vanish_geo_left_hand", - "17002408" : "mario_metal_vanish_geo_right_hand", - "170024b0" : "mario_metal_vanish_geo_body", - "1700266c" : "mario_metal_vanish_geo_medium_poly_left_hand", - "170026e4" : "mario_metal_vanish_geo_medium_poly_right_hand", - "1700278c" : "mario_metal_vanish_geo_medium_poly_body", - "17002958" : "mario_metal_vanish_geo_low_poly_face_and_wings", - "17002a04" : "mario_metal_vanish_geo_low_poly_left_hand", - "17002a7c" : "mario_metal_vanish_geo_low_poly_right_hand", - "17002b24" : "mario_metal_vanish_geo_low_poly_body", - "17002ce0" : "mario_geo_load_body", - "17002d14" : "mario_geo_load_medium_poly_body", - "17002d48" : "mario_geo_load_low_poly_body", - "17002d7c" : "mario_geo_render_body", - "17002dd4" : "mario_geo", - "17002e30" : "_group0_geoSegmentEnd", - "007cf4f0" : "_group0_geoSegmentRomEnd", - "05000000" : "_group1_mio0SegmentStart", - "007cc6c0" : "_group1_mio0SegmentRomStart", - "05008070" : ".", - "05008070" : "_group1_mio0SegmentEnd", - "007d4730" : "_group1_mio0SegmentRomEnd", - "0c000000" : "_group1_geoSegmentStart", - "007cc6c0" : "_group1_geoSegmentRomStart", - "0c000000" : "yellow_sphere_geo", - "0c000018" : "hoot_geo", - "0c0001e4" : "yoshi_egg_geo", - "0c000248" : "thwomp_geo", - "0c000264" : "bullet_bill_geo", - "0c00028c" : "heave_ho_geo", - "0c000410" : "_group1_geoSegmentEnd", - "007ccad0" : "_group1_geoSegmentRomEnd", - "05000000" : "_group2_mio0SegmentStart", - "007cc6c0" : "_group2_mio0SegmentRomStart", - "05001e10" : ".", - "05001e10" : "_group2_mio0SegmentEnd", - "007ce4d0" : "_group2_mio0SegmentRomEnd", - "0c000000" : "_group2_geoSegmentStart", - "007cc6c0" : "_group2_geoSegmentRomStart", - "0c000000" : "bully_geo", - "0c000120" : "bully_boss_geo", - "0c000240" : "blargg_geo", - "0c0002b0" : "_group2_geoSegmentEnd", - "007cc970" : "_group2_geoSegmentRomEnd", - "05000000" : "_group3_mio0SegmentStart", - "007cc6c0" : "_group3_mio0SegmentRomStart", - "050068b0" : ".", - "050068b0" : "_group3_mio0SegmentEnd", - "007d2f70" : "_group3_mio0SegmentRomEnd", - "0c000000" : "_group3_geoSegmentStart", - "007cc6c0" : "_group3_geoSegmentRomStart", - "0c000000" : "king_bobomb_geo", - "0c000308" : "water_bomb_geo", - "0c000328" : "water_bomb_shadow_geo", - "0c000340" : "_group3_geoSegmentEnd", - "007cca00" : "_group3_geoSegmentRomEnd", - "05000000" : "_group4_mio0SegmentStart", - "007cc6c0" : "_group4_mio0SegmentRomStart", - "0500a300" : ".", - "0500a300" : "_group4_mio0SegmentEnd", - "007d69c0" : "_group4_mio0SegmentRomEnd", - "0c000000" : "_group4_geoSegmentStart", - "007cc6c0" : "_group4_geoSegmentRomStart", - "0c000000" : "clam_shell_geo", - "0c000068" : "sushi_geo", - "0c00010c" : "unagi_geo", - "0c000280" : "_group4_geoSegmentEnd", - "007cc940" : "_group4_geoSegmentRomEnd", - "05000000" : "_group5_mio0SegmentStart", - "007cc6c0" : "_group5_mio0SegmentRomStart", - "0500bce0" : ".", - "0500bce0" : "_group5_mio0SegmentEnd", - "007d83a0" : "_group5_mio0SegmentRomEnd", - "0c000000" : "_group5_geoSegmentStart", - "007cc6c0" : "_group5_geoSegmentRomStart", - "0c000000" : "klepto_geo", - "0c0002ac" : "eyerok_geo_0002AC", - "0c0005a8" : "eyerok_left_hand_geo", - "0c0005e4" : "eyerok_right_hand_geo", - "0c000610" : "pokey_head_geo", - "0c000644" : "pokey_body_part_geo", - "0c000660" : "_group5_geoSegmentEnd", - "007ccd20" : "_group5_geoSegmentRomEnd", - "05000000" : "_group6_mio0SegmentStart", - "007cc6c0" : "_group6_mio0SegmentRomStart", - "0500e110" : ".", - "0500e110" : "_group6_mio0SegmentEnd", - "007da7d0" : "_group6_mio0SegmentRomEnd", - "0c000000" : "_group6_geoSegmentStart", - "007cc6c0" : "_group6_geoSegmentRomStart", - "0c000000" : "monty_mole_geo", - "0c000110" : "ukiki_geo", - "0c00036c" : "fwoosh_geo", - "0c000390" : "_group6_geoSegmentEnd", - "007cca50" : "_group6_geoSegmentRomEnd", - "05000000" : "_group7_mio0SegmentStart", - "007cc6c0" : "_group7_mio0SegmentRomStart", - "05005070" : ".", - "05005070" : "_group7_mio0SegmentEnd", - "007d1730" : "_group7_mio0SegmentRomEnd", - "0c000000" : "_group7_geoSegmentStart", - "007cc6c0" : "_group7_geoSegmentRomStart", - "0c000000" : "spindrift_geo", - "0c000104" : "penguin_geo", - "0c00021c" : "mr_blizzard_hidden_geo", - "0c000348" : "mr_blizzard_geo", - "0c000370" : "_group7_geoSegmentEnd", - "007cca30" : "_group7_geoSegmentRomEnd", - "05000000" : "_group8_mio0SegmentStart", - "007cc6c0" : "_group8_mio0SegmentRomStart", - "05001180" : ".", - "05001180" : "_group8_mio0SegmentEnd", - "007cd840" : "_group8_mio0SegmentRomEnd", - "0c000000" : "_group8_geoSegmentStart", - "007cc6c0" : "_group8_geoSegmentRomStart", - "0c000000" : "springboard_top_geo", - "0c000018" : "springboard_spring_geo", - "0c000030" : "springboard_bottom_geo", - "0c000048" : "cap_switch_geo", - "0c000090" : "_group8_geoSegmentEnd", - "007cc750" : "_group8_geoSegmentRomEnd", - "05000000" : "_group9_mio0SegmentStart", - "007cc6c0" : "_group9_mio0SegmentRomStart", - "05006960" : ".", - "05006960" : "_group9_mio0SegmentEnd", - "007d3020" : "_group9_mio0SegmentRomEnd", - "0c000000" : "_group9_geoSegmentStart", - "007cc6c0" : "_group9_geoSegmentRomStart", - "0c000000" : "bookend_part_geo", - "0c0000c0" : "bookend_geo", - "0c0000d8" : "haunted_chair_geo", - "0c000188" : "small_key_geo", - "0c0001b4" : "mad_piano_geo", - "0c000224" : "boo_geo", - "0c000274" : "haunted_cage_geo", - "0c0002b0" : "_group9_geoSegmentEnd", - "007cc970" : "_group9_geoSegmentRomEnd", - "05000000" : "_group10_mio0SegmentStart", - "007cc6c0" : "_group10_mio0SegmentRomStart", - "05012cd0" : ".", - "05012cd0" : "_group10_mio0SegmentEnd", - "007df390" : "_group10_mio0SegmentRomEnd", - "0c000000" : "_group10_geoSegmentStart", - "007cc6c0" : "_group10_geoSegmentRomStart", - "0c000000" : "birds_geo", - "0c000098" : "peach_geo_000098", - "0c000254" : "peach_geo_000254", - "0c000410" : "peach_geo", - "0c000468" : "yoshi_geo", - "0c000670" : "_group10_geoSegmentEnd", - "007ccd30" : "_group10_geoSegmentRomEnd", - "05000000" : "_group11_mio0SegmentStart", - "007cc6c0" : "_group11_mio0SegmentRomStart", - "050073f0" : ".", - "050073f0" : "_group11_mio0SegmentEnd", - "007d3ab0" : "_group11_mio0SegmentRomEnd", - "0c000000" : "_group11_geoSegmentStart", - "007cc6c0" : "_group11_geoSegmentRomStart", - "0c000000" : "bubba_geo", - "0c000030" : "wiggler_head_geo", - "0c0001bc" : "enemy_lakitu_geo", - "0c000290" : "spiny_ball_geo", - "0c000328" : "spiny_geo", - "0c0004a0" : "_group11_geoSegmentEnd", - "007ccb60" : "_group11_geoSegmentRomEnd", - "06000000" : "_group12_mio0SegmentStart", - "007cc6c0" : "_group12_mio0SegmentRomStart", - "06030c30" : ".", - "06030c30" : "_group12_mio0SegmentEnd", - "007fd2f0" : "_group12_mio0SegmentRomEnd", - "0d000000" : "_group12_geoSegmentStart", - "007cc6c0" : "_group12_geoSegmentRomStart", - "0d000000" : "bowser_flames_geo", - "0d000090" : "invisible_bowser_accessory_geo", - "0d0000b0" : "bowser_1_yellow_sphere_geo", - "0d0000d8" : "bowser_geo_0000D8", - "0d000424" : "bowser_geo_000424", - "0d000770" : "bowser_geo_000770", - "0d000ab8" : "bowser_shadow_geo", - "0d000ac4" : "bowser_geo", - "0d000b40" : "bowser2_geo", - "0d000bbc" : "bowser_bomb_geo", - "0d000bfc" : "bowser_impact_smoke_geo", - "0d000c50" : "_group12_geoSegmentEnd", - "007cd310" : "_group12_geoSegmentRomEnd", - "06000000" : "_group13_mio0SegmentStart", - "007cc6c0" : "_group13_mio0SegmentRomStart", - "0600a0f0" : ".", - "0600a0f0" : "_group13_mio0SegmentEnd", - "007d67b0" : "_group13_mio0SegmentRomEnd", - "0d000000" : "_group13_geoSegmentStart", - "007cc6c0" : "_group13_geoSegmentRomStart", - "0d000000" : "skeeter_geo", - "0d000284" : "seaweed_geo", - "0d0002f4" : "water_mine_geo", - "0d000324" : "cyan_fish_geo", - "0d00038c" : "bub_geo", - "0d000414" : "water_ring_geo", - "0d000450" : "treasure_chest_base_geo", - "0d000468" : "treasure_chest_lid_geo", - "0d000480" : "_group13_geoSegmentEnd", - "007ccb40" : "_group13_geoSegmentRomEnd", - "06000000" : "_group14_mio0SegmentStart", - "007cc6c0" : "_group14_mio0SegmentRomStart", - "06013a60" : ".", - "06013a60" : "_group14_mio0SegmentEnd", - "007e0120" : "_group14_mio0SegmentRomEnd", - "0d000000" : "_group14_geoSegmentStart", - "007cc6c0" : "_group14_geoSegmentRomStart", - "0d000000" : "koopa_flag_geo", - "0d0000b8" : "wooden_post_geo", - "0d0000d0" : "koopa_without_shell_geo", - "0d000214" : "koopa_with_shell_geo", - "0d000358" : "piranha_plant_geo", - "0d000480" : "whomp_geo", - "0d0005d0" : "metallic_ball_geo", - "0d0005ec" : "chain_chomp_geo", - "0d000680" : "_group14_geoSegmentEnd", - "007ccd40" : "_group14_geoSegmentRomEnd", - "06000000" : "_group15_mio0SegmentStart", - "007cc6c0" : "_group15_mio0SegmentRomStart", - "0600c8e0" : ".", - "0600c8e0" : "_group15_mio0SegmentEnd", - "007d8fa0" : "_group15_mio0SegmentRomEnd", - "0d000000" : "_group15_geoSegmentStart", - "007cc6c0" : "_group15_geoSegmentRomStart", - "0d000000" : "lakitu_geo", - "0d000114" : "toad_geo_000114", - "0d00027c" : "toad_geo_00027C", - "0d0003e4" : "toad_geo", - "0d000448" : "mips_geo", - "0d0005b0" : "boo_castle_geo", - "0d000600" : "_group15_geoSegmentEnd", - "007cccc0" : "_group15_geoSegmentRomEnd", - "06000000" : "_group16_mio0SegmentStart", - "007cc6c0" : "_group16_mio0SegmentRomStart", - "06002ba0" : ".", - "06002ba0" : "_group16_mio0SegmentEnd", - "007cf260" : "_group16_mio0SegmentRomEnd", - "0d000000" : "_group16_geoSegmentStart", - "007cc6c0" : "_group16_geoSegmentRomStart", - "0d000000" : "moneybag_geo_000000", - "0d000078" : "moneybag_geo_000078", - "0d0000f0" : "moneybag_geo", - "0d000150" : "_group16_geoSegmentEnd", - "007cc810" : "_group16_geoSegmentRomEnd", - "06000000" : "_group17_mio0SegmentStart", - "007cc6c0" : "_group17_mio0SegmentRomStart", - "06009c50" : ".", - "06009c50" : "_group17_mio0SegmentEnd", - "007d6310" : "_group17_mio0SegmentRomEnd", - "0d000000" : "_group17_geoSegmentStart", - "007cc6c0" : "_group17_geoSegmentRomStart", - "0d000000" : "mr_i_geo", - "0d00001c" : "mr_i_iris_geo", - "0d0000dc" : "swoop_geo", - "0d0001a0" : "snufit_geo", - "0d000230" : "dorrie_geo", - "0d000394" : "scuttlebug_geo", - "0d0006d0" : "_group17_geoSegmentEnd", - "007ccd90" : "_group17_geoSegmentRomEnd", - "08000000" : "_common0_mio0SegmentStart", - "007cc6c0" : "_common0_mio0SegmentRomStart", - "0800e6d0" : ".", - "0800e6d0" : "_common0_mio0SegmentEnd", - "007dad90" : "_common0_mio0SegmentRomEnd", - "0f000000" : "_common0_geoSegmentStart", - "007cc6c0" : "_common0_geoSegmentRomStart", - "0f000000" : "blue_coin_switch_geo", - "0f000020" : "test_platform_geo", - "0f000028" : "amp_geo", - "0f0001a8" : "cannon_base_geo", - "0f0001c0" : "cannon_barrel_geo", - "0f0001d8" : "chuckya_geo", - "0f0004cc" : "purple_switch_geo", - "0f0004e4" : "checkerboard_platform_geo", - "0f0004fc" : "heart_geo", - "0f000518" : "flyguy_geo", - "0f0005d0" : "breakable_box_geo", - "0f000610" : "breakable_box_small_geo", - "0f000640" : "bowling_ball_geo", - "0f00066c" : "bowling_ball_track_geo", - "0f000694" : "exclamation_box_geo", - "0f0006e4" : "goomba_geo", - "0f0007b8" : "black_bobomb_geo", - "0f0008f4" : "bobomb_buddy_geo", - "0f000a30" : "metal_box_geo", - "0f000a58" : "exclamation_box_outline_geo", - "0f000ab0" : "koopa_shell_geo", - "0f000adc" : "koopa_shell2_geo", - "0f000b08" : "koopa_shell3_geo", - "0f000b40" : "_common0_geoSegmentEnd", - "007cd200" : "_common0_geoSegmentRomEnd", - "03000000" : "_common1_mio0SegmentStart", - "007cc6c0" : "_common1_mio0SegmentRomStart", - "03017990" : ".", - "03017990" : "_common1_mio0SegmentEnd", - "007e4050" : "_common1_mio0SegmentRomEnd", - "16000000" : "_common1_geoSegmentStart", - "007cc6c0" : "_common1_geoSegmentRomStart", - "16000000" : "mist_geo", - "16000020" : "white_puff_geo", - "16000040" : "explosion_geo", - "160000a8" : "butterfly_geo", - "1600013c" : "yellow_coin_geo", - "160001a0" : "yellow_coin_no_shadow_geo", - "16000200" : "blue_coin_geo", - "16000264" : "blue_coin_no_shadow_geo", - "160002c4" : "red_coin_geo", - "16000328" : "red_coin_no_shadow_geo", - "16000388" : "warp_pipe_geo", - "160003a8" : "castle_door_geo", - "1600043c" : "cabin_door_geo", - "160004d0" : "wooden_door_geo", - "16000564" : "wooden_door2_geo", - "160005f8" : "metal_door_geo", - "1600068c" : "hazy_maze_door_geo", - "16000720" : "haunted_door_geo", - "160007b4" : "castle_door_0_star_geo", - "16000868" : "castle_door_1_star_geo", - "1600091c" : "castle_door_3_stars_geo", - "160009d0" : "key_door_geo", - "16000a84" : "bowser_key_geo", - "16000ab0" : "bowser_key_cutscene_geo", - "16000b10" : "red_flame_shadow_geo", - "16000b2c" : "red_flame_geo", - "16000b8c" : "blue_flame_geo", - "16000bec" : "fish_shadow_geo", - "16000c44" : "fish_geo", - "16000c8c" : "leaves_geo", - "16000ca4" : "marios_cap_geo", - "16000cf0" : "marios_metal_cap_geo", - "16000d3c" : "marios_wing_cap_geo", - "16000da8" : "marios_winged_metal_cap_geo", - "16000e14" : "number_geo", - "16000e84" : "mushroom_1up_geo", - "16000ea0" : "star_geo", - "16000ed4" : "dirt_animation_geo", - "16000f24" : "cartoon_star_geo", - "16000f6c" : "transparent_star_geo", - "16000f98" : "white_particle_geo", - "16000fb4" : "wooden_signpost_geo", - "16000fe8" : "bubbly_tree_geo", - "16001000" : "spiky_tree_geo", - "16001018" : "snow_tree_geo", - "16001030" : "spiky_tree1_geo", - "16001048" : "palm_tree_geo", - "16001060" : "_common1_geoSegmentEnd", - "007cd720" : "_common1_geoSegmentRomEnd", - "13000000" : "_behaviorSegmentStart", - "007cc6c0" : "_behaviorSegmentRomStart", - "13000000" : "bhvStarDoor", - "13000054" : "bhvMrI", - "1300008c" : "bhvMrIBody", - "130000ac" : "bhvMrIParticle", - "130000f8" : "bhvPurpleParticle", - "13000118" : "bhvGiantPole", - "13000144" : "bhvPoleGrabbing", - "13000174" : "bhvThiHugeIslandTop", - "13000194" : "bhvThiTinyIslandTop", - "130001ac" : "bhvCapSwitchBase", - "130001cc" : "bhvCapSwitch", - "130001f4" : "bhvKingBobomb", - "13000254" : "bhvBobombAnchorMario", - "13000278" : "bhvBetaChestBottom", - "1300029c" : "bhvBetaChestLid", - "130002b8" : "bhvBubbleParticleSpawner", - "130002e4" : "bhvBubbleMaybe", - "13000338" : "bhvSmallWaterWave", - "13000398" : "bhvSmallWaterWave398", - "130003bc" : "bhvWaterAirBubble", - "13000400" : "bhvSmallParticle", - "13000428" : "bhvPlungeBubble", - "13000444" : "bhvSmallParticleSnow", - "1300046c" : "bhvSmallParticleBubbles", - "13000494" : "bhvFishGroup", - "130004a8" : "bhvCannon", - "130004e4" : "bhvCannonBarrel", - "13000500" : "bhvCannonBaseUnused", - "13000528" : "bhvChuckya", - "13000584" : "bhvChuckyaAnchorMario", - "130005a8" : "bhvUnused05A8", - "130005b4" : "bhvRotatingPlatform", - "130005d8" : "bhvTower", - "13000600" : "bhvBulletBillCannon", - "13000624" : "bhvWfBreakableWallRight", - "13000638" : "bhvWfBreakableWallLeft", - "1300066c" : "bhvKickableBoard", - "130006a4" : "bhvTowerDoor", - "130006d8" : "bhvRotatingCounterClockwise", - "130006e0" : "bhvWfRotatingWoodenPlatform", - "13000708" : "bhvKoopaShellUnderwater", - "13000720" : "bhvExitPodiumWarp", - "1300075c" : "bhvFadingWarp", - "13000780" : "bhvWarp", - "130007a0" : "bhvWarpPipe", - "130007dc" : "bhvWhitePuffExplosion", - "130007f8" : "bhvSpawnedStar", - "1300080c" : "bhvSpawnedStarNoLevelExit", - "13000830" : "bhvMrIBlueCoin", - "13000888" : "bhvCoinInsideBoo", - "130008d0" : "bhvCoinFormationSpawn", - "130008ec" : "bhvCoinFormation", - "1300090c" : "bhvOneCoin", - "1300091c" : "bhvYellowCoin", - "13000940" : "bhvTemporaryYellowCoin", - "13000964" : "bhvThreeCoinsSpawn", - "13000984" : "bhvTenCoinsSpawn", - "130009a4" : "bhvSingleCoinGetsSpawned", - "130009e0" : "bhvCoinSparkles", - "13000a14" : "bhvGoldenCoinSparkles", - "13000a34" : "bhvWallTinyStarParticle", - "13000a54" : "bhvVertStarParticleSpawner", - "13000a78" : "bhvPoundTinyStarParticle", - "13000a98" : "bhvHorStarParticleSpawner", - "13000abc" : "bhvPunchTinyTriangle", - "13000ad8" : "bhvTriangleParticleSpawner", - "13000afc" : "bhvDoorWarp", - "13000b0c" : "bhvDoor", - "13000b58" : "bhvGrindel", - "13000b8c" : "bhvThwomp2", - "13000bc8" : "bhvThwomp", - "13000c04" : "bhvTumblingBridgePlatform", - "13000c28" : "bhvWfTumblingBridge", - "13000c44" : "bhvBbhTumblingBridge", - "13000c64" : "bhvLllTumblingBridge", - "13000c84" : "bhvFlame", - "13000cc8" : "bhvAnotherElavator", - "13000cfc" : "bhvRrElevatorPlatform", - "13000d30" : "bhvHmcElevatorPlatform", - "13000d6c" : "bhvWaterMist", - "13000d98" : "bhvBreathParticleSpawner", - "13000db4" : "bhvBreakBoxTriangle", - "13000dd8" : "bhvWaterMist2", - "13000dfc" : "bhvUnused0DFC", - "13000e24" : "bhvMistCircParticleSpawner", - "13000e3c" : "bhvDirtParticleSpawner", - "13000e58" : "bhvSnowParticleSpawner", - "13000e70" : "bhvWind", - "13000e88" : "bhvEndToad", - "13000eac" : "bhvEndPeach", - "13000ed0" : "bhvUnusedParticleSpawn", - "13000f08" : "bhvUkiki", - "13000f14" : "bhvUkikiCageChild", - "13000f2c" : "bhvUkikiCageStar", - "13000f48" : "bhvUkikiCage", - "13000f9c" : "bhvBitfsSinkingPlatforms", - "13000fc8" : "bhvBitfsSinkingCagePlatform", - "13001000" : "bhvDddMovingPole", - "13001030" : "bhvBitfsTiltingInvertedPyramid", - "13001064" : "bhvSquishablePlatform", - "13001098" : "bhvCutOutObject", - "130010a8" : "bhvBetaMovingFlamesSpawn", - "130010b8" : "bhvBetaMovingFlames", - "130010d8" : "bhvRrRotatingBridgePlatform", - "13001108" : "bhvFlamethrower", - "13001124" : "bhvFlamethrowerFlame", - "13001168" : "bhvBouncingFireball", - "13001184" : "bhvBouncingFireballFlame", - "130011d0" : "bhvBowserShockWave", - "130011ec" : "bhvFireParticleSpawner", - "13001214" : "bhvBlackSmokeMario", - "13001254" : "bhvBlackSmokeBowser", - "1300127c" : "bhvBlackSmokeUpward", - "13001298" : "bhvBetaFishSplashSpawner", - "130012b4" : "bhvSpindrift", - "130012f4" : "bhvTowerPlatformGroup", - "13001318" : "bhvWfSlidingTowerPlatform", - "13001340" : "bhvWfElevatorTowerPlatform", - "13001368" : "bhvWfSolidTowerPlatform", - "13001390" : "bhvLeafParticleSpawner", - "130013a8" : "bhvTreeSnow", - "130013c4" : "bhvTreeLeaf", - "130013dc" : "bhvAnotherTiltingPlatform", - "13001408" : "bhvSquarishPathMoving", - "1300142c" : "bhvPiranhaPlantBubble", - "13001448" : "bhvPiranhaPlantWakingBubbles", - "13001468" : "bhvFloorSwitchAnimatesObject", - "13001478" : "bhvFloorSwitchGrills", - "13001484" : "bhvFloorSwitchHardcodedModel", - "130014ac" : "bhvFloorSwitchHiddenObjects", - "130014bc" : "bhvHiddenObject", - "130014e0" : "bhvBreakableBox", - "13001518" : "bhvPushableMetalBox", - "13001548" : "bhvHeaveHo", - "130015a4" : "bhvHeaveHoThrowMario", - "130015c0" : "bhvCcmTouchedStarSpawn", - "130015e4" : "bhvUnusedPoundablePlatform", - "13001608" : "bhvBetaTrampolineTop", - "13001634" : "bhvBetaTrampolineSpring", - "13001650" : "bhvJumpingBox", - "1300167c" : "bhvBooCage", - "130016ac" : "bhvStub", - "130016b8" : "bhvIgloo", - "130016e4" : "bhvBowserKey", - "13001714" : "bhvGrandStar", - "13001744" : "bhvBetaBooKey", - "13001778" : "bhvAlphaBooKey", - "1300179c" : "bhvBulletBill", - "130017f4" : "bhvWhitePuffSmoke", - "13001820" : "bhvUnused1820", - "13001828" : "bhvBowserTailAnchor", - "13001850" : "bhvBowser", - "130018cc" : "bhvBowserBodyAnchor", - "13001904" : "bhvBowserFlameSpawn", - "13001920" : "bhvTiltingBowserLavaPlatform", - "13001958" : "bhvFallingBowserPlatform", - "13001984" : "bhvBlueBowserFlame", - "130019c8" : "bhvFlameFloatingLanding", - "13001a0c" : "bhvBlueFlamesGroup", - "13001a30" : "bhvFlameBouncing", - "13001a74" : "bhvFlameMovingForwardGrowing", - "13001aa4" : "bhvFlameBowser", - "13001ae8" : "bhvFlameLargeBurningOut", - "13001b2c" : "bhvBlueFish", - "13001b54" : "bhvTankFishGroup", - "13001b70" : "bhvCheckerboardElevatorGroup", - "13001b88" : "bhvCheckerboardPlatformSub", - "13001bb4" : "bhvBowserKeyUnlockDoor", - "13001bd4" : "bhvBowserKeyCourseExit", - "13001bf4" : "bhvInvisibleObjectsUnderBridge", - "13001c04" : "bhvWaterLevelPillar", - "13001c34" : "bhvDddWarp", - "13001c58" : "bhvMoatGrills", - "13001c7c" : "bhvClockMinuteHand", - "13001c8c" : "bhvClockHourHand", - "13001cb0" : "bhvMacroUkiki", - "13001d0c" : "bhvStub1D0C", - "13001d14" : "bhvLllRotatingHexagonalPlatform", - "13001d40" : "bhvLllSinkingRockBlock", - "13001d70" : "bhvStub1D70", - "13001d78" : "bhvLllMovingOctagonalMeshPlatform", - "13001da4" : "bhvSnowBall", - "13001da8" : "bhvLllRotatingBlockWithFireBars", - "13001dcc" : "bhvLllRotatingHexFlame", - "13001e04" : "bhvLllWoodPiece", - "13001e30" : "bhvLllFloatingWoodBridge", - "13001e4c" : "bhvVolcanoFlames", - "13001e6c" : "bhvLllRotatingHexagonalRing", - "13001e94" : "bhvLllSinkingRectangularPlatform", - "13001ec4" : "bhvLllSinkingSquarePlatforms", - "13001ef8" : "bhvLllTiltingInvertedPyramid", - "13001f30" : "bhvUnused1F30", - "13001f3c" : "bhvKoopaShell", - "13001f68" : "bhvKoopaShellFlame", - "13001f90" : "bhvToxBox", - "13001fbc" : "bhvPiranhaPlant", - "13002018" : "bhvLllHexagonalMesh", - "13002038" : "bhvLllBowserPuzzlePiece", - "13002068" : "bhvLllBowserPuzzle", - "13002088" : "bhvTuxiesMother", - "130020d8" : "bhvPenguinBaby", - "130020e0" : "bhvUnused20E0", - "130020e8" : "bhvSmallPenguin", - "1300213c" : "bhvFish2", - "1300214c" : "bhvFish3", - "1300215c" : "bhvLargeFishGroup", - "13002178" : "bhvFish", - "13002194" : "bhvWdwExpressElevator", - "130021c0" : "bhvWdwExpressElevatorPlatform", - "130021e4" : "bhvChirpChirp", - "130021f4" : "bhvChirpChirpUnused", - "1300220c" : "bhvBub", - "13002250" : "bhvExclamationBox", - "1300227c" : "bhvRotatingExclamationMark", - "1300229c" : "bhvSoundSpawner", - "130022b8" : "bhvRockSolid", - "130022d8" : "bhvBowserSubDoor", - "13002308" : "bhvBowsersSub", - "13002338" : "bhvSushiShark", - "13002388" : "bhvSushiSharkCollisionChild", - "130023a4" : "bhvJrbSlidingBox", - "130023d0" : "bhvShipPart3", - "130023ec" : "bhvInSunkenShip3", - "1300241c" : "bhvSunkenShipPart", - "1300243c" : "bhvSunkenShipSetRotation", - "1300244c" : "bhvSunkenShipPart2", - "1300246c" : "bhvInSunkenShip", - "13002480" : "bhvInSunkenShip2", - "130024ac" : "bhvMistParticleSpawner", - "130024dc" : "bhvWhitePuff1", - "13002500" : "bhvWhitePuff2", - "13002528" : "bhvWhitePuffSmoke2", - "13002558" : "bhvPurpleSwitchHiddenBoxes", - "13002568" : "bhvBlueCoinSwitch", - "13002588" : "bhvHiddenBlueCoin", - "130025c0" : "bhvOpenableCageDoor", - "130025e0" : "bhvOpenableGrill", - "130025f8" : "bhvWaterLevelDiamond", - "13002620" : "bhvInitializeChangingWaterLevel", - "13002634" : "bhvTweesterSandParticle", - "13002650" : "bhvTweester", - "13002684" : "bhvMerryGoRoundBooManager", - "1300269c" : "bhvAnimatedTexture", - "130026d4" : "bhvBooInCastle", - "13002710" : "bhvBooWithCage", - "13002768" : "bhvBalconyBigBoo", - "1300277c" : "bhvMerryGoRoundBigBoo", - "13002790" : "bhvGhostHuntBigBoo", - "130027d0" : "bhvCourtyardBooTriplet", - "130027e4" : "bhvBoo", - "130027f4" : "bhvMerryGoRoundBoo", - "13002804" : "bhvGhostHuntBoo", - "1300286c" : "bhvHiddenStaircaseStep", - "13002898" : "bhvBooBossSpawnedBridge", - "130028cc" : "bhvBbhTiltingTrapPlatform", - "130028fc" : "bhvHauntedBookshelf", - "1300292c" : "bhvMeshElevator", - "13002968" : "bhvMerryGoRound", - "13002998" : "bhvPlaysMusicTrackWhenTouched", - "130029b0" : "bhvInsideCannon", - "130029b4" : "bhvBetaBowserAnchor", - "130029e4" : "bhvStaticCheckeredPlatform", - "13002a10" : "bhvUnused2A10", - "13002a20" : "bhvUnusedFakeStar", - "13002a48" : "bhvStaticObject", - "13002a54" : "bhvUnused2A54", - "13002a5c" : "bhvCastleFloorTrap", - "13002a7c" : "bhvFloorTrapInCastle", - "13002aa4" : "bhvTree", - "13002ad0" : "bhvSparkle", - "13002af0" : "bhvSparkleSpawn", - "13002b08" : "bhvSparkleParticleSpawner", - "13002b5c" : "bhvScuttlebug", - "13002ba0" : "bhvScuttlebugSpawn", - "13002bb8" : "bhvWhompKingBoss", - "13002bcc" : "bhvSmallWhomp", - "13002c14" : "bhvWaterSplash", - "13002c60" : "bhvWaterDroplet", - "13002c7c" : "bhvWaterDropletSplash", - "13002cb0" : "bhvBubbleSplash", - "13002ce0" : "bhvIdleWaterWave", - "13002d28" : "bhvObjectWaterSplash", - "13002d50" : "bhvShallowWaterWave", - "13002d7c" : "bhvShallowWaterSplash", - "13002db0" : "bhvObjectWaveTrail", - "13002dc0" : "bhvWaveTrail", - "13002e04" : "bhvTinyStrongWindParticle", - "13002e20" : "bhvStrongWindParticle", - "13002e3c" : "bhvSLSnowmanWind", - "13002e58" : "bhvSLWalkingPenguin", - "13002ea8" : "bhvYellowBall", - "13002ec0" : "bhvMario", - "13002ef8" : "bhvToadMessage", - "13002f40" : "bhvUnlockDoorStar", - "13002f60" : "bhvInstantActiveWarp", - "13002f64" : "bhvAirborneWarp", - "13002f68" : "bhvHardAirKnockBackWarp", - "13002f6c" : "bhvSpinAirborneCircleWarp", - "13002f70" : "bhvDeathWarp", - "13002f74" : "bhvSpinAirborneWarp", - "13002f78" : "bhvFlyingWarp", - "13002f7c" : "bhvPaintingStarCollectWarp", - "13002f80" : "bhvPaintingDeathWarp", - "13002f84" : "bhvAirborneDeathWarp", - "13002f88" : "bhvAirborneStarCollectWarp", - "13002f8c" : "bhvLaunchStarCollectWarp", - "13002f90" : "bhvLaunchDeathWarp", - "13002f94" : "bhvSwimmingWarp", - "13002fa0" : "bhvRandomAnimatedTexture", - "13002fc0" : "bhvYellowBackgroundInMenu", - "13002fe4" : "bhvMenuButton", - "13003008" : "bhvMenuButtonManager", - "1300302c" : "bhvActSelectorStarType", - "13003048" : "bhvActSelector", - "13003068" : "bhvMovingYellowCoin", - "130030a4" : "bhvMovingBlueCoin", - "130030d4" : "bhvBlueCoinSliding", - "13003104" : "bhvBlueCoinJumping", - "13003134" : "bhvSeaweed", - "13003158" : "bhvSeaweedBundle", - "13003174" : "bhvBobomb", - "130031ac" : "bhvBobombFuseSmoke", - "130031dc" : "bhvBobombBuddy", - "13003228" : "bhvBobombBuddyOpensCannon", - "13003274" : "bhvCannonClosed", - "130032a8" : "bhvWhirlpool", - "130032c8" : "bhvJetStream", - "130032e0" : "bhvMessagePanel", - "13003324" : "bhvSignOnWall", - "13003354" : "bhvHomingAmp", - "13003388" : "bhvCirclingAmp", - "130033bc" : "bhvButterfly", - "130033ec" : "bhvHoot", - "13003420" : "bhvBetaHoldableObject", - "13003454" : "bhvCarrySomething1", - "1300345c" : "bhvCarrySomething2", - "13003464" : "bhvCarrySomething3", - "1300346c" : "bhvCarrySomething4", - "13003474" : "bhvCarrySomething5", - "1300347c" : "bhvCarrySomething6", - "13003484" : "bhvObjectBubble", - "130034c4" : "bhvObjectWaterWave", - "13003510" : "bhvExplosion", - "13003558" : "bhvBobombBullyDeathSmoke", - "13003588" : "bhvSmoke", - "130035b0" : "bhvBobombExplosionBubble", - "13003600" : "bhvBobombExplosionBubble3600", - "13003614" : "bhvRespawner", - "1300362c" : "bhvSmallBully", - "13003660" : "bhvBigBully", - "13003694" : "bhvBigBullyWithMinions", - "130036c8" : "bhvSmallChillBully", - "13003700" : "bhvBigChillBully", - "13003738" : "bhvJetStreamRingSpawner", - "13003750" : "bhvJetStreamWaterRing", - "13003798" : "bhvMantaRayWaterRing", - "130037e0" : "bhvMantaRayRingManager", - "130037ec" : "bhvBowserBomb", - "1300381c" : "bhvBowserBombExplosion", - "13003840" : "bhvBowserBombSmoke", - "13003868" : "bhvCelebrationStar", - "13003888" : "bhvCelebrationStarSparkle", - "130038b0" : "bhvStarKeyCollectionPuffSpawner", - "130038d0" : "bhvLllDrawbridgeSpawner", - "130038e8" : "bhvLllDrawbridge", - "13003910" : "bhvSmallBomp", - "13003940" : "bhvLargeBomp", - "13003970" : "bhvWfSlidingPlatform", - "130039a0" : "bhvMoneybag", - "130039d4" : "bhvMoneybagHidden", - "13003a08" : "bhvPitBowlingBall", - "13003a30" : "bhvFreeBowlingBall", - "13003a58" : "bhvBowlingBall", - "13003a80" : "bhvTtmBowlingBallSpawner", - "13003aa4" : "bhvBobBowlingBallSpawner", - "13003ac8" : "bhvThiBowlingBallSpawner", - "13003ae0" : "bhvRrCruiserWing", - "13003b00" : "bhvSpindel", - "13003b30" : "bhvSslMovingPyramidWall", - "13003b60" : "bhvPyramidElevator", - "13003b98" : "bhvPyramidElevatorTrajectoryMarkerBall", - "13003bb4" : "bhvPyramidTop", - "13003bec" : "bhvPyramidTopFragment", - "13003c0c" : "bhvPyramidPillarTouchDetector", - "13003c30" : "bhvWaterfallSoundLoop", - "13003c44" : "bhvVolcanoSoundLoop", - "13003c58" : "bhvCastleFlagWaving", - "13003c7c" : "bhvBirdsSoundLoop", - "13003c90" : "bhvAmbientSounds", - "13003ca4" : "bhvSandSoundLoop", - "13003cb8" : "bhvHiddenAt120Stars", - "13003ce4" : "bhvSnowmansBottom", - "13003d0c" : "bhvSnowmansHead", - "13003d34" : "bhvSnowmansBodyCheckpoint", - "13003d4c" : "bhvBigSnowmanWhole", - "13003d74" : "bhvBigBoulder", - "13003da0" : "bhvBigBoulderGenerator", - "13003db8" : "bhvWingCap", - "13003dd8" : "bhvMetalCap", - "13003df8" : "bhvNormalCap", - "13003e1c" : "bhvVanishCap", - "13003e3c" : "bhvStar", - "13003e64" : "bhvStarSpawnCoordinates", - "13003e8c" : "bhvHiddenRedCoinStar", - "13003eac" : "bhvRedCoin", - "13003ee4" : "bhvBowserCourseRedCoinStar", - "13003efc" : "bhvHiddenStar", - "13003f1c" : "bhvHiddenStarTrigger", - "13003f40" : "bhvTtmRollingLog", - "13003f78" : "bhvLllVolcanoFallingTrap", - "13003fa4" : "bhvLllRollingLog", - "13003fdc" : "bhv1upWalking", - "13004010" : "bhv1upRunningAway", - "13004044" : "bhv1upSliding", - "1300407c" : "bhv1Up", - "130040b4" : "bhv1upJumpOnApproach", - "130040ec" : "bhvHidden1up", - "13004124" : "bhvHidden1upTrigger", - "13004148" : "bhvHidden1upInPole", - "13004180" : "bhvHidden1upInPoleTrigger", - "130041a4" : "bhvHidden1upInPoleSpawner", - "130041bc" : "bhvControllablePlatform", - "130041f0" : "bhvControllablePlatformSub", - "13004218" : "bhvBreakableBoxSmall", - "13004244" : "bhvSlidingSnowMound", - "13004270" : "bhvSnowMoundSpawn", - "13004284" : "bhvWdwSquareFloatingPlatform", - "130042b4" : "bhvWdwRectangularFloatingPlatform", - "130042e4" : "bhvJrbFloatingPlatform", - "13004314" : "bhvArrowLift", - "13004348" : "bhvOrangeNumber", - "13004370" : "bhvMantaRay", - "130043a0" : "bhvFallingPillar", - "130043c4" : "bhvFallingPillarHitbox", - "130043e0" : "bhvPillarBase", - "13004400" : "bhvJrbFloatingBox", - "1300442c" : "bhvDecorativePendulum", - "1300444c" : "bhvTreasureChestsShip", - "13004470" : "bhvTreasureChestsJrb", - "13004494" : "bhvTreasureChests", - "130044b8" : "bhvTreasureChestBottom", - "130044e0" : "bhvTreasureChestTop", - "130044fc" : "bhvMips", - "13004538" : "bhvYoshi", - "13004580" : "bhvKoopa", - "130045d0" : "bhvKoopaRaceEndpoint", - "130045f8" : "bhvKoopaFlag", - "13004634" : "bhvPokey", - "13004668" : "bhvPokeyBodyPart", - "13004698" : "bhvSwoop", - "130046dc" : "bhvFlyGuy", - "1300472c" : "bhvGoomba", - "13004770" : "bhvGoombaTripletSpawner", - "1300478c" : "bhvChainChomp", - "130047e4" : "bhvChainChompChainPart", - "1300481c" : "bhvWoodenPost", - "13004868" : "bhvChainChompGate", - "13004898" : "bhvWigglerHead", - "130048e0" : "bhvWigglerBody", - "13004918" : "bhvEnemyLakitu", - "13004954" : "bhvCameraLakitu", - "13004988" : "bhvCloud", - "130049ac" : "bhvCloudPart", - "130049c8" : "bhvSpiny", - "13004a00" : "bhvMontyMole", - "13004a58" : "bhvMontyMoleHole", - "13004a78" : "bhvMontyMoleRock", - "13004ab0" : "bhvPlatformOnTrack", - "13004af4" : "bhvTrackBall", - "13004b1c" : "bhvSeesawPlatform", - "13004b44" : "bhvFerrisWheelAxle", - "13004b6c" : "bhvFerrisWheelPlatform", - "13004b8c" : "bhvWaterBombSpawner", - "13004ba8" : "bhvWaterBomb", - "13004bd4" : "bhvWaterBombShadow", - "13004bf0" : "bhvTTCRotatingSolid", - "13004c24" : "bhvTTCPendulum", - "13004c5c" : "bhvTTCTreadmill", - "13004c94" : "bhvTTCMovingBar", - "13004ccc" : "bhvTTCCog", - "13004cf8" : "bhvTTCPitBlock", - "13004d28" : "bhvTTCElevator", - "13004d64" : "bhvTTC2DRotator", - "13004d90" : "bhvTTCSpinner", - "13004dbc" : "bhvMrBlizzard", - "13004e08" : "bhvMrBlizzardSnowball", - "13004e4c" : "bhvSlidingPlatform2", - "13004e78" : "bhvOctagonalPlatformRotating", - "13004ea0" : "bhvAnimatesOnFloorSwitchPress", - "13004ecc" : "bhvActivatedBackAndForthPlatform", - "13004ef8" : "bhvRecoveryHeart", - "13004f10" : "bhvWaterBombCannon", - "13004f28" : "bhvCannonBarrelBubbles", - "13004f40" : "bhvUnagi", - "13004f78" : "bhvUnagiSubobject", - "13004f90" : "bhvDorrie", - "13004fd4" : "bhvHauntedChair", - "13005024" : "bhvMadPiano", - "1300506c" : "bhvFlyingBookend", - "130050b4" : "bhvBookendSpawn", - "130050d4" : "bhvHauntedBookshelfManager", - "130050f4" : "bhvBookSwitch", - "13005120" : "bhvFirePiranhaPlant", - "13005158" : "bhvSmallPiranhaFlame", - "1300518c" : "bhvFireSpitter", - "130051ac" : "bhvFlyguyFlame", - "130051e0" : "bhvSnufit", - "1300521c" : "bhvSnufitBalls", - "1300525c" : "bhvHorizontalGrindel", - "130052b4" : "bhvEyerokBoss", - "130052d0" : "bhvEyerokHand", - "13005310" : "bhvKlepto", - "13005354" : "bhvBird", - "13005380" : "bhvRacingPenguin", - "130053c4" : "bhvPenguinRaceFinishLine", - "130053dc" : "bhvPenguinRaceShortcutCheck", - "130053f4" : "bhvCoffinSpawner", - "13005414" : "bhvCoffin", - "13005440" : "bhvClamShell", - "13005468" : "bhvSkeeter", - "130054a0" : "bhvSkeeterWave", - "130054b8" : "bhvSwingPlatform", - "130054ec" : "bhvDonutPlatformSpawner", - "13005504" : "bhvDonutPlatform", - "13005528" : "bhvDDDPole", - "1300556c" : "bhvRedCoinStarMarker", - "13005598" : "bhvTripletButterfly", - "130055dc" : "bhvBubba", - "13005610" : "bhvBeginningLakitu", - "13005638" : "bhvBeginningPeach", - "1300565c" : "bhvEndBirds1", - "13005680" : "bhvEndBirds2", - "130056a4" : "bhvIntroScene", - "130056c0" : "_behaviorSegmentEnd", - "007d1d80" : "_behaviorSegmentRomEnd", - "8016f000" : "_goddardSegmentStart", - "007cc6c0" : "_goddardSegmentRomStart", - }, - "Refresh 13" : { - "80000000" : "EXCEPTION_TLB_MISS", - "a4000000" : "SP_DMEM", - "a40004c0" : "SP_DMEM_UNK0", - "a4000774" : "SP_DMEM_UNK1", - "a4001000" : "SP_IMEM", - "a4040010" : "SP_STATUS_REG", - "a4080000" : "SP_PC", - "a4300000" : "MI_MODE_REG", - "a4300004" : "MI_VERSION_REG", - "a4300008" : "MI_INTR_REG", - "a430000c" : "MI_INTR_MASK_REG", - "a4400010" : "VI_CURRENT_REG", - "a450000c" : "AI_STATUS_REG", - "a4600000" : "PI_DRAM_ADDR_REG", - "a4600004" : "PI_CART_ADDR_REG", - "a460000c" : "PI_WR_LEN_REG", - "a4600010" : "PI_STATUS_REG", - "a4600014" : "PI_BSD_DOM1_LAT_REG", - "a4600018" : "PI_BSD_DOM1_PWD_REG", - "a460001c" : "PI_BSD_DOM1_PGS_REG", - "a4600020" : "PI_BSD_DOM1_RLS_REG", - "a4700000" : "RI_MODE_REG", - "a4700010" : "RI_REFRESH_REG", - "a4800018" : "SI_STATUS_REG", - "b0000008" : "D_B0000008", - "b0000010" : "D_B0000010", - "b0000014" : "D_B0000014", - "c0000000" : "D_C0000000", - "c0000008" : "D_C0000008", - "c000000c" : "D_C000000C", - "00000000" : "__romPos", - "04000000" : "_bootSegmentStart", - "007cc6c0" : "_bootSegmentRomStart", - "04000040" : "ipl3_entry", - "04000b70" : "ipl3_font", - "04001000" : "_bootSegmentEnd", - "007cd6c0" : "_bootSegmentRomEnd", - "80000400" : ".", - "80000400" : "_zbufferSegmentNoloadStart", - "80000400" : "0x25800", - "80000400" : "gZBuffer", - "80246000" : "_mainSegmentStart", - "007cc6c0" : "_mainSegmentRomStart", - "80246000" : "entry_point", - "80246050" : "handle_debug_key_sequences", - "80246170" : "unknown_main_func", - "802461cc" : "stub_main_1", - "802461dc" : "stub_main_2", - "802461ec" : "stub_main_3", - "802461fc" : "setup_mesg_queues", - "802462e0" : "alloc_pool", - "80246338" : "create_thread", - "8024639c" : "handle_nmi_request", - "802463ec" : "receive_new_tasks", - "8024651c" : "start_sptask", - "8024659c" : "interrupt_gfx_sptask", - "802465ec" : "start_gfx_sptask", - "80246648" : "pretend_audio_sptask_done", - "8024669c" : "handle_vblank", - "802467fc" : "handle_sp_complete", - "8024694c" : "handle_dp_complete", - "802469b8" : "thread3_main", - "80246b14" : "set_vblank_handler", - "80246b74" : "send_sp_task_message", - "80246bb4" : "dispatch_audio_sptask", - "80246c10" : "send_display_list", - "80246c9c" : "turn_on_audio", - "80246cb8" : "turn_off_audio", - "80246cf0" : "thread1_idle", - "80246df8" : "main_func", - "80246e70" : "my_rdp_init", - "802471a4" : "my_rsp_init", - "80247284" : "clear_z_buffer", - "802473c8" : "display_frame_buffer", - "802474b8" : "clear_frame_buffer", - "80247620" : "clear_viewport", - "8024784c" : "draw_screen_borders", - "802479bc" : "make_viewport_clip_rect", - "80247b3c" : "create_task_structure", - "80247ccc" : "init_render_image", - "80247d14" : "end_master_display_list", - "80247db4" : "draw_reset_bars", - "80247f08" : "rendering_init", - "80247fdc" : "config_gfx_pool", - "80248090" : "display_and_vsync", - "80248304" : "adjust_analog_stick", - "80248498" : "run_demo_inputs", - "80248638" : "read_controller_inputs", - "80248824" : "init_controllers", - "80248964" : "setup_game_memory", - "80248af0" : "thread5_game_loop", - "80248c40" : "reset_volume", - "80248c58" : "lower_background_noise", - "80248ce8" : "raise_background_noise", - "80248d78" : "disable_background_sound", - "80248dc0" : "enable_background_sound", - "80248e08" : "set_sound_mode", - "80248e54" : "play_menu_sounds", - "80248fec" : "play_painting_eject_sound", - "80249070" : "play_infinite_stairs_music", - "80249178" : "set_background_music", - "8024922c" : "fadeout_music", - "8024927c" : "fadeout_level_music", - "802492d0" : "play_cutscene_music", - "80249310" : "play_shell_music", - "8024934c" : "stop_shell_music", - "80249398" : "play_cap_music", - "80249404" : "fadeout_cap_music", - "80249448" : "stop_cap_music", - "80249494" : "play_menu_sounds_extra", - "802494d8" : "audio_game_loop_tick", - "80249500" : "thread4_sound", - "802495e0" : "level_control_timer", - "802496b8" : "pressed_pause", - "80249764" : "set_play_mode", - "8024978c" : "warp_special", - "802497b8" : "fade_into_special_warp", - "8024982c" : "stub_level_update_1", - "8024983c" : "load_level_init_text", - "8024995c" : "init_door_warp", - "80249a10" : "set_mario_initial_cap_powerup", - "80249ab4" : "set_mario_initial_action", - "80249cd8" : "init_mario_after_warp", - "8024a124" : "warp_area", - "8024a18c" : "warp_level", - "8024a1d8" : "warp_credits", - "8024a374" : "check_instant_warp", - "8024a584" : "music_changed_through_warp", - "8024a700" : "initiate_warp", - "8024a7b4" : "get_painting_warp_node", - "8024a85c" : "initiate_painting_warp", - "8024a9cc" : "level_trigger_warp", - "8024aedc" : "initiate_delayed_warp", - "8024b13c" : "update_hud_values", - "8024b390" : "basic_update", - "8024b3e4" : "play_mode_normal", - "8024b5d4" : "play_mode_paused", - "8024b6cc" : "play_mode_frame_advance", - "8024b798" : "level_set_transition", - "8024b7c0" : "play_mode_change_area", - "8024b880" : "play_mode_change_level", - "8024b9b8" : "update_level", - "8024ba8c" : "init_level", - "8024bcd8" : "lvl_init_or_update", - "8024bd5c" : "lvl_init_from_save_file", - "8024be14" : "lvl_set_current_level", - "8024bfa0" : "lvl_play_the_end_screen_sound", - "8024bff0" : "get_mario_cap_flag", - "8024c0b8" : "object_facing_mario", - "8024c16c" : "mario_obj_angle_to_object", - "8024c1d8" : "determine_interaction", - "8024c51c" : "attack_object", - "8024c618" : "mario_stop_riding_object", - "8024c66c" : "mario_grab_used_object", - "8024c6c0" : "mario_drop_held_object", - "8024c780" : "mario_throw_held_object", - "8024c894" : "mario_stop_riding_and_holding", - "8024c8fc" : "does_mario_have_normal_cap_on_head", - "8024c928" : "mario_blow_off_cap", - "8024ca68" : "mario_lose_cap_to_enemy", - "8024caf8" : "mario_retrieve_cap", - "8024cb58" : "able_to_grab_object", - "8024cbfc" : "mario_get_collided_object", - "8024cc7c" : "mario_check_object_grab", - "8024ce08" : "bully_knock_back_mario", - "8024d0b4" : "bounce_off_object", - "8024d130" : "hit_object_from_below", - "8024d2bc" : "determine_knockback_action", - "8024d578" : "push_mario_out_of_object", - "8024d72c" : "bounce_back_from_attack", - "8024d804" : "should_push_or_pull_door", - "8024d8b0" : "take_damage_from_interact_object", - "8024d998" : "take_damage_and_knock_back", - "8024daac" : "reset_mario_pitch", - "8024db2c" : "interact_coin", - "8024dbf0" : "interact_water_ring", - "8024dc28" : "interact_star_or_key", - "8024de4c" : "interact_bbh_entrance", - "8024df10" : "interact_warp", - "8024e0c4" : "interact_warp_door", - "8024e2fc" : "get_door_save_file_flag", - "8024e420" : "interact_door", - "8024e6ec" : "interact_cannon_base", - "8024e778" : "interact_igloo_barrier", - "8024e7d4" : "interact_tornado", - "8024e8f0" : "interact_whirlpool", - "8024e9d0" : "interact_strong_wind", - "8024ead8" : "interact_flame", - "8024ec54" : "interact_snufit_bullet", - "8024ed84" : "interact_clam_or_bubba", - "8024ee44" : "interact_bully", - "8024eff8" : "interact_shock", - "8024f170" : "interact_mr_blizzard", - "8024f1e0" : "interact_hit_from_below", - "8024f354" : "interact_bounce_top", - "8024f4ac" : "interact_unknown_08", - "8024f55c" : "interact_damage", - "8024f5cc" : "interact_breakable", - "8024f6a4" : "interact_koopa_shell", - "8024f7a8" : "check_object_grab_mario", - "8024f8bc" : "interact_pole", - "8024fa60" : "interact_hoot", - "8024fb30" : "interact_cap", - "8024fd2c" : "interact_grabbable", - "8024fe6c" : "mario_can_talk", - "8024ff04" : "check_read_sign", - "80250098" : "check_npc_talk", - "80250198" : "interact_text", - "80250230" : "check_kick_or_punch_wall", - "802503f0" : "mario_process_interactions", - "802505c8" : "check_death_barrier", - "8025065c" : "check_lava_boost", - "80250724" : "pss_begin_slide", - "80250778" : "pss_end_slide", - "802507fc" : "mario_handle_special_floors", - "80250940" : "is_anim_at_end", - "8025097c" : "is_anim_past_end", - "802509b8" : "set_mario_animation", - "80250b04" : "set_mario_anim_with_accel", - "80250c7c" : "set_anim_to_frame", - "80250d38" : "is_anim_past_frame", - "80250e54" : "find_mario_anim_flags_and_translation", - "80251020" : "update_mario_pos_for_anim", - "802510dc" : "return_mario_anim_y_translation", - "80251120" : "play_sound_if_no_flag", - "8025118c" : "play_mario_jump_sound", - "80251274" : "adjust_sound_for_speed", - "80251310" : "play_sound_and_spawn_particles", - "80251444" : "play_mario_action_sound", - "802514ac" : "play_mario_landing_sound", - "80251510" : "play_mario_landing_sound_once", - "80251574" : "play_mario_heavy_landing_sound", - "802515d8" : "play_mario_heavy_landing_sound_once", - "8025163c" : "play_mario_sound", - "80251708" : "mario_set_forward_vel", - "8025177c" : "mario_get_floor_class", - "802518a8" : "mario_get_terrain_sound_addend", - "80251a48" : "resolve_and_return_wall_collisions", - "80251afc" : "vec3f_find_ceil", - "80251b54" : "mario_facing_downhill", - "80251bd4" : "mario_floor_is_slippery", - "80251cfc" : "mario_floor_is_slope", - "80251e24" : "mario_floor_is_steep", - "80251f24" : "find_floor_height_relative_polar", - "80252000" : "find_floor_slope", - "802521a0" : "update_mario_sound_and_camera", - "8025229c" : "set_steep_jump_action", - "80252cf4" : "set_mario_action", - "80252e5c" : "set_jump_from_landing", - "802530a0" : "set_jumping_action", - "80253178" : "drop_and_set_mario_action", - "802531c4" : "hurt_and_set_mario_action", - "80253218" : "check_common_action_exits", - "80253300" : "check_common_hold_action_exits", - "802533e4" : "transition_submerged_to_walking", - "80253488" : "set_water_plunge_action", - "80253588" : "squish_mario_model", - "80253720" : "debug_print_speed_action_normal", - "80253838" : "update_mario_button_inputs", - "8025395c" : "update_mario_joystick_inputs", - "80253a60" : "update_mario_geometry_inputs", - "80253d58" : "update_mario_inputs", - "80253ec0" : "set_submerged_cam_preset_and_spawn_bubbles", - "80254060" : "update_mario_health", - "802542b4" : "update_mario_info_for_cam", - "80254338" : "mario_reset_bodystate", - "80254390" : "sink_mario_in_quicksand", - "802543e8" : "update_and_return_cap_flags", - "80254588" : "mario_update_hitbox_and_cap_model", - "80254830" : "execute_mario_action", - "80254b20" : "init_mario", - "80254f44" : "init_mario_from_save_file", - "80255080" : "get_additive_y_vel_for_jumps", - "8025509c" : "stub_mario_step_1", - "802550b0" : "stub_mario_step_2", - "802550c0" : "transfer_bully_speed", - "80255238" : "init_bully_collision_data", - "802552fc" : "mario_bonk_reflection", - "80255414" : "mario_update_quicksand", - "80255654" : "mario_push_off_steep_floor", - "8025570c" : "mario_update_moving_sand", - "8025580c" : "mario_update_windy_ground", - "802559b0" : "stop_and_set_height_to_floor", - "80255a34" : "stationary_ground_step", - "80255d88" : "perform_ground_step", - "80255ec4" : "check_ledge_grab", - "802560ac" : "perform_air_quarter_step", - "802564e0" : "apply_twirl_gravity", - "80256584" : "should_strengthen_gravity_for_jump_ascent", - "8025661c" : "apply_gravity", - "802569f8" : "apply_vertical_wind", - "80256b24" : "perform_air_step", - "80256cd8" : "set_vel_from_pitch_and_yaw", - "80256d8c" : "set_vel_from_yaw", - "80256e00" : "get_credits_str_width", - "80256e88" : "print_displaying_credits_entry", - "80257060" : "bhv_end_peach_loop", - "802570dc" : "bhv_end_toad_loop", - "80257198" : "geo_switch_peach_eyes", - "802572b0" : "get_star_collection_dialog", - "8025733c" : "handle_save_menu", - "80257450" : "spawn_obj_at_mario_rel_yaw", - "802574e8" : "cutscene_take_cap_off", - "80257548" : "cutscene_put_cap_on", - "802575a8" : "mario_ready_to_speak", - "80257640" : "set_mario_npc_dialog", - "80257748" : "act_reading_npc_dialog", - "80257980" : "act_waiting_for_dialog", - "80257a0c" : "act_disappeared", - "80257ab0" : "act_reading_automatic_dialog", - "80257ce4" : "act_reading_sign", - "80257eac" : "act_debug_free_move", - "80258184" : "general_star_dance_handler", - "80258420" : "act_star_dance", - "802584dc" : "act_star_dance_water", - "802585c0" : "act_fall_after_star_grab", - "802586cc" : "common_death_handler", - "80258744" : "act_standing_death", - "802587ec" : "act_electrocution", - "8025883c" : "act_suffocation", - "8025888c" : "act_death_on_back", - "802588f8" : "act_death_on_stomach", - "80258964" : "act_quicksand_death", - "80258a7c" : "act_eaten_by_bubba", - "80258b24" : "launch_mario_until_land", - "80258ba8" : "act_unlocking_key_door", - "80258dac" : "act_unlocking_star_door", - "80258f94" : "act_entering_star_door", - "80259264" : "act_going_through_door", - "802593cc" : "act_warp_door_spawn", - "802594d4" : "act_emerge_from_pipe", - "80259608" : "act_spawn_spin_airborne", - "80259740" : "act_spawn_spin_landing", - "802597ac" : "act_exit_airborne", - "80259854" : "act_falling_exit_airborne", - "802598d0" : "act_exit_land_save_dialog", - "80259c30" : "act_death_exit", - "80259ce8" : "act_unused_death_exit", - "80259d74" : "act_falling_death_exit", - "80259e00" : "act_special_exit_airborne", - "80259ef8" : "act_special_death_exit", - "80259fcc" : "act_spawn_no_spin_airborne", - "8025a040" : "act_spawn_no_spin_landing", - "8025a0bc" : "act_bbh_enter_spin", - "8025a494" : "act_bbh_enter_jump", - "8025a610" : "act_teleport_fade_out", - "8025a6fc" : "act_teleport_fade_in", - "8025a858" : "act_shocked", - "8025a9ac" : "act_squished", - "8025ae0c" : "act_putting_on_cap", - "8025aea8" : "stuck_in_ground_handler", - "8025affc" : "act_head_stuck_in_ground", - "8025b050" : "act_butt_stuck_in_ground", - "8025b0a4" : "act_feet_stuck_in_ground", - "8025bc80" : "generate_yellow_sparkles", - "8025d798" : "mario_execute_cutscene_action", - "8025dd70" : "add_tree_leaf_particles", - "8025de1c" : "play_climbing_sounds", - "8025df04" : "set_pole_position", - "8025e21c" : "act_holding_pole", - "8025e5a8" : "act_climbing_pole", - "8025e7a4" : "act_grab_pole_slow", - "8025e830" : "act_grab_pole_fast", - "8025e930" : "act_top_of_pole_transition", - "8025ea30" : "act_top_of_pole", - "8025eb50" : "perform_hanging_step", - "8025ecfc" : "update_hang_moving", - "8025eed0" : "update_hang_stationary", - "8025ef58" : "act_start_hanging", - "8025f0b4" : "act_hanging", - "8025f1e4" : "act_hang_moving", - "8025f384" : "let_go_of_ledge", - "8025f4b4" : "climb_up_ledge", - "8025f560" : "update_ledge_climb_camera", - "8025f644" : "update_ledge_climb", - "8025f6c0" : "act_ledge_grab", - "8025f970" : "act_ledge_climb_slow", - "8025fa64" : "act_ledge_climb_down", - "8025fae8" : "act_ledge_climb_fast", - "8025fb90" : "act_grabbed", - "8025fc6c" : "act_in_cannon", - "80260154" : "act_tornado_twirling", - "80260568" : "check_common_automatic_cancels", - "802605d0" : "mario_execute_automatic_action", - "802608b0" : "check_common_idle_cancels", - "80260aac" : "check_common_hold_idle_cancels", - "80260cb4" : "act_idle", - "80260f94" : "play_anim_sound", - "80261000" : "act_start_sleeping", - "80261268" : "act_sleeping", - "802614fc" : "act_waking_up", - "8026168c" : "act_shivering", - "802618d8" : "act_coughing", - "802619d0" : "act_hold_idle", - "80261ad0" : "act_hold_heavy_idle", - "80261bf8" : "act_standing_against_wall", - "80261cec" : "act_in_quicksand", - "80261db4" : "act_crouching", - "80261f70" : "act_panting", - "80262080" : "act_hold_panting_unused", - "8026217c" : "stopping_step", - "802621dc" : "act_braking_stop", - "802622dc" : "act_butt_slide_stop", - "80262398" : "act_hold_butt_slide_stop", - "80262490" : "act_slide_kick_slide_stop", - "80262530" : "act_start_crouching", - "80262650" : "act_stop_crouching", - "80262770" : "act_start_crawling", - "80262890" : "act_stop_crawling", - "80262980" : "act_shockwave_bounce", - "80262bc4" : "landing_step", - "80262c34" : "check_common_landing_cancels", - "80262d68" : "act_jump_land_stop", - "80262dc4" : "act_double_jump_land_stop", - "80262e20" : "act_side_flip_land_stop", - "80262e94" : "act_freefall_land_stop", - "80262ef0" : "act_triple_jump_land_stop", - "80262f50" : "act_backflip_land_stop", - "80262fec" : "act_lava_boost_land", - "8026305c" : "act_long_jump_land_stop", - "802630f8" : "act_hold_jump_land_stop", - "802631f0" : "act_hold_freefall_land_stop", - "802632e8" : "act_air_throw_land", - "802633b4" : "act_twirl_land", - "8026350c" : "act_ground_pound_land", - "802635e8" : "act_first_person", - "80263784" : "check_common_stationary_cancels", - "80263898" : "mario_execute_stationary_action", - "80263e60" : "tilt_body_running", - "80263ee4" : "play_step_sound", - "80264024" : "align_with_floor", - "8026409c" : "begin_walking_action", - "802640fc" : "check_ledge_climb_down", - "802642b4" : "slide_bonk", - "80264340" : "set_triple_jump_action", - "8026440c" : "update_sliding_angle", - "80264740" : "update_sliding", - "80264b54" : "apply_slope_accel", - "80264d80" : "apply_landing_accel", - "80264e18" : "update_shell_speed", - "80265080" : "apply_slope_decel", - "802651b0" : "update_decelerating_speed", - "80265244" : "update_walking_speed", - "80265458" : "should_begin_sliding", - "80265514" : "analog_stick_held_back", - "80265558" : "check_ground_dive_or_punch", - "80265620" : "begin_braking_action", - "80265700" : "anim_and_audio_for_walk", - "80265b1c" : "anim_and_audio_for_hold_walk", - "80265d90" : "anim_and_audio_for_heavy_walk", - "80265df8" : "push_or_sidle_wall", - "80266038" : "tilt_body_walking", - "802661cc" : "tilt_body_ground_shell", - "80266354" : "act_walking", - "802665b4" : "act_move_punching", - "80266734" : "act_hold_walking", - "8026699c" : "act_hold_heavy_walking", - "80266af8" : "act_turning_around", - "80266d4c" : "act_finish_turning_around", - "80266e48" : "act_braking", - "80266fc8" : "act_decelerating", - "80267240" : "act_hold_decelerating", - "80267504" : "act_riding_shell_ground", - "80267728" : "act_crawling", - "8026795c" : "act_burning_ground", - "80267c24" : "tilt_body_butt_slide", - "80267ce4" : "common_slide_action", - "80267fa4" : "common_slide_action_with_jump", - "80268074" : "act_butt_slide", - "802680d4" : "act_hold_butt_slide", - "80268168" : "act_crouch_slide", - "80268338" : "act_slide_kick_slide", - "802684ac" : "stomach_slide_action", - "802685c0" : "act_stomach_slide", - "80268608" : "act_hold_stomach_slide", - "80268684" : "act_dive_slide", - "802687b8" : "common_ground_knockback_action", - "802689f8" : "act_hard_backward_ground_kb", - "80268adc" : "act_hard_forward_ground_kb", - "80268b64" : "act_backward_ground_kb", - "80268bb0" : "act_forward_ground_kb", - "80268bfc" : "act_soft_backward_ground_kb", - "80268c48" : "act_soft_forward_ground_kb", - "80268c94" : "act_ground_bonk", - "80268d04" : "act_death_exit_land", - "80268dcc" : "common_landing_action", - "80268f78" : "common_landing_cancels", - "80269108" : "act_jump_land", - "80269170" : "act_freefall_land", - "802691d8" : "act_side_flip_land", - "80269264" : "act_hold_jump_land", - "80269300" : "act_hold_freefall_land", - "8026939c" : "act_long_jump_land", - "8026947c" : "act_double_jump_land", - "802694e4" : "act_triple_jump_land", - "80269588" : "act_backflip_land", - "80269640" : "quicksand_jump_land_action", - "80269788" : "act_quicksand_jump_land", - "802697dc" : "act_hold_quicksand_jump_land", - "80269830" : "check_common_moving_cancels", - "80269954" : "mario_execute_moving_action", - "80269f40" : "play_flip_sounds", - "80269fc0" : "play_far_fall_sound", - "8026a090" : "play_knockback_sound", - "8026a12c" : "lava_boost_on_wall", - "8026a224" : "check_fall_damage", - "8026a400" : "check_kick_or_dive_in_air", - "8026a494" : "should_get_stuck_in_ground", - "8026a598" : "check_fall_damage_or_get_stuck", - "8026a62c" : "check_horizontal_wind", - "8026a818" : "update_air_with_turn", - "8026aa48" : "update_air_without_turn", - "8026acd8" : "update_lava_boost_or_twirling", - "8026ae5c" : "update_flying_yaw", - "8026b004" : "update_flying_pitch", - "8026b17c" : "update_flying", - "8026b444" : "common_air_action_step", - "8026b6a0" : "act_jump", - "8026b740" : "act_double_jump", - "8026b814" : "act_triple_jump", - "8026b90c" : "act_backflip", - "8026b9ac" : "act_freefall", - "8026bab8" : "act_hold_jump", - "8026bbb4" : "act_hold_freefall", - "8026bcc0" : "act_side_flip", - "8026bdcc" : "act_wall_kick_air", - "8026be78" : "act_long_jump", - "8026bf40" : "act_riding_shell_air", - "8026c034" : "act_twirling", - "8026c1e0" : "act_dive", - "8026c4b8" : "act_air_throw", - "8026c5d0" : "act_water_jump", - "8026c738" : "act_hold_water_jump", - "8026c880" : "act_steep_jump", - "8026c9fc" : "act_ground_pound", - "8026cd0c" : "act_burning_jump", - "8026ce50" : "act_burning_fall", - "8026cf28" : "act_crazy_box_bounce", - "8026d1b0" : "common_air_knockback_step", - "8026d33c" : "check_wall_kick", - "8026d3c8" : "act_backward_air_kb", - "8026d43c" : "act_forward_air_kb", - "8026d4b0" : "act_hard_backward_air_kb", - "8026d508" : "act_hard_forward_air_kb", - "8026d560" : "act_thrown_backward", - "8026d608" : "act_thrown_forward", - "8026d6fc" : "act_soft_bonk", - "8026d770" : "act_getting_blown", - "8026d988" : "act_air_hit_wall", - "8026db54" : "act_forward_rollout", - "8026dcf4" : "act_backward_rollout", - "8026de98" : "act_butt_slide_air", - "8026e088" : "act_hold_butt_slide_air", - "8026e2b4" : "act_lava_boost", - "8026e59c" : "act_slide_kick", - "8026e810" : "act_jump_kick", - "8026e968" : "act_shot_from_cannon", - "8026ec00" : "act_flying", - "8026f158" : "act_riding_hoot", - "8026f2ec" : "act_flying_triple_jump", - "8026f614" : "act_top_of_pole_jump", - "8026f660" : "act_vertical_wind", - "8026f840" : "act_special_triple_jump", - "8026fa18" : "check_common_airborne_cancels", - "8026fb04" : "mario_execute_airborne_action", - "8027499c" : "mario_execute_submerged_action", - "80274eb0" : "animated_stationary_ground_step", - "80274f10" : "mario_update_punch_sequence", - "80275328" : "act_punching", - "8027546c" : "act_picking_up", - "802755fc" : "act_dive_picking_up", - "802756c8" : "act_placing_down", - "80275794" : "act_throwing", - "802758c0" : "act_heavy_throw", - "802759b4" : "act_stomach_slide_stop", - "80275a80" : "act_picking_up_bowser", - "80275b34" : "act_holding_bowser", - "80275e78" : "act_releasing_bowser", - "80275f0c" : "check_common_object_cancels", - "80275fe0" : "mario_execute_object_action", - "802761d0" : "geo_envfx_main", - "802763d4" : "geo_skybox_main", - "802764b0" : "geo_draw_mario_head_goddard", - "8027684c" : "bhv_toad_message_loop", - "80276910" : "bhv_toad_message_init", - "80276bb8" : "bhv_unlock_door_star_init", - "80276ccc" : "bhv_unlock_door_star_loop", - "802770a4" : "geo_mirror_mario_set_alpha", - "80277150" : "geo_switch_mario_stand_run", - "802771bc" : "geo_switch_mario_eyes", - "80277294" : "geo_mario_tilt_torso", - "802773a4" : "geo_mario_head_rotation", - "802774f4" : "geo_switch_mario_hand", - "802775cc" : "geo_mario_hand_foot_scaler", - "802776d8" : "geo_switch_mario_cap_effect", - "80277740" : "geo_switch_mario_cap_on_off", - "80277824" : "geo_mario_rotate_wing_cap_wings", - "8027795c" : "geo_switch_mario_hand_grab_pos", - "80277b14" : "geo_render_mirror_mario", - "80277d6c" : "geo_mirror_mario_backface_culling", - "80277ee0" : "set_segment_base_addr", - "80277f20" : "get_segment_base_addr", - "80277f50" : "segmented_to_virtual", - "80277fa8" : "virtual_to_segmented", - "80277ff0" : "move_segment_table_to_dmem", - "80278074" : "main_pool_init", - "80278120" : "main_pool_alloc", - "80278238" : "main_pool_free", - "80278358" : "main_pool_realloc", - "802783c8" : "main_pool_available", - "802783e8" : "main_pool_push_state", - "80278498" : "main_pool_pop_state", - "8027868c" : "load_segment", - "802786f0" : "load_to_fixed_pool_addr", - "802787d8" : "load_segment_decompress", - "802788b4" : "load_segment_decompress_heap", - "80278974" : "load_engine_code_segment", - "80278a14" : "alloc_only_pool_init", - "80278ab8" : "alloc_only_pool_alloc", - "80278b28" : "alloc_only_pool_resize", - "80278b98" : "mem_pool_init", - "80278c58" : "mem_pool_alloc", - "80278d74" : "mem_pool_free", - "80278f2c" : "alloc_display_list", - "80279028" : "func_80278A78", - "80279084" : "load_patchable_table", - "80279840" : "save_file_do_save", - "802798fc" : "save_file_erase", - "80279960" : "save_file_copy", - "802799dc" : "save_file_load_all", - "80279bc8" : "save_file_reload", - "80279c44" : "save_file_collect_star_or_key", - "80279e44" : "save_file_exists", - "80279e80" : "save_file_get_max_coin_score", - "80279f80" : "save_file_get_course_star_count", - "8027a010" : "save_file_get_total_star_count", - "8027a0a8" : "save_file_set_flags", - "8027a0f4" : "save_file_clear_flags", - "8027a16c" : "save_file_get_flags", - "8027a1c8" : "save_file_get_star_flags", - "8027a23c" : "save_file_set_star_flags", - "8027a310" : "save_file_get_course_coin_score", - "8027a340" : "save_file_is_cannon_unlocked", - "8027a390" : "save_file_set_cannon_unlocked", - "8027a418" : "save_file_set_cap_pos", - "8027a4ac" : "save_file_get_cap_pos", - "8027a564" : "save_file_set_sound_mode", - "8027a5b4" : "save_file_get_sound_mode", - "8027a5d4" : "save_file_move_cap_to_default_location", - "8027a698" : "disable_warp_checkpoint", - "8027a6b0" : "check_if_should_set_warp_checkpoint", - "8027a718" : "check_warp_checkpoint", - "8027a7d0" : "override_viewport_and_clip", - "8027a83c" : "set_warp_transition_rgb", - "8027a8b0" : "print_intro_text", - "8027a93c" : "get_mario_spawn_type", - "8027a9c8" : "area_get_warp_node", - "8027aa28" : "area_get_warp_node_from_params", - "8027aa74" : "load_obj_warp_nodes", - "8027ab04" : "clear_areas", - "8027ad74" : "clear_area_graph_nodes", - "8027ae44" : "load_area", - "8027af48" : "unload_area", - "8027afbc" : "load_mario_area", - "8027b038" : "unload_mario_area", - "8027b0c0" : "change_area", - "8027b164" : "area_update_objects", - "8027b1a0" : "play_transition", - "8027b35c" : "play_transition_after_delay", - "8027b3b4" : "render_game", - "8027cf38" : "geo_set_animation_globals", - "8027da84" : "geo_process_held_object", - "8027de68" : "geo_try_process_children", - "8027dea8" : "geo_process_node_and_siblings", - "8027e130" : "geo_process_root", - "8027e3e0" : "profiler_log_thread5_time", - "8027e490" : "profiler_log_thread4_time", - "8027e520" : "profiler_log_gfx_time", - "8027e5cc" : "profiler_log_vblank_time", - "8027e65c" : "draw_profiler_bar", - "8027e958" : "draw_reference_profiler_bars", - "8027ebcc" : "draw_profiler_mode_1", - "8027eeac" : "draw_profiler_mode_0", - "8027f460" : "draw_profiler", - "8027f4e0" : "decompress", - "8027f590" : "set_camera_shake_from_hit", - "8027f8b8" : "set_environmental_camera_shake", - "8027f9f0" : "set_camera_shake_from_point", - "8027fb74" : "unused_set_camera_pitch_shake_env", - "8027fc18" : "calc_y_to_curr_floor", - "8027fe20" : "focus_on_mario", - "8027fff8" : "set_camera_height", - "80280368" : "look_down_slopes", - "802804f4" : "pan_ahead_of_player", - "802806a4" : "find_in_bounds_yaw_wdw_bob_thi", - "80280810" : "update_radial_camera", - "80280970" : "update_8_directions_camera", - "80280b00" : "radial_camera_move", - "80281188" : "lakitu_zoom", - "802813bc" : "radial_camera_input_default", - "802813ec" : "update_yaw_and_dist_from_c_up", - "8028146c" : "mode_radial_camera", - "80281588" : "mode_8_directions_camera", - "802816a0" : "update_outward_radial_camera", - "802817fc" : "mode_outward_radial_camera", - "80281904" : "update_parallel_tracking_camera", - "80282280" : "update_fixed_camera", - "802826a0" : "update_boss_fight_camera", - "80282c0c" : "unused_update_mode_5_camera", - "80282c3c" : "mode_boss_fight_camera", - "80282c7c" : "mode_parallel_tracking_camera", - "80282ce0" : "mode_fixed_camera", - "80282d78" : "update_behind_mario_camera", - "80283340" : "mode_behind_mario", - "80283578" : "update_slide_camera", - "802839e4" : "mode_behind_mario_camera", - "80283a18" : "nop_update_water_camera", - "80283a34" : "mode_water_surface_camera", - "80283a68" : "update_mario_camera", - "80283af8" : "update_default_camera", - "80284cb8" : "mode_default_camera", - "80284cfc" : "mode_lakitu_camera", - "80284d38" : "mode_mario_camera", - "80284d74" : "update_spiral_stairs_camera", - "802850ac" : "mode_spiral_stairs_camera", - "802850ec" : "update_slide_or_0f_camera", - "802851dc" : "mode_slide_camera", - "8028526c" : "store_lakitu_cam_info_for_c_up", - "802852f4" : "set_mode_c_up", - "80285370" : "exit_c_up", - "80285808" : "update_c_up", - "802858a4" : "move_mario_head_c_up", - "80285a2c" : "move_into_c_up", - "80285d20" : "mode_c_up_camera", - "80285ed8" : "update_in_cannon", - "80285f60" : "mode_cannon_camera", - "8028603c" : "transition_next_state", - "80286088" : "transition_to_camera_mode", - "80286188" : "set_camera_mode", - "80286420" : "update_lakitu", - "802868f8" : "update_camera", - "80286f68" : "reset_camera", - "8028724c" : "init_camera", - "802879ec" : "zoom_out_if_paused_and_outside", - "80287bc4" : "select_mario_cam_mode", - "80287be0" : "create_camera", - "80287cb8" : "update_graph_node_camera", - "80287d30" : "geo_camera_main", - "80287dc0" : "stub_camera_2", - "80287dd4" : "stub_camera_3", - "80287de8" : "vec3f_sub", - "80287e28" : "object_pos_to_vec3f", - "80287e50" : "vec3f_to_object_pos", - "80287e78" : "unused_object_angle_to_vec3s", - "80287ea0" : "evaluate_cubic_spline", - "802882e4" : "move_point_along_spline", - "80288624" : "cam_select_alt_mode", - "80288718" : "set_cam_angle", - "80288888" : "set_handheld_shake", - "802889b0" : "shake_camera_handheld", - "80288ce4" : "find_c_buttons_pressed", - "80288e68" : "update_camera_hud_status", - "80288f5c" : "collide_with_walls", - "80289198" : "vec3f_compare", - "80289214" : "clamp_pitch", - "802892d8" : "is_within_100_units_of_mario", - "8028935c" : "set_or_approach_f32_asymptotic", - "802893f4" : "approach_f32_asymptotic_bool", - "80289488" : "approach_f32_asymptotic", - "802894b4" : "approach_s16_asymptotic_bool", - "8028956c" : "approach_s16_asymptotic", - "80289610" : "approach_vec3f_asymptotic", - "80289684" : "set_or_approach_vec3f_asymptotic", - "802896f8" : "approach_vec3s_asymptotic", - "8028976c" : "camera_approach_s16_symmetric_bool", - "8028984c" : "camera_approach_s16_symmetric", - "8028993c" : "set_or_approach_s16_symmetric", - "802899cc" : "camera_approach_f32_symmetric_bool", - "80289b0c" : "camera_approach_f32_symmetric", - "80289c00" : "random_vec3s", - "80289d20" : "reduce_by_dist_from_camera", - "80289f88" : "clamp_positions_and_find_yaw", - "8028a080" : "calc_avoid_yaw", - "8028a0f4" : "is_surf_within_bounding_box", - "8028a4ec" : "is_behind_surface", - "8028a6bc" : "is_range_behind_surface", - "8028a7ec" : "is_mario_behind_surface", - "8028a834" : "scale_along_line", - "8028a8e8" : "is_pos_in_bounds", - "8028aa28" : "calculate_pitch", - "8028aad8" : "calculate_yaw", - "8028ab60" : "calculate_angles", - "8028ac28" : "calc_abs_dist", - "8028accc" : "calc_hor_dist", - "8028ad4c" : "rotate_in_xz", - "8028ae1c" : "rotate_in_yz", - "8028aef0" : "set_camera_pitch_shake", - "8028af4c" : "set_camera_yaw_shake", - "8028b00c" : "set_camera_roll_shake", - "8028b068" : "set_pitch_shake_from_point", - "8028b11c" : "set_yaw_shake_from_point", - "8028b1d0" : "increment_shake_offset", - "8028b218" : "shake_camera_pitch", - "8028b32c" : "shake_camera_yaw", - "8028b438" : "shake_camera_roll", - "8028b50c" : "offset_yaw_outward_radial", - "8028b724" : "cutscene_intro_peach_play_message_music", - "8028b754" : "cutscene_intro_peach_play_lakitu_flying_music", - "8028b784" : "play_camera_buzz_if_cdown", - "8028b7c4" : "play_camera_buzz_if_cbutton", - "8028b804" : "play_camera_buzz_if_c_sideways", - "8028b850" : "play_sound_cbutton_up", - "8028b884" : "play_sound_cbutton_down", - "8028b8b8" : "play_sound_cbutton_side", - "8028b8ec" : "play_sound_button_change_blocked", - "8028b920" : "play_sound_rbutton_changed", - "8028b954" : "play_sound_if_cam_switched_to_lakitu_or_mario", - "8028b9c4" : "radial_camera_input", - "8028bd34" : "trigger_cutscene_dialog", - "8028bd98" : "handle_c_button_movement", - "8028c038" : "clear_cutscene_vars", - "8028c13c" : "start_cutscene", - "8028c18c" : "determine_dance_cutscene", - "8028c26c" : "open_door_cutscene", - "8028c2c8" : "get_cutscene_from_mario_status", - "8028c7a0" : "warp_camera", - "8028c8f0" : "approach_camera_height", - "8028c9ac" : "stub_camera_4", - "8028c9cc" : "set_focus_rel_mario", - "8028cbf0" : "offset_rotated", - "8028cd94" : "offset_rotated_coords", - "8028cdec" : "determine_pushing_or_pulling_door", - "8028ce24" : "next_lakitu_state", - "8028d44c" : "set_camera_mode_fixed", - "8028d5ac" : "set_camera_mode_8_directions", - "8028d5fc" : "set_camera_mode_boss_fight", - "8028d658" : "set_camera_mode_close_cam", - "8028d698" : "set_camera_mode_radial", - "8028d79c" : "parallel_tracking_init", - "8028d888" : "set_fixed_cam_axis_sa_lobby", - "8028d92c" : "check_blocking_area_processing", - "8028da18" : "cam_rr_exit_building_side", - "8028da50" : "cam_rr_exit_building_top", - "8028daec" : "cam_rr_enter_building_window", - "8028db38" : "cam_rr_enter_building", - "8028dbb4" : "cam_rr_enter_building_side", - "8028dbf4" : "cam_cotmc_exit_waterfall", - "8028dc1c" : "cam_sl_snowman_head_8dir", - "8028dc70" : "cam_sl_free_roam", - "8028dca4" : "move_camera_through_floor_while_descending", - "8028dd48" : "cam_hmc_enter_maze", - "8028de2c" : "cam_hmc_elevator_black_hole", - "8028de5c" : "cam_hmc_elevator_maze_emergency_exit", - "8028de90" : "cam_hmc_elevator_lake", - "8028dec4" : "cam_hmc_elevator_maze", - "8028def8" : "cam_ssl_enter_pyramid_top", - "8028df24" : "cam_ssl_pyramid_center", - "8028df6c" : "cam_ssl_boss_room", - "8028dfb4" : "cam_thi_move_cam_through_tunnel", - "8028dfe8" : "cam_thi_look_through_tunnel", - "8028e01c" : "cam_bob_tower", - "8028e064" : "cam_bob_default_free_roam", - "8028e098" : "cam_castle_hmc_start_pool_cutscene", - "8028e0ec" : "cam_castle_lobby_entrance", - "8028e164" : "cam_castle_look_upstairs", - "8028e210" : "cam_castle_basement_look_downstairs", - "8028e298" : "cam_castle_enter_lobby", - "8028e300" : "cam_castle_enter_spiral_stairs", - "8028e38c" : "cam_castle_close_mode", - "8028e3b8" : "cam_castle_leave_lobby_sliding_door", - "8028e3f0" : "cam_castle_enter_lobby_sliding_door", - "8028e41c" : "cam_bbh_room_6", - "8028e450" : "cam_bbh_fall_off_roof", - "8028e47c" : "cam_bbh_fall_into_pool", - "8028e524" : "cam_bbh_room_1", - "8028e55c" : "cam_bbh_leave_front_door", - "8028e594" : "cam_bbh_room_2_lower", - "8028e5cc" : "cam_bbh_room_4", - "8028e604" : "cam_bbh_room_8", - "8028e63c" : "cam_bbh_room_5_library", - "8028e674" : "cam_bbh_room_5_library_to_hidden_transition", - "8028e6c4" : "cam_bbh_room_5_hidden_to_library_transition", - "8028e714" : "cam_bbh_room_5_hidden", - "8028e758" : "cam_bbh_room_3", - "8028e790" : "cam_bbh_room_7_mr_i", - "8028e7c8" : "cam_bbh_room_7_mr_i_to_coffins_transition", - "8028e818" : "cam_bbh_room_7_coffins_to_mr_i_transition", - "8028e868" : "cam_bbh_elevator_room_lower", - "8028e8a0" : "cam_bbh_room_0_back_entrance", - "8028e8cc" : "cam_bbh_elevator", - "8028e930" : "cam_bbh_room_12_upper", - "8028e974" : "cam_bbh_enter_front_door", - "8028e9a0" : "cam_bbh_room_2_library", - "8028e9d8" : "cam_bbh_room_2_library_to_trapdoor_transition", - "8028ea28" : "cam_bbh_room_2_trapdoor", - "8028ea60" : "cam_bbh_room_2_trapdoor_transition", - "8028eab0" : "cam_bbh_room_9_attic", - "8028eae8" : "cam_bbh_room_9_attic_transition", - "8028eb38" : "cam_bbh_room_9_mr_i_transition", - "8028eb88" : "cam_bbh_room_13_balcony", - "8028ebc0" : "cam_bbh_room_0", - "8028ec04" : "cam_ccm_enter_slide_shortcut", - "8028ec2c" : "cam_ccm_leave_slide_shortcut", - "8028ec58" : "surface_type_modes", - "8028ed30" : "set_mode_if_not_set_by_surface", - "8028ed98" : "surface_type_modes_thi", - "8028eeb0" : "camera_course_processing", - "8028f670" : "resolve_geometry_collisions", - "8028f914" : "rotate_camera_around_walls", - "8028fc9c" : "find_mario_floor_and_ceil", - "8028fe24" : "start_object_cutscene", - "8028fe58" : "start_object_cutscene_without_focus", - "8028fe84" : "unused_dialog_cutscene_response", - "8028ff04" : "cutscene_object_with_dialog", - "8028ffc8" : "cutscene_object_without_dialog", - "8029000c" : "cutscene_object", - "80290098" : "update_camera_yaw", - "802900e0" : "cutscene_reset_spline", - "80290104" : "stop_cutscene_and_retrieve_stored_info", - "80290168" : "cap_switch_save", - "802901a4" : "init_spline_point", - "802901fc" : "copy_spline_segment", - "802903b8" : "cutscene_common_set_dialog_state", - "802904a8" : "cutscene_intro_peach_start_letter_music", - "802904e4" : "cutscene_intro_peach_start_flying_music", - "8029051c" : "reset_pan_distance", - "8029053c" : "player2_rotate_cam", - "80290784" : "store_info_cannon", - "802907f4" : "retrieve_info_cannon", - "80290864" : "store_info_star", - "802908e8" : "retrieve_info_star", - "802909d0" : "pan_camera", - "80290a5c" : "cutscene_shake_explosion", - "80290abc" : "rotate_and_move_vec3f", - "80290b54" : "set_flag_post_door", - "80290ba4" : "cutscene_soften_music", - "80290bd8" : "cutscene_unsoften_music", - "80290c1c" : "cutscene_unused_start", - "80290c30" : "cutscene_unused_loop", - "80290c44" : "cutscene_ending_mario_fall_start", - "80290c9c" : "cutscene_ending_mario_fall_focus_mario", - "80290d90" : "cutscene_ending_mario_fall", - "80290e00" : "cutscene_ending_mario_land_closeup", - "80290e74" : "cutscene_ending_reset_spline", - "80290eb0" : "cutscene_ending_fly_up_to_window", - "80290f1c" : "cutscene_ending_stars_free_peach", - "80290f8c" : "cutscene_ending_mario_land", - "80291074" : "cutscene_ending_peach_appear_closeup", - "80291108" : "cutscene_ending_peach_appears", - "802911c8" : "cutscene_ending_peach_descends_start", - "80291208" : "cutscene_ending_follow_peach_descent", - "8029127c" : "cutscene_ending_peach_descent_lower_focus", - "802912b8" : "cutscene_ending_peach_descent_back_to_mario", - "80291354" : "cutscene_ending_peach_descends", - "8029142c" : "cutscene_ending_mario_to_peach", - "802914cc" : "cutscene_ending_look_up_at_castle", - "80291514" : "cutscene_ending_peach_wakeup", - "802915d4" : "cutscene_ending_dialog", - "80291654" : "cutscene_ending_kiss_closeup", - "802916b8" : "cutscene_ending_kiss_here_we_go", - "80291774" : "cutscene_ending_kiss", - "802917e4" : "cutscene_ending_look_at_sky", - "8029184c" : "cutscene_ending_zoom_fov", - "80291870" : "cutscene_ending_cake_for_mario", - "80291924" : "cutscene_ending_stop", - "80291964" : "cutscene_grand_star_start", - "802919dc" : "cutscene_grand_star_front_of_mario", - "80291ab4" : "cutscene_grand_star_mario_jump", - "80291b18" : "cutscene_grand_star_accel_cvar2", - "80291b68" : "cutscene_grand_star_approach_mario", - "80291bf4" : "cutscene_grand_star_move_cvar2", - "80291c3c" : "cutscene_grand_star_focus_mario", - "80291cd0" : "cutscene_grand_star", - "80291db0" : "cutscene_grand_star_fly_start", - "80291e84" : "cutscene_grand_star_fly_move_to_mario", - "80291f18" : "cutscene_grand_star_fly_mario_offscreen", - "80292038" : "cutscene_grand_star_fly_app_cvars", - "80292164" : "cutscene_grand_star_fly", - "802921fc" : "focus_in_front_of_mario", - "8029228c" : "cutscene_dance_move_to_mario", - "80292324" : "cutscene_dance_rotate", - "80292370" : "cutscene_dance_rotate_move_back", - "802923b8" : "cutscene_dance_rotate_move_towards_mario", - "80292414" : "cutscene_dance_default_focus_mario", - "8029244c" : "cutscene_dance_rotate_focus_mario", - "80292484" : "cutscene_dance_shake_fov", - "802924b8" : "cutscene_dance_default_rotate", - "80292628" : "star_dance_bound_yaw", - "802926dc" : "cutscene_dance_closeup_start", - "802927d0" : "cutscene_dance_closeup_focus_mario", - "80292868" : "cutscene_dance_closeup_fly_above", - "80292974" : "cutscene_dance_closeup_fly_closer", - "80292a20" : "cutscene_dance_closeup_zoom", - "80292a4c" : "cutscene_dance_closeup_shake_fov", - "80292a80" : "cutscene_dance_closeup", - "80292c00" : "cutscene_dance_fly_away_start", - "80292d80" : "cutscene_dance_fly_away_approach_mario", - "80292e2c" : "cutscene_dance_fly_away_focus_mario", - "80292ec4" : "cutscene_pan_cvar9", - "80292f40" : "cutscene_dance_fly_rotate_around_mario", - "80292f98" : "cutscene_dance_fly_away_rotate_while_flying", - "80292fe4" : "cutscene_dance_fly_away_shake_fov", - "80293018" : "cutscene_dance_fly_away", - "802930f0" : "cutscene_key_dance_jump_cvar", - "80293164" : "cutscene_key_dance_jump_closeup", - "802931c0" : "cutscene_key_dance_jump_lower_left", - "80293220" : "cutscene_key_dance_jump_above", - "8029328c" : "cutscene_key_dance_jump_last", - "802932f4" : "cutscene_key_dance_shake_fov", - "80293328" : "cutscene_key_dance_handheld_shake", - "80293354" : "cutscene_key_dance_focus_mario", - "8029338c" : "cutscene_key_dance", - "80293488" : "cutscene_bowser_area_shake_fov", - "802934b4" : "cutscene_bowser_area_start_bowser_walking", - "802934d8" : "cutscene_bowser_arena_set_pos", - "80293548" : "cutscene_bowser_arena_focus_sine", - "802935e0" : "cutscene_bowser_arena_set_focus", - "80293624" : "cutscene_bowser_arena_adjust_offsets", - "8029369c" : "cutscene_bowser_arena_pan_left", - "802936dc" : "cutscene_bowser_arena_mario_dialog", - "80293708" : "cutscene_stop_dialog", - "80293734" : "cutscene_bowser_arena_start", - "802937e8" : "bowser_fight_intro_dialog", - "8029386c" : "cutscene_bowser_arena_dialog", - "802938c8" : "cutscene_bowser_arena_end", - "80293944" : "cutscene_bowser_arena", - "80293abc" : "cutscene_star_spawn_store_info", - "80293ae8" : "cutscene_star_spawn_focus_star", - "80293b70" : "cutscene_star_spawn_update_boss_fight", - "80293bf4" : "cutscene_star_spawn_fly_back", - "80293c2c" : "cutscene_star_spawn", - "80293cb0" : "cutscene_star_spawn_back", - "80293d5c" : "cutscene_star_spawn_end", - "80293d90" : "cutscene_exit_waterfall_warp", - "80293dd4" : "cutscene_exit_to_castle_grounds_focus_mario", - "80293e7c" : "cutscene_exit_waterfall", - "80293ed8" : "cutscene_exit_to_castle_grounds_end", - "80293f2c" : "cutscene_exit_fall_to_castle_grounds_warp", - "80293f70" : "cutscene_exit_fall_to_castle_grounds", - "80293fcc" : "cutscene_red_coin_star_start", - "80294024" : "cutscene_red_coin_star_focus_xz", - "80294088" : "cutscene_red_coin_star_focus_y", - "802940cc" : "cutscene_red_coin_star_look_up_at_star", - "8029410c" : "cutscene_red_coin_star_warp", - "802942cc" : "cutscene_red_coin_star_set_fov", - "802942f0" : "cutscene_red_coin_star", - "802943d4" : "cutscene_red_coin_star_end", - "80294428" : "cutscene_goto_cvar_pos", - "80294718" : "cutscene_prepare_cannon_start", - "802947a4" : "cutscene_prepare_cannon_fly_to_cannon", - "8029480c" : "cannon_approach_prev", - "802948a0" : "cutscene_prepare_cannon_fly_back", - "80294a14" : "cutscene_prepare_cannon", - "80294a94" : "cutscene_prepare_cannon_end", - "80294ae8" : "water_death_move_to_mario_side", - "80294b78" : "death_goto_mario", - "80294bb4" : "cutscene_death_standing_start", - "80294c28" : "cutscene_death_standing_goto_mario", - "80294c5c" : "cutscene_death_standing", - "80294cc4" : "cutscene_death_stomach_start", - "80294d48" : "cutscene_death_stomach_goto_mario", - "80294db4" : "cutscene_death_stomach", - "80294e24" : "cutscene_bbh_death_start", - "80294ea8" : "cutscene_bbh_death_goto_mario", - "80294ee8" : "cutscene_bbh_death", - "80294f58" : "cutscene_quicksand_death_start", - "80294f94" : "cutscene_quicksand_death_goto_mario", - "80294fec" : "cutscene_quicksand_death", - "802950b0" : "cutscene_suffocation_fly_away", - "80295140" : "cutscene_suffocation_stay_above_gas", - "802951f0" : "cutscene_suffocation_rotate", - "80295270" : "cutscene_suffocation", - "80295310" : "cutscene_enter_pool_start", - "802953dc" : "cutscene_enter_pool_loop", - "80295418" : "cutscene_enter_pool", - "80295480" : "cutscene_pyramid_top_explode_start", - "802954ec" : "cutscene_pyramid_top_explode_zoom_in", - "80295518" : "cutscene_pyramid_top_explode_focus", - "80295580" : "cutscene_pyramid_top_explode_warp", - "80295670" : "cutscene_pyramid_top_explode_closeup", - "80295740" : "cutscene_pyramid_top_explode_cam_shake", - "8029576c" : "cutscene_pyramid_top_explode_warp_back", - "802957c8" : "cutscene_pyramid_top_explode", - "80295894" : "cutscene_pyramid_top_explode_end", - "802958d4" : "cutscene_enter_pyramid_top_start", - "80295930" : "cutscene_enter_pyramid_top", - "80295a58" : "cutscene_dialog_start", - "80295bf0" : "cutscene_dialog_move_mario_shoulder", - "80295e24" : "cutscene_dialog_create_dialog_box", - "80295e8c" : "cutscene_dialog", - "80295fb0" : "cutscene_dialog_set_flag", - "80295fd8" : "cutscene_dialog_end", - "80296020" : "cutscene_read_message_start", - "80296160" : "cutscene_read_message", - "802962c8" : "cutscene_read_message_set_flag", - "802962f0" : "cutscene_read_message_end", - "80296318" : "cutscene_exit_succ_start", - "802963b8" : "cutscene_non_painting_set_cam_pos", - "8029652c" : "cutscene_non_painting_set_cam_focus", - "8029665c" : "cutscene_exit_bowser_succ_focus_left", - "8029669c" : "cutscene_exit_bowser_key_toss_shake", - "802966e4" : "cutscene_exit_succ_shake_landing", - "80296710" : "cutscene_exit_bowser_succ", - "802967c4" : "cutscene_non_painting_end", - "8029685c" : "cutscene_exit_non_painting_succ_override_cvar", - "802968a0" : "cutscene_exit_non_painting_succ", - "8029695c" : "cutscene_non_painting_death_start", - "802969f8" : "cutscene_exit_bowser_death", - "80296a64" : "cutscene_non_painting_death_override_offset", - "80296b30" : "cutscene_non_painting_death", - "80296bc8" : "cutscene_cap_switch_press_start", - "80296c4c" : "cutscene_cap_switch_press_rotate_around_mario", - "80296d60" : "cutscene_cap_switch_press_lower_cam", - "80296da8" : "cutscene_cap_switch_press_approach_mario", - "80296eb4" : "cutscene_cap_switch_press_pan_left", - "80296f38" : "cutscene_cap_switch_press_create_dialog", - "80296fa8" : "cutscene_cap_switch_press", - "80297148" : "cutscene_unlock_key_door_start", - "8029720c" : "cutscene_unlock_key_door_approach_mario", - "80297290" : "cutscene_unlock_key_door_focus_lock", - "802972ec" : "cutscene_unlock_key_door_stub", - "80297300" : "cutscene_unlock_key_door_fly_back", - "80297384" : "cutscene_unlock_key_door_fov_shake", - "802973b0" : "cutscene_unlock_key_door", - "80297464" : "intro_peach_move_camera_start_to_pipe", - "80297560" : "peach_letter_text", - "8029758c" : "play_sound_peach_reading_letter", - "802975c4" : "cutscene_intro_peach_start_to_pipe_spline", - "8029762c" : "cutscene_intro_peach_dialog", - "802976bc" : "cutscene_intro_peach_follow_pipe_spline", - "80297728" : "cutscene_intro_peach_clear_cutscene_status", - "80297748" : "cutscene_intro_peach_zoom_fov", - "80297784" : "cutscene_intro_peach_reset_spline", - "802977c8" : "cutscene_intro_peach_handheld_shake_off", - "802977f4" : "intro_pipe_exit_text", - "80297820" : "play_sound_intro_turn_on_hud", - "8029784c" : "cutscene_intro_peach_fly_to_pipe", - "80297908" : "cutscene_intro_peach_mario_appears", - "80297a38" : "cutscene_intro_peach_reset_fov", - "80297a64" : "cutscene_intro_peach_letter", - "80297b58" : "cutscene_end_waving_start", - "80297b84" : "cutscene_end_waving", - "80297c14" : "cutscene_credits_reset_spline", - "80297c40" : "cutscene_credits", - "802980dc" : "cutscene_sliding_doors_open_start", - "8029819c" : "cutscene_sliding_doors_open_set_cvars", - "80298218" : "cutscene_sliding_doors_go_under_doorway", - "80298254" : "cutscene_sliding_doors_fly_back_up", - "80298290" : "cutscene_sliding_doors_follow_mario", - "802983b4" : "cutscene_sliding_doors_open", - "80298458" : "cutscene_double_doors_end", - "802984a0" : "cutscene_enter_painting_stub", - "802984b4" : "cutscene_enter_painting", - "802987b0" : "cutscene_exit_painting_start", - "8029894c" : "cutscene_exit_painting_move_to_mario", - "802989e8" : "cutscene_exit_painting_move_to_floor", - "80298af8" : "cutscene_exit_painting", - "80298ba0" : "cutscene_unused_exit_start", - "80298c2c" : "cutscene_unused_exit_focus_mario", - "80298ccc" : "cutscene_exit_painting_end", - "80298d44" : "cutscene_enter_cannon_end", - "80298d9c" : "cutscene_enter_cannon_raise", - "80298fe8" : "cutscene_enter_cannon_start", - "80299100" : "cutscene_door_start", - "80299154" : "cutscene_door_fix_cam", - "802991a8" : "cutscene_door_loop", - "802991f0" : "cutscene_door_move_behind_mario", - "802992cc" : "cutscene_door_follow_mario", - "80299360" : "cutscene_door_end", - "80299404" : "cutscene_door_mode", - "802994e8" : "play_cutscene", - "8029a2f8" : "cutscene_event", - "8029a37c" : "cutscene_spawn_obj", - "8029a3b4" : "set_fov_shake", - "8029a41c" : "set_fov_shake_from_point", - "8029a4d0" : "shake_camera_fov", - "8029a5e8" : "set_fov_30", - "8029a60c" : "approach_fov_20", - "8029a64c" : "set_fov_45", - "8029a670" : "set_fov_29", - "8029a694" : "zoom_fov_30", - "8029a6f4" : "fov_default", - "8029a858" : "approach_fov_30", - "8029a894" : "approach_fov_60", - "8029a8d0" : "approach_fov_45", - "8029a968" : "approach_fov_80", - "8029a9a4" : "set_fov_bbh", - "8029aa3c" : "geo_camera_fov", - "8029ab94" : "set_fov_function", - "8029abb0" : "cutscene_set_fov_shake_preset", - "8029ac30" : "set_fov_shake_from_point_preset", - "8029aef8" : "obj_rotate_towards_point", - "8029af98" : "intro_peach_set_pos_and_opacity", - "8029b08c" : "bhv_intro_peach_loop", - "8029b28c" : "intro_lakitu_set_offset_from_camera", - "8029b358" : "intro_lakitu_set_focus", - "8029b3c8" : "intro_lakitu_set_pos_and_focus", - "8029b49c" : "bhv_intro_lakitu_loop", - "8029bde4" : "bhv_end_birds_1_loop", - "8029bf64" : "bhv_end_birds_2_loop", - "8029c0e4" : "spawn_child_obj_relative", - "8029c254" : "bhv_intro_scene_loop", - "8029c770" : "nop_change_course", - "8029c780" : "copy_mario_state_to_object", - "8029c9cc" : "spawn_particle", - "8029ca58" : "bhv_mario_update", - "8029cb34" : "update_objects_starting_at", - "8029cbc8" : "update_objects_during_time_stop", - "8029cd28" : "update_objects_in_list", - "8029cd98" : "unload_deactivated_objects_in_list", - "8029ce58" : "set_object_respawn_info_bits", - "8029cedc" : "unload_objects_from_area", - "8029cfb0" : "spawn_objects_from_info", - "8029d1d8" : "stub_obj_list_processor_1", - "8029d1e8" : "clear_objects", - "8029d324" : "update_terrain_objects", - "8029d374" : "update_non_terrain_objects", - "8029d428" : "unload_deactivated_objects", - "8029d690" : "update_objects", - "8029d890" : "geo_update_projectile_pos_from_parent", - "8029d924" : "geo_update_layer_transparency", - "8029db48" : "geo_switch_anim_state", - "8029dbd4" : "geo_switch_area", - "8029dcd4" : "obj_update_pos_from_parent_transformation", - "8029dda8" : "obj_apply_scale_to_matrix", - "8029de80" : "create_transformation_from_matrices", - "8029e1b0" : "obj_set_held_state", - "8029e27c" : "lateral_dist_between_objects", - "8029e2f8" : "dist_between_objects", - "8029e398" : "cur_obj_forward_vel_approach_upward", - "8029e3e8" : "approach_f32_signed", - "8029e494" : "approach_f32_symmetric", - "8029e530" : "approach_s16_symmetric", - "8029e5ec" : "cur_obj_rotate_yaw_toward", - "8029e694" : "obj_angle_to_object", - "8029e714" : "obj_turn_toward_object", - "8029e8bc" : "obj_set_parent_relative_pos", - "8029e914" : "obj_set_pos", - "8029e96c" : "obj_set_angle", - "8029e9ac" : "spawn_object_abs_with_rot", - "8029ea24" : "spawn_object_rel_with_rot", - "8029eaac" : "spawn_obj_with_transform_flags", - "8029eb04" : "spawn_water_droplet", - "8029ed20" : "spawn_object_at_origin", - "8029edcc" : "spawn_object", - "8029ee24" : "try_to_spawn_object", - "8029eeb8" : "spawn_object_with_scale", - "8029ef64" : "spawn_object_relative", - "8029effc" : "spawn_object_relative_with_scale", - "8029f070" : "cur_obj_move_using_vel", - "8029f0c8" : "obj_copy_graph_y_offset", - "8029f0e0" : "obj_copy_pos_and_angle", - "8029f120" : "obj_copy_pos", - "8029f148" : "obj_copy_angle", - "8029f188" : "obj_set_gfx_pos_from_pos", - "8029f1b0" : "obj_init_animation", - "8029f200" : "linear_mtxf_mul_vec3f", - "8029f274" : "linear_mtxf_transpose_mul_vec3f", - "8029f2ec" : "obj_apply_scale_to_transform", - "8029f3a8" : "obj_copy_scale", - "8029f3d0" : "obj_scale_xyz", - "8029f404" : "obj_scale", - "8029f430" : "cur_obj_scale", - "8029f464" : "cur_obj_init_animation", - "8029f4b4" : "cur_obj_init_animation_with_sound", - "8029f514" : "cur_obj_init_animation_with_accel_and_sound", - "8029f59c" : "obj_init_animation_with_sound", - "8029f600" : "cur_obj_enable_rendering_and_become_tangible", - "8029f620" : "cur_obj_enable_rendering", - "8029f644" : "cur_obj_disable_rendering_and_become_intangible", - "8029f66c" : "cur_obj_disable_rendering", - "8029f694" : "cur_obj_unhide", - "8029f6bc" : "cur_obj_hide", - "8029f6e0" : "cur_obj_set_pos_relative", - "8029f7d8" : "cur_obj_set_pos_relative_to_parent", - "8029f820" : "cur_obj_enable_rendering_2", - "8029f848" : "cur_obj_unused_init_on_floor", - "8029f8ec" : "obj_set_face_angle_to_move_angle", - "8029f914" : "get_object_list_from_behavior", - "8029f95c" : "cur_obj_nearest_object_with_behavior", - "8029f998" : "cur_obj_dist_to_nearest_object_with_behavior", - "8029f9ec" : "cur_obj_find_nearest_object_with_behavior", - "8029fb1c" : "find_unimportant_object", - "8029fb68" : "count_unimportant_objects", - "8029fbdc" : "count_objects_with_behavior", - "8029fc9c" : "cur_obj_find_nearby_held_actor", - "8029fdb4" : "cur_obj_change_action", - "8029fe00" : "cur_obj_set_vel_from_mario_vel", - "8029fe6c" : "cur_obj_reverse_animation", - "8029fea4" : "cur_obj_extend_animation_if_at_end", - "8029ff04" : "cur_obj_check_if_near_animation_end", - "8029ffa4" : "cur_obj_check_if_at_animation_end", - "802a0008" : "cur_obj_check_anim_frame", - "802a0050" : "cur_obj_check_anim_frame_in_range", - "802a00ac" : "cur_obj_check_frame_prior_current_frame", - "802a0114" : "mario_is_in_air_action", - "802a0154" : "mario_is_dive_sliding", - "802a0198" : "cur_obj_set_y_vel_and_animation", - "802a01d8" : "cur_obj_unrender_and_reset_state", - "802a0380" : "cur_obj_get_thrown_or_placed", - "802a0474" : "cur_obj_get_dropped", - "802a04c0" : "cur_obj_set_model", - "802a04f0" : "mario_set_flag", - "802a0514" : "cur_obj_clear_interact_status_flag", - "802a0568" : "obj_mark_for_deletion", - "802a057c" : "cur_obj_disable", - "802a05b4" : "cur_obj_become_intangible", - "802a05d4" : "cur_obj_become_tangible", - "802a05f0" : "obj_become_tangible", - "802a0604" : "cur_obj_update_floor_height", - "802a064c" : "cur_obj_update_floor_height_and_get_floor", - "802a079c" : "cur_obj_apply_drag_xz", - "802a0e68" : "cur_obj_move_y", - "802a113c" : "cur_obj_unused_resolve_wall_collisions", - "802a11a8" : "abs_angle_diff", - "802a120c" : "cur_obj_move_xz_using_fvel_and_yaw", - "802a12a4" : "cur_obj_move_y_with_terminal_vel", - "802a1308" : "cur_obj_compute_vel_xz", - "802a1370" : "increment_velocity_toward_range", - "802a1424" : "obj_check_if_collided_with_object", - "802a148c" : "cur_obj_set_behavior", - "802a14c4" : "obj_set_behavior", - "802a14fc" : "cur_obj_has_behavior", - "802a1554" : "obj_has_behavior", - "802a15ac" : "cur_obj_lateral_dist_from_mario_to_home", - "802a1634" : "cur_obj_lateral_dist_to_home", - "802a16ac" : "cur_obj_outside_home_square", - "802a1774" : "cur_obj_outside_home_rectangle", - "802a184c" : "cur_obj_set_pos_to_home", - "802a188c" : "cur_obj_set_pos_to_home_and_stop", - "802a18dc" : "cur_obj_shake_y", - "802a1930" : "cur_obj_start_cam_event", - "802a1960" : "set_mario_interact_hoot_if_in_range", - "802a19ac" : "obj_set_billboard", - "802a19c8" : "cur_obj_set_hitbox_radius_and_height", - "802a19f0" : "cur_obj_set_hurtbox_radius_and_height", - "802a1b34" : "obj_spawn_loot_blue_coins", - "802a1b8c" : "obj_spawn_loot_yellow_coins", - "802a1bdc" : "cur_obj_spawn_loot_coin_at_mario_pos", - "802a1c68" : "cur_obj_abs_y_dist_to_home", - "802a1cc4" : "cur_obj_advance_looping_anim", - "802a1f3c" : "cur_obj_resolve_wall_collisions", - "802a2320" : "cur_obj_update_floor_and_walls", - "802a2348" : "cur_obj_move_standard", - "802a25b4" : "cur_obj_move_using_vel_and_gravity", - "802a2644" : "cur_obj_move_using_fvel_and_gravity", - "802a2674" : "obj_set_pos_relative", - "802a2748" : "cur_obj_angle_to_home", - "802a27b0" : "obj_set_gfx_pos_at_obj_pos", - "802a2804" : "obj_translate_local", - "802a2930" : "obj_build_transform_from_pos_and_angle", - "802a2a18" : "obj_set_throw_matrix_from_transform", - "802a2a84" : "obj_build_transform_relative_to_parent", - "802a2b28" : "obj_create_transform_from_self", - "802a2b6c" : "cur_obj_rotate_move_angle_using_vel", - "802a2bc4" : "cur_obj_rotate_face_angle_using_vel", - "802a2c1c" : "cur_obj_set_face_angle_to_move_angle", - "802a2c5c" : "cur_obj_follow_path", - "802a2ed4" : "chain_segment_init", - "802a2f14" : "random_f32_around_zero", - "802a2f5c" : "obj_scale_random", - "802a2fc0" : "obj_translate_xyz_random", - "802a308c" : "obj_translate_xz_random", - "802a31e0" : "cur_obj_set_pos_via_transform", - "802a3268" : "cur_obj_reflect_move_angle_off_wall", - "802a32ac" : "cur_obj_spawn_particles", - "802a34a4" : "obj_set_hitbox", - "802a3604" : "signum_positive", - "802a3634" : "absf", - "802a3674" : "absi", - "802a36a4" : "cur_obj_wait_then_blink", - "802a3754" : "cur_obj_is_mario_ground_pounding_platform", - "802a37ac" : "spawn_mist_particles", - "802a37dc" : "spawn_mist_particles_with_sound", - "802a3818" : "cur_obj_push_mario_away", - "802a390c" : "cur_obj_push_mario_away_from_cylinder", - "802a399c" : "bhv_dust_smoke_loop", - "802a3a4c" : "cur_obj_set_direction_table", - "802a3a88" : "cur_obj_progress_direction_table", - "802a3b28" : "stub_obj_helpers_3", - "802a3b40" : "cur_obj_scale_over_time", - "802a3c18" : "cur_obj_set_pos_to_home_with_debug", - "802a3cec" : "stub_obj_helpers_4", - "802a3cfc" : "cur_obj_is_mario_on_platform", - "802a3d40" : "cur_obj_shake_y_until", - "802a3dd4" : "cur_obj_move_up_and_down", - "802a3e30" : "cur_obj_call_action_function", - "802a3ef8" : "spawn_base_star_with_no_lvl_exit", - "802a3f24" : "bit_shift_left", - "802a3f48" : "cur_obj_mario_far_away", - "802a404c" : "is_mario_moving_fast_or_in_air", - "802a40b8" : "is_item_in_array", - "802a4120" : "bhv_init_room", - "802a4210" : "cur_obj_enable_rendering_if_mario_in_room", - "802a4360" : "cur_obj_set_hitbox_and_die_if_attacked", - "802a4440" : "obj_explode_and_spawn_coins", - "802a44f4" : "obj_set_collision_data", - "802a452c" : "cur_obj_if_hit_wall_bounce_away", - "802a4564" : "cur_obj_hide_if_mario_far_away_y", - "802a45e4" : "geo_offset_klepto_held_object", - "802a462c" : "geo_offset_klepto_debug", - "802a46cc" : "obj_is_hidden", - "802a4704" : "enable_time_stop", - "802a4728" : "disable_time_stop", - "802a4750" : "set_time_stop_flags", - "802a4774" : "clear_time_stop_flags", - "802a47a0" : "cur_obj_can_mario_activate_textbox", - "802a48bc" : "cur_obj_can_mario_activate_textbox_2", - "802a4960" : "cur_obj_update_dialog", - "802a4be4" : "cur_obj_update_dialog_with_cutscene", - "802a4f04" : "cur_obj_has_model", - "802a4f58" : "cur_obj_align_gfx_with_floor", - "802a5034" : "mario_is_within_rectangle", - "802a50fc" : "cur_obj_shake_screen", - "802a513c" : "obj_attack_collided_from_other_object", - "802a51ac" : "cur_obj_was_attacked_or_ground_pounded", - "802a5228" : "obj_copy_behavior_params", - "802a5248" : "cur_obj_init_animation_and_anim_frame", - "802a5288" : "cur_obj_init_animation_and_check_if_near_end", - "802a52c4" : "cur_obj_init_animation_and_extend_if_at_end", - "802a52f8" : "cur_obj_check_grabbed_mario", - "802a5358" : "player_performed_grab_escape_action", - "802a540c" : "cur_obj_unused_play_footstep_sound", - "802a5460" : "enable_time_stop_including_mario", - "802a5498" : "disable_time_stop_including_mario", - "802a54d8" : "cur_obj_check_interacted", - "802a5524" : "cur_obj_spawn_loot_blue_coin", - "802a5588" : "cur_obj_spawn_star_at_y_offset", - "802a5620" : "star_door_update_pos", - "802a56bc" : "bhv_star_door_loop", - "802a58dc" : "bhv_piranha_particle_loop", - "802a597c" : "mr_i_piranha_particle_act_0", - "802a5a44" : "mr_i_piranha_particle_act_1", - "802a5aa0" : "bhv_mr_i_particle_loop", - "802a5acc" : "spawn_mr_i_particle", - "802a5bd4" : "bhv_mr_i_body_loop", - "802a5d4c" : "mr_i_act_3", - "802a6518" : "mr_i_act_2", - "802a68a0" : "mr_i_act_1", - "802a6ad8" : "mr_i_act_0", - "802a6b7c" : "bhv_mr_i_loop", - "802a6c20" : "bhv_pole_init", - "802a6c74" : "bhv_giant_pole_loop", - "802a6cf4" : "bhv_thi_huge_island_top_loop", - "802a6d64" : "bhv_thi_tiny_island_top_loop", - "802a6ee4" : "cap_switch_act_0", - "802a7020" : "cap_switch_act_1", - "802a708c" : "cap_switch_act_2", - "802a7160" : "cap_switch_act_3", - "802a7170" : "bhv_cap_switch_loop", - "802a719c" : "geo_update_held_mario_pos", - "802a7230" : "bhv_bobomb_anchor_mario_loop", - "802a7264" : "king_bobomb_act_0", - "802a7384" : "mario_is_far_below_object", - "802a73d8" : "king_bobomb_act_2", - "802a7598" : "king_bobomb_act_3", - "802a7804" : "king_bobomb_act_1", - "802a78d8" : "king_bobomb_act_6", - "802a7a60" : "king_bobomb_act_7", - "802a7b1c" : "king_bobomb_act_8", - "802a7b5c" : "king_bobomb_act_4", - "802a7d14" : "king_bobomb_act_5", - "802a7fbc" : "king_bobomb_move", - "802a8064" : "bhv_king_bobomb_loop", - "802a816c" : "bhv_beta_chest_bottom_init", - "802a81e8" : "bhv_beta_chest_bottom_loop", - "802a821c" : "bhv_beta_chest_lid_loop", - "802a8370" : "bhv_water_air_bubble_init", - "802a83a0" : "bhv_water_air_bubble_loop", - "802a8630" : "bhv_bubble_wave_init", - "802a86bc" : "scale_bubble_random", - "802a870c" : "bhv_bubble_maybe_loop", - "802a88a4" : "bhv_small_water_wave_loop", - "802a8a38" : "scale_bubble_sin", - "802a8b18" : "bhv_particle_init", - "802a8bc0" : "bhv_particle_loop", - "802a8c88" : "bhv_small_bubbles_loop", - "802a8cdc" : "bhv_fish_group_loop", - "802a8d48" : "bhv_water_waves_init", - "802a8d98" : "bhv_cannon_base_unused_loop", - "802a8dc0" : "opened_cannon_act_0", - "802a8f40" : "opened_cannon_act_4", - "802a9114" : "opened_cannon_act_6", - "802a92fc" : "opened_cannon_act_5", - "802a93f8" : "opened_cannon_act_1", - "802a9440" : "opened_cannon_act_2", - "802a9460" : "opened_cannon_act_3", - "802a9498" : "bhv_cannon_base_loop", - "802a94f8" : "bhv_cannon_barrel_loop", - "802a958c" : "common_anchor_mario_behavior", - "802a9708" : "bhv_chuckya_anchor_mario_loop", - "802a973c" : "unknown_chuckya_function", - "802a98c4" : "approach_forward_vel", - "802a9994" : "chuckya_act_0", - "802a9d08" : "chuckya_act_1", - "802a9f54" : "chuckya_act_3", - "802a9fc8" : "chuckya_act_2", - "802aa02c" : "chuckya_move", - "802aa0ac" : "bhv_chuckya_loop", - "802aa1b8" : "bhv_wf_breakable_wall_loop", - "802aa280" : "check_mario_attacking", - "802aa3c8" : "init_kickable_board_rock", - "802aa3f4" : "bhv_kickable_board_loop", - "802aa700" : "bhv_tower_door_loop", - "802aa774" : "bhv_wf_rotating_wooden_platform_loop", - "802aa830" : "bhv_rotating_platform_loop", - "802aa948" : "set_koopa_shell_underwater_hitbox", - "802aa97c" : "bhv_koopa_shell_underwater_loop", - "802aaa60" : "bhv_warp_loop", - "802aab54" : "bhv_fading_warp_loop", - "802aac48" : "bhv_white_puff_exploding_loop", - "802aae8c" : "spawn_mist_particles_variable", - "802aaf48" : "bhv_spawned_star_init", - "802aaffc" : "set_sparkle_spawn_star_hitbox", - "802ab060" : "set_home_to_mario", - "802ab158" : "set_y_home_to_pos", - "802ab18c" : "slow_star_rotation", - "802ab1c8" : "bhv_spawned_star_loop", - "802ab558" : "bhv_spawn_star_no_level_exit", - "802ab5c8" : "bhv_coin_sparkles_init", - "802ab650" : "bhv_yellow_coin_init", - "802ab70c" : "bhv_yellow_coin_loop", - "802ab748" : "bhv_temp_coin_loop", - "802ab7a4" : "bhv_coin_init", - "802ab860" : "bhv_coin_loop", - "802aba40" : "bhv_coin_formation_spawn_loop", - "802abc04" : "spawn_coin_in_formation", - "802abee4" : "bhv_coin_formation_init", - "802abf0c" : "bhv_coin_formation_loop", - "802ac068" : "coin_inside_boo_act_1", - "802ac15c" : "coin_inside_boo_act_0", - "802ac294" : "bhv_coin_inside_boo_loop", - "802ac2c0" : "bhv_coin_sparkles_loop", - "802ac2ec" : "bhv_golden_coin_sparkles_loop", - "802ac3a8" : "bhv_punch_tiny_triangle_loop", - "802ac4a0" : "bhv_punch_tiny_triangle_init", - "802ac5b4" : "bhv_wall_tiny_star_particle_loop", - "802ac678" : "bhv_tiny_star_particles_init", - "802ac78c" : "bhv_pound_tiny_star_particle_loop", - "802ac864" : "bhv_pound_tiny_star_particle_init", - "802ac910" : "door_animation_and_reset", - "802ac958" : "set_door_camera_event", - "802ac9d0" : "play_door_open_noise", - "802aca6c" : "play_warp_door_open_noise", - "802acac8" : "bhv_door_loop", - "802acc3c" : "bhv_door_init", - "802ace80" : "bhv_star_door_loop_2", - "802ad078" : "grindel_thwomp_act_4", - "802ad10c" : "grindel_thwomp_act_2", - "802ad1a4" : "grindel_thwomp_act_3", - "802ad238" : "grindel_thwomp_act_1", - "802ad2d0" : "grindel_thwomp_act_0", - "802ad34c" : "bhv_grindel_thwomp_loop", - "802ad378" : "bhv_tumbling_bridge_platform_loop", - "802ad580" : "tumbling_bridge_act_1", - "802ad76c" : "tumbling_bridge_act_2", - "802ad7f4" : "tumbling_bridge_act_3", - "802ad828" : "tumbling_bridge_act_0", - "802ad890" : "bhv_tumbling_bridge_loop", - "802ad8bc" : "elevator_starting_shake", - "802ad8f0" : "elevator_act_0", - "802ada4c" : "elevator_act_1", - "802adb88" : "elevator_act_2", - "802adce4" : "elevator_act_4", - "802add70" : "elevator_act_3", - "802addf8" : "bhv_elevator_init", - "802adf6c" : "bhv_elevator_loop", - "802adf98" : "bhv_water_mist_spawn_loop", - "802adfd8" : "bhv_water_mist_loop", - "802ae0cc" : "spawn_triangle_break_particles", - "802ae238" : "bhv_water_mist_2_loop", - "802ae304" : "bhv_pound_white_puffs_init", - "802ae334" : "spawn_mist_from_global", - "802ae360" : "bhv_ground_sand_init", - "802ae394" : "spawn_smoke_with_velocity", - "802ae45c" : "clear_particle_flags", - "802ae48c" : "bhv_ground_snow_init", - "802ae4c0" : "spawn_wind_particles", - "802ae534" : "bhv_wind_loop", - "802ae85c" : "bhv_unused_particle_spawn_loop", - "802ae908" : "bhv_ukiki_cage_star_loop", - "802aea6c" : "ukiki_cage_act_wait_for_ukiki", - "802aeab8" : "ukiki_cage_act_spin", - "802aeb1c" : "ukiki_cage_act_fall", - "802aeb74" : "ukiki_cage_act_hide", - "802aeb9c" : "bhv_ukiki_cage_loop", - "802aebc8" : "bhv_squishable_platform_loop", - "802aec40" : "bhv_bitfs_sinking_platform_loop", - "802aeca8" : "bhv_ddd_moving_pole_loop", - "802aecdc" : "bhv_bitfs_sinking_cage_platform_loop", - "802aedc0" : "bhv_beta_moving_flames_spawn_loop", - "802aeea4" : "bhv_beta_moving_flames_loop", - "802aef1c" : "bhv_flamethrower_flame_loop", - "802af1e8" : "bhv_flamethrower_loop", - "802af3fc" : "bhv_rr_rotating_bridge_platform_loop", - "802af448" : "bhv_bouncing_fireball_flame_loop", - "802af5f8" : "bhv_bouncing_fireball_loop", - "802af7c4" : "bhv_bowser_shock_wave_loop", - "802af9cc" : "bhv_black_smoke_upward_loop", - "802afa0c" : "bhv_black_smoke_bowser_loop", - "802afae4" : "bhv_black_smoke_mario_loop", - "802afbf8" : "bhv_flame_mario_loop", - "802afce4" : "bhv_beta_fish_splash_spawner_loop", - "802afd1c" : "bhv_spindrift_loop", - "802afee8" : "bhv_wf_solid_tower_platform_loop", - "802aff30" : "bhv_wf_elevator_tower_platform_loop", - "802b00e4" : "bhv_wf_sliding_tower_platform_loop", - "802b0244" : "spawn_and_init_wf_platforms", - "802b039c" : "spawn_wf_platform_group", - "802b04b4" : "bhv_tower_platform_group_loop", - "802b0614" : "bhv_tree_snow_or_leaf_loop", - "802b0974" : "bhv_snow_leaf_particle_spawn_init", - "802b0b9c" : "square_plat_set_yaw_until_timer", - "802b0bec" : "bhv_squarish_path_moving_loop", - "802b0d48" : "bhv_piranha_plant_waking_bubbles_loop", - "802b0df0" : "bhv_piranha_plant_bubble_loop", - "802b1278" : "bhv_purple_switch_loop", - "802b14f4" : "check_if_moving_over_floor", - "802b15e8" : "bhv_pushable_loop", - "802b1714" : "breakable_box_init", - "802b17f4" : "hidden_breakable_box_actions", - "802b19d8" : "hidden_unbreakable_box_actions", - "802b1ae0" : "bhv_hidden_object_loop", - "802b1b2c" : "bhv_breakable_box_loop", - "802b1bb0" : "geo_move_mario_part_from_parent", - "802b1c54" : "bhv_heave_ho_throw_mario_loop", - "802b1d7c" : "heave_ho_act_1", - "802b1e6c" : "heave_ho_act_2", - "802b1ff4" : "heave_ho_act_3", - "802b20a0" : "heave_ho_act_0", - "802b2154" : "heave_ho_move", - "802b2278" : "bhv_heave_ho_loop", - "802b2340" : "bhv_ccm_touched_star_spawn_loop", - "802b23e0" : "bhv_unused_poundable_platform", - "802b2494" : "bhv_beta_trampoline_spring_loop", - "802b25ac" : "bhv_beta_trampoline_top_loop", - "802b26a4" : "jumping_box_act_0", - "802b27d8" : "jumping_box_act_1", - "802b2824" : "jumping_box_free_update", - "802b288c" : "bhv_jumping_box_loop", - "802b29b8" : "bhv_boo_cage_loop", - "802b2bc8" : "spawn_sparkle_particles", - "802b2d10" : "bhv_alpha_boo_key_loop", - "802b3108" : "bhv_beta_boo_key_loop", - "802b3134" : "arc_to_goal_pos", - "802b3250" : "grand_star_zero_velocity", - "802b329c" : "bhv_grand_star_loop", - "802b3600" : "bhv_bowser_key_loop", - "802b37b8" : "bhv_white_puff_smoke_init", - "802b3810" : "bhv_bullet_bill_init", - "802b3830" : "bullet_bill_act_0", - "802b38b8" : "bullet_bill_act_1", - "802b394c" : "bullet_bill_act_2", - "802b3b08" : "bullet_bill_act_3", - "802b3b24" : "bullet_bill_act_4", - "802b3be0" : "bhv_bullet_bill_loop", - "802b3c2c" : "bowser_tail_anchor_act_0", - "802b3cdc" : "bowser_tail_anchor_act_1", - "802b3d10" : "bowser_tail_anchor_act_2", - "802b3d74" : "bhv_bowser_tail_anchor_loop", - "802b3df4" : "bhv_bowser_flame_spawn_loop", - "802b4080" : "bhv_bowser_body_anchor_loop", - "802b4184" : "bowser_spawn_shockwave", - "802b41fc" : "bowser_bounce", - "802b4288" : "bowser_set_anim_look_up_and_walk", - "802b4300" : "bowser_set_anim_slow_gait", - "802b4368" : "bowser_set_anim_look_down", - "802b43dc" : "bowser_initialize_action", - "802b4478" : "bowser_act_text_wait", - "802b44bc" : "bowser_act_intro_walk", - "802b45f4" : "bowser_bitdw_act_controller", - "802b473c" : "bowser_bitfs_act_controller", - "802b48d4" : "bowser_general_bits_act_controller", - "802b4a1c" : "bowser_set_act_jump", - "802b4a3c" : "bowser_bits_act_controller", - "802b4af4" : "bowser_reset_fallen_off_stage", - "802b4bac" : "bowser_act_unused_slow_walk", - "802b4be8" : "bowser_act_default", - "802b4ca4" : "bowser_act_breath_fire", - "802b4d14" : "bowser_act_walk_to_mario", - "802b4f00" : "bowser_act_teleport", - "802b5104" : "bowser_act_spit_fire_into_sky", - "802b5218" : "bowser_act_hit_mine", - "802b53f4" : "bowser_set_anim_in_air", - "802b5444" : "bowser_land", - "802b5554" : "bowser_short_second_hop", - "802b55cc" : "bowser_act_jump", - "802b5798" : "bowser_act_jump_towards_mario", - "802b58bc" : "bowser_act_hit_edge", - "802b59cc" : "bowser_act_spit_fire_onto_floor", - "802b5aec" : "bowser_turn_on_timer", - "802b5c00" : "bowser_act_turn_from_edge", - "802b5c40" : "bowser_act_charge_mario", - "802b5f6c" : "bowser_check_hit_mine", - "802b5fec" : "bowser_act_thrown_dropped", - "802b611c" : "bowser_set_goal_invisible", - "802b6190" : "bowser_act_jump_onto_stage", - "802b6568" : "bowser_act_dance", - "802b65d0" : "bowser_spawn_grand_star_key", - "802b6670" : "bowser_fly_back_dead", - "802b6730" : "bowser_dead_bounce", - "802b67d4" : "bowser_dead_wait_for_mario", - "802b6878" : "bowser_dead_twirl_into_trophy", - "802b6a10" : "bowser_dead_hide", - "802b6a78" : "bowser_dead_not_bits_end", - "802b6bac" : "bowser_dead_bits_end", - "802b6cf0" : "bowser_act_dead", - "802b6e40" : "bowser_tilt_platform", - "802b6ee0" : "bowser_act_ride_tilting_platform", - "802b711c" : "bowser_check_fallen_off_stage", - "802b71e4" : "bowser_free_update", - "802b72d4" : "bowser_held_update", - "802b7418" : "bowser_thrown_dropped_update", - "802b75a4" : "bhv_bowser_loop", - "802b7878" : "bhv_bowser_init", - "802b798c" : "geo_update_body_rot_from_parent", - "802b7a20" : "bowser_open_eye_switch", - "802b7c64" : "geo_switch_bowser_eyes", - "802b7d44" : "geo_bits_bowser_coloring", - "802b7e68" : "falling_bowser_plat_act_0", - "802b7ef0" : "falling_bowser_plat_act_1", - "802b8024" : "falling_bowser_plat_act_2", - "802b8384" : "bhv_falling_bowser_platform_loop", - "802b83b0" : "bowser_flame_despawn", - "802b8434" : "bowser_flame_should_despawn", - "802b84ac" : "bhv_flame_bowser_init", - "802b85b0" : "bhv_flame_large_burning_out_init", - "802b8654" : "bowser_flame_move", - "802b8734" : "bhv_flame_bowser_loop", - "802b8960" : "bhv_flame_moving_forward_growing_init", - "802b89ec" : "bhv_flame_moving_forward_growing_loop", - "802b8b1c" : "bhv_flame_floating_landing_init", - "802b8c38" : "bhv_flame_floating_landing_loop", - "802b8d68" : "bhv_blue_bowser_flame_init", - "802b8e7c" : "bhv_blue_bowser_flame_loop", - "802b9034" : "bhv_flame_bouncing_init", - "802b90ec" : "bhv_flame_bouncing_loop", - "802b921c" : "bhv_blue_flames_group_loop", - "802b935c" : "bhv_blue_fish_movement_loop", - "802b9790" : "bhv_tank_fish_group_loop", - "802b98d4" : "vec3f_copy_2", - "802b98fc" : "bhv_checkerboard_elevator_group_init", - "802b9a78" : "checkerboard_plat_act_move_y", - "802b9af8" : "checkerboard_plat_act_rotate", - "802b9bb4" : "bhv_checkerboard_platform_init", - "802b9bd8" : "bhv_checkerboard_platform_loop", - "802b9e94" : "bhv_ddd_warp_loop", - "802b9efc" : "water_level_pillar_undrained", - "802ba13c" : "water_level_pillar_drained", - "802ba19c" : "bhv_water_level_pillar_init", - "802ba1e0" : "bhv_water_level_pillar_loop", - "802ba25c" : "bhv_invisible_objects_under_bridge_init", - "802ba2b0" : "geo_scale_bowser_key", - "802ba2f8" : "bhv_bowser_key_unlock_door_loop", - "802ba458" : "bhv_bowser_key_course_exit_loop", - "802ba5bc" : "bhv_moat_grills_loop", - "802ba608" : "bhv_rotating_clock_arm_loop", - "802ba7e0" : "handle_cap_ukiki_reset", - "802ba868" : "is_cap_ukiki_and_mario_has_normal_cap_on_head", - "802ba8c4" : "geo_update_projectile_pos_from_parent_copy", - "802ba958" : "idle_ukiki_taunt", - "802bab7c" : "ukiki_act_idle", - "802bae40" : "ukiki_act_return_home", - "802baec4" : "ukiki_act_wait_to_respawn", - "802baf10" : "ukiki_act_unused_turn", - "802baf64" : "ukiki_act_turn_to_mario", - "802bb07c" : "ukiki_act_run", - "802bb288" : "ukiki_act_jump", - "802bb3b8" : "ukiki_act_go_to_cage", - "802bb798" : "ukiki_free_loop", - "802bb888" : "cage_ukiki_held_loop", - "802bba3c" : "cap_ukiki_held_loop", - "802bbb98" : "bhv_ukiki_init", - "802bbc0c" : "bhv_ukiki_loop", - "802bbd6c" : "lll_octagonal_mesh_move", - "802bbfd8" : "lll_octagonal_mesh_find_y_offset", - "802bc0f0" : "bhv_lll_moving_octagonal_mesh_platform_loop", - "802bc22c" : "bhv_lll_sinking_rock_block_loop", - "802bc294" : "bhv_lll_rotating_hex_flame_loop", - "802bc348" : "fire_bar_spawn_flames", - "802bc4f4" : "fire_bar_act_0", - "802bc538" : "fire_bar_act_1", - "802bc590" : "fire_bar_act_2", - "802bc5fc" : "fire_bar_act_3", - "802bc618" : "bhv_lll_rotating_block_fire_bars_loop", - "802bc660" : "bhv_lll_wood_piece_loop", - "802bc728" : "bhv_lll_floating_wood_bridge_loop", - "802bc898" : "bhv_volcano_flames_loop", - "802bc934" : "hexagonal_ring_spawn_flames", - "802bca74" : "bhv_lll_rotating_hexagonal_ring_loop", - "802bcce8" : "sinking_rectangular_plat_actions", - "802bcda8" : "bhv_lll_sinking_rectangular_platform_loop", - "802bce58" : "bhv_lll_sinking_square_platforms_loop", - "802bce9c" : "create_transform_from_normals", - "802bcf40" : "bhv_platform_normals_init", - "802bcfc4" : "approach_by_increment", - "802bd058" : "bhv_tilting_inverted_pyramid_loop", - "802bd3e4" : "koopa_shell_spawn_water_drop", - "802bd488" : "bhv_koopa_shell_flame_loop", - "802bd5dc" : "bhv_koopa_shell_flame_spawn", - "802bd62c" : "koopa_shell_spawn_sparkles", - "802bd680" : "bhv_koopa_shell_loop", - "802bd8d0" : "tox_box_shake_screen", - "802bd91c" : "tox_box_move", - "802bdb04" : "tox_box_act_4", - "802bdb3c" : "tox_box_act_5", - "802bdb74" : "tox_box_act_6", - "802bdbac" : "tox_box_act_7", - "802bdbe4" : "tox_box_act_1", - "802bdc7c" : "tox_box_act_2", - "802bdcc8" : "tox_box_act_3", - "802bdd14" : "tox_box_act_0", - "802bdd68" : "bhv_tox_box_loop", - "802bdd9c" : "piranha_plant_act_idle", - "802bde10" : "piranha_plant_check_interactions", - "802bdeec" : "piranha_plant_act_sleeping", - "802be034" : "piranha_plant_act_woken_up", - "802be0b8" : "piranha_plant_reset_when_far", - "802be0ec" : "piranha_plant_attacked", - "802be150" : "piranha_plant_act_shrink_and_die", - "802be234" : "piranha_plant_act_wait_to_respawn", - "802be278" : "piranha_plant_act_respawn", - "802be350" : "piranha_plant_act_biting", - "802be49c" : "mario_moving_fast_enough_to_make_piranha_plant_bite", - "802be50c" : "piranha_plant_act_stopped_biting", - "802be5a0" : "bhv_piranha_plant_loop", - "802be628" : "bhv_lll_bowser_puzzle_spawn_piece", - "802be6d4" : "bhv_lll_bowser_puzzle_spawn_pieces", - "802be79c" : "bhv_lll_bowser_puzzle_loop", - "802be8a8" : "bhv_lll_bowser_puzzle_piece_action_0", - "802be8b8" : "bhv_lll_bowser_puzzle_piece_action_1", - "802be8f4" : "bhv_lll_bowser_puzzle_piece_update", - "802be9dc" : "bhv_lll_bowser_puzzle_piece_move", - "802beb14" : "bhv_lll_bowser_puzzle_piece_idle", - "802beb54" : "bhv_lll_bowser_puzzle_piece_move_left", - "802beb8c" : "bhv_lll_bowser_puzzle_piece_move_right", - "802bebc4" : "bhv_lll_bowser_puzzle_piece_move_up", - "802bebfc" : "bhv_lll_bowser_puzzle_piece_move_down", - "802bec34" : "bhv_lll_bowser_puzzle_piece_loop", - "802becb0" : "set_obj_anim_with_accel_and_sound", - "802bed7c" : "play_penguin_walking_sound", - "802bedec" : "tuxies_mother_act_2", - "802bef8c" : "tuxies_mother_act_1", - "802bf1d8" : "tuxies_mother_act_0", - "802bf3c0" : "bhv_tuxies_mother_loop", - "802bf424" : "small_penguin_dive_with_mario", - "802bf474" : "small_penguin_act_2", - "802bf57c" : "small_penguin_act_1", - "802bf648" : "small_penguin_act_3", - "802bf6e4" : "small_penguin_act_4", - "802bf760" : "small_penguin_act_0", - "802bf90c" : "small_penguin_act_5", - "802bfa14" : "small_penguin_free_actions", - "802bfa88" : "bhv_small_penguin_loop", - "802bfbac" : "geo_switch_tuxie_mother_eyes", - "802bff3c" : "bhv_fish_spawner_loop", - "802c0768" : "bhv_fish_loop", - "802c08a8" : "bhv_wdw_express_elevator_loop", - "802c0aac" : "bub_spawner_act_0", - "802c0b50" : "bub_spawner_act_1", - "802c0ba4" : "bub_spawner_act_2", - "802c0bc4" : "bub_spawner_act_3", - "802c0be0" : "bhv_bub_spawner_loop", - "802c0c0c" : "bub_move_vertically", - "802c0cd4" : "bub_act_0", - "802c0d44" : "bub_act_1", - "802c0f90" : "bub_act_2", - "802c1204" : "bhv_bub_loop", - "802c12c0" : "bhv_rotating_exclamation_box_loop", - "802c1308" : "exclamation_box_act_0", - "802c13ec" : "exclamation_box_act_1", - "802c14b0" : "exclamation_box_act_2", - "802c15b8" : "exclamation_box_act_3", - "802c17bc" : "exclamation_box_spawn_contents", - "802c18d0" : "exclamation_box_act_4", - "802c1988" : "exclamation_box_act_5", - "802c19c0" : "bhv_exclamation_box_loop", - "802c19fc" : "bhv_sound_spawner_init", - "802c1a40" : "bhv_bowsers_sub_loop", - "802c1a80" : "bhv_sushi_shark_collision_loop", - "802c1a90" : "bhv_sushi_shark_loop", - "802c1c44" : "bhv_sunken_ship_part_loop", - "802c1cd4" : "bhv_ship_part_3_loop", - "802c1e10" : "bhv_jrb_sliding_box_loop", - "802c2190" : "bhv_white_puff_1_loop", - "802c2274" : "bhv_white_puff_2_loop", - "802c22b8" : "bhv_hidden_blue_coin_loop", - "802c242c" : "bhv_blue_coin_switch_loop", - "802c263c" : "bhv_openable_cage_door_loop", - "802c26f8" : "bhv_openable_grill_loop", - "802c2930" : "bhv_init_changing_water_level_loop", - "802c2a24" : "bhv_water_level_diamond_loop", - "802c2ce8" : "tweester_scale_and_move", - "802c2ebc" : "tweester_act_idle", - "802c2fbc" : "tweester_act_chase", - "802c31c4" : "tweester_act_hide", - "802c329c" : "bhv_tweester_loop", - "802c32e8" : "bhv_tweester_sand_particle_loop", - "802c3440" : "bhv_boo_init", - "802c3684" : "bhv_courtyard_boo_triplet_init", - "802c4824" : "bhv_boo_loop", - "802c4f30" : "bhv_big_boo_loop", - "802c515c" : "bhv_boo_with_cage_init", - "802c51d4" : "bhv_boo_with_cage_loop", - "802c5224" : "bhv_merry_go_round_boo_manager_loop", - "802c53cc" : "obj_set_secondary_camera_focus", - "802c53ec" : "bhv_animated_texture_loop", - "802c5414" : "bhv_boo_in_castle_loop", - "802c5688" : "bhv_boo_boss_spawned_bridge_loop", - "802c5890" : "bhv_bbh_tilting_trap_platform_loop", - "802c5a38" : "bhv_haunted_bookshelf_loop", - "802c5ca8" : "bhv_merry_go_round_loop", - "802c5dc0" : "bhv_static_checkered_platform_loop", - "802c5f48" : "bhv_beta_bowser_anchor_loop", - "802c5fdc" : "bhv_play_music_track_when_touched_loop", - "802c6050" : "bhv_floor_trap_in_castle_loop", - "802c60ac" : "bhv_castle_floor_trap_init", - "802c6150" : "bhv_castle_floor_trap_open_detect", - "802c61d4" : "bhv_castle_floor_trap_open", - "802c6278" : "bhv_castle_floor_trap_close_detect", - "802c62bc" : "bhv_castle_floor_trap_close", - "802c6328" : "bhv_castle_floor_trap_rotate", - "802c6348" : "bhv_castle_floor_trap_loop", - "802c63e8" : "bhv_pole_base_loop", - "802c64a4" : "bhv_sparkle_spawn_loop", - "802c6538" : "update_angle_from_move_flags", - "802c65c0" : "bhv_scuttlebug_loop", - "802c6b6c" : "bhv_scuttlebug_spawn_loop", - "802c6ca0" : "whomp_play_sfx_from_pound_animation", - "802c6d6c" : "whomp_act_0", - "802c6ec8" : "whomp_act_7", - "802c6fb0" : "whomp_act_1", - "802c710c" : "whomp_act_2", - "802c7254" : "whomp_act_3", - "802c72b4" : "whomp_act_4", - "802c7380" : "whomp_act_5", - "802c7428" : "king_whomp_on_ground", - "802c75fc" : "whomp_on_ground", - "802c76d4" : "whomp_act_6", - "802c7858" : "whomp_act_8", - "802c7998" : "whomp_act_9", - "802c79d8" : "bhv_whomp_loop", - "802c7a70" : "bhv_water_splash_spawn_droplets", - "802c7b14" : "bhv_water_droplet_loop", - "802c7cac" : "bhv_idle_water_wave_loop", - "802c7d40" : "bhv_water_droplet_splash_init", - "802c7d90" : "bhv_bubble_splash_init", - "802c7dfc" : "bhv_shallow_water_splash_init", - "802c7e5c" : "bhv_wave_trail_shrink", - "802c7f98" : "bhv_strong_wind_particle_loop", - "802c81b4" : "cur_obj_spawn_strong_wind_particles", - "802c834c" : "bhv_sl_snowman_wind_loop", - "802c863c" : "bhv_sl_walking_penguin_loop", - "802c89f0" : "update_mario_platform", - "802c8b4c" : "get_mario_pos", - "802c8b8c" : "set_mario_pos", - "802c8bc8" : "apply_platform_displacement", - "802c8ec0" : "apply_mario_platform_displacement", - "802c8f28" : "clear_mario_platform", - "802c8f40" : "debug_print_obj_collision", - "802c8fe4" : "detect_object_hitbox_overlap", - "802c91ec" : "detect_object_hurtbox_overlap", - "802c9388" : "clear_object_collision", - "802c93f8" : "check_collision_in_list", - "802c94ac" : "check_player_object_collision", - "802c95b4" : "check_pushable_object_collision", - "802c9630" : "check_destructive_object_collision", - "802c9724" : "detect_object_collisions", - "802c97d0" : "unused_init_free_list", - "802c9840" : "unused_try_allocate", - "802c98a4" : "try_allocate_object", - "802c9950" : "unused_deallocate", - "802c99b8" : "init_free_object_list", - "802c9a3c" : "clear_object_lists", - "802c9b68" : "unload_object", - "802c9c00" : "allocate_object", - "802c9f04" : "create_object", - "802ca028" : "mark_obj_for_deletion", - "802ca040" : "exec_anim_sound_state", - "802ca144" : "create_sound_spawner", - "802ca190" : "cur_obj_play_sound_1", - "802ca1e0" : "cur_obj_play_sound_2", - "802ca230" : "calc_dist_to_volume_range_1", - "802ca2d4" : "calc_dist_to_volume_range_2", - "802ca370" : "stub_debug_1", - "802ca380" : "stub_debug_2", - "802ca390" : "stub_debug_3", - "802ca3a0" : "stub_debug_4", - "802ca3b0" : "get_current_clock", - "802ca3e0" : "get_clock_difference", - "802ca418" : "set_print_state_info", - "802ca460" : "print_text_array_info", - "802ca51c" : "set_text_array_x_y", - "802ca568" : "print_debug_bottom_up", - "802ca5b8" : "print_debug_top_down_objectinfo", - "802ca618" : "print_debug_top_down_mapinfo", - "802ca680" : "print_debug_top_down_normal", - "802ca6d0" : "print_mapinfo", - "802ca8e8" : "print_checkinfo", - "802ca918" : "print_surfaceinfo", - "802ca94c" : "print_stageinfo", - "802ca990" : "print_string_array_info", - "802caa6c" : "print_effectinfo", - "802caaa8" : "print_enemyinfo", - "802caae4" : "update_debug_dpadmask", - "802cabac" : "debug_unknown_level_select_check", - "802cac20" : "reset_debug_objectinfo", - "802cb0b0" : "stub_debug_5", - "802cb0c0" : "try_print_debug_mario_object_info", - "802cb1c0" : "try_print_debug_mario_level_info", - "802cb264" : "try_do_mario_debug_object_spawn", - "802cb564" : "debug_enemy_unknown", - "802cb5c0" : "set_and_reset_transition_fade_timer", - "802cb640" : "set_transition_color_fade_alpha", - "802cb894" : "vertex_transition_color", - "802cba18" : "dl_transition_color", - "802cbbc4" : "render_fade_transition_from_color", - "802cbc20" : "render_fade_transition_into_color", - "802cbc7c" : "calc_tex_transition_radius", - "802cbd54" : "calc_tex_transition_time", - "802cbe64" : "convert_tex_transition_angle_to_pos", - "802cbee0" : "center_tex_transition_x", - "802cbf64" : "center_tex_transition_y", - "802cbfe8" : "make_tex_transition_vertex", - "802cc180" : "load_tex_transition_vertex", - "802cc4d8" : "render_textured_transition", - "802ccbe8" : "render_screen_transition", - "802ccdc8" : "render_cannon_circle_base", - "802cd1e8" : "geo_cannon_circle_base", - "802cd280" : "rotate_rectangle", - "802cd328" : "atan2_deg", - "802cd388" : "scale_shadow_with_distance", - "802cd444" : "disable_shadow_with_distance", - "802cd48c" : "dim_shadow_with_distance", - "802cd614" : "get_water_level_below_shadow", - "802cd6c4" : "init_shadow", - "802cd938" : "get_texture_coords_9_vertices", - "802cd988" : "get_texture_coords_4_vertices", - "802cd9ec" : "make_shadow_vertex_at_xyz", - "802cdb20" : "extrapolate_vertex_y_position", - "802cdb74" : "get_vertex_coords", - "802cdc40" : "calculate_vertex_xyz", - "802cde94" : "floor_local_tilt", - "802cdf3c" : "make_shadow_vertex", - "802ce128" : "add_shadow_to_display_list", - "802ce2bc" : "linearly_interpolate_solidity_positive", - "802ce3ec" : "linearly_interpolate_solidity_negative", - "802ce524" : "correct_shadow_solidity_for_animations", - "802ce690" : "correct_lava_shadow_height", - "802ce79c" : "create_shadow_player", - "802ce9d0" : "create_shadow_circle_9_verts", - "802ceae8" : "create_shadow_circle_4_verts", - "802cec04" : "create_shadow_circle_assuming_flat_ground", - "802cedc0" : "create_shadow_rectangle", - "802cef6c" : "get_shadow_height_solidity", - "802cf080" : "create_shadow_square", - "802cf1f0" : "create_shadow_hardcoded_rectangle", - "802cf34c" : "create_shadow_below_xyz", - "802cf5b0" : "calculate_skybox_scaled_x", - "802cf69c" : "calculate_skybox_scaled_y", - "802cf804" : "make_skybox_rect", - "802cfa2c" : "draw_skybox_tile_grid", - "802cfc68" : "create_skybox_ortho_matrix", - "802cfd88" : "init_skybox_display_list", - "802cfef4" : "create_skybox_facing_camera", - "802d0080" : "geo_wdw_set_initial_water_level", - "802d01e0" : "geo_movtex_pause_control", - "802d0254" : "movtex_make_quad_vertex", - "802d0484" : "movtex_gen_from_quad", - "802d0a84" : "movtex_gen_from_quad_array", - "802d0bb0" : "movtex_gen_quads_id", - "802d0c84" : "get_quad_collection_from_id", - "802d0f28" : "movtex_change_texture_format", - "802d104c" : "geo_movtex_draw_water_regions", - "802d1330" : "update_moving_texture_offset", - "802d13cc" : "movtex_write_vertex_first", - "802d1574" : "movtex_write_vertex_index", - "802d18b4" : "movtex_gen_list", - "802d1b70" : "geo_movtex_draw_nocolor", - "802d1cdc" : "geo_movtex_draw_colored", - "802d1e48" : "geo_movtex_draw_colored_no_update", - "802d1fa8" : "geo_movtex_draw_colored_2_no_update", - "802d2108" : "geo_movtex_update_horizontal", - "802d2210" : "make_vertex", - "802d22c4" : "round_float", - "802d2360" : "geo_exec_inside_castle_light", - "802d2470" : "geo_exec_flying_carpet_timer_update", - "802d2520" : "geo_exec_flying_carpet_create", - "802d28cc" : "geo_exec_cake_end_screen", - "802d29c0" : "stop_other_paintings", - "802d2a74" : "painting_mario_y", - "802d2b08" : "painting_mario_z", - "802d2b84" : "painting_ripple_y", - "802d2c40" : "painting_nearest_4th", - "802d2d80" : "painting_mario_x", - "802d2dfc" : "painting_ripple_x", - "802d2eb8" : "painting_state", - "802d2ffc" : "wall_painting_proximity_idle", - "802d319c" : "wall_painting_proximity_rippling", - "802d327c" : "wall_painting_continuous_idle", - "802d341c" : "wall_painting_continuous_rippling", - "802d34fc" : "floor_painting_proximity_idle", - "802d36ac" : "floor_painting_proximity_rippling", - "802d379c" : "floor_painting_continuous_idle", - "802d393c" : "floor_painting_continuous_rippling", - "802d3a2c" : "painting_update_floors", - "802d3bec" : "painting_update_ripple_state", - "802d3cec" : "calculate_ripple_at_point", - "802d3e6c" : "ripple_if_movable", - "802d3ee4" : "painting_generate_mesh", - "802d404c" : "painting_calculate_triangle_normals", - "802d43f8" : "normalize_component", - "802d44bc" : "painting_average_vertex_normals", - "802d47d0" : "render_painting", - "802d4edc" : "painting_model_view_transform", - "802d50dc" : "painting_ripple_image", - "802d5354" : "painting_ripple_env_mapped", - "802d556c" : "display_painting_rippling", - "802d568c" : "display_painting_not_rippling", - "802d5778" : "reset_painting", - "802d57a8" : "move_ddd_painting", - "802d58e4" : "set_painting_layer", - "802d593c" : "display_painting", - "802d59a8" : "wall_painting_update", - "802d5aa0" : "floor_painting_update", - "802d5b98" : "geo_painting_draw", - "802d5d0c" : "geo_painting_update", - "802d5e00" : "int_pow", - "802d5e54" : "format_integer", - "802d6144" : "parse_width_field", - "802d62d8" : "print_text_fmt_int", - "802d6554" : "print_text", - "802d66c0" : "print_text_centered", - "802d6858" : "char_to_glyph_index", - "802d69f8" : "add_glyph_texture", - "802d6acc" : "clip_to_bounds", - "802d6b3c" : "render_textrect", - "802d6c88" : "render_text_labels", - "802d6f20" : "create_dl_identity_matrix", - "802d7070" : "create_dl_translation_matrix", - "802d7174" : "create_dl_rotation_matrix", - "802d7280" : "create_dl_scale_matrix", - "802d7384" : "create_dl_ortho_matrix", - "802d75dc" : "render_generic_char", - "802d76c8" : "render_multi_text_string", - "802d77dc" : "print_generic_string", - "802d7b84" : "print_hud_lut_string", - "802d7e88" : "print_menu_generic_string", - "802d82d4" : "print_credits_string", - "802d862c" : "handle_menu_scrolling", - "802d8844" : "get_str_x_pos_from_center", - "802d8934" : "get_string_width", - "802d89b8" : "print_hud_my_score_coins", - "802d8a80" : "print_hud_my_score_stars", - "802d8b34" : "int_to_str", - "802d8c6c" : "get_dialog_id", - "802d8c88" : "create_dialog_box", - "802d8cc4" : "create_dialog_box_with_var", - "802d8d08" : "create_dialog_inverted_box", - "802d8d48" : "create_dialog_box_with_response", - "802d8d90" : "reset_dialog_render_state", - "802d8e2c" : "render_dialog_box_type", - "802d9148" : "change_and_flash_dialog_text_color_lines", - "802d9388" : "handle_dialog_scroll_page_state", - "802d944c" : "render_star_count_dialog_text", - "802d9634" : "render_multi_text_string_lines", - "802d9800" : "ensure_nonnegative", - "802d982c" : "handle_dialog_text_and_pages", - "802d9cb0" : "render_dialog_triangle_choice", - "802d9dfc" : "render_dialog_string_color", - "802d9f84" : "handle_special_dialog_text", - "802da1ac" : "render_dialog_entries", - "802da810" : "set_menu_mode", - "802da844" : "reset_cutscene_msg_fade", - "802da85c" : "dl_rgba16_begin_cutscene_msg_fade", - "802da8e4" : "dl_rgba16_stop_cutscene_msg_fade", - "802da964" : "ascii_to_credits_char", - "802daa34" : "print_credits_str_ascii", - "802daae4" : "set_cutscene_message", - "802dab58" : "do_cutscene_handler", - "802dad54" : "print_peach_letter_message", - "802db08c" : "render_hud_cannon_reticle", - "802db350" : "reset_red_coins_collected", - "802db368" : "change_dialog_camera_angle", - "802db3b8" : "shade_screen", - "802db498" : "print_animated_red_coin", - "802db6e8" : "render_pause_red_coins", - "802db760" : "render_pause_my_score_coins", - "802dbb24" : "render_pause_camera_options", - "802dbe68" : "render_pause_course_options", - "802dc15c" : "render_pause_castle_menu_box", - "802dc418" : "highlight_last_course_complete_stars", - "802dc478" : "print_hud_pause_colorful_str", - "802dc570" : "render_pause_castle_course_stars", - "802dc718" : "render_pause_castle_main_strings", - "802dca88" : "render_pause_courses_and_castle", - "802dcd04" : "print_hud_course_complete_string", - "802dcf30" : "print_hud_course_complete_coins", - "802dd194" : "play_star_fanfare_and_flash_hud", - "802dd210" : "render_course_complete_lvl_info_and_hud_str", - "802dd838" : "render_save_confirmation", - "802ddae0" : "render_course_complete_screen", - "802ddca4" : "render_menus_and_dialogs", - "802dddf0" : "envfx_init_snow", - "802ddf38" : "envfx_update_snowflake_count", - "802de0bc" : "envfx_cleanup_snow", - "802de114" : "orbit_from_positions", - "802de23c" : "pos_from_orbit", - "802de360" : "envfx_is_snowflake_alive", - "802de458" : "envfx_update_snow_normal", - "802de888" : "envfx_update_snow_blizzard", - "802ded38" : "envfx_update_snow_water", - "802def2c" : "rotate_triangle_vertices", - "802df334" : "append_snowflake_vertex_buffer", - "802df748" : "envfx_update_snow", - "802dfbc8" : "envfx_update_particles", - "802dfd50" : "particle_is_laterally_close", - "802dfe00" : "random_flower_offset", - "802dfe80" : "envfx_update_flower", - "802e0120" : "envfx_set_lava_bubble_position", - "802e048c" : "envfx_update_lava", - "802e065c" : "envfx_rotate_around_whirlpool", - "802e08a8" : "envfx_is_whirlpool_bubble_alive", - "802e0934" : "envfx_update_whirlpool", - "802e0e24" : "envfx_is_jestream_bubble_alive", - "802e0eb8" : "envfx_update_jetstream", - "802e1238" : "envfx_init_bubble", - "802e1414" : "envfx_bubbles_update_switch", - "802e1618" : "append_bubble_vertex_buffer", - "802e1a20" : "envfx_set_bubble_texture", - "802e1bb8" : "envfx_update_bubble_particles", - "802e1ed8" : "envfx_set_max_bubble_particles", - "802e1f48" : "envfx_update_bubbles", - "802e20a0" : "convert_rotation", - "802e2134" : "spawn_macro_abs_yrot_2params", - "802e21dc" : "spawn_macro_abs_yrot_param1", - "802e2284" : "spawn_macro_abs_special", - "802e2414" : "spawn_macro_objects", - "802e2690" : "spawn_macro_objects_hardcoded", - "802e28ec" : "spawn_special_objects", - "802e2cf0" : "render_hud_tex_lut", - "802e2e58" : "render_hud_small_tex_lut", - "802e30b4" : "render_power_meter_health_segment", - "802e3214" : "render_dl_power_meter", - "802e33b8" : "animate_power_meter_emphasized", - "802e352c" : "handle_power_meter_actions", - "802e3654" : "render_hud_power_meter", - "802e3744" : "render_hud_mario_lives", - "802e37a8" : "render_hud_coins", - "802e380c" : "render_hud_stars", - "802e38e4" : "render_hud_keys", - "802e395c" : "render_hud_timer", - "802e3b1c" : "set_hud_camera_status", - "802e3b3c" : "render_hud_camera_status", - "802e3d2c" : "render_hud", - "802e3e50" : "set_yoshi_as_not_dead", - "802e3e68" : "geo_obj_transparency_something", - "802e3f68" : "absf_2", - "802e3fac" : "turn_obj_away_from_surface", - "802e405c" : "obj_find_wall", - "802e41a4" : "turn_obj_away_from_steep_floor", - "802e42e0" : "obj_orient_graph", - "802e43e4" : "calc_obj_friction", - "802e445c" : "calc_new_obj_vel_and_pos_y", - "802e4814" : "calc_new_obj_vel_and_pos_y_underwater", - "802e4cec" : "obj_update_pos_vel_xz", - "802e4d88" : "obj_splash", - "802e4e90" : "object_step", - "802e5114" : "object_step_without_floor_orient", - "802e5160" : "obj_move_xyz_using_fvel_and_yaw", - "802e5208" : "is_point_within_radius_of_mario", - "802e52b8" : "is_point_close_to_object", - "802e5360" : "set_object_visibility", - "802e53f4" : "obj_return_home_if_safe", - "802e54b0" : "obj_return_and_displace_home", - "802e55d0" : "obj_check_if_facing_toward_angle", - "802e569c" : "obj_find_wall_displacement", - "802e5760" : "obj_spawn_yellow_coins", - "802e5824" : "obj_flicker_and_disappear", - "802e58b4" : "current_mario_room_check", - "802e5948" : "trigger_obj_dialog_when_facing", - "802e5a80" : "obj_check_floor_death", - "802e5b18" : "obj_lava_death", - "802e5c6c" : "spawn_orange_number", - "802e5d04" : "debug_sequence_tracker", - "802e5de8" : "coin_step", - "802e5e6c" : "moving_coin_flicker", - "802e5ea4" : "coin_collected", - "802e5ee8" : "bhv_moving_yellow_coin_init", - "802e5f64" : "bhv_moving_yellow_coin_loop", - "802e6098" : "bhv_moving_blue_coin_init", - "802e6114" : "bhv_moving_blue_coin_loop", - "802e62a4" : "bhv_blue_coin_sliding_jumping_init", - "802e631c" : "blue_coin_sliding_away_from_mario", - "802e63ec" : "blue_coin_sliding_slow_down", - "802e6474" : "bhv_blue_coin_sliding_loop", - "802e6628" : "bhv_blue_coin_jumping_loop", - "802e6790" : "bhv_seaweed_init", - "802e67dc" : "bhv_seaweed_bundle_init", - "802e6a2c" : "bhv_bobomb_init", - "802e6a8c" : "bobomb_spawn_coin", - "802e6af8" : "bobomb_act_explode", - "802e6bd4" : "bobomb_check_interactions", - "802e6cf0" : "bobomb_act_patrol", - "802e6dc8" : "bobomb_act_chase_mario", - "802e6e84" : "bobomb_act_launched", - "802e6ed8" : "generic_bobomb_free_loop", - "802e7020" : "stationary_bobomb_free_loop", - "802e7134" : "bobomb_free_loop", - "802e7180" : "bobomb_held_loop", - "802e7220" : "bobomb_dropped_loop", - "802e7280" : "bobomb_thrown_loop", - "802e7324" : "curr_obj_random_blink", - "802e742c" : "bhv_bobomb_loop", - "802e75a0" : "bhv_bobomb_fuse_smoke_init", - "802e76ac" : "bhv_bobomb_buddy_init", - "802e770c" : "bobomb_buddy_act_idle", - "802e7814" : "bobomb_buddy_cannon_dialog", - "802e79dc" : "bobomb_buddy_act_talk", - "802e7b00" : "bobomb_buddy_act_turn_to_talk", - "802e7bb0" : "bobomb_buddy_actions", - "802e7c4c" : "bhv_bobomb_buddy_loop", - "802e7c90" : "bhv_cannon_closed_init", - "802e7d4c" : "cannon_door_act_opening", - "802e7e54" : "bhv_cannon_closed_loop", - "802e7f70" : "bhv_whirlpool_init", - "802e7fb8" : "whirlpool_set_hitbox", - "802e7fec" : "whirpool_orient_graph", - "802e80dc" : "bhv_whirlpool_loop", - "802e82b0" : "bhv_jet_stream_loop", - "802e8388" : "bhv_homing_amp_init", - "802e89d4" : "bhv_homing_amp_loop", - "802e8ae4" : "bhv_circling_amp_init", - "802e8ecc" : "bhv_circling_amp_loop", - "802e8f68" : "bhv_butterfly_init", - "802e9018" : "butterfly_step", - "802e9278" : "butterfly_calculate_angle", - "802e9470" : "butterfly_act_rest", - "802e94e4" : "butterfly_act_follow_mario", - "802e9548" : "butterfly_act_return_home", - "802e96c8" : "bhv_butterfly_loop", - "802e9764" : "bhv_hoot_init", - "802e97fc" : "hoot_find_next_floor", - "802e98c0" : "hoot_floor_bounce", - "802e9a4c" : "hoot_free_step", - "802e9cf4" : "hoot_player_set_yaw", - "802e9d98" : "hoot_carry_step", - "802e9f60" : "hoot_surface_collision", - "802ea144" : "hoot_act_ascent", - "802ea258" : "hoot_action_loop", - "802ea3f0" : "hoot_turn_to_home", - "802ea4ec" : "hoot_awake_loop", - "802ea588" : "bhv_hoot_loop", - "802ea6a8" : "bhv_beta_holdable_object_init", - "802ea7e0" : "bhv_beta_holdable_object_loop", - "802ea888" : "bhv_object_bubble_init", - "802ea934" : "bhv_object_bubble_loop", - "802eaa10" : "bhv_object_water_wave_init", - "802eaa50" : "bhv_object_water_wave_loop", - "802eaa8c" : "bhv_explosion_init", - "802eaad0" : "bhv_explosion_loop", - "802eabf0" : "bhv_bobomb_bully_death_smoke_init", - "802eac3c" : "bhv_bobomb_explosion_bubble_init", - "802ead3c" : "bhv_bobomb_explosion_bubble_loop", - "802eaef8" : "bhv_respawner_loop", - "802eaf84" : "create_respawner", - "802eb05c" : "bhv_small_bully_init", - "802eb104" : "bhv_big_bully_init", - "802eb1c0" : "bully_check_mario_collision", - "802eb288" : "bully_act_chase_mario", - "802eb3f0" : "bully_act_knockback", - "802eb510" : "bully_act_back_up", - "802eb5c4" : "bully_backup_check", - "802eb630" : "bully_play_stomping_sound", - "802eb744" : "bully_step", - "802eb7e0" : "bully_spawn_coin", - "802eb8b0" : "bully_act_level_death", - "802eb9d0" : "bhv_bully_loop", - "802ebb74" : "big_bully_spawn_minion", - "802ebc00" : "bhv_big_bully_with_minions_init", - "802ebc88" : "big_bully_spawn_star", - "802ebce0" : "bhv_big_bully_with_minions_loop", - "802ebf70" : "water_ring_calc_mario_dist", - "802ec030" : "water_ring_init", - "802ec1b0" : "bhv_jet_stream_water_ring_init", - "802ec200" : "water_ring_check_collection", - "802ec3d0" : "water_ring_set_scale", - "802ec4e0" : "water_ring_act_collected", - "802ec59c" : "water_ring_act_not_collected", - "802ec75c" : "bhv_jet_stream_water_ring_loop", - "802ec7cc" : "spawn_manta_ray_ring_manager", - "802ec818" : "water_ring_spawner_act_inactive", - "802ec908" : "bhv_jet_stream_ring_spawner_loop", - "802ec9b8" : "bhv_manta_ray_water_ring_init", - "802ec9f0" : "manta_water_ring_act_not_collected", - "802ecba4" : "bhv_manta_ray_water_ring_loop", - "802ecc14" : "bhv_bowser_bomb_loop", - "802ecd0c" : "bhv_bowser_bomb_explosion_loop", - "802ecea0" : "bhv_bowser_bomb_smoke_loop", - "802ecfac" : "bhv_celebration_star_init", - "802ed10c" : "celeb_star_act_spin_around_mario", - "802ed28c" : "celeb_star_act_face_camera", - "802ed39c" : "bhv_celebration_star_loop", - "802ed40c" : "bhv_celebration_star_sparkle_loop", - "802ed45c" : "bhv_star_key_collection_puff_spawner_loop", - "802ed498" : "bhv_lll_drawbridge_spawner_loop", - "802ed62c" : "bhv_lll_drawbridge_loop", - "802ed78c" : "bhv_small_bomp_init", - "802ed7fc" : "bhv_small_bomp_loop", - "802edacc" : "bhv_large_bomp_init", - "802edb2c" : "bhv_large_bomp_loop", - "802eddfc" : "bhv_wf_sliding_platform_init", - "802edf28" : "bhv_wf_sliding_platform_loop", - "802ee124" : "bhv_moneybag_init", - "802ee1a0" : "moneybag_check_mario_collision", - "802ee268" : "moneybag_jump", - "802ee46c" : "moneybag_act_move_around", - "802ee598" : "moneybag_act_return_home", - "802ee728" : "moneybag_act_disappear", - "802ee778" : "moneybag_act_death", - "802ee7e0" : "bhv_moneybag_loop", - "802ee8f4" : "bhv_moneybag_hidden_loop", - "802ee9cc" : "bhv_bowling_ball_init", - "802eea24" : "bowling_ball_set_hitbox", - "802eea7c" : "bowling_ball_set_waypoints", - "802eeb64" : "bhv_bowling_ball_roll_loop", - "802eecb8" : "bhv_bowling_ball_initializeLoop", - "802eedf0" : "bhv_bowling_ball_loop", - "802eeeb4" : "bhv_generic_bowling_ball_spawner_init", - "802eef9c" : "bhv_generic_bowling_ball_spawner_loop", - "802ef0e8" : "bhv_thi_bowling_ball_spawner_loop", - "802ef21c" : "bhv_bob_pit_bowling_ball_init", - "802ef274" : "bhv_bob_pit_bowling_ball_loop", - "802ef34c" : "bhv_free_bowling_ball_init", - "802ef3f4" : "bhv_free_bowling_ball_roll_loop", - "802ef524" : "bhv_free_bowling_ball_loop", - "802ef63c" : "bhv_rr_cruiser_wing_init", - "802ef66c" : "bhv_rr_cruiser_wing_loop", - "802ef820" : "bhv_spindel_init", - "802ef858" : "bhv_spindel_loop", - "802efcd0" : "bhv_ssl_moving_pyramid_wall_init", - "802efd8c" : "bhv_ssl_moving_pyramid_wall_loop", - "802efe64" : "bhv_pyramid_elevator_init", - "802efef4" : "bhv_pyramid_elevator_loop", - "802f0104" : "bhv_pyramid_elevator_trajectory_marker_ball_loop", - "802f0168" : "bhv_pyramid_top_init", - "802f0288" : "bhv_pyramid_top_spinning", - "802f04a0" : "bhv_pyramid_top_explode", - "802f05b4" : "bhv_pyramid_top_loop", - "802f06a8" : "bhv_pyramid_top_fragment_init", - "802f0714" : "bhv_pyramid_top_fragment_loop", - "802f0788" : "bhv_pyramid_pillar_touch_detector_loop", - "802f07f4" : "bhv_waterfall_sound_loop", - "802f0820" : "bhv_volcano_sound_loop", - "802f084c" : "bhv_castle_flag_init", - "802f0898" : "bhv_birds_sound_loop", - "802f0950" : "bhv_ambient_sounds_init", - "802f09a4" : "bhv_sand_sound_loop", - "802f09f0" : "bhv_castle_cannon_grate_init", - "802f0a40" : "bhv_snowmans_bottom_init", - "802f0b7c" : "set_rolling_sphere_hitbox", - "802f0bd4" : "adjust_rolling_face_pitch", - "802f0c94" : "snowmans_bottom_act_1", - "802f0df0" : "snowmans_bottom_act_2", - "802f0fa8" : "snowmans_bottom_act_3", - "802f105c" : "bhv_snowmans_bottom_loop", - "802f120c" : "bhv_snowmans_head_init", - "802f1370" : "bhv_snowmans_head_loop", - "802f151c" : "bhv_snowmans_body_checkpoint_loop", - "802f15a8" : "bhv_big_boulder_init", - "802f162c" : "boulder_act_1", - "802f1714" : "bhv_big_boulder_loop", - "802f17f0" : "bhv_big_boulder_generator_loop", - "802f1954" : "cap_set_hitbox", - "802f19c8" : "cap_despawn", - "802f1a10" : "cap_check_quicksand", - "802f1bb8" : "cap_sink_quicksand", - "802f1d64" : "bhv_wing_cap_init", - "802f1dc0" : "cap_scale_vertically", - "802f1e5c" : "wing_vanish_cap_act_0", - "802f1f3c" : "bhv_wing_vanish_cap_loop", - "802f1fd0" : "bhv_metal_cap_init", - "802f2030" : "metal_cap_act_0", - "802f20ac" : "bhv_metal_cap_loop", - "802f2140" : "bhv_normal_cap_init", - "802f21e0" : "normal_cap_set_save_flags", - "802f2284" : "normal_cap_act_0", - "802f23a8" : "bhv_normal_cap_loop", - "802f2498" : "bhv_vanish_cap_init", - "802f24f4" : "bhv_collect_star_init", - "802f25b0" : "bhv_collect_star_loop", - "802f2614" : "bhv_star_spawn_init", - "802f2768" : "bhv_star_spawn_loop", - "802f2aa0" : "spawn_star", - "802f2b88" : "spawn_default_star", - "802f2bd4" : "spawn_red_coin_cutscene_star", - "802f2c24" : "spawn_no_exit_star", - "802f2c84" : "bhv_hidden_red_coin_star_init", - "802f2d8c" : "bhv_hidden_red_coin_star_loop", - "802f2e6c" : "bhv_red_coin_init", - "802f2f2c" : "bhv_red_coin_loop", - "802f3014" : "bhv_hidden_star_init", - "802f30f0" : "bhv_hidden_star_loop", - "802f31bc" : "bhv_hidden_star_trigger_loop", - "802f328c" : "bhv_bowser_course_red_coin_star_loop", - "802f336c" : "bhv_ttm_rolling_log_init", - "802f341c" : "rolling_log_roll_log", - "802f36a4" : "bhv_rolling_log_loop", - "802f38b0" : "volcano_act_1", - "802f39b4" : "volcano_act_3", - "802f3a30" : "bhv_volcano_trap_loop", - "802f3b98" : "bhv_lll_rolling_log_init", - "802f3c54" : "bhv_1up_interact", - "802f3cc8" : "bhv_1up_common_init", - "802f3d30" : "bhv_1up_init", - "802f3dd0" : "one_up_loop_in_air", - "802f3ea8" : "pole_1up_move_towards_mario", - "802f401c" : "one_up_move_away_from_mario", - "802f40cc" : "bhv_1up_walking_loop", - "802f4248" : "bhv_1up_running_away_loop", - "802f43b8" : "sliding_1up_move", - "802f44c0" : "bhv_1up_sliding_loop", - "802f45b8" : "bhv_1up_loop", - "802f45f0" : "bhv_1up_jump_on_approach_loop", - "802f4710" : "bhv_1up_hidden_loop", - "802f48f4" : "bhv_1up_hidden_trigger_loop", - "802f496c" : "bhv_1up_hidden_in_pole_loop", - "802f4b00" : "bhv_1up_hidden_in_pole_trigger_loop", - "802f4b78" : "bhv_1up_hidden_in_pole_spawner_loop", - "802f4c68" : "controllable_platform_act_1", - "802f4ce0" : "controllable_platform_act_2", - "802f4d78" : "bhv_controllable_platform_sub_loop", - "802f4eb4" : "bhv_controllable_platform_init", - "802f5010" : "controllable_platform_hit_wall", - "802f5068" : "controllable_platform_check_walls", - "802f52c0" : "controllable_platform_shake_on_wall_hit", - "802f547c" : "controllable_platform_tilt_from_mario", - "802f55a4" : "bhv_controllable_platform_loop", - "802f5cd4" : "bhv_breakable_box_small_init", - "802f5d78" : "small_breakable_box_spawn_dust", - "802f5e44" : "small_breakable_box_act_move", - "802f5f48" : "breakable_box_small_released_loop", - "802f6014" : "breakable_box_small_idle_loop", - "802f60d8" : "breakable_box_small_get_dropped", - "802f6150" : "breakable_box_small_get_thrown", - "802f6228" : "bhv_breakable_box_small_loop", - "802f62e4" : "bhv_sliding_snow_mound_loop", - "802f6448" : "bhv_snow_mound_spawn_loop", - "802f6588" : "floating_platform_find_home_y", - "802f665c" : "floating_platform_act_0", - "802f6984" : "bhv_floating_platform_loop", - "802f6c0c" : "bhv_arrow_lift_loop", - "802f6d20" : "bhv_orange_number_init", - "802f6d58" : "bhv_orange_number_loop", - "802f6e40" : "bhv_manta_ray_init", - "802f7264" : "bhv_manta_ray_loop", - "802f7348" : "bhv_falling_pillar_init", - "802f7398" : "bhv_falling_pillar_spawn_hitboxes", - "802f7418" : "bhv_falling_pillar_calculate_angle_in_front_of_mario", - "802f74dc" : "bhv_falling_pillar_loop", - "802f7760" : "bhv_falling_pillar_hitbox_loop", - "802f7924" : "bhv_jrb_floating_box_loop", - "802f7978" : "bhv_decorative_pendulum_init", - "802f79b0" : "bhv_decorative_pendulum_loop", - "802f7a58" : "bhv_treasure_chest_top_loop", - "802f7c9c" : "bhv_treasure_chest_bottom_init", - "802f7d04" : "bhv_treasure_chest_bottom_loop", - "802f7f1c" : "spawn_treasure_chest", - "802f7fa0" : "bhv_treasure_chest_ship_init", - "802f8044" : "bhv_treasure_chest_ship_loop", - "802f8158" : "bhv_treasure_chest_jrb_init", - "802f8208" : "bhv_treasure_chest_jrb_loop", - "802f82f8" : "bhv_treasure_chest_init", - "802f83a4" : "bhv_treasure_chest_loop", - "802f8490" : "bhv_mips_init", - "802f85e0" : "bhv_mips_find_furthest_waypoint_to_mario", - "802f8760" : "bhv_mips_act_wait_for_nearby_mario", - "802f8808" : "bhv_mips_act_follow_path", - "802f893c" : "bhv_mips_act_wait_for_animation_done", - "802f8988" : "bhv_mips_act_fall_down", - "802f8a34" : "bhv_mips_act_idle", - "802f8ab4" : "bhv_mips_free", - "802f8b54" : "bhv_mips_held", - "802f8c74" : "bhv_mips_dropped", - "802f8cf8" : "bhv_mips_thrown", - "802f8dac" : "bhv_mips_loop", - "802f8e54" : "bhv_yoshi_init", - "802f8f08" : "yoshi_walk_loop", - "802f9054" : "yoshi_idle_loop", - "802f923c" : "yoshi_talk_loop", - "802f93a8" : "yoshi_walk_and_jump_off_roof_loop", - "802f9500" : "yoshi_finish_jumping_and_despawn_loop", - "802f95ac" : "yoshi_give_present_loop", - "802f965c" : "bhv_yoshi_loop", - "802fbc4c" : "bhv_koopa_init", - "802fc414" : "shelled_koopa_attack_handler", - "802fcc00" : "obj_begin_race", - "802fd7f8" : "bhv_koopa_update", - "802fd950" : "bhv_koopa_race_endpoint_update", - "802fda28" : "bhv_pokey_body_part_update", - "802fe3b0" : "bhv_pokey_update", - "802fe8b4" : "bhv_swoop_update", - "802ff040" : "bhv_fly_guy_update", - "802ff214" : "bhv_goomba_triplet_spawner_update", - "802ff408" : "bhv_goomba_init", - "802ff94c" : "huge_goomba_weakly_attacked", - "802ff96c" : "bhv_goomba_update", - "802ffb38" : "bhv_chain_chomp_chain_part_update", - "80300e40" : "bhv_chain_chomp_update", - "80300ecc" : "bhv_wooden_post_update", - "80301148" : "bhv_chain_chomp_gate_init", - "80301180" : "bhv_chain_chomp_gate_update", - "80301210" : "bhv_wiggler_body_part_update", - "803014cc" : "wiggler_init_segments", - "803016e0" : "wiggler_update_segments", - "803020e4" : "wiggler_jumped_on_attack_handler", - "80302154" : "bhv_wiggler_update", - "80302910" : "bhv_spiny_update", - "80303028" : "bhv_enemy_lakitu_update", - "8030369c" : "bhv_cloud_update", - "80303744" : "bhv_cloud_part_update", - "80303984" : "bhv_camera_lakitu_init", - "80303f64" : "bhv_camera_lakitu_update", - "803043f8" : "bhv_monty_mole_hole_update", - "80304474" : "monty_mole_spawn_dirt_particles", - "803044c0" : "bhv_monty_mole_init", - "80304ba8" : "bhv_monty_mole_update", - "80304fd4" : "bhv_monty_mole_rock_update", - "80305100" : "bhv_platform_on_track_init", - "80305a58" : "bhv_platform_on_track_update", - "80305bb0" : "bhv_track_ball_update", - "80305c14" : "bhv_seesaw_platform_init", - "80305c90" : "bhv_seesaw_platform_update", - "80305e2c" : "bhv_ferris_wheel_axle_init", - "80305f24" : "bhv_ferris_wheel_platform_update", - "80306084" : "bhv_water_bomb_spawner_update", - "803062a8" : "water_bomb_spawn_explode_particles", - "803067e8" : "bhv_water_bomb_update", - "803068c0" : "bhv_water_bomb_shadow_update", - "8030699c" : "bhv_ttc_rotating_solid_init", - "80306a38" : "bhv_ttc_rotating_solid_update", - "80306cc4" : "bhv_ttc_pendulum_init", - "80306d38" : "bhv_ttc_pendulum_update", - "80306f48" : "bhv_ttc_treadmill_init", - "80307010" : "bhv_ttc_treadmill_update", - "803071b8" : "bhv_ttc_moving_bar_init", - "80307670" : "bhv_ttc_moving_bar_update", - "80307760" : "bhv_ttc_cog_init", - "803077e0" : "bhv_ttc_cog_update", - "80307930" : "bhv_ttc_pit_block_init", - "803079c8" : "bhv_ttc_pit_block_update", - "80307ae4" : "bhv_ttc_elevator_init", - "80307b58" : "bhv_ttc_elevator_update", - "80307c88" : "bhv_ttc_2d_rotator_init", - "80307cf8" : "bhv_ttc_2d_rotator_update", - "80307ea4" : "bhv_ttc_spinner_update", - "80307fb8" : "mr_blizzard_spawn_white_particles", - "8030803c" : "bhv_mr_blizzard_init", - "80308d6c" : "bhv_mr_blizzard_update", - "80309154" : "bhv_mr_blizzard_snowball", - "803091e0" : "bhv_sliding_plat_2_init", - "80309354" : "bhv_sliding_plat_2_loop", - "80309454" : "bhv_rotating_octagonal_plat_init", - "803094d0" : "bhv_rotating_octagonal_plat_loop", - "803094f8" : "bhv_animates_on_floor_switch_press_init", - "80309530" : "bhv_animates_on_floor_switch_press_loop", - "803097a4" : "bhv_activated_back_and_forth_platform_init", - "803098c0" : "bhv_activated_back_and_forth_platform_update", - "80309b64" : "bhv_recovery_heart_loop", - "80309cec" : "bhv_bubble_cannon_barrel_loop", - "80309ed4" : "water_bomb_cannon_act_0", - "80309f68" : "water_bomb_cannon_act_1", - "8030a0e8" : "water_bomb_cannon_act_2", - "8030a11c" : "bhv_water_bomb_cannon_loop", - "8030a1c0" : "bhv_unagi_init", - "8030a2a8" : "unagi_act_0", - "8030a390" : "unagi_act_1_4", - "8030a514" : "unagi_act_2", - "8030a614" : "unagi_act_3", - "8030a93c" : "bhv_unagi_loop", - "8030aabc" : "bhv_unagi_subobject_loop", - "8030ad04" : "dorrie_raise_head", - "8030ae9c" : "dorrie_act_move", - "8030b0b8" : "dorrie_begin_head_raise", - "8030b0f0" : "dorrie_act_lower_head", - "8030b220" : "dorrie_act_raise_head", - "8030b2f4" : "bhv_dorrie_update", - "8030b658" : "bhv_haunted_chair_init", - "8030b6d8" : "haunted_chair_act_0", - "8030ba68" : "haunted_chair_act_1", - "8030bc90" : "bhv_haunted_chair_loop", - "8030bfd0" : "bhv_mad_piano_update", - "8030c06c" : "flying_bookend_act_0", - "8030c0f0" : "flying_bookend_act_1", - "8030c210" : "flying_bookend_act_2", - "8030c2c8" : "flying_bookend_act_3", - "8030c364" : "bhv_flying_bookend_loop", - "8030c4b0" : "bhv_bookend_spawn_loop", - "8030c564" : "bookshelf_manager_act_0", - "8030c60c" : "bookshelf_manager_act_1", - "8030c6a4" : "bookshelf_manager_act_2", - "8030c828" : "bookshelf_manager_act_3", - "8030c894" : "bookshelf_manager_act_4", - "8030c8ec" : "bhv_haunted_bookshelf_manager_loop", - "8030c98c" : "bhv_book_switch_loop", - "8030cd30" : "obj_spit_fire", - "8030cddc" : "bhv_fire_piranha_plant_init", - "8030d2f0" : "bhv_fire_piranha_plant_update", - "8030d598" : "bhv_fire_spitter_update", - "8030d640" : "bhv_small_piranha_flame_loop", - "8030d8d4" : "bhv_fly_guy_flame_loop", - "8030d93c" : "geo_snufit_move_mask", - "8030d9ac" : "geo_snufit_scale_body", - "8030da14" : "snufit_act_idle", - "8030db38" : "snufit_act_shoot", - "8030dc70" : "bhv_snufit_loop", - "8030dfc4" : "bhv_snufit_balls_loop", - "8030e14c" : "bhv_horizontal_grindel_init", - "8030e16c" : "bhv_horizontal_grindel_update", - "8030ea9c" : "bhv_eyerok_boss_loop", - "8030fff8" : "bhv_eyerok_hand_loop", - "80310498" : "bhv_klepto_init", - "8031126c" : "obj_set_speed_to_zero", - "8031129c" : "bhv_klepto_update", - "80311874" : "bhv_bird_update", - "803118e4" : "bhv_racing_penguin_init", - "80312070" : "bhv_racing_penguin_update", - "80312168" : "bhv_penguin_race_finish_line_update", - "80312200" : "bhv_penguin_race_shortcut_check_update", - "80312248" : "bhv_coffin_spawner_loop", - "80312370" : "coffin_act_idle", - "8031262c" : "coffin_act_stand_up", - "8031274c" : "bhv_coffin_loop", - "80312804" : "clam_act_0", - "80312900" : "clam_act_1", - "80312a54" : "bhv_clam_loop", - "80313110" : "bhv_skeeter_update", - "803131e8" : "bhv_skeeter_wave_update", - "8031326c" : "bhv_swing_platform_init", - "80313294" : "bhv_swing_platform_update", - "80313354" : "bhv_donut_platform_spawner_update", - "80313530" : "bhv_donut_platform_update", - "803136cc" : "bhv_ddd_pole_init", - "80313754" : "bhv_ddd_pole_update", - "803137f4" : "bhv_red_coin_star_marker_init", - "80313fc0" : "bhv_triplet_butterfly_update", - "80314098" : "bubba_act_0", - "8031427c" : "bubba_act_1", - "803145d4" : "bhv_bubba_loop", - "80314a30" : "prepare_reverb_ring_buffer", - "80314cc0" : "get_volume_ramping", - "80314de4" : "synthesis_execute", - "80314f64" : "synthesis_do_one_audio_update", - "80315590" : "synthesis_process_notes", - "80316010" : "load_wave_samples", - "803160dc" : "final_resample", - "80316138" : "process_envelope", - "8031619c" : "process_envelope_inner", - "803166fc" : "note_apply_headset_pan_effects", - "80316ac8" : "note_init_volume", - "80316af4" : "note_set_vel_pan_reverb", - "80316da8" : "note_set_frequency", - "80316db4" : "note_enable", - "80316e00" : "note_disable", - "80316e80" : "reset_bank_and_seq_load_status", - "80316ec4" : "discard_bank", - "80316fb4" : "discard_sequence", - "80317040" : "soundAlloc", - "803170b4" : "sound_alloc_pool_init", - "803170d4" : "persistent_pool_clear", - "803170e8" : "temporary_pool_clear", - "80317118" : "unused_803160F8", - "80317128" : "sound_init_main_pools", - "80317184" : "session_pools_init", - "80317200" : "seq_and_bank_pool_init", - "8031727c" : "persistent_pools_init", - "80317338" : "temporary_pools_init", - "803173fc" : "alloc_bank_or_seq", - "8031782c" : "get_bank_or_seq", - "803178ec" : "decrease_reverb_gain", - "80317914" : "wait_for_audio_frames", - "80317948" : "audio_reset_session", - "80318040" : "audio_dma_copy_immediate", - "803180c4" : "audio_dma_copy_async", - "80318130" : "audio_dma_partial_copy_async", - "803181ec" : "decrease_sample_dma_ttls", - "80318300" : "dma_sample_data", - "80318634" : "init_sample_dma_buffers", - "803188f4" : "patch_audio_bank", - "80318b30" : "bank_load_immediate", - "80318c8c" : "bank_load_async", - "80318dc4" : "sequence_dma_immediate", - "80318e70" : "sequence_dma_async", - "80318fac" : "get_missing_bank", - "803190f4" : "load_banks_immediate", - "80319220" : "preload_sequence", - "80319328" : "load_sequence", - "80319388" : "load_sequence_internal", - "8031950c" : "audio_init", - "80319920" : "note_init", - "80319998" : "note_disable2", - "803199b8" : "process_notes", - "80319db8" : "seq_channel_layer_decay_release_internal", - "80319f64" : "seq_channel_layer_note_decay", - "80319f84" : "seq_channel_layer_note_release", - "80319fa4" : "build_synthetic_wave", - "8031a1d0" : "init_synthetic_wave", - "8031a254" : "init_note_list", - "8031a264" : "init_note_lists", - "8031a2b4" : "init_note_free_list", - "8031a368" : "note_pool_clear", - "8031a494" : "note_pool_fill", - "8031a5d0" : "audio_list_push_front", - "8031a610" : "audio_list_remove", - "8031a63c" : "pop_node_with_lower_prio", - "8031a6cc" : "note_init_for_layer", - "8031a794" : "func_80319728", - "8031a7c8" : "note_release_and_take_ownership", - "8031a820" : "alloc_note_from_disabled", - "8031a89c" : "alloc_note_from_decaying", - "8031a8f0" : "alloc_note_from_active", - "8031a94c" : "alloc_note", - "8031ac34" : "reclaim_notes", - "8031adac" : "note_init_all", - "8031aee8" : "sequence_player_process_sound", - "8031b0cc" : "get_portamento_freq_scale", - "8031b1c0" : "get_vibrato_pitch_change", - "8031b248" : "get_vibrato_freq_scale", - "8031b440" : "note_vibrato_update", - "8031b4a0" : "note_vibrato_init", - "8031b58c" : "adsr_init", - "8031b5ac" : "adsr_update", - "8031b830" : "sequence_channel_init", - "8031b940" : "seq_channel_set_layer", - "8031ba30" : "seq_channel_layer_disable", - "8031ba6c" : "seq_channel_layer_free", - "8031baf0" : "sequence_channel_disable", - "8031bb5c" : "allocate_sequence_channel", - "8031bba4" : "sequence_player_init_channels", - "8031bcd0" : "sequence_player_disable_channels", - "8031bda0" : "sequence_channel_enable", - "8031be44" : "sequence_player_disable", - "8031bf14" : "audio_list_push_back", - "8031bf54" : "audio_list_pop_back", - "8031bf94" : "init_layer_freelist", - "8031c03c" : "m64_read_u8", - "8031c050" : "m64_read_s16", - "8031c080" : "m64_read_compressed_u16", - "8031c0c4" : "seq_channel_layer_process_script", - "8031ce54" : "get_instrument", - "8031cfd4" : "set_instrument", - "8031d068" : "sequence_channel_set_volume", - "8031d08c" : "sequence_channel_process_script", - "8031d9ec" : "sequence_player_process_sequence", - "8031e240" : "process_sequences", - "8031e2e8" : "init_sequence_player", - "8031e374" : "init_sequence_players", - "8031e4f0" : "unused_8031E4F0", - "8031e568" : "unused_8031E568", - "8031e7b8" : "create_next_audio_frame_task", - "8031eb00" : "play_sound", - "8031fd84" : "audio_signal_game_loop_tick", - "80320678" : "seq_player_fade_out", - "803206bc" : "fade_volume_scale", - "803208ec" : "process_level_music_dynamics", - "80320d70" : "unused_8031FED0", - "80320e3c" : "seq_player_lower_volume", - "80320ec4" : "seq_player_unlower_volume", - "803210d4" : "set_audio_muted", - "8032112c" : "sound_init", - "80321398" : "get_currently_playing_sound", - "80321474" : "stop_sound", - "80321584" : "stop_sounds_from_source", - "8032171c" : "stop_sounds_in_continuous_banks", - "8032174c" : "sound_banks_disable", - "8032180c" : "sound_banks_enable", - "80321864" : "unused_803209D8", - "803218d8" : "set_sound_moving_speed", - "803218f4" : "play_dialog_sound", - "803219ac" : "play_music", - "80321bac" : "stop_background_music", - "80321ce4" : "fadeout_background_music", - "80321d38" : "drop_queued_background_music", - "80321d5c" : "get_current_background_music", - "80321d9c" : "func_80320ED8", - "80321e48" : "play_secondary_music", - "80321f48" : "func_80321080", - "80321f9c" : "func_803210D4", - "80322078" : "play_course_clear", - "803220b4" : "play_peachs_jingle", - "803220f0" : "play_puzzle_jingle", - "8032212c" : "play_star_fanfare", - "80322168" : "play_power_star_jingle", - "803221b8" : "play_race_fanfare", - "803221f4" : "play_toads_jingle", - "80322230" : "sound_reset", - "8032231c" : "audio_set_sound_mode", - "80322348" : "unused_80321460", - "8032235c" : "unused_80321474", - "803223b0" : "osSetTime", - "803223e0" : "osMapTLB", - "803224a0" : "osUnmapTLBAll", - "803224f0" : "sprintf", - "8032255c" : "proutSprintf", - "803225a0" : "osCreateMesgQueue", - "803225d0" : "osSetEventMesg", - "80322640" : "osViSetEvent", - "803226b0" : "osCreateThread", - "80322800" : "osRecvMesg", - "80322940" : "_VirtualToPhysicalTask", - "80322a5c" : "osSpTaskLoad", - "80322bbc" : "osSpTaskStartGo", - "80322c00" : "osSpTaskYield", - "80322c20" : "osSendMesg", - "80322d70" : "osSpTaskYielded", - "80322df0" : "osStartThread", - "80322f40" : "osWritebackDCacheAll", - "80322f70" : "osCreateViManager", - "803230f4" : "viMgrMain", - "803232d0" : "osViSetMode", - "80323340" : "osViBlack", - "803233b0" : "osViSetSpecialFeatures", - "80323570" : "osCreatePiManager", - "803236f0" : "osSetThreadPri", - "803237d0" : "osInitialize", - "80323a00" : "osViSwapBuffer", - "80323a50" : "sqrtf", - "80323a60" : "osContStartReadData", - "80323b24" : "osContGetReadData", - "80323bcc" : "__osPackReadData", - "80323cc0" : "osContInit", - "80323ebc" : "__osContGetInitData", - "80323f8c" : "__osPackRequestData", - "80324080" : "osEepromProbe", - "803240f0" : "__ull_rshift", - "8032411c" : "__ull_rem", - "80324158" : "__ull_div", - "80324194" : "__ll_lshift", - "803241c0" : "__ll_rem", - "803241fc" : "__ll_div", - "80324258" : "__ll_mul", - "80324288" : "__ull_divremi", - "803242e8" : "__ll_mod", - "80324384" : "__ll_rshift", - "803243b0" : "osInvalDCache", - "80324460" : "osPiStartDma", - "80324570" : "bzero", - "80324610" : "osInvalICache", - "80324690" : "osEepromLongRead", - "803247d0" : "osEepromLongWrite", - "80324910" : "bcopy", - "80324c20" : "guOrthoF", - "80324d74" : "guOrtho", - "80324de0" : "guPerspectiveF", - "80325010" : "guPerspective", - "80325070" : "osGetTime", - "80325100" : "__d_to_ll", - "8032511c" : "__f_to_ll", - "80325138" : "__d_to_ull", - "803251d8" : "__f_to_ull", - "80325274" : "__ll_to_d", - "8032528c" : "__ll_to_f", - "803252a4" : "__ull_to_d", - "803252d8" : "__ull_to_f", - "80325310" : "cosf", - "80325480" : "sinf", - "80325640" : "guTranslateF", - "80325688" : "guTranslate", - "803256e0" : "guRotateF", - "80325874" : "guRotate", - "803258d0" : "guScaleF", - "80325924" : "guScale", - "80325970" : "osAiSetFrequency", - "80325bd4" : "alBnkfNew", - "80325cd8" : "alSeqFileNew", - "80325d20" : "osWritebackDCache", - "80325da0" : "osAiGetLength", - "80325db0" : "osAiSetNextBuffer", - "80325e60" : "__osTimerServicesInit", - "80325eec" : "__osTimerInterrupt", - "80326064" : "__osSetTimerIntr", - "803260d8" : "__osInsertTimer", - "80326260" : "_Printf", - "803273f0" : "memcpy", - "8032741c" : "strlen", - "80327444" : "strchr", - "80327490" : "__osDequeueThread", - "803274d0" : "__osDisableInt", - "803274f0" : "__osRestoreInt", - "80327510" : "__osViInit", - "80327640" : "__osExceptionPreamble", - "80327650" : "__osException", - "803278e4" : "L80326964", - "80327904" : "L80326984", - "80327938" : "L803269B8", - "80327a68" : "L80326AE8", - "80327ac4" : "L80326B44", - "80327ae4" : "L80326B64", - "80327b1c" : "L80326B9C", - "80327b68" : "L80326BE8", - "80327b98" : "send_mesg", - "80327c80" : "__osEnqueueAndYield", - "80327d10" : "__osEnqueueThread", - "80327d58" : "__osPopThread", - "80327d68" : "__osDispatchThread", - "80327ea8" : "__osCleanupThread", - "80327eb0" : "osVirtualToPhysical", - "80327f30" : "__osSpSetStatus", - "80327f40" : "__osSpSetPc", - "80327f80" : "__osSpRawStartDma", - "80328010" : "__osSpDeviceBusy", - "80328040" : "__osSpGetStatus", - "80328050" : "osGetThreadPri", - "80328070" : "__osViGetCurrentContext", - "80328080" : "__osViSwapContext", - "803283e0" : "osGetCount", - "803283f0" : "__osPiCreateAccessQueue", - "80328440" : "__osPiGetAccess", - "80328484" : "__osPiRelAccess", - "803284b0" : "osPiRawStartDma", - "80328590" : "__osDevMgrMain", - "80328710" : "__osSetSR", - "80328720" : "__osGetSR", - "80328730" : "__osSetFpcCsr", - "80328740" : "__osSiRawReadIo", - "80328790" : "__osSiRawWriteIo", - "803287e0" : "osMapTLBRdb", - "80328840" : "osPiRawReadIo", - "803288a0" : "__osSiCreateAccessQueue", - "803288f0" : "__osSiGetAccess", - "80328934" : "__osSiRelAccess", - "80328960" : "__osSiRawStartDma", - "80328a10" : "osSetTimer", - "80328af0" : "osEepromWrite", - "80328ca0" : "__osPackEepWriteData", - "80328dac" : "__osEepStatus", - "80328fd0" : "osJamMesg", - "80329120" : "osPiGetCmdQueue", - "80329150" : "osEepromRead", - "80329340" : "__osPackEepReadData", - "80329450" : "guMtxF2L", - "80329550" : "guMtxIdentF", - "803295d8" : "guMtxIdent", - "80329608" : "guMtxL2F", - "803296c0" : "guNormalize", - "80329750" : "__osAiDeviceBusy", - "80329780" : "__osSetCompare", - "80329790" : "_Litob", - "80329a90" : "_Ldtob", - "8032a860" : "u32_to_string", - "8032a890" : "string_to_u32", - "8032a8e8" : "send_packet", - "8032a9a8" : "send", - "8032aa80" : "process_command_memory", - "8032aacc" : "process_command_register", - "8032aaf8" : "kdebugserver", - "8032ace0" : "__osSyncPutChars", - "8032ae10" : "osSetIntMask", - "8032ae70" : "osDestroyThread", - "8032af70" : "__osProbeTLB", - "8032b030" : "__osSiDeviceBusy", - "8032b060" : "lldiv", - "8032b160" : "ldiv", - "8032b1f0" : "__osGetCause", - "8032b200" : "__osAtomicDec", - "8032b260" : "rspF3DBootStart", - "8032b330" : "rspF3DBootEnd", - "8032b330" : "rspF3DStart", - "8032c738" : "rspF3DEnd", - "8032c740" : "rspAspMainStart", - "8032d560" : "rspAspMainEnd", - "8032d560" : "gVblankHandler1", - "8032d564" : "gVblankHandler2", - "8032d568" : "gActiveSPTask", - "8032d56c" : "sCurrentAudioSPTask", - "8032d570" : "sCurrentDisplaySPTask", - "8032d574" : "sNextAudioSPTask", - "8032d578" : "sNextDisplaySPTask", - "8032d57c" : "sAudioEnabled", - "8032d580" : "gNumVblanks", - "8032d584" : "gResetTimer", - "8032d588" : "D_8032C648", - "8032d58c" : "gDebugLevelSelect", - "8032d590" : "D_8032C650", - "8032d594" : "gShowProfiler", - "8032d598" : "gShowDebugText", - "8032d5d0" : "unused8032C690", - "8032d5d4" : "gGlobalTimer", - "8032d5dc" : "frameBufferIndex", - "8032d5e0" : "gGoddardVblankCallback", - "8032d5e4" : "gPlayer1Controller", - "8032d5e8" : "gPlayer2Controller", - "8032d5ec" : "gPlayer3Controller", - "8032d5f0" : "gCurrDemoInput", - "8032d5f4" : "gDemoInputListID", - "8032d5f8" : "gRecordedDemoInput", - "8032d6d0" : "credits01", - "8032d6d8" : "credits02", - "8032d6e4" : "credits03", - "8032d6f0" : "credits04", - "8032d700" : "credits05", - "8032d710" : "credits06", - "8032d71c" : "credits07", - "8032d728" : "credits08", - "8032d738" : "credits09", - "8032d740" : "credits10", - "8032d750" : "credits11", - "8032d75c" : "credits12", - "8032d764" : "credits13", - "8032d774" : "credits14", - "8032d77c" : "credits15", - "8032d788" : "credits16", - "8032d79c" : "credits17", - "8032d7ac" : "credits18", - "8032d7bc" : "credits19", - "8032d7c4" : "credits20", - "8032d7cc" : "sCreditsSequence", - "8032d93c" : "gMarioState", - "8032d940" : "unused1", - "8032d944" : "sWarpCheckpointActive", - "8032daa0" : "sTerrainSounds", - "8032dacc" : "sSquishScaleOverTime", - "8032dae0" : "sCapFlickerFrames", - "8032daf8" : "gWaterSurfacePseudoFloor", - "8032dc50" : "sJumpLandAction", - "8032dc68" : "sFreefallLandAction", - "8032dc80" : "sSideFlipLandAction", - "8032dc98" : "sHoldJumpLandAction", - "8032dcb0" : "sHoldFreefallLandAction", - "8032dcc8" : "sLongJumpLandAction", - "8032dce0" : "sDoubleJumpLandAction", - "8032dcf8" : "sTripleJumpLandAction", - "8032dd10" : "sBackflipLandAction", - "8032dd40" : "sPunchingForwardVelocities", - "8032dd80" : "gLastCompletedCourseNum", - "8032dd84" : "gLastCompletedStarNum", - "8032dd88" : "sUnusedGotGlobalCoinHiScore", - "8032dd8c" : "gGotFileCoinHiScore", - "8032dd90" : "gCurrCourseStarFlags", - "8032dd94" : "gSpecialTripleJump", - "8032dd98" : "gLevelToCourseNumTable", - "8032ddc0" : "gMarioSpawnInfo", - "8032ddc4" : "gLoadedGraphNodes", - "8032ddc8" : "gAreas", - "8032ddcc" : "gCurrentArea", - "8032ddd0" : "gCurrCreditsEntry", - "8032ddd4" : "D_8032CE74", - "8032ddd8" : "D_8032CE78", - "8032dddc" : "gWarpTransDelay", - "8032dde0" : "gFBSetColor", - "8032dde4" : "gWarpTransFBSetColor", - "8032dde8" : "gWarpTransRed", - "8032ddec" : "gWarpTransGreen", - "8032ddf0" : "gWarpTransBlue", - "8032ddf4" : "gCurrSaveFileNum", - "8032ddf8" : "gCurrLevelNum", - "8032ddfc" : "sWarpBhvSpawnTable", - "8032de4c" : "sSpawnTypeFromWarpBhv", - "8032de60" : "D_8032CF00", - "8032de70" : "renderModeTable_1Cycle", - "8032deb0" : "renderModeTable_2Cycle", - "8032def0" : "gCurGraphNodeRoot", - "8032def4" : "gCurGraphNodeMasterList", - "8032def8" : "gCurGraphNodeCamFrustum", - "8032defc" : "gCurGraphNodeCamera", - "8032df00" : "gCurGraphNodeObject", - "8032df04" : "gCurGraphNodeHeldObject", - "8032df08" : "gAreaUpdateCounter", - "8032df10" : "gProfilerMode", - "8032df14" : "gCurrentFrameIndex1", - "8032df18" : "gCurrentFrameIndex2", - "8032df20" : "unused8032CFC0", - "8032df24" : "gCutsceneFocus", - "8032df28" : "unused8032CFC8", - "8032df2c" : "unused8032CFCC", - "8032df30" : "gSecondCameraFocus", - "8032df34" : "sYawSpeed", - "8032df38" : "gCurrLevelArea", - "8032df3c" : "gPrevLevel", - "8032df40" : "unused8032CFE0", - "8032df44" : "unused8032CFE4", - "8032df48" : "unused8032CFE8", - "8032df4c" : "gCameraZoomDist", - "8032df50" : "sObjectCutscene", - "8032df54" : "gRecentCutscene", - "8032df58" : "sFramesSinceCutsceneEnded", - "8032df5c" : "sCutsceneDialogResponse", - "8032df60" : "sMarioCamState", - "8032df64" : "sLuigiCamState", - "8032df68" : "unused8032D008", - "8032df6c" : "sFixedModeBasePosition", - "8032df78" : "sUnusedModeBasePosition_2", - "8032df84" : "sUnusedModeBasePosition_3", - "8032df90" : "sUnusedModeBasePosition_4", - "8032df9c" : "sUnusedModeBasePosition_5", - "8032dfa8" : "sModeTransitions", - "8032e008" : "unused8032D0A8", - "8032e010" : "unused8032D0B0", - "8032e018" : "sDanceCutsceneTable", - "8032e024" : "unusedDanceInfo1", - "8032e038" : "unusedDanceType", - "8032e03c" : "unusedDanceInfo2", - "8032e050" : "sBBHLibraryParTrackPath", - "8032e098" : "sCamSL", - "8032e0e0" : "sCamTHI", - "8032e128" : "sCamHMC", - "8032e1d0" : "sCamSSL", - "8032e248" : "sCamRR", - "8032e2f0" : "sCamBOB", - "8032e338" : "sCamCotMC", - "8032e368" : "sCamCCM", - "8032e3b0" : "sCamCastle", - "8032e6f8" : "sCamBBH", - "8032ecb0" : "sCameraTriggers", - "8032ed50" : "sIntroStartToPipePosition", - "8032ee08" : "sIntroStartToPipeFocus", - "8032eec0" : "sIntroPipeToDialogPosition", - "8032ef30" : "sIntroPipeToDialogFocus", - "8032efa0" : "sEndingFlyToWindowPos", - "8032eff0" : "sEndingFlyToWindowFocus", - "8032f048" : "sEndingPeachDescentCamPos", - "8032f0e8" : "sEndingMarioToPeachPos", - "8032f130" : "sEndingMarioToPeachFocus", - "8032f178" : "sEndingLookUpAtCastle", - "8032f1b8" : "sEndingLookAtSkyFocus", - "8032f214" : "gIntroLakituStartToPipeFocus", - "8032f32c" : "gIntroLakituStartToPipeOffsetFromCamera", - "8032f444" : "gEndWavingPos", - "8032f48c" : "gEndWavingFocus", - "8032f4d4" : "sCutsceneEnding", - "8032f534" : "sCutsceneGrandStar", - "8032f544" : "sCutsceneUnused", - "8032f554" : "sCutsceneDoorWarp", - "8032f564" : "sCutsceneEndWaving", - "8032f56c" : "sCutsceneCredits", - "8032f574" : "sCutsceneDoorPull", - "8032f59c" : "sCutsceneDoorPush", - "8032f5c4" : "sCutsceneDoorPullMode", - "8032f5dc" : "sCutsceneDoorPushMode", - "8032f5f4" : "sCutsceneEnterCannon", - "8032f60c" : "sCutsceneStarSpawn", - "8032f624" : "sCutsceneRedCoinStarSpawn", - "8032f634" : "sCutsceneEnterPainting", - "8032f63c" : "sCutsceneDeathExit", - "8032f64c" : "sCutsceneExitPaintingSuccess", - "8032f65c" : "sCutsceneUnusedExit", - "8032f674" : "sCutsceneIntroPeach", - "8032f69c" : "sCutscenePrepareCannon", - "8032f6ac" : "sCutsceneExitWaterfall", - "8032f6bc" : "sCutsceneFallToCastleGrounds", - "8032f6cc" : "sCutsceneEnterPyramidTop", - "8032f6dc" : "sCutscenePyramidTopExplode", - "8032f6f4" : "sCutsceneStandingDeath", - "8032f6fc" : "sCutsceneEnterPool", - "8032f70c" : "sCutsceneDeathStomach", - "8032f714" : "sCutsceneDeathOnBack", - "8032f71c" : "sCutsceneQuicksandDeath", - "8032f724" : "sCutsceneWaterDeath", - "8032f72c" : "sCutsceneSuffocation", - "8032f734" : "sCutsceneEnterBowserArena", - "8032f74c" : "sCutsceneDanceDefaultRotate", - "8032f754" : "sCutsceneDanceFlyAway", - "8032f75c" : "sCutsceneDanceCloseup", - "8032f764" : "sCutsceneKeyDance", - "8032f76c" : "sCutsceneCapSwitchPress", - "8032f774" : "sCutsceneSlidingDoorsOpen", - "8032f784" : "sCutsceneUnlockKeyDoor", - "8032f794" : "sCutsceneExitBowserSuccess", - "8032f7a4" : "sCutsceneExitBowserDeath", - "8032f7b4" : "sCutsceneExitSpecialSuccess", - "8032f7c4" : "sCutsceneNonPaintingDeath", - "8032f7d4" : "sCutsceneDialog", - "8032f7ec" : "sCutsceneReadMessage", - "8032f804" : "sDanceCutsceneIndexTable", - "8032f870" : "sZoomOutAreaMasks", - "8032f884" : "sBobCreditsSplinePositions", - "8032f8ac" : "sBobCreditsSplineFocus", - "8032f8d4" : "sWfCreditsSplinePositions", - "8032f8fc" : "sWfCreditsSplineFocus", - "8032f924" : "sJrbCreditsSplinePositions", - "8032f94c" : "sJrbCreditsSplineFocus", - "8032f974" : "sCcmSlideCreditsSplinePositions", - "8032f99c" : "sCcmSlideCreditsSplineFocus", - "8032f9c4" : "sBbhCreditsSplinePositions", - "8032f9e4" : "sBbhCreditsSplineFocus", - "8032fa04" : "sHmcCreditsSplinePositions", - "8032fa2c" : "sHmcCreditsSplineFocus", - "8032fa54" : "sThiWigglerCreditsSplinePositions", - "8032fa6c" : "sThiWigglerCreditsSplineFocus", - "8032fa84" : "sVolcanoCreditsSplinePositions", - "8032fab4" : "sVolcanoCreditsSplineFocus", - "8032fae4" : "sSslCreditsSplinePositions", - "8032fb14" : "sSslCreditsSplineFocus", - "8032fb44" : "sDddCreditsSplinePositions", - "8032fb7c" : "sDddCreditsSplineFocus", - "8032fbb4" : "sSlCreditsSplinePositions", - "8032fbd4" : "sSlCreditsSplineFocus", - "8032fbf4" : "sWdwCreditsSplinePositions", - "8032fc14" : "sWdwCreditsSplineFocus", - "8032fc34" : "sTtmCreditsSplinePositions", - "8032fc64" : "sTtmCreditsSplineFocus", - "8032fc94" : "sThiHugeCreditsSplinePositions", - "8032fccc" : "sThiHugeCreditsSplineFocus", - "8032fd04" : "sTtcCreditsSplinePositions", - "8032fd24" : "sTtcCreditsSplineFocus", - "8032fd44" : "sRrCreditsSplinePositions", - "8032fd64" : "sRrCreditsSplineFocus", - "8032fd84" : "sSaCreditsSplinePositions", - "8032fdac" : "sSaCreditsSplineFocus", - "8032fdd4" : "sCotmcCreditsSplinePositions", - "8032fdfc" : "sCotmcCreditsSplineFocus", - "8032fe24" : "sDddSubCreditsSplinePositions", - "8032fe4c" : "sDddSubCreditsSplineFocus", - "8032fe74" : "sCcmOutsideCreditsSplinePositions", - "8032fe94" : "sCcmOutsideCreditsSplineFocus", - "8032fec0" : "sObjectListUpdateOrder", - "8032fecc" : "sParticleTypes", - "80330000" : "D_8032F0A0", - "80330004" : "D_8032F0A4", - "80330020" : "D_8032F0C0", - "8033002c" : "D_8032F0CC", - "8033006c" : "sMrIParticleActions", - "80330074" : "sMrIActions", - "80330084" : "sMrIHitbox", - "80330094" : "D_8032F134", - "803300a8" : "unused8032F134", - "803300ac" : "sCapSwitchActions", - "803300bc" : "sKingBobombActions", - "803300e0" : "sKingBobombSoundStates", - "80330140" : "sOpenedCannonActions", - "8033015c" : "unused0EA1FC", - "80330198" : "sChuckyaActions", - "803301a8" : "sWFRotatingPlatformData", - "803301c0" : "sKoopaShellUnderwaterHitbox", - "803301d0" : "D_8032F270", - "803301e4" : "sSparkleSpawnStarHitbox", - "803301f4" : "sYellowCoinHitbox", - "80330204" : "D_8032F2A4", - "80330224" : "sCoinInsideBooActions", - "8033022c" : "D_8032F2CC", - "80330244" : "D_8032F2E4", - "80330260" : "D_8032F300", - "80330288" : "D_8032F328", - "80330290" : "D_8032F330", - "80330298" : "sGrindelThwompActions", - "803302ac" : "sTumblingBridgeParams", - "803302dc" : "sTumblingBridgeActions", - "803302ec" : "D_8032F38C", - "80330318" : "sElevatorActions", - "8033032c" : "D_8032F3CC", - "80330340" : "D_8032F3E0", - "80330354" : "D_8032F3F4", - "8033035c" : "D_8032F3FC", - "80330370" : "sUkikiCageActions", - "80330380" : "D_8032F420", - "80330390" : "sSpindriftHitbox", - "803303a0" : "sMetalBoxHitbox", - "803303b0" : "sBreakableBoxHitbox", - "803303c0" : "D_8032F460", - "803303e8" : "sHeaveHoActions", - "803303f8" : "sJumpingBoxHitbox", - "80330408" : "sJumpingBoxActions", - "8033042c" : "sBowserKeyHitbox", - "8033043c" : "sBulletBillActions", - "80330450" : "sBowserTailAnchorActions", - "8033045c" : "D_8032F4FC", - "8033046c" : "D_8032F50C", - "80330470" : "D_8032F510", - "80330474" : "D_8032F514", - "80330478" : "sBowserDefeatedDialogText", - "80330480" : "D_8032F520", - "803304c8" : "sBowserActions", - "80330518" : "D_8032F5B8", - "803305f0" : "D_8032F690", - "803305f4" : "D_8032F694", - "803305f8" : "D_8032F698", - "8033067c" : "sFallingBowserPlatformActions", - "80330688" : "sGrowingBowserFlameHitbox", - "80330698" : "sBowserFlameHitbox", - "803306a8" : "D_8032F748", - "803306b4" : "D_8032F754", - "80330738" : "sUkikiSoundStates", - "803307a0" : "sUkikiActions", - "803307c0" : "D_8032F860", - "803307f4" : "D_8032F894", - "80330828" : "D_8032F8C8", - "80330830" : "sRotatingCwFireBarsActions", - "80330840" : "sKoopaShellHitbox", - "80330850" : "D_8032F8F0", - "80330884" : "D_8032F924", - "803308a8" : "D_8032F948", - "803308cc" : "D_8032F96C", - "803308d8" : "sToxBoxActions", - "80330900" : "TablePiranhaPlantActions", - "80330b1c" : "sBowserPuzzlePieceActions", - "80330b38" : "sTuxiesMotherActions", - "80330b44" : "sSmallPenguinActions", - "80330b74" : "sBirdChirpChirpActions", - "80330b84" : "sCheepCheepActions", - "80330b90" : "sExclamationBoxHitbox", - "80330ba0" : "sExclamationBoxContents", - "80330c20" : "sExclamationBoxActions", - "80330c38" : "sSkullSlidingBoxHitbox", - "80330c48" : "gOpenableGrills", - "80330c58" : "sTweesterHitbox", - "80330c68" : "sTweesterActions", - "80330cd4" : "sScuttlebugHitbox", - "80330ce4" : "sWhompActions", - "80330d0c" : "sWaterSplashDropletParams", - "80330d30" : "gShallowWaterSplashDropletParams", - "80330d54" : "sWaterDropletFishParams", - "80330d78" : "gShallowWaterWaveDropletParams", - "80330d9c" : "sStrongWindParticleHitbox", - "80330dac" : "sSLWalkingPenguinErraticSteps", - "80330e20" : "D_8032FEC0", - "80330e24" : "unused_8032FEC4", - "80330e34" : "gMarioPlatform", - "80330e40" : "sDebugEffectStringInfo", - "80330e64" : "sDebugEnemyStringInfo", - "80330e88" : "sDebugInfoDPadMask", - "80330e8c" : "sDebugInfoDPadUpdID", - "80330e90" : "sDebugLvSelectCheckFlag", - "80330e94" : "sDebugPage", - "80330e98" : "sNoExtraDebug", - "80330e9c" : "sDebugStringArrPrinted", - "80330ea0" : "sDebugSysCursor", - "80330ea4" : "sDebugInfoButtonSeqID", - "80330ea8" : "sDebugInfoButtonSeq", - "80330ec0" : "sTransitionColorFadeCount", - "80330ec4" : "sTransitionTextureFadeCount", - "80330ec8" : "sTextureTransitionID", - "80330ee0" : "rectangles", - "80330f00" : "sSkyboxTextures", - "80330f28" : "sSkyboxColors", - "80330f30" : "gMovtexCounter", - "80330f34" : "gMovtexCounterPrev", - "80330f38" : "gMovtexVtxColor", - "80330f3c" : "gPaintingMarioYEntry", - "80330f40" : "gWdwWaterLevelSet", - "80330f44" : "gMovtexIdToTexture", - "80330f64" : "gMovtexNonColored", - "803311a4" : "gMovtexColored", - "8033127c" : "gMovtexColored2", - "80331300" : "sHmcPaintings", - "80331308" : "sInsideCastlePaintings", - "80331344" : "sTtmPaintings", - "8033134c" : "sPaintingGroups", - "80331358" : "gPaintingUpdateCounter", - "8033135c" : "gLastPaintingUpdateCounter", - "80331360" : "sTextLabelsCount", - "80331370" : "gDialogCharWidths", - "80331470" : "gDialogBoxState", - "80331474" : "gDialogBoxOpenTimer", - "80331478" : "gDialogBoxScale", - "8033147c" : "gDialogScrollOffsetY", - "80331480" : "gDialogBoxType", - "80331484" : "gDialogID", - "80331488" : "gLastDialogPageStrPos", - "8033148c" : "gDialogTextPos", - "80331490" : "gDialogLineNum", - "80331494" : "gLastDialogResponse", - "80331498" : "gMenuHoldKeyIndex", - "8033149c" : "gMenuHoldKeyTimer", - "803314a0" : "gDialogResponse", - "803314b0" : "gHudSymCoin", - "803314b4" : "gHudSymX", - "803314f8" : "gMenuMode", - "803314fc" : "gEndCutsceneStrEn0", - "80331504" : "gEndCutsceneStrEn1", - "80331538" : "gEndCutsceneStrEn2", - "80331558" : "gEndCutsceneStrEn3", - "8033156c" : "gEndCutsceneStrEn4", - "80331598" : "gEndCutsceneStrEn5", - "803315ac" : "gEndCutsceneStrEn6", - "803315cc" : "gEndCutsceneStrEn7", - "803315dc" : "gEndCutsceneStrEn8", - "803315e4" : "gEndCutsceneStringsEn", - "8033160c" : "gCutsceneMsgFade", - "80331610" : "gCutsceneMsgIndex", - "80331614" : "gCutsceneMsgDuration", - "80331618" : "gCutsceneMsgTimer", - "8033161c" : "gDialogCameraAngleIndex", - "80331620" : "gDialogCourseActNum", - "803316c8" : "gCourseCompleteCoinsEqual", - "803316cc" : "gCourseDoneMenuTimer", - "803316d0" : "gCourseCompleteCoins", - "803316d4" : "gHudFlash", - "80331750" : "gEnvFxMode", - "80331754" : "D_80330644", - "80331758" : "gSnowTempVtx", - "80331788" : "gSnowFlakeVertex1", - "80331790" : "gSnowFlakeVertex2", - "80331798" : "gSnowFlakeVertex3", - "803317a0" : "D_80330690", - "803317a4" : "D_80330694", - "803317a8" : "gBubbleTempVtx", - "803317e0" : "MacroObjectPresets", - "803325fc" : "sPowerMeterVisibleTimer", - "80332614" : "sPrevCheckMarioRoom", - "80332618" : "sYoshiDead", - "8033261c" : "sDebugSequenceTracker", - "80332620" : "sDebugTimer", - "803327a8" : "sBreakableBoxSmallHitbox", - "80332b00" : "sMrBlizzardHitbox", - "80332b24" : "sMrBlizzardSnowballHitbox", - "80332b54" : "D_80331A44", - "80332b5c" : "D_80331A4C", - "80332b64" : "D_80331A54", - "80332bdc" : "D_80331ACC", - "80332bf0" : "sRecoveryHeartHitbox", - "80332c00" : "sUnagiHitbox", - "80332c10" : "sHauntedChairHitbox", - "80332c30" : "sFlyingBookendHitbox", - "80332c40" : "D_80331B30", - "80332c4c" : "sBookSwitchHitbox", - "80332c5c" : "sFirePiranhaPlantHitbox", - "80332c6c" : "D_80331B5C", - "80332c74" : "sPiranhaPlantFireHitbox", - "80332c84" : "sSnufitHitbox", - "80332c94" : "sSnufitBulletHitbox", - "80332ca4" : "sEyerokHitbox", - "80332cb4" : "D_80331BA4", - "80332d10" : "coffinRelativePos", - "80332d28" : "sClamShellHitbox", - "80332d38" : "sSkeeterHitbox", - "80332d48" : "D_80331C38", - "80332e50" : "gAudioErrorFlags", - "80332e54" : "sGameLoopTicked", - "80332e58" : "sDialogSpeaker", - "80332f04" : "sDialogSpeakerVoice", - "80332f40" : "sNumProcessedSoundRequests", - "80332f44" : "sSoundRequestCount", - "80332f48" : "sDynBbh", - "80332f54" : "sDynDdd", - "80332f6c" : "sDynJrb", - "80332f88" : "sDynWdw", - "80332f98" : "sDynHmc", - "80332fa8" : "sDynUnk38", - "80332fb8" : "sDynNone", - "80332fbc" : "sCurrentMusicDynamic", - "80332fc0" : "sBackgroundMusicForDynamics", - "80332fc4" : "sLevelDynamics", - "80333060" : "sMusicDynamics", - "803330c0" : "sLevelAreaReverbs", - "80333138" : "sLevelAcousticReaches", - "80333188" : "sBackgroundMusicDefaultVolume", - "803331ac" : "sCurrentBackgroundMusicSeqId", - "803331b0" : "sMusicDynamicDelay", - "803331b4" : "sSoundBankUsedListBack", - "803331c0" : "sSoundBankFreeListFront", - "803331cc" : "sNumSoundsInBank", - "803331d8" : "sMaxChannelsForSoundBank", - "803331e4" : "sNumSoundsPerBank", - "803331f0" : "gGlobalSoundSource", - "803331fc" : "sUnusedSoundArgs", - "80333208" : "sSoundBankDisabled", - "80333218" : "D_80332108", - "8033321c" : "sHasStartedFadeOut", - "80333220" : "sSoundBanksThatLowerBackgroundMusic", - "80333224" : "sUnused80332114", - "80333228" : "sUnused80332118", - "8033322c" : "sBackgroundMusicMaxTargetVolume", - "80333230" : "D_80332120", - "80333234" : "D_80332124", - "80333238" : "sBackgroundMusicQueueSize", - "8033323c" : "sUnused8033323C", - "803332a0" : "gAudioSessionPresets", - "80333498" : "gAudioCosineTable", - "80333598" : "gPitchBendFrequencyScale", - "80333994" : "gNoteFrequencies", - "80333b94" : "gDefaultShortNoteVelocityTable", - "80333ba4" : "gDefaultShortNoteDurationTable", - "80333bb4" : "gVibratoCurve", - "80333bc4" : "gDefaultEnvelope", - "80333bd0" : "sSineWave", - "80333c50" : "sSquareWave", - "80333cd0" : "sTriangleWave", - "80333d50" : "sSawtoothWave", - "80333dd0" : "gWaveSamples", - "80333de0" : "gHeadsetPanQuantization", - "80333df4" : "gHeadsetPanVolume", - "80333ff4" : "gStereoPanVolume", - "803341f4" : "gDefaultPanVolume", - "803343f4" : "gVolRampingLhs136", - "803345f4" : "gVolRampingRhs136", - "803347f4" : "gVolRampingLhs144", - "803349f4" : "gVolRampingRhs144", - "80334bf4" : "gVolRampingLhs128", - "80334df4" : "gVolRampingRhs128", - "80334ff4" : "gTatumsPerBeat", - "80334ff8" : "gUnusedCount80333EE8", - "80334ffc" : "gAudioHeapSize", - "80335000" : "gAudioInitPoolSize", - "80335004" : "gAudioLoadLock", - "80335008" : "sUnused8033EF8", - "80335010" : "osViModeTable", - "803358d0" : "viMgrMainArgs", - "803358f0" : "__osPiDevMgr", - "80335910" : "osClockRate", - "80335918" : "D_80334808", - "80335920" : "_osContInitialized", - "80335930" : "D_80334820", - "80335940" : "D_80334830", - "80335950" : "_spaces", - "80335974" : "_zeroes", - "803359a0" : "D_80334890", - "803359a4" : "D_80334894", - "803359a8" : "D_80334898", - "803359ac" : "D_8033489C", - "803359b0" : "D_803348A0", - "803359b4" : "D_803348A4", - "803359c0" : "sViContexts", - "80335a20" : "__osViCurr", - "80335a24" : "__osViNext", - "80335a28" : "sTvType", - "80335a2c" : "osViClock", - "80335a30" : "D_80334920", - "80335a44" : "D_80334934", - "80335a48" : "D_80334938", - "80335a50" : "gOsPiAccessQueueCreated", - "80335a60" : "gOsSiAccessQueueCreated", - "80335aa0" : "D_80334990", - "80335af0" : "D_803349E0", - "80335b40" : "D_80334A30", - "80335b44" : "D_80334A34", - "80335b48" : "D_80334A38", - "80335b50" : "D_80334A40", - "80335b54" : "D_80334A44", - "80339880" : "length_str", - "80339884" : "flags_str", - "8033988c" : "flags_arr", - "80339980" : "D_80338610", - "803399a0" : "jtbl_80338630", - "803399d0" : "NAN", - "803399e0" : "D_80338670", - "80339a40" : "D_803386D0", - "80339ac0" : "rspF3DDataStart", - "8033a2c0" : "rspF3DDataEnd", - "8033a2c0" : "rspAspMainDataStart", - "8033a580" : "rspAspMainDataEnd", - "8033a580" : "_mainSegmentEnd", - "008c0c40" : "_mainSegmentRomEnd", - "8033a580" : "_mainSegmentNoloadStart", - "8033a580" : "D_80339210", - "8033a730" : "gIdleThread", - "8033a8e0" : "gMainThread", - "8033aa90" : "gGameLoopThread", - "8033ac40" : "gSoundThread", - "8033adf0" : "gPIMesgQueue", - "8033ae08" : "gIntrMesgQueue", - "8033ae20" : "gSPTaskMesgQueue", - "8033ae38" : "gDmaMesgBuf", - "8033ae40" : "gPIMesgBuf", - "8033aec0" : "gSIEventMesgBuf", - "8033aec8" : "gIntrMesgBuf", - "8033af08" : "gUnknownMesgBuf", - "8033af48" : "gDmaIoMesg", - "8033af5c" : "D_80339BEC", - "8033af60" : "gDmaMesgQueue", - "8033af78" : "gSIEventMesgQueue", - "8033af90" : "gControllers", - "8033afe8" : "gControllerStatuses", - "8033aff8" : "gControllerPads", - "8033b010" : "gGameVblankQueue", - "8033b028" : "D_80339CB8", - "8033b040" : "D_80339CD0", - "8033b044" : "D_80339CD4", - "8033b048" : "gGameVblankHandler", - "8033b050" : "gPhysicalFrameBuffers", - "8033b05c" : "gPhysicalZBuffer", - "8033b060" : "D_80339CF0", - "8033b064" : "D_80339CF4", - "8033b068" : "gGfxSPTask", - "8033b06c" : "gDisplayListHead", - "8033b070" : "gGfxPoolEnd", - "8033b074" : "gGfxPool", - "8033b078" : "gControllerBits", - "8033b079" : "gEepromProbe", - "8033b080" : "D_80339D10", - "8033b090" : "gDemo", - "8033b0a0" : "filler80339D30", - "8033b170" : "gMarioStates", - "8033b238" : "sCurrPlayMode", - "8033b23a" : "D_80339ECA", - "8033b23c" : "sTransitionTimer", - "8033b240" : "sTransitionUpdate", - "8033b244" : "unused3", - "8033b248" : "sWarpDest", - "8033b250" : "D_80339EE0", - "8033b252" : "sDelayedWarpOp", - "8033b254" : "sDelayedWarpTimer", - "8033b256" : "sSourceWarpNodeId", - "8033b258" : "sDelayedWarpArg", - "8033b25c" : "unused4", - "8033b25e" : "sTimerRunning", - "8033b260" : "gHudDisplay", - "8033b26e" : "gNeverEnteredCastle", - "8033b270" : "sDelayInvincTimer", - "8033b272" : "sInvulnerable", - "8033b280" : "unused80339F10", - "8033b288" : "filler80339F1C", - "8033b2c0" : "sFloorAlignMatrix", - "8033b350" : "gMirrorMario", - "8033b3b0" : "gBodyStates", - "8033b400" : "sSegmentTable", - "8033b480" : "sPoolFreeSpace", - "8033b484" : "sPoolStart", - "8033b488" : "sPoolEnd", - "8033b48c" : "sPoolListHeadL", - "8033b490" : "sPoolListHeadR", - "8033b494" : "gEffectsMemoryPool", - "8033b4a0" : "gWarpCheckpoint", - "8033b4a5" : "gMainMenuDataModified", - "8033b4a6" : "gSaveFileModified", - "8033b4b0" : "gPlayerSpawnInfos", - "8033b4d0" : "D_8033A160", - "8033b8d0" : "gAreaData", - "8033bab0" : "gWarpTransition", - "8033bac6" : "gCurrCourseNum", - "8033bac8" : "gCurrActNum", - "8033baca" : "gCurrAreaIndex", - "8033bacc" : "gSavedCourseNum", - "8033bace" : "gPauseScreenMode", - "8033bad0" : "gSaveOptSelectIndex", - "8033bae0" : "gMatStackIndex", - "8033bae8" : "gMatStack", - "8033c2e8" : "gMatStackFixed", - "8033c368" : "gGeoTempState", - "8033c378" : "gCurAnimType", - "8033c379" : "gCurAnimEnabled", - "8033c37a" : "gCurrAnimFrame", - "8033c37c" : "gCurAnimTranslationMultiplier", - "8033c380" : "gCurrAnimAttribute", - "8033c384" : "gCurAnimData", - "8033c388" : "gDisplayListHeap", - "8033c390" : "gProfilerFrameData", - "8033c520" : "gPlayerCameraState", - "8033c568" : "sOldPosition", - "8033c578" : "sOldFocus", - "8033c588" : "sPlayer2FocusOffset", - "8033c594" : "sCreditsPlayer2Pitch", - "8033c596" : "sCreditsPlayer2Yaw", - "8033c598" : "sFramesPaused", - "8033c5a0" : "sFOVState", - "8033c5c0" : "sModeTransition", - "8033c5e8" : "sMarioGeometry", - "8033c61c" : "unusedFreeRoamWallYaw", - "8033c61e" : "sAvoidYawVel", - "8033c620" : "sCameraYawAfterDoorCutscene", - "8033c622" : "unusedSplinePitch", - "8033c624" : "unusedSplineYaw", - "8033c628" : "sHandheldShakeSpline", - "8033c668" : "sHandheldShakeMag", - "8033c66c" : "sHandheldShakeTimer", - "8033c670" : "sHandheldShakeInc", - "8033c674" : "sHandheldShakePitch", - "8033c676" : "sHandheldShakeYaw", - "8033c678" : "sHandheldShakeRoll", - "8033c67c" : "unused8033B30C", - "8033c680" : "unused8033B310", - "8033c684" : "sSelectionFlags", - "8033c686" : "unused8033B316", - "8033c688" : "s2ndRotateFlags", - "8033c68a" : "unused8033B31A", - "8033c68c" : "sCameraSoundFlags", - "8033c68e" : "sCButtonsPressed", - "8033c690" : "sCutsceneDialogID", - "8033c698" : "gLakituState", - "8033c758" : "unused8033B3E8", - "8033c75a" : "sAreaYaw", - "8033c75c" : "sAreaYawChange", - "8033c75e" : "sLakituDist", - "8033c760" : "sLakituPitch", - "8033c764" : "sZoomAmount", - "8033c768" : "sCSideButtonYaw", - "8033c76a" : "sBehindMarioSoundTimer", - "8033c76c" : "sZeroZoomDist", - "8033c770" : "sCUpCameraPitch", - "8033c772" : "sModeOffsetYaw", - "8033c774" : "sSpiralStairsYawOffset", - "8033c776" : "s8DirModeBaseYaw", - "8033c778" : "s8DirModeYawOffset", - "8033c77c" : "sPanDistance", - "8033c780" : "sCannonYOffset", - "8033c788" : "sModeInfo", - "8033c7d0" : "sCastleEntranceOffset", - "8033c7dc" : "sParTrackIndex", - "8033c7e0" : "sParTrackPath", - "8033c7e8" : "sParTrackTransOff", - "8033c808" : "sCameraStoreCUp", - "8033c828" : "sCameraStoreCutscene", - "8033c848" : "gCameraMovementFlags", - "8033c84a" : "sStatusFlags", - "8033c850" : "sCurCreditsSplinePos", - "8033c950" : "sCurCreditsSplineFocus", - "8033ca50" : "sCutsceneSplineSegment", - "8033ca54" : "sCutsceneSplineSegmentProgress", - "8033ca58" : "unused8033B6E8", - "8033ca5a" : "sCutsceneShot", - "8033ca5c" : "gCutsceneTimer", - "8033ca60" : "sCutsceneVars", - "8033cbc8" : "gObjCutsceneDone", - "8033cbcc" : "gCutsceneObjSpawn", - "8033cbd0" : "gCamera", - "8033cbe0" : "gObjectListArray", - "8033d260" : "gDebugInfoFlags", - "8033d264" : "gNumFindFloorMisses", - "8033d268" : "unused_8033BEF8", - "8033d26c" : "gUnknownWallCount", - "8033d270" : "gObjectCounter", - "8033d274" : "gNumCalls", - "8033d280" : "gDebugInfo", - "8033d380" : "gDebugInfoOverwrite", - "8033d480" : "gTimeStopState", - "8033d488" : "gObjectPool", - "80360e88" : "gMacroObjectDefaultParent", - "803610e8" : "gObjectLists", - "803610f0" : "gFreeObjectList", - "80361158" : "gMarioObject", - "8036115c" : "gLuigiObject", - "80361160" : "gCurrentObject", - "80361164" : "gCurBhvCommand", - "80361168" : "gPrevFrameObjectCount", - "8036116c" : "gSurfaceNodesAllocated", - "80361170" : "gSurfacesAllocated", - "80361174" : "gNumStaticSurfaceNodes", - "80361178" : "gNumStaticSurfaces", - "8036117c" : "gObjectMemoryPool", - "80361180" : "gCheckingSurfaceCollisionsForCamera", - "80361182" : "gFindFloorIncludeSurfaceIntangible", - "80361184" : "gEnvironmentRegions", - "80361188" : "gEnvironmentLevels", - "803611d8" : "gDoorAdjacentRooms", - "80361250" : "gMarioCurrentRoom", - "80361252" : "D_8035FEE2", - "80361254" : "D_8035FEE4", - "80361256" : "gTHIWaterDrained", - "80361258" : "gTTCSpeedSetting", - "8036125a" : "gMarioShotFromCannon", - "8036125c" : "gCCMEnteredSlide", - "8036125e" : "gNumRoomedObjectsInMarioRoom", - "80361260" : "gNumRoomedObjectsNotInMarioRoom", - "80361262" : "gWDWWaterLevelChanging", - "80361264" : "gMarioOnMerryGoRound", - "80361290" : "gDebugPrintState1", - "803612a0" : "gDebugPrintState2", - "803612b0" : "sMarioOnFlyingCarpet", - "803612b2" : "sSurfaceTypeBelowShadow", - "803612b4" : "gShadowAboveWaterOrLava", - "803612b5" : "gMarioOnIceOrCarpet", - "803612c0" : "sSkyBoxInfo", - "803612e0" : "gMovetexLastTextureId", - "803612f0" : "gFlyingCarpetState", - "80361300" : "gPaintingMarioFloorType", - "80361304" : "gPaintingMarioXPos", - "80361308" : "gPaintingMarioYPos", - "8036130c" : "gPaintingMarioZPos", - "80361310" : "gPaintingMesh", - "80361314" : "gPaintingTriNorms", - "80361318" : "gRipplingPainting", - "8036131c" : "gDddPaintingStatus", - "80361320" : "sTextLabels", - "803613f0" : "gDialogColorFadeTimer", - "803613f2" : "gLastDialogLineNum", - "803613f4" : "gDialogVariable", - "803613f8" : "gDialogTextAlpha", - "803613fa" : "gCutsceneMsgXOffset", - "803613fc" : "gCutsceneMsgYOffset", - "803613fe" : "gRedCoinsCollected", - "80361400" : "gEnvFxBuffer", - "80361408" : "gSnowCylinderLastPos", - "80361414" : "gSnowParticleCount", - "80361416" : "gSnowParticleMaxCount", - "80361420" : "gEnvFxBubbleConfig", - "80361460" : "sNumActiveFirePiranhaPlants", - "80361464" : "sNumKilledFirePiranhaPlants", - "80361468" : "sObjSavedPosX", - "8036146c" : "sObjSavedPosY", - "80361470" : "sObjSavedPosZ", - "80361474" : "sMontyMoleHoleList", - "80361478" : "sMontyMoleKillStreak", - "8036147c" : "sMontyMoleLastKilledPosX", - "80361480" : "sMontyMoleLastKilledPosY", - "80361484" : "sMontyMoleLastKilledPosZ", - "80361488" : "sMasterTreadmill", - "80361490" : "gCurrAiBuffer", - "80361498" : "sSoundRequests", - "80361c98" : "D_80360928", - "80361f98" : "sUsedChannelsForSoundBank", - "80361fa8" : "sCurrentSound", - "80361fb8" : "sSoundBanks", - "80364b78" : "sSoundMovingSpeed", - "80364b82" : "sBackgroundMusicTargetVolume", - "80364b88" : "sBackgroundMusicQueue", - "80364ba0" : "__osEventStateTab", - "80364c20" : "D_803638B0", - "80365e70" : "piMgrThread", - "80366020" : "piMgrStack", - "80367020" : "__osPiMesgQueue", - "80367038" : "piMgrMesgBuff", - "80367040" : "D_80365CD0", - "80367050" : "_osContCmdBuf", - "8036708c" : "_osContPifCtrl", - "80367090" : "_osLastSentSiCmd", - "80367091" : "_osContNumControllers", - "80367098" : "D_80365D28", - "803670b8" : "_osContMesgQueue", - "803670d0" : "_osContMesgBuff", - "803670f0" : "D_80365D80", - "80367110" : "_osCurrentTime", - "80367118" : "D_80365DA8", - "8036711c" : "__osViIntrCount", - "80367120" : "D_80365DB0", - "80367130" : "osPiMesgBuff", - "80367138" : "gOsPiMessageQueue", - "80367150" : "osSiMesgBuff", - "80367158" : "gOsSiMessageQueue", - "80367170" : "D_80365E00", - "803671ac" : "D_80365E3C", - "803671b0" : "D_80365E40", - "803672b0" : "gInterruptedThread", - "80367460" : ".", - "80367460" : "_mainSegmentNoloadEnd", - "0000cee0" : "_mainSegmentNoloadSizeLo", - "00000002" : "_mainSegmentNoloadSizeHi", - "00000001" : "ASSERT", - "80378800" : "_engineSegmentStart", - "007cc6c0" : "_engineSegmentRomStart", - "80378800" : "vec3f_copy", - "80378840" : "vec3f_set", - "8037888c" : "vec3f_add", - "803788e4" : "vec3f_sum", - "8037893c" : "vec3s_copy", - "8037897c" : "vec3s_set", - "803789c8" : "vec3s_add", - "80378a20" : "vec3s_sum", - "80378a78" : "vec3s_sub", - "80378ad0" : "vec3s_to_vec3f", - "80378b34" : "vec3f_to_vec3s", - "80378c50" : "find_vector_perpendicular_to_plane", - "80378d38" : "vec3f_cross", - "80378dc0" : "vec3f_normalize", - "80378e68" : "mtxf_copy", - "80378eb4" : "mtxf_identity", - "80378f24" : "mtxf_translate", - "80378f84" : "mtxf_lookat", - "80379440" : "mtxf_rotate_zxy_and_translate", - "803795f0" : "mtxf_rotate_xyz_and_translate", - "80379798" : "mtxf_billboard", - "80379918" : "mtxf_align_terrain_normal", - "80379aa4" : "mtxf_align_terrain_triangle", - "80379f60" : "mtxf_mul", - "8037a29c" : "mtxf_scale_vec3f", - "8037a348" : "mtxf_mul_vec3s", - "8037a434" : "mtxf_to_mtx", - "8037a4b8" : "mtxf_rotate_xy", - "8037a550" : "get_pos_from_transform_mtx", - "8037a69c" : "vec3f_get_dist_and_angle", - "8037a788" : "vec3f_set_dist_and_angle", - "8037a860" : "approach_s32", - "8037a8b4" : "approach_f32", - "8037a9a8" : "atan2s", - "8037ab88" : "atan2f", - "8037abec" : "spline_get_weights", - "8037afb8" : "anim_spline_init", - "8037afe8" : "anim_spline_poll", - "8037b220" : "init_scene_graph_node_links", - "8037b24c" : "init_graph_node_root", - "8037b30c" : "init_graph_node_ortho_projection", - "8037b380" : "init_graph_node_perspective", - "8037b448" : "init_graph_node_start", - "8037b4ac" : "init_graph_node_master_list", - "8037b530" : "init_graph_node_render_range", - "8037b5b4" : "init_graph_node_switch_case", - "8037b670" : "init_graph_node_camera", - "8037b744" : "init_graph_node_translation_rotation", - "8037b7f8" : "init_graph_node_translation", - "8037b89c" : "init_graph_node_rotation", - "8037b940" : "init_graph_node_scale", - "8037b9e0" : "init_graph_node_object", - "8037bad4" : "init_graph_node_culling_radius", - "8037bb48" : "init_graph_node_animated_part", - "8037bbec" : "init_graph_node_billboard", - "8037bc90" : "init_graph_node_display_list", - "8037bd24" : "init_graph_node_shadow", - "8037bdb4" : "init_graph_node_object_parent", - "8037be28" : "init_graph_node_generated", - "8037becc" : "init_graph_node_background", - "8037bf84" : "init_graph_node_held_object", - "8037c044" : "geo_add_child", - "8037c0bc" : "geo_remove_child", - "8037c138" : "geo_make_first_child", - "8037c1e4" : "geo_call_global_function_nodes_helper", - "8037c360" : "geo_call_global_function_nodes", - "8037c3d0" : "geo_reset_object_node", - "8037c448" : "geo_obj_init", - "8037c51c" : "geo_obj_init_spawninfo", - "8037c658" : "geo_obj_init_animation", - "8037c708" : "geo_obj_init_animation_accel", - "8037c7d8" : "retrieve_animation_index", - "8037c844" : "geo_update_animation_frame", - "8037c9e8" : "geo_retreive_animation_translation", - "8037cb10" : "geo_find_root", - "8037cb60" : "read_vec3s_to_vec3f", - "8037cbc0" : "read_vec3s", - "8037cbfc" : "read_vec3s_angle", - "8037cc74" : "register_scene_graph_node", - "8037cd60" : "geo_layout_cmd_branch_and_link", - "8037ce24" : "geo_layout_cmd_end", - "8037cee8" : "geo_layout_cmd_branch", - "8037cf70" : "geo_layout_cmd_return", - "8037cfc0" : "geo_layout_cmd_open_node", - "8037d018" : "geo_layout_cmd_close_node", - "8037d050" : "geo_layout_cmd_assign_as_view", - "8037d0d0" : "geo_layout_cmd_update_node_flags", - "8037d1d0" : "geo_layout_cmd_node_root", - "8037d328" : "geo_layout_cmd_node_ortho_projection", - "8037d3a4" : "geo_layout_cmd_node_perspective", - "8037d48c" : "geo_layout_cmd_node_start", - "8037d4dc" : "geo_layout_cmd_nop3", - "8037d500" : "geo_layout_cmd_node_master_list", - "8037d55c" : "geo_layout_cmd_node_level_of_detail", - "8037d5d4" : "geo_layout_cmd_node_switch_case", - "8037d640" : "geo_layout_cmd_node_camera", - "8037d6f0" : "geo_layout_cmd_node_translation_rotation", - "8037d8d4" : "geo_layout_cmd_node_translation", - "8037d998" : "geo_layout_cmd_node_rotation", - "8037da5c" : "geo_layout_cmd_node_scale", - "8037db50" : "geo_layout_cmd_nop2", - "8037db74" : "geo_layout_cmd_node_animated_part", - "8037dc10" : "geo_layout_cmd_node_billboard", - "8037dcd4" : "geo_layout_cmd_node_display_list", - "8037dd4c" : "geo_layout_cmd_node_shadow", - "8037dddc" : "geo_layout_cmd_node_object_parent", - "8037de34" : "geo_layout_cmd_node_generated", - "8037de94" : "geo_layout_cmd_node_background", - "8037def8" : "geo_layout_cmd_nop", - "8037df1c" : "geo_layout_cmd_copy_view", - "8037dfd4" : "geo_layout_cmd_node_held_obj", - "8037e058" : "geo_layout_cmd_node_culling_radius", - "8037e0b4" : "process_geo_layout", - "803805c8" : "level_script_execute", - "80380de8" : "f32_find_wall_collision", - "80380e8c" : "find_wall_collisions", - "80381264" : "find_ceil", - "80381470" : "unused_obj_find_floor_height", - "803814b8" : "find_floor_height_and_data", - "80381794" : "find_floor_height", - "803817e0" : "unused_find_dynamic_floor", - "80381900" : "find_floor", - "80381ba0" : "find_water_level", - "80381d3c" : "find_poison_gas_level", - "80381f08" : "debug_surface_list_info", - "80382294" : "unused_resolve_floor_or_ceil_collisions", - "80383340" : "alloc_surface_pools", - "803833b8" : "load_area_terrain", - "803835a4" : "clear_dynamic_surfaces", - "80383614" : "transform_object_vertices", - "80383828" : "load_object_surfaces", - "803839cc" : "load_object_collision_model", - "80383bb0" : "random_u16", - "80383cb4" : "random_float", - "80383d1c" : "random_sign", - "80383d68" : "obj_update_gfx_pos_and_angle", - "80385bf0" : "stub_behavior_script_2", - "80385c00" : "cur_obj_update", - "80385f90" : "identityMtx", - "80385fb0" : "zeroMtx", - "80385fd0" : "gVec3fZero", - "80385fdc" : "gVec3sZero", - "80385fe4" : "gVec3fOne", - "80385ff0" : "gVec3sOne", - "80386000" : "gSineTable", - "80387000" : "gCosineTable", - "8038b000" : "gArctanTable", - "8038b810" : "GeoLayoutJumpTable", - "8038b894" : "unused_8038B894", - "8038bc90" : "_engineSegmentEnd", - "007dfb50" : "_engineSegmentRomEnd", - "8038bc90" : "_engineSegmentNoloadStart", - "8038bc90" : "gSplineKeyframe", - "8038bc94" : "gSplineKeyframeFraction", - "8038bc98" : "gSplineState", - "8038bca0" : "gGraphNodePool", - "8038bca4" : "gCurRootGraphNode", - "8038bca8" : "D_8038BCA8", - "8038bcac" : "gGeoViews", - "8038bcb0" : "gGeoNumViews", - "8038bcb8" : "gGeoLayoutStack", - "8038bcf8" : "gCurGraphNodeList", - "8038bd78" : "gCurGraphNodeIndex", - "8038bd7a" : "gGeoLayoutStackIndex", - "8038bd7c" : "D_8038BD7C", - "8038bd7e" : "gGeoLayoutReturnIndex", - "8038bd80" : "gGeoLayoutCommand", - "8038bd88" : "gObjParentGraphNode", - "8038be30" : "sFloorGeo", - "8038be90" : "unused8038BE90", - "8038be98" : "gStaticSurfacePartition", - "8038d698" : "gDynamicSurfacePartition", - "8038ee98" : "sSurfaceNodePool", - "8038ee9c" : "sSurfacePool", - "8038eea0" : "sSurfacePoolSize", - "8038eea8" : "unused8038EEA8", - "8038eef0" : "_engineSegmentNoloadEnd", - "00000001" : "ASSERT", - "8038f800" : ".", - "8038f800" : "_framebuffersSegmentNoloadStart", - "8038f800" : "0x70800", - "8038f800" : "gFrameBuffer0", - "803b5000" : "gFrameBuffer1", - "803da800" : "gFrameBuffer2", - "80400000" : "_framebuffersSegmentNoloadEnd", - "80400000" : "__expansionRamStart", - "00000001" : "ASSERT", - "10000000" : "_entrySegmentStart", - "007cc6c0" : "_entrySegmentRomStart", - "10000000" : "level_script_entry", - "10000030" : "_entrySegmentEnd", - "007cc6f0" : "_entrySegmentRomEnd", - "02000000" : "_segment2_mio0SegmentStart", - "007cc6c0" : "_segment2_mio0SegmentRomStart", - "0200bd10" : ".", - "0200bd10" : "_segment2_mio0SegmentEnd", - "007d83d0" : "_segment2_mio0SegmentRomEnd", - "04000000" : "_group0_mio0SegmentStart", - "007cc6c0" : "_group0_mio0SegmentRomStart", - "04013260" : ".", - "04013260" : "_group0_mio0SegmentEnd", - "007df920" : "_group0_mio0SegmentRomEnd", - "17000000" : "_group0_geoSegmentStart", - "007cc6c0" : "_group0_geoSegmentRomStart", - "17000000" : "bubble_geo", - "1700001c" : "purple_marble_geo", - "17000038" : "smoke_geo", - "17000084" : "burn_smoke_geo", - "1700009c" : "small_water_splash_geo", - "170000e0" : "mario_TODO_geo_0000E0", - "17000124" : "idle_water_wave_geo", - "17000168" : "wave_trail_geo", - "170001bc" : "sparkles_geo", - "17000230" : "water_splash_geo", - "17000284" : "sparkles_animation_geo", - "170002e0" : "mario_geo_face_and_wings", - "1700041c" : "mario_geo_left_hand", - "17000494" : "mario_geo_right_hand", - "1700053c" : "mario_geo_body", - "170006f8" : "mario_geo_medium_poly_left_hand", - "17000770" : "mario_geo_medium_poly_right_hand", - "17000818" : "mario_geo_medium_poly_body", - "170009d4" : "mario_geo_low_poly_face_and_wings", - "17000b10" : "mario_geo_low_poly_left_hand", - "17000b88" : "mario_geo_low_poly_right_hand", - "17000c30" : "mario_geo_low_poly_body", - "17000dec" : "mario_vanish_geo_face_and_wings", - "17000f28" : "mario_vanish_geo_left_hand", - "17000fa0" : "mario_vanish_geo_right_hand", - "17001048" : "mario_vanish_geo_body", - "17001204" : "mario_vanish_geo_medium_poly_left_hand", - "1700127c" : "mario_vanish_geo_medium_poly_right_hand", - "17001324" : "mario_vanish_geo_medium_poly_body", - "170014e0" : "mario_vanish_geo_low_poly_face_and_wings", - "1700161c" : "mario_vanish_geo_low_poly_left_hand", - "17001694" : "mario_vanish_geo_low_poly_right_hand", - "1700173c" : "mario_vanish_geo_low_poly_body", - "170018f8" : "mario_metal_geo_face_and_wings", - "170019a4" : "mario_metal_geo_left_hand", - "17001a1c" : "mario_metal_geo_right_hand", - "17001ac4" : "mario_metal_geo_body", - "17001c80" : "mario_metal_geo_medium_poly_left_hand", - "17001cf8" : "mario_metal_geo_medium_poly_right_hand", - "17001da0" : "mario_metal_geo_medium_poly_body", - "17001f5c" : "mario_metal_geo_low_poly_face_and_wings", - "17002008" : "mario_metal_geo_low_poly_left_hand", - "17002080" : "mario_metal_geo_low_poly_right_hand", - "17002128" : "mario_metal_geo_low_poly_body", - "170022e4" : "mario_metal_vanish_geo_face_and_wings", - "17002390" : "mario_metal_vanish_geo_left_hand", - "17002408" : "mario_metal_vanish_geo_right_hand", - "170024b0" : "mario_metal_vanish_geo_body", - "1700266c" : "mario_metal_vanish_geo_medium_poly_left_hand", - "170026e4" : "mario_metal_vanish_geo_medium_poly_right_hand", - "1700278c" : "mario_metal_vanish_geo_medium_poly_body", - "17002958" : "mario_metal_vanish_geo_low_poly_face_and_wings", - "17002a04" : "mario_metal_vanish_geo_low_poly_left_hand", - "17002a7c" : "mario_metal_vanish_geo_low_poly_right_hand", - "17002b24" : "mario_metal_vanish_geo_low_poly_body", - "17002ce0" : "mario_geo_load_body", - "17002d14" : "mario_geo_load_medium_poly_body", - "17002d48" : "mario_geo_load_low_poly_body", - "17002d7c" : "mario_geo_render_body", - "17002dd4" : "mario_geo", - "17002e30" : "_group0_geoSegmentEnd", - "007cf4f0" : "_group0_geoSegmentRomEnd", - "05000000" : "_group1_mio0SegmentStart", - "007cc6c0" : "_group1_mio0SegmentRomStart", - "05008070" : ".", - "05008070" : "_group1_mio0SegmentEnd", - "007d4730" : "_group1_mio0SegmentRomEnd", - "0c000000" : "_group1_geoSegmentStart", - "007cc6c0" : "_group1_geoSegmentRomStart", - "0c000000" : "yellow_sphere_geo", - "0c000018" : "hoot_geo", - "0c0001e4" : "yoshi_egg_geo", - "0c000248" : "thwomp_geo", - "0c000264" : "bullet_bill_geo", - "0c00028c" : "heave_ho_geo", - "0c000410" : "_group1_geoSegmentEnd", - "007ccad0" : "_group1_geoSegmentRomEnd", - "05000000" : "_group2_mio0SegmentStart", - "007cc6c0" : "_group2_mio0SegmentRomStart", - "05001e10" : ".", - "05001e10" : "_group2_mio0SegmentEnd", - "007ce4d0" : "_group2_mio0SegmentRomEnd", - "0c000000" : "_group2_geoSegmentStart", - "007cc6c0" : "_group2_geoSegmentRomStart", - "0c000000" : "bully_geo", - "0c000120" : "bully_boss_geo", - "0c000240" : "blargg_geo", - "0c0002b0" : "_group2_geoSegmentEnd", - "007cc970" : "_group2_geoSegmentRomEnd", - "05000000" : "_group3_mio0SegmentStart", - "007cc6c0" : "_group3_mio0SegmentRomStart", - "050068b0" : ".", - "050068b0" : "_group3_mio0SegmentEnd", - "007d2f70" : "_group3_mio0SegmentRomEnd", - "0c000000" : "_group3_geoSegmentStart", - "007cc6c0" : "_group3_geoSegmentRomStart", - "0c000000" : "king_bobomb_geo", - "0c000308" : "water_bomb_geo", - "0c000328" : "water_bomb_shadow_geo", - "0c000340" : "_group3_geoSegmentEnd", - "007cca00" : "_group3_geoSegmentRomEnd", - "05000000" : "_group4_mio0SegmentStart", - "007cc6c0" : "_group4_mio0SegmentRomStart", - "0500a300" : ".", - "0500a300" : "_group4_mio0SegmentEnd", - "007d69c0" : "_group4_mio0SegmentRomEnd", - "0c000000" : "_group4_geoSegmentStart", - "007cc6c0" : "_group4_geoSegmentRomStart", - "0c000000" : "clam_shell_geo", - "0c000068" : "sushi_geo", - "0c00010c" : "unagi_geo", - "0c000280" : "_group4_geoSegmentEnd", - "007cc940" : "_group4_geoSegmentRomEnd", - "05000000" : "_group5_mio0SegmentStart", - "007cc6c0" : "_group5_mio0SegmentRomStart", - "0500bce0" : ".", - "0500bce0" : "_group5_mio0SegmentEnd", - "007d83a0" : "_group5_mio0SegmentRomEnd", - "0c000000" : "_group5_geoSegmentStart", - "007cc6c0" : "_group5_geoSegmentRomStart", - "0c000000" : "klepto_geo", - "0c0002ac" : "eyerok_geo_0002AC", - "0c0005a8" : "eyerok_left_hand_geo", - "0c0005e4" : "eyerok_right_hand_geo", - "0c000610" : "pokey_head_geo", - "0c000644" : "pokey_body_part_geo", - "0c000660" : "_group5_geoSegmentEnd", - "007ccd20" : "_group5_geoSegmentRomEnd", - "05000000" : "_group6_mio0SegmentStart", - "007cc6c0" : "_group6_mio0SegmentRomStart", - "0500e110" : ".", - "0500e110" : "_group6_mio0SegmentEnd", - "007da7d0" : "_group6_mio0SegmentRomEnd", - "0c000000" : "_group6_geoSegmentStart", - "007cc6c0" : "_group6_geoSegmentRomStart", - "0c000000" : "monty_mole_geo", - "0c000110" : "ukiki_geo", - "0c00036c" : "fwoosh_geo", - "0c000390" : "_group6_geoSegmentEnd", - "007cca50" : "_group6_geoSegmentRomEnd", - "05000000" : "_group7_mio0SegmentStart", - "007cc6c0" : "_group7_mio0SegmentRomStart", - "05005070" : ".", - "05005070" : "_group7_mio0SegmentEnd", - "007d1730" : "_group7_mio0SegmentRomEnd", - "0c000000" : "_group7_geoSegmentStart", - "007cc6c0" : "_group7_geoSegmentRomStart", - "0c000000" : "spindrift_geo", - "0c000104" : "penguin_geo", - "0c00021c" : "mr_blizzard_hidden_geo", - "0c000348" : "mr_blizzard_geo", - "0c000370" : "_group7_geoSegmentEnd", - "007cca30" : "_group7_geoSegmentRomEnd", - "05000000" : "_group8_mio0SegmentStart", - "007cc6c0" : "_group8_mio0SegmentRomStart", - "05001180" : ".", - "05001180" : "_group8_mio0SegmentEnd", - "007cd840" : "_group8_mio0SegmentRomEnd", - "0c000000" : "_group8_geoSegmentStart", - "007cc6c0" : "_group8_geoSegmentRomStart", - "0c000000" : "springboard_top_geo", - "0c000018" : "springboard_spring_geo", - "0c000030" : "springboard_bottom_geo", - "0c000048" : "cap_switch_geo", - "0c000090" : "_group8_geoSegmentEnd", - "007cc750" : "_group8_geoSegmentRomEnd", - "05000000" : "_group9_mio0SegmentStart", - "007cc6c0" : "_group9_mio0SegmentRomStart", - "05006960" : ".", - "05006960" : "_group9_mio0SegmentEnd", - "007d3020" : "_group9_mio0SegmentRomEnd", - "0c000000" : "_group9_geoSegmentStart", - "007cc6c0" : "_group9_geoSegmentRomStart", - "0c000000" : "bookend_part_geo", - "0c0000c0" : "bookend_geo", - "0c0000d8" : "haunted_chair_geo", - "0c000188" : "small_key_geo", - "0c0001b4" : "mad_piano_geo", - "0c000224" : "boo_geo", - "0c000274" : "haunted_cage_geo", - "0c0002b0" : "_group9_geoSegmentEnd", - "007cc970" : "_group9_geoSegmentRomEnd", - "05000000" : "_group10_mio0SegmentStart", - "007cc6c0" : "_group10_mio0SegmentRomStart", - "05012cd0" : ".", - "05012cd0" : "_group10_mio0SegmentEnd", - "007df390" : "_group10_mio0SegmentRomEnd", - "0c000000" : "_group10_geoSegmentStart", - "007cc6c0" : "_group10_geoSegmentRomStart", - "0c000000" : "birds_geo", - "0c000098" : "peach_geo_000098", - "0c000254" : "peach_geo_000254", - "0c000410" : "peach_geo", - "0c000468" : "yoshi_geo", - "0c000670" : "_group10_geoSegmentEnd", - "007ccd30" : "_group10_geoSegmentRomEnd", - "05000000" : "_group11_mio0SegmentStart", - "007cc6c0" : "_group11_mio0SegmentRomStart", - "050073f0" : ".", - "050073f0" : "_group11_mio0SegmentEnd", - "007d3ab0" : "_group11_mio0SegmentRomEnd", - "0c000000" : "_group11_geoSegmentStart", - "007cc6c0" : "_group11_geoSegmentRomStart", - "0c000000" : "bubba_geo", - "0c000030" : "wiggler_head_geo", - "0c0001bc" : "enemy_lakitu_geo", - "0c000290" : "spiny_ball_geo", - "0c000328" : "spiny_geo", - "0c0004a0" : "_group11_geoSegmentEnd", - "007ccb60" : "_group11_geoSegmentRomEnd", - "06000000" : "_group12_mio0SegmentStart", - "007cc6c0" : "_group12_mio0SegmentRomStart", - "06030c30" : ".", - "06030c30" : "_group12_mio0SegmentEnd", - "007fd2f0" : "_group12_mio0SegmentRomEnd", - "0d000000" : "_group12_geoSegmentStart", - "007cc6c0" : "_group12_geoSegmentRomStart", - "0d000000" : "bowser_flames_geo", - "0d000090" : "invisible_bowser_accessory_geo", - "0d0000b0" : "bowser_1_yellow_sphere_geo", - "0d0000d8" : "bowser_geo_0000D8", - "0d000424" : "bowser_geo_000424", - "0d000770" : "bowser_geo_000770", - "0d000ab8" : "bowser_shadow_geo", - "0d000ac4" : "bowser_geo", - "0d000b40" : "bowser2_geo", - "0d000bbc" : "bowser_bomb_geo", - "0d000bfc" : "bowser_impact_smoke_geo", - "0d000c50" : "_group12_geoSegmentEnd", - "007cd310" : "_group12_geoSegmentRomEnd", - "06000000" : "_group13_mio0SegmentStart", - "007cc6c0" : "_group13_mio0SegmentRomStart", - "0600a0f0" : ".", - "0600a0f0" : "_group13_mio0SegmentEnd", - "007d67b0" : "_group13_mio0SegmentRomEnd", - "0d000000" : "_group13_geoSegmentStart", - "007cc6c0" : "_group13_geoSegmentRomStart", - "0d000000" : "skeeter_geo", - "0d000284" : "seaweed_geo", - "0d0002f4" : "water_mine_geo", - "0d000324" : "cyan_fish_geo", - "0d00038c" : "bub_geo", - "0d000414" : "water_ring_geo", - "0d000450" : "treasure_chest_base_geo", - "0d000468" : "treasure_chest_lid_geo", - "0d000480" : "_group13_geoSegmentEnd", - "007ccb40" : "_group13_geoSegmentRomEnd", - "06000000" : "_group14_mio0SegmentStart", - "007cc6c0" : "_group14_mio0SegmentRomStart", - "06013a60" : ".", - "06013a60" : "_group14_mio0SegmentEnd", - "007e0120" : "_group14_mio0SegmentRomEnd", - "0d000000" : "_group14_geoSegmentStart", - "007cc6c0" : "_group14_geoSegmentRomStart", - "0d000000" : "koopa_flag_geo", - "0d0000b8" : "wooden_post_geo", - "0d0000d0" : "koopa_without_shell_geo", - "0d000214" : "koopa_with_shell_geo", - "0d000358" : "piranha_plant_geo", - "0d000480" : "whomp_geo", - "0d0005d0" : "metallic_ball_geo", - "0d0005ec" : "chain_chomp_geo", - "0d000680" : "_group14_geoSegmentEnd", - "007ccd40" : "_group14_geoSegmentRomEnd", - "06000000" : "_group15_mio0SegmentStart", - "007cc6c0" : "_group15_mio0SegmentRomStart", - "0600c8e0" : ".", - "0600c8e0" : "_group15_mio0SegmentEnd", - "007d8fa0" : "_group15_mio0SegmentRomEnd", - "0d000000" : "_group15_geoSegmentStart", - "007cc6c0" : "_group15_geoSegmentRomStart", - "0d000000" : "lakitu_geo", - "0d000114" : "toad_geo_000114", - "0d00027c" : "toad_geo_00027C", - "0d0003e4" : "toad_geo", - "0d000448" : "mips_geo", - "0d0005b0" : "boo_castle_geo", - "0d000600" : "_group15_geoSegmentEnd", - "007cccc0" : "_group15_geoSegmentRomEnd", - "06000000" : "_group16_mio0SegmentStart", - "007cc6c0" : "_group16_mio0SegmentRomStart", - "06002ba0" : ".", - "06002ba0" : "_group16_mio0SegmentEnd", - "007cf260" : "_group16_mio0SegmentRomEnd", - "0d000000" : "_group16_geoSegmentStart", - "007cc6c0" : "_group16_geoSegmentRomStart", - "0d000000" : "moneybag_geo_000000", - "0d000078" : "moneybag_geo_000078", - "0d0000f0" : "moneybag_geo", - "0d000150" : "_group16_geoSegmentEnd", - "007cc810" : "_group16_geoSegmentRomEnd", - "06000000" : "_group17_mio0SegmentStart", - "007cc6c0" : "_group17_mio0SegmentRomStart", - "06009c50" : ".", - "06009c50" : "_group17_mio0SegmentEnd", - "007d6310" : "_group17_mio0SegmentRomEnd", - "0d000000" : "_group17_geoSegmentStart", - "007cc6c0" : "_group17_geoSegmentRomStart", - "0d000000" : "mr_i_geo", - "0d00001c" : "mr_i_iris_geo", - "0d0000dc" : "swoop_geo", - "0d0001a0" : "snufit_geo", - "0d000230" : "dorrie_geo", - "0d000394" : "scuttlebug_geo", - "0d0006d0" : "_group17_geoSegmentEnd", - "007ccd90" : "_group17_geoSegmentRomEnd", - "08000000" : "_common0_mio0SegmentStart", - "007cc6c0" : "_common0_mio0SegmentRomStart", - "0800e6d0" : ".", - "0800e6d0" : "_common0_mio0SegmentEnd", - "007dad90" : "_common0_mio0SegmentRomEnd", - "0f000000" : "_common0_geoSegmentStart", - "007cc6c0" : "_common0_geoSegmentRomStart", - "0f000000" : "blue_coin_switch_geo", - "0f000020" : "test_platform_geo", - "0f000028" : "amp_geo", - "0f0001a8" : "cannon_base_geo", - "0f0001c0" : "cannon_barrel_geo", - "0f0001d8" : "chuckya_geo", - "0f0004cc" : "purple_switch_geo", - "0f0004e4" : "checkerboard_platform_geo", - "0f0004fc" : "heart_geo", - "0f000518" : "flyguy_geo", - "0f0005d0" : "breakable_box_geo", - "0f000610" : "breakable_box_small_geo", - "0f000640" : "bowling_ball_geo", - "0f00066c" : "bowling_ball_track_geo", - "0f000694" : "exclamation_box_geo", - "0f0006e4" : "goomba_geo", - "0f0007b8" : "black_bobomb_geo", - "0f0008f4" : "bobomb_buddy_geo", - "0f000a30" : "metal_box_geo", - "0f000a58" : "exclamation_box_outline_geo", - "0f000ab0" : "koopa_shell_geo", - "0f000adc" : "koopa_shell2_geo", - "0f000b08" : "koopa_shell3_geo", - "0f000b40" : "_common0_geoSegmentEnd", - "007cd200" : "_common0_geoSegmentRomEnd", - "03000000" : "_common1_mio0SegmentStart", - "007cc6c0" : "_common1_mio0SegmentRomStart", - "03017990" : ".", - "03017990" : "_common1_mio0SegmentEnd", - "007e4050" : "_common1_mio0SegmentRomEnd", - "16000000" : "_common1_geoSegmentStart", - "007cc6c0" : "_common1_geoSegmentRomStart", - "16000000" : "mist_geo", - "16000020" : "white_puff_geo", - "16000040" : "explosion_geo", - "160000a8" : "butterfly_geo", - "1600013c" : "yellow_coin_geo", - "160001a0" : "yellow_coin_no_shadow_geo", - "16000200" : "blue_coin_geo", - "16000264" : "blue_coin_no_shadow_geo", - "160002c4" : "red_coin_geo", - "16000328" : "red_coin_no_shadow_geo", - "16000388" : "warp_pipe_geo", - "160003a8" : "castle_door_geo", - "1600043c" : "cabin_door_geo", - "160004d0" : "wooden_door_geo", - "16000564" : "wooden_door2_geo", - "160005f8" : "metal_door_geo", - "1600068c" : "hazy_maze_door_geo", - "16000720" : "haunted_door_geo", - "160007b4" : "castle_door_0_star_geo", - "16000868" : "castle_door_1_star_geo", - "1600091c" : "castle_door_3_stars_geo", - "160009d0" : "key_door_geo", - "16000a84" : "bowser_key_geo", - "16000ab0" : "bowser_key_cutscene_geo", - "16000b10" : "red_flame_shadow_geo", - "16000b2c" : "red_flame_geo", - "16000b8c" : "blue_flame_geo", - "16000bec" : "fish_shadow_geo", - "16000c44" : "fish_geo", - "16000c8c" : "leaves_geo", - "16000ca4" : "marios_cap_geo", - "16000cf0" : "marios_metal_cap_geo", - "16000d3c" : "marios_wing_cap_geo", - "16000da8" : "marios_winged_metal_cap_geo", - "16000e14" : "number_geo", - "16000e84" : "mushroom_1up_geo", - "16000ea0" : "star_geo", - "16000ed4" : "dirt_animation_geo", - "16000f24" : "cartoon_star_geo", - "16000f6c" : "transparent_star_geo", - "16000f98" : "white_particle_geo", - "16000fb4" : "wooden_signpost_geo", - "16000fe8" : "bubbly_tree_geo", - "16001000" : "spiky_tree_geo", - "16001018" : "snow_tree_geo", - "16001030" : "spiky_tree1_geo", - "16001048" : "palm_tree_geo", - "16001060" : "_common1_geoSegmentEnd", - "007cd720" : "_common1_geoSegmentRomEnd", - "13000000" : "_behaviorSegmentStart", - "007cc6c0" : "_behaviorSegmentRomStart", - "13000000" : "bhvStarDoor", - "13000054" : "bhvMrI", - "1300008c" : "bhvMrIBody", - "130000ac" : "bhvMrIParticle", - "130000f8" : "bhvPurpleParticle", - "13000118" : "bhvGiantPole", - "13000144" : "bhvPoleGrabbing", - "13000174" : "bhvThiHugeIslandTop", - "13000194" : "bhvThiTinyIslandTop", - "130001ac" : "bhvCapSwitchBase", - "130001cc" : "bhvCapSwitch", - "130001f4" : "bhvKingBobomb", - "13000254" : "bhvBobombAnchorMario", - "13000278" : "bhvBetaChestBottom", - "1300029c" : "bhvBetaChestLid", - "130002b8" : "bhvBubbleParticleSpawner", - "130002e4" : "bhvBubbleMaybe", - "13000338" : "bhvSmallWaterWave", - "13000398" : "bhvSmallWaterWave398", - "130003bc" : "bhvWaterAirBubble", - "13000400" : "bhvSmallParticle", - "13000428" : "bhvPlungeBubble", - "13000444" : "bhvSmallParticleSnow", - "1300046c" : "bhvSmallParticleBubbles", - "13000494" : "bhvFishGroup", - "130004a8" : "bhvCannon", - "130004e4" : "bhvCannonBarrel", - "13000500" : "bhvCannonBaseUnused", - "13000528" : "bhvChuckya", - "13000584" : "bhvChuckyaAnchorMario", - "130005a8" : "bhvUnused05A8", - "130005b4" : "bhvRotatingPlatform", - "130005d8" : "bhvTower", - "13000600" : "bhvBulletBillCannon", - "13000624" : "bhvWfBreakableWallRight", - "13000638" : "bhvWfBreakableWallLeft", - "1300066c" : "bhvKickableBoard", - "130006a4" : "bhvTowerDoor", - "130006d8" : "bhvRotatingCounterClockwise", - "130006e0" : "bhvWfRotatingWoodenPlatform", - "13000708" : "bhvKoopaShellUnderwater", - "13000720" : "bhvExitPodiumWarp", - "1300075c" : "bhvFadingWarp", - "13000780" : "bhvWarp", - "130007a0" : "bhvWarpPipe", - "130007dc" : "bhvWhitePuffExplosion", - "130007f8" : "bhvSpawnedStar", - "1300080c" : "bhvSpawnedStarNoLevelExit", - "13000830" : "bhvMrIBlueCoin", - "13000888" : "bhvCoinInsideBoo", - "130008d0" : "bhvCoinFormationSpawn", - "130008ec" : "bhvCoinFormation", - "1300090c" : "bhvOneCoin", - "1300091c" : "bhvYellowCoin", - "13000940" : "bhvTemporaryYellowCoin", - "13000964" : "bhvThreeCoinsSpawn", - "13000984" : "bhvTenCoinsSpawn", - "130009a4" : "bhvSingleCoinGetsSpawned", - "130009e0" : "bhvCoinSparkles", - "13000a14" : "bhvGoldenCoinSparkles", - "13000a34" : "bhvWallTinyStarParticle", - "13000a54" : "bhvVertStarParticleSpawner", - "13000a78" : "bhvPoundTinyStarParticle", - "13000a98" : "bhvHorStarParticleSpawner", - "13000abc" : "bhvPunchTinyTriangle", - "13000ad8" : "bhvTriangleParticleSpawner", - "13000afc" : "bhvDoorWarp", - "13000b0c" : "bhvDoor", - "13000b58" : "bhvGrindel", - "13000b8c" : "bhvThwomp2", - "13000bc8" : "bhvThwomp", - "13000c04" : "bhvTumblingBridgePlatform", - "13000c28" : "bhvWfTumblingBridge", - "13000c44" : "bhvBbhTumblingBridge", - "13000c64" : "bhvLllTumblingBridge", - "13000c84" : "bhvFlame", - "13000cc8" : "bhvAnotherElavator", - "13000cfc" : "bhvRrElevatorPlatform", - "13000d30" : "bhvHmcElevatorPlatform", - "13000d6c" : "bhvWaterMist", - "13000d98" : "bhvBreathParticleSpawner", - "13000db4" : "bhvBreakBoxTriangle", - "13000dd8" : "bhvWaterMist2", - "13000dfc" : "bhvUnused0DFC", - "13000e24" : "bhvMistCircParticleSpawner", - "13000e3c" : "bhvDirtParticleSpawner", - "13000e58" : "bhvSnowParticleSpawner", - "13000e70" : "bhvWind", - "13000e88" : "bhvEndToad", - "13000eac" : "bhvEndPeach", - "13000ed0" : "bhvUnusedParticleSpawn", - "13000f08" : "bhvUkiki", - "13000f14" : "bhvUkikiCageChild", - "13000f2c" : "bhvUkikiCageStar", - "13000f48" : "bhvUkikiCage", - "13000f9c" : "bhvBitfsSinkingPlatforms", - "13000fc8" : "bhvBitfsSinkingCagePlatform", - "13001000" : "bhvDddMovingPole", - "13001030" : "bhvBitfsTiltingInvertedPyramid", - "13001064" : "bhvSquishablePlatform", - "13001098" : "bhvCutOutObject", - "130010a8" : "bhvBetaMovingFlamesSpawn", - "130010b8" : "bhvBetaMovingFlames", - "130010d8" : "bhvRrRotatingBridgePlatform", - "13001108" : "bhvFlamethrower", - "13001124" : "bhvFlamethrowerFlame", - "13001168" : "bhvBouncingFireball", - "13001184" : "bhvBouncingFireballFlame", - "130011d0" : "bhvBowserShockWave", - "130011ec" : "bhvFireParticleSpawner", - "13001214" : "bhvBlackSmokeMario", - "13001254" : "bhvBlackSmokeBowser", - "1300127c" : "bhvBlackSmokeUpward", - "13001298" : "bhvBetaFishSplashSpawner", - "130012b4" : "bhvSpindrift", - "130012f4" : "bhvTowerPlatformGroup", - "13001318" : "bhvWfSlidingTowerPlatform", - "13001340" : "bhvWfElevatorTowerPlatform", - "13001368" : "bhvWfSolidTowerPlatform", - "13001390" : "bhvLeafParticleSpawner", - "130013a8" : "bhvTreeSnow", - "130013c4" : "bhvTreeLeaf", - "130013dc" : "bhvAnotherTiltingPlatform", - "13001408" : "bhvSquarishPathMoving", - "1300142c" : "bhvPiranhaPlantBubble", - "13001448" : "bhvPiranhaPlantWakingBubbles", - "13001468" : "bhvFloorSwitchAnimatesObject", - "13001478" : "bhvFloorSwitchGrills", - "13001484" : "bhvFloorSwitchHardcodedModel", - "130014ac" : "bhvFloorSwitchHiddenObjects", - "130014bc" : "bhvHiddenObject", - "130014e0" : "bhvBreakableBox", - "13001518" : "bhvPushableMetalBox", - "13001548" : "bhvHeaveHo", - "130015a4" : "bhvHeaveHoThrowMario", - "130015c0" : "bhvCcmTouchedStarSpawn", - "130015e4" : "bhvUnusedPoundablePlatform", - "13001608" : "bhvBetaTrampolineTop", - "13001634" : "bhvBetaTrampolineSpring", - "13001650" : "bhvJumpingBox", - "1300167c" : "bhvBooCage", - "130016ac" : "bhvStub", - "130016b8" : "bhvIgloo", - "130016e4" : "bhvBowserKey", - "13001714" : "bhvGrandStar", - "13001744" : "bhvBetaBooKey", - "13001778" : "bhvAlphaBooKey", - "1300179c" : "bhvBulletBill", - "130017f4" : "bhvWhitePuffSmoke", - "13001820" : "bhvUnused1820", - "13001828" : "bhvBowserTailAnchor", - "13001850" : "bhvBowser", - "130018cc" : "bhvBowserBodyAnchor", - "13001904" : "bhvBowserFlameSpawn", - "13001920" : "bhvTiltingBowserLavaPlatform", - "13001958" : "bhvFallingBowserPlatform", - "13001984" : "bhvBlueBowserFlame", - "130019c8" : "bhvFlameFloatingLanding", - "13001a0c" : "bhvBlueFlamesGroup", - "13001a30" : "bhvFlameBouncing", - "13001a74" : "bhvFlameMovingForwardGrowing", - "13001aa4" : "bhvFlameBowser", - "13001ae8" : "bhvFlameLargeBurningOut", - "13001b2c" : "bhvBlueFish", - "13001b54" : "bhvTankFishGroup", - "13001b70" : "bhvCheckerboardElevatorGroup", - "13001b88" : "bhvCheckerboardPlatformSub", - "13001bb4" : "bhvBowserKeyUnlockDoor", - "13001bd4" : "bhvBowserKeyCourseExit", - "13001bf4" : "bhvInvisibleObjectsUnderBridge", - "13001c04" : "bhvWaterLevelPillar", - "13001c34" : "bhvDddWarp", - "13001c58" : "bhvMoatGrills", - "13001c7c" : "bhvClockMinuteHand", - "13001c8c" : "bhvClockHourHand", - "13001cb0" : "bhvMacroUkiki", - "13001d0c" : "bhvStub1D0C", - "13001d14" : "bhvLllRotatingHexagonalPlatform", - "13001d40" : "bhvLllSinkingRockBlock", - "13001d70" : "bhvStub1D70", - "13001d78" : "bhvLllMovingOctagonalMeshPlatform", - "13001da4" : "bhvSnowBall", - "13001da8" : "bhvLllRotatingBlockWithFireBars", - "13001dcc" : "bhvLllRotatingHexFlame", - "13001e04" : "bhvLllWoodPiece", - "13001e30" : "bhvLllFloatingWoodBridge", - "13001e4c" : "bhvVolcanoFlames", - "13001e6c" : "bhvLllRotatingHexagonalRing", - "13001e94" : "bhvLllSinkingRectangularPlatform", - "13001ec4" : "bhvLllSinkingSquarePlatforms", - "13001ef8" : "bhvLllTiltingInvertedPyramid", - "13001f30" : "bhvUnused1F30", - "13001f3c" : "bhvKoopaShell", - "13001f68" : "bhvKoopaShellFlame", - "13001f90" : "bhvToxBox", - "13001fbc" : "bhvPiranhaPlant", - "13002018" : "bhvLllHexagonalMesh", - "13002038" : "bhvLllBowserPuzzlePiece", - "13002068" : "bhvLllBowserPuzzle", - "13002088" : "bhvTuxiesMother", - "130020d8" : "bhvPenguinBaby", - "130020e0" : "bhvUnused20E0", - "130020e8" : "bhvSmallPenguin", - "1300213c" : "bhvManyBlueFishSpawner", - "1300214c" : "bhvFewBlueFishSpawner", - "1300215c" : "bhvFishSpawner", - "13002178" : "bhvFish", - "13002194" : "bhvWdwExpressElevator", - "130021c0" : "bhvWdwExpressElevatorPlatform", - "130021e4" : "bhvChirpChirp", - "130021f4" : "bhvChirpChirpUnused", - "1300220c" : "bhvBub", - "13002250" : "bhvExclamationBox", - "1300227c" : "bhvRotatingExclamationMark", - "1300229c" : "bhvSoundSpawner", - "130022b8" : "bhvRockSolid", - "130022d8" : "bhvBowserSubDoor", - "13002308" : "bhvBowsersSub", - "13002338" : "bhvSushiShark", - "13002388" : "bhvSushiSharkCollisionChild", - "130023a4" : "bhvJrbSlidingBox", - "130023d0" : "bhvShipPart3", - "130023ec" : "bhvInSunkenShip3", - "1300241c" : "bhvSunkenShipPart", - "1300243c" : "bhvSunkenShipSetRotation", - "1300244c" : "bhvSunkenShipPart2", - "1300246c" : "bhvInSunkenShip", - "13002480" : "bhvInSunkenShip2", - "130024ac" : "bhvMistParticleSpawner", - "130024dc" : "bhvWhitePuff1", - "13002500" : "bhvWhitePuff2", - "13002528" : "bhvWhitePuffSmoke2", - "13002558" : "bhvPurpleSwitchHiddenBoxes", - "13002568" : "bhvBlueCoinSwitch", - "13002588" : "bhvHiddenBlueCoin", - "130025c0" : "bhvOpenableCageDoor", - "130025e0" : "bhvOpenableGrill", - "130025f8" : "bhvWaterLevelDiamond", - "13002620" : "bhvInitializeChangingWaterLevel", - "13002634" : "bhvTweesterSandParticle", - "13002650" : "bhvTweester", - "13002684" : "bhvMerryGoRoundBooManager", - "1300269c" : "bhvAnimatedTexture", - "130026d4" : "bhvBooInCastle", - "13002710" : "bhvBooWithCage", - "13002768" : "bhvBalconyBigBoo", - "1300277c" : "bhvMerryGoRoundBigBoo", - "13002790" : "bhvGhostHuntBigBoo", - "130027d0" : "bhvCourtyardBooTriplet", - "130027e4" : "bhvBoo", - "130027f4" : "bhvMerryGoRoundBoo", - "13002804" : "bhvGhostHuntBoo", - "1300286c" : "bhvHiddenStaircaseStep", - "13002898" : "bhvBooBossSpawnedBridge", - "130028cc" : "bhvBbhTiltingTrapPlatform", - "130028fc" : "bhvHauntedBookshelf", - "1300292c" : "bhvMeshElevator", - "13002968" : "bhvMerryGoRound", - "13002998" : "bhvPlaysMusicTrackWhenTouched", - "130029b0" : "bhvInsideCannon", - "130029b4" : "bhvBetaBowserAnchor", - "130029e4" : "bhvStaticCheckeredPlatform", - "13002a10" : "bhvUnused2A10", - "13002a20" : "bhvUnusedFakeStar", - "13002a48" : "bhvStaticObject", - "13002a54" : "bhvUnused2A54", - "13002a5c" : "bhvCastleFloorTrap", - "13002a7c" : "bhvFloorTrapInCastle", - "13002aa4" : "bhvTree", - "13002ad0" : "bhvSparkle", - "13002af0" : "bhvSparkleSpawn", - "13002b08" : "bhvSparkleParticleSpawner", - "13002b5c" : "bhvScuttlebug", - "13002ba0" : "bhvScuttlebugSpawn", - "13002bb8" : "bhvWhompKingBoss", - "13002bcc" : "bhvSmallWhomp", - "13002c14" : "bhvWaterSplash", - "13002c60" : "bhvWaterDroplet", - "13002c7c" : "bhvWaterDropletSplash", - "13002cb0" : "bhvBubbleSplash", - "13002ce0" : "bhvIdleWaterWave", - "13002d28" : "bhvObjectWaterSplash", - "13002d50" : "bhvShallowWaterWave", - "13002d7c" : "bhvShallowWaterSplash", - "13002db0" : "bhvObjectWaveTrail", - "13002dc0" : "bhvWaveTrail", - "13002e04" : "bhvTinyStrongWindParticle", - "13002e20" : "bhvStrongWindParticle", - "13002e3c" : "bhvSLSnowmanWind", - "13002e58" : "bhvSLWalkingPenguin", - "13002ea8" : "bhvYellowBall", - "13002ec0" : "bhvMario", - "13002ef8" : "bhvToadMessage", - "13002f40" : "bhvUnlockDoorStar", - "13002f60" : "bhvInstantActiveWarp", - "13002f64" : "bhvAirborneWarp", - "13002f68" : "bhvHardAirKnockBackWarp", - "13002f6c" : "bhvSpinAirborneCircleWarp", - "13002f70" : "bhvDeathWarp", - "13002f74" : "bhvSpinAirborneWarp", - "13002f78" : "bhvFlyingWarp", - "13002f7c" : "bhvPaintingStarCollectWarp", - "13002f80" : "bhvPaintingDeathWarp", - "13002f84" : "bhvAirborneDeathWarp", - "13002f88" : "bhvAirborneStarCollectWarp", - "13002f8c" : "bhvLaunchStarCollectWarp", - "13002f90" : "bhvLaunchDeathWarp", - "13002f94" : "bhvSwimmingWarp", - "13002fa0" : "bhvRandomAnimatedTexture", - "13002fc0" : "bhvYellowBackgroundInMenu", - "13002fe4" : "bhvMenuButton", - "13003008" : "bhvMenuButtonManager", - "1300302c" : "bhvActSelectorStarType", - "13003048" : "bhvActSelector", - "13003068" : "bhvMovingYellowCoin", - "130030a4" : "bhvMovingBlueCoin", - "130030d4" : "bhvBlueCoinSliding", - "13003104" : "bhvBlueCoinJumping", - "13003134" : "bhvSeaweed", - "13003158" : "bhvSeaweedBundle", - "13003174" : "bhvBobomb", - "130031ac" : "bhvBobombFuseSmoke", - "130031dc" : "bhvBobombBuddy", - "13003228" : "bhvBobombBuddyOpensCannon", - "13003274" : "bhvCannonClosed", - "130032a8" : "bhvWhirlpool", - "130032c8" : "bhvJetStream", - "130032e0" : "bhvMessagePanel", - "13003324" : "bhvSignOnWall", - "13003354" : "bhvHomingAmp", - "13003388" : "bhvCirclingAmp", - "130033bc" : "bhvButterfly", - "130033ec" : "bhvHoot", - "13003420" : "bhvBetaHoldableObject", - "13003454" : "bhvCarrySomething1", - "1300345c" : "bhvCarrySomething2", - "13003464" : "bhvCarrySomething3", - "1300346c" : "bhvCarrySomething4", - "13003474" : "bhvCarrySomething5", - "1300347c" : "bhvCarrySomething6", - "13003484" : "bhvObjectBubble", - "130034c4" : "bhvObjectWaterWave", - "13003510" : "bhvExplosion", - "13003558" : "bhvBobombBullyDeathSmoke", - "13003588" : "bhvSmoke", - "130035b0" : "bhvBobombExplosionBubble", - "13003600" : "bhvBobombExplosionBubble3600", - "13003614" : "bhvRespawner", - "1300362c" : "bhvSmallBully", - "13003660" : "bhvBigBully", - "13003694" : "bhvBigBullyWithMinions", - "130036c8" : "bhvSmallChillBully", - "13003700" : "bhvBigChillBully", - "13003738" : "bhvJetStreamRingSpawner", - "13003750" : "bhvJetStreamWaterRing", - "13003798" : "bhvMantaRayWaterRing", - "130037e0" : "bhvMantaRayRingManager", - "130037ec" : "bhvBowserBomb", - "1300381c" : "bhvBowserBombExplosion", - "13003840" : "bhvBowserBombSmoke", - "13003868" : "bhvCelebrationStar", - "13003888" : "bhvCelebrationStarSparkle", - "130038b0" : "bhvStarKeyCollectionPuffSpawner", - "130038d0" : "bhvLllDrawbridgeSpawner", - "130038e8" : "bhvLllDrawbridge", - "13003910" : "bhvSmallBomp", - "13003940" : "bhvLargeBomp", - "13003970" : "bhvWfSlidingPlatform", - "130039a0" : "bhvMoneybag", - "130039d4" : "bhvMoneybagHidden", - "13003a08" : "bhvPitBowlingBall", - "13003a30" : "bhvFreeBowlingBall", - "13003a58" : "bhvBowlingBall", - "13003a80" : "bhvTtmBowlingBallSpawner", - "13003aa4" : "bhvBobBowlingBallSpawner", - "13003ac8" : "bhvThiBowlingBallSpawner", - "13003ae0" : "bhvRrCruiserWing", - "13003b00" : "bhvSpindel", - "13003b30" : "bhvSslMovingPyramidWall", - "13003b60" : "bhvPyramidElevator", - "13003b98" : "bhvPyramidElevatorTrajectoryMarkerBall", - "13003bb4" : "bhvPyramidTop", - "13003bec" : "bhvPyramidTopFragment", - "13003c0c" : "bhvPyramidPillarTouchDetector", - "13003c30" : "bhvWaterfallSoundLoop", - "13003c44" : "bhvVolcanoSoundLoop", - "13003c58" : "bhvCastleFlagWaving", - "13003c7c" : "bhvBirdsSoundLoop", - "13003c90" : "bhvAmbientSounds", - "13003ca4" : "bhvSandSoundLoop", - "13003cb8" : "bhvHiddenAt120Stars", - "13003ce4" : "bhvSnowmansBottom", - "13003d0c" : "bhvSnowmansHead", - "13003d34" : "bhvSnowmansBodyCheckpoint", - "13003d4c" : "bhvBigSnowmanWhole", - "13003d74" : "bhvBigBoulder", - "13003da0" : "bhvBigBoulderGenerator", - "13003db8" : "bhvWingCap", - "13003dd8" : "bhvMetalCap", - "13003df8" : "bhvNormalCap", - "13003e1c" : "bhvVanishCap", - "13003e3c" : "bhvStar", - "13003e64" : "bhvStarSpawnCoordinates", - "13003e8c" : "bhvHiddenRedCoinStar", - "13003eac" : "bhvRedCoin", - "13003ee4" : "bhvBowserCourseRedCoinStar", - "13003efc" : "bhvHiddenStar", - "13003f1c" : "bhvHiddenStarTrigger", - "13003f40" : "bhvTtmRollingLog", - "13003f78" : "bhvLllVolcanoFallingTrap", - "13003fa4" : "bhvLllRollingLog", - "13003fdc" : "bhv1upWalking", - "13004010" : "bhv1upRunningAway", - "13004044" : "bhv1upSliding", - "1300407c" : "bhv1Up", - "130040b4" : "bhv1upJumpOnApproach", - "130040ec" : "bhvHidden1up", - "13004124" : "bhvHidden1upTrigger", - "13004148" : "bhvHidden1upInPole", - "13004180" : "bhvHidden1upInPoleTrigger", - "130041a4" : "bhvHidden1upInPoleSpawner", - "130041bc" : "bhvControllablePlatform", - "130041f0" : "bhvControllablePlatformSub", - "13004218" : "bhvBreakableBoxSmall", - "13004244" : "bhvSlidingSnowMound", - "13004270" : "bhvSnowMoundSpawn", - "13004284" : "bhvWdwSquareFloatingPlatform", - "130042b4" : "bhvWdwRectangularFloatingPlatform", - "130042e4" : "bhvJrbFloatingPlatform", - "13004314" : "bhvArrowLift", - "13004348" : "bhvOrangeNumber", - "13004370" : "bhvMantaRay", - "130043a0" : "bhvFallingPillar", - "130043c4" : "bhvFallingPillarHitbox", - "130043e0" : "bhvPillarBase", - "13004400" : "bhvJrbFloatingBox", - "1300442c" : "bhvDecorativePendulum", - "1300444c" : "bhvTreasureChestsShip", - "13004470" : "bhvTreasureChestsJrb", - "13004494" : "bhvTreasureChests", - "130044b8" : "bhvTreasureChestBottom", - "130044e0" : "bhvTreasureChestTop", - "130044fc" : "bhvMips", - "13004538" : "bhvYoshi", - "13004580" : "bhvKoopa", - "130045d0" : "bhvKoopaRaceEndpoint", - "130045f8" : "bhvKoopaFlag", - "13004634" : "bhvPokey", - "13004668" : "bhvPokeyBodyPart", - "13004698" : "bhvSwoop", - "130046dc" : "bhvFlyGuy", - "1300472c" : "bhvGoomba", - "13004770" : "bhvGoombaTripletSpawner", - "1300478c" : "bhvChainChomp", - "130047e4" : "bhvChainChompChainPart", - "1300481c" : "bhvWoodenPost", - "13004868" : "bhvChainChompGate", - "13004898" : "bhvWigglerHead", - "130048e0" : "bhvWigglerBody", - "13004918" : "bhvEnemyLakitu", - "13004954" : "bhvCameraLakitu", - "13004988" : "bhvCloud", - "130049ac" : "bhvCloudPart", - "130049c8" : "bhvSpiny", - "13004a00" : "bhvMontyMole", - "13004a58" : "bhvMontyMoleHole", - "13004a78" : "bhvMontyMoleRock", - "13004ab0" : "bhvPlatformOnTrack", - "13004af4" : "bhvTrackBall", - "13004b1c" : "bhvSeesawPlatform", - "13004b44" : "bhvFerrisWheelAxle", - "13004b6c" : "bhvFerrisWheelPlatform", - "13004b8c" : "bhvWaterBombSpawner", - "13004ba8" : "bhvWaterBomb", - "13004bd4" : "bhvWaterBombShadow", - "13004bf0" : "bhvTTCRotatingSolid", - "13004c24" : "bhvTTCPendulum", - "13004c5c" : "bhvTTCTreadmill", - "13004c94" : "bhvTTCMovingBar", - "13004ccc" : "bhvTTCCog", - "13004cf8" : "bhvTTCPitBlock", - "13004d28" : "bhvTTCElevator", - "13004d64" : "bhvTTC2DRotator", - "13004d90" : "bhvTTCSpinner", - "13004dbc" : "bhvMrBlizzard", - "13004e08" : "bhvMrBlizzardSnowball", - "13004e4c" : "bhvSlidingPlatform2", - "13004e78" : "bhvOctagonalPlatformRotating", - "13004ea0" : "bhvAnimatesOnFloorSwitchPress", - "13004ecc" : "bhvActivatedBackAndForthPlatform", - "13004ef8" : "bhvRecoveryHeart", - "13004f10" : "bhvWaterBombCannon", - "13004f28" : "bhvCannonBarrelBubbles", - "13004f40" : "bhvUnagi", - "13004f78" : "bhvUnagiSubobject", - "13004f90" : "bhvDorrie", - "13004fd4" : "bhvHauntedChair", - "13005024" : "bhvMadPiano", - "1300506c" : "bhvFlyingBookend", - "130050b4" : "bhvBookendSpawn", - "130050d4" : "bhvHauntedBookshelfManager", - "130050f4" : "bhvBookSwitch", - "13005120" : "bhvFirePiranhaPlant", - "13005158" : "bhvSmallPiranhaFlame", - "1300518c" : "bhvFireSpitter", - "130051ac" : "bhvFlyguyFlame", - "130051e0" : "bhvSnufit", - "1300521c" : "bhvSnufitBalls", - "1300525c" : "bhvHorizontalGrindel", - "130052b4" : "bhvEyerokBoss", - "130052d0" : "bhvEyerokHand", - "13005310" : "bhvKlepto", - "13005354" : "bhvBird", - "13005380" : "bhvRacingPenguin", - "130053c4" : "bhvPenguinRaceFinishLine", - "130053dc" : "bhvPenguinRaceShortcutCheck", - "130053f4" : "bhvCoffinSpawner", - "13005414" : "bhvCoffin", - "13005440" : "bhvClamShell", - "13005468" : "bhvSkeeter", - "130054a0" : "bhvSkeeterWave", - "130054b8" : "bhvSwingPlatform", - "130054ec" : "bhvDonutPlatformSpawner", - "13005504" : "bhvDonutPlatform", - "13005528" : "bhvDDDPole", - "1300556c" : "bhvRedCoinStarMarker", - "13005598" : "bhvTripletButterfly", - "130055dc" : "bhvBubba", - "13005610" : "bhvBeginningLakitu", - "13005638" : "bhvBeginningPeach", - "1300565c" : "bhvEndBirds1", - "13005680" : "bhvEndBirds2", - "130056a4" : "bhvIntroScene", - "130056c0" : "_behaviorSegmentEnd", - "007d1d80" : "_behaviorSegmentRomEnd", - "8016f000" : "_goddardSegmentStart", - "007cc6c0" : "_goddardSegmentRomStart", - } + "Refresh 3": { + "80000300": "osTvType", + "80000308": "osRomBase", + "8000030c": "osResetType", + "80000318": "osMemSize", + "8000031c": "osAppNmiBuffer", + "80000400": "gZBuffer", + "80000000": "D_80000000", + "a4000000": "D_A4000000", + "a40004c0": "D_A40004C0", + "a4000774": "D_A4000774", + "a4001000": "D_A4001000", + "a4040010": "D_A4040010", + "a4080000": "D_A4080000", + "a4300000": "D_A4300000", + "a4300004": "D_A4300004", + "a4300008": "D_A4300008", + "a430000c": "D_A430000C", + "a4400010": "D_A4400010", + "a450000c": "D_A450000C", + "a4600000": "D_A4600000", + "a4600004": "D_A4600004", + "a460000c": "D_A460000C", + "a4600010": "D_A4600010", + "a4700000": "D_A4700000", + "a4700010": "D_A4700010", + "a4800018": "D_A4800018", + "b0000008": "D_B0000008", + "b0000010": "D_B0000010", + "b0000014": "D_B0000014", + "c0000000": "D_C0000000", + "c0000008": "D_C0000008", + "c000000c": "D_C000000C", + "802ef700": "__osGetCurrFaultedThread", + "00000000": "__romPos", + "04000000": "_bootSegmentStart", + "007cc6c0": "_bootSegmentRomStart", + "04001000": "_bootSegmentEnd", + "007cd6c0": "_bootSegmentRomEnd", + "80246000": "_mainSegmentStart", + "007cc6c0": "_mainSegmentRomStart", + "80246000": "EntryPoint", + "80246050": "handle_debug_key_sequences", + "80246170": "Unknown80246170", + "802461cc": "Dummy802461CC", + "802461dc": "Dummy802461DC", + "802461ec": "Dummy802461EC", + "802461fc": "setup_mesg_queues", + "802462e0": "AllocPool", + "80246338": "create_thread", + "8024639c": "handle_nmi_request", + "802463ec": "receive_new_tasks", + "8024651c": "start_sptask", + "8024659c": "interrupt_gfx_sptask", + "802465ec": "start_gfx_sptask", + "80246648": "pretend_audio_sptask_done", + "8024669c": "handle_vblank", + "802467fc": "handle_sp_complete", + "8024694c": "handle_dp_complete", + "802469b8": "thread3_main", + "80246b14": "set_vblank_handler", + "80246b74": "SendMessage", + "80246bb4": "dispatch_audio_sptask", + "80246c10": "send_display_list", + "80246c9c": "turn_on_audio", + "80246cb8": "turn_off_audio", + "80246cf0": "thread1_idle", + "80246df8": "Main", + "80246e70": "my_rdp_init", + "802471a4": "my_rsp_init", + "80247284": "clear_z_buffer", + "802473c8": "display_frame_buffer", + "802474b8": "clear_frame_buffer", + "80247620": "clear_viewport", + "8024784c": "draw_screen_borders", + "802479bc": "make_viewport_clip_rect", + "80247b3c": "create_task_structure", + "80247ccc": "init_render_image", + "80247d14": "end_master_display_list", + "80247db4": "func_80247D84", + "80247f08": "func_80247ED8", + "80247fdc": "func_80247FAC", + "80248090": "display_and_vsync", + "80248304": "adjust_analog_stick", + "80248498": "run_demo_inputs", + "80248638": "read_controller_inputs", + "80248824": "init_controllers", + "80248964": "setup_game_memory", + "80248af0": "thread5_game_loop", + "80248c40": "func_80248C10", + "80248c58": "func_80248C28", + "80248ce8": "func_80248CB8", + "80248d78": "func_80248D48", + "80248dc0": "func_80248D90", + "80248e08": "set_sound_mode", + "80248e54": "play_menu_sounds", + "80248fec": "play_painting_eject_sound", + "80249070": "play_infinite_stairs_music", + "80249178": "set_background_music", + "8024922c": "func_802491FC", + "8024927c": "func_8024924C", + "802492d0": "play_cutscene_music", + "80249310": "play_shell_music", + "8024934c": "stop_shell_music", + "80249398": "play_cap_music", + "80249404": "fadeout_cap_music", + "80249448": "stop_cap_music", + "802494d8": "audio_game_loop_tick", + "80249500": "thread4_sound", + "802495e0": "level_control_timer", + "802496b8": "pressed_paused", + "80249764": "set_play_mode", + "8024978c": "func_8024975C", + "802497b8": "func_80249788", + "8024982c": "nop_802497FC", + "8024983c": "func_8024980C", + "8024995c": "func_8024992C", + "80249a10": "set_mario_initial_cap_powerup", + "80249ab4": "set_mario_initial_action", + "80249cd8": "init_mario_after_warp", + "8024a124": "func_8024A02C", + "8024a18c": "func_8024A094", + "8024a1d8": "func_8024A0E0", + "8024a374": "check_instant_warp", + "8024a584": "func_8024A48C", + "8024a700": "initiate_warp", + "8024a7b4": "get_painting_warp_node", + "8024a85c": "initiate_painting_warp", + "8024a9cc": "level_trigger_warp", + "8024aedc": "initiate_delayed_warp", + "8024b13c": "update_hud_values", + "8024b390": "basic_update", + "8024b3e4": "play_mode_normal", + "8024b5d4": "play_mode_paused", + "8024b6cc": "play_mode_frame_advance", + "8024b798": "level_set_transition", + "8024b7c0": "play_mode_change_area", + "8024b880": "play_mode_change_level", + "8024b9b8": "update_level", + "8024ba8c": "init_level", + "8024bcd8": "lvl_init_or_update", + "8024bd5c": "lvl_init_from_save_file", + "8024be14": "lvl_set_current_level", + "8024bfa0": "lvl_play_the_end_screen_sound", + "8024bff0": "get_mario_cap_flag", + "8024c0b8": "object_facing_mario", + "8024c16c": "mario_angle_to_object", + "8024c1d8": "determine_interaction", + "8024c51c": "attack_object", + "8024c618": "mario_stop_riding_object", + "8024c66c": "mario_grab_used_object", + "8024c6c0": "mario_drop_held_object", + "8024c780": "mario_throw_held_object", + "8024c894": "mario_stop_riding_and_holding", + "8024c8fc": "does_mario_have_hat", + "8024c928": "mario_blow_off_cap", + "8024ca68": "mario_lose_cap_to_enemy", + "8024caf8": "mario_retrieve_cap", + "8024cb58": "able_to_grab_object", + "8024cbfc": "mario_get_collided_object", + "8024cc7c": "mario_check_object_grab", + "8024ce08": "bully_knock_back_mario", + "8024d0b4": "bounce_off_object", + "8024d130": "hit_object_from_below", + "8024d2bc": "determine_knockback_action", + "8024d578": "push_mario_out_of_object", + "8024d72c": "bounce_back_from_attack", + "8024d804": "func_8024D664", + "8024d8b0": "take_damage_from_interact_object", + "8024d998": "take_damage_and_knock_back", + "8024daac": "reset_mario_pitch", + "8024db2c": "interact_coin", + "8024dbf0": "interact_water_ring", + "8024dc28": "interact_star_or_key", + "8024de4c": "interact_bbh_entrance", + "8024df10": "interact_warp", + "8024e0c4": "interact_warp_door", + "8024e2fc": "get_door_save_file_flag", + "8024e420": "interact_door", + "8024e6ec": "interact_cannon_base", + "8024e778": "interact_igloo_barrier", + "8024e7d4": "interact_tornado", + "8024e8f0": "interact_whirlpool", + "8024e9d0": "interact_wind", + "8024ead8": "interact_flame", + "8024ec54": "interact_snufit_bullet", + "8024ed84": "interact_clam_or_bubba", + "8024ee44": "interact_bully", + "8024eff8": "interact_shock", + "8024f170": "interact_mr_blizzard", + "8024f1e0": "interact_hit_from_below", + "8024f354": "interact_bounce_top", + "8024f4ac": "interact_unknown_08", + "8024f55c": "interact_damage", + "8024f5cc": "interact_breakable", + "8024f6a4": "interact_koopa_shell", + "8024f7a8": "check_object_grab_mario", + "8024f8bc": "interact_pole", + "8024fa60": "interact_hoot", + "8024fb30": "interact_cap", + "8024fd2c": "interact_grabbable", + "8024fe6c": "func_8024FC94", + "8024ff04": "func_8024FD2C", + "80250098": "func_8024FEC0", + "80250198": "interact_text", + "80250230": "check_kick_or_punch_wall", + "802503f0": "mario_process_interactions", + "802505c8": "check_death_barrier", + "8025065c": "check_lava_boost", + "80250724": "pss_begin_slide", + "80250778": "pss_end_slide", + "802507fc": "mario_handle_special_floors", + "80250940": "is_anim_at_end", + "8025097c": "is_anim_past_end", + "802509b8": "set_mario_animation", + "80250b04": "set_mario_anim_with_accel", + "80250c7c": "set_anim_to_frame", + "80250d38": "is_anim_past_frame", + "80250e54": "find_mario_anim_flags_and_translation", + "80251020": "update_mario_pos_for_anim", + "802510dc": "return_mario_anim_y_translation", + "80251120": "play_sound_if_no_flag", + "8025118c": "play_mario_jump_sound", + "80251274": "adjust_sound_for_speed", + "80251310": "play_sound_and_spawn_particles", + "80251444": "play_mario_action_sound", + "802514ac": "play_mario_landing_sound", + "80251510": "play_mario_landing_sound_once", + "80251574": "play_mario_heavy_landing_sound", + "802515d8": "play_mario_heavy_landing_sound_once", + "8025163c": "play_mario_sound", + "80251708": "mario_set_forward_vel", + "8025177c": "mario_get_floor_class", + "802518a8": "mario_get_terrain_sound_addend", + "80251a48": "resolve_and_return_wall_collisions", + "80251afc": "vec3f_find_ceil", + "80251b54": "mario_facing_downhill", + "80251bd4": "mario_floor_is_slippery", + "80251cfc": "mario_floor_is_slope", + "80251e24": "mario_floor_is_steep", + "80251f24": "find_floor_height_relative_polar", + "80252000": "find_floor_slope", + "802521a0": "update_mario_sound_and_camera", + "8025229c": "set_steep_jump_action", + "80252cf4": "set_mario_action", + "80252e5c": "set_jump_from_landing", + "802530a0": "set_jumping_action", + "80253178": "drop_and_set_mario_action", + "802531c4": "hurt_and_set_mario_action", + "80253218": "check_common_action_exits", + "80253300": "check_common_hold_action_exits", + "802533e4": "transition_submerged_to_walking", + "80253488": "set_water_plunge_action", + "80253588": "squish_mario_model", + "80253720": "debug_print_speed_action_normal", + "80253838": "update_mario_button_inputs", + "8025395c": "update_mario_joystick_inputs", + "80253a60": "update_mario_geometry_inputs", + "80253d58": "update_mario_inputs", + "80253ec0": "set_submerged_cam_preset_and_spawn_bubbles", + "80254060": "update_mario_health", + "802542b4": "update_mario_info_for_cam", + "80254338": "mario_reset_bodystate", + "80254390": "sink_mario_in_quicksand", + "802543e8": "update_and_return_cap_flags", + "80254588": "mario_update_hitbox_and_cap_model", + "80254830": "execute_mario_action", + "80254b20": "init_mario", + "80254f44": "init_mario_from_save_file", + "80255080": "get_additive_y_vel_for_jumps", + "8025509c": "nop_80254E3C", + "802550b0": "nop_80254E50", + "802550c0": "transfer_bully_speed", + "80255238": "init_bully_collision_data", + "802552fc": "mario_bonk_reflection", + "80255414": "mario_update_quicksand", + "80255654": "mario_push_off_steep_floor", + "8025570c": "mario_update_moving_sand", + "8025580c": "mario_update_windy_ground", + "802559b0": "stop_and_set_height_to_floor", + "80255a34": "stationary_ground_step", + "80255d88": "perform_ground_step", + "80255ec4": "check_ledge_grab", + "802560ac": "perform_air_quarter_step", + "802564e0": "apply_twirl_gravity", + "80256584": "should_strengthen_gravity_for_jump_ascent", + "8025661c": "apply_gravity", + "802569f8": "apply_vertical_wind", + "80256b24": "perform_air_step", + "80256cd8": "set_vel_from_pitch_and_yaw", + "80256d8c": "set_vel_from_yaw", + "80256e00": "get_credits_str_width", + "80256e88": "print_displaying_credits_entry", + "80257060": "BehEndPeachLoop", + "802570dc": "BehEndToadLoop", + "80257198": "geo_switch_peach_eyes", + "802572b0": "get_star_collection_dialog", + "8025733c": "handle_save_menu", + "80257450": "spawn_obj_at_mario_rel_yaw", + "802574e8": "cutscene_take_cap_off", + "80257548": "cutscene_put_cap_on", + "802575a8": "mario_ready_to_speak", + "80257640": "set_mario_npc_dialog", + "80257748": "act_reading_npc_dialog", + "80257980": "act_waiting_for_dialog", + "80257a0c": "act_disappeared", + "80257ab0": "act_reading_automatic_dialog", + "80257ce4": "act_reading_sign", + "80257eac": "act_debug_free_move", + "80258184": "general_star_dance_handler", + "80258420": "act_star_dance", + "802584dc": "act_star_dance_water", + "802585c0": "act_fall_after_star_grab", + "802586cc": "common_death_handler", + "80258744": "act_standing_death", + "802587ec": "act_electrocution", + "8025883c": "act_suffocation", + "8025888c": "act_death_on_back", + "802588f8": "act_death_on_stomach", + "80258964": "act_quicksand_death", + "80258a7c": "act_eaten_by_bubba", + "80258b24": "launch_mario_until_land", + "80258ba8": "act_unlocking_key_door", + "80258dac": "act_unlocking_star_door", + "80258f94": "act_entering_star_door", + "80259264": "act_going_through_door", + "802593cc": "act_warp_door_spawn", + "802594d4": "act_emerge_from_pipe", + "80259608": "act_spawn_spin_airborne", + "80259740": "act_spawn_spin_landing", + "802597ac": "act_exit_airborne", + "80259854": "act_falling_exit_airborne", + "802598d0": "act_exit_land_save_dialog", + "80259c30": "act_death_exit", + "80259ce8": "act_unused_death_exit", + "80259d74": "act_falling_death_exit", + "80259e00": "act_special_exit_airborne", + "80259ef8": "act_special_death_exit", + "80259fcc": "act_spawn_no_spin_airborne", + "8025a040": "act_spawn_no_spin_landing", + "8025a0bc": "act_bbh_enter_spin", + "8025a494": "act_bbh_enter_jump", + "8025a610": "act_teleport_fade_out", + "8025a6fc": "act_teleport_fade_in", + "8025a858": "act_shocked", + "8025a9ac": "act_squished", + "8025ae0c": "act_putting_on_cap", + "8025aea8": "stuck_in_ground_handler", + "8025affc": "act_head_stuck_in_ground", + "8025b050": "act_butt_stuck_in_ground", + "8025b0a4": "act_feet_stuck_in_ground", + "8025d798": "mario_execute_cutscene_action", + "8025dd70": "add_tree_leaf_particles", + "8025de1c": "play_climbing_sounds", + "8025df04": "set_pole_position", + "8025e21c": "act_holding_pole", + "8025e5a8": "act_climbing_pole", + "8025e7a4": "act_grab_pole_slow", + "8025e830": "act_grab_pole_fast", + "8025e930": "act_top_of_pole_transition", + "8025ea30": "act_top_of_pole", + "8025eb50": "perform_hanging_step", + "8025ecfc": "update_hang_moving", + "8025eed0": "update_hang_stationary", + "8025ef58": "act_start_hanging", + "8025f0b4": "act_hanging", + "8025f1e4": "act_hang_moving", + "8025f384": "let_go_of_ledge", + "8025f4b4": "func_8025F0DC", + "8025f560": "func_8025F188", + "8025f644": "update_ledge_climb", + "8025f6c0": "act_ledge_grab", + "8025f970": "act_ledge_climb_slow", + "8025fa64": "act_ledge_climb_down", + "8025fae8": "act_ledge_climb_fast", + "8025fb90": "act_grabbed", + "8025fc6c": "act_in_cannon", + "80260154": "act_tornado_twirling", + "80260568": "check_common_automatic_cancels", + "802605d0": "mario_execute_automatic_action", + "802608b0": "func_802604E0", + "80260aac": "func_802606DC", + "80260cb4": "act_idle", + "80260f94": "func_80260BC4", + "80261000": "act_start_sleeping", + "80261268": "act_sleeping", + "802614fc": "act_waking_up", + "8026168c": "act_shivering", + "802618d8": "act_coughing", + "802619d0": "func_802615C4", + "80261ad0": "func_802616C4", + "80261bf8": "act_standing_against_wall", + "80261cec": "act_in_quicksand", + "80261db4": "act_crouching", + "80261f70": "act_panting", + "80262080": "func_80261C74", + "8026217c": "func_80261D70", + "802621dc": "act_braking_stop", + "802622dc": "act_butt_slide_stop", + "80262398": "func_80261F8C", + "80262490": "act_slide_kick_slide_stop", + "80262530": "act_start_crouching", + "80262650": "act_stop_crouching", + "80262770": "act_start_crawling", + "80262890": "act_stop_crawling", + "80262980": "func_80262574", + "80262bc4": "func_802627B8", + "80262c34": "func_80262828", + "80262d68": "act_jump_land_stop", + "80262dc4": "act_double_jump_land_stop", + "80262e20": "act_side_flip_land_stop", + "80262e94": "act_freefall_land_stop", + "80262ef0": "act_triple_jump_land_stop", + "80262f50": "act_backflip_land_stop", + "80262fec": "act_lava_boost_land", + "8026305c": "act_long_jump_land_stop", + "802630f8": "func_80262CEC", + "802631f0": "func_80262DE4", + "802632e8": "act_air_throw_land", + "802633b4": "act_twirl_land", + "8026350c": "act_ground_pound_land", + "802635e8": "act_first_person", + "80263784": "func_80263378", + "80263898": "mario_execute_stationary_action", + "80263e60": "func_80263A50", + "80263ee4": "func_80263AD4", + "80264024": "func_80263C14", + "8026409c": "begin_walking_action", + "802640fc": "check_ledge_climb_down", + "802642b4": "slide_bonk", + "80264340": "set_triple_jump_action", + "8026440c": "update_sliding_angle", + "80264740": "update_sliding", + "80264b54": "apply_slope_accel", + "80264d80": "apply_landing_accel", + "80264e18": "update_shell_speed", + "80265080": "apply_slope_decel", + "802651b0": "update_decelerating_speed", + "80265244": "update_walking_speed", + "80265458": "should_begin_sliding", + "80265514": "analog_stick_held_back", + "80265558": "check_ground_dive_or_punch", + "80265620": "begin_braking_action", + "80265700": "func_802652F0", + "80265b1c": "func_8026570C", + "80265d90": "func_80265980", + "80265df8": "func_802659E8", + "80266038": "func_80265C28", + "802661cc": "func_80265DBC", + "80266354": "act_walking", + "802665b4": "act_move_punching", + "80266734": "act_hold_walking", + "8026699c": "act_hold_heavy_walking", + "80266af8": "act_turning_around", + "80266d4c": "act_finish_turning_around", + "80266e48": "act_braking", + "80266fc8": "act_decelerating", + "80267240": "act_hold_decelerating", + "80267504": "act_riding_shell_ground", + "80267728": "act_crawling", + "8026795c": "act_burning_ground", + "80267c24": "func_80267814", + "80267ce4": "common_slide_action", + "80267fa4": "common_slide_action_with_jump", + "80268074": "act_butt_slide", + "802680d4": "act_hold_butt_slide", + "80268168": "act_crouch_slide", + "80268338": "act_slide_kick_slide", + "802684ac": "stomach_slide_action", + "802685c0": "act_stomach_slide", + "80268608": "act_hold_stomach_slide", + "80268684": "act_dive_slide", + "802687b8": "common_ground_knockback_action", + "802689f8": "act_hard_backward_ground_kb", + "80268adc": "act_hard_forward_ground_kb", + "80268b64": "act_backward_ground_kb", + "80268bb0": "act_forward_ground_kb", + "80268bfc": "act_soft_backward_ground_kb", + "80268c48": "act_soft_forward_ground_kb", + "80268c94": "act_ground_bonk", + "80268d04": "act_death_exit_land", + "80268dcc": "common_landing_action", + "80268f78": "common_landing_cancels", + "80269108": "act_jump_land", + "80269170": "act_freefall_land", + "802691d8": "act_side_flip_land", + "80269264": "act_hold_jump_land", + "80269300": "act_hold_freefall_land", + "8026939c": "act_long_jump_land", + "8026947c": "act_double_jump_land", + "802694e4": "act_triple_jump_land", + "80269588": "act_backflip_land", + "80269640": "quicksand_jump_land_action", + "80269788": "act_quicksand_jump_land", + "802697dc": "act_hold_quicksand_jump_land", + "80269830": "check_common_moving_cancels", + "80269954": "mario_execute_moving_action", + "80269f40": "play_flip_sounds", + "80269fc0": "play_far_fall_sound", + "8026a090": "func_u_8026A090", + "8026a12c": "lava_boost_on_wall", + "8026a224": "check_fall_damage", + "8026a400": "check_kick_or_dive_in_air", + "8026a494": "should_get_stuck_in_ground", + "8026a598": "check_fall_damage_or_get_stuck", + "8026a62c": "check_horizontal_wind", + "8026a818": "update_air_with_turn", + "8026aa48": "update_air_without_turn", + "8026acd8": "update_lava_boost_or_twirling", + "8026ae5c": "update_flying_yaw", + "8026b004": "update_flying_pitch", + "8026b17c": "update_flying", + "8026b444": "common_air_action_step", + "8026b6a0": "act_jump", + "8026b740": "act_double_jump", + "8026b814": "act_triple_jump", + "8026b90c": "act_backflip", + "8026b9ac": "act_freefall", + "8026bab8": "act_hold_jump", + "8026bbb4": "act_hold_freefall", + "8026bcc0": "act_side_flip", + "8026bdcc": "act_wall_kick_air", + "8026be78": "act_long_jump", + "8026bf40": "act_riding_shell_air", + "8026c034": "act_twirling", + "8026c1e0": "act_dive", + "8026c4b8": "act_air_throw", + "8026c5d0": "act_water_jump", + "8026c738": "act_hold_water_jump", + "8026c880": "act_steep_jump", + "8026c9fc": "act_ground_pound", + "8026cd0c": "act_burning_jump", + "8026ce50": "act_burning_fall", + "8026cf28": "act_crazy_box_bounce", + "8026d1b0": "common_air_knockback_step", + "8026d33c": "func_8026CDFC", + "8026d3c8": "act_backward_air_kb", + "8026d43c": "act_forward_air_kb", + "8026d4b0": "act_hard_backward_air_kb", + "8026d508": "act_hard_forward_air_kb", + "8026d560": "act_thrown_backward", + "8026d608": "act_thrown_forward", + "8026d6fc": "act_soft_bonk", + "8026d770": "act_getting_blown", + "8026d988": "act_air_hit_wall", + "8026db54": "act_forward_rollout", + "8026dcf4": "act_backward_rollout", + "8026de98": "act_butt_slide_air", + "8026e088": "act_hold_butt_slide_air", + "8026e2b4": "act_lava_boost", + "8026e59c": "act_slide_kick", + "8026e810": "act_jump_kick", + "8026e968": "act_shot_from_cannon", + "8026ec00": "act_flying", + "8026f158": "act_riding_hoot", + "8026f2ec": "act_flying_triple_jump", + "8026f614": "act_top_of_pole_jump", + "8026f660": "act_vertical_wind", + "8026f840": "act_special_triple_jump", + "8026fa18": "check_common_airborne_cancels", + "8026fb04": "mario_execute_airborne_action", + "8027499c": "mario_execute_submerged_action", + "80274eb0": "animated_stationary_ground_step", + "80274f10": "mario_update_punch_sequence", + "80275328": "act_punching", + "8027546c": "act_picking_up", + "802755fc": "act_dive_picking_up", + "802756c8": "act_placing_down", + "80275794": "act_throwing", + "802758c0": "act_heavy_throw", + "802759b4": "act_stomach_slide_stop", + "80275a80": "act_picking_up_bowser", + "80275b34": "act_holding_bowser", + "80275e78": "act_releasing_bowser", + "80275f0c": "check_common_object_cancels", + "80275fe0": "mario_execute_object_action", + "802761d0": "geo_enfvx_main", + "802763d4": "geo_skybox_main", + "802764b0": "Geo18_802764B0", + "8027684c": "bhvToadMessage_loop", + "80276910": "bhvToadMessage_init", + "80276bb8": "bhvUnlockDoorStar_init", + "80276ccc": "bhvUnlockDoorStar_loop", + "802770a4": "Geo18_802770A4", + "80277150": "geo_switch_mario_stand_run", + "802771bc": "geo_switch_mario_eyes", + "80277294": "Geo18_80277294", + "802773a4": "Geo18_802773A4", + "802774f4": "geo_switch_mario_hand", + "802775cc": "Geo18_802775CC", + "802776d8": "geo_switch_mario_cap_effect", + "80277740": "geo_switch_mario_cap_on_off", + "80277824": "Geo18_80277824", + "8027795c": "geo_switch_mario_hand_grab_pos", + "80277b14": "geo_render_mirror_mario", + "80277d6c": "geo_mirror_mario_backface_culling", + "80277ee0": "set_segment_base_addr", + "80277f20": "get_segment_base_addr", + "80277f50": "segmented_to_virtual", + "80277fa8": "virtual_to_segmented", + "80277ff0": "move_segment_table_to_dmem", + "80278074": "main_pool_init", + "80278120": "main_pool_alloc", + "80278238": "main_pool_free", + "80278358": "main_pool_realloc", + "802783c8": "main_pool_available", + "802783e8": "main_pool_push_state", + "80278498": "main_pool_pop_state", + "8027868c": "load_segment", + "802786f0": "load_to_fixed_pool_addr", + "802787d8": "load_segment_decompress", + "802788b4": "func_80278304", + "80278974": "load_engine_code_segment", + "80278a14": "alloc_only_pool_init", + "80278ab8": "alloc_only_pool_alloc", + "80278b28": "alloc_only_pool_resize", + "80278b98": "mem_pool_init", + "80278c58": "mem_pool_alloc", + "80278d74": "mem_pool_free", + "80278f2c": "alloc_display_list", + "80279028": "func_80278A78", + "80279084": "func_80278AD4", + "80279840": "save_file_do_save", + "802798fc": "save_file_erase", + "80279960": "save_file_copy", + "802799dc": "save_file_load_all", + "80279bc8": "save_file_reload", + "80279c44": "save_file_collect_star_or_key", + "80279e44": "save_file_exists", + "80279e80": "save_file_get_max_coin_score", + "80279f80": "save_file_get_course_star_count", + "8027a010": "save_file_get_total_star_count", + "8027a0a8": "save_file_set_flags", + "8027a0f4": "save_file_clear_flags", + "8027a16c": "save_file_get_flags", + "8027a1c8": "save_file_get_star_flags", + "8027a23c": "save_file_set_star_flags", + "8027a310": "save_file_get_course_coin_score", + "8027a340": "save_file_is_cannon_unlocked", + "8027a390": "save_file_set_cannon_unlocked", + "8027a418": "save_file_set_cap_pos", + "8027a4ac": "save_file_get_cap_pos", + "8027a564": "save_file_set_sound_mode", + "8027a5b4": "save_file_get_sound_mode", + "8027a5d4": "save_file_move_cap_to_default_location", + "8027a698": "disable_warp_checkpoint", + "8027a6b0": "check_if_should_set_warp_checkpoint", + "8027a718": "check_warp_checkpoint", + "8027a7d0": "func_8027A220", + "8027a83c": "set_warp_transition_rgb", + "8027a8b0": "print_intro_text", + "8027a93c": "get_mario_spawn_type", + "8027a9c8": "area_get_warp_node", + "8027aa28": "func_8027A478", + "8027aa74": "func_8027A4C4", + "8027ab04": "clear_areas", + "8027ad74": "func_8027A7C4", + "8027ae44": "load_area", + "8027af48": "func_8027A998", + "8027afbc": "load_mario_area", + "8027b038": "func_8027AA88", + "8027b0c0": "change_area", + "8027b164": "area_update_objects", + "8027b1a0": "play_transition", + "8027b35c": "play_transition_after_delay", + "8027b3b4": "render_game", + "8027cf38": "geo_set_animation_globals", + "8027da84": "geo_process_held_object", + "8027de68": "geo_try_process_children", + "8027dea8": "geo_process_node_and_siblings", + "8027e130": "geo_process_root", + "8027e3e0": "profiler_log_thread5_time", + "8027e490": "profiler_log_thread4_time", + "8027e520": "profiler_log_gfx_time", + "8027e5cc": "profiler_log_vblank_time", + "8027e65c": "draw_profiler_bar", + "8027e958": "draw_reference_profiler_bars", + "8027ebcc": "draw_profiler_mode_1", + "8027eeac": "draw_profiler_mode_0", + "8027f460": "draw_profiler", + "8027f4e0": "decompress", + "8027f590": "set_camera_shake", + "8027f8b8": "set_camera_shake_2", + "8027f9f0": "func_8027F440", + "8027fb74": "unused_set_camera_shake", + "8027fc18": "return_height_above_floor", + "8027fe20": "set_cam_focus_and_pos_rel_mario", + "8027fff8": "set_camera_height", + "80280368": "return_pitch_parallel_floor", + "802804f4": "func_8027FF44", + "802806a4": "find_in_bounds_yaw_wdw_bob_thi", + "80280810": "return_open_camera_yaw", + "80280970": "return_platform_camera_yaw", + "80280b00": "func_80280550", + "80281188": "func_80280BD8", + "802813bc": "func_80280E0C", + "802813ec": "func_80280E3C", + "8028146c": "update_open_camera", + "80281588": "update_platform_level_camera", + "802816a0": "return_reverse_tower_camera_yaw", + "802817fc": "update_reverse_tower_camera", + "80281904": "return_parallel_tracking_camera_yaw", + "80282280": "return_fixed_camera_yaw", + "802826a0": "return_boss_fight_camera_yaw", + "80282c0c": "unused_return_mode_5_camera_yaw", + "80282c28": "unused_80282678", + "80282c3c": "update_boss_fight_camera", + "80282c7c": "update_parallel_tracking_camera", + "80282ce0": "update_fixed_camera", + "80282d78": "return_behind_mario_camera_yaw", + "80283340": "return_behind_mario_water_camera_yaw", + "80283578": "return_slide_camera_yaw", + "802839e4": "update_behind_mario_camera", + "80283a18": "nop_return_water_camera_yaw", + "80283a34": "update_water_surface_camera", + "80283a68": "return_mario_yaw", + "80283af8": "return_close_or_free_roam_cam_yaw", + "80284cb8": "update_close_or_free_roam_camera", + "80284cfc": "camera_lakitu_zoom_distance", + "80284d38": "camera_mario_zoom_distance", + "80284d74": "return_spiral_stairs_camera_yaw", + "802850ac": "update_spiral_stairs_camera", + "802850ec": "return_slide_or_0f_camera_yaw", + "802851dc": "update_slide_camera", + "8028526c": "func_80284CBC", + "802852f4": "func_80284D44", + "80285370": "exit_c_up_mode", + "80285808": "return_first_person_camera_yaw", + "802858a4": "operate_c_up_looking", + "80285a2c": "func_8028547C", + "80285d20": "update_c_up_camera", + "80285ed8": "return_cannon_camera_yaw", + "80285f60": "update_cannon_camera", + "8028603c": "init_transitional_movement", + "80286088": "set_camera_preset", + "80286188": "func_80285BD8", + "80286420": "func_80285E70", + "802868f8": "update_camera", + "80286f68": "reset_camera", + "8028724c": "init_camera", + "802879ec": "func_80287404", + "80287bc4": "select_mario_cam_mode", + "80287be0": "func_802875F8", + "80287cb8": "func_802876D0", + "80287d30": "geo_camera_preset_and_pos", + "80287dc0": "dummy_802877D8", + "80287dd4": "dummy_802877EC", + "80287de8": "vec3f_sub", + "80287e28": "object_pos_to_vec3f", + "80287e50": "vec3f_to_object_pos", + "80287e78": "unused_object_angle_to_vec3s", + "80287ea0": "evaluate_cubic_spline", + "802882e4": "move_point_along_spline", + "80288624": "select_or_activate_mario_cam", + "80288718": "test_or_set_mario_cam_active", + "80288888": "set_spline_values", + "802889b0": "set_face_angle_from_spline", + "80288ce4": "find_c_buttons_pressed", + "80288e68": "update_camera_status", + "80288f5c": "find_and_return_count_wall_collisions", + "80289198": "vec3f_compare", + "80289214": "clamp_pitch", + "802892d8": "is_within_100_units_of_mario", + "8028935c": "set_or_approach_f32_exponential", + "802893f4": "approach_f32_exponential_bool", + "80289488": "approach_f32_exponential", + "802894b4": "approach_s16_exponential_bool", + "8028956c": "approach_s16_exponential", + "80289610": "approach_vec3f_exponential", + "80289684": "set_or_approach_vec3f_exponential", + "802896f8": "approach_vec3s_exponential", + "8028976c": "camera_approach_s16_symmetric_bool", + "8028984c": "camera_approach_s16_symmetric", + "8028993c": "set_or_approach_s16_symmetric", + "802899cc": "camera_approach_f32_symmetric_bool", + "80289b0c": "camera_approach_f32_symmetric", + "80289c00": "random_vec3s", + "80289d20": "func_80289738", + "80289f88": "clamp_positions_and_find_yaw_angle", + "8028a080": "func_80289A98", + "8028a0f4": "is_pos_less_than_bounds", + "8028a4ec": "is_behind_surface", + "8028a6bc": "func_8028A0D4", + "8028a7ec": "is_mario_behind_surface", + "8028a834": "scale_along_line", + "8028a8e8": "check_if_vector_fits_in_bounds", + "8028aa28": "calculate_verticle_angle", + "8028aad8": "calculate_yaw", + "8028ab60": "calculate_angles", + "8028ac28": "calc_abs_dist", + "8028accc": "calc_hor_dist", + "8028ad4c": "rotate_in_xz", + "8028ae1c": "rotate_in_yz", + "8028aef0": "set_camera_pitch_shake", + "8028af4c": "set_camera_yaw_shake", + "8028b00c": "set_camera_roll_shake", + "8028b068": "func_8028AA80", + "8028b11c": "Unknown8028AB34", + "8028b1d0": "increment_shake_offset", + "8028b218": "shake_camera_pitch", + "8028b32c": "shake_camera_yaw", + "8028b438": "shake_camera_roll", + "8028b50c": "func_8028AF24", + "8028b724": "func_8028B13C", + "8028b754": "func_8028B16C", + "8028b784": "play_camera_buzz_if_cdown", + "8028b7c4": "play_camera_buzz_if_cbutton", + "8028b804": "play_camera_buzz_if_c_sideways", + "8028b850": "play_sound_cbutton_up", + "8028b884": "play_sound_cbutton_down", + "8028b8b8": "play_sound_cbutton_side", + "8028b8ec": "play_sound_button_change_blocked", + "8028b920": "play_sound_rbutton_changed", + "8028b954": "func_8028B36C", + "8028b9c4": "func_8028B3DC", + "8028bd34": "stop_mario", + "8028bd98": "handle_c_button_movement", + "8028c038": "func_8028BA38", + "8028c13c": "set_camera_cutscene_table", + "8028c18c": "determine_star_fadeout_cutscene_table", + "8028c26c": "return_table_door_push_or_pull", + "8028c2c8": "return_cutscene_table", + "8028c7a0": "instant_warp_camera_update", + "8028c8f0": "approach_camera_height", + "8028c9ac": "Unknown8028C3AC", + "8028c9cc": "set_focus_position", + "8028cbf0": "set_pos_from_face_angle_and_vec3f", + "8028cd94": "set_pos_from_face_angle_and_rel_coords", + "8028cdec": "determine_pushing_or_pulling_door", + "8028ce24": "func_8028C824", + "8028d44c": "set_camera_preset_fixed_ref_point", + "8028d5ac": "set_camera_preset_platform_level", + "8028d5fc": "set_camera_preset_boss_fight", + "8028d658": "set_camera_preset_close_cam", + "8028d698": "set_camera_preset_open_camera", + "8028d79c": "parallel_tracking_init", + "8028d888": "set_fixed_cam_axis_sa_lobby", + "8028d92c": "func_8028D32C", + "8028da18": "CameraRR00", + "8028da50": "CameraRR04", + "8028daec": "CameraRR02", + "8028db38": "CameraRR0305", + "8028dbb4": "CameraRR01", + "8028dbf4": "CameraCotMC00", + "8028dc1c": "CameraSL00", + "8028dc70": "camera_change_set_free_roam_mode", + "8028dca4": "move_camera_through_floor_while_descending", + "8028dd48": "camera_change_hmc_maze_entrance", + "8028de2c": "CameraHMC02", + "8028de5c": "CameraHMC03", + "8028de90": "CameraHMC04", + "8028dec4": "CameraHMC05", + "8028def8": "CameraSSL00", + "8028df24": "CameraSSL0102", + "8028df6c": "CameraSSL03", + "8028dfb4": "CameraTHI00", + "8028dfe8": "CameraTHI01", + "8028e01c": "CameraRR07", + "8028e064": "CameraRR08", + "8028e098": "camera_change_hmc_cotmc_pool_entry", + "8028e0ec": "CameraInside20", + "8028e164": "CameraInside1E", + "8028e210": "CameraInside1F", + "8028e298": "CameraInside01", + "8028e300": "CameraInside1213", + "8028e38c": "CameraInside00", + "8028e3b8": "CameraInside0E", + "8028e3f0": "CameraInside0F", + "8028e41c": "bbh_room_6_camera", + "8028e450": "CameraBBH24", + "8028e47c": "CameraBBH2E2F", + "8028e524": "bbh_room_1_camera", + "8028e55c": "CameraBBH01", + "8028e594": "bbh_room_2_lower_camera", + "8028e5cc": "bbh_room_4_camera", + "8028e604": "bbh_room_8_camera", + "8028e63c": "bbh_room_5_library_camera", + "8028e674": "bbh_room_5_library_to_hidden_transition", + "8028e6c4": "bbh_room_5_hidden_to_library_transition", + "8028e714": "bbh_room_5_hidden_camera", + "8028e758": "bbh_room_3_camera", + "8028e790": "bbh_room_7_mr_i_camera", + "8028e7c8": "bbh_room_7_mr_i_to_coffins_transition", + "8028e818": "bbh_room_7_coffins_to_mr_i_transition", + "8028e868": "CameraBBH3033", + "8028e8a0": "CameraBBH34", + "8028e8cc": "CameraBBH38", + "8028e930": "bbh_room_12_upper_camera", + "8028e974": "CameraBBH00", + "8028e9a0": "bbh_room_2_library_camera", + "8028e9d8": "bbh_room_2_library_to_trapdoor_transition", + "8028ea28": "bbh_room_2_trapdoor_camera", + "8028ea60": "bbh_room_2_trapdoor_transition", + "8028eab0": "bbh_room_9_attic_camera", + "8028eae8": "bbh_room_9_attic_transition", + "8028eb38": "bbh_room_9_mr_i_transition", + "8028eb88": "bbh_room_13_balcony_camera", + "8028ebc0": "bbh_room_0_camera", + "8028ec04": "camera_change_activate_ccm_slide_flag", + "8028ec2c": "camera_change_deactivate_ccm_slide_flag", + "8028ec58": "surface_type_presets", + "8028ed30": "set_preset_via_surface_or_input", + "8028ed98": "surface_type_presets_thi", + "8028eeb0": "level_specific_camera_update", + "8028f670": "resolve_geometry_collisions", + "8028f914": "func_8028F2F0", + "8028fc9c": "find_mario_relative_geometry", + "8028fe24": "func_8028F800", + "8028fe58": "func_8028F834", + "8028fe84": "unused_8028F860", + "8028ff04": "cutscene_object_with_dialog", + "8028ffc8": "cutscene_object_without_dialog", + "8029000c": "cutscene_object", + "80290098": "set_cam_yaw_from_focus_and_pos", + "802900e0": "func_8028FABC", + "80290104": "func_8028FAE0", + "80290168": "cap_switch_save", + "802901a4": "func_8028FB80", + "802901fc": "func_8028FBD8", + "802903b8": "func_8028FD94", + "802904a8": "CutsceneIntroPeach0_2", + "802904e4": "CutsceneIntroPeach2_1", + "8029051c": "func_8028FEDC", + "8029053c": "move_credits_camera", + "80290784": "func_80290144", + "802907f4": "func_802901B4", + "80290864": "func_80290224", + "802908e8": "func_802902A8", + "802909d0": "rotate_camera", + "80290a5c": "CutsceneEnterSomething8029041C", + "80290abc": "rotate_and_move_vec3f", + "80290b54": "func_80290514", + "80290ba4": "func_80290564", + "80290bd8": "func_80290598", + "80290c08": "unused_802905C8", + "80290c1c": "Cutscene0FTodo0", + "80290c30": "Cutscene0FTodo1", + "80290c44": "CutscenePeachEnd0_1", + "80290c9c": "CutscenePeachEnd0_2", + "80290d90": "CutscenePeachEnd0", + "80290e00": "CutscenePeachEnd2", + "80290e74": "CutscenePeachEndCommon367A", + "80290eb0": "CutscenePeachEnd3_1", + "80290f1c": "CutscenePeachEnd3", + "80290f8c": "CutscenePeachEnd1", + "80291074": "CutscenePeachEnd4_1", + "80291108": "CutscenePeachEnd4", + "802911c8": "CutscenePeachEnd5_1", + "80291208": "CutscenePeachEnd5_2", + "8029127c": "CutscenePeachEnd5_3", + "802912b8": "CutscenePeachEnd5_4", + "80291354": "CutscenePeachEnd5", + "8029142c": "CutscenePeachEnd6", + "802914cc": "CutscenePeachEnd7_1", + "80291514": "CutscenePeachEnd7", + "802915d4": "CutscenePeachEnd8", + "80291654": "CutscenePeachEnd9_1", + "802916b8": "CutscenePeachEnd9_2", + "80291774": "CutscenePeachEnd9", + "802917e4": "CutscenePeachEndA_1", + "8029184c": "CutscenePeachEndA_2", + "80291870": "CutscenePeachEndA", + "80291924": "CutscenePeachEndB", + "80291964": "CutsceneGrandStar0_1", + "802919dc": "CutsceneGrandStar0_2", + "80291ab4": "CutsceneGrandStar0_4", + "80291b18": "CutsceneGrandStar0_5", + "80291b68": "CutsceneGrandStar0_6", + "80291bf4": "CutsceneGrandStar0_7", + "80291c3c": "CutsceneGrandStar0_3", + "80291cd0": "CutsceneGrandStar0", + "80291db0": "CutsceneGrandStar1_1", + "80291e84": "CutsceneGrandStar1_2", + "80291f18": "CutsceneGrandStar1_3", + "80292038": "CutsceneGrandStar1_4", + "80292164": "CutsceneGrandStar1", + "802921fc": "func_80291BBC", + "8029228c": "CutsceneDanceCommon", + "80292324": "CutsceneStarDance1_4", + "80292370": "CutsceneStarDance1_5", + "802923b8": "CutsceneStarDance1_6", + "80292400": "dummy_80291DC0", + "80292414": "CutsceneStarDance1_1", + "8029244c": "CutsceneStarDance1_3", + "80292484": "CutsceneStarDance1_2", + "802924b8": "CutsceneStarDance1", + "80292628": "func_80291FE8", + "802926dc": "CutsceneStarDance3_1", + "802927d0": "CutsceneStarDance3_2", + "80292868": "CutsceneStarDance3_3", + "80292974": "CutsceneStarDance3_4", + "80292a20": "CutsceneStarDance3_5", + "80292a4c": "CutsceneStarDance3_6", + "80292a80": "CutsceneStarDance3", + "80292c00": "CutsceneStarDance2_1", + "80292d80": "CutsceneStarDance2_3", + "80292e2c": "CutsceneStarDance2_2", + "80292ec4": "func_80292884", + "80292f40": "CutsceneStarDance2_4", + "80292f98": "CutsceneStarDance2_5", + "80292fe4": "CutsceneStarDance2_6", + "80293018": "CutsceneStarDance2", + "802930f0": "CutsceneKeyDance0_6", + "80293164": "CutsceneKeyDance0_2", + "802931c0": "CutsceneKeyDance0_3", + "80293220": "CutsceneKeyDance0_4", + "8029328c": "CutsceneKeyDance0_5", + "802932f4": "CutsceneKeyDance0_7", + "80293328": "CutsceneKeyDance0_8", + "80293354": "CutsceneKeyDance0_1", + "8029338c": "CutsceneKeyDance0", + "80293488": "CutsceneEnterBowserPlatform0_4", + "802934b4": "CutsceneEnterBowserPlatform0_3", + "802934d8": "CutsceneEnterBowserPlatform0_5", + "80293548": "CutsceneEnterBowserPlatform0_8", + "802935e0": "CutsceneEnterBowserPlatform0_9", + "80293624": "CutsceneEnterBowserPlatform0_7", + "8029369c": "CutsceneEnterBowserPlatform0_6", + "802936dc": "CutsceneEnterBowserPlatform0_1", + "80293708": "func_802930C8", + "80293734": "CutsceneEnterBowserPlatform0_2", + "802937e8": "bowser_fight_intro_dialog", + "8029386c": "CutsceneEnterBowserPlatform1", + "802938c8": "CutsceneEnterBowserPlatform2", + "80293944": "CutsceneEnterBowserPlatform0", + "80293abc": "CutsceneStarSpawn0_1", + "80293ae8": "CutsceneStarSpawn0_2", + "80293b70": "CutsceneStarSpawn1_1", + "80293bf4": "CutsceneStarSpawn1_2", + "80293c2c": "CutsceneStarSpawn0", + "80293cb0": "CutsceneStarSpawn1", + "80293d5c": "CutsceneStarSpawn2", + "80293d90": "CutsceneExitWaterfall0_1", + "80293dd4": "Cutscene80293794", + "80293e7c": "CutsceneExitWaterfall0", + "80293ed8": "CutsceneFallCommon1", + "80293f2c": "CutsceneFallToCastleGrounds0_1", + "80293f70": "CutsceneFallToCastleGrounds0", + "80293fcc": "CutsceneSpecialStarSpawn0_1", + "80294024": "CutsceneSpecialStarSpawn0_3", + "80294088": "CutsceneSpecialStarSpawn0_4", + "802940cc": "CutsceneSpecialStarSpawn0_5", + "8029410c": "CutsceneSpecialStarSpawn0_2", + "802942cc": "CutsceneSpecialStarSpawn0_6", + "802942f0": "CutsceneSpecialStarSpawn0", + "802943d4": "CutsceneSpecialStarSpawn1", + "80294428": "func_80293DE8", + "80294718": "CutscenePrepareCannon0_1", + "802947a4": "CutscenePrepareCannon0_2", + "8029480c": "func_802941CC", + "802948a0": "CutscenePrepareCannon0_3", + "80294a14": "CutscenePrepareCannon0", + "80294a94": "CutscenePrepareCannon1", + "80294ae8": "func_802944A8", + "80294b78": "func_80294538", + "80294bb4": "CutsceneDeath1_1", + "80294c28": "CutsceneDeath1_2", + "80294c5c": "CutsceneDeath1", + "80294cc4": "CutsceneDeath2_1", + "80294d48": "CutsceneDeath2_2", + "80294db4": "CutsceneDeath2", + "80294e24": "CutsceneBBHDeath0_1", + "80294ea8": "CutsceneBBHDeath0_2", + "80294ee8": "CutsceneBBHDeath0", + "80294f58": "CutsceneQuicksandDeath0_1", + "80294f94": "CutsceneQuicksandDeath0_2", + "80294fec": "CutsceneQuicksandDeath0", + "802950b0": "Cutscene1ATodo0_3", + "80295140": "Cutscene1ATodo0_2", + "802951f0": "Cutscene1ATodo0_1", + "80295270": "Cutscene1ATodo0", + "80295310": "CutsceneEnterPool0_1", + "802953dc": "CutsceneEnterPool0_2", + "80295418": "CutsceneEnterPool0", + "80295480": "Cutscene26Todo1_1", + "802954ec": "Cutscene26Todo1_5", + "80295518": "Cutscene26Todo1_2", + "80295580": "Cutscene26Todo1_3", + "80295670": "Cutscene26Todo1_4", + "80295740": "Cutscene26Todo1_7", + "8029576c": "Cutscene26Todo1_6", + "802957c8": "Cutscene26Todo1", + "80295894": "Cutscene26Todo2", + "802958d4": "CutsceneEnterPyramidTop0_1", + "80295930": "CutsceneEnterPyramidTop0", + "80295a58": "CutsceneDialog0_1", + "80295bf0": "CutsceneDialog0_2", + "80295e24": "CutsceneDialog0_3", + "80295e8c": "CutsceneDialog0", + "80295fb0": "CutsceneDialog1", + "80295fd8": "CutsceneDialog2", + "80296020": "CutsceneReadMessage0_1", + "80296160": "CutsceneReadMessage0", + "802962c8": "CutsceneReadMessage1", + "802962f0": "CutsceneReadMessage2", + "80296318": "CutsceneExitSuccess1", + "802963b8": "CutsceneExitSuccess2", + "8029652c": "CutsceneExitSuccess4", + "8029665c": "CutsceneExitSuccess3", + "8029669c": "CutsceneExitBowserSuccess0_1", + "802966e4": "CutsceneExitSuccess5", + "80296710": "CutsceneExitBowserSuccess0", + "802967c4": "CutsceneExitNonPainting1", + "8029685c": "CutsceneBBHExitSuccess0_1", + "802968a0": "CutsceneBBHExitSuccess0", + "8029695c": "CutsceneNonPaintingDeath0_1", + "802969f8": "Cutscene1CTodo_0", + "80296a64": "CutsceneNonPaintingDeath0_2", + "80296b30": "CutsceneNonPaintingDeath0", + "80296bc8": "CutsceneCapSwitchPress0_1", + "80296c4c": "CutsceneCapSwitchPress0_4", + "80296d60": "CutsceneCapSwitchPress0_5", + "80296da8": "CutsceneCapSwitchPress0_2", + "80296eb4": "CutsceneCapSwitchPress0_3", + "80296f38": "CutsceneCapSwitchPress0_6", + "80296fa8": "CutsceneCapSwitchPress0", + "80297148": "CutsceneUnlockKeyDoor0_1", + "8029720c": "CutsceneUnlockKeyDoor0_2", + "80297290": "CutsceneUnlockKeyDoor0_5", + "802972ec": "CutsceneUnlockKeyDoor0_6", + "80297300": "CutsceneUnlockKeyDoor0_3", + "80297384": "CutsceneUnlockKeyDoor0_4", + "802973b0": "CutsceneUnlockKeyDoor0", + "80297464": "intro_peach_move_camera_start_to_pipe", + "80297560": "peach_letter_text", + "8029758c": "play_sound_peach_reading_letter", + "802975c4": "CutsceneIntroPeachCommon", + "8029762c": "CutsceneIntroPeach4", + "802976bc": "CutsceneIntroPeach3_2", + "80297728": "CutsceneIntroPeach2_2", + "80297748": "CutsceneIntroPeach0_1", + "80297784": "CutsceneIntroPeach3_1", + "802977c8": "CutsceneIntroPeach3_3", + "802977f4": "intro_pipe_exit_text", + "80297820": "play_sound_intro_turn_on_hud", + "8029784c": "CutsceneIntroPeach2", + "80297908": "CutsceneIntroPeach3", + "80297a38": "CutsceneIntroPeach1", + "80297a64": "CutsceneIntroPeach0", + "80297b58": "CutsceneEndWaving0_1", + "80297b84": "CutsceneEndWaving0", + "80297c14": "CutsceneCredits0_1", + "80297c40": "CutsceneCredits0", + "802980dc": "CutsceneSlidingDoorsOpen0_1", + "8029819c": "CutsceneSlidingDoorsOpen0_2", + "80298218": "CutsceneSlidingDoorsOpen0_3", + "80298254": "CutsceneSlidingDoorsOpen0_4", + "80298290": "CutsceneSlidingDoorsOpen0_5", + "802983b4": "CutsceneSlidingDoorsOpen0", + "80298458": "CutsceneDoubleDoorsOpen1", + "802984a0": "CutsceneEnterPainting0_1", + "802984b4": "CutsceneEnterPainting0", + "802987b0": "CutsceneExitPainting80298094", + "8029894c": "CutsceneExitPainting80298230", + "802989e8": "CutsceneExitPainting802982CC", + "80298af8": "CutsceneExitPainting0", + "80298ba0": "Cutscene11Todo_0", + "80298c2c": "Cutscene11Todo_1", + "80298ccc": "CutsceneExitPainting1", + "80298d44": "CutsceneEnterCannon2", + "80298d9c": "CutsceneEnterCannon1", + "80298fe8": "CutsceneEnterCannon0", + "80299100": "CutsceneDoor0", + "80299154": "CutsceneDoor1", + "802991a8": "CutsceneDoorWarp1", + "802991f0": "CutsceneDoor2", + "802992cc": "CutsceneDoor3", + "80299360": "CutsceneDoor4", + "80299404": "CutsceneDoorAB_2", + "802994e8": "handle_cutscenes", + "8029a2f8": "call_cutscene_func_in_time_range", + "8029a37c": "set_cutscene_phase_at_frame", + "8029a3b4": "func_80299C98", + "8029a41c": "func_80299D00", + "8029a4d0": "func_80299DB4", + "8029a5e8": "set_fov_30", + "8029a60c": "approach_fov_20", + "8029a64c": "set_fov_45", + "8029a670": "set_fov_29", + "8029a694": "zoom_fov_30", + "8029a6f4": "zoom_fov_for_sleep", + "8029a858": "approach_fov_30", + "8029a894": "approach_fov_60", + "8029a8d0": "approach_fov_45", + "8029a968": "approach_fov_80", + "8029a9a4": "func_8029A288", + "8029aa3c": "geo_camera_fov", + "8029ab94": "set_fov_function", + "8029abb0": "func_8029A494", + "8029ac30": "func_8029A514", + "8029aef8": "func_8029A7DC", + "8029af98": "intro_peach_set_pos_and_opacity", + "8029b08c": "bhv_intro_peach_loop", + "8029b28c": "intro_lakitu_set_offset_from_camera", + "8029b358": "intro_lakitu_set_focus", + "8029b3c8": "intro_lakitu_set_pos_and_focus", + "8029b49c": "bhv_intro_lakitu_loop", + "8029bde4": "bhv_end_birds_1_loop", + "8029bf64": "bhv_end_birds_2_loop", + "8029c0e4": "func_8029B964", + "8029c254": "bhv_intro_scene_loop", + "8029c770": "nop_change_course", + "8029c780": "copy_mario_state_to_object", + "8029c9cc": "spawn_particle", + "8029ca58": "bhv_mario_update", + "8029cb34": "update_objects_starting_at", + "8029cbc8": "update_objects_during_time_stop", + "8029cd28": "update_objects_in_list", + "8029cd98": "unload_deactivated_objects_in_list", + "8029ce58": "set_object_respawn_info_bits", + "8029cedc": "unload_objects_from_area", + "8029cfb0": "spawn_objects_from_info", + "8029d1d8": "stub_8029CA50", + "8029d1e8": "clear_objects", + "8029d324": "update_terrain_objects", + "8029d374": "update_non_terrain_objects", + "8029d428": "unload_deactivated_objects", + "8029d690": "update_objects", + "8029d890": "Geo18_8029D890", + "8029d924": "Geo18_8029D924", + "8029db48": "geo_switch_anim_state", + "8029dbd4": "geo_switch_area", + "8029dcd4": "func_8029D558", + "8029dda8": "apply_object_scale_to_matrix", + "8029de80": "func_8029D704", + "8029e1b0": "set_object_held_state", + "8029e27c": "lateral_dist_between_objects", + "8029e2f8": "dist_between_objects", + "8029e398": "obj_forward_vel_approach_upward", + "8029e3e8": "approach_f32_signed", + "8029e494": "approach_f32_symmetric", + "8029e530": "approach_s16_symmetric", + "8029e5ec": "obj_rotate_yaw_toward", + "8029e694": "angle_to_object", + "8029e714": "obj_turn_toward_object", + "8029e8bc": "set_object_parent_relative_pos", + "8029e914": "set_object_pos", + "8029e96c": "set_object_angle", + "8029e9ac": "spawn_object_abs_with_rot", + "8029ea24": "spawn_object_rel_with_rot", + "8029eaac": "Unknown8029E330", + "8029eb04": "spawn_water_splash", + "8029ed20": "spawn_object_at_origin", + "8029edcc": "spawn_object", + "8029ee24": "try_to_spawn_object", + "8029eeb8": "spawn_object_with_scale", + "8029ef64": "spawn_object_relative", + "8029effc": "spawn_object_relative_with_scale", + "8029f070": "obj_move_using_vel", + "8029f0c8": "copy_object_graph_y_offset", + "8029f0e0": "copy_object_pos_and_angle", + "8029f120": "copy_object_pos", + "8029f148": "copy_object_angle", + "8029f188": "func_8029EA0C", + "8029f1b0": "Unknown8029EA34", + "8029f200": "linear_mtxf_mul_vec3f", + "8029f274": "linear_mtxf_transpose_mul_vec3f", + "8029f2ec": "apply_scale_to_object_transform", + "8029f3a8": "copy_object_scale", + "8029f3d0": "scale_object_xyz", + "8029f404": "scale_object", + "8029f430": "obj_scale", + "8029f464": "SetObjAnimation", + "8029f4b4": "set_obj_animation_and_sound_state", + "8029f514": "func_8029ED98", + "8029f59c": "func_8029EE20", + "8029f600": "obj_enable_rendering_and_become_tangible", + "8029f620": "obj_enable_rendering", + "8029f644": "obj_disable_rendering_and_become_intangible", + "8029f66c": "obj_disable_rendering", + "8029f694": "obj_unhide", + "8029f6bc": "obj_hide", + "8029f6e0": "obj_set_pos_relative", + "8029f7d8": "obj_set_pos_relative_to_parent", + "8029f820": "obj_enable_rendering_2", + "8029f848": "obj_unused_init_on_floor", + "8029f8ec": "obj_set_facing_to_move_angles", + "8029f914": "get_object_list_from_behavior", + "8029f95c": "obj_nearest_object_with_behavior", + "8029f998": "obj_dist_to_nearest_object_with_behavior", + "8029f9ec": "obj_find_nearest_object_with_behavior", + "8029fb1c": "find_unimportant_object", + "8029fb68": "count_unimportant_objects", + "8029fbdc": "count_objects_with_behavior", + "8029fc9c": "obj_find_nearby_held_actor", + "8029fdb4": "obj_change_action", + "8029fe00": "func_8029F684", + "8029fe6c": "func_8029F6F0", + "8029fea4": "func_8029F728", + "8029ff04": "func_8029F788", + "8029ffa4": "func_8029F828", + "802a0008": "obj_check_anim_frame", + "802a0050": "obj_check_anim_frame_in_range", + "802a00ac": "Unknown8029F930", + "802a0114": "mario_is_in_air_action", + "802a0154": "mario_is_dive_sliding", + "802a0198": "func_8029FA1C", + "802a01d8": "func_8029FA5C", + "802a0380": "obj_get_thrown_or_placed", + "802a0474": "obj_get_dropped", + "802a04c0": "obj_set_model", + "802a04f0": "mario_set_flag", + "802a0514": "obj_clear_interact_status_flag", + "802a0568": "mark_object_for_deletion", + "802a057c": "obj_disable", + "802a05b4": "obj_become_intangible", + "802a05d4": "obj_become_tangible", + "802a05f0": "make_object_tangible", + "802a0604": "obj_update_floor_height", + "802a064c": "obj_update_floor_height_and_get_floor", + "802a079c": "obj_apply_drag_xz", + "802a0e68": "obj_move_y", + "802a113c": "obj_unused_resolve_wall_collisions", + "802a11a8": "abs_angle_diff", + "802a120c": "obj_move_xz_using_fvel_and_yaw", + "802a12a4": "obj_move_y_with_terminal_vel", + "802a1308": "obj_compute_vel_xz", + "802a1370": "func_802A0BF4", + "802a1424": "are_objects_collided", + "802a148c": "obj_set_behavior", + "802a14c4": "set_object_behavior", + "802a14fc": "obj_has_behavior", + "802a1554": "object_has_behavior", + "802a15ac": "obj_lateral_dist_from_mario_to_home", + "802a1634": "obj_lateral_dist_to_home", + "802a16ac": "obj_outside_home_square", + "802a1774": "obj_outside_home_rectangle", + "802a184c": "obj_set_pos_to_home", + "802a188c": "obj_set_pos_to_home_and_stop", + "802a18dc": "obj_shake_y", + "802a1930": "func_802A11B4", + "802a1960": "Unknown802A11E4", + "802a19ac": "obj_set_billboard", + "802a19c8": "obj_set_hitbox_radius_and_height", + "802a19f0": "obj_set_hurtbox_radius_and_height", + "802a1b34": "spawn_object_loot_blue_coins", + "802a1b8c": "spawn_object_loot_yellow_coins", + "802a1bdc": "obj_spawn_loot_coin_at_mario_pos", + "802a1c68": "obj_abs_y_dist_to_home", + "802a1cc4": "Unknown802A1548", + "802a1f3c": "obj_resolve_wall_collisions", + "802a2320": "obj_update_floor_and_walls", + "802a2348": "obj_move_standard", + "802a25b4": "obj_move_using_vel_and_gravity", + "802a2644": "obj_move_using_fvel_and_gravity", + "802a2674": "set_object_pos_relative", + "802a2748": "obj_angle_to_home", + "802a27b0": "func_802A2008", + "802a2804": "translate_object_local", + "802a2930": "build_object_transform_from_pos_and_angle", + "802a2a18": "func_802A2270", + "802a2a84": "build_object_transform_relative_to_parent", + "802a2b28": "Unknown802A2380", + "802a2b6c": "obj_rotate_move_angle_using_vel", + "802a2bc4": "obj_rotate_face_angle_using_vel", + "802a2c1c": "obj_set_face_angle_to_move_angle", + "802a2c5c": "obj_follow_path", + "802a2ed4": "chain_segment_init", + "802a2f14": "random_f32_around_zero", + "802a2f5c": "scale_object_random", + "802a2fc0": "translate_object_xyz_random", + "802a308c": "translate_object_xz_random", + "802a31e0": "func_802A2A38", + "802a3268": "obj_reflect_move_angle_off_wall", + "802a32ac": "obj_spawn_particles", + "802a34a4": "set_object_hitbox", + "802a3604": "signum_positive", + "802a3634": "absf", + "802a3674": "absi", + "802a36a4": "obj_wait_then_blink", + "802a3754": "obj_is_mario_ground_pounding_platform", + "802a37ac": "func_802A3004", + "802a37dc": "func_802A3034", + "802a3818": "obj_push_mario_away", + "802a390c": "obj_push_mario_away_from_cylinder", + "802a399c": "BehDustSmokeLoop", + "802a3a4c": "func_802A32A4", + "802a3a88": "func_802A32E0", + "802a3b40": "func_802A3398", + "802a3c18": "func_802A3470", + "802a3cfc": "obj_is_mario_on_platform", + "802a3d40": "obj_shake_y_until", + "802a3dd4": "func_802A362C", + "802a3e30": "obj_call_action_function", + "802a3ef8": "Unknown802A3750", + "802a3f24": "func_802A377C", + "802a3f48": "obj_mario_far_away", + "802a404c": "obj_is_mario_moving_fast_or_in_air", + "802a40b8": "item_in_array", + "802a4120": "bhv_init_room", + "802a4210": "obj_enable_rendering_if_mario_in_room", + "802a4360": "obj_set_hitbox_and_die_if_attacked", + "802a4440": "func_802A3C98", + "802a44f4": "set_object_collision_data", + "802a452c": "obj_if_hit_wall_bounce_away", + "802a4564": "obj_hide_if_mario_far_away_y", + "802a45e4": "Geo18_802A45E4", + "802a462c": "Unknown802A3E84", + "802a46cc": "obj_is_hidden", + "802a4704": "enable_time_stop", + "802a4728": "disable_time_stop", + "802a4750": "set_time_stop_flags", + "802a4774": "clear_time_stop_flags", + "802a47a0": "func_802A3FF8", + "802a48bc": "obj_is_mario_in_range_and_ready_to_speak", + "802a4960": "obj_update_dialog", + "802a4be4": "obj_update_dialog_with_cutscene", + "802a4f04": "obj_has_model", + "802a4f58": "obj_align_gfx_with_floor", + "802a5034": "mario_is_within_rectangle", + "802a50fc": "ShakeScreen", + "802a513c": "attack_collided_non_mario_object", + "802a51ac": "obj_was_attacked_or_ground_pounded", + "802a5228": "copy_object_behavior_params", + "802a5248": "func_802A4A70", + "802a5288": "func_802A4AB0", + "802a52c4": "func_802A4AEC", + "802a52f8": "obj_check_grabbed_mario", + "802a5358": "player_performed_grab_escape_action", + "802a540c": "obj_unused_play_footstep_sound", + "802a5460": "enable_time_stop_including_mario", + "802a5498": "disable_time_stop_including_mario", + "802a54d8": "obj_check_interacted", + "802a5524": "obj_spawn_loot_blue_coin", + "802a5588": "obj_spawn_star_at_y_offset", + "802a5620": "func_802A4DB0", + "802a56bc": "bhv_star_door_loop", + "802a58dc": "bhv_piranha_particle_loop", + "802a597c": "ActionMrIParticle0", + "802a5a44": "ActionMrIParticle1", + "802a5aa0": "bhv_mr_i_particle_loop", + "802a5acc": "func_802A525C", + "802a5bd4": "bhv_mr_i_body_loop", + "802a5d4c": "ActionMrI3", + "802a6518": "ActionMrI2", + "802a68a0": "ActionMrI1", + "802a6ad8": "ActionMrI0", + "802a6b7c": "bhv_mr_i_loop", + "802a6c20": "bhv_pole_init", + "802a6c74": "bhv_giant_pole_loop", + "802a6cf4": "bhv_thi_huge_island_top_loop", + "802a6d64": "bhv_thi_tiny_island_top_loop", + "802a6ee4": "ActionActivateCapSwitch0", + "802a7020": "ActionActivateCapSwitch1", + "802a708c": "ActionActivateCapSwitch2", + "802a7160": "ActionActivateCapSwitch3", + "802a7170": "bhv_cap_switch_loop", + "802a719c": "Geo18_802A719C", + "802a7230": "bhv_bobomb_anchor_mario_loop", + "802a7264": "ActionKingBobomb0", + "802a7384": "func_802A6AF8", + "802a73d8": "ActionKingBobomb2", + "802a7598": "ActionKingBobomb3", + "802a7804": "ActionKingBobomb1", + "802a78d8": "ActionKingBobomb6", + "802a7a60": "ActionKingBobomb7", + "802a7b1c": "ActionKingBobomb8", + "802a7b5c": "ActionKingBobomb4", + "802a7d14": "ActionKingBobomb5", + "802a7fbc": "func_802A7748", + "802a8064": "bhv_king_bobomb_loop", + "802a816c": "bhv_beta_chest_bottom_init", + "802a81e8": "bhv_beta_chest_bottom_loop", + "802a821c": "bhv_beta_chest_lid_loop", + "802a8370": "bhv_water_air_bubble_init", + "802a83a0": "bhv_water_air_bubble_loop", + "802a8630": "bhv_bubble_wave_init", + "802a86bc": "Unknown802A7E48", + "802a870c": "bhv_bubble_maybe_loop", + "802a88a4": "bhv_small_water_wave_loop", + "802a8a38": "func_802A81C4", + "802a8b18": "bhv_particle_init", + "802a8bc0": "bhv_particle_loop", + "802a8c88": "bhv_small_bubbles_loop", + "802a8cdc": "bhv_fish_group_loop", + "802a8d48": "bhv_water_waves_init", + "802a8d98": "bhv_cannon_base_unused_loop", + "802a8dc0": "ActionOpenedCannon0", + "802a8f40": "ActionOpenedCannon4", + "802a9114": "ActionOpenedCannon6", + "802a92fc": "ActionOpenedCannon5", + "802a93f8": "ActionOpenedCannon1", + "802a9440": "ActionOpenedCannon2", + "802a9460": "ActionOpenedCannon3", + "802a9498": "bhv_cannon_base_loop", + "802a94f8": "bhv_cannon_barrel_loop", + "802a958c": "func_802A8D18", + "802a9708": "bhv_chuckya_anchor_mario_loop", + "802a973c": "Unknown802A8EC8", + "802a98c4": "func_802A9050", + "802a9994": "ActionChuckya0", + "802a9d08": "ActionChuckya1", + "802a9f54": "ActionChuckya3", + "802a9fc8": "ActionChuckya2", + "802aa02c": "func_802A97B8", + "802aa0ac": "bhv_chuckya_loop", + "802aa1b8": "bhv_wf_breakable_wall_loop", + "802aa280": "func_802A9A0C", + "802aa3c8": "func_802A9B54", + "802aa3f4": "bhv_kickable_board_loop", + "802aa700": "bhv_tower_door_loop", + "802aa774": "bhv_wf_rotating_wooden_platform_loop", + "802aa830": "bhv_rotating_platform_loop", + "802aa948": "func_802AA0D4", + "802aa97c": "bhv_koopa_shell_underwater_loop", + "802aaa60": "bhv_warp_loop", + "802aab54": "BehFadingWarpLoop", + "802aac48": "bhv_white_puff_exploding_loop", + "802aae8c": "func_802AA618", + "802aaf48": "bhv_unused_080c_init", + "802aaffc": "func_802AA788", + "802ab060": "func_802AA7EC", + "802ab158": "func_802AA8E4", + "802ab18c": "func_802AA918", + "802ab1c8": "bhv_unused_080c_loop", + "802ab558": "bhv_spawn_star_objects", + "802ab5c8": "bhv_coin_sparkles_init", + "802ab650": "bhv_yellow_coin_init", + "802ab70c": "bhv_yellow_coin_loop", + "802ab748": "bhv_temp_coin_loop", + "802ab7a4": "bhv_coin_init", + "802ab860": "bhv_coin_loop", + "802aba40": "bhv_coin_formation_spawn_loop", + "802abc04": "func_802AB364", + "802abee4": "bhv_coin_formation_init", + "802abf0c": "bhv_coin_formation_loop", + "802ac068": "ActionCoinInsideBoo1", + "802ac15c": "ActionCoinInsideBoo0", + "802ac294": "bhv_coin_inside_boo_loop", + "802ac2c0": "bhv_coin_sparkles_loop", + "802ac2ec": "bhv_golden_coin_sparkles_loop", + "802ac3a8": "bhv_punch_tiny_triangle_loop", + "802ac4a0": "bhv_punch_tiny_triangle_init", + "802ac5b4": "bhv_wall_tiny_star_particle_loop", + "802ac678": "bhv_tiny_star_particles_init", + "802ac78c": "bhv_pound_tiny_star_particle_loop", + "802ac864": "bhv_pound_tiny_star_particle_init", + "802ac910": "func_802AC070", + "802ac958": "func_802AC0B8", + "802ac9d0": "func_802AC130", + "802aca6c": "func_802AC1CC", + "802acac8": "bhv_door_loop", + "802acc3c": "bhv_door_init", + "802ace80": "bhv_star_door_loop_2", + "802ad078": "ActionGrindelThwomp4", + "802ad10c": "ActionGrindelThwomp2", + "802ad1a4": "ActionGrindelThwomp3", + "802ad238": "ActionGrindelThwomp1", + "802ad2d0": "ActionGrindelThwomp0", + "802ad34c": "bhv_grindel_thwomp_loop", + "802ad378": "bhv_tumbling_bridge_platform_loop", + "802ad580": "ActionTumblingBridge1", + "802ad76c": "ActionTumblingBridge2", + "802ad7f4": "ActionTumblingBridge3", + "802ad828": "ActionTumblingBridge0", + "802ad890": "bhv_tumbling_bridge_loop", + "802ad8bc": "func_802AD01C", + "802ad8f0": "ActionElevator0", + "802ada4c": "ActionElevator1", + "802adb88": "ActionElevator2", + "802adce4": "ActionElevator4", + "802add70": "ActionElevator3", + "802addf8": "bhv_elevator_init", + "802adf6c": "bhv_elevator_loop", + "802adf98": "bhv_water_mist_spawn_loop", + "802adfd8": "bhv_water_mist_loop", + "802ae0cc": "spawn_triangle_break_particles", + "802ae238": "bhv_water_mist_2_loop", + "802ae304": "bhv_pound_white_puffs_init", + "802ae334": "func_802ADA94", + "802ae360": "bhv_unused_0e40_init", + "802ae394": "Unknown802ADAF4", + "802ae45c": "func_802ADBBC", + "802ae48c": "bhv_ground_snow_init", + "802ae4c0": "func_802ADC20", + "802ae534": "bhv_wind_loop", + "802ae85c": "bhv_unused_particle_spawn_loop", + "802ae908": "bhv_ukiki_cage_star_loop", + "802aea6c": "ukiki_cage_act_wait_for_ukiki", + "802aeab8": "ukiki_cage_act_spin", + "802aeb1c": "ukiki_cage_act_fall", + "802aeb74": "ukiki_cage_act_hide", + "802aeb9c": "bhv_ukiki_cage_loop", + "802aebc8": "bhv_squishable_platform_loop", + "802aec40": "bhv_bitfs_sinking_platform_loop", + "802aeca8": "bhv_ddd_moving_pole_loop", + "802aecdc": "bhv_bitfs_sinking_cage_platform_loop", + "802aedc0": "bhv_beta_moving_flames_spawn_loop", + "802aeea4": "bhv_beta_moving_flames_loop", + "802aef1c": "bhv_flamethrower_flame_loop", + "802af1e8": "bhv_flamethrower_loop", + "802af3fc": "bhv_rr_rotating_bridge_platform_loop", + "802af448": "bhv_bouncing_fireball_flame_loop", + "802af5f8": "bhv_bouncing_fireball_loop", + "802af7c4": "bhv_bowser_shock_wave_loop", + "802af9cc": "bhv_black_smoke_upward_loop", + "802afa0c": "bhv_black_smoke_bowser_loop", + "802afae4": "bhv_black_smoke_mario_loop", + "802afbf8": "bhv_flame_mario_loop", + "802afce4": "bhv_beta_fish_splash_spawner_loop", + "802afd1c": "bhv_spindrift_loop", + "802afee8": "bhv_wf_solid_tower_platform_loop", + "802aff30": "bhv_wf_elevator_tower_platform_loop", + "802b00e4": "bhv_wf_sliding_tower_platform_loop", + "802b0244": "func_802AF9A4", + "802b039c": "func_802AFAFC", + "802b04b4": "bhv_tower_platform_group_loop", + "802b0614": "bhv_tree_snow_or_leaf_loop", + "802b0974": "bhv_snow_leaf_particle_spawn_init", + "802b0b9c": "func_802B02FC", + "802b0bec": "bhv_squarish_path_moving_loop", + "802b0d48": "bhv_piranha_plant_waking_bubbles_loop", + "802b0df0": "bhv_piranha_plant_bubble_loop", + "802b1278": "bhv_purple_switch_loop", + "802b14f4": "func_802B0C54", + "802b15e8": "bhv_pushable_loop", + "802b1714": "func_802B0E74", + "802b17f4": "func_802B0F54", + "802b19d8": "func_802B1138", + "802b1ae0": "bhv_hidden_object_loop", + "802b1b2c": "bhv_breakable_box_loop", + "802b1bb0": "Geo18_802B1BB0", + "802b1c54": "bhv_heave_ho_throw_mario_loop", + "802b1d7c": "ActionHeaveHo1", + "802b1e6c": "ActionHeaveHo2", + "802b1ff4": "ActionHeaveHo3", + "802b20a0": "ActionHeaveHo0", + "802b2154": "func_802B18B4", + "802b2278": "bhv_heave_ho_loop", + "802b2340": "bhv_ccm_touched_star_spawn_loop", + "802b23e0": "bhv_unused_poundable_platform", + "802b2494": "bhv_beta_trampoline_spring_loop", + "802b25ac": "bhv_beta_trampoline_top_loop", + "802b26a4": "ActionJumpingBox0", + "802b27d8": "ActionJumpingBox1", + "802b2824": "func_802B1F84", + "802b288c": "bhv_jumping_box_loop", + "802b29b8": "bhv_boo_cage_loop", + "802b2bc8": "func_802B2328", + "802b2d10": "bhv_alpha_boo_key_loop", + "802b3108": "bhv_beta_boo_key_loop", + "802b3134": "func_802B2894", + "802b3250": "func_802B29B0", + "802b329c": "bhv_grand_star_loop", + "802b3600": "bhv_bowser_key_loop", + "802b37b8": "bhv_white_puff_smoke_init", + "802b3810": "bhv_bullet_bill_init", + "802b3830": "ActionBulletBill0", + "802b38b8": "ActionBulletBill1", + "802b394c": "ActionBulletBill2", + "802b3b08": "ActionBulletBill3", + "802b3b24": "ActionBulletBill4", + "802b3be0": "bhv_bullet_bill_loop", + "802b3c2c": "ActionBowserTailAnchor0", + "802b3cdc": "ActionBowserTailAnchor1", + "802b3d10": "ActionBowserTailAnchor2", + "802b3d74": "bhv_bowser_tail_anchor_loop", + "802b3df4": "bhv_bowser_flame_spawn_loop", + "802b4080": "bhv_bowser_body_anchor_loop", + "802b4184": "func_802B38B4", + "802b41fc": "func_802B392C", + "802b4288": "func_802B39B8", + "802b4300": "func_802B3A30", + "802b4368": "func_802B3A98", + "802b43dc": "func_802B3B0C", + "802b4478": "ActionBowser5", + "802b44bc": "ActionBowser6", + "802b45f4": "func_802B3D24", + "802b473c": "func_802B3E44", + "802b48d4": "func_802B3FDC", + "802b4a1c": "func_802B4124", + "802b4a3c": "func_802B4144", + "802b4af4": "func_u_802B4AF4", + "802b4bac": "ActionBowser18", + "802b4be8": "ActionBowser0", + "802b4ca4": "ActionBowser15", + "802b4d14": "ActionBowser14", + "802b4f00": "ActionBowser16", + "802b5104": "ActionBowser8", + "802b5218": "ActionBowser12", + "802b53f4": "func_802B4A44", + "802b5444": "func_802B4A94", + "802b5554": "func_802B4BA4", + "802b55cc": "ActionBowser13", + "802b5798": "ActionBowser17", + "802b58bc": "ActionBowser10", + "802b59cc": "ActionBowser9", + "802b5aec": "func_802B5108", + "802b5c00": "ActionBowser11", + "802b5c40": "ActionBowser7", + "802b5f6c": "func_802B5588", + "802b5fec": "ActionBowser1", + "802b611c": "func_802B5738", + "802b6190": "ActionBowser2", + "802b6568": "ActionBowser3", + "802b65d0": "func_802B5C78", + "802b6670": "func_802B5D18", + "802b6730": "func_802B5DD8", + "802b67d4": "func_802B5E7C", + "802b6878": "func_802B5F20", + "802b6a10": "func_802B60B8", + "802b6a78": "func_802B6120", + "802b6bac": "func_802B6254", + "802b6cf0": "ActionBowser4", + "802b6e40": "func_802B64E8", + "802b6ee0": "ActionBowser19", + "802b711c": "func_802B67C4", + "802b71e4": "func_802B688C", + "802b72d4": "func_802B697C", + "802b7418": "func_802B6AC0", + "802b75a4": "bhv_bowser_loop", + "802b7878": "bhv_bowser_init", + "802b798c": "Geo18_802B798C", + "802b7a20": "func_802B70C8", + "802b7c64": "geo_switch_bowser_eyes", + "802b7d44": "Geo18_802B7D44", + "802b7e68": "ActionFallingBowserPlatform0", + "802b7ef0": "ActionFallingBowserPlatform1", + "802b8024": "ActionFallingBowserPlatform2", + "802b8384": "bhv_falling_bowser_platform_loop", + "802b83b0": "func_802B7A58", + "802b8434": "func_802B7ADC", + "802b84ac": "bhv_flame_bowser_init", + "802b85b0": "bhv_flame_large_burning_out_init", + "802b8654": "func_802B7CFC", + "802b8734": "bhv_flame_bowser_loop", + "802b8960": "bhv_flame_moving_forward_growing_init", + "802b89ec": "bhv_flame_moving_forward_growing_loop", + "802b8b1c": "bhv_flame_floating_landing_init", + "802b8c38": "bhv_flame_floating_landing_loop", + "802b8d68": "bhv_blue_bowser_flame_init", + "802b8e7c": "bhv_blue_bowser_flame_loop", + "802b9034": "bhv_flame_bouncing_init", + "802b90ec": "bhv_flame_bouncing_loop", + "802b921c": "bhv_blue_flames_group_loop", + "802b935c": "bhv_blue_fish_loop", + "802b9790": "bhv_tank_fish_group_loop", + "802b98d4": "func_802B8F7C", + "802b98fc": "bhv_checkerboard_elevator_group_init", + "802b9a78": "func_802B9120", + "802b9af8": "func_802B91A0", + "802b9bb4": "bhv_checkerboard_platform_init", + "802b9bd8": "bhv_checkerboard_platform_loop", + "802b9e94": "bhv_ddd_warp_loop", + "802b9efc": "func_802B95A4", + "802ba13c": "func_802B97E4", + "802ba19c": "bhv_water_level_pillar_init", + "802ba1e0": "bhv_water_level_pillar_loop", + "802ba25c": "bhv_invisible_objects_under_bridge_init", + "802ba2b0": "Geo18_802BA2B0", + "802ba2f8": "bhv_bowser_key_unlock_door_loop", + "802ba458": "bhv_bowser_key_course_exit_loop", + "802ba5bc": "bhv_moat_grills_loop", + "802ba608": "bhv_rotating_clock_arm_loop", + "802ba7e0": "handle_hat_ukiki_reset", + "802ba868": "is_hat_ukiki_and_mario_has_hat", + "802ba8c4": "unused_Geo18_8029D890", + "802ba958": "idle_ukiki_taunt", + "802bab7c": "ukiki_act_idle", + "802bae40": "ukiki_act_return_home", + "802baec4": "ukiki_act_wait_to_respawn", + "802baf10": "ukiki_act_unused_turn", + "802baf64": "ukiki_act_turn_to_mario", + "802bb07c": "ukiki_act_run", + "802bb288": "ukiki_act_jump", + "802bb3b8": "ukiki_act_go_to_cage", + "802bb798": "ukiki_free_loop", + "802bb888": "cage_ukiki_held_loop", + "802bba3c": "hat_ukiki_held_loop", + "802bbb98": "bhv_ukiki_init", + "802bbc0c": "bhv_ukiki_loop", + "802bbd6c": "func_802BB414", + "802bbfd8": "func_802BB680", + "802bc0f0": "bhv_lll_moving_octagonal_mesh_platform_loop", + "802bc22c": "bhv_lll_sinking_rock_block_loop", + "802bc294": "bhv_lll_rotating_hex_flame_loop", + "802bc348": "func_802BB9F0", + "802bc4f4": "ActionRotatingCwFireBars0", + "802bc538": "ActionRotatingCwFireBars1", + "802bc590": "ActionRotatingCwFireBars2", + "802bc5fc": "ActionRotatingCwFireBars3", + "802bc618": "bhv_lll_rotating_block_fire_bars_loop", + "802bc660": "bhv_lll_wood_piece_loop", + "802bc728": "bhv_lll_floating_wood_bridge_loop", + "802bc898": "bhv_volcano_flames_loop", + "802bc934": "func_802BBFDC", + "802bca74": "bhv_lll_rotating_hexagonal_ring_loop", + "802bcce8": "func_802BC390", + "802bcda8": "bhv_lll_sinking_rectangular_platform_loop", + "802bce58": "bhv_lll_sinking_square_platforms_loop", + "802bce9c": "func_802BC544", + "802bcf40": "bhv_tilting_platform_init", + "802bcfc4": "func_802BC66C", + "802bd058": "bhv_tilting_platform_loop", + "802bd3e4": "func_802BCA8C", + "802bd488": "bhv_koopa_shell_flame_loop", + "802bd5dc": "bhv_koopa_shell_flame_spawn", + "802bd62c": "func_802BCCD4", + "802bd680": "bhv_koopa_shell_loop", + "802bd8d0": "func_802BCF78", + "802bd91c": "func_802BCFC4", + "802bdb04": "ActionToxBox4", + "802bdb3c": "ActionToxBox5", + "802bdb74": "ActionToxBox6", + "802bdbac": "ActionToxBox7", + "802bdbe4": "ActionToxBox1", + "802bdc7c": "ActionToxBox2", + "802bdcc8": "ActionToxBox3", + "802bdd14": "ActionToxBox0", + "802bdd68": "bhv_tox_box_loop", + "802bdd9c": "piranha_plant_act_idle", + "802bde10": "piranha_plant_check_interactions", + "802bdeec": "piranha_plant_act_sleeping", + "802be034": "piranha_plant_act_woken_up", + "802be0b8": "piranha_plant_reset_when_far", + "802be0ec": "piranha_plant_attacked", + "802be150": "piranha_plant_act_shrink_and_die", + "802be234": "piranha_plant_act_wait_to_respawn", + "802be278": "piranha_plant_act_respawn", + "802be350": "piranha_plant_act_biting", + "802be49c": "mario_moving_fast_enough_to_make_piranha_plant_bite", + "802be50c": "piranha_plant_act_stopped_biting", + "802be5a0": "bhv_piranha_plant_loop", + "802be628": "bhv_lll_bowser_puzzle_spawn_piece", + "802be6d4": "bhv_lll_bowser_puzzle_spawn_pieces", + "802be79c": "bhv_lll_bowser_puzzle_loop", + "802be8a8": "bhv_lll_bowser_puzzle_piece_action_0", + "802be8b8": "bhv_lll_bowser_puzzle_piece_action_1", + "802be8f4": "bhv_lll_bowser_puzzle_piece_update", + "802be9dc": "bhv_lll_bowser_puzzle_piece_move", + "802beb14": "bhv_lll_bowser_puzzle_piece_idle", + "802beb54": "bhv_lll_bowser_puzzle_piece_move_left", + "802beb8c": "bhv_lll_bowser_puzzle_piece_move_right", + "802bebc4": "bhv_lll_bowser_puzzle_piece_move_up", + "802bebfc": "bhv_lll_bowser_puzzle_piece_move_down", + "802bec34": "bhv_lll_bowser_puzzle_piece_loop", + "802becb0": "func_802BE2E8", + "802bed7c": "play_penguin_walking_sound", + "802bedec": "ActionTuxiesMother2", + "802bef8c": "ActionTuxiesMother1", + "802bf1d8": "ActionTuxiesMother0", + "802bf3c0": "bhv_tuxies_mother_loop", + "802bf424": "func_802BEA58", + "802bf474": "ActionSmallPenguin2", + "802bf57c": "ActionSmallPenguin1", + "802bf648": "ActionSmallPenguin3", + "802bf6e4": "ActionSmallPenguin4", + "802bf760": "ActionSmallPenguin0", + "802bf90c": "ActionSmallPenguin5", + "802bfa14": "func_802BF048", + "802bfa88": "bhv_small_penguin_loop", + "802bfbac": "geo_switch_tuxie_mother_eyes", + "802bfcd8": "ActionFish0", + "802bfeb8": "ActionFish1", + "802bff20": "ActionFish2", + "802bff3c": "bhv_fish_loop", + "802bff68": "func_802BF59C", + "802c00b4": "ActionFishGroup1", + "802c0348": "ActionFishGroup2", + "802c06a8": "ActionFishGroup0", + "802c0768": "bhv_fish_group_2_loop", + "802c08a8": "bhv_wdw_express_elevator_loop", + "802c0aac": "ActionBirdChirpChirp0", + "802c0b50": "ActionBirdChirpChirp1", + "802c0ba4": "ActionBirdChirpChirp2", + "802c0bc4": "ActionBirdChirpChirp3", + "802c0be0": "bhv_bird_chirp_chirp_loop", + "802c0c0c": "func_802C0240", + "802c0cd4": "ActionCheepCheep0", + "802c0d44": "ActionCheepCheep1", + "802c0f90": "ActionCheepCheep2", + "802c1204": "bhv_cheep_cheep_loop", + "802c12c0": "bhv_rotatin_exclamation_box_loop", + "802c1308": "ActionExclamationBox0", + "802c13ec": "ActionExclamationBox1", + "802c14b0": "ActionExclamationBox2", + "802c15b8": "ActionExclamationBox3", + "802c17bc": "func_802C0DF0", + "802c18d0": "ActionExclamationBox4", + "802c1988": "ActionExclamationBox5", + "802c19c0": "bhv_exclamation_box_loop", + "802c19fc": "bhv_sound_spawner_init", + "802c1a40": "bhv_bowsers_sub_loop", + "802c1a80": "bhv_sushi_shark_collision_loop", + "802c1a90": "bhv_sushi_shark_loop", + "802c1c44": "bhv_sunken_ship_part_loop", + "802c1cd4": "bhv_ship_part_3_loop", + "802c1e10": "bhv_jrb_sliding_box_loop", + "802c2190": "bhv_white_puff_1_loop", + "802c2274": "bhv_white_puff_2_loop", + "802c22b8": "bhv_hidden_blue_coin_loop", + "802c242c": "bhv_blue_coin_switch_loop", + "802c263c": "bhv_openable_cage_door_loop", + "802c26f8": "bhv_openable_grill_loop", + "802c2930": "bhv_init_changing_water_level_loop", + "802c2a24": "bhv_water_level_diamond_loop", + "802c2ce8": "func_802C231C", + "802c2ebc": "ActionTweester0", + "802c2fbc": "ActionTweester1", + "802c31c4": "ActionTweester2", + "802c329c": "bhv_tweester_loop", + "802c32e8": "bhv_tweester_sand_particle_loop", + "802c3440": "bhv_boo_init", + "802c3684": "bhv_courtyard_boo_triplet_init", + "802c4824": "bhv_boo_loop", + "802c4f30": "bhv_big_boo_loop", + "802c515c": "bhv_boo_with_cage_init", + "802c51d4": "bhv_boo_with_cage_loop", + "802c5224": "bhv_merry_go_round_boo_manager_loop", + "802c53cc": "obj_set_secondary_camera_focus", + "802c53ec": "bhv_animated_texture_loop", + "802c5414": "bhv_boo_in_castle_loop", + "802c5688": "bhv_boo_boss_spawned_bridge_loop", + "802c5890": "bhv_bbh_tilting_trap_platform_loop", + "802c5a38": "bhv_haunted_bookshelf_loop", + "802c5ca8": "bhv_merry_go_round_loop", + "802c5dc0": "bhv_static_checkered_platform_loop", + "802c5f48": "bhv_beta_bowser_anchor_loop", + "802c5fdc": "bhv_play_music_track_when_touched_loop", + "802c6050": "bhv_floor_trap_in_castle_loop", + "802c60ac": "bhv_castle_floor_trap_init", + "802c6150": "bhv_castle_floor_trap_open_detect", + "802c61d4": "bhv_castle_floor_trap_open", + "802c6278": "bhv_castle_floor_trap_close_detect", + "802c62bc": "bhv_castle_floor_trap_close", + "802c6328": "bhv_castle_floor_trap_rotate", + "802c6348": "bhv_castle_floor_trap_loop", + "802c63e8": "BehClimbDetectLoop", + "802c64a4": "bhv_sparkle_spawn_loop", + "802c6538": "func_802C5A64", + "802c65c0": "bhv_scuttlebug_loop", + "802c6b6c": "bhv_scuttlebug_spawn_loop", + "802c6ca0": "func_802C61CC", + "802c6d6c": "ActionWhomp0", + "802c6ec8": "ActionWhomp7", + "802c6fb0": "ActionWhomp1", + "802c710c": "ActionWhomp2", + "802c7254": "ActionWhomp3", + "802c72b4": "ActionWhomp4", + "802c7380": "ActionWhomp5", + "802c7428": "func_802C6954", + "802c75fc": "func_802C6B28", + "802c76d4": "ActionWhomp6", + "802c7858": "ActionWhomp8", + "802c7998": "ActionWhomp9", + "802c79d8": "bhv_whomp_loop", + "802c7a70": "bhv_water_splash_loop", + "802c7b14": "bhv_water_drops_loop", + "802c7cac": "bhv_surface_waves_loop", + "802c7d40": "bhv_water_surface_white_wave_init", + "802c7d90": "bhv_object_bubble_ripples_init", + "802c7dfc": "bhv_surface_wave_shrinking_init", + "802c7e5c": "bhv_wave_trail_loop", + "802c7f98": "bhv_white_wind_particle_loop", + "802c81b4": "func_802C76E0", + "802c834c": "bhv_snowman_wind_blowing_loop", + "802c85a4": "func_802C7AD0", + "802c863c": "bhv_walking_penguin_loop", + "802c89f0": "update_mario_platform", + "802c8b4c": "get_mario_pos", + "802c8b8c": "set_mario_pos", + "802c8bc8": "apply_platform_displacement", + "802c8ec0": "apply_mario_platform_displacement", + "802c8f28": "clear_mario_platform", + "802c8f40": "Unknown802C8460", + "802c8fe4": "func_802C8504", + "802c91ec": "func_802C870C", + "802c9388": "func_802C88A8", + "802c93f8": "func_802C8918", + "802c94ac": "func_802C89CC", + "802c95b4": "func_802C8AD4", + "802c9630": "func_802C8B50", + "802c9724": "detect_object_collisions", + "802c99b8": "init_free_object_list", + "802c9a3c": "clear_object_lists", + "802c9b68": "unload_object", + "802c9f04": "create_object", + "802ca028": "mark_obj_for_deletion", + "802ca040": "exec_anim_sound_state", + "802ca144": "create_sound_spawner", + "802ca190": "PlaySound", + "802ca1e0": "PlaySound2", + "802ca230": "calc_dist_to_volume_range_1", + "802ca2d4": "calc_dist_to_volume_range_2", + "802ca370": "Stub802C9890", + "802ca380": "Stub802C98A0", + "802ca390": "Stub802C98B0", + "802ca3a0": "Stub802C98C0", + "802ca3b0": "get_current_clock", + "802ca3e0": "get_clock_difference", + "802ca418": "set_print_state_info", + "802ca460": "print_text_array_info", + "802ca51c": "set_text_array_x_y", + "802ca568": "print_debug_bottom_up", + "802ca5b8": "print_debug_top_down_objectinfo", + "802ca618": "print_debug_top_down_mapinfo", + "802ca680": "print_debug_top_down_normal", + "802ca6d0": "print_mapinfo", + "802ca8e8": "print_checkinfo", + "802ca918": "print_surfaceinfo", + "802ca94c": "print_stageinfo", + "802ca990": "print_string_array_info", + "802caa6c": "print_effectinfo", + "802caaa8": "print_enemyinfo", + "802caae4": "update_debug_dpadmask", + "802cabac": "debug_unknown_level_select_check", + "802cac20": "reset_debug_objectinfo", + "802cb0b0": "stub_802CA5D0", + "802cb0c0": "try_print_debug_mario_object_info", + "802cb1c0": "try_print_debug_mario_level_info", + "802cb264": "try_do_mario_debug_object_spawn", + "802cb564": "Unknown802CAA84", + "802cb5c0": "func_802CAAE0", + "802cb640": "func_802CAB60", + "802cb894": "func_802CADB4", + "802cba18": "func_802CAF38", + "802cbbc4": "func_802CB0E4", + "802cbc20": "func_802CB140", + "802cbc7c": "func_802CB19C", + "802cbd54": "func_802CB274", + "802cbe64": "func_802CB384", + "802cbee0": "func_802CB400", + "802cbf64": "func_802CB484", + "802cbfe8": "func_802CB508", + "802cc180": "func_802CB6A0", + "802cc4d8": "func_802CB9F8", + "802ccbe8": "func_802CC108", + "802ccdc8": "func_802CC2E8", + "802cd1e8": "Geo18_802CD1E8", + "802cd280": "rotate_rectangle", + "802cd328": "atan2_deg", + "802cd388": "scale_shadow_with_distance", + "802cd444": "disable_shadow_with_distance", + "802cd48c": "dim_shadow_with_distance", + "802cd614": "get_water_level_below_shadow", + "802cd6c4": "init_shadow", + "802cd938": "get_texture_coords_9_vertices", + "802cd988": "get_texture_coords_4_vertices", + "802cd9ec": "make_shadow_vertex_at_xyz", + "802cdb20": "extrapolate_vertex_y_position", + "802cdb74": "get_vertex_coords", + "802cdc40": "calculate_vertex_xyz", + "802cde94": "floor_local_tilt", + "802cdf3c": "make_shadow_vertex", + "802ce128": "add_shadow_to_display_list", + "802ce2bc": "linearly_interpolate_solidity_positive", + "802ce3ec": "linearly_interpolate_solidity_negative", + "802ce524": "correct_shadow_solidity_for_animations", + "802ce690": "correct_lava_shadow_height", + "802ce79c": "create_shadow_player", + "802ce9d0": "create_shadow_circle_9_verts", + "802ceae8": "create_shadow_circle_4_verts", + "802cec04": "create_shadow_circle_assuming_flat_ground", + "802cedc0": "create_shadow_rectangle", + "802cef6c": "get_shadow_height_solidity", + "802cf080": "create_shadow_square", + "802cf1f0": "create_shadow_hardcoded_rectangle", + "802cf34c": "create_shadow_below_xyz", + "802cf5b0": "calculate_skybox_scaled_x", + "802cf69c": "calculate_skybox_scaled_y", + "802cf804": "make_skybox_rect", + "802cfa2c": "draw_skybox_tile_grid", + "802cfc68": "create_skybox_ortho_matrix", + "802cfd88": "init_skybox_display_list", + "802cfef4": "create_skybox_facing_camera", + "802d0080": "geo_wdw_set_initial_water_level", + "802d01e0": "geo_movtex_pause_control", + "802d0254": "movtex_make_quad_vertex", + "802d0484": "movtex_gen_from_quad", + "802d0a84": "movtex_gen_from_quad_array", + "802d0bb0": "movtex_gen_quads_id", + "802d0c84": "get_quad_collection_from_id", + "802d0f28": "movtex_change_texture_format", + "802d104c": "geo_movtex_draw_water_regions", + "802d1330": "update_moving_texture_offset", + "802d13cc": "movtex_write_vertex_first", + "802d1574": "movtex_write_vertex_index", + "802d18b4": "movtex_gen_list", + "802d1b70": "geo_movtex_draw_nocolor", + "802d1cdc": "geo_movtex_draw_colored", + "802d1e48": "geo_movtex_draw_colored_no_update", + "802d1fa8": "geo_movtex_draw_colored_2_no_update", + "802d2108": "geo_movtex_update_horizontal", + "802d2210": "make_vertex", + "802d22c4": "round_float", + "802d2360": "geo_exec_inside_castle_light", + "802d2470": "geo_exec_flying_carpet_timer_update", + "802d2520": "geo_exec_flying_carpet_create", + "802d28cc": "geo_exec_cake_end_screen", + "802d29c0": "stopAllRippleExcept", + "802d2a74": "find_mario_y_position_on_painting", + "802d2b08": "find_mario_z_position_on_painting", + "802d2b84": "painting_find_vertical_ripple_location", + "802d2c40": "find_part_of_painting_near_mario", + "802d2d80": "find_mario_x_position_on_painting", + "802d2dfc": "painting_find_horizontal_ripple_location", + "802d2eb8": "painting_set_ripple_type", + "802d2ffc": "vertical_proximity_ripple_painting_ripple", + "802d319c": "vertical_proximity_ripple_painting_ripple_if_mario_enters", + "802d327c": "vertical_continuous_ripple_painting_ripple", + "802d341c": "vertical_continuous_ripple_painting_ripple_if_mario_enters", + "802d34fc": "horizontal_proximity_ripple_painting_ripple", + "802d36ac": "horizontal_proximity_ripple_painting_ripple_if_mario_enters", + "802d379c": "horizontal_continuous_ripple_painting_ripple", + "802d393c": "horizontal_continuous_ripple_painting_ripple_if_mario_enters", + "802d3a2c": "painting_update_floors", + "802d3bec": "painting_update_ripple_status", + "802d3cec": "painting_calculate_point_ripple", + "802d3e6c": "painting_conditionally_calculate_point_ripple", + "802d3ee4": "Print1", + "802d404c": "Print2", + "802d43f8": "small_float_to_byte", + "802d44bc": "func_802D39DC", + "802d47d0": "func_802D3CF0", + "802d4edc": "func_802D43FC", + "802d50dc": "func_802D45FC", + "802d5354": "func_802D4874", + "802d556c": "display_painting_rippling", + "802d568c": "display_painting_not_rippling", + "802d5778": "reset_painting", + "802d57a8": "update_ddd_painting", + "802d58e4": "func_802D4E04", + "802d593c": "display_painting", + "802d59a8": "vertical_painting_ripple", + "802d5aa0": "horizontal_painting_ripple", + "802d5b98": "Geo18_802D5B98", + "802d5d0c": "Geo18_802D5D0C", + "802d5e00": "int_pow", + "802d5e54": "format_integer", + "802d6144": "parse_width_field", + "802d62d8": "print_text_fmt_int", + "802d6554": "print_text", + "802d66c0": "print_text_centered", + "802d6858": "char_to_glyph_index", + "802d69f8": "add_glyph_texture", + "802d6acc": "clip_to_bounds", + "802d6b3c": "render_textrect", + "802d6c88": "render_text_labels", + "802d6f20": "create_dl_identity_matrix", + "802d7070": "create_dl_translation_matrix", + "802d7174": "create_dl_rotation_matrix", + "802d7280": "create_dl_scale_matrix", + "802d7384": "create_dl_ortho_matrix", + "802d75dc": "render_generic_char", + "802d76c8": "render_multi_text_string", + "802d77dc": "print_generic_string", + "802d7b84": "print_hud_lut_string", + "802d7e88": "print_menu_generic_string", + "802d82d4": "print_credits_string", + "802d862c": "handle_menu_scrolling", + "802d8844": "get_str_x_pos_from_center", + "802d8934": "get_string_width", + "802d89b8": "print_hud_my_score_coins", + "802d8a80": "print_hud_my_score_stars", + "802d8b34": "int_to_str", + "802d8c6c": "get_dialog_id", + "802d8c88": "create_dialog_box", + "802d8cc4": "create_dialog_box_with_var", + "802d8d08": "create_dialog_inverted_box", + "802d8d48": "create_dialog_box_with_response", + "802d8d90": "reset_dialog_render_state", + "802d8e2c": "render_dialog_box_type", + "802d9148": "change_and_flash_dialog_text_color_lines", + "802d9388": "handle_dialog_scroll_page_state", + "802d944c": "render_star_count_dialog_text", + "802d9634": "render_multi_text_string_lines", + "802d9800": "ensure_nonnegative", + "802d982c": "handle_dialog_text_and_pages", + "802d9cb0": "render_dialog_triangle_choice", + "802d9dfc": "render_dialog_string_color", + "802d9f84": "handle_special_dialog_text", + "802da1ac": "render_dialog_entries", + "802da810": "set_menu_mode", + "802da844": "reset_cutscene_msg_fade", + "802da85c": "dl_rgba16_begin_cutscene_msg_fade", + "802da8e4": "dl_rgba16_stop_cutscene_msg_fade", + "802da964": "ascii_to_credits_char", + "802daa34": "print_credits_str_ascii", + "802daae4": "set_cutscene_message", + "802dab58": "do_cutscene_handler", + "802dad54": "print_peach_letter_message", + "802db08c": "render_hud_cannon_reticle", + "802db350": "reset_red_coins_collected", + "802db368": "change_dialog_camera_angle", + "802db3b8": "shade_screen", + "802db498": "print_animated_red_coin", + "802db6e8": "render_pause_red_coins", + "802db760": "render_pause_my_score_coins", + "802dbb24": "render_pause_camera_options", + "802dbe68": "render_pause_course_options", + "802dc15c": "render_pause_castle_menu_box", + "802dc418": "highlight_last_course_complete_stars", + "802dc478": "print_hud_pause_colorful_str", + "802dc570": "render_pause_castle_course_stars", + "802dc718": "render_pause_castle_main_strings", + "802dca88": "render_pause_courses_and_castle", + "802dcd04": "print_hud_course_complete_string", + "802dcf30": "print_hud_course_complete_coins", + "802dd194": "play_star_fanfare_and_flash_hud", + "802dd210": "render_course_complete_lvl_info_and_hud_str", + "802dd838": "render_save_confirmation", + "802ddae0": "render_course_complete_screen", + "802ddca4": "render_menus_and_dialogs", + "802dddf0": "envfx_init_snow", + "802ddf38": "envfx_update_snowflake_count", + "802de0bc": "envfx_cleanup_snow", + "802de114": "orbit_from_positions", + "802de23c": "pos_from_orbit", + "802de360": "envfx_is_snowflake_alive", + "802de458": "envfx_update_snow_normal", + "802de888": "envfx_update_snow_blizzard", + "802ded38": "envfx_update_snow_water", + "802def2c": "rotate_triangle_vertices", + "802df334": "append_snowflake_vertex_buffer", + "802df748": "envfx_update_snow", + "802dfbc8": "envfx_update_particles", + "802dfd50": "particle_is_laterally_close", + "802dfe00": "random_flower_offset", + "802dfe80": "envfx_update_flower", + "802e0120": "envfx_set_lava_bubble_position", + "802e048c": "envfx_update_lava", + "802e065c": "envfx_rotate_around_whirlpool", + "802e08a8": "envfx_is_whirlpool_bubble_alive", + "802e0934": "envfx_update_whirlpool", + "802e0e24": "envfx_is_jestream_bubble_alive", + "802e0eb8": "envfx_update_jetstream", + "802e1238": "envfx_init_bubble", + "802e1414": "envfx_bubbles_update_switch", + "802e1618": "append_bubble_vertex_buffer", + "802e1a20": "envfx_set_bubble_texture", + "802e1bb8": "envfx_update_bubble_particles", + "802e1ed8": "envfx_set_max_bubble_particles", + "802e1f48": "envfx_update_bubbles", + "802e20a0": "convert_rotation", + "802e2134": "spawn_macro_abs_yrot_2params", + "802e21dc": "spawn_macro_abs_yrot_param1", + "802e2284": "spawn_macro_abs_special", + "802e2414": "spawn_macro_objects", + "802e2690": "spawn_macro_objects_hardcoded", + "802e28ec": "spawn_special_objects", + "802e2cf0": "render_hud_tex_lut", + "802e2e58": "render_hud_small_tex_lut", + "802e30b4": "render_power_meter_health_segment", + "802e3214": "render_dl_power_meter", + "802e33b8": "animate_power_meter_emphasized", + "802e352c": "handle_power_meter_actions", + "802e3654": "render_hud_power_meter", + "802e3744": "render_hud_mario_lives", + "802e37a8": "render_hud_coins", + "802e380c": "render_hud_stars", + "802e38e4": "render_hud_keys", + "802e395c": "render_hud_timer", + "802e3b1c": "set_hud_camera_status", + "802e3b3c": "render_hud_camera_status", + "802e3d2c": "render_hud", + "802e3e50": "func_802E2F40", + "802e3e68": "func_802E2F58", + "802e3f68": "absf_2", + "802e3fac": "TurnObjAwayFromSurface", + "802e405c": "ObjFindWall", + "802e41a4": "TurnObjAwayFromAwkwardFloor", + "802e42e0": "ObjOrientGraph", + "802e43e4": "CalcObjFriction", + "802e445c": "CalcNewObjVelAndPosY", + "802e4814": "CalcNewObjVelAndPosYUnderwater", + "802e4cec": "ObjUpdatePosVelXZ", + "802e4d88": "ObjSplash", + "802e4e90": "ObjectStep", + "802e5114": "func_802E4204", + "802e5160": "obj_move_xyz_using_fvel_and_yaw", + "802e5208": "is_point_within_radius_of_mario", + "802e52b8": "IsPointCloseToObject", + "802e5360": "SetObjectVisibility", + "802e53f4": "ObjLeaveIfMarioIsNearHome", + "802e54b0": "ObjDisplaceHome", + "802e55d0": "func_802E46C0", + "802e569c": "func_802E478C", + "802e5760": "ObjSpawnYellowCoins", + "802e5824": "ObjFlickerAndDisappear", + "802e58b4": "func_802E49A4", + "802e5948": "func_802E4A38", + "802e5a80": "ObjCheckFloorDeath", + "802e5b18": "ObjLavaDeath", + "802e5c6c": "SpawnOrangeNumber", + "802e5d04": "Unknown802E4DF4", + "802e5de8": "CoinStep", + "802e5e6c": "MovingCoinFlickerLoop", + "802e5ea4": "CoinCollected", + "802e5ee8": "bhv_moving_yellow_coin_init", + "802e5f64": "bhv_moving_yellow_coin_loop", + "802e6098": "bhv_moving_blue_coin_init", + "802e6114": "bhv_moving_blue_coin_loop", + "802e62a4": "bhv_blue_coin_sliding_jumping_init", + "802e631c": "func_802E540C", + "802e63ec": "func_802E54DC", + "802e6474": "bhv_blue_coin_sliding_loop", + "802e6628": "bhv_blue_coin_jumping_loop", + "802e6790": "bhv_seaweed_init", + "802e67dc": "bhv_seaweed_bundle_init", + "802e6a2c": "bhv_bobomb_init", + "802e6a8c": "func_802E5B7C", + "802e6af8": "BobombExplodeLoop", + "802e6bd4": "CheckBobombInteractions", + "802e6cf0": "BobombPatrolLoop", + "802e6dc8": "BobombChaseMarioLoop", + "802e6e84": "BobombLaunchedLoop", + "802e6ed8": "GenericBobombFreeLoop", + "802e7020": "StationaryBobombFreeLoop", + "802e7134": "BobombFreeLoop", + "802e7180": "BobombHeldLoop", + "802e7220": "BobombDroppedLoop", + "802e7280": "BobombThrownLoop", + "802e7324": "ObjRandomBlink", + "802e742c": "bhv_bobomb_loop", + "802e75a0": "bhv_bobomb_fuse_smoke_init", + "802e76ac": "bhv_bobomb_buddy_init", + "802e770c": "BobombBuddyIdleLoop", + "802e7814": "BobombBuddyCannonLoop", + "802e79dc": "BobombBuddyTalkLoop", + "802e7b00": "BobombBuddyTurnToTalkLoop", + "802e7bb0": "BobombBuddyActionLoop", + "802e7c4c": "bhv_bobomb_buddy_loop", + "802e7c90": "bhv_cannon_closed_init", + "802e7d4c": "CannonTrapDoorOpeningLoop", + "802e7e54": "bhv_cannon_closed_loop", + "802e7f70": "bhv_whirlpool_init", + "802e7fb8": "func_802E70A8", + "802e7fec": "func_802E70DC", + "802e80dc": "bhv_whirlpool_loop", + "802e82b0": "bhv_jet_stream_loop", + "802e8388": "bhv_homing_amp_init", + "802e89d4": "bhv_homing_amp_loop", + "802e8ae4": "bhv_circling_amp_init", + "802e8ecc": "bhv_circling_amp_loop", + "802e8f68": "bhv_butterfly_init", + "802e9018": "ButterflyStep", + "802e9278": "CalculateButterflyAngle", + "802e9470": "ButterflyRestingLoop", + "802e94e4": "ButterflyFollowMarioLoop", + "802e9548": "ButterflyReturnHomeLoop", + "802e96c8": "bhv_butterfly_loop", + "802e9764": "bhv_hoot_init", + "802e97fc": "HootFindNextFloor", + "802e98c0": "HootFloorBounce", + "802e9a4c": "HootFreeStep", + "802e9cf4": "PlayerSetHootYaw", + "802e9d98": "HootCarryStep", + "802e9f60": "HootSurfaceCollision", + "802ea144": "HootAscentLoop", + "802ea258": "HootActionLoop", + "802ea3f0": "HootTurnToHome", + "802ea4ec": "HootAwakeLoop", + "802ea588": "bhv_hoot_loop", + "802ea6a8": "bhv_beta_holdable_object_init", + "802ea7e0": "bhv_beta_holdable_object_loop", + "802ea888": "bhv_object_bubble_init", + "802ea934": "bhv_object_bubble_loop", + "802eaa10": "bhv_object_water_wave_init", + "802eaa50": "bhv_object_water_wave_loop", + "802eaa8c": "bhv_explosion_init", + "802eaad0": "bhv_explosion_loop", + "802eabf0": "bhv_bobomb_bully_death_smoke_init", + "802eac3c": "bhv_bobomb_explosion_bubble_init", + "802ead3c": "bhv_bobomb_explosion_bubble_loop", + "802eaef8": "bhv_respawner_loop", + "802eaf84": "create_respawner", + "802eb05c": "bhv_small_bully_init", + "802eb104": "bhv_big_bully_init", + "802eb1c0": "BullyCheckMarioCollision", + "802eb288": "BullyChaseMarioLoop", + "802eb3f0": "BullyKnockbackLoop", + "802eb510": "BullyBackUpLoop", + "802eb5c4": "BullyBackUpCheck", + "802eb630": "PlayBullyStompingSound", + "802eb744": "BullyStep", + "802eb7e0": "BullySpawnCoin", + "802eb8b0": "BullyLavaDeath", + "802eb9d0": "bhv_bully_loop", + "802ebb74": "BigBullySpawnMinion", + "802ebc00": "bhv_big_bully_with_minions_init", + "802ebc88": "BigBullyWithMinionsLavaDeath", + "802ebce0": "bhv_big_bully_with_minions_loop", + "802ebf70": "WaterRingCalcMarioDistInFront", + "802ec030": "WaterRingInit", + "802ec1b0": "bhv_jet_stream_water_ring_init", + "802ec200": "CheckWaterRingCollection", + "802ec3d0": "SetWaterRingScale", + "802ec4e0": "WaterRingCollectedLoop", + "802ec59c": "JetStreamWaterRingNotCollectedLoop", + "802ec75c": "bhv_jet_stream_water_ring_loop", + "802ec7cc": "Unknown802EB8A4", + "802ec818": "JetStreamRingSpawnerActiveLoop", + "802ec908": "bhv_jet_stream_ring_spawner_loop", + "802ec9b8": "bhv_manta_ray_water_ring_init", + "802ec9f0": "MantaRayWaterRingNotCollectedLoop", + "802ecba4": "bhv_manta_ray_water_ring_loop", + "802ecc14": "bhv_bowser_bomb_loop", + "802ecd0c": "bhv_bowser_bomb_explosion_loop", + "802ecea0": "bhv_bowser_bomb_smoke_loop", + "802ecfac": "bhv_celebration_star_init", + "802ed10c": "CelebrationStarSpinAroundMarioLoop", + "802ed28c": "CelebrationStarFaceCameraLoop", + "802ed39c": "bhv_celebration_star_loop", + "802ed40c": "bhv_celebration_star_sparkle_loop", + "802ed45c": "bhv_star_key_collection_puff_spawner_loop", + "802ed498": "bhv_lll_drawbridge_spawner_loop", + "802ed62c": "bhv_lll_drawbridge_loop", + "802ed78c": "bhv_small_bomp_init", + "802ed7fc": "bhv_small_bomp_loop", + "802edacc": "bhv_large_bomp_init", + "802edb2c": "bhv_large_bomp_loop", + "802eddfc": "bhv_wf_sliding_platform_init", + "802edf28": "bhv_wf_sliding_platform_loop", + "802ee124": "bhv_moneybag_init", + "802ee1a0": "MoneybagCheckMarioCollision", + "802ee268": "MoneybagJump", + "802ee46c": "MoneybagMoveAroundLoop", + "802ee598": "MoneybagReturnHomeLoop", + "802ee728": "MoneybagDisappearLoop", + "802ee778": "MoneybagDeathLoop", + "802ee7e0": "bhv_moneybag_loop", + "802ee8f4": "bhv_moneybag_hidden_loop", + "802ee9cc": "bhv_bowling_ball_init", + "802eea24": "func_802EDA14", + "802eea7c": "func_802EDA6C", + "802eeb64": "bhv_bowling_ball_roll_loop", + "802eecb8": "bhv_bowling_ball_initializeLoop", + "802eedf0": "bhv_bowling_ball_loop", + "802eeeb4": "bhv_generic_bowling_ball_spawner_init", + "802eef9c": "bhv_generic_bowling_ball_spawner_loop", + "802ef0e8": "bhv_thi_bowling_ball_spawner_loop", + "802ef21c": "bhv_bob_pit_bowling_ball_init", + "802ef274": "bhv_bob_pit_bowling_ball_loop", + "802ef34c": "bhv_free_bowling_ball_init", + "802ef3f4": "bhv_free_bowling_ball_roll_loop", + "802ef524": "bhv_free_bowling_ball_loop", + "802ef63c": "bhv_rr_cruiser_wing_init", + "802ef66c": "bhv_rr_cruiser_wing_loop", + "802ef820": "bhv_spindel_init", + "802ef858": "bhv_spindel_loop", + "802efcd0": "bhv_ssl_moving_pyramid_wall_init", + "802efd8c": "bhv_ssl_moving_pyramid_wall_loop", + "802efe64": "bhv_pyramid_elevator_init", + "802efef4": "bhv_pyramid_elevator_loop", + "802f0104": "bhv_pyramid_elevator_trajectory_marker_ball_loop", + "802f0168": "bhv_pyramid_top_init", + "802f0288": "bhv_pyramid_top_spinning", + "802f04a0": "bhv_pyramid_top_explode", + "802f05b4": "bhv_pyramid_top_loop", + "802f06a8": "bhv_pyramid_top_fragment_init", + "802f0714": "bhv_pyramid_top_fragment_loop", + "802f0788": "bhv_pyramid_pillar_touch_detector_loop", + "802f07f4": "bhv_waterfall_sound_loop", + "802f0820": "bhv_volcano_sound_loop", + "802f084c": "bhv_castle_flag_init", + "802f0898": "bhv_birds_sound_loop", + "802f0950": "bhv_ambient_sounds_init", + "802f09a4": "bhv_sand_sound_loop", + "802f09f0": "bhv_castle_cannon_grate_init", + "802f0a40": "bhv_snowmans_bottom_init", + "802f0b7c": "func_802EFB2C", + "802f0bd4": "func_802EFB84", + "802f0c94": "func_802EFC44", + "802f0df0": "func_802EFDA0", + "802f0fa8": "func_802EFF58", + "802f105c": "bhv_snowmans_bottom_loop", + "802f120c": "bhv_snowmans_head_init", + "802f1370": "bhv_snowmans_head_loop", + "802f151c": "bhv_snowmans_body_checkpoint_loop", + "802f15a8": "bhv_big_boulder_init", + "802f162c": "func_802F05DC", + "802f1714": "bhv_big_boulder_loop", + "802f17f0": "bhv_big_boulder_generator_loop", + "802f1954": "func_802F0904", + "802f19c8": "func_802F0978", + "802f1a10": "func_802F09C0", + "802f1bb8": "func_802F0B68", + "802f1d64": "bhv_wing_cap_init", + "802f1dc0": "func_802F0D70", + "802f1e5c": "func_802F0E0C", + "802f1f3c": "bhv_wing_vanish_cap_loop", + "802f1fd0": "bhv_metal_cap_init", + "802f2030": "func_802F0FE0", + "802f20ac": "bhv_metal_cap_loop", + "802f2140": "bhv_normal_cap_init", + "802f21e0": "func_802F1190", + "802f2284": "func_802F1234", + "802f23a8": "bhv_normal_cap_loop", + "802f2498": "bhv_vanish_cap_init", + "802f24f4": "bhv_collect_star_init", + "802f25b0": "bhv_collect_star_loop", + "802f2614": "bhv_star_spawn_init", + "802f2768": "bhv_star_spawn_loop", + "802f2aa0": "func_802F1A50", + "802f2b88": "create_star", + "802f2bd4": "func_802F1B84", + "802f2c24": "func_802F1BD4", + "802f2c84": "bhv_hidden_red_coin_star_init", + "802f2d8c": "bhv_hidden_red_coin_star_loop", + "802f2e6c": "bhv_red_coin_init", + "802f2f2c": "bhv_red_coin_loop", + "802f3014": "bhv_hidden_star_init", + "802f30f0": "bhv_hidden_star_loop", + "802f31bc": "bhv_hidden_star_trigger_loop", + "802f328c": "bhv_bowser_course_red_coin_star_loop", + "802f336c": "bhv_ttm_rolling_log_init", + "802f341c": "func_802F238C", + "802f36a4": "bhv_rolling_log_loop", + "802f38b0": "func_802F2820", + "802f39b4": "func_802F2924", + "802f3a30": "bhvLllVolcanoFallingTrap_loop", + "802f3b98": "bhv_lll_rolling_log_init", + "802f3c54": "bhv_1up_interact", + "802f3cc8": "bhv_1up_common_init", + "802f3d30": "bhv_1up_init", + "802f3dd0": "func_802F2D40", + "802f3ea8": "func_802F2E18", + "802f401c": "func_802F2F8C", + "802f40cc": "bhv_1up_walking_loop", + "802f4248": "bhv_1up_running_away_loop", + "802f43b8": "func_802F3328", + "802f44c0": "bhv_1up_sliding_loop", + "802f45b8": "bhv_1up_loop", + "802f45f0": "bhv_1up_jump_on_approach_loop", + "802f4710": "bhv_1up_hidden_loop", + "802f48f4": "bhv_1up_hidden_trigger_loop", + "802f496c": "bhv_1up_hidden_in_pole_loop", + "802f4b00": "bhv_1up_hidden_in_pole_trigger_loop", + "802f4b78": "bhv_1up_hidden_in_pole_spawner_loop", + "802f4c68": "func_802F3BD8", + "802f4ce0": "func_802F3C50", + "802f4d78": "bhv_controllable_platform_sub_loop", + "802f4eb4": "bhv_controllable_platform_init", + "802f5010": "func_802F3F80", + "802f5068": "func_802F3FD8", + "802f52c0": "func_802F4230", + "802f547c": "func_802F43EC", + "802f55a4": "bhv_controllable_platform_loop", + "802f5cd4": "bhv_breakable_box_small_init", + "802f5d78": "func_802F4CE8", + "802f5e44": "func_802F4DB4", + "802f5f48": "breakable_box_small_released_loop", + "802f6014": "breakable_box_small_idle_loop", + "802f60d8": "breakable_box_small_get_dropped", + "802f6150": "breakable_box_small_get_thrown", + "802f6228": "bhv_breakable_box_small_loop", + "802f62e4": "bhv_sliding_snow_mound_loop", + "802f6448": "bhv_snow_mound_spawn_loop", + "802f6588": "func_802F54F8", + "802f665c": "func_802F55CC", + "802f6984": "bhv_floating_platform_loop", + "802f6c0c": "bhv_arrow_lift_loop", + "802f6d20": "bhv_orange_number_init", + "802f6d58": "bhv_orange_number_loop", + "802f6e40": "bhv_manta_ray_init", + "802f6eb0": "func_802F5E20", + "802f7068": "func_802F5FD8", + "802f7264": "bhv_manta_ray_loop", + "802f7348": "bhv_falling_pillar_init", + "802f7398": "bhv_falling_pillar_spawn_hitboxes", + "802f7418": "bhv_falling_pillar_calculate_angle_in_front_of_mario", + "802f74dc": "bhv_falling_pillar_loop", + "802f7760": "bhv_falling_pillar_hitbox_loop", + "802f7924": "bhv_jrb_floating_box_loop", + "802f7978": "bhv_decorative_pendulum_init", + "802f79b0": "bhv_decorative_pendulum_loop", + "802f7a58": "bhv_treasure_chest_top_loop", + "802f7c9c": "bhv_treasure_chest_bottom_init", + "802f7d04": "bhv_treasure_chest_bottom_loop", + "802f7f1c": "func_802F6E8C", + "802f7fa0": "bhv_treasure_chest_ship_init", + "802f8044": "bhv_treasure_chest_ship_loop", + "802f8158": "bhv_treasure_chest_jrb_init", + "802f8208": "bhv_treasure_chest_jrb_loop", + "802f82f8": "bhv_treasure_chest_init", + "802f83a4": "bhv_treasure_chest_loop", + "802f8490": "bhv_mips_init", + "802f85e0": "bhv_mips_find_furthest_waypoint_to_mario", + "802f8760": "bhv_mips_act_wait_for_nearby_mario", + "802f8808": "bhv_mips_act_follow_path", + "802f893c": "bhv_mips_act_wait_for_animation_done", + "802f8988": "bhv_mips_act_fall_down", + "802f8a34": "bhv_mips_act_idle", + "802f8ab4": "bhv_mips_free", + "802f8b54": "bhv_mips_held", + "802f8c74": "bhv_mips_dropped", + "802f8cf8": "bhv_mips_thrown", + "802f8dac": "bhv_mips_loop", + "802f8e54": "bhv_yoshi_init", + "802f8f08": "yoshi_walk_loop", + "802f9054": "yoshi_idle_loop", + "802f923c": "yoshi_talk_loop", + "802f93a8": "yoshi_walk_and_jump_off_roof_loop", + "802f9500": "yoshi_finish_jumping_and_despawn_loop", + "802f95ac": "yoshi_give_present_loop", + "802f965c": "BehYoshiLoop", + "802fbc4c": "bhv_koopa_init", + "802fc414": "shelled_koopa_attack_handler", + "802fcc00": "obj_begin_race", + "802fd7f8": "bhv_koopa_update", + "802fd950": "bhv_koopa_race_endpoint_update", + "802fda28": "bhv_pokey_body_part_update", + "802fe3b0": "bhv_pokey_update", + "802fe8b4": "bhv_swoop_update", + "802ff040": "bhv_fly_guy_update", + "802ff214": "bhv_goomba_triplet_spawner_update", + "802ff408": "bhv_goomba_init", + "802ff94c": "huge_goomba_weakly_attacked", + "802ff96c": "bhv_goomba_update", + "802ffb38": "bhv_chain_chomp_chain_part_update", + "80300e40": "bhv_chain_chomp_update", + "80300ecc": "bhv_wooden_post_update", + "80301148": "bhv_chain_chomp_gate_init", + "80301180": "bhv_chain_chomp_gate_update", + "80301210": "bhv_wiggler_body_part_update", + "803020e4": "wiggler_jumped_on_attack_handler", + "80302154": "bhv_wiggler_update", + "80302910": "bhv_spiny_update", + "80303028": "bhv_enemy_lakitu_update", + "8030369c": "bhv_cloud_update", + "80303744": "bhv_cloud_part_update", + "80303984": "bhv_camera_lakitu_init", + "80303f64": "bhv_camera_lakitu_update", + "803043f8": "bhv_monty_mole_hole_update", + "803044c0": "bhv_monty_mole_init", + "80304ba8": "bhv_monty_mole_update", + "80304fd4": "bhv_monty_mole_rock_update", + "80305100": "bhv_platform_on_track_init", + "80305a58": "bhv_platform_on_track_update", + "80305bb0": "bhv_track_ball_update", + "80305c14": "bhv_seesaw_platform_init", + "80305c90": "bhv_seesaw_platform_update", + "80305e2c": "bhv_ferris_wheel_axle_init", + "80305f24": "bhv_ferris_wheel_platform_update", + "80306084": "bhv_water_bomb_spawner_update", + "803067e8": "bhv_water_bomb_update", + "803068c0": "bhv_water_bomb_shadow_update", + "8030699c": "bhv_ttc_rotating_solid_init", + "80306a38": "bhv_ttc_rotating_solid_update", + "80306cc4": "bhv_ttc_pendulum_init", + "80306d38": "bhv_ttc_pendulum_update", + "80306f48": "bhv_ttc_treadmill_init", + "80307010": "bhv_ttc_treadmill_update", + "803071b8": "bhv_ttc_moving_bar_init", + "80307670": "bhv_ttc_moving_bar_update", + "80307760": "bhv_ttc_cog_init", + "803077e0": "bhv_ttc_cog_update", + "80307930": "bhv_ttc_pit_block_init", + "803079c8": "bhv_ttc_pit_block_update", + "80307ae4": "bhv_ttc_elevator_init", + "80307b58": "bhv_ttc_elevator_update", + "80307c88": "bhv_ttc_2d_rotator_init", + "80307cf8": "bhv_ttc_2d_rotator_update", + "80307ea4": "bhv_ttc_spinner_update", + "8030803c": "bhv_mr_blizzard_init", + "80308d6c": "bhv_mr_blizzard_update", + "80309154": "bhv_mr_blizzard_snowball", + "803091e0": "bhv_sliding_plat_2_init", + "80309354": "bhv_sliding_plat_2_loop", + "80309454": "bhv_rotating_octagonal_plat_init", + "803094d0": "bhv_rotating_octagonal_plat_loop", + "803094f8": "bhv_animates_on_floor_switch_press_init", + "80309530": "bhv_animates_on_floor_switch_press_loop", + "803097a4": "bhv_activated_back_and_forth_platform_init", + "803098c0": "bhv_activated_back_and_forth_platform_update", + "80309b64": "bhv_recovery_heart_loop", + "80309cec": "bhv_bubble_cannon_barrel_loop", + "80309ed4": "water_bomb_cannon_act_0", + "80309f68": "water_bomb_cannon_act_1", + "8030a0e8": "water_bomb_cannon_act_2", + "8030a11c": "bhv_water_bomb_cannon_loop", + "8030a1c0": "bhv_unagi_init", + "8030a2a8": "unagi_act_0", + "8030a390": "unagi_act_1_4", + "8030a514": "unagi_act_2", + "8030a614": "unagi_act_3", + "8030a93c": "bhv_unagi_loop", + "8030aabc": "bhv_unagi_subobject_loop", + "8030b2f4": "bhv_dorrie_update", + "8030b658": "bhv_haunted_chair_init", + "8030b6d8": "haunted_chair_act_0", + "8030ba68": "haunted_chair_act_1", + "8030bc90": "bhv_haunted_chair_loop", + "8030bfd0": "bhv_mad_piano_update", + "8030c06c": "flying_bookend_act_0", + "8030c0f0": "flying_bookend_act_1", + "8030c210": "flying_bookend_act_2", + "8030c2c8": "flying_bookend_act_3", + "8030c364": "bhv_flying_bookend_loop", + "8030c4b0": "bhv_bookend_spawn_loop", + "8030c564": "bookshelf_manager_act_0", + "8030c60c": "bookshelf_manager_act_1", + "8030c6a4": "bookshelf_manager_act_2", + "8030c828": "bookshelf_manager_act_3", + "8030c894": "bookshelf_manager_act_4", + "8030c8ec": "bhv_haunted_bookshelf_manager_loop", + "8030c98c": "bhv_book_switch_loop", + "8030cd30": "obj_spit_fire", + "8030cddc": "bhv_fire_piranha_plant_init", + "8030d2f0": "bhv_fire_piranha_plant_update", + "8030d598": "bhv_fire_spitter_update", + "8030d640": "bhv_small_piranha_flame_loop", + "8030d8d4": "bhv_fly_guy_flame_loop", + "8030d93c": "Geo18_8030D93C", + "8030d9ac": "Geo18_8030D9AC", + "8030da14": "snufit_act_0", + "8030db38": "snufit_act_1", + "8030dc70": "bhv_snufit_loop", + "8030dfc4": "bhv_snufit_balls_loop", + "8030e14c": "bhv_horizontal_grindel_init", + "8030e16c": "bhv_horizontal_grindel_update", + "8030ea9c": "bhv_eyerok_boss_loop", + "8030fff8": "bhv_eyerok_hand_loop", + "80310498": "bhv_klepto_init", + "8031126c": "obj_set_speed_to_zero", + "8031129c": "bhv_klepto_update", + "80311874": "bhv_bird_update", + "803118e4": "bhv_racing_penguin_init", + "80312070": "bhv_racing_penguin_update", + "80312168": "bhv_penguin_race_finish_line_update", + "80312200": "bhv_penguin_race_shortcut_check_update", + "80312248": "bhv_coffin_manager_loop", + "80312370": "coffin_act_0", + "8031262c": "coffin_act_1", + "8031274c": "bhv_coffin_loop", + "80312804": "clam_act_0", + "80312900": "clam_act_1", + "80312a54": "bhv_clam_loop", + "80313110": "bhv_skeeter_update", + "803131e8": "bhv_skeeter_wave_update", + "8031326c": "bhv_swing_platform_init", + "80313294": "bhv_swing_platform_update", + "80313354": "bhv_donut_platform_spawner_update", + "80313530": "bhv_donut_platform_update", + "803136cc": "bhv_ddd_pole_init", + "80313754": "bhv_ddd_pole_update", + "803137f4": "bhv_red_coin_star_marker_init", + "80313fc0": "bhv_triplet_butterfly_update", + "80314098": "bubba_act_0", + "8031427c": "bubba_act_1", + "803145d4": "bhv_bubba_loop", + "80314a30": "prepare_reverb_ring_buffer", + "80314cc0": "get_volume_ramping", + "80314de4": "synthesis_execute", + "80314f64": "synthesis_do_one_audio_update", + "80315590": "process_notes", + "80316010": "load_wave_samples", + "803160dc": "final_resample", + "80316138": "process_envelope", + "8031619c": "process_envelope_inner", + "803166fc": "note_apply_headset_pan_effects", + "80316ac8": "note_init_volume", + "80316af4": "note_set_vel_pan_reverb", + "80316da8": "note_set_frequency", + "80316db4": "note_enable", + "80316e00": "note_disable", + "80316e80": "reset_bank_and_seq_load_status", + "80316ec4": "discard_bank", + "80316fb4": "discard_sequence", + "80317040": "soundAlloc", + "803170b4": "sound_alloc_pool_init", + "803170d4": "persistent_pool_clear", + "803170e8": "temporary_pool_clear", + "80317118": "unused_803160F8", + "80317128": "sound_init_main_pools", + "80317184": "session_pools_init", + "80317200": "seq_and_bank_pool_init", + "8031727c": "persistent_pools_init", + "80317338": "temporary_pools_init", + "803173fc": "alloc_bank_or_seq", + "8031782c": "get_bank_or_seq", + "803178ec": "decrease_reverb_gain", + "80317914": "wait_for_audio_frames", + "80317948": "audio_reset_session", + "80318040": "audio_dma_copy_immediate", + "803180c4": "audio_dma_copy_async", + "80318130": "audio_dma_partial_copy_async", + "803181ec": "decrease_sample_dma_ttls", + "80318300": "dma_sample_data", + "80318634": "func_8031758C", + "803188f4": "func_8031784C", + "80318b30": "bank_load_immediate", + "80318c8c": "bank_load_async", + "80318dc4": "sequence_dma_immediate", + "80318e70": "sequence_dma_async", + "80318fac": "get_missing_bank", + "803190f4": "load_banks_immediate", + "80319220": "preload_sequence", + "80319328": "load_sequence", + "80319388": "load_sequence_internal", + "8031950c": "audio_init", + "80319920": "func_80318870", + "80319998": "note_disable2", + "803199b8": "func_80318908", + "80319db8": "seq_channel_layer_decay_release_internal", + "80319f64": "seq_channel_layer_note_decay", + "80319f84": "seq_channel_layer_note_release", + "80319fa4": "func_80318F04", + "8031a1d0": "func_80319164", + "8031a254": "init_note_list", + "8031a264": "init_note_lists", + "8031a2b4": "init_note_free_list", + "8031a368": "note_pool_clear", + "8031a494": "note_pool_fill", + "8031a5d0": "audio_list_push_front", + "8031a610": "audio_list_remove", + "8031a63c": "pop_node_with_value_less_equal", + "8031a6cc": "note_init_for_layer", + "8031a794": "func_80319728", + "8031a7c8": "note_release_and_take_ownership", + "8031a820": "alloc_note_from_disabled", + "8031a89c": "alloc_note_from_decaying", + "8031a8f0": "alloc_note_from_active", + "8031a94c": "alloc_note", + "8031ac34": "func_80319BC8", + "8031adac": "note_init_all", + "8031aee0": "func_80319E70", + "8031aee8": "sequence_player_process_sound", + "8031b0cc": "get_portamento_freq_scale", + "8031b1c0": "get_vibrato_pitch_change", + "8031b248": "get_vibrato_freq_scale", + "8031b440": "note_vibrato_update", + "8031b4a0": "note_vibrato_init", + "8031b58c": "adsr_init", + "8031b5ac": "adsr_update", + "8031b830": "sequence_channel_init", + "8031b940": "seq_channel_set_layer", + "8031ba30": "seq_channel_layer_disable", + "8031ba6c": "seq_channel_layer_free", + "8031baf0": "sequence_channel_disable", + "8031bb5c": "allocate_sequence_channel", + "8031bba4": "sequence_player_init_channels", + "8031bcd0": "sequence_player_disable_channels", + "8031bda0": "sequence_channel_enable", + "8031be44": "sequence_player_disable", + "8031bf14": "audio_list_push_back", + "8031bf54": "audio_list_pop_back", + "8031bf94": "func_8031AF74", + "8031c03c": "m64_read_u8", + "8031c050": "m64_read_s16", + "8031c080": "m64_read_compressed_u16", + "8031c0c4": "seq_channel_layer_process_script", + "8031c200": "L_U_8031C200", + "8031c23c": "L_U_8031C23C", + "8031c298": "L_U_8031C298", + "8031c2dc": "L_U_8031C2DC", + "8031c328": "L_U_8031C328", + "8031c36c": "L_U_8031C36C", + "8031c3bc": "L_U_8031C3BC", + "8031c3e8": "L_U_8031C3E8", + "8031c454": "L_U_8031C454", + "8031c4a4": "L_U_8031C4A4", + "8031c5c8": "L_U_8031C5C8", + "8031c698": "L_U_8031C698", + "8031c6a0": "L_U_8031C6A0", + "8031cbe0": "L_U_8031CBE0", + "8031cbec": "L_U_8031CBEC", + "8031ce54": "get_instrument", + "8031cfd4": "set_instrument", + "8031d068": "sequence_channel_set_volume", + "8031d08c": "sequence_channel_process_script", + "8031d144": "L_U_8031D144", + "8031d1f8": "L_U_8031D1F8", + "8031d234": "L_U_8031D234", + "8031d26c": "L_U_8031D26C", + "8031d2b4": "L_U_8031D2B4", + "8031d2c4": "L_U_8031D2C4", + "8031d31c": "L_U_8031D31C", + "8031d344": "L_U_8031D344", + "8031d354": "L_U_8031D354", + "8031d370": "L_U_8031D370", + "8031d3a8": "L_U_8031D3A8", + "8031d3c4": "L_U_8031D3C4", + "8031d3d4": "L_U_8031D3D4", + "8031d3e4": "L_U_8031D3E4", + "8031d400": "L_U_8031D400", + "8031d424": "L_U_8031D424", + "8031d44c": "L_U_8031D44C", + "8031d474": "L_U_8031D474", + "8031d498": "L_U_8031D498", + "8031d4bc": "L_U_8031D4BC", + "8031d4d4": "L_U_8031D4D4", + "8031d4f0": "L_U_8031D4F0", + "8031d500": "L_U_8031D500", + "8031d51c": "L_U_8031D51C", + "8031d538": "L_U_8031D538", + "8031d56c": "L_U_8031D56C", + "8031d5a0": "L_U_8031D5A0", + "8031d5b4": "L_U_8031D5B4", + "8031d5d4": "L_U_8031D5D4", + "8031d5e4": "L_U_8031D5E4", + "8031d640": "L_U_8031D640", + "8031d678": "L_U_8031D678", + "8031d6c4": "L_U_8031D6C4", + "8031d6d4": "L_U_8031D6D4", + "8031d6f4": "L_U_8031D6F4", + "8031d718": "L_U_8031D718", + "8031d728": "L_U_8031D728", + "8031d73c": "L_U_8031D73C", + "8031d7b8": "L_U_8031D7B8", + "8031d7e8": "L_U_8031D7E8", + "8031d7f8": "L_U_8031D7F8", + "8031d814": "L_U_8031D814", + "8031d830": "L_U_8031D830", + "8031d87c": "L_U_8031D87C", + "8031d898": "L_U_8031D898", + "8031d8f8": "L_U_8031D8F8", + "8031d900": "L_U_8031D900", + "8031d930": "L_U_8031D930", + "8031d94c": "L_U_8031D94C", + "8031d974": "L_U_8031D974", + "8031d9ec": "sequence_player_process_sequence", + "8031e240": "process_sequences", + "8031e2e8": "init_sequence_player", + "8031e374": "func_8031D4B8", + "8031e4f0": "unused_8031E4F0", + "8031e568": "unused_8031E568", + "8031e7b8": "create_next_audio_frame_task", + "8031eb00": "play_sound", + "8031fd84": "audio_signal_game_loop_tick", + "8031fdac": "update_game_sound", + "80320544": "play_sequence", + "80320678": "sequence_player_fade_out", + "803206bc": "fade_volume_scale", + "80320734": "fade_channel_volume_scale", + "8032080c": "func_8031F96C", + "803208ec": "process_level_music_dynamics", + "80320a4c": "L8031FBAC", + "80320a8c": "L8031FBEC", + "80320acc": "L8031FC2C", + "80320b0c": "L8031FC6C", + "80320b4c": "L8031FCAC", + "80320b8c": "L8031FCEC", + "80320bcc": "L8031FD2C", + "80320bf4": "L8031FD54", + "80320d70": "unused_8031FED0", + "80320e3c": "func_8031FFB4", + "80320ec4": "sequence_player_unlower", + "80320f68": "func_803200E4", + "803210d4": "set_sound_disabled", + "8032112c": "sound_init", + "80321398": "unused_8032050C", + "80321474": "func_803205E8", + "80321584": "func_803206F8", + "8032171c": "func_80320890", + "8032174c": "sound_banks_disable", + "8032180c": "sound_banks_enable", + "80321864": "unused_803209D8", + "803218d8": "func_80320A4C", + "803218f4": "play_dialog_sound", + "803219ac": "play_music", + "80321bac": "stop_background_music", + "80321ce4": "fadeout_background_music", + "80321d38": "drop_queued_background_music", + "80321d5c": "get_current_background_music", + "80321d9c": "func_80320ED8", + "80321e48": "play_secondary_music", + "80321f48": "func_80321080", + "80321f9c": "func_803210D4", + "80322078": "play_course_clear", + "803220b4": "play_peachs_jingle", + "803220f0": "play_puzzle_jingle", + "8032212c": "play_star_fanfare", + "80322168": "play_power_star_jingle", + "803221b8": "play_race_fanfare", + "803221f4": "play_toads_jingle", + "80322230": "sound_reset", + "8032231c": "audio_set_sound_mode", + "80322348": "unused_80321460", + "8032235c": "unused_80321474", + "803223b0": ".", + "803223b0": "osSetTime", + "803223e0": "osMapTLB", + "803224a0": "osUnmapTLBAll", + "803224f0": "sprintf", + "8032255c": "proutSprintf", + "803225a0": "osCreateMesgQueue", + "803225d0": "osSetEventMesg", + "80322640": "osViSetEvent", + "803226b0": "osCreateThread", + "80322800": "osRecvMesg", + "80322940": "_VirtualToPhysicalTask", + "80322a5c": "osSpTaskLoad", + "80322bbc": "osSpTaskStartGo", + "80322c00": "osSpTaskYield", + "80322c20": "osSendMesg", + "80322d70": "osSpTaskYielded", + "80322df0": "osStartThread", + "80322f40": "osWritebackDCacheAll", + "80322f70": "osCreateViManager", + "803230f4": "viMgrMain", + "803232d0": "osViSetMode", + "80323340": "osViBlack", + "803233b0": "osViSetSpecialFeatures", + "80323570": "osCreatePiManager", + "803236f0": "osSetThreadPri", + "803237d0": "osInitialize", + "80323a00": "osViSwapBuffer", + "80323a50": "sqrtf", + "80323a60": "osContStartReadData", + "80323b24": "osContGetReadData", + "80323bcc": "__osPackReadData", + "80323cc0": "osContInit", + "80323ebc": "__osContGetInitData", + "80323f8c": "__osPackRequestData", + "80324080": "osEepromProbe", + "803240f0": "__ull_rshift", + "8032411c": "__ull_rem", + "80324158": "__ull_div", + "80324194": "__ll_lshift", + "803241c0": "__ll_rem", + "803241fc": "__ll_div", + "80324258": "__ll_mul", + "80324288": "__ull_divremi", + "803242e8": "__ll_mod", + "80324384": "__ll_rshift", + "803243b0": "osInvalDCache", + "80324460": "osPiStartDma", + "80324570": "bzero", + "80324610": "osInvalICache", + "80324690": "osEepromLongRead", + "803247d0": "osEepromLongWrite", + "80324910": "bcopy", + "80324c20": "guOrthoF", + "80324d74": "guOrtho", + "80324de0": "guPerspectiveF", + "80325010": "guPerspective", + "80325070": "osGetTime", + "80325100": "__d_to_ll", + "8032511c": "__f_to_ll", + "80325138": "__d_to_ull", + "803251d8": "__f_to_ull", + "80325274": "__ll_to_d", + "8032528c": "__ll_to_f", + "803252a4": "__ull_to_d", + "803252d8": "__ull_to_f", + "80325310": "cosf", + "80325480": "sinf", + "80325640": "guTranslateF", + "80325688": "guTranslate", + "803256e0": "guRotateF", + "80325874": "guRotate", + "803258d0": "guScaleF", + "80325924": "guScale", + "80325970": "osAiSetFrequency", + "80325bd4": "alBnkfNew", + "80325cd8": "alSeqFileNew", + "80325d20": "osWritebackDCache", + "80325da0": "osAiGetLength", + "80325db0": "osAiSetNextBuffer", + "80325e60": "__osTimerServicesInit", + "80325eec": "__osTimerInterrupt", + "80326064": "__osSetTimerIntr", + "803260d8": "__osInsertTimer", + "80326260": "_Printf", + "803273f0": "memcpy", + "8032741c": "strlen", + "80327444": "strchr", + "80327490": "__osDequeueThread", + "803274d0": "__osDisableInt", + "803274f0": "__osRestoreInt", + "80327510": "__osViInit", + "80327640": "__osExceptionPreamble", + "80327650": "__osException", + "803278e4": "L80326964", + "80327904": "L80326984", + "80327938": "L803269B8", + "80327a68": "L80326AE8", + "80327ac4": "L80326B44", + "80327ae4": "L80326B64", + "80327b1c": "L80326B9C", + "80327b68": "L80326BE8", + "80327b98": "send_mesg", + "80327c80": "__osEnqueueAndYield", + "80327d10": "__osEnqueueThread", + "80327d58": "__osPopThread", + "80327d68": "__osDispatchThread", + "80327ea8": "__osCleanupThread", + "80327eb0": "osVirtualToPhysical", + "80327f30": "__osSpSetStatus", + "80327f40": "__osSpSetPc", + "80327f80": "__osSpRawStartDma", + "80328010": "__osSpDeviceBusy", + "80328040": "__osSpGetStatus", + "80328050": "osGetThreadPri", + "80328070": "__osViGetCurrentContext", + "80328080": "__osViSwapContext", + "803283e0": "osGetCount", + "803283f0": "__osPiCreateAccessQueue", + "80328440": "__osPiGetAccess", + "80328484": "__osPiRelAccess", + "803284b0": "osPiRawStartDma", + "80328590": "__osDevMgrMain", + "80328710": "__osSetSR", + "80328720": "__osGetSR", + "80328730": "__osSetFpcCsr", + "80328740": "__osSiRawReadIo", + "80328790": "__osSiRawWriteIo", + "803287e0": "osMapTLBRdb", + "80328840": "osPiRawReadIo", + "803288a0": "__osSiCreateAccessQueue", + "803288f0": "__osSiGetAccess", + "80328934": "__osSiRelAccess", + "80328960": "__osSiRawStartDma", + "80328a10": "osSetTimer", + "80328af0": "osEepromWrite", + "80328ca0": "__osPackEepWriteData", + "80328dac": "__osEepStatus", + "80328fd0": "osJamMesg", + "80329120": "osPiGetCmdQueue", + "80329150": "osEepromRead", + "80329340": "__osPackEepReadData", + "80329450": "guMtxF2L", + "80329550": "guMtxIdentF", + "803295d8": "guMtxIdent", + "80329608": "guMtxL2F", + "803296c0": "guNormalize", + "80329750": "__osAiDeviceBusy", + "80329780": "__osSetCompare", + "80329790": "_Litob", + "80329a90": "_Ldtob", + "8032a860": "u32_to_string", + "8032a890": "string_to_u32", + "8032a8e8": "send_packet", + "8032a9a8": "send", + "8032aa80": "process_command_memory", + "8032aacc": "process_command_register", + "8032aaf8": "kdebugserver", + "8032ace0": "__osSyncPutChars", + "8032ae10": "osSetIntMask", + "8032ae70": "osDestroyThread", + "8032af70": "__osProbeTLB", + "8032b030": "__osSiDeviceBusy", + "8032b060": "lldiv", + "8032b160": "ldiv", + "8032b1f0": "__osGetCause", + "8032b200": "__osAtomicDec", + "8032b260": "rspF3DBootStart", + "8032b330": "rspF3DBootEnd", + "8032b330": "rspF3DStart", + "8032c738": "rspF3DEnd", + "8032c740": "rspAspMainStart", + "8032d560": "rspAspMainEnd", + "8032d560": "gVblankHandler1", + "8032d564": "gVblankHandler2", + "8032d568": "gActiveSPTask", + "8032d56c": "sCurrentAudioSPTask", + "8032d570": "sCurrentDisplaySPTask", + "8032d574": "sNextAudioSPTask", + "8032d578": "sNextDisplaySPTask", + "8032d57c": "sAudioEnabled", + "8032d580": "sNumVblanks", + "8032d584": "gResetTimer", + "8032d588": "D_8032C648", + "8032d58c": "gDebugLevelSelect", + "8032d590": "D_8032C650", + "8032d594": "gShowProfiler", + "8032d598": "gShowDebugText", + "8032d5d0": "unused8032C690", + "8032d5d4": "gGlobalTimer", + "8032d5dc": "frameBufferIndex", + "8032d5e0": "D_8032C6A0", + "8032d5e4": "gPlayer1Controller", + "8032d5e8": "gPlayer2Controller", + "8032d5ec": "gPlayer3Controller", + "8032d5f0": "gCurrDemoInput", + "8032d5f4": "gDemoInputListID", + "8032d5f8": "gRecordedDemoInput", + "8032d6d0": "credits01", + "8032d6d8": "credits02", + "8032d6e4": "credits03", + "8032d6f0": "credits04", + "8032d700": "credits05", + "8032d710": "credits06", + "8032d71c": "credits07", + "8032d728": "credits08", + "8032d738": "credits09", + "8032d740": "credits10", + "8032d750": "credits11", + "8032d75c": "credits12", + "8032d764": "credits13", + "8032d774": "credits14", + "8032d77c": "credits15", + "8032d788": "credits16", + "8032d79c": "credits17", + "8032d7ac": "credits18", + "8032d7bc": "credits19", + "8032d7c4": "credits20", + "8032d7cc": "sCreditsSequence", + "8032d93c": "gMarioState", + "8032d940": "unused1", + "8032d944": "D_8032C9E0", + "8032daa0": "sTerrainSounds", + "8032dacc": "sSquishScaleOverTime", + "8032dae0": "sCapFlickerFrames", + "8032daf8": "gWaterSurfacePseudoFloor", + "8032dc50": "sJumpLandAction", + "8032dc68": "sFreefallLandAction", + "8032dc80": "sSideFlipLandAction", + "8032dc98": "sHoldJumpLandAction", + "8032dcb0": "sHoldFreefallLandAction", + "8032dcc8": "sLongJumpLandAction", + "8032dce0": "sDoubleJumpLandAction", + "8032dcf8": "sTripleJumpLandAction", + "8032dd10": "sBackflipLandAction", + "8032dd40": "sPunchingForwardVelocities", + "8032dd80": "gLastCompletedCourseNum", + "8032dd84": "gLastCompletedStarNum", + "8032dd88": "sUnusedGotGlobalCoinHiScore", + "8032dd8c": "gGotFileCoinHiScore", + "8032dd90": "gCurrCourseStarFlags", + "8032dd94": "gSpecialTripleJump", + "8032dd98": "gLevelToCourseNumTable", + "8032ddc0": "gMarioSpawnInfo", + "8032ddc4": "gLoadedGraphNodes", + "8032ddc8": "gAreas", + "8032ddcc": "gCurrentArea", + "8032ddd0": "gCurrCreditsEntry", + "8032ddd4": "D_8032CE74", + "8032ddd8": "D_8032CE78", + "8032dddc": "gWarpTransDelay", + "8032dde0": "gFBSetColor", + "8032dde4": "gWarpTransFBSetColor", + "8032dde8": "gWarpTransRed", + "8032ddec": "gWarpTransGreen", + "8032ddf0": "gWarpTransBlue", + "8032ddf4": "gCurrSaveFileNum", + "8032ddf8": "gCurrLevelNum", + "8032ddfc": "D_8032CE9C", + "8032de4c": "D_8032CEEC", + "8032de60": "D_8032CF00", + "8032de70": "renderModeTable_1Cycle", + "8032deb0": "renderModeTable_2Cycle", + "8032def0": "gCurGraphNodeRoot", + "8032def4": "gCurGraphNodeMasterList", + "8032def8": "gCurGraphNodeCamFrustum", + "8032defc": "gCurGraphNodeCamera", + "8032df00": "gCurGraphNodeObject", + "8032df04": "gCurGraphNodeHeldObject", + "8032df08": "gAreaUpdateCounter", + "8032df10": "gProfilerMode", + "8032df14": "gCurrentFrameIndex1", + "8032df18": "gCurrentFrameIndex2", + "8032df20": "unused_8032CFC0", + "8032df24": "gCutsceneFocus", + "8032df28": "unused_8032CFC8", + "8032df2c": "unused_8032CFCC", + "8032df30": "gSecondCameraFocus", + "8032df34": "D_8032CFD4", + "8032df38": "gCurrLevelArea", + "8032df3c": "gPrevLevel", + "8032df40": "D_8032CFE0", + "8032df44": "D_8032CFE4", + "8032df48": "D_8032CFE8", + "8032df4c": "gCameraZoomDist", + "8032df50": "sTempCutsceneNumber", + "8032df54": "gCutsceneNumber", + "8032df58": "sCutsceneTransitionTimer", + "8032df5c": "D_8032CFFC", + "8032df60": "sMarioStatusForCamera", + "8032df64": "sLuigiStatusForCamera", + "8032df68": "D_8032D008", + "8032df6c": "sFixedPresetBasePosition", + "8032df78": "D_8032D00C_2", + "8032df84": "D_8032D00C_3", + "8032df90": "D_8032D00C_4", + "8032df9c": "D_8032D00C_5", + "8032dfa8": "TableCameraTransitions", + "8032e008": "unused_8032D0A8", + "8032e010": "unused_8032D0B0", + "8032e018": "D_8032D0B8", + "8032e050": "BBHRoom6ParallelTrackingTable", + "8032e098": "TableCameraSL", + "8032e0e0": "TableCameraTHI", + "8032e128": "TableCameraHMC", + "8032e1d0": "TableCameraSSL", + "8032e248": "TableCameraRR", + "8032e338": "TableCameraCotMC", + "8032e368": "TableCameraCCM", + "8032e3b0": "TableCameraInside", + "8032e6f8": "TableCameraBBH", + "8032ecb0": "TableLevelCinematicCamera", + "8032ed50": "sIntroStartToPipePosition", + "8032ee08": "sIntroStartToPipeFocus", + "8032eec0": "sIntroPipeToDialogPosition", + "8032ef30": "sIntroPipeToDialogFocus", + "8032efa0": "D_8032E040", + "8032eff0": "D_8032E090", + "8032f048": "D_8032E0E8", + "8032f0e8": "D_8032E188", + "8032f130": "D_8032E1D0", + "8032f178": "D_8032E218", + "8032f1b8": "D_8032E258", + "8032f214": "gIntroLakituStartToPipeFocus", + "8032f32c": "gIntroLakituStartToPipeOffsetFromCamera", + "8032f444": "D_8032E4E4", + "8032f48c": "D_8032E52C", + "8032f4d4": "TableCutscenePeachEnd", + "8032f534": "TableCutsceneGrandStar", + "8032f544": "TableCutscene0FTodo", + "8032f554": "TableCutsceneDoorWarp", + "8032f564": "TableCutsceneEndWaving", + "8032f56c": "TableCutsceneCredits", + "8032f574": "TableCutsceneDoor00", + "8032f59c": "TableCutsceneDoor01", + "8032f5c4": "TableCutsceneDoor0A", + "8032f5dc": "TableCutsceneDoor0B", + "8032f5f4": "TableCutsceneEnterCannon", + "8032f60c": "TableCutsceneStarSpawn", + "8032f624": "TableCutsceneSpecialStarSpawn", + "8032f634": "TableCutsceneEnterPainting", + "8032f63c": "TableCutsceneDeathExit", + "8032f64c": "TableCutsceneExitPaintingSuccess", + "8032f65c": "TableCutscene11Todo", + "8032f674": "TableCutsceneIntroPeach", + "8032f69c": "TableCutscenePrepareCannon", + "8032f6ac": "TableCutsceneExitWaterfall", + "8032f6bc": "TableCutsceneFallToCastleGrounds", + "8032f6cc": "TableCutsceneEnterPyramidTop", + "8032f6dc": "TableCutscene26Todo", + "8032f6f4": "TableCutsceneStandingDeath", + "8032f6fc": "TableCutsceneEnterPool", + "8032f70c": "TableCutsceneDeath2", + "8032f714": "TableCutsceneDeathOnBack", + "8032f71c": "TableCutsceneQuicksandDeath", + "8032f72c": "TableCutsceneSuffocationDeath", + "8032f734": "TableCutsceneEnterBowserPlatform", + "8032f74c": "TableCutsceneStarDance1", + "8032f754": "TableCutsceneStarDance2", + "8032f75c": "TableCutsceneStarDance3", + "8032f764": "TableCutsceneKeyDance", + "8032f76c": "TableCutsceneCapSwitchPress", + "8032f774": "TableCutsceneSlidingDoorsOpen", + "8032f784": "TableCutsceneUnlockKeyDoor", + "8032f794": "TableCutsceneExitBowserSuccess", + "8032f7a4": "TableCutscene1CTodo", + "8032f7b4": "TableCutsceneBBHExitSuccess", + "8032f7c4": "TableCutsceneNonPaintingDeath", + "8032f7d4": "TableCutsceneDialog", + "8032f7ec": "TableCutsceneReadMessage", + "8032f804": "D_8032E8A4", + "8032f870": "D_8032E910", + "8032f884": "sBobCreditsCameraPositions", + "8032f8ac": "sBobCreditsCameraFocus", + "8032f8d4": "sWfCreditsCameraPositions", + "8032f8fc": "sWfCreditsCameraFocus", + "8032f924": "sJrbCreditsCameraPositions", + "8032f94c": "sJrbCreditsCameraFocus", + "8032f974": "sCcmSlideCreditsCameraPositions", + "8032f99c": "sCcmSlideCreditsCameraFocus", + "8032f9c4": "sBbhCreditsCameraPositions", + "8032f9e4": "sBbhCreditsCameraFocus", + "8032fa04": "sHmcCreditsCameraPositions", + "8032fa2c": "sHmcCreditsCameraFocus", + "8032fa54": "sThiWigglerCreditsCameraPositions", + "8032fa6c": "sThiWigglerCreditsCameraFocus", + "8032fa84": "sVolcanoCreditsCameraPositions", + "8032fab4": "sVolcanoCreditsCameraFocus", + "8032fae4": "sSslCreditsCameraPositions", + "8032fb14": "sSslCreditsCameraFocus", + "8032fb44": "sDddCreditsCameraPositions", + "8032fb7c": "sDddCreditsCameraFocus", + "8032fbb4": "sSlCreditsCameraPositions", + "8032fbd4": "sSlCreditsCameraFocus", + "8032fbf4": "sWdwCreditsCameraPositions", + "8032fc14": "sWdwCreditsCameraFocus", + "8032fc34": "sTtmCreditsCameraPositions", + "8032fc64": "sTtmCreditsCameraFocus", + "8032fc94": "sThiHugeCreditsCameraPositions", + "8032fccc": "sThiHugeCreditsCameraFocus", + "8032fd04": "sTtcCreditsCameraPositions", + "8032fd24": "sTtcCreditsCameraFocus", + "8032fd44": "sRrCreditsCameraPositions", + "8032fd64": "sRrCreditsCameraFocus", + "8032fd84": "sSaCreditsCameraPositions", + "8032fdac": "sSaCreditsCameraFocus", + "8032fdd4": "sCotmcCreditsCameraPositions", + "8032fdfc": "sCotmcCreditsCameraFocus", + "8032fe24": "sDddSubCreditsCameraPositions", + "8032fe4c": "sDddSubCreditsCameraFocus", + "8032fe74": "sCcmOutsideCreditsCameraPositions", + "8032fe94": "sCcmOutsideCreditsCameraFocus", + "8032fec0": "sObjectListUpdateOrder", + "8032fecc": "sParticleTypes", + "80330000": "D_8032F0A0", + "80330004": "D_8032F0A4", + "80330020": "D_8032F0C0", + "8033002c": "D_8032F0CC", + "8033006c": "sMrIParticleActions", + "80330074": "sMrIActions", + "80330084": "sMrIHitbox", + "80330094": "D_8032F134", + "803300a8": "unused8032F134", + "803300ac": "sCapSwitchActions", + "803300bc": "sKingBobombActions", + "803300e0": "sKingBobombSoundStates", + "80330140": "sOpenedCannonActions", + "8033015c": "unused0EA1FC", + "80330198": "sChuckyaActions", + "803301a8": "sWFRotatingPlatformData", + "803301c0": "sKoopaShellUnderwaterHitbox", + "803301d0": "D_8032F270", + "803301e4": "sSparkleSpawnStarHitbox", + "803301f4": "sYellowCoinHitbox", + "80330204": "D_8032F2A4", + "80330224": "sCoinInsideBooActions", + "8033022c": "D_8032F2CC", + "80330244": "D_8032F2E4", + "80330260": "D_8032F300", + "80330288": "D_8032F328", + "80330290": "D_8032F330", + "80330298": "sGrindelThwompActions", + "803302ac": "sTumblingBridgeParams", + "803302dc": "sTumblingBridgeActions", + "803302ec": "D_8032F38C", + "80330318": "sElevatorActions", + "8033032c": "D_8032F3CC", + "80330340": "D_8032F3E0", + "80330354": "D_8032F3F4", + "8033035c": "D_8032F3FC", + "80330370": "sUkikiCageActions", + "80330380": "D_8032F420", + "80330390": "sSpindriftHitbox", + "803303a0": "sMetalBoxHitbox", + "803303b0": "sBreakableBoxHitbox", + "803303c0": "D_8032F460", + "803303e8": "sHeaveHoActions", + "803303f8": "sJumpingBoxHitbox", + "80330408": "sJumpingBoxActions", + "8033042c": "sBowserKeyHitbox", + "8033043c": "sBulletBillActions", + "80330450": "sBowserTailAnchorActions", + "8033045c": "D_8032F4FC", + "8033046c": "D_8032F50C", + "80330470": "D_8032F510", + "80330474": "D_8032F514", + "80330478": "sBowserDefeatedDialogText", + "80330480": "D_8032F520", + "803304c8": "sBowserActions", + "80330518": "D_8032F5B8", + "803305f0": "D_8032F690", + "803305f4": "D_8032F694", + "803305f8": "D_8032F698", + "8033067c": "sFallingBowserPlatformActions", + "80330688": "sGrowingBowserFlameHitbox", + "80330698": "sBowserFlameHitbox", + "803306a8": "D_8032F748", + "803306b4": "D_8032F754", + "803306dc": "sCageUkikiPath", + "80330738": "sUkikiSoundStates", + "803307a0": "sUkikiActions", + "803307c0": "D_8032F860", + "803307f4": "D_8032F894", + "80330828": "D_8032F8C8", + "80330830": "sRotatingCwFireBarsActions", + "80330840": "sKoopaShellHitbox", + "80330850": "D_8032F8F0", + "80330884": "D_8032F924", + "803308a8": "D_8032F948", + "803308cc": "D_8032F96C", + "803308d8": "sToxBoxActions", + "80330900": "TablePiranhaPlantActions", + "80330b1c": "sBowserPuzzlePieceActions", + "80330b38": "sTuxiesMotherActions", + "80330b44": "sSmallPenguinActions", + "80330b5c": "sFishActions", + "80330b68": "sFishGroupActions", + "80330b74": "sBirdChirpChirpActions", + "80330b84": "sCheepCheepActions", + "80330b90": "sExclamationBoxHitbox", + "80330ba0": "sExclamationBoxContents", + "80330c20": "sExclamationBoxActions", + "80330c38": "sSkullSlidingBoxHitbox", + "80330c48": "D_8032FCE8", + "80330c58": "sTweesterHitbox", + "80330c68": "sTweesterActions", + "80330cd4": "sScuttlebugHitbox", + "80330ce4": "sWhompActions", + "80330d0c": "D_8032FDAC", + "80330d30": "D_8032FDD0", + "80330d54": "D_8032FDF4", + "80330d78": "D_8032FE18", + "80330d9c": "sWindParticleHitbox", + "80330dac": "D_8032FE4C", + "80330e20": "D_8032FEC0", + "80330e24": "unused_8032FEC4", + "80330e34": "gMarioPlatform", + "80330e40": "sDebugEffectStringInfo", + "80330e64": "sDebugEnemyStringInfo", + "80330e88": "sDebugInfoDPadMask", + "80330e8c": "sDebugInfoDPadUpdID", + "80330e90": "sDebugLvSelectCheckFlag", + "80330e94": "sDebugPage", + "80330e98": "sNoExtraDebug", + "80330e9c": "sDebugStringArrPrinted", + "80330ea0": "sDebugSysCursor", + "80330ea4": "sDebugInfoButtonSeqID", + "80330ea8": "sDebugInfoButtonSeq", + "80330ec0": "D_8032FF60", + "80330ec4": "D_8032FF64", + "80330ec8": "D_8032FF68", + "80330ee0": "rectangles", + "80330f00": "sSkyboxTextures", + "80330f28": "sSkyboxColors", + "80330f30": "gMovtexCounter", + "80330f34": "gMovtexCounterPrev", + "80330f38": "gMovtexVtxColor", + "80330f3c": "gPaintingMarioYEntry", + "80330f40": "gWdwWaterLevelSet", + "80330f44": "gMovtexIdToTexture", + "80330f64": "gMovtexNonColored", + "803311a4": "gMovtexColored", + "8033127c": "gMovtexColored2", + "80331300": "hmcPaintings", + "80331308": "insideCastlePaintings", + "80331344": "ttmPaintings", + "8033134c": "paintingGroups", + "80331358": "gPaintingUpdateCounter", + "8033135c": "gLastPaintingUpdateCounter", + "80331360": "sTextLabelsCount", + "80331370": "gDialogCharWidths", + "80331470": "gDialogBoxState", + "80331474": "gDialogBoxOpenTimer", + "80331478": "gDialogBoxScale", + "8033147c": "gDialogScrollOffsetY", + "80331480": "gDialogBoxType", + "80331484": "gDialogID", + "80331488": "gLastDialogPageStrPos", + "8033148c": "gDialogTextPos", + "80331490": "gDialogLineNum", + "80331494": "gLastDialogResponse", + "80331498": "gMenuHoldKeyIndex", + "8033149c": "gMenuHoldKeyTimer", + "803314a0": "gDialogResponse", + "803314b0": "gHudSymCoin", + "803314b4": "gHudSymX", + "803314f8": "gMenuMode", + "803314fc": "gEndCutsceneStrEn0", + "80331504": "gEndCutsceneStrEn1", + "80331538": "gEndCutsceneStrEn2", + "80331558": "gEndCutsceneStrEn3", + "8033156c": "gEndCutsceneStrEn4", + "80331598": "gEndCutsceneStrEn5", + "803315ac": "gEndCutsceneStrEn6", + "803315cc": "gEndCutsceneStrEn7", + "803315dc": "gEndCutsceneStrEn8", + "803315e4": "gEndCutsceneStringsEn", + "8033160c": "gCutsceneMsgFade", + "80331610": "gCutsceneMsgIndex", + "80331614": "gCutsceneMsgDuration", + "80331618": "gCutsceneMsgTimer", + "8033161c": "gDialogCameraAngleIndex", + "80331620": "gDialogCourseActNum", + "803316c8": "gCourseCompleteCoinsEqual", + "803316cc": "gCourseDoneMenuTimer", + "803316d0": "gCourseCompleteCoins", + "803316d4": "gHudFlash", + "80331750": "gEnvFxMode", + "80331754": "D_80330644", + "80331758": "gSnowTempVtx", + "80331788": "gSnowFlakeVertex1", + "80331790": "gSnowFlakeVertex2", + "80331798": "gSnowFlakeVertex3", + "803317a0": "D_80330690", + "803317a4": "D_80330694", + "803317a8": "gBubbleTempVtx", + "803317e0": "MacroObjectPresets", + "803325fc": "sPowerMeterVisibleTimer", + "80332610": "D_80331500", + "80332614": "D_80331504", + "80332618": "D_80331508", + "8033261c": "D_8033150C", + "80332620": "D_80331510", + "803327a8": "sBreakableBoxSmallHitbox", + "80332b00": "sMrBlizzardHitbox", + "80332b10": "D_80331A00", + "80332b24": "sMrBlizzardSnowballHitbox", + "80332b34": "D_80331A24", + "80332b54": "D_80331A44", + "80332b5c": "D_80331A4C", + "80332b64": "D_80331A54", + "80332bdc": "D_80331ACC", + "80332bf0": "sRecoveryHeartHitbox", + "80332c00": "sUnagiHitbox", + "80332c10": "sHauntedChairHitbox", + "80332c30": "sFlyingBookendHitbox", + "80332c40": "D_80331B30", + "80332c4c": "sBookSwitchHitbox", + "80332c5c": "sFirePiranhaPlantHitbox", + "80332c6c": "D_80331B5C", + "80332c74": "sPiranhaPlantFireHitbox", + "80332c84": "sSnufitHitbox", + "80332c94": "sSnufitBulletHitbox", + "80332ca4": "sEyerokHitbox", + "80332cb4": "D_80331BA4", + "80332d10": "D_80331C00", + "80332d28": "sClamShellHitbox", + "80332d38": "sSkeeterHitbox", + "80332d48": "D_80331C38", + "80332e50": "gAudioErrorFlags", + "80332e54": "sGameLoopTicked", + "80332e58": "sDialogSpeaker", + "80332f04": "sDialogSpeakerVoice", + "80332f40": "sNumProcessedSoundRequests", + "80332f44": "sSoundRequestCount", + "80332f48": "sDynBbh", + "80332f54": "sDynDdd", + "80332f6c": "sDynJrb", + "80332f88": "sDynWdw", + "80332f98": "sDynHmc", + "80332fa8": "sDynUnk38", + "80332fb8": "sDynNone", + "80332fbc": "sCurrentMusicDynamic", + "80332fc0": "sBackgroundMusicForDynamics", + "80332fc4": "sLevelDynamics", + "80333060": "sMusicDynamics", + "803330c0": "gAreaEchoLevel", + "80333138": "D_80332028", + "80333188": "sBackgroundMusicDefaultVolume", + "803331ac": "gPlayer0CurSeqId", + "803331b0": "sMusicDynamicDelay", + "803331b4": "D_803320A4", + "803331c0": "D_803320B0", + "803331cc": "D_803320BC", + "803331d8": "D_803320C8", + "803331e4": "sNumSoundsPerBank", + "803331f0": "gDefaultSoundArgs", + "803331fc": "gUnusedSoundArgs", + "80333208": "gSoundBankDisabled", + "80333218": "D_80332108", + "8033321c": "sHasStartedFadeOut", + "80333220": "D_80332110", + "80333224": "sUnused80332114", + "80333228": "sUnused80332118", + "8033322c": "D_8033211C", + "80333230": "D_80332120", + "80333234": "D_80332124", + "80333238": "sBackgroundMusicQueueSize", + "8033323c": "sUnused8033323C", + "803332a0": "gAudioSessionPresets", + "80333498": "gAudioCosineTable", + "80333598": "gPitchBendFrequencyScale", + "80333994": "gNoteFrequencies", + "80333b94": "gDefaultShortNoteVelocityTable", + "80333ba4": "gDefaultShortNoteDurationTable", + "80333bb4": "gVibratoCurve", + "80333bc4": "gDefaultEnvelope", + "80333bd0": "sSineWave", + "80333c50": "sSquareWave", + "80333cd0": "sTriangleWave", + "80333d50": "sSawtoothWave", + "80333dd0": "gWaveSamples", + "80333de0": "gHeadsetPanQuantization", + "80333df4": "gHeadsetPanVolume", + "80333ff4": "gStereoPanVolume", + "803341f4": "gDefaultPanVolume", + "803343f4": "gVolRampingLhs136", + "803345f4": "gVolRampingRhs136", + "803347f4": "gVolRampingLhs144", + "803349f4": "gVolRampingRhs144", + "80334bf4": "gVolRampingLhs128", + "80334df4": "gVolRampingRhs128", + "80334ff4": "gTatumsPerBeat", + "80334ff8": "gUnusedCount80333EE8", + "80334ffc": "gAudioHeapSize", + "80335000": "D_80333EF0", + "80335004": "gAudioLoadLock", + "80335008": "sUnused8033EF8", + "80335010": "osViModeTable", + "803358d0": "viMgrMainArgs", + "803358f0": "piMgrArgs", + "80335910": "osClockRate", + "80335918": "D_80334808", + "80335920": "D_80334810", + "80335930": "D_80334820", + "80335940": "D_80334830", + "80335950": "_spaces", + "80335974": "_zeroes", + "803359a0": "D_80334890", + "803359a4": "unknown", + "803359a8": "D_80334898", + "803359ac": "D_8033489C", + "803359b0": "D_803348A0", + "803359b4": "D_803348A4", + "803359c0": "D_803348B0", + "80335a20": "D_80334910", + "80335a24": "D_80334914", + "80335a28": "D_80334918", + "80335a2c": "D_8033491C", + "80335a30": "D_80334920", + "80335a44": "D_80334934", + "80335a48": "D_80334938", + "80335a50": "gOsPiAccessQueueCreated", + "80335a60": "gOsSiAccessQueueCreated", + "80335aa0": "D_80334990", + "80335af0": "D_803349E0", + "80335b40": "D_80334A30", + "80335b44": "D_80334A34", + "80335b48": "D_80334A38", + "80335b50": "D_80334A40", + "80335b54": "D_80334A44", + "80338da0": "D_80337BB0", + "80338da8": "D_80337BB8", + "80338e60": "jtbl_80337C90", + "80338e84": "jtbl_80337CB4", + "80338eac": "jtbl_80337CDC", + "80338ec0": "jtbl_80337D08", + "80338fbc": "jtbl_80337E04", + "8033978c": "jtbl_80338418", + "80339880": "length_str", + "80339884": "flags_str", + "8033988c": "flags_arr", + "80339980": "D_80338610", + "803399a0": "jtbl_80338630", + "803399d0": "NAN", + "803399e0": "D_80338670", + "80339a40": "D_803386D0", + "80339ac0": "rspF3DDataStart", + "8033a2c0": "rspF3DDataEnd", + "8033a2c0": "rspAspMainDataStart", + "8033a580": "rspAspMainDataEnd", + "8033a580": "_mainSegmentEnd", + "008c0c40": "_mainSegmentRomEnd", + "8033a580": "_mainSegmentNoloadStart", + "8033a580": "D_80339210", + "8033a730": "gIdleThread", + "8033a8e0": "gMainThread", + "8033aa90": "gGameLoopThread", + "8033ac40": "gSoundThread", + "8033adf0": "gPIMesgQueue", + "8033ae08": "gIntrMesgQueue", + "8033ae20": "gSPTaskMesgQueue", + "8033ae38": "gDmaMesgBuf", + "8033ae40": "gPIMesgBuf", + "8033aec0": "gSIEventMesgBuf", + "8033aec8": "gIntrMesgBuf", + "8033af08": "gUnknownMesgBuf", + "8033af48": "gDmaIoMesg", + "8033af5c": "D_80339BEC", + "8033af60": "gDmaMesgQueue", + "8033af78": "gSIEventMesgQueue", + "8033af90": "gControllers", + "8033afe8": "gControllerStatuses", + "8033aff8": "gControllerPads", + "8033b010": "gGameVblankQueue", + "8033b028": "D_80339CB8", + "8033b040": "D_80339CD0", + "8033b044": "D_80339CD4", + "8033b048": "gGameVblankHandler", + "8033b050": "gPhysicalFrameBuffers", + "8033b05c": "gPhysicalZBuffer", + "8033b060": "D_80339CF0", + "8033b064": "D_80339CF4", + "8033b068": "gGfxSPTask", + "8033b06c": "gDisplayListHead", + "8033b070": "gGfxPoolEnd", + "8033b074": "gGfxPool", + "8033b078": "gControllerBits", + "8033b079": "gEepromProbe", + "8033b080": "D_80339D10", + "8033b090": "gDemo", + "8033b0a0": "filler80339D30", + "8033b170": "gMarioStates", + "8033b238": "sCurrPlayMode", + "8033b23a": "D_80339ECA", + "8033b23c": "sTransitionTimer", + "8033b240": "sTransitionUpdate", + "8033b244": "unused3", + "8033b248": "sWarpDest", + "8033b250": "D_80339EE0", + "8033b252": "sDelayedWarpOp", + "8033b254": "sDelayedWarpTimer", + "8033b256": "sSourceWarpNodeId", + "8033b258": "sDelayedWarpArg", + "8033b25c": "unused4", + "8033b25e": "sTimerRunning", + "8033b260": "gHudDisplay", + "8033b26e": "gShouldNotPlayCastleMusic", + "8033b270": "sDelayInvincTimer", + "8033b272": "sInvulnerable", + "8033b280": "unused80339F10", + "8033b288": "filler80339F1C", + "8033b2c0": "D_80339F50", + "8033b350": "D_80339FE0", + "8033b3b0": "gBodyStates", + "8033b494": "D_8033A124", + "8033b4a0": "gWarpCheckpoint", + "8033b4a5": "gMainMenuDataModified", + "8033b4a6": "gSaveFileModified", + "8033b4b0": "gPlayerSpawnInfos", + "8033b4d0": "D_8033A160", + "8033b8d0": "gAreaData", + "8033bab0": "gWarpTransition", + "8033bac6": "gCurrCourseNum", + "8033bac8": "gCurrActNum", + "8033baca": "gCurrAreaIndex", + "8033bacc": "gSavedCourseNum", + "8033bace": "gPauseScreenMode", + "8033bad0": "gSaveOptSelectIndex", + "8033bae0": "gMatStackIndex", + "8033bae8": "gMatStack", + "8033c2e8": "gMatStackFixed", + "8033c368": "gGeoTempState", + "8033c378": "gCurAnimType", + "8033c379": "gCurAnimEnabled", + "8033c37a": "gCurrAnimFrame", + "8033c37c": "gCurAnimTranslationMultiplier", + "8033c380": "gCurrAnimAttribute", + "8033c384": "gCurAnimData", + "8033c388": "gDisplayListHeap", + "8033c390": "gProfilerFrameData", + "8033c520": "gPlayerStatusForCamera", + "8033c568": "sCameraPosition", + "8033c578": "sCameraFocus", + "8033c588": "D_8033B218", + "8033c594": "sCreditsCameraPitch", + "8033c596": "sCreditsCameraYaw", + "8033c598": "gFramesPaused", + "8033c5a0": "D_8033B230", + "8033c5c0": "sCameraTransition", + "8033c5e8": "sGeometryForMario", + "8033c61c": "unused_8033B2AC", + "8033c61e": "sCameraYawVelocity", + "8033c620": "sCameraYawAfterDoorCutscene", + "8033c622": "unused_spline_pitch", + "8033c624": "unused_spline_yaw", + "8033c628": "sSplineParameters", + "8033c668": "sSplineParameterMax", + "8033c66c": "sPositionAlongSpline", + "8033c670": "sSplinePositionLimit", + "8033c674": "sCameraCutscenePitchOffset", + "8033c676": "sCameraCutsceneYawOffset", + "8033c678": "sCameraCutsceneRollOffset", + "8033c67c": "unused_8033B30C", + "8033c680": "unused_8033B310", + "8033c684": "gCameraModeFlags", + "8033c686": "unused_8033B316", + "8033c688": "sCameraSideCFlags", + "8033c68a": "unused_8033B31A", + "8033c68c": "gCameraFlags1", + "8033c68e": "gCButtonsPressed", + "8033c690": "D_8033B320", + "8033c698": "gCameraStatus", + "8033c758": "unused_8033B3E8", + "8033c75a": "sYawFocToMario", + "8033c75c": "D_8033B3EC", + "8033c75e": "D_8033B3EE", + "8033c760": "D_8033B3F0", + "8033c764": "D_8033B3F4", + "8033c768": "sCSideButtonYaw", + "8033c76a": "D_8033B3FA", + "8033c76c": "D_8033B3FC", + "8033c770": "sFirstPersonCameraPitch", + "8033c772": "sFirstPersonCameraYaw", + "8033c774": "D_8033B404", + "8033c776": "sPlatformLevelPresetBaseYaw", + "8033c778": "gPlatformLevelYawOffset", + "8033c77c": "D_8033B40C", + "8033c780": "D_8033B410", + "8033c788": "D_8033B418", + "8033c7d0": "sFixedPresetBasePositionOffset", + "8033c7dc": "D_8033B46C", + "8033c7e0": "D_8033B470", + "8033c7e8": "D_8033B478", + "8033c808": "D_8033B498", + "8033c828": "D_8033B4B8", + "8033c848": "gCameraMovementFlags", + "8033c84a": "gCameraFlags2", + "8033c850": "D_8033B4E0", + "8033c950": "D_8033B5E0", + "8033ca50": "sCutsceneSplineSegment", + "8033ca54": "sCutsceneSplineSegmentProgress", + "8033ca58": "D_8033B6E8", + "8033ca5a": "D_8033B6EA", + "8033ca5c": "gCutsceneTimer", + "8033ca60": "D_8033B6F0", + "8033cbc8": "gCutsceneActive", + "8033cbcc": "sCutscenePhase", + "8033cbd0": "gCurrLevelCamera", + "8033cbe0": "gObjectListArray", + "8033d260": "gDebugInfoFlags", + "8033d264": "gNumFindFloorMisses", + "8033d268": "unused_8033BEF8", + "8033d26c": "gUnknownWallCount", + "8033d270": "gObjectCounter", + "8033d274": "gNumCalls", + "8033d280": "gDebugInfo", + "8033d380": "gDebugInfoOverwrite", + "8033d480": "gTimeStopState", + "8033d488": "gObjectPool", + "80360e88": "gMacroObjectDefaultParent", + "803610e8": "gObjectLists", + "803610f0": "gFreeObjectList", + "80361158": "gMarioObject", + "8036115c": "gLuigiObject", + "80361160": "gCurrentObject", + "80361164": "gBehCommand", + "80361168": "gPrevFrameObjectCount", + "8036116c": "gSurfaceNodesAllocated", + "80361170": "gSurfacesAllocated", + "80361174": "gNumStaticSurfaceNodes", + "80361178": "gNumStaticSurfaces", + "8036117c": "gObjectMemoryPool", + "80361180": "gCheckingSurfaceCollisionsForCamera", + "80361182": "gFindFloorIncludeSurfaceIntangible", + "80361184": "gEnvironmentRegions", + "80361188": "gEnvironmentLevels", + "803611d8": "gDoorAdjacentRooms", + "80361250": "gMarioCurrentRoom", + "80361252": "D_8035FEE2", + "80361254": "D_8035FEE4", + "80361256": "gTHIWaterDrained", + "80361258": "gTTCSpeedSetting", + "8036125a": "gMarioShotFromCannon", + "8036125c": "gCCMEnteredSlide", + "8036125e": "gNumRoomedObjectsInMarioRoom", + "80361260": "gNumRoomedObjectsNotInMarioRoom", + "80361262": "gWDWWaterLevelChanging", + "80361264": "gMarioOnMerryGoRound", + "80361270": "sGrabReleaseState", + "80361280": "D_8035FF10", + "80361290": "gDebugPrintState1", + "803612a0": "gDebugPrintState2", + "803612b0": "sMarioOnFlyingCarpet", + "803612b2": "sSurfaceTypeBelowShadow", + "803612b4": "gShadowAboveWaterOrLava", + "803612b5": "gMarioOnIceOrCarpet", + "803612c0": "sSkyBoxInfo", + "803612e0": "gMovetexLastTextureId", + "803612f0": "gFlyingCarpetState", + "80361300": "gPaintingMarioFloorType", + "80361304": "gPaintingMarioXPos", + "80361308": "gPaintingMarioYPos", + "8036130c": "gPaintingMarioZPos", + "80361310": "D_8035FFA0", + "80361314": "D_8035FFA4", + "80361318": "ripplingPainting", + "8036131c": "dddStatus", + "80361320": "sTextLabels", + "803613f0": "gDialogColorFadeTimer", + "803613f2": "gLastDialogLineNum", + "803613f4": "gDialogVariable", + "803613f8": "gDialogTextAlpha", + "803613fa": "gCutsceneMsgXOffset", + "803613fc": "gCutsceneMsgYOffset", + "803613fe": "gRedCoinsCollected", + "80361400": "gEnvFxBuffer", + "80361408": "gSnowCylinderLastPos", + "80361414": "gSnowParticleCount", + "80361416": "gSnowParticleMaxCount", + "80361420": "gEnvFxBubbleConfig", + "80361450": "D_803600E0", + "80361460": "sNumActiveFirePiranhaPlants", + "80361464": "sNumKilledFirePiranhaPlants", + "80361468": "sObjSavedPosX", + "8036146c": "sObjSavedPosY", + "80361470": "sObjSavedPosZ", + "80361474": "sMontyMoleHoleList", + "80361478": "sMontyMoleKillStreak", + "8036147c": "sMontyMoleLastKilledPosX", + "80361480": "sMontyMoleLastKilledPosY", + "80361484": "sMontyMoleLastKilledPosZ", + "80361488": "sMasterTreadmill", + "80361490": "gCurrAiBuffer", + "80361498": "sSoundRequests", + "80361c98": "D_80360928", + "80361f98": "D_80360C28", + "80361fa8": "D_80360C38", + "80361fb8": "gSoundBanks", + "80364b78": "D_80363808", + "80364b82": "D_80363812", + "80364b88": "sBackgroundMusicQueue", + "80364ba0": "D_80363830", + "80364c20": "D_803638B0", + "80364c60": "viMgrThread", + "80364e10": "viMgrStack", + "80365e10": "__osViMesgQueue", + "80365e28": "viMgrMesgBuff", + "80365e40": "viEventViMesg", + "80365e58": "viEventCounterMesg", + "80365e70": "piMgrThread", + "80366020": "piMgrStack", + "80367020": "__osPiMesgQueue", + "80367038": "piMgrMesgBuff", + "80367040": "D_80365CD0", + "80367050": "D_80365CE0", + "8036708c": "D_80365D1C", + "80367090": "D_80365D20", + "80367091": "_osCont_numControllers", + "80367098": "D_80365D28", + "803670b8": "_osContMesgQueue", + "803670d0": "_osContMesgBuff", + "803670f0": "D_80365D80", + "80367110": "_osCurrentTime", + "80367118": "D_80365DA8", + "8036711c": "D_80365DAC", + "80367120": "D_80365DB0", + "80367130": "osPiMesgBuff", + "80367138": "gOsPiMessageQueue", + "80367150": "osSiMesgBuff", + "80367158": "gOsSiMessageQueue", + "80367170": "D_80365E00", + "803671ac": "D_80365E3C", + "803671b0": "D_80365E40", + "803672b0": "gInterruptedThread", + "80367460": "_mainSegmentNoloadEnd", + "0000cee0": "_mainSegmentNoloadSizeLo", + "00000002": "_mainSegmentNoloadSizeHi", + "00000001": "ASSERT", + "80378800": "_engineSegmentStart", + "007cc6c0": "_engineSegmentRomStart", + "80378800": "vec3f_copy", + "80378840": "vec3f_set", + "8037888c": "vec3f_add", + "803788e4": "vec3f_sum", + "8037893c": "vec3s_copy", + "8037897c": "vec3s_set", + "803789c8": "vec3s_add", + "80378a20": "vec3s_sum", + "80378a78": "vec3s_sub", + "80378ad0": "vec3s_to_vec3f", + "80378b34": "vec3f_to_vec3s", + "80378c50": "find_vector_perpendicular_to_plane", + "80378d38": "vec3f_cross", + "80378dc0": "vec3f_normalize", + "80378e68": "mtxf_copy", + "80378eb4": "mtxf_identity", + "80378f24": "mtxf_translate", + "80378f84": "mtxf_lookat", + "80379440": "mtxf_rotate_zxy_and_translate", + "803795f0": "mtxf_rotate_xyz_and_translate", + "80379798": "mtxf_billboard", + "80379918": "mtxf_align_terrain_normal", + "80379aa4": "mtxf_align_terrain_triangle", + "80379f60": "mtxf_mul", + "8037a29c": "mtxf_scale_vec3f", + "8037a348": "mtxf_mul_vec3s", + "8037a434": "mtxf_to_mtx", + "8037a4b8": "mtxf_rotate_xy", + "8037a550": "get_pos_from_transform_mtx", + "8037a69c": "vec3f_get_dist_and_angle", + "8037a788": "vec3f_set_dist_and_angle", + "8037a860": "approach_s32", + "8037a8b4": "approach_f32", + "8037a9a8": "atan2s", + "8037ab88": "atan2f", + "8037abec": "spline_get_weights", + "8037afb8": "anim_spline_init", + "8037afe8": "anim_spline_poll", + "8037b220": "init_scene_graph_node_links", + "8037b24c": "init_graph_node_root", + "8037b30c": "init_graph_node_ortho_projection", + "8037b380": "init_graph_node_perspective", + "8037b448": "init_graph_node_start", + "8037b4ac": "init_graph_node_master_list", + "8037b530": "init_graph_node_render_range", + "8037b5b4": "init_graph_node_switch_case", + "8037b670": "init_graph_node_camera", + "8037b744": "init_graph_node_translation_rotation", + "8037b7f8": "init_graph_node_translation", + "8037b89c": "init_graph_node_rotation", + "8037b940": "init_graph_node_scale", + "8037b9e0": "init_graph_node_object", + "8037bad4": "init_graph_node_culling_radius", + "8037bb48": "init_graph_node_animated_part", + "8037bbec": "init_graph_node_billboard", + "8037bc90": "init_graph_node_display_list", + "8037bd24": "init_graph_node_shadow", + "8037bdb4": "init_graph_node_object_parent", + "8037be28": "init_graph_node_generated", + "8037becc": "init_graph_node_background", + "8037bf84": "init_graph_node_held_object", + "8037c044": "geo_add_child", + "8037c0bc": "geo_remove_child", + "8037c138": "geo_make_first_child", + "8037c1e4": "geo_call_global_function_nodes_helper", + "8037c360": "geo_call_global_function_nodes", + "8037c3d0": "geo_reset_object_node", + "8037c448": "geo_obj_init", + "8037c51c": "geo_obj_init_spawninfo", + "8037c658": "geo_obj_init_animation", + "8037c708": "geo_obj_init_animation_accel", + "8037c7d8": "retrieve_animation_index", + "8037c844": "geo_update_animation_frame", + "8037c9e8": "geo_retreive_animation_translation", + "8037cb10": "geo_find_root", + "8037cb60": "read_vec3s_to_vec3f", + "8037cbc0": "read_vec3s", + "8037cbfc": "read_vec3s_angle", + "8037cc74": "register_scene_graph_node", + "8037cd60": "geo_layout_cmd_branch_and_link", + "8037ce24": "geo_layout_cmd_end", + "8037cee8": "geo_layout_cmd_branch", + "8037cf70": "geo_layout_cmd_return", + "8037cfc0": "geo_layout_cmd_open_node", + "8037d018": "geo_layout_cmd_close_node", + "8037d050": "geo_layout_cmd_assign_as_view", + "8037d0d0": "geo_layout_cmd_update_node_flags", + "8037d1d0": "geo_layout_cmd_node_root", + "8037d328": "geo_layout_cmd_node_ortho_projection", + "8037d3a4": "geo_layout_cmd_node_perspective", + "8037d48c": "geo_layout_cmd_node_start", + "8037d4dc": "geo_layout_cmd_nop3", + "8037d500": "geo_layout_cmd_node_master_list", + "8037d55c": "geo_layout_cmd_node_level_of_detail", + "8037d5d4": "geo_layout_cmd_node_switch_case", + "8037d640": "geo_layout_cmd_node_camera", + "8037d6f0": "geo_layout_cmd_node_translation_rotation", + "8037d8d4": "geo_layout_cmd_node_translation", + "8037d998": "geo_layout_cmd_node_rotation", + "8037da5c": "geo_layout_cmd_node_scale", + "8037db50": "geo_layout_cmd_nop2", + "8037db74": "geo_layout_cmd_node_animated_part", + "8037dc10": "geo_layout_cmd_node_billboard", + "8037dcd4": "geo_layout_cmd_node_display_list", + "8037dd4c": "geo_layout_cmd_node_shadow", + "8037dddc": "geo_layout_cmd_node_object_parent", + "8037de34": "geo_layout_cmd_node_generated", + "8037de94": "geo_layout_cmd_node_background", + "8037def8": "geo_layout_cmd_nop", + "8037df1c": "geo_layout_cmd_copy_view", + "8037dfd4": "geo_layout_cmd_node_held_obj", + "8037e058": "geo_layout_cmd_node_culling_radius", + "8037e0b4": "process_geo_layout", + "803805c8": "level_script_execute", + "80380de8": "f32_find_wall_collision", + "80380e8c": "find_wall_collisions", + "80381264": "find_ceil", + "803814b8": "find_floor_height_and_data", + "80381794": "find_floor_height", + "80381900": "find_floor", + "80381ba0": "find_water_level", + "80381d3c": "find_poison_gas_level", + "80381f08": "debug_surface_list_info", + "80383340": "alloc_surface_pools", + "803833b8": "load_area_terrain", + "803835a4": "clear_dynamic_surfaces", + "803839cc": "load_object_collision_model", + "80383bb0": "RandomU16", + "80383cb4": "RandomFloat", + "80383d1c": "RandomSign", + "80383d68": "func_80383D68", + "80385bf0": "stub_80385BF0", + "80385c00": "cur_object_exec_behavior", + "80385f90": "identityMtx", + "80385fb0": "zeroMtx", + "80385fd0": "gVec3fZero", + "80385fdc": "gVec3sZero", + "80385fe4": "gVec3fOne", + "80385ff0": "gVec3sOne", + "80386000": "gSineTable", + "80387000": "gCosineTable", + "8038b000": "gArctanTable", + "8038b810": "GeoLayoutJumpTable", + "8038b894": "unused_8038B894", + "8038bc90": "_engineSegmentEnd", + "007dfb50": "_engineSegmentRomEnd", + "8038bc90": "_engineSegmentNoloadStart", + "8038bc90": "gSplineKeyframe", + "8038bc94": "gSplineKeyframeFraction", + "8038bc98": "gSplineState", + "8038bca0": "gGraphNodePool", + "8038bca4": "gCurRootGraphNode", + "8038bca8": "D_8038BCA8", + "8038bcac": "gGeoViews", + "8038bcb0": "gGeoNumViews", + "8038bcb8": "gGeoLayoutStack", + "8038bcf8": "gCurGraphNodeList", + "8038bd78": "gCurGraphNodeIndex", + "8038bd7a": "gGeoLayoutStackIndex", + "8038bd7c": "D_8038BD7C", + "8038bd7e": "gGeoLayoutReturnIndex", + "8038bd80": "gGeoLayoutCommand", + "8038bd88": "gObjParentGraphNode", + "8038be30": "sFloorGeo", + "8038be90": "unused8038BE90", + "8038be98": "gStaticSurfacePartition", + "8038d698": "gDynamicSurfacePartition", + "8038ee98": "sSurfaceNodePool", + "8038ee9c": "sSurfacePool", + "8038eea0": "sSurfacePoolSize", + "8038eea8": "unused8038EEA8", + "8038eef0": "_engineSegmentNoloadEnd", + "00000001": "ASSERT", + "8038f800": ".", + "8038f800": "_framebuffersSegmentNoloadStart", + "8038f800": "0x70800", + "8038f800": "gFrameBuffer0", + "803b5000": "gFrameBuffer1", + "803da800": "gFrameBuffer2", + "80400000": "_framebuffersSegmentNoloadEnd", + "80400000": "__expansionRamStart", + "00000001": "ASSERT", + "10000000": "_entrySegmentStart", + "007cc6c0": "_entrySegmentRomStart", + "10000000": "level_script_entry", + "10000030": "_entrySegmentEnd", + "007cc6f0": "_entrySegmentRomEnd", + "02000000": "_segment2_mio0SegmentStart", + "007cc6c0": "_segment2_mio0SegmentRomStart", + "0200bd10": ".", + "0200bd10": "_segment2_mio0SegmentEnd", + "007d83d0": "_segment2_mio0SegmentRomEnd", + "04000000": "_group0_mio0SegmentStart", + "007cc6c0": "_group0_mio0SegmentRomStart", + "04013260": ".", + "04013260": "_group0_mio0SegmentEnd", + "007df920": "_group0_mio0SegmentRomEnd", + "17000000": "_group0_geoSegmentStart", + "007cc6c0": "_group0_geoSegmentRomStart", + "17000000": "bubble_geo", + "1700001c": "purple_marble_geo", + "17000038": "smoke_geo", + "17000084": "burn_smoke_geo", + "1700009c": "spot_on_ground_geo", + "170000e0": "mario_TODO_geo_0000E0", + "17000124": "water_waves_surface_geo", + "17000168": "water_waves_geo", + "170001bc": "sparkles_geo", + "17000230": "water_splash_geo", + "17000284": "sparkles_animation_geo", + "170002e0": "mario_geo_face_and_wings", + "1700041c": "mario_geo_left_hand", + "17000494": "mario_geo_right_hand", + "1700053c": "mario_geo_body", + "170006f8": "mario_geo_medium_poly_left_hand", + "17000770": "mario_geo_medium_poly_right_hand", + "17000818": "mario_geo_medium_poly_body", + "170009d4": "mario_geo_low_poly_face_and_wings", + "17000b10": "mario_geo_low_poly_left_hand", + "17000b88": "mario_geo_low_poly_right_hand", + "17000c30": "mario_geo_low_poly_body", + "17000dec": "mario_vanish_geo_face_and_wings", + "17000f28": "mario_vanish_geo_left_hand", + "17000fa0": "mario_vanish_geo_right_hand", + "17001048": "mario_vanish_geo_body", + "17001204": "mario_vanish_geo_medium_poly_left_hand", + "1700127c": "mario_vanish_geo_medium_poly_right_hand", + "17001324": "mario_vanish_geo_medium_poly_body", + "170014e0": "mario_vanish_geo_low_poly_face_and_wings", + "1700161c": "mario_vanish_geo_low_poly_left_hand", + "17001694": "mario_vanish_geo_low_poly_right_hand", + "1700173c": "mario_vanish_geo_low_poly_body", + "170018f8": "mario_metal_geo_face_and_wings", + "170019a4": "mario_metal_geo_left_hand", + "17001a1c": "mario_metal_geo_right_hand", + "17001ac4": "mario_metal_geo_body", + "17001c80": "mario_metal_geo_medium_poly_left_hand", + "17001cf8": "mario_metal_geo_medium_poly_right_hand", + "17001da0": "mario_metal_geo_medium_poly_body", + "17001f5c": "mario_metal_geo_low_poly_face_and_wings", + "17002008": "mario_metal_geo_low_poly_left_hand", + "17002080": "mario_metal_geo_low_poly_right_hand", + "17002128": "mario_metal_geo_low_poly_body", + "170022e4": "mario_metal_vanish_geo_face_and_wings", + "17002390": "mario_metal_vanish_geo_left_hand", + "17002408": "mario_metal_vanish_geo_right_hand", + "170024b0": "mario_metal_vanish_geo_body", + "1700266c": "mario_metal_vanish_geo_medium_poly_left_hand", + "170026e4": "mario_metal_vanish_geo_medium_poly_right_hand", + "1700278c": "mario_metal_vanish_geo_medium_poly_body", + "17002958": "mario_metal_vanish_geo_low_poly_face_and_wings", + "17002a04": "mario_metal_vanish_geo_low_poly_left_hand", + "17002a7c": "mario_metal_vanish_geo_low_poly_right_hand", + "17002b24": "mario_metal_vanish_geo_low_poly_body", + "17002ce0": "mario_geo_load_body", + "17002d14": "mario_geo_load_medium_poly_body", + "17002d48": "mario_geo_load_low_poly_body", + "17002d7c": "mario_geo_render_body", + "17002dd4": "mario_geo", + "17002e30": "_group0_geoSegmentEnd", + "007cf4f0": "_group0_geoSegmentRomEnd", + "05000000": "_group1_mio0SegmentStart", + "007cc6c0": "_group1_mio0SegmentRomStart", + "05008070": ".", + "05008070": "_group1_mio0SegmentEnd", + "007d4730": "_group1_mio0SegmentRomEnd", + "0c000000": "_group1_geoSegmentStart", + "007cc6c0": "_group1_geoSegmentRomStart", + "0c000000": "yellow_sphere_geo", + "0c000018": "hoot_geo", + "0c0001e4": "yoshi_egg_geo", + "0c000248": "thwomp_geo", + "0c000264": "bullet_bill_geo", + "0c00028c": "heave_ho_geo", + "0c000410": "_group1_geoSegmentEnd", + "007ccad0": "_group1_geoSegmentRomEnd", + "05000000": "_group2_mio0SegmentStart", + "007cc6c0": "_group2_mio0SegmentRomStart", + "05001e10": ".", + "05001e10": "_group2_mio0SegmentEnd", + "007ce4d0": "_group2_mio0SegmentRomEnd", + "0c000000": "_group2_geoSegmentStart", + "007cc6c0": "_group2_geoSegmentRomStart", + "0c000000": "bully_geo", + "0c000120": "bully_boss_geo", + "0c000240": "blargg_geo", + "0c0002b0": "_group2_geoSegmentEnd", + "007cc970": "_group2_geoSegmentRomEnd", + "05000000": "_group3_mio0SegmentStart", + "007cc6c0": "_group3_mio0SegmentRomStart", + "050068b0": ".", + "050068b0": "_group3_mio0SegmentEnd", + "007d2f70": "_group3_mio0SegmentRomEnd", + "0c000000": "_group3_geoSegmentStart", + "007cc6c0": "_group3_geoSegmentRomStart", + "0c000000": "king_bobomb_geo", + "0c000308": "water_bomb_geo", + "0c000328": "water_bomb_shadow_geo", + "0c000340": "_group3_geoSegmentEnd", + "007cca00": "_group3_geoSegmentRomEnd", + "05000000": "_group4_mio0SegmentStart", + "007cc6c0": "_group4_mio0SegmentRomStart", + "0500a300": ".", + "0500a300": "_group4_mio0SegmentEnd", + "007d69c0": "_group4_mio0SegmentRomEnd", + "0c000000": "_group4_geoSegmentStart", + "007cc6c0": "_group4_geoSegmentRomStart", + "0c000000": "clam_shell_geo", + "0c000068": "sushi_geo", + "0c00010c": "unagi_geo", + "0c000280": "_group4_geoSegmentEnd", + "007cc940": "_group4_geoSegmentRomEnd", + "05000000": "_group5_mio0SegmentStart", + "007cc6c0": "_group5_mio0SegmentRomStart", + "0500bce0": ".", + "0500bce0": "_group5_mio0SegmentEnd", + "007d83a0": "_group5_mio0SegmentRomEnd", + "0c000000": "_group5_geoSegmentStart", + "007cc6c0": "_group5_geoSegmentRomStart", + "0c000000": "klepto_geo", + "0c0002ac": "eyerok_geo_0002AC", + "0c0005a8": "eyerok_left_hand_geo", + "0c0005e4": "eyerok_right_hand_geo", + "0c000610": "pokey_head_geo", + "0c000644": "pokey_body_part_geo", + "0c000660": "_group5_geoSegmentEnd", + "007ccd20": "_group5_geoSegmentRomEnd", + "05000000": "_group6_mio0SegmentStart", + "007cc6c0": "_group6_mio0SegmentRomStart", + "0500e110": ".", + "0500e110": "_group6_mio0SegmentEnd", + "007da7d0": "_group6_mio0SegmentRomEnd", + "0c000000": "_group6_geoSegmentStart", + "007cc6c0": "_group6_geoSegmentRomStart", + "0c000000": "monty_mole_geo", + "0c000110": "ukiki_geo", + "0c00036c": "fwoosh_geo", + "0c000390": "_group6_geoSegmentEnd", + "007cca50": "_group6_geoSegmentRomEnd", + "05000000": "_group7_mio0SegmentStart", + "007cc6c0": "_group7_mio0SegmentRomStart", + "05005070": ".", + "05005070": "_group7_mio0SegmentEnd", + "007d1730": "_group7_mio0SegmentRomEnd", + "0c000000": "_group7_geoSegmentStart", + "007cc6c0": "_group7_geoSegmentRomStart", + "0c000000": "spindrift_geo", + "0c000104": "penguin_geo", + "0c00021c": "mr_blizzard_hidden_geo", + "0c000348": "mr_blizzard_geo", + "0c000370": "_group7_geoSegmentEnd", + "007cca30": "_group7_geoSegmentRomEnd", + "05000000": "_group8_mio0SegmentStart", + "007cc6c0": "_group8_mio0SegmentRomStart", + "05001180": ".", + "05001180": "_group8_mio0SegmentEnd", + "007cd840": "_group8_mio0SegmentRomEnd", + "0c000000": "_group8_geoSegmentStart", + "007cc6c0": "_group8_geoSegmentRomStart", + "0c000000": "springboard_top_geo", + "0c000018": "springboard_spring_geo", + "0c000030": "springboard_bottom_geo", + "0c000048": "cap_switch_geo", + "0c000090": "_group8_geoSegmentEnd", + "007cc750": "_group8_geoSegmentRomEnd", + "05000000": "_group9_mio0SegmentStart", + "007cc6c0": "_group9_mio0SegmentRomStart", + "05006960": ".", + "05006960": "_group9_mio0SegmentEnd", + "007d3020": "_group9_mio0SegmentRomEnd", + "0c000000": "_group9_geoSegmentStart", + "007cc6c0": "_group9_geoSegmentRomStart", + "0c000000": "bookend_part_geo", + "0c0000c0": "bookend_geo", + "0c0000d8": "haunted_chair_geo", + "0c000188": "small_key_geo", + "0c0001b4": "mad_piano_geo", + "0c000224": "boo_geo", + "0c000274": "haunted_cage_geo", + "0c0002b0": "_group9_geoSegmentEnd", + "007cc970": "_group9_geoSegmentRomEnd", + "05000000": "_group10_mio0SegmentStart", + "007cc6c0": "_group10_mio0SegmentRomStart", + "05012cd0": ".", + "05012cd0": "_group10_mio0SegmentEnd", + "007df390": "_group10_mio0SegmentRomEnd", + "0c000000": "_group10_geoSegmentStart", + "007cc6c0": "_group10_geoSegmentRomStart", + "0c000000": "birds_geo", + "0c000098": "peach_geo_000098", + "0c000254": "peach_geo_000254", + "0c000410": "peach_geo", + "0c000468": "yoshi_geo", + "0c000670": "_group10_geoSegmentEnd", + "007ccd30": "_group10_geoSegmentRomEnd", + "05000000": "_group11_mio0SegmentStart", + "007cc6c0": "_group11_mio0SegmentRomStart", + "050073f0": ".", + "050073f0": "_group11_mio0SegmentEnd", + "007d3ab0": "_group11_mio0SegmentRomEnd", + "0c000000": "_group11_geoSegmentStart", + "007cc6c0": "_group11_geoSegmentRomStart", + "0c000000": "bubba_geo", + "0c000030": "wiggler_head_geo", + "0c0001bc": "enemy_lakitu_geo", + "0c000290": "spiny_ball_geo", + "0c000328": "spiny_geo", + "0c0004a0": "_group11_geoSegmentEnd", + "007ccb60": "_group11_geoSegmentRomEnd", + "06000000": "_group12_mio0SegmentStart", + "007cc6c0": "_group12_mio0SegmentRomStart", + "06030c30": ".", + "06030c30": "_group12_mio0SegmentEnd", + "007fd2f0": "_group12_mio0SegmentRomEnd", + "0d000000": "_group12_geoSegmentStart", + "007cc6c0": "_group12_geoSegmentRomStart", + "0d000000": "bowser_flames_geo", + "0d000090": "invisible_bowser_accessory_geo", + "0d0000b0": "bowser_1_yellow_sphere_geo", + "0d0000d8": "bowser_geo_0000D8", + "0d000424": "bowser_geo_000424", + "0d000770": "bowser_geo_000770", + "0d000ab8": "bowser_shadow_geo", + "0d000ac4": "bowser_geo", + "0d000b40": "bowser2_geo", + "0d000bbc": "bowser_bomb_geo", + "0d000bfc": "bowser_impact_smoke_geo", + "0d000c50": "_group12_geoSegmentEnd", + "007cd310": "_group12_geoSegmentRomEnd", + "06000000": "_group13_mio0SegmentStart", + "007cc6c0": "_group13_mio0SegmentRomStart", + "0600a0f0": ".", + "0600a0f0": "_group13_mio0SegmentEnd", + "007d67b0": "_group13_mio0SegmentRomEnd", + "0d000000": "_group13_geoSegmentStart", + "007cc6c0": "_group13_geoSegmentRomStart", + "0d000000": "skeeter_geo", + "0d000284": "seaweed_geo", + "0d0002f4": "water_mine_geo", + "0d000324": "cyan_fish_geo", + "0d00038c": "bub_geo", + "0d000414": "water_ring_geo", + "0d000450": "treasure_chest_base_geo", + "0d000468": "treasure_chest_lid_geo", + "0d000480": "_group13_geoSegmentEnd", + "007ccb40": "_group13_geoSegmentRomEnd", + "06000000": "_group14_mio0SegmentStart", + "007cc6c0": "_group14_mio0SegmentRomStart", + "06013a60": ".", + "06013a60": "_group14_mio0SegmentEnd", + "007e0120": "_group14_mio0SegmentRomEnd", + "0d000000": "_group14_geoSegmentStart", + "007cc6c0": "_group14_geoSegmentRomStart", + "0d000000": "koopa_flag_geo", + "0d0000b8": "wooden_post_geo", + "0d0000d0": "koopa_without_shell_geo", + "0d000214": "koopa_with_shell_geo", + "0d000358": "piranha_plant_geo", + "0d000480": "whomp_geo", + "0d0005d0": "metallic_ball_geo", + "0d0005ec": "chain_chomp_geo", + "0d000680": "_group14_geoSegmentEnd", + "007ccd40": "_group14_geoSegmentRomEnd", + "06000000": "_group15_mio0SegmentStart", + "007cc6c0": "_group15_mio0SegmentRomStart", + "0600c8e0": ".", + "0600c8e0": "_group15_mio0SegmentEnd", + "007d8fa0": "_group15_mio0SegmentRomEnd", + "0d000000": "_group15_geoSegmentStart", + "007cc6c0": "_group15_geoSegmentRomStart", + "0d000000": "lakitu_geo", + "0d000114": "toad_geo_000114", + "0d00027c": "toad_geo_00027C", + "0d0003e4": "toad_geo", + "0d000448": "mips_geo", + "0d0005b0": "boo_castle_geo", + "0d000600": "_group15_geoSegmentEnd", + "007cccc0": "_group15_geoSegmentRomEnd", + "06000000": "_group16_mio0SegmentStart", + "007cc6c0": "_group16_mio0SegmentRomStart", + "06002ba0": ".", + "06002ba0": "_group16_mio0SegmentEnd", + "007cf260": "_group16_mio0SegmentRomEnd", + "0d000000": "_group16_geoSegmentStart", + "007cc6c0": "_group16_geoSegmentRomStart", + "0d000000": "moneybag_geo_000000", + "0d000078": "moneybag_geo_000078", + "0d0000f0": "moneybag_geo", + "0d000150": "_group16_geoSegmentEnd", + "007cc810": "_group16_geoSegmentRomEnd", + "06000000": "_group17_mio0SegmentStart", + "007cc6c0": "_group17_mio0SegmentRomStart", + "06009c50": ".", + "06009c50": "_group17_mio0SegmentEnd", + "007d6310": "_group17_mio0SegmentRomEnd", + "0d000000": "_group17_geoSegmentStart", + "007cc6c0": "_group17_geoSegmentRomStart", + "0d000000": "mr_i_geo", + "0d00001c": "mr_i_iris_geo", + "0d0000dc": "swoop_geo", + "0d0001a0": "snufit_geo", + "0d000230": "dorrie_geo", + "0d000394": "scuttlebug_geo", + "0d0006d0": "_group17_geoSegmentEnd", + "007ccd90": "_group17_geoSegmentRomEnd", + "08000000": "_common0_mio0SegmentStart", + "007cc6c0": "_common0_mio0SegmentRomStart", + "0800e6d0": ".", + "0800e6d0": "_common0_mio0SegmentEnd", + "007dad90": "_common0_mio0SegmentRomEnd", + "0f000000": "_common0_geoSegmentStart", + "007cc6c0": "_common0_geoSegmentRomStart", + "0f000000": "blue_coin_switch_geo", + "0f000020": "test_platform_geo", + "0f000028": "amp_geo", + "0f0001a8": "cannon_base_geo", + "0f0001c0": "cannon_barrel_geo", + "0f0001d8": "chuckya_geo", + "0f0004cc": "purple_switch_geo", + "0f0004e4": "checkerboard_platform_geo", + "0f0004fc": "heart_geo", + "0f000518": "flyguy_geo", + "0f0005d0": "breakable_box_geo", + "0f000610": "breakable_box_small_geo", + "0f000640": "bowling_ball_geo", + "0f00066c": "bowling_ball_track_geo", + "0f000694": "exclamation_box_geo", + "0f0006e4": "goomba_geo", + "0f0007b8": "black_bobomb_geo", + "0f0008f4": "bobomb_buddy_geo", + "0f000a30": "metal_box_geo", + "0f000a58": "exclamation_box_outline_geo", + "0f000ab0": "koopa_shell_geo", + "0f000adc": "koopa_shell2_geo", + "0f000b08": "koopa_shell3_geo", + "0f000b40": "_common0_geoSegmentEnd", + "007cd200": "_common0_geoSegmentRomEnd", + "03000000": "_common1_mio0SegmentStart", + "007cc6c0": "_common1_mio0SegmentRomStart", + "03017990": ".", + "03017990": "_common1_mio0SegmentEnd", + "007e4050": "_common1_mio0SegmentRomEnd", + "16000000": "_common1_geoSegmentStart", + "007cc6c0": "_common1_geoSegmentRomStart", + "16000000": "mist_geo", + "16000020": "white_puff_geo", + "16000040": "explosion_geo", + "160000a8": "butterfly_geo", + "1600013c": "yellow_coin_geo", + "160001a0": "yellow_coin_no_shadow_geo", + "16000200": "blue_coin_geo", + "16000264": "blue_coin_no_shadow_geo", + "160002c4": "red_coin_geo", + "16000328": "red_coin_no_shadow_geo", + "16000388": "warp_pipe_geo", + "160003a8": "castle_door_geo", + "1600043c": "cabin_door_geo", + "160004d0": "wooden_door_geo", + "16000564": "wooden_door2_geo", + "160005f8": "metal_door_geo", + "1600068c": "hazy_maze_door_geo", + "16000720": "haunted_door_geo", + "160007b4": "castle_door_0_star_geo", + "16000868": "castle_door_1_star_geo", + "1600091c": "castle_door_3_stars_geo", + "160009d0": "key_door_geo", + "16000a84": "bowser_key_geo", + "16000ab0": "bowser_key_cutscene_geo", + "16000b10": "red_flame_shadow_geo", + "16000b2c": "red_flame_geo", + "16000b8c": "blue_flame_geo", + "16000bec": "fish_shadow_geo", + "16000c44": "fish_geo", + "16000c8c": "leaves_geo", + "16000ca4": "marios_cap_geo", + "16000cf0": "marios_metal_cap_geo", + "16000d3c": "marios_wing_cap_geo", + "16000da8": "marios_winged_metal_cap_geo", + "16000e14": "number_geo", + "16000e84": "mushroom_1up_geo", + "16000ea0": "star_geo", + "16000ed4": "dirt_animation_geo", + "16000f24": "cartoon_star_geo", + "16000f6c": "transparent_star_geo", + "16000f98": "white_particle_geo", + "16000fb4": "wooden_signpost_geo", + "16000fe8": "bubbly_tree_geo", + "16001000": "spiky_tree_geo", + "16001018": "snow_tree_geo", + "16001030": "spiky_tree1_geo", + "16001048": "palm_tree_geo", + "16001060": "_common1_geoSegmentEnd", + "007cd720": "_common1_geoSegmentRomEnd", + "13000000": "_behaviorSegmentStart", + "007cc6c0": "_behaviorSegmentRomStart", + "13000000": "bhvStarDoor", + "13000054": "bhvMrI", + "1300008c": "bhvMrIBody", + "130000ac": "bhvMrIParticle", + "130000f8": "bhvPurpleParticle", + "13000118": "bhvGiantPole", + "13000144": "bhvPoleGrabbing", + "13000174": "bhvThiHugeIslandTop", + "13000194": "bhvThiTinyIslandTop", + "130001ac": "bhvCapSwitchBase", + "130001cc": "bhvCapSwitch", + "130001f4": "bhvKingBobomb", + "13000254": "bhvBobombAnchorMario", + "13000278": "bhvBetaChestBottom", + "1300029c": "bhvBetaChestLid", + "130002b8": "bhvBubbleMario", + "130002e4": "bhvBubbleMaybe", + "13000338": "bhvSmallWaterWave", + "13000398": "bhvSmallWaterWave398", + "130003bc": "bhvWaterAirBubble", + "13000400": "bhvSmallParticle", + "13000428": "bhvWaterWaves", + "13000444": "bhvSmallParticleSnow", + "1300046c": "bhvSmallParticleBubbles", + "13000494": "bhvFishGroup", + "130004a8": "bhvCannon", + "130004e4": "bhvCannonBarrel", + "13000500": "bhvCannonBaseUnused", + "13000528": "bhvChuckya", + "13000584": "bhvChuckyaAnchorMario", + "130005a8": "bhvUnused05A8", + "130005b4": "bhvRotatingPlatform", + "130005d8": "bhvTower", + "13000600": "bhvBulletBillCannon", + "13000624": "bhvWfBreakableWallRight", + "13000638": "bhvWfBreakableWallLeft", + "1300066c": "bhvKickableBoard", + "130006a4": "bhvTowerDoor", + "130006d8": "bhvRotatingCounterClockwise", + "130006e0": "bhvWfRotatingWoodenPlatform", + "13000708": "bhvKoopaShellUnderwater", + "13000720": "bhvExitPodiumWarp", + "1300075c": "bhvFadingWarp", + "13000780": "bhvWarp", + "130007a0": "bhvWarpPipe", + "130007dc": "bhvWhitePuffExplosion", + "130007f8": "bhvSpawnedStar", + "1300080c": "bhvUnused080C", + "13000830": "bhvMrIBlueCoin", + "13000888": "bhvCoinInsideBoo", + "130008d0": "bhvCoinFormationSpawn", + "130008ec": "bhvCoinFormation", + "1300090c": "bhvOneCoin", + "1300091c": "bhvYellowCoin", + "13000940": "bhvTemporaryYellowCoin", + "13000964": "bhvThreeCoinsSpawn", + "13000984": "bhvTenCoinsSpawn", + "130009a4": "bhvSingleCoinGetsSpawned", + "130009e0": "bhvCoinSparkles", + "13000a14": "bhvGoldenCoinSparkles", + "13000a34": "bhvWallTinyStarParticle", + "13000a54": "bhvWallTinyStarParticleSpawn", + "13000a78": "bhvPoundTinyStarParticle", + "13000a98": "bhvPoundTinyStarParticleSpawn", + "13000abc": "bhvPunchTinyTriangle", + "13000ad8": "bhvPunchTinyTriangleSpawn", + "13000afc": "bhvDoorWarp", + "13000b0c": "bhvDoor", + "13000b58": "bhvGrindel", + "13000b8c": "bhvThwomp2", + "13000bc8": "bhvThwomp", + "13000c04": "bhvTumblingBridgePlatform", + "13000c28": "bhvWfTumblingBridge", + "13000c44": "bhvBbhTumblingBridge", + "13000c64": "bhvLllTumblingBridge", + "13000c84": "bhvFlame", + "13000cc8": "bhvAnotherElavator", + "13000cfc": "bhvRrElevatorPlatform", + "13000d30": "bhvHmcElevatorPlatform", + "13000d6c": "bhvWaterMist", + "13000d98": "bhvWaterMistSpawn", + "13000db4": "bhvBreakBoxTriangle", + "13000dd8": "bhvWaterMist2", + "13000dfc": "bhvUnused0DFC", + "13000e24": "bhvPoundWhitePuffs", + "13000e3c": "bhvGroundSand", + "13000e58": "bhvGroundSnow", + "13000e70": "bhvWind", + "13000e88": "bhvEndToad", + "13000eac": "bhvEndPeach", + "13000ed0": "bhvUnusedParticleSpawn", + "13000f08": "bhvUkiki", + "13000f14": "bhvUkikiCageChild", + "13000f2c": "bhvUkikiCageStar", + "13000f48": "bhvUkikiCage", + "13000f9c": "bhvBitfsSinkingPlatforms", + "13000fc8": "bhvBitfsSinkingCagePlatform", + "13001000": "bhvDddMovingPole", + "13001030": "bhvBitfsTiltingSquarePlatform", + "13001064": "bhvSquishablePlatform", + "13001098": "bhvCutOutObject", + "130010a8": "bhvBetaMovingFlamesSpawn", + "130010b8": "bhvBetaMovingFlames", + "130010d8": "bhvRrRotatingBridgePlatform", + "13001108": "bhvFlamethrower", + "13001124": "bhvFlamethrowerFlame", + "13001168": "bhvBouncingFireball", + "13001184": "bhvBouncingFireballFlame", + "130011d0": "bhvBowserShockWave", + "130011ec": "bhvFlameMario", + "13001214": "bhvBlackSmokeMario", + "13001254": "bhvBlackSmokeBowser", + "1300127c": "bhvBlackSmokeUpward", + "13001298": "bhvBetaFishSplashSpawner", + "130012b4": "bhvSpindrift", + "130012f4": "bhvTowerPlatformGroup", + "13001318": "bhvWfSlidingTowerPlatform", + "13001340": "bhvWfElevatorTowerPlatform", + "13001368": "bhvWfSolidTowerPlatform", + "13001390": "bhvSnowLeafParticleSpawn", + "130013a8": "bhvTreeSnow", + "130013c4": "bhvTreeLeaf", + "130013dc": "bhvAnotherTiltingPlatform", + "13001408": "bhvSquarishPathMoving", + "1300142c": "bhvPiranhaPlantBubble", + "13001448": "bhvPiranhaPlantWakingBubbles", + "13001468": "bhvFloorSwitchAnimatesObject", + "13001478": "bhvFloorSwitchGrills", + "13001484": "bhvFloorSwitchHardcodedModel", + "130014ac": "bhvFloorSwitchHiddenObjects", + "130014bc": "bhvHiddenObject", + "130014e0": "bhvBreakableBox", + "13001518": "bhvPushableMetalBox", + "13001548": "bhvHeaveHo", + "130015a4": "bhvHeaveHoThrowMario", + "130015c0": "bhvCcmTouchedStarSpawn", + "130015e4": "bhvUnusedPoundablePlatform", + "13001608": "bhvBetaTrampolineTop", + "13001634": "bhvBetaTrampolineSpring", + "13001650": "bhvJumpingBox", + "1300167c": "bhvBooCage", + "130016ac": "bhvStub", + "130016b8": "bhvIgloo", + "130016e4": "bhvBowserKey", + "13001714": "bhvGrandStar", + "13001744": "bhvBetaBooKey", + "13001778": "bhvAlphaBooKey", + "1300179c": "bhvBulletBill", + "130017f4": "bhvWhitePuffSmoke", + "13001820": "bhvUnused1820", + "13001828": "bhvBowserTailAnchor", + "13001850": "bhvBowser", + "130018cc": "bhvBowserBodyAnchor", + "13001904": "bhvBowserFlameSpawn", + "13001920": "bhvTiltingBowserLavaPlatform", + "13001958": "bhvFallingBowserPlatform", + "13001984": "bhvBlueBowserFlame", + "130019c8": "bhvFlameFloatingLanding", + "13001a0c": "bhvBlueFlamesGroup", + "13001a30": "bhvFlameBouncing", + "13001a74": "bhvFlameMovingForwardGrowing", + "13001aa4": "bhvFlameBowser", + "13001ae8": "bhvFlameLargeBurningOut", + "13001b2c": "bhvBlueFish", + "13001b54": "bhvTankFishGroup", + "13001b70": "bhvCheckerboardElevatorGroup", + "13001b88": "bhvCheckerboardPlatformSub", + "13001bb4": "bhvBowserKeyUnlockDoor", + "13001bd4": "bhvBowserKeyCourseExit", + "13001bf4": "bhvInvisibleObjectsUnderBridge", + "13001c04": "bhvWaterLevelPillar", + "13001c34": "bhvDddWarp", + "13001c58": "bhvMoatGrills", + "13001c7c": "bhvClockMinuteHand", + "13001c8c": "bhvClockHourHand", + "13001cb0": "bhvMacroUkiki", + "13001d0c": "bhvStub1D0C", + "13001d14": "bhvLllRotatingHexagonalPlatform", + "13001d40": "bhvLllSinkingRockBlock", + "13001d70": "bhvStub1D70", + "13001d78": "bhvLllMovingOctagonalMeshPlatform", + "13001da4": "bhvSnowBall", + "13001da8": "bhvLllRotatingBlockWithFireBars", + "13001dcc": "bhvLllRotatingHexFlame", + "13001e04": "bhvLllWoodPiece", + "13001e30": "bhvLllFloatingWoodBridge", + "13001e4c": "bhvVolcanoFlames", + "13001e6c": "bhvLllRotatingHexagonalRing", + "13001e94": "bhvLllSinkingRectangularPlatform", + "13001ec4": "bhvLllSinkingSquarePlatforms", + "13001ef8": "bhvLllTiltingSquarePlatform", + "13001f30": "bhvUnused1F30", + "13001f3c": "bhvKoopaShell", + "13001f68": "bhvKoopaShellFlame", + "13001f90": "bhvToxBox", + "13001fbc": "bhvPiranhaPlant", + "13002018": "bhvLllHexagonalMesh", + "13002038": "bhvLllBowserPuzzlePiece", + "13002068": "bhvLllBowserPuzzle", + "13002088": "bhvTuxiesMother", + "130020d8": "bhvPenguinBaby", + "130020e0": "bhvUnused20E0", + "130020e8": "bhvSmallPenguin", + "1300213c": "bhvFish2", + "1300214c": "bhvFish3", + "1300215c": "bhvLargeFishGroup", + "13002178": "bhvFishGroup2", + "13002194": "bhvWdwExpressElevator", + "130021c0": "bhvWdwExpressElevatorPlatform", + "130021e4": "bhvChirpChirp", + "130021f4": "bhvChirpChirpUnused", + "1300220c": "bhvBub", + "13002250": "bhvExclamationBox", + "1300227c": "bhvRotatingExclamationMark", + "1300229c": "bhvSoundSpawner", + "130022b8": "bhvRockSolid", + "130022d8": "bhvBowserSubDoor", + "13002308": "bhvBowsersSub", + "13002338": "bhvSushiShark", + "13002388": "bhvSushiSharkCollisionChild", + "130023a4": "bhvJrbSlidingBox", + "130023d0": "bhvShipPart3", + "130023ec": "bhvInSunkenShip3", + "1300241c": "bhvSunkenShipPart", + "1300243c": "bhvUnused243C", + "1300244c": "bhvSunkenShipPart2", + "1300246c": "bhvInSunkenShip", + "13002480": "bhvInSunkenShip2", + "130024ac": "bhvMarioDustGenerator", + "130024dc": "bhvWhitePuff1", + "13002500": "bhvWhitePuff2", + "13002528": "bhvWhitePuffSmoke2", + "13002558": "bhvPurpleSwitchHiddenBoxes", + "13002568": "bhvBlueCoinSwitch", + "13002588": "bhvHiddenBlueCoin", + "130025c0": "bhvOpenableCageDoor", + "130025e0": "bhvOpenableGrill", + "130025f8": "bhvWaterLevelDiamond", + "13002620": "bhvInitializeChangingWaterLevel", + "13002634": "bhvTornadoSandParticle", + "13002650": "bhvTornado", + "13002684": "bhvMerryGoRoundBooManager", + "1300269c": "bhvAnimatedTexture", + "130026d4": "bhvBooInCastle", + "13002710": "bhvBooWithCage", + "13002768": "bhvBalconyBigBoo", + "1300277c": "bhvMerryGoRoundBigBoo", + "13002790": "bhvGhostHuntBigBoo", + "130027d0": "bhvCourtyardBooTriplet", + "130027e4": "bhvBoo", + "130027f4": "bhvMerryGoRoundBoo", + "13002804": "bhvGhostHuntBoo", + "1300286c": "bhvHiddenStaircaseStep", + "13002898": "bhvBooBossSpawnedBridge", + "130028cc": "bhvBbhTiltingTrapPlatform", + "130028fc": "bhvHauntedBookshelf", + "1300292c": "bhvMeshElevator", + "13002968": "bhvMerryGoRound", + "13002998": "bhvPlaysMusicTrackWhenTouched", + "130029b0": "bhvInsideCannon", + "130029b4": "bhvBetaBowserAnchor", + "130029e4": "bhvStaticCheckeredPlatform", + "13002a10": "bhvUnused2A10", + "13002a20": "bhvUnusedFakeStar", + "13002a48": "bhvStaticObject", + "13002a54": "bhvUnused2A54", + "13002a5c": "bhvCastleFloorTrap", + "13002a7c": "bhvFloorTrapInCastle", + "13002aa4": "bhvTree", + "13002ad0": "bhvSparkle", + "13002af0": "bhvSparkleSpawn", + "13002b08": "bhvSpecialTripleJumpSparkles", + "13002b5c": "bhvScuttlebug", + "13002ba0": "bhvScuttlebugSpawn", + "13002bb8": "bhvWhompKingBoss", + "13002bcc": "bhvSmallWhomp", + "13002c14": "bhvWaterSplash", + "13002c60": "bhvWaterDrops", + "13002c7c": "bhvWaterSurfaceWhiteWave", + "13002cb0": "bhvObjectBubbleRipples", + "13002ce0": "bhvSurfaceWaves", + "13002d28": "bhvWaterSurfaceWhiteWave2", + "13002d50": "bhvWavesGenerator", + "13002d7c": "bhvSurfaceWaveShrinking", + "13002db0": "bhvWaterType", + "13002dc0": "bhvWaveTrailOnSurface", + "13002e04": "bhvTinyWhiteWindParticle", + "13002e20": "bhvWindParticle", + "13002e3c": "bhvSnowmanWindBlowing", + "13002e58": "bhvWalkingPenguin", + "13002ea8": "bhvYellowBall", + "13002ec0": "bhvMario", + "13002ef8": "bhvToadMessage", + "13002f40": "bhvUnlockDoorStar", + "13002f60": "bhvWarps60", + "13002f64": "bhvWarps64", + "13002f68": "bhvWarps68", + "13002f6c": "bhvWarps6C", + "13002f70": "bhvWarps70", + "13002f74": "bhvWarps74", + "13002f78": "bhvWarps78", + "13002f7c": "bhvWarps7C", + "13002f80": "bhvWarps80", + "13002f84": "bhvWarps84", + "13002f88": "bhvWarps88", + "13002f8c": "bhvWarps8C", + "13002f90": "bhvWarps90", + "13002f94": "bhvWarps94", + "13002fa0": "bhvRandomAnimatedTexture", + "13002fc0": "bhvYellowBackgroundInMenu", + "13002fe4": "bhvMenuButton", + "13003008": "bhvMenuButtonManager", + "1300302c": "bhvActSelectorStarType", + "13003048": "bhvActSelector", + "13003068": "bhvMovingYellowCoin", + "130030a4": "bhvMovingBlueCoin", + "130030d4": "bhvBlueCoinSliding", + "13003104": "bhvBlueCoinJumping", + "13003134": "bhvSeaweed", + "13003158": "bhvSeaweedBundle", + "13003174": "bhvBobomb", + "130031ac": "bhvBobombFuseSmoke", + "130031dc": "bhvBobombBuddy", + "13003228": "bhvBobombBuddyOpensCannon", + "13003274": "bhvCannonClosed", + "130032a8": "bhvWhirlpool", + "130032c8": "bhvJetStream", + "130032e0": "bhvMessagePanel", + "13003324": "bhvSignOnWall", + "13003354": "bhvHomingAmp", + "13003388": "bhvCirclingAmp", + "130033bc": "bhvButterfly", + "130033ec": "bhvHoot", + "13003420": "bhvBetaHoldableObject", + "13003454": "bhvCarrySomething1", + "1300345c": "bhvCarrySomething2", + "13003464": "bhvCarrySomething3", + "1300346c": "bhvCarrySomething4", + "13003474": "bhvCarrySomething5", + "1300347c": "bhvCarrySomething6", + "13003484": "bhvObjectBubble", + "130034c4": "bhvObjectWaterWave", + "13003510": "bhvExplosion", + "13003558": "bhvBobombBullyDeathSmoke", + "13003588": "bhvSmoke", + "130035b0": "bhvBobombExplosionBubble", + "13003600": "bhvBobombExplosionBubble3600", + "13003614": "bhvRespawner", + "1300362c": "bhvSmallBully", + "13003660": "bhvBigBully", + "13003694": "bhvBigBullyWithMinions", + "130036c8": "bhvSmallChillBully", + "13003700": "bhvBigChillBully", + "13003738": "bhvJetStreamRingSpawner", + "13003750": "bhvJetStreamWaterRing", + "13003798": "bhvMantaRayWaterRing", + "130037e0": "bhvMantaRayRingManager", + "130037ec": "bhvBowserBomb", + "1300381c": "bhvBowserBombExplosion", + "13003840": "bhvBowserBombSmoke", + "13003868": "bhvCelebrationStar", + "13003888": "bhvCelebrationStarSparkle", + "130038b0": "bhvStarKeyCollectionPuffSpawner", + "130038d0": "bhvLllDrawbridgeSpawner", + "130038e8": "bhvLllDrawbridge", + "13003910": "bhvSmallBomp", + "13003940": "bhvLargeBomp", + "13003970": "bhvWfSlidingPlatform", + "130039a0": "bhvMoneybag", + "130039d4": "bhvMoneybagHidden", + "13003a08": "bhvPitBowlingBall", + "13003a30": "bhvFreeBowlingBall", + "13003a58": "bhvBowlingBall", + "13003a80": "bhvTtmBowlingBallSpawner", + "13003aa4": "bhvBobBowlingBallSpawner", + "13003ac8": "bhvThiBowlingBallSpawner", + "13003ae0": "bhvRrCruiserWing", + "13003b00": "bhvSpindel", + "13003b30": "bhvSslMovingPyramidWall", + "13003b60": "bhvPyramidElevator", + "13003b98": "bhvPyramidElevatorTrajectoryMarkerBall", + "13003bb4": "bhvPyramidTop", + "13003bec": "bhvPyramidTopFragment", + "13003c0c": "bhvPyramidPillarTouchDetector", + "13003c30": "bhvWaterfallSoundLoop", + "13003c44": "bhvVolcanoSoundLoop", + "13003c58": "bhvCastleFlagWaving", + "13003c7c": "bhvBirdsSoundLoop", + "13003c90": "bhvAmbientSounds", + "13003ca4": "bhvSandSoundLoop", + "13003cb8": "bhvHiddenAt120Stars", + "13003ce4": "bhvSnowmansBottom", + "13003d0c": "bhvSnowmansHead", + "13003d34": "bhvSnowmansBodyCheckpoint", + "13003d4c": "bhvBigSnowmanWhole", + "13003d74": "bhvBigBoulder", + "13003da0": "bhvBigBoulderGenerator", + "13003db8": "bhvWingCap", + "13003dd8": "bhvMetalCap", + "13003df8": "bhvNormalCap", + "13003e1c": "bhvVanishCap", + "13003e3c": "bhvStar", + "13003e64": "bhvStarSpawnCoordinates", + "13003e8c": "bhvHiddenRedCoinStar", + "13003eac": "bhvRedCoin", + "13003ee4": "bhvBowserCourseRedCoinStar", + "13003efc": "bhvHiddenStar", + "13003f1c": "bhvHiddenStarTrigger", + "13003f40": "bhvTtmRollingLog", + "13003f78": "bhvLllVolcanoFallingTrap", + "13003fa4": "bhvLllRollingLog", + "13003fdc": "bhv1upWalking", + "13004010": "bhv1upRunningAway", + "13004044": "bhv1upSliding", + "1300407c": "bhv1Up", + "130040b4": "bhv1upJumpOnApproach", + "130040ec": "bhvHidden1up", + "13004124": "bhvHidden1upTrigger", + "13004148": "bhvHidden1upInPole", + "13004180": "bhvHidden1upInPoleTrigger", + "130041a4": "bhvHidden1upInPoleSpawner", + "130041bc": "bhvControllablePlatform", + "130041f0": "bhvControllablePlatformSub", + "13004218": "bhvBreakableBoxSmall", + "13004244": "bhvSlidingSnowMound", + "13004270": "bhvSnowMoundSpawn", + "13004284": "bhvWdwSquareFloatingPlatform", + "130042b4": "bhvWdwRectangularFloatingPlatform", + "130042e4": "bhvJrbFloatingPlatform", + "13004314": "bhvArrowLift", + "13004348": "bhvOrangeNumber", + "13004370": "bhvMantaRay", + "130043a0": "bhvFallingPillar", + "130043c4": "bhvFallingPillarHitbox", + "130043e0": "bhvPillarBase", + "13004400": "bhvJrbFloatingBox", + "1300442c": "bhvDecorativePendulum", + "1300444c": "bhvTreasureChestsShip", + "13004470": "bhvTreasureChestsJrb", + "13004494": "bhvTreasureChests", + "130044b8": "bhvTreasureChestBottom", + "130044e0": "bhvTreasureChestTop", + "130044fc": "bhvMips", + "13004538": "bhvYoshi", + "13004580": "bhvKoopa", + "130045d0": "bhvKoopaRaceEndpoint", + "130045f8": "bhvKoopaFlag", + "13004634": "bhvPokey", + "13004668": "bhvPokeyBodyPart", + "13004698": "bhvSwoop", + "130046dc": "bhvFlyGuy", + "1300472c": "bhvGoomba", + "13004770": "bhvGoombaTripletSpawner", + "1300478c": "bhvChainChomp", + "130047e4": "bhvChainChompChainPart", + "1300481c": "bhvWoodenPost", + "13004868": "bhvChainChompGate", + "13004898": "bhvWigglerHead", + "130048e0": "bhvWigglerBody", + "13004918": "bhvEnemyLakitu", + "13004954": "bhvCameraLakitu", + "13004988": "bhvCloud", + "130049ac": "bhvCloudPart", + "130049c8": "bhvSpiny", + "13004a00": "bhvMontyMole", + "13004a58": "bhvMontyMoleHole", + "13004a78": "bhvMontyMoleRock", + "13004ab0": "bhvPlatformOnTrack", + "13004af4": "bhvTrackBall", + "13004b1c": "bhvSeesawPlatform", + "13004b44": "bhvFerrisWheelAxle", + "13004b6c": "bhvFerrisWheelPlatform", + "13004b8c": "bhvWaterBombSpawner", + "13004ba8": "bhvWaterBomb", + "13004bd4": "bhvWaterBombShadow", + "13004bf0": "bhvTTCRotatingSolid", + "13004c24": "bhvTTCPendulum", + "13004c5c": "bhvTTCTreadmill", + "13004c94": "bhvTTCMovingBar", + "13004ccc": "bhvTTCCog", + "13004cf8": "bhvTTCPitBlock", + "13004d28": "bhvTTCElevator", + "13004d64": "bhvTTC2DRotator", + "13004d90": "bhvTTCSpinner", + "13004dbc": "bhvMrBlizzard", + "13004e08": "bhvMrBlizzardSnowball", + "13004e4c": "bhvSlidingPlatform2", + "13004e78": "bhvOctagonalPlatformRotating", + "13004ea0": "bhvAnimatesOnFloorSwitchPress", + "13004ecc": "bhvActivatedBackAndForthPlatform", + "13004ef8": "bhvRecoveryHeart", + "13004f10": "bhvWaterBombCannon", + "13004f28": "bhvCannonBarrelBubbles", + "13004f40": "bhvUnagi", + "13004f78": "bhvUnagiSubobject", + "13004f90": "bhvDorrie", + "13004fd4": "bhvHauntedChair", + "13005024": "bhvMadPiano", + "1300506c": "bhvFlyingBookend", + "130050b4": "bhvBookendSpawn", + "130050d4": "bhvHauntedBookshelfManager", + "130050f4": "bhvBookSwitch", + "13005120": "bhvFirePiranhaPlant", + "13005158": "bhvSmallPiranhaFlame", + "1300518c": "bhvFireSpitter", + "130051ac": "bhvFlyguyFlame", + "130051e0": "bhvSnufit", + "1300521c": "bhvSnufitBalls", + "1300525c": "bhvHorizontalGrindel", + "130052b4": "bhvEyerokBoss", + "130052d0": "bhvEyerokHand", + "13005310": "bhvKlepto", + "13005354": "bhvBird", + "13005380": "bhvRacingPenguin", + "130053c4": "bhvPenguinRaceFinishLine", + "130053dc": "bhvPenguinRaceShortcutCheck", + "130053f4": "bhvCoffinManager", + "13005414": "bhvCoffin", + "13005440": "bhvClamShell", + "13005468": "bhvSkeeter", + "130054a0": "bhvSkeeterWave", + "130054b8": "bhvSwingPlatform", + "130054ec": "bhvDonutPlatformSpawner", + "13005504": "bhvDonutPlatform", + "13005528": "bhvDDDPole", + "1300556c": "bhvRedCoinStarMarker", + "13005598": "bhvTripletButterfly", + "130055dc": "bhvBubba", + "13005610": "bhvBeginningLakitu", + "13005638": "bhvBeginningPeach", + "1300565c": "bhvEndBirds1", + "13005680": "bhvEndBirds2", + "130056a4": "bhvIntroScene", + "130056c0": "_behaviorSegmentEnd", + "007d1d80": "_behaviorSegmentRomEnd", + "8016f000": "_goddardSegmentStart", + "007cc6c0": "_goddardSegmentRomStart", + }, + "Refresh 4": { + "80000300": "osTvType", + "80000308": "osRomBase", + "8000030c": "osResetType", + "80000318": "osMemSize", + "8000031c": "osAppNmiBuffer", + "80000000": "D_80000000", + "a4000000": "D_A4000000", + "a40004c0": "D_A40004C0", + "a4000774": "D_A4000774", + "a4001000": "D_A4001000", + "a4040010": "D_A4040010", + "a4080000": "D_A4080000", + "a4300000": "D_A4300000", + "a4300004": "D_A4300004", + "a4300008": "D_A4300008", + "a430000c": "D_A430000C", + "a4400010": "D_A4400010", + "a450000c": "D_A450000C", + "a4600000": "D_A4600000", + "a4600004": "D_A4600004", + "a460000c": "D_A460000C", + "a4600010": "D_A4600010", + "a4700000": "D_A4700000", + "a4700010": "D_A4700010", + "a4800018": "D_A4800018", + "b0000008": "D_B0000008", + "b0000010": "D_B0000010", + "b0000014": "D_B0000014", + "c0000000": "D_C0000000", + "c0000008": "D_C0000008", + "c000000c": "D_C000000C", + "802ef700": "__osGetCurrFaultedThread", + "00000000": "__romPos", + "04000000": "_bootSegmentStart", + "007cc6c0": "_bootSegmentRomStart", + "04001000": "_bootSegmentEnd", + "007cd6c0": "_bootSegmentRomEnd", + "80000400": ".", + "80000400": "_zbufferSegmentNoloadStart", + "80000400": "0x25800", + "80000400": "gZBuffer", + "80246000": "_mainSegmentStart", + "007cc6c0": "_mainSegmentRomStart", + "80246000": "EntryPoint", + "80246050": "handle_debug_key_sequences", + "80246170": "Unknown80246170", + "802461cc": "Dummy802461CC", + "802461dc": "Dummy802461DC", + "802461ec": "Dummy802461EC", + "802461fc": "setup_mesg_queues", + "802462e0": "AllocPool", + "80246338": "create_thread", + "8024639c": "handle_nmi_request", + "802463ec": "receive_new_tasks", + "8024651c": "start_sptask", + "8024659c": "interrupt_gfx_sptask", + "802465ec": "start_gfx_sptask", + "80246648": "pretend_audio_sptask_done", + "8024669c": "handle_vblank", + "802467fc": "handle_sp_complete", + "8024694c": "handle_dp_complete", + "802469b8": "thread3_main", + "80246b14": "set_vblank_handler", + "80246b74": "SendMessage", + "80246bb4": "dispatch_audio_sptask", + "80246c10": "send_display_list", + "80246c9c": "turn_on_audio", + "80246cb8": "turn_off_audio", + "80246cf0": "thread1_idle", + "80246df8": "Main", + "80246e70": "my_rdp_init", + "802471a4": "my_rsp_init", + "80247284": "clear_z_buffer", + "802473c8": "display_frame_buffer", + "802474b8": "clear_frame_buffer", + "80247620": "clear_viewport", + "8024784c": "draw_screen_borders", + "802479bc": "make_viewport_clip_rect", + "80247b3c": "create_task_structure", + "80247ccc": "init_render_image", + "80247d14": "end_master_display_list", + "80247db4": "func_80247D84", + "80247f08": "func_80247ED8", + "80247fdc": "func_80247FAC", + "80248090": "display_and_vsync", + "80248304": "adjust_analog_stick", + "80248498": "run_demo_inputs", + "80248638": "read_controller_inputs", + "80248824": "init_controllers", + "80248964": "setup_game_memory", + "80248af0": "thread5_game_loop", + "80248c40": "func_80248C10", + "80248c58": "func_80248C28", + "80248ce8": "func_80248CB8", + "80248d78": "func_80248D48", + "80248dc0": "func_80248D90", + "80248e08": "set_sound_mode", + "80248e54": "play_menu_sounds", + "80248fec": "play_painting_eject_sound", + "80249070": "play_infinite_stairs_music", + "80249178": "set_background_music", + "8024922c": "func_802491FC", + "8024927c": "func_8024924C", + "802492d0": "play_cutscene_music", + "80249310": "play_shell_music", + "8024934c": "stop_shell_music", + "80249398": "play_cap_music", + "80249404": "fadeout_cap_music", + "80249448": "stop_cap_music", + "802494d8": "audio_game_loop_tick", + "80249500": "thread4_sound", + "802495e0": "level_control_timer", + "802496b8": "pressed_paused", + "80249764": "set_play_mode", + "8024978c": "func_8024975C", + "802497b8": "func_80249788", + "8024982c": "nop_802497FC", + "8024983c": "func_8024980C", + "8024995c": "func_8024992C", + "80249a10": "set_mario_initial_cap_powerup", + "80249ab4": "set_mario_initial_action", + "80249cd8": "init_mario_after_warp", + "8024a124": "func_8024A02C", + "8024a18c": "func_8024A094", + "8024a1d8": "func_8024A0E0", + "8024a374": "check_instant_warp", + "8024a584": "func_8024A48C", + "8024a700": "initiate_warp", + "8024a7b4": "get_painting_warp_node", + "8024a85c": "initiate_painting_warp", + "8024a9cc": "level_trigger_warp", + "8024aedc": "initiate_delayed_warp", + "8024b13c": "update_hud_values", + "8024b390": "basic_update", + "8024b3e4": "play_mode_normal", + "8024b5d4": "play_mode_paused", + "8024b6cc": "play_mode_frame_advance", + "8024b798": "level_set_transition", + "8024b7c0": "play_mode_change_area", + "8024b880": "play_mode_change_level", + "8024b9b8": "update_level", + "8024ba8c": "init_level", + "8024bcd8": "lvl_init_or_update", + "8024bd5c": "lvl_init_from_save_file", + "8024be14": "lvl_set_current_level", + "8024bfa0": "lvl_play_the_end_screen_sound", + "8024bff0": "get_mario_cap_flag", + "8024c0b8": "object_facing_mario", + "8024c16c": "mario_angle_to_object", + "8024c1d8": "determine_interaction", + "8024c51c": "attack_object", + "8024c618": "mario_stop_riding_object", + "8024c66c": "mario_grab_used_object", + "8024c6c0": "mario_drop_held_object", + "8024c780": "mario_throw_held_object", + "8024c894": "mario_stop_riding_and_holding", + "8024c8fc": "does_mario_have_hat", + "8024c928": "mario_blow_off_cap", + "8024ca68": "mario_lose_cap_to_enemy", + "8024caf8": "mario_retrieve_cap", + "8024cb58": "able_to_grab_object", + "8024cbfc": "mario_get_collided_object", + "8024cc7c": "mario_check_object_grab", + "8024ce08": "bully_knock_back_mario", + "8024d0b4": "bounce_off_object", + "8024d130": "hit_object_from_below", + "8024d2bc": "determine_knockback_action", + "8024d578": "push_mario_out_of_object", + "8024d72c": "bounce_back_from_attack", + "8024d804": "func_8024D664", + "8024d8b0": "take_damage_from_interact_object", + "8024d998": "take_damage_and_knock_back", + "8024daac": "reset_mario_pitch", + "8024db2c": "interact_coin", + "8024dbf0": "interact_water_ring", + "8024dc28": "interact_star_or_key", + "8024de4c": "interact_bbh_entrance", + "8024df10": "interact_warp", + "8024e0c4": "interact_warp_door", + "8024e2fc": "get_door_save_file_flag", + "8024e420": "interact_door", + "8024e6ec": "interact_cannon_base", + "8024e778": "interact_igloo_barrier", + "8024e7d4": "interact_tornado", + "8024e8f0": "interact_whirlpool", + "8024e9d0": "interact_wind", + "8024ead8": "interact_flame", + "8024ec54": "interact_snufit_bullet", + "8024ed84": "interact_clam_or_bubba", + "8024ee44": "interact_bully", + "8024eff8": "interact_shock", + "8024f170": "interact_mr_blizzard", + "8024f1e0": "interact_hit_from_below", + "8024f354": "interact_bounce_top", + "8024f4ac": "interact_unknown_08", + "8024f55c": "interact_damage", + "8024f5cc": "interact_breakable", + "8024f6a4": "interact_koopa_shell", + "8024f7a8": "check_object_grab_mario", + "8024f8bc": "interact_pole", + "8024fa60": "interact_hoot", + "8024fb30": "interact_cap", + "8024fd2c": "interact_grabbable", + "8024fe6c": "func_8024FC94", + "8024ff04": "func_8024FD2C", + "80250098": "func_8024FEC0", + "80250198": "interact_text", + "80250230": "check_kick_or_punch_wall", + "802503f0": "mario_process_interactions", + "802505c8": "check_death_barrier", + "8025065c": "check_lava_boost", + "80250724": "pss_begin_slide", + "80250778": "pss_end_slide", + "802507fc": "mario_handle_special_floors", + "80250940": "is_anim_at_end", + "8025097c": "is_anim_past_end", + "802509b8": "set_mario_animation", + "80250b04": "set_mario_anim_with_accel", + "80250c7c": "set_anim_to_frame", + "80250d38": "is_anim_past_frame", + "80250e54": "find_mario_anim_flags_and_translation", + "80251020": "update_mario_pos_for_anim", + "802510dc": "return_mario_anim_y_translation", + "80251120": "play_sound_if_no_flag", + "8025118c": "play_mario_jump_sound", + "80251274": "adjust_sound_for_speed", + "80251310": "play_sound_and_spawn_particles", + "80251444": "play_mario_action_sound", + "802514ac": "play_mario_landing_sound", + "80251510": "play_mario_landing_sound_once", + "80251574": "play_mario_heavy_landing_sound", + "802515d8": "play_mario_heavy_landing_sound_once", + "8025163c": "play_mario_sound", + "80251708": "mario_set_forward_vel", + "8025177c": "mario_get_floor_class", + "802518a8": "mario_get_terrain_sound_addend", + "80251a48": "resolve_and_return_wall_collisions", + "80251afc": "vec3f_find_ceil", + "80251b54": "mario_facing_downhill", + "80251bd4": "mario_floor_is_slippery", + "80251cfc": "mario_floor_is_slope", + "80251e24": "mario_floor_is_steep", + "80251f24": "find_floor_height_relative_polar", + "80252000": "find_floor_slope", + "802521a0": "update_mario_sound_and_camera", + "8025229c": "set_steep_jump_action", + "80252cf4": "set_mario_action", + "80252e5c": "set_jump_from_landing", + "802530a0": "set_jumping_action", + "80253178": "drop_and_set_mario_action", + "802531c4": "hurt_and_set_mario_action", + "80253218": "check_common_action_exits", + "80253300": "check_common_hold_action_exits", + "802533e4": "transition_submerged_to_walking", + "80253488": "set_water_plunge_action", + "80253588": "squish_mario_model", + "80253720": "debug_print_speed_action_normal", + "80253838": "update_mario_button_inputs", + "8025395c": "update_mario_joystick_inputs", + "80253a60": "update_mario_geometry_inputs", + "80253d58": "update_mario_inputs", + "80253ec0": "set_submerged_cam_preset_and_spawn_bubbles", + "80254060": "update_mario_health", + "802542b4": "update_mario_info_for_cam", + "80254338": "mario_reset_bodystate", + "80254390": "sink_mario_in_quicksand", + "802543e8": "update_and_return_cap_flags", + "80254588": "mario_update_hitbox_and_cap_model", + "80254830": "execute_mario_action", + "80254b20": "init_mario", + "80254f44": "init_mario_from_save_file", + "80255080": "get_additive_y_vel_for_jumps", + "8025509c": "nop_80254E3C", + "802550b0": "nop_80254E50", + "802550c0": "transfer_bully_speed", + "80255238": "init_bully_collision_data", + "802552fc": "mario_bonk_reflection", + "80255414": "mario_update_quicksand", + "80255654": "mario_push_off_steep_floor", + "8025570c": "mario_update_moving_sand", + "8025580c": "mario_update_windy_ground", + "802559b0": "stop_and_set_height_to_floor", + "80255a34": "stationary_ground_step", + "80255d88": "perform_ground_step", + "80255ec4": "check_ledge_grab", + "802560ac": "perform_air_quarter_step", + "802564e0": "apply_twirl_gravity", + "80256584": "should_strengthen_gravity_for_jump_ascent", + "8025661c": "apply_gravity", + "802569f8": "apply_vertical_wind", + "80256b24": "perform_air_step", + "80256cd8": "set_vel_from_pitch_and_yaw", + "80256d8c": "set_vel_from_yaw", + "80256e00": "get_credits_str_width", + "80256e88": "print_displaying_credits_entry", + "80257060": "BehEndPeachLoop", + "802570dc": "BehEndToadLoop", + "80257198": "geo_switch_peach_eyes", + "802572b0": "get_star_collection_dialog", + "8025733c": "handle_save_menu", + "80257450": "spawn_obj_at_mario_rel_yaw", + "802574e8": "cutscene_take_cap_off", + "80257548": "cutscene_put_cap_on", + "802575a8": "mario_ready_to_speak", + "80257640": "set_mario_npc_dialog", + "80257748": "act_reading_npc_dialog", + "80257980": "act_waiting_for_dialog", + "80257a0c": "act_disappeared", + "80257ab0": "act_reading_automatic_dialog", + "80257ce4": "act_reading_sign", + "80257eac": "act_debug_free_move", + "80258184": "general_star_dance_handler", + "80258420": "act_star_dance", + "802584dc": "act_star_dance_water", + "802585c0": "act_fall_after_star_grab", + "802586cc": "common_death_handler", + "80258744": "act_standing_death", + "802587ec": "act_electrocution", + "8025883c": "act_suffocation", + "8025888c": "act_death_on_back", + "802588f8": "act_death_on_stomach", + "80258964": "act_quicksand_death", + "80258a7c": "act_eaten_by_bubba", + "80258b24": "launch_mario_until_land", + "80258ba8": "act_unlocking_key_door", + "80258dac": "act_unlocking_star_door", + "80258f94": "act_entering_star_door", + "80259264": "act_going_through_door", + "802593cc": "act_warp_door_spawn", + "802594d4": "act_emerge_from_pipe", + "80259608": "act_spawn_spin_airborne", + "80259740": "act_spawn_spin_landing", + "802597ac": "act_exit_airborne", + "80259854": "act_falling_exit_airborne", + "802598d0": "act_exit_land_save_dialog", + "80259c30": "act_death_exit", + "80259ce8": "act_unused_death_exit", + "80259d74": "act_falling_death_exit", + "80259e00": "act_special_exit_airborne", + "80259ef8": "act_special_death_exit", + "80259fcc": "act_spawn_no_spin_airborne", + "8025a040": "act_spawn_no_spin_landing", + "8025a0bc": "act_bbh_enter_spin", + "8025a494": "act_bbh_enter_jump", + "8025a610": "act_teleport_fade_out", + "8025a6fc": "act_teleport_fade_in", + "8025a858": "act_shocked", + "8025a9ac": "act_squished", + "8025ae0c": "act_putting_on_cap", + "8025aea8": "stuck_in_ground_handler", + "8025affc": "act_head_stuck_in_ground", + "8025b050": "act_butt_stuck_in_ground", + "8025b0a4": "act_feet_stuck_in_ground", + "8025d798": "mario_execute_cutscene_action", + "8025dd70": "add_tree_leaf_particles", + "8025de1c": "play_climbing_sounds", + "8025df04": "set_pole_position", + "8025e21c": "act_holding_pole", + "8025e5a8": "act_climbing_pole", + "8025e7a4": "act_grab_pole_slow", + "8025e830": "act_grab_pole_fast", + "8025e930": "act_top_of_pole_transition", + "8025ea30": "act_top_of_pole", + "8025eb50": "perform_hanging_step", + "8025ecfc": "update_hang_moving", + "8025eed0": "update_hang_stationary", + "8025ef58": "act_start_hanging", + "8025f0b4": "act_hanging", + "8025f1e4": "act_hang_moving", + "8025f384": "let_go_of_ledge", + "8025f4b4": "func_8025F0DC", + "8025f560": "func_8025F188", + "8025f644": "update_ledge_climb", + "8025f6c0": "act_ledge_grab", + "8025f970": "act_ledge_climb_slow", + "8025fa64": "act_ledge_climb_down", + "8025fae8": "act_ledge_climb_fast", + "8025fb90": "act_grabbed", + "8025fc6c": "act_in_cannon", + "80260154": "act_tornado_twirling", + "80260568": "check_common_automatic_cancels", + "802605d0": "mario_execute_automatic_action", + "802608b0": "func_802604E0", + "80260aac": "func_802606DC", + "80260cb4": "act_idle", + "80260f94": "func_80260BC4", + "80261000": "act_start_sleeping", + "80261268": "act_sleeping", + "802614fc": "act_waking_up", + "8026168c": "act_shivering", + "802618d8": "act_coughing", + "802619d0": "act_hold_idle", + "80261ad0": "act_hold_heavy_idle", + "80261bf8": "act_standing_against_wall", + "80261cec": "act_in_quicksand", + "80261db4": "act_crouching", + "80261f70": "act_panting", + "80262080": "act_hold_panting_unused", + "8026217c": "func_80261D70", + "802621dc": "act_braking_stop", + "802622dc": "act_butt_slide_stop", + "80262398": "func_80261F8C", + "80262490": "act_slide_kick_slide_stop", + "80262530": "act_start_crouching", + "80262650": "act_stop_crouching", + "80262770": "act_start_crawling", + "80262890": "act_stop_crawling", + "80262980": "func_80262574", + "80262bc4": "func_802627B8", + "80262c34": "func_80262828", + "80262d68": "act_jump_land_stop", + "80262dc4": "act_double_jump_land_stop", + "80262e20": "act_side_flip_land_stop", + "80262e94": "act_freefall_land_stop", + "80262ef0": "act_triple_jump_land_stop", + "80262f50": "act_backflip_land_stop", + "80262fec": "act_lava_boost_land", + "8026305c": "act_long_jump_land_stop", + "802630f8": "func_80262CEC", + "802631f0": "func_80262DE4", + "802632e8": "act_air_throw_land", + "802633b4": "act_twirl_land", + "8026350c": "act_ground_pound_land", + "802635e8": "act_first_person", + "80263784": "func_80263378", + "80263898": "mario_execute_stationary_action", + "80263e60": "func_80263A50", + "80263ee4": "func_80263AD4", + "80264024": "func_80263C14", + "8026409c": "begin_walking_action", + "802640fc": "check_ledge_climb_down", + "802642b4": "slide_bonk", + "80264340": "set_triple_jump_action", + "8026440c": "update_sliding_angle", + "80264740": "update_sliding", + "80264b54": "apply_slope_accel", + "80264d80": "apply_landing_accel", + "80264e18": "update_shell_speed", + "80265080": "apply_slope_decel", + "802651b0": "update_decelerating_speed", + "80265244": "update_walking_speed", + "80265458": "should_begin_sliding", + "80265514": "analog_stick_held_back", + "80265558": "check_ground_dive_or_punch", + "80265620": "begin_braking_action", + "80265700": "func_802652F0", + "80265b1c": "func_8026570C", + "80265d90": "func_80265980", + "80265df8": "func_802659E8", + "80266038": "func_80265C28", + "802661cc": "func_80265DBC", + "80266354": "act_walking", + "802665b4": "act_move_punching", + "80266734": "act_hold_walking", + "8026699c": "act_hold_heavy_walking", + "80266af8": "act_turning_around", + "80266d4c": "act_finish_turning_around", + "80266e48": "act_braking", + "80266fc8": "act_decelerating", + "80267240": "act_hold_decelerating", + "80267504": "act_riding_shell_ground", + "80267728": "act_crawling", + "8026795c": "act_burning_ground", + "80267c24": "func_80267814", + "80267ce4": "common_slide_action", + "80267fa4": "common_slide_action_with_jump", + "80268074": "act_butt_slide", + "802680d4": "act_hold_butt_slide", + "80268168": "act_crouch_slide", + "80268338": "act_slide_kick_slide", + "802684ac": "stomach_slide_action", + "802685c0": "act_stomach_slide", + "80268608": "act_hold_stomach_slide", + "80268684": "act_dive_slide", + "802687b8": "common_ground_knockback_action", + "802689f8": "act_hard_backward_ground_kb", + "80268adc": "act_hard_forward_ground_kb", + "80268b64": "act_backward_ground_kb", + "80268bb0": "act_forward_ground_kb", + "80268bfc": "act_soft_backward_ground_kb", + "80268c48": "act_soft_forward_ground_kb", + "80268c94": "act_ground_bonk", + "80268d04": "act_death_exit_land", + "80268dcc": "common_landing_action", + "80268f78": "common_landing_cancels", + "80269108": "act_jump_land", + "80269170": "act_freefall_land", + "802691d8": "act_side_flip_land", + "80269264": "act_hold_jump_land", + "80269300": "act_hold_freefall_land", + "8026939c": "act_long_jump_land", + "8026947c": "act_double_jump_land", + "802694e4": "act_triple_jump_land", + "80269588": "act_backflip_land", + "80269640": "quicksand_jump_land_action", + "80269788": "act_quicksand_jump_land", + "802697dc": "act_hold_quicksand_jump_land", + "80269830": "check_common_moving_cancels", + "80269954": "mario_execute_moving_action", + "80269f40": "play_flip_sounds", + "80269fc0": "play_far_fall_sound", + "8026a090": "func_u_8026A090", + "8026a12c": "lava_boost_on_wall", + "8026a224": "check_fall_damage", + "8026a400": "check_kick_or_dive_in_air", + "8026a494": "should_get_stuck_in_ground", + "8026a598": "check_fall_damage_or_get_stuck", + "8026a62c": "check_horizontal_wind", + "8026a818": "update_air_with_turn", + "8026aa48": "update_air_without_turn", + "8026acd8": "update_lava_boost_or_twirling", + "8026ae5c": "update_flying_yaw", + "8026b004": "update_flying_pitch", + "8026b17c": "update_flying", + "8026b444": "common_air_action_step", + "8026b6a0": "act_jump", + "8026b740": "act_double_jump", + "8026b814": "act_triple_jump", + "8026b90c": "act_backflip", + "8026b9ac": "act_freefall", + "8026bab8": "act_hold_jump", + "8026bbb4": "act_hold_freefall", + "8026bcc0": "act_side_flip", + "8026bdcc": "act_wall_kick_air", + "8026be78": "act_long_jump", + "8026bf40": "act_riding_shell_air", + "8026c034": "act_twirling", + "8026c1e0": "act_dive", + "8026c4b8": "act_air_throw", + "8026c5d0": "act_water_jump", + "8026c738": "act_hold_water_jump", + "8026c880": "act_steep_jump", + "8026c9fc": "act_ground_pound", + "8026cd0c": "act_burning_jump", + "8026ce50": "act_burning_fall", + "8026cf28": "act_crazy_box_bounce", + "8026d1b0": "common_air_knockback_step", + "8026d33c": "func_8026CDFC", + "8026d3c8": "act_backward_air_kb", + "8026d43c": "act_forward_air_kb", + "8026d4b0": "act_hard_backward_air_kb", + "8026d508": "act_hard_forward_air_kb", + "8026d560": "act_thrown_backward", + "8026d608": "act_thrown_forward", + "8026d6fc": "act_soft_bonk", + "8026d770": "act_getting_blown", + "8026d988": "act_air_hit_wall", + "8026db54": "act_forward_rollout", + "8026dcf4": "act_backward_rollout", + "8026de98": "act_butt_slide_air", + "8026e088": "act_hold_butt_slide_air", + "8026e2b4": "act_lava_boost", + "8026e59c": "act_slide_kick", + "8026e810": "act_jump_kick", + "8026e968": "act_shot_from_cannon", + "8026ec00": "act_flying", + "8026f158": "act_riding_hoot", + "8026f2ec": "act_flying_triple_jump", + "8026f614": "act_top_of_pole_jump", + "8026f660": "act_vertical_wind", + "8026f840": "act_special_triple_jump", + "8026fa18": "check_common_airborne_cancels", + "8026fb04": "mario_execute_airborne_action", + "8027499c": "mario_execute_submerged_action", + "80274eb0": "animated_stationary_ground_step", + "80274f10": "mario_update_punch_sequence", + "80275328": "act_punching", + "8027546c": "act_picking_up", + "802755fc": "act_dive_picking_up", + "802756c8": "act_placing_down", + "80275794": "act_throwing", + "802758c0": "act_heavy_throw", + "802759b4": "act_stomach_slide_stop", + "80275a80": "act_picking_up_bowser", + "80275b34": "act_holding_bowser", + "80275e78": "act_releasing_bowser", + "80275f0c": "check_common_object_cancels", + "80275fe0": "mario_execute_object_action", + "802761d0": "geo_enfvx_main", + "802763d4": "geo_skybox_main", + "802764b0": "Geo18_802764B0", + "8027684c": "bhvToadMessage_loop", + "80276910": "bhvToadMessage_init", + "80276bb8": "bhvUnlockDoorStar_init", + "80276ccc": "bhvUnlockDoorStar_loop", + "802770a4": "Geo18_802770A4", + "80277150": "geo_switch_mario_stand_run", + "802771bc": "geo_switch_mario_eyes", + "80277294": "Geo18_80277294", + "802773a4": "Geo18_802773A4", + "802774f4": "geo_switch_mario_hand", + "802775cc": "Geo18_802775CC", + "802776d8": "geo_switch_mario_cap_effect", + "80277740": "geo_switch_mario_cap_on_off", + "80277824": "Geo18_80277824", + "8027795c": "geo_switch_mario_hand_grab_pos", + "80277b14": "geo_render_mirror_mario", + "80277d6c": "geo_mirror_mario_backface_culling", + "80277ee0": "set_segment_base_addr", + "80277f20": "get_segment_base_addr", + "80277f50": "segmented_to_virtual", + "80277fa8": "virtual_to_segmented", + "80277ff0": "move_segment_table_to_dmem", + "80278074": "main_pool_init", + "80278120": "main_pool_alloc", + "80278238": "main_pool_free", + "80278358": "main_pool_realloc", + "802783c8": "main_pool_available", + "802783e8": "main_pool_push_state", + "80278498": "main_pool_pop_state", + "8027868c": "load_segment", + "802786f0": "load_to_fixed_pool_addr", + "802787d8": "load_segment_decompress", + "802788b4": "func_80278304", + "80278974": "load_engine_code_segment", + "80278a14": "alloc_only_pool_init", + "80278ab8": "alloc_only_pool_alloc", + "80278b28": "alloc_only_pool_resize", + "80278b98": "mem_pool_init", + "80278c58": "mem_pool_alloc", + "80278d74": "mem_pool_free", + "80278f2c": "alloc_display_list", + "80279028": "func_80278A78", + "80279084": "func_80278AD4", + "80279840": "save_file_do_save", + "802798fc": "save_file_erase", + "80279960": "save_file_copy", + "802799dc": "save_file_load_all", + "80279bc8": "save_file_reload", + "80279c44": "save_file_collect_star_or_key", + "80279e44": "save_file_exists", + "80279e80": "save_file_get_max_coin_score", + "80279f80": "save_file_get_course_star_count", + "8027a010": "save_file_get_total_star_count", + "8027a0a8": "save_file_set_flags", + "8027a0f4": "save_file_clear_flags", + "8027a16c": "save_file_get_flags", + "8027a1c8": "save_file_get_star_flags", + "8027a23c": "save_file_set_star_flags", + "8027a310": "save_file_get_course_coin_score", + "8027a340": "save_file_is_cannon_unlocked", + "8027a390": "save_file_set_cannon_unlocked", + "8027a418": "save_file_set_cap_pos", + "8027a4ac": "save_file_get_cap_pos", + "8027a564": "save_file_set_sound_mode", + "8027a5b4": "save_file_get_sound_mode", + "8027a5d4": "save_file_move_cap_to_default_location", + "8027a698": "disable_warp_checkpoint", + "8027a6b0": "check_if_should_set_warp_checkpoint", + "8027a718": "check_warp_checkpoint", + "8027a7d0": "func_8027A220", + "8027a83c": "set_warp_transition_rgb", + "8027a8b0": "print_intro_text", + "8027a93c": "get_mario_spawn_type", + "8027a9c8": "area_get_warp_node", + "8027aa28": "func_8027A478", + "8027aa74": "func_8027A4C4", + "8027ab04": "clear_areas", + "8027ad74": "func_8027A7C4", + "8027ae44": "load_area", + "8027af48": "func_8027A998", + "8027afbc": "load_mario_area", + "8027b038": "func_8027AA88", + "8027b0c0": "change_area", + "8027b164": "area_update_objects", + "8027b1a0": "play_transition", + "8027b35c": "play_transition_after_delay", + "8027b3b4": "render_game", + "8027cf38": "geo_set_animation_globals", + "8027da84": "geo_process_held_object", + "8027de68": "geo_try_process_children", + "8027dea8": "geo_process_node_and_siblings", + "8027e130": "geo_process_root", + "8027e3e0": "profiler_log_thread5_time", + "8027e490": "profiler_log_thread4_time", + "8027e520": "profiler_log_gfx_time", + "8027e5cc": "profiler_log_vblank_time", + "8027e65c": "draw_profiler_bar", + "8027e958": "draw_reference_profiler_bars", + "8027ebcc": "draw_profiler_mode_1", + "8027eeac": "draw_profiler_mode_0", + "8027f460": "draw_profiler", + "8027f4e0": "decompress", + "8027f590": "set_camera_shake", + "8027f8b8": "set_camera_shake_2", + "8027f9f0": "func_8027F440", + "8027fb74": "unused_set_camera_shake", + "8027fc18": "return_height_above_floor", + "8027fe20": "set_cam_focus_and_pos_rel_mario", + "8027fff8": "set_camera_height", + "80280368": "return_pitch_parallel_floor", + "802804f4": "func_8027FF44", + "802806a4": "find_in_bounds_yaw_wdw_bob_thi", + "80280810": "return_open_camera_yaw", + "80280970": "return_platform_camera_yaw", + "80280b00": "func_80280550", + "80281188": "func_80280BD8", + "802813bc": "func_80280E0C", + "802813ec": "func_80280E3C", + "8028146c": "update_open_camera", + "80281588": "update_platform_level_camera", + "802816a0": "return_reverse_tower_camera_yaw", + "802817fc": "update_reverse_tower_camera", + "80281904": "return_parallel_tracking_camera_yaw", + "80282280": "return_fixed_camera_yaw", + "802826a0": "return_boss_fight_camera_yaw", + "80282c0c": "unused_return_mode_5_camera_yaw", + "80282c28": "unused_80282678", + "80282c3c": "update_boss_fight_camera", + "80282c7c": "update_parallel_tracking_camera", + "80282ce0": "update_fixed_camera", + "80282d78": "return_behind_mario_camera_yaw", + "80283340": "return_behind_mario_water_camera_yaw", + "80283578": "return_slide_camera_yaw", + "802839e4": "update_behind_mario_camera", + "80283a18": "nop_return_water_camera_yaw", + "80283a34": "update_water_surface_camera", + "80283a68": "return_mario_yaw", + "80283af8": "return_close_or_free_roam_cam_yaw", + "80284cb8": "update_close_or_free_roam_camera", + "80284cfc": "camera_lakitu_zoom_distance", + "80284d38": "camera_mario_zoom_distance", + "80284d74": "return_spiral_stairs_camera_yaw", + "802850ac": "update_spiral_stairs_camera", + "802850ec": "return_slide_or_0f_camera_yaw", + "802851dc": "update_slide_camera", + "8028526c": "func_80284CBC", + "802852f4": "func_80284D44", + "80285370": "exit_c_up_mode", + "80285808": "return_first_person_camera_yaw", + "802858a4": "operate_c_up_looking", + "80285a2c": "func_8028547C", + "80285d20": "update_c_up_camera", + "80285ed8": "return_cannon_camera_yaw", + "80285f60": "update_cannon_camera", + "8028603c": "init_transitional_movement", + "80286088": "set_camera_preset", + "80286188": "func_80285BD8", + "80286420": "func_80285E70", + "802868f8": "update_camera", + "80286f68": "reset_camera", + "8028724c": "init_camera", + "802879ec": "func_80287404", + "80287bc4": "select_mario_cam_mode", + "80287be0": "func_802875F8", + "80287cb8": "func_802876D0", + "80287d30": "geo_camera_preset_and_pos", + "80287dc0": "dummy_802877D8", + "80287dd4": "dummy_802877EC", + "80287de8": "vec3f_sub", + "80287e28": "object_pos_to_vec3f", + "80287e50": "vec3f_to_object_pos", + "80287e78": "unused_object_angle_to_vec3s", + "80287ea0": "evaluate_cubic_spline", + "802882e4": "move_point_along_spline", + "80288624": "select_or_activate_mario_cam", + "80288718": "test_or_set_mario_cam_active", + "80288888": "set_spline_values", + "802889b0": "set_face_angle_from_spline", + "80288ce4": "find_c_buttons_pressed", + "80288e68": "update_camera_status", + "80288f5c": "find_and_return_count_wall_collisions", + "80289198": "vec3f_compare", + "80289214": "clamp_pitch", + "802892d8": "is_within_100_units_of_mario", + "8028935c": "set_or_approach_f32_exponential", + "802893f4": "approach_f32_exponential_bool", + "80289488": "approach_f32_exponential", + "802894b4": "approach_s16_exponential_bool", + "8028956c": "approach_s16_exponential", + "80289610": "approach_vec3f_exponential", + "80289684": "set_or_approach_vec3f_exponential", + "802896f8": "approach_vec3s_exponential", + "8028976c": "camera_approach_s16_symmetric_bool", + "8028984c": "camera_approach_s16_symmetric", + "8028993c": "set_or_approach_s16_symmetric", + "802899cc": "camera_approach_f32_symmetric_bool", + "80289b0c": "camera_approach_f32_symmetric", + "80289c00": "random_vec3s", + "80289d20": "func_80289738", + "80289f88": "clamp_positions_and_find_yaw_angle", + "8028a080": "func_80289A98", + "8028a0f4": "is_pos_less_than_bounds", + "8028a4ec": "is_behind_surface", + "8028a6bc": "func_8028A0D4", + "8028a7ec": "is_mario_behind_surface", + "8028a834": "scale_along_line", + "8028a8e8": "check_if_vector_fits_in_bounds", + "8028aa28": "calculate_verticle_angle", + "8028aad8": "calculate_yaw", + "8028ab60": "calculate_angles", + "8028ac28": "calc_abs_dist", + "8028accc": "calc_hor_dist", + "8028ad4c": "rotate_in_xz", + "8028ae1c": "rotate_in_yz", + "8028aef0": "set_camera_pitch_shake", + "8028af4c": "set_camera_yaw_shake", + "8028b00c": "set_camera_roll_shake", + "8028b068": "func_8028AA80", + "8028b11c": "Unknown8028AB34", + "8028b1d0": "increment_shake_offset", + "8028b218": "shake_camera_pitch", + "8028b32c": "shake_camera_yaw", + "8028b438": "shake_camera_roll", + "8028b50c": "func_8028AF24", + "8028b724": "func_8028B13C", + "8028b754": "func_8028B16C", + "8028b784": "play_camera_buzz_if_cdown", + "8028b7c4": "play_camera_buzz_if_cbutton", + "8028b804": "play_camera_buzz_if_c_sideways", + "8028b850": "play_sound_cbutton_up", + "8028b884": "play_sound_cbutton_down", + "8028b8b8": "play_sound_cbutton_side", + "8028b8ec": "play_sound_button_change_blocked", + "8028b920": "play_sound_rbutton_changed", + "8028b954": "func_8028B36C", + "8028b9c4": "func_8028B3DC", + "8028bd34": "stop_mario", + "8028bd98": "handle_c_button_movement", + "8028c038": "func_8028BA38", + "8028c13c": "set_camera_cutscene_table", + "8028c18c": "determine_star_fadeout_cutscene_table", + "8028c26c": "return_table_door_push_or_pull", + "8028c2c8": "return_cutscene_table", + "8028c7a0": "instant_warp_camera_update", + "8028c8f0": "approach_camera_height", + "8028c9ac": "Unknown8028C3AC", + "8028c9cc": "set_focus_position", + "8028cbf0": "set_pos_from_face_angle_and_vec3f", + "8028cd94": "set_pos_from_face_angle_and_rel_coords", + "8028cdec": "determine_pushing_or_pulling_door", + "8028ce24": "func_8028C824", + "8028d44c": "set_camera_preset_fixed_ref_point", + "8028d5ac": "set_camera_preset_platform_level", + "8028d5fc": "set_camera_preset_boss_fight", + "8028d658": "set_camera_preset_close_cam", + "8028d698": "set_camera_preset_open_camera", + "8028d79c": "parallel_tracking_init", + "8028d888": "set_fixed_cam_axis_sa_lobby", + "8028d92c": "func_8028D32C", + "8028da18": "CameraRR00", + "8028da50": "CameraRR04", + "8028daec": "CameraRR02", + "8028db38": "CameraRR0305", + "8028dbb4": "CameraRR01", + "8028dbf4": "CameraCotMC00", + "8028dc1c": "CameraSL00", + "8028dc70": "camera_change_set_free_roam_mode", + "8028dca4": "move_camera_through_floor_while_descending", + "8028dd48": "camera_change_hmc_maze_entrance", + "8028de2c": "CameraHMC02", + "8028de5c": "CameraHMC03", + "8028de90": "CameraHMC04", + "8028dec4": "CameraHMC05", + "8028def8": "CameraSSL00", + "8028df24": "CameraSSL0102", + "8028df6c": "CameraSSL03", + "8028dfb4": "CameraTHI00", + "8028dfe8": "CameraTHI01", + "8028e01c": "CameraRR07", + "8028e064": "CameraRR08", + "8028e098": "camera_change_hmc_cotmc_pool_entry", + "8028e0ec": "CameraInside20", + "8028e164": "CameraInside1E", + "8028e210": "CameraInside1F", + "8028e298": "CameraInside01", + "8028e300": "CameraInside1213", + "8028e38c": "CameraInside00", + "8028e3b8": "CameraInside0E", + "8028e3f0": "CameraInside0F", + "8028e41c": "bbh_room_6_camera", + "8028e450": "CameraBBH24", + "8028e47c": "CameraBBH2E2F", + "8028e524": "bbh_room_1_camera", + "8028e55c": "CameraBBH01", + "8028e594": "bbh_room_2_lower_camera", + "8028e5cc": "bbh_room_4_camera", + "8028e604": "bbh_room_8_camera", + "8028e63c": "bbh_room_5_library_camera", + "8028e674": "bbh_room_5_library_to_hidden_transition", + "8028e6c4": "bbh_room_5_hidden_to_library_transition", + "8028e714": "bbh_room_5_hidden_camera", + "8028e758": "bbh_room_3_camera", + "8028e790": "bbh_room_7_mr_i_camera", + "8028e7c8": "bbh_room_7_mr_i_to_coffins_transition", + "8028e818": "bbh_room_7_coffins_to_mr_i_transition", + "8028e868": "CameraBBH3033", + "8028e8a0": "CameraBBH34", + "8028e8cc": "CameraBBH38", + "8028e930": "bbh_room_12_upper_camera", + "8028e974": "CameraBBH00", + "8028e9a0": "bbh_room_2_library_camera", + "8028e9d8": "bbh_room_2_library_to_trapdoor_transition", + "8028ea28": "bbh_room_2_trapdoor_camera", + "8028ea60": "bbh_room_2_trapdoor_transition", + "8028eab0": "bbh_room_9_attic_camera", + "8028eae8": "bbh_room_9_attic_transition", + "8028eb38": "bbh_room_9_mr_i_transition", + "8028eb88": "bbh_room_13_balcony_camera", + "8028ebc0": "bbh_room_0_camera", + "8028ec04": "camera_change_activate_ccm_slide_flag", + "8028ec2c": "camera_change_deactivate_ccm_slide_flag", + "8028ec58": "surface_type_presets", + "8028ed30": "set_preset_via_surface_or_input", + "8028ed98": "surface_type_presets_thi", + "8028eeb0": "level_specific_camera_update", + "8028f670": "resolve_geometry_collisions", + "8028f914": "func_8028F2F0", + "8028fc9c": "find_mario_relative_geometry", + "8028fe24": "func_8028F800", + "8028fe58": "func_8028F834", + "8028fe84": "unused_8028F860", + "8028ff04": "cutscene_object_with_dialog", + "8028ffc8": "cutscene_object_without_dialog", + "8029000c": "cutscene_object", + "80290098": "set_cam_yaw_from_focus_and_pos", + "802900e0": "func_8028FABC", + "80290104": "func_8028FAE0", + "80290168": "cap_switch_save", + "802901a4": "func_8028FB80", + "802901fc": "func_8028FBD8", + "802903b8": "func_8028FD94", + "802904a8": "CutsceneIntroPeach0_2", + "802904e4": "CutsceneIntroPeach2_1", + "8029051c": "func_8028FEDC", + "8029053c": "move_credits_camera", + "80290784": "func_80290144", + "802907f4": "func_802901B4", + "80290864": "func_80290224", + "802908e8": "func_802902A8", + "802909d0": "rotate_camera", + "80290a5c": "CutsceneEnterSomething8029041C", + "80290abc": "rotate_and_move_vec3f", + "80290b54": "func_80290514", + "80290ba4": "func_80290564", + "80290bd8": "func_80290598", + "80290c08": "unused_802905C8", + "80290c1c": "Cutscene0FTodo0", + "80290c30": "Cutscene0FTodo1", + "80290c44": "CutscenePeachEnd0_1", + "80290c9c": "CutscenePeachEnd0_2", + "80290d90": "CutscenePeachEnd0", + "80290e00": "CutscenePeachEnd2", + "80290e74": "CutscenePeachEndCommon367A", + "80290eb0": "CutscenePeachEnd3_1", + "80290f1c": "CutscenePeachEnd3", + "80290f8c": "CutscenePeachEnd1", + "80291074": "CutscenePeachEnd4_1", + "80291108": "CutscenePeachEnd4", + "802911c8": "CutscenePeachEnd5_1", + "80291208": "CutscenePeachEnd5_2", + "8029127c": "CutscenePeachEnd5_3", + "802912b8": "CutscenePeachEnd5_4", + "80291354": "CutscenePeachEnd5", + "8029142c": "CutscenePeachEnd6", + "802914cc": "CutscenePeachEnd7_1", + "80291514": "CutscenePeachEnd7", + "802915d4": "CutscenePeachEnd8", + "80291654": "CutscenePeachEnd9_1", + "802916b8": "CutscenePeachEnd9_2", + "80291774": "CutscenePeachEnd9", + "802917e4": "CutscenePeachEndA_1", + "8029184c": "CutscenePeachEndA_2", + "80291870": "CutscenePeachEndA", + "80291924": "CutscenePeachEndB", + "80291964": "CutsceneGrandStar0_1", + "802919dc": "CutsceneGrandStar0_2", + "80291ab4": "CutsceneGrandStar0_4", + "80291b18": "CutsceneGrandStar0_5", + "80291b68": "CutsceneGrandStar0_6", + "80291bf4": "CutsceneGrandStar0_7", + "80291c3c": "CutsceneGrandStar0_3", + "80291cd0": "CutsceneGrandStar0", + "80291db0": "CutsceneGrandStar1_1", + "80291e84": "CutsceneGrandStar1_2", + "80291f18": "CutsceneGrandStar1_3", + "80292038": "CutsceneGrandStar1_4", + "80292164": "CutsceneGrandStar1", + "802921fc": "func_80291BBC", + "8029228c": "CutsceneDanceCommon", + "80292324": "CutsceneStarDance1_4", + "80292370": "CutsceneStarDance1_5", + "802923b8": "CutsceneStarDance1_6", + "80292400": "dummy_80291DC0", + "80292414": "CutsceneStarDance1_1", + "8029244c": "CutsceneStarDance1_3", + "80292484": "CutsceneStarDance1_2", + "802924b8": "CutsceneStarDance1", + "80292628": "func_80291FE8", + "802926dc": "CutsceneStarDance3_1", + "802927d0": "CutsceneStarDance3_2", + "80292868": "CutsceneStarDance3_3", + "80292974": "CutsceneStarDance3_4", + "80292a20": "CutsceneStarDance3_5", + "80292a4c": "CutsceneStarDance3_6", + "80292a80": "CutsceneStarDance3", + "80292c00": "CutsceneStarDance2_1", + "80292d80": "CutsceneStarDance2_3", + "80292e2c": "CutsceneStarDance2_2", + "80292ec4": "func_80292884", + "80292f40": "CutsceneStarDance2_4", + "80292f98": "CutsceneStarDance2_5", + "80292fe4": "CutsceneStarDance2_6", + "80293018": "CutsceneStarDance2", + "802930f0": "CutsceneKeyDance0_6", + "80293164": "CutsceneKeyDance0_2", + "802931c0": "CutsceneKeyDance0_3", + "80293220": "CutsceneKeyDance0_4", + "8029328c": "CutsceneKeyDance0_5", + "802932f4": "CutsceneKeyDance0_7", + "80293328": "CutsceneKeyDance0_8", + "80293354": "CutsceneKeyDance0_1", + "8029338c": "CutsceneKeyDance0", + "80293488": "CutsceneEnterBowserPlatform0_4", + "802934b4": "CutsceneEnterBowserPlatform0_3", + "802934d8": "CutsceneEnterBowserPlatform0_5", + "80293548": "CutsceneEnterBowserPlatform0_8", + "802935e0": "CutsceneEnterBowserPlatform0_9", + "80293624": "CutsceneEnterBowserPlatform0_7", + "8029369c": "CutsceneEnterBowserPlatform0_6", + "802936dc": "CutsceneEnterBowserPlatform0_1", + "80293708": "func_802930C8", + "80293734": "CutsceneEnterBowserPlatform0_2", + "802937e8": "bowser_fight_intro_dialog", + "8029386c": "CutsceneEnterBowserPlatform1", + "802938c8": "CutsceneEnterBowserPlatform2", + "80293944": "CutsceneEnterBowserPlatform0", + "80293abc": "CutsceneStarSpawn0_1", + "80293ae8": "CutsceneStarSpawn0_2", + "80293b70": "CutsceneStarSpawn1_1", + "80293bf4": "CutsceneStarSpawn1_2", + "80293c2c": "CutsceneStarSpawn0", + "80293cb0": "CutsceneStarSpawn1", + "80293d5c": "CutsceneStarSpawn2", + "80293d90": "CutsceneExitWaterfall0_1", + "80293dd4": "Cutscene80293794", + "80293e7c": "CutsceneExitWaterfall0", + "80293ed8": "CutsceneFallCommon1", + "80293f2c": "CutsceneFallToCastleGrounds0_1", + "80293f70": "CutsceneFallToCastleGrounds0", + "80293fcc": "CutsceneSpecialStarSpawn0_1", + "80294024": "CutsceneSpecialStarSpawn0_3", + "80294088": "CutsceneSpecialStarSpawn0_4", + "802940cc": "CutsceneSpecialStarSpawn0_5", + "8029410c": "CutsceneSpecialStarSpawn0_2", + "802942cc": "CutsceneSpecialStarSpawn0_6", + "802942f0": "CutsceneSpecialStarSpawn0", + "802943d4": "CutsceneSpecialStarSpawn1", + "80294428": "func_80293DE8", + "80294718": "CutscenePrepareCannon0_1", + "802947a4": "CutscenePrepareCannon0_2", + "8029480c": "func_802941CC", + "802948a0": "CutscenePrepareCannon0_3", + "80294a14": "CutscenePrepareCannon0", + "80294a94": "CutscenePrepareCannon1", + "80294ae8": "func_802944A8", + "80294b78": "func_80294538", + "80294bb4": "CutsceneDeath1_1", + "80294c28": "CutsceneDeath1_2", + "80294c5c": "CutsceneDeath1", + "80294cc4": "CutsceneDeath2_1", + "80294d48": "CutsceneDeath2_2", + "80294db4": "CutsceneDeath2", + "80294e24": "CutsceneBBHDeath0_1", + "80294ea8": "CutsceneBBHDeath0_2", + "80294ee8": "CutsceneBBHDeath0", + "80294f58": "CutsceneQuicksandDeath0_1", + "80294f94": "CutsceneQuicksandDeath0_2", + "80294fec": "CutsceneQuicksandDeath0", + "802950b0": "Cutscene1ATodo0_3", + "80295140": "Cutscene1ATodo0_2", + "802951f0": "Cutscene1ATodo0_1", + "80295270": "Cutscene1ATodo0", + "80295310": "CutsceneEnterPool0_1", + "802953dc": "CutsceneEnterPool0_2", + "80295418": "CutsceneEnterPool0", + "80295480": "Cutscene26Todo1_1", + "802954ec": "Cutscene26Todo1_5", + "80295518": "Cutscene26Todo1_2", + "80295580": "Cutscene26Todo1_3", + "80295670": "Cutscene26Todo1_4", + "80295740": "Cutscene26Todo1_7", + "8029576c": "Cutscene26Todo1_6", + "802957c8": "Cutscene26Todo1", + "80295894": "Cutscene26Todo2", + "802958d4": "CutsceneEnterPyramidTop0_1", + "80295930": "CutsceneEnterPyramidTop0", + "80295a58": "CutsceneDialog0_1", + "80295bf0": "CutsceneDialog0_2", + "80295e24": "CutsceneDialog0_3", + "80295e8c": "CutsceneDialog0", + "80295fb0": "CutsceneDialog1", + "80295fd8": "CutsceneDialog2", + "80296020": "CutsceneReadMessage0_1", + "80296160": "CutsceneReadMessage0", + "802962c8": "CutsceneReadMessage1", + "802962f0": "CutsceneReadMessage2", + "80296318": "CutsceneExitSuccess1", + "802963b8": "CutsceneExitSuccess2", + "8029652c": "CutsceneExitSuccess4", + "8029665c": "CutsceneExitSuccess3", + "8029669c": "CutsceneExitBowserSuccess0_1", + "802966e4": "CutsceneExitSuccess5", + "80296710": "CutsceneExitBowserSuccess0", + "802967c4": "CutsceneExitNonPainting1", + "8029685c": "CutsceneBBHExitSuccess0_1", + "802968a0": "CutsceneBBHExitSuccess0", + "8029695c": "CutsceneNonPaintingDeath0_1", + "802969f8": "Cutscene1CTodo_0", + "80296a64": "CutsceneNonPaintingDeath0_2", + "80296b30": "CutsceneNonPaintingDeath0", + "80296bc8": "CutsceneCapSwitchPress0_1", + "80296c4c": "CutsceneCapSwitchPress0_4", + "80296d60": "CutsceneCapSwitchPress0_5", + "80296da8": "CutsceneCapSwitchPress0_2", + "80296eb4": "CutsceneCapSwitchPress0_3", + "80296f38": "CutsceneCapSwitchPress0_6", + "80296fa8": "CutsceneCapSwitchPress0", + "80297148": "CutsceneUnlockKeyDoor0_1", + "8029720c": "CutsceneUnlockKeyDoor0_2", + "80297290": "CutsceneUnlockKeyDoor0_5", + "802972ec": "CutsceneUnlockKeyDoor0_6", + "80297300": "CutsceneUnlockKeyDoor0_3", + "80297384": "CutsceneUnlockKeyDoor0_4", + "802973b0": "CutsceneUnlockKeyDoor0", + "80297464": "intro_peach_move_camera_start_to_pipe", + "80297560": "peach_letter_text", + "8029758c": "play_sound_peach_reading_letter", + "802975c4": "CutsceneIntroPeachCommon", + "8029762c": "CutsceneIntroPeach4", + "802976bc": "CutsceneIntroPeach3_2", + "80297728": "CutsceneIntroPeach2_2", + "80297748": "CutsceneIntroPeach0_1", + "80297784": "CutsceneIntroPeach3_1", + "802977c8": "CutsceneIntroPeach3_3", + "802977f4": "intro_pipe_exit_text", + "80297820": "play_sound_intro_turn_on_hud", + "8029784c": "CutsceneIntroPeach2", + "80297908": "CutsceneIntroPeach3", + "80297a38": "CutsceneIntroPeach1", + "80297a64": "CutsceneIntroPeach0", + "80297b58": "CutsceneEndWaving0_1", + "80297b84": "CutsceneEndWaving0", + "80297c14": "CutsceneCredits0_1", + "80297c40": "CutsceneCredits0", + "802980dc": "CutsceneSlidingDoorsOpen0_1", + "8029819c": "CutsceneSlidingDoorsOpen0_2", + "80298218": "CutsceneSlidingDoorsOpen0_3", + "80298254": "CutsceneSlidingDoorsOpen0_4", + "80298290": "CutsceneSlidingDoorsOpen0_5", + "802983b4": "CutsceneSlidingDoorsOpen0", + "80298458": "CutsceneDoubleDoorsOpen1", + "802984a0": "CutsceneEnterPainting0_1", + "802984b4": "CutsceneEnterPainting0", + "802987b0": "CutsceneExitPainting80298094", + "8029894c": "CutsceneExitPainting80298230", + "802989e8": "CutsceneExitPainting802982CC", + "80298af8": "CutsceneExitPainting0", + "80298ba0": "Cutscene11Todo_0", + "80298c2c": "Cutscene11Todo_1", + "80298ccc": "CutsceneExitPainting1", + "80298d44": "CutsceneEnterCannon2", + "80298d9c": "CutsceneEnterCannon1", + "80298fe8": "CutsceneEnterCannon0", + "80299100": "CutsceneDoor0", + "80299154": "CutsceneDoor1", + "802991a8": "CutsceneDoorWarp1", + "802991f0": "CutsceneDoor2", + "802992cc": "CutsceneDoor3", + "80299360": "CutsceneDoor4", + "80299404": "CutsceneDoorAB_2", + "802994e8": "handle_cutscenes", + "8029a2f8": "call_cutscene_func_in_time_range", + "8029a37c": "set_cutscene_phase_at_frame", + "8029a3b4": "func_80299C98", + "8029a41c": "func_80299D00", + "8029a4d0": "func_80299DB4", + "8029a5e8": "set_fov_30", + "8029a60c": "approach_fov_20", + "8029a64c": "set_fov_45", + "8029a670": "set_fov_29", + "8029a694": "zoom_fov_30", + "8029a6f4": "zoom_fov_for_sleep", + "8029a858": "approach_fov_30", + "8029a894": "approach_fov_60", + "8029a8d0": "approach_fov_45", + "8029a968": "approach_fov_80", + "8029a9a4": "func_8029A288", + "8029aa3c": "geo_camera_fov", + "8029ab94": "set_fov_function", + "8029abb0": "func_8029A494", + "8029ac30": "func_8029A514", + "8029aef8": "func_8029A7DC", + "8029af98": "intro_peach_set_pos_and_opacity", + "8029b08c": "bhv_intro_peach_loop", + "8029b28c": "intro_lakitu_set_offset_from_camera", + "8029b358": "intro_lakitu_set_focus", + "8029b3c8": "intro_lakitu_set_pos_and_focus", + "8029b49c": "bhv_intro_lakitu_loop", + "8029bde4": "bhv_end_birds_1_loop", + "8029bf64": "bhv_end_birds_2_loop", + "8029c0e4": "func_8029B964", + "8029c254": "bhv_intro_scene_loop", + "8029c770": "nop_change_course", + "8029c780": "copy_mario_state_to_object", + "8029c9cc": "spawn_particle", + "8029ca58": "bhv_mario_update", + "8029cb34": "update_objects_starting_at", + "8029cbc8": "update_objects_during_time_stop", + "8029cd28": "update_objects_in_list", + "8029cd98": "unload_deactivated_objects_in_list", + "8029ce58": "set_object_respawn_info_bits", + "8029cedc": "unload_objects_from_area", + "8029cfb0": "spawn_objects_from_info", + "8029d1d8": "stub_8029CA50", + "8029d1e8": "clear_objects", + "8029d324": "update_terrain_objects", + "8029d374": "update_non_terrain_objects", + "8029d428": "unload_deactivated_objects", + "8029d690": "update_objects", + "8029d890": "Geo18_8029D890", + "8029d924": "Geo18_8029D924", + "8029db48": "geo_switch_anim_state", + "8029dbd4": "geo_switch_area", + "8029dcd4": "func_8029D558", + "8029dda8": "apply_object_scale_to_matrix", + "8029de80": "func_8029D704", + "8029e1b0": "set_object_held_state", + "8029e27c": "lateral_dist_between_objects", + "8029e2f8": "dist_between_objects", + "8029e398": "obj_forward_vel_approach_upward", + "8029e3e8": "approach_f32_signed", + "8029e494": "approach_f32_symmetric", + "8029e530": "approach_s16_symmetric", + "8029e5ec": "obj_rotate_yaw_toward", + "8029e694": "angle_to_object", + "8029e714": "obj_turn_toward_object", + "8029e8bc": "set_object_parent_relative_pos", + "8029e914": "set_object_pos", + "8029e96c": "set_object_angle", + "8029e9ac": "spawn_object_abs_with_rot", + "8029ea24": "spawn_object_rel_with_rot", + "8029eaac": "Unknown8029E330", + "8029eb04": "spawn_water_splash", + "8029ed20": "spawn_object_at_origin", + "8029edcc": "spawn_object", + "8029ee24": "try_to_spawn_object", + "8029eeb8": "spawn_object_with_scale", + "8029ef64": "spawn_object_relative", + "8029effc": "spawn_object_relative_with_scale", + "8029f070": "obj_move_using_vel", + "8029f0c8": "copy_object_graph_y_offset", + "8029f0e0": "copy_object_pos_and_angle", + "8029f120": "copy_object_pos", + "8029f148": "copy_object_angle", + "8029f188": "func_8029EA0C", + "8029f1b0": "Unknown8029EA34", + "8029f200": "linear_mtxf_mul_vec3f", + "8029f274": "linear_mtxf_transpose_mul_vec3f", + "8029f2ec": "apply_scale_to_object_transform", + "8029f3a8": "copy_object_scale", + "8029f3d0": "scale_object_xyz", + "8029f404": "scale_object", + "8029f430": "obj_scale", + "8029f464": "SetObjAnimation", + "8029f4b4": "set_obj_animation_and_sound_state", + "8029f514": "func_8029ED98", + "8029f59c": "func_8029EE20", + "8029f600": "obj_enable_rendering_and_become_tangible", + "8029f620": "obj_enable_rendering", + "8029f644": "obj_disable_rendering_and_become_intangible", + "8029f66c": "obj_disable_rendering", + "8029f694": "obj_unhide", + "8029f6bc": "obj_hide", + "8029f6e0": "obj_set_pos_relative", + "8029f7d8": "obj_set_pos_relative_to_parent", + "8029f820": "obj_enable_rendering_2", + "8029f848": "obj_unused_init_on_floor", + "8029f8ec": "obj_set_facing_to_move_angles", + "8029f914": "get_object_list_from_behavior", + "8029f95c": "obj_nearest_object_with_behavior", + "8029f998": "obj_dist_to_nearest_object_with_behavior", + "8029f9ec": "obj_find_nearest_object_with_behavior", + "8029fb1c": "find_unimportant_object", + "8029fb68": "count_unimportant_objects", + "8029fbdc": "count_objects_with_behavior", + "8029fc9c": "obj_find_nearby_held_actor", + "8029fdb4": "obj_change_action", + "8029fe00": "func_8029F684", + "8029fe6c": "func_8029F6F0", + "8029fea4": "func_8029F728", + "8029ff04": "func_8029F788", + "8029ffa4": "func_8029F828", + "802a0008": "obj_check_anim_frame", + "802a0050": "obj_check_anim_frame_in_range", + "802a00ac": "Unknown8029F930", + "802a0114": "mario_is_in_air_action", + "802a0154": "mario_is_dive_sliding", + "802a0198": "func_8029FA1C", + "802a01d8": "func_8029FA5C", + "802a0380": "obj_get_thrown_or_placed", + "802a0474": "obj_get_dropped", + "802a04c0": "obj_set_model", + "802a04f0": "mario_set_flag", + "802a0514": "obj_clear_interact_status_flag", + "802a0568": "mark_object_for_deletion", + "802a057c": "obj_disable", + "802a05b4": "obj_become_intangible", + "802a05d4": "obj_become_tangible", + "802a05f0": "make_object_tangible", + "802a0604": "obj_update_floor_height", + "802a064c": "obj_update_floor_height_and_get_floor", + "802a079c": "obj_apply_drag_xz", + "802a0e68": "obj_move_y", + "802a113c": "obj_unused_resolve_wall_collisions", + "802a11a8": "abs_angle_diff", + "802a120c": "obj_move_xz_using_fvel_and_yaw", + "802a12a4": "obj_move_y_with_terminal_vel", + "802a1308": "obj_compute_vel_xz", + "802a1370": "func_802A0BF4", + "802a1424": "are_objects_collided", + "802a148c": "obj_set_behavior", + "802a14c4": "set_object_behavior", + "802a14fc": "obj_has_behavior", + "802a1554": "object_has_behavior", + "802a15ac": "obj_lateral_dist_from_mario_to_home", + "802a1634": "obj_lateral_dist_to_home", + "802a16ac": "obj_outside_home_square", + "802a1774": "obj_outside_home_rectangle", + "802a184c": "obj_set_pos_to_home", + "802a188c": "obj_set_pos_to_home_and_stop", + "802a18dc": "obj_shake_y", + "802a1930": "func_802A11B4", + "802a1960": "Unknown802A11E4", + "802a19ac": "obj_set_billboard", + "802a19c8": "obj_set_hitbox_radius_and_height", + "802a19f0": "obj_set_hurtbox_radius_and_height", + "802a1b34": "spawn_object_loot_blue_coins", + "802a1b8c": "spawn_object_loot_yellow_coins", + "802a1bdc": "obj_spawn_loot_coin_at_mario_pos", + "802a1c68": "obj_abs_y_dist_to_home", + "802a1cc4": "Unknown802A1548", + "802a1f3c": "obj_resolve_wall_collisions", + "802a2320": "obj_update_floor_and_walls", + "802a2348": "obj_move_standard", + "802a25b4": "obj_move_using_vel_and_gravity", + "802a2644": "obj_move_using_fvel_and_gravity", + "802a2674": "set_object_pos_relative", + "802a2748": "obj_angle_to_home", + "802a27b0": "func_802A2008", + "802a2804": "translate_object_local", + "802a2930": "build_object_transform_from_pos_and_angle", + "802a2a18": "func_802A2270", + "802a2a84": "build_object_transform_relative_to_parent", + "802a2b28": "Unknown802A2380", + "802a2b6c": "obj_rotate_move_angle_using_vel", + "802a2bc4": "obj_rotate_face_angle_using_vel", + "802a2c1c": "obj_set_face_angle_to_move_angle", + "802a2c5c": "obj_follow_path", + "802a2ed4": "chain_segment_init", + "802a2f14": "random_f32_around_zero", + "802a2f5c": "scale_object_random", + "802a2fc0": "translate_object_xyz_random", + "802a308c": "translate_object_xz_random", + "802a31e0": "func_802A2A38", + "802a3268": "obj_reflect_move_angle_off_wall", + "802a32ac": "obj_spawn_particles", + "802a34a4": "set_object_hitbox", + "802a3604": "signum_positive", + "802a3634": "absf", + "802a3674": "absi", + "802a36a4": "obj_wait_then_blink", + "802a3754": "obj_is_mario_ground_pounding_platform", + "802a37ac": "func_802A3004", + "802a37dc": "func_802A3034", + "802a3818": "obj_push_mario_away", + "802a390c": "obj_push_mario_away_from_cylinder", + "802a399c": "BehDustSmokeLoop", + "802a3a4c": "func_802A32A4", + "802a3a88": "func_802A32E0", + "802a3b40": "func_802A3398", + "802a3c18": "func_802A3470", + "802a3cfc": "obj_is_mario_on_platform", + "802a3d40": "obj_shake_y_until", + "802a3dd4": "func_802A362C", + "802a3e30": "obj_call_action_function", + "802a3ef8": "Unknown802A3750", + "802a3f24": "func_802A377C", + "802a3f48": "obj_mario_far_away", + "802a404c": "obj_is_mario_moving_fast_or_in_air", + "802a40b8": "item_in_array", + "802a4120": "bhv_init_room", + "802a4210": "obj_enable_rendering_if_mario_in_room", + "802a4360": "obj_set_hitbox_and_die_if_attacked", + "802a4440": "func_802A3C98", + "802a44f4": "set_object_collision_data", + "802a452c": "obj_if_hit_wall_bounce_away", + "802a4564": "obj_hide_if_mario_far_away_y", + "802a45e4": "Geo18_802A45E4", + "802a462c": "Unknown802A3E84", + "802a46cc": "obj_is_hidden", + "802a4704": "enable_time_stop", + "802a4728": "disable_time_stop", + "802a4750": "set_time_stop_flags", + "802a4774": "clear_time_stop_flags", + "802a47a0": "func_802A3FF8", + "802a48bc": "obj_is_mario_in_range_and_ready_to_speak", + "802a4960": "obj_update_dialog", + "802a4be4": "obj_update_dialog_with_cutscene", + "802a4f04": "obj_has_model", + "802a4f58": "obj_align_gfx_with_floor", + "802a5034": "mario_is_within_rectangle", + "802a50fc": "ShakeScreen", + "802a513c": "attack_collided_non_mario_object", + "802a51ac": "obj_was_attacked_or_ground_pounded", + "802a5228": "copy_object_behavior_params", + "802a5248": "func_802A4A70", + "802a5288": "func_802A4AB0", + "802a52c4": "func_802A4AEC", + "802a52f8": "obj_check_grabbed_mario", + "802a5358": "player_performed_grab_escape_action", + "802a540c": "obj_unused_play_footstep_sound", + "802a5460": "enable_time_stop_including_mario", + "802a5498": "disable_time_stop_including_mario", + "802a54d8": "obj_check_interacted", + "802a5524": "obj_spawn_loot_blue_coin", + "802a5588": "obj_spawn_star_at_y_offset", + "802a5620": "func_802A4DB0", + "802a56bc": "bhv_star_door_loop", + "802a58dc": "bhv_piranha_particle_loop", + "802a597c": "ActionMrIParticle0", + "802a5a44": "ActionMrIParticle1", + "802a5aa0": "bhv_mr_i_particle_loop", + "802a5acc": "func_802A525C", + "802a5bd4": "bhv_mr_i_body_loop", + "802a5d4c": "ActionMrI3", + "802a6518": "ActionMrI2", + "802a68a0": "ActionMrI1", + "802a6ad8": "ActionMrI0", + "802a6b7c": "bhv_mr_i_loop", + "802a6c20": "bhv_pole_init", + "802a6c74": "bhv_giant_pole_loop", + "802a6cf4": "bhv_thi_huge_island_top_loop", + "802a6d64": "bhv_thi_tiny_island_top_loop", + "802a6ee4": "ActionActivateCapSwitch0", + "802a7020": "ActionActivateCapSwitch1", + "802a708c": "ActionActivateCapSwitch2", + "802a7160": "ActionActivateCapSwitch3", + "802a7170": "bhv_cap_switch_loop", + "802a719c": "Geo18_802A719C", + "802a7230": "bhv_bobomb_anchor_mario_loop", + "802a7264": "ActionKingBobomb0", + "802a7384": "func_802A6AF8", + "802a73d8": "ActionKingBobomb2", + "802a7598": "ActionKingBobomb3", + "802a7804": "ActionKingBobomb1", + "802a78d8": "ActionKingBobomb6", + "802a7a60": "ActionKingBobomb7", + "802a7b1c": "ActionKingBobomb8", + "802a7b5c": "ActionKingBobomb4", + "802a7d14": "ActionKingBobomb5", + "802a7fbc": "func_802A7748", + "802a8064": "bhv_king_bobomb_loop", + "802a816c": "bhv_beta_chest_bottom_init", + "802a81e8": "bhv_beta_chest_bottom_loop", + "802a821c": "bhv_beta_chest_lid_loop", + "802a8370": "bhv_water_air_bubble_init", + "802a83a0": "bhv_water_air_bubble_loop", + "802a8630": "bhv_bubble_wave_init", + "802a86bc": "Unknown802A7E48", + "802a870c": "bhv_bubble_maybe_loop", + "802a88a4": "bhv_small_water_wave_loop", + "802a8a38": "func_802A81C4", + "802a8b18": "bhv_particle_init", + "802a8bc0": "bhv_particle_loop", + "802a8c88": "bhv_small_bubbles_loop", + "802a8cdc": "bhv_fish_group_loop", + "802a8d48": "bhv_water_waves_init", + "802a8d98": "bhv_cannon_base_unused_loop", + "802a8dc0": "ActionOpenedCannon0", + "802a8f40": "ActionOpenedCannon4", + "802a9114": "ActionOpenedCannon6", + "802a92fc": "ActionOpenedCannon5", + "802a93f8": "ActionOpenedCannon1", + "802a9440": "ActionOpenedCannon2", + "802a9460": "ActionOpenedCannon3", + "802a9498": "bhv_cannon_base_loop", + "802a94f8": "bhv_cannon_barrel_loop", + "802a958c": "func_802A8D18", + "802a9708": "bhv_chuckya_anchor_mario_loop", + "802a973c": "Unknown802A8EC8", + "802a98c4": "func_802A9050", + "802a9994": "ActionChuckya0", + "802a9d08": "ActionChuckya1", + "802a9f54": "ActionChuckya3", + "802a9fc8": "ActionChuckya2", + "802aa02c": "func_802A97B8", + "802aa0ac": "bhv_chuckya_loop", + "802aa1b8": "bhv_wf_breakable_wall_loop", + "802aa280": "func_802A9A0C", + "802aa3c8": "func_802A9B54", + "802aa3f4": "bhv_kickable_board_loop", + "802aa700": "bhv_tower_door_loop", + "802aa774": "bhv_wf_rotating_wooden_platform_loop", + "802aa830": "bhv_rotating_platform_loop", + "802aa948": "func_802AA0D4", + "802aa97c": "bhv_koopa_shell_underwater_loop", + "802aaa60": "bhv_warp_loop", + "802aab54": "BehFadingWarpLoop", + "802aac48": "bhv_white_puff_exploding_loop", + "802aae8c": "func_802AA618", + "802aaf48": "bhv_unused_080c_init", + "802aaffc": "func_802AA788", + "802ab060": "func_802AA7EC", + "802ab158": "func_802AA8E4", + "802ab18c": "func_802AA918", + "802ab1c8": "bhv_unused_080c_loop", + "802ab558": "bhv_spawn_star_objects", + "802ab5c8": "bhv_coin_sparkles_init", + "802ab650": "bhv_yellow_coin_init", + "802ab70c": "bhv_yellow_coin_loop", + "802ab748": "bhv_temp_coin_loop", + "802ab7a4": "bhv_coin_init", + "802ab860": "bhv_coin_loop", + "802aba40": "bhv_coin_formation_spawn_loop", + "802abc04": "func_802AB364", + "802abee4": "bhv_coin_formation_init", + "802abf0c": "bhv_coin_formation_loop", + "802ac068": "ActionCoinInsideBoo1", + "802ac15c": "ActionCoinInsideBoo0", + "802ac294": "bhv_coin_inside_boo_loop", + "802ac2c0": "bhv_coin_sparkles_loop", + "802ac2ec": "bhv_golden_coin_sparkles_loop", + "802ac3a8": "bhv_punch_tiny_triangle_loop", + "802ac4a0": "bhv_punch_tiny_triangle_init", + "802ac5b4": "bhv_wall_tiny_star_particle_loop", + "802ac678": "bhv_tiny_star_particles_init", + "802ac78c": "bhv_pound_tiny_star_particle_loop", + "802ac864": "bhv_pound_tiny_star_particle_init", + "802ac910": "func_802AC070", + "802ac958": "func_802AC0B8", + "802ac9d0": "func_802AC130", + "802aca6c": "func_802AC1CC", + "802acac8": "bhv_door_loop", + "802acc3c": "bhv_door_init", + "802ace80": "bhv_star_door_loop_2", + "802ad078": "ActionGrindelThwomp4", + "802ad10c": "ActionGrindelThwomp2", + "802ad1a4": "ActionGrindelThwomp3", + "802ad238": "ActionGrindelThwomp1", + "802ad2d0": "ActionGrindelThwomp0", + "802ad34c": "bhv_grindel_thwomp_loop", + "802ad378": "bhv_tumbling_bridge_platform_loop", + "802ad580": "ActionTumblingBridge1", + "802ad76c": "ActionTumblingBridge2", + "802ad7f4": "ActionTumblingBridge3", + "802ad828": "ActionTumblingBridge0", + "802ad890": "bhv_tumbling_bridge_loop", + "802ad8bc": "func_802AD01C", + "802ad8f0": "ActionElevator0", + "802ada4c": "ActionElevator1", + "802adb88": "ActionElevator2", + "802adce4": "ActionElevator4", + "802add70": "ActionElevator3", + "802addf8": "bhv_elevator_init", + "802adf6c": "bhv_elevator_loop", + "802adf98": "bhv_water_mist_spawn_loop", + "802adfd8": "bhv_water_mist_loop", + "802ae0cc": "spawn_triangle_break_particles", + "802ae238": "bhv_water_mist_2_loop", + "802ae304": "bhv_pound_white_puffs_init", + "802ae334": "func_802ADA94", + "802ae360": "bhv_unused_0e40_init", + "802ae394": "Unknown802ADAF4", + "802ae45c": "func_802ADBBC", + "802ae48c": "bhv_ground_snow_init", + "802ae4c0": "func_802ADC20", + "802ae534": "bhv_wind_loop", + "802ae85c": "bhv_unused_particle_spawn_loop", + "802ae908": "bhv_ukiki_cage_star_loop", + "802aea6c": "ukiki_cage_act_wait_for_ukiki", + "802aeab8": "ukiki_cage_act_spin", + "802aeb1c": "ukiki_cage_act_fall", + "802aeb74": "ukiki_cage_act_hide", + "802aeb9c": "bhv_ukiki_cage_loop", + "802aebc8": "bhv_squishable_platform_loop", + "802aec40": "bhv_bitfs_sinking_platform_loop", + "802aeca8": "bhv_ddd_moving_pole_loop", + "802aecdc": "bhv_bitfs_sinking_cage_platform_loop", + "802aedc0": "bhv_beta_moving_flames_spawn_loop", + "802aeea4": "bhv_beta_moving_flames_loop", + "802aef1c": "bhv_flamethrower_flame_loop", + "802af1e8": "bhv_flamethrower_loop", + "802af3fc": "bhv_rr_rotating_bridge_platform_loop", + "802af448": "bhv_bouncing_fireball_flame_loop", + "802af5f8": "bhv_bouncing_fireball_loop", + "802af7c4": "bhv_bowser_shock_wave_loop", + "802af9cc": "bhv_black_smoke_upward_loop", + "802afa0c": "bhv_black_smoke_bowser_loop", + "802afae4": "bhv_black_smoke_mario_loop", + "802afbf8": "bhv_flame_mario_loop", + "802afce4": "bhv_beta_fish_splash_spawner_loop", + "802afd1c": "bhv_spindrift_loop", + "802afee8": "bhv_wf_solid_tower_platform_loop", + "802aff30": "bhv_wf_elevator_tower_platform_loop", + "802b00e4": "bhv_wf_sliding_tower_platform_loop", + "802b0244": "func_802AF9A4", + "802b039c": "func_802AFAFC", + "802b04b4": "bhv_tower_platform_group_loop", + "802b0614": "bhv_tree_snow_or_leaf_loop", + "802b0974": "bhv_snow_leaf_particle_spawn_init", + "802b0b9c": "func_802B02FC", + "802b0bec": "bhv_squarish_path_moving_loop", + "802b0d48": "bhv_piranha_plant_waking_bubbles_loop", + "802b0df0": "bhv_piranha_plant_bubble_loop", + "802b1278": "bhv_purple_switch_loop", + "802b14f4": "func_802B0C54", + "802b15e8": "bhv_pushable_loop", + "802b1714": "func_802B0E74", + "802b17f4": "func_802B0F54", + "802b19d8": "func_802B1138", + "802b1ae0": "bhv_hidden_object_loop", + "802b1b2c": "bhv_breakable_box_loop", + "802b1bb0": "Geo18_802B1BB0", + "802b1c54": "bhv_heave_ho_throw_mario_loop", + "802b1d7c": "ActionHeaveHo1", + "802b1e6c": "ActionHeaveHo2", + "802b1ff4": "ActionHeaveHo3", + "802b20a0": "ActionHeaveHo0", + "802b2154": "func_802B18B4", + "802b2278": "bhv_heave_ho_loop", + "802b2340": "bhv_ccm_touched_star_spawn_loop", + "802b23e0": "bhv_unused_poundable_platform", + "802b2494": "bhv_beta_trampoline_spring_loop", + "802b25ac": "bhv_beta_trampoline_top_loop", + "802b26a4": "ActionJumpingBox0", + "802b27d8": "ActionJumpingBox1", + "802b2824": "func_802B1F84", + "802b288c": "bhv_jumping_box_loop", + "802b29b8": "bhv_boo_cage_loop", + "802b2bc8": "func_802B2328", + "802b2d10": "bhv_alpha_boo_key_loop", + "802b3108": "bhv_beta_boo_key_loop", + "802b3134": "func_802B2894", + "802b3250": "func_802B29B0", + "802b329c": "bhv_grand_star_loop", + "802b3600": "bhv_bowser_key_loop", + "802b37b8": "bhv_white_puff_smoke_init", + "802b3810": "bhv_bullet_bill_init", + "802b3830": "ActionBulletBill0", + "802b38b8": "ActionBulletBill1", + "802b394c": "ActionBulletBill2", + "802b3b08": "ActionBulletBill3", + "802b3b24": "ActionBulletBill4", + "802b3be0": "bhv_bullet_bill_loop", + "802b3c2c": "ActionBowserTailAnchor0", + "802b3cdc": "ActionBowserTailAnchor1", + "802b3d10": "ActionBowserTailAnchor2", + "802b3d74": "bhv_bowser_tail_anchor_loop", + "802b3df4": "bhv_bowser_flame_spawn_loop", + "802b4080": "bhv_bowser_body_anchor_loop", + "802b4184": "func_802B38B4", + "802b41fc": "func_802B392C", + "802b4288": "func_802B39B8", + "802b4300": "func_802B3A30", + "802b4368": "func_802B3A98", + "802b43dc": "func_802B3B0C", + "802b4478": "ActionBowser5", + "802b44bc": "ActionBowser6", + "802b45f4": "func_802B3D24", + "802b473c": "func_802B3E44", + "802b48d4": "func_802B3FDC", + "802b4a1c": "func_802B4124", + "802b4a3c": "func_802B4144", + "802b4af4": "func_u_802B4AF4", + "802b4bac": "ActionBowser18", + "802b4be8": "ActionBowser0", + "802b4ca4": "ActionBowser15", + "802b4d14": "ActionBowser14", + "802b4f00": "ActionBowser16", + "802b5104": "ActionBowser8", + "802b5218": "ActionBowser12", + "802b53f4": "func_802B4A44", + "802b5444": "func_802B4A94", + "802b5554": "func_802B4BA4", + "802b55cc": "ActionBowser13", + "802b5798": "ActionBowser17", + "802b58bc": "ActionBowser10", + "802b59cc": "ActionBowser9", + "802b5aec": "func_802B5108", + "802b5c00": "ActionBowser11", + "802b5c40": "ActionBowser7", + "802b5f6c": "func_802B5588", + "802b5fec": "ActionBowser1", + "802b611c": "func_802B5738", + "802b6190": "ActionBowser2", + "802b6568": "ActionBowser3", + "802b65d0": "func_802B5C78", + "802b6670": "func_802B5D18", + "802b6730": "func_802B5DD8", + "802b67d4": "func_802B5E7C", + "802b6878": "func_802B5F20", + "802b6a10": "func_802B60B8", + "802b6a78": "func_802B6120", + "802b6bac": "func_802B6254", + "802b6cf0": "ActionBowser4", + "802b6e40": "func_802B64E8", + "802b6ee0": "ActionBowser19", + "802b711c": "func_802B67C4", + "802b71e4": "func_802B688C", + "802b72d4": "func_802B697C", + "802b7418": "func_802B6AC0", + "802b75a4": "bhv_bowser_loop", + "802b7878": "bhv_bowser_init", + "802b798c": "Geo18_802B798C", + "802b7a20": "func_802B70C8", + "802b7c64": "geo_switch_bowser_eyes", + "802b7d44": "Geo18_802B7D44", + "802b7e68": "ActionFallingBowserPlatform0", + "802b7ef0": "ActionFallingBowserPlatform1", + "802b8024": "ActionFallingBowserPlatform2", + "802b8384": "bhv_falling_bowser_platform_loop", + "802b83b0": "func_802B7A58", + "802b8434": "func_802B7ADC", + "802b84ac": "bhv_flame_bowser_init", + "802b85b0": "bhv_flame_large_burning_out_init", + "802b8654": "func_802B7CFC", + "802b8734": "bhv_flame_bowser_loop", + "802b8960": "bhv_flame_moving_forward_growing_init", + "802b89ec": "bhv_flame_moving_forward_growing_loop", + "802b8b1c": "bhv_flame_floating_landing_init", + "802b8c38": "bhv_flame_floating_landing_loop", + "802b8d68": "bhv_blue_bowser_flame_init", + "802b8e7c": "bhv_blue_bowser_flame_loop", + "802b9034": "bhv_flame_bouncing_init", + "802b90ec": "bhv_flame_bouncing_loop", + "802b921c": "bhv_blue_flames_group_loop", + "802b935c": "bhv_blue_fish_loop", + "802b9790": "bhv_tank_fish_group_loop", + "802b98d4": "func_802B8F7C", + "802b98fc": "bhv_checkerboard_elevator_group_init", + "802b9a78": "func_802B9120", + "802b9af8": "func_802B91A0", + "802b9bb4": "bhv_checkerboard_platform_init", + "802b9bd8": "bhv_checkerboard_platform_loop", + "802b9e94": "bhv_ddd_warp_loop", + "802b9efc": "func_802B95A4", + "802ba13c": "func_802B97E4", + "802ba19c": "bhv_water_level_pillar_init", + "802ba1e0": "bhv_water_level_pillar_loop", + "802ba25c": "bhv_invisible_objects_under_bridge_init", + "802ba2b0": "Geo18_802BA2B0", + "802ba2f8": "bhv_bowser_key_unlock_door_loop", + "802ba458": "bhv_bowser_key_course_exit_loop", + "802ba5bc": "bhv_moat_grills_loop", + "802ba608": "bhv_rotating_clock_arm_loop", + "802ba7e0": "handle_hat_ukiki_reset", + "802ba868": "is_hat_ukiki_and_mario_has_hat", + "802ba8c4": "unused_Geo18_8029D890", + "802ba958": "idle_ukiki_taunt", + "802bab7c": "ukiki_act_idle", + "802bae40": "ukiki_act_return_home", + "802baec4": "ukiki_act_wait_to_respawn", + "802baf10": "ukiki_act_unused_turn", + "802baf64": "ukiki_act_turn_to_mario", + "802bb07c": "ukiki_act_run", + "802bb288": "ukiki_act_jump", + "802bb3b8": "ukiki_act_go_to_cage", + "802bb798": "ukiki_free_loop", + "802bb888": "cage_ukiki_held_loop", + "802bba3c": "hat_ukiki_held_loop", + "802bbb98": "bhv_ukiki_init", + "802bbc0c": "bhv_ukiki_loop", + "802bbd6c": "func_802BB414", + "802bbfd8": "func_802BB680", + "802bc0f0": "bhv_lll_moving_octagonal_mesh_platform_loop", + "802bc22c": "bhv_lll_sinking_rock_block_loop", + "802bc294": "bhv_lll_rotating_hex_flame_loop", + "802bc348": "func_802BB9F0", + "802bc4f4": "ActionRotatingCwFireBars0", + "802bc538": "ActionRotatingCwFireBars1", + "802bc590": "ActionRotatingCwFireBars2", + "802bc5fc": "ActionRotatingCwFireBars3", + "802bc618": "bhv_lll_rotating_block_fire_bars_loop", + "802bc660": "bhv_lll_wood_piece_loop", + "802bc728": "bhv_lll_floating_wood_bridge_loop", + "802bc898": "bhv_volcano_flames_loop", + "802bc934": "func_802BBFDC", + "802bca74": "bhv_lll_rotating_hexagonal_ring_loop", + "802bcce8": "func_802BC390", + "802bcda8": "bhv_lll_sinking_rectangular_platform_loop", + "802bce58": "bhv_lll_sinking_square_platforms_loop", + "802bce9c": "create_transform_from_normals", + "802bcf40": "bhv_platform_normals_init", + "802bcfc4": "approach_by_increment", + "802bd058": "bhv_tilting_inverted_pyramid_loop", + "802bd3e4": "func_802BCA8C", + "802bd488": "bhv_koopa_shell_flame_loop", + "802bd5dc": "bhv_koopa_shell_flame_spawn", + "802bd62c": "func_802BCCD4", + "802bd680": "bhv_koopa_shell_loop", + "802bd8d0": "func_802BCF78", + "802bd91c": "func_802BCFC4", + "802bdb04": "ActionToxBox4", + "802bdb3c": "ActionToxBox5", + "802bdb74": "ActionToxBox6", + "802bdbac": "ActionToxBox7", + "802bdbe4": "ActionToxBox1", + "802bdc7c": "ActionToxBox2", + "802bdcc8": "ActionToxBox3", + "802bdd14": "ActionToxBox0", + "802bdd68": "bhv_tox_box_loop", + "802bdd9c": "piranha_plant_act_idle", + "802bde10": "piranha_plant_check_interactions", + "802bdeec": "piranha_plant_act_sleeping", + "802be034": "piranha_plant_act_woken_up", + "802be0b8": "piranha_plant_reset_when_far", + "802be0ec": "piranha_plant_attacked", + "802be150": "piranha_plant_act_shrink_and_die", + "802be234": "piranha_plant_act_wait_to_respawn", + "802be278": "piranha_plant_act_respawn", + "802be350": "piranha_plant_act_biting", + "802be49c": "mario_moving_fast_enough_to_make_piranha_plant_bite", + "802be50c": "piranha_plant_act_stopped_biting", + "802be5a0": "bhv_piranha_plant_loop", + "802be628": "bhv_lll_bowser_puzzle_spawn_piece", + "802be6d4": "bhv_lll_bowser_puzzle_spawn_pieces", + "802be79c": "bhv_lll_bowser_puzzle_loop", + "802be8a8": "bhv_lll_bowser_puzzle_piece_action_0", + "802be8b8": "bhv_lll_bowser_puzzle_piece_action_1", + "802be8f4": "bhv_lll_bowser_puzzle_piece_update", + "802be9dc": "bhv_lll_bowser_puzzle_piece_move", + "802beb14": "bhv_lll_bowser_puzzle_piece_idle", + "802beb54": "bhv_lll_bowser_puzzle_piece_move_left", + "802beb8c": "bhv_lll_bowser_puzzle_piece_move_right", + "802bebc4": "bhv_lll_bowser_puzzle_piece_move_up", + "802bebfc": "bhv_lll_bowser_puzzle_piece_move_down", + "802bec34": "bhv_lll_bowser_puzzle_piece_loop", + "802becb0": "func_802BE2E8", + "802bed7c": "play_penguin_walking_sound", + "802bedec": "ActionTuxiesMother2", + "802bef8c": "ActionTuxiesMother1", + "802bf1d8": "ActionTuxiesMother0", + "802bf3c0": "bhv_tuxies_mother_loop", + "802bf424": "func_802BEA58", + "802bf474": "ActionSmallPenguin2", + "802bf57c": "ActionSmallPenguin1", + "802bf648": "ActionSmallPenguin3", + "802bf6e4": "ActionSmallPenguin4", + "802bf760": "ActionSmallPenguin0", + "802bf90c": "ActionSmallPenguin5", + "802bfa14": "func_802BF048", + "802bfa88": "bhv_small_penguin_loop", + "802bfbac": "geo_switch_tuxie_mother_eyes", + "802bfcd8": "ActionFish0", + "802bfeb8": "ActionFish1", + "802bff20": "ActionFish2", + "802bff3c": "bhv_fish_loop", + "802bff68": "func_802BF59C", + "802c00b4": "ActionFishGroup1", + "802c0348": "ActionFishGroup2", + "802c06a8": "ActionFishGroup0", + "802c0768": "bhv_fish_group_2_loop", + "802c08a8": "bhv_wdw_express_elevator_loop", + "802c0aac": "ActionBirdChirpChirp0", + "802c0b50": "ActionBirdChirpChirp1", + "802c0ba4": "ActionBirdChirpChirp2", + "802c0bc4": "ActionBirdChirpChirp3", + "802c0be0": "bhv_bird_chirp_chirp_loop", + "802c0c0c": "func_802C0240", + "802c0cd4": "ActionCheepCheep0", + "802c0d44": "ActionCheepCheep1", + "802c0f90": "ActionCheepCheep2", + "802c1204": "bhv_cheep_cheep_loop", + "802c12c0": "bhv_rotatin_exclamation_box_loop", + "802c1308": "ActionExclamationBox0", + "802c13ec": "ActionExclamationBox1", + "802c14b0": "ActionExclamationBox2", + "802c15b8": "ActionExclamationBox3", + "802c17bc": "func_802C0DF0", + "802c18d0": "ActionExclamationBox4", + "802c1988": "ActionExclamationBox5", + "802c19c0": "bhv_exclamation_box_loop", + "802c19fc": "bhv_sound_spawner_init", + "802c1a40": "bhv_bowsers_sub_loop", + "802c1a80": "bhv_sushi_shark_collision_loop", + "802c1a90": "bhv_sushi_shark_loop", + "802c1c44": "bhv_sunken_ship_part_loop", + "802c1cd4": "bhv_ship_part_3_loop", + "802c1e10": "bhv_jrb_sliding_box_loop", + "802c2190": "bhv_white_puff_1_loop", + "802c2274": "bhv_white_puff_2_loop", + "802c22b8": "bhv_hidden_blue_coin_loop", + "802c242c": "bhv_blue_coin_switch_loop", + "802c263c": "bhv_openable_cage_door_loop", + "802c26f8": "bhv_openable_grill_loop", + "802c2930": "bhv_init_changing_water_level_loop", + "802c2a24": "bhv_water_level_diamond_loop", + "802c2ce8": "func_802C231C", + "802c2ebc": "ActionTweester0", + "802c2fbc": "ActionTweester1", + "802c31c4": "ActionTweester2", + "802c329c": "bhv_tweester_loop", + "802c32e8": "bhv_tweester_sand_particle_loop", + "802c3440": "bhv_boo_init", + "802c3684": "bhv_courtyard_boo_triplet_init", + "802c4824": "bhv_boo_loop", + "802c4f30": "bhv_big_boo_loop", + "802c515c": "bhv_boo_with_cage_init", + "802c51d4": "bhv_boo_with_cage_loop", + "802c5224": "bhv_merry_go_round_boo_manager_loop", + "802c53cc": "obj_set_secondary_camera_focus", + "802c53ec": "bhv_animated_texture_loop", + "802c5414": "bhv_boo_in_castle_loop", + "802c5688": "bhv_boo_boss_spawned_bridge_loop", + "802c5890": "bhv_bbh_tilting_trap_platform_loop", + "802c5a38": "bhv_haunted_bookshelf_loop", + "802c5ca8": "bhv_merry_go_round_loop", + "802c5dc0": "bhv_static_checkered_platform_loop", + "802c5f48": "bhv_beta_bowser_anchor_loop", + "802c5fdc": "bhv_play_music_track_when_touched_loop", + "802c6050": "bhv_floor_trap_in_castle_loop", + "802c60ac": "bhv_castle_floor_trap_init", + "802c6150": "bhv_castle_floor_trap_open_detect", + "802c61d4": "bhv_castle_floor_trap_open", + "802c6278": "bhv_castle_floor_trap_close_detect", + "802c62bc": "bhv_castle_floor_trap_close", + "802c6328": "bhv_castle_floor_trap_rotate", + "802c6348": "bhv_castle_floor_trap_loop", + "802c63e8": "BehClimbDetectLoop", + "802c64a4": "bhv_sparkle_spawn_loop", + "802c6538": "func_802C5A64", + "802c65c0": "bhv_scuttlebug_loop", + "802c6b6c": "bhv_scuttlebug_spawn_loop", + "802c6ca0": "func_802C61CC", + "802c6d6c": "ActionWhomp0", + "802c6ec8": "ActionWhomp7", + "802c6fb0": "ActionWhomp1", + "802c710c": "ActionWhomp2", + "802c7254": "ActionWhomp3", + "802c72b4": "ActionWhomp4", + "802c7380": "ActionWhomp5", + "802c7428": "func_802C6954", + "802c75fc": "func_802C6B28", + "802c76d4": "ActionWhomp6", + "802c7858": "ActionWhomp8", + "802c7998": "ActionWhomp9", + "802c79d8": "bhv_whomp_loop", + "802c7a70": "bhv_water_splash_loop", + "802c7b14": "bhv_water_drops_loop", + "802c7cac": "bhv_surface_waves_loop", + "802c7d40": "bhv_water_surface_white_wave_init", + "802c7d90": "bhv_object_bubble_ripples_init", + "802c7dfc": "bhv_surface_wave_shrinking_init", + "802c7e5c": "bhv_wave_trail_loop", + "802c7f98": "bhv_white_wind_particle_loop", + "802c81b4": "func_802C76E0", + "802c834c": "bhv_snowman_wind_blowing_loop", + "802c85a4": "func_802C7AD0", + "802c863c": "bhv_walking_penguin_loop", + "802c89f0": "update_mario_platform", + "802c8b4c": "get_mario_pos", + "802c8b8c": "set_mario_pos", + "802c8bc8": "apply_platform_displacement", + "802c8ec0": "apply_mario_platform_displacement", + "802c8f28": "clear_mario_platform", + "802c8f40": "Unknown802C8460", + "802c8fe4": "func_802C8504", + "802c91ec": "func_802C870C", + "802c9388": "func_802C88A8", + "802c93f8": "func_802C8918", + "802c94ac": "func_802C89CC", + "802c95b4": "func_802C8AD4", + "802c9630": "func_802C8B50", + "802c9724": "detect_object_collisions", + "802c99b8": "init_free_object_list", + "802c9a3c": "clear_object_lists", + "802c9b68": "unload_object", + "802c9f04": "create_object", + "802ca028": "mark_obj_for_deletion", + "802ca040": "exec_anim_sound_state", + "802ca144": "create_sound_spawner", + "802ca190": "PlaySound", + "802ca1e0": "PlaySound2", + "802ca230": "calc_dist_to_volume_range_1", + "802ca2d4": "calc_dist_to_volume_range_2", + "802ca370": "Stub802C9890", + "802ca380": "Stub802C98A0", + "802ca390": "Stub802C98B0", + "802ca3a0": "Stub802C98C0", + "802ca3b0": "get_current_clock", + "802ca3e0": "get_clock_difference", + "802ca418": "set_print_state_info", + "802ca460": "print_text_array_info", + "802ca51c": "set_text_array_x_y", + "802ca568": "print_debug_bottom_up", + "802ca5b8": "print_debug_top_down_objectinfo", + "802ca618": "print_debug_top_down_mapinfo", + "802ca680": "print_debug_top_down_normal", + "802ca6d0": "print_mapinfo", + "802ca8e8": "print_checkinfo", + "802ca918": "print_surfaceinfo", + "802ca94c": "print_stageinfo", + "802ca990": "print_string_array_info", + "802caa6c": "print_effectinfo", + "802caaa8": "print_enemyinfo", + "802caae4": "update_debug_dpadmask", + "802cabac": "debug_unknown_level_select_check", + "802cac20": "reset_debug_objectinfo", + "802cb0b0": "stub_802CA5D0", + "802cb0c0": "try_print_debug_mario_object_info", + "802cb1c0": "try_print_debug_mario_level_info", + "802cb264": "try_do_mario_debug_object_spawn", + "802cb564": "Unknown802CAA84", + "802cb5c0": "set_and_reset_transition_fade_timer", + "802cb640": "set_transition_color_fade_alpha", + "802cb894": "vertex_transition_color", + "802cba18": "dl_transition_color", + "802cbbc4": "render_fade_transition_from_color", + "802cbc20": "render_fade_transition_into_color", + "802cbc7c": "calc_tex_transition_radius", + "802cbd54": "calc_tex_transition_time", + "802cbe64": "convert_tex_transition_angle_to_pos", + "802cbee0": "center_tex_transition_x", + "802cbf64": "center_tex_transition_y", + "802cbfe8": "make_tex_transition_vertex", + "802cc180": "load_tex_transition_vertex", + "802cc4d8": "render_textured_transition", + "802ccbe8": "render_screen_transition", + "802ccdc8": "render_cannon_circle_base", + "802cd1e8": "geo_cannon_circle_base", + "802cd280": "rotate_rectangle", + "802cd328": "atan2_deg", + "802cd388": "scale_shadow_with_distance", + "802cd444": "disable_shadow_with_distance", + "802cd48c": "dim_shadow_with_distance", + "802cd614": "get_water_level_below_shadow", + "802cd6c4": "init_shadow", + "802cd938": "get_texture_coords_9_vertices", + "802cd988": "get_texture_coords_4_vertices", + "802cd9ec": "make_shadow_vertex_at_xyz", + "802cdb20": "extrapolate_vertex_y_position", + "802cdb74": "get_vertex_coords", + "802cdc40": "calculate_vertex_xyz", + "802cde94": "floor_local_tilt", + "802cdf3c": "make_shadow_vertex", + "802ce128": "add_shadow_to_display_list", + "802ce2bc": "linearly_interpolate_solidity_positive", + "802ce3ec": "linearly_interpolate_solidity_negative", + "802ce524": "correct_shadow_solidity_for_animations", + "802ce690": "correct_lava_shadow_height", + "802ce79c": "create_shadow_player", + "802ce9d0": "create_shadow_circle_9_verts", + "802ceae8": "create_shadow_circle_4_verts", + "802cec04": "create_shadow_circle_assuming_flat_ground", + "802cedc0": "create_shadow_rectangle", + "802cef6c": "get_shadow_height_solidity", + "802cf080": "create_shadow_square", + "802cf1f0": "create_shadow_hardcoded_rectangle", + "802cf34c": "create_shadow_below_xyz", + "802cf5b0": "calculate_skybox_scaled_x", + "802cf69c": "calculate_skybox_scaled_y", + "802cf804": "make_skybox_rect", + "802cfa2c": "draw_skybox_tile_grid", + "802cfc68": "create_skybox_ortho_matrix", + "802cfd88": "init_skybox_display_list", + "802cfef4": "create_skybox_facing_camera", + "802d0080": "geo_wdw_set_initial_water_level", + "802d01e0": "geo_movtex_pause_control", + "802d0254": "movtex_make_quad_vertex", + "802d0484": "movtex_gen_from_quad", + "802d0a84": "movtex_gen_from_quad_array", + "802d0bb0": "movtex_gen_quads_id", + "802d0c84": "get_quad_collection_from_id", + "802d0f28": "movtex_change_texture_format", + "802d104c": "geo_movtex_draw_water_regions", + "802d1330": "update_moving_texture_offset", + "802d13cc": "movtex_write_vertex_first", + "802d1574": "movtex_write_vertex_index", + "802d18b4": "movtex_gen_list", + "802d1b70": "geo_movtex_draw_nocolor", + "802d1cdc": "geo_movtex_draw_colored", + "802d1e48": "geo_movtex_draw_colored_no_update", + "802d1fa8": "geo_movtex_draw_colored_2_no_update", + "802d2108": "geo_movtex_update_horizontal", + "802d2210": "make_vertex", + "802d22c4": "round_float", + "802d2360": "geo_exec_inside_castle_light", + "802d2470": "geo_exec_flying_carpet_timer_update", + "802d2520": "geo_exec_flying_carpet_create", + "802d28cc": "geo_exec_cake_end_screen", + "802d29c0": "stopAllRippleExcept", + "802d2a74": "find_mario_y_position_on_painting", + "802d2b08": "find_mario_z_position_on_painting", + "802d2b84": "painting_find_vertical_ripple_location", + "802d2c40": "find_part_of_painting_near_mario", + "802d2d80": "find_mario_x_position_on_painting", + "802d2dfc": "painting_find_horizontal_ripple_location", + "802d2eb8": "painting_set_ripple_type", + "802d2ffc": "vertical_proximity_ripple_painting_ripple", + "802d319c": "vertical_proximity_ripple_painting_ripple_if_mario_enters", + "802d327c": "vertical_continuous_ripple_painting_ripple", + "802d341c": "vertical_continuous_ripple_painting_ripple_if_mario_enters", + "802d34fc": "horizontal_proximity_ripple_painting_ripple", + "802d36ac": "horizontal_proximity_ripple_painting_ripple_if_mario_enters", + "802d379c": "horizontal_continuous_ripple_painting_ripple", + "802d393c": "horizontal_continuous_ripple_painting_ripple_if_mario_enters", + "802d3a2c": "painting_update_floors", + "802d3bec": "painting_update_ripple_status", + "802d3cec": "painting_calculate_point_ripple", + "802d3e6c": "painting_conditionally_calculate_point_ripple", + "802d3ee4": "Print1", + "802d404c": "Print2", + "802d43f8": "small_float_to_byte", + "802d44bc": "func_802D39DC", + "802d47d0": "func_802D3CF0", + "802d4edc": "func_802D43FC", + "802d50dc": "func_802D45FC", + "802d5354": "func_802D4874", + "802d556c": "display_painting_rippling", + "802d568c": "display_painting_not_rippling", + "802d5778": "reset_painting", + "802d57a8": "update_ddd_painting", + "802d58e4": "func_802D4E04", + "802d593c": "display_painting", + "802d59a8": "vertical_painting_ripple", + "802d5aa0": "horizontal_painting_ripple", + "802d5b98": "Geo18_802D5B98", + "802d5d0c": "Geo18_802D5D0C", + "802d5e00": "int_pow", + "802d5e54": "format_integer", + "802d6144": "parse_width_field", + "802d62d8": "print_text_fmt_int", + "802d6554": "print_text", + "802d66c0": "print_text_centered", + "802d6858": "char_to_glyph_index", + "802d69f8": "add_glyph_texture", + "802d6acc": "clip_to_bounds", + "802d6b3c": "render_textrect", + "802d6c88": "render_text_labels", + "802d6f20": "create_dl_identity_matrix", + "802d7070": "create_dl_translation_matrix", + "802d7174": "create_dl_rotation_matrix", + "802d7280": "create_dl_scale_matrix", + "802d7384": "create_dl_ortho_matrix", + "802d75dc": "render_generic_char", + "802d76c8": "render_multi_text_string", + "802d77dc": "print_generic_string", + "802d7b84": "print_hud_lut_string", + "802d7e88": "print_menu_generic_string", + "802d82d4": "print_credits_string", + "802d862c": "handle_menu_scrolling", + "802d8844": "get_str_x_pos_from_center", + "802d8934": "get_string_width", + "802d89b8": "print_hud_my_score_coins", + "802d8a80": "print_hud_my_score_stars", + "802d8b34": "int_to_str", + "802d8c6c": "get_dialog_id", + "802d8c88": "create_dialog_box", + "802d8cc4": "create_dialog_box_with_var", + "802d8d08": "create_dialog_inverted_box", + "802d8d48": "create_dialog_box_with_response", + "802d8d90": "reset_dialog_render_state", + "802d8e2c": "render_dialog_box_type", + "802d9148": "change_and_flash_dialog_text_color_lines", + "802d9388": "handle_dialog_scroll_page_state", + "802d944c": "render_star_count_dialog_text", + "802d9634": "render_multi_text_string_lines", + "802d9800": "ensure_nonnegative", + "802d982c": "handle_dialog_text_and_pages", + "802d9cb0": "render_dialog_triangle_choice", + "802d9dfc": "render_dialog_string_color", + "802d9f84": "handle_special_dialog_text", + "802da1ac": "render_dialog_entries", + "802da810": "set_menu_mode", + "802da844": "reset_cutscene_msg_fade", + "802da85c": "dl_rgba16_begin_cutscene_msg_fade", + "802da8e4": "dl_rgba16_stop_cutscene_msg_fade", + "802da964": "ascii_to_credits_char", + "802daa34": "print_credits_str_ascii", + "802daae4": "set_cutscene_message", + "802dab58": "do_cutscene_handler", + "802dad54": "print_peach_letter_message", + "802db08c": "render_hud_cannon_reticle", + "802db350": "reset_red_coins_collected", + "802db368": "change_dialog_camera_angle", + "802db3b8": "shade_screen", + "802db498": "print_animated_red_coin", + "802db6e8": "render_pause_red_coins", + "802db760": "render_pause_my_score_coins", + "802dbb24": "render_pause_camera_options", + "802dbe68": "render_pause_course_options", + "802dc15c": "render_pause_castle_menu_box", + "802dc418": "highlight_last_course_complete_stars", + "802dc478": "print_hud_pause_colorful_str", + "802dc570": "render_pause_castle_course_stars", + "802dc718": "render_pause_castle_main_strings", + "802dca88": "render_pause_courses_and_castle", + "802dcd04": "print_hud_course_complete_string", + "802dcf30": "print_hud_course_complete_coins", + "802dd194": "play_star_fanfare_and_flash_hud", + "802dd210": "render_course_complete_lvl_info_and_hud_str", + "802dd838": "render_save_confirmation", + "802ddae0": "render_course_complete_screen", + "802ddca4": "render_menus_and_dialogs", + "802dddf0": "envfx_init_snow", + "802ddf38": "envfx_update_snowflake_count", + "802de0bc": "envfx_cleanup_snow", + "802de114": "orbit_from_positions", + "802de23c": "pos_from_orbit", + "802de360": "envfx_is_snowflake_alive", + "802de458": "envfx_update_snow_normal", + "802de888": "envfx_update_snow_blizzard", + "802ded38": "envfx_update_snow_water", + "802def2c": "rotate_triangle_vertices", + "802df334": "append_snowflake_vertex_buffer", + "802df748": "envfx_update_snow", + "802dfbc8": "envfx_update_particles", + "802dfd50": "particle_is_laterally_close", + "802dfe00": "random_flower_offset", + "802dfe80": "envfx_update_flower", + "802e0120": "envfx_set_lava_bubble_position", + "802e048c": "envfx_update_lava", + "802e065c": "envfx_rotate_around_whirlpool", + "802e08a8": "envfx_is_whirlpool_bubble_alive", + "802e0934": "envfx_update_whirlpool", + "802e0e24": "envfx_is_jestream_bubble_alive", + "802e0eb8": "envfx_update_jetstream", + "802e1238": "envfx_init_bubble", + "802e1414": "envfx_bubbles_update_switch", + "802e1618": "append_bubble_vertex_buffer", + "802e1a20": "envfx_set_bubble_texture", + "802e1bb8": "envfx_update_bubble_particles", + "802e1ed8": "envfx_set_max_bubble_particles", + "802e1f48": "envfx_update_bubbles", + "802e20a0": "convert_rotation", + "802e2134": "spawn_macro_abs_yrot_2params", + "802e21dc": "spawn_macro_abs_yrot_param1", + "802e2284": "spawn_macro_abs_special", + "802e2414": "spawn_macro_objects", + "802e2690": "spawn_macro_objects_hardcoded", + "802e28ec": "spawn_special_objects", + "802e2cf0": "render_hud_tex_lut", + "802e2e58": "render_hud_small_tex_lut", + "802e30b4": "render_power_meter_health_segment", + "802e3214": "render_dl_power_meter", + "802e33b8": "animate_power_meter_emphasized", + "802e352c": "handle_power_meter_actions", + "802e3654": "render_hud_power_meter", + "802e3744": "render_hud_mario_lives", + "802e37a8": "render_hud_coins", + "802e380c": "render_hud_stars", + "802e38e4": "render_hud_keys", + "802e395c": "render_hud_timer", + "802e3b1c": "set_hud_camera_status", + "802e3b3c": "render_hud_camera_status", + "802e3d2c": "render_hud", + "802e3e50": "set_yoshi_as_not_dead", + "802e3e68": "geo_obj_transparency_something", + "802e3f68": "absf_2", + "802e3fac": "turn_obj_away_from_surface", + "802e405c": "obj_find_wall", + "802e41a4": "turn_obj_away_from_steep_floor", + "802e42e0": "obj_orient_graph", + "802e43e4": "calc_obj_friction", + "802e445c": "calc_new_obj_vel_and_pos_y", + "802e4814": "calc_new_obj_vel_and_pos_y_underwater", + "802e4cec": "obj_update_pos_vel_xz", + "802e4d88": "obj_splash", + "802e4e90": "object_step", + "802e5114": "object_step_without_floor_orient", + "802e5160": "obj_move_xyz_using_fvel_and_yaw", + "802e5208": "is_point_within_radius_of_mario", + "802e52b8": "is_point_close_to_object", + "802e5360": "set_object_visibility", + "802e53f4": "obj_return_home_if_safe", + "802e54b0": "obj_return_and_displace_home", + "802e55d0": "obj_check_if_facing_toward_angle", + "802e569c": "obj_find_wall_displacement", + "802e5760": "obj_spawn_yellow_coins", + "802e5824": "obj_flicker_and_disappear", + "802e58b4": "current_mario_room_check", + "802e5948": "trigger_obj_dialog_when_facing", + "802e5a80": "obj_check_floor_death", + "802e5b18": "obj_lava_death", + "802e5c6c": "spawn_orange_number", + "802e5d04": "debug_sequence_tracker", + "802e5de8": "CoinStep", + "802e5e6c": "MovingCoinFlickerLoop", + "802e5ea4": "CoinCollected", + "802e5ee8": "bhv_moving_yellow_coin_init", + "802e5f64": "bhv_moving_yellow_coin_loop", + "802e6098": "bhv_moving_blue_coin_init", + "802e6114": "bhv_moving_blue_coin_loop", + "802e62a4": "bhv_blue_coin_sliding_jumping_init", + "802e631c": "func_802E540C", + "802e63ec": "func_802E54DC", + "802e6474": "bhv_blue_coin_sliding_loop", + "802e6628": "bhv_blue_coin_jumping_loop", + "802e6790": "bhv_seaweed_init", + "802e67dc": "bhv_seaweed_bundle_init", + "802e6a2c": "bhv_bobomb_init", + "802e6a8c": "func_802E5B7C", + "802e6af8": "BobombExplodeLoop", + "802e6bd4": "CheckBobombInteractions", + "802e6cf0": "BobombPatrolLoop", + "802e6dc8": "BobombChaseMarioLoop", + "802e6e84": "BobombLaunchedLoop", + "802e6ed8": "GenericBobombFreeLoop", + "802e7020": "StationaryBobombFreeLoop", + "802e7134": "BobombFreeLoop", + "802e7180": "BobombHeldLoop", + "802e7220": "BobombDroppedLoop", + "802e7280": "BobombThrownLoop", + "802e7324": "ObjRandomBlink", + "802e742c": "bhv_bobomb_loop", + "802e75a0": "bhv_bobomb_fuse_smoke_init", + "802e76ac": "bhv_bobomb_buddy_init", + "802e770c": "BobombBuddyIdleLoop", + "802e7814": "BobombBuddyCannonLoop", + "802e79dc": "BobombBuddyTalkLoop", + "802e7b00": "BobombBuddyTurnToTalkLoop", + "802e7bb0": "BobombBuddyActionLoop", + "802e7c4c": "bhv_bobomb_buddy_loop", + "802e7c90": "bhv_cannon_closed_init", + "802e7d4c": "CannonTrapDoorOpeningLoop", + "802e7e54": "bhv_cannon_closed_loop", + "802e7f70": "bhv_whirlpool_init", + "802e7fb8": "func_802E70A8", + "802e7fec": "func_802E70DC", + "802e80dc": "bhv_whirlpool_loop", + "802e82b0": "bhv_jet_stream_loop", + "802e8388": "bhv_homing_amp_init", + "802e89d4": "bhv_homing_amp_loop", + "802e8ae4": "bhv_circling_amp_init", + "802e8ecc": "bhv_circling_amp_loop", + "802e8f68": "bhv_butterfly_init", + "802e9018": "ButterflyStep", + "802e9278": "CalculateButterflyAngle", + "802e9470": "ButterflyRestingLoop", + "802e94e4": "ButterflyFollowMarioLoop", + "802e9548": "ButterflyReturnHomeLoop", + "802e96c8": "bhv_butterfly_loop", + "802e9764": "bhv_hoot_init", + "802e97fc": "HootFindNextFloor", + "802e98c0": "HootFloorBounce", + "802e9a4c": "HootFreeStep", + "802e9cf4": "PlayerSetHootYaw", + "802e9d98": "HootCarryStep", + "802e9f60": "HootSurfaceCollision", + "802ea144": "HootAscentLoop", + "802ea258": "HootActionLoop", + "802ea3f0": "HootTurnToHome", + "802ea4ec": "HootAwakeLoop", + "802ea588": "bhv_hoot_loop", + "802ea6a8": "bhv_beta_holdable_object_init", + "802ea7e0": "bhv_beta_holdable_object_loop", + "802ea888": "bhv_object_bubble_init", + "802ea934": "bhv_object_bubble_loop", + "802eaa10": "bhv_object_water_wave_init", + "802eaa50": "bhv_object_water_wave_loop", + "802eaa8c": "bhv_explosion_init", + "802eaad0": "bhv_explosion_loop", + "802eabf0": "bhv_bobomb_bully_death_smoke_init", + "802eac3c": "bhv_bobomb_explosion_bubble_init", + "802ead3c": "bhv_bobomb_explosion_bubble_loop", + "802eaef8": "bhv_respawner_loop", + "802eaf84": "create_respawner", + "802eb05c": "bhv_small_bully_init", + "802eb104": "bhv_big_bully_init", + "802eb1c0": "BullyCheckMarioCollision", + "802eb288": "BullyChaseMarioLoop", + "802eb3f0": "BullyKnockbackLoop", + "802eb510": "BullyBackUpLoop", + "802eb5c4": "BullyBackUpCheck", + "802eb630": "PlayBullyStompingSound", + "802eb744": "BullyStep", + "802eb7e0": "BullySpawnCoin", + "802eb8b0": "BullyLavaDeath", + "802eb9d0": "bhv_bully_loop", + "802ebb74": "BigBullySpawnMinion", + "802ebc00": "bhv_big_bully_with_minions_init", + "802ebc88": "BigBullyWithMinionsLavaDeath", + "802ebce0": "bhv_big_bully_with_minions_loop", + "802ebf70": "WaterRingCalcMarioDistInFront", + "802ec030": "WaterRingInit", + "802ec1b0": "bhv_jet_stream_water_ring_init", + "802ec200": "CheckWaterRingCollection", + "802ec3d0": "SetWaterRingScale", + "802ec4e0": "WaterRingCollectedLoop", + "802ec59c": "JetStreamWaterRingNotCollectedLoop", + "802ec75c": "bhv_jet_stream_water_ring_loop", + "802ec7cc": "Unknown802EB8A4", + "802ec818": "JetStreamRingSpawnerActiveLoop", + "802ec908": "bhv_jet_stream_ring_spawner_loop", + "802ec9b8": "bhv_manta_ray_water_ring_init", + "802ec9f0": "MantaRayWaterRingNotCollectedLoop", + "802ecba4": "bhv_manta_ray_water_ring_loop", + "802ecc14": "bhv_bowser_bomb_loop", + "802ecd0c": "bhv_bowser_bomb_explosion_loop", + "802ecea0": "bhv_bowser_bomb_smoke_loop", + "802ecfac": "bhv_celebration_star_init", + "802ed10c": "CelebrationStarSpinAroundMarioLoop", + "802ed28c": "CelebrationStarFaceCameraLoop", + "802ed39c": "bhv_celebration_star_loop", + "802ed40c": "bhv_celebration_star_sparkle_loop", + "802ed45c": "bhv_star_key_collection_puff_spawner_loop", + "802ed498": "bhv_lll_drawbridge_spawner_loop", + "802ed62c": "bhv_lll_drawbridge_loop", + "802ed78c": "bhv_small_bomp_init", + "802ed7fc": "bhv_small_bomp_loop", + "802edacc": "bhv_large_bomp_init", + "802edb2c": "bhv_large_bomp_loop", + "802eddfc": "bhv_wf_sliding_platform_init", + "802edf28": "bhv_wf_sliding_platform_loop", + "802ee124": "bhv_moneybag_init", + "802ee1a0": "MoneybagCheckMarioCollision", + "802ee268": "MoneybagJump", + "802ee46c": "MoneybagMoveAroundLoop", + "802ee598": "MoneybagReturnHomeLoop", + "802ee728": "MoneybagDisappearLoop", + "802ee778": "MoneybagDeathLoop", + "802ee7e0": "bhv_moneybag_loop", + "802ee8f4": "bhv_moneybag_hidden_loop", + "802ee9cc": "bhv_bowling_ball_init", + "802eea24": "func_802EDA14", + "802eea7c": "func_802EDA6C", + "802eeb64": "bhv_bowling_ball_roll_loop", + "802eecb8": "bhv_bowling_ball_initializeLoop", + "802eedf0": "bhv_bowling_ball_loop", + "802eeeb4": "bhv_generic_bowling_ball_spawner_init", + "802eef9c": "bhv_generic_bowling_ball_spawner_loop", + "802ef0e8": "bhv_thi_bowling_ball_spawner_loop", + "802ef21c": "bhv_bob_pit_bowling_ball_init", + "802ef274": "bhv_bob_pit_bowling_ball_loop", + "802ef34c": "bhv_free_bowling_ball_init", + "802ef3f4": "bhv_free_bowling_ball_roll_loop", + "802ef524": "bhv_free_bowling_ball_loop", + "802ef63c": "bhv_rr_cruiser_wing_init", + "802ef66c": "bhv_rr_cruiser_wing_loop", + "802ef820": "bhv_spindel_init", + "802ef858": "bhv_spindel_loop", + "802efcd0": "bhv_ssl_moving_pyramid_wall_init", + "802efd8c": "bhv_ssl_moving_pyramid_wall_loop", + "802efe64": "bhv_pyramid_elevator_init", + "802efef4": "bhv_pyramid_elevator_loop", + "802f0104": "bhv_pyramid_elevator_trajectory_marker_ball_loop", + "802f0168": "bhv_pyramid_top_init", + "802f0288": "bhv_pyramid_top_spinning", + "802f04a0": "bhv_pyramid_top_explode", + "802f05b4": "bhv_pyramid_top_loop", + "802f06a8": "bhv_pyramid_top_fragment_init", + "802f0714": "bhv_pyramid_top_fragment_loop", + "802f0788": "bhv_pyramid_pillar_touch_detector_loop", + "802f07f4": "bhv_waterfall_sound_loop", + "802f0820": "bhv_volcano_sound_loop", + "802f084c": "bhv_castle_flag_init", + "802f0898": "bhv_birds_sound_loop", + "802f0950": "bhv_ambient_sounds_init", + "802f09a4": "bhv_sand_sound_loop", + "802f09f0": "bhv_castle_cannon_grate_init", + "802f0a40": "bhv_snowmans_bottom_init", + "802f0b7c": "func_802EFB2C", + "802f0bd4": "func_802EFB84", + "802f0c94": "func_802EFC44", + "802f0df0": "func_802EFDA0", + "802f0fa8": "func_802EFF58", + "802f105c": "bhv_snowmans_bottom_loop", + "802f120c": "bhv_snowmans_head_init", + "802f1370": "bhv_snowmans_head_loop", + "802f151c": "bhv_snowmans_body_checkpoint_loop", + "802f15a8": "bhv_big_boulder_init", + "802f162c": "func_802F05DC", + "802f1714": "bhv_big_boulder_loop", + "802f17f0": "bhv_big_boulder_generator_loop", + "802f1954": "func_802F0904", + "802f19c8": "func_802F0978", + "802f1a10": "func_802F09C0", + "802f1bb8": "func_802F0B68", + "802f1d64": "bhv_wing_cap_init", + "802f1dc0": "func_802F0D70", + "802f1e5c": "func_802F0E0C", + "802f1f3c": "bhv_wing_vanish_cap_loop", + "802f1fd0": "bhv_metal_cap_init", + "802f2030": "func_802F0FE0", + "802f20ac": "bhv_metal_cap_loop", + "802f2140": "bhv_normal_cap_init", + "802f21e0": "func_802F1190", + "802f2284": "func_802F1234", + "802f23a8": "bhv_normal_cap_loop", + "802f2498": "bhv_vanish_cap_init", + "802f24f4": "bhv_collect_star_init", + "802f25b0": "bhv_collect_star_loop", + "802f2614": "bhv_star_spawn_init", + "802f2768": "bhv_star_spawn_loop", + "802f2aa0": "func_802F1A50", + "802f2b88": "create_star", + "802f2bd4": "func_802F1B84", + "802f2c24": "func_802F1BD4", + "802f2c84": "bhv_hidden_red_coin_star_init", + "802f2d8c": "bhv_hidden_red_coin_star_loop", + "802f2e6c": "bhv_red_coin_init", + "802f2f2c": "bhv_red_coin_loop", + "802f3014": "bhv_hidden_star_init", + "802f30f0": "bhv_hidden_star_loop", + "802f31bc": "bhv_hidden_star_trigger_loop", + "802f328c": "bhv_bowser_course_red_coin_star_loop", + "802f336c": "bhv_ttm_rolling_log_init", + "802f341c": "func_802F238C", + "802f36a4": "bhv_rolling_log_loop", + "802f38b0": "func_802F2820", + "802f39b4": "func_802F2924", + "802f3a30": "bhvLllVolcanoFallingTrap_loop", + "802f3b98": "bhv_lll_rolling_log_init", + "802f3c54": "bhv_1up_interact", + "802f3cc8": "bhv_1up_common_init", + "802f3d30": "bhv_1up_init", + "802f3dd0": "func_802F2D40", + "802f3ea8": "func_802F2E18", + "802f401c": "func_802F2F8C", + "802f40cc": "bhv_1up_walking_loop", + "802f4248": "bhv_1up_running_away_loop", + "802f43b8": "func_802F3328", + "802f44c0": "bhv_1up_sliding_loop", + "802f45b8": "bhv_1up_loop", + "802f45f0": "bhv_1up_jump_on_approach_loop", + "802f4710": "bhv_1up_hidden_loop", + "802f48f4": "bhv_1up_hidden_trigger_loop", + "802f496c": "bhv_1up_hidden_in_pole_loop", + "802f4b00": "bhv_1up_hidden_in_pole_trigger_loop", + "802f4b78": "bhv_1up_hidden_in_pole_spawner_loop", + "802f4c68": "func_802F3BD8", + "802f4ce0": "func_802F3C50", + "802f4d78": "bhv_controllable_platform_sub_loop", + "802f4eb4": "bhv_controllable_platform_init", + "802f5010": "func_802F3F80", + "802f5068": "func_802F3FD8", + "802f52c0": "func_802F4230", + "802f547c": "func_802F43EC", + "802f55a4": "bhv_controllable_platform_loop", + "802f5cd4": "bhv_breakable_box_small_init", + "802f5d78": "func_802F4CE8", + "802f5e44": "func_802F4DB4", + "802f5f48": "breakable_box_small_released_loop", + "802f6014": "breakable_box_small_idle_loop", + "802f60d8": "breakable_box_small_get_dropped", + "802f6150": "breakable_box_small_get_thrown", + "802f6228": "bhv_breakable_box_small_loop", + "802f62e4": "bhv_sliding_snow_mound_loop", + "802f6448": "bhv_snow_mound_spawn_loop", + "802f6588": "func_802F54F8", + "802f665c": "func_802F55CC", + "802f6984": "bhv_floating_platform_loop", + "802f6c0c": "bhv_arrow_lift_loop", + "802f6d20": "bhv_orange_number_init", + "802f6d58": "bhv_orange_number_loop", + "802f6e40": "bhv_manta_ray_init", + "802f6eb0": "func_802F5E20", + "802f7068": "func_802F5FD8", + "802f7264": "bhv_manta_ray_loop", + "802f7348": "bhv_falling_pillar_init", + "802f7398": "bhv_falling_pillar_spawn_hitboxes", + "802f7418": "bhv_falling_pillar_calculate_angle_in_front_of_mario", + "802f74dc": "bhv_falling_pillar_loop", + "802f7760": "bhv_falling_pillar_hitbox_loop", + "802f7924": "bhv_jrb_floating_box_loop", + "802f7978": "bhv_decorative_pendulum_init", + "802f79b0": "bhv_decorative_pendulum_loop", + "802f7a58": "bhv_treasure_chest_top_loop", + "802f7c9c": "bhv_treasure_chest_bottom_init", + "802f7d04": "bhv_treasure_chest_bottom_loop", + "802f7f1c": "func_802F6E8C", + "802f7fa0": "bhv_treasure_chest_ship_init", + "802f8044": "bhv_treasure_chest_ship_loop", + "802f8158": "bhv_treasure_chest_jrb_init", + "802f8208": "bhv_treasure_chest_jrb_loop", + "802f82f8": "bhv_treasure_chest_init", + "802f83a4": "bhv_treasure_chest_loop", + "802f8490": "bhv_mips_init", + "802f85e0": "bhv_mips_find_furthest_waypoint_to_mario", + "802f8760": "bhv_mips_act_wait_for_nearby_mario", + "802f8808": "bhv_mips_act_follow_path", + "802f893c": "bhv_mips_act_wait_for_animation_done", + "802f8988": "bhv_mips_act_fall_down", + "802f8a34": "bhv_mips_act_idle", + "802f8ab4": "bhv_mips_free", + "802f8b54": "bhv_mips_held", + "802f8c74": "bhv_mips_dropped", + "802f8cf8": "bhv_mips_thrown", + "802f8dac": "bhv_mips_loop", + "802f8e54": "bhv_yoshi_init", + "802f8f08": "yoshi_walk_loop", + "802f9054": "yoshi_idle_loop", + "802f923c": "yoshi_talk_loop", + "802f93a8": "yoshi_walk_and_jump_off_roof_loop", + "802f9500": "yoshi_finish_jumping_and_despawn_loop", + "802f95ac": "yoshi_give_present_loop", + "802f965c": "BehYoshiLoop", + "802fbc4c": "bhv_koopa_init", + "802fc414": "shelled_koopa_attack_handler", + "802fcc00": "obj_begin_race", + "802fd7f8": "bhv_koopa_update", + "802fd950": "bhv_koopa_race_endpoint_update", + "802fda28": "bhv_pokey_body_part_update", + "802fe3b0": "bhv_pokey_update", + "802fe8b4": "bhv_swoop_update", + "802ff040": "bhv_fly_guy_update", + "802ff214": "bhv_goomba_triplet_spawner_update", + "802ff408": "bhv_goomba_init", + "802ff94c": "huge_goomba_weakly_attacked", + "802ff96c": "bhv_goomba_update", + "802ffb38": "bhv_chain_chomp_chain_part_update", + "80300e40": "bhv_chain_chomp_update", + "80300ecc": "bhv_wooden_post_update", + "80301148": "bhv_chain_chomp_gate_init", + "80301180": "bhv_chain_chomp_gate_update", + "80301210": "bhv_wiggler_body_part_update", + "803020e4": "wiggler_jumped_on_attack_handler", + "80302154": "bhv_wiggler_update", + "80302910": "bhv_spiny_update", + "80303028": "bhv_enemy_lakitu_update", + "8030369c": "bhv_cloud_update", + "80303744": "bhv_cloud_part_update", + "80303984": "bhv_camera_lakitu_init", + "80303f64": "bhv_camera_lakitu_update", + "803043f8": "bhv_monty_mole_hole_update", + "803044c0": "bhv_monty_mole_init", + "80304ba8": "bhv_monty_mole_update", + "80304fd4": "bhv_monty_mole_rock_update", + "80305100": "bhv_platform_on_track_init", + "80305a58": "bhv_platform_on_track_update", + "80305bb0": "bhv_track_ball_update", + "80305c14": "bhv_seesaw_platform_init", + "80305c90": "bhv_seesaw_platform_update", + "80305e2c": "bhv_ferris_wheel_axle_init", + "80305f24": "bhv_ferris_wheel_platform_update", + "80306084": "bhv_water_bomb_spawner_update", + "803067e8": "bhv_water_bomb_update", + "803068c0": "bhv_water_bomb_shadow_update", + "8030699c": "bhv_ttc_rotating_solid_init", + "80306a38": "bhv_ttc_rotating_solid_update", + "80306cc4": "bhv_ttc_pendulum_init", + "80306d38": "bhv_ttc_pendulum_update", + "80306f48": "bhv_ttc_treadmill_init", + "80307010": "bhv_ttc_treadmill_update", + "803071b8": "bhv_ttc_moving_bar_init", + "80307670": "bhv_ttc_moving_bar_update", + "80307760": "bhv_ttc_cog_init", + "803077e0": "bhv_ttc_cog_update", + "80307930": "bhv_ttc_pit_block_init", + "803079c8": "bhv_ttc_pit_block_update", + "80307ae4": "bhv_ttc_elevator_init", + "80307b58": "bhv_ttc_elevator_update", + "80307c88": "bhv_ttc_2d_rotator_init", + "80307cf8": "bhv_ttc_2d_rotator_update", + "80307ea4": "bhv_ttc_spinner_update", + "8030803c": "bhv_mr_blizzard_init", + "80308d6c": "bhv_mr_blizzard_update", + "80309154": "bhv_mr_blizzard_snowball", + "803091e0": "bhv_sliding_plat_2_init", + "80309354": "bhv_sliding_plat_2_loop", + "80309454": "bhv_rotating_octagonal_plat_init", + "803094d0": "bhv_rotating_octagonal_plat_loop", + "803094f8": "bhv_animates_on_floor_switch_press_init", + "80309530": "bhv_animates_on_floor_switch_press_loop", + "803097a4": "bhv_activated_back_and_forth_platform_init", + "803098c0": "bhv_activated_back_and_forth_platform_update", + "80309b64": "bhv_recovery_heart_loop", + "80309cec": "bhv_bubble_cannon_barrel_loop", + "80309ed4": "water_bomb_cannon_act_0", + "80309f68": "water_bomb_cannon_act_1", + "8030a0e8": "water_bomb_cannon_act_2", + "8030a11c": "bhv_water_bomb_cannon_loop", + "8030a1c0": "bhv_unagi_init", + "8030a2a8": "unagi_act_0", + "8030a390": "unagi_act_1_4", + "8030a514": "unagi_act_2", + "8030a614": "unagi_act_3", + "8030a93c": "bhv_unagi_loop", + "8030aabc": "bhv_unagi_subobject_loop", + "8030b2f4": "bhv_dorrie_update", + "8030b658": "bhv_haunted_chair_init", + "8030b6d8": "haunted_chair_act_0", + "8030ba68": "haunted_chair_act_1", + "8030bc90": "bhv_haunted_chair_loop", + "8030bfd0": "bhv_mad_piano_update", + "8030c06c": "flying_bookend_act_0", + "8030c0f0": "flying_bookend_act_1", + "8030c210": "flying_bookend_act_2", + "8030c2c8": "flying_bookend_act_3", + "8030c364": "bhv_flying_bookend_loop", + "8030c4b0": "bhv_bookend_spawn_loop", + "8030c564": "bookshelf_manager_act_0", + "8030c60c": "bookshelf_manager_act_1", + "8030c6a4": "bookshelf_manager_act_2", + "8030c828": "bookshelf_manager_act_3", + "8030c894": "bookshelf_manager_act_4", + "8030c8ec": "bhv_haunted_bookshelf_manager_loop", + "8030c98c": "bhv_book_switch_loop", + "8030cd30": "obj_spit_fire", + "8030cddc": "bhv_fire_piranha_plant_init", + "8030d2f0": "bhv_fire_piranha_plant_update", + "8030d598": "bhv_fire_spitter_update", + "8030d640": "bhv_small_piranha_flame_loop", + "8030d8d4": "bhv_fly_guy_flame_loop", + "8030d93c": "Geo18_8030D93C", + "8030d9ac": "Geo18_8030D9AC", + "8030da14": "snufit_act_0", + "8030db38": "snufit_act_1", + "8030dc70": "bhv_snufit_loop", + "8030dfc4": "bhv_snufit_balls_loop", + "8030e14c": "bhv_horizontal_grindel_init", + "8030e16c": "bhv_horizontal_grindel_update", + "8030ea9c": "bhv_eyerok_boss_loop", + "8030fff8": "bhv_eyerok_hand_loop", + "80310498": "bhv_klepto_init", + "8031126c": "obj_set_speed_to_zero", + "8031129c": "bhv_klepto_update", + "80311874": "bhv_bird_update", + "803118e4": "bhv_racing_penguin_init", + "80312070": "bhv_racing_penguin_update", + "80312168": "bhv_penguin_race_finish_line_update", + "80312200": "bhv_penguin_race_shortcut_check_update", + "80312248": "bhv_coffin_manager_loop", + "80312370": "coffin_act_0", + "8031262c": "coffin_act_1", + "8031274c": "bhv_coffin_loop", + "80312804": "clam_act_0", + "80312900": "clam_act_1", + "80312a54": "bhv_clam_loop", + "80313110": "bhv_skeeter_update", + "803131e8": "bhv_skeeter_wave_update", + "8031326c": "bhv_swing_platform_init", + "80313294": "bhv_swing_platform_update", + "80313354": "bhv_donut_platform_spawner_update", + "80313530": "bhv_donut_platform_update", + "803136cc": "bhv_ddd_pole_init", + "80313754": "bhv_ddd_pole_update", + "803137f4": "bhv_red_coin_star_marker_init", + "80313fc0": "bhv_triplet_butterfly_update", + "80314098": "bubba_act_0", + "8031427c": "bubba_act_1", + "803145d4": "bhv_bubba_loop", + "80314a30": "prepare_reverb_ring_buffer", + "80314cc0": "get_volume_ramping", + "80314de4": "synthesis_execute", + "80314f64": "synthesis_do_one_audio_update", + "80315590": "synthesis_process_notes", + "80316010": "load_wave_samples", + "803160dc": "final_resample", + "80316138": "process_envelope", + "8031619c": "process_envelope_inner", + "803166fc": "note_apply_headset_pan_effects", + "80316ac8": "note_init_volume", + "80316af4": "note_set_vel_pan_reverb", + "80316da8": "note_set_frequency", + "80316db4": "note_enable", + "80316e00": "note_disable", + "80316e80": "reset_bank_and_seq_load_status", + "80316ec4": "discard_bank", + "80316fb4": "discard_sequence", + "80317040": "soundAlloc", + "803170b4": "sound_alloc_pool_init", + "803170d4": "persistent_pool_clear", + "803170e8": "temporary_pool_clear", + "80317118": "unused_803160F8", + "80317128": "sound_init_main_pools", + "80317184": "session_pools_init", + "80317200": "seq_and_bank_pool_init", + "8031727c": "persistent_pools_init", + "80317338": "temporary_pools_init", + "803173fc": "alloc_bank_or_seq", + "8031782c": "get_bank_or_seq", + "803178ec": "decrease_reverb_gain", + "80317914": "wait_for_audio_frames", + "80317948": "audio_reset_session", + "80318040": "audio_dma_copy_immediate", + "803180c4": "audio_dma_copy_async", + "80318130": "audio_dma_partial_copy_async", + "803181ec": "decrease_sample_dma_ttls", + "80318300": "dma_sample_data", + "80318634": "init_sample_dma_buffers", + "803188f4": "patch_audio_bank", + "80318b30": "bank_load_immediate", + "80318c8c": "bank_load_async", + "80318dc4": "sequence_dma_immediate", + "80318e70": "sequence_dma_async", + "80318fac": "get_missing_bank", + "803190f4": "load_banks_immediate", + "80319220": "preload_sequence", + "80319328": "load_sequence", + "80319388": "load_sequence_internal", + "8031950c": "audio_init", + "80319920": "note_init", + "80319998": "note_disable2", + "803199b8": "process_notes", + "80319db8": "seq_channel_layer_decay_release_internal", + "80319f64": "seq_channel_layer_note_decay", + "80319f84": "seq_channel_layer_note_release", + "80319fa4": "build_synthetic_wave", + "8031a1d0": "init_synthetic_wave", + "8031a254": "init_note_list", + "8031a264": "init_note_lists", + "8031a2b4": "init_note_free_list", + "8031a368": "note_pool_clear", + "8031a494": "note_pool_fill", + "8031a5d0": "audio_list_push_front", + "8031a610": "audio_list_remove", + "8031a63c": "pop_node_with_value_less_equal", + "8031a6cc": "note_init_for_layer", + "8031a794": "func_80319728", + "8031a7c8": "note_release_and_take_ownership", + "8031a820": "alloc_note_from_disabled", + "8031a89c": "alloc_note_from_decaying", + "8031a8f0": "alloc_note_from_active", + "8031a94c": "alloc_note", + "8031ac34": "reclaim_notes", + "8031adac": "note_init_all", + "8031aee0": "func_80319E70", + "8031aee8": "sequence_player_process_sound", + "8031b0cc": "get_portamento_freq_scale", + "8031b1c0": "get_vibrato_pitch_change", + "8031b248": "get_vibrato_freq_scale", + "8031b440": "note_vibrato_update", + "8031b4a0": "note_vibrato_init", + "8031b58c": "adsr_init", + "8031b5ac": "adsr_update", + "8031b830": "sequence_channel_init", + "8031b940": "seq_channel_set_layer", + "8031ba30": "seq_channel_layer_disable", + "8031ba6c": "seq_channel_layer_free", + "8031baf0": "sequence_channel_disable", + "8031bb5c": "allocate_sequence_channel", + "8031bba4": "sequence_player_init_channels", + "8031bcd0": "sequence_player_disable_channels", + "8031bda0": "sequence_channel_enable", + "8031be44": "sequence_player_disable", + "8031bf14": "audio_list_push_back", + "8031bf54": "audio_list_pop_back", + "8031bf94": "init_layer_freelist", + "8031c03c": "m64_read_u8", + "8031c050": "m64_read_s16", + "8031c080": "m64_read_compressed_u16", + "8031c0c4": "seq_channel_layer_process_script", + "8031c200": "L_U_8031C200", + "8031c23c": "L_U_8031C23C", + "8031c298": "L_U_8031C298", + "8031c2dc": "L_U_8031C2DC", + "8031c328": "L_U_8031C328", + "8031c36c": "L_U_8031C36C", + "8031c3bc": "L_U_8031C3BC", + "8031c3e8": "L_U_8031C3E8", + "8031c454": "L_U_8031C454", + "8031c4a4": "L_U_8031C4A4", + "8031c5c8": "L_U_8031C5C8", + "8031c698": "L_U_8031C698", + "8031c6a0": "L_U_8031C6A0", + "8031cbe0": "L_U_8031CBE0", + "8031cbec": "L_U_8031CBEC", + "8031ce54": "get_instrument", + "8031cfd4": "set_instrument", + "8031d068": "sequence_channel_set_volume", + "8031d08c": "sequence_channel_process_script", + "8031d144": "L_U_8031D144", + "8031d1f8": "L_U_8031D1F8", + "8031d234": "L_U_8031D234", + "8031d26c": "L_U_8031D26C", + "8031d2b4": "L_U_8031D2B4", + "8031d2c4": "L_U_8031D2C4", + "8031d31c": "L_U_8031D31C", + "8031d344": "L_U_8031D344", + "8031d354": "L_U_8031D354", + "8031d370": "L_U_8031D370", + "8031d3a8": "L_U_8031D3A8", + "8031d3c4": "L_U_8031D3C4", + "8031d3d4": "L_U_8031D3D4", + "8031d3e4": "L_U_8031D3E4", + "8031d400": "L_U_8031D400", + "8031d424": "L_U_8031D424", + "8031d44c": "L_U_8031D44C", + "8031d474": "L_U_8031D474", + "8031d498": "L_U_8031D498", + "8031d4bc": "L_U_8031D4BC", + "8031d4d4": "L_U_8031D4D4", + "8031d4f0": "L_U_8031D4F0", + "8031d500": "L_U_8031D500", + "8031d51c": "L_U_8031D51C", + "8031d538": "L_U_8031D538", + "8031d56c": "L_U_8031D56C", + "8031d5a0": "L_U_8031D5A0", + "8031d5b4": "L_U_8031D5B4", + "8031d5d4": "L_U_8031D5D4", + "8031d5e4": "L_U_8031D5E4", + "8031d640": "L_U_8031D640", + "8031d678": "L_U_8031D678", + "8031d6c4": "L_U_8031D6C4", + "8031d6d4": "L_U_8031D6D4", + "8031d6f4": "L_U_8031D6F4", + "8031d718": "L_U_8031D718", + "8031d728": "L_U_8031D728", + "8031d73c": "L_U_8031D73C", + "8031d7b8": "L_U_8031D7B8", + "8031d7e8": "L_U_8031D7E8", + "8031d7f8": "L_U_8031D7F8", + "8031d814": "L_U_8031D814", + "8031d830": "L_U_8031D830", + "8031d87c": "L_U_8031D87C", + "8031d898": "L_U_8031D898", + "8031d8f8": "L_U_8031D8F8", + "8031d900": "L_U_8031D900", + "8031d930": "L_U_8031D930", + "8031d94c": "L_U_8031D94C", + "8031d974": "L_U_8031D974", + "8031d9ec": "sequence_player_process_sequence", + "8031e240": "process_sequences", + "8031e2e8": "init_sequence_player", + "8031e374": "init_sequence_players", + "8031e4f0": "unused_8031E4F0", + "8031e568": "unused_8031E568", + "8031e7b8": "create_next_audio_frame_task", + "8031eb00": "play_sound", + "8031fd84": "audio_signal_game_loop_tick", + "8031fdac": "update_game_sound", + "80320544": "play_sequence", + "80320678": "sequence_player_fade_out", + "803206bc": "fade_volume_scale", + "80320734": "fade_channel_volume_scale", + "8032080c": "func_8031F96C", + "803208ec": "process_level_music_dynamics", + "80320a4c": "L8031FBAC", + "80320a8c": "L8031FBEC", + "80320acc": "L8031FC2C", + "80320b0c": "L8031FC6C", + "80320b4c": "L8031FCAC", + "80320b8c": "L8031FCEC", + "80320bcc": "L8031FD2C", + "80320bf4": "L8031FD54", + "80320d70": "unused_8031FED0", + "80320e3c": "func_8031FFB4", + "80320ec4": "sequence_player_unlower", + "80320f68": "func_803200E4", + "803210d4": "set_sound_disabled", + "8032112c": "sound_init", + "80321398": "get_currently_playing_sound", + "80321474": "func_803205E8", + "80321584": "func_803206F8", + "8032171c": "func_80320890", + "8032174c": "sound_banks_disable", + "8032180c": "sound_banks_enable", + "80321864": "unused_803209D8", + "803218d8": "func_80320A4C", + "803218f4": "play_dialog_sound", + "803219ac": "play_music", + "80321bac": "stop_background_music", + "80321ce4": "fadeout_background_music", + "80321d38": "drop_queued_background_music", + "80321d5c": "get_current_background_music", + "80321d9c": "func_80320ED8", + "80321e48": "play_secondary_music", + "80321f48": "func_80321080", + "80321f9c": "func_803210D4", + "80322078": "play_course_clear", + "803220b4": "play_peachs_jingle", + "803220f0": "play_puzzle_jingle", + "8032212c": "play_star_fanfare", + "80322168": "play_power_star_jingle", + "803221b8": "play_race_fanfare", + "803221f4": "play_toads_jingle", + "80322230": "sound_reset", + "8032231c": "audio_set_sound_mode", + "80322348": "unused_80321460", + "8032235c": "unused_80321474", + "803223b0": ".", + "803223b0": "osSetTime", + "803223e0": "osMapTLB", + "803224a0": "osUnmapTLBAll", + "803224f0": "sprintf", + "8032255c": "proutSprintf", + "803225a0": "osCreateMesgQueue", + "803225d0": "osSetEventMesg", + "80322640": "osViSetEvent", + "803226b0": "osCreateThread", + "80322800": "osRecvMesg", + "80322940": "_VirtualToPhysicalTask", + "80322a5c": "osSpTaskLoad", + "80322bbc": "osSpTaskStartGo", + "80322c00": "osSpTaskYield", + "80322c20": "osSendMesg", + "80322d70": "osSpTaskYielded", + "80322df0": "osStartThread", + "80322f40": "osWritebackDCacheAll", + "80322f70": "osCreateViManager", + "803230f4": "viMgrMain", + "803232d0": "osViSetMode", + "80323340": "osViBlack", + "803233b0": "osViSetSpecialFeatures", + "80323570": "osCreatePiManager", + "803236f0": "osSetThreadPri", + "803237d0": "osInitialize", + "80323a00": "osViSwapBuffer", + "80323a50": "sqrtf", + "80323a60": "osContStartReadData", + "80323b24": "osContGetReadData", + "80323bcc": "__osPackReadData", + "80323cc0": "osContInit", + "80323ebc": "__osContGetInitData", + "80323f8c": "__osPackRequestData", + "80324080": "osEepromProbe", + "803240f0": "__ull_rshift", + "8032411c": "__ull_rem", + "80324158": "__ull_div", + "80324194": "__ll_lshift", + "803241c0": "__ll_rem", + "803241fc": "__ll_div", + "80324258": "__ll_mul", + "80324288": "__ull_divremi", + "803242e8": "__ll_mod", + "80324384": "__ll_rshift", + "803243b0": "osInvalDCache", + "80324460": "osPiStartDma", + "80324570": "bzero", + "80324610": "osInvalICache", + "80324690": "osEepromLongRead", + "803247d0": "osEepromLongWrite", + "80324910": "bcopy", + "80324c20": "guOrthoF", + "80324d74": "guOrtho", + "80324de0": "guPerspectiveF", + "80325010": "guPerspective", + "80325070": "osGetTime", + "80325100": "__d_to_ll", + "8032511c": "__f_to_ll", + "80325138": "__d_to_ull", + "803251d8": "__f_to_ull", + "80325274": "__ll_to_d", + "8032528c": "__ll_to_f", + "803252a4": "__ull_to_d", + "803252d8": "__ull_to_f", + "80325310": "cosf", + "80325480": "sinf", + "80325640": "guTranslateF", + "80325688": "guTranslate", + "803256e0": "guRotateF", + "80325874": "guRotate", + "803258d0": "guScaleF", + "80325924": "guScale", + "80325970": "osAiSetFrequency", + "80325bd4": "alBnkfNew", + "80325cd8": "alSeqFileNew", + "80325d20": "osWritebackDCache", + "80325da0": "osAiGetLength", + "80325db0": "osAiSetNextBuffer", + "80325e60": "__osTimerServicesInit", + "80325eec": "__osTimerInterrupt", + "80326064": "__osSetTimerIntr", + "803260d8": "__osInsertTimer", + "80326260": "_Printf", + "803273f0": "memcpy", + "8032741c": "strlen", + "80327444": "strchr", + "80327490": "__osDequeueThread", + "803274d0": "__osDisableInt", + "803274f0": "__osRestoreInt", + "80327510": "__osViInit", + "80327640": "__osExceptionPreamble", + "80327650": "__osException", + "803278e4": "L80326964", + "80327904": "L80326984", + "80327938": "L803269B8", + "80327a68": "L80326AE8", + "80327ac4": "L80326B44", + "80327ae4": "L80326B64", + "80327b1c": "L80326B9C", + "80327b68": "L80326BE8", + "80327b98": "send_mesg", + "80327c80": "__osEnqueueAndYield", + "80327d10": "__osEnqueueThread", + "80327d58": "__osPopThread", + "80327d68": "__osDispatchThread", + "80327ea8": "__osCleanupThread", + "80327eb0": "osVirtualToPhysical", + "80327f30": "__osSpSetStatus", + "80327f40": "__osSpSetPc", + "80327f80": "__osSpRawStartDma", + "80328010": "__osSpDeviceBusy", + "80328040": "__osSpGetStatus", + "80328050": "osGetThreadPri", + "80328070": "__osViGetCurrentContext", + "80328080": "__osViSwapContext", + "803283e0": "osGetCount", + "803283f0": "__osPiCreateAccessQueue", + "80328440": "__osPiGetAccess", + "80328484": "__osPiRelAccess", + "803284b0": "osPiRawStartDma", + "80328590": "__osDevMgrMain", + "80328710": "__osSetSR", + "80328720": "__osGetSR", + "80328730": "__osSetFpcCsr", + "80328740": "__osSiRawReadIo", + "80328790": "__osSiRawWriteIo", + "803287e0": "osMapTLBRdb", + "80328840": "osPiRawReadIo", + "803288a0": "__osSiCreateAccessQueue", + "803288f0": "__osSiGetAccess", + "80328934": "__osSiRelAccess", + "80328960": "__osSiRawStartDma", + "80328a10": "osSetTimer", + "80328af0": "osEepromWrite", + "80328ca0": "__osPackEepWriteData", + "80328dac": "__osEepStatus", + "80328fd0": "osJamMesg", + "80329120": "osPiGetCmdQueue", + "80329150": "osEepromRead", + "80329340": "__osPackEepReadData", + "80329450": "guMtxF2L", + "80329550": "guMtxIdentF", + "803295d8": "guMtxIdent", + "80329608": "guMtxL2F", + "803296c0": "guNormalize", + "80329750": "__osAiDeviceBusy", + "80329780": "__osSetCompare", + "80329790": "_Litob", + "80329a90": "_Ldtob", + "8032a860": "u32_to_string", + "8032a890": "string_to_u32", + "8032a8e8": "send_packet", + "8032a9a8": "send", + "8032aa80": "process_command_memory", + "8032aacc": "process_command_register", + "8032aaf8": "kdebugserver", + "8032ace0": "__osSyncPutChars", + "8032ae10": "osSetIntMask", + "8032ae70": "osDestroyThread", + "8032af70": "__osProbeTLB", + "8032b030": "__osSiDeviceBusy", + "8032b060": "lldiv", + "8032b160": "ldiv", + "8032b1f0": "__osGetCause", + "8032b200": "__osAtomicDec", + "8032b260": "rspF3DBootStart", + "8032b330": "rspF3DBootEnd", + "8032b330": "rspF3DStart", + "8032c738": "rspF3DEnd", + "8032c740": "rspAspMainStart", + "8032d560": "rspAspMainEnd", + "8032d560": "gVblankHandler1", + "8032d564": "gVblankHandler2", + "8032d568": "gActiveSPTask", + "8032d56c": "sCurrentAudioSPTask", + "8032d570": "sCurrentDisplaySPTask", + "8032d574": "sNextAudioSPTask", + "8032d578": "sNextDisplaySPTask", + "8032d57c": "sAudioEnabled", + "8032d580": "sNumVblanks", + "8032d584": "gResetTimer", + "8032d588": "D_8032C648", + "8032d58c": "gDebugLevelSelect", + "8032d590": "D_8032C650", + "8032d594": "gShowProfiler", + "8032d598": "gShowDebugText", + "8032d5d0": "unused8032C690", + "8032d5d4": "gGlobalTimer", + "8032d5dc": "frameBufferIndex", + "8032d5e0": "D_8032C6A0", + "8032d5e4": "gPlayer1Controller", + "8032d5e8": "gPlayer2Controller", + "8032d5ec": "gPlayer3Controller", + "8032d5f0": "gCurrDemoInput", + "8032d5f4": "gDemoInputListID", + "8032d5f8": "gRecordedDemoInput", + "8032d6d0": "credits01", + "8032d6d8": "credits02", + "8032d6e4": "credits03", + "8032d6f0": "credits04", + "8032d700": "credits05", + "8032d710": "credits06", + "8032d71c": "credits07", + "8032d728": "credits08", + "8032d738": "credits09", + "8032d740": "credits10", + "8032d750": "credits11", + "8032d75c": "credits12", + "8032d764": "credits13", + "8032d774": "credits14", + "8032d77c": "credits15", + "8032d788": "credits16", + "8032d79c": "credits17", + "8032d7ac": "credits18", + "8032d7bc": "credits19", + "8032d7c4": "credits20", + "8032d7cc": "sCreditsSequence", + "8032d93c": "gMarioState", + "8032d940": "unused1", + "8032d944": "D_8032C9E0", + "8032daa0": "sTerrainSounds", + "8032dacc": "sSquishScaleOverTime", + "8032dae0": "sCapFlickerFrames", + "8032daf8": "gWaterSurfacePseudoFloor", + "8032dc50": "sJumpLandAction", + "8032dc68": "sFreefallLandAction", + "8032dc80": "sSideFlipLandAction", + "8032dc98": "sHoldJumpLandAction", + "8032dcb0": "sHoldFreefallLandAction", + "8032dcc8": "sLongJumpLandAction", + "8032dce0": "sDoubleJumpLandAction", + "8032dcf8": "sTripleJumpLandAction", + "8032dd10": "sBackflipLandAction", + "8032dd40": "sPunchingForwardVelocities", + "8032dd80": "gLastCompletedCourseNum", + "8032dd84": "gLastCompletedStarNum", + "8032dd88": "sUnusedGotGlobalCoinHiScore", + "8032dd8c": "gGotFileCoinHiScore", + "8032dd90": "gCurrCourseStarFlags", + "8032dd94": "gSpecialTripleJump", + "8032dd98": "gLevelToCourseNumTable", + "8032ddc0": "gMarioSpawnInfo", + "8032ddc4": "gLoadedGraphNodes", + "8032ddc8": "gAreas", + "8032ddcc": "gCurrentArea", + "8032ddd0": "gCurrCreditsEntry", + "8032ddd4": "D_8032CE74", + "8032ddd8": "D_8032CE78", + "8032dddc": "gWarpTransDelay", + "8032dde0": "gFBSetColor", + "8032dde4": "gWarpTransFBSetColor", + "8032dde8": "gWarpTransRed", + "8032ddec": "gWarpTransGreen", + "8032ddf0": "gWarpTransBlue", + "8032ddf4": "gCurrSaveFileNum", + "8032ddf8": "gCurrLevelNum", + "8032ddfc": "D_8032CE9C", + "8032de4c": "D_8032CEEC", + "8032de60": "D_8032CF00", + "8032de70": "renderModeTable_1Cycle", + "8032deb0": "renderModeTable_2Cycle", + "8032def0": "gCurGraphNodeRoot", + "8032def4": "gCurGraphNodeMasterList", + "8032def8": "gCurGraphNodeCamFrustum", + "8032defc": "gCurGraphNodeCamera", + "8032df00": "gCurGraphNodeObject", + "8032df04": "gCurGraphNodeHeldObject", + "8032df08": "gAreaUpdateCounter", + "8032df10": "gProfilerMode", + "8032df14": "gCurrentFrameIndex1", + "8032df18": "gCurrentFrameIndex2", + "8032df20": "unused_8032CFC0", + "8032df24": "gCutsceneFocus", + "8032df28": "unused_8032CFC8", + "8032df2c": "unused_8032CFCC", + "8032df30": "gSecondCameraFocus", + "8032df34": "D_8032CFD4", + "8032df38": "gCurrLevelArea", + "8032df3c": "gPrevLevel", + "8032df40": "D_8032CFE0", + "8032df44": "D_8032CFE4", + "8032df48": "D_8032CFE8", + "8032df4c": "gCameraZoomDist", + "8032df50": "sTempCutsceneNumber", + "8032df54": "gCutsceneNumber", + "8032df58": "sCutsceneTransitionTimer", + "8032df5c": "D_8032CFFC", + "8032df60": "sMarioStatusForCamera", + "8032df64": "sLuigiStatusForCamera", + "8032df68": "D_8032D008", + "8032df6c": "sFixedPresetBasePosition", + "8032df78": "D_8032D00C_2", + "8032df84": "D_8032D00C_3", + "8032df90": "D_8032D00C_4", + "8032df9c": "D_8032D00C_5", + "8032dfa8": "TableCameraTransitions", + "8032e008": "unused_8032D0A8", + "8032e010": "unused_8032D0B0", + "8032e018": "D_8032D0B8", + "8032e050": "BBHRoom6ParallelTrackingTable", + "8032e098": "TableCameraSL", + "8032e0e0": "TableCameraTHI", + "8032e128": "TableCameraHMC", + "8032e1d0": "TableCameraSSL", + "8032e248": "TableCameraRR", + "8032e338": "TableCameraCotMC", + "8032e368": "TableCameraCCM", + "8032e3b0": "TableCameraInside", + "8032e6f8": "TableCameraBBH", + "8032ecb0": "TableLevelCinematicCamera", + "8032ed50": "sIntroStartToPipePosition", + "8032ee08": "sIntroStartToPipeFocus", + "8032eec0": "sIntroPipeToDialogPosition", + "8032ef30": "sIntroPipeToDialogFocus", + "8032efa0": "D_8032E040", + "8032eff0": "D_8032E090", + "8032f048": "D_8032E0E8", + "8032f0e8": "D_8032E188", + "8032f130": "D_8032E1D0", + "8032f178": "D_8032E218", + "8032f1b8": "D_8032E258", + "8032f214": "gIntroLakituStartToPipeFocus", + "8032f32c": "gIntroLakituStartToPipeOffsetFromCamera", + "8032f444": "D_8032E4E4", + "8032f48c": "D_8032E52C", + "8032f4d4": "TableCutscenePeachEnd", + "8032f534": "TableCutsceneGrandStar", + "8032f544": "TableCutscene0FTodo", + "8032f554": "TableCutsceneDoorWarp", + "8032f564": "TableCutsceneEndWaving", + "8032f56c": "TableCutsceneCredits", + "8032f574": "TableCutsceneDoor00", + "8032f59c": "TableCutsceneDoor01", + "8032f5c4": "TableCutsceneDoor0A", + "8032f5dc": "TableCutsceneDoor0B", + "8032f5f4": "TableCutsceneEnterCannon", + "8032f60c": "TableCutsceneStarSpawn", + "8032f624": "TableCutsceneSpecialStarSpawn", + "8032f634": "TableCutsceneEnterPainting", + "8032f63c": "TableCutsceneDeathExit", + "8032f64c": "TableCutsceneExitPaintingSuccess", + "8032f65c": "TableCutscene11Todo", + "8032f674": "TableCutsceneIntroPeach", + "8032f69c": "TableCutscenePrepareCannon", + "8032f6ac": "TableCutsceneExitWaterfall", + "8032f6bc": "TableCutsceneFallToCastleGrounds", + "8032f6cc": "TableCutsceneEnterPyramidTop", + "8032f6dc": "TableCutscene26Todo", + "8032f6f4": "TableCutsceneStandingDeath", + "8032f6fc": "TableCutsceneEnterPool", + "8032f70c": "TableCutsceneDeath2", + "8032f714": "TableCutsceneDeathOnBack", + "8032f71c": "TableCutsceneQuicksandDeath", + "8032f72c": "TableCutsceneSuffocationDeath", + "8032f734": "TableCutsceneEnterBowserPlatform", + "8032f74c": "TableCutsceneStarDance1", + "8032f754": "TableCutsceneStarDance2", + "8032f75c": "TableCutsceneStarDance3", + "8032f764": "TableCutsceneKeyDance", + "8032f76c": "TableCutsceneCapSwitchPress", + "8032f774": "TableCutsceneSlidingDoorsOpen", + "8032f784": "TableCutsceneUnlockKeyDoor", + "8032f794": "TableCutsceneExitBowserSuccess", + "8032f7a4": "TableCutscene1CTodo", + "8032f7b4": "TableCutsceneBBHExitSuccess", + "8032f7c4": "TableCutsceneNonPaintingDeath", + "8032f7d4": "TableCutsceneDialog", + "8032f7ec": "TableCutsceneReadMessage", + "8032f804": "D_8032E8A4", + "8032f870": "zoomOutAreaMasks", + "8032f884": "sBobCreditsCameraPositions", + "8032f8ac": "sBobCreditsCameraFocus", + "8032f8d4": "sWfCreditsCameraPositions", + "8032f8fc": "sWfCreditsCameraFocus", + "8032f924": "sJrbCreditsCameraPositions", + "8032f94c": "sJrbCreditsCameraFocus", + "8032f974": "sCcmSlideCreditsCameraPositions", + "8032f99c": "sCcmSlideCreditsCameraFocus", + "8032f9c4": "sBbhCreditsCameraPositions", + "8032f9e4": "sBbhCreditsCameraFocus", + "8032fa04": "sHmcCreditsCameraPositions", + "8032fa2c": "sHmcCreditsCameraFocus", + "8032fa54": "sThiWigglerCreditsCameraPositions", + "8032fa6c": "sThiWigglerCreditsCameraFocus", + "8032fa84": "sVolcanoCreditsCameraPositions", + "8032fab4": "sVolcanoCreditsCameraFocus", + "8032fae4": "sSslCreditsCameraPositions", + "8032fb14": "sSslCreditsCameraFocus", + "8032fb44": "sDddCreditsCameraPositions", + "8032fb7c": "sDddCreditsCameraFocus", + "8032fbb4": "sSlCreditsCameraPositions", + "8032fbd4": "sSlCreditsCameraFocus", + "8032fbf4": "sWdwCreditsCameraPositions", + "8032fc14": "sWdwCreditsCameraFocus", + "8032fc34": "sTtmCreditsCameraPositions", + "8032fc64": "sTtmCreditsCameraFocus", + "8032fc94": "sThiHugeCreditsCameraPositions", + "8032fccc": "sThiHugeCreditsCameraFocus", + "8032fd04": "sTtcCreditsCameraPositions", + "8032fd24": "sTtcCreditsCameraFocus", + "8032fd44": "sRrCreditsCameraPositions", + "8032fd64": "sRrCreditsCameraFocus", + "8032fd84": "sSaCreditsCameraPositions", + "8032fdac": "sSaCreditsCameraFocus", + "8032fdd4": "sCotmcCreditsCameraPositions", + "8032fdfc": "sCotmcCreditsCameraFocus", + "8032fe24": "sDddSubCreditsCameraPositions", + "8032fe4c": "sDddSubCreditsCameraFocus", + "8032fe74": "sCcmOutsideCreditsCameraPositions", + "8032fe94": "sCcmOutsideCreditsCameraFocus", + "8032fec0": "sObjectListUpdateOrder", + "8032fecc": "sParticleTypes", + "80330000": "D_8032F0A0", + "80330004": "D_8032F0A4", + "80330020": "D_8032F0C0", + "8033002c": "D_8032F0CC", + "8033006c": "sMrIParticleActions", + "80330074": "sMrIActions", + "80330084": "sMrIHitbox", + "80330094": "D_8032F134", + "803300a8": "unused8032F134", + "803300ac": "sCapSwitchActions", + "803300bc": "sKingBobombActions", + "803300e0": "sKingBobombSoundStates", + "80330140": "sOpenedCannonActions", + "8033015c": "unused0EA1FC", + "80330198": "sChuckyaActions", + "803301a8": "sWFRotatingPlatformData", + "803301c0": "sKoopaShellUnderwaterHitbox", + "803301d0": "D_8032F270", + "803301e4": "sSparkleSpawnStarHitbox", + "803301f4": "sYellowCoinHitbox", + "80330204": "D_8032F2A4", + "80330224": "sCoinInsideBooActions", + "8033022c": "D_8032F2CC", + "80330244": "D_8032F2E4", + "80330260": "D_8032F300", + "80330288": "D_8032F328", + "80330290": "D_8032F330", + "80330298": "sGrindelThwompActions", + "803302ac": "sTumblingBridgeParams", + "803302dc": "sTumblingBridgeActions", + "803302ec": "D_8032F38C", + "80330318": "sElevatorActions", + "8033032c": "D_8032F3CC", + "80330340": "D_8032F3E0", + "80330354": "D_8032F3F4", + "8033035c": "D_8032F3FC", + "80330370": "sUkikiCageActions", + "80330380": "D_8032F420", + "80330390": "sSpindriftHitbox", + "803303a0": "sMetalBoxHitbox", + "803303b0": "sBreakableBoxHitbox", + "803303c0": "D_8032F460", + "803303e8": "sHeaveHoActions", + "803303f8": "sJumpingBoxHitbox", + "80330408": "sJumpingBoxActions", + "8033042c": "sBowserKeyHitbox", + "8033043c": "sBulletBillActions", + "80330450": "sBowserTailAnchorActions", + "8033045c": "D_8032F4FC", + "8033046c": "D_8032F50C", + "80330470": "D_8032F510", + "80330474": "D_8032F514", + "80330478": "sBowserDefeatedDialogText", + "80330480": "D_8032F520", + "803304c8": "sBowserActions", + "80330518": "D_8032F5B8", + "803305f0": "D_8032F690", + "803305f4": "D_8032F694", + "803305f8": "D_8032F698", + "8033067c": "sFallingBowserPlatformActions", + "80330688": "sGrowingBowserFlameHitbox", + "80330698": "sBowserFlameHitbox", + "803306a8": "D_8032F748", + "803306b4": "D_8032F754", + "803306dc": "sCageUkikiPath", + "80330738": "sUkikiSoundStates", + "803307a0": "sUkikiActions", + "803307c0": "D_8032F860", + "803307f4": "D_8032F894", + "80330828": "D_8032F8C8", + "80330830": "sRotatingCwFireBarsActions", + "80330840": "sKoopaShellHitbox", + "80330850": "D_8032F8F0", + "80330884": "D_8032F924", + "803308a8": "D_8032F948", + "803308cc": "D_8032F96C", + "803308d8": "sToxBoxActions", + "80330900": "TablePiranhaPlantActions", + "80330b1c": "sBowserPuzzlePieceActions", + "80330b38": "sTuxiesMotherActions", + "80330b44": "sSmallPenguinActions", + "80330b5c": "sFishActions", + "80330b68": "sFishGroupActions", + "80330b74": "sBirdChirpChirpActions", + "80330b84": "sCheepCheepActions", + "80330b90": "sExclamationBoxHitbox", + "80330ba0": "sExclamationBoxContents", + "80330c20": "sExclamationBoxActions", + "80330c38": "sSkullSlidingBoxHitbox", + "80330c48": "D_8032FCE8", + "80330c58": "sTweesterHitbox", + "80330c68": "sTweesterActions", + "80330cd4": "sScuttlebugHitbox", + "80330ce4": "sWhompActions", + "80330d0c": "D_8032FDAC", + "80330d30": "D_8032FDD0", + "80330d54": "D_8032FDF4", + "80330d78": "D_8032FE18", + "80330d9c": "sWindParticleHitbox", + "80330dac": "D_8032FE4C", + "80330e20": "D_8032FEC0", + "80330e24": "unused_8032FEC4", + "80330e34": "gMarioPlatform", + "80330e40": "sDebugEffectStringInfo", + "80330e64": "sDebugEnemyStringInfo", + "80330e88": "sDebugInfoDPadMask", + "80330e8c": "sDebugInfoDPadUpdID", + "80330e90": "sDebugLvSelectCheckFlag", + "80330e94": "sDebugPage", + "80330e98": "sNoExtraDebug", + "80330e9c": "sDebugStringArrPrinted", + "80330ea0": "sDebugSysCursor", + "80330ea4": "sDebugInfoButtonSeqID", + "80330ea8": "sDebugInfoButtonSeq", + "80330ec0": "sTransitionColorFadeCount", + "80330ec4": "sTransitionTextureFadeCount", + "80330ec8": "sTextureTransitionID", + "80330ee0": "rectangles", + "80330f00": "sSkyboxTextures", + "80330f28": "sSkyboxColors", + "80330f30": "gMovtexCounter", + "80330f34": "gMovtexCounterPrev", + "80330f38": "gMovtexVtxColor", + "80330f3c": "gPaintingMarioYEntry", + "80330f40": "gWdwWaterLevelSet", + "80330f44": "gMovtexIdToTexture", + "80330f64": "gMovtexNonColored", + "803311a4": "gMovtexColored", + "8033127c": "gMovtexColored2", + "80331300": "hmcPaintings", + "80331308": "insideCastlePaintings", + "80331344": "ttmPaintings", + "8033134c": "paintingGroups", + "80331358": "gPaintingUpdateCounter", + "8033135c": "gLastPaintingUpdateCounter", + "80331360": "sTextLabelsCount", + "80331370": "gDialogCharWidths", + "80331470": "gDialogBoxState", + "80331474": "gDialogBoxOpenTimer", + "80331478": "gDialogBoxScale", + "8033147c": "gDialogScrollOffsetY", + "80331480": "gDialogBoxType", + "80331484": "gDialogID", + "80331488": "gLastDialogPageStrPos", + "8033148c": "gDialogTextPos", + "80331490": "gDialogLineNum", + "80331494": "gLastDialogResponse", + "80331498": "gMenuHoldKeyIndex", + "8033149c": "gMenuHoldKeyTimer", + "803314a0": "gDialogResponse", + "803314b0": "gHudSymCoin", + "803314b4": "gHudSymX", + "803314f8": "gMenuMode", + "803314fc": "gEndCutsceneStrEn0", + "80331504": "gEndCutsceneStrEn1", + "80331538": "gEndCutsceneStrEn2", + "80331558": "gEndCutsceneStrEn3", + "8033156c": "gEndCutsceneStrEn4", + "80331598": "gEndCutsceneStrEn5", + "803315ac": "gEndCutsceneStrEn6", + "803315cc": "gEndCutsceneStrEn7", + "803315dc": "gEndCutsceneStrEn8", + "803315e4": "gEndCutsceneStringsEn", + "8033160c": "gCutsceneMsgFade", + "80331610": "gCutsceneMsgIndex", + "80331614": "gCutsceneMsgDuration", + "80331618": "gCutsceneMsgTimer", + "8033161c": "gDialogCameraAngleIndex", + "80331620": "gDialogCourseActNum", + "803316c8": "gCourseCompleteCoinsEqual", + "803316cc": "gCourseDoneMenuTimer", + "803316d0": "gCourseCompleteCoins", + "803316d4": "gHudFlash", + "80331750": "gEnvFxMode", + "80331754": "D_80330644", + "80331758": "gSnowTempVtx", + "80331788": "gSnowFlakeVertex1", + "80331790": "gSnowFlakeVertex2", + "80331798": "gSnowFlakeVertex3", + "803317a0": "D_80330690", + "803317a4": "D_80330694", + "803317a8": "gBubbleTempVtx", + "803317e0": "MacroObjectPresets", + "803325fc": "sPowerMeterVisibleTimer", + "80332614": "sPrevCheckMarioRoom", + "80332618": "sYoshiDead", + "8033261c": "sDebugSequenceTracker", + "80332620": "sDebugTimer", + "803327a8": "sBreakableBoxSmallHitbox", + "80332b00": "sMrBlizzardHitbox", + "80332b10": "D_80331A00", + "80332b24": "sMrBlizzardSnowballHitbox", + "80332b34": "D_80331A24", + "80332b54": "D_80331A44", + "80332b5c": "D_80331A4C", + "80332b64": "D_80331A54", + "80332bdc": "D_80331ACC", + "80332bf0": "sRecoveryHeartHitbox", + "80332c00": "sUnagiHitbox", + "80332c10": "sHauntedChairHitbox", + "80332c30": "sFlyingBookendHitbox", + "80332c40": "D_80331B30", + "80332c4c": "sBookSwitchHitbox", + "80332c5c": "sFirePiranhaPlantHitbox", + "80332c6c": "D_80331B5C", + "80332c74": "sPiranhaPlantFireHitbox", + "80332c84": "sSnufitHitbox", + "80332c94": "sSnufitBulletHitbox", + "80332ca4": "sEyerokHitbox", + "80332cb4": "D_80331BA4", + "80332d10": "D_80331C00", + "80332d28": "sClamShellHitbox", + "80332d38": "sSkeeterHitbox", + "80332d48": "D_80331C38", + "80332e50": "gAudioErrorFlags", + "80332e54": "sGameLoopTicked", + "80332e58": "sDialogSpeaker", + "80332f04": "sDialogSpeakerVoice", + "80332f40": "sNumProcessedSoundRequests", + "80332f44": "sSoundRequestCount", + "80332f48": "sDynBbh", + "80332f54": "sDynDdd", + "80332f6c": "sDynJrb", + "80332f88": "sDynWdw", + "80332f98": "sDynHmc", + "80332fa8": "sDynUnk38", + "80332fb8": "sDynNone", + "80332fbc": "sCurrentMusicDynamic", + "80332fc0": "sBackgroundMusicForDynamics", + "80332fc4": "sLevelDynamics", + "80333060": "sMusicDynamics", + "803330c0": "gAreaEchoLevel", + "80333138": "D_80332028", + "80333188": "sBackgroundMusicDefaultVolume", + "803331ac": "sPlayer0CurSeqId", + "803331b0": "sMusicDynamicDelay", + "803331b4": "D_803320A4", + "803331c0": "D_803320B0", + "803331cc": "D_803320BC", + "803331d8": "sMaxChannelsForSoundBank", + "803331e4": "sNumSoundsPerBank", + "803331f0": "gDefaultSoundArgs", + "803331fc": "sUnusedSoundArgs", + "80333208": "sSoundBankDisabled", + "80333218": "D_80332108", + "8033321c": "sHasStartedFadeOut", + "80333220": "D_80332110", + "80333224": "sUnused80332114", + "80333228": "sUnused80332118", + "8033322c": "D_8033211C", + "80333230": "D_80332120", + "80333234": "D_80332124", + "80333238": "sBackgroundMusicQueueSize", + "8033323c": "sUnused8033323C", + "803332a0": "gAudioSessionPresets", + "80333498": "gAudioCosineTable", + "80333598": "gPitchBendFrequencyScale", + "80333994": "gNoteFrequencies", + "80333b94": "gDefaultShortNoteVelocityTable", + "80333ba4": "gDefaultShortNoteDurationTable", + "80333bb4": "gVibratoCurve", + "80333bc4": "gDefaultEnvelope", + "80333bd0": "sSineWave", + "80333c50": "sSquareWave", + "80333cd0": "sTriangleWave", + "80333d50": "sSawtoothWave", + "80333dd0": "gWaveSamples", + "80333de0": "gHeadsetPanQuantization", + "80333df4": "gHeadsetPanVolume", + "80333ff4": "gStereoPanVolume", + "803341f4": "gDefaultPanVolume", + "803343f4": "gVolRampingLhs136", + "803345f4": "gVolRampingRhs136", + "803347f4": "gVolRampingLhs144", + "803349f4": "gVolRampingRhs144", + "80334bf4": "gVolRampingLhs128", + "80334df4": "gVolRampingRhs128", + "80334ff4": "gTatumsPerBeat", + "80334ff8": "gUnusedCount80333EE8", + "80334ffc": "gAudioHeapSize", + "80335000": "D_80333EF0", + "80335004": "gAudioLoadLock", + "80335008": "sUnused8033EF8", + "80335010": "osViModeTable", + "803358d0": "viMgrMainArgs", + "803358f0": "piMgrArgs", + "80335910": "osClockRate", + "80335918": "D_80334808", + "80335920": "D_80334810", + "80335930": "D_80334820", + "80335940": "D_80334830", + "80335950": "_spaces", + "80335974": "_zeroes", + "803359a0": "D_80334890", + "803359a4": "unknown", + "803359a8": "D_80334898", + "803359ac": "D_8033489C", + "803359b0": "D_803348A0", + "803359b4": "D_803348A4", + "803359c0": "D_803348B0", + "80335a20": "D_80334910", + "80335a24": "D_80334914", + "80335a28": "D_80334918", + "80335a2c": "D_8033491C", + "80335a30": "D_80334920", + "80335a44": "D_80334934", + "80335a48": "D_80334938", + "80335a50": "gOsPiAccessQueueCreated", + "80335a60": "gOsSiAccessQueueCreated", + "80335aa0": "D_80334990", + "80335af0": "D_803349E0", + "80335b40": "D_80334A30", + "80335b44": "D_80334A34", + "80335b48": "D_80334A38", + "80335b50": "D_80334A40", + "80335b54": "D_80334A44", + "80338da0": "D_80337BB0", + "80338da8": "D_80337BB8", + "80338e60": "jtbl_80337C90", + "80338e84": "jtbl_80337CB4", + "80338eac": "jtbl_80337CDC", + "80338ec0": "jtbl_80337D08", + "80338fbc": "jtbl_80337E04", + "8033978c": "jtbl_80338418", + "80339880": "length_str", + "80339884": "flags_str", + "8033988c": "flags_arr", + "80339980": "D_80338610", + "803399a0": "jtbl_80338630", + "803399d0": "NAN", + "803399e0": "D_80338670", + "80339a40": "D_803386D0", + "80339ac0": "rspF3DDataStart", + "8033a2c0": "rspF3DDataEnd", + "8033a2c0": "rspAspMainDataStart", + "8033a580": "rspAspMainDataEnd", + "8033a580": "_mainSegmentEnd", + "008c0c40": "_mainSegmentRomEnd", + "8033a580": "_mainSegmentNoloadStart", + "8033a580": "D_80339210", + "8033a730": "gIdleThread", + "8033a8e0": "gMainThread", + "8033aa90": "gGameLoopThread", + "8033ac40": "gSoundThread", + "8033adf0": "gPIMesgQueue", + "8033ae08": "gIntrMesgQueue", + "8033ae20": "gSPTaskMesgQueue", + "8033ae38": "gDmaMesgBuf", + "8033ae40": "gPIMesgBuf", + "8033aec0": "gSIEventMesgBuf", + "8033aec8": "gIntrMesgBuf", + "8033af08": "gUnknownMesgBuf", + "8033af48": "gDmaIoMesg", + "8033af5c": "D_80339BEC", + "8033af60": "gDmaMesgQueue", + "8033af78": "gSIEventMesgQueue", + "8033af90": "gControllers", + "8033afe8": "gControllerStatuses", + "8033aff8": "gControllerPads", + "8033b010": "gGameVblankQueue", + "8033b028": "D_80339CB8", + "8033b040": "D_80339CD0", + "8033b044": "D_80339CD4", + "8033b048": "gGameVblankHandler", + "8033b050": "gPhysicalFrameBuffers", + "8033b05c": "gPhysicalZBuffer", + "8033b060": "D_80339CF0", + "8033b064": "D_80339CF4", + "8033b068": "gGfxSPTask", + "8033b06c": "gDisplayListHead", + "8033b070": "gGfxPoolEnd", + "8033b074": "gGfxPool", + "8033b078": "gControllerBits", + "8033b079": "gEepromProbe", + "8033b080": "D_80339D10", + "8033b090": "gDemo", + "8033b0a0": "filler80339D30", + "8033b170": "gMarioStates", + "8033b238": "sCurrPlayMode", + "8033b23a": "D_80339ECA", + "8033b23c": "sTransitionTimer", + "8033b240": "sTransitionUpdate", + "8033b244": "unused3", + "8033b248": "sWarpDest", + "8033b250": "D_80339EE0", + "8033b252": "sDelayedWarpOp", + "8033b254": "sDelayedWarpTimer", + "8033b256": "sSourceWarpNodeId", + "8033b258": "sDelayedWarpArg", + "8033b25c": "unused4", + "8033b25e": "sTimerRunning", + "8033b260": "gHudDisplay", + "8033b26e": "gShouldNotPlayCastleMusic", + "8033b270": "sDelayInvincTimer", + "8033b272": "sInvulnerable", + "8033b280": "unused80339F10", + "8033b288": "filler80339F1C", + "8033b2c0": "D_80339F50", + "8033b350": "D_80339FE0", + "8033b3b0": "gBodyStates", + "8033b494": "D_8033A124", + "8033b4a0": "gWarpCheckpoint", + "8033b4a5": "gMainMenuDataModified", + "8033b4a6": "gSaveFileModified", + "8033b4b0": "gPlayerSpawnInfos", + "8033b4d0": "D_8033A160", + "8033b8d0": "gAreaData", + "8033bab0": "gWarpTransition", + "8033bac6": "gCurrCourseNum", + "8033bac8": "gCurrActNum", + "8033baca": "gCurrAreaIndex", + "8033bacc": "gSavedCourseNum", + "8033bace": "gPauseScreenMode", + "8033bad0": "gSaveOptSelectIndex", + "8033bae0": "gMatStackIndex", + "8033bae8": "gMatStack", + "8033c2e8": "gMatStackFixed", + "8033c368": "gGeoTempState", + "8033c378": "gCurAnimType", + "8033c379": "gCurAnimEnabled", + "8033c37a": "gCurrAnimFrame", + "8033c37c": "gCurAnimTranslationMultiplier", + "8033c380": "gCurrAnimAttribute", + "8033c384": "gCurAnimData", + "8033c388": "gDisplayListHeap", + "8033c390": "gProfilerFrameData", + "8033c520": "gPlayerStatusForCamera", + "8033c568": "sCameraPosition", + "8033c578": "sCameraFocus", + "8033c588": "D_8033B218", + "8033c594": "sCreditsCameraPitch", + "8033c596": "sCreditsCameraYaw", + "8033c598": "gFramesPaused", + "8033c5a0": "D_8033B230", + "8033c5c0": "sCameraTransition", + "8033c5e8": "sGeometryForMario", + "8033c61c": "unused_8033B2AC", + "8033c61e": "sCameraYawVelocity", + "8033c620": "sCameraYawAfterDoorCutscene", + "8033c622": "unused_spline_pitch", + "8033c624": "unused_spline_yaw", + "8033c628": "sSplineParameters", + "8033c668": "sSplineParameterMax", + "8033c66c": "sPositionAlongSpline", + "8033c670": "sSplinePositionLimit", + "8033c674": "sCameraCutscenePitchOffset", + "8033c676": "sCameraCutsceneYawOffset", + "8033c678": "sCameraCutsceneRollOffset", + "8033c67c": "unused_8033B30C", + "8033c680": "unused_8033B310", + "8033c684": "gCameraModeFlags", + "8033c686": "unused_8033B316", + "8033c688": "sCameraSideCFlags", + "8033c68a": "unused_8033B31A", + "8033c68c": "gCameraFlags1", + "8033c68e": "gCButtonsPressed", + "8033c690": "D_8033B320", + "8033c698": "gCameraStatus", + "8033c758": "unused_8033B3E8", + "8033c75a": "sYawFocToMario", + "8033c75c": "D_8033B3EC", + "8033c75e": "D_8033B3EE", + "8033c760": "D_8033B3F0", + "8033c764": "D_8033B3F4", + "8033c768": "sCSideButtonYaw", + "8033c76a": "D_8033B3FA", + "8033c76c": "D_8033B3FC", + "8033c770": "sFirstPersonCameraPitch", + "8033c772": "sFirstPersonCameraYaw", + "8033c774": "D_8033B404", + "8033c776": "sPlatformLevelPresetBaseYaw", + "8033c778": "gPlatformLevelYawOffset", + "8033c77c": "D_8033B40C", + "8033c780": "D_8033B410", + "8033c788": "D_8033B418", + "8033c7d0": "sFixedPresetBasePositionOffset", + "8033c7dc": "D_8033B46C", + "8033c7e0": "D_8033B470", + "8033c7e8": "D_8033B478", + "8033c808": "D_8033B498", + "8033c828": "D_8033B4B8", + "8033c848": "gCameraMovementFlags", + "8033c84a": "gCameraFlags2", + "8033c850": "D_8033B4E0", + "8033c950": "D_8033B5E0", + "8033ca50": "sCutsceneSplineSegment", + "8033ca54": "sCutsceneSplineSegmentProgress", + "8033ca58": "D_8033B6E8", + "8033ca5a": "D_8033B6EA", + "8033ca5c": "gCutsceneTimer", + "8033ca60": "D_8033B6F0", + "8033cbc8": "gCutsceneActive", + "8033cbcc": "sCutscenePhase", + "8033cbd0": "gCurrLevelCamera", + "8033cbe0": "gObjectListArray", + "8033d260": "gDebugInfoFlags", + "8033d264": "gNumFindFloorMisses", + "8033d268": "unused_8033BEF8", + "8033d26c": "gUnknownWallCount", + "8033d270": "gObjectCounter", + "8033d274": "gNumCalls", + "8033d280": "gDebugInfo", + "8033d380": "gDebugInfoOverwrite", + "8033d480": "gTimeStopState", + "8033d488": "gObjectPool", + "80360e88": "gMacroObjectDefaultParent", + "803610e8": "gObjectLists", + "803610f0": "gFreeObjectList", + "80361158": "gMarioObject", + "8036115c": "gLuigiObject", + "80361160": "gCurrentObject", + "80361164": "gBehCommand", + "80361168": "gPrevFrameObjectCount", + "8036116c": "gSurfaceNodesAllocated", + "80361170": "gSurfacesAllocated", + "80361174": "gNumStaticSurfaceNodes", + "80361178": "gNumStaticSurfaces", + "8036117c": "gObjectMemoryPool", + "80361180": "gCheckingSurfaceCollisionsForCamera", + "80361182": "gFindFloorIncludeSurfaceIntangible", + "80361184": "gEnvironmentRegions", + "80361188": "gEnvironmentLevels", + "803611d8": "gDoorAdjacentRooms", + "80361250": "gMarioCurrentRoom", + "80361252": "D_8035FEE2", + "80361254": "D_8035FEE4", + "80361256": "gTHIWaterDrained", + "80361258": "gTTCSpeedSetting", + "8036125a": "gMarioShotFromCannon", + "8036125c": "gCCMEnteredSlide", + "8036125e": "gNumRoomedObjectsInMarioRoom", + "80361260": "gNumRoomedObjectsNotInMarioRoom", + "80361262": "gWDWWaterLevelChanging", + "80361264": "gMarioOnMerryGoRound", + "80361270": "sGrabReleaseState", + "80361280": "D_8035FF10", + "80361290": "gDebugPrintState1", + "803612a0": "gDebugPrintState2", + "803612b0": "sMarioOnFlyingCarpet", + "803612b2": "sSurfaceTypeBelowShadow", + "803612b4": "gShadowAboveWaterOrLava", + "803612b5": "gMarioOnIceOrCarpet", + "803612c0": "sSkyBoxInfo", + "803612e0": "gMovetexLastTextureId", + "803612f0": "gFlyingCarpetState", + "80361300": "gPaintingMarioFloorType", + "80361304": "gPaintingMarioXPos", + "80361308": "gPaintingMarioYPos", + "8036130c": "gPaintingMarioZPos", + "80361310": "D_8035FFA0", + "80361314": "D_8035FFA4", + "80361318": "ripplingPainting", + "8036131c": "dddStatus", + "80361320": "sTextLabels", + "803613f0": "gDialogColorFadeTimer", + "803613f2": "gLastDialogLineNum", + "803613f4": "gDialogVariable", + "803613f8": "gDialogTextAlpha", + "803613fa": "gCutsceneMsgXOffset", + "803613fc": "gCutsceneMsgYOffset", + "803613fe": "gRedCoinsCollected", + "80361400": "gEnvFxBuffer", + "80361408": "gSnowCylinderLastPos", + "80361414": "gSnowParticleCount", + "80361416": "gSnowParticleMaxCount", + "80361420": "gEnvFxBubbleConfig", + "80361460": "sNumActiveFirePiranhaPlants", + "80361464": "sNumKilledFirePiranhaPlants", + "80361468": "sObjSavedPosX", + "8036146c": "sObjSavedPosY", + "80361470": "sObjSavedPosZ", + "80361474": "sMontyMoleHoleList", + "80361478": "sMontyMoleKillStreak", + "8036147c": "sMontyMoleLastKilledPosX", + "80361480": "sMontyMoleLastKilledPosY", + "80361484": "sMontyMoleLastKilledPosZ", + "80361488": "sMasterTreadmill", + "80361490": "gCurrAiBuffer", + "80361498": "sSoundRequests", + "80361c98": "D_80360928", + "80361f98": "sUsedChannelsForSoundBank", + "80361fa8": "sCurrentSound", + "80361fb8": "gSoundBanks", + "80364b78": "D_80363808", + "80364b82": "D_80363812", + "80364b88": "sBackgroundMusicQueue", + "80364ba0": "D_80363830", + "80364c20": "D_803638B0", + "80364c60": "viMgrThread", + "80364e10": "viMgrStack", + "80365e10": "__osViMesgQueue", + "80365e28": "viMgrMesgBuff", + "80365e40": "viEventViMesg", + "80365e58": "viEventCounterMesg", + "80365e70": "piMgrThread", + "80366020": "piMgrStack", + "80367020": "__osPiMesgQueue", + "80367038": "piMgrMesgBuff", + "80367040": "D_80365CD0", + "80367050": "D_80365CE0", + "8036708c": "D_80365D1C", + "80367090": "D_80365D20", + "80367091": "_osCont_numControllers", + "80367098": "D_80365D28", + "803670b8": "_osContMesgQueue", + "803670d0": "_osContMesgBuff", + "803670f0": "D_80365D80", + "80367110": "_osCurrentTime", + "80367118": "D_80365DA8", + "8036711c": "D_80365DAC", + "80367120": "D_80365DB0", + "80367130": "osPiMesgBuff", + "80367138": "gOsPiMessageQueue", + "80367150": "osSiMesgBuff", + "80367158": "gOsSiMessageQueue", + "80367170": "D_80365E00", + "803671ac": "D_80365E3C", + "803671b0": "D_80365E40", + "803672b0": "gInterruptedThread", + "80367460": "_mainSegmentNoloadEnd", + "0000cee0": "_mainSegmentNoloadSizeLo", + "00000002": "_mainSegmentNoloadSizeHi", + "00000001": "ASSERT", + "80378800": "_engineSegmentStart", + "007cc6c0": "_engineSegmentRomStart", + "80378800": "vec3f_copy", + "80378840": "vec3f_set", + "8037888c": "vec3f_add", + "803788e4": "vec3f_sum", + "8037893c": "vec3s_copy", + "8037897c": "vec3s_set", + "803789c8": "vec3s_add", + "80378a20": "vec3s_sum", + "80378a78": "vec3s_sub", + "80378ad0": "vec3s_to_vec3f", + "80378b34": "vec3f_to_vec3s", + "80378c50": "find_vector_perpendicular_to_plane", + "80378d38": "vec3f_cross", + "80378dc0": "vec3f_normalize", + "80378e68": "mtxf_copy", + "80378eb4": "mtxf_identity", + "80378f24": "mtxf_translate", + "80378f84": "mtxf_lookat", + "80379440": "mtxf_rotate_zxy_and_translate", + "803795f0": "mtxf_rotate_xyz_and_translate", + "80379798": "mtxf_billboard", + "80379918": "mtxf_align_terrain_normal", + "80379aa4": "mtxf_align_terrain_triangle", + "80379f60": "mtxf_mul", + "8037a29c": "mtxf_scale_vec3f", + "8037a348": "mtxf_mul_vec3s", + "8037a434": "mtxf_to_mtx", + "8037a4b8": "mtxf_rotate_xy", + "8037a550": "get_pos_from_transform_mtx", + "8037a69c": "vec3f_get_dist_and_angle", + "8037a788": "vec3f_set_dist_and_angle", + "8037a860": "approach_s32", + "8037a8b4": "approach_f32", + "8037a9a8": "atan2s", + "8037ab88": "atan2f", + "8037abec": "spline_get_weights", + "8037afb8": "anim_spline_init", + "8037afe8": "anim_spline_poll", + "8037b220": "init_scene_graph_node_links", + "8037b24c": "init_graph_node_root", + "8037b30c": "init_graph_node_ortho_projection", + "8037b380": "init_graph_node_perspective", + "8037b448": "init_graph_node_start", + "8037b4ac": "init_graph_node_master_list", + "8037b530": "init_graph_node_render_range", + "8037b5b4": "init_graph_node_switch_case", + "8037b670": "init_graph_node_camera", + "8037b744": "init_graph_node_translation_rotation", + "8037b7f8": "init_graph_node_translation", + "8037b89c": "init_graph_node_rotation", + "8037b940": "init_graph_node_scale", + "8037b9e0": "init_graph_node_object", + "8037bad4": "init_graph_node_culling_radius", + "8037bb48": "init_graph_node_animated_part", + "8037bbec": "init_graph_node_billboard", + "8037bc90": "init_graph_node_display_list", + "8037bd24": "init_graph_node_shadow", + "8037bdb4": "init_graph_node_object_parent", + "8037be28": "init_graph_node_generated", + "8037becc": "init_graph_node_background", + "8037bf84": "init_graph_node_held_object", + "8037c044": "geo_add_child", + "8037c0bc": "geo_remove_child", + "8037c138": "geo_make_first_child", + "8037c1e4": "geo_call_global_function_nodes_helper", + "8037c360": "geo_call_global_function_nodes", + "8037c3d0": "geo_reset_object_node", + "8037c448": "geo_obj_init", + "8037c51c": "geo_obj_init_spawninfo", + "8037c658": "geo_obj_init_animation", + "8037c708": "geo_obj_init_animation_accel", + "8037c7d8": "retrieve_animation_index", + "8037c844": "geo_update_animation_frame", + "8037c9e8": "geo_retreive_animation_translation", + "8037cb10": "geo_find_root", + "8037cb60": "read_vec3s_to_vec3f", + "8037cbc0": "read_vec3s", + "8037cbfc": "read_vec3s_angle", + "8037cc74": "register_scene_graph_node", + "8037cd60": "geo_layout_cmd_branch_and_link", + "8037ce24": "geo_layout_cmd_end", + "8037cee8": "geo_layout_cmd_branch", + "8037cf70": "geo_layout_cmd_return", + "8037cfc0": "geo_layout_cmd_open_node", + "8037d018": "geo_layout_cmd_close_node", + "8037d050": "geo_layout_cmd_assign_as_view", + "8037d0d0": "geo_layout_cmd_update_node_flags", + "8037d1d0": "geo_layout_cmd_node_root", + "8037d328": "geo_layout_cmd_node_ortho_projection", + "8037d3a4": "geo_layout_cmd_node_perspective", + "8037d48c": "geo_layout_cmd_node_start", + "8037d4dc": "geo_layout_cmd_nop3", + "8037d500": "geo_layout_cmd_node_master_list", + "8037d55c": "geo_layout_cmd_node_level_of_detail", + "8037d5d4": "geo_layout_cmd_node_switch_case", + "8037d640": "geo_layout_cmd_node_camera", + "8037d6f0": "geo_layout_cmd_node_translation_rotation", + "8037d8d4": "geo_layout_cmd_node_translation", + "8037d998": "geo_layout_cmd_node_rotation", + "8037da5c": "geo_layout_cmd_node_scale", + "8037db50": "geo_layout_cmd_nop2", + "8037db74": "geo_layout_cmd_node_animated_part", + "8037dc10": "geo_layout_cmd_node_billboard", + "8037dcd4": "geo_layout_cmd_node_display_list", + "8037dd4c": "geo_layout_cmd_node_shadow", + "8037dddc": "geo_layout_cmd_node_object_parent", + "8037de34": "geo_layout_cmd_node_generated", + "8037de94": "geo_layout_cmd_node_background", + "8037def8": "geo_layout_cmd_nop", + "8037df1c": "geo_layout_cmd_copy_view", + "8037dfd4": "geo_layout_cmd_node_held_obj", + "8037e058": "geo_layout_cmd_node_culling_radius", + "8037e0b4": "process_geo_layout", + "803805c8": "level_script_execute", + "80380de8": "f32_find_wall_collision", + "80380e8c": "find_wall_collisions", + "80381264": "find_ceil", + "803814b8": "find_floor_height_and_data", + "80381794": "find_floor_height", + "80381900": "find_floor", + "80381ba0": "find_water_level", + "80381d3c": "find_poison_gas_level", + "80381f08": "debug_surface_list_info", + "80383340": "alloc_surface_pools", + "803833b8": "load_area_terrain", + "803835a4": "clear_dynamic_surfaces", + "803839cc": "load_object_collision_model", + "80383bb0": "RandomU16", + "80383cb4": "RandomFloat", + "80383d1c": "RandomSign", + "80383d68": "func_80383D68", + "80385bf0": "stub_80385BF0", + "80385c00": "cur_object_exec_behavior", + "80385f90": "identityMtx", + "80385fb0": "zeroMtx", + "80385fd0": "gVec3fZero", + "80385fdc": "gVec3sZero", + "80385fe4": "gVec3fOne", + "80385ff0": "gVec3sOne", + "80386000": "gSineTable", + "80387000": "gCosineTable", + "8038b000": "gArctanTable", + "8038b810": "GeoLayoutJumpTable", + "8038b894": "unused_8038B894", + "8038bc90": "_engineSegmentEnd", + "007dfb50": "_engineSegmentRomEnd", + "8038bc90": "_engineSegmentNoloadStart", + "8038bc90": "gSplineKeyframe", + "8038bc94": "gSplineKeyframeFraction", + "8038bc98": "gSplineState", + "8038bca0": "gGraphNodePool", + "8038bca4": "gCurRootGraphNode", + "8038bca8": "D_8038BCA8", + "8038bcac": "gGeoViews", + "8038bcb0": "gGeoNumViews", + "8038bcb8": "gGeoLayoutStack", + "8038bcf8": "gCurGraphNodeList", + "8038bd78": "gCurGraphNodeIndex", + "8038bd7a": "gGeoLayoutStackIndex", + "8038bd7c": "D_8038BD7C", + "8038bd7e": "gGeoLayoutReturnIndex", + "8038bd80": "gGeoLayoutCommand", + "8038bd88": "gObjParentGraphNode", + "8038be30": "sFloorGeo", + "8038be90": "unused8038BE90", + "8038be98": "gStaticSurfacePartition", + "8038d698": "gDynamicSurfacePartition", + "8038ee98": "sSurfaceNodePool", + "8038ee9c": "sSurfacePool", + "8038eea0": "sSurfacePoolSize", + "8038eea8": "unused8038EEA8", + "8038eef0": "_engineSegmentNoloadEnd", + "00000001": "ASSERT", + "8038f800": ".", + "8038f800": "_framebuffersSegmentNoloadStart", + "8038f800": "0x70800", + "8038f800": "gFrameBuffer0", + "803b5000": "gFrameBuffer1", + "803da800": "gFrameBuffer2", + "80400000": "_framebuffersSegmentNoloadEnd", + "80400000": "__expansionRamStart", + "00000001": "ASSERT", + "10000000": "_entrySegmentStart", + "007cc6c0": "_entrySegmentRomStart", + "10000000": "level_script_entry", + "10000030": "_entrySegmentEnd", + "007cc6f0": "_entrySegmentRomEnd", + "02000000": "_segment2_mio0SegmentStart", + "007cc6c0": "_segment2_mio0SegmentRomStart", + "0200bd10": ".", + "0200bd10": "_segment2_mio0SegmentEnd", + "007d83d0": "_segment2_mio0SegmentRomEnd", + "04000000": "_group0_mio0SegmentStart", + "007cc6c0": "_group0_mio0SegmentRomStart", + "04013260": ".", + "04013260": "_group0_mio0SegmentEnd", + "007df920": "_group0_mio0SegmentRomEnd", + "17000000": "_group0_geoSegmentStart", + "007cc6c0": "_group0_geoSegmentRomStart", + "17000000": "bubble_geo", + "1700001c": "purple_marble_geo", + "17000038": "smoke_geo", + "17000084": "burn_smoke_geo", + "1700009c": "spot_on_ground_geo", + "170000e0": "mario_TODO_geo_0000E0", + "17000124": "water_waves_surface_geo", + "17000168": "water_waves_geo", + "170001bc": "sparkles_geo", + "17000230": "water_splash_geo", + "17000284": "sparkles_animation_geo", + "170002e0": "mario_geo_face_and_wings", + "1700041c": "mario_geo_left_hand", + "17000494": "mario_geo_right_hand", + "1700053c": "mario_geo_body", + "170006f8": "mario_geo_medium_poly_left_hand", + "17000770": "mario_geo_medium_poly_right_hand", + "17000818": "mario_geo_medium_poly_body", + "170009d4": "mario_geo_low_poly_face_and_wings", + "17000b10": "mario_geo_low_poly_left_hand", + "17000b88": "mario_geo_low_poly_right_hand", + "17000c30": "mario_geo_low_poly_body", + "17000dec": "mario_vanish_geo_face_and_wings", + "17000f28": "mario_vanish_geo_left_hand", + "17000fa0": "mario_vanish_geo_right_hand", + "17001048": "mario_vanish_geo_body", + "17001204": "mario_vanish_geo_medium_poly_left_hand", + "1700127c": "mario_vanish_geo_medium_poly_right_hand", + "17001324": "mario_vanish_geo_medium_poly_body", + "170014e0": "mario_vanish_geo_low_poly_face_and_wings", + "1700161c": "mario_vanish_geo_low_poly_left_hand", + "17001694": "mario_vanish_geo_low_poly_right_hand", + "1700173c": "mario_vanish_geo_low_poly_body", + "170018f8": "mario_metal_geo_face_and_wings", + "170019a4": "mario_metal_geo_left_hand", + "17001a1c": "mario_metal_geo_right_hand", + "17001ac4": "mario_metal_geo_body", + "17001c80": "mario_metal_geo_medium_poly_left_hand", + "17001cf8": "mario_metal_geo_medium_poly_right_hand", + "17001da0": "mario_metal_geo_medium_poly_body", + "17001f5c": "mario_metal_geo_low_poly_face_and_wings", + "17002008": "mario_metal_geo_low_poly_left_hand", + "17002080": "mario_metal_geo_low_poly_right_hand", + "17002128": "mario_metal_geo_low_poly_body", + "170022e4": "mario_metal_vanish_geo_face_and_wings", + "17002390": "mario_metal_vanish_geo_left_hand", + "17002408": "mario_metal_vanish_geo_right_hand", + "170024b0": "mario_metal_vanish_geo_body", + "1700266c": "mario_metal_vanish_geo_medium_poly_left_hand", + "170026e4": "mario_metal_vanish_geo_medium_poly_right_hand", + "1700278c": "mario_metal_vanish_geo_medium_poly_body", + "17002958": "mario_metal_vanish_geo_low_poly_face_and_wings", + "17002a04": "mario_metal_vanish_geo_low_poly_left_hand", + "17002a7c": "mario_metal_vanish_geo_low_poly_right_hand", + "17002b24": "mario_metal_vanish_geo_low_poly_body", + "17002ce0": "mario_geo_load_body", + "17002d14": "mario_geo_load_medium_poly_body", + "17002d48": "mario_geo_load_low_poly_body", + "17002d7c": "mario_geo_render_body", + "17002dd4": "mario_geo", + "17002e30": "_group0_geoSegmentEnd", + "007cf4f0": "_group0_geoSegmentRomEnd", + "05000000": "_group1_mio0SegmentStart", + "007cc6c0": "_group1_mio0SegmentRomStart", + "05008070": ".", + "05008070": "_group1_mio0SegmentEnd", + "007d4730": "_group1_mio0SegmentRomEnd", + "0c000000": "_group1_geoSegmentStart", + "007cc6c0": "_group1_geoSegmentRomStart", + "0c000000": "yellow_sphere_geo", + "0c000018": "hoot_geo", + "0c0001e4": "yoshi_egg_geo", + "0c000248": "thwomp_geo", + "0c000264": "bullet_bill_geo", + "0c00028c": "heave_ho_geo", + "0c000410": "_group1_geoSegmentEnd", + "007ccad0": "_group1_geoSegmentRomEnd", + "05000000": "_group2_mio0SegmentStart", + "007cc6c0": "_group2_mio0SegmentRomStart", + "05001e10": ".", + "05001e10": "_group2_mio0SegmentEnd", + "007ce4d0": "_group2_mio0SegmentRomEnd", + "0c000000": "_group2_geoSegmentStart", + "007cc6c0": "_group2_geoSegmentRomStart", + "0c000000": "bully_geo", + "0c000120": "bully_boss_geo", + "0c000240": "blargg_geo", + "0c0002b0": "_group2_geoSegmentEnd", + "007cc970": "_group2_geoSegmentRomEnd", + "05000000": "_group3_mio0SegmentStart", + "007cc6c0": "_group3_mio0SegmentRomStart", + "050068b0": ".", + "050068b0": "_group3_mio0SegmentEnd", + "007d2f70": "_group3_mio0SegmentRomEnd", + "0c000000": "_group3_geoSegmentStart", + "007cc6c0": "_group3_geoSegmentRomStart", + "0c000000": "king_bobomb_geo", + "0c000308": "water_bomb_geo", + "0c000328": "water_bomb_shadow_geo", + "0c000340": "_group3_geoSegmentEnd", + "007cca00": "_group3_geoSegmentRomEnd", + "05000000": "_group4_mio0SegmentStart", + "007cc6c0": "_group4_mio0SegmentRomStart", + "0500a300": ".", + "0500a300": "_group4_mio0SegmentEnd", + "007d69c0": "_group4_mio0SegmentRomEnd", + "0c000000": "_group4_geoSegmentStart", + "007cc6c0": "_group4_geoSegmentRomStart", + "0c000000": "clam_shell_geo", + "0c000068": "sushi_geo", + "0c00010c": "unagi_geo", + "0c000280": "_group4_geoSegmentEnd", + "007cc940": "_group4_geoSegmentRomEnd", + "05000000": "_group5_mio0SegmentStart", + "007cc6c0": "_group5_mio0SegmentRomStart", + "0500bce0": ".", + "0500bce0": "_group5_mio0SegmentEnd", + "007d83a0": "_group5_mio0SegmentRomEnd", + "0c000000": "_group5_geoSegmentStart", + "007cc6c0": "_group5_geoSegmentRomStart", + "0c000000": "klepto_geo", + "0c0002ac": "eyerok_geo_0002AC", + "0c0005a8": "eyerok_left_hand_geo", + "0c0005e4": "eyerok_right_hand_geo", + "0c000610": "pokey_head_geo", + "0c000644": "pokey_body_part_geo", + "0c000660": "_group5_geoSegmentEnd", + "007ccd20": "_group5_geoSegmentRomEnd", + "05000000": "_group6_mio0SegmentStart", + "007cc6c0": "_group6_mio0SegmentRomStart", + "0500e110": ".", + "0500e110": "_group6_mio0SegmentEnd", + "007da7d0": "_group6_mio0SegmentRomEnd", + "0c000000": "_group6_geoSegmentStart", + "007cc6c0": "_group6_geoSegmentRomStart", + "0c000000": "monty_mole_geo", + "0c000110": "ukiki_geo", + "0c00036c": "fwoosh_geo", + "0c000390": "_group6_geoSegmentEnd", + "007cca50": "_group6_geoSegmentRomEnd", + "05000000": "_group7_mio0SegmentStart", + "007cc6c0": "_group7_mio0SegmentRomStart", + "05005070": ".", + "05005070": "_group7_mio0SegmentEnd", + "007d1730": "_group7_mio0SegmentRomEnd", + "0c000000": "_group7_geoSegmentStart", + "007cc6c0": "_group7_geoSegmentRomStart", + "0c000000": "spindrift_geo", + "0c000104": "penguin_geo", + "0c00021c": "mr_blizzard_hidden_geo", + "0c000348": "mr_blizzard_geo", + "0c000370": "_group7_geoSegmentEnd", + "007cca30": "_group7_geoSegmentRomEnd", + "05000000": "_group8_mio0SegmentStart", + "007cc6c0": "_group8_mio0SegmentRomStart", + "05001180": ".", + "05001180": "_group8_mio0SegmentEnd", + "007cd840": "_group8_mio0SegmentRomEnd", + "0c000000": "_group8_geoSegmentStart", + "007cc6c0": "_group8_geoSegmentRomStart", + "0c000000": "springboard_top_geo", + "0c000018": "springboard_spring_geo", + "0c000030": "springboard_bottom_geo", + "0c000048": "cap_switch_geo", + "0c000090": "_group8_geoSegmentEnd", + "007cc750": "_group8_geoSegmentRomEnd", + "05000000": "_group9_mio0SegmentStart", + "007cc6c0": "_group9_mio0SegmentRomStart", + "05006960": ".", + "05006960": "_group9_mio0SegmentEnd", + "007d3020": "_group9_mio0SegmentRomEnd", + "0c000000": "_group9_geoSegmentStart", + "007cc6c0": "_group9_geoSegmentRomStart", + "0c000000": "bookend_part_geo", + "0c0000c0": "bookend_geo", + "0c0000d8": "haunted_chair_geo", + "0c000188": "small_key_geo", + "0c0001b4": "mad_piano_geo", + "0c000224": "boo_geo", + "0c000274": "haunted_cage_geo", + "0c0002b0": "_group9_geoSegmentEnd", + "007cc970": "_group9_geoSegmentRomEnd", + "05000000": "_group10_mio0SegmentStart", + "007cc6c0": "_group10_mio0SegmentRomStart", + "05012cd0": ".", + "05012cd0": "_group10_mio0SegmentEnd", + "007df390": "_group10_mio0SegmentRomEnd", + "0c000000": "_group10_geoSegmentStart", + "007cc6c0": "_group10_geoSegmentRomStart", + "0c000000": "birds_geo", + "0c000098": "peach_geo_000098", + "0c000254": "peach_geo_000254", + "0c000410": "peach_geo", + "0c000468": "yoshi_geo", + "0c000670": "_group10_geoSegmentEnd", + "007ccd30": "_group10_geoSegmentRomEnd", + "05000000": "_group11_mio0SegmentStart", + "007cc6c0": "_group11_mio0SegmentRomStart", + "050073f0": ".", + "050073f0": "_group11_mio0SegmentEnd", + "007d3ab0": "_group11_mio0SegmentRomEnd", + "0c000000": "_group11_geoSegmentStart", + "007cc6c0": "_group11_geoSegmentRomStart", + "0c000000": "bubba_geo", + "0c000030": "wiggler_head_geo", + "0c0001bc": "enemy_lakitu_geo", + "0c000290": "spiny_ball_geo", + "0c000328": "spiny_geo", + "0c0004a0": "_group11_geoSegmentEnd", + "007ccb60": "_group11_geoSegmentRomEnd", + "06000000": "_group12_mio0SegmentStart", + "007cc6c0": "_group12_mio0SegmentRomStart", + "06030c30": ".", + "06030c30": "_group12_mio0SegmentEnd", + "007fd2f0": "_group12_mio0SegmentRomEnd", + "0d000000": "_group12_geoSegmentStart", + "007cc6c0": "_group12_geoSegmentRomStart", + "0d000000": "bowser_flames_geo", + "0d000090": "invisible_bowser_accessory_geo", + "0d0000b0": "bowser_1_yellow_sphere_geo", + "0d0000d8": "bowser_geo_0000D8", + "0d000424": "bowser_geo_000424", + "0d000770": "bowser_geo_000770", + "0d000ab8": "bowser_shadow_geo", + "0d000ac4": "bowser_geo", + "0d000b40": "bowser2_geo", + "0d000bbc": "bowser_bomb_geo", + "0d000bfc": "bowser_impact_smoke_geo", + "0d000c50": "_group12_geoSegmentEnd", + "007cd310": "_group12_geoSegmentRomEnd", + "06000000": "_group13_mio0SegmentStart", + "007cc6c0": "_group13_mio0SegmentRomStart", + "0600a0f0": ".", + "0600a0f0": "_group13_mio0SegmentEnd", + "007d67b0": "_group13_mio0SegmentRomEnd", + "0d000000": "_group13_geoSegmentStart", + "007cc6c0": "_group13_geoSegmentRomStart", + "0d000000": "skeeter_geo", + "0d000284": "seaweed_geo", + "0d0002f4": "water_mine_geo", + "0d000324": "cyan_fish_geo", + "0d00038c": "bub_geo", + "0d000414": "water_ring_geo", + "0d000450": "treasure_chest_base_geo", + "0d000468": "treasure_chest_lid_geo", + "0d000480": "_group13_geoSegmentEnd", + "007ccb40": "_group13_geoSegmentRomEnd", + "06000000": "_group14_mio0SegmentStart", + "007cc6c0": "_group14_mio0SegmentRomStart", + "06013a60": ".", + "06013a60": "_group14_mio0SegmentEnd", + "007e0120": "_group14_mio0SegmentRomEnd", + "0d000000": "_group14_geoSegmentStart", + "007cc6c0": "_group14_geoSegmentRomStart", + "0d000000": "koopa_flag_geo", + "0d0000b8": "wooden_post_geo", + "0d0000d0": "koopa_without_shell_geo", + "0d000214": "koopa_with_shell_geo", + "0d000358": "piranha_plant_geo", + "0d000480": "whomp_geo", + "0d0005d0": "metallic_ball_geo", + "0d0005ec": "chain_chomp_geo", + "0d000680": "_group14_geoSegmentEnd", + "007ccd40": "_group14_geoSegmentRomEnd", + "06000000": "_group15_mio0SegmentStart", + "007cc6c0": "_group15_mio0SegmentRomStart", + "0600c8e0": ".", + "0600c8e0": "_group15_mio0SegmentEnd", + "007d8fa0": "_group15_mio0SegmentRomEnd", + "0d000000": "_group15_geoSegmentStart", + "007cc6c0": "_group15_geoSegmentRomStart", + "0d000000": "lakitu_geo", + "0d000114": "toad_geo_000114", + "0d00027c": "toad_geo_00027C", + "0d0003e4": "toad_geo", + "0d000448": "mips_geo", + "0d0005b0": "boo_castle_geo", + "0d000600": "_group15_geoSegmentEnd", + "007cccc0": "_group15_geoSegmentRomEnd", + "06000000": "_group16_mio0SegmentStart", + "007cc6c0": "_group16_mio0SegmentRomStart", + "06002ba0": ".", + "06002ba0": "_group16_mio0SegmentEnd", + "007cf260": "_group16_mio0SegmentRomEnd", + "0d000000": "_group16_geoSegmentStart", + "007cc6c0": "_group16_geoSegmentRomStart", + "0d000000": "moneybag_geo_000000", + "0d000078": "moneybag_geo_000078", + "0d0000f0": "moneybag_geo", + "0d000150": "_group16_geoSegmentEnd", + "007cc810": "_group16_geoSegmentRomEnd", + "06000000": "_group17_mio0SegmentStart", + "007cc6c0": "_group17_mio0SegmentRomStart", + "06009c50": ".", + "06009c50": "_group17_mio0SegmentEnd", + "007d6310": "_group17_mio0SegmentRomEnd", + "0d000000": "_group17_geoSegmentStart", + "007cc6c0": "_group17_geoSegmentRomStart", + "0d000000": "mr_i_geo", + "0d00001c": "mr_i_iris_geo", + "0d0000dc": "swoop_geo", + "0d0001a0": "snufit_geo", + "0d000230": "dorrie_geo", + "0d000394": "scuttlebug_geo", + "0d0006d0": "_group17_geoSegmentEnd", + "007ccd90": "_group17_geoSegmentRomEnd", + "08000000": "_common0_mio0SegmentStart", + "007cc6c0": "_common0_mio0SegmentRomStart", + "0800e6d0": ".", + "0800e6d0": "_common0_mio0SegmentEnd", + "007dad90": "_common0_mio0SegmentRomEnd", + "0f000000": "_common0_geoSegmentStart", + "007cc6c0": "_common0_geoSegmentRomStart", + "0f000000": "blue_coin_switch_geo", + "0f000020": "test_platform_geo", + "0f000028": "amp_geo", + "0f0001a8": "cannon_base_geo", + "0f0001c0": "cannon_barrel_geo", + "0f0001d8": "chuckya_geo", + "0f0004cc": "purple_switch_geo", + "0f0004e4": "checkerboard_platform_geo", + "0f0004fc": "heart_geo", + "0f000518": "flyguy_geo", + "0f0005d0": "breakable_box_geo", + "0f000610": "breakable_box_small_geo", + "0f000640": "bowling_ball_geo", + "0f00066c": "bowling_ball_track_geo", + "0f000694": "exclamation_box_geo", + "0f0006e4": "goomba_geo", + "0f0007b8": "black_bobomb_geo", + "0f0008f4": "bobomb_buddy_geo", + "0f000a30": "metal_box_geo", + "0f000a58": "exclamation_box_outline_geo", + "0f000ab0": "koopa_shell_geo", + "0f000adc": "koopa_shell2_geo", + "0f000b08": "koopa_shell3_geo", + "0f000b40": "_common0_geoSegmentEnd", + "007cd200": "_common0_geoSegmentRomEnd", + "03000000": "_common1_mio0SegmentStart", + "007cc6c0": "_common1_mio0SegmentRomStart", + "03017990": ".", + "03017990": "_common1_mio0SegmentEnd", + "007e4050": "_common1_mio0SegmentRomEnd", + "16000000": "_common1_geoSegmentStart", + "007cc6c0": "_common1_geoSegmentRomStart", + "16000000": "mist_geo", + "16000020": "white_puff_geo", + "16000040": "explosion_geo", + "160000a8": "butterfly_geo", + "1600013c": "yellow_coin_geo", + "160001a0": "yellow_coin_no_shadow_geo", + "16000200": "blue_coin_geo", + "16000264": "blue_coin_no_shadow_geo", + "160002c4": "red_coin_geo", + "16000328": "red_coin_no_shadow_geo", + "16000388": "warp_pipe_geo", + "160003a8": "castle_door_geo", + "1600043c": "cabin_door_geo", + "160004d0": "wooden_door_geo", + "16000564": "wooden_door2_geo", + "160005f8": "metal_door_geo", + "1600068c": "hazy_maze_door_geo", + "16000720": "haunted_door_geo", + "160007b4": "castle_door_0_star_geo", + "16000868": "castle_door_1_star_geo", + "1600091c": "castle_door_3_stars_geo", + "160009d0": "key_door_geo", + "16000a84": "bowser_key_geo", + "16000ab0": "bowser_key_cutscene_geo", + "16000b10": "red_flame_shadow_geo", + "16000b2c": "red_flame_geo", + "16000b8c": "blue_flame_geo", + "16000bec": "fish_shadow_geo", + "16000c44": "fish_geo", + "16000c8c": "leaves_geo", + "16000ca4": "marios_cap_geo", + "16000cf0": "marios_metal_cap_geo", + "16000d3c": "marios_wing_cap_geo", + "16000da8": "marios_winged_metal_cap_geo", + "16000e14": "number_geo", + "16000e84": "mushroom_1up_geo", + "16000ea0": "star_geo", + "16000ed4": "dirt_animation_geo", + "16000f24": "cartoon_star_geo", + "16000f6c": "transparent_star_geo", + "16000f98": "white_particle_geo", + "16000fb4": "wooden_signpost_geo", + "16000fe8": "bubbly_tree_geo", + "16001000": "spiky_tree_geo", + "16001018": "snow_tree_geo", + "16001030": "spiky_tree1_geo", + "16001048": "palm_tree_geo", + "16001060": "_common1_geoSegmentEnd", + "007cd720": "_common1_geoSegmentRomEnd", + "13000000": "_behaviorSegmentStart", + "007cc6c0": "_behaviorSegmentRomStart", + "13000000": "bhvStarDoor", + "13000054": "bhvMrI", + "1300008c": "bhvMrIBody", + "130000ac": "bhvMrIParticle", + "130000f8": "bhvPurpleParticle", + "13000118": "bhvGiantPole", + "13000144": "bhvPoleGrabbing", + "13000174": "bhvThiHugeIslandTop", + "13000194": "bhvThiTinyIslandTop", + "130001ac": "bhvCapSwitchBase", + "130001cc": "bhvCapSwitch", + "130001f4": "bhvKingBobomb", + "13000254": "bhvBobombAnchorMario", + "13000278": "bhvBetaChestBottom", + "1300029c": "bhvBetaChestLid", + "130002b8": "bhvBubbleMario", + "130002e4": "bhvBubbleMaybe", + "13000338": "bhvSmallWaterWave", + "13000398": "bhvSmallWaterWave398", + "130003bc": "bhvWaterAirBubble", + "13000400": "bhvSmallParticle", + "13000428": "bhvWaterWaves", + "13000444": "bhvSmallParticleSnow", + "1300046c": "bhvSmallParticleBubbles", + "13000494": "bhvFishGroup", + "130004a8": "bhvCannon", + "130004e4": "bhvCannonBarrel", + "13000500": "bhvCannonBaseUnused", + "13000528": "bhvChuckya", + "13000584": "bhvChuckyaAnchorMario", + "130005a8": "bhvUnused05A8", + "130005b4": "bhvRotatingPlatform", + "130005d8": "bhvTower", + "13000600": "bhvBulletBillCannon", + "13000624": "bhvWfBreakableWallRight", + "13000638": "bhvWfBreakableWallLeft", + "1300066c": "bhvKickableBoard", + "130006a4": "bhvTowerDoor", + "130006d8": "bhvRotatingCounterClockwise", + "130006e0": "bhvWfRotatingWoodenPlatform", + "13000708": "bhvKoopaShellUnderwater", + "13000720": "bhvExitPodiumWarp", + "1300075c": "bhvFadingWarp", + "13000780": "bhvWarp", + "130007a0": "bhvWarpPipe", + "130007dc": "bhvWhitePuffExplosion", + "130007f8": "bhvSpawnedStar", + "1300080c": "bhvUnused080C", + "13000830": "bhvMrIBlueCoin", + "13000888": "bhvCoinInsideBoo", + "130008d0": "bhvCoinFormationSpawn", + "130008ec": "bhvCoinFormation", + "1300090c": "bhvOneCoin", + "1300091c": "bhvYellowCoin", + "13000940": "bhvTemporaryYellowCoin", + "13000964": "bhvThreeCoinsSpawn", + "13000984": "bhvTenCoinsSpawn", + "130009a4": "bhvSingleCoinGetsSpawned", + "130009e0": "bhvCoinSparkles", + "13000a14": "bhvGoldenCoinSparkles", + "13000a34": "bhvWallTinyStarParticle", + "13000a54": "bhvWallTinyStarParticleSpawn", + "13000a78": "bhvPoundTinyStarParticle", + "13000a98": "bhvPoundTinyStarParticleSpawn", + "13000abc": "bhvPunchTinyTriangle", + "13000ad8": "bhvPunchTinyTriangleSpawn", + "13000afc": "bhvDoorWarp", + "13000b0c": "bhvDoor", + "13000b58": "bhvGrindel", + "13000b8c": "bhvThwomp2", + "13000bc8": "bhvThwomp", + "13000c04": "bhvTumblingBridgePlatform", + "13000c28": "bhvWfTumblingBridge", + "13000c44": "bhvBbhTumblingBridge", + "13000c64": "bhvLllTumblingBridge", + "13000c84": "bhvFlame", + "13000cc8": "bhvAnotherElavator", + "13000cfc": "bhvRrElevatorPlatform", + "13000d30": "bhvHmcElevatorPlatform", + "13000d6c": "bhvWaterMist", + "13000d98": "bhvWaterMistSpawn", + "13000db4": "bhvBreakBoxTriangle", + "13000dd8": "bhvWaterMist2", + "13000dfc": "bhvUnused0DFC", + "13000e24": "bhvPoundWhitePuffs", + "13000e3c": "bhvGroundSand", + "13000e58": "bhvGroundSnow", + "13000e70": "bhvWind", + "13000e88": "bhvEndToad", + "13000eac": "bhvEndPeach", + "13000ed0": "bhvUnusedParticleSpawn", + "13000f08": "bhvUkiki", + "13000f14": "bhvUkikiCageChild", + "13000f2c": "bhvUkikiCageStar", + "13000f48": "bhvUkikiCage", + "13000f9c": "bhvBitfsSinkingPlatforms", + "13000fc8": "bhvBitfsSinkingCagePlatform", + "13001000": "bhvDddMovingPole", + "13001030": "bhvBitfsTiltingInvertedPyramid", + "13001064": "bhvSquishablePlatform", + "13001098": "bhvCutOutObject", + "130010a8": "bhvBetaMovingFlamesSpawn", + "130010b8": "bhvBetaMovingFlames", + "130010d8": "bhvRrRotatingBridgePlatform", + "13001108": "bhvFlamethrower", + "13001124": "bhvFlamethrowerFlame", + "13001168": "bhvBouncingFireball", + "13001184": "bhvBouncingFireballFlame", + "130011d0": "bhvBowserShockWave", + "130011ec": "bhvFlameMario", + "13001214": "bhvBlackSmokeMario", + "13001254": "bhvBlackSmokeBowser", + "1300127c": "bhvBlackSmokeUpward", + "13001298": "bhvBetaFishSplashSpawner", + "130012b4": "bhvSpindrift", + "130012f4": "bhvTowerPlatformGroup", + "13001318": "bhvWfSlidingTowerPlatform", + "13001340": "bhvWfElevatorTowerPlatform", + "13001368": "bhvWfSolidTowerPlatform", + "13001390": "bhvSnowLeafParticleSpawn", + "130013a8": "bhvTreeSnow", + "130013c4": "bhvTreeLeaf", + "130013dc": "bhvAnotherTiltingPlatform", + "13001408": "bhvSquarishPathMoving", + "1300142c": "bhvPiranhaPlantBubble", + "13001448": "bhvPiranhaPlantWakingBubbles", + "13001468": "bhvFloorSwitchAnimatesObject", + "13001478": "bhvFloorSwitchGrills", + "13001484": "bhvFloorSwitchHardcodedModel", + "130014ac": "bhvFloorSwitchHiddenObjects", + "130014bc": "bhvHiddenObject", + "130014e0": "bhvBreakableBox", + "13001518": "bhvPushableMetalBox", + "13001548": "bhvHeaveHo", + "130015a4": "bhvHeaveHoThrowMario", + "130015c0": "bhvCcmTouchedStarSpawn", + "130015e4": "bhvUnusedPoundablePlatform", + "13001608": "bhvBetaTrampolineTop", + "13001634": "bhvBetaTrampolineSpring", + "13001650": "bhvJumpingBox", + "1300167c": "bhvBooCage", + "130016ac": "bhvStub", + "130016b8": "bhvIgloo", + "130016e4": "bhvBowserKey", + "13001714": "bhvGrandStar", + "13001744": "bhvBetaBooKey", + "13001778": "bhvAlphaBooKey", + "1300179c": "bhvBulletBill", + "130017f4": "bhvWhitePuffSmoke", + "13001820": "bhvUnused1820", + "13001828": "bhvBowserTailAnchor", + "13001850": "bhvBowser", + "130018cc": "bhvBowserBodyAnchor", + "13001904": "bhvBowserFlameSpawn", + "13001920": "bhvTiltingBowserLavaPlatform", + "13001958": "bhvFallingBowserPlatform", + "13001984": "bhvBlueBowserFlame", + "130019c8": "bhvFlameFloatingLanding", + "13001a0c": "bhvBlueFlamesGroup", + "13001a30": "bhvFlameBouncing", + "13001a74": "bhvFlameMovingForwardGrowing", + "13001aa4": "bhvFlameBowser", + "13001ae8": "bhvFlameLargeBurningOut", + "13001b2c": "bhvBlueFish", + "13001b54": "bhvTankFishGroup", + "13001b70": "bhvCheckerboardElevatorGroup", + "13001b88": "bhvCheckerboardPlatformSub", + "13001bb4": "bhvBowserKeyUnlockDoor", + "13001bd4": "bhvBowserKeyCourseExit", + "13001bf4": "bhvInvisibleObjectsUnderBridge", + "13001c04": "bhvWaterLevelPillar", + "13001c34": "bhvDddWarp", + "13001c58": "bhvMoatGrills", + "13001c7c": "bhvClockMinuteHand", + "13001c8c": "bhvClockHourHand", + "13001cb0": "bhvMacroUkiki", + "13001d0c": "bhvStub1D0C", + "13001d14": "bhvLllRotatingHexagonalPlatform", + "13001d40": "bhvLllSinkingRockBlock", + "13001d70": "bhvStub1D70", + "13001d78": "bhvLllMovingOctagonalMeshPlatform", + "13001da4": "bhvSnowBall", + "13001da8": "bhvLllRotatingBlockWithFireBars", + "13001dcc": "bhvLllRotatingHexFlame", + "13001e04": "bhvLllWoodPiece", + "13001e30": "bhvLllFloatingWoodBridge", + "13001e4c": "bhvVolcanoFlames", + "13001e6c": "bhvLllRotatingHexagonalRing", + "13001e94": "bhvLllSinkingRectangularPlatform", + "13001ec4": "bhvLllSinkingSquarePlatforms", + "13001ef8": "bhvLllTiltingInvertedPyramid", + "13001f30": "bhvUnused1F30", + "13001f3c": "bhvKoopaShell", + "13001f68": "bhvKoopaShellFlame", + "13001f90": "bhvToxBox", + "13001fbc": "bhvPiranhaPlant", + "13002018": "bhvLllHexagonalMesh", + "13002038": "bhvLllBowserPuzzlePiece", + "13002068": "bhvLllBowserPuzzle", + "13002088": "bhvTuxiesMother", + "130020d8": "bhvPenguinBaby", + "130020e0": "bhvUnused20E0", + "130020e8": "bhvSmallPenguin", + "1300213c": "bhvFish2", + "1300214c": "bhvFish3", + "1300215c": "bhvLargeFishGroup", + "13002178": "bhvFishGroup2", + "13002194": "bhvWdwExpressElevator", + "130021c0": "bhvWdwExpressElevatorPlatform", + "130021e4": "bhvChirpChirp", + "130021f4": "bhvChirpChirpUnused", + "1300220c": "bhvBub", + "13002250": "bhvExclamationBox", + "1300227c": "bhvRotatingExclamationMark", + "1300229c": "bhvSoundSpawner", + "130022b8": "bhvRockSolid", + "130022d8": "bhvBowserSubDoor", + "13002308": "bhvBowsersSub", + "13002338": "bhvSushiShark", + "13002388": "bhvSushiSharkCollisionChild", + "130023a4": "bhvJrbSlidingBox", + "130023d0": "bhvShipPart3", + "130023ec": "bhvInSunkenShip3", + "1300241c": "bhvSunkenShipPart", + "1300243c": "bhvUnused243C", + "1300244c": "bhvSunkenShipPart2", + "1300246c": "bhvInSunkenShip", + "13002480": "bhvInSunkenShip2", + "130024ac": "bhvMarioDustGenerator", + "130024dc": "bhvWhitePuff1", + "13002500": "bhvWhitePuff2", + "13002528": "bhvWhitePuffSmoke2", + "13002558": "bhvPurpleSwitchHiddenBoxes", + "13002568": "bhvBlueCoinSwitch", + "13002588": "bhvHiddenBlueCoin", + "130025c0": "bhvOpenableCageDoor", + "130025e0": "bhvOpenableGrill", + "130025f8": "bhvWaterLevelDiamond", + "13002620": "bhvInitializeChangingWaterLevel", + "13002634": "bhvTornadoSandParticle", + "13002650": "bhvTornado", + "13002684": "bhvMerryGoRoundBooManager", + "1300269c": "bhvAnimatedTexture", + "130026d4": "bhvBooInCastle", + "13002710": "bhvBooWithCage", + "13002768": "bhvBalconyBigBoo", + "1300277c": "bhvMerryGoRoundBigBoo", + "13002790": "bhvGhostHuntBigBoo", + "130027d0": "bhvCourtyardBooTriplet", + "130027e4": "bhvBoo", + "130027f4": "bhvMerryGoRoundBoo", + "13002804": "bhvGhostHuntBoo", + "1300286c": "bhvHiddenStaircaseStep", + "13002898": "bhvBooBossSpawnedBridge", + "130028cc": "bhvBbhTiltingTrapPlatform", + "130028fc": "bhvHauntedBookshelf", + "1300292c": "bhvMeshElevator", + "13002968": "bhvMerryGoRound", + "13002998": "bhvPlaysMusicTrackWhenTouched", + "130029b0": "bhvInsideCannon", + "130029b4": "bhvBetaBowserAnchor", + "130029e4": "bhvStaticCheckeredPlatform", + "13002a10": "bhvUnused2A10", + "13002a20": "bhvUnusedFakeStar", + "13002a48": "bhvStaticObject", + "13002a54": "bhvUnused2A54", + "13002a5c": "bhvCastleFloorTrap", + "13002a7c": "bhvFloorTrapInCastle", + "13002aa4": "bhvTree", + "13002ad0": "bhvSparkle", + "13002af0": "bhvSparkleSpawn", + "13002b08": "bhvSpecialTripleJumpSparkles", + "13002b5c": "bhvScuttlebug", + "13002ba0": "bhvScuttlebugSpawn", + "13002bb8": "bhvWhompKingBoss", + "13002bcc": "bhvSmallWhomp", + "13002c14": "bhvWaterSplash", + "13002c60": "bhvWaterDrops", + "13002c7c": "bhvWaterSurfaceWhiteWave", + "13002cb0": "bhvObjectBubbleRipples", + "13002ce0": "bhvSurfaceWaves", + "13002d28": "bhvWaterSurfaceWhiteWave2", + "13002d50": "bhvWavesGenerator", + "13002d7c": "bhvSurfaceWaveShrinking", + "13002db0": "bhvWaterType", + "13002dc0": "bhvWaveTrailOnSurface", + "13002e04": "bhvTinyWhiteWindParticle", + "13002e20": "bhvWindParticle", + "13002e3c": "bhvSnowmanWindBlowing", + "13002e58": "bhvWalkingPenguin", + "13002ea8": "bhvYellowBall", + "13002ec0": "bhvMario", + "13002ef8": "bhvToadMessage", + "13002f40": "bhvUnlockDoorStar", + "13002f60": "bhvWarps60", + "13002f64": "bhvWarps64", + "13002f68": "bhvWarps68", + "13002f6c": "bhvWarps6C", + "13002f70": "bhvWarps70", + "13002f74": "bhvWarps74", + "13002f78": "bhvWarps78", + "13002f7c": "bhvWarps7C", + "13002f80": "bhvWarps80", + "13002f84": "bhvWarps84", + "13002f88": "bhvWarps88", + "13002f8c": "bhvWarps8C", + "13002f90": "bhvWarps90", + "13002f94": "bhvWarps94", + "13002fa0": "bhvRandomAnimatedTexture", + "13002fc0": "bhvYellowBackgroundInMenu", + "13002fe4": "bhvMenuButton", + "13003008": "bhvMenuButtonManager", + "1300302c": "bhvActSelectorStarType", + "13003048": "bhvActSelector", + "13003068": "bhvMovingYellowCoin", + "130030a4": "bhvMovingBlueCoin", + "130030d4": "bhvBlueCoinSliding", + "13003104": "bhvBlueCoinJumping", + "13003134": "bhvSeaweed", + "13003158": "bhvSeaweedBundle", + "13003174": "bhvBobomb", + "130031ac": "bhvBobombFuseSmoke", + "130031dc": "bhvBobombBuddy", + "13003228": "bhvBobombBuddyOpensCannon", + "13003274": "bhvCannonClosed", + "130032a8": "bhvWhirlpool", + "130032c8": "bhvJetStream", + "130032e0": "bhvMessagePanel", + "13003324": "bhvSignOnWall", + "13003354": "bhvHomingAmp", + "13003388": "bhvCirclingAmp", + "130033bc": "bhvButterfly", + "130033ec": "bhvHoot", + "13003420": "bhvBetaHoldableObject", + "13003454": "bhvCarrySomething1", + "1300345c": "bhvCarrySomething2", + "13003464": "bhvCarrySomething3", + "1300346c": "bhvCarrySomething4", + "13003474": "bhvCarrySomething5", + "1300347c": "bhvCarrySomething6", + "13003484": "bhvObjectBubble", + "130034c4": "bhvObjectWaterWave", + "13003510": "bhvExplosion", + "13003558": "bhvBobombBullyDeathSmoke", + "13003588": "bhvSmoke", + "130035b0": "bhvBobombExplosionBubble", + "13003600": "bhvBobombExplosionBubble3600", + "13003614": "bhvRespawner", + "1300362c": "bhvSmallBully", + "13003660": "bhvBigBully", + "13003694": "bhvBigBullyWithMinions", + "130036c8": "bhvSmallChillBully", + "13003700": "bhvBigChillBully", + "13003738": "bhvJetStreamRingSpawner", + "13003750": "bhvJetStreamWaterRing", + "13003798": "bhvMantaRayWaterRing", + "130037e0": "bhvMantaRayRingManager", + "130037ec": "bhvBowserBomb", + "1300381c": "bhvBowserBombExplosion", + "13003840": "bhvBowserBombSmoke", + "13003868": "bhvCelebrationStar", + "13003888": "bhvCelebrationStarSparkle", + "130038b0": "bhvStarKeyCollectionPuffSpawner", + "130038d0": "bhvLllDrawbridgeSpawner", + "130038e8": "bhvLllDrawbridge", + "13003910": "bhvSmallBomp", + "13003940": "bhvLargeBomp", + "13003970": "bhvWfSlidingPlatform", + "130039a0": "bhvMoneybag", + "130039d4": "bhvMoneybagHidden", + "13003a08": "bhvPitBowlingBall", + "13003a30": "bhvFreeBowlingBall", + "13003a58": "bhvBowlingBall", + "13003a80": "bhvTtmBowlingBallSpawner", + "13003aa4": "bhvBobBowlingBallSpawner", + "13003ac8": "bhvThiBowlingBallSpawner", + "13003ae0": "bhvRrCruiserWing", + "13003b00": "bhvSpindel", + "13003b30": "bhvSslMovingPyramidWall", + "13003b60": "bhvPyramidElevator", + "13003b98": "bhvPyramidElevatorTrajectoryMarkerBall", + "13003bb4": "bhvPyramidTop", + "13003bec": "bhvPyramidTopFragment", + "13003c0c": "bhvPyramidPillarTouchDetector", + "13003c30": "bhvWaterfallSoundLoop", + "13003c44": "bhvVolcanoSoundLoop", + "13003c58": "bhvCastleFlagWaving", + "13003c7c": "bhvBirdsSoundLoop", + "13003c90": "bhvAmbientSounds", + "13003ca4": "bhvSandSoundLoop", + "13003cb8": "bhvHiddenAt120Stars", + "13003ce4": "bhvSnowmansBottom", + "13003d0c": "bhvSnowmansHead", + "13003d34": "bhvSnowmansBodyCheckpoint", + "13003d4c": "bhvBigSnowmanWhole", + "13003d74": "bhvBigBoulder", + "13003da0": "bhvBigBoulderGenerator", + "13003db8": "bhvWingCap", + "13003dd8": "bhvMetalCap", + "13003df8": "bhvNormalCap", + "13003e1c": "bhvVanishCap", + "13003e3c": "bhvStar", + "13003e64": "bhvStarSpawnCoordinates", + "13003e8c": "bhvHiddenRedCoinStar", + "13003eac": "bhvRedCoin", + "13003ee4": "bhvBowserCourseRedCoinStar", + "13003efc": "bhvHiddenStar", + "13003f1c": "bhvHiddenStarTrigger", + "13003f40": "bhvTtmRollingLog", + "13003f78": "bhvLllVolcanoFallingTrap", + "13003fa4": "bhvLllRollingLog", + "13003fdc": "bhv1upWalking", + "13004010": "bhv1upRunningAway", + "13004044": "bhv1upSliding", + "1300407c": "bhv1Up", + "130040b4": "bhv1upJumpOnApproach", + "130040ec": "bhvHidden1up", + "13004124": "bhvHidden1upTrigger", + "13004148": "bhvHidden1upInPole", + "13004180": "bhvHidden1upInPoleTrigger", + "130041a4": "bhvHidden1upInPoleSpawner", + "130041bc": "bhvControllablePlatform", + "130041f0": "bhvControllablePlatformSub", + "13004218": "bhvBreakableBoxSmall", + "13004244": "bhvSlidingSnowMound", + "13004270": "bhvSnowMoundSpawn", + "13004284": "bhvWdwSquareFloatingPlatform", + "130042b4": "bhvWdwRectangularFloatingPlatform", + "130042e4": "bhvJrbFloatingPlatform", + "13004314": "bhvArrowLift", + "13004348": "bhvOrangeNumber", + "13004370": "bhvMantaRay", + "130043a0": "bhvFallingPillar", + "130043c4": "bhvFallingPillarHitbox", + "130043e0": "bhvPillarBase", + "13004400": "bhvJrbFloatingBox", + "1300442c": "bhvDecorativePendulum", + "1300444c": "bhvTreasureChestsShip", + "13004470": "bhvTreasureChestsJrb", + "13004494": "bhvTreasureChests", + "130044b8": "bhvTreasureChestBottom", + "130044e0": "bhvTreasureChestTop", + "130044fc": "bhvMips", + "13004538": "bhvYoshi", + "13004580": "bhvKoopa", + "130045d0": "bhvKoopaRaceEndpoint", + "130045f8": "bhvKoopaFlag", + "13004634": "bhvPokey", + "13004668": "bhvPokeyBodyPart", + "13004698": "bhvSwoop", + "130046dc": "bhvFlyGuy", + "1300472c": "bhvGoomba", + "13004770": "bhvGoombaTripletSpawner", + "1300478c": "bhvChainChomp", + "130047e4": "bhvChainChompChainPart", + "1300481c": "bhvWoodenPost", + "13004868": "bhvChainChompGate", + "13004898": "bhvWigglerHead", + "130048e0": "bhvWigglerBody", + "13004918": "bhvEnemyLakitu", + "13004954": "bhvCameraLakitu", + "13004988": "bhvCloud", + "130049ac": "bhvCloudPart", + "130049c8": "bhvSpiny", + "13004a00": "bhvMontyMole", + "13004a58": "bhvMontyMoleHole", + "13004a78": "bhvMontyMoleRock", + "13004ab0": "bhvPlatformOnTrack", + "13004af4": "bhvTrackBall", + "13004b1c": "bhvSeesawPlatform", + "13004b44": "bhvFerrisWheelAxle", + "13004b6c": "bhvFerrisWheelPlatform", + "13004b8c": "bhvWaterBombSpawner", + "13004ba8": "bhvWaterBomb", + "13004bd4": "bhvWaterBombShadow", + "13004bf0": "bhvTTCRotatingSolid", + "13004c24": "bhvTTCPendulum", + "13004c5c": "bhvTTCTreadmill", + "13004c94": "bhvTTCMovingBar", + "13004ccc": "bhvTTCCog", + "13004cf8": "bhvTTCPitBlock", + "13004d28": "bhvTTCElevator", + "13004d64": "bhvTTC2DRotator", + "13004d90": "bhvTTCSpinner", + "13004dbc": "bhvMrBlizzard", + "13004e08": "bhvMrBlizzardSnowball", + "13004e4c": "bhvSlidingPlatform2", + "13004e78": "bhvOctagonalPlatformRotating", + "13004ea0": "bhvAnimatesOnFloorSwitchPress", + "13004ecc": "bhvActivatedBackAndForthPlatform", + "13004ef8": "bhvRecoveryHeart", + "13004f10": "bhvWaterBombCannon", + "13004f28": "bhvCannonBarrelBubbles", + "13004f40": "bhvUnagi", + "13004f78": "bhvUnagiSubobject", + "13004f90": "bhvDorrie", + "13004fd4": "bhvHauntedChair", + "13005024": "bhvMadPiano", + "1300506c": "bhvFlyingBookend", + "130050b4": "bhvBookendSpawn", + "130050d4": "bhvHauntedBookshelfManager", + "130050f4": "bhvBookSwitch", + "13005120": "bhvFirePiranhaPlant", + "13005158": "bhvSmallPiranhaFlame", + "1300518c": "bhvFireSpitter", + "130051ac": "bhvFlyguyFlame", + "130051e0": "bhvSnufit", + "1300521c": "bhvSnufitBalls", + "1300525c": "bhvHorizontalGrindel", + "130052b4": "bhvEyerokBoss", + "130052d0": "bhvEyerokHand", + "13005310": "bhvKlepto", + "13005354": "bhvBird", + "13005380": "bhvRacingPenguin", + "130053c4": "bhvPenguinRaceFinishLine", + "130053dc": "bhvPenguinRaceShortcutCheck", + "130053f4": "bhvCoffinManager", + "13005414": "bhvCoffin", + "13005440": "bhvClamShell", + "13005468": "bhvSkeeter", + "130054a0": "bhvSkeeterWave", + "130054b8": "bhvSwingPlatform", + "130054ec": "bhvDonutPlatformSpawner", + "13005504": "bhvDonutPlatform", + "13005528": "bhvDDDPole", + "1300556c": "bhvRedCoinStarMarker", + "13005598": "bhvTripletButterfly", + "130055dc": "bhvBubba", + "13005610": "bhvBeginningLakitu", + "13005638": "bhvBeginningPeach", + "1300565c": "bhvEndBirds1", + "13005680": "bhvEndBirds2", + "130056a4": "bhvIntroScene", + "130056c0": "_behaviorSegmentEnd", + "007d1d80": "_behaviorSegmentRomEnd", + "8016f000": "_goddardSegmentStart", + "007cc6c0": "_goddardSegmentRomStart", + }, + "Refresh 5": { + "80000300": "osTvType", + "80000308": "osRomBase", + "8000030c": "osResetType", + "80000318": "osMemSize", + "8000031c": "osAppNmiBuffer", + "80000000": "D_80000000", + "a4000000": "D_A4000000", + "a40004c0": "D_A40004C0", + "a4000774": "D_A4000774", + "a4001000": "D_A4001000", + "a4040010": "D_A4040010", + "a4080000": "D_A4080000", + "a4300000": "D_A4300000", + "a4300004": "D_A4300004", + "a4300008": "D_A4300008", + "a430000c": "D_A430000C", + "a4400010": "D_A4400010", + "a450000c": "D_A450000C", + "a4600000": "D_A4600000", + "a4600004": "D_A4600004", + "a460000c": "D_A460000C", + "a4600010": "D_A4600010", + "a4700000": "D_A4700000", + "a4700010": "D_A4700010", + "a4800018": "D_A4800018", + "b0000008": "D_B0000008", + "b0000010": "D_B0000010", + "b0000014": "D_B0000014", + "c0000000": "D_C0000000", + "c0000008": "D_C0000008", + "c000000c": "D_C000000C", + "802ef700": "__osGetCurrFaultedThread", + "00000000": "__romPos", + "04000000": "_bootSegmentStart", + "007cc6c0": "_bootSegmentRomStart", + "04001000": "_bootSegmentEnd", + "007cd6c0": "_bootSegmentRomEnd", + "80000400": ".", + "80000400": "_zbufferSegmentNoloadStart", + "80000400": "0x25800", + "80000400": "gZBuffer", + "80246000": "_mainSegmentStart", + "007cc6c0": "_mainSegmentRomStart", + "80246000": "EntryPoint", + "80246050": "handle_debug_key_sequences", + "80246170": "Unknown80246170", + "802461cc": "Dummy802461CC", + "802461dc": "Dummy802461DC", + "802461ec": "Dummy802461EC", + "802461fc": "setup_mesg_queues", + "802462e0": "AllocPool", + "80246338": "create_thread", + "8024639c": "handle_nmi_request", + "802463ec": "receive_new_tasks", + "8024651c": "start_sptask", + "8024659c": "interrupt_gfx_sptask", + "802465ec": "start_gfx_sptask", + "80246648": "pretend_audio_sptask_done", + "8024669c": "handle_vblank", + "802467fc": "handle_sp_complete", + "8024694c": "handle_dp_complete", + "802469b8": "thread3_main", + "80246b14": "set_vblank_handler", + "80246b74": "SendMessage", + "80246bb4": "dispatch_audio_sptask", + "80246c10": "send_display_list", + "80246c9c": "turn_on_audio", + "80246cb8": "turn_off_audio", + "80246cf0": "thread1_idle", + "80246df8": "Main", + "80246e70": "my_rdp_init", + "802471a4": "my_rsp_init", + "80247284": "clear_z_buffer", + "802473c8": "display_frame_buffer", + "802474b8": "clear_frame_buffer", + "80247620": "clear_viewport", + "8024784c": "draw_screen_borders", + "802479bc": "make_viewport_clip_rect", + "80247b3c": "create_task_structure", + "80247ccc": "init_render_image", + "80247d14": "end_master_display_list", + "80247db4": "func_80247D84", + "80247f08": "func_80247ED8", + "80247fdc": "func_80247FAC", + "80248090": "display_and_vsync", + "80248304": "adjust_analog_stick", + "80248498": "run_demo_inputs", + "80248638": "read_controller_inputs", + "80248824": "init_controllers", + "80248964": "setup_game_memory", + "80248af0": "thread5_game_loop", + "80248c40": "func_80248C10", + "80248c58": "func_80248C28", + "80248ce8": "func_80248CB8", + "80248d78": "func_80248D48", + "80248dc0": "func_80248D90", + "80248e08": "set_sound_mode", + "80248e54": "play_menu_sounds", + "80248fec": "play_painting_eject_sound", + "80249070": "play_infinite_stairs_music", + "80249178": "set_background_music", + "8024922c": "func_802491FC", + "8024927c": "func_8024924C", + "802492d0": "play_cutscene_music", + "80249310": "play_shell_music", + "8024934c": "stop_shell_music", + "80249398": "play_cap_music", + "80249404": "fadeout_cap_music", + "80249448": "stop_cap_music", + "802494d8": "audio_game_loop_tick", + "80249500": "thread4_sound", + "802495e0": "level_control_timer", + "802496b8": "pressed_paused", + "80249764": "set_play_mode", + "8024978c": "func_8024975C", + "802497b8": "func_80249788", + "8024982c": "nop_802497FC", + "8024983c": "func_8024980C", + "8024995c": "func_8024992C", + "80249a10": "set_mario_initial_cap_powerup", + "80249ab4": "set_mario_initial_action", + "80249cd8": "init_mario_after_warp", + "8024a124": "func_8024A02C", + "8024a18c": "func_8024A094", + "8024a1d8": "func_8024A0E0", + "8024a374": "check_instant_warp", + "8024a584": "func_8024A48C", + "8024a700": "initiate_warp", + "8024a7b4": "get_painting_warp_node", + "8024a85c": "initiate_painting_warp", + "8024a9cc": "level_trigger_warp", + "8024aedc": "initiate_delayed_warp", + "8024b13c": "update_hud_values", + "8024b390": "basic_update", + "8024b3e4": "play_mode_normal", + "8024b5d4": "play_mode_paused", + "8024b6cc": "play_mode_frame_advance", + "8024b798": "level_set_transition", + "8024b7c0": "play_mode_change_area", + "8024b880": "play_mode_change_level", + "8024b9b8": "update_level", + "8024ba8c": "init_level", + "8024bcd8": "lvl_init_or_update", + "8024bd5c": "lvl_init_from_save_file", + "8024be14": "lvl_set_current_level", + "8024bfa0": "lvl_play_the_end_screen_sound", + "8024bff0": "get_mario_cap_flag", + "8024c0b8": "object_facing_mario", + "8024c16c": "mario_angle_to_object", + "8024c1d8": "determine_interaction", + "8024c51c": "attack_object", + "8024c618": "mario_stop_riding_object", + "8024c66c": "mario_grab_used_object", + "8024c6c0": "mario_drop_held_object", + "8024c780": "mario_throw_held_object", + "8024c894": "mario_stop_riding_and_holding", + "8024c8fc": "does_mario_have_hat", + "8024c928": "mario_blow_off_cap", + "8024ca68": "mario_lose_cap_to_enemy", + "8024caf8": "mario_retrieve_cap", + "8024cb58": "able_to_grab_object", + "8024cbfc": "mario_get_collided_object", + "8024cc7c": "mario_check_object_grab", + "8024ce08": "bully_knock_back_mario", + "8024d0b4": "bounce_off_object", + "8024d130": "hit_object_from_below", + "8024d2bc": "determine_knockback_action", + "8024d578": "push_mario_out_of_object", + "8024d72c": "bounce_back_from_attack", + "8024d804": "func_8024D664", + "8024d8b0": "take_damage_from_interact_object", + "8024d998": "take_damage_and_knock_back", + "8024daac": "reset_mario_pitch", + "8024db2c": "interact_coin", + "8024dbf0": "interact_water_ring", + "8024dc28": "interact_star_or_key", + "8024de4c": "interact_bbh_entrance", + "8024df10": "interact_warp", + "8024e0c4": "interact_warp_door", + "8024e2fc": "get_door_save_file_flag", + "8024e420": "interact_door", + "8024e6ec": "interact_cannon_base", + "8024e778": "interact_igloo_barrier", + "8024e7d4": "interact_tornado", + "8024e8f0": "interact_whirlpool", + "8024e9d0": "interact_wind", + "8024ead8": "interact_flame", + "8024ec54": "interact_snufit_bullet", + "8024ed84": "interact_clam_or_bubba", + "8024ee44": "interact_bully", + "8024eff8": "interact_shock", + "8024f170": "interact_mr_blizzard", + "8024f1e0": "interact_hit_from_below", + "8024f354": "interact_bounce_top", + "8024f4ac": "interact_unknown_08", + "8024f55c": "interact_damage", + "8024f5cc": "interact_breakable", + "8024f6a4": "interact_koopa_shell", + "8024f7a8": "check_object_grab_mario", + "8024f8bc": "interact_pole", + "8024fa60": "interact_hoot", + "8024fb30": "interact_cap", + "8024fd2c": "interact_grabbable", + "8024fe6c": "func_8024FC94", + "8024ff04": "func_8024FD2C", + "80250098": "func_8024FEC0", + "80250198": "interact_text", + "80250230": "check_kick_or_punch_wall", + "802503f0": "mario_process_interactions", + "802505c8": "check_death_barrier", + "8025065c": "check_lava_boost", + "80250724": "pss_begin_slide", + "80250778": "pss_end_slide", + "802507fc": "mario_handle_special_floors", + "80250940": "is_anim_at_end", + "8025097c": "is_anim_past_end", + "802509b8": "set_mario_animation", + "80250b04": "set_mario_anim_with_accel", + "80250c7c": "set_anim_to_frame", + "80250d38": "is_anim_past_frame", + "80250e54": "find_mario_anim_flags_and_translation", + "80251020": "update_mario_pos_for_anim", + "802510dc": "return_mario_anim_y_translation", + "80251120": "play_sound_if_no_flag", + "8025118c": "play_mario_jump_sound", + "80251274": "adjust_sound_for_speed", + "80251310": "play_sound_and_spawn_particles", + "80251444": "play_mario_action_sound", + "802514ac": "play_mario_landing_sound", + "80251510": "play_mario_landing_sound_once", + "80251574": "play_mario_heavy_landing_sound", + "802515d8": "play_mario_heavy_landing_sound_once", + "8025163c": "play_mario_sound", + "80251708": "mario_set_forward_vel", + "8025177c": "mario_get_floor_class", + "802518a8": "mario_get_terrain_sound_addend", + "80251a48": "resolve_and_return_wall_collisions", + "80251afc": "vec3f_find_ceil", + "80251b54": "mario_facing_downhill", + "80251bd4": "mario_floor_is_slippery", + "80251cfc": "mario_floor_is_slope", + "80251e24": "mario_floor_is_steep", + "80251f24": "find_floor_height_relative_polar", + "80252000": "find_floor_slope", + "802521a0": "update_mario_sound_and_camera", + "8025229c": "set_steep_jump_action", + "80252cf4": "set_mario_action", + "80252e5c": "set_jump_from_landing", + "802530a0": "set_jumping_action", + "80253178": "drop_and_set_mario_action", + "802531c4": "hurt_and_set_mario_action", + "80253218": "check_common_action_exits", + "80253300": "check_common_hold_action_exits", + "802533e4": "transition_submerged_to_walking", + "80253488": "set_water_plunge_action", + "80253588": "squish_mario_model", + "80253720": "debug_print_speed_action_normal", + "80253838": "update_mario_button_inputs", + "8025395c": "update_mario_joystick_inputs", + "80253a60": "update_mario_geometry_inputs", + "80253d58": "update_mario_inputs", + "80253ec0": "set_submerged_cam_preset_and_spawn_bubbles", + "80254060": "update_mario_health", + "802542b4": "update_mario_info_for_cam", + "80254338": "mario_reset_bodystate", + "80254390": "sink_mario_in_quicksand", + "802543e8": "update_and_return_cap_flags", + "80254588": "mario_update_hitbox_and_cap_model", + "80254830": "execute_mario_action", + "80254b20": "init_mario", + "80254f44": "init_mario_from_save_file", + "80255080": "get_additive_y_vel_for_jumps", + "8025509c": "nop_80254E3C", + "802550b0": "nop_80254E50", + "802550c0": "transfer_bully_speed", + "80255238": "init_bully_collision_data", + "802552fc": "mario_bonk_reflection", + "80255414": "mario_update_quicksand", + "80255654": "mario_push_off_steep_floor", + "8025570c": "mario_update_moving_sand", + "8025580c": "mario_update_windy_ground", + "802559b0": "stop_and_set_height_to_floor", + "80255a34": "stationary_ground_step", + "80255d88": "perform_ground_step", + "80255ec4": "check_ledge_grab", + "802560ac": "perform_air_quarter_step", + "802564e0": "apply_twirl_gravity", + "80256584": "should_strengthen_gravity_for_jump_ascent", + "8025661c": "apply_gravity", + "802569f8": "apply_vertical_wind", + "80256b24": "perform_air_step", + "80256cd8": "set_vel_from_pitch_and_yaw", + "80256d8c": "set_vel_from_yaw", + "80256e00": "get_credits_str_width", + "80256e88": "print_displaying_credits_entry", + "80257060": "BehEndPeachLoop", + "802570dc": "BehEndToadLoop", + "80257198": "geo_switch_peach_eyes", + "802572b0": "get_star_collection_dialog", + "8025733c": "handle_save_menu", + "80257450": "spawn_obj_at_mario_rel_yaw", + "802574e8": "cutscene_take_cap_off", + "80257548": "cutscene_put_cap_on", + "802575a8": "mario_ready_to_speak", + "80257640": "set_mario_npc_dialog", + "80257748": "act_reading_npc_dialog", + "80257980": "act_waiting_for_dialog", + "80257a0c": "act_disappeared", + "80257ab0": "act_reading_automatic_dialog", + "80257ce4": "act_reading_sign", + "80257eac": "act_debug_free_move", + "80258184": "general_star_dance_handler", + "80258420": "act_star_dance", + "802584dc": "act_star_dance_water", + "802585c0": "act_fall_after_star_grab", + "802586cc": "common_death_handler", + "80258744": "act_standing_death", + "802587ec": "act_electrocution", + "8025883c": "act_suffocation", + "8025888c": "act_death_on_back", + "802588f8": "act_death_on_stomach", + "80258964": "act_quicksand_death", + "80258a7c": "act_eaten_by_bubba", + "80258b24": "launch_mario_until_land", + "80258ba8": "act_unlocking_key_door", + "80258dac": "act_unlocking_star_door", + "80258f94": "act_entering_star_door", + "80259264": "act_going_through_door", + "802593cc": "act_warp_door_spawn", + "802594d4": "act_emerge_from_pipe", + "80259608": "act_spawn_spin_airborne", + "80259740": "act_spawn_spin_landing", + "802597ac": "act_exit_airborne", + "80259854": "act_falling_exit_airborne", + "802598d0": "act_exit_land_save_dialog", + "80259c30": "act_death_exit", + "80259ce8": "act_unused_death_exit", + "80259d74": "act_falling_death_exit", + "80259e00": "act_special_exit_airborne", + "80259ef8": "act_special_death_exit", + "80259fcc": "act_spawn_no_spin_airborne", + "8025a040": "act_spawn_no_spin_landing", + "8025a0bc": "act_bbh_enter_spin", + "8025a494": "act_bbh_enter_jump", + "8025a610": "act_teleport_fade_out", + "8025a6fc": "act_teleport_fade_in", + "8025a858": "act_shocked", + "8025a9ac": "act_squished", + "8025ae0c": "act_putting_on_cap", + "8025aea8": "stuck_in_ground_handler", + "8025affc": "act_head_stuck_in_ground", + "8025b050": "act_butt_stuck_in_ground", + "8025b0a4": "act_feet_stuck_in_ground", + "8025d798": "mario_execute_cutscene_action", + "8025dd70": "add_tree_leaf_particles", + "8025de1c": "play_climbing_sounds", + "8025df04": "set_pole_position", + "8025e21c": "act_holding_pole", + "8025e5a8": "act_climbing_pole", + "8025e7a4": "act_grab_pole_slow", + "8025e830": "act_grab_pole_fast", + "8025e930": "act_top_of_pole_transition", + "8025ea30": "act_top_of_pole", + "8025eb50": "perform_hanging_step", + "8025ecfc": "update_hang_moving", + "8025eed0": "update_hang_stationary", + "8025ef58": "act_start_hanging", + "8025f0b4": "act_hanging", + "8025f1e4": "act_hang_moving", + "8025f384": "let_go_of_ledge", + "8025f4b4": "func_8025F0DC", + "8025f560": "func_8025F188", + "8025f644": "update_ledge_climb", + "8025f6c0": "act_ledge_grab", + "8025f970": "act_ledge_climb_slow", + "8025fa64": "act_ledge_climb_down", + "8025fae8": "act_ledge_climb_fast", + "8025fb90": "act_grabbed", + "8025fc6c": "act_in_cannon", + "80260154": "act_tornado_twirling", + "80260568": "check_common_automatic_cancels", + "802605d0": "mario_execute_automatic_action", + "802608b0": "func_802604E0", + "80260aac": "func_802606DC", + "80260cb4": "act_idle", + "80260f94": "func_80260BC4", + "80261000": "act_start_sleeping", + "80261268": "act_sleeping", + "802614fc": "act_waking_up", + "8026168c": "act_shivering", + "802618d8": "act_coughing", + "802619d0": "act_hold_idle", + "80261ad0": "act_hold_heavy_idle", + "80261bf8": "act_standing_against_wall", + "80261cec": "act_in_quicksand", + "80261db4": "act_crouching", + "80261f70": "act_panting", + "80262080": "act_hold_panting_unused", + "8026217c": "func_80261D70", + "802621dc": "act_braking_stop", + "802622dc": "act_butt_slide_stop", + "80262398": "func_80261F8C", + "80262490": "act_slide_kick_slide_stop", + "80262530": "act_start_crouching", + "80262650": "act_stop_crouching", + "80262770": "act_start_crawling", + "80262890": "act_stop_crawling", + "80262980": "func_80262574", + "80262bc4": "func_802627B8", + "80262c34": "func_80262828", + "80262d68": "act_jump_land_stop", + "80262dc4": "act_double_jump_land_stop", + "80262e20": "act_side_flip_land_stop", + "80262e94": "act_freefall_land_stop", + "80262ef0": "act_triple_jump_land_stop", + "80262f50": "act_backflip_land_stop", + "80262fec": "act_lava_boost_land", + "8026305c": "act_long_jump_land_stop", + "802630f8": "func_80262CEC", + "802631f0": "func_80262DE4", + "802632e8": "act_air_throw_land", + "802633b4": "act_twirl_land", + "8026350c": "act_ground_pound_land", + "802635e8": "act_first_person", + "80263784": "func_80263378", + "80263898": "mario_execute_stationary_action", + "80263e60": "func_80263A50", + "80263ee4": "func_80263AD4", + "80264024": "func_80263C14", + "8026409c": "begin_walking_action", + "802640fc": "check_ledge_climb_down", + "802642b4": "slide_bonk", + "80264340": "set_triple_jump_action", + "8026440c": "update_sliding_angle", + "80264740": "update_sliding", + "80264b54": "apply_slope_accel", + "80264d80": "apply_landing_accel", + "80264e18": "update_shell_speed", + "80265080": "apply_slope_decel", + "802651b0": "update_decelerating_speed", + "80265244": "update_walking_speed", + "80265458": "should_begin_sliding", + "80265514": "analog_stick_held_back", + "80265558": "check_ground_dive_or_punch", + "80265620": "begin_braking_action", + "80265700": "func_802652F0", + "80265b1c": "func_8026570C", + "80265d90": "func_80265980", + "80265df8": "func_802659E8", + "80266038": "func_80265C28", + "802661cc": "func_80265DBC", + "80266354": "act_walking", + "802665b4": "act_move_punching", + "80266734": "act_hold_walking", + "8026699c": "act_hold_heavy_walking", + "80266af8": "act_turning_around", + "80266d4c": "act_finish_turning_around", + "80266e48": "act_braking", + "80266fc8": "act_decelerating", + "80267240": "act_hold_decelerating", + "80267504": "act_riding_shell_ground", + "80267728": "act_crawling", + "8026795c": "act_burning_ground", + "80267c24": "func_80267814", + "80267ce4": "common_slide_action", + "80267fa4": "common_slide_action_with_jump", + "80268074": "act_butt_slide", + "802680d4": "act_hold_butt_slide", + "80268168": "act_crouch_slide", + "80268338": "act_slide_kick_slide", + "802684ac": "stomach_slide_action", + "802685c0": "act_stomach_slide", + "80268608": "act_hold_stomach_slide", + "80268684": "act_dive_slide", + "802687b8": "common_ground_knockback_action", + "802689f8": "act_hard_backward_ground_kb", + "80268adc": "act_hard_forward_ground_kb", + "80268b64": "act_backward_ground_kb", + "80268bb0": "act_forward_ground_kb", + "80268bfc": "act_soft_backward_ground_kb", + "80268c48": "act_soft_forward_ground_kb", + "80268c94": "act_ground_bonk", + "80268d04": "act_death_exit_land", + "80268dcc": "common_landing_action", + "80268f78": "common_landing_cancels", + "80269108": "act_jump_land", + "80269170": "act_freefall_land", + "802691d8": "act_side_flip_land", + "80269264": "act_hold_jump_land", + "80269300": "act_hold_freefall_land", + "8026939c": "act_long_jump_land", + "8026947c": "act_double_jump_land", + "802694e4": "act_triple_jump_land", + "80269588": "act_backflip_land", + "80269640": "quicksand_jump_land_action", + "80269788": "act_quicksand_jump_land", + "802697dc": "act_hold_quicksand_jump_land", + "80269830": "check_common_moving_cancels", + "80269954": "mario_execute_moving_action", + "80269f40": "play_flip_sounds", + "80269fc0": "play_far_fall_sound", + "8026a090": "func_u_8026A090", + "8026a12c": "lava_boost_on_wall", + "8026a224": "check_fall_damage", + "8026a400": "check_kick_or_dive_in_air", + "8026a494": "should_get_stuck_in_ground", + "8026a598": "check_fall_damage_or_get_stuck", + "8026a62c": "check_horizontal_wind", + "8026a818": "update_air_with_turn", + "8026aa48": "update_air_without_turn", + "8026acd8": "update_lava_boost_or_twirling", + "8026ae5c": "update_flying_yaw", + "8026b004": "update_flying_pitch", + "8026b17c": "update_flying", + "8026b444": "common_air_action_step", + "8026b6a0": "act_jump", + "8026b740": "act_double_jump", + "8026b814": "act_triple_jump", + "8026b90c": "act_backflip", + "8026b9ac": "act_freefall", + "8026bab8": "act_hold_jump", + "8026bbb4": "act_hold_freefall", + "8026bcc0": "act_side_flip", + "8026bdcc": "act_wall_kick_air", + "8026be78": "act_long_jump", + "8026bf40": "act_riding_shell_air", + "8026c034": "act_twirling", + "8026c1e0": "act_dive", + "8026c4b8": "act_air_throw", + "8026c5d0": "act_water_jump", + "8026c738": "act_hold_water_jump", + "8026c880": "act_steep_jump", + "8026c9fc": "act_ground_pound", + "8026cd0c": "act_burning_jump", + "8026ce50": "act_burning_fall", + "8026cf28": "act_crazy_box_bounce", + "8026d1b0": "common_air_knockback_step", + "8026d33c": "func_8026CDFC", + "8026d3c8": "act_backward_air_kb", + "8026d43c": "act_forward_air_kb", + "8026d4b0": "act_hard_backward_air_kb", + "8026d508": "act_hard_forward_air_kb", + "8026d560": "act_thrown_backward", + "8026d608": "act_thrown_forward", + "8026d6fc": "act_soft_bonk", + "8026d770": "act_getting_blown", + "8026d988": "act_air_hit_wall", + "8026db54": "act_forward_rollout", + "8026dcf4": "act_backward_rollout", + "8026de98": "act_butt_slide_air", + "8026e088": "act_hold_butt_slide_air", + "8026e2b4": "act_lava_boost", + "8026e59c": "act_slide_kick", + "8026e810": "act_jump_kick", + "8026e968": "act_shot_from_cannon", + "8026ec00": "act_flying", + "8026f158": "act_riding_hoot", + "8026f2ec": "act_flying_triple_jump", + "8026f614": "act_top_of_pole_jump", + "8026f660": "act_vertical_wind", + "8026f840": "act_special_triple_jump", + "8026fa18": "check_common_airborne_cancels", + "8026fb04": "mario_execute_airborne_action", + "8027499c": "mario_execute_submerged_action", + "80274eb0": "animated_stationary_ground_step", + "80274f10": "mario_update_punch_sequence", + "80275328": "act_punching", + "8027546c": "act_picking_up", + "802755fc": "act_dive_picking_up", + "802756c8": "act_placing_down", + "80275794": "act_throwing", + "802758c0": "act_heavy_throw", + "802759b4": "act_stomach_slide_stop", + "80275a80": "act_picking_up_bowser", + "80275b34": "act_holding_bowser", + "80275e78": "act_releasing_bowser", + "80275f0c": "check_common_object_cancels", + "80275fe0": "mario_execute_object_action", + "802761d0": "geo_enfvx_main", + "802763d4": "geo_skybox_main", + "802764b0": "Geo18_802764B0", + "8027684c": "bhvToadMessage_loop", + "80276910": "bhvToadMessage_init", + "80276bb8": "bhvUnlockDoorStar_init", + "80276ccc": "bhvUnlockDoorStar_loop", + "802770a4": "Geo18_802770A4", + "80277150": "geo_switch_mario_stand_run", + "802771bc": "geo_switch_mario_eyes", + "80277294": "Geo18_80277294", + "802773a4": "Geo18_802773A4", + "802774f4": "geo_switch_mario_hand", + "802775cc": "Geo18_802775CC", + "802776d8": "geo_switch_mario_cap_effect", + "80277740": "geo_switch_mario_cap_on_off", + "80277824": "Geo18_80277824", + "8027795c": "geo_switch_mario_hand_grab_pos", + "80277b14": "geo_render_mirror_mario", + "80277d6c": "geo_mirror_mario_backface_culling", + "80277ee0": "set_segment_base_addr", + "80277f20": "get_segment_base_addr", + "80277f50": "segmented_to_virtual", + "80277fa8": "virtual_to_segmented", + "80277ff0": "move_segment_table_to_dmem", + "80278074": "main_pool_init", + "80278120": "main_pool_alloc", + "80278238": "main_pool_free", + "80278358": "main_pool_realloc", + "802783c8": "main_pool_available", + "802783e8": "main_pool_push_state", + "80278498": "main_pool_pop_state", + "8027868c": "load_segment", + "802786f0": "load_to_fixed_pool_addr", + "802787d8": "load_segment_decompress", + "802788b4": "func_80278304", + "80278974": "load_engine_code_segment", + "80278a14": "alloc_only_pool_init", + "80278ab8": "alloc_only_pool_alloc", + "80278b28": "alloc_only_pool_resize", + "80278b98": "mem_pool_init", + "80278c58": "mem_pool_alloc", + "80278d74": "mem_pool_free", + "80278f2c": "alloc_display_list", + "80279028": "func_80278A78", + "80279084": "func_80278AD4", + "80279840": "save_file_do_save", + "802798fc": "save_file_erase", + "80279960": "save_file_copy", + "802799dc": "save_file_load_all", + "80279bc8": "save_file_reload", + "80279c44": "save_file_collect_star_or_key", + "80279e44": "save_file_exists", + "80279e80": "save_file_get_max_coin_score", + "80279f80": "save_file_get_course_star_count", + "8027a010": "save_file_get_total_star_count", + "8027a0a8": "save_file_set_flags", + "8027a0f4": "save_file_clear_flags", + "8027a16c": "save_file_get_flags", + "8027a1c8": "save_file_get_star_flags", + "8027a23c": "save_file_set_star_flags", + "8027a310": "save_file_get_course_coin_score", + "8027a340": "save_file_is_cannon_unlocked", + "8027a390": "save_file_set_cannon_unlocked", + "8027a418": "save_file_set_cap_pos", + "8027a4ac": "save_file_get_cap_pos", + "8027a564": "save_file_set_sound_mode", + "8027a5b4": "save_file_get_sound_mode", + "8027a5d4": "save_file_move_cap_to_default_location", + "8027a698": "disable_warp_checkpoint", + "8027a6b0": "check_if_should_set_warp_checkpoint", + "8027a718": "check_warp_checkpoint", + "8027a7d0": "func_8027A220", + "8027a83c": "set_warp_transition_rgb", + "8027a8b0": "print_intro_text", + "8027a93c": "get_mario_spawn_type", + "8027a9c8": "area_get_warp_node", + "8027aa28": "func_8027A478", + "8027aa74": "func_8027A4C4", + "8027ab04": "clear_areas", + "8027ad74": "func_8027A7C4", + "8027ae44": "load_area", + "8027af48": "func_8027A998", + "8027afbc": "load_mario_area", + "8027b038": "func_8027AA88", + "8027b0c0": "change_area", + "8027b164": "area_update_objects", + "8027b1a0": "play_transition", + "8027b35c": "play_transition_after_delay", + "8027b3b4": "render_game", + "8027cf38": "geo_set_animation_globals", + "8027da84": "geo_process_held_object", + "8027de68": "geo_try_process_children", + "8027dea8": "geo_process_node_and_siblings", + "8027e130": "geo_process_root", + "8027e3e0": "profiler_log_thread5_time", + "8027e490": "profiler_log_thread4_time", + "8027e520": "profiler_log_gfx_time", + "8027e5cc": "profiler_log_vblank_time", + "8027e65c": "draw_profiler_bar", + "8027e958": "draw_reference_profiler_bars", + "8027ebcc": "draw_profiler_mode_1", + "8027eeac": "draw_profiler_mode_0", + "8027f460": "draw_profiler", + "8027f4e0": "decompress", + "8027f590": "set_camera_shake_from_hit", + "8027f8b8": "set_environmental_camera_shake", + "8027f9f0": "set_camera_shake_from_point", + "8027fb74": "unused_set_camera_pitch_shake_env", + "8027fc18": "calc_y_to_curr_floor", + "8027fe20": "focus_on_mario", + "8027fff8": "set_camera_height", + "80280368": "look_down_slopes", + "802804f4": "pan_ahead_of_player", + "802806a4": "find_in_bounds_yaw_wdw_bob_thi", + "80280810": "update_radial_camera", + "80280970": "update_8_directions_camera", + "80280b00": "radial_camera_move", + "80281188": "lakitu_zoom", + "802813bc": "radial_camera_input_default", + "802813ec": "update_yaw_and_dist_from_c_up", + "8028146c": "mode_radial_camera", + "80281588": "mode_8_directions_camera", + "802816a0": "update_outward_radial_camera", + "802817fc": "mode_outward_radial_camera", + "80281904": "update_parallel_tracking_camera", + "80282280": "update_fixed_camera", + "802826a0": "update_boss_fight_camera", + "80282c0c": "unused_update_mode_5_camera", + "80282c28": "unused_80282678", + "80282c3c": "mode_boss_fight_camera", + "80282c7c": "mode_parallel_tracking_camera", + "80282ce0": "mode_fixed_camera", + "80282d78": "update_behind_mario_camera", + "80283340": "mode_behind_mario", + "80283578": "update_slide_camera", + "802839e4": "mode_behind_mario_camera", + "80283a18": "nop_update_water_camera", + "80283a34": "mode_water_surface_camera", + "80283a68": "update_mario_camera", + "80283af8": "update_default_camera", + "80284cb8": "mode_default_camera", + "80284cfc": "mode_lakitu_camera", + "80284d38": "mode_mario_camera", + "80284d74": "update_spiral_stairs_camera", + "802850ac": "mode_spiral_stairs_camera", + "802850ec": "update_slide_or_0f_camera", + "802851dc": "mode_slide_camera", + "8028526c": "store_lakitu_cam_info_for_c_up", + "802852f4": "set_mode_c_up", + "80285370": "exit_c_up", + "80285808": "update_c_up", + "802858a4": "move_mario_head_c_up", + "80285a2c": "move_into_c_up", + "80285d20": "mode_c_up_camera", + "80285ed8": "update_in_cannon", + "80285f60": "mode_cannon_camera", + "8028603c": "transition_next_state", + "80286088": "transition_to_camera_mode", + "80286188": "set_camera_mode", + "80286420": "update_lakitu", + "802868f8": "update_camera", + "80286f68": "reset_camera", + "8028724c": "init_camera", + "802879ec": "zoom_out_if_paused_and_outside", + "80287bc4": "select_mario_cam_mode", + "80287be0": "create_camera", + "80287cb8": "update_graph_node_camera", + "80287d30": "geo_camera_main", + "80287dc0": "dummy_802877D8", + "80287dd4": "dummy_802877EC", + "80287de8": "vec3f_sub", + "80287e28": "object_pos_to_vec3f", + "80287e50": "vec3f_to_object_pos", + "80287e78": "unused_object_angle_to_vec3s", + "80287ea0": "evaluate_cubic_spline", + "802882e4": "move_point_along_spline", + "80288624": "cam_select_alt_mode", + "80288718": "set_cam_angle", + "80288888": "set_handheld_shake", + "802889b0": "shake_camera_handheld", + "80288ce4": "find_c_buttons_pressed", + "80288e68": "update_camera_hud_status", + "80288f5c": "collide_with_walls", + "80289198": "vec3f_compare", + "80289214": "clamp_pitch", + "802892d8": "is_within_100_units_of_mario", + "8028935c": "set_or_approach_f32_asymptotic", + "802893f4": "approach_f32_asymptotic_bool", + "80289488": "approach_f32_asymptotic", + "802894b4": "approach_s16_asymptotic_bool", + "8028956c": "approach_s16_asymptotic", + "80289610": "approach_vec3f_asymptotic", + "80289684": "set_or_approach_vec3f_asymptotic", + "802896f8": "approach_vec3s_asymptotic", + "8028976c": "camera_approach_s16_symmetric_bool", + "8028984c": "camera_approach_s16_symmetric", + "8028993c": "set_or_approach_s16_symmetric", + "802899cc": "camera_approach_f32_symmetric_bool", + "80289b0c": "camera_approach_f32_symmetric", + "80289c00": "random_vec3s", + "80289d20": "reduce_by_dist_from_camera", + "80289f88": "clamp_positions_and_find_yaw", + "8028a080": "calc_avoid_yaw", + "8028a0f4": "is_surf_within_bounding_box", + "8028a4ec": "is_behind_surface", + "8028a6bc": "is_range_behind_surface", + "8028a7ec": "is_mario_behind_surface", + "8028a834": "scale_along_line", + "8028a8e8": "is_pos_in_bounds", + "8028aa28": "calculate_pitch", + "8028aad8": "calculate_yaw", + "8028ab60": "calculate_angles", + "8028ac28": "calc_abs_dist", + "8028accc": "calc_hor_dist", + "8028ad4c": "rotate_in_xz", + "8028ae1c": "rotate_in_yz", + "8028aef0": "set_camera_pitch_shake", + "8028af4c": "set_camera_yaw_shake", + "8028b00c": "set_camera_roll_shake", + "8028b068": "set_pitch_shake_from_point", + "8028b11c": "set_yaw_shake_from_point", + "8028b1d0": "increment_shake_offset", + "8028b218": "shake_camera_pitch", + "8028b32c": "shake_camera_yaw", + "8028b438": "shake_camera_roll", + "8028b50c": "offset_yaw_outward_radial", + "8028b724": "cutscene_intro_peach_play_message_music", + "8028b754": "cutscene_intro_peach_play_lakitu_flying_music", + "8028b784": "play_camera_buzz_if_cdown", + "8028b7c4": "play_camera_buzz_if_cbutton", + "8028b804": "play_camera_buzz_if_c_sideways", + "8028b850": "play_sound_cbutton_up", + "8028b884": "play_sound_cbutton_down", + "8028b8b8": "play_sound_cbutton_side", + "8028b8ec": "play_sound_button_change_blocked", + "8028b920": "play_sound_rbutton_changed", + "8028b954": "play_sound_if_cam_switched_to_lakitu_or_mario", + "8028b9c4": "radial_camera_input", + "8028bd34": "trigger_cutscene_dialog", + "8028bd98": "handle_c_button_movement", + "8028c038": "clear_cutscene_vars", + "8028c13c": "start_cutscene", + "8028c18c": "determine_dance_cutscene", + "8028c26c": "open_door_cutscene", + "8028c2c8": "get_cutscene_from_mario_status", + "8028c7a0": "warp_camera", + "8028c8f0": "approach_camera_height", + "8028c9ac": "unused_8028C3AC", + "8028c9cc": "set_focus_rel_mario", + "8028cbf0": "offset_rotated", + "8028cd94": "offset_rotated_coords", + "8028cdec": "determine_pushing_or_pulling_door", + "8028ce24": "next_lakitu_state", + "8028d44c": "set_camera_mode_fixed", + "8028d5ac": "set_camera_mode_8_directions", + "8028d5fc": "set_camera_mode_boss_fight", + "8028d658": "set_camera_mode_close_cam", + "8028d698": "set_camera_mode_radial", + "8028d79c": "parallel_tracking_init", + "8028d888": "set_fixed_cam_axis_sa_lobby", + "8028d92c": "check_blocking_area_processing", + "8028da18": "cam_rr_exit_building_side", + "8028da50": "cam_rr_exit_building_top", + "8028daec": "cam_rr_enter_building_window", + "8028db38": "cam_rr_enter_building", + "8028dbb4": "cam_rr_enter_building_side", + "8028dbf4": "cam_cotmc_exit_waterfall", + "8028dc1c": "cam_sl_snowman_head_8dir", + "8028dc70": "cam_sl_free_roam", + "8028dca4": "move_camera_through_floor_while_descending", + "8028dd48": "cam_hmc_enter_maze", + "8028de2c": "cam_hmc_elevator_black_hole", + "8028de5c": "cam_hmc_elevator_maze_emergency_exit", + "8028de90": "cam_hmc_elevator_lake", + "8028dec4": "cam_hmc_elevator_maze", + "8028def8": "cam_ssl_enter_pyramid_top", + "8028df24": "cam_ssl_pyramid_center", + "8028df6c": "cam_ssl_boss_room", + "8028dfb4": "cam_thi_move_cam_through_tunnel", + "8028dfe8": "cam_thi_look_through_tunnel", + "8028e01c": "cam_bob_tower", + "8028e064": "cam_bob_default_free_roam", + "8028e098": "cam_castle_hmc_start_pool_cutscene", + "8028e0ec": "cam_castle_lobby_entrance", + "8028e164": "cam_castle_look_upstairs", + "8028e210": "cam_castle_basement_look_downstairs", + "8028e298": "cam_castle_enter_lobby", + "8028e300": "cam_castle_enter_spiral_stairs", + "8028e38c": "cam_castle_close_mode", + "8028e3b8": "cam_castle_leave_lobby_sliding_door", + "8028e3f0": "cam_castle_enter_lobby_sliding_door", + "8028e41c": "cam_bbh_room_6", + "8028e450": "cam_bbh_fall_off_roof", + "8028e47c": "cam_bbh_fall_into_pool", + "8028e524": "cam_bbh_room_1", + "8028e55c": "cam_bbh_leave_front_door", + "8028e594": "cam_bbh_room_2_lower", + "8028e5cc": "cam_bbh_room_4", + "8028e604": "cam_bbh_room_8", + "8028e63c": "cam_bbh_room_5_library", + "8028e674": "cam_bbh_room_5_library_to_hidden_transition", + "8028e6c4": "cam_bbh_room_5_hidden_to_library_transition", + "8028e714": "cam_bbh_room_5_hidden", + "8028e758": "cam_bbh_room_3", + "8028e790": "cam_bbh_room_7_mr_i", + "8028e7c8": "cam_bbh_room_7_mr_i_to_coffins_transition", + "8028e818": "cam_bbh_room_7_coffins_to_mr_i_transition", + "8028e868": "cam_bbh_elevator_room_lower", + "8028e8a0": "cam_bbh_room_0_back_entrance", + "8028e8cc": "cam_bbh_elevator", + "8028e930": "cam_bbh_room_12_upper", + "8028e974": "cam_bbh_enter_front_door", + "8028e9a0": "cam_bbh_room_2_library", + "8028e9d8": "cam_bbh_room_2_library_to_trapdoor_transition", + "8028ea28": "cam_bbh_room_2_trapdoor", + "8028ea60": "cam_bbh_room_2_trapdoor_transition", + "8028eab0": "cam_bbh_room_9_attic", + "8028eae8": "cam_bbh_room_9_attic_transition", + "8028eb38": "cam_bbh_room_9_mr_i_transition", + "8028eb88": "cam_bbh_room_13_balcony", + "8028ebc0": "cam_bbh_room_0", + "8028ec04": "cam_ccm_enter_slide_shortcut", + "8028ec2c": "cam_ccm_leave_slide_shortcut", + "8028ec58": "surface_type_modes", + "8028ed30": "set_mode_if_not_set_by_surface", + "8028ed98": "surface_type_modes_thi", + "8028eeb0": "camera_course_processing", + "8028f670": "resolve_geometry_collisions", + "8028f914": "rotate_camera_around_walls", + "8028fc9c": "find_mario_floor_and_ceil", + "8028fe24": "start_object_cutscene", + "8028fe58": "start_object_cutscene_without_focus", + "8028fe84": "unused_dialog_cutscene_response", + "8028ff04": "cutscene_object_with_dialog", + "8028ffc8": "cutscene_object_without_dialog", + "8029000c": "cutscene_object", + "80290098": "update_camera_yaw", + "802900e0": "cutscene_reset_spline", + "80290104": "stop_cutscene_and_retrieve_stored_info", + "80290168": "cap_switch_save", + "802901a4": "init_spline_point", + "802901fc": "copy_spline_segment", + "802903b8": "cutscene_common_set_dialog_state", + "802904a8": "cutscene_intro_peach_start_letter_music", + "802904e4": "cutscene_intro_peach_start_flying_music", + "8029051c": "reset_pan_distance", + "8029053c": "player2_rotate_cam", + "80290784": "store_info_cannon", + "802907f4": "retrieve_info_cannon", + "80290864": "store_info_star", + "802908e8": "retrieve_info_star", + "802909d0": "pan_camera", + "80290a5c": "cutscene_shake_explosion", + "80290abc": "rotate_and_move_vec3f", + "80290b54": "set_flag_post_door", + "80290ba4": "cutscene_soften_music", + "80290bd8": "cutscene_unsoften_music", + "80290c08": "unused_802905C8", + "80290c1c": "cutscene_unused_start", + "80290c30": "cutscene_unused_loop", + "80290c44": "cutscene_ending_mario_fall_start", + "80290c9c": "cutscene_ending_mario_fall_focus_mario", + "80290d90": "cutscene_ending_mario_fall", + "80290e00": "cutscene_ending_mario_land_closeup", + "80290e74": "cutscene_ending_reset_spline", + "80290eb0": "cutscene_ending_fly_up_to_window", + "80290f1c": "cutscene_ending_stars_free_peach", + "80290f8c": "cutscene_ending_mario_land", + "80291074": "cutscene_ending_peach_appear_closeup", + "80291108": "cutscene_ending_peach_appears", + "802911c8": "cutscene_ending_peach_descends_start", + "80291208": "cutscene_ending_follow_peach_descent", + "8029127c": "cutscene_ending_peach_descent_lower_focus", + "802912b8": "cutscene_ending_peach_descent_back_to_mario", + "80291354": "cutscene_ending_peach_descends", + "8029142c": "cutscene_ending_mario_to_peach", + "802914cc": "cutscene_ending_look_up_at_castle", + "80291514": "cutscene_ending_peach_wakeup", + "802915d4": "cutscene_ending_dialog", + "80291654": "cutscene_ending_kiss_closeup", + "802916b8": "cutscene_ending_kiss_here_we_go", + "80291774": "cutscene_ending_kiss", + "802917e4": "cutscene_ending_look_at_sky", + "8029184c": "cutscene_ending_zoom_fov", + "80291870": "cutscene_ending_cake_for_mario", + "80291924": "cutscene_ending_stop", + "80291964": "cutscene_grand_star_start", + "802919dc": "cutscene_grand_star_front_of_mario", + "80291ab4": "cutscene_grand_star_mario_jump", + "80291b18": "cutscene_grand_star_accel_cvar2", + "80291b68": "cutscene_grand_star_approach_mario", + "80291bf4": "cutscene_grand_star_move_cvar2", + "80291c3c": "cutscene_grand_star_focus_mario", + "80291cd0": "cutscene_grand_star", + "80291db0": "cutscene_grand_star_fly_start", + "80291e84": "cutscene_grand_star_fly_move_to_mario", + "80291f18": "cutscene_grand_star_fly_mario_offscreen", + "80292038": "cutscene_grand_star_fly_app_cvars", + "80292164": "cutscene_grand_star_fly", + "802921fc": "focus_in_front_of_mario", + "8029228c": "cutscene_dance_move_to_mario", + "80292324": "cutscene_dance_rotate", + "80292370": "cutscene_dance_rotate_move_back", + "802923b8": "cutscene_dance_rotate_move_towards_mario", + "80292400": "cutscene_dance_unused", + "80292414": "cutscene_dance_default_focus_mario", + "8029244c": "cutscene_dance_rotate_focus_mario", + "80292484": "cutscene_dance_shake_fov", + "802924b8": "cutscene_dance_default_rotate", + "80292628": "star_dance_bound_yaw", + "802926dc": "cutscene_dance_closeup_start", + "802927d0": "cutscene_dance_closeup_focus_mario", + "80292868": "cutscene_dance_closeup_fly_above", + "80292974": "cutscene_dance_closeup_fly_closer", + "80292a20": "cutscene_dance_closeup_zoom", + "80292a4c": "cutscene_dance_closeup_shake_fov", + "80292a80": "cutscene_dance_closeup", + "80292c00": "cutscene_dance_fly_away_start", + "80292d80": "cutscene_dance_fly_away_approach_mario", + "80292e2c": "cutscene_dance_fly_away_focus_mario", + "80292ec4": "cutscene_pan_cvar9", + "80292f40": "cutscene_dance_fly_rotate_around_mario", + "80292f98": "cutscene_dance_fly_away_rotate_while_flying", + "80292fe4": "cutscene_dance_fly_away_shake_fov", + "80293018": "cutscene_dance_fly_away", + "802930f0": "cutscene_key_dance_jump_cvar", + "80293164": "cutscene_key_dance_jump_closeup", + "802931c0": "cutscene_key_dance_jump_lower_left", + "80293220": "cutscene_key_dance_jump_above", + "8029328c": "cutscene_key_dance_jump_last", + "802932f4": "cutscene_key_dance_shake_fov", + "80293328": "cutscene_key_dance_handheld_shake", + "80293354": "cutscene_key_dance_focus_mario", + "8029338c": "cutscene_key_dance", + "80293488": "cutscene_bowser_area_shake_fov", + "802934b4": "cutscene_bowser_area_start_bowser_walking", + "802934d8": "cutscene_bowser_arena_set_pos", + "80293548": "cutscene_bowser_arena_focus_sine", + "802935e0": "cutscene_bowser_arena_set_focus", + "80293624": "cutscene_bowser_arena_adjust_offsets", + "8029369c": "cutscene_bowser_arena_pan_left", + "802936dc": "cutscene_bowser_arena_mario_dialog", + "80293708": "cutscene_stop_dialog", + "80293734": "cutscene_bowser_arena_start", + "802937e8": "bowser_fight_intro_dialog", + "8029386c": "cutscene_bowser_arena_dialog", + "802938c8": "cutscene_bowser_arena_end", + "80293944": "cutscene_bowser_arena", + "80293abc": "cutscene_star_spawn_store_info", + "80293ae8": "cutscene_star_spawn_focus_star", + "80293b70": "cutscene_star_spawn_update_boss_fight", + "80293bf4": "cutscene_star_spawn_fly_back", + "80293c2c": "cutscene_star_spawn", + "80293cb0": "cutscene_star_spawn_back", + "80293d5c": "cutscene_star_spawn_end", + "80293d90": "cutscene_exit_waterfall_warp", + "80293dd4": "cutscene_exit_to_castle_grounds_focus_mario", + "80293e7c": "cutscene_exit_waterfall", + "80293ed8": "cutscene_exit_to_castle_grounds_end", + "80293f2c": "cutscene_exit_fall_to_castle_grounds_warp", + "80293f70": "cutscene_exit_fall_to_castle_grounds", + "80293fcc": "cutscene_red_coin_star_start", + "80294024": "cutscene_red_coin_star_focus_xz", + "80294088": "cutscene_red_coin_star_focus_y", + "802940cc": "cutscene_red_coin_star_look_up_at_star", + "8029410c": "cutscene_red_coin_star_warp", + "802942cc": "cutscene_red_coin_star_set_fov", + "802942f0": "cutscene_red_coin_star", + "802943d4": "cutscene_red_coin_star_end", + "80294428": "cutscene_goto_cvar_pos", + "80294718": "cutscene_prepare_cannon_start", + "802947a4": "cutscene_prepare_cannon_fly_to_cannon", + "8029480c": "cannon_approach_prev", + "802948a0": "cutscene_prepare_cannon_fly_back", + "80294a14": "cutscene_prepare_cannon", + "80294a94": "cutscene_prepare_cannon_end", + "80294ae8": "water_death_move_to_mario_side", + "80294b78": "death_goto_mario", + "80294bb4": "cutscene_death_standing_start", + "80294c28": "cutscene_death_standing_goto_mario", + "80294c5c": "cutscene_death_standing", + "80294cc4": "cutscene_death_stomach_start", + "80294d48": "cutscene_death_stomach_goto_mario", + "80294db4": "cutscene_death_stomach", + "80294e24": "cutscene_bbh_death_start", + "80294ea8": "cutscene_bbh_death_goto_mario", + "80294ee8": "cutscene_bbh_death", + "80294f58": "cutscene_quicksand_death_start", + "80294f94": "cutscene_quicksand_death_goto_mario", + "80294fec": "cutscene_quicksand_death", + "802950b0": "cutscene_suffocation_fly_away", + "80295140": "cutscene_suffocation_stay_above_gas", + "802951f0": "cutscene_suffocation_rotate", + "80295270": "cutscene_suffocation", + "80295310": "cutscene_enter_pool_start", + "802953dc": "cutscene_enter_pool_loop", + "80295418": "cutscene_enter_pool", + "80295480": "cutscene_pyramid_top_explode_start", + "802954ec": "cutscene_pyramid_top_explode_zoom_in", + "80295518": "cutscene_pyramid_top_explode_focus", + "80295580": "cutscene_pyramid_top_explode_warp", + "80295670": "cutscene_pyramid_top_explode_closeup", + "80295740": "cutscene_pyramid_top_explode_cam_shake", + "8029576c": "cutscene_pyramid_top_explode_warp_back", + "802957c8": "cutscene_pyramid_top_explode", + "80295894": "cutscene_pyramid_top_explode_end", + "802958d4": "cutscene_enter_pyramid_top_start", + "80295930": "cutscene_enter_pyramid_top", + "80295a58": "cutscene_dialog_start", + "80295bf0": "cutscene_dialog_move_mario_shoulder", + "80295e24": "cutscene_dialog_create_dialog_box", + "80295e8c": "cutscene_dialog", + "80295fb0": "cutscene_dialog_set_flag", + "80295fd8": "cutscene_dialog_end", + "80296020": "cutscene_read_message_start", + "80296160": "cutscene_read_message", + "802962c8": "cutscene_read_message_set_flag", + "802962f0": "cutscene_read_message_end", + "80296318": "cutscene_exit_succ_start", + "802963b8": "cutscene_non_painting_set_cam_pos", + "8029652c": "cutscene_non_painting_set_cam_focus", + "8029665c": "cutscene_exit_bowser_succ_focus_left", + "8029669c": "cutscene_exit_bowser_key_toss_shake", + "802966e4": "cutscene_exit_succ_shake_landing", + "80296710": "cutscene_exit_bowser_succ", + "802967c4": "cutscene_non_painting_end", + "8029685c": "cutscene_exit_non_painting_succ_override_cvar", + "802968a0": "cutscene_exit_non_painting_succ", + "8029695c": "cutscene_non_painting_death_start", + "802969f8": "cutscene_exit_bowser_death", + "80296a64": "cutscene_non_painting_death_override_offset", + "80296b30": "cutscene_non_painting_death", + "80296bc8": "cutscene_cap_switch_press_start", + "80296c4c": "cutscene_cap_switch_press_rotate_around_mario", + "80296d60": "cutscene_cap_switch_press_lower_cam", + "80296da8": "cutscene_cap_switch_press_approach_mario", + "80296eb4": "cutscene_cap_switch_press_pan_left", + "80296f38": "cutscene_cap_switch_press_create_dialog", + "80296fa8": "cutscene_cap_switch_press", + "80297148": "cutscene_unlock_key_door_start", + "8029720c": "cutscene_unlock_key_door_approach_mario", + "80297290": "cutscene_unlock_key_door_focus_lock", + "802972ec": "cutscene_unlock_key_door_stub", + "80297300": "cutscene_unlock_key_door_fly_back", + "80297384": "cutscene_unlock_key_door_fov_shake", + "802973b0": "cutscene_unlock_key_door", + "80297464": "intro_peach_move_camera_start_to_pipe", + "80297560": "peach_letter_text", + "8029758c": "play_sound_peach_reading_letter", + "802975c4": "cutscene_intro_peach_start_to_pipe_spline", + "8029762c": "cutscene_intro_peach_dialog", + "802976bc": "cutscene_intro_peach_follow_pipe_spline", + "80297728": "cutscene_intro_peach_clear_cutscene_status", + "80297748": "cutscene_intro_peach_zoom_fov", + "80297784": "cutscene_intro_peach_reset_spline", + "802977c8": "cutscene_intro_peach_handheld_shake_off", + "802977f4": "intro_pipe_exit_text", + "80297820": "play_sound_intro_turn_on_hud", + "8029784c": "cutscene_intro_peach_fly_to_pipe", + "80297908": "cutscene_intro_peach_mario_appears", + "80297a38": "cutscene_intro_peach_reset_fov", + "80297a64": "cutscene_intro_peach_letter", + "80297b58": "cutscene_end_waving_start", + "80297b84": "cutscene_end_waving", + "80297c14": "cutscene_credits_reset_spline", + "80297c40": "cutscene_credits", + "802980dc": "cutscene_sliding_doors_open_start", + "8029819c": "cutscene_sliding_doors_open_set_cvars", + "80298218": "cutscene_sliding_doors_go_under_doorway", + "80298254": "cutscene_sliding_doors_fly_back_up", + "80298290": "cutscene_sliding_doors_follow_mario", + "802983b4": "cutscene_sliding_doors_open", + "80298458": "cutscene_double_doors_end", + "802984a0": "cutscene_enter_painting_stub", + "802984b4": "cutscene_enter_painting", + "802987b0": "cutscene_exit_painting_start", + "8029894c": "cutscene_exit_painting_move_to_mario", + "802989e8": "cutscene_exit_painting_move_to_floor", + "80298af8": "cutscene_exit_painting", + "80298ba0": "cutscene_unused_exit_start", + "80298c2c": "cutscene_unused_exit_focus_mario", + "80298ccc": "cutscene_exit_painting_end", + "80298d44": "cutscene_enter_cannon_end", + "80298d9c": "cutscene_enter_cannon_raise", + "80298fe8": "cutscene_enter_cannon_start", + "80299100": "cutscene_door_start", + "80299154": "cutscene_door_fix_cam", + "802991a8": "cutscene_door_loop", + "802991f0": "cutscene_door_move_behind_mario", + "802992cc": "cutscene_door_follow_mario", + "80299360": "cutscene_door_end", + "80299404": "cutscene_door_mode", + "802994e8": "play_cutscene", + "8029a2f8": "cutscene_event", + "8029a37c": "cutscene_spawn_obj", + "8029a3b4": "set_fov_shake", + "8029a41c": "set_fov_shake_from_point", + "8029a4d0": "shake_camera_fov", + "8029a5e8": "set_fov_30", + "8029a60c": "approach_fov_20", + "8029a64c": "set_fov_45", + "8029a670": "set_fov_29", + "8029a694": "zoom_fov_30", + "8029a6f4": "fov_default", + "8029a858": "approach_fov_30", + "8029a894": "approach_fov_60", + "8029a8d0": "approach_fov_45", + "8029a968": "approach_fov_80", + "8029a9a4": "set_fov_bbh", + "8029aa3c": "geo_camera_fov", + "8029ab94": "set_fov_function", + "8029abb0": "cutscene_set_fov_shake_preset", + "8029ac30": "set_fov_shake_from_point_preset", + "8029aef8": "obj_rotate_towards_point", + "8029af98": "intro_peach_set_pos_and_opacity", + "8029b08c": "bhv_intro_peach_loop", + "8029b28c": "intro_lakitu_set_offset_from_camera", + "8029b358": "intro_lakitu_set_focus", + "8029b3c8": "intro_lakitu_set_pos_and_focus", + "8029b49c": "bhv_intro_lakitu_loop", + "8029bde4": "bhv_end_birds_1_loop", + "8029bf64": "bhv_end_birds_2_loop", + "8029c0e4": "func_8029B964", + "8029c254": "bhv_intro_scene_loop", + "8029c770": "nop_change_course", + "8029c780": "copy_mario_state_to_object", + "8029c9cc": "spawn_particle", + "8029ca58": "bhv_mario_update", + "8029cb34": "update_objects_starting_at", + "8029cbc8": "update_objects_during_time_stop", + "8029cd28": "update_objects_in_list", + "8029cd98": "unload_deactivated_objects_in_list", + "8029ce58": "set_object_respawn_info_bits", + "8029cedc": "unload_objects_from_area", + "8029cfb0": "spawn_objects_from_info", + "8029d1d8": "stub_8029CA50", + "8029d1e8": "clear_objects", + "8029d324": "update_terrain_objects", + "8029d374": "update_non_terrain_objects", + "8029d428": "unload_deactivated_objects", + "8029d690": "update_objects", + "8029d890": "Geo18_8029D890", + "8029d924": "Geo18_8029D924", + "8029db48": "geo_switch_anim_state", + "8029dbd4": "geo_switch_area", + "8029dcd4": "func_8029D558", + "8029dda8": "apply_object_scale_to_matrix", + "8029de80": "func_8029D704", + "8029e1b0": "set_object_held_state", + "8029e27c": "lateral_dist_between_objects", + "8029e2f8": "dist_between_objects", + "8029e398": "obj_forward_vel_approach_upward", + "8029e3e8": "approach_f32_signed", + "8029e494": "approach_f32_symmetric", + "8029e530": "approach_s16_symmetric", + "8029e5ec": "obj_rotate_yaw_toward", + "8029e694": "angle_to_object", + "8029e714": "obj_turn_toward_object", + "8029e8bc": "set_object_parent_relative_pos", + "8029e914": "set_object_pos", + "8029e96c": "set_object_angle", + "8029e9ac": "spawn_object_abs_with_rot", + "8029ea24": "spawn_object_rel_with_rot", + "8029eaac": "Unknown8029E330", + "8029eb04": "spawn_water_splash", + "8029ed20": "spawn_object_at_origin", + "8029edcc": "spawn_object", + "8029ee24": "try_to_spawn_object", + "8029eeb8": "spawn_object_with_scale", + "8029ef64": "spawn_object_relative", + "8029effc": "spawn_object_relative_with_scale", + "8029f070": "obj_move_using_vel", + "8029f0c8": "copy_object_graph_y_offset", + "8029f0e0": "copy_object_pos_and_angle", + "8029f120": "copy_object_pos", + "8029f148": "copy_object_angle", + "8029f188": "func_8029EA0C", + "8029f1b0": "Unknown8029EA34", + "8029f200": "linear_mtxf_mul_vec3f", + "8029f274": "linear_mtxf_transpose_mul_vec3f", + "8029f2ec": "apply_scale_to_object_transform", + "8029f3a8": "copy_object_scale", + "8029f3d0": "scale_object_xyz", + "8029f404": "scale_object", + "8029f430": "obj_scale", + "8029f464": "SetObjAnimation", + "8029f4b4": "set_obj_animation_and_sound_state", + "8029f514": "func_8029ED98", + "8029f59c": "func_8029EE20", + "8029f600": "obj_enable_rendering_and_become_tangible", + "8029f620": "obj_enable_rendering", + "8029f644": "obj_disable_rendering_and_become_intangible", + "8029f66c": "obj_disable_rendering", + "8029f694": "obj_unhide", + "8029f6bc": "obj_hide", + "8029f6e0": "obj_set_pos_relative", + "8029f7d8": "obj_set_pos_relative_to_parent", + "8029f820": "obj_enable_rendering_2", + "8029f848": "obj_unused_init_on_floor", + "8029f8ec": "obj_set_facing_to_move_angles", + "8029f914": "get_object_list_from_behavior", + "8029f95c": "obj_nearest_object_with_behavior", + "8029f998": "obj_dist_to_nearest_object_with_behavior", + "8029f9ec": "obj_find_nearest_object_with_behavior", + "8029fb1c": "find_unimportant_object", + "8029fb68": "count_unimportant_objects", + "8029fbdc": "count_objects_with_behavior", + "8029fc9c": "obj_find_nearby_held_actor", + "8029fdb4": "obj_change_action", + "8029fe00": "func_8029F684", + "8029fe6c": "func_8029F6F0", + "8029fea4": "func_8029F728", + "8029ff04": "func_8029F788", + "8029ffa4": "func_8029F828", + "802a0008": "obj_check_anim_frame", + "802a0050": "obj_check_anim_frame_in_range", + "802a00ac": "Unknown8029F930", + "802a0114": "mario_is_in_air_action", + "802a0154": "mario_is_dive_sliding", + "802a0198": "func_8029FA1C", + "802a01d8": "func_8029FA5C", + "802a0380": "obj_get_thrown_or_placed", + "802a0474": "obj_get_dropped", + "802a04c0": "obj_set_model", + "802a04f0": "mario_set_flag", + "802a0514": "obj_clear_interact_status_flag", + "802a0568": "mark_object_for_deletion", + "802a057c": "obj_disable", + "802a05b4": "obj_become_intangible", + "802a05d4": "obj_become_tangible", + "802a05f0": "make_object_tangible", + "802a0604": "obj_update_floor_height", + "802a064c": "obj_update_floor_height_and_get_floor", + "802a079c": "obj_apply_drag_xz", + "802a0e68": "obj_move_y", + "802a113c": "obj_unused_resolve_wall_collisions", + "802a11a8": "abs_angle_diff", + "802a120c": "obj_move_xz_using_fvel_and_yaw", + "802a12a4": "obj_move_y_with_terminal_vel", + "802a1308": "obj_compute_vel_xz", + "802a1370": "func_802A0BF4", + "802a1424": "are_objects_collided", + "802a148c": "obj_set_behavior", + "802a14c4": "set_object_behavior", + "802a14fc": "obj_has_behavior", + "802a1554": "object_has_behavior", + "802a15ac": "obj_lateral_dist_from_mario_to_home", + "802a1634": "obj_lateral_dist_to_home", + "802a16ac": "obj_outside_home_square", + "802a1774": "obj_outside_home_rectangle", + "802a184c": "obj_set_pos_to_home", + "802a188c": "obj_set_pos_to_home_and_stop", + "802a18dc": "obj_shake_y", + "802a1930": "obj_start_cam_event", + "802a1960": "Unknown802A11E4", + "802a19ac": "obj_set_billboard", + "802a19c8": "obj_set_hitbox_radius_and_height", + "802a19f0": "obj_set_hurtbox_radius_and_height", + "802a1b34": "spawn_object_loot_blue_coins", + "802a1b8c": "spawn_object_loot_yellow_coins", + "802a1bdc": "obj_spawn_loot_coin_at_mario_pos", + "802a1c68": "obj_abs_y_dist_to_home", + "802a1cc4": "Unknown802A1548", + "802a1f3c": "obj_resolve_wall_collisions", + "802a2320": "obj_update_floor_and_walls", + "802a2348": "obj_move_standard", + "802a25b4": "obj_move_using_vel_and_gravity", + "802a2644": "obj_move_using_fvel_and_gravity", + "802a2674": "set_object_pos_relative", + "802a2748": "obj_angle_to_home", + "802a27b0": "func_802A2008", + "802a2804": "translate_object_local", + "802a2930": "build_object_transform_from_pos_and_angle", + "802a2a18": "func_802A2270", + "802a2a84": "build_object_transform_relative_to_parent", + "802a2b28": "Unknown802A2380", + "802a2b6c": "obj_rotate_move_angle_using_vel", + "802a2bc4": "obj_rotate_face_angle_using_vel", + "802a2c1c": "obj_set_face_angle_to_move_angle", + "802a2c5c": "obj_follow_path", + "802a2ed4": "chain_segment_init", + "802a2f14": "random_f32_around_zero", + "802a2f5c": "scale_object_random", + "802a2fc0": "translate_object_xyz_random", + "802a308c": "translate_object_xz_random", + "802a31e0": "func_802A2A38", + "802a3268": "obj_reflect_move_angle_off_wall", + "802a32ac": "obj_spawn_particles", + "802a34a4": "set_object_hitbox", + "802a3604": "signum_positive", + "802a3634": "absf", + "802a3674": "absi", + "802a36a4": "obj_wait_then_blink", + "802a3754": "obj_is_mario_ground_pounding_platform", + "802a37ac": "func_802A3004", + "802a37dc": "func_802A3034", + "802a3818": "obj_push_mario_away", + "802a390c": "obj_push_mario_away_from_cylinder", + "802a399c": "BehDustSmokeLoop", + "802a3a4c": "func_802A32A4", + "802a3a88": "func_802A32E0", + "802a3b40": "func_802A3398", + "802a3c18": "func_802A3470", + "802a3cfc": "obj_is_mario_on_platform", + "802a3d40": "obj_shake_y_until", + "802a3dd4": "func_802A362C", + "802a3e30": "obj_call_action_function", + "802a3ef8": "Unknown802A3750", + "802a3f24": "func_802A377C", + "802a3f48": "obj_mario_far_away", + "802a404c": "obj_is_mario_moving_fast_or_in_air", + "802a40b8": "item_in_array", + "802a4120": "bhv_init_room", + "802a4210": "obj_enable_rendering_if_mario_in_room", + "802a4360": "obj_set_hitbox_and_die_if_attacked", + "802a4440": "func_802A3C98", + "802a44f4": "set_object_collision_data", + "802a452c": "obj_if_hit_wall_bounce_away", + "802a4564": "obj_hide_if_mario_far_away_y", + "802a45e4": "Geo18_802A45E4", + "802a462c": "Unknown802A3E84", + "802a46cc": "obj_is_hidden", + "802a4704": "enable_time_stop", + "802a4728": "disable_time_stop", + "802a4750": "set_time_stop_flags", + "802a4774": "clear_time_stop_flags", + "802a47a0": "func_802A3FF8", + "802a48bc": "obj_is_mario_in_range_and_ready_to_speak", + "802a4960": "obj_update_dialog", + "802a4be4": "obj_update_dialog_with_cutscene", + "802a4f04": "obj_has_model", + "802a4f58": "obj_align_gfx_with_floor", + "802a5034": "mario_is_within_rectangle", + "802a50fc": "ShakeScreen", + "802a513c": "attack_collided_non_mario_object", + "802a51ac": "obj_was_attacked_or_ground_pounded", + "802a5228": "copy_object_behavior_params", + "802a5248": "func_802A4A70", + "802a5288": "func_802A4AB0", + "802a52c4": "func_802A4AEC", + "802a52f8": "obj_check_grabbed_mario", + "802a5358": "player_performed_grab_escape_action", + "802a540c": "obj_unused_play_footstep_sound", + "802a5460": "enable_time_stop_including_mario", + "802a5498": "disable_time_stop_including_mario", + "802a54d8": "obj_check_interacted", + "802a5524": "obj_spawn_loot_blue_coin", + "802a5588": "obj_spawn_star_at_y_offset", + "802a5620": "func_802A4DB0", + "802a56bc": "bhv_star_door_loop", + "802a58dc": "bhv_piranha_particle_loop", + "802a597c": "ActionMrIParticle0", + "802a5a44": "ActionMrIParticle1", + "802a5aa0": "bhv_mr_i_particle_loop", + "802a5acc": "func_802A525C", + "802a5bd4": "bhv_mr_i_body_loop", + "802a5d4c": "ActionMrI3", + "802a6518": "ActionMrI2", + "802a68a0": "ActionMrI1", + "802a6ad8": "ActionMrI0", + "802a6b7c": "bhv_mr_i_loop", + "802a6c20": "bhv_pole_init", + "802a6c74": "bhv_giant_pole_loop", + "802a6cf4": "bhv_thi_huge_island_top_loop", + "802a6d64": "bhv_thi_tiny_island_top_loop", + "802a6ee4": "ActionActivateCapSwitch0", + "802a7020": "ActionActivateCapSwitch1", + "802a708c": "ActionActivateCapSwitch2", + "802a7160": "ActionActivateCapSwitch3", + "802a7170": "bhv_cap_switch_loop", + "802a719c": "Geo18_802A719C", + "802a7230": "bhv_bobomb_anchor_mario_loop", + "802a7264": "ActionKingBobomb0", + "802a7384": "func_802A6AF8", + "802a73d8": "ActionKingBobomb2", + "802a7598": "ActionKingBobomb3", + "802a7804": "ActionKingBobomb1", + "802a78d8": "ActionKingBobomb6", + "802a7a60": "ActionKingBobomb7", + "802a7b1c": "ActionKingBobomb8", + "802a7b5c": "ActionKingBobomb4", + "802a7d14": "ActionKingBobomb5", + "802a7fbc": "func_802A7748", + "802a8064": "bhv_king_bobomb_loop", + "802a816c": "bhv_beta_chest_bottom_init", + "802a81e8": "bhv_beta_chest_bottom_loop", + "802a821c": "bhv_beta_chest_lid_loop", + "802a8370": "bhv_water_air_bubble_init", + "802a83a0": "bhv_water_air_bubble_loop", + "802a8630": "bhv_bubble_wave_init", + "802a86bc": "Unknown802A7E48", + "802a870c": "bhv_bubble_maybe_loop", + "802a88a4": "bhv_small_water_wave_loop", + "802a8a38": "func_802A81C4", + "802a8b18": "bhv_particle_init", + "802a8bc0": "bhv_particle_loop", + "802a8c88": "bhv_small_bubbles_loop", + "802a8cdc": "bhv_fish_group_loop", + "802a8d48": "bhv_water_waves_init", + "802a8d98": "bhv_cannon_base_unused_loop", + "802a8dc0": "ActionOpenedCannon0", + "802a8f40": "ActionOpenedCannon4", + "802a9114": "ActionOpenedCannon6", + "802a92fc": "ActionOpenedCannon5", + "802a93f8": "ActionOpenedCannon1", + "802a9440": "ActionOpenedCannon2", + "802a9460": "ActionOpenedCannon3", + "802a9498": "bhv_cannon_base_loop", + "802a94f8": "bhv_cannon_barrel_loop", + "802a958c": "func_802A8D18", + "802a9708": "bhv_chuckya_anchor_mario_loop", + "802a973c": "Unknown802A8EC8", + "802a98c4": "func_802A9050", + "802a9994": "ActionChuckya0", + "802a9d08": "ActionChuckya1", + "802a9f54": "ActionChuckya3", + "802a9fc8": "ActionChuckya2", + "802aa02c": "func_802A97B8", + "802aa0ac": "bhv_chuckya_loop", + "802aa1b8": "bhv_wf_breakable_wall_loop", + "802aa280": "func_802A9A0C", + "802aa3c8": "func_802A9B54", + "802aa3f4": "bhv_kickable_board_loop", + "802aa700": "bhv_tower_door_loop", + "802aa774": "bhv_wf_rotating_wooden_platform_loop", + "802aa830": "bhv_rotating_platform_loop", + "802aa948": "func_802AA0D4", + "802aa97c": "bhv_koopa_shell_underwater_loop", + "802aaa60": "bhv_warp_loop", + "802aab54": "BehFadingWarpLoop", + "802aac48": "bhv_white_puff_exploding_loop", + "802aae8c": "func_802AA618", + "802aaf48": "bhv_spawned_star_init", + "802aaffc": "func_802AA788", + "802ab060": "func_802AA7EC", + "802ab158": "func_802AA8E4", + "802ab18c": "func_802AA918", + "802ab1c8": "bhv_spawned_star_loop", + "802ab558": "bhv_spawn_star_no_level_exit", + "802ab5c8": "bhv_coin_sparkles_init", + "802ab650": "bhv_yellow_coin_init", + "802ab70c": "bhv_yellow_coin_loop", + "802ab748": "bhv_temp_coin_loop", + "802ab7a4": "bhv_coin_init", + "802ab860": "bhv_coin_loop", + "802aba40": "bhv_coin_formation_spawn_loop", + "802abc04": "func_802AB364", + "802abee4": "bhv_coin_formation_init", + "802abf0c": "bhv_coin_formation_loop", + "802ac068": "ActionCoinInsideBoo1", + "802ac15c": "ActionCoinInsideBoo0", + "802ac294": "bhv_coin_inside_boo_loop", + "802ac2c0": "bhv_coin_sparkles_loop", + "802ac2ec": "bhv_golden_coin_sparkles_loop", + "802ac3a8": "bhv_punch_tiny_triangle_loop", + "802ac4a0": "bhv_punch_tiny_triangle_init", + "802ac5b4": "bhv_wall_tiny_star_particle_loop", + "802ac678": "bhv_tiny_star_particles_init", + "802ac78c": "bhv_pound_tiny_star_particle_loop", + "802ac864": "bhv_pound_tiny_star_particle_init", + "802ac910": "func_802AC070", + "802ac958": "func_802AC0B8", + "802ac9d0": "func_802AC130", + "802aca6c": "func_802AC1CC", + "802acac8": "bhv_door_loop", + "802acc3c": "bhv_door_init", + "802ace80": "bhv_star_door_loop_2", + "802ad078": "ActionGrindelThwomp4", + "802ad10c": "ActionGrindelThwomp2", + "802ad1a4": "ActionGrindelThwomp3", + "802ad238": "ActionGrindelThwomp1", + "802ad2d0": "ActionGrindelThwomp0", + "802ad34c": "bhv_grindel_thwomp_loop", + "802ad378": "bhv_tumbling_bridge_platform_loop", + "802ad580": "ActionTumblingBridge1", + "802ad76c": "ActionTumblingBridge2", + "802ad7f4": "ActionTumblingBridge3", + "802ad828": "ActionTumblingBridge0", + "802ad890": "bhv_tumbling_bridge_loop", + "802ad8bc": "func_802AD01C", + "802ad8f0": "ActionElevator0", + "802ada4c": "ActionElevator1", + "802adb88": "ActionElevator2", + "802adce4": "ActionElevator4", + "802add70": "ActionElevator3", + "802addf8": "bhv_elevator_init", + "802adf6c": "bhv_elevator_loop", + "802adf98": "bhv_water_mist_spawn_loop", + "802adfd8": "bhv_water_mist_loop", + "802ae0cc": "spawn_triangle_break_particles", + "802ae238": "bhv_water_mist_2_loop", + "802ae304": "bhv_pound_white_puffs_init", + "802ae334": "func_802ADA94", + "802ae360": "bhv_unused_0e40_init", + "802ae394": "Unknown802ADAF4", + "802ae45c": "func_802ADBBC", + "802ae48c": "bhv_ground_snow_init", + "802ae4c0": "func_802ADC20", + "802ae534": "bhv_wind_loop", + "802ae85c": "bhv_unused_particle_spawn_loop", + "802ae908": "bhv_ukiki_cage_star_loop", + "802aea6c": "ukiki_cage_act_wait_for_ukiki", + "802aeab8": "ukiki_cage_act_spin", + "802aeb1c": "ukiki_cage_act_fall", + "802aeb74": "ukiki_cage_act_hide", + "802aeb9c": "bhv_ukiki_cage_loop", + "802aebc8": "bhv_squishable_platform_loop", + "802aec40": "bhv_bitfs_sinking_platform_loop", + "802aeca8": "bhv_ddd_moving_pole_loop", + "802aecdc": "bhv_bitfs_sinking_cage_platform_loop", + "802aedc0": "bhv_beta_moving_flames_spawn_loop", + "802aeea4": "bhv_beta_moving_flames_loop", + "802aef1c": "bhv_flamethrower_flame_loop", + "802af1e8": "bhv_flamethrower_loop", + "802af3fc": "bhv_rr_rotating_bridge_platform_loop", + "802af448": "bhv_bouncing_fireball_flame_loop", + "802af5f8": "bhv_bouncing_fireball_loop", + "802af7c4": "bhv_bowser_shock_wave_loop", + "802af9cc": "bhv_black_smoke_upward_loop", + "802afa0c": "bhv_black_smoke_bowser_loop", + "802afae4": "bhv_black_smoke_mario_loop", + "802afbf8": "bhv_flame_mario_loop", + "802afce4": "bhv_beta_fish_splash_spawner_loop", + "802afd1c": "bhv_spindrift_loop", + "802afee8": "bhv_wf_solid_tower_platform_loop", + "802aff30": "bhv_wf_elevator_tower_platform_loop", + "802b00e4": "bhv_wf_sliding_tower_platform_loop", + "802b0244": "func_802AF9A4", + "802b039c": "func_802AFAFC", + "802b04b4": "bhv_tower_platform_group_loop", + "802b0614": "bhv_tree_snow_or_leaf_loop", + "802b0974": "bhv_snow_leaf_particle_spawn_init", + "802b0b9c": "func_802B02FC", + "802b0bec": "bhv_squarish_path_moving_loop", + "802b0d48": "bhv_piranha_plant_waking_bubbles_loop", + "802b0df0": "bhv_piranha_plant_bubble_loop", + "802b1278": "bhv_purple_switch_loop", + "802b14f4": "func_802B0C54", + "802b15e8": "bhv_pushable_loop", + "802b1714": "func_802B0E74", + "802b17f4": "func_802B0F54", + "802b19d8": "func_802B1138", + "802b1ae0": "bhv_hidden_object_loop", + "802b1b2c": "bhv_breakable_box_loop", + "802b1bb0": "Geo18_802B1BB0", + "802b1c54": "bhv_heave_ho_throw_mario_loop", + "802b1d7c": "ActionHeaveHo1", + "802b1e6c": "ActionHeaveHo2", + "802b1ff4": "ActionHeaveHo3", + "802b20a0": "ActionHeaveHo0", + "802b2154": "func_802B18B4", + "802b2278": "bhv_heave_ho_loop", + "802b2340": "bhv_ccm_touched_star_spawn_loop", + "802b23e0": "bhv_unused_poundable_platform", + "802b2494": "bhv_beta_trampoline_spring_loop", + "802b25ac": "bhv_beta_trampoline_top_loop", + "802b26a4": "ActionJumpingBox0", + "802b27d8": "ActionJumpingBox1", + "802b2824": "func_802B1F84", + "802b288c": "bhv_jumping_box_loop", + "802b29b8": "bhv_boo_cage_loop", + "802b2bc8": "func_802B2328", + "802b2d10": "bhv_alpha_boo_key_loop", + "802b3108": "bhv_beta_boo_key_loop", + "802b3134": "func_802B2894", + "802b3250": "func_802B29B0", + "802b329c": "bhv_grand_star_loop", + "802b3600": "bhv_bowser_key_loop", + "802b37b8": "bhv_white_puff_smoke_init", + "802b3810": "bhv_bullet_bill_init", + "802b3830": "ActionBulletBill0", + "802b38b8": "ActionBulletBill1", + "802b394c": "ActionBulletBill2", + "802b3b08": "ActionBulletBill3", + "802b3b24": "ActionBulletBill4", + "802b3be0": "bhv_bullet_bill_loop", + "802b3c2c": "ActionBowserTailAnchor0", + "802b3cdc": "ActionBowserTailAnchor1", + "802b3d10": "ActionBowserTailAnchor2", + "802b3d74": "bhv_bowser_tail_anchor_loop", + "802b3df4": "bhv_bowser_flame_spawn_loop", + "802b4080": "bhv_bowser_body_anchor_loop", + "802b4184": "func_802B38B4", + "802b41fc": "func_802B392C", + "802b4288": "func_802B39B8", + "802b4300": "func_802B3A30", + "802b4368": "func_802B3A98", + "802b43dc": "func_802B3B0C", + "802b4478": "ActionBowser5", + "802b44bc": "ActionBowser6", + "802b45f4": "func_802B3D24", + "802b473c": "func_802B3E44", + "802b48d4": "func_802B3FDC", + "802b4a1c": "func_802B4124", + "802b4a3c": "func_802B4144", + "802b4af4": "func_u_802B4AF4", + "802b4bac": "ActionBowser18", + "802b4be8": "ActionBowser0", + "802b4ca4": "ActionBowser15", + "802b4d14": "ActionBowser14", + "802b4f00": "ActionBowser16", + "802b5104": "ActionBowser8", + "802b5218": "ActionBowser12", + "802b53f4": "func_802B4A44", + "802b5444": "func_802B4A94", + "802b5554": "func_802B4BA4", + "802b55cc": "ActionBowser13", + "802b5798": "ActionBowser17", + "802b58bc": "ActionBowser10", + "802b59cc": "ActionBowser9", + "802b5aec": "func_802B5108", + "802b5c00": "ActionBowser11", + "802b5c40": "ActionBowser7", + "802b5f6c": "func_802B5588", + "802b5fec": "ActionBowser1", + "802b611c": "func_802B5738", + "802b6190": "ActionBowser2", + "802b6568": "ActionBowser3", + "802b65d0": "func_802B5C78", + "802b6670": "func_802B5D18", + "802b6730": "func_802B5DD8", + "802b67d4": "func_802B5E7C", + "802b6878": "func_802B5F20", + "802b6a10": "func_802B60B8", + "802b6a78": "func_802B6120", + "802b6bac": "func_802B6254", + "802b6cf0": "ActionBowser4", + "802b6e40": "func_802B64E8", + "802b6ee0": "ActionBowser19", + "802b711c": "func_802B67C4", + "802b71e4": "func_802B688C", + "802b72d4": "func_802B697C", + "802b7418": "func_802B6AC0", + "802b75a4": "bhv_bowser_loop", + "802b7878": "bhv_bowser_init", + "802b798c": "Geo18_802B798C", + "802b7a20": "func_802B70C8", + "802b7c64": "geo_switch_bowser_eyes", + "802b7d44": "Geo18_802B7D44", + "802b7e68": "ActionFallingBowserPlatform0", + "802b7ef0": "ActionFallingBowserPlatform1", + "802b8024": "ActionFallingBowserPlatform2", + "802b8384": "bhv_falling_bowser_platform_loop", + "802b83b0": "func_802B7A58", + "802b8434": "func_802B7ADC", + "802b84ac": "bhv_flame_bowser_init", + "802b85b0": "bhv_flame_large_burning_out_init", + "802b8654": "func_802B7CFC", + "802b8734": "bhv_flame_bowser_loop", + "802b8960": "bhv_flame_moving_forward_growing_init", + "802b89ec": "bhv_flame_moving_forward_growing_loop", + "802b8b1c": "bhv_flame_floating_landing_init", + "802b8c38": "bhv_flame_floating_landing_loop", + "802b8d68": "bhv_blue_bowser_flame_init", + "802b8e7c": "bhv_blue_bowser_flame_loop", + "802b9034": "bhv_flame_bouncing_init", + "802b90ec": "bhv_flame_bouncing_loop", + "802b921c": "bhv_blue_flames_group_loop", + "802b935c": "bhv_blue_fish_loop", + "802b9790": "bhv_tank_fish_group_loop", + "802b98d4": "func_802B8F7C", + "802b98fc": "bhv_checkerboard_elevator_group_init", + "802b9a78": "func_802B9120", + "802b9af8": "func_802B91A0", + "802b9bb4": "bhv_checkerboard_platform_init", + "802b9bd8": "bhv_checkerboard_platform_loop", + "802b9e94": "bhv_ddd_warp_loop", + "802b9efc": "func_802B95A4", + "802ba13c": "func_802B97E4", + "802ba19c": "bhv_water_level_pillar_init", + "802ba1e0": "bhv_water_level_pillar_loop", + "802ba25c": "bhv_invisible_objects_under_bridge_init", + "802ba2b0": "Geo18_802BA2B0", + "802ba2f8": "bhv_bowser_key_unlock_door_loop", + "802ba458": "bhv_bowser_key_course_exit_loop", + "802ba5bc": "bhv_moat_grills_loop", + "802ba608": "bhv_rotating_clock_arm_loop", + "802ba7e0": "handle_hat_ukiki_reset", + "802ba868": "is_hat_ukiki_and_mario_has_hat", + "802ba8c4": "unused_Geo18_8029D890", + "802ba958": "idle_ukiki_taunt", + "802bab7c": "ukiki_act_idle", + "802bae40": "ukiki_act_return_home", + "802baec4": "ukiki_act_wait_to_respawn", + "802baf10": "ukiki_act_unused_turn", + "802baf64": "ukiki_act_turn_to_mario", + "802bb07c": "ukiki_act_run", + "802bb288": "ukiki_act_jump", + "802bb3b8": "ukiki_act_go_to_cage", + "802bb798": "ukiki_free_loop", + "802bb888": "cage_ukiki_held_loop", + "802bba3c": "hat_ukiki_held_loop", + "802bbb98": "bhv_ukiki_init", + "802bbc0c": "bhv_ukiki_loop", + "802bbd6c": "func_802BB414", + "802bbfd8": "func_802BB680", + "802bc0f0": "bhv_lll_moving_octagonal_mesh_platform_loop", + "802bc22c": "bhv_lll_sinking_rock_block_loop", + "802bc294": "bhv_lll_rotating_hex_flame_loop", + "802bc348": "func_802BB9F0", + "802bc4f4": "ActionRotatingCwFireBars0", + "802bc538": "ActionRotatingCwFireBars1", + "802bc590": "ActionRotatingCwFireBars2", + "802bc5fc": "ActionRotatingCwFireBars3", + "802bc618": "bhv_lll_rotating_block_fire_bars_loop", + "802bc660": "bhv_lll_wood_piece_loop", + "802bc728": "bhv_lll_floating_wood_bridge_loop", + "802bc898": "bhv_volcano_flames_loop", + "802bc934": "func_802BBFDC", + "802bca74": "bhv_lll_rotating_hexagonal_ring_loop", + "802bcce8": "func_802BC390", + "802bcda8": "bhv_lll_sinking_rectangular_platform_loop", + "802bce58": "bhv_lll_sinking_square_platforms_loop", + "802bce9c": "create_transform_from_normals", + "802bcf40": "bhv_platform_normals_init", + "802bcfc4": "approach_by_increment", + "802bd058": "bhv_tilting_inverted_pyramid_loop", + "802bd3e4": "func_802BCA8C", + "802bd488": "bhv_koopa_shell_flame_loop", + "802bd5dc": "bhv_koopa_shell_flame_spawn", + "802bd62c": "func_802BCCD4", + "802bd680": "bhv_koopa_shell_loop", + "802bd8d0": "func_802BCF78", + "802bd91c": "func_802BCFC4", + "802bdb04": "ActionToxBox4", + "802bdb3c": "ActionToxBox5", + "802bdb74": "ActionToxBox6", + "802bdbac": "ActionToxBox7", + "802bdbe4": "ActionToxBox1", + "802bdc7c": "ActionToxBox2", + "802bdcc8": "ActionToxBox3", + "802bdd14": "ActionToxBox0", + "802bdd68": "bhv_tox_box_loop", + "802bdd9c": "piranha_plant_act_idle", + "802bde10": "piranha_plant_check_interactions", + "802bdeec": "piranha_plant_act_sleeping", + "802be034": "piranha_plant_act_woken_up", + "802be0b8": "piranha_plant_reset_when_far", + "802be0ec": "piranha_plant_attacked", + "802be150": "piranha_plant_act_shrink_and_die", + "802be234": "piranha_plant_act_wait_to_respawn", + "802be278": "piranha_plant_act_respawn", + "802be350": "piranha_plant_act_biting", + "802be49c": "mario_moving_fast_enough_to_make_piranha_plant_bite", + "802be50c": "piranha_plant_act_stopped_biting", + "802be5a0": "bhv_piranha_plant_loop", + "802be628": "bhv_lll_bowser_puzzle_spawn_piece", + "802be6d4": "bhv_lll_bowser_puzzle_spawn_pieces", + "802be79c": "bhv_lll_bowser_puzzle_loop", + "802be8a8": "bhv_lll_bowser_puzzle_piece_action_0", + "802be8b8": "bhv_lll_bowser_puzzle_piece_action_1", + "802be8f4": "bhv_lll_bowser_puzzle_piece_update", + "802be9dc": "bhv_lll_bowser_puzzle_piece_move", + "802beb14": "bhv_lll_bowser_puzzle_piece_idle", + "802beb54": "bhv_lll_bowser_puzzle_piece_move_left", + "802beb8c": "bhv_lll_bowser_puzzle_piece_move_right", + "802bebc4": "bhv_lll_bowser_puzzle_piece_move_up", + "802bebfc": "bhv_lll_bowser_puzzle_piece_move_down", + "802bec34": "bhv_lll_bowser_puzzle_piece_loop", + "802becb0": "func_802BE2E8", + "802bed7c": "play_penguin_walking_sound", + "802bedec": "ActionTuxiesMother2", + "802bef8c": "ActionTuxiesMother1", + "802bf1d8": "ActionTuxiesMother0", + "802bf3c0": "bhv_tuxies_mother_loop", + "802bf424": "func_802BEA58", + "802bf474": "ActionSmallPenguin2", + "802bf57c": "ActionSmallPenguin1", + "802bf648": "ActionSmallPenguin3", + "802bf6e4": "ActionSmallPenguin4", + "802bf760": "ActionSmallPenguin0", + "802bf90c": "ActionSmallPenguin5", + "802bfa14": "func_802BF048", + "802bfa88": "bhv_small_penguin_loop", + "802bfbac": "geo_switch_tuxie_mother_eyes", + "802bfcd8": "ActionFish0", + "802bfeb8": "ActionFish1", + "802bff20": "ActionFish2", + "802bff3c": "bhv_fish_loop", + "802bff68": "func_802BF59C", + "802c00b4": "ActionFishGroup1", + "802c0348": "ActionFishGroup2", + "802c06a8": "ActionFishGroup0", + "802c0768": "bhv_fish_group_2_loop", + "802c08a8": "bhv_wdw_express_elevator_loop", + "802c0aac": "ActionBirdChirpChirp0", + "802c0b50": "ActionBirdChirpChirp1", + "802c0ba4": "ActionBirdChirpChirp2", + "802c0bc4": "ActionBirdChirpChirp3", + "802c0be0": "bhv_bird_chirp_chirp_loop", + "802c0c0c": "func_802C0240", + "802c0cd4": "ActionCheepCheep0", + "802c0d44": "ActionCheepCheep1", + "802c0f90": "ActionCheepCheep2", + "802c1204": "bhv_cheep_cheep_loop", + "802c12c0": "bhv_rotatin_exclamation_box_loop", + "802c1308": "ActionExclamationBox0", + "802c13ec": "ActionExclamationBox1", + "802c14b0": "ActionExclamationBox2", + "802c15b8": "ActionExclamationBox3", + "802c17bc": "func_802C0DF0", + "802c18d0": "ActionExclamationBox4", + "802c1988": "ActionExclamationBox5", + "802c19c0": "bhv_exclamation_box_loop", + "802c19fc": "bhv_sound_spawner_init", + "802c1a40": "bhv_bowsers_sub_loop", + "802c1a80": "bhv_sushi_shark_collision_loop", + "802c1a90": "bhv_sushi_shark_loop", + "802c1c44": "bhv_sunken_ship_part_loop", + "802c1cd4": "bhv_ship_part_3_loop", + "802c1e10": "bhv_jrb_sliding_box_loop", + "802c2190": "bhv_white_puff_1_loop", + "802c2274": "bhv_white_puff_2_loop", + "802c22b8": "bhv_hidden_blue_coin_loop", + "802c242c": "bhv_blue_coin_switch_loop", + "802c263c": "bhv_openable_cage_door_loop", + "802c26f8": "bhv_openable_grill_loop", + "802c2930": "bhv_init_changing_water_level_loop", + "802c2a24": "bhv_water_level_diamond_loop", + "802c2ce8": "func_802C231C", + "802c2ebc": "ActionTweester0", + "802c2fbc": "ActionTweester1", + "802c31c4": "ActionTweester2", + "802c329c": "bhv_tweester_loop", + "802c32e8": "bhv_tweester_sand_particle_loop", + "802c3440": "bhv_boo_init", + "802c3684": "bhv_courtyard_boo_triplet_init", + "802c4824": "bhv_boo_loop", + "802c4f30": "bhv_big_boo_loop", + "802c515c": "bhv_boo_with_cage_init", + "802c51d4": "bhv_boo_with_cage_loop", + "802c5224": "bhv_merry_go_round_boo_manager_loop", + "802c53cc": "obj_set_secondary_camera_focus", + "802c53ec": "bhv_animated_texture_loop", + "802c5414": "bhv_boo_in_castle_loop", + "802c5688": "bhv_boo_boss_spawned_bridge_loop", + "802c5890": "bhv_bbh_tilting_trap_platform_loop", + "802c5a38": "bhv_haunted_bookshelf_loop", + "802c5ca8": "bhv_merry_go_round_loop", + "802c5dc0": "bhv_static_checkered_platform_loop", + "802c5f48": "bhv_beta_bowser_anchor_loop", + "802c5fdc": "bhv_play_music_track_when_touched_loop", + "802c6050": "bhv_floor_trap_in_castle_loop", + "802c60ac": "bhv_castle_floor_trap_init", + "802c6150": "bhv_castle_floor_trap_open_detect", + "802c61d4": "bhv_castle_floor_trap_open", + "802c6278": "bhv_castle_floor_trap_close_detect", + "802c62bc": "bhv_castle_floor_trap_close", + "802c6328": "bhv_castle_floor_trap_rotate", + "802c6348": "bhv_castle_floor_trap_loop", + "802c63e8": "BehClimbDetectLoop", + "802c64a4": "bhv_sparkle_spawn_loop", + "802c6538": "func_802C5A64", + "802c65c0": "bhv_scuttlebug_loop", + "802c6b6c": "bhv_scuttlebug_spawn_loop", + "802c6ca0": "func_802C61CC", + "802c6d6c": "ActionWhomp0", + "802c6ec8": "ActionWhomp7", + "802c6fb0": "ActionWhomp1", + "802c710c": "ActionWhomp2", + "802c7254": "ActionWhomp3", + "802c72b4": "ActionWhomp4", + "802c7380": "ActionWhomp5", + "802c7428": "func_802C6954", + "802c75fc": "func_802C6B28", + "802c76d4": "ActionWhomp6", + "802c7858": "ActionWhomp8", + "802c7998": "ActionWhomp9", + "802c79d8": "bhv_whomp_loop", + "802c7a70": "bhv_water_splash_loop", + "802c7b14": "bhv_water_drops_loop", + "802c7cac": "bhv_surface_waves_loop", + "802c7d40": "bhv_water_surface_white_wave_init", + "802c7d90": "bhv_object_bubble_ripples_init", + "802c7dfc": "bhv_surface_wave_shrinking_init", + "802c7e5c": "bhv_wave_trail_loop", + "802c7f98": "bhv_white_wind_particle_loop", + "802c81b4": "func_802C76E0", + "802c834c": "bhv_snowman_wind_blowing_loop", + "802c85a4": "func_802C7AD0", + "802c863c": "bhv_walking_penguin_loop", + "802c89f0": "update_mario_platform", + "802c8b4c": "get_mario_pos", + "802c8b8c": "set_mario_pos", + "802c8bc8": "apply_platform_displacement", + "802c8ec0": "apply_mario_platform_displacement", + "802c8f28": "clear_mario_platform", + "802c8f40": "Unknown802C8460", + "802c8fe4": "func_802C8504", + "802c91ec": "func_802C870C", + "802c9388": "func_802C88A8", + "802c93f8": "func_802C8918", + "802c94ac": "func_802C89CC", + "802c95b4": "func_802C8AD4", + "802c9630": "func_802C8B50", + "802c9724": "detect_object_collisions", + "802c99b8": "init_free_object_list", + "802c9a3c": "clear_object_lists", + "802c9b68": "unload_object", + "802c9f04": "create_object", + "802ca028": "mark_obj_for_deletion", + "802ca040": "exec_anim_sound_state", + "802ca144": "create_sound_spawner", + "802ca190": "PlaySound", + "802ca1e0": "PlaySound2", + "802ca230": "calc_dist_to_volume_range_1", + "802ca2d4": "calc_dist_to_volume_range_2", + "802ca370": "Stub802C9890", + "802ca380": "Stub802C98A0", + "802ca390": "Stub802C98B0", + "802ca3a0": "Stub802C98C0", + "802ca3b0": "get_current_clock", + "802ca3e0": "get_clock_difference", + "802ca418": "set_print_state_info", + "802ca460": "print_text_array_info", + "802ca51c": "set_text_array_x_y", + "802ca568": "print_debug_bottom_up", + "802ca5b8": "print_debug_top_down_objectinfo", + "802ca618": "print_debug_top_down_mapinfo", + "802ca680": "print_debug_top_down_normal", + "802ca6d0": "print_mapinfo", + "802ca8e8": "print_checkinfo", + "802ca918": "print_surfaceinfo", + "802ca94c": "print_stageinfo", + "802ca990": "print_string_array_info", + "802caa6c": "print_effectinfo", + "802caaa8": "print_enemyinfo", + "802caae4": "update_debug_dpadmask", + "802cabac": "debug_unknown_level_select_check", + "802cac20": "reset_debug_objectinfo", + "802cb0b0": "stub_802CA5D0", + "802cb0c0": "try_print_debug_mario_object_info", + "802cb1c0": "try_print_debug_mario_level_info", + "802cb264": "try_do_mario_debug_object_spawn", + "802cb564": "Unknown802CAA84", + "802cb5c0": "set_and_reset_transition_fade_timer", + "802cb640": "set_transition_color_fade_alpha", + "802cb894": "vertex_transition_color", + "802cba18": "dl_transition_color", + "802cbbc4": "render_fade_transition_from_color", + "802cbc20": "render_fade_transition_into_color", + "802cbc7c": "calc_tex_transition_radius", + "802cbd54": "calc_tex_transition_time", + "802cbe64": "convert_tex_transition_angle_to_pos", + "802cbee0": "center_tex_transition_x", + "802cbf64": "center_tex_transition_y", + "802cbfe8": "make_tex_transition_vertex", + "802cc180": "load_tex_transition_vertex", + "802cc4d8": "render_textured_transition", + "802ccbe8": "render_screen_transition", + "802ccdc8": "render_cannon_circle_base", + "802cd1e8": "geo_cannon_circle_base", + "802cd280": "rotate_rectangle", + "802cd328": "atan2_deg", + "802cd388": "scale_shadow_with_distance", + "802cd444": "disable_shadow_with_distance", + "802cd48c": "dim_shadow_with_distance", + "802cd614": "get_water_level_below_shadow", + "802cd6c4": "init_shadow", + "802cd938": "get_texture_coords_9_vertices", + "802cd988": "get_texture_coords_4_vertices", + "802cd9ec": "make_shadow_vertex_at_xyz", + "802cdb20": "extrapolate_vertex_y_position", + "802cdb74": "get_vertex_coords", + "802cdc40": "calculate_vertex_xyz", + "802cde94": "floor_local_tilt", + "802cdf3c": "make_shadow_vertex", + "802ce128": "add_shadow_to_display_list", + "802ce2bc": "linearly_interpolate_solidity_positive", + "802ce3ec": "linearly_interpolate_solidity_negative", + "802ce524": "correct_shadow_solidity_for_animations", + "802ce690": "correct_lava_shadow_height", + "802ce79c": "create_shadow_player", + "802ce9d0": "create_shadow_circle_9_verts", + "802ceae8": "create_shadow_circle_4_verts", + "802cec04": "create_shadow_circle_assuming_flat_ground", + "802cedc0": "create_shadow_rectangle", + "802cef6c": "get_shadow_height_solidity", + "802cf080": "create_shadow_square", + "802cf1f0": "create_shadow_hardcoded_rectangle", + "802cf34c": "create_shadow_below_xyz", + "802cf5b0": "calculate_skybox_scaled_x", + "802cf69c": "calculate_skybox_scaled_y", + "802cf804": "make_skybox_rect", + "802cfa2c": "draw_skybox_tile_grid", + "802cfc68": "create_skybox_ortho_matrix", + "802cfd88": "init_skybox_display_list", + "802cfef4": "create_skybox_facing_camera", + "802d0080": "geo_wdw_set_initial_water_level", + "802d01e0": "geo_movtex_pause_control", + "802d0254": "movtex_make_quad_vertex", + "802d0484": "movtex_gen_from_quad", + "802d0a84": "movtex_gen_from_quad_array", + "802d0bb0": "movtex_gen_quads_id", + "802d0c84": "get_quad_collection_from_id", + "802d0f28": "movtex_change_texture_format", + "802d104c": "geo_movtex_draw_water_regions", + "802d1330": "update_moving_texture_offset", + "802d13cc": "movtex_write_vertex_first", + "802d1574": "movtex_write_vertex_index", + "802d18b4": "movtex_gen_list", + "802d1b70": "geo_movtex_draw_nocolor", + "802d1cdc": "geo_movtex_draw_colored", + "802d1e48": "geo_movtex_draw_colored_no_update", + "802d1fa8": "geo_movtex_draw_colored_2_no_update", + "802d2108": "geo_movtex_update_horizontal", + "802d2210": "make_vertex", + "802d22c4": "round_float", + "802d2360": "geo_exec_inside_castle_light", + "802d2470": "geo_exec_flying_carpet_timer_update", + "802d2520": "geo_exec_flying_carpet_create", + "802d28cc": "geo_exec_cake_end_screen", + "802d29c0": "stopAllRippleExcept", + "802d2a74": "find_mario_y_position_on_painting", + "802d2b08": "find_mario_z_position_on_painting", + "802d2b84": "painting_find_vertical_ripple_location", + "802d2c40": "find_part_of_painting_near_mario", + "802d2d80": "find_mario_x_position_on_painting", + "802d2dfc": "painting_find_horizontal_ripple_location", + "802d2eb8": "painting_set_ripple_type", + "802d2ffc": "vertical_proximity_ripple_painting_ripple", + "802d319c": "vertical_proximity_ripple_painting_ripple_if_mario_enters", + "802d327c": "vertical_continuous_ripple_painting_ripple", + "802d341c": "vertical_continuous_ripple_painting_ripple_if_mario_enters", + "802d34fc": "horizontal_proximity_ripple_painting_ripple", + "802d36ac": "horizontal_proximity_ripple_painting_ripple_if_mario_enters", + "802d379c": "horizontal_continuous_ripple_painting_ripple", + "802d393c": "horizontal_continuous_ripple_painting_ripple_if_mario_enters", + "802d3a2c": "painting_update_floors", + "802d3bec": "painting_update_ripple_status", + "802d3cec": "painting_calculate_point_ripple", + "802d3e6c": "painting_conditionally_calculate_point_ripple", + "802d3ee4": "Print1", + "802d404c": "Print2", + "802d43f8": "small_float_to_byte", + "802d44bc": "func_802D39DC", + "802d47d0": "func_802D3CF0", + "802d4edc": "func_802D43FC", + "802d50dc": "func_802D45FC", + "802d5354": "func_802D4874", + "802d556c": "display_painting_rippling", + "802d568c": "display_painting_not_rippling", + "802d5778": "reset_painting", + "802d57a8": "update_ddd_painting", + "802d58e4": "func_802D4E04", + "802d593c": "display_painting", + "802d59a8": "vertical_painting_ripple", + "802d5aa0": "horizontal_painting_ripple", + "802d5b98": "Geo18_802D5B98", + "802d5d0c": "Geo18_802D5D0C", + "802d5e00": "int_pow", + "802d5e54": "format_integer", + "802d6144": "parse_width_field", + "802d62d8": "print_text_fmt_int", + "802d6554": "print_text", + "802d66c0": "print_text_centered", + "802d6858": "char_to_glyph_index", + "802d69f8": "add_glyph_texture", + "802d6acc": "clip_to_bounds", + "802d6b3c": "render_textrect", + "802d6c88": "render_text_labels", + "802d6f20": "create_dl_identity_matrix", + "802d7070": "create_dl_translation_matrix", + "802d7174": "create_dl_rotation_matrix", + "802d7280": "create_dl_scale_matrix", + "802d7384": "create_dl_ortho_matrix", + "802d75dc": "render_generic_char", + "802d76c8": "render_multi_text_string", + "802d77dc": "print_generic_string", + "802d7b84": "print_hud_lut_string", + "802d7e88": "print_menu_generic_string", + "802d82d4": "print_credits_string", + "802d862c": "handle_menu_scrolling", + "802d8844": "get_str_x_pos_from_center", + "802d8934": "get_string_width", + "802d89b8": "print_hud_my_score_coins", + "802d8a80": "print_hud_my_score_stars", + "802d8b34": "int_to_str", + "802d8c6c": "get_dialog_id", + "802d8c88": "create_dialog_box", + "802d8cc4": "create_dialog_box_with_var", + "802d8d08": "create_dialog_inverted_box", + "802d8d48": "create_dialog_box_with_response", + "802d8d90": "reset_dialog_render_state", + "802d8e2c": "render_dialog_box_type", + "802d9148": "change_and_flash_dialog_text_color_lines", + "802d9388": "handle_dialog_scroll_page_state", + "802d944c": "render_star_count_dialog_text", + "802d9634": "render_multi_text_string_lines", + "802d9800": "ensure_nonnegative", + "802d982c": "handle_dialog_text_and_pages", + "802d9cb0": "render_dialog_triangle_choice", + "802d9dfc": "render_dialog_string_color", + "802d9f84": "handle_special_dialog_text", + "802da1ac": "render_dialog_entries", + "802da810": "set_menu_mode", + "802da844": "reset_cutscene_msg_fade", + "802da85c": "dl_rgba16_begin_cutscene_msg_fade", + "802da8e4": "dl_rgba16_stop_cutscene_msg_fade", + "802da964": "ascii_to_credits_char", + "802daa34": "print_credits_str_ascii", + "802daae4": "set_cutscene_message", + "802dab58": "do_cutscene_handler", + "802dad54": "print_peach_letter_message", + "802db08c": "render_hud_cannon_reticle", + "802db350": "reset_red_coins_collected", + "802db368": "change_dialog_camera_angle", + "802db3b8": "shade_screen", + "802db498": "print_animated_red_coin", + "802db6e8": "render_pause_red_coins", + "802db760": "render_pause_my_score_coins", + "802dbb24": "render_pause_camera_options", + "802dbe68": "render_pause_course_options", + "802dc15c": "render_pause_castle_menu_box", + "802dc418": "highlight_last_course_complete_stars", + "802dc478": "print_hud_pause_colorful_str", + "802dc570": "render_pause_castle_course_stars", + "802dc718": "render_pause_castle_main_strings", + "802dca88": "render_pause_courses_and_castle", + "802dcd04": "print_hud_course_complete_string", + "802dcf30": "print_hud_course_complete_coins", + "802dd194": "play_star_fanfare_and_flash_hud", + "802dd210": "render_course_complete_lvl_info_and_hud_str", + "802dd838": "render_save_confirmation", + "802ddae0": "render_course_complete_screen", + "802ddca4": "render_menus_and_dialogs", + "802dddf0": "envfx_init_snow", + "802ddf38": "envfx_update_snowflake_count", + "802de0bc": "envfx_cleanup_snow", + "802de114": "orbit_from_positions", + "802de23c": "pos_from_orbit", + "802de360": "envfx_is_snowflake_alive", + "802de458": "envfx_update_snow_normal", + "802de888": "envfx_update_snow_blizzard", + "802ded38": "envfx_update_snow_water", + "802def2c": "rotate_triangle_vertices", + "802df334": "append_snowflake_vertex_buffer", + "802df748": "envfx_update_snow", + "802dfbc8": "envfx_update_particles", + "802dfd50": "particle_is_laterally_close", + "802dfe00": "random_flower_offset", + "802dfe80": "envfx_update_flower", + "802e0120": "envfx_set_lava_bubble_position", + "802e048c": "envfx_update_lava", + "802e065c": "envfx_rotate_around_whirlpool", + "802e08a8": "envfx_is_whirlpool_bubble_alive", + "802e0934": "envfx_update_whirlpool", + "802e0e24": "envfx_is_jestream_bubble_alive", + "802e0eb8": "envfx_update_jetstream", + "802e1238": "envfx_init_bubble", + "802e1414": "envfx_bubbles_update_switch", + "802e1618": "append_bubble_vertex_buffer", + "802e1a20": "envfx_set_bubble_texture", + "802e1bb8": "envfx_update_bubble_particles", + "802e1ed8": "envfx_set_max_bubble_particles", + "802e1f48": "envfx_update_bubbles", + "802e20a0": "convert_rotation", + "802e2134": "spawn_macro_abs_yrot_2params", + "802e21dc": "spawn_macro_abs_yrot_param1", + "802e2284": "spawn_macro_abs_special", + "802e2414": "spawn_macro_objects", + "802e2690": "spawn_macro_objects_hardcoded", + "802e28ec": "spawn_special_objects", + "802e2cf0": "render_hud_tex_lut", + "802e2e58": "render_hud_small_tex_lut", + "802e30b4": "render_power_meter_health_segment", + "802e3214": "render_dl_power_meter", + "802e33b8": "animate_power_meter_emphasized", + "802e352c": "handle_power_meter_actions", + "802e3654": "render_hud_power_meter", + "802e3744": "render_hud_mario_lives", + "802e37a8": "render_hud_coins", + "802e380c": "render_hud_stars", + "802e38e4": "render_hud_keys", + "802e395c": "render_hud_timer", + "802e3b1c": "set_hud_camera_status", + "802e3b3c": "render_hud_camera_status", + "802e3d2c": "render_hud", + "802e3e50": "set_yoshi_as_not_dead", + "802e3e68": "geo_obj_transparency_something", + "802e3f68": "absf_2", + "802e3fac": "turn_obj_away_from_surface", + "802e405c": "obj_find_wall", + "802e41a4": "turn_obj_away_from_steep_floor", + "802e42e0": "obj_orient_graph", + "802e43e4": "calc_obj_friction", + "802e445c": "calc_new_obj_vel_and_pos_y", + "802e4814": "calc_new_obj_vel_and_pos_y_underwater", + "802e4cec": "obj_update_pos_vel_xz", + "802e4d88": "obj_splash", + "802e4e90": "object_step", + "802e5114": "object_step_without_floor_orient", + "802e5160": "obj_move_xyz_using_fvel_and_yaw", + "802e5208": "is_point_within_radius_of_mario", + "802e52b8": "is_point_close_to_object", + "802e5360": "set_object_visibility", + "802e53f4": "obj_return_home_if_safe", + "802e54b0": "obj_return_and_displace_home", + "802e55d0": "obj_check_if_facing_toward_angle", + "802e569c": "obj_find_wall_displacement", + "802e5760": "obj_spawn_yellow_coins", + "802e5824": "obj_flicker_and_disappear", + "802e58b4": "current_mario_room_check", + "802e5948": "trigger_obj_dialog_when_facing", + "802e5a80": "obj_check_floor_death", + "802e5b18": "obj_lava_death", + "802e5c6c": "spawn_orange_number", + "802e5d04": "debug_sequence_tracker", + "802e5de8": "CoinStep", + "802e5e6c": "MovingCoinFlickerLoop", + "802e5ea4": "CoinCollected", + "802e5ee8": "bhv_moving_yellow_coin_init", + "802e5f64": "bhv_moving_yellow_coin_loop", + "802e6098": "bhv_moving_blue_coin_init", + "802e6114": "bhv_moving_blue_coin_loop", + "802e62a4": "bhv_blue_coin_sliding_jumping_init", + "802e631c": "func_802E540C", + "802e63ec": "func_802E54DC", + "802e6474": "bhv_blue_coin_sliding_loop", + "802e6628": "bhv_blue_coin_jumping_loop", + "802e6790": "bhv_seaweed_init", + "802e67dc": "bhv_seaweed_bundle_init", + "802e6a2c": "bhv_bobomb_init", + "802e6a8c": "func_802E5B7C", + "802e6af8": "BobombExplodeLoop", + "802e6bd4": "CheckBobombInteractions", + "802e6cf0": "BobombPatrolLoop", + "802e6dc8": "BobombChaseMarioLoop", + "802e6e84": "BobombLaunchedLoop", + "802e6ed8": "GenericBobombFreeLoop", + "802e7020": "StationaryBobombFreeLoop", + "802e7134": "BobombFreeLoop", + "802e7180": "BobombHeldLoop", + "802e7220": "BobombDroppedLoop", + "802e7280": "BobombThrownLoop", + "802e7324": "ObjRandomBlink", + "802e742c": "bhv_bobomb_loop", + "802e75a0": "bhv_bobomb_fuse_smoke_init", + "802e76ac": "bhv_bobomb_buddy_init", + "802e770c": "BobombBuddyIdleLoop", + "802e7814": "BobombBuddyCannonLoop", + "802e79dc": "BobombBuddyTalkLoop", + "802e7b00": "BobombBuddyTurnToTalkLoop", + "802e7bb0": "BobombBuddyActionLoop", + "802e7c4c": "bhv_bobomb_buddy_loop", + "802e7c90": "bhv_cannon_closed_init", + "802e7d4c": "CannonTrapDoorOpeningLoop", + "802e7e54": "bhv_cannon_closed_loop", + "802e7f70": "bhv_whirlpool_init", + "802e7fb8": "func_802E70A8", + "802e7fec": "func_802E70DC", + "802e80dc": "bhv_whirlpool_loop", + "802e82b0": "bhv_jet_stream_loop", + "802e8388": "bhv_homing_amp_init", + "802e89d4": "bhv_homing_amp_loop", + "802e8ae4": "bhv_circling_amp_init", + "802e8ecc": "bhv_circling_amp_loop", + "802e8f68": "bhv_butterfly_init", + "802e9018": "ButterflyStep", + "802e9278": "CalculateButterflyAngle", + "802e9470": "ButterflyRestingLoop", + "802e94e4": "ButterflyFollowMarioLoop", + "802e9548": "ButterflyReturnHomeLoop", + "802e96c8": "bhv_butterfly_loop", + "802e9764": "bhv_hoot_init", + "802e97fc": "HootFindNextFloor", + "802e98c0": "HootFloorBounce", + "802e9a4c": "HootFreeStep", + "802e9cf4": "PlayerSetHootYaw", + "802e9d98": "HootCarryStep", + "802e9f60": "HootSurfaceCollision", + "802ea144": "HootAscentLoop", + "802ea258": "HootActionLoop", + "802ea3f0": "HootTurnToHome", + "802ea4ec": "HootAwakeLoop", + "802ea588": "bhv_hoot_loop", + "802ea6a8": "bhv_beta_holdable_object_init", + "802ea7e0": "bhv_beta_holdable_object_loop", + "802ea888": "bhv_object_bubble_init", + "802ea934": "bhv_object_bubble_loop", + "802eaa10": "bhv_object_water_wave_init", + "802eaa50": "bhv_object_water_wave_loop", + "802eaa8c": "bhv_explosion_init", + "802eaad0": "bhv_explosion_loop", + "802eabf0": "bhv_bobomb_bully_death_smoke_init", + "802eac3c": "bhv_bobomb_explosion_bubble_init", + "802ead3c": "bhv_bobomb_explosion_bubble_loop", + "802eaef8": "bhv_respawner_loop", + "802eaf84": "create_respawner", + "802eb05c": "bhv_small_bully_init", + "802eb104": "bhv_big_bully_init", + "802eb1c0": "BullyCheckMarioCollision", + "802eb288": "BullyChaseMarioLoop", + "802eb3f0": "BullyKnockbackLoop", + "802eb510": "BullyBackUpLoop", + "802eb5c4": "BullyBackUpCheck", + "802eb630": "PlayBullyStompingSound", + "802eb744": "BullyStep", + "802eb7e0": "BullySpawnCoin", + "802eb8b0": "BullyLavaDeath", + "802eb9d0": "bhv_bully_loop", + "802ebb74": "BigBullySpawnMinion", + "802ebc00": "bhv_big_bully_with_minions_init", + "802ebc88": "BigBullyWithMinionsLavaDeath", + "802ebce0": "bhv_big_bully_with_minions_loop", + "802ebf70": "WaterRingCalcMarioDistInFront", + "802ec030": "WaterRingInit", + "802ec1b0": "bhv_jet_stream_water_ring_init", + "802ec200": "CheckWaterRingCollection", + "802ec3d0": "SetWaterRingScale", + "802ec4e0": "WaterRingCollectedLoop", + "802ec59c": "JetStreamWaterRingNotCollectedLoop", + "802ec75c": "bhv_jet_stream_water_ring_loop", + "802ec7cc": "Unknown802EB8A4", + "802ec818": "JetStreamRingSpawnerActiveLoop", + "802ec908": "bhv_jet_stream_ring_spawner_loop", + "802ec9b8": "bhv_manta_ray_water_ring_init", + "802ec9f0": "MantaRayWaterRingNotCollectedLoop", + "802ecba4": "bhv_manta_ray_water_ring_loop", + "802ecc14": "bhv_bowser_bomb_loop", + "802ecd0c": "bhv_bowser_bomb_explosion_loop", + "802ecea0": "bhv_bowser_bomb_smoke_loop", + "802ecfac": "bhv_celebration_star_init", + "802ed10c": "CelebrationStarSpinAroundMarioLoop", + "802ed28c": "CelebrationStarFaceCameraLoop", + "802ed39c": "bhv_celebration_star_loop", + "802ed40c": "bhv_celebration_star_sparkle_loop", + "802ed45c": "bhv_star_key_collection_puff_spawner_loop", + "802ed498": "bhv_lll_drawbridge_spawner_loop", + "802ed62c": "bhv_lll_drawbridge_loop", + "802ed78c": "bhv_small_bomp_init", + "802ed7fc": "bhv_small_bomp_loop", + "802edacc": "bhv_large_bomp_init", + "802edb2c": "bhv_large_bomp_loop", + "802eddfc": "bhv_wf_sliding_platform_init", + "802edf28": "bhv_wf_sliding_platform_loop", + "802ee124": "bhv_moneybag_init", + "802ee1a0": "MoneybagCheckMarioCollision", + "802ee268": "MoneybagJump", + "802ee46c": "MoneybagMoveAroundLoop", + "802ee598": "MoneybagReturnHomeLoop", + "802ee728": "MoneybagDisappearLoop", + "802ee778": "MoneybagDeathLoop", + "802ee7e0": "bhv_moneybag_loop", + "802ee8f4": "bhv_moneybag_hidden_loop", + "802ee9cc": "bhv_bowling_ball_init", + "802eea24": "func_802EDA14", + "802eea7c": "func_802EDA6C", + "802eeb64": "bhv_bowling_ball_roll_loop", + "802eecb8": "bhv_bowling_ball_initializeLoop", + "802eedf0": "bhv_bowling_ball_loop", + "802eeeb4": "bhv_generic_bowling_ball_spawner_init", + "802eef9c": "bhv_generic_bowling_ball_spawner_loop", + "802ef0e8": "bhv_thi_bowling_ball_spawner_loop", + "802ef21c": "bhv_bob_pit_bowling_ball_init", + "802ef274": "bhv_bob_pit_bowling_ball_loop", + "802ef34c": "bhv_free_bowling_ball_init", + "802ef3f4": "bhv_free_bowling_ball_roll_loop", + "802ef524": "bhv_free_bowling_ball_loop", + "802ef63c": "bhv_rr_cruiser_wing_init", + "802ef66c": "bhv_rr_cruiser_wing_loop", + "802ef820": "bhv_spindel_init", + "802ef858": "bhv_spindel_loop", + "802efcd0": "bhv_ssl_moving_pyramid_wall_init", + "802efd8c": "bhv_ssl_moving_pyramid_wall_loop", + "802efe64": "bhv_pyramid_elevator_init", + "802efef4": "bhv_pyramid_elevator_loop", + "802f0104": "bhv_pyramid_elevator_trajectory_marker_ball_loop", + "802f0168": "bhv_pyramid_top_init", + "802f0288": "bhv_pyramid_top_spinning", + "802f04a0": "bhv_pyramid_top_explode", + "802f05b4": "bhv_pyramid_top_loop", + "802f06a8": "bhv_pyramid_top_fragment_init", + "802f0714": "bhv_pyramid_top_fragment_loop", + "802f0788": "bhv_pyramid_pillar_touch_detector_loop", + "802f07f4": "bhv_waterfall_sound_loop", + "802f0820": "bhv_volcano_sound_loop", + "802f084c": "bhv_castle_flag_init", + "802f0898": "bhv_birds_sound_loop", + "802f0950": "bhv_ambient_sounds_init", + "802f09a4": "bhv_sand_sound_loop", + "802f09f0": "bhv_castle_cannon_grate_init", + "802f0a40": "bhv_snowmans_bottom_init", + "802f0b7c": "func_802EFB2C", + "802f0bd4": "func_802EFB84", + "802f0c94": "func_802EFC44", + "802f0df0": "func_802EFDA0", + "802f0fa8": "func_802EFF58", + "802f105c": "bhv_snowmans_bottom_loop", + "802f120c": "bhv_snowmans_head_init", + "802f1370": "bhv_snowmans_head_loop", + "802f151c": "bhv_snowmans_body_checkpoint_loop", + "802f15a8": "bhv_big_boulder_init", + "802f162c": "func_802F05DC", + "802f1714": "bhv_big_boulder_loop", + "802f17f0": "bhv_big_boulder_generator_loop", + "802f1954": "func_802F0904", + "802f19c8": "func_802F0978", + "802f1a10": "func_802F09C0", + "802f1bb8": "func_802F0B68", + "802f1d64": "bhv_wing_cap_init", + "802f1dc0": "func_802F0D70", + "802f1e5c": "func_802F0E0C", + "802f1f3c": "bhv_wing_vanish_cap_loop", + "802f1fd0": "bhv_metal_cap_init", + "802f2030": "func_802F0FE0", + "802f20ac": "bhv_metal_cap_loop", + "802f2140": "bhv_normal_cap_init", + "802f21e0": "func_802F1190", + "802f2284": "func_802F1234", + "802f23a8": "bhv_normal_cap_loop", + "802f2498": "bhv_vanish_cap_init", + "802f24f4": "bhv_collect_star_init", + "802f25b0": "bhv_collect_star_loop", + "802f2614": "bhv_star_spawn_init", + "802f2768": "bhv_star_spawn_loop", + "802f2aa0": "func_802F1A50", + "802f2b88": "create_star", + "802f2bd4": "func_802F1B84", + "802f2c24": "func_802F1BD4", + "802f2c84": "bhv_hidden_red_coin_star_init", + "802f2d8c": "bhv_hidden_red_coin_star_loop", + "802f2e6c": "bhv_red_coin_init", + "802f2f2c": "bhv_red_coin_loop", + "802f3014": "bhv_hidden_star_init", + "802f30f0": "bhv_hidden_star_loop", + "802f31bc": "bhv_hidden_star_trigger_loop", + "802f328c": "bhv_bowser_course_red_coin_star_loop", + "802f336c": "bhv_ttm_rolling_log_init", + "802f341c": "func_802F238C", + "802f36a4": "bhv_rolling_log_loop", + "802f38b0": "func_802F2820", + "802f39b4": "func_802F2924", + "802f3a30": "bhvLllVolcanoFallingTrap_loop", + "802f3b98": "bhv_lll_rolling_log_init", + "802f3c54": "bhv_1up_interact", + "802f3cc8": "bhv_1up_common_init", + "802f3d30": "bhv_1up_init", + "802f3dd0": "func_802F2D40", + "802f3ea8": "func_802F2E18", + "802f401c": "func_802F2F8C", + "802f40cc": "bhv_1up_walking_loop", + "802f4248": "bhv_1up_running_away_loop", + "802f43b8": "func_802F3328", + "802f44c0": "bhv_1up_sliding_loop", + "802f45b8": "bhv_1up_loop", + "802f45f0": "bhv_1up_jump_on_approach_loop", + "802f4710": "bhv_1up_hidden_loop", + "802f48f4": "bhv_1up_hidden_trigger_loop", + "802f496c": "bhv_1up_hidden_in_pole_loop", + "802f4b00": "bhv_1up_hidden_in_pole_trigger_loop", + "802f4b78": "bhv_1up_hidden_in_pole_spawner_loop", + "802f4c68": "func_802F3BD8", + "802f4ce0": "func_802F3C50", + "802f4d78": "bhv_controllable_platform_sub_loop", + "802f4eb4": "bhv_controllable_platform_init", + "802f5010": "func_802F3F80", + "802f5068": "func_802F3FD8", + "802f52c0": "func_802F4230", + "802f547c": "func_802F43EC", + "802f55a4": "bhv_controllable_platform_loop", + "802f5cd4": "bhv_breakable_box_small_init", + "802f5d78": "func_802F4CE8", + "802f5e44": "func_802F4DB4", + "802f5f48": "breakable_box_small_released_loop", + "802f6014": "breakable_box_small_idle_loop", + "802f60d8": "breakable_box_small_get_dropped", + "802f6150": "breakable_box_small_get_thrown", + "802f6228": "bhv_breakable_box_small_loop", + "802f62e4": "bhv_sliding_snow_mound_loop", + "802f6448": "bhv_snow_mound_spawn_loop", + "802f6588": "func_802F54F8", + "802f665c": "func_802F55CC", + "802f6984": "bhv_floating_platform_loop", + "802f6c0c": "bhv_arrow_lift_loop", + "802f6d20": "bhv_orange_number_init", + "802f6d58": "bhv_orange_number_loop", + "802f6e40": "bhv_manta_ray_init", + "802f6eb0": "func_802F5E20", + "802f7068": "func_802F5FD8", + "802f7264": "bhv_manta_ray_loop", + "802f7348": "bhv_falling_pillar_init", + "802f7398": "bhv_falling_pillar_spawn_hitboxes", + "802f7418": "bhv_falling_pillar_calculate_angle_in_front_of_mario", + "802f74dc": "bhv_falling_pillar_loop", + "802f7760": "bhv_falling_pillar_hitbox_loop", + "802f7924": "bhv_jrb_floating_box_loop", + "802f7978": "bhv_decorative_pendulum_init", + "802f79b0": "bhv_decorative_pendulum_loop", + "802f7a58": "bhv_treasure_chest_top_loop", + "802f7c9c": "bhv_treasure_chest_bottom_init", + "802f7d04": "bhv_treasure_chest_bottom_loop", + "802f7f1c": "func_802F6E8C", + "802f7fa0": "bhv_treasure_chest_ship_init", + "802f8044": "bhv_treasure_chest_ship_loop", + "802f8158": "bhv_treasure_chest_jrb_init", + "802f8208": "bhv_treasure_chest_jrb_loop", + "802f82f8": "bhv_treasure_chest_init", + "802f83a4": "bhv_treasure_chest_loop", + "802f8490": "bhv_mips_init", + "802f85e0": "bhv_mips_find_furthest_waypoint_to_mario", + "802f8760": "bhv_mips_act_wait_for_nearby_mario", + "802f8808": "bhv_mips_act_follow_path", + "802f893c": "bhv_mips_act_wait_for_animation_done", + "802f8988": "bhv_mips_act_fall_down", + "802f8a34": "bhv_mips_act_idle", + "802f8ab4": "bhv_mips_free", + "802f8b54": "bhv_mips_held", + "802f8c74": "bhv_mips_dropped", + "802f8cf8": "bhv_mips_thrown", + "802f8dac": "bhv_mips_loop", + "802f8e54": "bhv_yoshi_init", + "802f8f08": "yoshi_walk_loop", + "802f9054": "yoshi_idle_loop", + "802f923c": "yoshi_talk_loop", + "802f93a8": "yoshi_walk_and_jump_off_roof_loop", + "802f9500": "yoshi_finish_jumping_and_despawn_loop", + "802f95ac": "yoshi_give_present_loop", + "802f965c": "BehYoshiLoop", + "802fbc4c": "bhv_koopa_init", + "802fc414": "shelled_koopa_attack_handler", + "802fcc00": "obj_begin_race", + "802fd7f8": "bhv_koopa_update", + "802fd950": "bhv_koopa_race_endpoint_update", + "802fda28": "bhv_pokey_body_part_update", + "802fe3b0": "bhv_pokey_update", + "802fe8b4": "bhv_swoop_update", + "802ff040": "bhv_fly_guy_update", + "802ff214": "bhv_goomba_triplet_spawner_update", + "802ff408": "bhv_goomba_init", + "802ff94c": "huge_goomba_weakly_attacked", + "802ff96c": "bhv_goomba_update", + "802ffb38": "bhv_chain_chomp_chain_part_update", + "80300e40": "bhv_chain_chomp_update", + "80300ecc": "bhv_wooden_post_update", + "80301148": "bhv_chain_chomp_gate_init", + "80301180": "bhv_chain_chomp_gate_update", + "80301210": "bhv_wiggler_body_part_update", + "803020e4": "wiggler_jumped_on_attack_handler", + "80302154": "bhv_wiggler_update", + "80302910": "bhv_spiny_update", + "80303028": "bhv_enemy_lakitu_update", + "8030369c": "bhv_cloud_update", + "80303744": "bhv_cloud_part_update", + "80303984": "bhv_camera_lakitu_init", + "80303f64": "bhv_camera_lakitu_update", + "803043f8": "bhv_monty_mole_hole_update", + "803044c0": "bhv_monty_mole_init", + "80304ba8": "bhv_monty_mole_update", + "80304fd4": "bhv_monty_mole_rock_update", + "80305100": "bhv_platform_on_track_init", + "80305a58": "bhv_platform_on_track_update", + "80305bb0": "bhv_track_ball_update", + "80305c14": "bhv_seesaw_platform_init", + "80305c90": "bhv_seesaw_platform_update", + "80305e2c": "bhv_ferris_wheel_axle_init", + "80305f24": "bhv_ferris_wheel_platform_update", + "80306084": "bhv_water_bomb_spawner_update", + "803067e8": "bhv_water_bomb_update", + "803068c0": "bhv_water_bomb_shadow_update", + "8030699c": "bhv_ttc_rotating_solid_init", + "80306a38": "bhv_ttc_rotating_solid_update", + "80306cc4": "bhv_ttc_pendulum_init", + "80306d38": "bhv_ttc_pendulum_update", + "80306f48": "bhv_ttc_treadmill_init", + "80307010": "bhv_ttc_treadmill_update", + "803071b8": "bhv_ttc_moving_bar_init", + "80307670": "bhv_ttc_moving_bar_update", + "80307760": "bhv_ttc_cog_init", + "803077e0": "bhv_ttc_cog_update", + "80307930": "bhv_ttc_pit_block_init", + "803079c8": "bhv_ttc_pit_block_update", + "80307ae4": "bhv_ttc_elevator_init", + "80307b58": "bhv_ttc_elevator_update", + "80307c88": "bhv_ttc_2d_rotator_init", + "80307cf8": "bhv_ttc_2d_rotator_update", + "80307ea4": "bhv_ttc_spinner_update", + "8030803c": "bhv_mr_blizzard_init", + "80308d6c": "bhv_mr_blizzard_update", + "80309154": "bhv_mr_blizzard_snowball", + "803091e0": "bhv_sliding_plat_2_init", + "80309354": "bhv_sliding_plat_2_loop", + "80309454": "bhv_rotating_octagonal_plat_init", + "803094d0": "bhv_rotating_octagonal_plat_loop", + "803094f8": "bhv_animates_on_floor_switch_press_init", + "80309530": "bhv_animates_on_floor_switch_press_loop", + "803097a4": "bhv_activated_back_and_forth_platform_init", + "803098c0": "bhv_activated_back_and_forth_platform_update", + "80309b64": "bhv_recovery_heart_loop", + "80309cec": "bhv_bubble_cannon_barrel_loop", + "80309ed4": "water_bomb_cannon_act_0", + "80309f68": "water_bomb_cannon_act_1", + "8030a0e8": "water_bomb_cannon_act_2", + "8030a11c": "bhv_water_bomb_cannon_loop", + "8030a1c0": "bhv_unagi_init", + "8030a2a8": "unagi_act_0", + "8030a390": "unagi_act_1_4", + "8030a514": "unagi_act_2", + "8030a614": "unagi_act_3", + "8030a93c": "bhv_unagi_loop", + "8030aabc": "bhv_unagi_subobject_loop", + "8030b2f4": "bhv_dorrie_update", + "8030b658": "bhv_haunted_chair_init", + "8030b6d8": "haunted_chair_act_0", + "8030ba68": "haunted_chair_act_1", + "8030bc90": "bhv_haunted_chair_loop", + "8030bfd0": "bhv_mad_piano_update", + "8030c06c": "flying_bookend_act_0", + "8030c0f0": "flying_bookend_act_1", + "8030c210": "flying_bookend_act_2", + "8030c2c8": "flying_bookend_act_3", + "8030c364": "bhv_flying_bookend_loop", + "8030c4b0": "bhv_bookend_spawn_loop", + "8030c564": "bookshelf_manager_act_0", + "8030c60c": "bookshelf_manager_act_1", + "8030c6a4": "bookshelf_manager_act_2", + "8030c828": "bookshelf_manager_act_3", + "8030c894": "bookshelf_manager_act_4", + "8030c8ec": "bhv_haunted_bookshelf_manager_loop", + "8030c98c": "bhv_book_switch_loop", + "8030cd30": "obj_spit_fire", + "8030cddc": "bhv_fire_piranha_plant_init", + "8030d2f0": "bhv_fire_piranha_plant_update", + "8030d598": "bhv_fire_spitter_update", + "8030d640": "bhv_small_piranha_flame_loop", + "8030d8d4": "bhv_fly_guy_flame_loop", + "8030d93c": "Geo18_8030D93C", + "8030d9ac": "Geo18_8030D9AC", + "8030da14": "snufit_act_0", + "8030db38": "snufit_act_1", + "8030dc70": "bhv_snufit_loop", + "8030dfc4": "bhv_snufit_balls_loop", + "8030e14c": "bhv_horizontal_grindel_init", + "8030e16c": "bhv_horizontal_grindel_update", + "8030ea9c": "bhv_eyerok_boss_loop", + "8030fff8": "bhv_eyerok_hand_loop", + "80310498": "bhv_klepto_init", + "8031126c": "obj_set_speed_to_zero", + "8031129c": "bhv_klepto_update", + "80311874": "bhv_bird_update", + "803118e4": "bhv_racing_penguin_init", + "80312070": "bhv_racing_penguin_update", + "80312168": "bhv_penguin_race_finish_line_update", + "80312200": "bhv_penguin_race_shortcut_check_update", + "80312248": "bhv_coffin_manager_loop", + "80312370": "coffin_act_0", + "8031262c": "coffin_act_1", + "8031274c": "bhv_coffin_loop", + "80312804": "clam_act_0", + "80312900": "clam_act_1", + "80312a54": "bhv_clam_loop", + "80313110": "bhv_skeeter_update", + "803131e8": "bhv_skeeter_wave_update", + "8031326c": "bhv_swing_platform_init", + "80313294": "bhv_swing_platform_update", + "80313354": "bhv_donut_platform_spawner_update", + "80313530": "bhv_donut_platform_update", + "803136cc": "bhv_ddd_pole_init", + "80313754": "bhv_ddd_pole_update", + "803137f4": "bhv_red_coin_star_marker_init", + "80313fc0": "bhv_triplet_butterfly_update", + "80314098": "bubba_act_0", + "8031427c": "bubba_act_1", + "803145d4": "bhv_bubba_loop", + "80314a30": "prepare_reverb_ring_buffer", + "80314cc0": "get_volume_ramping", + "80314de4": "synthesis_execute", + "80314f64": "synthesis_do_one_audio_update", + "80315590": "synthesis_process_notes", + "80316010": "load_wave_samples", + "803160dc": "final_resample", + "80316138": "process_envelope", + "8031619c": "process_envelope_inner", + "803166fc": "note_apply_headset_pan_effects", + "80316ac8": "note_init_volume", + "80316af4": "note_set_vel_pan_reverb", + "80316da8": "note_set_frequency", + "80316db4": "note_enable", + "80316e00": "note_disable", + "80316e80": "reset_bank_and_seq_load_status", + "80316ec4": "discard_bank", + "80316fb4": "discard_sequence", + "80317040": "soundAlloc", + "803170b4": "sound_alloc_pool_init", + "803170d4": "persistent_pool_clear", + "803170e8": "temporary_pool_clear", + "80317118": "unused_803160F8", + "80317128": "sound_init_main_pools", + "80317184": "session_pools_init", + "80317200": "seq_and_bank_pool_init", + "8031727c": "persistent_pools_init", + "80317338": "temporary_pools_init", + "803173fc": "alloc_bank_or_seq", + "8031782c": "get_bank_or_seq", + "803178ec": "decrease_reverb_gain", + "80317914": "wait_for_audio_frames", + "80317948": "audio_reset_session", + "80318040": "audio_dma_copy_immediate", + "803180c4": "audio_dma_copy_async", + "80318130": "audio_dma_partial_copy_async", + "803181ec": "decrease_sample_dma_ttls", + "80318300": "dma_sample_data", + "80318634": "init_sample_dma_buffers", + "803188f4": "patch_audio_bank", + "80318b30": "bank_load_immediate", + "80318c8c": "bank_load_async", + "80318dc4": "sequence_dma_immediate", + "80318e70": "sequence_dma_async", + "80318fac": "get_missing_bank", + "803190f4": "load_banks_immediate", + "80319220": "preload_sequence", + "80319328": "load_sequence", + "80319388": "load_sequence_internal", + "8031950c": "audio_init", + "80319920": "note_init", + "80319998": "note_disable2", + "803199b8": "process_notes", + "80319db8": "seq_channel_layer_decay_release_internal", + "80319f64": "seq_channel_layer_note_decay", + "80319f84": "seq_channel_layer_note_release", + "80319fa4": "build_synthetic_wave", + "8031a1d0": "init_synthetic_wave", + "8031a254": "init_note_list", + "8031a264": "init_note_lists", + "8031a2b4": "init_note_free_list", + "8031a368": "note_pool_clear", + "8031a494": "note_pool_fill", + "8031a5d0": "audio_list_push_front", + "8031a610": "audio_list_remove", + "8031a63c": "pop_node_with_value_less_equal", + "8031a6cc": "note_init_for_layer", + "8031a794": "func_80319728", + "8031a7c8": "note_release_and_take_ownership", + "8031a820": "alloc_note_from_disabled", + "8031a89c": "alloc_note_from_decaying", + "8031a8f0": "alloc_note_from_active", + "8031a94c": "alloc_note", + "8031ac34": "reclaim_notes", + "8031adac": "note_init_all", + "8031aee0": "func_80319E70", + "8031aee8": "sequence_player_process_sound", + "8031b0cc": "get_portamento_freq_scale", + "8031b1c0": "get_vibrato_pitch_change", + "8031b248": "get_vibrato_freq_scale", + "8031b440": "note_vibrato_update", + "8031b4a0": "note_vibrato_init", + "8031b58c": "adsr_init", + "8031b5ac": "adsr_update", + "8031b830": "sequence_channel_init", + "8031b940": "seq_channel_set_layer", + "8031ba30": "seq_channel_layer_disable", + "8031ba6c": "seq_channel_layer_free", + "8031baf0": "sequence_channel_disable", + "8031bb5c": "allocate_sequence_channel", + "8031bba4": "sequence_player_init_channels", + "8031bcd0": "sequence_player_disable_channels", + "8031bda0": "sequence_channel_enable", + "8031be44": "sequence_player_disable", + "8031bf14": "audio_list_push_back", + "8031bf54": "audio_list_pop_back", + "8031bf94": "init_layer_freelist", + "8031c03c": "m64_read_u8", + "8031c050": "m64_read_s16", + "8031c080": "m64_read_compressed_u16", + "8031c0c4": "seq_channel_layer_process_script", + "8031c200": "L_U_8031C200", + "8031c23c": "L_U_8031C23C", + "8031c298": "L_U_8031C298", + "8031c2dc": "L_U_8031C2DC", + "8031c328": "L_U_8031C328", + "8031c36c": "L_U_8031C36C", + "8031c3bc": "L_U_8031C3BC", + "8031c3e8": "L_U_8031C3E8", + "8031c454": "L_U_8031C454", + "8031c4a4": "L_U_8031C4A4", + "8031c5c8": "L_U_8031C5C8", + "8031c698": "L_U_8031C698", + "8031c6a0": "L_U_8031C6A0", + "8031cbe0": "L_U_8031CBE0", + "8031cbec": "L_U_8031CBEC", + "8031ce54": "get_instrument", + "8031cfd4": "set_instrument", + "8031d068": "sequence_channel_set_volume", + "8031d08c": "sequence_channel_process_script", + "8031d144": "L_U_8031D144", + "8031d1f8": "L_U_8031D1F8", + "8031d234": "L_U_8031D234", + "8031d26c": "L_U_8031D26C", + "8031d2b4": "L_U_8031D2B4", + "8031d2c4": "L_U_8031D2C4", + "8031d31c": "L_U_8031D31C", + "8031d344": "L_U_8031D344", + "8031d354": "L_U_8031D354", + "8031d370": "L_U_8031D370", + "8031d3a8": "L_U_8031D3A8", + "8031d3c4": "L_U_8031D3C4", + "8031d3d4": "L_U_8031D3D4", + "8031d3e4": "L_U_8031D3E4", + "8031d400": "L_U_8031D400", + "8031d424": "L_U_8031D424", + "8031d44c": "L_U_8031D44C", + "8031d474": "L_U_8031D474", + "8031d498": "L_U_8031D498", + "8031d4bc": "L_U_8031D4BC", + "8031d4d4": "L_U_8031D4D4", + "8031d4f0": "L_U_8031D4F0", + "8031d500": "L_U_8031D500", + "8031d51c": "L_U_8031D51C", + "8031d538": "L_U_8031D538", + "8031d56c": "L_U_8031D56C", + "8031d5a0": "L_U_8031D5A0", + "8031d5b4": "L_U_8031D5B4", + "8031d5d4": "L_U_8031D5D4", + "8031d5e4": "L_U_8031D5E4", + "8031d640": "L_U_8031D640", + "8031d678": "L_U_8031D678", + "8031d6c4": "L_U_8031D6C4", + "8031d6d4": "L_U_8031D6D4", + "8031d6f4": "L_U_8031D6F4", + "8031d718": "L_U_8031D718", + "8031d728": "L_U_8031D728", + "8031d73c": "L_U_8031D73C", + "8031d7b8": "L_U_8031D7B8", + "8031d7e8": "L_U_8031D7E8", + "8031d7f8": "L_U_8031D7F8", + "8031d814": "L_U_8031D814", + "8031d830": "L_U_8031D830", + "8031d87c": "L_U_8031D87C", + "8031d898": "L_U_8031D898", + "8031d8f8": "L_U_8031D8F8", + "8031d900": "L_U_8031D900", + "8031d930": "L_U_8031D930", + "8031d94c": "L_U_8031D94C", + "8031d974": "L_U_8031D974", + "8031d9ec": "sequence_player_process_sequence", + "8031e240": "process_sequences", + "8031e2e8": "init_sequence_player", + "8031e374": "init_sequence_players", + "8031e4f0": "unused_8031E4F0", + "8031e568": "unused_8031E568", + "8031e7b8": "create_next_audio_frame_task", + "8031eb00": "play_sound", + "8031fd84": "audio_signal_game_loop_tick", + "8031fdac": "update_game_sound", + "80320544": "play_sequence", + "80320678": "sequence_player_fade_out", + "803206bc": "fade_volume_scale", + "80320734": "fade_channel_volume_scale", + "8032080c": "func_8031F96C", + "803208ec": "process_level_music_dynamics", + "80320a4c": "L8031FBAC", + "80320a8c": "L8031FBEC", + "80320acc": "L8031FC2C", + "80320b0c": "L8031FC6C", + "80320b4c": "L8031FCAC", + "80320b8c": "L8031FCEC", + "80320bcc": "L8031FD2C", + "80320bf4": "L8031FD54", + "80320d70": "unused_8031FED0", + "80320e3c": "func_8031FFB4", + "80320ec4": "sequence_player_unlower", + "80320f68": "func_803200E4", + "803210d4": "set_sound_disabled", + "8032112c": "sound_init", + "80321398": "get_currently_playing_sound", + "80321474": "func_803205E8", + "80321584": "func_803206F8", + "8032171c": "func_80320890", + "8032174c": "sound_banks_disable", + "8032180c": "sound_banks_enable", + "80321864": "unused_803209D8", + "803218d8": "func_80320A4C", + "803218f4": "play_dialog_sound", + "803219ac": "play_music", + "80321bac": "stop_background_music", + "80321ce4": "fadeout_background_music", + "80321d38": "drop_queued_background_music", + "80321d5c": "get_current_background_music", + "80321d9c": "func_80320ED8", + "80321e48": "play_secondary_music", + "80321f48": "func_80321080", + "80321f9c": "func_803210D4", + "80322078": "play_course_clear", + "803220b4": "play_peachs_jingle", + "803220f0": "play_puzzle_jingle", + "8032212c": "play_star_fanfare", + "80322168": "play_power_star_jingle", + "803221b8": "play_race_fanfare", + "803221f4": "play_toads_jingle", + "80322230": "sound_reset", + "8032231c": "audio_set_sound_mode", + "80322348": "unused_80321460", + "8032235c": "unused_80321474", + "803223b0": ".", + "803223b0": "osSetTime", + "803223e0": "osMapTLB", + "803224a0": "osUnmapTLBAll", + "803224f0": "sprintf", + "8032255c": "proutSprintf", + "803225a0": "osCreateMesgQueue", + "803225d0": "osSetEventMesg", + "80322640": "osViSetEvent", + "803226b0": "osCreateThread", + "80322800": "osRecvMesg", + "80322940": "_VirtualToPhysicalTask", + "80322a5c": "osSpTaskLoad", + "80322bbc": "osSpTaskStartGo", + "80322c00": "osSpTaskYield", + "80322c20": "osSendMesg", + "80322d70": "osSpTaskYielded", + "80322df0": "osStartThread", + "80322f40": "osWritebackDCacheAll", + "80322f70": "osCreateViManager", + "803230f4": "viMgrMain", + "803232d0": "osViSetMode", + "80323340": "osViBlack", + "803233b0": "osViSetSpecialFeatures", + "80323570": "osCreatePiManager", + "803236f0": "osSetThreadPri", + "803237d0": "osInitialize", + "80323a00": "osViSwapBuffer", + "80323a50": "sqrtf", + "80323a60": "osContStartReadData", + "80323b24": "osContGetReadData", + "80323bcc": "__osPackReadData", + "80323cc0": "osContInit", + "80323ebc": "__osContGetInitData", + "80323f8c": "__osPackRequestData", + "80324080": "osEepromProbe", + "803240f0": "__ull_rshift", + "8032411c": "__ull_rem", + "80324158": "__ull_div", + "80324194": "__ll_lshift", + "803241c0": "__ll_rem", + "803241fc": "__ll_div", + "80324258": "__ll_mul", + "80324288": "__ull_divremi", + "803242e8": "__ll_mod", + "80324384": "__ll_rshift", + "803243b0": "osInvalDCache", + "80324460": "osPiStartDma", + "80324570": "bzero", + "80324610": "osInvalICache", + "80324690": "osEepromLongRead", + "803247d0": "osEepromLongWrite", + "80324910": "bcopy", + "80324c20": "guOrthoF", + "80324d74": "guOrtho", + "80324de0": "guPerspectiveF", + "80325010": "guPerspective", + "80325070": "osGetTime", + "80325100": "__d_to_ll", + "8032511c": "__f_to_ll", + "80325138": "__d_to_ull", + "803251d8": "__f_to_ull", + "80325274": "__ll_to_d", + "8032528c": "__ll_to_f", + "803252a4": "__ull_to_d", + "803252d8": "__ull_to_f", + "80325310": "cosf", + "80325480": "sinf", + "80325640": "guTranslateF", + "80325688": "guTranslate", + "803256e0": "guRotateF", + "80325874": "guRotate", + "803258d0": "guScaleF", + "80325924": "guScale", + "80325970": "osAiSetFrequency", + "80325bd4": "alBnkfNew", + "80325cd8": "alSeqFileNew", + "80325d20": "osWritebackDCache", + "80325da0": "osAiGetLength", + "80325db0": "osAiSetNextBuffer", + "80325e60": "__osTimerServicesInit", + "80325eec": "__osTimerInterrupt", + "80326064": "__osSetTimerIntr", + "803260d8": "__osInsertTimer", + "80326260": "_Printf", + "803273f0": "memcpy", + "8032741c": "strlen", + "80327444": "strchr", + "80327490": "__osDequeueThread", + "803274d0": "__osDisableInt", + "803274f0": "__osRestoreInt", + "80327510": "__osViInit", + "80327640": "__osExceptionPreamble", + "80327650": "__osException", + "803278e4": "L80326964", + "80327904": "L80326984", + "80327938": "L803269B8", + "80327a68": "L80326AE8", + "80327ac4": "L80326B44", + "80327ae4": "L80326B64", + "80327b1c": "L80326B9C", + "80327b68": "L80326BE8", + "80327b98": "send_mesg", + "80327c80": "__osEnqueueAndYield", + "80327d10": "__osEnqueueThread", + "80327d58": "__osPopThread", + "80327d68": "__osDispatchThread", + "80327ea8": "__osCleanupThread", + "80327eb0": "osVirtualToPhysical", + "80327f30": "__osSpSetStatus", + "80327f40": "__osSpSetPc", + "80327f80": "__osSpRawStartDma", + "80328010": "__osSpDeviceBusy", + "80328040": "__osSpGetStatus", + "80328050": "osGetThreadPri", + "80328070": "__osViGetCurrentContext", + "80328080": "__osViSwapContext", + "803283e0": "osGetCount", + "803283f0": "__osPiCreateAccessQueue", + "80328440": "__osPiGetAccess", + "80328484": "__osPiRelAccess", + "803284b0": "osPiRawStartDma", + "80328590": "__osDevMgrMain", + "80328710": "__osSetSR", + "80328720": "__osGetSR", + "80328730": "__osSetFpcCsr", + "80328740": "__osSiRawReadIo", + "80328790": "__osSiRawWriteIo", + "803287e0": "osMapTLBRdb", + "80328840": "osPiRawReadIo", + "803288a0": "__osSiCreateAccessQueue", + "803288f0": "__osSiGetAccess", + "80328934": "__osSiRelAccess", + "80328960": "__osSiRawStartDma", + "80328a10": "osSetTimer", + "80328af0": "osEepromWrite", + "80328ca0": "__osPackEepWriteData", + "80328dac": "__osEepStatus", + "80328fd0": "osJamMesg", + "80329120": "osPiGetCmdQueue", + "80329150": "osEepromRead", + "80329340": "__osPackEepReadData", + "80329450": "guMtxF2L", + "80329550": "guMtxIdentF", + "803295d8": "guMtxIdent", + "80329608": "guMtxL2F", + "803296c0": "guNormalize", + "80329750": "__osAiDeviceBusy", + "80329780": "__osSetCompare", + "80329790": "_Litob", + "80329a90": "_Ldtob", + "8032a860": "u32_to_string", + "8032a890": "string_to_u32", + "8032a8e8": "send_packet", + "8032a9a8": "send", + "8032aa80": "process_command_memory", + "8032aacc": "process_command_register", + "8032aaf8": "kdebugserver", + "8032ace0": "__osSyncPutChars", + "8032ae10": "osSetIntMask", + "8032ae70": "osDestroyThread", + "8032af70": "__osProbeTLB", + "8032b030": "__osSiDeviceBusy", + "8032b060": "lldiv", + "8032b160": "ldiv", + "8032b1f0": "__osGetCause", + "8032b200": "__osAtomicDec", + "8032b260": "rspF3DBootStart", + "8032b330": "rspF3DBootEnd", + "8032b330": "rspF3DStart", + "8032c738": "rspF3DEnd", + "8032c740": "rspAspMainStart", + "8032d560": "rspAspMainEnd", + "8032d560": "gVblankHandler1", + "8032d564": "gVblankHandler2", + "8032d568": "gActiveSPTask", + "8032d56c": "sCurrentAudioSPTask", + "8032d570": "sCurrentDisplaySPTask", + "8032d574": "sNextAudioSPTask", + "8032d578": "sNextDisplaySPTask", + "8032d57c": "sAudioEnabled", + "8032d580": "sNumVblanks", + "8032d584": "gResetTimer", + "8032d588": "D_8032C648", + "8032d58c": "gDebugLevelSelect", + "8032d590": "D_8032C650", + "8032d594": "gShowProfiler", + "8032d598": "gShowDebugText", + "8032d5d0": "unused8032C690", + "8032d5d4": "gGlobalTimer", + "8032d5dc": "frameBufferIndex", + "8032d5e0": "D_8032C6A0", + "8032d5e4": "gPlayer1Controller", + "8032d5e8": "gPlayer2Controller", + "8032d5ec": "gPlayer3Controller", + "8032d5f0": "gCurrDemoInput", + "8032d5f4": "gDemoInputListID", + "8032d5f8": "gRecordedDemoInput", + "8032d6d0": "credits01", + "8032d6d8": "credits02", + "8032d6e4": "credits03", + "8032d6f0": "credits04", + "8032d700": "credits05", + "8032d710": "credits06", + "8032d71c": "credits07", + "8032d728": "credits08", + "8032d738": "credits09", + "8032d740": "credits10", + "8032d750": "credits11", + "8032d75c": "credits12", + "8032d764": "credits13", + "8032d774": "credits14", + "8032d77c": "credits15", + "8032d788": "credits16", + "8032d79c": "credits17", + "8032d7ac": "credits18", + "8032d7bc": "credits19", + "8032d7c4": "credits20", + "8032d7cc": "sCreditsSequence", + "8032d93c": "gMarioState", + "8032d940": "unused1", + "8032d944": "D_8032C9E0", + "8032daa0": "sTerrainSounds", + "8032dacc": "sSquishScaleOverTime", + "8032dae0": "sCapFlickerFrames", + "8032daf8": "gWaterSurfacePseudoFloor", + "8032dc50": "sJumpLandAction", + "8032dc68": "sFreefallLandAction", + "8032dc80": "sSideFlipLandAction", + "8032dc98": "sHoldJumpLandAction", + "8032dcb0": "sHoldFreefallLandAction", + "8032dcc8": "sLongJumpLandAction", + "8032dce0": "sDoubleJumpLandAction", + "8032dcf8": "sTripleJumpLandAction", + "8032dd10": "sBackflipLandAction", + "8032dd40": "sPunchingForwardVelocities", + "8032dd80": "gLastCompletedCourseNum", + "8032dd84": "gLastCompletedStarNum", + "8032dd88": "sUnusedGotGlobalCoinHiScore", + "8032dd8c": "gGotFileCoinHiScore", + "8032dd90": "gCurrCourseStarFlags", + "8032dd94": "gSpecialTripleJump", + "8032dd98": "gLevelToCourseNumTable", + "8032ddc0": "gMarioSpawnInfo", + "8032ddc4": "gLoadedGraphNodes", + "8032ddc8": "gAreas", + "8032ddcc": "gCurrentArea", + "8032ddd0": "gCurrCreditsEntry", + "8032ddd4": "D_8032CE74", + "8032ddd8": "D_8032CE78", + "8032dddc": "gWarpTransDelay", + "8032dde0": "gFBSetColor", + "8032dde4": "gWarpTransFBSetColor", + "8032dde8": "gWarpTransRed", + "8032ddec": "gWarpTransGreen", + "8032ddf0": "gWarpTransBlue", + "8032ddf4": "gCurrSaveFileNum", + "8032ddf8": "gCurrLevelNum", + "8032ddfc": "D_8032CE9C", + "8032de4c": "D_8032CEEC", + "8032de60": "D_8032CF00", + "8032de70": "renderModeTable_1Cycle", + "8032deb0": "renderModeTable_2Cycle", + "8032def0": "gCurGraphNodeRoot", + "8032def4": "gCurGraphNodeMasterList", + "8032def8": "gCurGraphNodeCamFrustum", + "8032defc": "gCurGraphNodeCamera", + "8032df00": "gCurGraphNodeObject", + "8032df04": "gCurGraphNodeHeldObject", + "8032df08": "gAreaUpdateCounter", + "8032df10": "gProfilerMode", + "8032df14": "gCurrentFrameIndex1", + "8032df18": "gCurrentFrameIndex2", + "8032df20": "unused8032CFC0", + "8032df24": "gCutsceneFocus", + "8032df28": "unused8032CFC8", + "8032df2c": "unused8032CFCC", + "8032df30": "gSecondCameraFocus", + "8032df34": "sYawSpeed", + "8032df38": "gCurrLevelArea", + "8032df3c": "gPrevLevel", + "8032df40": "unused8032CFE0", + "8032df44": "unused8032CFE4", + "8032df48": "unused8032CFE8", + "8032df4c": "gCameraZoomDist", + "8032df50": "sObjectCutscene", + "8032df54": "gRecentCutscene", + "8032df58": "sFramesSinceCutsceneEnded", + "8032df5c": "sCutsceneDialogResponse", + "8032df60": "sMarioCamState", + "8032df64": "sLuigiCamState", + "8032df68": "unused8032D008", + "8032df6c": "sFixedModeBasePosition", + "8032df78": "sUnusedModeBasePosition_2", + "8032df84": "sUnusedModeBasePosition_3", + "8032df90": "sUnusedModeBasePosition_4", + "8032df9c": "sUnusedModeBasePosition_5", + "8032dfa8": "sModeTransitions", + "8032e008": "unused8032D0A8", + "8032e010": "unused8032D0B0", + "8032e018": "sDanceCutsceneTable", + "8032e024": "unusedDanceInfo1", + "8032e038": "unusedDanceType", + "8032e03c": "unusedDanceInfo2", + "8032e050": "sBBHLibraryParTrackPath", + "8032e098": "sCamSL", + "8032e0e0": "sCamTHI", + "8032e128": "sCamHMC", + "8032e1d0": "sCamSSL", + "8032e248": "sCamRR", + "8032e2f0": "sCamBOB", + "8032e338": "sCamCotMC", + "8032e368": "sCamCCM", + "8032e3b0": "sCamCastle", + "8032e6f8": "sCamBBH", + "8032ecb0": "sCameraTriggers", + "8032ed50": "sIntroStartToPipePosition", + "8032ee08": "sIntroStartToPipeFocus", + "8032eec0": "sIntroPipeToDialogPosition", + "8032ef30": "sIntroPipeToDialogFocus", + "8032efa0": "sEndingFlyToWindowPos", + "8032eff0": "sEndingFlyToWindowFocus", + "8032f048": "sEndingPeachDescentCamPos", + "8032f0e8": "sEndingMarioToPeachPos", + "8032f130": "sEndingMarioToPeachFocus", + "8032f178": "sEndingLookUpAtCastle", + "8032f1b8": "sEndingLookAtSkyFocus", + "8032f214": "gIntroLakituStartToPipeFocus", + "8032f32c": "gIntroLakituStartToPipeOffsetFromCamera", + "8032f444": "gEndWavingPos", + "8032f48c": "gEndWavingFocus", + "8032f4d4": "sCutsceneEnding", + "8032f534": "sCutsceneGrandStar", + "8032f544": "sCutsceneUnused", + "8032f554": "sCutsceneDoorWarp", + "8032f564": "sCutsceneEndWaving", + "8032f56c": "sCutsceneCredits", + "8032f574": "sCutsceneDoorPull", + "8032f59c": "sCutsceneDoorPush", + "8032f5c4": "sCutsceneDoorPullMode", + "8032f5dc": "sCutsceneDoorPushMode", + "8032f5f4": "sCutsceneEnterCannon", + "8032f60c": "sCutsceneStarSpawn", + "8032f624": "sCutsceneRedCoinStarSpawn", + "8032f634": "sCutsceneEnterPainting", + "8032f63c": "sCutsceneDeathExit", + "8032f64c": "sCutsceneExitPaintingSuccess", + "8032f65c": "sCutsceneUnusedExit", + "8032f674": "sCutsceneIntroPeach", + "8032f69c": "sCutscenePrepareCannon", + "8032f6ac": "sCutsceneExitWaterfall", + "8032f6bc": "sCutsceneFallToCastleGrounds", + "8032f6cc": "sCutsceneEnterPyramidTop", + "8032f6dc": "sCutscenePyramidTopExplode", + "8032f6f4": "sCutsceneStandingDeath", + "8032f6fc": "sCutsceneEnterPool", + "8032f70c": "sCutsceneDeathStomach", + "8032f714": "sCutsceneDeathOnBack", + "8032f71c": "sCutsceneQuicksandDeath", + "8032f724": "sCutsceneWaterDeath", + "8032f72c": "sCutsceneSuffocation", + "8032f734": "sCutsceneEnterBowserArena", + "8032f74c": "sCutsceneDanceDefaultRotate", + "8032f754": "sCutsceneDanceFlyAway", + "8032f75c": "sCutsceneDanceCloseup", + "8032f764": "sCutsceneKeyDance", + "8032f76c": "sCutsceneCapSwitchPress", + "8032f774": "sCutsceneSlidingDoorsOpen", + "8032f784": "sCutsceneUnlockKeyDoor", + "8032f794": "sCutsceneExitBowserSuccess", + "8032f7a4": "sCutsceneExitBowserDeath", + "8032f7b4": "sCutsceneExitSpecialSuccess", + "8032f7c4": "sCutsceneNonPaintingDeath", + "8032f7d4": "sCutsceneDialog", + "8032f7ec": "sCutsceneReadMessage", + "8032f804": "sDanceCutsceneIndexTable", + "8032f870": "sZoomOutAreaMasks", + "8032f884": "sBobCreditsSplinePositions", + "8032f8ac": "sBobCreditsSplineFocus", + "8032f8d4": "sWfCreditsSplinePositions", + "8032f8fc": "sWfCreditsSplineFocus", + "8032f924": "sJrbCreditsSplinePositions", + "8032f94c": "sJrbCreditsSplineFocus", + "8032f974": "sCcmSlideCreditsSplinePositions", + "8032f99c": "sCcmSlideCreditsSplineFocus", + "8032f9c4": "sBbhCreditsSplinePositions", + "8032f9e4": "sBbhCreditsSplineFocus", + "8032fa04": "sHmcCreditsSplinePositions", + "8032fa2c": "sHmcCreditsSplineFocus", + "8032fa54": "sThiWigglerCreditsSplinePositions", + "8032fa6c": "sThiWigglerCreditsSplineFocus", + "8032fa84": "sVolcanoCreditsSplinePositions", + "8032fab4": "sVolcanoCreditsSplineFocus", + "8032fae4": "sSslCreditsSplinePositions", + "8032fb14": "sSslCreditsSplineFocus", + "8032fb44": "sDddCreditsSplinePositions", + "8032fb7c": "sDddCreditsSplineFocus", + "8032fbb4": "sSlCreditsSplinePositions", + "8032fbd4": "sSlCreditsSplineFocus", + "8032fbf4": "sWdwCreditsSplinePositions", + "8032fc14": "sWdwCreditsSplineFocus", + "8032fc34": "sTtmCreditsSplinePositions", + "8032fc64": "sTtmCreditsSplineFocus", + "8032fc94": "sThiHugeCreditsSplinePositions", + "8032fccc": "sThiHugeCreditsSplineFocus", + "8032fd04": "sTtcCreditsSplinePositions", + "8032fd24": "sTtcCreditsSplineFocus", + "8032fd44": "sRrCreditsSplinePositions", + "8032fd64": "sRrCreditsSplineFocus", + "8032fd84": "sSaCreditsSplinePositions", + "8032fdac": "sSaCreditsSplineFocus", + "8032fdd4": "sCotmcCreditsSplinePositions", + "8032fdfc": "sCotmcCreditsSplineFocus", + "8032fe24": "sDddSubCreditsSplinePositions", + "8032fe4c": "sDddSubCreditsSplineFocus", + "8032fe74": "sCcmOutsideCreditsSplinePositions", + "8032fe94": "sCcmOutsideCreditsSplineFocus", + "8032fec0": "sObjectListUpdateOrder", + "8032fecc": "sParticleTypes", + "80330000": "D_8032F0A0", + "80330004": "D_8032F0A4", + "80330020": "D_8032F0C0", + "8033002c": "D_8032F0CC", + "8033006c": "sMrIParticleActions", + "80330074": "sMrIActions", + "80330084": "sMrIHitbox", + "80330094": "D_8032F134", + "803300a8": "unused8032F134", + "803300ac": "sCapSwitchActions", + "803300bc": "sKingBobombActions", + "803300e0": "sKingBobombSoundStates", + "80330140": "sOpenedCannonActions", + "8033015c": "unused0EA1FC", + "80330198": "sChuckyaActions", + "803301a8": "sWFRotatingPlatformData", + "803301c0": "sKoopaShellUnderwaterHitbox", + "803301d0": "D_8032F270", + "803301e4": "sSparkleSpawnStarHitbox", + "803301f4": "sYellowCoinHitbox", + "80330204": "D_8032F2A4", + "80330224": "sCoinInsideBooActions", + "8033022c": "D_8032F2CC", + "80330244": "D_8032F2E4", + "80330260": "D_8032F300", + "80330288": "D_8032F328", + "80330290": "D_8032F330", + "80330298": "sGrindelThwompActions", + "803302ac": "sTumblingBridgeParams", + "803302dc": "sTumblingBridgeActions", + "803302ec": "D_8032F38C", + "80330318": "sElevatorActions", + "8033032c": "D_8032F3CC", + "80330340": "D_8032F3E0", + "80330354": "D_8032F3F4", + "8033035c": "D_8032F3FC", + "80330370": "sUkikiCageActions", + "80330380": "D_8032F420", + "80330390": "sSpindriftHitbox", + "803303a0": "sMetalBoxHitbox", + "803303b0": "sBreakableBoxHitbox", + "803303c0": "D_8032F460", + "803303e8": "sHeaveHoActions", + "803303f8": "sJumpingBoxHitbox", + "80330408": "sJumpingBoxActions", + "8033042c": "sBowserKeyHitbox", + "8033043c": "sBulletBillActions", + "80330450": "sBowserTailAnchorActions", + "8033045c": "D_8032F4FC", + "8033046c": "D_8032F50C", + "80330470": "D_8032F510", + "80330474": "D_8032F514", + "80330478": "sBowserDefeatedDialogText", + "80330480": "D_8032F520", + "803304c8": "sBowserActions", + "80330518": "D_8032F5B8", + "803305f0": "D_8032F690", + "803305f4": "D_8032F694", + "803305f8": "D_8032F698", + "8033067c": "sFallingBowserPlatformActions", + "80330688": "sGrowingBowserFlameHitbox", + "80330698": "sBowserFlameHitbox", + "803306a8": "D_8032F748", + "803306b4": "D_8032F754", + "803306dc": "sCageUkikiPath", + "80330738": "sUkikiSoundStates", + "803307a0": "sUkikiActions", + "803307c0": "D_8032F860", + "803307f4": "D_8032F894", + "80330828": "D_8032F8C8", + "80330830": "sRotatingCwFireBarsActions", + "80330840": "sKoopaShellHitbox", + "80330850": "D_8032F8F0", + "80330884": "D_8032F924", + "803308a8": "D_8032F948", + "803308cc": "D_8032F96C", + "803308d8": "sToxBoxActions", + "80330900": "TablePiranhaPlantActions", + "80330b1c": "sBowserPuzzlePieceActions", + "80330b38": "sTuxiesMotherActions", + "80330b44": "sSmallPenguinActions", + "80330b5c": "sFishActions", + "80330b68": "sFishGroupActions", + "80330b74": "sBirdChirpChirpActions", + "80330b84": "sCheepCheepActions", + "80330b90": "sExclamationBoxHitbox", + "80330ba0": "sExclamationBoxContents", + "80330c20": "sExclamationBoxActions", + "80330c38": "sSkullSlidingBoxHitbox", + "80330c48": "D_8032FCE8", + "80330c58": "sTweesterHitbox", + "80330c68": "sTweesterActions", + "80330cd4": "sScuttlebugHitbox", + "80330ce4": "sWhompActions", + "80330d0c": "D_8032FDAC", + "80330d30": "D_8032FDD0", + "80330d54": "D_8032FDF4", + "80330d78": "D_8032FE18", + "80330d9c": "sWindParticleHitbox", + "80330dac": "D_8032FE4C", + "80330e20": "D_8032FEC0", + "80330e24": "unused_8032FEC4", + "80330e34": "gMarioPlatform", + "80330e40": "sDebugEffectStringInfo", + "80330e64": "sDebugEnemyStringInfo", + "80330e88": "sDebugInfoDPadMask", + "80330e8c": "sDebugInfoDPadUpdID", + "80330e90": "sDebugLvSelectCheckFlag", + "80330e94": "sDebugPage", + "80330e98": "sNoExtraDebug", + "80330e9c": "sDebugStringArrPrinted", + "80330ea0": "sDebugSysCursor", + "80330ea4": "sDebugInfoButtonSeqID", + "80330ea8": "sDebugInfoButtonSeq", + "80330ec0": "sTransitionColorFadeCount", + "80330ec4": "sTransitionTextureFadeCount", + "80330ec8": "sTextureTransitionID", + "80330ee0": "rectangles", + "80330f00": "sSkyboxTextures", + "80330f28": "sSkyboxColors", + "80330f30": "gMovtexCounter", + "80330f34": "gMovtexCounterPrev", + "80330f38": "gMovtexVtxColor", + "80330f3c": "gPaintingMarioYEntry", + "80330f40": "gWdwWaterLevelSet", + "80330f44": "gMovtexIdToTexture", + "80330f64": "gMovtexNonColored", + "803311a4": "gMovtexColored", + "8033127c": "gMovtexColored2", + "80331300": "hmcPaintings", + "80331308": "insideCastlePaintings", + "80331344": "ttmPaintings", + "8033134c": "paintingGroups", + "80331358": "gPaintingUpdateCounter", + "8033135c": "gLastPaintingUpdateCounter", + "80331360": "sTextLabelsCount", + "80331370": "gDialogCharWidths", + "80331470": "gDialogBoxState", + "80331474": "gDialogBoxOpenTimer", + "80331478": "gDialogBoxScale", + "8033147c": "gDialogScrollOffsetY", + "80331480": "gDialogBoxType", + "80331484": "gDialogID", + "80331488": "gLastDialogPageStrPos", + "8033148c": "gDialogTextPos", + "80331490": "gDialogLineNum", + "80331494": "gLastDialogResponse", + "80331498": "gMenuHoldKeyIndex", + "8033149c": "gMenuHoldKeyTimer", + "803314a0": "gDialogResponse", + "803314b0": "gHudSymCoin", + "803314b4": "gHudSymX", + "803314f8": "gMenuMode", + "803314fc": "gEndCutsceneStrEn0", + "80331504": "gEndCutsceneStrEn1", + "80331538": "gEndCutsceneStrEn2", + "80331558": "gEndCutsceneStrEn3", + "8033156c": "gEndCutsceneStrEn4", + "80331598": "gEndCutsceneStrEn5", + "803315ac": "gEndCutsceneStrEn6", + "803315cc": "gEndCutsceneStrEn7", + "803315dc": "gEndCutsceneStrEn8", + "803315e4": "gEndCutsceneStringsEn", + "8033160c": "gCutsceneMsgFade", + "80331610": "gCutsceneMsgIndex", + "80331614": "gCutsceneMsgDuration", + "80331618": "gCutsceneMsgTimer", + "8033161c": "gDialogCameraAngleIndex", + "80331620": "gDialogCourseActNum", + "803316c8": "gCourseCompleteCoinsEqual", + "803316cc": "gCourseDoneMenuTimer", + "803316d0": "gCourseCompleteCoins", + "803316d4": "gHudFlash", + "80331750": "gEnvFxMode", + "80331754": "D_80330644", + "80331758": "gSnowTempVtx", + "80331788": "gSnowFlakeVertex1", + "80331790": "gSnowFlakeVertex2", + "80331798": "gSnowFlakeVertex3", + "803317a0": "D_80330690", + "803317a4": "D_80330694", + "803317a8": "gBubbleTempVtx", + "803317e0": "MacroObjectPresets", + "803325fc": "sPowerMeterVisibleTimer", + "80332614": "sPrevCheckMarioRoom", + "80332618": "sYoshiDead", + "8033261c": "sDebugSequenceTracker", + "80332620": "sDebugTimer", + "803327a8": "sBreakableBoxSmallHitbox", + "80332b00": "sMrBlizzardHitbox", + "80332b10": "D_80331A00", + "80332b24": "sMrBlizzardSnowballHitbox", + "80332b34": "D_80331A24", + "80332b54": "D_80331A44", + "80332b5c": "D_80331A4C", + "80332b64": "D_80331A54", + "80332bdc": "D_80331ACC", + "80332bf0": "sRecoveryHeartHitbox", + "80332c00": "sUnagiHitbox", + "80332c10": "sHauntedChairHitbox", + "80332c30": "sFlyingBookendHitbox", + "80332c40": "D_80331B30", + "80332c4c": "sBookSwitchHitbox", + "80332c5c": "sFirePiranhaPlantHitbox", + "80332c6c": "D_80331B5C", + "80332c74": "sPiranhaPlantFireHitbox", + "80332c84": "sSnufitHitbox", + "80332c94": "sSnufitBulletHitbox", + "80332ca4": "sEyerokHitbox", + "80332cb4": "D_80331BA4", + "80332d10": "D_80331C00", + "80332d28": "sClamShellHitbox", + "80332d38": "sSkeeterHitbox", + "80332d48": "D_80331C38", + "80332e50": "gAudioErrorFlags", + "80332e54": "sGameLoopTicked", + "80332e58": "sDialogSpeaker", + "80332f04": "sDialogSpeakerVoice", + "80332f40": "sNumProcessedSoundRequests", + "80332f44": "sSoundRequestCount", + "80332f48": "sDynBbh", + "80332f54": "sDynDdd", + "80332f6c": "sDynJrb", + "80332f88": "sDynWdw", + "80332f98": "sDynHmc", + "80332fa8": "sDynUnk38", + "80332fb8": "sDynNone", + "80332fbc": "sCurrentMusicDynamic", + "80332fc0": "sBackgroundMusicForDynamics", + "80332fc4": "sLevelDynamics", + "80333060": "sMusicDynamics", + "803330c0": "gAreaEchoLevel", + "80333138": "D_80332028", + "80333188": "sBackgroundMusicDefaultVolume", + "803331ac": "sPlayer0CurSeqId", + "803331b0": "sMusicDynamicDelay", + "803331b4": "D_803320A4", + "803331c0": "D_803320B0", + "803331cc": "D_803320BC", + "803331d8": "sMaxChannelsForSoundBank", + "803331e4": "sNumSoundsPerBank", + "803331f0": "gDefaultSoundArgs", + "803331fc": "sUnusedSoundArgs", + "80333208": "sSoundBankDisabled", + "80333218": "D_80332108", + "8033321c": "sHasStartedFadeOut", + "80333220": "D_80332110", + "80333224": "sUnused80332114", + "80333228": "sUnused80332118", + "8033322c": "D_8033211C", + "80333230": "D_80332120", + "80333234": "D_80332124", + "80333238": "sBackgroundMusicQueueSize", + "8033323c": "sUnused8033323C", + "803332a0": "gAudioSessionPresets", + "80333498": "gAudioCosineTable", + "80333598": "gPitchBendFrequencyScale", + "80333994": "gNoteFrequencies", + "80333b94": "gDefaultShortNoteVelocityTable", + "80333ba4": "gDefaultShortNoteDurationTable", + "80333bb4": "gVibratoCurve", + "80333bc4": "gDefaultEnvelope", + "80333bd0": "sSineWave", + "80333c50": "sSquareWave", + "80333cd0": "sTriangleWave", + "80333d50": "sSawtoothWave", + "80333dd0": "gWaveSamples", + "80333de0": "gHeadsetPanQuantization", + "80333df4": "gHeadsetPanVolume", + "80333ff4": "gStereoPanVolume", + "803341f4": "gDefaultPanVolume", + "803343f4": "gVolRampingLhs136", + "803345f4": "gVolRampingRhs136", + "803347f4": "gVolRampingLhs144", + "803349f4": "gVolRampingRhs144", + "80334bf4": "gVolRampingLhs128", + "80334df4": "gVolRampingRhs128", + "80334ff4": "gTatumsPerBeat", + "80334ff8": "gUnusedCount80333EE8", + "80334ffc": "gAudioHeapSize", + "80335000": "D_80333EF0", + "80335004": "gAudioLoadLock", + "80335008": "sUnused8033EF8", + "80335010": "osViModeTable", + "803358d0": "viMgrMainArgs", + "803358f0": "piMgrArgs", + "80335910": "osClockRate", + "80335918": "D_80334808", + "80335920": "D_80334810", + "80335930": "D_80334820", + "80335940": "D_80334830", + "80335950": "_spaces", + "80335974": "_zeroes", + "803359a0": "D_80334890", + "803359a4": "unknown", + "803359a8": "D_80334898", + "803359ac": "D_8033489C", + "803359b0": "D_803348A0", + "803359b4": "D_803348A4", + "803359c0": "D_803348B0", + "80335a20": "D_80334910", + "80335a24": "D_80334914", + "80335a28": "D_80334918", + "80335a2c": "D_8033491C", + "80335a30": "D_80334920", + "80335a44": "D_80334934", + "80335a48": "D_80334938", + "80335a50": "gOsPiAccessQueueCreated", + "80335a60": "gOsSiAccessQueueCreated", + "80335aa0": "D_80334990", + "80335af0": "D_803349E0", + "80335b40": "D_80334A30", + "80335b44": "D_80334A34", + "80335b48": "D_80334A38", + "80335b50": "D_80334A40", + "80335b54": "D_80334A44", + "80338da0": "D_80337BB0", + "80338da8": "D_80337BB8", + "80338e60": "jtbl_80337C90", + "80338e84": "jtbl_80337CB4", + "80338eac": "jtbl_80337CDC", + "80338ec0": "jtbl_80337D08", + "80338fbc": "jtbl_80337E04", + "8033978c": "jtbl_80338418", + "80339880": "length_str", + "80339884": "flags_str", + "8033988c": "flags_arr", + "80339980": "D_80338610", + "803399a0": "jtbl_80338630", + "803399d0": "NAN", + "803399e0": "D_80338670", + "80339a40": "D_803386D0", + "80339ac0": "rspF3DDataStart", + "8033a2c0": "rspF3DDataEnd", + "8033a2c0": "rspAspMainDataStart", + "8033a580": "rspAspMainDataEnd", + "8033a580": "_mainSegmentEnd", + "008c0c40": "_mainSegmentRomEnd", + "8033a580": "_mainSegmentNoloadStart", + "8033a580": "D_80339210", + "8033a730": "gIdleThread", + "8033a8e0": "gMainThread", + "8033aa90": "gGameLoopThread", + "8033ac40": "gSoundThread", + "8033adf0": "gPIMesgQueue", + "8033ae08": "gIntrMesgQueue", + "8033ae20": "gSPTaskMesgQueue", + "8033ae38": "gDmaMesgBuf", + "8033ae40": "gPIMesgBuf", + "8033aec0": "gSIEventMesgBuf", + "8033aec8": "gIntrMesgBuf", + "8033af08": "gUnknownMesgBuf", + "8033af48": "gDmaIoMesg", + "8033af5c": "D_80339BEC", + "8033af60": "gDmaMesgQueue", + "8033af78": "gSIEventMesgQueue", + "8033af90": "gControllers", + "8033afe8": "gControllerStatuses", + "8033aff8": "gControllerPads", + "8033b010": "gGameVblankQueue", + "8033b028": "D_80339CB8", + "8033b040": "D_80339CD0", + "8033b044": "D_80339CD4", + "8033b048": "gGameVblankHandler", + "8033b050": "gPhysicalFrameBuffers", + "8033b05c": "gPhysicalZBuffer", + "8033b060": "D_80339CF0", + "8033b064": "D_80339CF4", + "8033b068": "gGfxSPTask", + "8033b06c": "gDisplayListHead", + "8033b070": "gGfxPoolEnd", + "8033b074": "gGfxPool", + "8033b078": "gControllerBits", + "8033b079": "gEepromProbe", + "8033b080": "D_80339D10", + "8033b090": "gDemo", + "8033b0a0": "filler80339D30", + "8033b170": "gMarioStates", + "8033b238": "sCurrPlayMode", + "8033b23a": "D_80339ECA", + "8033b23c": "sTransitionTimer", + "8033b240": "sTransitionUpdate", + "8033b244": "unused3", + "8033b248": "sWarpDest", + "8033b250": "D_80339EE0", + "8033b252": "sDelayedWarpOp", + "8033b254": "sDelayedWarpTimer", + "8033b256": "sSourceWarpNodeId", + "8033b258": "sDelayedWarpArg", + "8033b25c": "unused4", + "8033b25e": "sTimerRunning", + "8033b260": "gHudDisplay", + "8033b26e": "gShouldNotPlayCastleMusic", + "8033b270": "sDelayInvincTimer", + "8033b272": "sInvulnerable", + "8033b280": "unused80339F10", + "8033b288": "filler80339F1C", + "8033b2c0": "D_80339F50", + "8033b350": "D_80339FE0", + "8033b3b0": "gBodyStates", + "8033b494": "gEffectsMemoryPool", + "8033b4a0": "gWarpCheckpoint", + "8033b4a5": "gMainMenuDataModified", + "8033b4a6": "gSaveFileModified", + "8033b4b0": "gPlayerSpawnInfos", + "8033b4d0": "D_8033A160", + "8033b8d0": "gAreaData", + "8033bab0": "gWarpTransition", + "8033bac6": "gCurrCourseNum", + "8033bac8": "gCurrActNum", + "8033baca": "gCurrAreaIndex", + "8033bacc": "gSavedCourseNum", + "8033bace": "gPauseScreenMode", + "8033bad0": "gSaveOptSelectIndex", + "8033bae0": "gMatStackIndex", + "8033bae8": "gMatStack", + "8033c2e8": "gMatStackFixed", + "8033c368": "gGeoTempState", + "8033c378": "gCurAnimType", + "8033c379": "gCurAnimEnabled", + "8033c37a": "gCurrAnimFrame", + "8033c37c": "gCurAnimTranslationMultiplier", + "8033c380": "gCurrAnimAttribute", + "8033c384": "gCurAnimData", + "8033c388": "gDisplayListHeap", + "8033c390": "gProfilerFrameData", + "8033c520": "gPlayerCameraState", + "8033c568": "sOldPosition", + "8033c578": "sOldFocus", + "8033c588": "sPlayer2FocusOffset", + "8033c594": "sCreditsPlayer2Pitch", + "8033c596": "sCreditsPlayer2Yaw", + "8033c598": "sFramesPaused", + "8033c5a0": "sFOVState", + "8033c5c0": "sModeTransition", + "8033c5e8": "sMarioGeometry", + "8033c61c": "unusedFreeRoamWallYaw", + "8033c61e": "sAvoidYawVel", + "8033c620": "sCameraYawAfterDoorCutscene", + "8033c622": "unusedSplinePitch", + "8033c624": "unusedSplineYaw", + "8033c628": "sHandheldShakeSpline", + "8033c668": "sHandheldShakeMag", + "8033c66c": "sHandheldShakeTimer", + "8033c670": "sHandheldShakeInc", + "8033c674": "sHandheldShakePitch", + "8033c676": "sHandheldShakeYaw", + "8033c678": "sHandheldShakeRoll", + "8033c67c": "unused8033B30C", + "8033c680": "unused8033B310", + "8033c684": "sSelectionFlags", + "8033c686": "unused8033B316", + "8033c688": "s2ndRotateFlags", + "8033c68a": "unused8033B31A", + "8033c68c": "sCameraSoundFlags", + "8033c68e": "sCButtonsPressed", + "8033c690": "sCutsceneDialogID", + "8033c698": "gLakituState", + "8033c758": "unused8033B3E8", + "8033c75a": "sAreaYaw", + "8033c75c": "sAreaYawChange", + "8033c75e": "sLakituDist", + "8033c760": "sLakituPitch", + "8033c764": "sZoomAmount", + "8033c768": "sCSideButtonYaw", + "8033c76a": "sBehindMarioSoundTimer", + "8033c76c": "sZeroZoomDist", + "8033c770": "sCUpCameraPitch", + "8033c772": "sModeOffsetYaw", + "8033c774": "sSpiralStairsYawOffset", + "8033c776": "s8DirModeBaseYaw", + "8033c778": "s8DirModeYawOffset", + "8033c77c": "sPanDistance", + "8033c780": "sCannonYOffset", + "8033c788": "sModeInfo", + "8033c7d0": "sCastleEntranceOffset", + "8033c7dc": "sParTrackIndex", + "8033c7e0": "sParTrackPath", + "8033c7e8": "sParTrackTransOff", + "8033c808": "sCameraStoreCUp", + "8033c828": "sCameraStoreCutscene", + "8033c848": "gCameraMovementFlags", + "8033c84a": "sStatusFlags", + "8033c850": "sCurCreditsSplinePos", + "8033c950": "sCurCreditsSplineFocus", + "8033ca50": "sCutsceneSplineSegment", + "8033ca54": "sCutsceneSplineSegmentProgress", + "8033ca58": "unused8033B6E8", + "8033ca5a": "sCutsceneShot", + "8033ca5c": "gCutsceneTimer", + "8033ca60": "sCutsceneVars", + "8033cbc8": "gObjCutsceneDone", + "8033cbcc": "gCutsceneObjSpawn", + "8033cbd0": "gCamera", + "8033cbe0": "gObjectListArray", + "8033d260": "gDebugInfoFlags", + "8033d264": "gNumFindFloorMisses", + "8033d268": "unused_8033BEF8", + "8033d26c": "gUnknownWallCount", + "8033d270": "gObjectCounter", + "8033d274": "gNumCalls", + "8033d280": "gDebugInfo", + "8033d380": "gDebugInfoOverwrite", + "8033d480": "gTimeStopState", + "8033d488": "gObjectPool", + "80360e88": "gMacroObjectDefaultParent", + "803610e8": "gObjectLists", + "803610f0": "gFreeObjectList", + "80361158": "gMarioObject", + "8036115c": "gLuigiObject", + "80361160": "gCurrentObject", + "80361164": "gBehCommand", + "80361168": "gPrevFrameObjectCount", + "8036116c": "gSurfaceNodesAllocated", + "80361170": "gSurfacesAllocated", + "80361174": "gNumStaticSurfaceNodes", + "80361178": "gNumStaticSurfaces", + "8036117c": "gObjectMemoryPool", + "80361180": "gCheckingSurfaceCollisionsForCamera", + "80361182": "gFindFloorIncludeSurfaceIntangible", + "80361184": "gEnvironmentRegions", + "80361188": "gEnvironmentLevels", + "803611d8": "gDoorAdjacentRooms", + "80361250": "gMarioCurrentRoom", + "80361252": "D_8035FEE2", + "80361254": "D_8035FEE4", + "80361256": "gTHIWaterDrained", + "80361258": "gTTCSpeedSetting", + "8036125a": "gMarioShotFromCannon", + "8036125c": "gCCMEnteredSlide", + "8036125e": "gNumRoomedObjectsInMarioRoom", + "80361260": "gNumRoomedObjectsNotInMarioRoom", + "80361262": "gWDWWaterLevelChanging", + "80361264": "gMarioOnMerryGoRound", + "80361270": "sGrabReleaseState", + "80361280": "D_8035FF10", + "80361290": "gDebugPrintState1", + "803612a0": "gDebugPrintState2", + "803612b0": "sMarioOnFlyingCarpet", + "803612b2": "sSurfaceTypeBelowShadow", + "803612b4": "gShadowAboveWaterOrLava", + "803612b5": "gMarioOnIceOrCarpet", + "803612c0": "sSkyBoxInfo", + "803612e0": "gMovetexLastTextureId", + "803612f0": "gFlyingCarpetState", + "80361300": "gPaintingMarioFloorType", + "80361304": "gPaintingMarioXPos", + "80361308": "gPaintingMarioYPos", + "8036130c": "gPaintingMarioZPos", + "80361310": "D_8035FFA0", + "80361314": "D_8035FFA4", + "80361318": "ripplingPainting", + "8036131c": "dddStatus", + "80361320": "sTextLabels", + "803613f0": "gDialogColorFadeTimer", + "803613f2": "gLastDialogLineNum", + "803613f4": "gDialogVariable", + "803613f8": "gDialogTextAlpha", + "803613fa": "gCutsceneMsgXOffset", + "803613fc": "gCutsceneMsgYOffset", + "803613fe": "gRedCoinsCollected", + "80361400": "gEnvFxBuffer", + "80361408": "gSnowCylinderLastPos", + "80361414": "gSnowParticleCount", + "80361416": "gSnowParticleMaxCount", + "80361420": "gEnvFxBubbleConfig", + "80361460": "sNumActiveFirePiranhaPlants", + "80361464": "sNumKilledFirePiranhaPlants", + "80361468": "sObjSavedPosX", + "8036146c": "sObjSavedPosY", + "80361470": "sObjSavedPosZ", + "80361474": "sMontyMoleHoleList", + "80361478": "sMontyMoleKillStreak", + "8036147c": "sMontyMoleLastKilledPosX", + "80361480": "sMontyMoleLastKilledPosY", + "80361484": "sMontyMoleLastKilledPosZ", + "80361488": "sMasterTreadmill", + "80361490": "gCurrAiBuffer", + "80361498": "sSoundRequests", + "80361c98": "D_80360928", + "80361f98": "sUsedChannelsForSoundBank", + "80361fa8": "sCurrentSound", + "80361fb8": "gSoundBanks", + "80364b78": "D_80363808", + "80364b82": "D_80363812", + "80364b88": "sBackgroundMusicQueue", + "80364ba0": "D_80363830", + "80364c20": "D_803638B0", + "80364c60": "viMgrThread", + "80364e10": "viMgrStack", + "80365e10": "__osViMesgQueue", + "80365e28": "viMgrMesgBuff", + "80365e40": "viEventViMesg", + "80365e58": "viEventCounterMesg", + "80365e70": "piMgrThread", + "80366020": "piMgrStack", + "80367020": "__osPiMesgQueue", + "80367038": "piMgrMesgBuff", + "80367040": "D_80365CD0", + "80367050": "D_80365CE0", + "8036708c": "D_80365D1C", + "80367090": "D_80365D20", + "80367091": "_osCont_numControllers", + "80367098": "D_80365D28", + "803670b8": "_osContMesgQueue", + "803670d0": "_osContMesgBuff", + "803670f0": "D_80365D80", + "80367110": "_osCurrentTime", + "80367118": "D_80365DA8", + "8036711c": "D_80365DAC", + "80367120": "D_80365DB0", + "80367130": "osPiMesgBuff", + "80367138": "gOsPiMessageQueue", + "80367150": "osSiMesgBuff", + "80367158": "gOsSiMessageQueue", + "80367170": "D_80365E00", + "803671ac": "D_80365E3C", + "803671b0": "D_80365E40", + "803672b0": "gInterruptedThread", + "80367460": "_mainSegmentNoloadEnd", + "0000cee0": "_mainSegmentNoloadSizeLo", + "00000002": "_mainSegmentNoloadSizeHi", + "00000001": "ASSERT", + "80378800": "_engineSegmentStart", + "007cc6c0": "_engineSegmentRomStart", + "80378800": "vec3f_copy", + "80378840": "vec3f_set", + "8037888c": "vec3f_add", + "803788e4": "vec3f_sum", + "8037893c": "vec3s_copy", + "8037897c": "vec3s_set", + "803789c8": "vec3s_add", + "80378a20": "vec3s_sum", + "80378a78": "vec3s_sub", + "80378ad0": "vec3s_to_vec3f", + "80378b34": "vec3f_to_vec3s", + "80378c50": "find_vector_perpendicular_to_plane", + "80378d38": "vec3f_cross", + "80378dc0": "vec3f_normalize", + "80378e68": "mtxf_copy", + "80378eb4": "mtxf_identity", + "80378f24": "mtxf_translate", + "80378f84": "mtxf_lookat", + "80379440": "mtxf_rotate_zxy_and_translate", + "803795f0": "mtxf_rotate_xyz_and_translate", + "80379798": "mtxf_billboard", + "80379918": "mtxf_align_terrain_normal", + "80379aa4": "mtxf_align_terrain_triangle", + "80379f60": "mtxf_mul", + "8037a29c": "mtxf_scale_vec3f", + "8037a348": "mtxf_mul_vec3s", + "8037a434": "mtxf_to_mtx", + "8037a4b8": "mtxf_rotate_xy", + "8037a550": "get_pos_from_transform_mtx", + "8037a69c": "vec3f_get_dist_and_angle", + "8037a788": "vec3f_set_dist_and_angle", + "8037a860": "approach_s32", + "8037a8b4": "approach_f32", + "8037a9a8": "atan2s", + "8037ab88": "atan2f", + "8037abec": "spline_get_weights", + "8037afb8": "anim_spline_init", + "8037afe8": "anim_spline_poll", + "8037b220": "init_scene_graph_node_links", + "8037b24c": "init_graph_node_root", + "8037b30c": "init_graph_node_ortho_projection", + "8037b380": "init_graph_node_perspective", + "8037b448": "init_graph_node_start", + "8037b4ac": "init_graph_node_master_list", + "8037b530": "init_graph_node_render_range", + "8037b5b4": "init_graph_node_switch_case", + "8037b670": "init_graph_node_camera", + "8037b744": "init_graph_node_translation_rotation", + "8037b7f8": "init_graph_node_translation", + "8037b89c": "init_graph_node_rotation", + "8037b940": "init_graph_node_scale", + "8037b9e0": "init_graph_node_object", + "8037bad4": "init_graph_node_culling_radius", + "8037bb48": "init_graph_node_animated_part", + "8037bbec": "init_graph_node_billboard", + "8037bc90": "init_graph_node_display_list", + "8037bd24": "init_graph_node_shadow", + "8037bdb4": "init_graph_node_object_parent", + "8037be28": "init_graph_node_generated", + "8037becc": "init_graph_node_background", + "8037bf84": "init_graph_node_held_object", + "8037c044": "geo_add_child", + "8037c0bc": "geo_remove_child", + "8037c138": "geo_make_first_child", + "8037c1e4": "geo_call_global_function_nodes_helper", + "8037c360": "geo_call_global_function_nodes", + "8037c3d0": "geo_reset_object_node", + "8037c448": "geo_obj_init", + "8037c51c": "geo_obj_init_spawninfo", + "8037c658": "geo_obj_init_animation", + "8037c708": "geo_obj_init_animation_accel", + "8037c7d8": "retrieve_animation_index", + "8037c844": "geo_update_animation_frame", + "8037c9e8": "geo_retreive_animation_translation", + "8037cb10": "geo_find_root", + "8037cb60": "read_vec3s_to_vec3f", + "8037cbc0": "read_vec3s", + "8037cbfc": "read_vec3s_angle", + "8037cc74": "register_scene_graph_node", + "8037cd60": "geo_layout_cmd_branch_and_link", + "8037ce24": "geo_layout_cmd_end", + "8037cee8": "geo_layout_cmd_branch", + "8037cf70": "geo_layout_cmd_return", + "8037cfc0": "geo_layout_cmd_open_node", + "8037d018": "geo_layout_cmd_close_node", + "8037d050": "geo_layout_cmd_assign_as_view", + "8037d0d0": "geo_layout_cmd_update_node_flags", + "8037d1d0": "geo_layout_cmd_node_root", + "8037d328": "geo_layout_cmd_node_ortho_projection", + "8037d3a4": "geo_layout_cmd_node_perspective", + "8037d48c": "geo_layout_cmd_node_start", + "8037d4dc": "geo_layout_cmd_nop3", + "8037d500": "geo_layout_cmd_node_master_list", + "8037d55c": "geo_layout_cmd_node_level_of_detail", + "8037d5d4": "geo_layout_cmd_node_switch_case", + "8037d640": "geo_layout_cmd_node_camera", + "8037d6f0": "geo_layout_cmd_node_translation_rotation", + "8037d8d4": "geo_layout_cmd_node_translation", + "8037d998": "geo_layout_cmd_node_rotation", + "8037da5c": "geo_layout_cmd_node_scale", + "8037db50": "geo_layout_cmd_nop2", + "8037db74": "geo_layout_cmd_node_animated_part", + "8037dc10": "geo_layout_cmd_node_billboard", + "8037dcd4": "geo_layout_cmd_node_display_list", + "8037dd4c": "geo_layout_cmd_node_shadow", + "8037dddc": "geo_layout_cmd_node_object_parent", + "8037de34": "geo_layout_cmd_node_generated", + "8037de94": "geo_layout_cmd_node_background", + "8037def8": "geo_layout_cmd_nop", + "8037df1c": "geo_layout_cmd_copy_view", + "8037dfd4": "geo_layout_cmd_node_held_obj", + "8037e058": "geo_layout_cmd_node_culling_radius", + "8037e0b4": "process_geo_layout", + "803805c8": "level_script_execute", + "80380de8": "f32_find_wall_collision", + "80380e8c": "find_wall_collisions", + "80381264": "find_ceil", + "803814b8": "find_floor_height_and_data", + "80381794": "find_floor_height", + "80381900": "find_floor", + "80381ba0": "find_water_level", + "80381d3c": "find_poison_gas_level", + "80381f08": "debug_surface_list_info", + "80383340": "alloc_surface_pools", + "803833b8": "load_area_terrain", + "803835a4": "clear_dynamic_surfaces", + "803839cc": "load_object_collision_model", + "80383bb0": "RandomU16", + "80383cb4": "RandomFloat", + "80383d1c": "RandomSign", + "80383d68": "func_80383D68", + "80385bf0": "stub_80385BF0", + "80385c00": "cur_object_exec_behavior", + "80385f90": "identityMtx", + "80385fb0": "zeroMtx", + "80385fd0": "gVec3fZero", + "80385fdc": "gVec3sZero", + "80385fe4": "gVec3fOne", + "80385ff0": "gVec3sOne", + "80386000": "gSineTable", + "80387000": "gCosineTable", + "8038b000": "gArctanTable", + "8038b810": "GeoLayoutJumpTable", + "8038b894": "unused_8038B894", + "8038bc90": "_engineSegmentEnd", + "007dfb50": "_engineSegmentRomEnd", + "8038bc90": "_engineSegmentNoloadStart", + "8038bc90": "gSplineKeyframe", + "8038bc94": "gSplineKeyframeFraction", + "8038bc98": "gSplineState", + "8038bca0": "gGraphNodePool", + "8038bca4": "gCurRootGraphNode", + "8038bca8": "D_8038BCA8", + "8038bcac": "gGeoViews", + "8038bcb0": "gGeoNumViews", + "8038bcb8": "gGeoLayoutStack", + "8038bcf8": "gCurGraphNodeList", + "8038bd78": "gCurGraphNodeIndex", + "8038bd7a": "gGeoLayoutStackIndex", + "8038bd7c": "D_8038BD7C", + "8038bd7e": "gGeoLayoutReturnIndex", + "8038bd80": "gGeoLayoutCommand", + "8038bd88": "gObjParentGraphNode", + "8038be30": "sFloorGeo", + "8038be90": "unused8038BE90", + "8038be98": "gStaticSurfacePartition", + "8038d698": "gDynamicSurfacePartition", + "8038ee98": "sSurfaceNodePool", + "8038ee9c": "sSurfacePool", + "8038eea0": "sSurfacePoolSize", + "8038eea8": "unused8038EEA8", + "8038eef0": "_engineSegmentNoloadEnd", + "00000001": "ASSERT", + "8038f800": ".", + "8038f800": "_framebuffersSegmentNoloadStart", + "8038f800": "0x70800", + "8038f800": "gFrameBuffer0", + "803b5000": "gFrameBuffer1", + "803da800": "gFrameBuffer2", + "80400000": "_framebuffersSegmentNoloadEnd", + "80400000": "__expansionRamStart", + "00000001": "ASSERT", + "10000000": "_entrySegmentStart", + "007cc6c0": "_entrySegmentRomStart", + "10000000": "level_script_entry", + "10000030": "_entrySegmentEnd", + "007cc6f0": "_entrySegmentRomEnd", + "02000000": "_segment2_mio0SegmentStart", + "007cc6c0": "_segment2_mio0SegmentRomStart", + "0200bd10": ".", + "0200bd10": "_segment2_mio0SegmentEnd", + "007d83d0": "_segment2_mio0SegmentRomEnd", + "04000000": "_group0_mio0SegmentStart", + "007cc6c0": "_group0_mio0SegmentRomStart", + "04013260": ".", + "04013260": "_group0_mio0SegmentEnd", + "007df920": "_group0_mio0SegmentRomEnd", + "17000000": "_group0_geoSegmentStart", + "007cc6c0": "_group0_geoSegmentRomStart", + "17000000": "bubble_geo", + "1700001c": "purple_marble_geo", + "17000038": "smoke_geo", + "17000084": "burn_smoke_geo", + "1700009c": "spot_on_ground_geo", + "170000e0": "mario_TODO_geo_0000E0", + "17000124": "water_waves_surface_geo", + "17000168": "water_waves_geo", + "170001bc": "sparkles_geo", + "17000230": "water_splash_geo", + "17000284": "sparkles_animation_geo", + "170002e0": "mario_geo_face_and_wings", + "1700041c": "mario_geo_left_hand", + "17000494": "mario_geo_right_hand", + "1700053c": "mario_geo_body", + "170006f8": "mario_geo_medium_poly_left_hand", + "17000770": "mario_geo_medium_poly_right_hand", + "17000818": "mario_geo_medium_poly_body", + "170009d4": "mario_geo_low_poly_face_and_wings", + "17000b10": "mario_geo_low_poly_left_hand", + "17000b88": "mario_geo_low_poly_right_hand", + "17000c30": "mario_geo_low_poly_body", + "17000dec": "mario_vanish_geo_face_and_wings", + "17000f28": "mario_vanish_geo_left_hand", + "17000fa0": "mario_vanish_geo_right_hand", + "17001048": "mario_vanish_geo_body", + "17001204": "mario_vanish_geo_medium_poly_left_hand", + "1700127c": "mario_vanish_geo_medium_poly_right_hand", + "17001324": "mario_vanish_geo_medium_poly_body", + "170014e0": "mario_vanish_geo_low_poly_face_and_wings", + "1700161c": "mario_vanish_geo_low_poly_left_hand", + "17001694": "mario_vanish_geo_low_poly_right_hand", + "1700173c": "mario_vanish_geo_low_poly_body", + "170018f8": "mario_metal_geo_face_and_wings", + "170019a4": "mario_metal_geo_left_hand", + "17001a1c": "mario_metal_geo_right_hand", + "17001ac4": "mario_metal_geo_body", + "17001c80": "mario_metal_geo_medium_poly_left_hand", + "17001cf8": "mario_metal_geo_medium_poly_right_hand", + "17001da0": "mario_metal_geo_medium_poly_body", + "17001f5c": "mario_metal_geo_low_poly_face_and_wings", + "17002008": "mario_metal_geo_low_poly_left_hand", + "17002080": "mario_metal_geo_low_poly_right_hand", + "17002128": "mario_metal_geo_low_poly_body", + "170022e4": "mario_metal_vanish_geo_face_and_wings", + "17002390": "mario_metal_vanish_geo_left_hand", + "17002408": "mario_metal_vanish_geo_right_hand", + "170024b0": "mario_metal_vanish_geo_body", + "1700266c": "mario_metal_vanish_geo_medium_poly_left_hand", + "170026e4": "mario_metal_vanish_geo_medium_poly_right_hand", + "1700278c": "mario_metal_vanish_geo_medium_poly_body", + "17002958": "mario_metal_vanish_geo_low_poly_face_and_wings", + "17002a04": "mario_metal_vanish_geo_low_poly_left_hand", + "17002a7c": "mario_metal_vanish_geo_low_poly_right_hand", + "17002b24": "mario_metal_vanish_geo_low_poly_body", + "17002ce0": "mario_geo_load_body", + "17002d14": "mario_geo_load_medium_poly_body", + "17002d48": "mario_geo_load_low_poly_body", + "17002d7c": "mario_geo_render_body", + "17002dd4": "mario_geo", + "17002e30": "_group0_geoSegmentEnd", + "007cf4f0": "_group0_geoSegmentRomEnd", + "05000000": "_group1_mio0SegmentStart", + "007cc6c0": "_group1_mio0SegmentRomStart", + "05008070": ".", + "05008070": "_group1_mio0SegmentEnd", + "007d4730": "_group1_mio0SegmentRomEnd", + "0c000000": "_group1_geoSegmentStart", + "007cc6c0": "_group1_geoSegmentRomStart", + "0c000000": "yellow_sphere_geo", + "0c000018": "hoot_geo", + "0c0001e4": "yoshi_egg_geo", + "0c000248": "thwomp_geo", + "0c000264": "bullet_bill_geo", + "0c00028c": "heave_ho_geo", + "0c000410": "_group1_geoSegmentEnd", + "007ccad0": "_group1_geoSegmentRomEnd", + "05000000": "_group2_mio0SegmentStart", + "007cc6c0": "_group2_mio0SegmentRomStart", + "05001e10": ".", + "05001e10": "_group2_mio0SegmentEnd", + "007ce4d0": "_group2_mio0SegmentRomEnd", + "0c000000": "_group2_geoSegmentStart", + "007cc6c0": "_group2_geoSegmentRomStart", + "0c000000": "bully_geo", + "0c000120": "bully_boss_geo", + "0c000240": "blargg_geo", + "0c0002b0": "_group2_geoSegmentEnd", + "007cc970": "_group2_geoSegmentRomEnd", + "05000000": "_group3_mio0SegmentStart", + "007cc6c0": "_group3_mio0SegmentRomStart", + "050068b0": ".", + "050068b0": "_group3_mio0SegmentEnd", + "007d2f70": "_group3_mio0SegmentRomEnd", + "0c000000": "_group3_geoSegmentStart", + "007cc6c0": "_group3_geoSegmentRomStart", + "0c000000": "king_bobomb_geo", + "0c000308": "water_bomb_geo", + "0c000328": "water_bomb_shadow_geo", + "0c000340": "_group3_geoSegmentEnd", + "007cca00": "_group3_geoSegmentRomEnd", + "05000000": "_group4_mio0SegmentStart", + "007cc6c0": "_group4_mio0SegmentRomStart", + "0500a300": ".", + "0500a300": "_group4_mio0SegmentEnd", + "007d69c0": "_group4_mio0SegmentRomEnd", + "0c000000": "_group4_geoSegmentStart", + "007cc6c0": "_group4_geoSegmentRomStart", + "0c000000": "clam_shell_geo", + "0c000068": "sushi_geo", + "0c00010c": "unagi_geo", + "0c000280": "_group4_geoSegmentEnd", + "007cc940": "_group4_geoSegmentRomEnd", + "05000000": "_group5_mio0SegmentStart", + "007cc6c0": "_group5_mio0SegmentRomStart", + "0500bce0": ".", + "0500bce0": "_group5_mio0SegmentEnd", + "007d83a0": "_group5_mio0SegmentRomEnd", + "0c000000": "_group5_geoSegmentStart", + "007cc6c0": "_group5_geoSegmentRomStart", + "0c000000": "klepto_geo", + "0c0002ac": "eyerok_geo_0002AC", + "0c0005a8": "eyerok_left_hand_geo", + "0c0005e4": "eyerok_right_hand_geo", + "0c000610": "pokey_head_geo", + "0c000644": "pokey_body_part_geo", + "0c000660": "_group5_geoSegmentEnd", + "007ccd20": "_group5_geoSegmentRomEnd", + "05000000": "_group6_mio0SegmentStart", + "007cc6c0": "_group6_mio0SegmentRomStart", + "0500e110": ".", + "0500e110": "_group6_mio0SegmentEnd", + "007da7d0": "_group6_mio0SegmentRomEnd", + "0c000000": "_group6_geoSegmentStart", + "007cc6c0": "_group6_geoSegmentRomStart", + "0c000000": "monty_mole_geo", + "0c000110": "ukiki_geo", + "0c00036c": "fwoosh_geo", + "0c000390": "_group6_geoSegmentEnd", + "007cca50": "_group6_geoSegmentRomEnd", + "05000000": "_group7_mio0SegmentStart", + "007cc6c0": "_group7_mio0SegmentRomStart", + "05005070": ".", + "05005070": "_group7_mio0SegmentEnd", + "007d1730": "_group7_mio0SegmentRomEnd", + "0c000000": "_group7_geoSegmentStart", + "007cc6c0": "_group7_geoSegmentRomStart", + "0c000000": "spindrift_geo", + "0c000104": "penguin_geo", + "0c00021c": "mr_blizzard_hidden_geo", + "0c000348": "mr_blizzard_geo", + "0c000370": "_group7_geoSegmentEnd", + "007cca30": "_group7_geoSegmentRomEnd", + "05000000": "_group8_mio0SegmentStart", + "007cc6c0": "_group8_mio0SegmentRomStart", + "05001180": ".", + "05001180": "_group8_mio0SegmentEnd", + "007cd840": "_group8_mio0SegmentRomEnd", + "0c000000": "_group8_geoSegmentStart", + "007cc6c0": "_group8_geoSegmentRomStart", + "0c000000": "springboard_top_geo", + "0c000018": "springboard_spring_geo", + "0c000030": "springboard_bottom_geo", + "0c000048": "cap_switch_geo", + "0c000090": "_group8_geoSegmentEnd", + "007cc750": "_group8_geoSegmentRomEnd", + "05000000": "_group9_mio0SegmentStart", + "007cc6c0": "_group9_mio0SegmentRomStart", + "05006960": ".", + "05006960": "_group9_mio0SegmentEnd", + "007d3020": "_group9_mio0SegmentRomEnd", + "0c000000": "_group9_geoSegmentStart", + "007cc6c0": "_group9_geoSegmentRomStart", + "0c000000": "bookend_part_geo", + "0c0000c0": "bookend_geo", + "0c0000d8": "haunted_chair_geo", + "0c000188": "small_key_geo", + "0c0001b4": "mad_piano_geo", + "0c000224": "boo_geo", + "0c000274": "haunted_cage_geo", + "0c0002b0": "_group9_geoSegmentEnd", + "007cc970": "_group9_geoSegmentRomEnd", + "05000000": "_group10_mio0SegmentStart", + "007cc6c0": "_group10_mio0SegmentRomStart", + "05012cd0": ".", + "05012cd0": "_group10_mio0SegmentEnd", + "007df390": "_group10_mio0SegmentRomEnd", + "0c000000": "_group10_geoSegmentStart", + "007cc6c0": "_group10_geoSegmentRomStart", + "0c000000": "birds_geo", + "0c000098": "peach_geo_000098", + "0c000254": "peach_geo_000254", + "0c000410": "peach_geo", + "0c000468": "yoshi_geo", + "0c000670": "_group10_geoSegmentEnd", + "007ccd30": "_group10_geoSegmentRomEnd", + "05000000": "_group11_mio0SegmentStart", + "007cc6c0": "_group11_mio0SegmentRomStart", + "050073f0": ".", + "050073f0": "_group11_mio0SegmentEnd", + "007d3ab0": "_group11_mio0SegmentRomEnd", + "0c000000": "_group11_geoSegmentStart", + "007cc6c0": "_group11_geoSegmentRomStart", + "0c000000": "bubba_geo", + "0c000030": "wiggler_head_geo", + "0c0001bc": "enemy_lakitu_geo", + "0c000290": "spiny_ball_geo", + "0c000328": "spiny_geo", + "0c0004a0": "_group11_geoSegmentEnd", + "007ccb60": "_group11_geoSegmentRomEnd", + "06000000": "_group12_mio0SegmentStart", + "007cc6c0": "_group12_mio0SegmentRomStart", + "06030c30": ".", + "06030c30": "_group12_mio0SegmentEnd", + "007fd2f0": "_group12_mio0SegmentRomEnd", + "0d000000": "_group12_geoSegmentStart", + "007cc6c0": "_group12_geoSegmentRomStart", + "0d000000": "bowser_flames_geo", + "0d000090": "invisible_bowser_accessory_geo", + "0d0000b0": "bowser_1_yellow_sphere_geo", + "0d0000d8": "bowser_geo_0000D8", + "0d000424": "bowser_geo_000424", + "0d000770": "bowser_geo_000770", + "0d000ab8": "bowser_shadow_geo", + "0d000ac4": "bowser_geo", + "0d000b40": "bowser2_geo", + "0d000bbc": "bowser_bomb_geo", + "0d000bfc": "bowser_impact_smoke_geo", + "0d000c50": "_group12_geoSegmentEnd", + "007cd310": "_group12_geoSegmentRomEnd", + "06000000": "_group13_mio0SegmentStart", + "007cc6c0": "_group13_mio0SegmentRomStart", + "0600a0f0": ".", + "0600a0f0": "_group13_mio0SegmentEnd", + "007d67b0": "_group13_mio0SegmentRomEnd", + "0d000000": "_group13_geoSegmentStart", + "007cc6c0": "_group13_geoSegmentRomStart", + "0d000000": "skeeter_geo", + "0d000284": "seaweed_geo", + "0d0002f4": "water_mine_geo", + "0d000324": "cyan_fish_geo", + "0d00038c": "bub_geo", + "0d000414": "water_ring_geo", + "0d000450": "treasure_chest_base_geo", + "0d000468": "treasure_chest_lid_geo", + "0d000480": "_group13_geoSegmentEnd", + "007ccb40": "_group13_geoSegmentRomEnd", + "06000000": "_group14_mio0SegmentStart", + "007cc6c0": "_group14_mio0SegmentRomStart", + "06013a60": ".", + "06013a60": "_group14_mio0SegmentEnd", + "007e0120": "_group14_mio0SegmentRomEnd", + "0d000000": "_group14_geoSegmentStart", + "007cc6c0": "_group14_geoSegmentRomStart", + "0d000000": "koopa_flag_geo", + "0d0000b8": "wooden_post_geo", + "0d0000d0": "koopa_without_shell_geo", + "0d000214": "koopa_with_shell_geo", + "0d000358": "piranha_plant_geo", + "0d000480": "whomp_geo", + "0d0005d0": "metallic_ball_geo", + "0d0005ec": "chain_chomp_geo", + "0d000680": "_group14_geoSegmentEnd", + "007ccd40": "_group14_geoSegmentRomEnd", + "06000000": "_group15_mio0SegmentStart", + "007cc6c0": "_group15_mio0SegmentRomStart", + "0600c8e0": ".", + "0600c8e0": "_group15_mio0SegmentEnd", + "007d8fa0": "_group15_mio0SegmentRomEnd", + "0d000000": "_group15_geoSegmentStart", + "007cc6c0": "_group15_geoSegmentRomStart", + "0d000000": "lakitu_geo", + "0d000114": "toad_geo_000114", + "0d00027c": "toad_geo_00027C", + "0d0003e4": "toad_geo", + "0d000448": "mips_geo", + "0d0005b0": "boo_castle_geo", + "0d000600": "_group15_geoSegmentEnd", + "007cccc0": "_group15_geoSegmentRomEnd", + "06000000": "_group16_mio0SegmentStart", + "007cc6c0": "_group16_mio0SegmentRomStart", + "06002ba0": ".", + "06002ba0": "_group16_mio0SegmentEnd", + "007cf260": "_group16_mio0SegmentRomEnd", + "0d000000": "_group16_geoSegmentStart", + "007cc6c0": "_group16_geoSegmentRomStart", + "0d000000": "moneybag_geo_000000", + "0d000078": "moneybag_geo_000078", + "0d0000f0": "moneybag_geo", + "0d000150": "_group16_geoSegmentEnd", + "007cc810": "_group16_geoSegmentRomEnd", + "06000000": "_group17_mio0SegmentStart", + "007cc6c0": "_group17_mio0SegmentRomStart", + "06009c50": ".", + "06009c50": "_group17_mio0SegmentEnd", + "007d6310": "_group17_mio0SegmentRomEnd", + "0d000000": "_group17_geoSegmentStart", + "007cc6c0": "_group17_geoSegmentRomStart", + "0d000000": "mr_i_geo", + "0d00001c": "mr_i_iris_geo", + "0d0000dc": "swoop_geo", + "0d0001a0": "snufit_geo", + "0d000230": "dorrie_geo", + "0d000394": "scuttlebug_geo", + "0d0006d0": "_group17_geoSegmentEnd", + "007ccd90": "_group17_geoSegmentRomEnd", + "08000000": "_common0_mio0SegmentStart", + "007cc6c0": "_common0_mio0SegmentRomStart", + "0800e6d0": ".", + "0800e6d0": "_common0_mio0SegmentEnd", + "007dad90": "_common0_mio0SegmentRomEnd", + "0f000000": "_common0_geoSegmentStart", + "007cc6c0": "_common0_geoSegmentRomStart", + "0f000000": "blue_coin_switch_geo", + "0f000020": "test_platform_geo", + "0f000028": "amp_geo", + "0f0001a8": "cannon_base_geo", + "0f0001c0": "cannon_barrel_geo", + "0f0001d8": "chuckya_geo", + "0f0004cc": "purple_switch_geo", + "0f0004e4": "checkerboard_platform_geo", + "0f0004fc": "heart_geo", + "0f000518": "flyguy_geo", + "0f0005d0": "breakable_box_geo", + "0f000610": "breakable_box_small_geo", + "0f000640": "bowling_ball_geo", + "0f00066c": "bowling_ball_track_geo", + "0f000694": "exclamation_box_geo", + "0f0006e4": "goomba_geo", + "0f0007b8": "black_bobomb_geo", + "0f0008f4": "bobomb_buddy_geo", + "0f000a30": "metal_box_geo", + "0f000a58": "exclamation_box_outline_geo", + "0f000ab0": "koopa_shell_geo", + "0f000adc": "koopa_shell2_geo", + "0f000b08": "koopa_shell3_geo", + "0f000b40": "_common0_geoSegmentEnd", + "007cd200": "_common0_geoSegmentRomEnd", + "03000000": "_common1_mio0SegmentStart", + "007cc6c0": "_common1_mio0SegmentRomStart", + "03017990": ".", + "03017990": "_common1_mio0SegmentEnd", + "007e4050": "_common1_mio0SegmentRomEnd", + "16000000": "_common1_geoSegmentStart", + "007cc6c0": "_common1_geoSegmentRomStart", + "16000000": "mist_geo", + "16000020": "white_puff_geo", + "16000040": "explosion_geo", + "160000a8": "butterfly_geo", + "1600013c": "yellow_coin_geo", + "160001a0": "yellow_coin_no_shadow_geo", + "16000200": "blue_coin_geo", + "16000264": "blue_coin_no_shadow_geo", + "160002c4": "red_coin_geo", + "16000328": "red_coin_no_shadow_geo", + "16000388": "warp_pipe_geo", + "160003a8": "castle_door_geo", + "1600043c": "cabin_door_geo", + "160004d0": "wooden_door_geo", + "16000564": "wooden_door2_geo", + "160005f8": "metal_door_geo", + "1600068c": "hazy_maze_door_geo", + "16000720": "haunted_door_geo", + "160007b4": "castle_door_0_star_geo", + "16000868": "castle_door_1_star_geo", + "1600091c": "castle_door_3_stars_geo", + "160009d0": "key_door_geo", + "16000a84": "bowser_key_geo", + "16000ab0": "bowser_key_cutscene_geo", + "16000b10": "red_flame_shadow_geo", + "16000b2c": "red_flame_geo", + "16000b8c": "blue_flame_geo", + "16000bec": "fish_shadow_geo", + "16000c44": "fish_geo", + "16000c8c": "leaves_geo", + "16000ca4": "marios_cap_geo", + "16000cf0": "marios_metal_cap_geo", + "16000d3c": "marios_wing_cap_geo", + "16000da8": "marios_winged_metal_cap_geo", + "16000e14": "number_geo", + "16000e84": "mushroom_1up_geo", + "16000ea0": "star_geo", + "16000ed4": "dirt_animation_geo", + "16000f24": "cartoon_star_geo", + "16000f6c": "transparent_star_geo", + "16000f98": "white_particle_geo", + "16000fb4": "wooden_signpost_geo", + "16000fe8": "bubbly_tree_geo", + "16001000": "spiky_tree_geo", + "16001018": "snow_tree_geo", + "16001030": "spiky_tree1_geo", + "16001048": "palm_tree_geo", + "16001060": "_common1_geoSegmentEnd", + "007cd720": "_common1_geoSegmentRomEnd", + "13000000": "_behaviorSegmentStart", + "007cc6c0": "_behaviorSegmentRomStart", + "13000000": "bhvStarDoor", + "13000054": "bhvMrI", + "1300008c": "bhvMrIBody", + "130000ac": "bhvMrIParticle", + "130000f8": "bhvPurpleParticle", + "13000118": "bhvGiantPole", + "13000144": "bhvPoleGrabbing", + "13000174": "bhvThiHugeIslandTop", + "13000194": "bhvThiTinyIslandTop", + "130001ac": "bhvCapSwitchBase", + "130001cc": "bhvCapSwitch", + "130001f4": "bhvKingBobomb", + "13000254": "bhvBobombAnchorMario", + "13000278": "bhvBetaChestBottom", + "1300029c": "bhvBetaChestLid", + "130002b8": "bhvBubbleMario", + "130002e4": "bhvBubbleMaybe", + "13000338": "bhvSmallWaterWave", + "13000398": "bhvSmallWaterWave398", + "130003bc": "bhvWaterAirBubble", + "13000400": "bhvSmallParticle", + "13000428": "bhvWaterWaves", + "13000444": "bhvSmallParticleSnow", + "1300046c": "bhvSmallParticleBubbles", + "13000494": "bhvFishGroup", + "130004a8": "bhvCannon", + "130004e4": "bhvCannonBarrel", + "13000500": "bhvCannonBaseUnused", + "13000528": "bhvChuckya", + "13000584": "bhvChuckyaAnchorMario", + "130005a8": "bhvUnused05A8", + "130005b4": "bhvRotatingPlatform", + "130005d8": "bhvTower", + "13000600": "bhvBulletBillCannon", + "13000624": "bhvWfBreakableWallRight", + "13000638": "bhvWfBreakableWallLeft", + "1300066c": "bhvKickableBoard", + "130006a4": "bhvTowerDoor", + "130006d8": "bhvRotatingCounterClockwise", + "130006e0": "bhvWfRotatingWoodenPlatform", + "13000708": "bhvKoopaShellUnderwater", + "13000720": "bhvExitPodiumWarp", + "1300075c": "bhvFadingWarp", + "13000780": "bhvWarp", + "130007a0": "bhvWarpPipe", + "130007dc": "bhvWhitePuffExplosion", + "130007f8": "bhvSpawnedStar", + "1300080c": "bhvSpawnedStarNoLevelExit", + "13000830": "bhvMrIBlueCoin", + "13000888": "bhvCoinInsideBoo", + "130008d0": "bhvCoinFormationSpawn", + "130008ec": "bhvCoinFormation", + "1300090c": "bhvOneCoin", + "1300091c": "bhvYellowCoin", + "13000940": "bhvTemporaryYellowCoin", + "13000964": "bhvThreeCoinsSpawn", + "13000984": "bhvTenCoinsSpawn", + "130009a4": "bhvSingleCoinGetsSpawned", + "130009e0": "bhvCoinSparkles", + "13000a14": "bhvGoldenCoinSparkles", + "13000a34": "bhvWallTinyStarParticle", + "13000a54": "bhvWallTinyStarParticleSpawn", + "13000a78": "bhvPoundTinyStarParticle", + "13000a98": "bhvPoundTinyStarParticleSpawn", + "13000abc": "bhvPunchTinyTriangle", + "13000ad8": "bhvPunchTinyTriangleSpawn", + "13000afc": "bhvDoorWarp", + "13000b0c": "bhvDoor", + "13000b58": "bhvGrindel", + "13000b8c": "bhvThwomp2", + "13000bc8": "bhvThwomp", + "13000c04": "bhvTumblingBridgePlatform", + "13000c28": "bhvWfTumblingBridge", + "13000c44": "bhvBbhTumblingBridge", + "13000c64": "bhvLllTumblingBridge", + "13000c84": "bhvFlame", + "13000cc8": "bhvAnotherElavator", + "13000cfc": "bhvRrElevatorPlatform", + "13000d30": "bhvHmcElevatorPlatform", + "13000d6c": "bhvWaterMist", + "13000d98": "bhvWaterMistSpawn", + "13000db4": "bhvBreakBoxTriangle", + "13000dd8": "bhvWaterMist2", + "13000dfc": "bhvUnused0DFC", + "13000e24": "bhvPoundWhitePuffs", + "13000e3c": "bhvGroundSand", + "13000e58": "bhvGroundSnow", + "13000e70": "bhvWind", + "13000e88": "bhvEndToad", + "13000eac": "bhvEndPeach", + "13000ed0": "bhvUnusedParticleSpawn", + "13000f08": "bhvUkiki", + "13000f14": "bhvUkikiCageChild", + "13000f2c": "bhvUkikiCageStar", + "13000f48": "bhvUkikiCage", + "13000f9c": "bhvBitfsSinkingPlatforms", + "13000fc8": "bhvBitfsSinkingCagePlatform", + "13001000": "bhvDddMovingPole", + "13001030": "bhvBitfsTiltingInvertedPyramid", + "13001064": "bhvSquishablePlatform", + "13001098": "bhvCutOutObject", + "130010a8": "bhvBetaMovingFlamesSpawn", + "130010b8": "bhvBetaMovingFlames", + "130010d8": "bhvRrRotatingBridgePlatform", + "13001108": "bhvFlamethrower", + "13001124": "bhvFlamethrowerFlame", + "13001168": "bhvBouncingFireball", + "13001184": "bhvBouncingFireballFlame", + "130011d0": "bhvBowserShockWave", + "130011ec": "bhvFlameMario", + "13001214": "bhvBlackSmokeMario", + "13001254": "bhvBlackSmokeBowser", + "1300127c": "bhvBlackSmokeUpward", + "13001298": "bhvBetaFishSplashSpawner", + "130012b4": "bhvSpindrift", + "130012f4": "bhvTowerPlatformGroup", + "13001318": "bhvWfSlidingTowerPlatform", + "13001340": "bhvWfElevatorTowerPlatform", + "13001368": "bhvWfSolidTowerPlatform", + "13001390": "bhvSnowLeafParticleSpawn", + "130013a8": "bhvTreeSnow", + "130013c4": "bhvTreeLeaf", + "130013dc": "bhvAnotherTiltingPlatform", + "13001408": "bhvSquarishPathMoving", + "1300142c": "bhvPiranhaPlantBubble", + "13001448": "bhvPiranhaPlantWakingBubbles", + "13001468": "bhvFloorSwitchAnimatesObject", + "13001478": "bhvFloorSwitchGrills", + "13001484": "bhvFloorSwitchHardcodedModel", + "130014ac": "bhvFloorSwitchHiddenObjects", + "130014bc": "bhvHiddenObject", + "130014e0": "bhvBreakableBox", + "13001518": "bhvPushableMetalBox", + "13001548": "bhvHeaveHo", + "130015a4": "bhvHeaveHoThrowMario", + "130015c0": "bhvCcmTouchedStarSpawn", + "130015e4": "bhvUnusedPoundablePlatform", + "13001608": "bhvBetaTrampolineTop", + "13001634": "bhvBetaTrampolineSpring", + "13001650": "bhvJumpingBox", + "1300167c": "bhvBooCage", + "130016ac": "bhvStub", + "130016b8": "bhvIgloo", + "130016e4": "bhvBowserKey", + "13001714": "bhvGrandStar", + "13001744": "bhvBetaBooKey", + "13001778": "bhvAlphaBooKey", + "1300179c": "bhvBulletBill", + "130017f4": "bhvWhitePuffSmoke", + "13001820": "bhvUnused1820", + "13001828": "bhvBowserTailAnchor", + "13001850": "bhvBowser", + "130018cc": "bhvBowserBodyAnchor", + "13001904": "bhvBowserFlameSpawn", + "13001920": "bhvTiltingBowserLavaPlatform", + "13001958": "bhvFallingBowserPlatform", + "13001984": "bhvBlueBowserFlame", + "130019c8": "bhvFlameFloatingLanding", + "13001a0c": "bhvBlueFlamesGroup", + "13001a30": "bhvFlameBouncing", + "13001a74": "bhvFlameMovingForwardGrowing", + "13001aa4": "bhvFlameBowser", + "13001ae8": "bhvFlameLargeBurningOut", + "13001b2c": "bhvBlueFish", + "13001b54": "bhvTankFishGroup", + "13001b70": "bhvCheckerboardElevatorGroup", + "13001b88": "bhvCheckerboardPlatformSub", + "13001bb4": "bhvBowserKeyUnlockDoor", + "13001bd4": "bhvBowserKeyCourseExit", + "13001bf4": "bhvInvisibleObjectsUnderBridge", + "13001c04": "bhvWaterLevelPillar", + "13001c34": "bhvDddWarp", + "13001c58": "bhvMoatGrills", + "13001c7c": "bhvClockMinuteHand", + "13001c8c": "bhvClockHourHand", + "13001cb0": "bhvMacroUkiki", + "13001d0c": "bhvStub1D0C", + "13001d14": "bhvLllRotatingHexagonalPlatform", + "13001d40": "bhvLllSinkingRockBlock", + "13001d70": "bhvStub1D70", + "13001d78": "bhvLllMovingOctagonalMeshPlatform", + "13001da4": "bhvSnowBall", + "13001da8": "bhvLllRotatingBlockWithFireBars", + "13001dcc": "bhvLllRotatingHexFlame", + "13001e04": "bhvLllWoodPiece", + "13001e30": "bhvLllFloatingWoodBridge", + "13001e4c": "bhvVolcanoFlames", + "13001e6c": "bhvLllRotatingHexagonalRing", + "13001e94": "bhvLllSinkingRectangularPlatform", + "13001ec4": "bhvLllSinkingSquarePlatforms", + "13001ef8": "bhvLllTiltingInvertedPyramid", + "13001f30": "bhvUnused1F30", + "13001f3c": "bhvKoopaShell", + "13001f68": "bhvKoopaShellFlame", + "13001f90": "bhvToxBox", + "13001fbc": "bhvPiranhaPlant", + "13002018": "bhvLllHexagonalMesh", + "13002038": "bhvLllBowserPuzzlePiece", + "13002068": "bhvLllBowserPuzzle", + "13002088": "bhvTuxiesMother", + "130020d8": "bhvPenguinBaby", + "130020e0": "bhvUnused20E0", + "130020e8": "bhvSmallPenguin", + "1300213c": "bhvFish2", + "1300214c": "bhvFish3", + "1300215c": "bhvLargeFishGroup", + "13002178": "bhvFishGroup2", + "13002194": "bhvWdwExpressElevator", + "130021c0": "bhvWdwExpressElevatorPlatform", + "130021e4": "bhvChirpChirp", + "130021f4": "bhvChirpChirpUnused", + "1300220c": "bhvBub", + "13002250": "bhvExclamationBox", + "1300227c": "bhvRotatingExclamationMark", + "1300229c": "bhvSoundSpawner", + "130022b8": "bhvRockSolid", + "130022d8": "bhvBowserSubDoor", + "13002308": "bhvBowsersSub", + "13002338": "bhvSushiShark", + "13002388": "bhvSushiSharkCollisionChild", + "130023a4": "bhvJrbSlidingBox", + "130023d0": "bhvShipPart3", + "130023ec": "bhvInSunkenShip3", + "1300241c": "bhvSunkenShipPart", + "1300243c": "bhvSunkenShipSetRotation", + "1300244c": "bhvSunkenShipPart2", + "1300246c": "bhvInSunkenShip", + "13002480": "bhvInSunkenShip2", + "130024ac": "bhvMarioDustGenerator", + "130024dc": "bhvWhitePuff1", + "13002500": "bhvWhitePuff2", + "13002528": "bhvWhitePuffSmoke2", + "13002558": "bhvPurpleSwitchHiddenBoxes", + "13002568": "bhvBlueCoinSwitch", + "13002588": "bhvHiddenBlueCoin", + "130025c0": "bhvOpenableCageDoor", + "130025e0": "bhvOpenableGrill", + "130025f8": "bhvWaterLevelDiamond", + "13002620": "bhvInitializeChangingWaterLevel", + "13002634": "bhvTornadoSandParticle", + "13002650": "bhvTornado", + "13002684": "bhvMerryGoRoundBooManager", + "1300269c": "bhvAnimatedTexture", + "130026d4": "bhvBooInCastle", + "13002710": "bhvBooWithCage", + "13002768": "bhvBalconyBigBoo", + "1300277c": "bhvMerryGoRoundBigBoo", + "13002790": "bhvGhostHuntBigBoo", + "130027d0": "bhvCourtyardBooTriplet", + "130027e4": "bhvBoo", + "130027f4": "bhvMerryGoRoundBoo", + "13002804": "bhvGhostHuntBoo", + "1300286c": "bhvHiddenStaircaseStep", + "13002898": "bhvBooBossSpawnedBridge", + "130028cc": "bhvBbhTiltingTrapPlatform", + "130028fc": "bhvHauntedBookshelf", + "1300292c": "bhvMeshElevator", + "13002968": "bhvMerryGoRound", + "13002998": "bhvPlaysMusicTrackWhenTouched", + "130029b0": "bhvInsideCannon", + "130029b4": "bhvBetaBowserAnchor", + "130029e4": "bhvStaticCheckeredPlatform", + "13002a10": "bhvUnused2A10", + "13002a20": "bhvUnusedFakeStar", + "13002a48": "bhvStaticObject", + "13002a54": "bhvUnused2A54", + "13002a5c": "bhvCastleFloorTrap", + "13002a7c": "bhvFloorTrapInCastle", + "13002aa4": "bhvTree", + "13002ad0": "bhvSparkle", + "13002af0": "bhvSparkleSpawn", + "13002b08": "bhvSpecialTripleJumpSparkles", + "13002b5c": "bhvScuttlebug", + "13002ba0": "bhvScuttlebugSpawn", + "13002bb8": "bhvWhompKingBoss", + "13002bcc": "bhvSmallWhomp", + "13002c14": "bhvWaterSplash", + "13002c60": "bhvWaterDrops", + "13002c7c": "bhvWaterSurfaceWhiteWave", + "13002cb0": "bhvObjectBubbleRipples", + "13002ce0": "bhvSurfaceWaves", + "13002d28": "bhvWaterSurfaceWhiteWave2", + "13002d50": "bhvWavesGenerator", + "13002d7c": "bhvSurfaceWaveShrinking", + "13002db0": "bhvWaterType", + "13002dc0": "bhvWaveTrailOnSurface", + "13002e04": "bhvTinyWhiteWindParticle", + "13002e20": "bhvWindParticle", + "13002e3c": "bhvSnowmanWindBlowing", + "13002e58": "bhvWalkingPenguin", + "13002ea8": "bhvYellowBall", + "13002ec0": "bhvMario", + "13002ef8": "bhvToadMessage", + "13002f40": "bhvUnlockDoorStar", + "13002f60": "bhvWarps60", + "13002f64": "bhvWarps64", + "13002f68": "bhvWarps68", + "13002f6c": "bhvWarps6C", + "13002f70": "bhvWarps70", + "13002f74": "bhvWarps74", + "13002f78": "bhvWarps78", + "13002f7c": "bhvWarps7C", + "13002f80": "bhvWarps80", + "13002f84": "bhvWarps84", + "13002f88": "bhvWarps88", + "13002f8c": "bhvWarps8C", + "13002f90": "bhvWarps90", + "13002f94": "bhvWarps94", + "13002fa0": "bhvRandomAnimatedTexture", + "13002fc0": "bhvYellowBackgroundInMenu", + "13002fe4": "bhvMenuButton", + "13003008": "bhvMenuButtonManager", + "1300302c": "bhvActSelectorStarType", + "13003048": "bhvActSelector", + "13003068": "bhvMovingYellowCoin", + "130030a4": "bhvMovingBlueCoin", + "130030d4": "bhvBlueCoinSliding", + "13003104": "bhvBlueCoinJumping", + "13003134": "bhvSeaweed", + "13003158": "bhvSeaweedBundle", + "13003174": "bhvBobomb", + "130031ac": "bhvBobombFuseSmoke", + "130031dc": "bhvBobombBuddy", + "13003228": "bhvBobombBuddyOpensCannon", + "13003274": "bhvCannonClosed", + "130032a8": "bhvWhirlpool", + "130032c8": "bhvJetStream", + "130032e0": "bhvMessagePanel", + "13003324": "bhvSignOnWall", + "13003354": "bhvHomingAmp", + "13003388": "bhvCirclingAmp", + "130033bc": "bhvButterfly", + "130033ec": "bhvHoot", + "13003420": "bhvBetaHoldableObject", + "13003454": "bhvCarrySomething1", + "1300345c": "bhvCarrySomething2", + "13003464": "bhvCarrySomething3", + "1300346c": "bhvCarrySomething4", + "13003474": "bhvCarrySomething5", + "1300347c": "bhvCarrySomething6", + "13003484": "bhvObjectBubble", + "130034c4": "bhvObjectWaterWave", + "13003510": "bhvExplosion", + "13003558": "bhvBobombBullyDeathSmoke", + "13003588": "bhvSmoke", + "130035b0": "bhvBobombExplosionBubble", + "13003600": "bhvBobombExplosionBubble3600", + "13003614": "bhvRespawner", + "1300362c": "bhvSmallBully", + "13003660": "bhvBigBully", + "13003694": "bhvBigBullyWithMinions", + "130036c8": "bhvSmallChillBully", + "13003700": "bhvBigChillBully", + "13003738": "bhvJetStreamRingSpawner", + "13003750": "bhvJetStreamWaterRing", + "13003798": "bhvMantaRayWaterRing", + "130037e0": "bhvMantaRayRingManager", + "130037ec": "bhvBowserBomb", + "1300381c": "bhvBowserBombExplosion", + "13003840": "bhvBowserBombSmoke", + "13003868": "bhvCelebrationStar", + "13003888": "bhvCelebrationStarSparkle", + "130038b0": "bhvStarKeyCollectionPuffSpawner", + "130038d0": "bhvLllDrawbridgeSpawner", + "130038e8": "bhvLllDrawbridge", + "13003910": "bhvSmallBomp", + "13003940": "bhvLargeBomp", + "13003970": "bhvWfSlidingPlatform", + "130039a0": "bhvMoneybag", + "130039d4": "bhvMoneybagHidden", + "13003a08": "bhvPitBowlingBall", + "13003a30": "bhvFreeBowlingBall", + "13003a58": "bhvBowlingBall", + "13003a80": "bhvTtmBowlingBallSpawner", + "13003aa4": "bhvBobBowlingBallSpawner", + "13003ac8": "bhvThiBowlingBallSpawner", + "13003ae0": "bhvRrCruiserWing", + "13003b00": "bhvSpindel", + "13003b30": "bhvSslMovingPyramidWall", + "13003b60": "bhvPyramidElevator", + "13003b98": "bhvPyramidElevatorTrajectoryMarkerBall", + "13003bb4": "bhvPyramidTop", + "13003bec": "bhvPyramidTopFragment", + "13003c0c": "bhvPyramidPillarTouchDetector", + "13003c30": "bhvWaterfallSoundLoop", + "13003c44": "bhvVolcanoSoundLoop", + "13003c58": "bhvCastleFlagWaving", + "13003c7c": "bhvBirdsSoundLoop", + "13003c90": "bhvAmbientSounds", + "13003ca4": "bhvSandSoundLoop", + "13003cb8": "bhvHiddenAt120Stars", + "13003ce4": "bhvSnowmansBottom", + "13003d0c": "bhvSnowmansHead", + "13003d34": "bhvSnowmansBodyCheckpoint", + "13003d4c": "bhvBigSnowmanWhole", + "13003d74": "bhvBigBoulder", + "13003da0": "bhvBigBoulderGenerator", + "13003db8": "bhvWingCap", + "13003dd8": "bhvMetalCap", + "13003df8": "bhvNormalCap", + "13003e1c": "bhvVanishCap", + "13003e3c": "bhvStar", + "13003e64": "bhvStarSpawnCoordinates", + "13003e8c": "bhvHiddenRedCoinStar", + "13003eac": "bhvRedCoin", + "13003ee4": "bhvBowserCourseRedCoinStar", + "13003efc": "bhvHiddenStar", + "13003f1c": "bhvHiddenStarTrigger", + "13003f40": "bhvTtmRollingLog", + "13003f78": "bhvLllVolcanoFallingTrap", + "13003fa4": "bhvLllRollingLog", + "13003fdc": "bhv1upWalking", + "13004010": "bhv1upRunningAway", + "13004044": "bhv1upSliding", + "1300407c": "bhv1Up", + "130040b4": "bhv1upJumpOnApproach", + "130040ec": "bhvHidden1up", + "13004124": "bhvHidden1upTrigger", + "13004148": "bhvHidden1upInPole", + "13004180": "bhvHidden1upInPoleTrigger", + "130041a4": "bhvHidden1upInPoleSpawner", + "130041bc": "bhvControllablePlatform", + "130041f0": "bhvControllablePlatformSub", + "13004218": "bhvBreakableBoxSmall", + "13004244": "bhvSlidingSnowMound", + "13004270": "bhvSnowMoundSpawn", + "13004284": "bhvWdwSquareFloatingPlatform", + "130042b4": "bhvWdwRectangularFloatingPlatform", + "130042e4": "bhvJrbFloatingPlatform", + "13004314": "bhvArrowLift", + "13004348": "bhvOrangeNumber", + "13004370": "bhvMantaRay", + "130043a0": "bhvFallingPillar", + "130043c4": "bhvFallingPillarHitbox", + "130043e0": "bhvPillarBase", + "13004400": "bhvJrbFloatingBox", + "1300442c": "bhvDecorativePendulum", + "1300444c": "bhvTreasureChestsShip", + "13004470": "bhvTreasureChestsJrb", + "13004494": "bhvTreasureChests", + "130044b8": "bhvTreasureChestBottom", + "130044e0": "bhvTreasureChestTop", + "130044fc": "bhvMips", + "13004538": "bhvYoshi", + "13004580": "bhvKoopa", + "130045d0": "bhvKoopaRaceEndpoint", + "130045f8": "bhvKoopaFlag", + "13004634": "bhvPokey", + "13004668": "bhvPokeyBodyPart", + "13004698": "bhvSwoop", + "130046dc": "bhvFlyGuy", + "1300472c": "bhvGoomba", + "13004770": "bhvGoombaTripletSpawner", + "1300478c": "bhvChainChomp", + "130047e4": "bhvChainChompChainPart", + "1300481c": "bhvWoodenPost", + "13004868": "bhvChainChompGate", + "13004898": "bhvWigglerHead", + "130048e0": "bhvWigglerBody", + "13004918": "bhvEnemyLakitu", + "13004954": "bhvCameraLakitu", + "13004988": "bhvCloud", + "130049ac": "bhvCloudPart", + "130049c8": "bhvSpiny", + "13004a00": "bhvMontyMole", + "13004a58": "bhvMontyMoleHole", + "13004a78": "bhvMontyMoleRock", + "13004ab0": "bhvPlatformOnTrack", + "13004af4": "bhvTrackBall", + "13004b1c": "bhvSeesawPlatform", + "13004b44": "bhvFerrisWheelAxle", + "13004b6c": "bhvFerrisWheelPlatform", + "13004b8c": "bhvWaterBombSpawner", + "13004ba8": "bhvWaterBomb", + "13004bd4": "bhvWaterBombShadow", + "13004bf0": "bhvTTCRotatingSolid", + "13004c24": "bhvTTCPendulum", + "13004c5c": "bhvTTCTreadmill", + "13004c94": "bhvTTCMovingBar", + "13004ccc": "bhvTTCCog", + "13004cf8": "bhvTTCPitBlock", + "13004d28": "bhvTTCElevator", + "13004d64": "bhvTTC2DRotator", + "13004d90": "bhvTTCSpinner", + "13004dbc": "bhvMrBlizzard", + "13004e08": "bhvMrBlizzardSnowball", + "13004e4c": "bhvSlidingPlatform2", + "13004e78": "bhvOctagonalPlatformRotating", + "13004ea0": "bhvAnimatesOnFloorSwitchPress", + "13004ecc": "bhvActivatedBackAndForthPlatform", + "13004ef8": "bhvRecoveryHeart", + "13004f10": "bhvWaterBombCannon", + "13004f28": "bhvCannonBarrelBubbles", + "13004f40": "bhvUnagi", + "13004f78": "bhvUnagiSubobject", + "13004f90": "bhvDorrie", + "13004fd4": "bhvHauntedChair", + "13005024": "bhvMadPiano", + "1300506c": "bhvFlyingBookend", + "130050b4": "bhvBookendSpawn", + "130050d4": "bhvHauntedBookshelfManager", + "130050f4": "bhvBookSwitch", + "13005120": "bhvFirePiranhaPlant", + "13005158": "bhvSmallPiranhaFlame", + "1300518c": "bhvFireSpitter", + "130051ac": "bhvFlyguyFlame", + "130051e0": "bhvSnufit", + "1300521c": "bhvSnufitBalls", + "1300525c": "bhvHorizontalGrindel", + "130052b4": "bhvEyerokBoss", + "130052d0": "bhvEyerokHand", + "13005310": "bhvKlepto", + "13005354": "bhvBird", + "13005380": "bhvRacingPenguin", + "130053c4": "bhvPenguinRaceFinishLine", + "130053dc": "bhvPenguinRaceShortcutCheck", + "130053f4": "bhvCoffinManager", + "13005414": "bhvCoffin", + "13005440": "bhvClamShell", + "13005468": "bhvSkeeter", + "130054a0": "bhvSkeeterWave", + "130054b8": "bhvSwingPlatform", + "130054ec": "bhvDonutPlatformSpawner", + "13005504": "bhvDonutPlatform", + "13005528": "bhvDDDPole", + "1300556c": "bhvRedCoinStarMarker", + "13005598": "bhvTripletButterfly", + "130055dc": "bhvBubba", + "13005610": "bhvBeginningLakitu", + "13005638": "bhvBeginningPeach", + "1300565c": "bhvEndBirds1", + "13005680": "bhvEndBirds2", + "130056a4": "bhvIntroScene", + "130056c0": "_behaviorSegmentEnd", + "007d1d80": "_behaviorSegmentRomEnd", + "8016f000": "_goddardSegmentStart", + "007cc6c0": "_goddardSegmentRomStart", + }, + "Refresh 6": { + "80000000": "D_80000000", + "a4000000": "D_A4000000", + "a40004c0": "D_A40004C0", + "a4000774": "D_A4000774", + "a4001000": "D_A4001000", + "a4040010": "D_A4040010", + "a4080000": "D_A4080000", + "a4300000": "D_A4300000", + "a4300004": "D_A4300004", + "a4300008": "D_A4300008", + "a430000c": "D_A430000C", + "a4400010": "D_A4400010", + "a450000c": "D_A450000C", + "a4600000": "D_A4600000", + "a4600004": "D_A4600004", + "a460000c": "D_A460000C", + "a4600010": "D_A4600010", + "a4700000": "D_A4700000", + "a4700010": "D_A4700010", + "a4800018": "D_A4800018", + "b0000008": "D_B0000008", + "b0000010": "D_B0000010", + "b0000014": "D_B0000014", + "c0000000": "D_C0000000", + "c0000008": "D_C0000008", + "c000000c": "D_C000000C", + "00000000": "__romPos", + "04000000": "_bootSegmentStart", + "007cc6c0": "_bootSegmentRomStart", + "04001000": "_bootSegmentEnd", + "007cd6c0": "_bootSegmentRomEnd", + "80000400": ".", + "80000400": "_zbufferSegmentNoloadStart", + "80000400": "0x25800", + "80000400": "gZBuffer", + "80246000": "_mainSegmentStart", + "007cc6c0": "_mainSegmentRomStart", + "80246000": "EntryPoint", + "80246050": "handle_debug_key_sequences", + "80246170": "Unknown80246170", + "802461cc": "Dummy802461CC", + "802461dc": "Dummy802461DC", + "802461ec": "Dummy802461EC", + "802461fc": "setup_mesg_queues", + "802462e0": "AllocPool", + "80246338": "create_thread", + "8024639c": "handle_nmi_request", + "802463ec": "receive_new_tasks", + "8024651c": "start_sptask", + "8024659c": "interrupt_gfx_sptask", + "802465ec": "start_gfx_sptask", + "80246648": "pretend_audio_sptask_done", + "8024669c": "handle_vblank", + "802467fc": "handle_sp_complete", + "8024694c": "handle_dp_complete", + "802469b8": "thread3_main", + "80246b14": "set_vblank_handler", + "80246b74": "SendMessage", + "80246bb4": "dispatch_audio_sptask", + "80246c10": "send_display_list", + "80246c9c": "turn_on_audio", + "80246cb8": "turn_off_audio", + "80246cf0": "thread1_idle", + "80246df8": "Main", + "80246e70": "my_rdp_init", + "802471a4": "my_rsp_init", + "80247284": "clear_z_buffer", + "802473c8": "display_frame_buffer", + "802474b8": "clear_frame_buffer", + "80247620": "clear_viewport", + "8024784c": "draw_screen_borders", + "802479bc": "make_viewport_clip_rect", + "80247b3c": "create_task_structure", + "80247ccc": "init_render_image", + "80247d14": "end_master_display_list", + "80247db4": "func_80247D84", + "80247f08": "func_80247ED8", + "80247fdc": "func_80247FAC", + "80248090": "display_and_vsync", + "80248304": "adjust_analog_stick", + "80248498": "run_demo_inputs", + "80248638": "read_controller_inputs", + "80248824": "init_controllers", + "80248964": "setup_game_memory", + "80248af0": "thread5_game_loop", + "80248c40": "func_80248C10", + "80248c58": "func_80248C28", + "80248ce8": "func_80248CB8", + "80248d78": "func_80248D48", + "80248dc0": "func_80248D90", + "80248e08": "set_sound_mode", + "80248e54": "play_menu_sounds", + "80248fec": "play_painting_eject_sound", + "80249070": "play_infinite_stairs_music", + "80249178": "set_background_music", + "8024922c": "func_802491FC", + "8024927c": "func_8024924C", + "802492d0": "play_cutscene_music", + "80249310": "play_shell_music", + "8024934c": "stop_shell_music", + "80249398": "play_cap_music", + "80249404": "fadeout_cap_music", + "80249448": "stop_cap_music", + "802494d8": "audio_game_loop_tick", + "80249500": "thread4_sound", + "802495e0": "level_control_timer", + "802496b8": "pressed_paused", + "80249764": "set_play_mode", + "8024978c": "func_8024975C", + "802497b8": "func_80249788", + "8024982c": "nop_802497FC", + "8024983c": "func_8024980C", + "8024995c": "func_8024992C", + "80249a10": "set_mario_initial_cap_powerup", + "80249ab4": "set_mario_initial_action", + "80249cd8": "init_mario_after_warp", + "8024a124": "func_8024A02C", + "8024a18c": "func_8024A094", + "8024a1d8": "func_8024A0E0", + "8024a374": "check_instant_warp", + "8024a584": "func_8024A48C", + "8024a700": "initiate_warp", + "8024a7b4": "get_painting_warp_node", + "8024a85c": "initiate_painting_warp", + "8024a9cc": "level_trigger_warp", + "8024aedc": "initiate_delayed_warp", + "8024b13c": "update_hud_values", + "8024b390": "basic_update", + "8024b3e4": "play_mode_normal", + "8024b5d4": "play_mode_paused", + "8024b6cc": "play_mode_frame_advance", + "8024b798": "level_set_transition", + "8024b7c0": "play_mode_change_area", + "8024b880": "play_mode_change_level", + "8024b9b8": "update_level", + "8024ba8c": "init_level", + "8024bcd8": "lvl_init_or_update", + "8024bd5c": "lvl_init_from_save_file", + "8024be14": "lvl_set_current_level", + "8024bfa0": "lvl_play_the_end_screen_sound", + "8024bff0": "get_mario_cap_flag", + "8024c0b8": "object_facing_mario", + "8024c16c": "mario_angle_to_object", + "8024c1d8": "determine_interaction", + "8024c51c": "attack_object", + "8024c618": "mario_stop_riding_object", + "8024c66c": "mario_grab_used_object", + "8024c6c0": "mario_drop_held_object", + "8024c780": "mario_throw_held_object", + "8024c894": "mario_stop_riding_and_holding", + "8024c8fc": "does_mario_have_hat", + "8024c928": "mario_blow_off_cap", + "8024ca68": "mario_lose_cap_to_enemy", + "8024caf8": "mario_retrieve_cap", + "8024cb58": "able_to_grab_object", + "8024cbfc": "mario_get_collided_object", + "8024cc7c": "mario_check_object_grab", + "8024ce08": "bully_knock_back_mario", + "8024d0b4": "bounce_off_object", + "8024d130": "hit_object_from_below", + "8024d2bc": "determine_knockback_action", + "8024d578": "push_mario_out_of_object", + "8024d72c": "bounce_back_from_attack", + "8024d804": "func_8024D664", + "8024d8b0": "take_damage_from_interact_object", + "8024d998": "take_damage_and_knock_back", + "8024daac": "reset_mario_pitch", + "8024db2c": "interact_coin", + "8024dbf0": "interact_water_ring", + "8024dc28": "interact_star_or_key", + "8024de4c": "interact_bbh_entrance", + "8024df10": "interact_warp", + "8024e0c4": "interact_warp_door", + "8024e2fc": "get_door_save_file_flag", + "8024e420": "interact_door", + "8024e6ec": "interact_cannon_base", + "8024e778": "interact_igloo_barrier", + "8024e7d4": "interact_tornado", + "8024e8f0": "interact_whirlpool", + "8024e9d0": "interact_wind", + "8024ead8": "interact_flame", + "8024ec54": "interact_snufit_bullet", + "8024ed84": "interact_clam_or_bubba", + "8024ee44": "interact_bully", + "8024eff8": "interact_shock", + "8024f170": "interact_mr_blizzard", + "8024f1e0": "interact_hit_from_below", + "8024f354": "interact_bounce_top", + "8024f4ac": "interact_unknown_08", + "8024f55c": "interact_damage", + "8024f5cc": "interact_breakable", + "8024f6a4": "interact_koopa_shell", + "8024f7a8": "check_object_grab_mario", + "8024f8bc": "interact_pole", + "8024fa60": "interact_hoot", + "8024fb30": "interact_cap", + "8024fd2c": "interact_grabbable", + "8024fe6c": "func_8024FC94", + "8024ff04": "func_8024FD2C", + "80250098": "func_8024FEC0", + "80250198": "interact_text", + "80250230": "check_kick_or_punch_wall", + "802503f0": "mario_process_interactions", + "802505c8": "check_death_barrier", + "8025065c": "check_lava_boost", + "80250724": "pss_begin_slide", + "80250778": "pss_end_slide", + "802507fc": "mario_handle_special_floors", + "80250940": "is_anim_at_end", + "8025097c": "is_anim_past_end", + "802509b8": "set_mario_animation", + "80250b04": "set_mario_anim_with_accel", + "80250c7c": "set_anim_to_frame", + "80250d38": "is_anim_past_frame", + "80250e54": "find_mario_anim_flags_and_translation", + "80251020": "update_mario_pos_for_anim", + "802510dc": "return_mario_anim_y_translation", + "80251120": "play_sound_if_no_flag", + "8025118c": "play_mario_jump_sound", + "80251274": "adjust_sound_for_speed", + "80251310": "play_sound_and_spawn_particles", + "80251444": "play_mario_action_sound", + "802514ac": "play_mario_landing_sound", + "80251510": "play_mario_landing_sound_once", + "80251574": "play_mario_heavy_landing_sound", + "802515d8": "play_mario_heavy_landing_sound_once", + "8025163c": "play_mario_sound", + "80251708": "mario_set_forward_vel", + "8025177c": "mario_get_floor_class", + "802518a8": "mario_get_terrain_sound_addend", + "80251a48": "resolve_and_return_wall_collisions", + "80251afc": "vec3f_find_ceil", + "80251b54": "mario_facing_downhill", + "80251bd4": "mario_floor_is_slippery", + "80251cfc": "mario_floor_is_slope", + "80251e24": "mario_floor_is_steep", + "80251f24": "find_floor_height_relative_polar", + "80252000": "find_floor_slope", + "802521a0": "update_mario_sound_and_camera", + "8025229c": "set_steep_jump_action", + "80252cf4": "set_mario_action", + "80252e5c": "set_jump_from_landing", + "802530a0": "set_jumping_action", + "80253178": "drop_and_set_mario_action", + "802531c4": "hurt_and_set_mario_action", + "80253218": "check_common_action_exits", + "80253300": "check_common_hold_action_exits", + "802533e4": "transition_submerged_to_walking", + "80253488": "set_water_plunge_action", + "80253588": "squish_mario_model", + "80253720": "debug_print_speed_action_normal", + "80253838": "update_mario_button_inputs", + "8025395c": "update_mario_joystick_inputs", + "80253a60": "update_mario_geometry_inputs", + "80253d58": "update_mario_inputs", + "80253ec0": "set_submerged_cam_preset_and_spawn_bubbles", + "80254060": "update_mario_health", + "802542b4": "update_mario_info_for_cam", + "80254338": "mario_reset_bodystate", + "80254390": "sink_mario_in_quicksand", + "802543e8": "update_and_return_cap_flags", + "80254588": "mario_update_hitbox_and_cap_model", + "80254830": "execute_mario_action", + "80254b20": "init_mario", + "80254f44": "init_mario_from_save_file", + "80255080": "get_additive_y_vel_for_jumps", + "8025509c": "nop_80254E3C", + "802550b0": "nop_80254E50", + "802550c0": "transfer_bully_speed", + "80255238": "init_bully_collision_data", + "802552fc": "mario_bonk_reflection", + "80255414": "mario_update_quicksand", + "80255654": "mario_push_off_steep_floor", + "8025570c": "mario_update_moving_sand", + "8025580c": "mario_update_windy_ground", + "802559b0": "stop_and_set_height_to_floor", + "80255a34": "stationary_ground_step", + "80255d88": "perform_ground_step", + "80255ec4": "check_ledge_grab", + "802560ac": "perform_air_quarter_step", + "802564e0": "apply_twirl_gravity", + "80256584": "should_strengthen_gravity_for_jump_ascent", + "8025661c": "apply_gravity", + "802569f8": "apply_vertical_wind", + "80256b24": "perform_air_step", + "80256cd8": "set_vel_from_pitch_and_yaw", + "80256d8c": "set_vel_from_yaw", + "80256e00": "get_credits_str_width", + "80256e88": "print_displaying_credits_entry", + "80257060": "BehEndPeachLoop", + "802570dc": "BehEndToadLoop", + "80257198": "geo_switch_peach_eyes", + "802572b0": "get_star_collection_dialog", + "8025733c": "handle_save_menu", + "80257450": "spawn_obj_at_mario_rel_yaw", + "802574e8": "cutscene_take_cap_off", + "80257548": "cutscene_put_cap_on", + "802575a8": "mario_ready_to_speak", + "80257640": "set_mario_npc_dialog", + "80257748": "act_reading_npc_dialog", + "80257980": "act_waiting_for_dialog", + "80257a0c": "act_disappeared", + "80257ab0": "act_reading_automatic_dialog", + "80257ce4": "act_reading_sign", + "80257eac": "act_debug_free_move", + "80258184": "general_star_dance_handler", + "80258420": "act_star_dance", + "802584dc": "act_star_dance_water", + "802585c0": "act_fall_after_star_grab", + "802586cc": "common_death_handler", + "80258744": "act_standing_death", + "802587ec": "act_electrocution", + "8025883c": "act_suffocation", + "8025888c": "act_death_on_back", + "802588f8": "act_death_on_stomach", + "80258964": "act_quicksand_death", + "80258a7c": "act_eaten_by_bubba", + "80258b24": "launch_mario_until_land", + "80258ba8": "act_unlocking_key_door", + "80258dac": "act_unlocking_star_door", + "80258f94": "act_entering_star_door", + "80259264": "act_going_through_door", + "802593cc": "act_warp_door_spawn", + "802594d4": "act_emerge_from_pipe", + "80259608": "act_spawn_spin_airborne", + "80259740": "act_spawn_spin_landing", + "802597ac": "act_exit_airborne", + "80259854": "act_falling_exit_airborne", + "802598d0": "act_exit_land_save_dialog", + "80259c30": "act_death_exit", + "80259ce8": "act_unused_death_exit", + "80259d74": "act_falling_death_exit", + "80259e00": "act_special_exit_airborne", + "80259ef8": "act_special_death_exit", + "80259fcc": "act_spawn_no_spin_airborne", + "8025a040": "act_spawn_no_spin_landing", + "8025a0bc": "act_bbh_enter_spin", + "8025a494": "act_bbh_enter_jump", + "8025a610": "act_teleport_fade_out", + "8025a6fc": "act_teleport_fade_in", + "8025a858": "act_shocked", + "8025a9ac": "act_squished", + "8025ae0c": "act_putting_on_cap", + "8025aea8": "stuck_in_ground_handler", + "8025affc": "act_head_stuck_in_ground", + "8025b050": "act_butt_stuck_in_ground", + "8025b0a4": "act_feet_stuck_in_ground", + "8025d798": "mario_execute_cutscene_action", + "8025dd70": "add_tree_leaf_particles", + "8025de1c": "play_climbing_sounds", + "8025df04": "set_pole_position", + "8025e21c": "act_holding_pole", + "8025e5a8": "act_climbing_pole", + "8025e7a4": "act_grab_pole_slow", + "8025e830": "act_grab_pole_fast", + "8025e930": "act_top_of_pole_transition", + "8025ea30": "act_top_of_pole", + "8025eb50": "perform_hanging_step", + "8025ecfc": "update_hang_moving", + "8025eed0": "update_hang_stationary", + "8025ef58": "act_start_hanging", + "8025f0b4": "act_hanging", + "8025f1e4": "act_hang_moving", + "8025f384": "let_go_of_ledge", + "8025f4b4": "func_8025F0DC", + "8025f560": "func_8025F188", + "8025f644": "update_ledge_climb", + "8025f6c0": "act_ledge_grab", + "8025f970": "act_ledge_climb_slow", + "8025fa64": "act_ledge_climb_down", + "8025fae8": "act_ledge_climb_fast", + "8025fb90": "act_grabbed", + "8025fc6c": "act_in_cannon", + "80260154": "act_tornado_twirling", + "80260568": "check_common_automatic_cancels", + "802605d0": "mario_execute_automatic_action", + "802608b0": "func_802604E0", + "80260aac": "func_802606DC", + "80260cb4": "act_idle", + "80260f94": "func_80260BC4", + "80261000": "act_start_sleeping", + "80261268": "act_sleeping", + "802614fc": "act_waking_up", + "8026168c": "act_shivering", + "802618d8": "act_coughing", + "802619d0": "act_hold_idle", + "80261ad0": "act_hold_heavy_idle", + "80261bf8": "act_standing_against_wall", + "80261cec": "act_in_quicksand", + "80261db4": "act_crouching", + "80261f70": "act_panting", + "80262080": "act_hold_panting_unused", + "8026217c": "func_80261D70", + "802621dc": "act_braking_stop", + "802622dc": "act_butt_slide_stop", + "80262398": "func_80261F8C", + "80262490": "act_slide_kick_slide_stop", + "80262530": "act_start_crouching", + "80262650": "act_stop_crouching", + "80262770": "act_start_crawling", + "80262890": "act_stop_crawling", + "80262980": "func_80262574", + "80262bc4": "func_802627B8", + "80262c34": "func_80262828", + "80262d68": "act_jump_land_stop", + "80262dc4": "act_double_jump_land_stop", + "80262e20": "act_side_flip_land_stop", + "80262e94": "act_freefall_land_stop", + "80262ef0": "act_triple_jump_land_stop", + "80262f50": "act_backflip_land_stop", + "80262fec": "act_lava_boost_land", + "8026305c": "act_long_jump_land_stop", + "802630f8": "func_80262CEC", + "802631f0": "func_80262DE4", + "802632e8": "act_air_throw_land", + "802633b4": "act_twirl_land", + "8026350c": "act_ground_pound_land", + "802635e8": "act_first_person", + "80263784": "func_80263378", + "80263898": "mario_execute_stationary_action", + "80263e60": "func_80263A50", + "80263ee4": "func_80263AD4", + "80264024": "func_80263C14", + "8026409c": "begin_walking_action", + "802640fc": "check_ledge_climb_down", + "802642b4": "slide_bonk", + "80264340": "set_triple_jump_action", + "8026440c": "update_sliding_angle", + "80264740": "update_sliding", + "80264b54": "apply_slope_accel", + "80264d80": "apply_landing_accel", + "80264e18": "update_shell_speed", + "80265080": "apply_slope_decel", + "802651b0": "update_decelerating_speed", + "80265244": "update_walking_speed", + "80265458": "should_begin_sliding", + "80265514": "analog_stick_held_back", + "80265558": "check_ground_dive_or_punch", + "80265620": "begin_braking_action", + "80265700": "func_802652F0", + "80265b1c": "func_8026570C", + "80265d90": "func_80265980", + "80265df8": "func_802659E8", + "80266038": "func_80265C28", + "802661cc": "func_80265DBC", + "80266354": "act_walking", + "802665b4": "act_move_punching", + "80266734": "act_hold_walking", + "8026699c": "act_hold_heavy_walking", + "80266af8": "act_turning_around", + "80266d4c": "act_finish_turning_around", + "80266e48": "act_braking", + "80266fc8": "act_decelerating", + "80267240": "act_hold_decelerating", + "80267504": "act_riding_shell_ground", + "80267728": "act_crawling", + "8026795c": "act_burning_ground", + "80267c24": "func_80267814", + "80267ce4": "common_slide_action", + "80267fa4": "common_slide_action_with_jump", + "80268074": "act_butt_slide", + "802680d4": "act_hold_butt_slide", + "80268168": "act_crouch_slide", + "80268338": "act_slide_kick_slide", + "802684ac": "stomach_slide_action", + "802685c0": "act_stomach_slide", + "80268608": "act_hold_stomach_slide", + "80268684": "act_dive_slide", + "802687b8": "common_ground_knockback_action", + "802689f8": "act_hard_backward_ground_kb", + "80268adc": "act_hard_forward_ground_kb", + "80268b64": "act_backward_ground_kb", + "80268bb0": "act_forward_ground_kb", + "80268bfc": "act_soft_backward_ground_kb", + "80268c48": "act_soft_forward_ground_kb", + "80268c94": "act_ground_bonk", + "80268d04": "act_death_exit_land", + "80268dcc": "common_landing_action", + "80268f78": "common_landing_cancels", + "80269108": "act_jump_land", + "80269170": "act_freefall_land", + "802691d8": "act_side_flip_land", + "80269264": "act_hold_jump_land", + "80269300": "act_hold_freefall_land", + "8026939c": "act_long_jump_land", + "8026947c": "act_double_jump_land", + "802694e4": "act_triple_jump_land", + "80269588": "act_backflip_land", + "80269640": "quicksand_jump_land_action", + "80269788": "act_quicksand_jump_land", + "802697dc": "act_hold_quicksand_jump_land", + "80269830": "check_common_moving_cancels", + "80269954": "mario_execute_moving_action", + "80269f40": "play_flip_sounds", + "80269fc0": "play_far_fall_sound", + "8026a090": "func_u_8026A090", + "8026a12c": "lava_boost_on_wall", + "8026a224": "check_fall_damage", + "8026a400": "check_kick_or_dive_in_air", + "8026a494": "should_get_stuck_in_ground", + "8026a598": "check_fall_damage_or_get_stuck", + "8026a62c": "check_horizontal_wind", + "8026a818": "update_air_with_turn", + "8026aa48": "update_air_without_turn", + "8026acd8": "update_lava_boost_or_twirling", + "8026ae5c": "update_flying_yaw", + "8026b004": "update_flying_pitch", + "8026b17c": "update_flying", + "8026b444": "common_air_action_step", + "8026b6a0": "act_jump", + "8026b740": "act_double_jump", + "8026b814": "act_triple_jump", + "8026b90c": "act_backflip", + "8026b9ac": "act_freefall", + "8026bab8": "act_hold_jump", + "8026bbb4": "act_hold_freefall", + "8026bcc0": "act_side_flip", + "8026bdcc": "act_wall_kick_air", + "8026be78": "act_long_jump", + "8026bf40": "act_riding_shell_air", + "8026c034": "act_twirling", + "8026c1e0": "act_dive", + "8026c4b8": "act_air_throw", + "8026c5d0": "act_water_jump", + "8026c738": "act_hold_water_jump", + "8026c880": "act_steep_jump", + "8026c9fc": "act_ground_pound", + "8026cd0c": "act_burning_jump", + "8026ce50": "act_burning_fall", + "8026cf28": "act_crazy_box_bounce", + "8026d1b0": "common_air_knockback_step", + "8026d33c": "func_8026CDFC", + "8026d3c8": "act_backward_air_kb", + "8026d43c": "act_forward_air_kb", + "8026d4b0": "act_hard_backward_air_kb", + "8026d508": "act_hard_forward_air_kb", + "8026d560": "act_thrown_backward", + "8026d608": "act_thrown_forward", + "8026d6fc": "act_soft_bonk", + "8026d770": "act_getting_blown", + "8026d988": "act_air_hit_wall", + "8026db54": "act_forward_rollout", + "8026dcf4": "act_backward_rollout", + "8026de98": "act_butt_slide_air", + "8026e088": "act_hold_butt_slide_air", + "8026e2b4": "act_lava_boost", + "8026e59c": "act_slide_kick", + "8026e810": "act_jump_kick", + "8026e968": "act_shot_from_cannon", + "8026ec00": "act_flying", + "8026f158": "act_riding_hoot", + "8026f2ec": "act_flying_triple_jump", + "8026f614": "act_top_of_pole_jump", + "8026f660": "act_vertical_wind", + "8026f840": "act_special_triple_jump", + "8026fa18": "check_common_airborne_cancels", + "8026fb04": "mario_execute_airborne_action", + "8027499c": "mario_execute_submerged_action", + "80274eb0": "animated_stationary_ground_step", + "80274f10": "mario_update_punch_sequence", + "80275328": "act_punching", + "8027546c": "act_picking_up", + "802755fc": "act_dive_picking_up", + "802756c8": "act_placing_down", + "80275794": "act_throwing", + "802758c0": "act_heavy_throw", + "802759b4": "act_stomach_slide_stop", + "80275a80": "act_picking_up_bowser", + "80275b34": "act_holding_bowser", + "80275e78": "act_releasing_bowser", + "80275f0c": "check_common_object_cancels", + "80275fe0": "mario_execute_object_action", + "802761d0": "geo_enfvx_main", + "802763d4": "geo_skybox_main", + "802764b0": "geo_draw_mario_head_goddard", + "8027684c": "bhvToadMessage_loop", + "80276910": "bhvToadMessage_init", + "80276bb8": "bhvUnlockDoorStar_init", + "80276ccc": "bhvUnlockDoorStar_loop", + "802770a4": "geo_mirror_mario_set_alpha", + "80277150": "geo_switch_mario_stand_run", + "802771bc": "geo_switch_mario_eyes", + "80277294": "geo_mario_tilt_torso", + "802773a4": "geo_mario_head_rotation", + "802774f4": "geo_switch_mario_hand", + "802775cc": "geo_mario_hand_foot_scaler", + "802776d8": "geo_switch_mario_cap_effect", + "80277740": "geo_switch_mario_cap_on_off", + "80277824": "geo_mario_rotate_wing_cap_wings", + "8027795c": "geo_switch_mario_hand_grab_pos", + "80277b14": "geo_render_mirror_mario", + "80277d6c": "geo_mirror_mario_backface_culling", + "80277ee0": "set_segment_base_addr", + "80277f20": "get_segment_base_addr", + "80277f50": "segmented_to_virtual", + "80277fa8": "virtual_to_segmented", + "80277ff0": "move_segment_table_to_dmem", + "80278074": "main_pool_init", + "80278120": "main_pool_alloc", + "80278238": "main_pool_free", + "80278358": "main_pool_realloc", + "802783c8": "main_pool_available", + "802783e8": "main_pool_push_state", + "80278498": "main_pool_pop_state", + "8027868c": "load_segment", + "802786f0": "load_to_fixed_pool_addr", + "802787d8": "load_segment_decompress", + "802788b4": "func_80278304", + "80278974": "load_engine_code_segment", + "80278a14": "alloc_only_pool_init", + "80278ab8": "alloc_only_pool_alloc", + "80278b28": "alloc_only_pool_resize", + "80278b98": "mem_pool_init", + "80278c58": "mem_pool_alloc", + "80278d74": "mem_pool_free", + "80278f2c": "alloc_display_list", + "80279028": "func_80278A78", + "80279084": "func_80278AD4", + "80279840": "save_file_do_save", + "802798fc": "save_file_erase", + "80279960": "save_file_copy", + "802799dc": "save_file_load_all", + "80279bc8": "save_file_reload", + "80279c44": "save_file_collect_star_or_key", + "80279e44": "save_file_exists", + "80279e80": "save_file_get_max_coin_score", + "80279f80": "save_file_get_course_star_count", + "8027a010": "save_file_get_total_star_count", + "8027a0a8": "save_file_set_flags", + "8027a0f4": "save_file_clear_flags", + "8027a16c": "save_file_get_flags", + "8027a1c8": "save_file_get_star_flags", + "8027a23c": "save_file_set_star_flags", + "8027a310": "save_file_get_course_coin_score", + "8027a340": "save_file_is_cannon_unlocked", + "8027a390": "save_file_set_cannon_unlocked", + "8027a418": "save_file_set_cap_pos", + "8027a4ac": "save_file_get_cap_pos", + "8027a564": "save_file_set_sound_mode", + "8027a5b4": "save_file_get_sound_mode", + "8027a5d4": "save_file_move_cap_to_default_location", + "8027a698": "disable_warp_checkpoint", + "8027a6b0": "check_if_should_set_warp_checkpoint", + "8027a718": "check_warp_checkpoint", + "8027a7d0": "func_8027A220", + "8027a83c": "set_warp_transition_rgb", + "8027a8b0": "print_intro_text", + "8027a93c": "get_mario_spawn_type", + "8027a9c8": "area_get_warp_node", + "8027aa28": "func_8027A478", + "8027aa74": "func_8027A4C4", + "8027ab04": "clear_areas", + "8027ad74": "func_8027A7C4", + "8027ae44": "load_area", + "8027af48": "func_8027A998", + "8027afbc": "load_mario_area", + "8027b038": "func_8027AA88", + "8027b0c0": "change_area", + "8027b164": "area_update_objects", + "8027b1a0": "play_transition", + "8027b35c": "play_transition_after_delay", + "8027b3b4": "render_game", + "8027cf38": "geo_set_animation_globals", + "8027da84": "geo_process_held_object", + "8027de68": "geo_try_process_children", + "8027dea8": "geo_process_node_and_siblings", + "8027e130": "geo_process_root", + "8027e3e0": "profiler_log_thread5_time", + "8027e490": "profiler_log_thread4_time", + "8027e520": "profiler_log_gfx_time", + "8027e5cc": "profiler_log_vblank_time", + "8027e65c": "draw_profiler_bar", + "8027e958": "draw_reference_profiler_bars", + "8027ebcc": "draw_profiler_mode_1", + "8027eeac": "draw_profiler_mode_0", + "8027f460": "draw_profiler", + "8027f4e0": "decompress", + "8027f590": "set_camera_shake_from_hit", + "8027f8b8": "set_environmental_camera_shake", + "8027f9f0": "set_camera_shake_from_point", + "8027fb74": "unused_set_camera_pitch_shake_env", + "8027fc18": "calc_y_to_curr_floor", + "8027fe20": "focus_on_mario", + "8027fff8": "set_camera_height", + "80280368": "look_down_slopes", + "802804f4": "pan_ahead_of_player", + "802806a4": "find_in_bounds_yaw_wdw_bob_thi", + "80280810": "update_radial_camera", + "80280970": "update_8_directions_camera", + "80280b00": "radial_camera_move", + "80281188": "lakitu_zoom", + "802813bc": "radial_camera_input_default", + "802813ec": "update_yaw_and_dist_from_c_up", + "8028146c": "mode_radial_camera", + "80281588": "mode_8_directions_camera", + "802816a0": "update_outward_radial_camera", + "802817fc": "mode_outward_radial_camera", + "80281904": "update_parallel_tracking_camera", + "80282280": "update_fixed_camera", + "802826a0": "update_boss_fight_camera", + "80282c0c": "unused_update_mode_5_camera", + "80282c3c": "mode_boss_fight_camera", + "80282c7c": "mode_parallel_tracking_camera", + "80282ce0": "mode_fixed_camera", + "80282d78": "update_behind_mario_camera", + "80283340": "mode_behind_mario", + "80283578": "update_slide_camera", + "802839e4": "mode_behind_mario_camera", + "80283a18": "nop_update_water_camera", + "80283a34": "mode_water_surface_camera", + "80283a68": "update_mario_camera", + "80283af8": "update_default_camera", + "80284cb8": "mode_default_camera", + "80284cfc": "mode_lakitu_camera", + "80284d38": "mode_mario_camera", + "80284d74": "update_spiral_stairs_camera", + "802850ac": "mode_spiral_stairs_camera", + "802850ec": "update_slide_or_0f_camera", + "802851dc": "mode_slide_camera", + "8028526c": "store_lakitu_cam_info_for_c_up", + "802852f4": "set_mode_c_up", + "80285370": "exit_c_up", + "80285808": "update_c_up", + "802858a4": "move_mario_head_c_up", + "80285a2c": "move_into_c_up", + "80285d20": "mode_c_up_camera", + "80285ed8": "update_in_cannon", + "80285f60": "mode_cannon_camera", + "8028603c": "transition_next_state", + "80286088": "transition_to_camera_mode", + "80286188": "set_camera_mode", + "80286420": "update_lakitu", + "802868f8": "update_camera", + "80286f68": "reset_camera", + "8028724c": "init_camera", + "802879ec": "zoom_out_if_paused_and_outside", + "80287bc4": "select_mario_cam_mode", + "80287be0": "create_camera", + "80287cb8": "update_graph_node_camera", + "80287d30": "geo_camera_main", + "80287dc0": "dummy_802877D8", + "80287dd4": "dummy_802877EC", + "80287de8": "vec3f_sub", + "80287e28": "object_pos_to_vec3f", + "80287e50": "vec3f_to_object_pos", + "80287e78": "unused_object_angle_to_vec3s", + "80287ea0": "evaluate_cubic_spline", + "802882e4": "move_point_along_spline", + "80288624": "cam_select_alt_mode", + "80288718": "set_cam_angle", + "80288888": "set_handheld_shake", + "802889b0": "shake_camera_handheld", + "80288ce4": "find_c_buttons_pressed", + "80288e68": "update_camera_hud_status", + "80288f5c": "collide_with_walls", + "80289198": "vec3f_compare", + "80289214": "clamp_pitch", + "802892d8": "is_within_100_units_of_mario", + "8028935c": "set_or_approach_f32_asymptotic", + "802893f4": "approach_f32_asymptotic_bool", + "80289488": "approach_f32_asymptotic", + "802894b4": "approach_s16_asymptotic_bool", + "8028956c": "approach_s16_asymptotic", + "80289610": "approach_vec3f_asymptotic", + "80289684": "set_or_approach_vec3f_asymptotic", + "802896f8": "approach_vec3s_asymptotic", + "8028976c": "camera_approach_s16_symmetric_bool", + "8028984c": "camera_approach_s16_symmetric", + "8028993c": "set_or_approach_s16_symmetric", + "802899cc": "camera_approach_f32_symmetric_bool", + "80289b0c": "camera_approach_f32_symmetric", + "80289c00": "random_vec3s", + "80289d20": "reduce_by_dist_from_camera", + "80289f88": "clamp_positions_and_find_yaw", + "8028a080": "calc_avoid_yaw", + "8028a0f4": "is_surf_within_bounding_box", + "8028a4ec": "is_behind_surface", + "8028a6bc": "is_range_behind_surface", + "8028a7ec": "is_mario_behind_surface", + "8028a834": "scale_along_line", + "8028a8e8": "is_pos_in_bounds", + "8028aa28": "calculate_pitch", + "8028aad8": "calculate_yaw", + "8028ab60": "calculate_angles", + "8028ac28": "calc_abs_dist", + "8028accc": "calc_hor_dist", + "8028ad4c": "rotate_in_xz", + "8028ae1c": "rotate_in_yz", + "8028aef0": "set_camera_pitch_shake", + "8028af4c": "set_camera_yaw_shake", + "8028b00c": "set_camera_roll_shake", + "8028b068": "set_pitch_shake_from_point", + "8028b11c": "set_yaw_shake_from_point", + "8028b1d0": "increment_shake_offset", + "8028b218": "shake_camera_pitch", + "8028b32c": "shake_camera_yaw", + "8028b438": "shake_camera_roll", + "8028b50c": "offset_yaw_outward_radial", + "8028b724": "cutscene_intro_peach_play_message_music", + "8028b754": "cutscene_intro_peach_play_lakitu_flying_music", + "8028b784": "play_camera_buzz_if_cdown", + "8028b7c4": "play_camera_buzz_if_cbutton", + "8028b804": "play_camera_buzz_if_c_sideways", + "8028b850": "play_sound_cbutton_up", + "8028b884": "play_sound_cbutton_down", + "8028b8b8": "play_sound_cbutton_side", + "8028b8ec": "play_sound_button_change_blocked", + "8028b920": "play_sound_rbutton_changed", + "8028b954": "play_sound_if_cam_switched_to_lakitu_or_mario", + "8028b9c4": "radial_camera_input", + "8028bd34": "trigger_cutscene_dialog", + "8028bd98": "handle_c_button_movement", + "8028c038": "clear_cutscene_vars", + "8028c13c": "start_cutscene", + "8028c18c": "determine_dance_cutscene", + "8028c26c": "open_door_cutscene", + "8028c2c8": "get_cutscene_from_mario_status", + "8028c7a0": "warp_camera", + "8028c8f0": "approach_camera_height", + "8028c9ac": "unused_8028C3AC", + "8028c9cc": "set_focus_rel_mario", + "8028cbf0": "offset_rotated", + "8028cd94": "offset_rotated_coords", + "8028cdec": "determine_pushing_or_pulling_door", + "8028ce24": "next_lakitu_state", + "8028d44c": "set_camera_mode_fixed", + "8028d5ac": "set_camera_mode_8_directions", + "8028d5fc": "set_camera_mode_boss_fight", + "8028d658": "set_camera_mode_close_cam", + "8028d698": "set_camera_mode_radial", + "8028d79c": "parallel_tracking_init", + "8028d888": "set_fixed_cam_axis_sa_lobby", + "8028d92c": "check_blocking_area_processing", + "8028da18": "cam_rr_exit_building_side", + "8028da50": "cam_rr_exit_building_top", + "8028daec": "cam_rr_enter_building_window", + "8028db38": "cam_rr_enter_building", + "8028dbb4": "cam_rr_enter_building_side", + "8028dbf4": "cam_cotmc_exit_waterfall", + "8028dc1c": "cam_sl_snowman_head_8dir", + "8028dc70": "cam_sl_free_roam", + "8028dca4": "move_camera_through_floor_while_descending", + "8028dd48": "cam_hmc_enter_maze", + "8028de2c": "cam_hmc_elevator_black_hole", + "8028de5c": "cam_hmc_elevator_maze_emergency_exit", + "8028de90": "cam_hmc_elevator_lake", + "8028dec4": "cam_hmc_elevator_maze", + "8028def8": "cam_ssl_enter_pyramid_top", + "8028df24": "cam_ssl_pyramid_center", + "8028df6c": "cam_ssl_boss_room", + "8028dfb4": "cam_thi_move_cam_through_tunnel", + "8028dfe8": "cam_thi_look_through_tunnel", + "8028e01c": "cam_bob_tower", + "8028e064": "cam_bob_default_free_roam", + "8028e098": "cam_castle_hmc_start_pool_cutscene", + "8028e0ec": "cam_castle_lobby_entrance", + "8028e164": "cam_castle_look_upstairs", + "8028e210": "cam_castle_basement_look_downstairs", + "8028e298": "cam_castle_enter_lobby", + "8028e300": "cam_castle_enter_spiral_stairs", + "8028e38c": "cam_castle_close_mode", + "8028e3b8": "cam_castle_leave_lobby_sliding_door", + "8028e3f0": "cam_castle_enter_lobby_sliding_door", + "8028e41c": "cam_bbh_room_6", + "8028e450": "cam_bbh_fall_off_roof", + "8028e47c": "cam_bbh_fall_into_pool", + "8028e524": "cam_bbh_room_1", + "8028e55c": "cam_bbh_leave_front_door", + "8028e594": "cam_bbh_room_2_lower", + "8028e5cc": "cam_bbh_room_4", + "8028e604": "cam_bbh_room_8", + "8028e63c": "cam_bbh_room_5_library", + "8028e674": "cam_bbh_room_5_library_to_hidden_transition", + "8028e6c4": "cam_bbh_room_5_hidden_to_library_transition", + "8028e714": "cam_bbh_room_5_hidden", + "8028e758": "cam_bbh_room_3", + "8028e790": "cam_bbh_room_7_mr_i", + "8028e7c8": "cam_bbh_room_7_mr_i_to_coffins_transition", + "8028e818": "cam_bbh_room_7_coffins_to_mr_i_transition", + "8028e868": "cam_bbh_elevator_room_lower", + "8028e8a0": "cam_bbh_room_0_back_entrance", + "8028e8cc": "cam_bbh_elevator", + "8028e930": "cam_bbh_room_12_upper", + "8028e974": "cam_bbh_enter_front_door", + "8028e9a0": "cam_bbh_room_2_library", + "8028e9d8": "cam_bbh_room_2_library_to_trapdoor_transition", + "8028ea28": "cam_bbh_room_2_trapdoor", + "8028ea60": "cam_bbh_room_2_trapdoor_transition", + "8028eab0": "cam_bbh_room_9_attic", + "8028eae8": "cam_bbh_room_9_attic_transition", + "8028eb38": "cam_bbh_room_9_mr_i_transition", + "8028eb88": "cam_bbh_room_13_balcony", + "8028ebc0": "cam_bbh_room_0", + "8028ec04": "cam_ccm_enter_slide_shortcut", + "8028ec2c": "cam_ccm_leave_slide_shortcut", + "8028ec58": "surface_type_modes", + "8028ed30": "set_mode_if_not_set_by_surface", + "8028ed98": "surface_type_modes_thi", + "8028eeb0": "camera_course_processing", + "8028f670": "resolve_geometry_collisions", + "8028f914": "rotate_camera_around_walls", + "8028fc9c": "find_mario_floor_and_ceil", + "8028fe24": "start_object_cutscene", + "8028fe58": "start_object_cutscene_without_focus", + "8028fe84": "unused_dialog_cutscene_response", + "8028ff04": "cutscene_object_with_dialog", + "8028ffc8": "cutscene_object_without_dialog", + "8029000c": "cutscene_object", + "80290098": "update_camera_yaw", + "802900e0": "cutscene_reset_spline", + "80290104": "stop_cutscene_and_retrieve_stored_info", + "80290168": "cap_switch_save", + "802901a4": "init_spline_point", + "802901fc": "copy_spline_segment", + "802903b8": "cutscene_common_set_dialog_state", + "802904a8": "cutscene_intro_peach_start_letter_music", + "802904e4": "cutscene_intro_peach_start_flying_music", + "8029051c": "reset_pan_distance", + "8029053c": "player2_rotate_cam", + "80290784": "store_info_cannon", + "802907f4": "retrieve_info_cannon", + "80290864": "store_info_star", + "802908e8": "retrieve_info_star", + "802909d0": "pan_camera", + "80290a5c": "cutscene_shake_explosion", + "80290abc": "rotate_and_move_vec3f", + "80290b54": "set_flag_post_door", + "80290ba4": "cutscene_soften_music", + "80290bd8": "cutscene_unsoften_music", + "80290c1c": "cutscene_unused_start", + "80290c30": "cutscene_unused_loop", + "80290c44": "cutscene_ending_mario_fall_start", + "80290c9c": "cutscene_ending_mario_fall_focus_mario", + "80290d90": "cutscene_ending_mario_fall", + "80290e00": "cutscene_ending_mario_land_closeup", + "80290e74": "cutscene_ending_reset_spline", + "80290eb0": "cutscene_ending_fly_up_to_window", + "80290f1c": "cutscene_ending_stars_free_peach", + "80290f8c": "cutscene_ending_mario_land", + "80291074": "cutscene_ending_peach_appear_closeup", + "80291108": "cutscene_ending_peach_appears", + "802911c8": "cutscene_ending_peach_descends_start", + "80291208": "cutscene_ending_follow_peach_descent", + "8029127c": "cutscene_ending_peach_descent_lower_focus", + "802912b8": "cutscene_ending_peach_descent_back_to_mario", + "80291354": "cutscene_ending_peach_descends", + "8029142c": "cutscene_ending_mario_to_peach", + "802914cc": "cutscene_ending_look_up_at_castle", + "80291514": "cutscene_ending_peach_wakeup", + "802915d4": "cutscene_ending_dialog", + "80291654": "cutscene_ending_kiss_closeup", + "802916b8": "cutscene_ending_kiss_here_we_go", + "80291774": "cutscene_ending_kiss", + "802917e4": "cutscene_ending_look_at_sky", + "8029184c": "cutscene_ending_zoom_fov", + "80291870": "cutscene_ending_cake_for_mario", + "80291924": "cutscene_ending_stop", + "80291964": "cutscene_grand_star_start", + "802919dc": "cutscene_grand_star_front_of_mario", + "80291ab4": "cutscene_grand_star_mario_jump", + "80291b18": "cutscene_grand_star_accel_cvar2", + "80291b68": "cutscene_grand_star_approach_mario", + "80291bf4": "cutscene_grand_star_move_cvar2", + "80291c3c": "cutscene_grand_star_focus_mario", + "80291cd0": "cutscene_grand_star", + "80291db0": "cutscene_grand_star_fly_start", + "80291e84": "cutscene_grand_star_fly_move_to_mario", + "80291f18": "cutscene_grand_star_fly_mario_offscreen", + "80292038": "cutscene_grand_star_fly_app_cvars", + "80292164": "cutscene_grand_star_fly", + "802921fc": "focus_in_front_of_mario", + "8029228c": "cutscene_dance_move_to_mario", + "80292324": "cutscene_dance_rotate", + "80292370": "cutscene_dance_rotate_move_back", + "802923b8": "cutscene_dance_rotate_move_towards_mario", + "80292414": "cutscene_dance_default_focus_mario", + "8029244c": "cutscene_dance_rotate_focus_mario", + "80292484": "cutscene_dance_shake_fov", + "802924b8": "cutscene_dance_default_rotate", + "80292628": "star_dance_bound_yaw", + "802926dc": "cutscene_dance_closeup_start", + "802927d0": "cutscene_dance_closeup_focus_mario", + "80292868": "cutscene_dance_closeup_fly_above", + "80292974": "cutscene_dance_closeup_fly_closer", + "80292a20": "cutscene_dance_closeup_zoom", + "80292a4c": "cutscene_dance_closeup_shake_fov", + "80292a80": "cutscene_dance_closeup", + "80292c00": "cutscene_dance_fly_away_start", + "80292d80": "cutscene_dance_fly_away_approach_mario", + "80292e2c": "cutscene_dance_fly_away_focus_mario", + "80292ec4": "cutscene_pan_cvar9", + "80292f40": "cutscene_dance_fly_rotate_around_mario", + "80292f98": "cutscene_dance_fly_away_rotate_while_flying", + "80292fe4": "cutscene_dance_fly_away_shake_fov", + "80293018": "cutscene_dance_fly_away", + "802930f0": "cutscene_key_dance_jump_cvar", + "80293164": "cutscene_key_dance_jump_closeup", + "802931c0": "cutscene_key_dance_jump_lower_left", + "80293220": "cutscene_key_dance_jump_above", + "8029328c": "cutscene_key_dance_jump_last", + "802932f4": "cutscene_key_dance_shake_fov", + "80293328": "cutscene_key_dance_handheld_shake", + "80293354": "cutscene_key_dance_focus_mario", + "8029338c": "cutscene_key_dance", + "80293488": "cutscene_bowser_area_shake_fov", + "802934b4": "cutscene_bowser_area_start_bowser_walking", + "802934d8": "cutscene_bowser_arena_set_pos", + "80293548": "cutscene_bowser_arena_focus_sine", + "802935e0": "cutscene_bowser_arena_set_focus", + "80293624": "cutscene_bowser_arena_adjust_offsets", + "8029369c": "cutscene_bowser_arena_pan_left", + "802936dc": "cutscene_bowser_arena_mario_dialog", + "80293708": "cutscene_stop_dialog", + "80293734": "cutscene_bowser_arena_start", + "802937e8": "bowser_fight_intro_dialog", + "8029386c": "cutscene_bowser_arena_dialog", + "802938c8": "cutscene_bowser_arena_end", + "80293944": "cutscene_bowser_arena", + "80293abc": "cutscene_star_spawn_store_info", + "80293ae8": "cutscene_star_spawn_focus_star", + "80293b70": "cutscene_star_spawn_update_boss_fight", + "80293bf4": "cutscene_star_spawn_fly_back", + "80293c2c": "cutscene_star_spawn", + "80293cb0": "cutscene_star_spawn_back", + "80293d5c": "cutscene_star_spawn_end", + "80293d90": "cutscene_exit_waterfall_warp", + "80293dd4": "cutscene_exit_to_castle_grounds_focus_mario", + "80293e7c": "cutscene_exit_waterfall", + "80293ed8": "cutscene_exit_to_castle_grounds_end", + "80293f2c": "cutscene_exit_fall_to_castle_grounds_warp", + "80293f70": "cutscene_exit_fall_to_castle_grounds", + "80293fcc": "cutscene_red_coin_star_start", + "80294024": "cutscene_red_coin_star_focus_xz", + "80294088": "cutscene_red_coin_star_focus_y", + "802940cc": "cutscene_red_coin_star_look_up_at_star", + "8029410c": "cutscene_red_coin_star_warp", + "802942cc": "cutscene_red_coin_star_set_fov", + "802942f0": "cutscene_red_coin_star", + "802943d4": "cutscene_red_coin_star_end", + "80294428": "cutscene_goto_cvar_pos", + "80294718": "cutscene_prepare_cannon_start", + "802947a4": "cutscene_prepare_cannon_fly_to_cannon", + "8029480c": "cannon_approach_prev", + "802948a0": "cutscene_prepare_cannon_fly_back", + "80294a14": "cutscene_prepare_cannon", + "80294a94": "cutscene_prepare_cannon_end", + "80294ae8": "water_death_move_to_mario_side", + "80294b78": "death_goto_mario", + "80294bb4": "cutscene_death_standing_start", + "80294c28": "cutscene_death_standing_goto_mario", + "80294c5c": "cutscene_death_standing", + "80294cc4": "cutscene_death_stomach_start", + "80294d48": "cutscene_death_stomach_goto_mario", + "80294db4": "cutscene_death_stomach", + "80294e24": "cutscene_bbh_death_start", + "80294ea8": "cutscene_bbh_death_goto_mario", + "80294ee8": "cutscene_bbh_death", + "80294f58": "cutscene_quicksand_death_start", + "80294f94": "cutscene_quicksand_death_goto_mario", + "80294fec": "cutscene_quicksand_death", + "802950b0": "cutscene_suffocation_fly_away", + "80295140": "cutscene_suffocation_stay_above_gas", + "802951f0": "cutscene_suffocation_rotate", + "80295270": "cutscene_suffocation", + "80295310": "cutscene_enter_pool_start", + "802953dc": "cutscene_enter_pool_loop", + "80295418": "cutscene_enter_pool", + "80295480": "cutscene_pyramid_top_explode_start", + "802954ec": "cutscene_pyramid_top_explode_zoom_in", + "80295518": "cutscene_pyramid_top_explode_focus", + "80295580": "cutscene_pyramid_top_explode_warp", + "80295670": "cutscene_pyramid_top_explode_closeup", + "80295740": "cutscene_pyramid_top_explode_cam_shake", + "8029576c": "cutscene_pyramid_top_explode_warp_back", + "802957c8": "cutscene_pyramid_top_explode", + "80295894": "cutscene_pyramid_top_explode_end", + "802958d4": "cutscene_enter_pyramid_top_start", + "80295930": "cutscene_enter_pyramid_top", + "80295a58": "cutscene_dialog_start", + "80295bf0": "cutscene_dialog_move_mario_shoulder", + "80295e24": "cutscene_dialog_create_dialog_box", + "80295e8c": "cutscene_dialog", + "80295fb0": "cutscene_dialog_set_flag", + "80295fd8": "cutscene_dialog_end", + "80296020": "cutscene_read_message_start", + "80296160": "cutscene_read_message", + "802962c8": "cutscene_read_message_set_flag", + "802962f0": "cutscene_read_message_end", + "80296318": "cutscene_exit_succ_start", + "802963b8": "cutscene_non_painting_set_cam_pos", + "8029652c": "cutscene_non_painting_set_cam_focus", + "8029665c": "cutscene_exit_bowser_succ_focus_left", + "8029669c": "cutscene_exit_bowser_key_toss_shake", + "802966e4": "cutscene_exit_succ_shake_landing", + "80296710": "cutscene_exit_bowser_succ", + "802967c4": "cutscene_non_painting_end", + "8029685c": "cutscene_exit_non_painting_succ_override_cvar", + "802968a0": "cutscene_exit_non_painting_succ", + "8029695c": "cutscene_non_painting_death_start", + "802969f8": "cutscene_exit_bowser_death", + "80296a64": "cutscene_non_painting_death_override_offset", + "80296b30": "cutscene_non_painting_death", + "80296bc8": "cutscene_cap_switch_press_start", + "80296c4c": "cutscene_cap_switch_press_rotate_around_mario", + "80296d60": "cutscene_cap_switch_press_lower_cam", + "80296da8": "cutscene_cap_switch_press_approach_mario", + "80296eb4": "cutscene_cap_switch_press_pan_left", + "80296f38": "cutscene_cap_switch_press_create_dialog", + "80296fa8": "cutscene_cap_switch_press", + "80297148": "cutscene_unlock_key_door_start", + "8029720c": "cutscene_unlock_key_door_approach_mario", + "80297290": "cutscene_unlock_key_door_focus_lock", + "802972ec": "cutscene_unlock_key_door_stub", + "80297300": "cutscene_unlock_key_door_fly_back", + "80297384": "cutscene_unlock_key_door_fov_shake", + "802973b0": "cutscene_unlock_key_door", + "80297464": "intro_peach_move_camera_start_to_pipe", + "80297560": "peach_letter_text", + "8029758c": "play_sound_peach_reading_letter", + "802975c4": "cutscene_intro_peach_start_to_pipe_spline", + "8029762c": "cutscene_intro_peach_dialog", + "802976bc": "cutscene_intro_peach_follow_pipe_spline", + "80297728": "cutscene_intro_peach_clear_cutscene_status", + "80297748": "cutscene_intro_peach_zoom_fov", + "80297784": "cutscene_intro_peach_reset_spline", + "802977c8": "cutscene_intro_peach_handheld_shake_off", + "802977f4": "intro_pipe_exit_text", + "80297820": "play_sound_intro_turn_on_hud", + "8029784c": "cutscene_intro_peach_fly_to_pipe", + "80297908": "cutscene_intro_peach_mario_appears", + "80297a38": "cutscene_intro_peach_reset_fov", + "80297a64": "cutscene_intro_peach_letter", + "80297b58": "cutscene_end_waving_start", + "80297b84": "cutscene_end_waving", + "80297c14": "cutscene_credits_reset_spline", + "80297c40": "cutscene_credits", + "802980dc": "cutscene_sliding_doors_open_start", + "8029819c": "cutscene_sliding_doors_open_set_cvars", + "80298218": "cutscene_sliding_doors_go_under_doorway", + "80298254": "cutscene_sliding_doors_fly_back_up", + "80298290": "cutscene_sliding_doors_follow_mario", + "802983b4": "cutscene_sliding_doors_open", + "80298458": "cutscene_double_doors_end", + "802984a0": "cutscene_enter_painting_stub", + "802984b4": "cutscene_enter_painting", + "802987b0": "cutscene_exit_painting_start", + "8029894c": "cutscene_exit_painting_move_to_mario", + "802989e8": "cutscene_exit_painting_move_to_floor", + "80298af8": "cutscene_exit_painting", + "80298ba0": "cutscene_unused_exit_start", + "80298c2c": "cutscene_unused_exit_focus_mario", + "80298ccc": "cutscene_exit_painting_end", + "80298d44": "cutscene_enter_cannon_end", + "80298d9c": "cutscene_enter_cannon_raise", + "80298fe8": "cutscene_enter_cannon_start", + "80299100": "cutscene_door_start", + "80299154": "cutscene_door_fix_cam", + "802991a8": "cutscene_door_loop", + "802991f0": "cutscene_door_move_behind_mario", + "802992cc": "cutscene_door_follow_mario", + "80299360": "cutscene_door_end", + "80299404": "cutscene_door_mode", + "802994e8": "play_cutscene", + "8029a2f8": "cutscene_event", + "8029a37c": "cutscene_spawn_obj", + "8029a3b4": "set_fov_shake", + "8029a41c": "set_fov_shake_from_point", + "8029a4d0": "shake_camera_fov", + "8029a5e8": "set_fov_30", + "8029a60c": "approach_fov_20", + "8029a64c": "set_fov_45", + "8029a670": "set_fov_29", + "8029a694": "zoom_fov_30", + "8029a6f4": "fov_default", + "8029a858": "approach_fov_30", + "8029a894": "approach_fov_60", + "8029a8d0": "approach_fov_45", + "8029a968": "approach_fov_80", + "8029a9a4": "set_fov_bbh", + "8029aa3c": "geo_camera_fov", + "8029ab94": "set_fov_function", + "8029abb0": "cutscene_set_fov_shake_preset", + "8029ac30": "set_fov_shake_from_point_preset", + "8029aef8": "obj_rotate_towards_point", + "8029af98": "intro_peach_set_pos_and_opacity", + "8029b08c": "bhv_intro_peach_loop", + "8029b28c": "intro_lakitu_set_offset_from_camera", + "8029b358": "intro_lakitu_set_focus", + "8029b3c8": "intro_lakitu_set_pos_and_focus", + "8029b49c": "bhv_intro_lakitu_loop", + "8029bde4": "bhv_end_birds_1_loop", + "8029bf64": "bhv_end_birds_2_loop", + "8029c0e4": "func_8029B964", + "8029c254": "bhv_intro_scene_loop", + "8029c770": "nop_change_course", + "8029c780": "copy_mario_state_to_object", + "8029c9cc": "spawn_particle", + "8029ca58": "bhv_mario_update", + "8029cb34": "update_objects_starting_at", + "8029cbc8": "update_objects_during_time_stop", + "8029cd28": "update_objects_in_list", + "8029cd98": "unload_deactivated_objects_in_list", + "8029ce58": "set_object_respawn_info_bits", + "8029cedc": "unload_objects_from_area", + "8029cfb0": "spawn_objects_from_info", + "8029d1d8": "stub_8029CA50", + "8029d1e8": "clear_objects", + "8029d324": "update_terrain_objects", + "8029d374": "update_non_terrain_objects", + "8029d428": "unload_deactivated_objects", + "8029d690": "update_objects", + "8029d890": "Geo18_8029D890", + "8029d924": "Geo18_8029D924", + "8029db48": "geo_switch_anim_state", + "8029dbd4": "geo_switch_area", + "8029dcd4": "func_8029D558", + "8029dda8": "apply_object_scale_to_matrix", + "8029de80": "func_8029D704", + "8029e1b0": "set_object_held_state", + "8029e27c": "lateral_dist_between_objects", + "8029e2f8": "dist_between_objects", + "8029e398": "obj_forward_vel_approach_upward", + "8029e3e8": "approach_f32_signed", + "8029e494": "approach_f32_symmetric", + "8029e530": "approach_s16_symmetric", + "8029e5ec": "obj_rotate_yaw_toward", + "8029e694": "angle_to_object", + "8029e714": "obj_turn_toward_object", + "8029e8bc": "set_object_parent_relative_pos", + "8029e914": "set_object_pos", + "8029e96c": "set_object_angle", + "8029e9ac": "spawn_object_abs_with_rot", + "8029ea24": "spawn_object_rel_with_rot", + "8029eaac": "Unknown8029E330", + "8029eb04": "spawn_water_splash", + "8029ed20": "spawn_object_at_origin", + "8029edcc": "spawn_object", + "8029ee24": "try_to_spawn_object", + "8029eeb8": "spawn_object_with_scale", + "8029ef64": "spawn_object_relative", + "8029effc": "spawn_object_relative_with_scale", + "8029f070": "obj_move_using_vel", + "8029f0c8": "copy_object_graph_y_offset", + "8029f0e0": "copy_object_pos_and_angle", + "8029f120": "copy_object_pos", + "8029f148": "copy_object_angle", + "8029f188": "func_8029EA0C", + "8029f1b0": "Unknown8029EA34", + "8029f200": "linear_mtxf_mul_vec3f", + "8029f274": "linear_mtxf_transpose_mul_vec3f", + "8029f2ec": "apply_scale_to_object_transform", + "8029f3a8": "copy_object_scale", + "8029f3d0": "scale_object_xyz", + "8029f404": "scale_object", + "8029f430": "obj_scale", + "8029f464": "SetObjAnimation", + "8029f4b4": "set_obj_animation_and_sound_state", + "8029f514": "func_8029ED98", + "8029f59c": "func_8029EE20", + "8029f600": "obj_enable_rendering_and_become_tangible", + "8029f620": "obj_enable_rendering", + "8029f644": "obj_disable_rendering_and_become_intangible", + "8029f66c": "obj_disable_rendering", + "8029f694": "obj_unhide", + "8029f6bc": "obj_hide", + "8029f6e0": "obj_set_pos_relative", + "8029f7d8": "obj_set_pos_relative_to_parent", + "8029f820": "obj_enable_rendering_2", + "8029f848": "obj_unused_init_on_floor", + "8029f8ec": "obj_set_facing_to_move_angles", + "8029f914": "get_object_list_from_behavior", + "8029f95c": "obj_nearest_object_with_behavior", + "8029f998": "obj_dist_to_nearest_object_with_behavior", + "8029f9ec": "obj_find_nearest_object_with_behavior", + "8029fb1c": "find_unimportant_object", + "8029fb68": "count_unimportant_objects", + "8029fbdc": "count_objects_with_behavior", + "8029fc9c": "obj_find_nearby_held_actor", + "8029fdb4": "obj_change_action", + "8029fe00": "func_8029F684", + "8029fe6c": "func_8029F6F0", + "8029fea4": "func_8029F728", + "8029ff04": "func_8029F788", + "8029ffa4": "func_8029F828", + "802a0008": "obj_check_anim_frame", + "802a0050": "obj_check_anim_frame_in_range", + "802a00ac": "Unknown8029F930", + "802a0114": "mario_is_in_air_action", + "802a0154": "mario_is_dive_sliding", + "802a0198": "func_8029FA1C", + "802a01d8": "func_8029FA5C", + "802a0380": "obj_get_thrown_or_placed", + "802a0474": "obj_get_dropped", + "802a04c0": "obj_set_model", + "802a04f0": "mario_set_flag", + "802a0514": "obj_clear_interact_status_flag", + "802a0568": "mark_object_for_deletion", + "802a057c": "obj_disable", + "802a05b4": "obj_become_intangible", + "802a05d4": "obj_become_tangible", + "802a05f0": "make_object_tangible", + "802a0604": "obj_update_floor_height", + "802a064c": "obj_update_floor_height_and_get_floor", + "802a079c": "obj_apply_drag_xz", + "802a0e68": "obj_move_y", + "802a113c": "obj_unused_resolve_wall_collisions", + "802a11a8": "abs_angle_diff", + "802a120c": "obj_move_xz_using_fvel_and_yaw", + "802a12a4": "obj_move_y_with_terminal_vel", + "802a1308": "obj_compute_vel_xz", + "802a1370": "func_802A0BF4", + "802a1424": "are_objects_collided", + "802a148c": "obj_set_behavior", + "802a14c4": "set_object_behavior", + "802a14fc": "obj_has_behavior", + "802a1554": "object_has_behavior", + "802a15ac": "obj_lateral_dist_from_mario_to_home", + "802a1634": "obj_lateral_dist_to_home", + "802a16ac": "obj_outside_home_square", + "802a1774": "obj_outside_home_rectangle", + "802a184c": "obj_set_pos_to_home", + "802a188c": "obj_set_pos_to_home_and_stop", + "802a18dc": "obj_shake_y", + "802a1930": "obj_start_cam_event", + "802a1960": "Unknown802A11E4", + "802a19ac": "obj_set_billboard", + "802a19c8": "obj_set_hitbox_radius_and_height", + "802a19f0": "obj_set_hurtbox_radius_and_height", + "802a1b34": "spawn_object_loot_blue_coins", + "802a1b8c": "spawn_object_loot_yellow_coins", + "802a1bdc": "obj_spawn_loot_coin_at_mario_pos", + "802a1c68": "obj_abs_y_dist_to_home", + "802a1cc4": "Unknown802A1548", + "802a1f3c": "obj_resolve_wall_collisions", + "802a2320": "obj_update_floor_and_walls", + "802a2348": "obj_move_standard", + "802a25b4": "obj_move_using_vel_and_gravity", + "802a2644": "obj_move_using_fvel_and_gravity", + "802a2674": "set_object_pos_relative", + "802a2748": "obj_angle_to_home", + "802a27b0": "func_802A2008", + "802a2804": "translate_object_local", + "802a2930": "build_object_transform_from_pos_and_angle", + "802a2a18": "func_802A2270", + "802a2a84": "build_object_transform_relative_to_parent", + "802a2b28": "Unknown802A2380", + "802a2b6c": "obj_rotate_move_angle_using_vel", + "802a2bc4": "obj_rotate_face_angle_using_vel", + "802a2c1c": "obj_set_face_angle_to_move_angle", + "802a2c5c": "obj_follow_path", + "802a2ed4": "chain_segment_init", + "802a2f14": "random_f32_around_zero", + "802a2f5c": "scale_object_random", + "802a2fc0": "translate_object_xyz_random", + "802a308c": "translate_object_xz_random", + "802a31e0": "func_802A2A38", + "802a3268": "obj_reflect_move_angle_off_wall", + "802a32ac": "obj_spawn_particles", + "802a34a4": "set_object_hitbox", + "802a3604": "signum_positive", + "802a3634": "absf", + "802a3674": "absi", + "802a36a4": "obj_wait_then_blink", + "802a3754": "obj_is_mario_ground_pounding_platform", + "802a37ac": "func_802A3004", + "802a37dc": "func_802A3034", + "802a3818": "obj_push_mario_away", + "802a390c": "obj_push_mario_away_from_cylinder", + "802a399c": "BehDustSmokeLoop", + "802a3a4c": "func_802A32A4", + "802a3a88": "func_802A32E0", + "802a3b28": "nop_802A3380", + "802a3b40": "func_802A3398", + "802a3c18": "func_802A3470", + "802a3cec": "nop_802A3544", + "802a3cfc": "obj_is_mario_on_platform", + "802a3d40": "obj_shake_y_until", + "802a3dd4": "func_802A362C", + "802a3e30": "obj_call_action_function", + "802a3ef8": "Unknown802A3750", + "802a3f24": "func_802A377C", + "802a3f48": "obj_mario_far_away", + "802a404c": "obj_is_mario_moving_fast_or_in_air", + "802a40b8": "item_in_array", + "802a4120": "bhv_init_room", + "802a4210": "obj_enable_rendering_if_mario_in_room", + "802a4360": "obj_set_hitbox_and_die_if_attacked", + "802a4440": "func_802A3C98", + "802a44f4": "set_object_collision_data", + "802a452c": "obj_if_hit_wall_bounce_away", + "802a4564": "obj_hide_if_mario_far_away_y", + "802a45e4": "Geo18_802A45E4", + "802a462c": "Unknown802A3E84", + "802a46cc": "obj_is_hidden", + "802a4704": "enable_time_stop", + "802a4728": "disable_time_stop", + "802a4750": "set_time_stop_flags", + "802a4774": "clear_time_stop_flags", + "802a47a0": "func_802A3FF8", + "802a48bc": "obj_is_mario_in_range_and_ready_to_speak", + "802a4960": "obj_update_dialog", + "802a4be4": "obj_update_dialog_with_cutscene", + "802a4f04": "obj_has_model", + "802a4f58": "obj_align_gfx_with_floor", + "802a5034": "mario_is_within_rectangle", + "802a50fc": "ShakeScreen", + "802a513c": "attack_collided_non_mario_object", + "802a51ac": "obj_was_attacked_or_ground_pounded", + "802a5228": "copy_object_behavior_params", + "802a5248": "func_802A4A70", + "802a5288": "func_802A4AB0", + "802a52c4": "func_802A4AEC", + "802a52f8": "obj_check_grabbed_mario", + "802a5358": "player_performed_grab_escape_action", + "802a540c": "obj_unused_play_footstep_sound", + "802a5460": "enable_time_stop_including_mario", + "802a5498": "disable_time_stop_including_mario", + "802a54d8": "obj_check_interacted", + "802a5524": "obj_spawn_loot_blue_coin", + "802a5588": "obj_spawn_star_at_y_offset", + "802a5620": "func_802A4DB0", + "802a56bc": "bhv_star_door_loop", + "802a58dc": "bhv_piranha_particle_loop", + "802a597c": "ActionMrIParticle0", + "802a5a44": "ActionMrIParticle1", + "802a5aa0": "bhv_mr_i_particle_loop", + "802a5acc": "func_802A525C", + "802a5bd4": "bhv_mr_i_body_loop", + "802a5d4c": "ActionMrI3", + "802a6518": "ActionMrI2", + "802a68a0": "ActionMrI1", + "802a6ad8": "ActionMrI0", + "802a6b7c": "bhv_mr_i_loop", + "802a6c20": "bhv_pole_init", + "802a6c74": "bhv_giant_pole_loop", + "802a6cf4": "bhv_thi_huge_island_top_loop", + "802a6d64": "bhv_thi_tiny_island_top_loop", + "802a6ee4": "ActionActivateCapSwitch0", + "802a7020": "ActionActivateCapSwitch1", + "802a708c": "ActionActivateCapSwitch2", + "802a7160": "ActionActivateCapSwitch3", + "802a7170": "bhv_cap_switch_loop", + "802a719c": "Geo18_802A719C", + "802a7230": "bhv_bobomb_anchor_mario_loop", + "802a7264": "ActionKingBobomb0", + "802a7384": "func_802A6AF8", + "802a73d8": "ActionKingBobomb2", + "802a7598": "ActionKingBobomb3", + "802a7804": "ActionKingBobomb1", + "802a78d8": "ActionKingBobomb6", + "802a7a60": "ActionKingBobomb7", + "802a7b1c": "ActionKingBobomb8", + "802a7b5c": "ActionKingBobomb4", + "802a7d14": "ActionKingBobomb5", + "802a7fbc": "func_802A7748", + "802a8064": "bhv_king_bobomb_loop", + "802a816c": "bhv_beta_chest_bottom_init", + "802a81e8": "bhv_beta_chest_bottom_loop", + "802a821c": "bhv_beta_chest_lid_loop", + "802a8370": "bhv_water_air_bubble_init", + "802a83a0": "bhv_water_air_bubble_loop", + "802a8630": "bhv_bubble_wave_init", + "802a86bc": "Unknown802A7E48", + "802a870c": "bhv_bubble_maybe_loop", + "802a88a4": "bhv_small_water_wave_loop", + "802a8a38": "func_802A81C4", + "802a8b18": "bhv_particle_init", + "802a8bc0": "bhv_particle_loop", + "802a8c88": "bhv_small_bubbles_loop", + "802a8cdc": "bhv_fish_group_loop", + "802a8d48": "bhv_water_waves_init", + "802a8d98": "bhv_cannon_base_unused_loop", + "802a8dc0": "ActionOpenedCannon0", + "802a8f40": "ActionOpenedCannon4", + "802a9114": "ActionOpenedCannon6", + "802a92fc": "ActionOpenedCannon5", + "802a93f8": "ActionOpenedCannon1", + "802a9440": "ActionOpenedCannon2", + "802a9460": "ActionOpenedCannon3", + "802a9498": "bhv_cannon_base_loop", + "802a94f8": "bhv_cannon_barrel_loop", + "802a958c": "func_802A8D18", + "802a9708": "bhv_chuckya_anchor_mario_loop", + "802a973c": "Unknown802A8EC8", + "802a98c4": "func_802A9050", + "802a9994": "ActionChuckya0", + "802a9d08": "ActionChuckya1", + "802a9f54": "ActionChuckya3", + "802a9fc8": "ActionChuckya2", + "802aa02c": "func_802A97B8", + "802aa0ac": "bhv_chuckya_loop", + "802aa1b8": "bhv_wf_breakable_wall_loop", + "802aa280": "func_802A9A0C", + "802aa3c8": "func_802A9B54", + "802aa3f4": "bhv_kickable_board_loop", + "802aa700": "bhv_tower_door_loop", + "802aa774": "bhv_wf_rotating_wooden_platform_loop", + "802aa830": "bhv_rotating_platform_loop", + "802aa948": "func_802AA0D4", + "802aa97c": "bhv_koopa_shell_underwater_loop", + "802aaa60": "bhv_warp_loop", + "802aab54": "BehFadingWarpLoop", + "802aac48": "bhv_white_puff_exploding_loop", + "802aae8c": "func_802AA618", + "802aaf48": "bhv_spawned_star_init", + "802aaffc": "func_802AA788", + "802ab060": "func_802AA7EC", + "802ab158": "func_802AA8E4", + "802ab18c": "func_802AA918", + "802ab1c8": "bhv_spawned_star_loop", + "802ab558": "bhv_spawn_star_no_level_exit", + "802ab5c8": "bhv_coin_sparkles_init", + "802ab650": "bhv_yellow_coin_init", + "802ab70c": "bhv_yellow_coin_loop", + "802ab748": "bhv_temp_coin_loop", + "802ab7a4": "bhv_coin_init", + "802ab860": "bhv_coin_loop", + "802aba40": "bhv_coin_formation_spawn_loop", + "802abc04": "func_802AB364", + "802abee4": "bhv_coin_formation_init", + "802abf0c": "bhv_coin_formation_loop", + "802ac068": "ActionCoinInsideBoo1", + "802ac15c": "ActionCoinInsideBoo0", + "802ac294": "bhv_coin_inside_boo_loop", + "802ac2c0": "bhv_coin_sparkles_loop", + "802ac2ec": "bhv_golden_coin_sparkles_loop", + "802ac3a8": "bhv_punch_tiny_triangle_loop", + "802ac4a0": "bhv_punch_tiny_triangle_init", + "802ac5b4": "bhv_wall_tiny_star_particle_loop", + "802ac678": "bhv_tiny_star_particles_init", + "802ac78c": "bhv_pound_tiny_star_particle_loop", + "802ac864": "bhv_pound_tiny_star_particle_init", + "802ac910": "func_802AC070", + "802ac958": "func_802AC0B8", + "802ac9d0": "func_802AC130", + "802aca6c": "func_802AC1CC", + "802acac8": "bhv_door_loop", + "802acc3c": "bhv_door_init", + "802ace80": "bhv_star_door_loop_2", + "802ad078": "ActionGrindelThwomp4", + "802ad10c": "ActionGrindelThwomp2", + "802ad1a4": "ActionGrindelThwomp3", + "802ad238": "ActionGrindelThwomp1", + "802ad2d0": "ActionGrindelThwomp0", + "802ad34c": "bhv_grindel_thwomp_loop", + "802ad378": "bhv_tumbling_bridge_platform_loop", + "802ad580": "ActionTumblingBridge1", + "802ad76c": "ActionTumblingBridge2", + "802ad7f4": "ActionTumblingBridge3", + "802ad828": "ActionTumblingBridge0", + "802ad890": "bhv_tumbling_bridge_loop", + "802ad8bc": "func_802AD01C", + "802ad8f0": "ActionElevator0", + "802ada4c": "ActionElevator1", + "802adb88": "ActionElevator2", + "802adce4": "ActionElevator4", + "802add70": "ActionElevator3", + "802addf8": "bhv_elevator_init", + "802adf6c": "bhv_elevator_loop", + "802adf98": "bhv_water_mist_spawn_loop", + "802adfd8": "bhv_water_mist_loop", + "802ae0cc": "spawn_triangle_break_particles", + "802ae238": "bhv_water_mist_2_loop", + "802ae304": "bhv_pound_white_puffs_init", + "802ae334": "func_802ADA94", + "802ae360": "bhv_unused_0e40_init", + "802ae394": "Unknown802ADAF4", + "802ae45c": "func_802ADBBC", + "802ae48c": "bhv_ground_snow_init", + "802ae4c0": "func_802ADC20", + "802ae534": "bhv_wind_loop", + "802ae85c": "bhv_unused_particle_spawn_loop", + "802ae908": "bhv_ukiki_cage_star_loop", + "802aea6c": "ukiki_cage_act_wait_for_ukiki", + "802aeab8": "ukiki_cage_act_spin", + "802aeb1c": "ukiki_cage_act_fall", + "802aeb74": "ukiki_cage_act_hide", + "802aeb9c": "bhv_ukiki_cage_loop", + "802aebc8": "bhv_squishable_platform_loop", + "802aec40": "bhv_bitfs_sinking_platform_loop", + "802aeca8": "bhv_ddd_moving_pole_loop", + "802aecdc": "bhv_bitfs_sinking_cage_platform_loop", + "802aedc0": "bhv_beta_moving_flames_spawn_loop", + "802aeea4": "bhv_beta_moving_flames_loop", + "802aef1c": "bhv_flamethrower_flame_loop", + "802af1e8": "bhv_flamethrower_loop", + "802af3fc": "bhv_rr_rotating_bridge_platform_loop", + "802af448": "bhv_bouncing_fireball_flame_loop", + "802af5f8": "bhv_bouncing_fireball_loop", + "802af7c4": "bhv_bowser_shock_wave_loop", + "802af9cc": "bhv_black_smoke_upward_loop", + "802afa0c": "bhv_black_smoke_bowser_loop", + "802afae4": "bhv_black_smoke_mario_loop", + "802afbf8": "bhv_flame_mario_loop", + "802afce4": "bhv_beta_fish_splash_spawner_loop", + "802afd1c": "bhv_spindrift_loop", + "802afee8": "bhv_wf_solid_tower_platform_loop", + "802aff30": "bhv_wf_elevator_tower_platform_loop", + "802b00e4": "bhv_wf_sliding_tower_platform_loop", + "802b0244": "func_802AF9A4", + "802b039c": "func_802AFAFC", + "802b04b4": "bhv_tower_platform_group_loop", + "802b0614": "bhv_tree_snow_or_leaf_loop", + "802b0974": "bhv_snow_leaf_particle_spawn_init", + "802b0b9c": "func_802B02FC", + "802b0bec": "bhv_squarish_path_moving_loop", + "802b0d48": "bhv_piranha_plant_waking_bubbles_loop", + "802b0df0": "bhv_piranha_plant_bubble_loop", + "802b1278": "bhv_purple_switch_loop", + "802b14f4": "func_802B0C54", + "802b15e8": "bhv_pushable_loop", + "802b1714": "func_802B0E74", + "802b17f4": "func_802B0F54", + "802b19d8": "func_802B1138", + "802b1ae0": "bhv_hidden_object_loop", + "802b1b2c": "bhv_breakable_box_loop", + "802b1bb0": "Geo18_802B1BB0", + "802b1c54": "bhv_heave_ho_throw_mario_loop", + "802b1d7c": "ActionHeaveHo1", + "802b1e6c": "ActionHeaveHo2", + "802b1ff4": "ActionHeaveHo3", + "802b20a0": "ActionHeaveHo0", + "802b2154": "func_802B18B4", + "802b2278": "bhv_heave_ho_loop", + "802b2340": "bhv_ccm_touched_star_spawn_loop", + "802b23e0": "bhv_unused_poundable_platform", + "802b2494": "bhv_beta_trampoline_spring_loop", + "802b25ac": "bhv_beta_trampoline_top_loop", + "802b26a4": "ActionJumpingBox0", + "802b27d8": "ActionJumpingBox1", + "802b2824": "func_802B1F84", + "802b288c": "bhv_jumping_box_loop", + "802b29b8": "bhv_boo_cage_loop", + "802b2bc8": "func_802B2328", + "802b2d10": "bhv_alpha_boo_key_loop", + "802b3108": "bhv_beta_boo_key_loop", + "802b3134": "func_802B2894", + "802b3250": "func_802B29B0", + "802b329c": "bhv_grand_star_loop", + "802b3600": "bhv_bowser_key_loop", + "802b37b8": "bhv_white_puff_smoke_init", + "802b3810": "bhv_bullet_bill_init", + "802b3830": "ActionBulletBill0", + "802b38b8": "ActionBulletBill1", + "802b394c": "ActionBulletBill2", + "802b3b08": "ActionBulletBill3", + "802b3b24": "ActionBulletBill4", + "802b3be0": "bhv_bullet_bill_loop", + "802b3c2c": "ActionBowserTailAnchor0", + "802b3cdc": "ActionBowserTailAnchor1", + "802b3d10": "ActionBowserTailAnchor2", + "802b3d74": "bhv_bowser_tail_anchor_loop", + "802b3df4": "bhv_bowser_flame_spawn_loop", + "802b4080": "bhv_bowser_body_anchor_loop", + "802b4184": "func_802B38B4", + "802b41fc": "func_802B392C", + "802b4288": "func_802B39B8", + "802b4300": "func_802B3A30", + "802b4368": "func_802B3A98", + "802b43dc": "func_802B3B0C", + "802b4478": "ActionBowser5", + "802b44bc": "ActionBowser6", + "802b45f4": "func_802B3D24", + "802b473c": "func_802B3E44", + "802b48d4": "func_802B3FDC", + "802b4a1c": "func_802B4124", + "802b4a3c": "func_802B4144", + "802b4af4": "func_u_802B4AF4", + "802b4bac": "ActionBowser18", + "802b4be8": "ActionBowser0", + "802b4ca4": "ActionBowser15", + "802b4d14": "ActionBowser14", + "802b4f00": "ActionBowser16", + "802b5104": "ActionBowser8", + "802b5218": "ActionBowser12", + "802b53f4": "func_802B4A44", + "802b5444": "func_802B4A94", + "802b5554": "func_802B4BA4", + "802b55cc": "ActionBowser13", + "802b5798": "ActionBowser17", + "802b58bc": "ActionBowser10", + "802b59cc": "ActionBowser9", + "802b5aec": "func_802B5108", + "802b5c00": "ActionBowser11", + "802b5c40": "ActionBowser7", + "802b5f6c": "func_802B5588", + "802b5fec": "ActionBowser1", + "802b611c": "func_802B5738", + "802b6190": "ActionBowser2", + "802b6568": "ActionBowser3", + "802b65d0": "func_802B5C78", + "802b6670": "func_802B5D18", + "802b6730": "func_802B5DD8", + "802b67d4": "func_802B5E7C", + "802b6878": "func_802B5F20", + "802b6a10": "func_802B60B8", + "802b6a78": "func_802B6120", + "802b6bac": "func_802B6254", + "802b6cf0": "ActionBowser4", + "802b6e40": "func_802B64E8", + "802b6ee0": "ActionBowser19", + "802b711c": "func_802B67C4", + "802b71e4": "func_802B688C", + "802b72d4": "func_802B697C", + "802b7418": "func_802B6AC0", + "802b75a4": "bhv_bowser_loop", + "802b7878": "bhv_bowser_init", + "802b798c": "Geo18_802B798C", + "802b7a20": "func_802B70C8", + "802b7c64": "geo_switch_bowser_eyes", + "802b7d44": "Geo18_802B7D44", + "802b7e68": "ActionFallingBowserPlatform0", + "802b7ef0": "ActionFallingBowserPlatform1", + "802b8024": "ActionFallingBowserPlatform2", + "802b8384": "bhv_falling_bowser_platform_loop", + "802b83b0": "func_802B7A58", + "802b8434": "func_802B7ADC", + "802b84ac": "bhv_flame_bowser_init", + "802b85b0": "bhv_flame_large_burning_out_init", + "802b8654": "func_802B7CFC", + "802b8734": "bhv_flame_bowser_loop", + "802b8960": "bhv_flame_moving_forward_growing_init", + "802b89ec": "bhv_flame_moving_forward_growing_loop", + "802b8b1c": "bhv_flame_floating_landing_init", + "802b8c38": "bhv_flame_floating_landing_loop", + "802b8d68": "bhv_blue_bowser_flame_init", + "802b8e7c": "bhv_blue_bowser_flame_loop", + "802b9034": "bhv_flame_bouncing_init", + "802b90ec": "bhv_flame_bouncing_loop", + "802b921c": "bhv_blue_flames_group_loop", + "802b935c": "bhv_blue_fish_loop", + "802b9790": "bhv_tank_fish_group_loop", + "802b98d4": "func_802B8F7C", + "802b98fc": "bhv_checkerboard_elevator_group_init", + "802b9a78": "func_802B9120", + "802b9af8": "func_802B91A0", + "802b9bb4": "bhv_checkerboard_platform_init", + "802b9bd8": "bhv_checkerboard_platform_loop", + "802b9e94": "bhv_ddd_warp_loop", + "802b9efc": "func_802B95A4", + "802ba13c": "func_802B97E4", + "802ba19c": "bhv_water_level_pillar_init", + "802ba1e0": "bhv_water_level_pillar_loop", + "802ba25c": "bhv_invisible_objects_under_bridge_init", + "802ba2b0": "Geo18_802BA2B0", + "802ba2f8": "bhv_bowser_key_unlock_door_loop", + "802ba458": "bhv_bowser_key_course_exit_loop", + "802ba5bc": "bhv_moat_grills_loop", + "802ba608": "bhv_rotating_clock_arm_loop", + "802ba7e0": "handle_hat_ukiki_reset", + "802ba868": "is_hat_ukiki_and_mario_has_hat", + "802ba8c4": "unused_Geo18_8029D890", + "802ba958": "idle_ukiki_taunt", + "802bab7c": "ukiki_act_idle", + "802bae40": "ukiki_act_return_home", + "802baec4": "ukiki_act_wait_to_respawn", + "802baf10": "ukiki_act_unused_turn", + "802baf64": "ukiki_act_turn_to_mario", + "802bb07c": "ukiki_act_run", + "802bb288": "ukiki_act_jump", + "802bb3b8": "ukiki_act_go_to_cage", + "802bb798": "ukiki_free_loop", + "802bb888": "cage_ukiki_held_loop", + "802bba3c": "hat_ukiki_held_loop", + "802bbb98": "bhv_ukiki_init", + "802bbc0c": "bhv_ukiki_loop", + "802bbd6c": "func_802BB414", + "802bbfd8": "func_802BB680", + "802bc0f0": "bhv_lll_moving_octagonal_mesh_platform_loop", + "802bc22c": "bhv_lll_sinking_rock_block_loop", + "802bc294": "bhv_lll_rotating_hex_flame_loop", + "802bc348": "func_802BB9F0", + "802bc4f4": "ActionRotatingCwFireBars0", + "802bc538": "ActionRotatingCwFireBars1", + "802bc590": "ActionRotatingCwFireBars2", + "802bc5fc": "ActionRotatingCwFireBars3", + "802bc618": "bhv_lll_rotating_block_fire_bars_loop", + "802bc660": "bhv_lll_wood_piece_loop", + "802bc728": "bhv_lll_floating_wood_bridge_loop", + "802bc898": "bhv_volcano_flames_loop", + "802bc934": "func_802BBFDC", + "802bca74": "bhv_lll_rotating_hexagonal_ring_loop", + "802bcce8": "func_802BC390", + "802bcda8": "bhv_lll_sinking_rectangular_platform_loop", + "802bce58": "bhv_lll_sinking_square_platforms_loop", + "802bce9c": "create_transform_from_normals", + "802bcf40": "bhv_platform_normals_init", + "802bcfc4": "approach_by_increment", + "802bd058": "bhv_tilting_inverted_pyramid_loop", + "802bd3e4": "func_802BCA8C", + "802bd488": "bhv_koopa_shell_flame_loop", + "802bd5dc": "bhv_koopa_shell_flame_spawn", + "802bd62c": "func_802BCCD4", + "802bd680": "bhv_koopa_shell_loop", + "802bd8d0": "func_802BCF78", + "802bd91c": "func_802BCFC4", + "802bdb04": "ActionToxBox4", + "802bdb3c": "ActionToxBox5", + "802bdb74": "ActionToxBox6", + "802bdbac": "ActionToxBox7", + "802bdbe4": "ActionToxBox1", + "802bdc7c": "ActionToxBox2", + "802bdcc8": "ActionToxBox3", + "802bdd14": "ActionToxBox0", + "802bdd68": "bhv_tox_box_loop", + "802bdd9c": "piranha_plant_act_idle", + "802bde10": "piranha_plant_check_interactions", + "802bdeec": "piranha_plant_act_sleeping", + "802be034": "piranha_plant_act_woken_up", + "802be0b8": "piranha_plant_reset_when_far", + "802be0ec": "piranha_plant_attacked", + "802be150": "piranha_plant_act_shrink_and_die", + "802be234": "piranha_plant_act_wait_to_respawn", + "802be278": "piranha_plant_act_respawn", + "802be350": "piranha_plant_act_biting", + "802be49c": "mario_moving_fast_enough_to_make_piranha_plant_bite", + "802be50c": "piranha_plant_act_stopped_biting", + "802be5a0": "bhv_piranha_plant_loop", + "802be628": "bhv_lll_bowser_puzzle_spawn_piece", + "802be6d4": "bhv_lll_bowser_puzzle_spawn_pieces", + "802be79c": "bhv_lll_bowser_puzzle_loop", + "802be8a8": "bhv_lll_bowser_puzzle_piece_action_0", + "802be8b8": "bhv_lll_bowser_puzzle_piece_action_1", + "802be8f4": "bhv_lll_bowser_puzzle_piece_update", + "802be9dc": "bhv_lll_bowser_puzzle_piece_move", + "802beb14": "bhv_lll_bowser_puzzle_piece_idle", + "802beb54": "bhv_lll_bowser_puzzle_piece_move_left", + "802beb8c": "bhv_lll_bowser_puzzle_piece_move_right", + "802bebc4": "bhv_lll_bowser_puzzle_piece_move_up", + "802bebfc": "bhv_lll_bowser_puzzle_piece_move_down", + "802bec34": "bhv_lll_bowser_puzzle_piece_loop", + "802becb0": "func_802BE2E8", + "802bed7c": "play_penguin_walking_sound", + "802bedec": "ActionTuxiesMother2", + "802bef8c": "ActionTuxiesMother1", + "802bf1d8": "ActionTuxiesMother0", + "802bf3c0": "bhv_tuxies_mother_loop", + "802bf424": "func_802BEA58", + "802bf474": "ActionSmallPenguin2", + "802bf57c": "ActionSmallPenguin1", + "802bf648": "ActionSmallPenguin3", + "802bf6e4": "ActionSmallPenguin4", + "802bf760": "ActionSmallPenguin0", + "802bf90c": "ActionSmallPenguin5", + "802bfa14": "func_802BF048", + "802bfa88": "bhv_small_penguin_loop", + "802bfbac": "geo_switch_tuxie_mother_eyes", + "802bfcd8": "ActionFish0", + "802bfeb8": "ActionFish1", + "802bff20": "ActionFish2", + "802bff3c": "bhv_fish_loop", + "802bff68": "func_802BF59C", + "802c00b4": "ActionFishGroup1", + "802c0348": "ActionFishGroup2", + "802c06a8": "ActionFishGroup0", + "802c0768": "bhv_fish_group_2_loop", + "802c08a8": "bhv_wdw_express_elevator_loop", + "802c0aac": "ActionBirdChirpChirp0", + "802c0b50": "ActionBirdChirpChirp1", + "802c0ba4": "ActionBirdChirpChirp2", + "802c0bc4": "ActionBirdChirpChirp3", + "802c0be0": "bhv_bird_chirp_chirp_loop", + "802c0c0c": "func_802C0240", + "802c0cd4": "ActionCheepCheep0", + "802c0d44": "ActionCheepCheep1", + "802c0f90": "ActionCheepCheep2", + "802c1204": "bhv_cheep_cheep_loop", + "802c12c0": "bhv_rotatin_exclamation_box_loop", + "802c1308": "ActionExclamationBox0", + "802c13ec": "ActionExclamationBox1", + "802c14b0": "ActionExclamationBox2", + "802c15b8": "ActionExclamationBox3", + "802c17bc": "func_802C0DF0", + "802c18d0": "ActionExclamationBox4", + "802c1988": "ActionExclamationBox5", + "802c19c0": "bhv_exclamation_box_loop", + "802c19fc": "bhv_sound_spawner_init", + "802c1a40": "bhv_bowsers_sub_loop", + "802c1a80": "bhv_sushi_shark_collision_loop", + "802c1a90": "bhv_sushi_shark_loop", + "802c1c44": "bhv_sunken_ship_part_loop", + "802c1cd4": "bhv_ship_part_3_loop", + "802c1e10": "bhv_jrb_sliding_box_loop", + "802c2190": "bhv_white_puff_1_loop", + "802c2274": "bhv_white_puff_2_loop", + "802c22b8": "bhv_hidden_blue_coin_loop", + "802c242c": "bhv_blue_coin_switch_loop", + "802c263c": "bhv_openable_cage_door_loop", + "802c26f8": "bhv_openable_grill_loop", + "802c2930": "bhv_init_changing_water_level_loop", + "802c2a24": "bhv_water_level_diamond_loop", + "802c2ce8": "tweester_scale_and_move", + "802c2ebc": "tweester_act_idle", + "802c2fbc": "tweester_act_chase", + "802c31c4": "tweester_act_hide", + "802c329c": "bhv_tweester_loop", + "802c32e8": "bhv_tweester_sand_particle_loop", + "802c3440": "bhv_boo_init", + "802c3684": "bhv_courtyard_boo_triplet_init", + "802c4824": "bhv_boo_loop", + "802c4f30": "bhv_big_boo_loop", + "802c515c": "bhv_boo_with_cage_init", + "802c51d4": "bhv_boo_with_cage_loop", + "802c5224": "bhv_merry_go_round_boo_manager_loop", + "802c53cc": "obj_set_secondary_camera_focus", + "802c53ec": "bhv_animated_texture_loop", + "802c5414": "bhv_boo_in_castle_loop", + "802c5688": "bhv_boo_boss_spawned_bridge_loop", + "802c5890": "bhv_bbh_tilting_trap_platform_loop", + "802c5a38": "bhv_haunted_bookshelf_loop", + "802c5ca8": "bhv_merry_go_round_loop", + "802c5dc0": "bhv_static_checkered_platform_loop", + "802c5f48": "bhv_beta_bowser_anchor_loop", + "802c5fdc": "bhv_play_music_track_when_touched_loop", + "802c6050": "bhv_floor_trap_in_castle_loop", + "802c60ac": "bhv_castle_floor_trap_init", + "802c6150": "bhv_castle_floor_trap_open_detect", + "802c61d4": "bhv_castle_floor_trap_open", + "802c6278": "bhv_castle_floor_trap_close_detect", + "802c62bc": "bhv_castle_floor_trap_close", + "802c6328": "bhv_castle_floor_trap_rotate", + "802c6348": "bhv_castle_floor_trap_loop", + "802c63e8": "BehClimbDetectLoop", + "802c64a4": "bhv_sparkle_spawn_loop", + "802c6538": "func_802C5A64", + "802c65c0": "bhv_scuttlebug_loop", + "802c6b6c": "bhv_scuttlebug_spawn_loop", + "802c6ca0": "func_802C61CC", + "802c6d6c": "ActionWhomp0", + "802c6ec8": "ActionWhomp7", + "802c6fb0": "ActionWhomp1", + "802c710c": "ActionWhomp2", + "802c7254": "ActionWhomp3", + "802c72b4": "ActionWhomp4", + "802c7380": "ActionWhomp5", + "802c7428": "func_802C6954", + "802c75fc": "func_802C6B28", + "802c76d4": "ActionWhomp6", + "802c7858": "ActionWhomp8", + "802c7998": "ActionWhomp9", + "802c79d8": "bhv_whomp_loop", + "802c7a70": "bhv_water_splash_loop", + "802c7b14": "bhv_water_drops_loop", + "802c7cac": "bhv_surface_waves_loop", + "802c7d40": "bhv_water_surface_white_wave_init", + "802c7d90": "bhv_object_bubble_ripples_init", + "802c7dfc": "bhv_surface_wave_shrinking_init", + "802c7e5c": "bhv_wave_trail_loop", + "802c7f98": "bhv_white_wind_particle_loop", + "802c81b4": "func_802C76E0", + "802c834c": "bhv_snowman_wind_blowing_loop", + "802c85a4": "func_802C7AD0", + "802c863c": "bhv_walking_penguin_loop", + "802c89f0": "update_mario_platform", + "802c8b4c": "get_mario_pos", + "802c8b8c": "set_mario_pos", + "802c8bc8": "apply_platform_displacement", + "802c8ec0": "apply_mario_platform_displacement", + "802c8f28": "clear_mario_platform", + "802c8f40": "Unknown802C8460", + "802c8fe4": "func_802C8504", + "802c91ec": "func_802C870C", + "802c9388": "func_802C88A8", + "802c93f8": "func_802C8918", + "802c94ac": "func_802C89CC", + "802c95b4": "func_802C8AD4", + "802c9630": "func_802C8B50", + "802c9724": "detect_object_collisions", + "802c97d0": "unused_init_free_list", + "802c9840": "unused_try_allocate", + "802c98a4": "try_allocate_object", + "802c9950": "unused_deallocate", + "802c99b8": "init_free_object_list", + "802c9a3c": "clear_object_lists", + "802c9b68": "unload_object", + "802c9c00": "allocate_object", + "802c9f04": "create_object", + "802ca028": "mark_obj_for_deletion", + "802ca040": "exec_anim_sound_state", + "802ca144": "create_sound_spawner", + "802ca190": "PlaySound", + "802ca1e0": "PlaySound2", + "802ca230": "calc_dist_to_volume_range_1", + "802ca2d4": "calc_dist_to_volume_range_2", + "802ca370": "Stub802C9890", + "802ca380": "Stub802C98A0", + "802ca390": "Stub802C98B0", + "802ca3a0": "Stub802C98C0", + "802ca3b0": "get_current_clock", + "802ca3e0": "get_clock_difference", + "802ca418": "set_print_state_info", + "802ca460": "print_text_array_info", + "802ca51c": "set_text_array_x_y", + "802ca568": "print_debug_bottom_up", + "802ca5b8": "print_debug_top_down_objectinfo", + "802ca618": "print_debug_top_down_mapinfo", + "802ca680": "print_debug_top_down_normal", + "802ca6d0": "print_mapinfo", + "802ca8e8": "print_checkinfo", + "802ca918": "print_surfaceinfo", + "802ca94c": "print_stageinfo", + "802ca990": "print_string_array_info", + "802caa6c": "print_effectinfo", + "802caaa8": "print_enemyinfo", + "802caae4": "update_debug_dpadmask", + "802cabac": "debug_unknown_level_select_check", + "802cac20": "reset_debug_objectinfo", + "802cb0b0": "stub_802CA5D0", + "802cb0c0": "try_print_debug_mario_object_info", + "802cb1c0": "try_print_debug_mario_level_info", + "802cb264": "try_do_mario_debug_object_spawn", + "802cb564": "Unknown802CAA84", + "802cb5c0": "set_and_reset_transition_fade_timer", + "802cb640": "set_transition_color_fade_alpha", + "802cb894": "vertex_transition_color", + "802cba18": "dl_transition_color", + "802cbbc4": "render_fade_transition_from_color", + "802cbc20": "render_fade_transition_into_color", + "802cbc7c": "calc_tex_transition_radius", + "802cbd54": "calc_tex_transition_time", + "802cbe64": "convert_tex_transition_angle_to_pos", + "802cbee0": "center_tex_transition_x", + "802cbf64": "center_tex_transition_y", + "802cbfe8": "make_tex_transition_vertex", + "802cc180": "load_tex_transition_vertex", + "802cc4d8": "render_textured_transition", + "802ccbe8": "render_screen_transition", + "802ccdc8": "render_cannon_circle_base", + "802cd1e8": "geo_cannon_circle_base", + "802cd280": "rotate_rectangle", + "802cd328": "atan2_deg", + "802cd388": "scale_shadow_with_distance", + "802cd444": "disable_shadow_with_distance", + "802cd48c": "dim_shadow_with_distance", + "802cd614": "get_water_level_below_shadow", + "802cd6c4": "init_shadow", + "802cd938": "get_texture_coords_9_vertices", + "802cd988": "get_texture_coords_4_vertices", + "802cd9ec": "make_shadow_vertex_at_xyz", + "802cdb20": "extrapolate_vertex_y_position", + "802cdb74": "get_vertex_coords", + "802cdc40": "calculate_vertex_xyz", + "802cde94": "floor_local_tilt", + "802cdf3c": "make_shadow_vertex", + "802ce128": "add_shadow_to_display_list", + "802ce2bc": "linearly_interpolate_solidity_positive", + "802ce3ec": "linearly_interpolate_solidity_negative", + "802ce524": "correct_shadow_solidity_for_animations", + "802ce690": "correct_lava_shadow_height", + "802ce79c": "create_shadow_player", + "802ce9d0": "create_shadow_circle_9_verts", + "802ceae8": "create_shadow_circle_4_verts", + "802cec04": "create_shadow_circle_assuming_flat_ground", + "802cedc0": "create_shadow_rectangle", + "802cef6c": "get_shadow_height_solidity", + "802cf080": "create_shadow_square", + "802cf1f0": "create_shadow_hardcoded_rectangle", + "802cf34c": "create_shadow_below_xyz", + "802cf5b0": "calculate_skybox_scaled_x", + "802cf69c": "calculate_skybox_scaled_y", + "802cf804": "make_skybox_rect", + "802cfa2c": "draw_skybox_tile_grid", + "802cfc68": "create_skybox_ortho_matrix", + "802cfd88": "init_skybox_display_list", + "802cfef4": "create_skybox_facing_camera", + "802d0080": "geo_wdw_set_initial_water_level", + "802d01e0": "geo_movtex_pause_control", + "802d0254": "movtex_make_quad_vertex", + "802d0484": "movtex_gen_from_quad", + "802d0a84": "movtex_gen_from_quad_array", + "802d0bb0": "movtex_gen_quads_id", + "802d0c84": "get_quad_collection_from_id", + "802d0f28": "movtex_change_texture_format", + "802d104c": "geo_movtex_draw_water_regions", + "802d1330": "update_moving_texture_offset", + "802d13cc": "movtex_write_vertex_first", + "802d1574": "movtex_write_vertex_index", + "802d18b4": "movtex_gen_list", + "802d1b70": "geo_movtex_draw_nocolor", + "802d1cdc": "geo_movtex_draw_colored", + "802d1e48": "geo_movtex_draw_colored_no_update", + "802d1fa8": "geo_movtex_draw_colored_2_no_update", + "802d2108": "geo_movtex_update_horizontal", + "802d2210": "make_vertex", + "802d22c4": "round_float", + "802d2360": "geo_exec_inside_castle_light", + "802d2470": "geo_exec_flying_carpet_timer_update", + "802d2520": "geo_exec_flying_carpet_create", + "802d28cc": "geo_exec_cake_end_screen", + "802d29c0": "stopAllRippleExcept", + "802d2a74": "find_mario_y_position_on_painting", + "802d2b08": "find_mario_z_position_on_painting", + "802d2b84": "painting_find_vertical_ripple_location", + "802d2c40": "find_part_of_painting_near_mario", + "802d2d80": "find_mario_x_position_on_painting", + "802d2dfc": "painting_find_horizontal_ripple_location", + "802d2eb8": "painting_set_ripple_type", + "802d2ffc": "vertical_proximity_ripple_painting_ripple", + "802d319c": "vertical_proximity_ripple_painting_ripple_if_mario_enters", + "802d327c": "vertical_continuous_ripple_painting_ripple", + "802d341c": "vertical_continuous_ripple_painting_ripple_if_mario_enters", + "802d34fc": "horizontal_proximity_ripple_painting_ripple", + "802d36ac": "horizontal_proximity_ripple_painting_ripple_if_mario_enters", + "802d379c": "horizontal_continuous_ripple_painting_ripple", + "802d393c": "horizontal_continuous_ripple_painting_ripple_if_mario_enters", + "802d3a2c": "painting_update_floors", + "802d3bec": "painting_update_ripple_status", + "802d3cec": "painting_calculate_point_ripple", + "802d3e6c": "painting_conditionally_calculate_point_ripple", + "802d3ee4": "Print1", + "802d404c": "Print2", + "802d43f8": "small_float_to_byte", + "802d44bc": "func_802D39DC", + "802d47d0": "func_802D3CF0", + "802d4edc": "func_802D43FC", + "802d50dc": "func_802D45FC", + "802d5354": "func_802D4874", + "802d556c": "display_painting_rippling", + "802d568c": "display_painting_not_rippling", + "802d5778": "reset_painting", + "802d57a8": "update_ddd_painting", + "802d58e4": "func_802D4E04", + "802d593c": "display_painting", + "802d59a8": "vertical_painting_ripple", + "802d5aa0": "horizontal_painting_ripple", + "802d5b98": "Geo18_802D5B98", + "802d5d0c": "Geo18_802D5D0C", + "802d5e00": "int_pow", + "802d5e54": "format_integer", + "802d6144": "parse_width_field", + "802d62d8": "print_text_fmt_int", + "802d6554": "print_text", + "802d66c0": "print_text_centered", + "802d6858": "char_to_glyph_index", + "802d69f8": "add_glyph_texture", + "802d6acc": "clip_to_bounds", + "802d6b3c": "render_textrect", + "802d6c88": "render_text_labels", + "802d6f20": "create_dl_identity_matrix", + "802d7070": "create_dl_translation_matrix", + "802d7174": "create_dl_rotation_matrix", + "802d7280": "create_dl_scale_matrix", + "802d7384": "create_dl_ortho_matrix", + "802d75dc": "render_generic_char", + "802d76c8": "render_multi_text_string", + "802d77dc": "print_generic_string", + "802d7b84": "print_hud_lut_string", + "802d7e88": "print_menu_generic_string", + "802d82d4": "print_credits_string", + "802d862c": "handle_menu_scrolling", + "802d8844": "get_str_x_pos_from_center", + "802d8934": "get_string_width", + "802d89b8": "print_hud_my_score_coins", + "802d8a80": "print_hud_my_score_stars", + "802d8b34": "int_to_str", + "802d8c6c": "get_dialog_id", + "802d8c88": "create_dialog_box", + "802d8cc4": "create_dialog_box_with_var", + "802d8d08": "create_dialog_inverted_box", + "802d8d48": "create_dialog_box_with_response", + "802d8d90": "reset_dialog_render_state", + "802d8e2c": "render_dialog_box_type", + "802d9148": "change_and_flash_dialog_text_color_lines", + "802d9388": "handle_dialog_scroll_page_state", + "802d944c": "render_star_count_dialog_text", + "802d9634": "render_multi_text_string_lines", + "802d9800": "ensure_nonnegative", + "802d982c": "handle_dialog_text_and_pages", + "802d9cb0": "render_dialog_triangle_choice", + "802d9dfc": "render_dialog_string_color", + "802d9f84": "handle_special_dialog_text", + "802da1ac": "render_dialog_entries", + "802da810": "set_menu_mode", + "802da844": "reset_cutscene_msg_fade", + "802da85c": "dl_rgba16_begin_cutscene_msg_fade", + "802da8e4": "dl_rgba16_stop_cutscene_msg_fade", + "802da964": "ascii_to_credits_char", + "802daa34": "print_credits_str_ascii", + "802daae4": "set_cutscene_message", + "802dab58": "do_cutscene_handler", + "802dad54": "print_peach_letter_message", + "802db08c": "render_hud_cannon_reticle", + "802db350": "reset_red_coins_collected", + "802db368": "change_dialog_camera_angle", + "802db3b8": "shade_screen", + "802db498": "print_animated_red_coin", + "802db6e8": "render_pause_red_coins", + "802db760": "render_pause_my_score_coins", + "802dbb24": "render_pause_camera_options", + "802dbe68": "render_pause_course_options", + "802dc15c": "render_pause_castle_menu_box", + "802dc418": "highlight_last_course_complete_stars", + "802dc478": "print_hud_pause_colorful_str", + "802dc570": "render_pause_castle_course_stars", + "802dc718": "render_pause_castle_main_strings", + "802dca88": "render_pause_courses_and_castle", + "802dcd04": "print_hud_course_complete_string", + "802dcf30": "print_hud_course_complete_coins", + "802dd194": "play_star_fanfare_and_flash_hud", + "802dd210": "render_course_complete_lvl_info_and_hud_str", + "802dd838": "render_save_confirmation", + "802ddae0": "render_course_complete_screen", + "802ddca4": "render_menus_and_dialogs", + "802dddf0": "envfx_init_snow", + "802ddf38": "envfx_update_snowflake_count", + "802de0bc": "envfx_cleanup_snow", + "802de114": "orbit_from_positions", + "802de23c": "pos_from_orbit", + "802de360": "envfx_is_snowflake_alive", + "802de458": "envfx_update_snow_normal", + "802de888": "envfx_update_snow_blizzard", + "802ded38": "envfx_update_snow_water", + "802def2c": "rotate_triangle_vertices", + "802df334": "append_snowflake_vertex_buffer", + "802df748": "envfx_update_snow", + "802dfbc8": "envfx_update_particles", + "802dfd50": "particle_is_laterally_close", + "802dfe00": "random_flower_offset", + "802dfe80": "envfx_update_flower", + "802e0120": "envfx_set_lava_bubble_position", + "802e048c": "envfx_update_lava", + "802e065c": "envfx_rotate_around_whirlpool", + "802e08a8": "envfx_is_whirlpool_bubble_alive", + "802e0934": "envfx_update_whirlpool", + "802e0e24": "envfx_is_jestream_bubble_alive", + "802e0eb8": "envfx_update_jetstream", + "802e1238": "envfx_init_bubble", + "802e1414": "envfx_bubbles_update_switch", + "802e1618": "append_bubble_vertex_buffer", + "802e1a20": "envfx_set_bubble_texture", + "802e1bb8": "envfx_update_bubble_particles", + "802e1ed8": "envfx_set_max_bubble_particles", + "802e1f48": "envfx_update_bubbles", + "802e20a0": "convert_rotation", + "802e2134": "spawn_macro_abs_yrot_2params", + "802e21dc": "spawn_macro_abs_yrot_param1", + "802e2284": "spawn_macro_abs_special", + "802e2414": "spawn_macro_objects", + "802e2690": "spawn_macro_objects_hardcoded", + "802e28ec": "spawn_special_objects", + "802e2cf0": "render_hud_tex_lut", + "802e2e58": "render_hud_small_tex_lut", + "802e30b4": "render_power_meter_health_segment", + "802e3214": "render_dl_power_meter", + "802e33b8": "animate_power_meter_emphasized", + "802e352c": "handle_power_meter_actions", + "802e3654": "render_hud_power_meter", + "802e3744": "render_hud_mario_lives", + "802e37a8": "render_hud_coins", + "802e380c": "render_hud_stars", + "802e38e4": "render_hud_keys", + "802e395c": "render_hud_timer", + "802e3b1c": "set_hud_camera_status", + "802e3b3c": "render_hud_camera_status", + "802e3d2c": "render_hud", + "802e3e50": "set_yoshi_as_not_dead", + "802e3e68": "geo_obj_transparency_something", + "802e3f68": "absf_2", + "802e3fac": "turn_obj_away_from_surface", + "802e405c": "obj_find_wall", + "802e41a4": "turn_obj_away_from_steep_floor", + "802e42e0": "obj_orient_graph", + "802e43e4": "calc_obj_friction", + "802e445c": "calc_new_obj_vel_and_pos_y", + "802e4814": "calc_new_obj_vel_and_pos_y_underwater", + "802e4cec": "obj_update_pos_vel_xz", + "802e4d88": "obj_splash", + "802e4e90": "object_step", + "802e5114": "object_step_without_floor_orient", + "802e5160": "obj_move_xyz_using_fvel_and_yaw", + "802e5208": "is_point_within_radius_of_mario", + "802e52b8": "is_point_close_to_object", + "802e5360": "set_object_visibility", + "802e53f4": "obj_return_home_if_safe", + "802e54b0": "obj_return_and_displace_home", + "802e55d0": "obj_check_if_facing_toward_angle", + "802e569c": "obj_find_wall_displacement", + "802e5760": "obj_spawn_yellow_coins", + "802e5824": "obj_flicker_and_disappear", + "802e58b4": "current_mario_room_check", + "802e5948": "trigger_obj_dialog_when_facing", + "802e5a80": "obj_check_floor_death", + "802e5b18": "obj_lava_death", + "802e5c6c": "spawn_orange_number", + "802e5d04": "debug_sequence_tracker", + "802e5de8": "CoinStep", + "802e5e6c": "MovingCoinFlickerLoop", + "802e5ea4": "CoinCollected", + "802e5ee8": "bhv_moving_yellow_coin_init", + "802e5f64": "bhv_moving_yellow_coin_loop", + "802e6098": "bhv_moving_blue_coin_init", + "802e6114": "bhv_moving_blue_coin_loop", + "802e62a4": "bhv_blue_coin_sliding_jumping_init", + "802e631c": "func_802E540C", + "802e63ec": "func_802E54DC", + "802e6474": "bhv_blue_coin_sliding_loop", + "802e6628": "bhv_blue_coin_jumping_loop", + "802e6790": "bhv_seaweed_init", + "802e67dc": "bhv_seaweed_bundle_init", + "802e6a2c": "bhv_bobomb_init", + "802e6a8c": "func_802E5B7C", + "802e6af8": "BobombExplodeLoop", + "802e6bd4": "CheckBobombInteractions", + "802e6cf0": "BobombPatrolLoop", + "802e6dc8": "BobombChaseMarioLoop", + "802e6e84": "BobombLaunchedLoop", + "802e6ed8": "GenericBobombFreeLoop", + "802e7020": "StationaryBobombFreeLoop", + "802e7134": "BobombFreeLoop", + "802e7180": "BobombHeldLoop", + "802e7220": "BobombDroppedLoop", + "802e7280": "BobombThrownLoop", + "802e7324": "ObjRandomBlink", + "802e742c": "bhv_bobomb_loop", + "802e75a0": "bhv_bobomb_fuse_smoke_init", + "802e76ac": "bhv_bobomb_buddy_init", + "802e770c": "BobombBuddyIdleLoop", + "802e7814": "BobombBuddyCannonLoop", + "802e79dc": "BobombBuddyTalkLoop", + "802e7b00": "BobombBuddyTurnToTalkLoop", + "802e7bb0": "BobombBuddyActionLoop", + "802e7c4c": "bhv_bobomb_buddy_loop", + "802e7c90": "bhv_cannon_closed_init", + "802e7d4c": "CannonTrapDoorOpeningLoop", + "802e7e54": "bhv_cannon_closed_loop", + "802e7f70": "bhv_whirlpool_init", + "802e7fb8": "func_802E70A8", + "802e7fec": "func_802E70DC", + "802e80dc": "bhv_whirlpool_loop", + "802e82b0": "bhv_jet_stream_loop", + "802e8388": "bhv_homing_amp_init", + "802e89d4": "bhv_homing_amp_loop", + "802e8ae4": "bhv_circling_amp_init", + "802e8ecc": "bhv_circling_amp_loop", + "802e8f68": "bhv_butterfly_init", + "802e9018": "ButterflyStep", + "802e9278": "CalculateButterflyAngle", + "802e9470": "ButterflyRestingLoop", + "802e94e4": "ButterflyFollowMarioLoop", + "802e9548": "ButterflyReturnHomeLoop", + "802e96c8": "bhv_butterfly_loop", + "802e9764": "bhv_hoot_init", + "802e97fc": "HootFindNextFloor", + "802e98c0": "HootFloorBounce", + "802e9a4c": "HootFreeStep", + "802e9cf4": "PlayerSetHootYaw", + "802e9d98": "HootCarryStep", + "802e9f60": "HootSurfaceCollision", + "802ea144": "HootAscentLoop", + "802ea258": "HootActionLoop", + "802ea3f0": "HootTurnToHome", + "802ea4ec": "HootAwakeLoop", + "802ea588": "bhv_hoot_loop", + "802ea6a8": "bhv_beta_holdable_object_init", + "802ea7e0": "bhv_beta_holdable_object_loop", + "802ea888": "bhv_object_bubble_init", + "802ea934": "bhv_object_bubble_loop", + "802eaa10": "bhv_object_water_wave_init", + "802eaa50": "bhv_object_water_wave_loop", + "802eaa8c": "bhv_explosion_init", + "802eaad0": "bhv_explosion_loop", + "802eabf0": "bhv_bobomb_bully_death_smoke_init", + "802eac3c": "bhv_bobomb_explosion_bubble_init", + "802ead3c": "bhv_bobomb_explosion_bubble_loop", + "802eaef8": "bhv_respawner_loop", + "802eaf84": "create_respawner", + "802eb05c": "bhv_small_bully_init", + "802eb104": "bhv_big_bully_init", + "802eb1c0": "BullyCheckMarioCollision", + "802eb288": "BullyChaseMarioLoop", + "802eb3f0": "BullyKnockbackLoop", + "802eb510": "BullyBackUpLoop", + "802eb5c4": "BullyBackUpCheck", + "802eb630": "PlayBullyStompingSound", + "802eb744": "BullyStep", + "802eb7e0": "BullySpawnCoin", + "802eb8b0": "BullyLavaDeath", + "802eb9d0": "bhv_bully_loop", + "802ebb74": "BigBullySpawnMinion", + "802ebc00": "bhv_big_bully_with_minions_init", + "802ebc88": "BigBullyWithMinionsLavaDeath", + "802ebce0": "bhv_big_bully_with_minions_loop", + "802ebf70": "WaterRingCalcMarioDistInFront", + "802ec030": "WaterRingInit", + "802ec1b0": "bhv_jet_stream_water_ring_init", + "802ec200": "CheckWaterRingCollection", + "802ec3d0": "SetWaterRingScale", + "802ec4e0": "WaterRingCollectedLoop", + "802ec59c": "JetStreamWaterRingNotCollectedLoop", + "802ec75c": "bhv_jet_stream_water_ring_loop", + "802ec7cc": "Unknown802EB8A4", + "802ec818": "JetStreamRingSpawnerActiveLoop", + "802ec908": "bhv_jet_stream_ring_spawner_loop", + "802ec9b8": "bhv_manta_ray_water_ring_init", + "802ec9f0": "MantaRayWaterRingNotCollectedLoop", + "802ecba4": "bhv_manta_ray_water_ring_loop", + "802ecc14": "bhv_bowser_bomb_loop", + "802ecd0c": "bhv_bowser_bomb_explosion_loop", + "802ecea0": "bhv_bowser_bomb_smoke_loop", + "802ecfac": "bhv_celebration_star_init", + "802ed10c": "CelebrationStarSpinAroundMarioLoop", + "802ed28c": "CelebrationStarFaceCameraLoop", + "802ed39c": "bhv_celebration_star_loop", + "802ed40c": "bhv_celebration_star_sparkle_loop", + "802ed45c": "bhv_star_key_collection_puff_spawner_loop", + "802ed498": "bhv_lll_drawbridge_spawner_loop", + "802ed62c": "bhv_lll_drawbridge_loop", + "802ed78c": "bhv_small_bomp_init", + "802ed7fc": "bhv_small_bomp_loop", + "802edacc": "bhv_large_bomp_init", + "802edb2c": "bhv_large_bomp_loop", + "802eddfc": "bhv_wf_sliding_platform_init", + "802edf28": "bhv_wf_sliding_platform_loop", + "802ee124": "bhv_moneybag_init", + "802ee1a0": "MoneybagCheckMarioCollision", + "802ee268": "MoneybagJump", + "802ee46c": "MoneybagMoveAroundLoop", + "802ee598": "MoneybagReturnHomeLoop", + "802ee728": "MoneybagDisappearLoop", + "802ee778": "MoneybagDeathLoop", + "802ee7e0": "bhv_moneybag_loop", + "802ee8f4": "bhv_moneybag_hidden_loop", + "802ee9cc": "bhv_bowling_ball_init", + "802eea24": "func_802EDA14", + "802eea7c": "func_802EDA6C", + "802eeb64": "bhv_bowling_ball_roll_loop", + "802eecb8": "bhv_bowling_ball_initializeLoop", + "802eedf0": "bhv_bowling_ball_loop", + "802eeeb4": "bhv_generic_bowling_ball_spawner_init", + "802eef9c": "bhv_generic_bowling_ball_spawner_loop", + "802ef0e8": "bhv_thi_bowling_ball_spawner_loop", + "802ef21c": "bhv_bob_pit_bowling_ball_init", + "802ef274": "bhv_bob_pit_bowling_ball_loop", + "802ef34c": "bhv_free_bowling_ball_init", + "802ef3f4": "bhv_free_bowling_ball_roll_loop", + "802ef524": "bhv_free_bowling_ball_loop", + "802ef63c": "bhv_rr_cruiser_wing_init", + "802ef66c": "bhv_rr_cruiser_wing_loop", + "802ef820": "bhv_spindel_init", + "802ef858": "bhv_spindel_loop", + "802efcd0": "bhv_ssl_moving_pyramid_wall_init", + "802efd8c": "bhv_ssl_moving_pyramid_wall_loop", + "802efe64": "bhv_pyramid_elevator_init", + "802efef4": "bhv_pyramid_elevator_loop", + "802f0104": "bhv_pyramid_elevator_trajectory_marker_ball_loop", + "802f0168": "bhv_pyramid_top_init", + "802f0288": "bhv_pyramid_top_spinning", + "802f04a0": "bhv_pyramid_top_explode", + "802f05b4": "bhv_pyramid_top_loop", + "802f06a8": "bhv_pyramid_top_fragment_init", + "802f0714": "bhv_pyramid_top_fragment_loop", + "802f0788": "bhv_pyramid_pillar_touch_detector_loop", + "802f07f4": "bhv_waterfall_sound_loop", + "802f0820": "bhv_volcano_sound_loop", + "802f084c": "bhv_castle_flag_init", + "802f0898": "bhv_birds_sound_loop", + "802f0950": "bhv_ambient_sounds_init", + "802f09a4": "bhv_sand_sound_loop", + "802f09f0": "bhv_castle_cannon_grate_init", + "802f0a40": "bhv_snowmans_bottom_init", + "802f0b7c": "func_802EFB2C", + "802f0bd4": "func_802EFB84", + "802f0c94": "func_802EFC44", + "802f0df0": "func_802EFDA0", + "802f0fa8": "func_802EFF58", + "802f105c": "bhv_snowmans_bottom_loop", + "802f120c": "bhv_snowmans_head_init", + "802f1370": "bhv_snowmans_head_loop", + "802f151c": "bhv_snowmans_body_checkpoint_loop", + "802f15a8": "bhv_big_boulder_init", + "802f162c": "func_802F05DC", + "802f1714": "bhv_big_boulder_loop", + "802f17f0": "bhv_big_boulder_generator_loop", + "802f1954": "func_802F0904", + "802f19c8": "func_802F0978", + "802f1a10": "func_802F09C0", + "802f1bb8": "func_802F0B68", + "802f1d64": "bhv_wing_cap_init", + "802f1dc0": "func_802F0D70", + "802f1e5c": "func_802F0E0C", + "802f1f3c": "bhv_wing_vanish_cap_loop", + "802f1fd0": "bhv_metal_cap_init", + "802f2030": "func_802F0FE0", + "802f20ac": "bhv_metal_cap_loop", + "802f2140": "bhv_normal_cap_init", + "802f21e0": "func_802F1190", + "802f2284": "func_802F1234", + "802f23a8": "bhv_normal_cap_loop", + "802f2498": "bhv_vanish_cap_init", + "802f24f4": "bhv_collect_star_init", + "802f25b0": "bhv_collect_star_loop", + "802f2614": "bhv_star_spawn_init", + "802f2768": "bhv_star_spawn_loop", + "802f2aa0": "func_802F1A50", + "802f2b88": "create_star", + "802f2bd4": "func_802F1B84", + "802f2c24": "func_802F1BD4", + "802f2c84": "bhv_hidden_red_coin_star_init", + "802f2d8c": "bhv_hidden_red_coin_star_loop", + "802f2e6c": "bhv_red_coin_init", + "802f2f2c": "bhv_red_coin_loop", + "802f3014": "bhv_hidden_star_init", + "802f30f0": "bhv_hidden_star_loop", + "802f31bc": "bhv_hidden_star_trigger_loop", + "802f328c": "bhv_bowser_course_red_coin_star_loop", + "802f336c": "bhv_ttm_rolling_log_init", + "802f341c": "func_802F238C", + "802f36a4": "bhv_rolling_log_loop", + "802f38b0": "func_802F2820", + "802f39b4": "func_802F2924", + "802f3a30": "bhvLllVolcanoFallingTrap_loop", + "802f3b98": "bhv_lll_rolling_log_init", + "802f3c54": "bhv_1up_interact", + "802f3cc8": "bhv_1up_common_init", + "802f3d30": "bhv_1up_init", + "802f3dd0": "func_802F2D40", + "802f3ea8": "func_802F2E18", + "802f401c": "func_802F2F8C", + "802f40cc": "bhv_1up_walking_loop", + "802f4248": "bhv_1up_running_away_loop", + "802f43b8": "func_802F3328", + "802f44c0": "bhv_1up_sliding_loop", + "802f45b8": "bhv_1up_loop", + "802f45f0": "bhv_1up_jump_on_approach_loop", + "802f4710": "bhv_1up_hidden_loop", + "802f48f4": "bhv_1up_hidden_trigger_loop", + "802f496c": "bhv_1up_hidden_in_pole_loop", + "802f4b00": "bhv_1up_hidden_in_pole_trigger_loop", + "802f4b78": "bhv_1up_hidden_in_pole_spawner_loop", + "802f4c68": "func_802F3BD8", + "802f4ce0": "func_802F3C50", + "802f4d78": "bhv_controllable_platform_sub_loop", + "802f4eb4": "bhv_controllable_platform_init", + "802f5010": "func_802F3F80", + "802f5068": "func_802F3FD8", + "802f52c0": "func_802F4230", + "802f547c": "func_802F43EC", + "802f55a4": "bhv_controllable_platform_loop", + "802f5cd4": "bhv_breakable_box_small_init", + "802f5d78": "func_802F4CE8", + "802f5e44": "func_802F4DB4", + "802f5f48": "breakable_box_small_released_loop", + "802f6014": "breakable_box_small_idle_loop", + "802f60d8": "breakable_box_small_get_dropped", + "802f6150": "breakable_box_small_get_thrown", + "802f6228": "bhv_breakable_box_small_loop", + "802f62e4": "bhv_sliding_snow_mound_loop", + "802f6448": "bhv_snow_mound_spawn_loop", + "802f6588": "func_802F54F8", + "802f665c": "func_802F55CC", + "802f6984": "bhv_floating_platform_loop", + "802f6c0c": "bhv_arrow_lift_loop", + "802f6d20": "bhv_orange_number_init", + "802f6d58": "bhv_orange_number_loop", + "802f6e40": "bhv_manta_ray_init", + "802f6eb0": "func_802F5E20", + "802f7068": "func_802F5FD8", + "802f7264": "bhv_manta_ray_loop", + "802f7348": "bhv_falling_pillar_init", + "802f7398": "bhv_falling_pillar_spawn_hitboxes", + "802f7418": "bhv_falling_pillar_calculate_angle_in_front_of_mario", + "802f74dc": "bhv_falling_pillar_loop", + "802f7760": "bhv_falling_pillar_hitbox_loop", + "802f7924": "bhv_jrb_floating_box_loop", + "802f7978": "bhv_decorative_pendulum_init", + "802f79b0": "bhv_decorative_pendulum_loop", + "802f7a58": "bhv_treasure_chest_top_loop", + "802f7c9c": "bhv_treasure_chest_bottom_init", + "802f7d04": "bhv_treasure_chest_bottom_loop", + "802f7f1c": "func_802F6E8C", + "802f7fa0": "bhv_treasure_chest_ship_init", + "802f8044": "bhv_treasure_chest_ship_loop", + "802f8158": "bhv_treasure_chest_jrb_init", + "802f8208": "bhv_treasure_chest_jrb_loop", + "802f82f8": "bhv_treasure_chest_init", + "802f83a4": "bhv_treasure_chest_loop", + "802f8490": "bhv_mips_init", + "802f85e0": "bhv_mips_find_furthest_waypoint_to_mario", + "802f8760": "bhv_mips_act_wait_for_nearby_mario", + "802f8808": "bhv_mips_act_follow_path", + "802f893c": "bhv_mips_act_wait_for_animation_done", + "802f8988": "bhv_mips_act_fall_down", + "802f8a34": "bhv_mips_act_idle", + "802f8ab4": "bhv_mips_free", + "802f8b54": "bhv_mips_held", + "802f8c74": "bhv_mips_dropped", + "802f8cf8": "bhv_mips_thrown", + "802f8dac": "bhv_mips_loop", + "802f8e54": "bhv_yoshi_init", + "802f8f08": "yoshi_walk_loop", + "802f9054": "yoshi_idle_loop", + "802f923c": "yoshi_talk_loop", + "802f93a8": "yoshi_walk_and_jump_off_roof_loop", + "802f9500": "yoshi_finish_jumping_and_despawn_loop", + "802f95ac": "yoshi_give_present_loop", + "802f965c": "BehYoshiLoop", + "802fbc4c": "bhv_koopa_init", + "802fc414": "shelled_koopa_attack_handler", + "802fcc00": "obj_begin_race", + "802fd7f8": "bhv_koopa_update", + "802fd950": "bhv_koopa_race_endpoint_update", + "802fda28": "bhv_pokey_body_part_update", + "802fe3b0": "bhv_pokey_update", + "802fe8b4": "bhv_swoop_update", + "802ff040": "bhv_fly_guy_update", + "802ff214": "bhv_goomba_triplet_spawner_update", + "802ff408": "bhv_goomba_init", + "802ff94c": "huge_goomba_weakly_attacked", + "802ff96c": "bhv_goomba_update", + "802ffb38": "bhv_chain_chomp_chain_part_update", + "80300e40": "bhv_chain_chomp_update", + "80300ecc": "bhv_wooden_post_update", + "80301148": "bhv_chain_chomp_gate_init", + "80301180": "bhv_chain_chomp_gate_update", + "80301210": "bhv_wiggler_body_part_update", + "803014cc": "wiggler_init_segments", + "803016e0": "wiggler_update_segments", + "803020e4": "wiggler_jumped_on_attack_handler", + "80302154": "bhv_wiggler_update", + "80302910": "bhv_spiny_update", + "80303028": "bhv_enemy_lakitu_update", + "8030369c": "bhv_cloud_update", + "80303744": "bhv_cloud_part_update", + "80303984": "bhv_camera_lakitu_init", + "80303f64": "bhv_camera_lakitu_update", + "803043f8": "bhv_monty_mole_hole_update", + "80304474": "monty_mole_spawn_dirt_particles", + "803044c0": "bhv_monty_mole_init", + "80304ba8": "bhv_monty_mole_update", + "80304fd4": "bhv_monty_mole_rock_update", + "80305100": "bhv_platform_on_track_init", + "80305a58": "bhv_platform_on_track_update", + "80305bb0": "bhv_track_ball_update", + "80305c14": "bhv_seesaw_platform_init", + "80305c90": "bhv_seesaw_platform_update", + "80305e2c": "bhv_ferris_wheel_axle_init", + "80305f24": "bhv_ferris_wheel_platform_update", + "80306084": "bhv_water_bomb_spawner_update", + "803062a8": "water_bomb_spawn_explode_particles", + "803067e8": "bhv_water_bomb_update", + "803068c0": "bhv_water_bomb_shadow_update", + "8030699c": "bhv_ttc_rotating_solid_init", + "80306a38": "bhv_ttc_rotating_solid_update", + "80306cc4": "bhv_ttc_pendulum_init", + "80306d38": "bhv_ttc_pendulum_update", + "80306f48": "bhv_ttc_treadmill_init", + "80307010": "bhv_ttc_treadmill_update", + "803071b8": "bhv_ttc_moving_bar_init", + "80307670": "bhv_ttc_moving_bar_update", + "80307760": "bhv_ttc_cog_init", + "803077e0": "bhv_ttc_cog_update", + "80307930": "bhv_ttc_pit_block_init", + "803079c8": "bhv_ttc_pit_block_update", + "80307ae4": "bhv_ttc_elevator_init", + "80307b58": "bhv_ttc_elevator_update", + "80307c88": "bhv_ttc_2d_rotator_init", + "80307cf8": "bhv_ttc_2d_rotator_update", + "80307ea4": "bhv_ttc_spinner_update", + "80307fb8": "func_80306ED4", + "8030803c": "bhv_mr_blizzard_init", + "80308d6c": "bhv_mr_blizzard_update", + "80309154": "bhv_mr_blizzard_snowball", + "803091e0": "bhv_sliding_plat_2_init", + "80309354": "bhv_sliding_plat_2_loop", + "80309454": "bhv_rotating_octagonal_plat_init", + "803094d0": "bhv_rotating_octagonal_plat_loop", + "803094f8": "bhv_animates_on_floor_switch_press_init", + "80309530": "bhv_animates_on_floor_switch_press_loop", + "803097a4": "bhv_activated_back_and_forth_platform_init", + "803098c0": "bhv_activated_back_and_forth_platform_update", + "80309b64": "bhv_recovery_heart_loop", + "80309cec": "bhv_bubble_cannon_barrel_loop", + "80309ed4": "water_bomb_cannon_act_0", + "80309f68": "water_bomb_cannon_act_1", + "8030a0e8": "water_bomb_cannon_act_2", + "8030a11c": "bhv_water_bomb_cannon_loop", + "8030a1c0": "bhv_unagi_init", + "8030a2a8": "unagi_act_0", + "8030a390": "unagi_act_1_4", + "8030a514": "unagi_act_2", + "8030a614": "unagi_act_3", + "8030a93c": "bhv_unagi_loop", + "8030aabc": "bhv_unagi_subobject_loop", + "8030ad04": "dorrie_raise_head", + "8030ae9c": "dorrie_act_move", + "8030b0b8": "dorrie_begin_head_raise", + "8030b0f0": "dorrie_act_lower_head", + "8030b220": "dorrie_act_raise_head", + "8030b2f4": "bhv_dorrie_update", + "8030b658": "bhv_haunted_chair_init", + "8030b6d8": "haunted_chair_act_0", + "8030ba68": "haunted_chair_act_1", + "8030bc90": "bhv_haunted_chair_loop", + "8030bfd0": "bhv_mad_piano_update", + "8030c06c": "flying_bookend_act_0", + "8030c0f0": "flying_bookend_act_1", + "8030c210": "flying_bookend_act_2", + "8030c2c8": "flying_bookend_act_3", + "8030c364": "bhv_flying_bookend_loop", + "8030c4b0": "bhv_bookend_spawn_loop", + "8030c564": "bookshelf_manager_act_0", + "8030c60c": "bookshelf_manager_act_1", + "8030c6a4": "bookshelf_manager_act_2", + "8030c828": "bookshelf_manager_act_3", + "8030c894": "bookshelf_manager_act_4", + "8030c8ec": "bhv_haunted_bookshelf_manager_loop", + "8030c98c": "bhv_book_switch_loop", + "8030cd30": "obj_spit_fire", + "8030cddc": "bhv_fire_piranha_plant_init", + "8030d2f0": "bhv_fire_piranha_plant_update", + "8030d598": "bhv_fire_spitter_update", + "8030d640": "bhv_small_piranha_flame_loop", + "8030d8d4": "bhv_fly_guy_flame_loop", + "8030d93c": "Geo18_8030D93C", + "8030d9ac": "Geo18_8030D9AC", + "8030da14": "snufit_act_0", + "8030db38": "snufit_act_1", + "8030dc70": "bhv_snufit_loop", + "8030dfc4": "bhv_snufit_balls_loop", + "8030e14c": "bhv_horizontal_grindel_init", + "8030e16c": "bhv_horizontal_grindel_update", + "8030ea9c": "bhv_eyerok_boss_loop", + "8030fff8": "bhv_eyerok_hand_loop", + "80310498": "bhv_klepto_init", + "8031126c": "obj_set_speed_to_zero", + "8031129c": "bhv_klepto_update", + "80311874": "bhv_bird_update", + "803118e4": "bhv_racing_penguin_init", + "80312070": "bhv_racing_penguin_update", + "80312168": "bhv_penguin_race_finish_line_update", + "80312200": "bhv_penguin_race_shortcut_check_update", + "80312248": "bhv_coffin_spawner_loop", + "80312370": "coffin_act_idle", + "8031262c": "coffin_act_stand_up", + "8031274c": "bhv_coffin_loop", + "80312804": "clam_act_0", + "80312900": "clam_act_1", + "80312a54": "bhv_clam_loop", + "80313110": "bhv_skeeter_update", + "803131e8": "bhv_skeeter_wave_update", + "8031326c": "bhv_swing_platform_init", + "80313294": "bhv_swing_platform_update", + "80313354": "bhv_donut_platform_spawner_update", + "80313530": "bhv_donut_platform_update", + "803136cc": "bhv_ddd_pole_init", + "80313754": "bhv_ddd_pole_update", + "803137f4": "bhv_red_coin_star_marker_init", + "80313fc0": "bhv_triplet_butterfly_update", + "80314098": "bubba_act_0", + "8031427c": "bubba_act_1", + "803145d4": "bhv_bubba_loop", + "80314a30": "prepare_reverb_ring_buffer", + "80314cc0": "get_volume_ramping", + "80314de4": "synthesis_execute", + "80314f64": "synthesis_do_one_audio_update", + "80315590": "synthesis_process_notes", + "80316010": "load_wave_samples", + "803160dc": "final_resample", + "80316138": "process_envelope", + "8031619c": "process_envelope_inner", + "803166fc": "note_apply_headset_pan_effects", + "80316ac8": "note_init_volume", + "80316af4": "note_set_vel_pan_reverb", + "80316da8": "note_set_frequency", + "80316db4": "note_enable", + "80316e00": "note_disable", + "80316e80": "reset_bank_and_seq_load_status", + "80316ec4": "discard_bank", + "80316fb4": "discard_sequence", + "80317040": "soundAlloc", + "803170b4": "sound_alloc_pool_init", + "803170d4": "persistent_pool_clear", + "803170e8": "temporary_pool_clear", + "80317118": "unused_803160F8", + "80317128": "sound_init_main_pools", + "80317184": "session_pools_init", + "80317200": "seq_and_bank_pool_init", + "8031727c": "persistent_pools_init", + "80317338": "temporary_pools_init", + "803173fc": "alloc_bank_or_seq", + "8031782c": "get_bank_or_seq", + "803178ec": "decrease_reverb_gain", + "80317914": "wait_for_audio_frames", + "80317948": "audio_reset_session", + "80318040": "audio_dma_copy_immediate", + "803180c4": "audio_dma_copy_async", + "80318130": "audio_dma_partial_copy_async", + "803181ec": "decrease_sample_dma_ttls", + "80318300": "dma_sample_data", + "80318634": "init_sample_dma_buffers", + "803188f4": "patch_audio_bank", + "80318b30": "bank_load_immediate", + "80318c8c": "bank_load_async", + "80318dc4": "sequence_dma_immediate", + "80318e70": "sequence_dma_async", + "80318fac": "get_missing_bank", + "803190f4": "load_banks_immediate", + "80319220": "preload_sequence", + "80319328": "load_sequence", + "80319388": "load_sequence_internal", + "8031950c": "audio_init", + "80319920": "note_init", + "80319998": "note_disable2", + "803199b8": "process_notes", + "80319db8": "seq_channel_layer_decay_release_internal", + "80319f64": "seq_channel_layer_note_decay", + "80319f84": "seq_channel_layer_note_release", + "80319fa4": "build_synthetic_wave", + "8031a1d0": "init_synthetic_wave", + "8031a254": "init_note_list", + "8031a264": "init_note_lists", + "8031a2b4": "init_note_free_list", + "8031a368": "note_pool_clear", + "8031a494": "note_pool_fill", + "8031a5d0": "audio_list_push_front", + "8031a610": "audio_list_remove", + "8031a63c": "pop_node_with_value_less_equal", + "8031a6cc": "note_init_for_layer", + "8031a794": "func_80319728", + "8031a7c8": "note_release_and_take_ownership", + "8031a820": "alloc_note_from_disabled", + "8031a89c": "alloc_note_from_decaying", + "8031a8f0": "alloc_note_from_active", + "8031a94c": "alloc_note", + "8031ac34": "reclaim_notes", + "8031adac": "note_init_all", + "8031aee0": "func_80319E70", + "8031aee8": "sequence_player_process_sound", + "8031b0cc": "get_portamento_freq_scale", + "8031b1c0": "get_vibrato_pitch_change", + "8031b248": "get_vibrato_freq_scale", + "8031b440": "note_vibrato_update", + "8031b4a0": "note_vibrato_init", + "8031b58c": "adsr_init", + "8031b5ac": "adsr_update", + "8031b830": "sequence_channel_init", + "8031b940": "seq_channel_set_layer", + "8031ba30": "seq_channel_layer_disable", + "8031ba6c": "seq_channel_layer_free", + "8031baf0": "sequence_channel_disable", + "8031bb5c": "allocate_sequence_channel", + "8031bba4": "sequence_player_init_channels", + "8031bcd0": "sequence_player_disable_channels", + "8031bda0": "sequence_channel_enable", + "8031be44": "sequence_player_disable", + "8031bf14": "audio_list_push_back", + "8031bf54": "audio_list_pop_back", + "8031bf94": "init_layer_freelist", + "8031c03c": "m64_read_u8", + "8031c050": "m64_read_s16", + "8031c080": "m64_read_compressed_u16", + "8031c0c4": "seq_channel_layer_process_script", + "8031c200": "L_U_8031C200", + "8031c23c": "L_U_8031C23C", + "8031c298": "L_U_8031C298", + "8031c2dc": "L_U_8031C2DC", + "8031c328": "L_U_8031C328", + "8031c36c": "L_U_8031C36C", + "8031c3bc": "L_U_8031C3BC", + "8031c3e8": "L_U_8031C3E8", + "8031c454": "L_U_8031C454", + "8031c4a4": "L_U_8031C4A4", + "8031c5c8": "L_U_8031C5C8", + "8031c698": "L_U_8031C698", + "8031c6a0": "L_U_8031C6A0", + "8031cbe0": "L_U_8031CBE0", + "8031cbec": "L_U_8031CBEC", + "8031ce54": "get_instrument", + "8031cfd4": "set_instrument", + "8031d068": "sequence_channel_set_volume", + "8031d08c": "sequence_channel_process_script", + "8031d144": "L_U_8031D144", + "8031d1f8": "L_U_8031D1F8", + "8031d234": "L_U_8031D234", + "8031d26c": "L_U_8031D26C", + "8031d2b4": "L_U_8031D2B4", + "8031d2c4": "L_U_8031D2C4", + "8031d31c": "L_U_8031D31C", + "8031d344": "L_U_8031D344", + "8031d354": "L_U_8031D354", + "8031d370": "L_U_8031D370", + "8031d3a8": "L_U_8031D3A8", + "8031d3c4": "L_U_8031D3C4", + "8031d3d4": "L_U_8031D3D4", + "8031d3e4": "L_U_8031D3E4", + "8031d400": "L_U_8031D400", + "8031d424": "L_U_8031D424", + "8031d44c": "L_U_8031D44C", + "8031d474": "L_U_8031D474", + "8031d498": "L_U_8031D498", + "8031d4bc": "L_U_8031D4BC", + "8031d4d4": "L_U_8031D4D4", + "8031d4f0": "L_U_8031D4F0", + "8031d500": "L_U_8031D500", + "8031d51c": "L_U_8031D51C", + "8031d538": "L_U_8031D538", + "8031d56c": "L_U_8031D56C", + "8031d5a0": "L_U_8031D5A0", + "8031d5b4": "L_U_8031D5B4", + "8031d5d4": "L_U_8031D5D4", + "8031d5e4": "L_U_8031D5E4", + "8031d640": "L_U_8031D640", + "8031d678": "L_U_8031D678", + "8031d6c4": "L_U_8031D6C4", + "8031d6d4": "L_U_8031D6D4", + "8031d6f4": "L_U_8031D6F4", + "8031d718": "L_U_8031D718", + "8031d728": "L_U_8031D728", + "8031d73c": "L_U_8031D73C", + "8031d7b8": "L_U_8031D7B8", + "8031d7e8": "L_U_8031D7E8", + "8031d7f8": "L_U_8031D7F8", + "8031d814": "L_U_8031D814", + "8031d830": "L_U_8031D830", + "8031d87c": "L_U_8031D87C", + "8031d898": "L_U_8031D898", + "8031d8f8": "L_U_8031D8F8", + "8031d900": "L_U_8031D900", + "8031d930": "L_U_8031D930", + "8031d94c": "L_U_8031D94C", + "8031d974": "L_U_8031D974", + "8031d9ec": "sequence_player_process_sequence", + "8031e240": "process_sequences", + "8031e2e8": "init_sequence_player", + "8031e374": "init_sequence_players", + "8031e4f0": "unused_8031E4F0", + "8031e568": "unused_8031E568", + "8031e578": "sequence_player_fade_out_internal", + "8031e5c0": "func_8031D690", + "8031e60c": "func_8031D6E4", + "8031e6a4": "func_8031D7B0", + "8031e710": "func_8031D838", + "8031e7b8": "create_next_audio_frame_task", + "8031eb00": "play_sound", + "8031eb30": "process_sound_request", + "8031edec": "process_all_sound_requests", + "8031ee70": "func_8031DFE8", + "8031ef6c": "func_8031E0E4", + "8031eff4": "func_8031E16C", + "8031f810": "get_sound_pan", + "8031f96c": "get_sound_dynamics", + "8031fb20": "get_sound_freq_scale", + "8031fbe8": "get_sound_reverb", + "8031fd84": "audio_signal_game_loop_tick", + "8031fdac": "update_game_sound", + "80320544": "play_sequence", + "80320678": "sequence_player_fade_out", + "803206bc": "fade_volume_scale", + "80320734": "fade_channel_volume_scale", + "8032080c": "func_8031F96C", + "803208ec": "process_level_music_dynamics", + "80320a4c": "L8031FBAC", + "80320a8c": "L8031FBEC", + "80320acc": "L8031FC2C", + "80320b0c": "L8031FC6C", + "80320b4c": "L8031FCAC", + "80320b8c": "L8031FCEC", + "80320bcc": "L8031FD2C", + "80320bf4": "L8031FD54", + "80320d70": "unused_8031FED0", + "80320e3c": "func_8031FFB4", + "80320ec4": "sequence_player_unlower", + "80320f68": "func_803200E4", + "803210d4": "set_sound_disabled", + "8032112c": "sound_init", + "80321398": "get_currently_playing_sound", + "80321474": "func_803205E8", + "80321584": "func_803206F8", + "8032171c": "func_80320890", + "8032174c": "sound_banks_disable", + "803217a8": "disable_all_sequence_players", + "8032180c": "sound_banks_enable", + "80321864": "unused_803209D8", + "803218d8": "func_80320A4C", + "803218f4": "play_dialog_sound", + "803219ac": "play_music", + "80321bac": "stop_background_music", + "80321ce4": "fadeout_background_music", + "80321d38": "drop_queued_background_music", + "80321d5c": "get_current_background_music", + "80321d9c": "func_80320ED8", + "80321e48": "play_secondary_music", + "80321f48": "func_80321080", + "80321f9c": "func_803210D4", + "80322078": "play_course_clear", + "803220b4": "play_peachs_jingle", + "803220f0": "play_puzzle_jingle", + "8032212c": "play_star_fanfare", + "80322168": "play_power_star_jingle", + "803221b8": "play_race_fanfare", + "803221f4": "play_toads_jingle", + "80322230": "sound_reset", + "8032231c": "audio_set_sound_mode", + "80322348": "unused_80321460", + "8032235c": "unused_80321474", + "803223b0": "osSetTime", + "803223e0": "osMapTLB", + "803224a0": "osUnmapTLBAll", + "803224f0": "sprintf", + "8032255c": "proutSprintf", + "803225a0": "osCreateMesgQueue", + "803225d0": "osSetEventMesg", + "80322640": "osViSetEvent", + "803226b0": "osCreateThread", + "80322800": "osRecvMesg", + "80322940": "_VirtualToPhysicalTask", + "80322a5c": "osSpTaskLoad", + "80322bbc": "osSpTaskStartGo", + "80322c00": "osSpTaskYield", + "80322c20": "osSendMesg", + "80322d70": "osSpTaskYielded", + "80322df0": "osStartThread", + "80322f40": "osWritebackDCacheAll", + "80322f70": "osCreateViManager", + "803230f4": "viMgrMain", + "803232d0": "osViSetMode", + "80323340": "osViBlack", + "803233b0": "osViSetSpecialFeatures", + "80323570": "osCreatePiManager", + "803236f0": "osSetThreadPri", + "803237d0": "osInitialize", + "80323a00": "osViSwapBuffer", + "80323a50": "sqrtf", + "80323a60": "osContStartReadData", + "80323b24": "osContGetReadData", + "80323bcc": "__osPackReadData", + "80323cc0": "osContInit", + "80323ebc": "__osContGetInitData", + "80323f8c": "__osPackRequestData", + "80324080": "osEepromProbe", + "803240f0": "__ull_rshift", + "8032411c": "__ull_rem", + "80324158": "__ull_div", + "80324194": "__ll_lshift", + "803241c0": "__ll_rem", + "803241fc": "__ll_div", + "80324258": "__ll_mul", + "80324288": "__ull_divremi", + "803242e8": "__ll_mod", + "80324384": "__ll_rshift", + "803243b0": "osInvalDCache", + "80324460": "osPiStartDma", + "80324570": "bzero", + "80324610": "osInvalICache", + "80324690": "osEepromLongRead", + "803247d0": "osEepromLongWrite", + "80324910": "bcopy", + "80324c20": "guOrthoF", + "80324d74": "guOrtho", + "80324de0": "guPerspectiveF", + "80325010": "guPerspective", + "80325070": "osGetTime", + "80325100": "__d_to_ll", + "8032511c": "__f_to_ll", + "80325138": "__d_to_ull", + "803251d8": "__f_to_ull", + "80325274": "__ll_to_d", + "8032528c": "__ll_to_f", + "803252a4": "__ull_to_d", + "803252d8": "__ull_to_f", + "80325310": "cosf", + "80325480": "sinf", + "80325640": "guTranslateF", + "80325688": "guTranslate", + "803256e0": "guRotateF", + "80325874": "guRotate", + "803258d0": "guScaleF", + "80325924": "guScale", + "80325970": "osAiSetFrequency", + "80325bd4": "alBnkfNew", + "80325cd8": "alSeqFileNew", + "80325d20": "osWritebackDCache", + "80325da0": "osAiGetLength", + "80325db0": "osAiSetNextBuffer", + "80325e60": "__osTimerServicesInit", + "80325eec": "__osTimerInterrupt", + "80326064": "__osSetTimerIntr", + "803260d8": "__osInsertTimer", + "80326260": "_Printf", + "803273f0": "memcpy", + "8032741c": "strlen", + "80327444": "strchr", + "80327490": "__osDequeueThread", + "803274d0": "__osDisableInt", + "803274f0": "__osRestoreInt", + "80327510": "__osViInit", + "80327640": "__osExceptionPreamble", + "80327650": "__osException", + "803278e4": "L80326964", + "80327904": "L80326984", + "80327938": "L803269B8", + "80327a68": "L80326AE8", + "80327ac4": "L80326B44", + "80327ae4": "L80326B64", + "80327b1c": "L80326B9C", + "80327b68": "L80326BE8", + "80327b98": "send_mesg", + "80327c80": "__osEnqueueAndYield", + "80327d10": "__osEnqueueThread", + "80327d58": "__osPopThread", + "80327d68": "__osDispatchThread", + "80327ea8": "__osCleanupThread", + "80327eb0": "osVirtualToPhysical", + "80327f30": "__osSpSetStatus", + "80327f40": "__osSpSetPc", + "80327f80": "__osSpRawStartDma", + "80328010": "__osSpDeviceBusy", + "80328040": "__osSpGetStatus", + "80328050": "osGetThreadPri", + "80328070": "__osViGetCurrentContext", + "80328080": "__osViSwapContext", + "803283e0": "osGetCount", + "803283f0": "__osPiCreateAccessQueue", + "80328440": "__osPiGetAccess", + "80328484": "__osPiRelAccess", + "803284b0": "osPiRawStartDma", + "80328590": "__osDevMgrMain", + "80328710": "__osSetSR", + "80328720": "__osGetSR", + "80328730": "__osSetFpcCsr", + "80328740": "__osSiRawReadIo", + "80328790": "__osSiRawWriteIo", + "803287e0": "osMapTLBRdb", + "80328840": "osPiRawReadIo", + "803288a0": "__osSiCreateAccessQueue", + "803288f0": "__osSiGetAccess", + "80328934": "__osSiRelAccess", + "80328960": "__osSiRawStartDma", + "80328a10": "osSetTimer", + "80328af0": "osEepromWrite", + "80328ca0": "__osPackEepWriteData", + "80328dac": "__osEepStatus", + "80328fd0": "osJamMesg", + "80329120": "osPiGetCmdQueue", + "80329150": "osEepromRead", + "80329340": "__osPackEepReadData", + "80329450": "guMtxF2L", + "80329550": "guMtxIdentF", + "803295d8": "guMtxIdent", + "80329608": "guMtxL2F", + "803296c0": "guNormalize", + "80329750": "__osAiDeviceBusy", + "80329780": "__osSetCompare", + "80329790": "_Litob", + "80329a90": "_Ldtob", + "8032a860": "u32_to_string", + "8032a890": "string_to_u32", + "8032a8e8": "send_packet", + "8032a9a8": "send", + "8032aa80": "process_command_memory", + "8032aacc": "process_command_register", + "8032aaf8": "kdebugserver", + "8032ace0": "__osSyncPutChars", + "8032ae10": "osSetIntMask", + "8032ae70": "osDestroyThread", + "8032af70": "__osProbeTLB", + "8032b030": "__osSiDeviceBusy", + "8032b060": "lldiv", + "8032b160": "ldiv", + "8032b1f0": "__osGetCause", + "8032b200": "__osAtomicDec", + "8032b260": "rspF3DBootStart", + "8032b330": "rspF3DBootEnd", + "8032b330": "rspF3DStart", + "8032c738": "rspF3DEnd", + "8032c740": "rspAspMainStart", + "8032d560": "rspAspMainEnd", + "8032d560": "gVblankHandler1", + "8032d564": "gVblankHandler2", + "8032d568": "gActiveSPTask", + "8032d56c": "sCurrentAudioSPTask", + "8032d570": "sCurrentDisplaySPTask", + "8032d574": "sNextAudioSPTask", + "8032d578": "sNextDisplaySPTask", + "8032d57c": "sAudioEnabled", + "8032d580": "sNumVblanks", + "8032d584": "gResetTimer", + "8032d588": "D_8032C648", + "8032d58c": "gDebugLevelSelect", + "8032d590": "D_8032C650", + "8032d594": "gShowProfiler", + "8032d598": "gShowDebugText", + "8032d5d0": "unused8032C690", + "8032d5d4": "gGlobalTimer", + "8032d5dc": "frameBufferIndex", + "8032d5e0": "D_8032C6A0", + "8032d5e4": "gPlayer1Controller", + "8032d5e8": "gPlayer2Controller", + "8032d5ec": "gPlayer3Controller", + "8032d5f0": "gCurrDemoInput", + "8032d5f4": "gDemoInputListID", + "8032d5f8": "gRecordedDemoInput", + "8032d6d0": "credits01", + "8032d6d8": "credits02", + "8032d6e4": "credits03", + "8032d6f0": "credits04", + "8032d700": "credits05", + "8032d710": "credits06", + "8032d71c": "credits07", + "8032d728": "credits08", + "8032d738": "credits09", + "8032d740": "credits10", + "8032d750": "credits11", + "8032d75c": "credits12", + "8032d764": "credits13", + "8032d774": "credits14", + "8032d77c": "credits15", + "8032d788": "credits16", + "8032d79c": "credits17", + "8032d7ac": "credits18", + "8032d7bc": "credits19", + "8032d7c4": "credits20", + "8032d7cc": "sCreditsSequence", + "8032d93c": "gMarioState", + "8032d940": "unused1", + "8032d944": "D_8032C9E0", + "8032daa0": "sTerrainSounds", + "8032dacc": "sSquishScaleOverTime", + "8032dae0": "sCapFlickerFrames", + "8032daf8": "gWaterSurfacePseudoFloor", + "8032dc50": "sJumpLandAction", + "8032dc68": "sFreefallLandAction", + "8032dc80": "sSideFlipLandAction", + "8032dc98": "sHoldJumpLandAction", + "8032dcb0": "sHoldFreefallLandAction", + "8032dcc8": "sLongJumpLandAction", + "8032dce0": "sDoubleJumpLandAction", + "8032dcf8": "sTripleJumpLandAction", + "8032dd10": "sBackflipLandAction", + "8032dd40": "sPunchingForwardVelocities", + "8032dd80": "gLastCompletedCourseNum", + "8032dd84": "gLastCompletedStarNum", + "8032dd88": "sUnusedGotGlobalCoinHiScore", + "8032dd8c": "gGotFileCoinHiScore", + "8032dd90": "gCurrCourseStarFlags", + "8032dd94": "gSpecialTripleJump", + "8032dd98": "gLevelToCourseNumTable", + "8032ddc0": "gMarioSpawnInfo", + "8032ddc4": "gLoadedGraphNodes", + "8032ddc8": "gAreas", + "8032ddcc": "gCurrentArea", + "8032ddd0": "gCurrCreditsEntry", + "8032ddd4": "D_8032CE74", + "8032ddd8": "D_8032CE78", + "8032dddc": "gWarpTransDelay", + "8032dde0": "gFBSetColor", + "8032dde4": "gWarpTransFBSetColor", + "8032dde8": "gWarpTransRed", + "8032ddec": "gWarpTransGreen", + "8032ddf0": "gWarpTransBlue", + "8032ddf4": "gCurrSaveFileNum", + "8032ddf8": "gCurrLevelNum", + "8032ddfc": "D_8032CE9C", + "8032de4c": "D_8032CEEC", + "8032de60": "D_8032CF00", + "8032de70": "renderModeTable_1Cycle", + "8032deb0": "renderModeTable_2Cycle", + "8032def0": "gCurGraphNodeRoot", + "8032def4": "gCurGraphNodeMasterList", + "8032def8": "gCurGraphNodeCamFrustum", + "8032defc": "gCurGraphNodeCamera", + "8032df00": "gCurGraphNodeObject", + "8032df04": "gCurGraphNodeHeldObject", + "8032df08": "gAreaUpdateCounter", + "8032df10": "gProfilerMode", + "8032df14": "gCurrentFrameIndex1", + "8032df18": "gCurrentFrameIndex2", + "8032df20": "unused8032CFC0", + "8032df24": "gCutsceneFocus", + "8032df28": "unused8032CFC8", + "8032df2c": "unused8032CFCC", + "8032df30": "gSecondCameraFocus", + "8032df34": "sYawSpeed", + "8032df38": "gCurrLevelArea", + "8032df3c": "gPrevLevel", + "8032df40": "unused8032CFE0", + "8032df44": "unused8032CFE4", + "8032df48": "unused8032CFE8", + "8032df4c": "gCameraZoomDist", + "8032df50": "sObjectCutscene", + "8032df54": "gRecentCutscene", + "8032df58": "sFramesSinceCutsceneEnded", + "8032df5c": "sCutsceneDialogResponse", + "8032df60": "sMarioCamState", + "8032df64": "sLuigiCamState", + "8032df68": "unused8032D008", + "8032df6c": "sFixedModeBasePosition", + "8032df78": "sUnusedModeBasePosition_2", + "8032df84": "sUnusedModeBasePosition_3", + "8032df90": "sUnusedModeBasePosition_4", + "8032df9c": "sUnusedModeBasePosition_5", + "8032dfa8": "sModeTransitions", + "8032e008": "unused8032D0A8", + "8032e010": "unused8032D0B0", + "8032e018": "sDanceCutsceneTable", + "8032e024": "unusedDanceInfo1", + "8032e038": "unusedDanceType", + "8032e03c": "unusedDanceInfo2", + "8032e050": "sBBHLibraryParTrackPath", + "8032e098": "sCamSL", + "8032e0e0": "sCamTHI", + "8032e128": "sCamHMC", + "8032e1d0": "sCamSSL", + "8032e248": "sCamRR", + "8032e2f0": "sCamBOB", + "8032e338": "sCamCotMC", + "8032e368": "sCamCCM", + "8032e3b0": "sCamCastle", + "8032e6f8": "sCamBBH", + "8032ecb0": "sCameraTriggers", + "8032ed50": "sIntroStartToPipePosition", + "8032ee08": "sIntroStartToPipeFocus", + "8032eec0": "sIntroPipeToDialogPosition", + "8032ef30": "sIntroPipeToDialogFocus", + "8032efa0": "sEndingFlyToWindowPos", + "8032eff0": "sEndingFlyToWindowFocus", + "8032f048": "sEndingPeachDescentCamPos", + "8032f0e8": "sEndingMarioToPeachPos", + "8032f130": "sEndingMarioToPeachFocus", + "8032f178": "sEndingLookUpAtCastle", + "8032f1b8": "sEndingLookAtSkyFocus", + "8032f214": "gIntroLakituStartToPipeFocus", + "8032f32c": "gIntroLakituStartToPipeOffsetFromCamera", + "8032f444": "gEndWavingPos", + "8032f48c": "gEndWavingFocus", + "8032f4d4": "sCutsceneEnding", + "8032f534": "sCutsceneGrandStar", + "8032f544": "sCutsceneUnused", + "8032f554": "sCutsceneDoorWarp", + "8032f564": "sCutsceneEndWaving", + "8032f56c": "sCutsceneCredits", + "8032f574": "sCutsceneDoorPull", + "8032f59c": "sCutsceneDoorPush", + "8032f5c4": "sCutsceneDoorPullMode", + "8032f5dc": "sCutsceneDoorPushMode", + "8032f5f4": "sCutsceneEnterCannon", + "8032f60c": "sCutsceneStarSpawn", + "8032f624": "sCutsceneRedCoinStarSpawn", + "8032f634": "sCutsceneEnterPainting", + "8032f63c": "sCutsceneDeathExit", + "8032f64c": "sCutsceneExitPaintingSuccess", + "8032f65c": "sCutsceneUnusedExit", + "8032f674": "sCutsceneIntroPeach", + "8032f69c": "sCutscenePrepareCannon", + "8032f6ac": "sCutsceneExitWaterfall", + "8032f6bc": "sCutsceneFallToCastleGrounds", + "8032f6cc": "sCutsceneEnterPyramidTop", + "8032f6dc": "sCutscenePyramidTopExplode", + "8032f6f4": "sCutsceneStandingDeath", + "8032f6fc": "sCutsceneEnterPool", + "8032f70c": "sCutsceneDeathStomach", + "8032f714": "sCutsceneDeathOnBack", + "8032f71c": "sCutsceneQuicksandDeath", + "8032f724": "sCutsceneWaterDeath", + "8032f72c": "sCutsceneSuffocation", + "8032f734": "sCutsceneEnterBowserArena", + "8032f74c": "sCutsceneDanceDefaultRotate", + "8032f754": "sCutsceneDanceFlyAway", + "8032f75c": "sCutsceneDanceCloseup", + "8032f764": "sCutsceneKeyDance", + "8032f76c": "sCutsceneCapSwitchPress", + "8032f774": "sCutsceneSlidingDoorsOpen", + "8032f784": "sCutsceneUnlockKeyDoor", + "8032f794": "sCutsceneExitBowserSuccess", + "8032f7a4": "sCutsceneExitBowserDeath", + "8032f7b4": "sCutsceneExitSpecialSuccess", + "8032f7c4": "sCutsceneNonPaintingDeath", + "8032f7d4": "sCutsceneDialog", + "8032f7ec": "sCutsceneReadMessage", + "8032f804": "sDanceCutsceneIndexTable", + "8032f870": "sZoomOutAreaMasks", + "8032f884": "sBobCreditsSplinePositions", + "8032f8ac": "sBobCreditsSplineFocus", + "8032f8d4": "sWfCreditsSplinePositions", + "8032f8fc": "sWfCreditsSplineFocus", + "8032f924": "sJrbCreditsSplinePositions", + "8032f94c": "sJrbCreditsSplineFocus", + "8032f974": "sCcmSlideCreditsSplinePositions", + "8032f99c": "sCcmSlideCreditsSplineFocus", + "8032f9c4": "sBbhCreditsSplinePositions", + "8032f9e4": "sBbhCreditsSplineFocus", + "8032fa04": "sHmcCreditsSplinePositions", + "8032fa2c": "sHmcCreditsSplineFocus", + "8032fa54": "sThiWigglerCreditsSplinePositions", + "8032fa6c": "sThiWigglerCreditsSplineFocus", + "8032fa84": "sVolcanoCreditsSplinePositions", + "8032fab4": "sVolcanoCreditsSplineFocus", + "8032fae4": "sSslCreditsSplinePositions", + "8032fb14": "sSslCreditsSplineFocus", + "8032fb44": "sDddCreditsSplinePositions", + "8032fb7c": "sDddCreditsSplineFocus", + "8032fbb4": "sSlCreditsSplinePositions", + "8032fbd4": "sSlCreditsSplineFocus", + "8032fbf4": "sWdwCreditsSplinePositions", + "8032fc14": "sWdwCreditsSplineFocus", + "8032fc34": "sTtmCreditsSplinePositions", + "8032fc64": "sTtmCreditsSplineFocus", + "8032fc94": "sThiHugeCreditsSplinePositions", + "8032fccc": "sThiHugeCreditsSplineFocus", + "8032fd04": "sTtcCreditsSplinePositions", + "8032fd24": "sTtcCreditsSplineFocus", + "8032fd44": "sRrCreditsSplinePositions", + "8032fd64": "sRrCreditsSplineFocus", + "8032fd84": "sSaCreditsSplinePositions", + "8032fdac": "sSaCreditsSplineFocus", + "8032fdd4": "sCotmcCreditsSplinePositions", + "8032fdfc": "sCotmcCreditsSplineFocus", + "8032fe24": "sDddSubCreditsSplinePositions", + "8032fe4c": "sDddSubCreditsSplineFocus", + "8032fe74": "sCcmOutsideCreditsSplinePositions", + "8032fe94": "sCcmOutsideCreditsSplineFocus", + "8032fec0": "sObjectListUpdateOrder", + "8032fecc": "sParticleTypes", + "80330000": "D_8032F0A0", + "80330004": "D_8032F0A4", + "80330020": "D_8032F0C0", + "8033002c": "D_8032F0CC", + "8033006c": "sMrIParticleActions", + "80330074": "sMrIActions", + "80330084": "sMrIHitbox", + "80330094": "D_8032F134", + "803300a8": "unused8032F134", + "803300ac": "sCapSwitchActions", + "803300bc": "sKingBobombActions", + "803300e0": "sKingBobombSoundStates", + "80330140": "sOpenedCannonActions", + "8033015c": "unused0EA1FC", + "80330198": "sChuckyaActions", + "803301a8": "sWFRotatingPlatformData", + "803301c0": "sKoopaShellUnderwaterHitbox", + "803301d0": "D_8032F270", + "803301e4": "sSparkleSpawnStarHitbox", + "803301f4": "sYellowCoinHitbox", + "80330204": "D_8032F2A4", + "80330224": "sCoinInsideBooActions", + "8033022c": "D_8032F2CC", + "80330244": "D_8032F2E4", + "80330260": "D_8032F300", + "80330288": "D_8032F328", + "80330290": "D_8032F330", + "80330298": "sGrindelThwompActions", + "803302ac": "sTumblingBridgeParams", + "803302dc": "sTumblingBridgeActions", + "803302ec": "D_8032F38C", + "80330318": "sElevatorActions", + "8033032c": "D_8032F3CC", + "80330340": "D_8032F3E0", + "80330354": "D_8032F3F4", + "8033035c": "D_8032F3FC", + "80330370": "sUkikiCageActions", + "80330380": "D_8032F420", + "80330390": "sSpindriftHitbox", + "803303a0": "sMetalBoxHitbox", + "803303b0": "sBreakableBoxHitbox", + "803303c0": "D_8032F460", + "803303e8": "sHeaveHoActions", + "803303f8": "sJumpingBoxHitbox", + "80330408": "sJumpingBoxActions", + "8033042c": "sBowserKeyHitbox", + "8033043c": "sBulletBillActions", + "80330450": "sBowserTailAnchorActions", + "8033045c": "D_8032F4FC", + "8033046c": "D_8032F50C", + "80330470": "D_8032F510", + "80330474": "D_8032F514", + "80330478": "sBowserDefeatedDialogText", + "80330480": "D_8032F520", + "803304c8": "sBowserActions", + "80330518": "D_8032F5B8", + "803305f0": "D_8032F690", + "803305f4": "D_8032F694", + "803305f8": "D_8032F698", + "8033067c": "sFallingBowserPlatformActions", + "80330688": "sGrowingBowserFlameHitbox", + "80330698": "sBowserFlameHitbox", + "803306a8": "D_8032F748", + "803306b4": "D_8032F754", + "803306dc": "sCageUkikiPath", + "80330738": "sUkikiSoundStates", + "803307a0": "sUkikiActions", + "803307c0": "D_8032F860", + "803307f4": "D_8032F894", + "80330828": "D_8032F8C8", + "80330830": "sRotatingCwFireBarsActions", + "80330840": "sKoopaShellHitbox", + "80330850": "D_8032F8F0", + "80330884": "D_8032F924", + "803308a8": "D_8032F948", + "803308cc": "D_8032F96C", + "803308d8": "sToxBoxActions", + "80330900": "TablePiranhaPlantActions", + "80330b1c": "sBowserPuzzlePieceActions", + "80330b38": "sTuxiesMotherActions", + "80330b44": "sSmallPenguinActions", + "80330b5c": "sFishActions", + "80330b68": "sFishGroupActions", + "80330b74": "sBirdChirpChirpActions", + "80330b84": "sCheepCheepActions", + "80330b90": "sExclamationBoxHitbox", + "80330ba0": "sExclamationBoxContents", + "80330c20": "sExclamationBoxActions", + "80330c38": "sSkullSlidingBoxHitbox", + "80330c48": "D_8032FCE8", + "80330c58": "sTweesterHitbox", + "80330c68": "sTweesterActions", + "80330cd4": "sScuttlebugHitbox", + "80330ce4": "sWhompActions", + "80330d0c": "D_8032FDAC", + "80330d30": "D_8032FDD0", + "80330d54": "D_8032FDF4", + "80330d78": "D_8032FE18", + "80330d9c": "sWindParticleHitbox", + "80330dac": "D_8032FE4C", + "80330e20": "D_8032FEC0", + "80330e24": "unused_8032FEC4", + "80330e34": "gMarioPlatform", + "80330e40": "sDebugEffectStringInfo", + "80330e64": "sDebugEnemyStringInfo", + "80330e88": "sDebugInfoDPadMask", + "80330e8c": "sDebugInfoDPadUpdID", + "80330e90": "sDebugLvSelectCheckFlag", + "80330e94": "sDebugPage", + "80330e98": "sNoExtraDebug", + "80330e9c": "sDebugStringArrPrinted", + "80330ea0": "sDebugSysCursor", + "80330ea4": "sDebugInfoButtonSeqID", + "80330ea8": "sDebugInfoButtonSeq", + "80330ec0": "sTransitionColorFadeCount", + "80330ec4": "sTransitionTextureFadeCount", + "80330ec8": "sTextureTransitionID", + "80330ee0": "rectangles", + "80330f00": "sSkyboxTextures", + "80330f28": "sSkyboxColors", + "80330f30": "gMovtexCounter", + "80330f34": "gMovtexCounterPrev", + "80330f38": "gMovtexVtxColor", + "80330f3c": "gPaintingMarioYEntry", + "80330f40": "gWdwWaterLevelSet", + "80330f44": "gMovtexIdToTexture", + "80330f64": "gMovtexNonColored", + "803311a4": "gMovtexColored", + "8033127c": "gMovtexColored2", + "80331300": "hmcPaintings", + "80331308": "insideCastlePaintings", + "80331344": "ttmPaintings", + "8033134c": "paintingGroups", + "80331358": "gPaintingUpdateCounter", + "8033135c": "gLastPaintingUpdateCounter", + "80331360": "sTextLabelsCount", + "80331370": "gDialogCharWidths", + "80331470": "gDialogBoxState", + "80331474": "gDialogBoxOpenTimer", + "80331478": "gDialogBoxScale", + "8033147c": "gDialogScrollOffsetY", + "80331480": "gDialogBoxType", + "80331484": "gDialogID", + "80331488": "gLastDialogPageStrPos", + "8033148c": "gDialogTextPos", + "80331490": "gDialogLineNum", + "80331494": "gLastDialogResponse", + "80331498": "gMenuHoldKeyIndex", + "8033149c": "gMenuHoldKeyTimer", + "803314a0": "gDialogResponse", + "803314b0": "gHudSymCoin", + "803314b4": "gHudSymX", + "803314f8": "gMenuMode", + "803314fc": "gEndCutsceneStrEn0", + "80331504": "gEndCutsceneStrEn1", + "80331538": "gEndCutsceneStrEn2", + "80331558": "gEndCutsceneStrEn3", + "8033156c": "gEndCutsceneStrEn4", + "80331598": "gEndCutsceneStrEn5", + "803315ac": "gEndCutsceneStrEn6", + "803315cc": "gEndCutsceneStrEn7", + "803315dc": "gEndCutsceneStrEn8", + "803315e4": "gEndCutsceneStringsEn", + "8033160c": "gCutsceneMsgFade", + "80331610": "gCutsceneMsgIndex", + "80331614": "gCutsceneMsgDuration", + "80331618": "gCutsceneMsgTimer", + "8033161c": "gDialogCameraAngleIndex", + "80331620": "gDialogCourseActNum", + "803316c8": "gCourseCompleteCoinsEqual", + "803316cc": "gCourseDoneMenuTimer", + "803316d0": "gCourseCompleteCoins", + "803316d4": "gHudFlash", + "80331750": "gEnvFxMode", + "80331754": "D_80330644", + "80331758": "gSnowTempVtx", + "80331788": "gSnowFlakeVertex1", + "80331790": "gSnowFlakeVertex2", + "80331798": "gSnowFlakeVertex3", + "803317a0": "D_80330690", + "803317a4": "D_80330694", + "803317a8": "gBubbleTempVtx", + "803317e0": "MacroObjectPresets", + "803325fc": "sPowerMeterVisibleTimer", + "80332614": "sPrevCheckMarioRoom", + "80332618": "sYoshiDead", + "8033261c": "sDebugSequenceTracker", + "80332620": "sDebugTimer", + "803327a8": "sBreakableBoxSmallHitbox", + "80332b00": "sMrBlizzardHitbox", + "80332b10": "D_80331A00", + "80332b24": "sMrBlizzardSnowballHitbox", + "80332b34": "D_80331A24", + "80332b54": "D_80331A44", + "80332b5c": "D_80331A4C", + "80332b64": "D_80331A54", + "80332bdc": "D_80331ACC", + "80332bf0": "sRecoveryHeartHitbox", + "80332c00": "sUnagiHitbox", + "80332c10": "sHauntedChairHitbox", + "80332c30": "sFlyingBookendHitbox", + "80332c40": "D_80331B30", + "80332c4c": "sBookSwitchHitbox", + "80332c5c": "sFirePiranhaPlantHitbox", + "80332c6c": "D_80331B5C", + "80332c74": "sPiranhaPlantFireHitbox", + "80332c84": "sSnufitHitbox", + "80332c94": "sSnufitBulletHitbox", + "80332ca4": "sEyerokHitbox", + "80332cb4": "D_80331BA4", + "80332d10": "coffinRelativePos", + "80332d28": "sClamShellHitbox", + "80332d38": "sSkeeterHitbox", + "80332d48": "D_80331C38", + "80332e50": "gAudioErrorFlags", + "80332e54": "sGameLoopTicked", + "80332e58": "sDialogSpeaker", + "80332f04": "sDialogSpeakerVoice", + "80332f40": "sNumProcessedSoundRequests", + "80332f44": "sSoundRequestCount", + "80332f48": "sDynBbh", + "80332f54": "sDynDdd", + "80332f6c": "sDynJrb", + "80332f88": "sDynWdw", + "80332f98": "sDynHmc", + "80332fa8": "sDynUnk38", + "80332fb8": "sDynNone", + "80332fbc": "sCurrentMusicDynamic", + "80332fc0": "sBackgroundMusicForDynamics", + "80332fc4": "sLevelDynamics", + "80333060": "sMusicDynamics", + "803330c0": "gAreaEchoLevel", + "80333138": "D_80332028", + "80333188": "sBackgroundMusicDefaultVolume", + "803331ac": "sPlayer0CurSeqId", + "803331b0": "sMusicDynamicDelay", + "803331b4": "D_803320A4", + "803331c0": "D_803320B0", + "803331cc": "D_803320BC", + "803331d8": "sMaxChannelsForSoundBank", + "803331e4": "sNumSoundsPerBank", + "803331f0": "gDefaultSoundArgs", + "803331fc": "sUnusedSoundArgs", + "80333208": "sSoundBankDisabled", + "80333218": "D_80332108", + "8033321c": "sHasStartedFadeOut", + "80333220": "D_80332110", + "80333224": "sUnused80332114", + "80333228": "sUnused80332118", + "8033322c": "D_8033211C", + "80333230": "D_80332120", + "80333234": "D_80332124", + "80333238": "sBackgroundMusicQueueSize", + "8033323c": "sUnused8033323C", + "803332a0": "gAudioSessionPresets", + "80333498": "gAudioCosineTable", + "80333598": "gPitchBendFrequencyScale", + "80333994": "gNoteFrequencies", + "80333b94": "gDefaultShortNoteVelocityTable", + "80333ba4": "gDefaultShortNoteDurationTable", + "80333bb4": "gVibratoCurve", + "80333bc4": "gDefaultEnvelope", + "80333bd0": "sSineWave", + "80333c50": "sSquareWave", + "80333cd0": "sTriangleWave", + "80333d50": "sSawtoothWave", + "80333dd0": "gWaveSamples", + "80333de0": "gHeadsetPanQuantization", + "80333df4": "gHeadsetPanVolume", + "80333ff4": "gStereoPanVolume", + "803341f4": "gDefaultPanVolume", + "803343f4": "gVolRampingLhs136", + "803345f4": "gVolRampingRhs136", + "803347f4": "gVolRampingLhs144", + "803349f4": "gVolRampingRhs144", + "80334bf4": "gVolRampingLhs128", + "80334df4": "gVolRampingRhs128", + "80334ff4": "gTatumsPerBeat", + "80334ff8": "gUnusedCount80333EE8", + "80334ffc": "gAudioHeapSize", + "80335000": "D_80333EF0", + "80335004": "gAudioLoadLock", + "80335008": "sUnused8033EF8", + "80335010": "osViModeTable", + "803358f0": "piMgrArgs", + "80335910": "osClockRate", + "80335918": "D_80334808", + "80335920": "D_80334810", + "80335930": "D_80334820", + "80335940": "D_80334830", + "80335950": "_spaces", + "80335974": "_zeroes", + "803359a0": "D_80334890", + "803359a4": "unknown", + "803359a8": "D_80334898", + "803359ac": "D_8033489C", + "803359b0": "D_803348A0", + "803359b4": "D_803348A4", + "803359c0": "D_803348B0", + "80335a20": "D_80334910", + "80335a24": "D_80334914", + "80335a28": "D_80334918", + "80335a2c": "D_8033491C", + "80335a30": "D_80334920", + "80335a44": "D_80334934", + "80335a48": "D_80334938", + "80335a50": "gOsPiAccessQueueCreated", + "80335a60": "gOsSiAccessQueueCreated", + "80335aa0": "D_80334990", + "80335af0": "D_803349E0", + "80335b40": "D_80334A30", + "80335b44": "D_80334A34", + "80335b48": "D_80334A38", + "80335b50": "D_80334A40", + "80335b54": "D_80334A44", + "80338da0": "D_80337BB0", + "80338da8": "D_80337BB8", + "80338e60": "jtbl_80337C90", + "80338e84": "jtbl_80337CB4", + "80338eac": "jtbl_80337CDC", + "80338ec0": "jtbl_80337D08", + "80338fbc": "jtbl_80337E04", + "8033978c": "jtbl_80338418", + "80339880": "length_str", + "80339884": "flags_str", + "8033988c": "flags_arr", + "80339980": "D_80338610", + "803399a0": "jtbl_80338630", + "803399d0": "NAN", + "803399e0": "D_80338670", + "80339a40": "D_803386D0", + "80339ac0": "rspF3DDataStart", + "8033a2c0": "rspF3DDataEnd", + "8033a2c0": "rspAspMainDataStart", + "8033a580": "rspAspMainDataEnd", + "8033a580": "_mainSegmentEnd", + "008c0c40": "_mainSegmentRomEnd", + "8033a580": "_mainSegmentNoloadStart", + "8033a580": "D_80339210", + "8033a730": "gIdleThread", + "8033a8e0": "gMainThread", + "8033aa90": "gGameLoopThread", + "8033ac40": "gSoundThread", + "8033adf0": "gPIMesgQueue", + "8033ae08": "gIntrMesgQueue", + "8033ae20": "gSPTaskMesgQueue", + "8033ae38": "gDmaMesgBuf", + "8033ae40": "gPIMesgBuf", + "8033aec0": "gSIEventMesgBuf", + "8033aec8": "gIntrMesgBuf", + "8033af08": "gUnknownMesgBuf", + "8033af48": "gDmaIoMesg", + "8033af5c": "D_80339BEC", + "8033af60": "gDmaMesgQueue", + "8033af78": "gSIEventMesgQueue", + "8033af90": "gControllers", + "8033afe8": "gControllerStatuses", + "8033aff8": "gControllerPads", + "8033b010": "gGameVblankQueue", + "8033b028": "D_80339CB8", + "8033b040": "D_80339CD0", + "8033b044": "D_80339CD4", + "8033b048": "gGameVblankHandler", + "8033b050": "gPhysicalFrameBuffers", + "8033b05c": "gPhysicalZBuffer", + "8033b060": "D_80339CF0", + "8033b064": "D_80339CF4", + "8033b068": "gGfxSPTask", + "8033b06c": "gDisplayListHead", + "8033b070": "gGfxPoolEnd", + "8033b074": "gGfxPool", + "8033b078": "gControllerBits", + "8033b079": "gEepromProbe", + "8033b080": "D_80339D10", + "8033b090": "gDemo", + "8033b0a0": "filler80339D30", + "8033b170": "gMarioStates", + "8033b238": "sCurrPlayMode", + "8033b23a": "D_80339ECA", + "8033b23c": "sTransitionTimer", + "8033b240": "sTransitionUpdate", + "8033b244": "unused3", + "8033b248": "sWarpDest", + "8033b250": "D_80339EE0", + "8033b252": "sDelayedWarpOp", + "8033b254": "sDelayedWarpTimer", + "8033b256": "sSourceWarpNodeId", + "8033b258": "sDelayedWarpArg", + "8033b25c": "unused4", + "8033b25e": "sTimerRunning", + "8033b260": "gHudDisplay", + "8033b26e": "gShouldNotPlayCastleMusic", + "8033b270": "sDelayInvincTimer", + "8033b272": "sInvulnerable", + "8033b280": "unused80339F10", + "8033b288": "filler80339F1C", + "8033b2c0": "D_80339F50", + "8033b350": "gMirrorMario", + "8033b3b0": "gBodyStates", + "8033b400": "sSegmentTable", + "8033b480": "sPoolFreeSpace", + "8033b484": "sPoolStart", + "8033b488": "sPoolEnd", + "8033b48c": "sPoolListHeadL", + "8033b490": "sPoolListHeadR", + "8033b494": "gEffectsMemoryPool", + "8033b4a0": "gWarpCheckpoint", + "8033b4a5": "gMainMenuDataModified", + "8033b4a6": "gSaveFileModified", + "8033b4b0": "gPlayerSpawnInfos", + "8033b4d0": "D_8033A160", + "8033b8d0": "gAreaData", + "8033bab0": "gWarpTransition", + "8033bac6": "gCurrCourseNum", + "8033bac8": "gCurrActNum", + "8033baca": "gCurrAreaIndex", + "8033bacc": "gSavedCourseNum", + "8033bace": "gPauseScreenMode", + "8033bad0": "gSaveOptSelectIndex", + "8033bae0": "gMatStackIndex", + "8033bae8": "gMatStack", + "8033c2e8": "gMatStackFixed", + "8033c368": "gGeoTempState", + "8033c378": "gCurAnimType", + "8033c379": "gCurAnimEnabled", + "8033c37a": "gCurrAnimFrame", + "8033c37c": "gCurAnimTranslationMultiplier", + "8033c380": "gCurrAnimAttribute", + "8033c384": "gCurAnimData", + "8033c388": "gDisplayListHeap", + "8033c390": "gProfilerFrameData", + "8033c520": "gPlayerCameraState", + "8033c568": "sOldPosition", + "8033c578": "sOldFocus", + "8033c588": "sPlayer2FocusOffset", + "8033c594": "sCreditsPlayer2Pitch", + "8033c596": "sCreditsPlayer2Yaw", + "8033c598": "sFramesPaused", + "8033c5a0": "sFOVState", + "8033c5c0": "sModeTransition", + "8033c5e8": "sMarioGeometry", + "8033c61c": "unusedFreeRoamWallYaw", + "8033c61e": "sAvoidYawVel", + "8033c620": "sCameraYawAfterDoorCutscene", + "8033c622": "unusedSplinePitch", + "8033c624": "unusedSplineYaw", + "8033c628": "sHandheldShakeSpline", + "8033c668": "sHandheldShakeMag", + "8033c66c": "sHandheldShakeTimer", + "8033c670": "sHandheldShakeInc", + "8033c674": "sHandheldShakePitch", + "8033c676": "sHandheldShakeYaw", + "8033c678": "sHandheldShakeRoll", + "8033c67c": "unused8033B30C", + "8033c680": "unused8033B310", + "8033c684": "sSelectionFlags", + "8033c686": "unused8033B316", + "8033c688": "s2ndRotateFlags", + "8033c68a": "unused8033B31A", + "8033c68c": "sCameraSoundFlags", + "8033c68e": "sCButtonsPressed", + "8033c690": "sCutsceneDialogID", + "8033c698": "gLakituState", + "8033c758": "unused8033B3E8", + "8033c75a": "sAreaYaw", + "8033c75c": "sAreaYawChange", + "8033c75e": "sLakituDist", + "8033c760": "sLakituPitch", + "8033c764": "sZoomAmount", + "8033c768": "sCSideButtonYaw", + "8033c76a": "sBehindMarioSoundTimer", + "8033c76c": "sZeroZoomDist", + "8033c770": "sCUpCameraPitch", + "8033c772": "sModeOffsetYaw", + "8033c774": "sSpiralStairsYawOffset", + "8033c776": "s8DirModeBaseYaw", + "8033c778": "s8DirModeYawOffset", + "8033c77c": "sPanDistance", + "8033c780": "sCannonYOffset", + "8033c788": "sModeInfo", + "8033c7d0": "sCastleEntranceOffset", + "8033c7dc": "sParTrackIndex", + "8033c7e0": "sParTrackPath", + "8033c7e8": "sParTrackTransOff", + "8033c808": "sCameraStoreCUp", + "8033c828": "sCameraStoreCutscene", + "8033c848": "gCameraMovementFlags", + "8033c84a": "sStatusFlags", + "8033c850": "sCurCreditsSplinePos", + "8033c950": "sCurCreditsSplineFocus", + "8033ca50": "sCutsceneSplineSegment", + "8033ca54": "sCutsceneSplineSegmentProgress", + "8033ca58": "unused8033B6E8", + "8033ca5a": "sCutsceneShot", + "8033ca5c": "gCutsceneTimer", + "8033ca60": "sCutsceneVars", + "8033cbc8": "gObjCutsceneDone", + "8033cbcc": "gCutsceneObjSpawn", + "8033cbd0": "gCamera", + "8033cbe0": "gObjectListArray", + "8033d260": "gDebugInfoFlags", + "8033d264": "gNumFindFloorMisses", + "8033d268": "unused_8033BEF8", + "8033d26c": "gUnknownWallCount", + "8033d270": "gObjectCounter", + "8033d274": "gNumCalls", + "8033d280": "gDebugInfo", + "8033d380": "gDebugInfoOverwrite", + "8033d480": "gTimeStopState", + "8033d488": "gObjectPool", + "80360e88": "gMacroObjectDefaultParent", + "803610e8": "gObjectLists", + "803610f0": "gFreeObjectList", + "80361158": "gMarioObject", + "8036115c": "gLuigiObject", + "80361160": "gCurrentObject", + "80361164": "gBehCommand", + "80361168": "gPrevFrameObjectCount", + "8036116c": "gSurfaceNodesAllocated", + "80361170": "gSurfacesAllocated", + "80361174": "gNumStaticSurfaceNodes", + "80361178": "gNumStaticSurfaces", + "8036117c": "gObjectMemoryPool", + "80361180": "gCheckingSurfaceCollisionsForCamera", + "80361182": "gFindFloorIncludeSurfaceIntangible", + "80361184": "gEnvironmentRegions", + "80361188": "gEnvironmentLevels", + "803611d8": "gDoorAdjacentRooms", + "80361250": "gMarioCurrentRoom", + "80361252": "D_8035FEE2", + "80361254": "D_8035FEE4", + "80361256": "gTHIWaterDrained", + "80361258": "gTTCSpeedSetting", + "8036125a": "gMarioShotFromCannon", + "8036125c": "gCCMEnteredSlide", + "8036125e": "gNumRoomedObjectsInMarioRoom", + "80361260": "gNumRoomedObjectsNotInMarioRoom", + "80361262": "gWDWWaterLevelChanging", + "80361264": "gMarioOnMerryGoRound", + "80361270": "sGrabReleaseState", + "80361280": "D_8035FF10", + "80361290": "gDebugPrintState1", + "803612a0": "gDebugPrintState2", + "803612b0": "sMarioOnFlyingCarpet", + "803612b2": "sSurfaceTypeBelowShadow", + "803612b4": "gShadowAboveWaterOrLava", + "803612b5": "gMarioOnIceOrCarpet", + "803612c0": "sSkyBoxInfo", + "803612e0": "gMovetexLastTextureId", + "803612f0": "gFlyingCarpetState", + "80361300": "gPaintingMarioFloorType", + "80361304": "gPaintingMarioXPos", + "80361308": "gPaintingMarioYPos", + "8036130c": "gPaintingMarioZPos", + "80361310": "D_8035FFA0", + "80361314": "D_8035FFA4", + "80361318": "ripplingPainting", + "8036131c": "dddStatus", + "80361320": "sTextLabels", + "803613f0": "gDialogColorFadeTimer", + "803613f2": "gLastDialogLineNum", + "803613f4": "gDialogVariable", + "803613f8": "gDialogTextAlpha", + "803613fa": "gCutsceneMsgXOffset", + "803613fc": "gCutsceneMsgYOffset", + "803613fe": "gRedCoinsCollected", + "80361400": "gEnvFxBuffer", + "80361408": "gSnowCylinderLastPos", + "80361414": "gSnowParticleCount", + "80361416": "gSnowParticleMaxCount", + "80361420": "gEnvFxBubbleConfig", + "80361460": "sNumActiveFirePiranhaPlants", + "80361464": "sNumKilledFirePiranhaPlants", + "80361468": "sObjSavedPosX", + "8036146c": "sObjSavedPosY", + "80361470": "sObjSavedPosZ", + "80361474": "sMontyMoleHoleList", + "80361478": "sMontyMoleKillStreak", + "8036147c": "sMontyMoleLastKilledPosX", + "80361480": "sMontyMoleLastKilledPosY", + "80361484": "sMontyMoleLastKilledPosZ", + "80361488": "sMasterTreadmill", + "80361490": "gCurrAiBuffer", + "80361498": "sSoundRequests", + "80361c98": "D_80360928", + "80361f98": "sUsedChannelsForSoundBank", + "80361fa8": "sCurrentSound", + "80361fb8": "gSoundBanks", + "80364b78": "D_80363808", + "80364b82": "D_80363812", + "80364b88": "sBackgroundMusicQueue", + "80364ba0": "D_80363830", + "80364c20": "D_803638B0", + "80365e70": "piMgrThread", + "80366020": "piMgrStack", + "80367020": "__osPiMesgQueue", + "80367038": "piMgrMesgBuff", + "80367040": "D_80365CD0", + "80367050": "D_80365CE0", + "8036708c": "D_80365D1C", + "80367090": "D_80365D20", + "80367091": "_osCont_numControllers", + "80367098": "D_80365D28", + "803670b8": "_osContMesgQueue", + "803670d0": "_osContMesgBuff", + "803670f0": "D_80365D80", + "80367110": "_osCurrentTime", + "80367118": "D_80365DA8", + "8036711c": "__osViIntrCount", + "80367120": "D_80365DB0", + "80367130": "osPiMesgBuff", + "80367138": "gOsPiMessageQueue", + "80367150": "osSiMesgBuff", + "80367158": "gOsSiMessageQueue", + "80367170": "D_80365E00", + "803671ac": "D_80365E3C", + "803671b0": "D_80365E40", + "803672b0": "gInterruptedThread", + "80367460": "_mainSegmentNoloadEnd", + "0000cee0": "_mainSegmentNoloadSizeLo", + "00000002": "_mainSegmentNoloadSizeHi", + "00000001": "ASSERT", + "80378800": "_engineSegmentStart", + "007cc6c0": "_engineSegmentRomStart", + "80378800": "vec3f_copy", + "80378840": "vec3f_set", + "8037888c": "vec3f_add", + "803788e4": "vec3f_sum", + "8037893c": "vec3s_copy", + "8037897c": "vec3s_set", + "803789c8": "vec3s_add", + "80378a20": "vec3s_sum", + "80378a78": "vec3s_sub", + "80378ad0": "vec3s_to_vec3f", + "80378b34": "vec3f_to_vec3s", + "80378c50": "find_vector_perpendicular_to_plane", + "80378d38": "vec3f_cross", + "80378dc0": "vec3f_normalize", + "80378e68": "mtxf_copy", + "80378eb4": "mtxf_identity", + "80378f24": "mtxf_translate", + "80378f84": "mtxf_lookat", + "80379440": "mtxf_rotate_zxy_and_translate", + "803795f0": "mtxf_rotate_xyz_and_translate", + "80379798": "mtxf_billboard", + "80379918": "mtxf_align_terrain_normal", + "80379aa4": "mtxf_align_terrain_triangle", + "80379f60": "mtxf_mul", + "8037a29c": "mtxf_scale_vec3f", + "8037a348": "mtxf_mul_vec3s", + "8037a434": "mtxf_to_mtx", + "8037a4b8": "mtxf_rotate_xy", + "8037a550": "get_pos_from_transform_mtx", + "8037a69c": "vec3f_get_dist_and_angle", + "8037a788": "vec3f_set_dist_and_angle", + "8037a860": "approach_s32", + "8037a8b4": "approach_f32", + "8037a9a8": "atan2s", + "8037ab88": "atan2f", + "8037abec": "spline_get_weights", + "8037afb8": "anim_spline_init", + "8037afe8": "anim_spline_poll", + "8037b220": "init_scene_graph_node_links", + "8037b24c": "init_graph_node_root", + "8037b30c": "init_graph_node_ortho_projection", + "8037b380": "init_graph_node_perspective", + "8037b448": "init_graph_node_start", + "8037b4ac": "init_graph_node_master_list", + "8037b530": "init_graph_node_render_range", + "8037b5b4": "init_graph_node_switch_case", + "8037b670": "init_graph_node_camera", + "8037b744": "init_graph_node_translation_rotation", + "8037b7f8": "init_graph_node_translation", + "8037b89c": "init_graph_node_rotation", + "8037b940": "init_graph_node_scale", + "8037b9e0": "init_graph_node_object", + "8037bad4": "init_graph_node_culling_radius", + "8037bb48": "init_graph_node_animated_part", + "8037bbec": "init_graph_node_billboard", + "8037bc90": "init_graph_node_display_list", + "8037bd24": "init_graph_node_shadow", + "8037bdb4": "init_graph_node_object_parent", + "8037be28": "init_graph_node_generated", + "8037becc": "init_graph_node_background", + "8037bf84": "init_graph_node_held_object", + "8037c044": "geo_add_child", + "8037c0bc": "geo_remove_child", + "8037c138": "geo_make_first_child", + "8037c1e4": "geo_call_global_function_nodes_helper", + "8037c360": "geo_call_global_function_nodes", + "8037c3d0": "geo_reset_object_node", + "8037c448": "geo_obj_init", + "8037c51c": "geo_obj_init_spawninfo", + "8037c658": "geo_obj_init_animation", + "8037c708": "geo_obj_init_animation_accel", + "8037c7d8": "retrieve_animation_index", + "8037c844": "geo_update_animation_frame", + "8037c9e8": "geo_retreive_animation_translation", + "8037cb10": "geo_find_root", + "8037cb60": "read_vec3s_to_vec3f", + "8037cbc0": "read_vec3s", + "8037cbfc": "read_vec3s_angle", + "8037cc74": "register_scene_graph_node", + "8037cd60": "geo_layout_cmd_branch_and_link", + "8037ce24": "geo_layout_cmd_end", + "8037cee8": "geo_layout_cmd_branch", + "8037cf70": "geo_layout_cmd_return", + "8037cfc0": "geo_layout_cmd_open_node", + "8037d018": "geo_layout_cmd_close_node", + "8037d050": "geo_layout_cmd_assign_as_view", + "8037d0d0": "geo_layout_cmd_update_node_flags", + "8037d1d0": "geo_layout_cmd_node_root", + "8037d328": "geo_layout_cmd_node_ortho_projection", + "8037d3a4": "geo_layout_cmd_node_perspective", + "8037d48c": "geo_layout_cmd_node_start", + "8037d4dc": "geo_layout_cmd_nop3", + "8037d500": "geo_layout_cmd_node_master_list", + "8037d55c": "geo_layout_cmd_node_level_of_detail", + "8037d5d4": "geo_layout_cmd_node_switch_case", + "8037d640": "geo_layout_cmd_node_camera", + "8037d6f0": "geo_layout_cmd_node_translation_rotation", + "8037d8d4": "geo_layout_cmd_node_translation", + "8037d998": "geo_layout_cmd_node_rotation", + "8037da5c": "geo_layout_cmd_node_scale", + "8037db50": "geo_layout_cmd_nop2", + "8037db74": "geo_layout_cmd_node_animated_part", + "8037dc10": "geo_layout_cmd_node_billboard", + "8037dcd4": "geo_layout_cmd_node_display_list", + "8037dd4c": "geo_layout_cmd_node_shadow", + "8037dddc": "geo_layout_cmd_node_object_parent", + "8037de34": "geo_layout_cmd_node_generated", + "8037de94": "geo_layout_cmd_node_background", + "8037def8": "geo_layout_cmd_nop", + "8037df1c": "geo_layout_cmd_copy_view", + "8037dfd4": "geo_layout_cmd_node_held_obj", + "8037e058": "geo_layout_cmd_node_culling_radius", + "8037e0b4": "process_geo_layout", + "803805c8": "level_script_execute", + "80380de8": "f32_find_wall_collision", + "80380e8c": "find_wall_collisions", + "80381264": "find_ceil", + "80381470": "unused_obj_find_floor_height", + "803814b8": "find_floor_height_and_data", + "80381794": "find_floor_height", + "803817e0": "unused_find_dynamic_floor", + "80381900": "find_floor", + "80381ba0": "find_water_level", + "80381d3c": "find_poison_gas_level", + "80381f08": "debug_surface_list_info", + "80382294": "unused_resolve_floor_or_ceil_collisions", + "80383340": "alloc_surface_pools", + "803833b8": "load_area_terrain", + "803835a4": "clear_dynamic_surfaces", + "80383614": "transform_object_vertices", + "80383828": "load_object_surfaces", + "803839cc": "load_object_collision_model", + "80383bb0": "RandomU16", + "80383cb4": "RandomFloat", + "80383d1c": "RandomSign", + "80383d68": "func_80383D68", + "80385bf0": "stub_80385BF0", + "80385c00": "cur_object_exec_behavior", + "80385f90": "identityMtx", + "80385fb0": "zeroMtx", + "80385fd0": "gVec3fZero", + "80385fdc": "gVec3sZero", + "80385fe4": "gVec3fOne", + "80385ff0": "gVec3sOne", + "80386000": "gSineTable", + "80387000": "gCosineTable", + "8038b000": "gArctanTable", + "8038b810": "GeoLayoutJumpTable", + "8038b894": "unused_8038B894", + "8038bc90": "_engineSegmentEnd", + "007dfb50": "_engineSegmentRomEnd", + "8038bc90": "_engineSegmentNoloadStart", + "8038bc90": "gSplineKeyframe", + "8038bc94": "gSplineKeyframeFraction", + "8038bc98": "gSplineState", + "8038bca0": "gGraphNodePool", + "8038bca4": "gCurRootGraphNode", + "8038bca8": "D_8038BCA8", + "8038bcac": "gGeoViews", + "8038bcb0": "gGeoNumViews", + "8038bcb8": "gGeoLayoutStack", + "8038bcf8": "gCurGraphNodeList", + "8038bd78": "gCurGraphNodeIndex", + "8038bd7a": "gGeoLayoutStackIndex", + "8038bd7c": "D_8038BD7C", + "8038bd7e": "gGeoLayoutReturnIndex", + "8038bd80": "gGeoLayoutCommand", + "8038bd88": "gObjParentGraphNode", + "8038be30": "sFloorGeo", + "8038be90": "unused8038BE90", + "8038be98": "gStaticSurfacePartition", + "8038d698": "gDynamicSurfacePartition", + "8038ee98": "sSurfaceNodePool", + "8038ee9c": "sSurfacePool", + "8038eea0": "sSurfacePoolSize", + "8038eea8": "unused8038EEA8", + "8038eef0": "_engineSegmentNoloadEnd", + "8038f800": ".", + "8038f800": "_framebuffersSegmentNoloadStart", + "8038f800": "0x70800", + "8038f800": "gFrameBuffer0", + "803b5000": "gFrameBuffer1", + "803da800": "gFrameBuffer2", + "80400000": "_framebuffersSegmentNoloadEnd", + "80400000": "__expansionRamStart", + "00000001": "ASSERT", + "10000000": "_entrySegmentStart", + "007cc6c0": "_entrySegmentRomStart", + "10000000": "level_script_entry", + "10000030": "_entrySegmentEnd", + "007cc6f0": "_entrySegmentRomEnd", + "02000000": "_segment2_mio0SegmentStart", + "007cc6c0": "_segment2_mio0SegmentRomStart", + "0200bd10": ".", + "0200bd10": "_segment2_mio0SegmentEnd", + "007d83d0": "_segment2_mio0SegmentRomEnd", + "04000000": "_group0_mio0SegmentStart", + "007cc6c0": "_group0_mio0SegmentRomStart", + "04013260": ".", + "04013260": "_group0_mio0SegmentEnd", + "007df920": "_group0_mio0SegmentRomEnd", + "17000000": "_group0_geoSegmentStart", + "007cc6c0": "_group0_geoSegmentRomStart", + "17000000": "bubble_geo", + "1700001c": "purple_marble_geo", + "17000038": "smoke_geo", + "17000084": "burn_smoke_geo", + "1700009c": "spot_on_ground_geo", + "170000e0": "mario_TODO_geo_0000E0", + "17000124": "water_waves_surface_geo", + "17000168": "water_waves_geo", + "170001bc": "sparkles_geo", + "17000230": "water_splash_geo", + "17000284": "sparkles_animation_geo", + "170002e0": "mario_geo_face_and_wings", + "1700041c": "mario_geo_left_hand", + "17000494": "mario_geo_right_hand", + "1700053c": "mario_geo_body", + "170006f8": "mario_geo_medium_poly_left_hand", + "17000770": "mario_geo_medium_poly_right_hand", + "17000818": "mario_geo_medium_poly_body", + "170009d4": "mario_geo_low_poly_face_and_wings", + "17000b10": "mario_geo_low_poly_left_hand", + "17000b88": "mario_geo_low_poly_right_hand", + "17000c30": "mario_geo_low_poly_body", + "17000dec": "mario_vanish_geo_face_and_wings", + "17000f28": "mario_vanish_geo_left_hand", + "17000fa0": "mario_vanish_geo_right_hand", + "17001048": "mario_vanish_geo_body", + "17001204": "mario_vanish_geo_medium_poly_left_hand", + "1700127c": "mario_vanish_geo_medium_poly_right_hand", + "17001324": "mario_vanish_geo_medium_poly_body", + "170014e0": "mario_vanish_geo_low_poly_face_and_wings", + "1700161c": "mario_vanish_geo_low_poly_left_hand", + "17001694": "mario_vanish_geo_low_poly_right_hand", + "1700173c": "mario_vanish_geo_low_poly_body", + "170018f8": "mario_metal_geo_face_and_wings", + "170019a4": "mario_metal_geo_left_hand", + "17001a1c": "mario_metal_geo_right_hand", + "17001ac4": "mario_metal_geo_body", + "17001c80": "mario_metal_geo_medium_poly_left_hand", + "17001cf8": "mario_metal_geo_medium_poly_right_hand", + "17001da0": "mario_metal_geo_medium_poly_body", + "17001f5c": "mario_metal_geo_low_poly_face_and_wings", + "17002008": "mario_metal_geo_low_poly_left_hand", + "17002080": "mario_metal_geo_low_poly_right_hand", + "17002128": "mario_metal_geo_low_poly_body", + "170022e4": "mario_metal_vanish_geo_face_and_wings", + "17002390": "mario_metal_vanish_geo_left_hand", + "17002408": "mario_metal_vanish_geo_right_hand", + "170024b0": "mario_metal_vanish_geo_body", + "1700266c": "mario_metal_vanish_geo_medium_poly_left_hand", + "170026e4": "mario_metal_vanish_geo_medium_poly_right_hand", + "1700278c": "mario_metal_vanish_geo_medium_poly_body", + "17002958": "mario_metal_vanish_geo_low_poly_face_and_wings", + "17002a04": "mario_metal_vanish_geo_low_poly_left_hand", + "17002a7c": "mario_metal_vanish_geo_low_poly_right_hand", + "17002b24": "mario_metal_vanish_geo_low_poly_body", + "17002ce0": "mario_geo_load_body", + "17002d14": "mario_geo_load_medium_poly_body", + "17002d48": "mario_geo_load_low_poly_body", + "17002d7c": "mario_geo_render_body", + "17002dd4": "mario_geo", + "17002e30": "_group0_geoSegmentEnd", + "007cf4f0": "_group0_geoSegmentRomEnd", + "05000000": "_group1_mio0SegmentStart", + "007cc6c0": "_group1_mio0SegmentRomStart", + "05008070": ".", + "05008070": "_group1_mio0SegmentEnd", + "007d4730": "_group1_mio0SegmentRomEnd", + "0c000000": "_group1_geoSegmentStart", + "007cc6c0": "_group1_geoSegmentRomStart", + "0c000000": "yellow_sphere_geo", + "0c000018": "hoot_geo", + "0c0001e4": "yoshi_egg_geo", + "0c000248": "thwomp_geo", + "0c000264": "bullet_bill_geo", + "0c00028c": "heave_ho_geo", + "0c000410": "_group1_geoSegmentEnd", + "007ccad0": "_group1_geoSegmentRomEnd", + "05000000": "_group2_mio0SegmentStart", + "007cc6c0": "_group2_mio0SegmentRomStart", + "05001e10": ".", + "05001e10": "_group2_mio0SegmentEnd", + "007ce4d0": "_group2_mio0SegmentRomEnd", + "0c000000": "_group2_geoSegmentStart", + "007cc6c0": "_group2_geoSegmentRomStart", + "0c000000": "bully_geo", + "0c000120": "bully_boss_geo", + "0c000240": "blargg_geo", + "0c0002b0": "_group2_geoSegmentEnd", + "007cc970": "_group2_geoSegmentRomEnd", + "05000000": "_group3_mio0SegmentStart", + "007cc6c0": "_group3_mio0SegmentRomStart", + "050068b0": ".", + "050068b0": "_group3_mio0SegmentEnd", + "007d2f70": "_group3_mio0SegmentRomEnd", + "0c000000": "_group3_geoSegmentStart", + "007cc6c0": "_group3_geoSegmentRomStart", + "0c000000": "king_bobomb_geo", + "0c000308": "water_bomb_geo", + "0c000328": "water_bomb_shadow_geo", + "0c000340": "_group3_geoSegmentEnd", + "007cca00": "_group3_geoSegmentRomEnd", + "05000000": "_group4_mio0SegmentStart", + "007cc6c0": "_group4_mio0SegmentRomStart", + "0500a300": ".", + "0500a300": "_group4_mio0SegmentEnd", + "007d69c0": "_group4_mio0SegmentRomEnd", + "0c000000": "_group4_geoSegmentStart", + "007cc6c0": "_group4_geoSegmentRomStart", + "0c000000": "clam_shell_geo", + "0c000068": "sushi_geo", + "0c00010c": "unagi_geo", + "0c000280": "_group4_geoSegmentEnd", + "007cc940": "_group4_geoSegmentRomEnd", + "05000000": "_group5_mio0SegmentStart", + "007cc6c0": "_group5_mio0SegmentRomStart", + "0500bce0": ".", + "0500bce0": "_group5_mio0SegmentEnd", + "007d83a0": "_group5_mio0SegmentRomEnd", + "0c000000": "_group5_geoSegmentStart", + "007cc6c0": "_group5_geoSegmentRomStart", + "0c000000": "klepto_geo", + "0c0002ac": "eyerok_geo_0002AC", + "0c0005a8": "eyerok_left_hand_geo", + "0c0005e4": "eyerok_right_hand_geo", + "0c000610": "pokey_head_geo", + "0c000644": "pokey_body_part_geo", + "0c000660": "_group5_geoSegmentEnd", + "007ccd20": "_group5_geoSegmentRomEnd", + "05000000": "_group6_mio0SegmentStart", + "007cc6c0": "_group6_mio0SegmentRomStart", + "0500e110": ".", + "0500e110": "_group6_mio0SegmentEnd", + "007da7d0": "_group6_mio0SegmentRomEnd", + "0c000000": "_group6_geoSegmentStart", + "007cc6c0": "_group6_geoSegmentRomStart", + "0c000000": "monty_mole_geo", + "0c000110": "ukiki_geo", + "0c00036c": "fwoosh_geo", + "0c000390": "_group6_geoSegmentEnd", + "007cca50": "_group6_geoSegmentRomEnd", + "05000000": "_group7_mio0SegmentStart", + "007cc6c0": "_group7_mio0SegmentRomStart", + "05005070": ".", + "05005070": "_group7_mio0SegmentEnd", + "007d1730": "_group7_mio0SegmentRomEnd", + "0c000000": "_group7_geoSegmentStart", + "007cc6c0": "_group7_geoSegmentRomStart", + "0c000000": "spindrift_geo", + "0c000104": "penguin_geo", + "0c00021c": "mr_blizzard_hidden_geo", + "0c000348": "mr_blizzard_geo", + "0c000370": "_group7_geoSegmentEnd", + "007cca30": "_group7_geoSegmentRomEnd", + "05000000": "_group8_mio0SegmentStart", + "007cc6c0": "_group8_mio0SegmentRomStart", + "05001180": ".", + "05001180": "_group8_mio0SegmentEnd", + "007cd840": "_group8_mio0SegmentRomEnd", + "0c000000": "_group8_geoSegmentStart", + "007cc6c0": "_group8_geoSegmentRomStart", + "0c000000": "springboard_top_geo", + "0c000018": "springboard_spring_geo", + "0c000030": "springboard_bottom_geo", + "0c000048": "cap_switch_geo", + "0c000090": "_group8_geoSegmentEnd", + "007cc750": "_group8_geoSegmentRomEnd", + "05000000": "_group9_mio0SegmentStart", + "007cc6c0": "_group9_mio0SegmentRomStart", + "05006960": ".", + "05006960": "_group9_mio0SegmentEnd", + "007d3020": "_group9_mio0SegmentRomEnd", + "0c000000": "_group9_geoSegmentStart", + "007cc6c0": "_group9_geoSegmentRomStart", + "0c000000": "bookend_part_geo", + "0c0000c0": "bookend_geo", + "0c0000d8": "haunted_chair_geo", + "0c000188": "small_key_geo", + "0c0001b4": "mad_piano_geo", + "0c000224": "boo_geo", + "0c000274": "haunted_cage_geo", + "0c0002b0": "_group9_geoSegmentEnd", + "007cc970": "_group9_geoSegmentRomEnd", + "05000000": "_group10_mio0SegmentStart", + "007cc6c0": "_group10_mio0SegmentRomStart", + "05012cd0": ".", + "05012cd0": "_group10_mio0SegmentEnd", + "007df390": "_group10_mio0SegmentRomEnd", + "0c000000": "_group10_geoSegmentStart", + "007cc6c0": "_group10_geoSegmentRomStart", + "0c000000": "birds_geo", + "0c000098": "peach_geo_000098", + "0c000254": "peach_geo_000254", + "0c000410": "peach_geo", + "0c000468": "yoshi_geo", + "0c000670": "_group10_geoSegmentEnd", + "007ccd30": "_group10_geoSegmentRomEnd", + "05000000": "_group11_mio0SegmentStart", + "007cc6c0": "_group11_mio0SegmentRomStart", + "050073f0": ".", + "050073f0": "_group11_mio0SegmentEnd", + "007d3ab0": "_group11_mio0SegmentRomEnd", + "0c000000": "_group11_geoSegmentStart", + "007cc6c0": "_group11_geoSegmentRomStart", + "0c000000": "bubba_geo", + "0c000030": "wiggler_head_geo", + "0c0001bc": "enemy_lakitu_geo", + "0c000290": "spiny_ball_geo", + "0c000328": "spiny_geo", + "0c0004a0": "_group11_geoSegmentEnd", + "007ccb60": "_group11_geoSegmentRomEnd", + "06000000": "_group12_mio0SegmentStart", + "007cc6c0": "_group12_mio0SegmentRomStart", + "06030c30": ".", + "06030c30": "_group12_mio0SegmentEnd", + "007fd2f0": "_group12_mio0SegmentRomEnd", + "0d000000": "_group12_geoSegmentStart", + "007cc6c0": "_group12_geoSegmentRomStart", + "0d000000": "bowser_flames_geo", + "0d000090": "invisible_bowser_accessory_geo", + "0d0000b0": "bowser_1_yellow_sphere_geo", + "0d0000d8": "bowser_geo_0000D8", + "0d000424": "bowser_geo_000424", + "0d000770": "bowser_geo_000770", + "0d000ab8": "bowser_shadow_geo", + "0d000ac4": "bowser_geo", + "0d000b40": "bowser2_geo", + "0d000bbc": "bowser_bomb_geo", + "0d000bfc": "bowser_impact_smoke_geo", + "0d000c50": "_group12_geoSegmentEnd", + "007cd310": "_group12_geoSegmentRomEnd", + "06000000": "_group13_mio0SegmentStart", + "007cc6c0": "_group13_mio0SegmentRomStart", + "0600a0f0": ".", + "0600a0f0": "_group13_mio0SegmentEnd", + "007d67b0": "_group13_mio0SegmentRomEnd", + "0d000000": "_group13_geoSegmentStart", + "007cc6c0": "_group13_geoSegmentRomStart", + "0d000000": "skeeter_geo", + "0d000284": "seaweed_geo", + "0d0002f4": "water_mine_geo", + "0d000324": "cyan_fish_geo", + "0d00038c": "bub_geo", + "0d000414": "water_ring_geo", + "0d000450": "treasure_chest_base_geo", + "0d000468": "treasure_chest_lid_geo", + "0d000480": "_group13_geoSegmentEnd", + "007ccb40": "_group13_geoSegmentRomEnd", + "06000000": "_group14_mio0SegmentStart", + "007cc6c0": "_group14_mio0SegmentRomStart", + "06013a60": ".", + "06013a60": "_group14_mio0SegmentEnd", + "007e0120": "_group14_mio0SegmentRomEnd", + "0d000000": "_group14_geoSegmentStart", + "007cc6c0": "_group14_geoSegmentRomStart", + "0d000000": "koopa_flag_geo", + "0d0000b8": "wooden_post_geo", + "0d0000d0": "koopa_without_shell_geo", + "0d000214": "koopa_with_shell_geo", + "0d000358": "piranha_plant_geo", + "0d000480": "whomp_geo", + "0d0005d0": "metallic_ball_geo", + "0d0005ec": "chain_chomp_geo", + "0d000680": "_group14_geoSegmentEnd", + "007ccd40": "_group14_geoSegmentRomEnd", + "06000000": "_group15_mio0SegmentStart", + "007cc6c0": "_group15_mio0SegmentRomStart", + "0600c8e0": ".", + "0600c8e0": "_group15_mio0SegmentEnd", + "007d8fa0": "_group15_mio0SegmentRomEnd", + "0d000000": "_group15_geoSegmentStart", + "007cc6c0": "_group15_geoSegmentRomStart", + "0d000000": "lakitu_geo", + "0d000114": "toad_geo_000114", + "0d00027c": "toad_geo_00027C", + "0d0003e4": "toad_geo", + "0d000448": "mips_geo", + "0d0005b0": "boo_castle_geo", + "0d000600": "_group15_geoSegmentEnd", + "007cccc0": "_group15_geoSegmentRomEnd", + "06000000": "_group16_mio0SegmentStart", + "007cc6c0": "_group16_mio0SegmentRomStart", + "06002ba0": ".", + "06002ba0": "_group16_mio0SegmentEnd", + "007cf260": "_group16_mio0SegmentRomEnd", + "0d000000": "_group16_geoSegmentStart", + "007cc6c0": "_group16_geoSegmentRomStart", + "0d000000": "moneybag_geo_000000", + "0d000078": "moneybag_geo_000078", + "0d0000f0": "moneybag_geo", + "0d000150": "_group16_geoSegmentEnd", + "007cc810": "_group16_geoSegmentRomEnd", + "06000000": "_group17_mio0SegmentStart", + "007cc6c0": "_group17_mio0SegmentRomStart", + "06009c50": ".", + "06009c50": "_group17_mio0SegmentEnd", + "007d6310": "_group17_mio0SegmentRomEnd", + "0d000000": "_group17_geoSegmentStart", + "007cc6c0": "_group17_geoSegmentRomStart", + "0d000000": "mr_i_geo", + "0d00001c": "mr_i_iris_geo", + "0d0000dc": "swoop_geo", + "0d0001a0": "snufit_geo", + "0d000230": "dorrie_geo", + "0d000394": "scuttlebug_geo", + "0d0006d0": "_group17_geoSegmentEnd", + "007ccd90": "_group17_geoSegmentRomEnd", + "08000000": "_common0_mio0SegmentStart", + "007cc6c0": "_common0_mio0SegmentRomStart", + "0800e6d0": ".", + "0800e6d0": "_common0_mio0SegmentEnd", + "007dad90": "_common0_mio0SegmentRomEnd", + "0f000000": "_common0_geoSegmentStart", + "007cc6c0": "_common0_geoSegmentRomStart", + "0f000000": "blue_coin_switch_geo", + "0f000020": "test_platform_geo", + "0f000028": "amp_geo", + "0f0001a8": "cannon_base_geo", + "0f0001c0": "cannon_barrel_geo", + "0f0001d8": "chuckya_geo", + "0f0004cc": "purple_switch_geo", + "0f0004e4": "checkerboard_platform_geo", + "0f0004fc": "heart_geo", + "0f000518": "flyguy_geo", + "0f0005d0": "breakable_box_geo", + "0f000610": "breakable_box_small_geo", + "0f000640": "bowling_ball_geo", + "0f00066c": "bowling_ball_track_geo", + "0f000694": "exclamation_box_geo", + "0f0006e4": "goomba_geo", + "0f0007b8": "black_bobomb_geo", + "0f0008f4": "bobomb_buddy_geo", + "0f000a30": "metal_box_geo", + "0f000a58": "exclamation_box_outline_geo", + "0f000ab0": "koopa_shell_geo", + "0f000adc": "koopa_shell2_geo", + "0f000b08": "koopa_shell3_geo", + "0f000b40": "_common0_geoSegmentEnd", + "007cd200": "_common0_geoSegmentRomEnd", + "03000000": "_common1_mio0SegmentStart", + "007cc6c0": "_common1_mio0SegmentRomStart", + "03017990": ".", + "03017990": "_common1_mio0SegmentEnd", + "007e4050": "_common1_mio0SegmentRomEnd", + "16000000": "_common1_geoSegmentStart", + "007cc6c0": "_common1_geoSegmentRomStart", + "16000000": "mist_geo", + "16000020": "white_puff_geo", + "16000040": "explosion_geo", + "160000a8": "butterfly_geo", + "1600013c": "yellow_coin_geo", + "160001a0": "yellow_coin_no_shadow_geo", + "16000200": "blue_coin_geo", + "16000264": "blue_coin_no_shadow_geo", + "160002c4": "red_coin_geo", + "16000328": "red_coin_no_shadow_geo", + "16000388": "warp_pipe_geo", + "160003a8": "castle_door_geo", + "1600043c": "cabin_door_geo", + "160004d0": "wooden_door_geo", + "16000564": "wooden_door2_geo", + "160005f8": "metal_door_geo", + "1600068c": "hazy_maze_door_geo", + "16000720": "haunted_door_geo", + "160007b4": "castle_door_0_star_geo", + "16000868": "castle_door_1_star_geo", + "1600091c": "castle_door_3_stars_geo", + "160009d0": "key_door_geo", + "16000a84": "bowser_key_geo", + "16000ab0": "bowser_key_cutscene_geo", + "16000b10": "red_flame_shadow_geo", + "16000b2c": "red_flame_geo", + "16000b8c": "blue_flame_geo", + "16000bec": "fish_shadow_geo", + "16000c44": "fish_geo", + "16000c8c": "leaves_geo", + "16000ca4": "marios_cap_geo", + "16000cf0": "marios_metal_cap_geo", + "16000d3c": "marios_wing_cap_geo", + "16000da8": "marios_winged_metal_cap_geo", + "16000e14": "number_geo", + "16000e84": "mushroom_1up_geo", + "16000ea0": "star_geo", + "16000ed4": "dirt_animation_geo", + "16000f24": "cartoon_star_geo", + "16000f6c": "transparent_star_geo", + "16000f98": "white_particle_geo", + "16000fb4": "wooden_signpost_geo", + "16000fe8": "bubbly_tree_geo", + "16001000": "spiky_tree_geo", + "16001018": "snow_tree_geo", + "16001030": "spiky_tree1_geo", + "16001048": "palm_tree_geo", + "16001060": "_common1_geoSegmentEnd", + "007cd720": "_common1_geoSegmentRomEnd", + "13000000": "_behaviorSegmentStart", + "007cc6c0": "_behaviorSegmentRomStart", + "13000000": "bhvStarDoor", + "13000054": "bhvMrI", + "1300008c": "bhvMrIBody", + "130000ac": "bhvMrIParticle", + "130000f8": "bhvPurpleParticle", + "13000118": "bhvGiantPole", + "13000144": "bhvPoleGrabbing", + "13000174": "bhvThiHugeIslandTop", + "13000194": "bhvThiTinyIslandTop", + "130001ac": "bhvCapSwitchBase", + "130001cc": "bhvCapSwitch", + "130001f4": "bhvKingBobomb", + "13000254": "bhvBobombAnchorMario", + "13000278": "bhvBetaChestBottom", + "1300029c": "bhvBetaChestLid", + "130002b8": "bhvBubbleMario", + "130002e4": "bhvBubbleMaybe", + "13000338": "bhvSmallWaterWave", + "13000398": "bhvSmallWaterWave398", + "130003bc": "bhvWaterAirBubble", + "13000400": "bhvSmallParticle", + "13000428": "bhvWaterWaves", + "13000444": "bhvSmallParticleSnow", + "1300046c": "bhvSmallParticleBubbles", + "13000494": "bhvFishGroup", + "130004a8": "bhvCannon", + "130004e4": "bhvCannonBarrel", + "13000500": "bhvCannonBaseUnused", + "13000528": "bhvChuckya", + "13000584": "bhvChuckyaAnchorMario", + "130005a8": "bhvUnused05A8", + "130005b4": "bhvRotatingPlatform", + "130005d8": "bhvTower", + "13000600": "bhvBulletBillCannon", + "13000624": "bhvWfBreakableWallRight", + "13000638": "bhvWfBreakableWallLeft", + "1300066c": "bhvKickableBoard", + "130006a4": "bhvTowerDoor", + "130006d8": "bhvRotatingCounterClockwise", + "130006e0": "bhvWfRotatingWoodenPlatform", + "13000708": "bhvKoopaShellUnderwater", + "13000720": "bhvExitPodiumWarp", + "1300075c": "bhvFadingWarp", + "13000780": "bhvWarp", + "130007a0": "bhvWarpPipe", + "130007dc": "bhvWhitePuffExplosion", + "130007f8": "bhvSpawnedStar", + "1300080c": "bhvSpawnedStarNoLevelExit", + "13000830": "bhvMrIBlueCoin", + "13000888": "bhvCoinInsideBoo", + "130008d0": "bhvCoinFormationSpawn", + "130008ec": "bhvCoinFormation", + "1300090c": "bhvOneCoin", + "1300091c": "bhvYellowCoin", + "13000940": "bhvTemporaryYellowCoin", + "13000964": "bhvThreeCoinsSpawn", + "13000984": "bhvTenCoinsSpawn", + "130009a4": "bhvSingleCoinGetsSpawned", + "130009e0": "bhvCoinSparkles", + "13000a14": "bhvGoldenCoinSparkles", + "13000a34": "bhvWallTinyStarParticle", + "13000a54": "bhvWallTinyStarParticleSpawn", + "13000a78": "bhvPoundTinyStarParticle", + "13000a98": "bhvPoundTinyStarParticleSpawn", + "13000abc": "bhvPunchTinyTriangle", + "13000ad8": "bhvPunchTinyTriangleSpawn", + "13000afc": "bhvDoorWarp", + "13000b0c": "bhvDoor", + "13000b58": "bhvGrindel", + "13000b8c": "bhvThwomp2", + "13000bc8": "bhvThwomp", + "13000c04": "bhvTumblingBridgePlatform", + "13000c28": "bhvWfTumblingBridge", + "13000c44": "bhvBbhTumblingBridge", + "13000c64": "bhvLllTumblingBridge", + "13000c84": "bhvFlame", + "13000cc8": "bhvAnotherElavator", + "13000cfc": "bhvRrElevatorPlatform", + "13000d30": "bhvHmcElevatorPlatform", + "13000d6c": "bhvWaterMist", + "13000d98": "bhvWaterMistSpawn", + "13000db4": "bhvBreakBoxTriangle", + "13000dd8": "bhvWaterMist2", + "13000dfc": "bhvUnused0DFC", + "13000e24": "bhvPoundWhitePuffs", + "13000e3c": "bhvGroundSand", + "13000e58": "bhvGroundSnow", + "13000e70": "bhvWind", + "13000e88": "bhvEndToad", + "13000eac": "bhvEndPeach", + "13000ed0": "bhvUnusedParticleSpawn", + "13000f08": "bhvUkiki", + "13000f14": "bhvUkikiCageChild", + "13000f2c": "bhvUkikiCageStar", + "13000f48": "bhvUkikiCage", + "13000f9c": "bhvBitfsSinkingPlatforms", + "13000fc8": "bhvBitfsSinkingCagePlatform", + "13001000": "bhvDddMovingPole", + "13001030": "bhvBitfsTiltingInvertedPyramid", + "13001064": "bhvSquishablePlatform", + "13001098": "bhvCutOutObject", + "130010a8": "bhvBetaMovingFlamesSpawn", + "130010b8": "bhvBetaMovingFlames", + "130010d8": "bhvRrRotatingBridgePlatform", + "13001108": "bhvFlamethrower", + "13001124": "bhvFlamethrowerFlame", + "13001168": "bhvBouncingFireball", + "13001184": "bhvBouncingFireballFlame", + "130011d0": "bhvBowserShockWave", + "130011ec": "bhvFlameMario", + "13001214": "bhvBlackSmokeMario", + "13001254": "bhvBlackSmokeBowser", + "1300127c": "bhvBlackSmokeUpward", + "13001298": "bhvBetaFishSplashSpawner", + "130012b4": "bhvSpindrift", + "130012f4": "bhvTowerPlatformGroup", + "13001318": "bhvWfSlidingTowerPlatform", + "13001340": "bhvWfElevatorTowerPlatform", + "13001368": "bhvWfSolidTowerPlatform", + "13001390": "bhvSnowLeafParticleSpawn", + "130013a8": "bhvTreeSnow", + "130013c4": "bhvTreeLeaf", + "130013dc": "bhvAnotherTiltingPlatform", + "13001408": "bhvSquarishPathMoving", + "1300142c": "bhvPiranhaPlantBubble", + "13001448": "bhvPiranhaPlantWakingBubbles", + "13001468": "bhvFloorSwitchAnimatesObject", + "13001478": "bhvFloorSwitchGrills", + "13001484": "bhvFloorSwitchHardcodedModel", + "130014ac": "bhvFloorSwitchHiddenObjects", + "130014bc": "bhvHiddenObject", + "130014e0": "bhvBreakableBox", + "13001518": "bhvPushableMetalBox", + "13001548": "bhvHeaveHo", + "130015a4": "bhvHeaveHoThrowMario", + "130015c0": "bhvCcmTouchedStarSpawn", + "130015e4": "bhvUnusedPoundablePlatform", + "13001608": "bhvBetaTrampolineTop", + "13001634": "bhvBetaTrampolineSpring", + "13001650": "bhvJumpingBox", + "1300167c": "bhvBooCage", + "130016ac": "bhvStub", + "130016b8": "bhvIgloo", + "130016e4": "bhvBowserKey", + "13001714": "bhvGrandStar", + "13001744": "bhvBetaBooKey", + "13001778": "bhvAlphaBooKey", + "1300179c": "bhvBulletBill", + "130017f4": "bhvWhitePuffSmoke", + "13001820": "bhvUnused1820", + "13001828": "bhvBowserTailAnchor", + "13001850": "bhvBowser", + "130018cc": "bhvBowserBodyAnchor", + "13001904": "bhvBowserFlameSpawn", + "13001920": "bhvTiltingBowserLavaPlatform", + "13001958": "bhvFallingBowserPlatform", + "13001984": "bhvBlueBowserFlame", + "130019c8": "bhvFlameFloatingLanding", + "13001a0c": "bhvBlueFlamesGroup", + "13001a30": "bhvFlameBouncing", + "13001a74": "bhvFlameMovingForwardGrowing", + "13001aa4": "bhvFlameBowser", + "13001ae8": "bhvFlameLargeBurningOut", + "13001b2c": "bhvBlueFish", + "13001b54": "bhvTankFishGroup", + "13001b70": "bhvCheckerboardElevatorGroup", + "13001b88": "bhvCheckerboardPlatformSub", + "13001bb4": "bhvBowserKeyUnlockDoor", + "13001bd4": "bhvBowserKeyCourseExit", + "13001bf4": "bhvInvisibleObjectsUnderBridge", + "13001c04": "bhvWaterLevelPillar", + "13001c34": "bhvDddWarp", + "13001c58": "bhvMoatGrills", + "13001c7c": "bhvClockMinuteHand", + "13001c8c": "bhvClockHourHand", + "13001cb0": "bhvMacroUkiki", + "13001d0c": "bhvStub1D0C", + "13001d14": "bhvLllRotatingHexagonalPlatform", + "13001d40": "bhvLllSinkingRockBlock", + "13001d70": "bhvStub1D70", + "13001d78": "bhvLllMovingOctagonalMeshPlatform", + "13001da4": "bhvSnowBall", + "13001da8": "bhvLllRotatingBlockWithFireBars", + "13001dcc": "bhvLllRotatingHexFlame", + "13001e04": "bhvLllWoodPiece", + "13001e30": "bhvLllFloatingWoodBridge", + "13001e4c": "bhvVolcanoFlames", + "13001e6c": "bhvLllRotatingHexagonalRing", + "13001e94": "bhvLllSinkingRectangularPlatform", + "13001ec4": "bhvLllSinkingSquarePlatforms", + "13001ef8": "bhvLllTiltingInvertedPyramid", + "13001f30": "bhvUnused1F30", + "13001f3c": "bhvKoopaShell", + "13001f68": "bhvKoopaShellFlame", + "13001f90": "bhvToxBox", + "13001fbc": "bhvPiranhaPlant", + "13002018": "bhvLllHexagonalMesh", + "13002038": "bhvLllBowserPuzzlePiece", + "13002068": "bhvLllBowserPuzzle", + "13002088": "bhvTuxiesMother", + "130020d8": "bhvPenguinBaby", + "130020e0": "bhvUnused20E0", + "130020e8": "bhvSmallPenguin", + "1300213c": "bhvFish2", + "1300214c": "bhvFish3", + "1300215c": "bhvLargeFishGroup", + "13002178": "bhvFishGroup2", + "13002194": "bhvWdwExpressElevator", + "130021c0": "bhvWdwExpressElevatorPlatform", + "130021e4": "bhvChirpChirp", + "130021f4": "bhvChirpChirpUnused", + "1300220c": "bhvBub", + "13002250": "bhvExclamationBox", + "1300227c": "bhvRotatingExclamationMark", + "1300229c": "bhvSoundSpawner", + "130022b8": "bhvRockSolid", + "130022d8": "bhvBowserSubDoor", + "13002308": "bhvBowsersSub", + "13002338": "bhvSushiShark", + "13002388": "bhvSushiSharkCollisionChild", + "130023a4": "bhvJrbSlidingBox", + "130023d0": "bhvShipPart3", + "130023ec": "bhvInSunkenShip3", + "1300241c": "bhvSunkenShipPart", + "1300243c": "bhvSunkenShipSetRotation", + "1300244c": "bhvSunkenShipPart2", + "1300246c": "bhvInSunkenShip", + "13002480": "bhvInSunkenShip2", + "130024ac": "bhvMarioDustGenerator", + "130024dc": "bhvWhitePuff1", + "13002500": "bhvWhitePuff2", + "13002528": "bhvWhitePuffSmoke2", + "13002558": "bhvPurpleSwitchHiddenBoxes", + "13002568": "bhvBlueCoinSwitch", + "13002588": "bhvHiddenBlueCoin", + "130025c0": "bhvOpenableCageDoor", + "130025e0": "bhvOpenableGrill", + "130025f8": "bhvWaterLevelDiamond", + "13002620": "bhvInitializeChangingWaterLevel", + "13002634": "bhvTweesterSandParticle", + "13002650": "bhvTweester", + "13002684": "bhvMerryGoRoundBooManager", + "1300269c": "bhvAnimatedTexture", + "130026d4": "bhvBooInCastle", + "13002710": "bhvBooWithCage", + "13002768": "bhvBalconyBigBoo", + "1300277c": "bhvMerryGoRoundBigBoo", + "13002790": "bhvGhostHuntBigBoo", + "130027d0": "bhvCourtyardBooTriplet", + "130027e4": "bhvBoo", + "130027f4": "bhvMerryGoRoundBoo", + "13002804": "bhvGhostHuntBoo", + "1300286c": "bhvHiddenStaircaseStep", + "13002898": "bhvBooBossSpawnedBridge", + "130028cc": "bhvBbhTiltingTrapPlatform", + "130028fc": "bhvHauntedBookshelf", + "1300292c": "bhvMeshElevator", + "13002968": "bhvMerryGoRound", + "13002998": "bhvPlaysMusicTrackWhenTouched", + "130029b0": "bhvInsideCannon", + "130029b4": "bhvBetaBowserAnchor", + "130029e4": "bhvStaticCheckeredPlatform", + "13002a10": "bhvUnused2A10", + "13002a20": "bhvUnusedFakeStar", + "13002a48": "bhvStaticObject", + "13002a54": "bhvUnused2A54", + "13002a5c": "bhvCastleFloorTrap", + "13002a7c": "bhvFloorTrapInCastle", + "13002aa4": "bhvTree", + "13002ad0": "bhvSparkle", + "13002af0": "bhvSparkleSpawn", + "13002b08": "bhvSpecialTripleJumpSparkles", + "13002b5c": "bhvScuttlebug", + "13002ba0": "bhvScuttlebugSpawn", + "13002bb8": "bhvWhompKingBoss", + "13002bcc": "bhvSmallWhomp", + "13002c14": "bhvWaterSplash", + "13002c60": "bhvWaterDrops", + "13002c7c": "bhvWaterSurfaceWhiteWave", + "13002cb0": "bhvObjectBubbleRipples", + "13002ce0": "bhvSurfaceWaves", + "13002d28": "bhvWaterSurfaceWhiteWave2", + "13002d50": "bhvWavesGenerator", + "13002d7c": "bhvSurfaceWaveShrinking", + "13002db0": "bhvWaterType", + "13002dc0": "bhvWaveTrailOnSurface", + "13002e04": "bhvTinyWhiteWindParticle", + "13002e20": "bhvWindParticle", + "13002e3c": "bhvSnowmanWindBlowing", + "13002e58": "bhvWalkingPenguin", + "13002ea8": "bhvYellowBall", + "13002ec0": "bhvMario", + "13002ef8": "bhvToadMessage", + "13002f40": "bhvUnlockDoorStar", + "13002f60": "bhvWarps60", + "13002f64": "bhvWarps64", + "13002f68": "bhvWarps68", + "13002f6c": "bhvWarps6C", + "13002f70": "bhvWarps70", + "13002f74": "bhvWarps74", + "13002f78": "bhvWarps78", + "13002f7c": "bhvWarps7C", + "13002f80": "bhvWarps80", + "13002f84": "bhvWarps84", + "13002f88": "bhvWarps88", + "13002f8c": "bhvWarps8C", + "13002f90": "bhvWarps90", + "13002f94": "bhvWarps94", + "13002fa0": "bhvRandomAnimatedTexture", + "13002fc0": "bhvYellowBackgroundInMenu", + "13002fe4": "bhvMenuButton", + "13003008": "bhvMenuButtonManager", + "1300302c": "bhvActSelectorStarType", + "13003048": "bhvActSelector", + "13003068": "bhvMovingYellowCoin", + "130030a4": "bhvMovingBlueCoin", + "130030d4": "bhvBlueCoinSliding", + "13003104": "bhvBlueCoinJumping", + "13003134": "bhvSeaweed", + "13003158": "bhvSeaweedBundle", + "13003174": "bhvBobomb", + "130031ac": "bhvBobombFuseSmoke", + "130031dc": "bhvBobombBuddy", + "13003228": "bhvBobombBuddyOpensCannon", + "13003274": "bhvCannonClosed", + "130032a8": "bhvWhirlpool", + "130032c8": "bhvJetStream", + "130032e0": "bhvMessagePanel", + "13003324": "bhvSignOnWall", + "13003354": "bhvHomingAmp", + "13003388": "bhvCirclingAmp", + "130033bc": "bhvButterfly", + "130033ec": "bhvHoot", + "13003420": "bhvBetaHoldableObject", + "13003454": "bhvCarrySomething1", + "1300345c": "bhvCarrySomething2", + "13003464": "bhvCarrySomething3", + "1300346c": "bhvCarrySomething4", + "13003474": "bhvCarrySomething5", + "1300347c": "bhvCarrySomething6", + "13003484": "bhvObjectBubble", + "130034c4": "bhvObjectWaterWave", + "13003510": "bhvExplosion", + "13003558": "bhvBobombBullyDeathSmoke", + "13003588": "bhvSmoke", + "130035b0": "bhvBobombExplosionBubble", + "13003600": "bhvBobombExplosionBubble3600", + "13003614": "bhvRespawner", + "1300362c": "bhvSmallBully", + "13003660": "bhvBigBully", + "13003694": "bhvBigBullyWithMinions", + "130036c8": "bhvSmallChillBully", + "13003700": "bhvBigChillBully", + "13003738": "bhvJetStreamRingSpawner", + "13003750": "bhvJetStreamWaterRing", + "13003798": "bhvMantaRayWaterRing", + "130037e0": "bhvMantaRayRingManager", + "130037ec": "bhvBowserBomb", + "1300381c": "bhvBowserBombExplosion", + "13003840": "bhvBowserBombSmoke", + "13003868": "bhvCelebrationStar", + "13003888": "bhvCelebrationStarSparkle", + "130038b0": "bhvStarKeyCollectionPuffSpawner", + "130038d0": "bhvLllDrawbridgeSpawner", + "130038e8": "bhvLllDrawbridge", + "13003910": "bhvSmallBomp", + "13003940": "bhvLargeBomp", + "13003970": "bhvWfSlidingPlatform", + "130039a0": "bhvMoneybag", + "130039d4": "bhvMoneybagHidden", + "13003a08": "bhvPitBowlingBall", + "13003a30": "bhvFreeBowlingBall", + "13003a58": "bhvBowlingBall", + "13003a80": "bhvTtmBowlingBallSpawner", + "13003aa4": "bhvBobBowlingBallSpawner", + "13003ac8": "bhvThiBowlingBallSpawner", + "13003ae0": "bhvRrCruiserWing", + "13003b00": "bhvSpindel", + "13003b30": "bhvSslMovingPyramidWall", + "13003b60": "bhvPyramidElevator", + "13003b98": "bhvPyramidElevatorTrajectoryMarkerBall", + "13003bb4": "bhvPyramidTop", + "13003bec": "bhvPyramidTopFragment", + "13003c0c": "bhvPyramidPillarTouchDetector", + "13003c30": "bhvWaterfallSoundLoop", + "13003c44": "bhvVolcanoSoundLoop", + "13003c58": "bhvCastleFlagWaving", + "13003c7c": "bhvBirdsSoundLoop", + "13003c90": "bhvAmbientSounds", + "13003ca4": "bhvSandSoundLoop", + "13003cb8": "bhvHiddenAt120Stars", + "13003ce4": "bhvSnowmansBottom", + "13003d0c": "bhvSnowmansHead", + "13003d34": "bhvSnowmansBodyCheckpoint", + "13003d4c": "bhvBigSnowmanWhole", + "13003d74": "bhvBigBoulder", + "13003da0": "bhvBigBoulderGenerator", + "13003db8": "bhvWingCap", + "13003dd8": "bhvMetalCap", + "13003df8": "bhvNormalCap", + "13003e1c": "bhvVanishCap", + "13003e3c": "bhvStar", + "13003e64": "bhvStarSpawnCoordinates", + "13003e8c": "bhvHiddenRedCoinStar", + "13003eac": "bhvRedCoin", + "13003ee4": "bhvBowserCourseRedCoinStar", + "13003efc": "bhvHiddenStar", + "13003f1c": "bhvHiddenStarTrigger", + "13003f40": "bhvTtmRollingLog", + "13003f78": "bhvLllVolcanoFallingTrap", + "13003fa4": "bhvLllRollingLog", + "13003fdc": "bhv1upWalking", + "13004010": "bhv1upRunningAway", + "13004044": "bhv1upSliding", + "1300407c": "bhv1Up", + "130040b4": "bhv1upJumpOnApproach", + "130040ec": "bhvHidden1up", + "13004124": "bhvHidden1upTrigger", + "13004148": "bhvHidden1upInPole", + "13004180": "bhvHidden1upInPoleTrigger", + "130041a4": "bhvHidden1upInPoleSpawner", + "130041bc": "bhvControllablePlatform", + "130041f0": "bhvControllablePlatformSub", + "13004218": "bhvBreakableBoxSmall", + "13004244": "bhvSlidingSnowMound", + "13004270": "bhvSnowMoundSpawn", + "13004284": "bhvWdwSquareFloatingPlatform", + "130042b4": "bhvWdwRectangularFloatingPlatform", + "130042e4": "bhvJrbFloatingPlatform", + "13004314": "bhvArrowLift", + "13004348": "bhvOrangeNumber", + "13004370": "bhvMantaRay", + "130043a0": "bhvFallingPillar", + "130043c4": "bhvFallingPillarHitbox", + "130043e0": "bhvPillarBase", + "13004400": "bhvJrbFloatingBox", + "1300442c": "bhvDecorativePendulum", + "1300444c": "bhvTreasureChestsShip", + "13004470": "bhvTreasureChestsJrb", + "13004494": "bhvTreasureChests", + "130044b8": "bhvTreasureChestBottom", + "130044e0": "bhvTreasureChestTop", + "130044fc": "bhvMips", + "13004538": "bhvYoshi", + "13004580": "bhvKoopa", + "130045d0": "bhvKoopaRaceEndpoint", + "130045f8": "bhvKoopaFlag", + "13004634": "bhvPokey", + "13004668": "bhvPokeyBodyPart", + "13004698": "bhvSwoop", + "130046dc": "bhvFlyGuy", + "1300472c": "bhvGoomba", + "13004770": "bhvGoombaTripletSpawner", + "1300478c": "bhvChainChomp", + "130047e4": "bhvChainChompChainPart", + "1300481c": "bhvWoodenPost", + "13004868": "bhvChainChompGate", + "13004898": "bhvWigglerHead", + "130048e0": "bhvWigglerBody", + "13004918": "bhvEnemyLakitu", + "13004954": "bhvCameraLakitu", + "13004988": "bhvCloud", + "130049ac": "bhvCloudPart", + "130049c8": "bhvSpiny", + "13004a00": "bhvMontyMole", + "13004a58": "bhvMontyMoleHole", + "13004a78": "bhvMontyMoleRock", + "13004ab0": "bhvPlatformOnTrack", + "13004af4": "bhvTrackBall", + "13004b1c": "bhvSeesawPlatform", + "13004b44": "bhvFerrisWheelAxle", + "13004b6c": "bhvFerrisWheelPlatform", + "13004b8c": "bhvWaterBombSpawner", + "13004ba8": "bhvWaterBomb", + "13004bd4": "bhvWaterBombShadow", + "13004bf0": "bhvTTCRotatingSolid", + "13004c24": "bhvTTCPendulum", + "13004c5c": "bhvTTCTreadmill", + "13004c94": "bhvTTCMovingBar", + "13004ccc": "bhvTTCCog", + "13004cf8": "bhvTTCPitBlock", + "13004d28": "bhvTTCElevator", + "13004d64": "bhvTTC2DRotator", + "13004d90": "bhvTTCSpinner", + "13004dbc": "bhvMrBlizzard", + "13004e08": "bhvMrBlizzardSnowball", + "13004e4c": "bhvSlidingPlatform2", + "13004e78": "bhvOctagonalPlatformRotating", + "13004ea0": "bhvAnimatesOnFloorSwitchPress", + "13004ecc": "bhvActivatedBackAndForthPlatform", + "13004ef8": "bhvRecoveryHeart", + "13004f10": "bhvWaterBombCannon", + "13004f28": "bhvCannonBarrelBubbles", + "13004f40": "bhvUnagi", + "13004f78": "bhvUnagiSubobject", + "13004f90": "bhvDorrie", + "13004fd4": "bhvHauntedChair", + "13005024": "bhvMadPiano", + "1300506c": "bhvFlyingBookend", + "130050b4": "bhvBookendSpawn", + "130050d4": "bhvHauntedBookshelfManager", + "130050f4": "bhvBookSwitch", + "13005120": "bhvFirePiranhaPlant", + "13005158": "bhvSmallPiranhaFlame", + "1300518c": "bhvFireSpitter", + "130051ac": "bhvFlyguyFlame", + "130051e0": "bhvSnufit", + "1300521c": "bhvSnufitBalls", + "1300525c": "bhvHorizontalGrindel", + "130052b4": "bhvEyerokBoss", + "130052d0": "bhvEyerokHand", + "13005310": "bhvKlepto", + "13005354": "bhvBird", + "13005380": "bhvRacingPenguin", + "130053c4": "bhvPenguinRaceFinishLine", + "130053dc": "bhvPenguinRaceShortcutCheck", + "130053f4": "bhvCoffinSpawner", + "13005414": "bhvCoffin", + "13005440": "bhvClamShell", + "13005468": "bhvSkeeter", + "130054a0": "bhvSkeeterWave", + "130054b8": "bhvSwingPlatform", + "130054ec": "bhvDonutPlatformSpawner", + "13005504": "bhvDonutPlatform", + "13005528": "bhvDDDPole", + "1300556c": "bhvRedCoinStarMarker", + "13005598": "bhvTripletButterfly", + "130055dc": "bhvBubba", + "13005610": "bhvBeginningLakitu", + "13005638": "bhvBeginningPeach", + "1300565c": "bhvEndBirds1", + "13005680": "bhvEndBirds2", + "130056a4": "bhvIntroScene", + "130056c0": "_behaviorSegmentEnd", + "007d1d80": "_behaviorSegmentRomEnd", + "8016f000": "_goddardSegmentStart", + "007cc6c0": "_goddardSegmentRomStart", + }, + "Refresh 7": { + "80000000": "D_80000000", + "a4000000": "D_A4000000", + "a40004c0": "D_A40004C0", + "a4000774": "D_A4000774", + "a4001000": "D_A4001000", + "a4040010": "D_A4040010", + "a4080000": "D_A4080000", + "a4300000": "D_A4300000", + "a4300004": "D_A4300004", + "a4300008": "D_A4300008", + "a430000c": "D_A430000C", + "a4400010": "D_A4400010", + "a450000c": "D_A450000C", + "a4600000": "D_A4600000", + "a4600004": "D_A4600004", + "a460000c": "D_A460000C", + "a4600010": "D_A4600010", + "a4700000": "D_A4700000", + "a4700010": "D_A4700010", + "a4800018": "D_A4800018", + "b0000008": "D_B0000008", + "b0000010": "D_B0000010", + "b0000014": "D_B0000014", + "c0000000": "D_C0000000", + "c0000008": "D_C0000008", + "c000000c": "D_C000000C", + "802f69cc": "func_sh_802F69CC", + "8024cc7c": "func_sh_8024CC7C", + "00000000": "__romPos", + "04000000": "_bootSegmentStart", + "007cc6c0": "_bootSegmentRomStart", + "04001000": "_bootSegmentEnd", + "007cd6c0": "_bootSegmentRomEnd", + "80000400": ".", + "80000400": "_zbufferSegmentNoloadStart", + "80000400": "0x25800", + "80000400": "gZBuffer", + "80246000": "_mainSegmentStart", + "007cc6c0": "_mainSegmentRomStart", + "80246000": "entry_point", + "80246050": "handle_debug_key_sequences", + "80246170": "unknown_main_func", + "802461cc": "stub_main_1", + "802461dc": "stub_main_2", + "802461ec": "stub_main_3", + "802461fc": "setup_mesg_queues", + "802462e0": "alloc_pool", + "80246338": "create_thread", + "8024639c": "handle_nmi_request", + "802463ec": "receive_new_tasks", + "8024651c": "start_sptask", + "8024659c": "interrupt_gfx_sptask", + "802465ec": "start_gfx_sptask", + "80246648": "pretend_audio_sptask_done", + "8024669c": "handle_vblank", + "802467fc": "handle_sp_complete", + "8024694c": "handle_dp_complete", + "802469b8": "thread3_main", + "80246b14": "set_vblank_handler", + "80246b74": "send_sp_task_message", + "80246bb4": "dispatch_audio_sptask", + "80246c10": "send_display_list", + "80246c9c": "turn_on_audio", + "80246cb8": "turn_off_audio", + "80246cf0": "thread1_idle", + "80246df8": "main_func", + "80246e70": "my_rdp_init", + "802471a4": "my_rsp_init", + "80247284": "clear_z_buffer", + "802473c8": "display_frame_buffer", + "802474b8": "clear_frame_buffer", + "80247620": "clear_viewport", + "8024784c": "draw_screen_borders", + "802479bc": "make_viewport_clip_rect", + "80247b3c": "create_task_structure", + "80247ccc": "init_render_image", + "80247d14": "end_master_display_list", + "80247db4": "draw_reset_bars", + "80247f08": "rendering_init", + "80247fdc": "config_gfx_pool", + "80248090": "display_and_vsync", + "80248304": "adjust_analog_stick", + "80248498": "run_demo_inputs", + "80248638": "read_controller_inputs", + "80248824": "init_controllers", + "80248964": "setup_game_memory", + "80248af0": "thread5_game_loop", + "80248c40": "reset_volume", + "80248c58": "lower_background_noise", + "80248ce8": "raise_background_noise", + "80248d78": "disable_background_sound", + "80248dc0": "enable_background_sound", + "80248e08": "set_sound_mode", + "80248e54": "play_menu_sounds", + "80248fec": "play_painting_eject_sound", + "80249070": "play_infinite_stairs_music", + "80249178": "set_background_music", + "8024922c": "fadeout_music", + "8024927c": "fadeout_level_music", + "802492d0": "play_cutscene_music", + "80249310": "play_shell_music", + "8024934c": "stop_shell_music", + "80249398": "play_cap_music", + "80249404": "fadeout_cap_music", + "80249448": "stop_cap_music", + "802494d8": "audio_game_loop_tick", + "80249500": "thread4_sound", + "802495e0": "level_control_timer", + "802496b8": "pressed_pause", + "80249764": "set_play_mode", + "8024978c": "warp_special", + "802497b8": "fade_into_special_warp", + "8024982c": "stub_level_update_1", + "8024983c": "load_level_init_text", + "8024995c": "init_door_warp", + "80249a10": "set_mario_initial_cap_powerup", + "80249ab4": "set_mario_initial_action", + "80249cd8": "init_mario_after_warp", + "8024a124": "warp_area", + "8024a18c": "warp_level", + "8024a1d8": "warp_credits", + "8024a374": "check_instant_warp", + "8024a584": "music_changed_through_warp", + "8024a700": "initiate_warp", + "8024a7b4": "get_painting_warp_node", + "8024a85c": "initiate_painting_warp", + "8024a9cc": "level_trigger_warp", + "8024aedc": "initiate_delayed_warp", + "8024b13c": "update_hud_values", + "8024b390": "basic_update", + "8024b3e4": "play_mode_normal", + "8024b5d4": "play_mode_paused", + "8024b6cc": "play_mode_frame_advance", + "8024b798": "level_set_transition", + "8024b7c0": "play_mode_change_area", + "8024b880": "play_mode_change_level", + "8024b9b8": "update_level", + "8024ba8c": "init_level", + "8024bcd8": "lvl_init_or_update", + "8024bd5c": "lvl_init_from_save_file", + "8024be14": "lvl_set_current_level", + "8024bfa0": "lvl_play_the_end_screen_sound", + "8024bff0": "get_mario_cap_flag", + "8024c0b8": "object_facing_mario", + "8024c16c": "mario_obj_angle_to_object", + "8024c1d8": "determine_interaction", + "8024c51c": "attack_object", + "8024c618": "mario_stop_riding_object", + "8024c66c": "mario_grab_used_object", + "8024c6c0": "mario_drop_held_object", + "8024c780": "mario_throw_held_object", + "8024c894": "mario_stop_riding_and_holding", + "8024c8fc": "does_mario_have_hat", + "8024c928": "mario_blow_off_cap", + "8024ca68": "mario_lose_cap_to_enemy", + "8024caf8": "mario_retrieve_cap", + "8024cb58": "able_to_grab_object", + "8024cbfc": "mario_get_collided_object", + "8024cc7c": "mario_check_object_grab", + "8024ce08": "bully_knock_back_mario", + "8024d0b4": "bounce_off_object", + "8024d130": "hit_object_from_below", + "8024d2bc": "determine_knockback_action", + "8024d578": "push_mario_out_of_object", + "8024d72c": "bounce_back_from_attack", + "8024d804": "should_push_or_pull_door", + "8024d8b0": "take_damage_from_interact_object", + "8024d998": "take_damage_and_knock_back", + "8024daac": "reset_mario_pitch", + "8024db2c": "interact_coin", + "8024dbf0": "interact_water_ring", + "8024dc28": "interact_star_or_key", + "8024de4c": "interact_bbh_entrance", + "8024df10": "interact_warp", + "8024e0c4": "interact_warp_door", + "8024e2fc": "get_door_save_file_flag", + "8024e420": "interact_door", + "8024e6ec": "interact_cannon_base", + "8024e778": "interact_igloo_barrier", + "8024e7d4": "interact_tornado", + "8024e8f0": "interact_whirlpool", + "8024e9d0": "interact_strong_wind", + "8024ead8": "interact_flame", + "8024ec54": "interact_snufit_bullet", + "8024ed84": "interact_clam_or_bubba", + "8024ee44": "interact_bully", + "8024eff8": "interact_shock", + "8024f170": "interact_mr_blizzard", + "8024f1e0": "interact_hit_from_below", + "8024f354": "interact_bounce_top", + "8024f4ac": "interact_unknown_08", + "8024f55c": "interact_damage", + "8024f5cc": "interact_breakable", + "8024f6a4": "interact_koopa_shell", + "8024f7a8": "check_object_grab_mario", + "8024f8bc": "interact_pole", + "8024fa60": "interact_hoot", + "8024fb30": "interact_cap", + "8024fd2c": "interact_grabbable", + "8024fe6c": "mario_can_talk", + "8024ff04": "check_read_sign", + "80250098": "check_npc_talk", + "80250198": "interact_text", + "80250230": "check_kick_or_punch_wall", + "802503f0": "mario_process_interactions", + "802505c8": "check_death_barrier", + "8025065c": "check_lava_boost", + "80250724": "pss_begin_slide", + "80250778": "pss_end_slide", + "802507fc": "mario_handle_special_floors", + "80250940": "is_anim_at_end", + "8025097c": "is_anim_past_end", + "802509b8": "set_mario_animation", + "80250b04": "set_mario_anim_with_accel", + "80250c7c": "set_anim_to_frame", + "80250d38": "is_anim_past_frame", + "80250e54": "find_mario_anim_flags_and_translation", + "80251020": "update_mario_pos_for_anim", + "802510dc": "return_mario_anim_y_translation", + "80251120": "play_sound_if_no_flag", + "8025118c": "play_mario_jump_sound", + "80251274": "adjust_sound_for_speed", + "80251310": "play_sound_and_spawn_particles", + "80251444": "play_mario_action_sound", + "802514ac": "play_mario_landing_sound", + "80251510": "play_mario_landing_sound_once", + "80251574": "play_mario_heavy_landing_sound", + "802515d8": "play_mario_heavy_landing_sound_once", + "8025163c": "play_mario_sound", + "80251708": "mario_set_forward_vel", + "8025177c": "mario_get_floor_class", + "802518a8": "mario_get_terrain_sound_addend", + "80251a48": "resolve_and_return_wall_collisions", + "80251afc": "vec3f_find_ceil", + "80251b54": "mario_facing_downhill", + "80251bd4": "mario_floor_is_slippery", + "80251cfc": "mario_floor_is_slope", + "80251e24": "mario_floor_is_steep", + "80251f24": "find_floor_height_relative_polar", + "80252000": "find_floor_slope", + "802521a0": "update_mario_sound_and_camera", + "8025229c": "set_steep_jump_action", + "80252cf4": "set_mario_action", + "80252e5c": "set_jump_from_landing", + "802530a0": "set_jumping_action", + "80253178": "drop_and_set_mario_action", + "802531c4": "hurt_and_set_mario_action", + "80253218": "check_common_action_exits", + "80253300": "check_common_hold_action_exits", + "802533e4": "transition_submerged_to_walking", + "80253488": "set_water_plunge_action", + "80253588": "squish_mario_model", + "80253720": "debug_print_speed_action_normal", + "80253838": "update_mario_button_inputs", + "8025395c": "update_mario_joystick_inputs", + "80253a60": "update_mario_geometry_inputs", + "80253d58": "update_mario_inputs", + "80253ec0": "set_submerged_cam_preset_and_spawn_bubbles", + "80254060": "update_mario_health", + "802542b4": "update_mario_info_for_cam", + "80254338": "mario_reset_bodystate", + "80254390": "sink_mario_in_quicksand", + "802543e8": "update_and_return_cap_flags", + "80254588": "mario_update_hitbox_and_cap_model", + "80254830": "execute_mario_action", + "80254b20": "init_mario", + "80254f44": "init_mario_from_save_file", + "80255080": "get_additive_y_vel_for_jumps", + "8025509c": "stub_mario_step_1", + "802550b0": "stub_mario_step_2", + "802550c0": "transfer_bully_speed", + "80255238": "init_bully_collision_data", + "802552fc": "mario_bonk_reflection", + "80255414": "mario_update_quicksand", + "80255654": "mario_push_off_steep_floor", + "8025570c": "mario_update_moving_sand", + "8025580c": "mario_update_windy_ground", + "802559b0": "stop_and_set_height_to_floor", + "80255a34": "stationary_ground_step", + "80255d88": "perform_ground_step", + "80255ec4": "check_ledge_grab", + "802560ac": "perform_air_quarter_step", + "802564e0": "apply_twirl_gravity", + "80256584": "should_strengthen_gravity_for_jump_ascent", + "8025661c": "apply_gravity", + "802569f8": "apply_vertical_wind", + "80256b24": "perform_air_step", + "80256cd8": "set_vel_from_pitch_and_yaw", + "80256d8c": "set_vel_from_yaw", + "80256e00": "get_credits_str_width", + "80256e88": "print_displaying_credits_entry", + "80257060": "bhv_end_peach_loop", + "802570dc": "bhv_end_toad_loop", + "80257198": "geo_switch_peach_eyes", + "802572b0": "get_star_collection_dialog", + "8025733c": "handle_save_menu", + "80257450": "spawn_obj_at_mario_rel_yaw", + "802574e8": "cutscene_take_cap_off", + "80257548": "cutscene_put_cap_on", + "802575a8": "mario_ready_to_speak", + "80257640": "set_mario_npc_dialog", + "80257748": "act_reading_npc_dialog", + "80257980": "act_waiting_for_dialog", + "80257a0c": "act_disappeared", + "80257ab0": "act_reading_automatic_dialog", + "80257ce4": "act_reading_sign", + "80257eac": "act_debug_free_move", + "80258184": "general_star_dance_handler", + "80258420": "act_star_dance", + "802584dc": "act_star_dance_water", + "802585c0": "act_fall_after_star_grab", + "802586cc": "common_death_handler", + "80258744": "act_standing_death", + "802587ec": "act_electrocution", + "8025883c": "act_suffocation", + "8025888c": "act_death_on_back", + "802588f8": "act_death_on_stomach", + "80258964": "act_quicksand_death", + "80258a7c": "act_eaten_by_bubba", + "80258b24": "launch_mario_until_land", + "80258ba8": "act_unlocking_key_door", + "80258dac": "act_unlocking_star_door", + "80258f94": "act_entering_star_door", + "80259264": "act_going_through_door", + "802593cc": "act_warp_door_spawn", + "802594d4": "act_emerge_from_pipe", + "80259608": "act_spawn_spin_airborne", + "80259740": "act_spawn_spin_landing", + "802597ac": "act_exit_airborne", + "80259854": "act_falling_exit_airborne", + "802598d0": "act_exit_land_save_dialog", + "80259c30": "act_death_exit", + "80259ce8": "act_unused_death_exit", + "80259d74": "act_falling_death_exit", + "80259e00": "act_special_exit_airborne", + "80259ef8": "act_special_death_exit", + "80259fcc": "act_spawn_no_spin_airborne", + "8025a040": "act_spawn_no_spin_landing", + "8025a0bc": "act_bbh_enter_spin", + "8025a494": "act_bbh_enter_jump", + "8025a610": "act_teleport_fade_out", + "8025a6fc": "act_teleport_fade_in", + "8025a858": "act_shocked", + "8025a9ac": "act_squished", + "8025ae0c": "act_putting_on_cap", + "8025aea8": "stuck_in_ground_handler", + "8025affc": "act_head_stuck_in_ground", + "8025b050": "act_butt_stuck_in_ground", + "8025b0a4": "act_feet_stuck_in_ground", + "8025d798": "mario_execute_cutscene_action", + "8025dd70": "add_tree_leaf_particles", + "8025de1c": "play_climbing_sounds", + "8025df04": "set_pole_position", + "8025e21c": "act_holding_pole", + "8025e5a8": "act_climbing_pole", + "8025e7a4": "act_grab_pole_slow", + "8025e830": "act_grab_pole_fast", + "8025e930": "act_top_of_pole_transition", + "8025ea30": "act_top_of_pole", + "8025eb50": "perform_hanging_step", + "8025ecfc": "update_hang_moving", + "8025eed0": "update_hang_stationary", + "8025ef58": "act_start_hanging", + "8025f0b4": "act_hanging", + "8025f1e4": "act_hang_moving", + "8025f384": "let_go_of_ledge", + "8025f4b4": "climb_up_ledge", + "8025f560": "update_ledge_climb_camera", + "8025f644": "update_ledge_climb", + "8025f6c0": "act_ledge_grab", + "8025f970": "act_ledge_climb_slow", + "8025fa64": "act_ledge_climb_down", + "8025fae8": "act_ledge_climb_fast", + "8025fb90": "act_grabbed", + "8025fc6c": "act_in_cannon", + "80260154": "act_tornado_twirling", + "80260568": "check_common_automatic_cancels", + "802605d0": "mario_execute_automatic_action", + "802608b0": "check_common_idle_cancels", + "80260aac": "check_common_hold_idle_cancels", + "80260cb4": "act_idle", + "80260f94": "play_anim_sound", + "80261000": "act_start_sleeping", + "80261268": "act_sleeping", + "802614fc": "act_waking_up", + "8026168c": "act_shivering", + "802618d8": "act_coughing", + "802619d0": "act_hold_idle", + "80261ad0": "act_hold_heavy_idle", + "80261bf8": "act_standing_against_wall", + "80261cec": "act_in_quicksand", + "80261db4": "act_crouching", + "80261f70": "act_panting", + "80262080": "act_hold_panting_unused", + "8026217c": "stopping_step", + "802621dc": "act_braking_stop", + "802622dc": "act_butt_slide_stop", + "80262398": "act_unknown_03F", + "80262490": "act_slide_kick_slide_stop", + "80262530": "act_start_crouching", + "80262650": "act_stop_crouching", + "80262770": "act_start_crawling", + "80262890": "act_stop_crawling", + "80262980": "act_unknown_026", + "80262bc4": "landing_step", + "80262c34": "check_common_landing_cancels", + "80262d68": "act_jump_land_stop", + "80262dc4": "act_double_jump_land_stop", + "80262e20": "act_side_flip_land_stop", + "80262e94": "act_freefall_land_stop", + "80262ef0": "act_triple_jump_land_stop", + "80262f50": "act_backflip_land_stop", + "80262fec": "act_lava_boost_land", + "8026305c": "act_long_jump_land_stop", + "802630f8": "act_unknown_034", + "802631f0": "act_unknown_035", + "802632e8": "act_air_throw_land", + "802633b4": "act_twirl_land", + "8026350c": "act_ground_pound_land", + "802635e8": "act_first_person", + "80263784": "check_common_stationary_cancels", + "80263898": "mario_execute_stationary_action", + "80263e60": "tilt_body_running", + "80263ee4": "play_step_sound", + "80264024": "align_with_floor", + "8026409c": "begin_walking_action", + "802640fc": "check_ledge_climb_down", + "802642b4": "slide_bonk", + "80264340": "set_triple_jump_action", + "8026440c": "update_sliding_angle", + "80264740": "update_sliding", + "80264b54": "apply_slope_accel", + "80264d80": "apply_landing_accel", + "80264e18": "update_shell_speed", + "80265080": "apply_slope_decel", + "802651b0": "update_decelerating_speed", + "80265244": "update_walking_speed", + "80265458": "should_begin_sliding", + "80265514": "analog_stick_held_back", + "80265558": "check_ground_dive_or_punch", + "80265620": "begin_braking_action", + "80265700": "anim_and_audio_for_walk", + "80265b1c": "anim_and_audio_for_hold_walk", + "80265d90": "anim_and_audio_for_heavy_walk", + "80265df8": "push_or_sidle_wall", + "80266038": "tilt_body_walking", + "802661cc": "tilt_body_ground_shell", + "80266354": "act_walking", + "802665b4": "act_move_punching", + "80266734": "act_hold_walking", + "8026699c": "act_hold_heavy_walking", + "80266af8": "act_turning_around", + "80266d4c": "act_finish_turning_around", + "80266e48": "act_braking", + "80266fc8": "act_decelerating", + "80267240": "act_hold_decelerating", + "80267504": "act_riding_shell_ground", + "80267728": "act_crawling", + "8026795c": "act_burning_ground", + "80267c24": "tilt_body_butt_slide", + "80267ce4": "common_slide_action", + "80267fa4": "common_slide_action_with_jump", + "80268074": "act_butt_slide", + "802680d4": "act_hold_butt_slide", + "80268168": "act_crouch_slide", + "80268338": "act_slide_kick_slide", + "802684ac": "stomach_slide_action", + "802685c0": "act_stomach_slide", + "80268608": "act_hold_stomach_slide", + "80268684": "act_dive_slide", + "802687b8": "common_ground_knockback_action", + "802689f8": "act_hard_backward_ground_kb", + "80268adc": "act_hard_forward_ground_kb", + "80268b64": "act_backward_ground_kb", + "80268bb0": "act_forward_ground_kb", + "80268bfc": "act_soft_backward_ground_kb", + "80268c48": "act_soft_forward_ground_kb", + "80268c94": "act_ground_bonk", + "80268d04": "act_death_exit_land", + "80268dcc": "common_landing_action", + "80268f78": "common_landing_cancels", + "80269108": "act_jump_land", + "80269170": "act_freefall_land", + "802691d8": "act_side_flip_land", + "80269264": "act_hold_jump_land", + "80269300": "act_hold_freefall_land", + "8026939c": "act_long_jump_land", + "8026947c": "act_double_jump_land", + "802694e4": "act_triple_jump_land", + "80269588": "act_backflip_land", + "80269640": "quicksand_jump_land_action", + "80269788": "act_quicksand_jump_land", + "802697dc": "act_hold_quicksand_jump_land", + "80269830": "check_common_moving_cancels", + "80269954": "mario_execute_moving_action", + "80269f40": "play_flip_sounds", + "80269fc0": "play_far_fall_sound", + "8026a090": "play_knockback_sound", + "8026a12c": "lava_boost_on_wall", + "8026a224": "check_fall_damage", + "8026a400": "check_kick_or_dive_in_air", + "8026a494": "should_get_stuck_in_ground", + "8026a598": "check_fall_damage_or_get_stuck", + "8026a62c": "check_horizontal_wind", + "8026a818": "update_air_with_turn", + "8026aa48": "update_air_without_turn", + "8026acd8": "update_lava_boost_or_twirling", + "8026ae5c": "update_flying_yaw", + "8026b004": "update_flying_pitch", + "8026b17c": "update_flying", + "8026b444": "common_air_action_step", + "8026b6a0": "act_jump", + "8026b740": "act_double_jump", + "8026b814": "act_triple_jump", + "8026b90c": "act_backflip", + "8026b9ac": "act_freefall", + "8026bab8": "act_hold_jump", + "8026bbb4": "act_hold_freefall", + "8026bcc0": "act_side_flip", + "8026bdcc": "act_wall_kick_air", + "8026be78": "act_long_jump", + "8026bf40": "act_riding_shell_air", + "8026c034": "act_twirling", + "8026c1e0": "act_dive", + "8026c4b8": "act_air_throw", + "8026c5d0": "act_water_jump", + "8026c738": "act_hold_water_jump", + "8026c880": "act_steep_jump", + "8026c9fc": "act_ground_pound", + "8026cd0c": "act_burning_jump", + "8026ce50": "act_burning_fall", + "8026cf28": "act_crazy_box_bounce", + "8026d1b0": "common_air_knockback_step", + "8026d33c": "check_wall_kick", + "8026d3c8": "act_backward_air_kb", + "8026d43c": "act_forward_air_kb", + "8026d4b0": "act_hard_backward_air_kb", + "8026d508": "act_hard_forward_air_kb", + "8026d560": "act_thrown_backward", + "8026d608": "act_thrown_forward", + "8026d6fc": "act_soft_bonk", + "8026d770": "act_getting_blown", + "8026d988": "act_air_hit_wall", + "8026db54": "act_forward_rollout", + "8026dcf4": "act_backward_rollout", + "8026de98": "act_butt_slide_air", + "8026e088": "act_hold_butt_slide_air", + "8026e2b4": "act_lava_boost", + "8026e59c": "act_slide_kick", + "8026e810": "act_jump_kick", + "8026e968": "act_shot_from_cannon", + "8026ec00": "act_flying", + "8026f158": "act_riding_hoot", + "8026f2ec": "act_flying_triple_jump", + "8026f614": "act_top_of_pole_jump", + "8026f660": "act_vertical_wind", + "8026f840": "act_special_triple_jump", + "8026fa18": "check_common_airborne_cancels", + "8026fb04": "mario_execute_airborne_action", + "8027499c": "mario_execute_submerged_action", + "80274eb0": "animated_stationary_ground_step", + "80274f10": "mario_update_punch_sequence", + "80275328": "act_punching", + "8027546c": "act_picking_up", + "802755fc": "act_dive_picking_up", + "802756c8": "act_placing_down", + "80275794": "act_throwing", + "802758c0": "act_heavy_throw", + "802759b4": "act_stomach_slide_stop", + "80275a80": "act_picking_up_bowser", + "80275b34": "act_holding_bowser", + "80275e78": "act_releasing_bowser", + "80275f0c": "check_common_object_cancels", + "80275fe0": "mario_execute_object_action", + "802761d0": "geo_envfx_main", + "802763d4": "geo_skybox_main", + "802764b0": "geo_draw_mario_head_goddard", + "8027684c": "bhv_toad_message_loop", + "80276910": "bhv_toad_message_init", + "80276bb8": "bhv_unlock_door_star_init", + "80276ccc": "bhv_unlock_door_star_loop", + "802770a4": "geo_mirror_mario_set_alpha", + "80277150": "geo_switch_mario_stand_run", + "802771bc": "geo_switch_mario_eyes", + "80277294": "geo_mario_tilt_torso", + "802773a4": "geo_mario_head_rotation", + "802774f4": "geo_switch_mario_hand", + "802775cc": "geo_mario_hand_foot_scaler", + "802776d8": "geo_switch_mario_cap_effect", + "80277740": "geo_switch_mario_cap_on_off", + "80277824": "geo_mario_rotate_wing_cap_wings", + "8027795c": "geo_switch_mario_hand_grab_pos", + "80277b14": "geo_render_mirror_mario", + "80277d6c": "geo_mirror_mario_backface_culling", + "80277ee0": "set_segment_base_addr", + "80277f20": "get_segment_base_addr", + "80277f50": "segmented_to_virtual", + "80277fa8": "virtual_to_segmented", + "80277ff0": "move_segment_table_to_dmem", + "80278074": "main_pool_init", + "80278120": "main_pool_alloc", + "80278238": "main_pool_free", + "80278358": "main_pool_realloc", + "802783c8": "main_pool_available", + "802783e8": "main_pool_push_state", + "80278498": "main_pool_pop_state", + "8027868c": "load_segment", + "802786f0": "load_to_fixed_pool_addr", + "802787d8": "load_segment_decompress", + "802788b4": "load_segment_decompress_heap", + "80278974": "load_engine_code_segment", + "80278a14": "alloc_only_pool_init", + "80278ab8": "alloc_only_pool_alloc", + "80278b28": "alloc_only_pool_resize", + "80278b98": "mem_pool_init", + "80278c58": "mem_pool_alloc", + "80278d74": "mem_pool_free", + "80278f2c": "alloc_display_list", + "80279028": "func_80278A78", + "80279084": "load_patchable_table", + "80279840": "save_file_do_save", + "802798fc": "save_file_erase", + "80279960": "save_file_copy", + "802799dc": "save_file_load_all", + "80279bc8": "save_file_reload", + "80279c44": "save_file_collect_star_or_key", + "80279e44": "save_file_exists", + "80279e80": "save_file_get_max_coin_score", + "80279f80": "save_file_get_course_star_count", + "8027a010": "save_file_get_total_star_count", + "8027a0a8": "save_file_set_flags", + "8027a0f4": "save_file_clear_flags", + "8027a16c": "save_file_get_flags", + "8027a1c8": "save_file_get_star_flags", + "8027a23c": "save_file_set_star_flags", + "8027a310": "save_file_get_course_coin_score", + "8027a340": "save_file_is_cannon_unlocked", + "8027a390": "save_file_set_cannon_unlocked", + "8027a418": "save_file_set_cap_pos", + "8027a4ac": "save_file_get_cap_pos", + "8027a564": "save_file_set_sound_mode", + "8027a5b4": "save_file_get_sound_mode", + "8027a5d4": "save_file_move_cap_to_default_location", + "8027a698": "disable_warp_checkpoint", + "8027a6b0": "check_if_should_set_warp_checkpoint", + "8027a718": "check_warp_checkpoint", + "8027a7d0": "override_viewport_and_clip", + "8027a83c": "set_warp_transition_rgb", + "8027a8b0": "print_intro_text", + "8027a93c": "get_mario_spawn_type", + "8027a9c8": "area_get_warp_node", + "8027aa28": "area_get_warp_node_from_params", + "8027aa74": "load_obj_warp_nodes", + "8027ab04": "clear_areas", + "8027ad74": "clear_area_graph_nodes", + "8027ae44": "load_area", + "8027af48": "unload_area", + "8027afbc": "load_mario_area", + "8027b038": "unload_mario_area", + "8027b0c0": "change_area", + "8027b164": "area_update_objects", + "8027b1a0": "play_transition", + "8027b35c": "play_transition_after_delay", + "8027b3b4": "render_game", + "8027cf38": "geo_set_animation_globals", + "8027da84": "geo_process_held_object", + "8027de68": "geo_try_process_children", + "8027dea8": "geo_process_node_and_siblings", + "8027e130": "geo_process_root", + "8027e3e0": "profiler_log_thread5_time", + "8027e490": "profiler_log_thread4_time", + "8027e520": "profiler_log_gfx_time", + "8027e5cc": "profiler_log_vblank_time", + "8027e65c": "draw_profiler_bar", + "8027e958": "draw_reference_profiler_bars", + "8027ebcc": "draw_profiler_mode_1", + "8027eeac": "draw_profiler_mode_0", + "8027f460": "draw_profiler", + "8027f4e0": "decompress", + "8027f590": "set_camera_shake_from_hit", + "8027f8b8": "set_environmental_camera_shake", + "8027f9f0": "set_camera_shake_from_point", + "8027fb74": "unused_set_camera_pitch_shake_env", + "8027fc18": "calc_y_to_curr_floor", + "8027fe20": "focus_on_mario", + "8027fff8": "set_camera_height", + "80280368": "look_down_slopes", + "802804f4": "pan_ahead_of_player", + "802806a4": "find_in_bounds_yaw_wdw_bob_thi", + "80280810": "update_radial_camera", + "80280970": "update_8_directions_camera", + "80280b00": "radial_camera_move", + "80281188": "lakitu_zoom", + "802813bc": "radial_camera_input_default", + "802813ec": "update_yaw_and_dist_from_c_up", + "8028146c": "mode_radial_camera", + "80281588": "mode_8_directions_camera", + "802816a0": "update_outward_radial_camera", + "802817fc": "mode_outward_radial_camera", + "80281904": "update_parallel_tracking_camera", + "80282280": "update_fixed_camera", + "802826a0": "update_boss_fight_camera", + "80282c0c": "unused_update_mode_5_camera", + "80282c3c": "mode_boss_fight_camera", + "80282c7c": "mode_parallel_tracking_camera", + "80282ce0": "mode_fixed_camera", + "80282d78": "update_behind_mario_camera", + "80283340": "mode_behind_mario", + "80283578": "update_slide_camera", + "802839e4": "mode_behind_mario_camera", + "80283a18": "nop_update_water_camera", + "80283a34": "mode_water_surface_camera", + "80283a68": "update_mario_camera", + "80283af8": "update_default_camera", + "80284cb8": "mode_default_camera", + "80284cfc": "mode_lakitu_camera", + "80284d38": "mode_mario_camera", + "80284d74": "update_spiral_stairs_camera", + "802850ac": "mode_spiral_stairs_camera", + "802850ec": "update_slide_or_0f_camera", + "802851dc": "mode_slide_camera", + "8028526c": "store_lakitu_cam_info_for_c_up", + "802852f4": "set_mode_c_up", + "80285370": "exit_c_up", + "80285808": "update_c_up", + "802858a4": "move_mario_head_c_up", + "80285a2c": "move_into_c_up", + "80285d20": "mode_c_up_camera", + "80285ed8": "update_in_cannon", + "80285f60": "mode_cannon_camera", + "8028603c": "transition_next_state", + "80286088": "transition_to_camera_mode", + "80286188": "set_camera_mode", + "80286420": "update_lakitu", + "802868f8": "update_camera", + "80286f68": "reset_camera", + "8028724c": "init_camera", + "802879ec": "zoom_out_if_paused_and_outside", + "80287bc4": "select_mario_cam_mode", + "80287be0": "create_camera", + "80287cb8": "update_graph_node_camera", + "80287d30": "geo_camera_main", + "80287dc0": "stub_camera_2", + "80287dd4": "stub_camera_3", + "80287de8": "vec3f_sub", + "80287e28": "object_pos_to_vec3f", + "80287e50": "vec3f_to_object_pos", + "80287e78": "unused_object_angle_to_vec3s", + "80287ea0": "evaluate_cubic_spline", + "802882e4": "move_point_along_spline", + "80288624": "cam_select_alt_mode", + "80288718": "set_cam_angle", + "80288888": "set_handheld_shake", + "802889b0": "shake_camera_handheld", + "80288ce4": "find_c_buttons_pressed", + "80288e68": "update_camera_hud_status", + "80288f5c": "collide_with_walls", + "80289198": "vec3f_compare", + "80289214": "clamp_pitch", + "802892d8": "is_within_100_units_of_mario", + "8028935c": "set_or_approach_f32_asymptotic", + "802893f4": "approach_f32_asymptotic_bool", + "80289488": "approach_f32_asymptotic", + "802894b4": "approach_s16_asymptotic_bool", + "8028956c": "approach_s16_asymptotic", + "80289610": "approach_vec3f_asymptotic", + "80289684": "set_or_approach_vec3f_asymptotic", + "802896f8": "approach_vec3s_asymptotic", + "8028976c": "camera_approach_s16_symmetric_bool", + "8028984c": "camera_approach_s16_symmetric", + "8028993c": "set_or_approach_s16_symmetric", + "802899cc": "camera_approach_f32_symmetric_bool", + "80289b0c": "camera_approach_f32_symmetric", + "80289c00": "random_vec3s", + "80289d20": "reduce_by_dist_from_camera", + "80289f88": "clamp_positions_and_find_yaw", + "8028a080": "calc_avoid_yaw", + "8028a0f4": "is_surf_within_bounding_box", + "8028a4ec": "is_behind_surface", + "8028a6bc": "is_range_behind_surface", + "8028a7ec": "is_mario_behind_surface", + "8028a834": "scale_along_line", + "8028a8e8": "is_pos_in_bounds", + "8028aa28": "calculate_pitch", + "8028aad8": "calculate_yaw", + "8028ab60": "calculate_angles", + "8028ac28": "calc_abs_dist", + "8028accc": "calc_hor_dist", + "8028ad4c": "rotate_in_xz", + "8028ae1c": "rotate_in_yz", + "8028aef0": "set_camera_pitch_shake", + "8028af4c": "set_camera_yaw_shake", + "8028b00c": "set_camera_roll_shake", + "8028b068": "set_pitch_shake_from_point", + "8028b11c": "set_yaw_shake_from_point", + "8028b1d0": "increment_shake_offset", + "8028b218": "shake_camera_pitch", + "8028b32c": "shake_camera_yaw", + "8028b438": "shake_camera_roll", + "8028b50c": "offset_yaw_outward_radial", + "8028b724": "cutscene_intro_peach_play_message_music", + "8028b754": "cutscene_intro_peach_play_lakitu_flying_music", + "8028b784": "play_camera_buzz_if_cdown", + "8028b7c4": "play_camera_buzz_if_cbutton", + "8028b804": "play_camera_buzz_if_c_sideways", + "8028b850": "play_sound_cbutton_up", + "8028b884": "play_sound_cbutton_down", + "8028b8b8": "play_sound_cbutton_side", + "8028b8ec": "play_sound_button_change_blocked", + "8028b920": "play_sound_rbutton_changed", + "8028b954": "play_sound_if_cam_switched_to_lakitu_or_mario", + "8028b9c4": "radial_camera_input", + "8028bd34": "trigger_cutscene_dialog", + "8028bd98": "handle_c_button_movement", + "8028c038": "clear_cutscene_vars", + "8028c13c": "start_cutscene", + "8028c18c": "determine_dance_cutscene", + "8028c26c": "open_door_cutscene", + "8028c2c8": "get_cutscene_from_mario_status", + "8028c7a0": "warp_camera", + "8028c8f0": "approach_camera_height", + "8028c9ac": "stub_camera_4", + "8028c9cc": "set_focus_rel_mario", + "8028cbf0": "offset_rotated", + "8028cd94": "offset_rotated_coords", + "8028cdec": "determine_pushing_or_pulling_door", + "8028ce24": "next_lakitu_state", + "8028d44c": "set_camera_mode_fixed", + "8028d5ac": "set_camera_mode_8_directions", + "8028d5fc": "set_camera_mode_boss_fight", + "8028d658": "set_camera_mode_close_cam", + "8028d698": "set_camera_mode_radial", + "8028d79c": "parallel_tracking_init", + "8028d888": "set_fixed_cam_axis_sa_lobby", + "8028d92c": "check_blocking_area_processing", + "8028da18": "cam_rr_exit_building_side", + "8028da50": "cam_rr_exit_building_top", + "8028daec": "cam_rr_enter_building_window", + "8028db38": "cam_rr_enter_building", + "8028dbb4": "cam_rr_enter_building_side", + "8028dbf4": "cam_cotmc_exit_waterfall", + "8028dc1c": "cam_sl_snowman_head_8dir", + "8028dc70": "cam_sl_free_roam", + "8028dca4": "move_camera_through_floor_while_descending", + "8028dd48": "cam_hmc_enter_maze", + "8028de2c": "cam_hmc_elevator_black_hole", + "8028de5c": "cam_hmc_elevator_maze_emergency_exit", + "8028de90": "cam_hmc_elevator_lake", + "8028dec4": "cam_hmc_elevator_maze", + "8028def8": "cam_ssl_enter_pyramid_top", + "8028df24": "cam_ssl_pyramid_center", + "8028df6c": "cam_ssl_boss_room", + "8028dfb4": "cam_thi_move_cam_through_tunnel", + "8028dfe8": "cam_thi_look_through_tunnel", + "8028e01c": "cam_bob_tower", + "8028e064": "cam_bob_default_free_roam", + "8028e098": "cam_castle_hmc_start_pool_cutscene", + "8028e0ec": "cam_castle_lobby_entrance", + "8028e164": "cam_castle_look_upstairs", + "8028e210": "cam_castle_basement_look_downstairs", + "8028e298": "cam_castle_enter_lobby", + "8028e300": "cam_castle_enter_spiral_stairs", + "8028e38c": "cam_castle_close_mode", + "8028e3b8": "cam_castle_leave_lobby_sliding_door", + "8028e3f0": "cam_castle_enter_lobby_sliding_door", + "8028e41c": "cam_bbh_room_6", + "8028e450": "cam_bbh_fall_off_roof", + "8028e47c": "cam_bbh_fall_into_pool", + "8028e524": "cam_bbh_room_1", + "8028e55c": "cam_bbh_leave_front_door", + "8028e594": "cam_bbh_room_2_lower", + "8028e5cc": "cam_bbh_room_4", + "8028e604": "cam_bbh_room_8", + "8028e63c": "cam_bbh_room_5_library", + "8028e674": "cam_bbh_room_5_library_to_hidden_transition", + "8028e6c4": "cam_bbh_room_5_hidden_to_library_transition", + "8028e714": "cam_bbh_room_5_hidden", + "8028e758": "cam_bbh_room_3", + "8028e790": "cam_bbh_room_7_mr_i", + "8028e7c8": "cam_bbh_room_7_mr_i_to_coffins_transition", + "8028e818": "cam_bbh_room_7_coffins_to_mr_i_transition", + "8028e868": "cam_bbh_elevator_room_lower", + "8028e8a0": "cam_bbh_room_0_back_entrance", + "8028e8cc": "cam_bbh_elevator", + "8028e930": "cam_bbh_room_12_upper", + "8028e974": "cam_bbh_enter_front_door", + "8028e9a0": "cam_bbh_room_2_library", + "8028e9d8": "cam_bbh_room_2_library_to_trapdoor_transition", + "8028ea28": "cam_bbh_room_2_trapdoor", + "8028ea60": "cam_bbh_room_2_trapdoor_transition", + "8028eab0": "cam_bbh_room_9_attic", + "8028eae8": "cam_bbh_room_9_attic_transition", + "8028eb38": "cam_bbh_room_9_mr_i_transition", + "8028eb88": "cam_bbh_room_13_balcony", + "8028ebc0": "cam_bbh_room_0", + "8028ec04": "cam_ccm_enter_slide_shortcut", + "8028ec2c": "cam_ccm_leave_slide_shortcut", + "8028ec58": "surface_type_modes", + "8028ed30": "set_mode_if_not_set_by_surface", + "8028ed98": "surface_type_modes_thi", + "8028eeb0": "camera_course_processing", + "8028f670": "resolve_geometry_collisions", + "8028f914": "rotate_camera_around_walls", + "8028fc9c": "find_mario_floor_and_ceil", + "8028fe24": "start_object_cutscene", + "8028fe58": "start_object_cutscene_without_focus", + "8028fe84": "unused_dialog_cutscene_response", + "8028ff04": "cutscene_object_with_dialog", + "8028ffc8": "cutscene_object_without_dialog", + "8029000c": "cutscene_object", + "80290098": "update_camera_yaw", + "802900e0": "cutscene_reset_spline", + "80290104": "stop_cutscene_and_retrieve_stored_info", + "80290168": "cap_switch_save", + "802901a4": "init_spline_point", + "802901fc": "copy_spline_segment", + "802903b8": "cutscene_common_set_dialog_state", + "802904a8": "cutscene_intro_peach_start_letter_music", + "802904e4": "cutscene_intro_peach_start_flying_music", + "8029051c": "reset_pan_distance", + "8029053c": "player2_rotate_cam", + "80290784": "store_info_cannon", + "802907f4": "retrieve_info_cannon", + "80290864": "store_info_star", + "802908e8": "retrieve_info_star", + "802909d0": "pan_camera", + "80290a5c": "cutscene_shake_explosion", + "80290abc": "rotate_and_move_vec3f", + "80290b54": "set_flag_post_door", + "80290ba4": "cutscene_soften_music", + "80290bd8": "cutscene_unsoften_music", + "80290c1c": "cutscene_unused_start", + "80290c30": "cutscene_unused_loop", + "80290c44": "cutscene_ending_mario_fall_start", + "80290c9c": "cutscene_ending_mario_fall_focus_mario", + "80290d90": "cutscene_ending_mario_fall", + "80290e00": "cutscene_ending_mario_land_closeup", + "80290e74": "cutscene_ending_reset_spline", + "80290eb0": "cutscene_ending_fly_up_to_window", + "80290f1c": "cutscene_ending_stars_free_peach", + "80290f8c": "cutscene_ending_mario_land", + "80291074": "cutscene_ending_peach_appear_closeup", + "80291108": "cutscene_ending_peach_appears", + "802911c8": "cutscene_ending_peach_descends_start", + "80291208": "cutscene_ending_follow_peach_descent", + "8029127c": "cutscene_ending_peach_descent_lower_focus", + "802912b8": "cutscene_ending_peach_descent_back_to_mario", + "80291354": "cutscene_ending_peach_descends", + "8029142c": "cutscene_ending_mario_to_peach", + "802914cc": "cutscene_ending_look_up_at_castle", + "80291514": "cutscene_ending_peach_wakeup", + "802915d4": "cutscene_ending_dialog", + "80291654": "cutscene_ending_kiss_closeup", + "802916b8": "cutscene_ending_kiss_here_we_go", + "80291774": "cutscene_ending_kiss", + "802917e4": "cutscene_ending_look_at_sky", + "8029184c": "cutscene_ending_zoom_fov", + "80291870": "cutscene_ending_cake_for_mario", + "80291924": "cutscene_ending_stop", + "80291964": "cutscene_grand_star_start", + "802919dc": "cutscene_grand_star_front_of_mario", + "80291ab4": "cutscene_grand_star_mario_jump", + "80291b18": "cutscene_grand_star_accel_cvar2", + "80291b68": "cutscene_grand_star_approach_mario", + "80291bf4": "cutscene_grand_star_move_cvar2", + "80291c3c": "cutscene_grand_star_focus_mario", + "80291cd0": "cutscene_grand_star", + "80291db0": "cutscene_grand_star_fly_start", + "80291e84": "cutscene_grand_star_fly_move_to_mario", + "80291f18": "cutscene_grand_star_fly_mario_offscreen", + "80292038": "cutscene_grand_star_fly_app_cvars", + "80292164": "cutscene_grand_star_fly", + "802921fc": "focus_in_front_of_mario", + "8029228c": "cutscene_dance_move_to_mario", + "80292324": "cutscene_dance_rotate", + "80292370": "cutscene_dance_rotate_move_back", + "802923b8": "cutscene_dance_rotate_move_towards_mario", + "80292414": "cutscene_dance_default_focus_mario", + "8029244c": "cutscene_dance_rotate_focus_mario", + "80292484": "cutscene_dance_shake_fov", + "802924b8": "cutscene_dance_default_rotate", + "80292628": "star_dance_bound_yaw", + "802926dc": "cutscene_dance_closeup_start", + "802927d0": "cutscene_dance_closeup_focus_mario", + "80292868": "cutscene_dance_closeup_fly_above", + "80292974": "cutscene_dance_closeup_fly_closer", + "80292a20": "cutscene_dance_closeup_zoom", + "80292a4c": "cutscene_dance_closeup_shake_fov", + "80292a80": "cutscene_dance_closeup", + "80292c00": "cutscene_dance_fly_away_start", + "80292d80": "cutscene_dance_fly_away_approach_mario", + "80292e2c": "cutscene_dance_fly_away_focus_mario", + "80292ec4": "cutscene_pan_cvar9", + "80292f40": "cutscene_dance_fly_rotate_around_mario", + "80292f98": "cutscene_dance_fly_away_rotate_while_flying", + "80292fe4": "cutscene_dance_fly_away_shake_fov", + "80293018": "cutscene_dance_fly_away", + "802930f0": "cutscene_key_dance_jump_cvar", + "80293164": "cutscene_key_dance_jump_closeup", + "802931c0": "cutscene_key_dance_jump_lower_left", + "80293220": "cutscene_key_dance_jump_above", + "8029328c": "cutscene_key_dance_jump_last", + "802932f4": "cutscene_key_dance_shake_fov", + "80293328": "cutscene_key_dance_handheld_shake", + "80293354": "cutscene_key_dance_focus_mario", + "8029338c": "cutscene_key_dance", + "80293488": "cutscene_bowser_area_shake_fov", + "802934b4": "cutscene_bowser_area_start_bowser_walking", + "802934d8": "cutscene_bowser_arena_set_pos", + "80293548": "cutscene_bowser_arena_focus_sine", + "802935e0": "cutscene_bowser_arena_set_focus", + "80293624": "cutscene_bowser_arena_adjust_offsets", + "8029369c": "cutscene_bowser_arena_pan_left", + "802936dc": "cutscene_bowser_arena_mario_dialog", + "80293708": "cutscene_stop_dialog", + "80293734": "cutscene_bowser_arena_start", + "802937e8": "bowser_fight_intro_dialog", + "8029386c": "cutscene_bowser_arena_dialog", + "802938c8": "cutscene_bowser_arena_end", + "80293944": "cutscene_bowser_arena", + "80293abc": "cutscene_star_spawn_store_info", + "80293ae8": "cutscene_star_spawn_focus_star", + "80293b70": "cutscene_star_spawn_update_boss_fight", + "80293bf4": "cutscene_star_spawn_fly_back", + "80293c2c": "cutscene_star_spawn", + "80293cb0": "cutscene_star_spawn_back", + "80293d5c": "cutscene_star_spawn_end", + "80293d90": "cutscene_exit_waterfall_warp", + "80293dd4": "cutscene_exit_to_castle_grounds_focus_mario", + "80293e7c": "cutscene_exit_waterfall", + "80293ed8": "cutscene_exit_to_castle_grounds_end", + "80293f2c": "cutscene_exit_fall_to_castle_grounds_warp", + "80293f70": "cutscene_exit_fall_to_castle_grounds", + "80293fcc": "cutscene_red_coin_star_start", + "80294024": "cutscene_red_coin_star_focus_xz", + "80294088": "cutscene_red_coin_star_focus_y", + "802940cc": "cutscene_red_coin_star_look_up_at_star", + "8029410c": "cutscene_red_coin_star_warp", + "802942cc": "cutscene_red_coin_star_set_fov", + "802942f0": "cutscene_red_coin_star", + "802943d4": "cutscene_red_coin_star_end", + "80294428": "cutscene_goto_cvar_pos", + "80294718": "cutscene_prepare_cannon_start", + "802947a4": "cutscene_prepare_cannon_fly_to_cannon", + "8029480c": "cannon_approach_prev", + "802948a0": "cutscene_prepare_cannon_fly_back", + "80294a14": "cutscene_prepare_cannon", + "80294a94": "cutscene_prepare_cannon_end", + "80294ae8": "water_death_move_to_mario_side", + "80294b78": "death_goto_mario", + "80294bb4": "cutscene_death_standing_start", + "80294c28": "cutscene_death_standing_goto_mario", + "80294c5c": "cutscene_death_standing", + "80294cc4": "cutscene_death_stomach_start", + "80294d48": "cutscene_death_stomach_goto_mario", + "80294db4": "cutscene_death_stomach", + "80294e24": "cutscene_bbh_death_start", + "80294ea8": "cutscene_bbh_death_goto_mario", + "80294ee8": "cutscene_bbh_death", + "80294f58": "cutscene_quicksand_death_start", + "80294f94": "cutscene_quicksand_death_goto_mario", + "80294fec": "cutscene_quicksand_death", + "802950b0": "cutscene_suffocation_fly_away", + "80295140": "cutscene_suffocation_stay_above_gas", + "802951f0": "cutscene_suffocation_rotate", + "80295270": "cutscene_suffocation", + "80295310": "cutscene_enter_pool_start", + "802953dc": "cutscene_enter_pool_loop", + "80295418": "cutscene_enter_pool", + "80295480": "cutscene_pyramid_top_explode_start", + "802954ec": "cutscene_pyramid_top_explode_zoom_in", + "80295518": "cutscene_pyramid_top_explode_focus", + "80295580": "cutscene_pyramid_top_explode_warp", + "80295670": "cutscene_pyramid_top_explode_closeup", + "80295740": "cutscene_pyramid_top_explode_cam_shake", + "8029576c": "cutscene_pyramid_top_explode_warp_back", + "802957c8": "cutscene_pyramid_top_explode", + "80295894": "cutscene_pyramid_top_explode_end", + "802958d4": "cutscene_enter_pyramid_top_start", + "80295930": "cutscene_enter_pyramid_top", + "80295a58": "cutscene_dialog_start", + "80295bf0": "cutscene_dialog_move_mario_shoulder", + "80295e24": "cutscene_dialog_create_dialog_box", + "80295e8c": "cutscene_dialog", + "80295fb0": "cutscene_dialog_set_flag", + "80295fd8": "cutscene_dialog_end", + "80296020": "cutscene_read_message_start", + "80296160": "cutscene_read_message", + "802962c8": "cutscene_read_message_set_flag", + "802962f0": "cutscene_read_message_end", + "80296318": "cutscene_exit_succ_start", + "802963b8": "cutscene_non_painting_set_cam_pos", + "8029652c": "cutscene_non_painting_set_cam_focus", + "8029665c": "cutscene_exit_bowser_succ_focus_left", + "8029669c": "cutscene_exit_bowser_key_toss_shake", + "802966e4": "cutscene_exit_succ_shake_landing", + "80296710": "cutscene_exit_bowser_succ", + "802967c4": "cutscene_non_painting_end", + "8029685c": "cutscene_exit_non_painting_succ_override_cvar", + "802968a0": "cutscene_exit_non_painting_succ", + "8029695c": "cutscene_non_painting_death_start", + "802969f8": "cutscene_exit_bowser_death", + "80296a64": "cutscene_non_painting_death_override_offset", + "80296b30": "cutscene_non_painting_death", + "80296bc8": "cutscene_cap_switch_press_start", + "80296c4c": "cutscene_cap_switch_press_rotate_around_mario", + "80296d60": "cutscene_cap_switch_press_lower_cam", + "80296da8": "cutscene_cap_switch_press_approach_mario", + "80296eb4": "cutscene_cap_switch_press_pan_left", + "80296f38": "cutscene_cap_switch_press_create_dialog", + "80296fa8": "cutscene_cap_switch_press", + "80297148": "cutscene_unlock_key_door_start", + "8029720c": "cutscene_unlock_key_door_approach_mario", + "80297290": "cutscene_unlock_key_door_focus_lock", + "802972ec": "cutscene_unlock_key_door_stub", + "80297300": "cutscene_unlock_key_door_fly_back", + "80297384": "cutscene_unlock_key_door_fov_shake", + "802973b0": "cutscene_unlock_key_door", + "80297464": "intro_peach_move_camera_start_to_pipe", + "80297560": "peach_letter_text", + "8029758c": "play_sound_peach_reading_letter", + "802975c4": "cutscene_intro_peach_start_to_pipe_spline", + "8029762c": "cutscene_intro_peach_dialog", + "802976bc": "cutscene_intro_peach_follow_pipe_spline", + "80297728": "cutscene_intro_peach_clear_cutscene_status", + "80297748": "cutscene_intro_peach_zoom_fov", + "80297784": "cutscene_intro_peach_reset_spline", + "802977c8": "cutscene_intro_peach_handheld_shake_off", + "802977f4": "intro_pipe_exit_text", + "80297820": "play_sound_intro_turn_on_hud", + "8029784c": "cutscene_intro_peach_fly_to_pipe", + "80297908": "cutscene_intro_peach_mario_appears", + "80297a38": "cutscene_intro_peach_reset_fov", + "80297a64": "cutscene_intro_peach_letter", + "80297b58": "cutscene_end_waving_start", + "80297b84": "cutscene_end_waving", + "80297c14": "cutscene_credits_reset_spline", + "80297c40": "cutscene_credits", + "802980dc": "cutscene_sliding_doors_open_start", + "8029819c": "cutscene_sliding_doors_open_set_cvars", + "80298218": "cutscene_sliding_doors_go_under_doorway", + "80298254": "cutscene_sliding_doors_fly_back_up", + "80298290": "cutscene_sliding_doors_follow_mario", + "802983b4": "cutscene_sliding_doors_open", + "80298458": "cutscene_double_doors_end", + "802984a0": "cutscene_enter_painting_stub", + "802984b4": "cutscene_enter_painting", + "802987b0": "cutscene_exit_painting_start", + "8029894c": "cutscene_exit_painting_move_to_mario", + "802989e8": "cutscene_exit_painting_move_to_floor", + "80298af8": "cutscene_exit_painting", + "80298ba0": "cutscene_unused_exit_start", + "80298c2c": "cutscene_unused_exit_focus_mario", + "80298ccc": "cutscene_exit_painting_end", + "80298d44": "cutscene_enter_cannon_end", + "80298d9c": "cutscene_enter_cannon_raise", + "80298fe8": "cutscene_enter_cannon_start", + "80299100": "cutscene_door_start", + "80299154": "cutscene_door_fix_cam", + "802991a8": "cutscene_door_loop", + "802991f0": "cutscene_door_move_behind_mario", + "802992cc": "cutscene_door_follow_mario", + "80299360": "cutscene_door_end", + "80299404": "cutscene_door_mode", + "802994e8": "play_cutscene", + "8029a2f8": "cutscene_event", + "8029a37c": "cutscene_spawn_obj", + "8029a3b4": "set_fov_shake", + "8029a41c": "set_fov_shake_from_point", + "8029a4d0": "shake_camera_fov", + "8029a5e8": "set_fov_30", + "8029a60c": "approach_fov_20", + "8029a64c": "set_fov_45", + "8029a670": "set_fov_29", + "8029a694": "zoom_fov_30", + "8029a6f4": "fov_default", + "8029a858": "approach_fov_30", + "8029a894": "approach_fov_60", + "8029a8d0": "approach_fov_45", + "8029a968": "approach_fov_80", + "8029a9a4": "set_fov_bbh", + "8029aa3c": "geo_camera_fov", + "8029ab94": "set_fov_function", + "8029abb0": "cutscene_set_fov_shake_preset", + "8029ac30": "set_fov_shake_from_point_preset", + "8029aef8": "obj_rotate_towards_point", + "8029af98": "intro_peach_set_pos_and_opacity", + "8029b08c": "bhv_intro_peach_loop", + "8029b28c": "intro_lakitu_set_offset_from_camera", + "8029b358": "intro_lakitu_set_focus", + "8029b3c8": "intro_lakitu_set_pos_and_focus", + "8029b49c": "bhv_intro_lakitu_loop", + "8029bde4": "bhv_end_birds_1_loop", + "8029bf64": "bhv_end_birds_2_loop", + "8029c0e4": "spawn_child_obj_relative", + "8029c254": "bhv_intro_scene_loop", + "8029c770": "nop_change_course", + "8029c780": "copy_mario_state_to_object", + "8029c9cc": "spawn_particle", + "8029ca58": "bhv_mario_update", + "8029cb34": "update_objects_starting_at", + "8029cbc8": "update_objects_during_time_stop", + "8029cd28": "update_objects_in_list", + "8029cd98": "unload_deactivated_objects_in_list", + "8029ce58": "set_object_respawn_info_bits", + "8029cedc": "unload_objects_from_area", + "8029cfb0": "spawn_objects_from_info", + "8029d1d8": "stub_obj_list_processor_1", + "8029d1e8": "clear_objects", + "8029d324": "update_terrain_objects", + "8029d374": "update_non_terrain_objects", + "8029d428": "unload_deactivated_objects", + "8029d690": "update_objects", + "8029d890": "geo_update_projectile_pos_from_parent", + "8029d924": "geo_update_layer_transparency", + "8029db48": "geo_switch_anim_state", + "8029dbd4": "geo_switch_area", + "8029dcd4": "obj_update_pos_from_parent_transformation", + "8029dda8": "obj_apply_scale_to_matrix", + "8029de80": "create_transformation_from_matrices", + "8029e1b0": "obj_set_held_state", + "8029e27c": "lateral_dist_between_objects", + "8029e2f8": "dist_between_objects", + "8029e398": "cur_obj_forward_vel_approach_upward", + "8029e3e8": "approach_f32_signed", + "8029e494": "approach_f32_symmetric", + "8029e530": "approach_s16_symmetric", + "8029e5ec": "cur_obj_rotate_yaw_toward", + "8029e694": "obj_angle_to_object", + "8029e714": "obj_turn_toward_object", + "8029e8bc": "obj_set_parent_relative_pos", + "8029e914": "obj_set_pos", + "8029e96c": "obj_set_angle", + "8029e9ac": "spawn_object_abs_with_rot", + "8029ea24": "spawn_object_rel_with_rot", + "8029eaac": "spawn_obj_with_transform_flags", + "8029eb04": "spawn_water_droplet", + "8029ed20": "spawn_object_at_origin", + "8029edcc": "spawn_object", + "8029ee24": "try_to_spawn_object", + "8029eeb8": "spawn_object_with_scale", + "8029ef64": "spawn_object_relative", + "8029effc": "spawn_object_relative_with_scale", + "8029f070": "cur_obj_move_using_vel", + "8029f0c8": "obj_copy_graph_y_offset", + "8029f0e0": "obj_copy_pos_and_angle", + "8029f120": "obj_copy_pos", + "8029f148": "obj_copy_angle", + "8029f188": "obj_set_gfx_pos_from_pos", + "8029f1b0": "obj_init_animation", + "8029f200": "linear_mtxf_mul_vec3f", + "8029f274": "linear_mtxf_transpose_mul_vec3f", + "8029f2ec": "obj_apply_scale_to_transform", + "8029f3a8": "obj_copy_scale", + "8029f3d0": "obj_scale_xyz", + "8029f404": "obj_scale", + "8029f430": "cur_obj_scale", + "8029f464": "cur_obj_init_animation", + "8029f4b4": "cur_obj_init_animation_with_sound", + "8029f514": "cur_obj_init_animation_with_accel_and_sound", + "8029f59c": "obj_init_animation_with_sound", + "8029f600": "cur_obj_enable_rendering_and_become_tangible", + "8029f620": "cur_obj_enable_rendering", + "8029f644": "cur_obj_disable_rendering_and_become_intangible", + "8029f66c": "cur_obj_disable_rendering", + "8029f694": "cur_obj_unhide", + "8029f6bc": "cur_obj_hide", + "8029f6e0": "cur_obj_set_pos_relative", + "8029f7d8": "cur_obj_set_pos_relative_to_parent", + "8029f820": "cur_obj_enable_rendering_2", + "8029f848": "cur_obj_unused_init_on_floor", + "8029f8ec": "obj_set_face_angle_to_move_angle", + "8029f914": "get_object_list_from_behavior", + "8029f95c": "cur_obj_nearest_object_with_behavior", + "8029f998": "cur_obj_dist_to_nearest_object_with_behavior", + "8029f9ec": "cur_obj_find_nearest_object_with_behavior", + "8029fb1c": "find_unimportant_object", + "8029fb68": "count_unimportant_objects", + "8029fbdc": "count_objects_with_behavior", + "8029fc9c": "cur_obj_find_nearby_held_actor", + "8029fdb4": "cur_obj_change_action", + "8029fe00": "cur_obj_set_vel_from_mario_vel", + "8029fe6c": "cur_obj_reverse_animation", + "8029fea4": "cur_obj_extend_animation_if_at_end", + "8029ff04": "cur_obj_check_if_near_animation_end", + "8029ffa4": "cur_obj_check_if_at_animation_end", + "802a0008": "cur_obj_check_anim_frame", + "802a0050": "cur_obj_check_anim_frame_in_range", + "802a00ac": "cur_obj_check_frame_prior_current_frame", + "802a0114": "mario_is_in_air_action", + "802a0154": "mario_is_dive_sliding", + "802a0198": "cur_obj_set_y_vel_and_animation", + "802a01d8": "cur_obj_unrender_and_reset_state", + "802a0380": "cur_obj_get_thrown_or_placed", + "802a0474": "cur_obj_get_dropped", + "802a04c0": "cur_obj_set_model", + "802a04f0": "mario_set_flag", + "802a0514": "cur_obj_clear_interact_status_flag", + "802a0568": "obj_mark_for_deletion", + "802a057c": "cur_obj_disable", + "802a05b4": "cur_obj_become_intangible", + "802a05d4": "cur_obj_become_tangible", + "802a05f0": "obj_become_tangible", + "802a0604": "cur_obj_update_floor_height", + "802a064c": "cur_obj_update_floor_height_and_get_floor", + "802a079c": "cur_obj_apply_drag_xz", + "802a0e68": "cur_obj_move_y", + "802a113c": "cur_obj_unused_resolve_wall_collisions", + "802a11a8": "abs_angle_diff", + "802a120c": "cur_obj_move_xz_using_fvel_and_yaw", + "802a12a4": "cur_obj_move_y_with_terminal_vel", + "802a1308": "cur_obj_compute_vel_xz", + "802a1370": "increment_velocity_toward_range", + "802a1424": "obj_check_if_collided_with_object", + "802a148c": "cur_obj_set_behavior", + "802a14c4": "obj_set_behavior", + "802a14fc": "cur_obj_has_behavior", + "802a1554": "obj_has_behavior", + "802a15ac": "cur_obj_lateral_dist_from_mario_to_home", + "802a1634": "cur_obj_lateral_dist_to_home", + "802a16ac": "cur_obj_outside_home_square", + "802a1774": "cur_obj_outside_home_rectangle", + "802a184c": "cur_obj_set_pos_to_home", + "802a188c": "cur_obj_set_pos_to_home_and_stop", + "802a18dc": "cur_obj_shake_y", + "802a1930": "cur_obj_start_cam_event", + "802a1960": "set_mario_interact_hoot_if_in_range", + "802a19ac": "obj_set_billboard", + "802a19c8": "cur_obj_set_hitbox_radius_and_height", + "802a19f0": "cur_obj_set_hurtbox_radius_and_height", + "802a1b34": "obj_spawn_loot_blue_coins", + "802a1b8c": "obj_spawn_loot_yellow_coins", + "802a1bdc": "cur_obj_spawn_loot_coin_at_mario_pos", + "802a1c68": "cur_obj_abs_y_dist_to_home", + "802a1cc4": "cur_obj_advance_looping_anim", + "802a1f3c": "cur_obj_resolve_wall_collisions", + "802a2320": "cur_obj_update_floor_and_walls", + "802a2348": "cur_obj_move_standard", + "802a25b4": "cur_obj_move_using_vel_and_gravity", + "802a2644": "cur_obj_move_using_fvel_and_gravity", + "802a2674": "obj_set_pos_relative", + "802a2748": "cur_obj_angle_to_home", + "802a27b0": "obj_set_gfx_pos_at_obj_pos", + "802a2804": "obj_translate_local", + "802a2930": "obj_build_transform_from_pos_and_angle", + "802a2a18": "obj_set_throw_matrix_from_transform", + "802a2a84": "obj_build_transform_relative_to_parent", + "802a2b28": "obj_create_transform_from_self", + "802a2b6c": "cur_obj_rotate_move_angle_using_vel", + "802a2bc4": "cur_obj_rotate_face_angle_using_vel", + "802a2c1c": "cur_obj_set_face_angle_to_move_angle", + "802a2c5c": "cur_obj_follow_path", + "802a2ed4": "chain_segment_init", + "802a2f14": "random_f32_around_zero", + "802a2f5c": "obj_scale_random", + "802a2fc0": "obj_translate_xyz_random", + "802a308c": "obj_translate_xz_random", + "802a31e0": "cur_obj_set_pos_via_transform", + "802a3268": "cur_obj_reflect_move_angle_off_wall", + "802a32ac": "cur_obj_spawn_particles", + "802a34a4": "obj_set_hitbox", + "802a3604": "signum_positive", + "802a3634": "absf", + "802a3674": "absi", + "802a36a4": "cur_obj_wait_then_blink", + "802a3754": "cur_obj_is_mario_ground_pounding_platform", + "802a37ac": "spawn_mist_particles", + "802a37dc": "spawn_mist_particles_with_sound", + "802a3818": "cur_obj_push_mario_away", + "802a390c": "cur_obj_push_mario_away_from_cylinder", + "802a399c": "bhv_dust_smoke_loop", + "802a3a4c": "cur_obj_set_direction_table", + "802a3a88": "cur_obj_progress_direction_table", + "802a3b28": "stub_obj_helpers_3", + "802a3b40": "cur_obj_scale_over_time", + "802a3c18": "cur_obj_set_pos_to_home_with_debug", + "802a3cec": "stub_obj_helpers_4", + "802a3cfc": "cur_obj_is_mario_on_platform", + "802a3d40": "cur_obj_shake_y_until", + "802a3dd4": "cur_obj_move_up_and_down", + "802a3e30": "cur_obj_call_action_function", + "802a3ef8": "spawn_base_star_with_no_lvl_exit", + "802a3f24": "bit_shift_left", + "802a3f48": "cur_obj_mario_far_away", + "802a404c": "is_mario_moving_fast_or_in_air", + "802a40b8": "is_item_in_array", + "802a4120": "bhv_init_room", + "802a4210": "cur_obj_enable_rendering_if_mario_in_room", + "802a4360": "cur_obj_set_hitbox_and_die_if_attacked", + "802a4440": "obj_explode_and_spawn_coins", + "802a44f4": "obj_set_collision_data", + "802a452c": "cur_obj_if_hit_wall_bounce_away", + "802a4564": "cur_obj_hide_if_mario_far_away_y", + "802a45e4": "geo_offset_klepto_held_object", + "802a462c": "geo_offset_klepto_debug", + "802a46cc": "obj_is_hidden", + "802a4704": "enable_time_stop", + "802a4728": "disable_time_stop", + "802a4750": "set_time_stop_flags", + "802a4774": "clear_time_stop_flags", + "802a47a0": "cur_obj_can_mario_activate_textbox", + "802a48bc": "cur_obj_can_mario_activate_textbox_2", + "802a4960": "cur_obj_update_dialog", + "802a4be4": "cur_obj_update_dialog_with_cutscene", + "802a4f04": "cur_obj_has_model", + "802a4f58": "cur_obj_align_gfx_with_floor", + "802a5034": "mario_is_within_rectangle", + "802a50fc": "cur_obj_shake_screen", + "802a513c": "obj_attack_collided_from_other_object", + "802a51ac": "cur_obj_was_attacked_or_ground_pounded", + "802a5228": "obj_copy_behavior_params", + "802a5248": "cur_obj_init_animation_and_anim_frame", + "802a5288": "cur_obj_init_animation_and_check_if_near_end", + "802a52c4": "cur_obj_init_animation_and_extend_if_at_end", + "802a52f8": "cur_obj_check_grabbed_mario", + "802a5358": "player_performed_grab_escape_action", + "802a540c": "cur_obj_unused_play_footstep_sound", + "802a5460": "enable_time_stop_including_mario", + "802a5498": "disable_time_stop_including_mario", + "802a54d8": "cur_obj_check_interacted", + "802a5524": "cur_obj_spawn_loot_blue_coin", + "802a5588": "cur_obj_spawn_star_at_y_offset", + "802a5620": "star_door_update_pos", + "802a56bc": "bhv_star_door_loop", + "802a58dc": "bhv_piranha_particle_loop", + "802a597c": "mr_i_piranha_particle_act_0", + "802a5a44": "mr_i_piranha_particle_act_1", + "802a5aa0": "bhv_mr_i_particle_loop", + "802a5acc": "spawn_mr_i_particle", + "802a5bd4": "bhv_mr_i_body_loop", + "802a5d4c": "mr_i_act_3", + "802a6518": "mr_i_act_2", + "802a68a0": "mr_i_act_1", + "802a6ad8": "mr_i_act_0", + "802a6b7c": "bhv_mr_i_loop", + "802a6c20": "bhv_pole_init", + "802a6c74": "bhv_giant_pole_loop", + "802a6cf4": "bhv_thi_huge_island_top_loop", + "802a6d64": "bhv_thi_tiny_island_top_loop", + "802a6ee4": "cap_switch_act_0", + "802a7020": "cap_switch_act_1", + "802a708c": "cap_switch_act_2", + "802a7160": "cap_switch_act_3", + "802a7170": "bhv_cap_switch_loop", + "802a719c": "geo_update_held_mario_pos", + "802a7230": "bhv_bobomb_anchor_mario_loop", + "802a7264": "king_bobomb_act_0", + "802a7384": "mario_is_far_below_object", + "802a73d8": "king_bobomb_act_2", + "802a7598": "king_bobomb_act_3", + "802a7804": "king_bobomb_act_1", + "802a78d8": "king_bobomb_act_6", + "802a7a60": "king_bobomb_act_7", + "802a7b1c": "king_bobomb_act_8", + "802a7b5c": "king_bobomb_act_4", + "802a7d14": "king_bobomb_act_5", + "802a7fbc": "king_bobomb_move", + "802a8064": "bhv_king_bobomb_loop", + "802a816c": "bhv_beta_chest_bottom_init", + "802a81e8": "bhv_beta_chest_bottom_loop", + "802a821c": "bhv_beta_chest_lid_loop", + "802a8370": "bhv_water_air_bubble_init", + "802a83a0": "bhv_water_air_bubble_loop", + "802a8630": "bhv_bubble_wave_init", + "802a86bc": "scale_bubble_random", + "802a870c": "bhv_bubble_maybe_loop", + "802a88a4": "bhv_small_water_wave_loop", + "802a8a38": "scale_bubble_sin", + "802a8b18": "bhv_particle_init", + "802a8bc0": "bhv_particle_loop", + "802a8c88": "bhv_small_bubbles_loop", + "802a8cdc": "bhv_fish_group_loop", + "802a8d48": "bhv_water_waves_init", + "802a8d98": "bhv_cannon_base_unused_loop", + "802a8dc0": "opened_cannon_act_0", + "802a8f40": "opened_cannon_act_4", + "802a9114": "opened_cannon_act_6", + "802a92fc": "opened_cannon_act_5", + "802a93f8": "opened_cannon_act_1", + "802a9440": "opened_cannon_act_2", + "802a9460": "opened_cannon_act_3", + "802a9498": "bhv_cannon_base_loop", + "802a94f8": "bhv_cannon_barrel_loop", + "802a958c": "common_anchor_mario_behavior", + "802a9708": "bhv_chuckya_anchor_mario_loop", + "802a973c": "unknown_chuckya_function", + "802a98c4": "approach_forward_vel", + "802a9994": "chuckya_act_0", + "802a9d08": "chuckya_act_1", + "802a9f54": "chuckya_act_3", + "802a9fc8": "chuckya_act_2", + "802aa02c": "chuckya_move", + "802aa0ac": "bhv_chuckya_loop", + "802aa1b8": "bhv_wf_breakable_wall_loop", + "802aa280": "check_mario_attacking", + "802aa3c8": "init_kickable_board_rock", + "802aa3f4": "bhv_kickable_board_loop", + "802aa700": "bhv_tower_door_loop", + "802aa774": "bhv_wf_rotating_wooden_platform_loop", + "802aa830": "bhv_rotating_platform_loop", + "802aa948": "set_koopa_shell_underwater_hitbox", + "802aa97c": "bhv_koopa_shell_underwater_loop", + "802aaa60": "bhv_warp_loop", + "802aab54": "bhv_fading_warp_loop", + "802aac48": "bhv_white_puff_exploding_loop", + "802aae8c": "spawn_mist_particles_variable", + "802aaf48": "bhv_spawned_star_init", + "802aaffc": "set_sparkle_spawn_star_hitbox", + "802ab060": "set_home_to_mario", + "802ab158": "set_y_home_to_pos", + "802ab18c": "slow_star_rotation", + "802ab1c8": "bhv_spawned_star_loop", + "802ab558": "bhv_spawn_star_no_level_exit", + "802ab5c8": "bhv_coin_sparkles_init", + "802ab650": "bhv_yellow_coin_init", + "802ab70c": "bhv_yellow_coin_loop", + "802ab748": "bhv_temp_coin_loop", + "802ab7a4": "bhv_coin_init", + "802ab860": "bhv_coin_loop", + "802aba40": "bhv_coin_formation_spawn_loop", + "802abc04": "spawn_coin_in_formation", + "802abee4": "bhv_coin_formation_init", + "802abf0c": "bhv_coin_formation_loop", + "802ac068": "coin_inside_boo_act_1", + "802ac15c": "coin_inside_boo_act_0", + "802ac294": "bhv_coin_inside_boo_loop", + "802ac2c0": "bhv_coin_sparkles_loop", + "802ac2ec": "bhv_golden_coin_sparkles_loop", + "802ac3a8": "bhv_punch_tiny_triangle_loop", + "802ac4a0": "bhv_punch_tiny_triangle_init", + "802ac5b4": "bhv_wall_tiny_star_particle_loop", + "802ac678": "bhv_tiny_star_particles_init", + "802ac78c": "bhv_pound_tiny_star_particle_loop", + "802ac864": "bhv_pound_tiny_star_particle_init", + "802ac910": "door_animation_and_reset", + "802ac958": "set_door_camera_event", + "802ac9d0": "play_door_open_noise", + "802aca6c": "play_warp_door_open_noise", + "802acac8": "bhv_door_loop", + "802acc3c": "bhv_door_init", + "802ace80": "bhv_star_door_loop_2", + "802ad078": "grindel_thwomp_act_4", + "802ad10c": "grindel_thwomp_act_2", + "802ad1a4": "grindel_thwomp_act_3", + "802ad238": "grindel_thwomp_act_1", + "802ad2d0": "grindel_thwomp_act_0", + "802ad34c": "bhv_grindel_thwomp_loop", + "802ad378": "bhv_tumbling_bridge_platform_loop", + "802ad580": "tumbling_bridge_act_1", + "802ad76c": "tumbling_bridge_act_2", + "802ad7f4": "tumbling_bridge_act_3", + "802ad828": "tumbling_bridge_act_0", + "802ad890": "bhv_tumbling_bridge_loop", + "802ad8bc": "elevator_starting_shake", + "802ad8f0": "elevator_act_0", + "802ada4c": "elevator_act_1", + "802adb88": "elevator_act_2", + "802adce4": "elevator_act_4", + "802add70": "elevator_act_3", + "802addf8": "bhv_elevator_init", + "802adf6c": "bhv_elevator_loop", + "802adf98": "bhv_water_mist_spawn_loop", + "802adfd8": "bhv_water_mist_loop", + "802ae0cc": "spawn_triangle_break_particles", + "802ae238": "bhv_water_mist_2_loop", + "802ae304": "bhv_pound_white_puffs_init", + "802ae334": "spawn_mist_from_global", + "802ae360": "bhv_ground_sand_init", + "802ae394": "spawn_smoke_with_velocity", + "802ae45c": "clear_particle_flags", + "802ae48c": "bhv_ground_snow_init", + "802ae4c0": "spawn_wind_particles", + "802ae534": "bhv_wind_loop", + "802ae85c": "bhv_unused_particle_spawn_loop", + "802ae908": "bhv_ukiki_cage_star_loop", + "802aea6c": "ukiki_cage_act_wait_for_ukiki", + "802aeab8": "ukiki_cage_act_spin", + "802aeb1c": "ukiki_cage_act_fall", + "802aeb74": "ukiki_cage_act_hide", + "802aeb9c": "bhv_ukiki_cage_loop", + "802aebc8": "bhv_squishable_platform_loop", + "802aec40": "bhv_bitfs_sinking_platform_loop", + "802aeca8": "bhv_ddd_moving_pole_loop", + "802aecdc": "bhv_bitfs_sinking_cage_platform_loop", + "802aedc0": "bhv_beta_moving_flames_spawn_loop", + "802aeea4": "bhv_beta_moving_flames_loop", + "802aef1c": "bhv_flamethrower_flame_loop", + "802af1e8": "bhv_flamethrower_loop", + "802af3fc": "bhv_rr_rotating_bridge_platform_loop", + "802af448": "bhv_bouncing_fireball_flame_loop", + "802af5f8": "bhv_bouncing_fireball_loop", + "802af7c4": "bhv_bowser_shock_wave_loop", + "802af9cc": "bhv_black_smoke_upward_loop", + "802afa0c": "bhv_black_smoke_bowser_loop", + "802afae4": "bhv_black_smoke_mario_loop", + "802afbf8": "bhv_flame_mario_loop", + "802afce4": "bhv_beta_fish_splash_spawner_loop", + "802afd1c": "bhv_spindrift_loop", + "802afee8": "bhv_wf_solid_tower_platform_loop", + "802aff30": "bhv_wf_elevator_tower_platform_loop", + "802b00e4": "bhv_wf_sliding_tower_platform_loop", + "802b0244": "spawn_and_init_wf_platforms", + "802b039c": "spawn_wf_platform_group", + "802b04b4": "bhv_tower_platform_group_loop", + "802b0614": "bhv_tree_snow_or_leaf_loop", + "802b0974": "bhv_snow_leaf_particle_spawn_init", + "802b0b9c": "square_plat_set_yaw_until_timer", + "802b0bec": "bhv_squarish_path_moving_loop", + "802b0d48": "bhv_piranha_plant_waking_bubbles_loop", + "802b0df0": "bhv_piranha_plant_bubble_loop", + "802b1278": "bhv_purple_switch_loop", + "802b14f4": "check_if_moving_over_floor", + "802b15e8": "bhv_pushable_loop", + "802b1714": "breakable_box_init", + "802b17f4": "hidden_breakable_box_actions", + "802b19d8": "hidden_unbreakable_box_actions", + "802b1ae0": "bhv_hidden_object_loop", + "802b1b2c": "bhv_breakable_box_loop", + "802b1bb0": "geo_move_mario_part_from_parent", + "802b1c54": "bhv_heave_ho_throw_mario_loop", + "802b1d7c": "heave_ho_act_1", + "802b1e6c": "heave_ho_act_2", + "802b1ff4": "heave_ho_act_3", + "802b20a0": "heave_ho_act_0", + "802b2154": "heave_ho_move", + "802b2278": "bhv_heave_ho_loop", + "802b2340": "bhv_ccm_touched_star_spawn_loop", + "802b23e0": "bhv_unused_poundable_platform", + "802b2494": "bhv_beta_trampoline_spring_loop", + "802b25ac": "bhv_beta_trampoline_top_loop", + "802b26a4": "jumping_box_act_0", + "802b27d8": "jumping_box_act_1", + "802b2824": "jumping_box_free_update", + "802b288c": "bhv_jumping_box_loop", + "802b29b8": "bhv_boo_cage_loop", + "802b2bc8": "spawn_sparkle_particles", + "802b2d10": "bhv_alpha_boo_key_loop", + "802b3108": "bhv_beta_boo_key_loop", + "802b3134": "arc_to_goal_pos", + "802b3250": "grand_star_zero_velocity", + "802b329c": "bhv_grand_star_loop", + "802b3600": "bhv_bowser_key_loop", + "802b37b8": "bhv_white_puff_smoke_init", + "802b3810": "bhv_bullet_bill_init", + "802b3830": "bullet_bill_act_0", + "802b38b8": "bullet_bill_act_1", + "802b394c": "bullet_bill_act_2", + "802b3b08": "bullet_bill_act_3", + "802b3b24": "bullet_bill_act_4", + "802b3be0": "bhv_bullet_bill_loop", + "802b3c2c": "bowser_tail_anchor_act_0", + "802b3cdc": "bowser_tail_anchor_act_1", + "802b3d10": "bowser_tail_anchor_act_2", + "802b3d74": "bhv_bowser_tail_anchor_loop", + "802b3df4": "bhv_bowser_flame_spawn_loop", + "802b4080": "bhv_bowser_body_anchor_loop", + "802b4184": "bowser_spawn_shockwave", + "802b41fc": "bowser_bounce", + "802b4288": "bowser_set_anim_look_up_and_walk", + "802b4300": "bowser_set_anim_slow_gait", + "802b4368": "bowser_set_anim_look_down", + "802b43dc": "bowser_initialize_action", + "802b4478": "bowser_act_text_wait", + "802b44bc": "bowser_act_intro_walk", + "802b45f4": "bowser_bitdw_act_controller", + "802b473c": "bowser_bitfs_act_controller", + "802b48d4": "bowser_general_bits_act_controller", + "802b4a1c": "bowser_set_act_jump", + "802b4a3c": "bowser_bits_act_controller", + "802b4af4": "bowser_reset_fallen_off_stage", + "802b4bac": "bowser_act_unused_slow_walk", + "802b4be8": "bowser_act_default", + "802b4ca4": "bowser_act_breath_fire", + "802b4d14": "bowser_act_walk_to_mario", + "802b4f00": "bowser_act_teleport", + "802b5104": "bowser_act_spit_fire_into_sky", + "802b5218": "bowser_act_hit_mine", + "802b53f4": "bowser_set_anim_in_air", + "802b5444": "bowser_land", + "802b5554": "bowser_short_second_hop", + "802b55cc": "bowser_act_jump", + "802b5798": "bowser_act_jump_towards_mario", + "802b58bc": "bowser_act_hit_edge", + "802b59cc": "bowser_act_spit_fire_onto_floor", + "802b5aec": "bowser_turn_on_timer", + "802b5c00": "bowser_act_turn_from_edge", + "802b5c40": "bowser_act_charge_mario", + "802b5f6c": "bowser_check_hit_mine", + "802b5fec": "bowser_act_thrown_dropped", + "802b611c": "bowser_set_goal_invisible", + "802b6190": "bowser_act_jump_onto_stage", + "802b6568": "bowser_act_dance", + "802b65d0": "bowser_spawn_grand_star_key", + "802b6670": "bowser_fly_back_dead", + "802b6730": "bowser_dead_bounce", + "802b67d4": "bowser_dead_wait_for_mario", + "802b6878": "bowser_dead_twirl_into_trophy", + "802b6a10": "bowser_dead_hide", + "802b6a78": "bowser_dead_not_bits_end", + "802b6bac": "bowser_dead_bits_end", + "802b6cf0": "bowser_act_dead", + "802b6e40": "bowser_tilt_platform", + "802b6ee0": "bowser_act_ride_tilting_platform", + "802b711c": "bowser_check_fallen_off_stage", + "802b71e4": "bowser_free_update", + "802b72d4": "bowser_held_update", + "802b7418": "bowser_thrown_dropped_update", + "802b75a4": "bhv_bowser_loop", + "802b7878": "bhv_bowser_init", + "802b798c": "geo_update_body_rot_from_parent", + "802b7a20": "bowser_open_eye_switch", + "802b7c64": "geo_switch_bowser_eyes", + "802b7d44": "geo_bits_bowser_coloring", + "802b7e68": "falling_bowser_plat_act_0", + "802b7ef0": "falling_bowser_plat_act_1", + "802b8024": "falling_bowser_plat_act_2", + "802b8384": "bhv_falling_bowser_platform_loop", + "802b83b0": "bowser_flame_despawn", + "802b8434": "bowser_flame_should_despawn", + "802b84ac": "bhv_flame_bowser_init", + "802b85b0": "bhv_flame_large_burning_out_init", + "802b8654": "bowser_flame_move", + "802b8734": "bhv_flame_bowser_loop", + "802b8960": "bhv_flame_moving_forward_growing_init", + "802b89ec": "bhv_flame_moving_forward_growing_loop", + "802b8b1c": "bhv_flame_floating_landing_init", + "802b8c38": "bhv_flame_floating_landing_loop", + "802b8d68": "bhv_blue_bowser_flame_init", + "802b8e7c": "bhv_blue_bowser_flame_loop", + "802b9034": "bhv_flame_bouncing_init", + "802b90ec": "bhv_flame_bouncing_loop", + "802b921c": "bhv_blue_flames_group_loop", + "802b935c": "bhv_blue_fish_movement_loop", + "802b9790": "bhv_tank_fish_group_loop", + "802b98d4": "vec3f_copy_2", + "802b98fc": "bhv_checkerboard_elevator_group_init", + "802b9a78": "checkerboard_plat_act_move_y", + "802b9af8": "checkerboard_plat_act_rotate", + "802b9bb4": "bhv_checkerboard_platform_init", + "802b9bd8": "bhv_checkerboard_platform_loop", + "802b9e94": "bhv_ddd_warp_loop", + "802b9efc": "water_level_pillar_undrained", + "802ba13c": "water_level_pillar_drained", + "802ba19c": "bhv_water_level_pillar_init", + "802ba1e0": "bhv_water_level_pillar_loop", + "802ba25c": "bhv_invisible_objects_under_bridge_init", + "802ba2b0": "geo_scale_bowser_key", + "802ba2f8": "bhv_bowser_key_unlock_door_loop", + "802ba458": "bhv_bowser_key_course_exit_loop", + "802ba5bc": "bhv_moat_grills_loop", + "802ba608": "bhv_rotating_clock_arm_loop", + "802ba7e0": "handle_hat_ukiki_reset", + "802ba868": "is_hat_ukiki_and_mario_has_hat", + "802ba8c4": "geo_update_projectile_pos_from_parent_copy", + "802ba958": "idle_ukiki_taunt", + "802bab7c": "ukiki_act_idle", + "802bae40": "ukiki_act_return_home", + "802baec4": "ukiki_act_wait_to_respawn", + "802baf10": "ukiki_act_unused_turn", + "802baf64": "ukiki_act_turn_to_mario", + "802bb07c": "ukiki_act_run", + "802bb288": "ukiki_act_jump", + "802bb3b8": "ukiki_act_go_to_cage", + "802bb798": "ukiki_free_loop", + "802bb888": "cage_ukiki_held_loop", + "802bba3c": "hat_ukiki_held_loop", + "802bbb98": "bhv_ukiki_init", + "802bbc0c": "bhv_ukiki_loop", + "802bbd6c": "lll_octagonal_mesh_move", + "802bbfd8": "lll_octagonal_mesh_find_y_offset", + "802bc0f0": "bhv_lll_moving_octagonal_mesh_platform_loop", + "802bc22c": "bhv_lll_sinking_rock_block_loop", + "802bc294": "bhv_lll_rotating_hex_flame_loop", + "802bc348": "fire_bar_spawn_flames", + "802bc4f4": "fire_bar_act_0", + "802bc538": "fire_bar_act_1", + "802bc590": "fire_bar_act_2", + "802bc5fc": "fire_bar_act_3", + "802bc618": "bhv_lll_rotating_block_fire_bars_loop", + "802bc660": "bhv_lll_wood_piece_loop", + "802bc728": "bhv_lll_floating_wood_bridge_loop", + "802bc898": "bhv_volcano_flames_loop", + "802bc934": "hexagonal_ring_spawn_flames", + "802bca74": "bhv_lll_rotating_hexagonal_ring_loop", + "802bcce8": "sinking_rectangular_plat_actions", + "802bcda8": "bhv_lll_sinking_rectangular_platform_loop", + "802bce58": "bhv_lll_sinking_square_platforms_loop", + "802bce9c": "create_transform_from_normals", + "802bcf40": "bhv_platform_normals_init", + "802bcfc4": "approach_by_increment", + "802bd058": "bhv_tilting_inverted_pyramid_loop", + "802bd3e4": "koopa_shell_spawn_water_drop", + "802bd488": "bhv_koopa_shell_flame_loop", + "802bd5dc": "bhv_koopa_shell_flame_spawn", + "802bd62c": "koopa_shell_spawn_sparkles", + "802bd680": "bhv_koopa_shell_loop", + "802bd8d0": "tox_box_shake_screen", + "802bd91c": "tox_box_move", + "802bdb04": "tox_box_act_4", + "802bdb3c": "tox_box_act_5", + "802bdb74": "tox_box_act_6", + "802bdbac": "tox_box_act_7", + "802bdbe4": "tox_box_act_1", + "802bdc7c": "tox_box_act_2", + "802bdcc8": "tox_box_act_3", + "802bdd14": "tox_box_act_0", + "802bdd68": "bhv_tox_box_loop", + "802bdd9c": "piranha_plant_act_idle", + "802bde10": "piranha_plant_check_interactions", + "802bdeec": "piranha_plant_act_sleeping", + "802be034": "piranha_plant_act_woken_up", + "802be0b8": "piranha_plant_reset_when_far", + "802be0ec": "piranha_plant_attacked", + "802be150": "piranha_plant_act_shrink_and_die", + "802be234": "piranha_plant_act_wait_to_respawn", + "802be278": "piranha_plant_act_respawn", + "802be350": "piranha_plant_act_biting", + "802be49c": "mario_moving_fast_enough_to_make_piranha_plant_bite", + "802be50c": "piranha_plant_act_stopped_biting", + "802be5a0": "bhv_piranha_plant_loop", + "802be628": "bhv_lll_bowser_puzzle_spawn_piece", + "802be6d4": "bhv_lll_bowser_puzzle_spawn_pieces", + "802be79c": "bhv_lll_bowser_puzzle_loop", + "802be8a8": "bhv_lll_bowser_puzzle_piece_action_0", + "802be8b8": "bhv_lll_bowser_puzzle_piece_action_1", + "802be8f4": "bhv_lll_bowser_puzzle_piece_update", + "802be9dc": "bhv_lll_bowser_puzzle_piece_move", + "802beb14": "bhv_lll_bowser_puzzle_piece_idle", + "802beb54": "bhv_lll_bowser_puzzle_piece_move_left", + "802beb8c": "bhv_lll_bowser_puzzle_piece_move_right", + "802bebc4": "bhv_lll_bowser_puzzle_piece_move_up", + "802bebfc": "bhv_lll_bowser_puzzle_piece_move_down", + "802bec34": "bhv_lll_bowser_puzzle_piece_loop", + "802becb0": "set_obj_anim_with_accel_and_sound", + "802bed7c": "play_penguin_walking_sound", + "802bedec": "tuxies_mother_act_2", + "802bef8c": "tuxies_mother_act_1", + "802bf1d8": "tuxies_mother_act_0", + "802bf3c0": "bhv_tuxies_mother_loop", + "802bf424": "small_penguin_dive_with_mario", + "802bf474": "small_penguin_act_2", + "802bf57c": "small_penguin_act_1", + "802bf648": "small_penguin_act_3", + "802bf6e4": "small_penguin_act_4", + "802bf760": "small_penguin_act_0", + "802bf90c": "small_penguin_act_5", + "802bfa14": "small_penguin_free_actions", + "802bfa88": "bhv_small_penguin_loop", + "802bfbac": "geo_switch_tuxie_mother_eyes", + "802bfcd8": "fish_act_spawn", + "802bfeb8": "fish_act_respawn", + "802bff20": "fish_act_init", + "802bff3c": "bhv_large_fish_group_loop", + "802bff68": "fish_regroup", + "802c00b4": "fish_group_act_rotation", + "802c0348": "fish_group_act_move", + "802c06a8": "fish_group_act_animate", + "802c0768": "bhv_fish_loop", + "802c08a8": "bhv_wdw_express_elevator_loop", + "802c0aac": "bub_spawner_act_0", + "802c0b50": "bub_spawner_act_1", + "802c0ba4": "bub_spawner_act_2", + "802c0bc4": "bub_spawner_act_3", + "802c0be0": "bhv_bub_spawner_loop", + "802c0c0c": "bub_move_vertically", + "802c0cd4": "bub_act_0", + "802c0d44": "bub_act_1", + "802c0f90": "bub_act_2", + "802c1204": "bhv_bub_loop", + "802c12c0": "bhv_rotating_exclamation_box_loop", + "802c1308": "exclamation_box_act_0", + "802c13ec": "exclamation_box_act_1", + "802c14b0": "exclamation_box_act_2", + "802c15b8": "exclamation_box_act_3", + "802c17bc": "exclamation_box_spawn_contents", + "802c18d0": "exclamation_box_act_4", + "802c1988": "exclamation_box_act_5", + "802c19c0": "bhv_exclamation_box_loop", + "802c19fc": "bhv_sound_spawner_init", + "802c1a40": "bhv_bowsers_sub_loop", + "802c1a80": "bhv_sushi_shark_collision_loop", + "802c1a90": "bhv_sushi_shark_loop", + "802c1c44": "bhv_sunken_ship_part_loop", + "802c1cd4": "bhv_ship_part_3_loop", + "802c1e10": "bhv_jrb_sliding_box_loop", + "802c2190": "bhv_white_puff_1_loop", + "802c2274": "bhv_white_puff_2_loop", + "802c22b8": "bhv_hidden_blue_coin_loop", + "802c242c": "bhv_blue_coin_switch_loop", + "802c263c": "bhv_openable_cage_door_loop", + "802c26f8": "bhv_openable_grill_loop", + "802c2930": "bhv_init_changing_water_level_loop", + "802c2a24": "bhv_water_level_diamond_loop", + "802c2ce8": "tweester_scale_and_move", + "802c2ebc": "tweester_act_idle", + "802c2fbc": "tweester_act_chase", + "802c31c4": "tweester_act_hide", + "802c329c": "bhv_tweester_loop", + "802c32e8": "bhv_tweester_sand_particle_loop", + "802c3440": "bhv_boo_init", + "802c3684": "bhv_courtyard_boo_triplet_init", + "802c4824": "bhv_boo_loop", + "802c4f30": "bhv_big_boo_loop", + "802c515c": "bhv_boo_with_cage_init", + "802c51d4": "bhv_boo_with_cage_loop", + "802c5224": "bhv_merry_go_round_boo_manager_loop", + "802c53cc": "obj_set_secondary_camera_focus", + "802c53ec": "bhv_animated_texture_loop", + "802c5414": "bhv_boo_in_castle_loop", + "802c5688": "bhv_boo_boss_spawned_bridge_loop", + "802c5890": "bhv_bbh_tilting_trap_platform_loop", + "802c5a38": "bhv_haunted_bookshelf_loop", + "802c5ca8": "bhv_merry_go_round_loop", + "802c5dc0": "bhv_static_checkered_platform_loop", + "802c5f48": "bhv_beta_bowser_anchor_loop", + "802c5fdc": "bhv_play_music_track_when_touched_loop", + "802c6050": "bhv_floor_trap_in_castle_loop", + "802c60ac": "bhv_castle_floor_trap_init", + "802c6150": "bhv_castle_floor_trap_open_detect", + "802c61d4": "bhv_castle_floor_trap_open", + "802c6278": "bhv_castle_floor_trap_close_detect", + "802c62bc": "bhv_castle_floor_trap_close", + "802c6328": "bhv_castle_floor_trap_rotate", + "802c6348": "bhv_castle_floor_trap_loop", + "802c63e8": "bhv_pole_base_loop", + "802c64a4": "bhv_sparkle_spawn_loop", + "802c6538": "update_angle_from_move_flags", + "802c65c0": "bhv_scuttlebug_loop", + "802c6b6c": "bhv_scuttlebug_spawn_loop", + "802c6ca0": "whomp_play_sfx_from_pound_animation", + "802c6d6c": "whomp_act_0", + "802c6ec8": "whomp_act_7", + "802c6fb0": "whomp_act_1", + "802c710c": "whomp_act_2", + "802c7254": "whomp_act_3", + "802c72b4": "whomp_act_4", + "802c7380": "whomp_act_5", + "802c7428": "king_whomp_on_ground", + "802c75fc": "whomp_on_ground", + "802c76d4": "whomp_act_6", + "802c7858": "whomp_act_8", + "802c7998": "whomp_act_9", + "802c79d8": "bhv_whomp_loop", + "802c7a70": "bhv_water_splash_spawn_droplets", + "802c7b14": "bhv_water_droplet_loop", + "802c7cac": "bhv_idle_water_wave_loop", + "802c7d40": "bhv_water_droplet_splash_init", + "802c7d90": "bhv_bubble_splash_init", + "802c7dfc": "bhv_shallow_water_splash_init", + "802c7e5c": "bhv_wave_trail_shrink", + "802c7f98": "bhv_strong_wind_particle_loop", + "802c81b4": "cur_obj_spawn_strong_wind_particles", + "802c834c": "bhv_sl_snowman_wind_loop", + "802c863c": "bhv_sl_walking_penguin_loop", + "802c89f0": "update_mario_platform", + "802c8b4c": "get_mario_pos", + "802c8b8c": "set_mario_pos", + "802c8bc8": "apply_platform_displacement", + "802c8ec0": "apply_mario_platform_displacement", + "802c8f28": "clear_mario_platform", + "802c8f40": "debug_print_obj_collision", + "802c8fe4": "detect_object_hitbox_overlap", + "802c91ec": "detect_object_hurtbox_overlap", + "802c9388": "clear_object_collision", + "802c93f8": "check_collision_in_list", + "802c94ac": "check_player_object_collision", + "802c95b4": "check_pushable_object_collision", + "802c9630": "check_destructive_object_collision", + "802c9724": "detect_object_collisions", + "802c97d0": "unused_init_free_list", + "802c9840": "unused_try_allocate", + "802c98a4": "try_allocate_object", + "802c9950": "unused_deallocate", + "802c99b8": "init_free_object_list", + "802c9a3c": "clear_object_lists", + "802c9b68": "unload_object", + "802c9c00": "allocate_object", + "802c9f04": "create_object", + "802ca028": "mark_obj_for_deletion", + "802ca040": "exec_anim_sound_state", + "802ca144": "create_sound_spawner", + "802ca190": "cur_obj_play_sound_1", + "802ca1e0": "cur_obj_play_sound_2", + "802ca230": "calc_dist_to_volume_range_1", + "802ca2d4": "calc_dist_to_volume_range_2", + "802ca370": "stub_debug_1", + "802ca380": "stub_debug_2", + "802ca390": "stub_debug_3", + "802ca3a0": "stub_debug_4", + "802ca3b0": "get_current_clock", + "802ca3e0": "get_clock_difference", + "802ca418": "set_print_state_info", + "802ca460": "print_text_array_info", + "802ca51c": "set_text_array_x_y", + "802ca568": "print_debug_bottom_up", + "802ca5b8": "print_debug_top_down_objectinfo", + "802ca618": "print_debug_top_down_mapinfo", + "802ca680": "print_debug_top_down_normal", + "802ca6d0": "print_mapinfo", + "802ca8e8": "print_checkinfo", + "802ca918": "print_surfaceinfo", + "802ca94c": "print_stageinfo", + "802ca990": "print_string_array_info", + "802caa6c": "print_effectinfo", + "802caaa8": "print_enemyinfo", + "802caae4": "update_debug_dpadmask", + "802cabac": "debug_unknown_level_select_check", + "802cac20": "reset_debug_objectinfo", + "802cb0b0": "stub_debug_5", + "802cb0c0": "try_print_debug_mario_object_info", + "802cb1c0": "try_print_debug_mario_level_info", + "802cb264": "try_do_mario_debug_object_spawn", + "802cb564": "debug_enemy_unknown", + "802cb5c0": "set_and_reset_transition_fade_timer", + "802cb640": "set_transition_color_fade_alpha", + "802cb894": "vertex_transition_color", + "802cba18": "dl_transition_color", + "802cbbc4": "render_fade_transition_from_color", + "802cbc20": "render_fade_transition_into_color", + "802cbc7c": "calc_tex_transition_radius", + "802cbd54": "calc_tex_transition_time", + "802cbe64": "convert_tex_transition_angle_to_pos", + "802cbee0": "center_tex_transition_x", + "802cbf64": "center_tex_transition_y", + "802cbfe8": "make_tex_transition_vertex", + "802cc180": "load_tex_transition_vertex", + "802cc4d8": "render_textured_transition", + "802ccbe8": "render_screen_transition", + "802ccdc8": "render_cannon_circle_base", + "802cd1e8": "geo_cannon_circle_base", + "802cd280": "rotate_rectangle", + "802cd328": "atan2_deg", + "802cd388": "scale_shadow_with_distance", + "802cd444": "disable_shadow_with_distance", + "802cd48c": "dim_shadow_with_distance", + "802cd614": "get_water_level_below_shadow", + "802cd6c4": "init_shadow", + "802cd938": "get_texture_coords_9_vertices", + "802cd988": "get_texture_coords_4_vertices", + "802cd9ec": "make_shadow_vertex_at_xyz", + "802cdb20": "extrapolate_vertex_y_position", + "802cdb74": "get_vertex_coords", + "802cdc40": "calculate_vertex_xyz", + "802cde94": "floor_local_tilt", + "802cdf3c": "make_shadow_vertex", + "802ce128": "add_shadow_to_display_list", + "802ce2bc": "linearly_interpolate_solidity_positive", + "802ce3ec": "linearly_interpolate_solidity_negative", + "802ce524": "correct_shadow_solidity_for_animations", + "802ce690": "correct_lava_shadow_height", + "802ce79c": "create_shadow_player", + "802ce9d0": "create_shadow_circle_9_verts", + "802ceae8": "create_shadow_circle_4_verts", + "802cec04": "create_shadow_circle_assuming_flat_ground", + "802cedc0": "create_shadow_rectangle", + "802cef6c": "get_shadow_height_solidity", + "802cf080": "create_shadow_square", + "802cf1f0": "create_shadow_hardcoded_rectangle", + "802cf34c": "create_shadow_below_xyz", + "802cf5b0": "calculate_skybox_scaled_x", + "802cf69c": "calculate_skybox_scaled_y", + "802cf804": "make_skybox_rect", + "802cfa2c": "draw_skybox_tile_grid", + "802cfc68": "create_skybox_ortho_matrix", + "802cfd88": "init_skybox_display_list", + "802cfef4": "create_skybox_facing_camera", + "802d0080": "geo_wdw_set_initial_water_level", + "802d01e0": "geo_movtex_pause_control", + "802d0254": "movtex_make_quad_vertex", + "802d0484": "movtex_gen_from_quad", + "802d0a84": "movtex_gen_from_quad_array", + "802d0bb0": "movtex_gen_quads_id", + "802d0c84": "get_quad_collection_from_id", + "802d0f28": "movtex_change_texture_format", + "802d104c": "geo_movtex_draw_water_regions", + "802d1330": "update_moving_texture_offset", + "802d13cc": "movtex_write_vertex_first", + "802d1574": "movtex_write_vertex_index", + "802d18b4": "movtex_gen_list", + "802d1b70": "geo_movtex_draw_nocolor", + "802d1cdc": "geo_movtex_draw_colored", + "802d1e48": "geo_movtex_draw_colored_no_update", + "802d1fa8": "geo_movtex_draw_colored_2_no_update", + "802d2108": "geo_movtex_update_horizontal", + "802d2210": "make_vertex", + "802d22c4": "round_float", + "802d2360": "geo_exec_inside_castle_light", + "802d2470": "geo_exec_flying_carpet_timer_update", + "802d2520": "geo_exec_flying_carpet_create", + "802d28cc": "geo_exec_cake_end_screen", + "802d29c0": "stop_other_paintings", + "802d2a74": "painting_mario_y", + "802d2b08": "painting_mario_z", + "802d2b84": "painting_ripple_y", + "802d2c40": "painting_nearest_4th", + "802d2d80": "painting_mario_x", + "802d2dfc": "painting_ripple_x", + "802d2eb8": "painting_state", + "802d2ffc": "wall_painting_proximity_idle", + "802d319c": "wall_painting_proximity_rippling", + "802d327c": "wall_painting_continuous_idle", + "802d341c": "wall_painting_continuous_rippling", + "802d34fc": "floor_painting_proximity_idle", + "802d36ac": "floor_painting_proximity_rippling", + "802d379c": "floor_painting_continuous_idle", + "802d393c": "floor_painting_continuous_rippling", + "802d3a2c": "painting_update_floors", + "802d3bec": "painting_update_ripple_state", + "802d3cec": "calculate_ripple_at_point", + "802d3e6c": "ripple_if_movable", + "802d3ee4": "painting_generate_mesh", + "802d404c": "painting_calculate_triangle_normals", + "802d43f8": "normalize_component", + "802d44bc": "painting_average_vertex_normals", + "802d47d0": "render_painting", + "802d4edc": "painting_model_view_transform", + "802d50dc": "painting_ripple_image", + "802d5354": "painting_ripple_env_mapped", + "802d556c": "display_painting_rippling", + "802d568c": "display_painting_not_rippling", + "802d5778": "reset_painting", + "802d57a8": "move_ddd_painting", + "802d58e4": "set_painting_layer", + "802d593c": "display_painting", + "802d59a8": "wall_painting_update", + "802d5aa0": "floor_painting_update", + "802d5b98": "geo_painting_draw", + "802d5d0c": "geo_painting_update", + "802d5e00": "int_pow", + "802d5e54": "format_integer", + "802d6144": "parse_width_field", + "802d62d8": "print_text_fmt_int", + "802d6554": "print_text", + "802d66c0": "print_text_centered", + "802d6858": "char_to_glyph_index", + "802d69f8": "add_glyph_texture", + "802d6acc": "clip_to_bounds", + "802d6b3c": "render_textrect", + "802d6c88": "render_text_labels", + "802d6f20": "create_dl_identity_matrix", + "802d7070": "create_dl_translation_matrix", + "802d7174": "create_dl_rotation_matrix", + "802d7280": "create_dl_scale_matrix", + "802d7384": "create_dl_ortho_matrix", + "802d75dc": "render_generic_char", + "802d76c8": "render_multi_text_string", + "802d77dc": "print_generic_string", + "802d7b84": "print_hud_lut_string", + "802d7e88": "print_menu_generic_string", + "802d82d4": "print_credits_string", + "802d862c": "handle_menu_scrolling", + "802d8844": "get_str_x_pos_from_center", + "802d8934": "get_string_width", + "802d89b8": "print_hud_my_score_coins", + "802d8a80": "print_hud_my_score_stars", + "802d8b34": "int_to_str", + "802d8c6c": "get_dialog_id", + "802d8c88": "create_dialog_box", + "802d8cc4": "create_dialog_box_with_var", + "802d8d08": "create_dialog_inverted_box", + "802d8d48": "create_dialog_box_with_response", + "802d8d90": "reset_dialog_render_state", + "802d8e2c": "render_dialog_box_type", + "802d9148": "change_and_flash_dialog_text_color_lines", + "802d9388": "handle_dialog_scroll_page_state", + "802d944c": "render_star_count_dialog_text", + "802d9634": "render_multi_text_string_lines", + "802d9800": "ensure_nonnegative", + "802d982c": "handle_dialog_text_and_pages", + "802d9cb0": "render_dialog_triangle_choice", + "802d9dfc": "render_dialog_string_color", + "802d9f84": "handle_special_dialog_text", + "802da1ac": "render_dialog_entries", + "802da810": "set_menu_mode", + "802da844": "reset_cutscene_msg_fade", + "802da85c": "dl_rgba16_begin_cutscene_msg_fade", + "802da8e4": "dl_rgba16_stop_cutscene_msg_fade", + "802da964": "ascii_to_credits_char", + "802daa34": "print_credits_str_ascii", + "802daae4": "set_cutscene_message", + "802dab58": "do_cutscene_handler", + "802dad54": "print_peach_letter_message", + "802db08c": "render_hud_cannon_reticle", + "802db350": "reset_red_coins_collected", + "802db368": "change_dialog_camera_angle", + "802db3b8": "shade_screen", + "802db498": "print_animated_red_coin", + "802db6e8": "render_pause_red_coins", + "802db760": "render_pause_my_score_coins", + "802dbb24": "render_pause_camera_options", + "802dbe68": "render_pause_course_options", + "802dc15c": "render_pause_castle_menu_box", + "802dc418": "highlight_last_course_complete_stars", + "802dc478": "print_hud_pause_colorful_str", + "802dc570": "render_pause_castle_course_stars", + "802dc718": "render_pause_castle_main_strings", + "802dca88": "render_pause_courses_and_castle", + "802dcd04": "print_hud_course_complete_string", + "802dcf30": "print_hud_course_complete_coins", + "802dd194": "play_star_fanfare_and_flash_hud", + "802dd210": "render_course_complete_lvl_info_and_hud_str", + "802dd838": "render_save_confirmation", + "802ddae0": "render_course_complete_screen", + "802ddca4": "render_menus_and_dialogs", + "802dddf0": "envfx_init_snow", + "802ddf38": "envfx_update_snowflake_count", + "802de0bc": "envfx_cleanup_snow", + "802de114": "orbit_from_positions", + "802de23c": "pos_from_orbit", + "802de360": "envfx_is_snowflake_alive", + "802de458": "envfx_update_snow_normal", + "802de888": "envfx_update_snow_blizzard", + "802ded38": "envfx_update_snow_water", + "802def2c": "rotate_triangle_vertices", + "802df334": "append_snowflake_vertex_buffer", + "802df748": "envfx_update_snow", + "802dfbc8": "envfx_update_particles", + "802dfd50": "particle_is_laterally_close", + "802dfe00": "random_flower_offset", + "802dfe80": "envfx_update_flower", + "802e0120": "envfx_set_lava_bubble_position", + "802e048c": "envfx_update_lava", + "802e065c": "envfx_rotate_around_whirlpool", + "802e08a8": "envfx_is_whirlpool_bubble_alive", + "802e0934": "envfx_update_whirlpool", + "802e0e24": "envfx_is_jestream_bubble_alive", + "802e0eb8": "envfx_update_jetstream", + "802e1238": "envfx_init_bubble", + "802e1414": "envfx_bubbles_update_switch", + "802e1618": "append_bubble_vertex_buffer", + "802e1a20": "envfx_set_bubble_texture", + "802e1bb8": "envfx_update_bubble_particles", + "802e1ed8": "envfx_set_max_bubble_particles", + "802e1f48": "envfx_update_bubbles", + "802e20a0": "convert_rotation", + "802e2134": "spawn_macro_abs_yrot_2params", + "802e21dc": "spawn_macro_abs_yrot_param1", + "802e2284": "spawn_macro_abs_special", + "802e2414": "spawn_macro_objects", + "802e2690": "spawn_macro_objects_hardcoded", + "802e28ec": "spawn_special_objects", + "802e2cf0": "render_hud_tex_lut", + "802e2e58": "render_hud_small_tex_lut", + "802e30b4": "render_power_meter_health_segment", + "802e3214": "render_dl_power_meter", + "802e33b8": "animate_power_meter_emphasized", + "802e352c": "handle_power_meter_actions", + "802e3654": "render_hud_power_meter", + "802e3744": "render_hud_mario_lives", + "802e37a8": "render_hud_coins", + "802e380c": "render_hud_stars", + "802e38e4": "render_hud_keys", + "802e395c": "render_hud_timer", + "802e3b1c": "set_hud_camera_status", + "802e3b3c": "render_hud_camera_status", + "802e3d2c": "render_hud", + "802e3e50": "set_yoshi_as_not_dead", + "802e3e68": "geo_obj_transparency_something", + "802e3f68": "absf_2", + "802e3fac": "turn_obj_away_from_surface", + "802e405c": "obj_find_wall", + "802e41a4": "turn_obj_away_from_steep_floor", + "802e42e0": "obj_orient_graph", + "802e43e4": "calc_obj_friction", + "802e445c": "calc_new_obj_vel_and_pos_y", + "802e4814": "calc_new_obj_vel_and_pos_y_underwater", + "802e4cec": "obj_update_pos_vel_xz", + "802e4d88": "obj_splash", + "802e4e90": "object_step", + "802e5114": "object_step_without_floor_orient", + "802e5160": "obj_move_xyz_using_fvel_and_yaw", + "802e5208": "is_point_within_radius_of_mario", + "802e52b8": "is_point_close_to_object", + "802e5360": "set_object_visibility", + "802e53f4": "obj_return_home_if_safe", + "802e54b0": "obj_return_and_displace_home", + "802e55d0": "obj_check_if_facing_toward_angle", + "802e569c": "obj_find_wall_displacement", + "802e5760": "obj_spawn_yellow_coins", + "802e5824": "obj_flicker_and_disappear", + "802e58b4": "current_mario_room_check", + "802e5948": "trigger_obj_dialog_when_facing", + "802e5a80": "obj_check_floor_death", + "802e5b18": "obj_lava_death", + "802e5c6c": "spawn_orange_number", + "802e5d04": "debug_sequence_tracker", + "802e5de8": "coin_step", + "802e5e6c": "moving_coin_flicker", + "802e5ea4": "coin_collected", + "802e5ee8": "bhv_moving_yellow_coin_init", + "802e5f64": "bhv_moving_yellow_coin_loop", + "802e6098": "bhv_moving_blue_coin_init", + "802e6114": "bhv_moving_blue_coin_loop", + "802e62a4": "bhv_blue_coin_sliding_jumping_init", + "802e631c": "blue_coin_sliding_away_from_mario", + "802e63ec": "blue_coin_sliding_slow_down", + "802e6474": "bhv_blue_coin_sliding_loop", + "802e6628": "bhv_blue_coin_jumping_loop", + "802e6790": "bhv_seaweed_init", + "802e67dc": "bhv_seaweed_bundle_init", + "802e6a2c": "bhv_bobomb_init", + "802e6a8c": "bobomb_spawn_coin", + "802e6af8": "bobomb_act_explode", + "802e6bd4": "bobomb_check_interactions", + "802e6cf0": "bobomb_act_patrol", + "802e6dc8": "bobomb_act_chase_mario", + "802e6e84": "bobomb_act_launched", + "802e6ed8": "generic_bobomb_free_loop", + "802e7020": "stationary_bobomb_free_loop", + "802e7134": "bobomb_free_loop", + "802e7180": "bobomb_held_loop", + "802e7220": "bobomb_dropped_loop", + "802e7280": "bobomb_thrown_loop", + "802e7324": "curr_obj_random_blink", + "802e742c": "bhv_bobomb_loop", + "802e75a0": "bhv_bobomb_fuse_smoke_init", + "802e76ac": "bhv_bobomb_buddy_init", + "802e770c": "bobomb_buddy_act_idle", + "802e7814": "bobomb_buddy_cannon_dialog", + "802e79dc": "bobomb_buddy_act_talk", + "802e7b00": "bobomb_buddy_act_turn_to_talk", + "802e7bb0": "bobomb_buddy_actions", + "802e7c4c": "bhv_bobomb_buddy_loop", + "802e7c90": "bhv_cannon_closed_init", + "802e7d4c": "cannon_door_act_opening", + "802e7e54": "bhv_cannon_closed_loop", + "802e7f70": "bhv_whirlpool_init", + "802e7fb8": "whirlpool_set_hitbox", + "802e7fec": "whirpool_orient_graph", + "802e80dc": "bhv_whirlpool_loop", + "802e82b0": "bhv_jet_stream_loop", + "802e8388": "bhv_homing_amp_init", + "802e89d4": "bhv_homing_amp_loop", + "802e8ae4": "bhv_circling_amp_init", + "802e8ecc": "bhv_circling_amp_loop", + "802e8f68": "bhv_butterfly_init", + "802e9018": "butterfly_step", + "802e9278": "butterfly_calculate_angle", + "802e9470": "butterfly_act_rest", + "802e94e4": "butterfly_act_follow_mario", + "802e9548": "butterfly_act_return_home", + "802e96c8": "bhv_butterfly_loop", + "802e9764": "bhv_hoot_init", + "802e97fc": "hoot_find_next_floor", + "802e98c0": "hoot_floor_bounce", + "802e9a4c": "hoot_free_step", + "802e9cf4": "hoot_player_set_yaw", + "802e9d98": "hoot_carry_step", + "802e9f60": "hoot_surface_collision", + "802ea144": "hoot_act_ascent", + "802ea258": "hoot_action_loop", + "802ea3f0": "hoot_turn_to_home", + "802ea4ec": "hoot_awake_loop", + "802ea588": "bhv_hoot_loop", + "802ea6a8": "bhv_beta_holdable_object_init", + "802ea7e0": "bhv_beta_holdable_object_loop", + "802ea888": "bhv_object_bubble_init", + "802ea934": "bhv_object_bubble_loop", + "802eaa10": "bhv_object_water_wave_init", + "802eaa50": "bhv_object_water_wave_loop", + "802eaa8c": "bhv_explosion_init", + "802eaad0": "bhv_explosion_loop", + "802eabf0": "bhv_bobomb_bully_death_smoke_init", + "802eac3c": "bhv_bobomb_explosion_bubble_init", + "802ead3c": "bhv_bobomb_explosion_bubble_loop", + "802eaef8": "bhv_respawner_loop", + "802eaf84": "create_respawner", + "802eb05c": "bhv_small_bully_init", + "802eb104": "bhv_big_bully_init", + "802eb1c0": "bully_check_mario_collision", + "802eb288": "bully_act_chase_mario", + "802eb3f0": "bully_act_knockback", + "802eb510": "bully_act_back_up", + "802eb5c4": "bully_backup_check", + "802eb630": "bully_play_stomping_sound", + "802eb744": "bully_step", + "802eb7e0": "bully_spawn_coin", + "802eb8b0": "bully_act_level_death", + "802eb9d0": "bhv_bully_loop", + "802ebb74": "big_bully_spawn_minion", + "802ebc00": "bhv_big_bully_with_minions_init", + "802ebc88": "big_bully_spawn_star", + "802ebce0": "bhv_big_bully_with_minions_loop", + "802ebf70": "water_ring_calc_mario_dist", + "802ec030": "water_ring_init", + "802ec1b0": "bhv_jet_stream_water_ring_init", + "802ec200": "water_ring_check_collection", + "802ec3d0": "water_ring_set_scale", + "802ec4e0": "water_ring_act_collected", + "802ec59c": "water_ring_act_not_collected", + "802ec75c": "bhv_jet_stream_water_ring_loop", + "802ec7cc": "spawn_manta_ray_ring_manager", + "802ec818": "water_ring_spawner_act_inactive", + "802ec908": "bhv_jet_stream_ring_spawner_loop", + "802ec9b8": "bhv_manta_ray_water_ring_init", + "802ec9f0": "manta_water_ring_act_not_collected", + "802ecba4": "bhv_manta_ray_water_ring_loop", + "802ecc14": "bhv_bowser_bomb_loop", + "802ecd0c": "bhv_bowser_bomb_explosion_loop", + "802ecea0": "bhv_bowser_bomb_smoke_loop", + "802ecfac": "bhv_celebration_star_init", + "802ed10c": "celeb_star_act_spin_around_mario", + "802ed28c": "celeb_star_act_face_camera", + "802ed39c": "bhv_celebration_star_loop", + "802ed40c": "bhv_celebration_star_sparkle_loop", + "802ed45c": "bhv_star_key_collection_puff_spawner_loop", + "802ed498": "bhv_lll_drawbridge_spawner_loop", + "802ed62c": "bhv_lll_drawbridge_loop", + "802ed78c": "bhv_small_bomp_init", + "802ed7fc": "bhv_small_bomp_loop", + "802edacc": "bhv_large_bomp_init", + "802edb2c": "bhv_large_bomp_loop", + "802eddfc": "bhv_wf_sliding_platform_init", + "802edf28": "bhv_wf_sliding_platform_loop", + "802ee124": "bhv_moneybag_init", + "802ee1a0": "moneybag_check_mario_collision", + "802ee268": "moneybag_jump", + "802ee46c": "moneybag_act_move_around", + "802ee598": "moneybag_act_return_home", + "802ee728": "moneybag_act_disappear", + "802ee778": "moneybag_act_death", + "802ee7e0": "bhv_moneybag_loop", + "802ee8f4": "bhv_moneybag_hidden_loop", + "802ee9cc": "bhv_bowling_ball_init", + "802eea24": "bowling_ball_set_hitbox", + "802eea7c": "bowling_ball_set_waypoints", + "802eeb64": "bhv_bowling_ball_roll_loop", + "802eecb8": "bhv_bowling_ball_initializeLoop", + "802eedf0": "bhv_bowling_ball_loop", + "802eeeb4": "bhv_generic_bowling_ball_spawner_init", + "802eef9c": "bhv_generic_bowling_ball_spawner_loop", + "802ef0e8": "bhv_thi_bowling_ball_spawner_loop", + "802ef21c": "bhv_bob_pit_bowling_ball_init", + "802ef274": "bhv_bob_pit_bowling_ball_loop", + "802ef34c": "bhv_free_bowling_ball_init", + "802ef3f4": "bhv_free_bowling_ball_roll_loop", + "802ef524": "bhv_free_bowling_ball_loop", + "802ef63c": "bhv_rr_cruiser_wing_init", + "802ef66c": "bhv_rr_cruiser_wing_loop", + "802ef820": "bhv_spindel_init", + "802ef858": "bhv_spindel_loop", + "802efcd0": "bhv_ssl_moving_pyramid_wall_init", + "802efd8c": "bhv_ssl_moving_pyramid_wall_loop", + "802efe64": "bhv_pyramid_elevator_init", + "802efef4": "bhv_pyramid_elevator_loop", + "802f0104": "bhv_pyramid_elevator_trajectory_marker_ball_loop", + "802f0168": "bhv_pyramid_top_init", + "802f0288": "bhv_pyramid_top_spinning", + "802f04a0": "bhv_pyramid_top_explode", + "802f05b4": "bhv_pyramid_top_loop", + "802f06a8": "bhv_pyramid_top_fragment_init", + "802f0714": "bhv_pyramid_top_fragment_loop", + "802f0788": "bhv_pyramid_pillar_touch_detector_loop", + "802f07f4": "bhv_waterfall_sound_loop", + "802f0820": "bhv_volcano_sound_loop", + "802f084c": "bhv_castle_flag_init", + "802f0898": "bhv_birds_sound_loop", + "802f0950": "bhv_ambient_sounds_init", + "802f09a4": "bhv_sand_sound_loop", + "802f09f0": "bhv_castle_cannon_grate_init", + "802f0a40": "bhv_snowmans_bottom_init", + "802f0b7c": "set_rolling_sphere_hitbox", + "802f0bd4": "adjust_rolling_face_pitch", + "802f0c94": "snowmans_bottom_act_1", + "802f0df0": "snowmans_bottom_act_2", + "802f0fa8": "snowmans_bottom_act_3", + "802f105c": "bhv_snowmans_bottom_loop", + "802f120c": "bhv_snowmans_head_init", + "802f1370": "bhv_snowmans_head_loop", + "802f151c": "bhv_snowmans_body_checkpoint_loop", + "802f15a8": "bhv_big_boulder_init", + "802f162c": "boulder_act_1", + "802f1714": "bhv_big_boulder_loop", + "802f17f0": "bhv_big_boulder_generator_loop", + "802f1954": "cap_set_hitbox", + "802f19c8": "cap_despawn", + "802f1a10": "cap_check_quicksand", + "802f1bb8": "cap_sink_quicksand", + "802f1d64": "bhv_wing_cap_init", + "802f1dc0": "cap_scale_vertically", + "802f1e5c": "wing_vanish_cap_act_0", + "802f1f3c": "bhv_wing_vanish_cap_loop", + "802f1fd0": "bhv_metal_cap_init", + "802f2030": "metal_cap_act_0", + "802f20ac": "bhv_metal_cap_loop", + "802f2140": "bhv_normal_cap_init", + "802f21e0": "normal_cap_set_save_flags", + "802f2284": "normal_cap_act_0", + "802f23a8": "bhv_normal_cap_loop", + "802f2498": "bhv_vanish_cap_init", + "802f24f4": "bhv_collect_star_init", + "802f25b0": "bhv_collect_star_loop", + "802f2614": "bhv_star_spawn_init", + "802f2768": "bhv_star_spawn_loop", + "802f2aa0": "spawn_star", + "802f2b88": "spawn_default_star", + "802f2bd4": "spawn_red_coin_cutscene_star", + "802f2c24": "spawn_no_exit_star", + "802f2c84": "bhv_hidden_red_coin_star_init", + "802f2d8c": "bhv_hidden_red_coin_star_loop", + "802f2e6c": "bhv_red_coin_init", + "802f2f2c": "bhv_red_coin_loop", + "802f3014": "bhv_hidden_star_init", + "802f30f0": "bhv_hidden_star_loop", + "802f31bc": "bhv_hidden_star_trigger_loop", + "802f328c": "bhv_bowser_course_red_coin_star_loop", + "802f336c": "bhv_ttm_rolling_log_init", + "802f341c": "rolling_log_roll_log", + "802f36a4": "bhv_rolling_log_loop", + "802f38b0": "volcano_act_1", + "802f39b4": "volcano_act_3", + "802f3a30": "bhv_volcano_trap_loop", + "802f3b98": "bhv_lll_rolling_log_init", + "802f3c54": "bhv_1up_interact", + "802f3cc8": "bhv_1up_common_init", + "802f3d30": "bhv_1up_init", + "802f3dd0": "one_up_loop_in_air", + "802f3ea8": "pole_1up_move_towards_mario", + "802f401c": "one_up_move_away_from_mario", + "802f40cc": "bhv_1up_walking_loop", + "802f4248": "bhv_1up_running_away_loop", + "802f43b8": "sliding_1up_move", + "802f44c0": "bhv_1up_sliding_loop", + "802f45b8": "bhv_1up_loop", + "802f45f0": "bhv_1up_jump_on_approach_loop", + "802f4710": "bhv_1up_hidden_loop", + "802f48f4": "bhv_1up_hidden_trigger_loop", + "802f496c": "bhv_1up_hidden_in_pole_loop", + "802f4b00": "bhv_1up_hidden_in_pole_trigger_loop", + "802f4b78": "bhv_1up_hidden_in_pole_spawner_loop", + "802f4c68": "controllable_platform_act_1", + "802f4ce0": "controllable_platform_act_2", + "802f4d78": "bhv_controllable_platform_sub_loop", + "802f4eb4": "bhv_controllable_platform_init", + "802f5010": "controllable_platform_hit_wall", + "802f5068": "controllable_platform_check_walls", + "802f52c0": "controllable_platform_shake_on_wall_hit", + "802f547c": "controllable_platform_tilt_from_mario", + "802f55a4": "bhv_controllable_platform_loop", + "802f5cd4": "bhv_breakable_box_small_init", + "802f5d78": "small_breakable_box_spawn_dust", + "802f5e44": "small_breakable_box_act_move", + "802f5f48": "breakable_box_small_released_loop", + "802f6014": "breakable_box_small_idle_loop", + "802f60d8": "breakable_box_small_get_dropped", + "802f6150": "breakable_box_small_get_thrown", + "802f6228": "bhv_breakable_box_small_loop", + "802f62e4": "bhv_sliding_snow_mound_loop", + "802f6448": "bhv_snow_mound_spawn_loop", + "802f6588": "floating_platform_find_home_y", + "802f665c": "floating_platform_act_0", + "802f6984": "bhv_floating_platform_loop", + "802f6c0c": "bhv_arrow_lift_loop", + "802f6d20": "bhv_orange_number_init", + "802f6d58": "bhv_orange_number_loop", + "802f6e40": "bhv_manta_ray_init", + "802f6eb0": "manta_ray_move", + "802f7068": "manta_ray_act_spawn_ring", + "802f7264": "bhv_manta_ray_loop", + "802f7348": "bhv_falling_pillar_init", + "802f7398": "bhv_falling_pillar_spawn_hitboxes", + "802f7418": "bhv_falling_pillar_calculate_angle_in_front_of_mario", + "802f74dc": "bhv_falling_pillar_loop", + "802f7760": "bhv_falling_pillar_hitbox_loop", + "802f7924": "bhv_jrb_floating_box_loop", + "802f7978": "bhv_decorative_pendulum_init", + "802f79b0": "bhv_decorative_pendulum_loop", + "802f7a58": "bhv_treasure_chest_top_loop", + "802f7c9c": "bhv_treasure_chest_bottom_init", + "802f7d04": "bhv_treasure_chest_bottom_loop", + "802f7f1c": "spawn_treasure_chest", + "802f7fa0": "bhv_treasure_chest_ship_init", + "802f8044": "bhv_treasure_chest_ship_loop", + "802f8158": "bhv_treasure_chest_jrb_init", + "802f8208": "bhv_treasure_chest_jrb_loop", + "802f82f8": "bhv_treasure_chest_init", + "802f83a4": "bhv_treasure_chest_loop", + "802f8490": "bhv_mips_init", + "802f85e0": "bhv_mips_find_furthest_waypoint_to_mario", + "802f8760": "bhv_mips_act_wait_for_nearby_mario", + "802f8808": "bhv_mips_act_follow_path", + "802f893c": "bhv_mips_act_wait_for_animation_done", + "802f8988": "bhv_mips_act_fall_down", + "802f8a34": "bhv_mips_act_idle", + "802f8ab4": "bhv_mips_free", + "802f8b54": "bhv_mips_held", + "802f8c74": "bhv_mips_dropped", + "802f8cf8": "bhv_mips_thrown", + "802f8dac": "bhv_mips_loop", + "802f8e54": "bhv_yoshi_init", + "802f8f08": "yoshi_walk_loop", + "802f9054": "yoshi_idle_loop", + "802f923c": "yoshi_talk_loop", + "802f93a8": "yoshi_walk_and_jump_off_roof_loop", + "802f9500": "yoshi_finish_jumping_and_despawn_loop", + "802f95ac": "yoshi_give_present_loop", + "802f965c": "bhv_yoshi_loop", + "802fbc4c": "bhv_koopa_init", + "802fc414": "shelled_koopa_attack_handler", + "802fcc00": "obj_begin_race", + "802fd7f8": "bhv_koopa_update", + "802fd950": "bhv_koopa_race_endpoint_update", + "802fda28": "bhv_pokey_body_part_update", + "802fe3b0": "bhv_pokey_update", + "802fe8b4": "bhv_swoop_update", + "802ff040": "bhv_fly_guy_update", + "802ff214": "bhv_goomba_triplet_spawner_update", + "802ff408": "bhv_goomba_init", + "802ff94c": "huge_goomba_weakly_attacked", + "802ff96c": "bhv_goomba_update", + "802ffb38": "bhv_chain_chomp_chain_part_update", + "80300e40": "bhv_chain_chomp_update", + "80300ecc": "bhv_wooden_post_update", + "80301148": "bhv_chain_chomp_gate_init", + "80301180": "bhv_chain_chomp_gate_update", + "80301210": "bhv_wiggler_body_part_update", + "803014cc": "wiggler_init_segments", + "803016e0": "wiggler_update_segments", + "803020e4": "wiggler_jumped_on_attack_handler", + "80302154": "bhv_wiggler_update", + "80302910": "bhv_spiny_update", + "80303028": "bhv_enemy_lakitu_update", + "8030369c": "bhv_cloud_update", + "80303744": "bhv_cloud_part_update", + "80303984": "bhv_camera_lakitu_init", + "80303f64": "bhv_camera_lakitu_update", + "803043f8": "bhv_monty_mole_hole_update", + "80304474": "monty_mole_spawn_dirt_particles", + "803044c0": "bhv_monty_mole_init", + "80304ba8": "bhv_monty_mole_update", + "80304fd4": "bhv_monty_mole_rock_update", + "80305100": "bhv_platform_on_track_init", + "80305a58": "bhv_platform_on_track_update", + "80305bb0": "bhv_track_ball_update", + "80305c14": "bhv_seesaw_platform_init", + "80305c90": "bhv_seesaw_platform_update", + "80305e2c": "bhv_ferris_wheel_axle_init", + "80305f24": "bhv_ferris_wheel_platform_update", + "80306084": "bhv_water_bomb_spawner_update", + "803062a8": "water_bomb_spawn_explode_particles", + "803067e8": "bhv_water_bomb_update", + "803068c0": "bhv_water_bomb_shadow_update", + "8030699c": "bhv_ttc_rotating_solid_init", + "80306a38": "bhv_ttc_rotating_solid_update", + "80306cc4": "bhv_ttc_pendulum_init", + "80306d38": "bhv_ttc_pendulum_update", + "80306f48": "bhv_ttc_treadmill_init", + "80307010": "bhv_ttc_treadmill_update", + "803071b8": "bhv_ttc_moving_bar_init", + "80307670": "bhv_ttc_moving_bar_update", + "80307760": "bhv_ttc_cog_init", + "803077e0": "bhv_ttc_cog_update", + "80307930": "bhv_ttc_pit_block_init", + "803079c8": "bhv_ttc_pit_block_update", + "80307ae4": "bhv_ttc_elevator_init", + "80307b58": "bhv_ttc_elevator_update", + "80307c88": "bhv_ttc_2d_rotator_init", + "80307cf8": "bhv_ttc_2d_rotator_update", + "80307ea4": "bhv_ttc_spinner_update", + "80307fb8": "func_80306ED4", + "8030803c": "bhv_mr_blizzard_init", + "80308d6c": "bhv_mr_blizzard_update", + "80309154": "bhv_mr_blizzard_snowball", + "803091e0": "bhv_sliding_plat_2_init", + "80309354": "bhv_sliding_plat_2_loop", + "80309454": "bhv_rotating_octagonal_plat_init", + "803094d0": "bhv_rotating_octagonal_plat_loop", + "803094f8": "bhv_animates_on_floor_switch_press_init", + "80309530": "bhv_animates_on_floor_switch_press_loop", + "803097a4": "bhv_activated_back_and_forth_platform_init", + "803098c0": "bhv_activated_back_and_forth_platform_update", + "80309b64": "bhv_recovery_heart_loop", + "80309cec": "bhv_bubble_cannon_barrel_loop", + "80309ed4": "water_bomb_cannon_act_0", + "80309f68": "water_bomb_cannon_act_1", + "8030a0e8": "water_bomb_cannon_act_2", + "8030a11c": "bhv_water_bomb_cannon_loop", + "8030a1c0": "bhv_unagi_init", + "8030a2a8": "unagi_act_0", + "8030a390": "unagi_act_1_4", + "8030a514": "unagi_act_2", + "8030a614": "unagi_act_3", + "8030a93c": "bhv_unagi_loop", + "8030aabc": "bhv_unagi_subobject_loop", + "8030ad04": "dorrie_raise_head", + "8030ae9c": "dorrie_act_move", + "8030b0b8": "dorrie_begin_head_raise", + "8030b0f0": "dorrie_act_lower_head", + "8030b220": "dorrie_act_raise_head", + "8030b2f4": "bhv_dorrie_update", + "8030b658": "bhv_haunted_chair_init", + "8030b6d8": "haunted_chair_act_0", + "8030ba68": "haunted_chair_act_1", + "8030bc90": "bhv_haunted_chair_loop", + "8030bfd0": "bhv_mad_piano_update", + "8030c06c": "flying_bookend_act_0", + "8030c0f0": "flying_bookend_act_1", + "8030c210": "flying_bookend_act_2", + "8030c2c8": "flying_bookend_act_3", + "8030c364": "bhv_flying_bookend_loop", + "8030c4b0": "bhv_bookend_spawn_loop", + "8030c564": "bookshelf_manager_act_0", + "8030c60c": "bookshelf_manager_act_1", + "8030c6a4": "bookshelf_manager_act_2", + "8030c828": "bookshelf_manager_act_3", + "8030c894": "bookshelf_manager_act_4", + "8030c8ec": "bhv_haunted_bookshelf_manager_loop", + "8030c98c": "bhv_book_switch_loop", + "8030cd30": "obj_spit_fire", + "8030cddc": "bhv_fire_piranha_plant_init", + "8030d2f0": "bhv_fire_piranha_plant_update", + "8030d598": "bhv_fire_spitter_update", + "8030d640": "bhv_small_piranha_flame_loop", + "8030d8d4": "bhv_fly_guy_flame_loop", + "8030d93c": "geo_snufit_move_mask", + "8030d9ac": "geo_snufit_scale_body", + "8030da14": "snufit_act_idle", + "8030db38": "snufit_act_shoot", + "8030dc70": "bhv_snufit_loop", + "8030dfc4": "bhv_snufit_balls_loop", + "8030e14c": "bhv_horizontal_grindel_init", + "8030e16c": "bhv_horizontal_grindel_update", + "8030ea9c": "bhv_eyerok_boss_loop", + "8030fff8": "bhv_eyerok_hand_loop", + "80310498": "bhv_klepto_init", + "8031126c": "obj_set_speed_to_zero", + "8031129c": "bhv_klepto_update", + "80311874": "bhv_bird_update", + "803118e4": "bhv_racing_penguin_init", + "80312070": "bhv_racing_penguin_update", + "80312168": "bhv_penguin_race_finish_line_update", + "80312200": "bhv_penguin_race_shortcut_check_update", + "80312248": "bhv_coffin_spawner_loop", + "80312370": "coffin_act_idle", + "8031262c": "coffin_act_stand_up", + "8031274c": "bhv_coffin_loop", + "80312804": "clam_act_0", + "80312900": "clam_act_1", + "80312a54": "bhv_clam_loop", + "80313110": "bhv_skeeter_update", + "803131e8": "bhv_skeeter_wave_update", + "8031326c": "bhv_swing_platform_init", + "80313294": "bhv_swing_platform_update", + "80313354": "bhv_donut_platform_spawner_update", + "80313530": "bhv_donut_platform_update", + "803136cc": "bhv_ddd_pole_init", + "80313754": "bhv_ddd_pole_update", + "803137f4": "bhv_red_coin_star_marker_init", + "80313fc0": "bhv_triplet_butterfly_update", + "80314098": "bubba_act_0", + "8031427c": "bubba_act_1", + "803145d4": "bhv_bubba_loop", + "80314a30": "prepare_reverb_ring_buffer", + "80314cc0": "get_volume_ramping", + "80314de4": "synthesis_execute", + "80314f64": "synthesis_do_one_audio_update", + "80315590": "synthesis_process_notes", + "80316010": "load_wave_samples", + "803160dc": "final_resample", + "80316138": "process_envelope", + "8031619c": "process_envelope_inner", + "803166fc": "note_apply_headset_pan_effects", + "80316ac8": "note_init_volume", + "80316af4": "note_set_vel_pan_reverb", + "80316da8": "note_set_frequency", + "80316db4": "note_enable", + "80316e00": "note_disable", + "80316e80": "reset_bank_and_seq_load_status", + "80316ec4": "discard_bank", + "80316fb4": "discard_sequence", + "80317040": "soundAlloc", + "803170b4": "sound_alloc_pool_init", + "803170d4": "persistent_pool_clear", + "803170e8": "temporary_pool_clear", + "80317118": "unused_803160F8", + "80317128": "sound_init_main_pools", + "80317184": "session_pools_init", + "80317200": "seq_and_bank_pool_init", + "8031727c": "persistent_pools_init", + "80317338": "temporary_pools_init", + "803173fc": "alloc_bank_or_seq", + "8031782c": "get_bank_or_seq", + "803178ec": "decrease_reverb_gain", + "80317914": "wait_for_audio_frames", + "80317948": "audio_reset_session", + "80318040": "audio_dma_copy_immediate", + "803180c4": "audio_dma_copy_async", + "80318130": "audio_dma_partial_copy_async", + "803181ec": "decrease_sample_dma_ttls", + "80318300": "dma_sample_data", + "80318634": "init_sample_dma_buffers", + "803188f4": "patch_audio_bank", + "80318b30": "bank_load_immediate", + "80318c8c": "bank_load_async", + "80318dc4": "sequence_dma_immediate", + "80318e70": "sequence_dma_async", + "80318fac": "get_missing_bank", + "803190f4": "load_banks_immediate", + "80319220": "preload_sequence", + "80319328": "load_sequence", + "80319388": "load_sequence_internal", + "8031950c": "audio_init", + "80319920": "note_init", + "80319998": "note_disable2", + "803199b8": "process_notes", + "80319db8": "seq_channel_layer_decay_release_internal", + "80319f64": "seq_channel_layer_note_decay", + "80319f84": "seq_channel_layer_note_release", + "80319fa4": "build_synthetic_wave", + "8031a1d0": "init_synthetic_wave", + "8031a254": "init_note_list", + "8031a264": "init_note_lists", + "8031a2b4": "init_note_free_list", + "8031a368": "note_pool_clear", + "8031a494": "note_pool_fill", + "8031a5d0": "audio_list_push_front", + "8031a610": "audio_list_remove", + "8031a63c": "pop_node_with_value_less_equal", + "8031a6cc": "note_init_for_layer", + "8031a794": "func_80319728", + "8031a7c8": "note_release_and_take_ownership", + "8031a820": "alloc_note_from_disabled", + "8031a89c": "alloc_note_from_decaying", + "8031a8f0": "alloc_note_from_active", + "8031a94c": "alloc_note", + "8031ac34": "reclaim_notes", + "8031adac": "note_init_all", + "8031aee8": "sequence_player_process_sound", + "8031b0cc": "get_portamento_freq_scale", + "8031b1c0": "get_vibrato_pitch_change", + "8031b248": "get_vibrato_freq_scale", + "8031b440": "note_vibrato_update", + "8031b4a0": "note_vibrato_init", + "8031b58c": "adsr_init", + "8031b5ac": "adsr_update", + "8031b830": "sequence_channel_init", + "8031b940": "seq_channel_set_layer", + "8031ba30": "seq_channel_layer_disable", + "8031ba6c": "seq_channel_layer_free", + "8031baf0": "sequence_channel_disable", + "8031bb5c": "allocate_sequence_channel", + "8031bba4": "sequence_player_init_channels", + "8031bcd0": "sequence_player_disable_channels", + "8031bda0": "sequence_channel_enable", + "8031be44": "sequence_player_disable", + "8031bf14": "audio_list_push_back", + "8031bf54": "audio_list_pop_back", + "8031bf94": "init_layer_freelist", + "8031c03c": "m64_read_u8", + "8031c050": "m64_read_s16", + "8031c080": "m64_read_compressed_u16", + "8031c0c4": "seq_channel_layer_process_script", + "8031c200": "L_U_8031C200", + "8031c23c": "L_U_8031C23C", + "8031c298": "L_U_8031C298", + "8031c2dc": "L_U_8031C2DC", + "8031c328": "L_U_8031C328", + "8031c36c": "L_U_8031C36C", + "8031c3bc": "L_U_8031C3BC", + "8031c3e8": "L_U_8031C3E8", + "8031c454": "L_U_8031C454", + "8031c4a4": "L_U_8031C4A4", + "8031c5c8": "L_U_8031C5C8", + "8031c698": "L_U_8031C698", + "8031c6a0": "L_U_8031C6A0", + "8031cbe0": "L_U_8031CBE0", + "8031cbec": "L_U_8031CBEC", + "8031ce54": "get_instrument", + "8031cfd4": "set_instrument", + "8031d068": "sequence_channel_set_volume", + "8031d08c": "sequence_channel_process_script", + "8031d144": "L_U_8031D144", + "8031d1f8": "L_U_8031D1F8", + "8031d234": "L_U_8031D234", + "8031d26c": "L_U_8031D26C", + "8031d2b4": "L_U_8031D2B4", + "8031d2c4": "L_U_8031D2C4", + "8031d31c": "L_U_8031D31C", + "8031d344": "L_U_8031D344", + "8031d354": "L_U_8031D354", + "8031d370": "L_U_8031D370", + "8031d3a8": "L_U_8031D3A8", + "8031d3c4": "L_U_8031D3C4", + "8031d3d4": "L_U_8031D3D4", + "8031d3e4": "L_U_8031D3E4", + "8031d400": "L_U_8031D400", + "8031d424": "L_U_8031D424", + "8031d44c": "L_U_8031D44C", + "8031d474": "L_U_8031D474", + "8031d498": "L_U_8031D498", + "8031d4bc": "L_U_8031D4BC", + "8031d4d4": "L_U_8031D4D4", + "8031d4f0": "L_U_8031D4F0", + "8031d500": "L_U_8031D500", + "8031d51c": "L_U_8031D51C", + "8031d538": "L_U_8031D538", + "8031d56c": "L_U_8031D56C", + "8031d5a0": "L_U_8031D5A0", + "8031d5b4": "L_U_8031D5B4", + "8031d5d4": "L_U_8031D5D4", + "8031d5e4": "L_U_8031D5E4", + "8031d640": "L_U_8031D640", + "8031d678": "L_U_8031D678", + "8031d6c4": "L_U_8031D6C4", + "8031d6d4": "L_U_8031D6D4", + "8031d6f4": "L_U_8031D6F4", + "8031d718": "L_U_8031D718", + "8031d728": "L_U_8031D728", + "8031d73c": "L_U_8031D73C", + "8031d7b8": "L_U_8031D7B8", + "8031d7e8": "L_U_8031D7E8", + "8031d7f8": "L_U_8031D7F8", + "8031d814": "L_U_8031D814", + "8031d830": "L_U_8031D830", + "8031d87c": "L_U_8031D87C", + "8031d898": "L_U_8031D898", + "8031d8f8": "L_U_8031D8F8", + "8031d900": "L_U_8031D900", + "8031d930": "L_U_8031D930", + "8031d94c": "L_U_8031D94C", + "8031d974": "L_U_8031D974", + "8031d9ec": "sequence_player_process_sequence", + "8031e240": "process_sequences", + "8031e2e8": "init_sequence_player", + "8031e374": "init_sequence_players", + "8031e4f0": "unused_8031E4F0", + "8031e568": "unused_8031E568", + "8031e578": "sequence_player_fade_out_internal", + "8031e5c0": "func_8031D690", + "8031e60c": "func_8031D6E4", + "8031e6a4": "func_8031D7B0", + "8031e710": "func_8031D838", + "8031e7b8": "create_next_audio_frame_task", + "8031eb00": "play_sound", + "8031eb30": "process_sound_request", + "8031edec": "process_all_sound_requests", + "8031ee70": "func_8031DFE8", + "8031ef6c": "func_8031E0E4", + "8031eff4": "func_8031E16C", + "8031f810": "get_sound_pan", + "8031f96c": "get_sound_dynamics", + "8031fb20": "get_sound_freq_scale", + "8031fbe8": "get_sound_reverb", + "8031fd84": "audio_signal_game_loop_tick", + "8031fdac": "update_game_sound", + "80320544": "play_sequence", + "80320678": "sequence_player_fade_out", + "803206bc": "fade_volume_scale", + "80320734": "fade_channel_volume_scale", + "8032080c": "func_8031F96C", + "803208ec": "process_level_music_dynamics", + "80320a4c": "L8031FBAC", + "80320a8c": "L8031FBEC", + "80320acc": "L8031FC2C", + "80320b0c": "L8031FC6C", + "80320b4c": "L8031FCAC", + "80320b8c": "L8031FCEC", + "80320bcc": "L8031FD2C", + "80320bf4": "L8031FD54", + "80320d70": "unused_8031FED0", + "80320e3c": "func_8031FFB4", + "80320ec4": "sequence_player_unlower", + "80320f68": "func_803200E4", + "803210d4": "set_sound_disabled", + "8032112c": "sound_init", + "80321398": "get_currently_playing_sound", + "80321474": "func_803205E8", + "80321584": "func_803206F8", + "8032171c": "func_80320890", + "8032174c": "sound_banks_disable", + "803217a8": "disable_all_sequence_players", + "8032180c": "sound_banks_enable", + "80321864": "unused_803209D8", + "803218d8": "func_80320A4C", + "803218f4": "play_dialog_sound", + "803219ac": "play_music", + "80321bac": "stop_background_music", + "80321ce4": "fadeout_background_music", + "80321d38": "drop_queued_background_music", + "80321d5c": "get_current_background_music", + "80321d9c": "func_80320ED8", + "80321e48": "play_secondary_music", + "80321f48": "func_80321080", + "80321f9c": "func_803210D4", + "80322078": "play_course_clear", + "803220b4": "play_peachs_jingle", + "803220f0": "play_puzzle_jingle", + "8032212c": "play_star_fanfare", + "80322168": "play_power_star_jingle", + "803221b8": "play_race_fanfare", + "803221f4": "play_toads_jingle", + "80322230": "sound_reset", + "8032231c": "audio_set_sound_mode", + "80322348": "unused_80321460", + "8032235c": "unused_80321474", + "803223b0": "osSetTime", + "803223e0": "osMapTLB", + "803224a0": "osUnmapTLBAll", + "803224f0": "sprintf", + "8032255c": "proutSprintf", + "803225a0": "osCreateMesgQueue", + "803225d0": "osSetEventMesg", + "80322640": "osViSetEvent", + "803226b0": "osCreateThread", + "80322800": "osRecvMesg", + "80322940": "_VirtualToPhysicalTask", + "80322a5c": "osSpTaskLoad", + "80322bbc": "osSpTaskStartGo", + "80322c00": "osSpTaskYield", + "80322c20": "osSendMesg", + "80322d70": "osSpTaskYielded", + "80322df0": "osStartThread", + "80322f40": "osWritebackDCacheAll", + "80322f70": "osCreateViManager", + "803230f4": "viMgrMain", + "803232d0": "osViSetMode", + "80323340": "osViBlack", + "803233b0": "osViSetSpecialFeatures", + "80323570": "osCreatePiManager", + "803236f0": "osSetThreadPri", + "803237d0": "osInitialize", + "80323a00": "osViSwapBuffer", + "80323a50": "sqrtf", + "80323a60": "osContStartReadData", + "80323b24": "osContGetReadData", + "80323bcc": "__osPackReadData", + "80323cc0": "osContInit", + "80323ebc": "__osContGetInitData", + "80323f8c": "__osPackRequestData", + "80324080": "osEepromProbe", + "803240f0": "__ull_rshift", + "8032411c": "__ull_rem", + "80324158": "__ull_div", + "80324194": "__ll_lshift", + "803241c0": "__ll_rem", + "803241fc": "__ll_div", + "80324258": "__ll_mul", + "80324288": "__ull_divremi", + "803242e8": "__ll_mod", + "80324384": "__ll_rshift", + "803243b0": "osInvalDCache", + "80324460": "osPiStartDma", + "80324570": "bzero", + "80324610": "osInvalICache", + "80324690": "osEepromLongRead", + "803247d0": "osEepromLongWrite", + "80324910": "bcopy", + "80324c20": "guOrthoF", + "80324d74": "guOrtho", + "80324de0": "guPerspectiveF", + "80325010": "guPerspective", + "80325070": "osGetTime", + "80325100": "__d_to_ll", + "8032511c": "__f_to_ll", + "80325138": "__d_to_ull", + "803251d8": "__f_to_ull", + "80325274": "__ll_to_d", + "8032528c": "__ll_to_f", + "803252a4": "__ull_to_d", + "803252d8": "__ull_to_f", + "80325310": "cosf", + "80325480": "sinf", + "80325640": "guTranslateF", + "80325688": "guTranslate", + "803256e0": "guRotateF", + "80325874": "guRotate", + "803258d0": "guScaleF", + "80325924": "guScale", + "80325970": "osAiSetFrequency", + "80325bd4": "alBnkfNew", + "80325cd8": "alSeqFileNew", + "80325d20": "osWritebackDCache", + "80325da0": "osAiGetLength", + "80325db0": "osAiSetNextBuffer", + "80325e60": "__osTimerServicesInit", + "80325eec": "__osTimerInterrupt", + "80326064": "__osSetTimerIntr", + "803260d8": "__osInsertTimer", + "80326260": "_Printf", + "803273f0": "memcpy", + "8032741c": "strlen", + "80327444": "strchr", + "80327490": "__osDequeueThread", + "803274d0": "__osDisableInt", + "803274f0": "__osRestoreInt", + "80327510": "__osViInit", + "80327640": "__osExceptionPreamble", + "80327650": "__osException", + "803278e4": "L80326964", + "80327904": "L80326984", + "80327938": "L803269B8", + "80327a68": "L80326AE8", + "80327ac4": "L80326B44", + "80327ae4": "L80326B64", + "80327b1c": "L80326B9C", + "80327b68": "L80326BE8", + "80327b98": "send_mesg", + "80327c80": "__osEnqueueAndYield", + "80327d10": "__osEnqueueThread", + "80327d58": "__osPopThread", + "80327d68": "__osDispatchThread", + "80327ea8": "__osCleanupThread", + "80327eb0": "osVirtualToPhysical", + "80327f30": "__osSpSetStatus", + "80327f40": "__osSpSetPc", + "80327f80": "__osSpRawStartDma", + "80328010": "__osSpDeviceBusy", + "80328040": "__osSpGetStatus", + "80328050": "osGetThreadPri", + "80328070": "__osViGetCurrentContext", + "80328080": "__osViSwapContext", + "803283e0": "osGetCount", + "803283f0": "__osPiCreateAccessQueue", + "80328440": "__osPiGetAccess", + "80328484": "__osPiRelAccess", + "803284b0": "osPiRawStartDma", + "80328590": "__osDevMgrMain", + "80328710": "__osSetSR", + "80328720": "__osGetSR", + "80328730": "__osSetFpcCsr", + "80328740": "__osSiRawReadIo", + "80328790": "__osSiRawWriteIo", + "803287e0": "osMapTLBRdb", + "80328840": "osPiRawReadIo", + "803288a0": "__osSiCreateAccessQueue", + "803288f0": "__osSiGetAccess", + "80328934": "__osSiRelAccess", + "80328960": "__osSiRawStartDma", + "80328a10": "osSetTimer", + "80328af0": "osEepromWrite", + "80328ca0": "__osPackEepWriteData", + "80328dac": "__osEepStatus", + "80328fd0": "osJamMesg", + "80329120": "osPiGetCmdQueue", + "80329150": "osEepromRead", + "80329340": "__osPackEepReadData", + "80329450": "guMtxF2L", + "80329550": "guMtxIdentF", + "803295d8": "guMtxIdent", + "80329608": "guMtxL2F", + "803296c0": "guNormalize", + "80329750": "__osAiDeviceBusy", + "80329780": "__osSetCompare", + "80329790": "_Litob", + "80329a90": "_Ldtob", + "8032a860": "u32_to_string", + "8032a890": "string_to_u32", + "8032a8e8": "send_packet", + "8032a9a8": "send", + "8032aa80": "process_command_memory", + "8032aacc": "process_command_register", + "8032aaf8": "kdebugserver", + "8032ace0": "__osSyncPutChars", + "8032ae10": "osSetIntMask", + "8032ae70": "osDestroyThread", + "8032af70": "__osProbeTLB", + "8032b030": "__osSiDeviceBusy", + "8032b060": "lldiv", + "8032b160": "ldiv", + "8032b1f0": "__osGetCause", + "8032b200": "__osAtomicDec", + "8032b260": "rspF3DBootStart", + "8032b330": "rspF3DBootEnd", + "8032b330": "rspF3DStart", + "8032c738": "rspF3DEnd", + "8032c740": "rspAspMainStart", + "8032d560": "rspAspMainEnd", + "8032d560": "gVblankHandler1", + "8032d564": "gVblankHandler2", + "8032d568": "gActiveSPTask", + "8032d56c": "sCurrentAudioSPTask", + "8032d570": "sCurrentDisplaySPTask", + "8032d574": "sNextAudioSPTask", + "8032d578": "sNextDisplaySPTask", + "8032d57c": "sAudioEnabled", + "8032d580": "sNumVblanks", + "8032d584": "gResetTimer", + "8032d588": "D_8032C648", + "8032d58c": "gDebugLevelSelect", + "8032d590": "D_8032C650", + "8032d594": "gShowProfiler", + "8032d598": "gShowDebugText", + "8032d5d0": "unused8032C690", + "8032d5d4": "gGlobalTimer", + "8032d5dc": "frameBufferIndex", + "8032d5e0": "D_8032C6A0", + "8032d5e4": "gPlayer1Controller", + "8032d5e8": "gPlayer2Controller", + "8032d5ec": "gPlayer3Controller", + "8032d5f0": "gCurrDemoInput", + "8032d5f4": "gDemoInputListID", + "8032d5f8": "gRecordedDemoInput", + "8032d6d0": "credits01", + "8032d6d8": "credits02", + "8032d6e4": "credits03", + "8032d6f0": "credits04", + "8032d700": "credits05", + "8032d710": "credits06", + "8032d71c": "credits07", + "8032d728": "credits08", + "8032d738": "credits09", + "8032d740": "credits10", + "8032d750": "credits11", + "8032d75c": "credits12", + "8032d764": "credits13", + "8032d774": "credits14", + "8032d77c": "credits15", + "8032d788": "credits16", + "8032d79c": "credits17", + "8032d7ac": "credits18", + "8032d7bc": "credits19", + "8032d7c4": "credits20", + "8032d7cc": "sCreditsSequence", + "8032d93c": "gMarioState", + "8032d940": "unused1", + "8032d944": "D_8032C9E0", + "8032daa0": "sTerrainSounds", + "8032dacc": "sSquishScaleOverTime", + "8032dae0": "sCapFlickerFrames", + "8032daf8": "gWaterSurfacePseudoFloor", + "8032dc50": "sJumpLandAction", + "8032dc68": "sFreefallLandAction", + "8032dc80": "sSideFlipLandAction", + "8032dc98": "sHoldJumpLandAction", + "8032dcb0": "sHoldFreefallLandAction", + "8032dcc8": "sLongJumpLandAction", + "8032dce0": "sDoubleJumpLandAction", + "8032dcf8": "sTripleJumpLandAction", + "8032dd10": "sBackflipLandAction", + "8032dd40": "sPunchingForwardVelocities", + "8032dd80": "gLastCompletedCourseNum", + "8032dd84": "gLastCompletedStarNum", + "8032dd88": "sUnusedGotGlobalCoinHiScore", + "8032dd8c": "gGotFileCoinHiScore", + "8032dd90": "gCurrCourseStarFlags", + "8032dd94": "gSpecialTripleJump", + "8032dd98": "gLevelToCourseNumTable", + "8032ddc0": "gMarioSpawnInfo", + "8032ddc4": "gLoadedGraphNodes", + "8032ddc8": "gAreas", + "8032ddcc": "gCurrentArea", + "8032ddd0": "gCurrCreditsEntry", + "8032ddd4": "D_8032CE74", + "8032ddd8": "D_8032CE78", + "8032dddc": "gWarpTransDelay", + "8032dde0": "gFBSetColor", + "8032dde4": "gWarpTransFBSetColor", + "8032dde8": "gWarpTransRed", + "8032ddec": "gWarpTransGreen", + "8032ddf0": "gWarpTransBlue", + "8032ddf4": "gCurrSaveFileNum", + "8032ddf8": "gCurrLevelNum", + "8032ddfc": "D_8032CE9C", + "8032de4c": "D_8032CEEC", + "8032de60": "D_8032CF00", + "8032de70": "renderModeTable_1Cycle", + "8032deb0": "renderModeTable_2Cycle", + "8032def0": "gCurGraphNodeRoot", + "8032def4": "gCurGraphNodeMasterList", + "8032def8": "gCurGraphNodeCamFrustum", + "8032defc": "gCurGraphNodeCamera", + "8032df00": "gCurGraphNodeObject", + "8032df04": "gCurGraphNodeHeldObject", + "8032df08": "gAreaUpdateCounter", + "8032df10": "gProfilerMode", + "8032df14": "gCurrentFrameIndex1", + "8032df18": "gCurrentFrameIndex2", + "8032df20": "unused8032CFC0", + "8032df24": "gCutsceneFocus", + "8032df28": "unused8032CFC8", + "8032df2c": "unused8032CFCC", + "8032df30": "gSecondCameraFocus", + "8032df34": "sYawSpeed", + "8032df38": "gCurrLevelArea", + "8032df3c": "gPrevLevel", + "8032df40": "unused8032CFE0", + "8032df44": "unused8032CFE4", + "8032df48": "unused8032CFE8", + "8032df4c": "gCameraZoomDist", + "8032df50": "sObjectCutscene", + "8032df54": "gRecentCutscene", + "8032df58": "sFramesSinceCutsceneEnded", + "8032df5c": "sCutsceneDialogResponse", + "8032df60": "sMarioCamState", + "8032df64": "sLuigiCamState", + "8032df68": "unused8032D008", + "8032df6c": "sFixedModeBasePosition", + "8032df78": "sUnusedModeBasePosition_2", + "8032df84": "sUnusedModeBasePosition_3", + "8032df90": "sUnusedModeBasePosition_4", + "8032df9c": "sUnusedModeBasePosition_5", + "8032dfa8": "sModeTransitions", + "8032e008": "unused8032D0A8", + "8032e010": "unused8032D0B0", + "8032e018": "sDanceCutsceneTable", + "8032e024": "unusedDanceInfo1", + "8032e038": "unusedDanceType", + "8032e03c": "unusedDanceInfo2", + "8032e050": "sBBHLibraryParTrackPath", + "8032e098": "sCamSL", + "8032e0e0": "sCamTHI", + "8032e128": "sCamHMC", + "8032e1d0": "sCamSSL", + "8032e248": "sCamRR", + "8032e2f0": "sCamBOB", + "8032e338": "sCamCotMC", + "8032e368": "sCamCCM", + "8032e3b0": "sCamCastle", + "8032e6f8": "sCamBBH", + "8032ecb0": "sCameraTriggers", + "8032ed50": "sIntroStartToPipePosition", + "8032ee08": "sIntroStartToPipeFocus", + "8032eec0": "sIntroPipeToDialogPosition", + "8032ef30": "sIntroPipeToDialogFocus", + "8032efa0": "sEndingFlyToWindowPos", + "8032eff0": "sEndingFlyToWindowFocus", + "8032f048": "sEndingPeachDescentCamPos", + "8032f0e8": "sEndingMarioToPeachPos", + "8032f130": "sEndingMarioToPeachFocus", + "8032f178": "sEndingLookUpAtCastle", + "8032f1b8": "sEndingLookAtSkyFocus", + "8032f214": "gIntroLakituStartToPipeFocus", + "8032f32c": "gIntroLakituStartToPipeOffsetFromCamera", + "8032f444": "gEndWavingPos", + "8032f48c": "gEndWavingFocus", + "8032f4d4": "sCutsceneEnding", + "8032f534": "sCutsceneGrandStar", + "8032f544": "sCutsceneUnused", + "8032f554": "sCutsceneDoorWarp", + "8032f564": "sCutsceneEndWaving", + "8032f56c": "sCutsceneCredits", + "8032f574": "sCutsceneDoorPull", + "8032f59c": "sCutsceneDoorPush", + "8032f5c4": "sCutsceneDoorPullMode", + "8032f5dc": "sCutsceneDoorPushMode", + "8032f5f4": "sCutsceneEnterCannon", + "8032f60c": "sCutsceneStarSpawn", + "8032f624": "sCutsceneRedCoinStarSpawn", + "8032f634": "sCutsceneEnterPainting", + "8032f63c": "sCutsceneDeathExit", + "8032f64c": "sCutsceneExitPaintingSuccess", + "8032f65c": "sCutsceneUnusedExit", + "8032f674": "sCutsceneIntroPeach", + "8032f69c": "sCutscenePrepareCannon", + "8032f6ac": "sCutsceneExitWaterfall", + "8032f6bc": "sCutsceneFallToCastleGrounds", + "8032f6cc": "sCutsceneEnterPyramidTop", + "8032f6dc": "sCutscenePyramidTopExplode", + "8032f6f4": "sCutsceneStandingDeath", + "8032f6fc": "sCutsceneEnterPool", + "8032f70c": "sCutsceneDeathStomach", + "8032f714": "sCutsceneDeathOnBack", + "8032f71c": "sCutsceneQuicksandDeath", + "8032f724": "sCutsceneWaterDeath", + "8032f72c": "sCutsceneSuffocation", + "8032f734": "sCutsceneEnterBowserArena", + "8032f74c": "sCutsceneDanceDefaultRotate", + "8032f754": "sCutsceneDanceFlyAway", + "8032f75c": "sCutsceneDanceCloseup", + "8032f764": "sCutsceneKeyDance", + "8032f76c": "sCutsceneCapSwitchPress", + "8032f774": "sCutsceneSlidingDoorsOpen", + "8032f784": "sCutsceneUnlockKeyDoor", + "8032f794": "sCutsceneExitBowserSuccess", + "8032f7a4": "sCutsceneExitBowserDeath", + "8032f7b4": "sCutsceneExitSpecialSuccess", + "8032f7c4": "sCutsceneNonPaintingDeath", + "8032f7d4": "sCutsceneDialog", + "8032f7ec": "sCutsceneReadMessage", + "8032f804": "sDanceCutsceneIndexTable", + "8032f870": "sZoomOutAreaMasks", + "8032f884": "sBobCreditsSplinePositions", + "8032f8ac": "sBobCreditsSplineFocus", + "8032f8d4": "sWfCreditsSplinePositions", + "8032f8fc": "sWfCreditsSplineFocus", + "8032f924": "sJrbCreditsSplinePositions", + "8032f94c": "sJrbCreditsSplineFocus", + "8032f974": "sCcmSlideCreditsSplinePositions", + "8032f99c": "sCcmSlideCreditsSplineFocus", + "8032f9c4": "sBbhCreditsSplinePositions", + "8032f9e4": "sBbhCreditsSplineFocus", + "8032fa04": "sHmcCreditsSplinePositions", + "8032fa2c": "sHmcCreditsSplineFocus", + "8032fa54": "sThiWigglerCreditsSplinePositions", + "8032fa6c": "sThiWigglerCreditsSplineFocus", + "8032fa84": "sVolcanoCreditsSplinePositions", + "8032fab4": "sVolcanoCreditsSplineFocus", + "8032fae4": "sSslCreditsSplinePositions", + "8032fb14": "sSslCreditsSplineFocus", + "8032fb44": "sDddCreditsSplinePositions", + "8032fb7c": "sDddCreditsSplineFocus", + "8032fbb4": "sSlCreditsSplinePositions", + "8032fbd4": "sSlCreditsSplineFocus", + "8032fbf4": "sWdwCreditsSplinePositions", + "8032fc14": "sWdwCreditsSplineFocus", + "8032fc34": "sTtmCreditsSplinePositions", + "8032fc64": "sTtmCreditsSplineFocus", + "8032fc94": "sThiHugeCreditsSplinePositions", + "8032fccc": "sThiHugeCreditsSplineFocus", + "8032fd04": "sTtcCreditsSplinePositions", + "8032fd24": "sTtcCreditsSplineFocus", + "8032fd44": "sRrCreditsSplinePositions", + "8032fd64": "sRrCreditsSplineFocus", + "8032fd84": "sSaCreditsSplinePositions", + "8032fdac": "sSaCreditsSplineFocus", + "8032fdd4": "sCotmcCreditsSplinePositions", + "8032fdfc": "sCotmcCreditsSplineFocus", + "8032fe24": "sDddSubCreditsSplinePositions", + "8032fe4c": "sDddSubCreditsSplineFocus", + "8032fe74": "sCcmOutsideCreditsSplinePositions", + "8032fe94": "sCcmOutsideCreditsSplineFocus", + "8032fec0": "sObjectListUpdateOrder", + "8032fecc": "sParticleTypes", + "80330000": "D_8032F0A0", + "80330004": "D_8032F0A4", + "80330020": "D_8032F0C0", + "8033002c": "D_8032F0CC", + "8033006c": "sMrIParticleActions", + "80330074": "sMrIActions", + "80330084": "sMrIHitbox", + "80330094": "D_8032F134", + "803300a8": "unused8032F134", + "803300ac": "sCapSwitchActions", + "803300bc": "sKingBobombActions", + "803300e0": "sKingBobombSoundStates", + "80330140": "sOpenedCannonActions", + "8033015c": "unused0EA1FC", + "80330198": "sChuckyaActions", + "803301a8": "sWFRotatingPlatformData", + "803301c0": "sKoopaShellUnderwaterHitbox", + "803301d0": "D_8032F270", + "803301e4": "sSparkleSpawnStarHitbox", + "803301f4": "sYellowCoinHitbox", + "80330204": "D_8032F2A4", + "80330224": "sCoinInsideBooActions", + "8033022c": "D_8032F2CC", + "80330244": "D_8032F2E4", + "80330260": "D_8032F300", + "80330288": "D_8032F328", + "80330290": "D_8032F330", + "80330298": "sGrindelThwompActions", + "803302ac": "sTumblingBridgeParams", + "803302dc": "sTumblingBridgeActions", + "803302ec": "D_8032F38C", + "80330318": "sElevatorActions", + "8033032c": "D_8032F3CC", + "80330340": "D_8032F3E0", + "80330354": "D_8032F3F4", + "8033035c": "D_8032F3FC", + "80330370": "sUkikiCageActions", + "80330380": "D_8032F420", + "80330390": "sSpindriftHitbox", + "803303a0": "sMetalBoxHitbox", + "803303b0": "sBreakableBoxHitbox", + "803303c0": "D_8032F460", + "803303e8": "sHeaveHoActions", + "803303f8": "sJumpingBoxHitbox", + "80330408": "sJumpingBoxActions", + "8033042c": "sBowserKeyHitbox", + "8033043c": "sBulletBillActions", + "80330450": "sBowserTailAnchorActions", + "8033045c": "D_8032F4FC", + "8033046c": "D_8032F50C", + "80330470": "D_8032F510", + "80330474": "D_8032F514", + "80330478": "sBowserDefeatedDialogText", + "80330480": "D_8032F520", + "803304c8": "sBowserActions", + "80330518": "D_8032F5B8", + "803305f0": "D_8032F690", + "803305f4": "D_8032F694", + "803305f8": "D_8032F698", + "8033067c": "sFallingBowserPlatformActions", + "80330688": "sGrowingBowserFlameHitbox", + "80330698": "sBowserFlameHitbox", + "803306a8": "D_8032F748", + "803306b4": "D_8032F754", + "803306dc": "sCageUkikiPath", + "80330738": "sUkikiSoundStates", + "803307a0": "sUkikiActions", + "803307c0": "D_8032F860", + "803307f4": "D_8032F894", + "80330828": "D_8032F8C8", + "80330830": "sRotatingCwFireBarsActions", + "80330840": "sKoopaShellHitbox", + "80330850": "D_8032F8F0", + "80330884": "D_8032F924", + "803308a8": "D_8032F948", + "803308cc": "D_8032F96C", + "803308d8": "sToxBoxActions", + "80330900": "TablePiranhaPlantActions", + "80330b1c": "sBowserPuzzlePieceActions", + "80330b38": "sTuxiesMotherActions", + "80330b44": "sSmallPenguinActions", + "80330b5c": "sFishActions", + "80330b68": "sFishGroupActions", + "80330b74": "sBirdChirpChirpActions", + "80330b84": "sCheepCheepActions", + "80330b90": "sExclamationBoxHitbox", + "80330ba0": "sExclamationBoxContents", + "80330c20": "sExclamationBoxActions", + "80330c38": "sSkullSlidingBoxHitbox", + "80330c48": "D_8032FCE8", + "80330c58": "sTweesterHitbox", + "80330c68": "sTweesterActions", + "80330cd4": "sScuttlebugHitbox", + "80330ce4": "sWhompActions", + "80330d0c": "sWaterSplashDropletParams", + "80330d30": "sShallowWaterSplashDropletParams", + "80330d54": "sWaterDropletFishParams", + "80330d78": "sShallowWaterWaveDropletParams", + "80330d9c": "sStrongWindParticleHitbox", + "80330dac": "sSLWalkingPenguinErraticSteps", + "80330e20": "D_8032FEC0", + "80330e24": "unused_8032FEC4", + "80330e34": "gMarioPlatform", + "80330e40": "sDebugEffectStringInfo", + "80330e64": "sDebugEnemyStringInfo", + "80330e88": "sDebugInfoDPadMask", + "80330e8c": "sDebugInfoDPadUpdID", + "80330e90": "sDebugLvSelectCheckFlag", + "80330e94": "sDebugPage", + "80330e98": "sNoExtraDebug", + "80330e9c": "sDebugStringArrPrinted", + "80330ea0": "sDebugSysCursor", + "80330ea4": "sDebugInfoButtonSeqID", + "80330ea8": "sDebugInfoButtonSeq", + "80330ec0": "sTransitionColorFadeCount", + "80330ec4": "sTransitionTextureFadeCount", + "80330ec8": "sTextureTransitionID", + "80330ee0": "rectangles", + "80330f00": "sSkyboxTextures", + "80330f28": "sSkyboxColors", + "80330f30": "gMovtexCounter", + "80330f34": "gMovtexCounterPrev", + "80330f38": "gMovtexVtxColor", + "80330f3c": "gPaintingMarioYEntry", + "80330f40": "gWdwWaterLevelSet", + "80330f44": "gMovtexIdToTexture", + "80330f64": "gMovtexNonColored", + "803311a4": "gMovtexColored", + "8033127c": "gMovtexColored2", + "80331300": "sHmcPaintings", + "80331308": "sInsideCastlePaintings", + "80331344": "sTtmPaintings", + "8033134c": "sPaintingGroups", + "80331358": "gPaintingUpdateCounter", + "8033135c": "gLastPaintingUpdateCounter", + "80331360": "sTextLabelsCount", + "80331370": "gDialogCharWidths", + "80331470": "gDialogBoxState", + "80331474": "gDialogBoxOpenTimer", + "80331478": "gDialogBoxScale", + "8033147c": "gDialogScrollOffsetY", + "80331480": "gDialogBoxType", + "80331484": "gDialogID", + "80331488": "gLastDialogPageStrPos", + "8033148c": "gDialogTextPos", + "80331490": "gDialogLineNum", + "80331494": "gLastDialogResponse", + "80331498": "gMenuHoldKeyIndex", + "8033149c": "gMenuHoldKeyTimer", + "803314a0": "gDialogResponse", + "803314b0": "gHudSymCoin", + "803314b4": "gHudSymX", + "803314f8": "gMenuMode", + "803314fc": "gEndCutsceneStrEn0", + "80331504": "gEndCutsceneStrEn1", + "80331538": "gEndCutsceneStrEn2", + "80331558": "gEndCutsceneStrEn3", + "8033156c": "gEndCutsceneStrEn4", + "80331598": "gEndCutsceneStrEn5", + "803315ac": "gEndCutsceneStrEn6", + "803315cc": "gEndCutsceneStrEn7", + "803315dc": "gEndCutsceneStrEn8", + "803315e4": "gEndCutsceneStringsEn", + "8033160c": "gCutsceneMsgFade", + "80331610": "gCutsceneMsgIndex", + "80331614": "gCutsceneMsgDuration", + "80331618": "gCutsceneMsgTimer", + "8033161c": "gDialogCameraAngleIndex", + "80331620": "gDialogCourseActNum", + "803316c8": "gCourseCompleteCoinsEqual", + "803316cc": "gCourseDoneMenuTimer", + "803316d0": "gCourseCompleteCoins", + "803316d4": "gHudFlash", + "80331750": "gEnvFxMode", + "80331754": "D_80330644", + "80331758": "gSnowTempVtx", + "80331788": "gSnowFlakeVertex1", + "80331790": "gSnowFlakeVertex2", + "80331798": "gSnowFlakeVertex3", + "803317a0": "D_80330690", + "803317a4": "D_80330694", + "803317a8": "gBubbleTempVtx", + "803317e0": "MacroObjectPresets", + "803325fc": "sPowerMeterVisibleTimer", + "80332614": "sPrevCheckMarioRoom", + "80332618": "sYoshiDead", + "8033261c": "sDebugSequenceTracker", + "80332620": "sDebugTimer", + "803327a8": "sBreakableBoxSmallHitbox", + "80332b00": "sMrBlizzardHitbox", + "80332b10": "D_80331A00", + "80332b24": "sMrBlizzardSnowballHitbox", + "80332b34": "D_80331A24", + "80332b54": "D_80331A44", + "80332b5c": "D_80331A4C", + "80332b64": "D_80331A54", + "80332bdc": "D_80331ACC", + "80332bf0": "sRecoveryHeartHitbox", + "80332c00": "sUnagiHitbox", + "80332c10": "sHauntedChairHitbox", + "80332c30": "sFlyingBookendHitbox", + "80332c40": "D_80331B30", + "80332c4c": "sBookSwitchHitbox", + "80332c5c": "sFirePiranhaPlantHitbox", + "80332c6c": "D_80331B5C", + "80332c74": "sPiranhaPlantFireHitbox", + "80332c84": "sSnufitHitbox", + "80332c94": "sSnufitBulletHitbox", + "80332ca4": "sEyerokHitbox", + "80332cb4": "D_80331BA4", + "80332d10": "coffinRelativePos", + "80332d28": "sClamShellHitbox", + "80332d38": "sSkeeterHitbox", + "80332d48": "D_80331C38", + "80332e50": "gAudioErrorFlags", + "80332e54": "sGameLoopTicked", + "80332e58": "sDialogSpeaker", + "80332f04": "sDialogSpeakerVoice", + "80332f40": "sNumProcessedSoundRequests", + "80332f44": "sSoundRequestCount", + "80332f48": "sDynBbh", + "80332f54": "sDynDdd", + "80332f6c": "sDynJrb", + "80332f88": "sDynWdw", + "80332f98": "sDynHmc", + "80332fa8": "sDynUnk38", + "80332fb8": "sDynNone", + "80332fbc": "sCurrentMusicDynamic", + "80332fc0": "sBackgroundMusicForDynamics", + "80332fc4": "sLevelDynamics", + "80333060": "sMusicDynamics", + "803330c0": "gAreaEchoLevel", + "80333138": "D_80332028", + "80333188": "sBackgroundMusicDefaultVolume", + "803331ac": "sPlayer0CurSeqId", + "803331b0": "sMusicDynamicDelay", + "803331b4": "D_803320A4", + "803331c0": "D_803320B0", + "803331cc": "D_803320BC", + "803331d8": "sMaxChannelsForSoundBank", + "803331e4": "sNumSoundsPerBank", + "803331f0": "gDefaultSoundArgs", + "803331fc": "sUnusedSoundArgs", + "80333208": "sSoundBankDisabled", + "80333218": "D_80332108", + "8033321c": "sHasStartedFadeOut", + "80333220": "D_80332110", + "80333224": "sUnused80332114", + "80333228": "sUnused80332118", + "8033322c": "D_8033211C", + "80333230": "D_80332120", + "80333234": "D_80332124", + "80333238": "sBackgroundMusicQueueSize", + "8033323c": "sUnused8033323C", + "803332a0": "gAudioSessionPresets", + "80333498": "gAudioCosineTable", + "80333598": "gPitchBendFrequencyScale", + "80333994": "gNoteFrequencies", + "80333b94": "gDefaultShortNoteVelocityTable", + "80333ba4": "gDefaultShortNoteDurationTable", + "80333bb4": "gVibratoCurve", + "80333bc4": "gDefaultEnvelope", + "80333bd0": "sSineWave", + "80333c50": "sSquareWave", + "80333cd0": "sTriangleWave", + "80333d50": "sSawtoothWave", + "80333dd0": "gWaveSamples", + "80333de0": "gHeadsetPanQuantization", + "80333df4": "gHeadsetPanVolume", + "80333ff4": "gStereoPanVolume", + "803341f4": "gDefaultPanVolume", + "803343f4": "gVolRampingLhs136", + "803345f4": "gVolRampingRhs136", + "803347f4": "gVolRampingLhs144", + "803349f4": "gVolRampingRhs144", + "80334bf4": "gVolRampingLhs128", + "80334df4": "gVolRampingRhs128", + "80334ff4": "gTatumsPerBeat", + "80334ff8": "gUnusedCount80333EE8", + "80334ffc": "gAudioHeapSize", + "80335000": "D_80333EF0", + "80335004": "gAudioLoadLock", + "80335008": "sUnused8033EF8", + "80335010": "osViModeTable", + "803358f0": "piMgrArgs", + "80335910": "osClockRate", + "80335918": "D_80334808", + "80335920": "D_80334810", + "80335930": "D_80334820", + "80335940": "D_80334830", + "80335950": "_spaces", + "80335974": "_zeroes", + "803359a0": "D_80334890", + "803359a4": "unknown", + "803359a8": "D_80334898", + "803359ac": "D_8033489C", + "803359b0": "D_803348A0", + "803359b4": "D_803348A4", + "803359c0": "D_803348B0", + "80335a20": "D_80334910", + "80335a24": "D_80334914", + "80335a28": "D_80334918", + "80335a2c": "D_8033491C", + "80335a30": "D_80334920", + "80335a44": "D_80334934", + "80335a48": "D_80334938", + "80335a50": "gOsPiAccessQueueCreated", + "80335a60": "gOsSiAccessQueueCreated", + "80335aa0": "D_80334990", + "80335af0": "D_803349E0", + "80335b40": "D_80334A30", + "80335b44": "D_80334A34", + "80335b48": "D_80334A38", + "80335b50": "D_80334A40", + "80335b54": "D_80334A44", + "80338da0": "D_80337BB0", + "80338da8": "D_80337BB8", + "80338e60": "jtbl_80337C90", + "80338e84": "jtbl_80337CB4", + "80338eac": "jtbl_80337CDC", + "80338ec0": "jtbl_80337D08", + "80338fbc": "jtbl_80337E04", + "8033978c": "jtbl_80338418", + "80339880": "length_str", + "80339884": "flags_str", + "8033988c": "flags_arr", + "80339980": "D_80338610", + "803399a0": "jtbl_80338630", + "803399d0": "NAN", + "803399e0": "D_80338670", + "80339a40": "D_803386D0", + "80339ac0": "rspF3DDataStart", + "8033a2c0": "rspF3DDataEnd", + "8033a2c0": "rspAspMainDataStart", + "8033a580": "rspAspMainDataEnd", + "8033a580": "_mainSegmentEnd", + "008c0c40": "_mainSegmentRomEnd", + "8033a580": "_mainSegmentNoloadStart", + "8033a580": "D_80339210", + "8033a730": "gIdleThread", + "8033a8e0": "gMainThread", + "8033aa90": "gGameLoopThread", + "8033ac40": "gSoundThread", + "8033adf0": "gPIMesgQueue", + "8033ae08": "gIntrMesgQueue", + "8033ae20": "gSPTaskMesgQueue", + "8033ae38": "gDmaMesgBuf", + "8033ae40": "gPIMesgBuf", + "8033aec0": "gSIEventMesgBuf", + "8033aec8": "gIntrMesgBuf", + "8033af08": "gUnknownMesgBuf", + "8033af48": "gDmaIoMesg", + "8033af5c": "D_80339BEC", + "8033af60": "gDmaMesgQueue", + "8033af78": "gSIEventMesgQueue", + "8033af90": "gControllers", + "8033afe8": "gControllerStatuses", + "8033aff8": "gControllerPads", + "8033b010": "gGameVblankQueue", + "8033b028": "D_80339CB8", + "8033b040": "D_80339CD0", + "8033b044": "D_80339CD4", + "8033b048": "gGameVblankHandler", + "8033b050": "gPhysicalFrameBuffers", + "8033b05c": "gPhysicalZBuffer", + "8033b060": "D_80339CF0", + "8033b064": "D_80339CF4", + "8033b068": "gGfxSPTask", + "8033b06c": "gDisplayListHead", + "8033b070": "gGfxPoolEnd", + "8033b074": "gGfxPool", + "8033b078": "gControllerBits", + "8033b079": "gEepromProbe", + "8033b080": "D_80339D10", + "8033b090": "gDemo", + "8033b0a0": "filler80339D30", + "8033b170": "gMarioStates", + "8033b238": "sCurrPlayMode", + "8033b23a": "D_80339ECA", + "8033b23c": "sTransitionTimer", + "8033b240": "sTransitionUpdate", + "8033b244": "unused3", + "8033b248": "sWarpDest", + "8033b250": "D_80339EE0", + "8033b252": "sDelayedWarpOp", + "8033b254": "sDelayedWarpTimer", + "8033b256": "sSourceWarpNodeId", + "8033b258": "sDelayedWarpArg", + "8033b25c": "unused4", + "8033b25e": "sTimerRunning", + "8033b260": "gHudDisplay", + "8033b26e": "gShouldNotPlayCastleMusic", + "8033b270": "sDelayInvincTimer", + "8033b272": "sInvulnerable", + "8033b280": "unused80339F10", + "8033b288": "filler80339F1C", + "8033b2c0": "D_80339F50", + "8033b350": "gMirrorMario", + "8033b3b0": "gBodyStates", + "8033b400": "sSegmentTable", + "8033b480": "sPoolFreeSpace", + "8033b484": "sPoolStart", + "8033b488": "sPoolEnd", + "8033b48c": "sPoolListHeadL", + "8033b490": "sPoolListHeadR", + "8033b494": "gEffectsMemoryPool", + "8033b4a0": "gWarpCheckpoint", + "8033b4a5": "gMainMenuDataModified", + "8033b4a6": "gSaveFileModified", + "8033b4b0": "gPlayerSpawnInfos", + "8033b4d0": "D_8033A160", + "8033b8d0": "gAreaData", + "8033bab0": "gWarpTransition", + "8033bac6": "gCurrCourseNum", + "8033bac8": "gCurrActNum", + "8033baca": "gCurrAreaIndex", + "8033bacc": "gSavedCourseNum", + "8033bace": "gPauseScreenMode", + "8033bad0": "gSaveOptSelectIndex", + "8033bae0": "gMatStackIndex", + "8033bae8": "gMatStack", + "8033c2e8": "gMatStackFixed", + "8033c368": "gGeoTempState", + "8033c378": "gCurAnimType", + "8033c379": "gCurAnimEnabled", + "8033c37a": "gCurrAnimFrame", + "8033c37c": "gCurAnimTranslationMultiplier", + "8033c380": "gCurrAnimAttribute", + "8033c384": "gCurAnimData", + "8033c388": "gDisplayListHeap", + "8033c390": "gProfilerFrameData", + "8033c520": "gPlayerCameraState", + "8033c568": "sOldPosition", + "8033c578": "sOldFocus", + "8033c588": "sPlayer2FocusOffset", + "8033c594": "sCreditsPlayer2Pitch", + "8033c596": "sCreditsPlayer2Yaw", + "8033c598": "sFramesPaused", + "8033c5a0": "sFOVState", + "8033c5c0": "sModeTransition", + "8033c5e8": "sMarioGeometry", + "8033c61c": "unusedFreeRoamWallYaw", + "8033c61e": "sAvoidYawVel", + "8033c620": "sCameraYawAfterDoorCutscene", + "8033c622": "unusedSplinePitch", + "8033c624": "unusedSplineYaw", + "8033c628": "sHandheldShakeSpline", + "8033c668": "sHandheldShakeMag", + "8033c66c": "sHandheldShakeTimer", + "8033c670": "sHandheldShakeInc", + "8033c674": "sHandheldShakePitch", + "8033c676": "sHandheldShakeYaw", + "8033c678": "sHandheldShakeRoll", + "8033c67c": "unused8033B30C", + "8033c680": "unused8033B310", + "8033c684": "sSelectionFlags", + "8033c686": "unused8033B316", + "8033c688": "s2ndRotateFlags", + "8033c68a": "unused8033B31A", + "8033c68c": "sCameraSoundFlags", + "8033c68e": "sCButtonsPressed", + "8033c690": "sCutsceneDialogID", + "8033c698": "gLakituState", + "8033c758": "unused8033B3E8", + "8033c75a": "sAreaYaw", + "8033c75c": "sAreaYawChange", + "8033c75e": "sLakituDist", + "8033c760": "sLakituPitch", + "8033c764": "sZoomAmount", + "8033c768": "sCSideButtonYaw", + "8033c76a": "sBehindMarioSoundTimer", + "8033c76c": "sZeroZoomDist", + "8033c770": "sCUpCameraPitch", + "8033c772": "sModeOffsetYaw", + "8033c774": "sSpiralStairsYawOffset", + "8033c776": "s8DirModeBaseYaw", + "8033c778": "s8DirModeYawOffset", + "8033c77c": "sPanDistance", + "8033c780": "sCannonYOffset", + "8033c788": "sModeInfo", + "8033c7d0": "sCastleEntranceOffset", + "8033c7dc": "sParTrackIndex", + "8033c7e0": "sParTrackPath", + "8033c7e8": "sParTrackTransOff", + "8033c808": "sCameraStoreCUp", + "8033c828": "sCameraStoreCutscene", + "8033c848": "gCameraMovementFlags", + "8033c84a": "sStatusFlags", + "8033c850": "sCurCreditsSplinePos", + "8033c950": "sCurCreditsSplineFocus", + "8033ca50": "sCutsceneSplineSegment", + "8033ca54": "sCutsceneSplineSegmentProgress", + "8033ca58": "unused8033B6E8", + "8033ca5a": "sCutsceneShot", + "8033ca5c": "gCutsceneTimer", + "8033ca60": "sCutsceneVars", + "8033cbc8": "gObjCutsceneDone", + "8033cbcc": "gCutsceneObjSpawn", + "8033cbd0": "gCamera", + "8033cbe0": "gObjectListArray", + "8033d260": "gDebugInfoFlags", + "8033d264": "gNumFindFloorMisses", + "8033d268": "unused_8033BEF8", + "8033d26c": "gUnknownWallCount", + "8033d270": "gObjectCounter", + "8033d274": "gNumCalls", + "8033d280": "gDebugInfo", + "8033d380": "gDebugInfoOverwrite", + "8033d480": "gTimeStopState", + "8033d488": "gObjectPool", + "80360e88": "gMacroObjectDefaultParent", + "803610e8": "gObjectLists", + "803610f0": "gFreeObjectList", + "80361158": "gMarioObject", + "8036115c": "gLuigiObject", + "80361160": "gCurrentObject", + "80361164": "gBehCommand", + "80361168": "gPrevFrameObjectCount", + "8036116c": "gSurfaceNodesAllocated", + "80361170": "gSurfacesAllocated", + "80361174": "gNumStaticSurfaceNodes", + "80361178": "gNumStaticSurfaces", + "8036117c": "gObjectMemoryPool", + "80361180": "gCheckingSurfaceCollisionsForCamera", + "80361182": "gFindFloorIncludeSurfaceIntangible", + "80361184": "gEnvironmentRegions", + "80361188": "gEnvironmentLevels", + "803611d8": "gDoorAdjacentRooms", + "80361250": "gMarioCurrentRoom", + "80361252": "D_8035FEE2", + "80361254": "D_8035FEE4", + "80361256": "gTHIWaterDrained", + "80361258": "gTTCSpeedSetting", + "8036125a": "gMarioShotFromCannon", + "8036125c": "gCCMEnteredSlide", + "8036125e": "gNumRoomedObjectsInMarioRoom", + "80361260": "gNumRoomedObjectsNotInMarioRoom", + "80361262": "gWDWWaterLevelChanging", + "80361264": "gMarioOnMerryGoRound", + "80361270": "sGrabReleaseState", + "80361280": "D_8035FF10", + "80361290": "gDebugPrintState1", + "803612a0": "gDebugPrintState2", + "803612b0": "sMarioOnFlyingCarpet", + "803612b2": "sSurfaceTypeBelowShadow", + "803612b4": "gShadowAboveWaterOrLava", + "803612b5": "gMarioOnIceOrCarpet", + "803612c0": "sSkyBoxInfo", + "803612e0": "gMovetexLastTextureId", + "803612f0": "gFlyingCarpetState", + "80361300": "gPaintingMarioFloorType", + "80361304": "gPaintingMarioXPos", + "80361308": "gPaintingMarioYPos", + "8036130c": "gPaintingMarioZPos", + "80361310": "gPaintingMesh", + "80361314": "gPaintingTriNorms", + "80361318": "gRipplingPainting", + "8036131c": "gDddPaintingStatus", + "80361320": "sTextLabels", + "803613f0": "gDialogColorFadeTimer", + "803613f2": "gLastDialogLineNum", + "803613f4": "gDialogVariable", + "803613f8": "gDialogTextAlpha", + "803613fa": "gCutsceneMsgXOffset", + "803613fc": "gCutsceneMsgYOffset", + "803613fe": "gRedCoinsCollected", + "80361400": "gEnvFxBuffer", + "80361408": "gSnowCylinderLastPos", + "80361414": "gSnowParticleCount", + "80361416": "gSnowParticleMaxCount", + "80361420": "gEnvFxBubbleConfig", + "80361460": "sNumActiveFirePiranhaPlants", + "80361464": "sNumKilledFirePiranhaPlants", + "80361468": "sObjSavedPosX", + "8036146c": "sObjSavedPosY", + "80361470": "sObjSavedPosZ", + "80361474": "sMontyMoleHoleList", + "80361478": "sMontyMoleKillStreak", + "8036147c": "sMontyMoleLastKilledPosX", + "80361480": "sMontyMoleLastKilledPosY", + "80361484": "sMontyMoleLastKilledPosZ", + "80361488": "sMasterTreadmill", + "80361490": "gCurrAiBuffer", + "80361498": "sSoundRequests", + "80361c98": "D_80360928", + "80361f98": "sUsedChannelsForSoundBank", + "80361fa8": "sCurrentSound", + "80361fb8": "gSoundBanks", + "80364b78": "D_80363808", + "80364b82": "D_80363812", + "80364b88": "sBackgroundMusicQueue", + "80364ba0": "D_80363830", + "80364c20": "D_803638B0", + "80365e70": "piMgrThread", + "80366020": "piMgrStack", + "80367020": "__osPiMesgQueue", + "80367038": "piMgrMesgBuff", + "80367040": "D_80365CD0", + "80367050": "D_80365CE0", + "8036708c": "D_80365D1C", + "80367090": "D_80365D20", + "80367091": "_osCont_numControllers", + "80367098": "D_80365D28", + "803670b8": "_osContMesgQueue", + "803670d0": "_osContMesgBuff", + "803670f0": "D_80365D80", + "80367110": "_osCurrentTime", + "80367118": "D_80365DA8", + "8036711c": "__osViIntrCount", + "80367120": "D_80365DB0", + "80367130": "osPiMesgBuff", + "80367138": "gOsPiMessageQueue", + "80367150": "osSiMesgBuff", + "80367158": "gOsSiMessageQueue", + "80367170": "D_80365E00", + "803671ac": "D_80365E3C", + "803671b0": "D_80365E40", + "803672b0": "gInterruptedThread", + "80367460": "_mainSegmentNoloadEnd", + "0000cee0": "_mainSegmentNoloadSizeLo", + "00000002": "_mainSegmentNoloadSizeHi", + "00000001": "ASSERT", + "80378800": "_engineSegmentStart", + "007cc6c0": "_engineSegmentRomStart", + "80378800": "vec3f_copy", + "80378840": "vec3f_set", + "8037888c": "vec3f_add", + "803788e4": "vec3f_sum", + "8037893c": "vec3s_copy", + "8037897c": "vec3s_set", + "803789c8": "vec3s_add", + "80378a20": "vec3s_sum", + "80378a78": "vec3s_sub", + "80378ad0": "vec3s_to_vec3f", + "80378b34": "vec3f_to_vec3s", + "80378c50": "find_vector_perpendicular_to_plane", + "80378d38": "vec3f_cross", + "80378dc0": "vec3f_normalize", + "80378e68": "mtxf_copy", + "80378eb4": "mtxf_identity", + "80378f24": "mtxf_translate", + "80378f84": "mtxf_lookat", + "80379440": "mtxf_rotate_zxy_and_translate", + "803795f0": "mtxf_rotate_xyz_and_translate", + "80379798": "mtxf_billboard", + "80379918": "mtxf_align_terrain_normal", + "80379aa4": "mtxf_align_terrain_triangle", + "80379f60": "mtxf_mul", + "8037a29c": "mtxf_scale_vec3f", + "8037a348": "mtxf_mul_vec3s", + "8037a434": "mtxf_to_mtx", + "8037a4b8": "mtxf_rotate_xy", + "8037a550": "get_pos_from_transform_mtx", + "8037a69c": "vec3f_get_dist_and_angle", + "8037a788": "vec3f_set_dist_and_angle", + "8037a860": "approach_s32", + "8037a8b4": "approach_f32", + "8037a9a8": "atan2s", + "8037ab88": "atan2f", + "8037abec": "spline_get_weights", + "8037afb8": "anim_spline_init", + "8037afe8": "anim_spline_poll", + "8037b220": "init_scene_graph_node_links", + "8037b24c": "init_graph_node_root", + "8037b30c": "init_graph_node_ortho_projection", + "8037b380": "init_graph_node_perspective", + "8037b448": "init_graph_node_start", + "8037b4ac": "init_graph_node_master_list", + "8037b530": "init_graph_node_render_range", + "8037b5b4": "init_graph_node_switch_case", + "8037b670": "init_graph_node_camera", + "8037b744": "init_graph_node_translation_rotation", + "8037b7f8": "init_graph_node_translation", + "8037b89c": "init_graph_node_rotation", + "8037b940": "init_graph_node_scale", + "8037b9e0": "init_graph_node_object", + "8037bad4": "init_graph_node_culling_radius", + "8037bb48": "init_graph_node_animated_part", + "8037bbec": "init_graph_node_billboard", + "8037bc90": "init_graph_node_display_list", + "8037bd24": "init_graph_node_shadow", + "8037bdb4": "init_graph_node_object_parent", + "8037be28": "init_graph_node_generated", + "8037becc": "init_graph_node_background", + "8037bf84": "init_graph_node_held_object", + "8037c044": "geo_add_child", + "8037c0bc": "geo_remove_child", + "8037c138": "geo_make_first_child", + "8037c1e4": "geo_call_global_function_nodes_helper", + "8037c360": "geo_call_global_function_nodes", + "8037c3d0": "geo_reset_object_node", + "8037c448": "geo_obj_init", + "8037c51c": "geo_obj_init_spawninfo", + "8037c658": "geo_obj_init_animation", + "8037c708": "geo_obj_init_animation_accel", + "8037c7d8": "retrieve_animation_index", + "8037c844": "geo_update_animation_frame", + "8037c9e8": "geo_retreive_animation_translation", + "8037cb10": "geo_find_root", + "8037cb60": "read_vec3s_to_vec3f", + "8037cbc0": "read_vec3s", + "8037cbfc": "read_vec3s_angle", + "8037cc74": "register_scene_graph_node", + "8037cd60": "geo_layout_cmd_branch_and_link", + "8037ce24": "geo_layout_cmd_end", + "8037cee8": "geo_layout_cmd_branch", + "8037cf70": "geo_layout_cmd_return", + "8037cfc0": "geo_layout_cmd_open_node", + "8037d018": "geo_layout_cmd_close_node", + "8037d050": "geo_layout_cmd_assign_as_view", + "8037d0d0": "geo_layout_cmd_update_node_flags", + "8037d1d0": "geo_layout_cmd_node_root", + "8037d328": "geo_layout_cmd_node_ortho_projection", + "8037d3a4": "geo_layout_cmd_node_perspective", + "8037d48c": "geo_layout_cmd_node_start", + "8037d4dc": "geo_layout_cmd_nop3", + "8037d500": "geo_layout_cmd_node_master_list", + "8037d55c": "geo_layout_cmd_node_level_of_detail", + "8037d5d4": "geo_layout_cmd_node_switch_case", + "8037d640": "geo_layout_cmd_node_camera", + "8037d6f0": "geo_layout_cmd_node_translation_rotation", + "8037d8d4": "geo_layout_cmd_node_translation", + "8037d998": "geo_layout_cmd_node_rotation", + "8037da5c": "geo_layout_cmd_node_scale", + "8037db50": "geo_layout_cmd_nop2", + "8037db74": "geo_layout_cmd_node_animated_part", + "8037dc10": "geo_layout_cmd_node_billboard", + "8037dcd4": "geo_layout_cmd_node_display_list", + "8037dd4c": "geo_layout_cmd_node_shadow", + "8037dddc": "geo_layout_cmd_node_object_parent", + "8037de34": "geo_layout_cmd_node_generated", + "8037de94": "geo_layout_cmd_node_background", + "8037def8": "geo_layout_cmd_nop", + "8037df1c": "geo_layout_cmd_copy_view", + "8037dfd4": "geo_layout_cmd_node_held_obj", + "8037e058": "geo_layout_cmd_node_culling_radius", + "8037e0b4": "process_geo_layout", + "803805c8": "level_script_execute", + "80380de8": "f32_find_wall_collision", + "80380e8c": "find_wall_collisions", + "80381264": "find_ceil", + "80381470": "unused_obj_find_floor_height", + "803814b8": "find_floor_height_and_data", + "80381794": "find_floor_height", + "803817e0": "unused_find_dynamic_floor", + "80381900": "find_floor", + "80381ba0": "find_water_level", + "80381d3c": "find_poison_gas_level", + "80381f08": "debug_surface_list_info", + "80382294": "unused_resolve_floor_or_ceil_collisions", + "80383340": "alloc_surface_pools", + "803833b8": "load_area_terrain", + "803835a4": "clear_dynamic_surfaces", + "80383614": "transform_object_vertices", + "80383828": "load_object_surfaces", + "803839cc": "load_object_collision_model", + "80383bb0": "RandomU16", + "80383cb4": "RandomFloat", + "80383d1c": "RandomSign", + "80383d68": "func_80383D68", + "80385bf0": "stub_80385BF0", + "80385c00": "cur_object_exec_behavior", + "80385f90": "identityMtx", + "80385fb0": "zeroMtx", + "80385fd0": "gVec3fZero", + "80385fdc": "gVec3sZero", + "80385fe4": "gVec3fOne", + "80385ff0": "gVec3sOne", + "80386000": "gSineTable", + "80387000": "gCosineTable", + "8038b000": "gArctanTable", + "8038b810": "GeoLayoutJumpTable", + "8038b894": "unused_8038B894", + "8038bc90": "_engineSegmentEnd", + "007dfb50": "_engineSegmentRomEnd", + "8038bc90": "_engineSegmentNoloadStart", + "8038bc90": "gSplineKeyframe", + "8038bc94": "gSplineKeyframeFraction", + "8038bc98": "gSplineState", + "8038bca0": "gGraphNodePool", + "8038bca4": "gCurRootGraphNode", + "8038bca8": "D_8038BCA8", + "8038bcac": "gGeoViews", + "8038bcb0": "gGeoNumViews", + "8038bcb8": "gGeoLayoutStack", + "8038bcf8": "gCurGraphNodeList", + "8038bd78": "gCurGraphNodeIndex", + "8038bd7a": "gGeoLayoutStackIndex", + "8038bd7c": "D_8038BD7C", + "8038bd7e": "gGeoLayoutReturnIndex", + "8038bd80": "gGeoLayoutCommand", + "8038bd88": "gObjParentGraphNode", + "8038be30": "sFloorGeo", + "8038be90": "unused8038BE90", + "8038be98": "gStaticSurfacePartition", + "8038d698": "gDynamicSurfacePartition", + "8038ee98": "sSurfaceNodePool", + "8038ee9c": "sSurfacePool", + "8038eea0": "sSurfacePoolSize", + "8038eea8": "unused8038EEA8", + "8038eef0": "_engineSegmentNoloadEnd", + "8038f800": ".", + "8038f800": "_framebuffersSegmentNoloadStart", + "8038f800": "0x70800", + "8038f800": "gFrameBuffer0", + "803b5000": "gFrameBuffer1", + "803da800": "gFrameBuffer2", + "80400000": "_framebuffersSegmentNoloadEnd", + "80400000": "__expansionRamStart", + "00000001": "ASSERT", + "10000000": "_entrySegmentStart", + "007cc6c0": "_entrySegmentRomStart", + "10000000": "level_script_entry", + "10000030": "_entrySegmentEnd", + "007cc6f0": "_entrySegmentRomEnd", + "02000000": "_segment2_mio0SegmentStart", + "007cc6c0": "_segment2_mio0SegmentRomStart", + "0200bd10": ".", + "0200bd10": "_segment2_mio0SegmentEnd", + "007d83d0": "_segment2_mio0SegmentRomEnd", + "04000000": "_group0_mio0SegmentStart", + "007cc6c0": "_group0_mio0SegmentRomStart", + "04013260": ".", + "04013260": "_group0_mio0SegmentEnd", + "007df920": "_group0_mio0SegmentRomEnd", + "17000000": "_group0_geoSegmentStart", + "007cc6c0": "_group0_geoSegmentRomStart", + "17000000": "bubble_geo", + "1700001c": "purple_marble_geo", + "17000038": "smoke_geo", + "17000084": "burn_smoke_geo", + "1700009c": "small_water_splash_geo", + "170000e0": "mario_TODO_geo_0000E0", + "17000124": "idle_water_wave_geo", + "17000168": "wave_trail_geo", + "170001bc": "sparkles_geo", + "17000230": "water_splash_geo", + "17000284": "sparkles_animation_geo", + "170002e0": "mario_geo_face_and_wings", + "1700041c": "mario_geo_left_hand", + "17000494": "mario_geo_right_hand", + "1700053c": "mario_geo_body", + "170006f8": "mario_geo_medium_poly_left_hand", + "17000770": "mario_geo_medium_poly_right_hand", + "17000818": "mario_geo_medium_poly_body", + "170009d4": "mario_geo_low_poly_face_and_wings", + "17000b10": "mario_geo_low_poly_left_hand", + "17000b88": "mario_geo_low_poly_right_hand", + "17000c30": "mario_geo_low_poly_body", + "17000dec": "mario_vanish_geo_face_and_wings", + "17000f28": "mario_vanish_geo_left_hand", + "17000fa0": "mario_vanish_geo_right_hand", + "17001048": "mario_vanish_geo_body", + "17001204": "mario_vanish_geo_medium_poly_left_hand", + "1700127c": "mario_vanish_geo_medium_poly_right_hand", + "17001324": "mario_vanish_geo_medium_poly_body", + "170014e0": "mario_vanish_geo_low_poly_face_and_wings", + "1700161c": "mario_vanish_geo_low_poly_left_hand", + "17001694": "mario_vanish_geo_low_poly_right_hand", + "1700173c": "mario_vanish_geo_low_poly_body", + "170018f8": "mario_metal_geo_face_and_wings", + "170019a4": "mario_metal_geo_left_hand", + "17001a1c": "mario_metal_geo_right_hand", + "17001ac4": "mario_metal_geo_body", + "17001c80": "mario_metal_geo_medium_poly_left_hand", + "17001cf8": "mario_metal_geo_medium_poly_right_hand", + "17001da0": "mario_metal_geo_medium_poly_body", + "17001f5c": "mario_metal_geo_low_poly_face_and_wings", + "17002008": "mario_metal_geo_low_poly_left_hand", + "17002080": "mario_metal_geo_low_poly_right_hand", + "17002128": "mario_metal_geo_low_poly_body", + "170022e4": "mario_metal_vanish_geo_face_and_wings", + "17002390": "mario_metal_vanish_geo_left_hand", + "17002408": "mario_metal_vanish_geo_right_hand", + "170024b0": "mario_metal_vanish_geo_body", + "1700266c": "mario_metal_vanish_geo_medium_poly_left_hand", + "170026e4": "mario_metal_vanish_geo_medium_poly_right_hand", + "1700278c": "mario_metal_vanish_geo_medium_poly_body", + "17002958": "mario_metal_vanish_geo_low_poly_face_and_wings", + "17002a04": "mario_metal_vanish_geo_low_poly_left_hand", + "17002a7c": "mario_metal_vanish_geo_low_poly_right_hand", + "17002b24": "mario_metal_vanish_geo_low_poly_body", + "17002ce0": "mario_geo_load_body", + "17002d14": "mario_geo_load_medium_poly_body", + "17002d48": "mario_geo_load_low_poly_body", + "17002d7c": "mario_geo_render_body", + "17002dd4": "mario_geo", + "17002e30": "_group0_geoSegmentEnd", + "007cf4f0": "_group0_geoSegmentRomEnd", + "05000000": "_group1_mio0SegmentStart", + "007cc6c0": "_group1_mio0SegmentRomStart", + "05008070": ".", + "05008070": "_group1_mio0SegmentEnd", + "007d4730": "_group1_mio0SegmentRomEnd", + "0c000000": "_group1_geoSegmentStart", + "007cc6c0": "_group1_geoSegmentRomStart", + "0c000000": "yellow_sphere_geo", + "0c000018": "hoot_geo", + "0c0001e4": "yoshi_egg_geo", + "0c000248": "thwomp_geo", + "0c000264": "bullet_bill_geo", + "0c00028c": "heave_ho_geo", + "0c000410": "_group1_geoSegmentEnd", + "007ccad0": "_group1_geoSegmentRomEnd", + "05000000": "_group2_mio0SegmentStart", + "007cc6c0": "_group2_mio0SegmentRomStart", + "05001e10": ".", + "05001e10": "_group2_mio0SegmentEnd", + "007ce4d0": "_group2_mio0SegmentRomEnd", + "0c000000": "_group2_geoSegmentStart", + "007cc6c0": "_group2_geoSegmentRomStart", + "0c000000": "bully_geo", + "0c000120": "bully_boss_geo", + "0c000240": "blargg_geo", + "0c0002b0": "_group2_geoSegmentEnd", + "007cc970": "_group2_geoSegmentRomEnd", + "05000000": "_group3_mio0SegmentStart", + "007cc6c0": "_group3_mio0SegmentRomStart", + "050068b0": ".", + "050068b0": "_group3_mio0SegmentEnd", + "007d2f70": "_group3_mio0SegmentRomEnd", + "0c000000": "_group3_geoSegmentStart", + "007cc6c0": "_group3_geoSegmentRomStart", + "0c000000": "king_bobomb_geo", + "0c000308": "water_bomb_geo", + "0c000328": "water_bomb_shadow_geo", + "0c000340": "_group3_geoSegmentEnd", + "007cca00": "_group3_geoSegmentRomEnd", + "05000000": "_group4_mio0SegmentStart", + "007cc6c0": "_group4_mio0SegmentRomStart", + "0500a300": ".", + "0500a300": "_group4_mio0SegmentEnd", + "007d69c0": "_group4_mio0SegmentRomEnd", + "0c000000": "_group4_geoSegmentStart", + "007cc6c0": "_group4_geoSegmentRomStart", + "0c000000": "clam_shell_geo", + "0c000068": "sushi_geo", + "0c00010c": "unagi_geo", + "0c000280": "_group4_geoSegmentEnd", + "007cc940": "_group4_geoSegmentRomEnd", + "05000000": "_group5_mio0SegmentStart", + "007cc6c0": "_group5_mio0SegmentRomStart", + "0500bce0": ".", + "0500bce0": "_group5_mio0SegmentEnd", + "007d83a0": "_group5_mio0SegmentRomEnd", + "0c000000": "_group5_geoSegmentStart", + "007cc6c0": "_group5_geoSegmentRomStart", + "0c000000": "klepto_geo", + "0c0002ac": "eyerok_geo_0002AC", + "0c0005a8": "eyerok_left_hand_geo", + "0c0005e4": "eyerok_right_hand_geo", + "0c000610": "pokey_head_geo", + "0c000644": "pokey_body_part_geo", + "0c000660": "_group5_geoSegmentEnd", + "007ccd20": "_group5_geoSegmentRomEnd", + "05000000": "_group6_mio0SegmentStart", + "007cc6c0": "_group6_mio0SegmentRomStart", + "0500e110": ".", + "0500e110": "_group6_mio0SegmentEnd", + "007da7d0": "_group6_mio0SegmentRomEnd", + "0c000000": "_group6_geoSegmentStart", + "007cc6c0": "_group6_geoSegmentRomStart", + "0c000000": "monty_mole_geo", + "0c000110": "ukiki_geo", + "0c00036c": "fwoosh_geo", + "0c000390": "_group6_geoSegmentEnd", + "007cca50": "_group6_geoSegmentRomEnd", + "05000000": "_group7_mio0SegmentStart", + "007cc6c0": "_group7_mio0SegmentRomStart", + "05005070": ".", + "05005070": "_group7_mio0SegmentEnd", + "007d1730": "_group7_mio0SegmentRomEnd", + "0c000000": "_group7_geoSegmentStart", + "007cc6c0": "_group7_geoSegmentRomStart", + "0c000000": "spindrift_geo", + "0c000104": "penguin_geo", + "0c00021c": "mr_blizzard_hidden_geo", + "0c000348": "mr_blizzard_geo", + "0c000370": "_group7_geoSegmentEnd", + "007cca30": "_group7_geoSegmentRomEnd", + "05000000": "_group8_mio0SegmentStart", + "007cc6c0": "_group8_mio0SegmentRomStart", + "05001180": ".", + "05001180": "_group8_mio0SegmentEnd", + "007cd840": "_group8_mio0SegmentRomEnd", + "0c000000": "_group8_geoSegmentStart", + "007cc6c0": "_group8_geoSegmentRomStart", + "0c000000": "springboard_top_geo", + "0c000018": "springboard_spring_geo", + "0c000030": "springboard_bottom_geo", + "0c000048": "cap_switch_geo", + "0c000090": "_group8_geoSegmentEnd", + "007cc750": "_group8_geoSegmentRomEnd", + "05000000": "_group9_mio0SegmentStart", + "007cc6c0": "_group9_mio0SegmentRomStart", + "05006960": ".", + "05006960": "_group9_mio0SegmentEnd", + "007d3020": "_group9_mio0SegmentRomEnd", + "0c000000": "_group9_geoSegmentStart", + "007cc6c0": "_group9_geoSegmentRomStart", + "0c000000": "bookend_part_geo", + "0c0000c0": "bookend_geo", + "0c0000d8": "haunted_chair_geo", + "0c000188": "small_key_geo", + "0c0001b4": "mad_piano_geo", + "0c000224": "boo_geo", + "0c000274": "haunted_cage_geo", + "0c0002b0": "_group9_geoSegmentEnd", + "007cc970": "_group9_geoSegmentRomEnd", + "05000000": "_group10_mio0SegmentStart", + "007cc6c0": "_group10_mio0SegmentRomStart", + "05012cd0": ".", + "05012cd0": "_group10_mio0SegmentEnd", + "007df390": "_group10_mio0SegmentRomEnd", + "0c000000": "_group10_geoSegmentStart", + "007cc6c0": "_group10_geoSegmentRomStart", + "0c000000": "birds_geo", + "0c000098": "peach_geo_000098", + "0c000254": "peach_geo_000254", + "0c000410": "peach_geo", + "0c000468": "yoshi_geo", + "0c000670": "_group10_geoSegmentEnd", + "007ccd30": "_group10_geoSegmentRomEnd", + "05000000": "_group11_mio0SegmentStart", + "007cc6c0": "_group11_mio0SegmentRomStart", + "050073f0": ".", + "050073f0": "_group11_mio0SegmentEnd", + "007d3ab0": "_group11_mio0SegmentRomEnd", + "0c000000": "_group11_geoSegmentStart", + "007cc6c0": "_group11_geoSegmentRomStart", + "0c000000": "bubba_geo", + "0c000030": "wiggler_head_geo", + "0c0001bc": "enemy_lakitu_geo", + "0c000290": "spiny_ball_geo", + "0c000328": "spiny_geo", + "0c0004a0": "_group11_geoSegmentEnd", + "007ccb60": "_group11_geoSegmentRomEnd", + "06000000": "_group12_mio0SegmentStart", + "007cc6c0": "_group12_mio0SegmentRomStart", + "06030c30": ".", + "06030c30": "_group12_mio0SegmentEnd", + "007fd2f0": "_group12_mio0SegmentRomEnd", + "0d000000": "_group12_geoSegmentStart", + "007cc6c0": "_group12_geoSegmentRomStart", + "0d000000": "bowser_flames_geo", + "0d000090": "invisible_bowser_accessory_geo", + "0d0000b0": "bowser_1_yellow_sphere_geo", + "0d0000d8": "bowser_geo_0000D8", + "0d000424": "bowser_geo_000424", + "0d000770": "bowser_geo_000770", + "0d000ab8": "bowser_shadow_geo", + "0d000ac4": "bowser_geo", + "0d000b40": "bowser2_geo", + "0d000bbc": "bowser_bomb_geo", + "0d000bfc": "bowser_impact_smoke_geo", + "0d000c50": "_group12_geoSegmentEnd", + "007cd310": "_group12_geoSegmentRomEnd", + "06000000": "_group13_mio0SegmentStart", + "007cc6c0": "_group13_mio0SegmentRomStart", + "0600a0f0": ".", + "0600a0f0": "_group13_mio0SegmentEnd", + "007d67b0": "_group13_mio0SegmentRomEnd", + "0d000000": "_group13_geoSegmentStart", + "007cc6c0": "_group13_geoSegmentRomStart", + "0d000000": "skeeter_geo", + "0d000284": "seaweed_geo", + "0d0002f4": "water_mine_geo", + "0d000324": "cyan_fish_geo", + "0d00038c": "bub_geo", + "0d000414": "water_ring_geo", + "0d000450": "treasure_chest_base_geo", + "0d000468": "treasure_chest_lid_geo", + "0d000480": "_group13_geoSegmentEnd", + "007ccb40": "_group13_geoSegmentRomEnd", + "06000000": "_group14_mio0SegmentStart", + "007cc6c0": "_group14_mio0SegmentRomStart", + "06013a60": ".", + "06013a60": "_group14_mio0SegmentEnd", + "007e0120": "_group14_mio0SegmentRomEnd", + "0d000000": "_group14_geoSegmentStart", + "007cc6c0": "_group14_geoSegmentRomStart", + "0d000000": "koopa_flag_geo", + "0d0000b8": "wooden_post_geo", + "0d0000d0": "koopa_without_shell_geo", + "0d000214": "koopa_with_shell_geo", + "0d000358": "piranha_plant_geo", + "0d000480": "whomp_geo", + "0d0005d0": "metallic_ball_geo", + "0d0005ec": "chain_chomp_geo", + "0d000680": "_group14_geoSegmentEnd", + "007ccd40": "_group14_geoSegmentRomEnd", + "06000000": "_group15_mio0SegmentStart", + "007cc6c0": "_group15_mio0SegmentRomStart", + "0600c8e0": ".", + "0600c8e0": "_group15_mio0SegmentEnd", + "007d8fa0": "_group15_mio0SegmentRomEnd", + "0d000000": "_group15_geoSegmentStart", + "007cc6c0": "_group15_geoSegmentRomStart", + "0d000000": "lakitu_geo", + "0d000114": "toad_geo_000114", + "0d00027c": "toad_geo_00027C", + "0d0003e4": "toad_geo", + "0d000448": "mips_geo", + "0d0005b0": "boo_castle_geo", + "0d000600": "_group15_geoSegmentEnd", + "007cccc0": "_group15_geoSegmentRomEnd", + "06000000": "_group16_mio0SegmentStart", + "007cc6c0": "_group16_mio0SegmentRomStart", + "06002ba0": ".", + "06002ba0": "_group16_mio0SegmentEnd", + "007cf260": "_group16_mio0SegmentRomEnd", + "0d000000": "_group16_geoSegmentStart", + "007cc6c0": "_group16_geoSegmentRomStart", + "0d000000": "moneybag_geo_000000", + "0d000078": "moneybag_geo_000078", + "0d0000f0": "moneybag_geo", + "0d000150": "_group16_geoSegmentEnd", + "007cc810": "_group16_geoSegmentRomEnd", + "06000000": "_group17_mio0SegmentStart", + "007cc6c0": "_group17_mio0SegmentRomStart", + "06009c50": ".", + "06009c50": "_group17_mio0SegmentEnd", + "007d6310": "_group17_mio0SegmentRomEnd", + "0d000000": "_group17_geoSegmentStart", + "007cc6c0": "_group17_geoSegmentRomStart", + "0d000000": "mr_i_geo", + "0d00001c": "mr_i_iris_geo", + "0d0000dc": "swoop_geo", + "0d0001a0": "snufit_geo", + "0d000230": "dorrie_geo", + "0d000394": "scuttlebug_geo", + "0d0006d0": "_group17_geoSegmentEnd", + "007ccd90": "_group17_geoSegmentRomEnd", + "08000000": "_common0_mio0SegmentStart", + "007cc6c0": "_common0_mio0SegmentRomStart", + "0800e6d0": ".", + "0800e6d0": "_common0_mio0SegmentEnd", + "007dad90": "_common0_mio0SegmentRomEnd", + "0f000000": "_common0_geoSegmentStart", + "007cc6c0": "_common0_geoSegmentRomStart", + "0f000000": "blue_coin_switch_geo", + "0f000020": "test_platform_geo", + "0f000028": "amp_geo", + "0f0001a8": "cannon_base_geo", + "0f0001c0": "cannon_barrel_geo", + "0f0001d8": "chuckya_geo", + "0f0004cc": "purple_switch_geo", + "0f0004e4": "checkerboard_platform_geo", + "0f0004fc": "heart_geo", + "0f000518": "flyguy_geo", + "0f0005d0": "breakable_box_geo", + "0f000610": "breakable_box_small_geo", + "0f000640": "bowling_ball_geo", + "0f00066c": "bowling_ball_track_geo", + "0f000694": "exclamation_box_geo", + "0f0006e4": "goomba_geo", + "0f0007b8": "black_bobomb_geo", + "0f0008f4": "bobomb_buddy_geo", + "0f000a30": "metal_box_geo", + "0f000a58": "exclamation_box_outline_geo", + "0f000ab0": "koopa_shell_geo", + "0f000adc": "koopa_shell2_geo", + "0f000b08": "koopa_shell3_geo", + "0f000b40": "_common0_geoSegmentEnd", + "007cd200": "_common0_geoSegmentRomEnd", + "03000000": "_common1_mio0SegmentStart", + "007cc6c0": "_common1_mio0SegmentRomStart", + "03017990": ".", + "03017990": "_common1_mio0SegmentEnd", + "007e4050": "_common1_mio0SegmentRomEnd", + "16000000": "_common1_geoSegmentStart", + "007cc6c0": "_common1_geoSegmentRomStart", + "16000000": "mist_geo", + "16000020": "white_puff_geo", + "16000040": "explosion_geo", + "160000a8": "butterfly_geo", + "1600013c": "yellow_coin_geo", + "160001a0": "yellow_coin_no_shadow_geo", + "16000200": "blue_coin_geo", + "16000264": "blue_coin_no_shadow_geo", + "160002c4": "red_coin_geo", + "16000328": "red_coin_no_shadow_geo", + "16000388": "warp_pipe_geo", + "160003a8": "castle_door_geo", + "1600043c": "cabin_door_geo", + "160004d0": "wooden_door_geo", + "16000564": "wooden_door2_geo", + "160005f8": "metal_door_geo", + "1600068c": "hazy_maze_door_geo", + "16000720": "haunted_door_geo", + "160007b4": "castle_door_0_star_geo", + "16000868": "castle_door_1_star_geo", + "1600091c": "castle_door_3_stars_geo", + "160009d0": "key_door_geo", + "16000a84": "bowser_key_geo", + "16000ab0": "bowser_key_cutscene_geo", + "16000b10": "red_flame_shadow_geo", + "16000b2c": "red_flame_geo", + "16000b8c": "blue_flame_geo", + "16000bec": "fish_shadow_geo", + "16000c44": "fish_geo", + "16000c8c": "leaves_geo", + "16000ca4": "marios_cap_geo", + "16000cf0": "marios_metal_cap_geo", + "16000d3c": "marios_wing_cap_geo", + "16000da8": "marios_winged_metal_cap_geo", + "16000e14": "number_geo", + "16000e84": "mushroom_1up_geo", + "16000ea0": "star_geo", + "16000ed4": "dirt_animation_geo", + "16000f24": "cartoon_star_geo", + "16000f6c": "transparent_star_geo", + "16000f98": "white_particle_geo", + "16000fb4": "wooden_signpost_geo", + "16000fe8": "bubbly_tree_geo", + "16001000": "spiky_tree_geo", + "16001018": "snow_tree_geo", + "16001030": "spiky_tree1_geo", + "16001048": "palm_tree_geo", + "16001060": "_common1_geoSegmentEnd", + "007cd720": "_common1_geoSegmentRomEnd", + "13000000": "_behaviorSegmentStart", + "007cc6c0": "_behaviorSegmentRomStart", + "13000000": "bhvStarDoor", + "13000054": "bhvMrI", + "1300008c": "bhvMrIBody", + "130000ac": "bhvMrIParticle", + "130000f8": "bhvPurpleParticle", + "13000118": "bhvGiantPole", + "13000144": "bhvPoleGrabbing", + "13000174": "bhvThiHugeIslandTop", + "13000194": "bhvThiTinyIslandTop", + "130001ac": "bhvCapSwitchBase", + "130001cc": "bhvCapSwitch", + "130001f4": "bhvKingBobomb", + "13000254": "bhvBobombAnchorMario", + "13000278": "bhvBetaChestBottom", + "1300029c": "bhvBetaChestLid", + "130002b8": "bhvBubbleMario", + "130002e4": "bhvBubbleMaybe", + "13000338": "bhvSmallWaterWave", + "13000398": "bhvSmallWaterWave398", + "130003bc": "bhvWaterAirBubble", + "13000400": "bhvSmallParticle", + "13000428": "bhvWaterWaves", + "13000444": "bhvSmallParticleSnow", + "1300046c": "bhvSmallParticleBubbles", + "13000494": "bhvFishGroup", + "130004a8": "bhvCannon", + "130004e4": "bhvCannonBarrel", + "13000500": "bhvCannonBaseUnused", + "13000528": "bhvChuckya", + "13000584": "bhvChuckyaAnchorMario", + "130005a8": "bhvUnused05A8", + "130005b4": "bhvRotatingPlatform", + "130005d8": "bhvTower", + "13000600": "bhvBulletBillCannon", + "13000624": "bhvWfBreakableWallRight", + "13000638": "bhvWfBreakableWallLeft", + "1300066c": "bhvKickableBoard", + "130006a4": "bhvTowerDoor", + "130006d8": "bhvRotatingCounterClockwise", + "130006e0": "bhvWfRotatingWoodenPlatform", + "13000708": "bhvKoopaShellUnderwater", + "13000720": "bhvExitPodiumWarp", + "1300075c": "bhvFadingWarp", + "13000780": "bhvWarp", + "130007a0": "bhvWarpPipe", + "130007dc": "bhvWhitePuffExplosion", + "130007f8": "bhvSpawnedStar", + "1300080c": "bhvSpawnedStarNoLevelExit", + "13000830": "bhvMrIBlueCoin", + "13000888": "bhvCoinInsideBoo", + "130008d0": "bhvCoinFormationSpawn", + "130008ec": "bhvCoinFormation", + "1300090c": "bhvOneCoin", + "1300091c": "bhvYellowCoin", + "13000940": "bhvTemporaryYellowCoin", + "13000964": "bhvThreeCoinsSpawn", + "13000984": "bhvTenCoinsSpawn", + "130009a4": "bhvSingleCoinGetsSpawned", + "130009e0": "bhvCoinSparkles", + "13000a14": "bhvGoldenCoinSparkles", + "13000a34": "bhvWallTinyStarParticle", + "13000a54": "bhvWallTinyStarParticleSpawn", + "13000a78": "bhvPoundTinyStarParticle", + "13000a98": "bhvPoundTinyStarParticleSpawn", + "13000abc": "bhvPunchTinyTriangle", + "13000ad8": "bhvPunchTinyTriangleSpawn", + "13000afc": "bhvDoorWarp", + "13000b0c": "bhvDoor", + "13000b58": "bhvGrindel", + "13000b8c": "bhvThwomp2", + "13000bc8": "bhvThwomp", + "13000c04": "bhvTumblingBridgePlatform", + "13000c28": "bhvWfTumblingBridge", + "13000c44": "bhvBbhTumblingBridge", + "13000c64": "bhvLllTumblingBridge", + "13000c84": "bhvFlame", + "13000cc8": "bhvAnotherElavator", + "13000cfc": "bhvRrElevatorPlatform", + "13000d30": "bhvHmcElevatorPlatform", + "13000d6c": "bhvWaterMist", + "13000d98": "bhvWaterMistSpawn", + "13000db4": "bhvBreakBoxTriangle", + "13000dd8": "bhvWaterMist2", + "13000dfc": "bhvUnused0DFC", + "13000e24": "bhvPoundWhitePuffs", + "13000e3c": "bhvGroundSand", + "13000e58": "bhvGroundSnow", + "13000e70": "bhvWind", + "13000e88": "bhvEndToad", + "13000eac": "bhvEndPeach", + "13000ed0": "bhvUnusedParticleSpawn", + "13000f08": "bhvUkiki", + "13000f14": "bhvUkikiCageChild", + "13000f2c": "bhvUkikiCageStar", + "13000f48": "bhvUkikiCage", + "13000f9c": "bhvBitfsSinkingPlatforms", + "13000fc8": "bhvBitfsSinkingCagePlatform", + "13001000": "bhvDddMovingPole", + "13001030": "bhvBitfsTiltingInvertedPyramid", + "13001064": "bhvSquishablePlatform", + "13001098": "bhvCutOutObject", + "130010a8": "bhvBetaMovingFlamesSpawn", + "130010b8": "bhvBetaMovingFlames", + "130010d8": "bhvRrRotatingBridgePlatform", + "13001108": "bhvFlamethrower", + "13001124": "bhvFlamethrowerFlame", + "13001168": "bhvBouncingFireball", + "13001184": "bhvBouncingFireballFlame", + "130011d0": "bhvBowserShockWave", + "130011ec": "bhvFlameMario", + "13001214": "bhvBlackSmokeMario", + "13001254": "bhvBlackSmokeBowser", + "1300127c": "bhvBlackSmokeUpward", + "13001298": "bhvBetaFishSplashSpawner", + "130012b4": "bhvSpindrift", + "130012f4": "bhvTowerPlatformGroup", + "13001318": "bhvWfSlidingTowerPlatform", + "13001340": "bhvWfElevatorTowerPlatform", + "13001368": "bhvWfSolidTowerPlatform", + "13001390": "bhvSnowLeafParticleSpawn", + "130013a8": "bhvTreeSnow", + "130013c4": "bhvTreeLeaf", + "130013dc": "bhvAnotherTiltingPlatform", + "13001408": "bhvSquarishPathMoving", + "1300142c": "bhvPiranhaPlantBubble", + "13001448": "bhvPiranhaPlantWakingBubbles", + "13001468": "bhvFloorSwitchAnimatesObject", + "13001478": "bhvFloorSwitchGrills", + "13001484": "bhvFloorSwitchHardcodedModel", + "130014ac": "bhvFloorSwitchHiddenObjects", + "130014bc": "bhvHiddenObject", + "130014e0": "bhvBreakableBox", + "13001518": "bhvPushableMetalBox", + "13001548": "bhvHeaveHo", + "130015a4": "bhvHeaveHoThrowMario", + "130015c0": "bhvCcmTouchedStarSpawn", + "130015e4": "bhvUnusedPoundablePlatform", + "13001608": "bhvBetaTrampolineTop", + "13001634": "bhvBetaTrampolineSpring", + "13001650": "bhvJumpingBox", + "1300167c": "bhvBooCage", + "130016ac": "bhvStub", + "130016b8": "bhvIgloo", + "130016e4": "bhvBowserKey", + "13001714": "bhvGrandStar", + "13001744": "bhvBetaBooKey", + "13001778": "bhvAlphaBooKey", + "1300179c": "bhvBulletBill", + "130017f4": "bhvWhitePuffSmoke", + "13001820": "bhvUnused1820", + "13001828": "bhvBowserTailAnchor", + "13001850": "bhvBowser", + "130018cc": "bhvBowserBodyAnchor", + "13001904": "bhvBowserFlameSpawn", + "13001920": "bhvTiltingBowserLavaPlatform", + "13001958": "bhvFallingBowserPlatform", + "13001984": "bhvBlueBowserFlame", + "130019c8": "bhvFlameFloatingLanding", + "13001a0c": "bhvBlueFlamesGroup", + "13001a30": "bhvFlameBouncing", + "13001a74": "bhvFlameMovingForwardGrowing", + "13001aa4": "bhvFlameBowser", + "13001ae8": "bhvFlameLargeBurningOut", + "13001b2c": "bhvBlueFish", + "13001b54": "bhvTankFishGroup", + "13001b70": "bhvCheckerboardElevatorGroup", + "13001b88": "bhvCheckerboardPlatformSub", + "13001bb4": "bhvBowserKeyUnlockDoor", + "13001bd4": "bhvBowserKeyCourseExit", + "13001bf4": "bhvInvisibleObjectsUnderBridge", + "13001c04": "bhvWaterLevelPillar", + "13001c34": "bhvDddWarp", + "13001c58": "bhvMoatGrills", + "13001c7c": "bhvClockMinuteHand", + "13001c8c": "bhvClockHourHand", + "13001cb0": "bhvMacroUkiki", + "13001d0c": "bhvStub1D0C", + "13001d14": "bhvLllRotatingHexagonalPlatform", + "13001d40": "bhvLllSinkingRockBlock", + "13001d70": "bhvStub1D70", + "13001d78": "bhvLllMovingOctagonalMeshPlatform", + "13001da4": "bhvSnowBall", + "13001da8": "bhvLllRotatingBlockWithFireBars", + "13001dcc": "bhvLllRotatingHexFlame", + "13001e04": "bhvLllWoodPiece", + "13001e30": "bhvLllFloatingWoodBridge", + "13001e4c": "bhvVolcanoFlames", + "13001e6c": "bhvLllRotatingHexagonalRing", + "13001e94": "bhvLllSinkingRectangularPlatform", + "13001ec4": "bhvLllSinkingSquarePlatforms", + "13001ef8": "bhvLllTiltingInvertedPyramid", + "13001f30": "bhvUnused1F30", + "13001f3c": "bhvKoopaShell", + "13001f68": "bhvKoopaShellFlame", + "13001f90": "bhvToxBox", + "13001fbc": "bhvPiranhaPlant", + "13002018": "bhvLllHexagonalMesh", + "13002038": "bhvLllBowserPuzzlePiece", + "13002068": "bhvLllBowserPuzzle", + "13002088": "bhvTuxiesMother", + "130020d8": "bhvPenguinBaby", + "130020e0": "bhvUnused20E0", + "130020e8": "bhvSmallPenguin", + "1300213c": "bhvFish2", + "1300214c": "bhvFish3", + "1300215c": "bhvLargeFishGroup", + "13002178": "bhvFish", + "13002194": "bhvWdwExpressElevator", + "130021c0": "bhvWdwExpressElevatorPlatform", + "130021e4": "bhvChirpChirp", + "130021f4": "bhvChirpChirpUnused", + "1300220c": "bhvBub", + "13002250": "bhvExclamationBox", + "1300227c": "bhvRotatingExclamationMark", + "1300229c": "bhvSoundSpawner", + "130022b8": "bhvRockSolid", + "130022d8": "bhvBowserSubDoor", + "13002308": "bhvBowsersSub", + "13002338": "bhvSushiShark", + "13002388": "bhvSushiSharkCollisionChild", + "130023a4": "bhvJrbSlidingBox", + "130023d0": "bhvShipPart3", + "130023ec": "bhvInSunkenShip3", + "1300241c": "bhvSunkenShipPart", + "1300243c": "bhvSunkenShipSetRotation", + "1300244c": "bhvSunkenShipPart2", + "1300246c": "bhvInSunkenShip", + "13002480": "bhvInSunkenShip2", + "130024ac": "bhvMarioDustGenerator", + "130024dc": "bhvWhitePuff1", + "13002500": "bhvWhitePuff2", + "13002528": "bhvWhitePuffSmoke2", + "13002558": "bhvPurpleSwitchHiddenBoxes", + "13002568": "bhvBlueCoinSwitch", + "13002588": "bhvHiddenBlueCoin", + "130025c0": "bhvOpenableCageDoor", + "130025e0": "bhvOpenableGrill", + "130025f8": "bhvWaterLevelDiamond", + "13002620": "bhvInitializeChangingWaterLevel", + "13002634": "bhvTweesterSandParticle", + "13002650": "bhvTweester", + "13002684": "bhvMerryGoRoundBooManager", + "1300269c": "bhvAnimatedTexture", + "130026d4": "bhvBooInCastle", + "13002710": "bhvBooWithCage", + "13002768": "bhvBalconyBigBoo", + "1300277c": "bhvMerryGoRoundBigBoo", + "13002790": "bhvGhostHuntBigBoo", + "130027d0": "bhvCourtyardBooTriplet", + "130027e4": "bhvBoo", + "130027f4": "bhvMerryGoRoundBoo", + "13002804": "bhvGhostHuntBoo", + "1300286c": "bhvHiddenStaircaseStep", + "13002898": "bhvBooBossSpawnedBridge", + "130028cc": "bhvBbhTiltingTrapPlatform", + "130028fc": "bhvHauntedBookshelf", + "1300292c": "bhvMeshElevator", + "13002968": "bhvMerryGoRound", + "13002998": "bhvPlaysMusicTrackWhenTouched", + "130029b0": "bhvInsideCannon", + "130029b4": "bhvBetaBowserAnchor", + "130029e4": "bhvStaticCheckeredPlatform", + "13002a10": "bhvUnused2A10", + "13002a20": "bhvUnusedFakeStar", + "13002a48": "bhvStaticObject", + "13002a54": "bhvUnused2A54", + "13002a5c": "bhvCastleFloorTrap", + "13002a7c": "bhvFloorTrapInCastle", + "13002aa4": "bhvTree", + "13002ad0": "bhvSparkle", + "13002af0": "bhvSparkleSpawn", + "13002b08": "bhvSpecialTripleJumpSparkles", + "13002b5c": "bhvScuttlebug", + "13002ba0": "bhvScuttlebugSpawn", + "13002bb8": "bhvWhompKingBoss", + "13002bcc": "bhvSmallWhomp", + "13002c14": "bhvWaterSplash", + "13002c60": "bhvWaterDroplet", + "13002c7c": "bhvWaterDropletSplash", + "13002cb0": "bhvBubbleSplash", + "13002ce0": "bhvIdleWaterWave", + "13002d28": "bhvObjectWaterSplash", + "13002d50": "bhvShallowWaterWave", + "13002d7c": "bhvShallowWaterSplash", + "13002db0": "bhvObjectWaveTrail", + "13002dc0": "bhvWaveTrail", + "13002e04": "bhvTinyStrongWindParticle", + "13002e20": "bhvStrongWindParticle", + "13002e3c": "bhvSLSnowmanWind", + "13002e58": "bhvSLWalkingPenguin", + "13002ea8": "bhvYellowBall", + "13002ec0": "bhvMario", + "13002ef8": "bhvToadMessage", + "13002f40": "bhvUnlockDoorStar", + "13002f60": "bhvWarps60", + "13002f64": "bhvWarps64", + "13002f68": "bhvWarps68", + "13002f6c": "bhvWarps6C", + "13002f70": "bhvWarps70", + "13002f74": "bhvWarps74", + "13002f78": "bhvWarps78", + "13002f7c": "bhvWarps7C", + "13002f80": "bhvWarps80", + "13002f84": "bhvWarps84", + "13002f88": "bhvWarps88", + "13002f8c": "bhvWarps8C", + "13002f90": "bhvWarps90", + "13002f94": "bhvWarps94", + "13002fa0": "bhvRandomAnimatedTexture", + "13002fc0": "bhvYellowBackgroundInMenu", + "13002fe4": "bhvMenuButton", + "13003008": "bhvMenuButtonManager", + "1300302c": "bhvActSelectorStarType", + "13003048": "bhvActSelector", + "13003068": "bhvMovingYellowCoin", + "130030a4": "bhvMovingBlueCoin", + "130030d4": "bhvBlueCoinSliding", + "13003104": "bhvBlueCoinJumping", + "13003134": "bhvSeaweed", + "13003158": "bhvSeaweedBundle", + "13003174": "bhvBobomb", + "130031ac": "bhvBobombFuseSmoke", + "130031dc": "bhvBobombBuddy", + "13003228": "bhvBobombBuddyOpensCannon", + "13003274": "bhvCannonClosed", + "130032a8": "bhvWhirlpool", + "130032c8": "bhvJetStream", + "130032e0": "bhvMessagePanel", + "13003324": "bhvSignOnWall", + "13003354": "bhvHomingAmp", + "13003388": "bhvCirclingAmp", + "130033bc": "bhvButterfly", + "130033ec": "bhvHoot", + "13003420": "bhvBetaHoldableObject", + "13003454": "bhvCarrySomething1", + "1300345c": "bhvCarrySomething2", + "13003464": "bhvCarrySomething3", + "1300346c": "bhvCarrySomething4", + "13003474": "bhvCarrySomething5", + "1300347c": "bhvCarrySomething6", + "13003484": "bhvObjectBubble", + "130034c4": "bhvObjectWaterWave", + "13003510": "bhvExplosion", + "13003558": "bhvBobombBullyDeathSmoke", + "13003588": "bhvSmoke", + "130035b0": "bhvBobombExplosionBubble", + "13003600": "bhvBobombExplosionBubble3600", + "13003614": "bhvRespawner", + "1300362c": "bhvSmallBully", + "13003660": "bhvBigBully", + "13003694": "bhvBigBullyWithMinions", + "130036c8": "bhvSmallChillBully", + "13003700": "bhvBigChillBully", + "13003738": "bhvJetStreamRingSpawner", + "13003750": "bhvJetStreamWaterRing", + "13003798": "bhvMantaRayWaterRing", + "130037e0": "bhvMantaRayRingManager", + "130037ec": "bhvBowserBomb", + "1300381c": "bhvBowserBombExplosion", + "13003840": "bhvBowserBombSmoke", + "13003868": "bhvCelebrationStar", + "13003888": "bhvCelebrationStarSparkle", + "130038b0": "bhvStarKeyCollectionPuffSpawner", + "130038d0": "bhvLllDrawbridgeSpawner", + "130038e8": "bhvLllDrawbridge", + "13003910": "bhvSmallBomp", + "13003940": "bhvLargeBomp", + "13003970": "bhvWfSlidingPlatform", + "130039a0": "bhvMoneybag", + "130039d4": "bhvMoneybagHidden", + "13003a08": "bhvPitBowlingBall", + "13003a30": "bhvFreeBowlingBall", + "13003a58": "bhvBowlingBall", + "13003a80": "bhvTtmBowlingBallSpawner", + "13003aa4": "bhvBobBowlingBallSpawner", + "13003ac8": "bhvThiBowlingBallSpawner", + "13003ae0": "bhvRrCruiserWing", + "13003b00": "bhvSpindel", + "13003b30": "bhvSslMovingPyramidWall", + "13003b60": "bhvPyramidElevator", + "13003b98": "bhvPyramidElevatorTrajectoryMarkerBall", + "13003bb4": "bhvPyramidTop", + "13003bec": "bhvPyramidTopFragment", + "13003c0c": "bhvPyramidPillarTouchDetector", + "13003c30": "bhvWaterfallSoundLoop", + "13003c44": "bhvVolcanoSoundLoop", + "13003c58": "bhvCastleFlagWaving", + "13003c7c": "bhvBirdsSoundLoop", + "13003c90": "bhvAmbientSounds", + "13003ca4": "bhvSandSoundLoop", + "13003cb8": "bhvHiddenAt120Stars", + "13003ce4": "bhvSnowmansBottom", + "13003d0c": "bhvSnowmansHead", + "13003d34": "bhvSnowmansBodyCheckpoint", + "13003d4c": "bhvBigSnowmanWhole", + "13003d74": "bhvBigBoulder", + "13003da0": "bhvBigBoulderGenerator", + "13003db8": "bhvWingCap", + "13003dd8": "bhvMetalCap", + "13003df8": "bhvNormalCap", + "13003e1c": "bhvVanishCap", + "13003e3c": "bhvStar", + "13003e64": "bhvStarSpawnCoordinates", + "13003e8c": "bhvHiddenRedCoinStar", + "13003eac": "bhvRedCoin", + "13003ee4": "bhvBowserCourseRedCoinStar", + "13003efc": "bhvHiddenStar", + "13003f1c": "bhvHiddenStarTrigger", + "13003f40": "bhvTtmRollingLog", + "13003f78": "bhvLllVolcanoFallingTrap", + "13003fa4": "bhvLllRollingLog", + "13003fdc": "bhv1upWalking", + "13004010": "bhv1upRunningAway", + "13004044": "bhv1upSliding", + "1300407c": "bhv1Up", + "130040b4": "bhv1upJumpOnApproach", + "130040ec": "bhvHidden1up", + "13004124": "bhvHidden1upTrigger", + "13004148": "bhvHidden1upInPole", + "13004180": "bhvHidden1upInPoleTrigger", + "130041a4": "bhvHidden1upInPoleSpawner", + "130041bc": "bhvControllablePlatform", + "130041f0": "bhvControllablePlatformSub", + "13004218": "bhvBreakableBoxSmall", + "13004244": "bhvSlidingSnowMound", + "13004270": "bhvSnowMoundSpawn", + "13004284": "bhvWdwSquareFloatingPlatform", + "130042b4": "bhvWdwRectangularFloatingPlatform", + "130042e4": "bhvJrbFloatingPlatform", + "13004314": "bhvArrowLift", + "13004348": "bhvOrangeNumber", + "13004370": "bhvMantaRay", + "130043a0": "bhvFallingPillar", + "130043c4": "bhvFallingPillarHitbox", + "130043e0": "bhvPillarBase", + "13004400": "bhvJrbFloatingBox", + "1300442c": "bhvDecorativePendulum", + "1300444c": "bhvTreasureChestsShip", + "13004470": "bhvTreasureChestsJrb", + "13004494": "bhvTreasureChests", + "130044b8": "bhvTreasureChestBottom", + "130044e0": "bhvTreasureChestTop", + "130044fc": "bhvMips", + "13004538": "bhvYoshi", + "13004580": "bhvKoopa", + "130045d0": "bhvKoopaRaceEndpoint", + "130045f8": "bhvKoopaFlag", + "13004634": "bhvPokey", + "13004668": "bhvPokeyBodyPart", + "13004698": "bhvSwoop", + "130046dc": "bhvFlyGuy", + "1300472c": "bhvGoomba", + "13004770": "bhvGoombaTripletSpawner", + "1300478c": "bhvChainChomp", + "130047e4": "bhvChainChompChainPart", + "1300481c": "bhvWoodenPost", + "13004868": "bhvChainChompGate", + "13004898": "bhvWigglerHead", + "130048e0": "bhvWigglerBody", + "13004918": "bhvEnemyLakitu", + "13004954": "bhvCameraLakitu", + "13004988": "bhvCloud", + "130049ac": "bhvCloudPart", + "130049c8": "bhvSpiny", + "13004a00": "bhvMontyMole", + "13004a58": "bhvMontyMoleHole", + "13004a78": "bhvMontyMoleRock", + "13004ab0": "bhvPlatformOnTrack", + "13004af4": "bhvTrackBall", + "13004b1c": "bhvSeesawPlatform", + "13004b44": "bhvFerrisWheelAxle", + "13004b6c": "bhvFerrisWheelPlatform", + "13004b8c": "bhvWaterBombSpawner", + "13004ba8": "bhvWaterBomb", + "13004bd4": "bhvWaterBombShadow", + "13004bf0": "bhvTTCRotatingSolid", + "13004c24": "bhvTTCPendulum", + "13004c5c": "bhvTTCTreadmill", + "13004c94": "bhvTTCMovingBar", + "13004ccc": "bhvTTCCog", + "13004cf8": "bhvTTCPitBlock", + "13004d28": "bhvTTCElevator", + "13004d64": "bhvTTC2DRotator", + "13004d90": "bhvTTCSpinner", + "13004dbc": "bhvMrBlizzard", + "13004e08": "bhvMrBlizzardSnowball", + "13004e4c": "bhvSlidingPlatform2", + "13004e78": "bhvOctagonalPlatformRotating", + "13004ea0": "bhvAnimatesOnFloorSwitchPress", + "13004ecc": "bhvActivatedBackAndForthPlatform", + "13004ef8": "bhvRecoveryHeart", + "13004f10": "bhvWaterBombCannon", + "13004f28": "bhvCannonBarrelBubbles", + "13004f40": "bhvUnagi", + "13004f78": "bhvUnagiSubobject", + "13004f90": "bhvDorrie", + "13004fd4": "bhvHauntedChair", + "13005024": "bhvMadPiano", + "1300506c": "bhvFlyingBookend", + "130050b4": "bhvBookendSpawn", + "130050d4": "bhvHauntedBookshelfManager", + "130050f4": "bhvBookSwitch", + "13005120": "bhvFirePiranhaPlant", + "13005158": "bhvSmallPiranhaFlame", + "1300518c": "bhvFireSpitter", + "130051ac": "bhvFlyguyFlame", + "130051e0": "bhvSnufit", + "1300521c": "bhvSnufitBalls", + "1300525c": "bhvHorizontalGrindel", + "130052b4": "bhvEyerokBoss", + "130052d0": "bhvEyerokHand", + "13005310": "bhvKlepto", + "13005354": "bhvBird", + "13005380": "bhvRacingPenguin", + "130053c4": "bhvPenguinRaceFinishLine", + "130053dc": "bhvPenguinRaceShortcutCheck", + "130053f4": "bhvCoffinSpawner", + "13005414": "bhvCoffin", + "13005440": "bhvClamShell", + "13005468": "bhvSkeeter", + "130054a0": "bhvSkeeterWave", + "130054b8": "bhvSwingPlatform", + "130054ec": "bhvDonutPlatformSpawner", + "13005504": "bhvDonutPlatform", + "13005528": "bhvDDDPole", + "1300556c": "bhvRedCoinStarMarker", + "13005598": "bhvTripletButterfly", + "130055dc": "bhvBubba", + "13005610": "bhvBeginningLakitu", + "13005638": "bhvBeginningPeach", + "1300565c": "bhvEndBirds1", + "13005680": "bhvEndBirds2", + "130056a4": "bhvIntroScene", + "130056c0": "_behaviorSegmentEnd", + "007d1d80": "_behaviorSegmentRomEnd", + "8016f000": "_goddardSegmentStart", + "007cc6c0": "_goddardSegmentRomStart", + }, + "Refresh 8": { + "80000000": "EXCEPTION_TLB_MISS", + "a4000000": "SP_DMEM", + "a40004c0": "SP_DMEM_UNK0", + "a4000774": "SP_DMEM_UNK1", + "a4001000": "SP_IMEM", + "a4040010": "SP_STATUS_REG", + "a4080000": "SP_PC", + "a4300000": "MI_MODE_REG", + "a4300004": "MI_VERSION_REG", + "a4300008": "MI_INTR_REG", + "a430000c": "MI_INTR_MASK_REG", + "a4400010": "VI_CURRENT_REG", + "a450000c": "AI_STATUS_REG", + "a4600000": "PI_DRAM_ADDR_REG", + "a4600004": "PI_CART_ADDR_REG", + "a460000c": "PI_WR_LEN_REG", + "a4600010": "PI_STATUS_REG", + "a4700000": "RI_MODE_REG", + "a4700010": "RI_REFRESH_REG", + "a4800018": "SI_STATUS_REG", + "b0000008": "D_B0000008", + "b0000010": "D_B0000010", + "b0000014": "D_B0000014", + "c0000000": "D_C0000000", + "c0000008": "D_C0000008", + "c000000c": "D_C000000C", + "802f69cc": "func_sh_802F69CC", + "80302ef0": "osMotorStop", + "80303090": "osMotorStart", + "803033ac": "osMotorInit", + "803016a0": "func_sh_803016A0", + "803016d0": "func_sh_803016D0", + "80301820": "func_sh_80301820", + "00000000": "__romPos", + "04000000": "_bootSegmentStart", + "007cc6c0": "_bootSegmentRomStart", + "04000040": "ipl3_entry", + "04000b70": "ipl3_font", + "04001000": "_bootSegmentEnd", + "007cd6c0": "_bootSegmentRomEnd", + "80000400": ".", + "80000400": "_zbufferSegmentNoloadStart", + "80000400": "0x25800", + "80000400": "gZBuffer", + "80246000": "_mainSegmentStart", + "007cc6c0": "_mainSegmentRomStart", + "80246000": "entry_point", + "80246050": "handle_debug_key_sequences", + "80246170": "unknown_main_func", + "802461cc": "stub_main_1", + "802461dc": "stub_main_2", + "802461ec": "stub_main_3", + "802461fc": "setup_mesg_queues", + "802462e0": "alloc_pool", + "80246338": "create_thread", + "8024639c": "handle_nmi_request", + "802463ec": "receive_new_tasks", + "8024651c": "start_sptask", + "8024659c": "interrupt_gfx_sptask", + "802465ec": "start_gfx_sptask", + "80246648": "pretend_audio_sptask_done", + "8024669c": "handle_vblank", + "802467fc": "handle_sp_complete", + "8024694c": "handle_dp_complete", + "802469b8": "thread3_main", + "80246b14": "set_vblank_handler", + "80246b74": "send_sp_task_message", + "80246bb4": "dispatch_audio_sptask", + "80246c10": "send_display_list", + "80246c9c": "turn_on_audio", + "80246cb8": "turn_off_audio", + "80246cf0": "thread1_idle", + "80246df8": "main_func", + "80246e70": "my_rdp_init", + "802471a4": "my_rsp_init", + "80247284": "clear_z_buffer", + "802473c8": "display_frame_buffer", + "802474b8": "clear_frame_buffer", + "80247620": "clear_viewport", + "8024784c": "draw_screen_borders", + "802479bc": "make_viewport_clip_rect", + "80247b3c": "create_task_structure", + "80247ccc": "init_render_image", + "80247d14": "end_master_display_list", + "80247db4": "draw_reset_bars", + "80247f08": "rendering_init", + "80247fdc": "config_gfx_pool", + "80248090": "display_and_vsync", + "80248304": "adjust_analog_stick", + "80248498": "run_demo_inputs", + "80248638": "read_controller_inputs", + "80248824": "init_controllers", + "80248964": "setup_game_memory", + "80248af0": "thread5_game_loop", + "80248c40": "reset_volume", + "80248c58": "lower_background_noise", + "80248ce8": "raise_background_noise", + "80248d78": "disable_background_sound", + "80248dc0": "enable_background_sound", + "80248e08": "set_sound_mode", + "80248e54": "play_menu_sounds", + "80248fec": "play_painting_eject_sound", + "80249070": "play_infinite_stairs_music", + "80249178": "set_background_music", + "8024922c": "fadeout_music", + "8024927c": "fadeout_level_music", + "802492d0": "play_cutscene_music", + "80249310": "play_shell_music", + "8024934c": "stop_shell_music", + "80249398": "play_cap_music", + "80249404": "fadeout_cap_music", + "80249448": "stop_cap_music", + "80249494": "play_menu_sounds_extra", + "802494d8": "audio_game_loop_tick", + "80249500": "thread4_sound", + "802495e0": "level_control_timer", + "802496b8": "pressed_pause", + "80249764": "set_play_mode", + "8024978c": "warp_special", + "802497b8": "fade_into_special_warp", + "8024982c": "stub_level_update_1", + "8024983c": "load_level_init_text", + "8024995c": "init_door_warp", + "80249a10": "set_mario_initial_cap_powerup", + "80249ab4": "set_mario_initial_action", + "80249cd8": "init_mario_after_warp", + "8024a124": "warp_area", + "8024a18c": "warp_level", + "8024a1d8": "warp_credits", + "8024a374": "check_instant_warp", + "8024a584": "music_changed_through_warp", + "8024a700": "initiate_warp", + "8024a7b4": "get_painting_warp_node", + "8024a85c": "initiate_painting_warp", + "8024a9cc": "level_trigger_warp", + "8024aedc": "initiate_delayed_warp", + "8024b13c": "update_hud_values", + "8024b390": "basic_update", + "8024b3e4": "play_mode_normal", + "8024b5d4": "play_mode_paused", + "8024b6cc": "play_mode_frame_advance", + "8024b798": "level_set_transition", + "8024b7c0": "play_mode_change_area", + "8024b880": "play_mode_change_level", + "8024b9b8": "update_level", + "8024ba8c": "init_level", + "8024bcd8": "lvl_init_or_update", + "8024bd5c": "lvl_init_from_save_file", + "8024be14": "lvl_set_current_level", + "8024bfa0": "lvl_play_the_end_screen_sound", + "8024bff0": "get_mario_cap_flag", + "8024c0b8": "object_facing_mario", + "8024c16c": "mario_obj_angle_to_object", + "8024c1d8": "determine_interaction", + "8024c51c": "attack_object", + "8024c618": "mario_stop_riding_object", + "8024c66c": "mario_grab_used_object", + "8024c6c0": "mario_drop_held_object", + "8024c780": "mario_throw_held_object", + "8024c894": "mario_stop_riding_and_holding", + "8024c8fc": "does_mario_have_hat", + "8024c928": "mario_blow_off_cap", + "8024ca68": "mario_lose_cap_to_enemy", + "8024caf8": "mario_retrieve_cap", + "8024cb58": "able_to_grab_object", + "8024cbfc": "mario_get_collided_object", + "8024cc7c": "mario_check_object_grab", + "8024ce08": "bully_knock_back_mario", + "8024d0b4": "bounce_off_object", + "8024d130": "hit_object_from_below", + "8024d2bc": "determine_knockback_action", + "8024d578": "push_mario_out_of_object", + "8024d72c": "bounce_back_from_attack", + "8024d804": "should_push_or_pull_door", + "8024d8b0": "take_damage_from_interact_object", + "8024d998": "take_damage_and_knock_back", + "8024daac": "reset_mario_pitch", + "8024db2c": "interact_coin", + "8024dbf0": "interact_water_ring", + "8024dc28": "interact_star_or_key", + "8024de4c": "interact_bbh_entrance", + "8024df10": "interact_warp", + "8024e0c4": "interact_warp_door", + "8024e2fc": "get_door_save_file_flag", + "8024e420": "interact_door", + "8024e6ec": "interact_cannon_base", + "8024e778": "interact_igloo_barrier", + "8024e7d4": "interact_tornado", + "8024e8f0": "interact_whirlpool", + "8024e9d0": "interact_strong_wind", + "8024ead8": "interact_flame", + "8024ec54": "interact_snufit_bullet", + "8024ed84": "interact_clam_or_bubba", + "8024ee44": "interact_bully", + "8024eff8": "interact_shock", + "8024f170": "interact_mr_blizzard", + "8024f1e0": "interact_hit_from_below", + "8024f354": "interact_bounce_top", + "8024f4ac": "interact_unknown_08", + "8024f55c": "interact_damage", + "8024f5cc": "interact_breakable", + "8024f6a4": "interact_koopa_shell", + "8024f7a8": "check_object_grab_mario", + "8024f8bc": "interact_pole", + "8024fa60": "interact_hoot", + "8024fb30": "interact_cap", + "8024fd2c": "interact_grabbable", + "8024fe6c": "mario_can_talk", + "8024ff04": "check_read_sign", + "80250098": "check_npc_talk", + "80250198": "interact_text", + "80250230": "check_kick_or_punch_wall", + "802503f0": "mario_process_interactions", + "802505c8": "check_death_barrier", + "8025065c": "check_lava_boost", + "80250724": "pss_begin_slide", + "80250778": "pss_end_slide", + "802507fc": "mario_handle_special_floors", + "80250940": "is_anim_at_end", + "8025097c": "is_anim_past_end", + "802509b8": "set_mario_animation", + "80250b04": "set_mario_anim_with_accel", + "80250c7c": "set_anim_to_frame", + "80250d38": "is_anim_past_frame", + "80250e54": "find_mario_anim_flags_and_translation", + "80251020": "update_mario_pos_for_anim", + "802510dc": "return_mario_anim_y_translation", + "80251120": "play_sound_if_no_flag", + "8025118c": "play_mario_jump_sound", + "80251274": "adjust_sound_for_speed", + "80251310": "play_sound_and_spawn_particles", + "80251444": "play_mario_action_sound", + "802514ac": "play_mario_landing_sound", + "80251510": "play_mario_landing_sound_once", + "80251574": "play_mario_heavy_landing_sound", + "802515d8": "play_mario_heavy_landing_sound_once", + "8025163c": "play_mario_sound", + "80251708": "mario_set_forward_vel", + "8025177c": "mario_get_floor_class", + "802518a8": "mario_get_terrain_sound_addend", + "80251a48": "resolve_and_return_wall_collisions", + "80251afc": "vec3f_find_ceil", + "80251b54": "mario_facing_downhill", + "80251bd4": "mario_floor_is_slippery", + "80251cfc": "mario_floor_is_slope", + "80251e24": "mario_floor_is_steep", + "80251f24": "find_floor_height_relative_polar", + "80252000": "find_floor_slope", + "802521a0": "update_mario_sound_and_camera", + "8025229c": "set_steep_jump_action", + "80252cf4": "set_mario_action", + "80252e5c": "set_jump_from_landing", + "802530a0": "set_jumping_action", + "80253178": "drop_and_set_mario_action", + "802531c4": "hurt_and_set_mario_action", + "80253218": "check_common_action_exits", + "80253300": "check_common_hold_action_exits", + "802533e4": "transition_submerged_to_walking", + "80253488": "set_water_plunge_action", + "80253588": "squish_mario_model", + "80253720": "debug_print_speed_action_normal", + "80253838": "update_mario_button_inputs", + "8025395c": "update_mario_joystick_inputs", + "80253a60": "update_mario_geometry_inputs", + "80253d58": "update_mario_inputs", + "80253ec0": "set_submerged_cam_preset_and_spawn_bubbles", + "80254060": "update_mario_health", + "802542b4": "update_mario_info_for_cam", + "80254338": "mario_reset_bodystate", + "80254390": "sink_mario_in_quicksand", + "802543e8": "update_and_return_cap_flags", + "80254588": "mario_update_hitbox_and_cap_model", + "80254830": "execute_mario_action", + "80254b20": "init_mario", + "80254f44": "init_mario_from_save_file", + "80255080": "get_additive_y_vel_for_jumps", + "8025509c": "stub_mario_step_1", + "802550b0": "stub_mario_step_2", + "802550c0": "transfer_bully_speed", + "80255238": "init_bully_collision_data", + "802552fc": "mario_bonk_reflection", + "80255414": "mario_update_quicksand", + "80255654": "mario_push_off_steep_floor", + "8025570c": "mario_update_moving_sand", + "8025580c": "mario_update_windy_ground", + "802559b0": "stop_and_set_height_to_floor", + "80255a34": "stationary_ground_step", + "80255d88": "perform_ground_step", + "80255ec4": "check_ledge_grab", + "802560ac": "perform_air_quarter_step", + "802564e0": "apply_twirl_gravity", + "80256584": "should_strengthen_gravity_for_jump_ascent", + "8025661c": "apply_gravity", + "802569f8": "apply_vertical_wind", + "80256b24": "perform_air_step", + "80256cd8": "set_vel_from_pitch_and_yaw", + "80256d8c": "set_vel_from_yaw", + "80256e00": "get_credits_str_width", + "80256e88": "print_displaying_credits_entry", + "80257060": "bhv_end_peach_loop", + "802570dc": "bhv_end_toad_loop", + "80257198": "geo_switch_peach_eyes", + "802572b0": "get_star_collection_dialog", + "8025733c": "handle_save_menu", + "80257450": "spawn_obj_at_mario_rel_yaw", + "802574e8": "cutscene_take_cap_off", + "80257548": "cutscene_put_cap_on", + "802575a8": "mario_ready_to_speak", + "80257640": "set_mario_npc_dialog", + "80257748": "act_reading_npc_dialog", + "80257980": "act_waiting_for_dialog", + "80257a0c": "act_disappeared", + "80257ab0": "act_reading_automatic_dialog", + "80257ce4": "act_reading_sign", + "80257eac": "act_debug_free_move", + "80258184": "general_star_dance_handler", + "80258420": "act_star_dance", + "802584dc": "act_star_dance_water", + "802585c0": "act_fall_after_star_grab", + "802586cc": "common_death_handler", + "80258744": "act_standing_death", + "802587ec": "act_electrocution", + "8025883c": "act_suffocation", + "8025888c": "act_death_on_back", + "802588f8": "act_death_on_stomach", + "80258964": "act_quicksand_death", + "80258a7c": "act_eaten_by_bubba", + "80258b24": "launch_mario_until_land", + "80258ba8": "act_unlocking_key_door", + "80258dac": "act_unlocking_star_door", + "80258f94": "act_entering_star_door", + "80259264": "act_going_through_door", + "802593cc": "act_warp_door_spawn", + "802594d4": "act_emerge_from_pipe", + "80259608": "act_spawn_spin_airborne", + "80259740": "act_spawn_spin_landing", + "802597ac": "act_exit_airborne", + "80259854": "act_falling_exit_airborne", + "802598d0": "act_exit_land_save_dialog", + "80259c30": "act_death_exit", + "80259ce8": "act_unused_death_exit", + "80259d74": "act_falling_death_exit", + "80259e00": "act_special_exit_airborne", + "80259ef8": "act_special_death_exit", + "80259fcc": "act_spawn_no_spin_airborne", + "8025a040": "act_spawn_no_spin_landing", + "8025a0bc": "act_bbh_enter_spin", + "8025a494": "act_bbh_enter_jump", + "8025a610": "act_teleport_fade_out", + "8025a6fc": "act_teleport_fade_in", + "8025a858": "act_shocked", + "8025a9ac": "act_squished", + "8025ae0c": "act_putting_on_cap", + "8025aea8": "stuck_in_ground_handler", + "8025affc": "act_head_stuck_in_ground", + "8025b050": "act_butt_stuck_in_ground", + "8025b0a4": "act_feet_stuck_in_ground", + "8025bc80": "generate_yellow_sparkles", + "8025d798": "mario_execute_cutscene_action", + "8025dd70": "add_tree_leaf_particles", + "8025de1c": "play_climbing_sounds", + "8025df04": "set_pole_position", + "8025e21c": "act_holding_pole", + "8025e5a8": "act_climbing_pole", + "8025e7a4": "act_grab_pole_slow", + "8025e830": "act_grab_pole_fast", + "8025e930": "act_top_of_pole_transition", + "8025ea30": "act_top_of_pole", + "8025eb50": "perform_hanging_step", + "8025ecfc": "update_hang_moving", + "8025eed0": "update_hang_stationary", + "8025ef58": "act_start_hanging", + "8025f0b4": "act_hanging", + "8025f1e4": "act_hang_moving", + "8025f384": "let_go_of_ledge", + "8025f4b4": "climb_up_ledge", + "8025f560": "update_ledge_climb_camera", + "8025f644": "update_ledge_climb", + "8025f6c0": "act_ledge_grab", + "8025f970": "act_ledge_climb_slow", + "8025fa64": "act_ledge_climb_down", + "8025fae8": "act_ledge_climb_fast", + "8025fb90": "act_grabbed", + "8025fc6c": "act_in_cannon", + "80260154": "act_tornado_twirling", + "80260568": "check_common_automatic_cancels", + "802605d0": "mario_execute_automatic_action", + "802608b0": "check_common_idle_cancels", + "80260aac": "check_common_hold_idle_cancels", + "80260cb4": "act_idle", + "80260f94": "play_anim_sound", + "80261000": "act_start_sleeping", + "80261268": "act_sleeping", + "802614fc": "act_waking_up", + "8026168c": "act_shivering", + "802618d8": "act_coughing", + "802619d0": "act_hold_idle", + "80261ad0": "act_hold_heavy_idle", + "80261bf8": "act_standing_against_wall", + "80261cec": "act_in_quicksand", + "80261db4": "act_crouching", + "80261f70": "act_panting", + "80262080": "act_hold_panting_unused", + "8026217c": "stopping_step", + "802621dc": "act_braking_stop", + "802622dc": "act_butt_slide_stop", + "80262398": "act_hold_butt_slide_stop", + "80262490": "act_slide_kick_slide_stop", + "80262530": "act_start_crouching", + "80262650": "act_stop_crouching", + "80262770": "act_start_crawling", + "80262890": "act_stop_crawling", + "80262980": "act_shockwave_bounce", + "80262bc4": "landing_step", + "80262c34": "check_common_landing_cancels", + "80262d68": "act_jump_land_stop", + "80262dc4": "act_double_jump_land_stop", + "80262e20": "act_side_flip_land_stop", + "80262e94": "act_freefall_land_stop", + "80262ef0": "act_triple_jump_land_stop", + "80262f50": "act_backflip_land_stop", + "80262fec": "act_lava_boost_land", + "8026305c": "act_long_jump_land_stop", + "802630f8": "act_hold_jump_land_stop", + "802631f0": "act_hold_freefall_land_stop", + "802632e8": "act_air_throw_land", + "802633b4": "act_twirl_land", + "8026350c": "act_ground_pound_land", + "802635e8": "act_first_person", + "80263784": "check_common_stationary_cancels", + "80263898": "mario_execute_stationary_action", + "80263e60": "tilt_body_running", + "80263ee4": "play_step_sound", + "80264024": "align_with_floor", + "8026409c": "begin_walking_action", + "802640fc": "check_ledge_climb_down", + "802642b4": "slide_bonk", + "80264340": "set_triple_jump_action", + "8026440c": "update_sliding_angle", + "80264740": "update_sliding", + "80264b54": "apply_slope_accel", + "80264d80": "apply_landing_accel", + "80264e18": "update_shell_speed", + "80265080": "apply_slope_decel", + "802651b0": "update_decelerating_speed", + "80265244": "update_walking_speed", + "80265458": "should_begin_sliding", + "80265514": "analog_stick_held_back", + "80265558": "check_ground_dive_or_punch", + "80265620": "begin_braking_action", + "80265700": "anim_and_audio_for_walk", + "80265b1c": "anim_and_audio_for_hold_walk", + "80265d90": "anim_and_audio_for_heavy_walk", + "80265df8": "push_or_sidle_wall", + "80266038": "tilt_body_walking", + "802661cc": "tilt_body_ground_shell", + "80266354": "act_walking", + "802665b4": "act_move_punching", + "80266734": "act_hold_walking", + "8026699c": "act_hold_heavy_walking", + "80266af8": "act_turning_around", + "80266d4c": "act_finish_turning_around", + "80266e48": "act_braking", + "80266fc8": "act_decelerating", + "80267240": "act_hold_decelerating", + "80267504": "act_riding_shell_ground", + "80267728": "act_crawling", + "8026795c": "act_burning_ground", + "80267c24": "tilt_body_butt_slide", + "80267ce4": "common_slide_action", + "80267fa4": "common_slide_action_with_jump", + "80268074": "act_butt_slide", + "802680d4": "act_hold_butt_slide", + "80268168": "act_crouch_slide", + "80268338": "act_slide_kick_slide", + "802684ac": "stomach_slide_action", + "802685c0": "act_stomach_slide", + "80268608": "act_hold_stomach_slide", + "80268684": "act_dive_slide", + "802687b8": "common_ground_knockback_action", + "802689f8": "act_hard_backward_ground_kb", + "80268adc": "act_hard_forward_ground_kb", + "80268b64": "act_backward_ground_kb", + "80268bb0": "act_forward_ground_kb", + "80268bfc": "act_soft_backward_ground_kb", + "80268c48": "act_soft_forward_ground_kb", + "80268c94": "act_ground_bonk", + "80268d04": "act_death_exit_land", + "80268dcc": "common_landing_action", + "80268f78": "common_landing_cancels", + "80269108": "act_jump_land", + "80269170": "act_freefall_land", + "802691d8": "act_side_flip_land", + "80269264": "act_hold_jump_land", + "80269300": "act_hold_freefall_land", + "8026939c": "act_long_jump_land", + "8026947c": "act_double_jump_land", + "802694e4": "act_triple_jump_land", + "80269588": "act_backflip_land", + "80269640": "quicksand_jump_land_action", + "80269788": "act_quicksand_jump_land", + "802697dc": "act_hold_quicksand_jump_land", + "80269830": "check_common_moving_cancels", + "80269954": "mario_execute_moving_action", + "80269f40": "play_flip_sounds", + "80269fc0": "play_far_fall_sound", + "8026a090": "play_knockback_sound", + "8026a12c": "lava_boost_on_wall", + "8026a224": "check_fall_damage", + "8026a400": "check_kick_or_dive_in_air", + "8026a494": "should_get_stuck_in_ground", + "8026a598": "check_fall_damage_or_get_stuck", + "8026a62c": "check_horizontal_wind", + "8026a818": "update_air_with_turn", + "8026aa48": "update_air_without_turn", + "8026acd8": "update_lava_boost_or_twirling", + "8026ae5c": "update_flying_yaw", + "8026b004": "update_flying_pitch", + "8026b17c": "update_flying", + "8026b444": "common_air_action_step", + "8026b6a0": "act_jump", + "8026b740": "act_double_jump", + "8026b814": "act_triple_jump", + "8026b90c": "act_backflip", + "8026b9ac": "act_freefall", + "8026bab8": "act_hold_jump", + "8026bbb4": "act_hold_freefall", + "8026bcc0": "act_side_flip", + "8026bdcc": "act_wall_kick_air", + "8026be78": "act_long_jump", + "8026bf40": "act_riding_shell_air", + "8026c034": "act_twirling", + "8026c1e0": "act_dive", + "8026c4b8": "act_air_throw", + "8026c5d0": "act_water_jump", + "8026c738": "act_hold_water_jump", + "8026c880": "act_steep_jump", + "8026c9fc": "act_ground_pound", + "8026cd0c": "act_burning_jump", + "8026ce50": "act_burning_fall", + "8026cf28": "act_crazy_box_bounce", + "8026d1b0": "common_air_knockback_step", + "8026d33c": "check_wall_kick", + "8026d3c8": "act_backward_air_kb", + "8026d43c": "act_forward_air_kb", + "8026d4b0": "act_hard_backward_air_kb", + "8026d508": "act_hard_forward_air_kb", + "8026d560": "act_thrown_backward", + "8026d608": "act_thrown_forward", + "8026d6fc": "act_soft_bonk", + "8026d770": "act_getting_blown", + "8026d988": "act_air_hit_wall", + "8026db54": "act_forward_rollout", + "8026dcf4": "act_backward_rollout", + "8026de98": "act_butt_slide_air", + "8026e088": "act_hold_butt_slide_air", + "8026e2b4": "act_lava_boost", + "8026e59c": "act_slide_kick", + "8026e810": "act_jump_kick", + "8026e968": "act_shot_from_cannon", + "8026ec00": "act_flying", + "8026f158": "act_riding_hoot", + "8026f2ec": "act_flying_triple_jump", + "8026f614": "act_top_of_pole_jump", + "8026f660": "act_vertical_wind", + "8026f840": "act_special_triple_jump", + "8026fa18": "check_common_airborne_cancels", + "8026fb04": "mario_execute_airborne_action", + "8027499c": "mario_execute_submerged_action", + "80274eb0": "animated_stationary_ground_step", + "80274f10": "mario_update_punch_sequence", + "80275328": "act_punching", + "8027546c": "act_picking_up", + "802755fc": "act_dive_picking_up", + "802756c8": "act_placing_down", + "80275794": "act_throwing", + "802758c0": "act_heavy_throw", + "802759b4": "act_stomach_slide_stop", + "80275a80": "act_picking_up_bowser", + "80275b34": "act_holding_bowser", + "80275e78": "act_releasing_bowser", + "80275f0c": "check_common_object_cancels", + "80275fe0": "mario_execute_object_action", + "802761d0": "geo_envfx_main", + "802763d4": "geo_skybox_main", + "802764b0": "geo_draw_mario_head_goddard", + "8027684c": "bhv_toad_message_loop", + "80276910": "bhv_toad_message_init", + "80276bb8": "bhv_unlock_door_star_init", + "80276ccc": "bhv_unlock_door_star_loop", + "802770a4": "geo_mirror_mario_set_alpha", + "80277150": "geo_switch_mario_stand_run", + "802771bc": "geo_switch_mario_eyes", + "80277294": "geo_mario_tilt_torso", + "802773a4": "geo_mario_head_rotation", + "802774f4": "geo_switch_mario_hand", + "802775cc": "geo_mario_hand_foot_scaler", + "802776d8": "geo_switch_mario_cap_effect", + "80277740": "geo_switch_mario_cap_on_off", + "80277824": "geo_mario_rotate_wing_cap_wings", + "8027795c": "geo_switch_mario_hand_grab_pos", + "80277b14": "geo_render_mirror_mario", + "80277d6c": "geo_mirror_mario_backface_culling", + "80277ee0": "set_segment_base_addr", + "80277f20": "get_segment_base_addr", + "80277f50": "segmented_to_virtual", + "80277fa8": "virtual_to_segmented", + "80277ff0": "move_segment_table_to_dmem", + "80278074": "main_pool_init", + "80278120": "main_pool_alloc", + "80278238": "main_pool_free", + "80278358": "main_pool_realloc", + "802783c8": "main_pool_available", + "802783e8": "main_pool_push_state", + "80278498": "main_pool_pop_state", + "8027868c": "load_segment", + "802786f0": "load_to_fixed_pool_addr", + "802787d8": "load_segment_decompress", + "802788b4": "load_segment_decompress_heap", + "80278974": "load_engine_code_segment", + "80278a14": "alloc_only_pool_init", + "80278ab8": "alloc_only_pool_alloc", + "80278b28": "alloc_only_pool_resize", + "80278b98": "mem_pool_init", + "80278c58": "mem_pool_alloc", + "80278d74": "mem_pool_free", + "80278f2c": "alloc_display_list", + "80279028": "func_80278A78", + "80279084": "load_patchable_table", + "80279840": "save_file_do_save", + "802798fc": "save_file_erase", + "80279960": "save_file_copy", + "802799dc": "save_file_load_all", + "80279bc8": "save_file_reload", + "80279c44": "save_file_collect_star_or_key", + "80279e44": "save_file_exists", + "80279e80": "save_file_get_max_coin_score", + "80279f80": "save_file_get_course_star_count", + "8027a010": "save_file_get_total_star_count", + "8027a0a8": "save_file_set_flags", + "8027a0f4": "save_file_clear_flags", + "8027a16c": "save_file_get_flags", + "8027a1c8": "save_file_get_star_flags", + "8027a23c": "save_file_set_star_flags", + "8027a310": "save_file_get_course_coin_score", + "8027a340": "save_file_is_cannon_unlocked", + "8027a390": "save_file_set_cannon_unlocked", + "8027a418": "save_file_set_cap_pos", + "8027a4ac": "save_file_get_cap_pos", + "8027a564": "save_file_set_sound_mode", + "8027a5b4": "save_file_get_sound_mode", + "8027a5d4": "save_file_move_cap_to_default_location", + "8027a698": "disable_warp_checkpoint", + "8027a6b0": "check_if_should_set_warp_checkpoint", + "8027a718": "check_warp_checkpoint", + "8027a7d0": "override_viewport_and_clip", + "8027a83c": "set_warp_transition_rgb", + "8027a8b0": "print_intro_text", + "8027a93c": "get_mario_spawn_type", + "8027a9c8": "area_get_warp_node", + "8027aa28": "area_get_warp_node_from_params", + "8027aa74": "load_obj_warp_nodes", + "8027ab04": "clear_areas", + "8027ad74": "clear_area_graph_nodes", + "8027ae44": "load_area", + "8027af48": "unload_area", + "8027afbc": "load_mario_area", + "8027b038": "unload_mario_area", + "8027b0c0": "change_area", + "8027b164": "area_update_objects", + "8027b1a0": "play_transition", + "8027b35c": "play_transition_after_delay", + "8027b3b4": "render_game", + "8027cf38": "geo_set_animation_globals", + "8027da84": "geo_process_held_object", + "8027de68": "geo_try_process_children", + "8027dea8": "geo_process_node_and_siblings", + "8027e130": "geo_process_root", + "8027e3e0": "profiler_log_thread5_time", + "8027e490": "profiler_log_thread4_time", + "8027e520": "profiler_log_gfx_time", + "8027e5cc": "profiler_log_vblank_time", + "8027e65c": "draw_profiler_bar", + "8027e958": "draw_reference_profiler_bars", + "8027ebcc": "draw_profiler_mode_1", + "8027eeac": "draw_profiler_mode_0", + "8027f460": "draw_profiler", + "8027f4e0": "decompress", + "8027f590": "set_camera_shake_from_hit", + "8027f8b8": "set_environmental_camera_shake", + "8027f9f0": "set_camera_shake_from_point", + "8027fb74": "unused_set_camera_pitch_shake_env", + "8027fc18": "calc_y_to_curr_floor", + "8027fe20": "focus_on_mario", + "8027fff8": "set_camera_height", + "80280368": "look_down_slopes", + "802804f4": "pan_ahead_of_player", + "802806a4": "find_in_bounds_yaw_wdw_bob_thi", + "80280810": "update_radial_camera", + "80280970": "update_8_directions_camera", + "80280b00": "radial_camera_move", + "80281188": "lakitu_zoom", + "802813bc": "radial_camera_input_default", + "802813ec": "update_yaw_and_dist_from_c_up", + "8028146c": "mode_radial_camera", + "80281588": "mode_8_directions_camera", + "802816a0": "update_outward_radial_camera", + "802817fc": "mode_outward_radial_camera", + "80281904": "update_parallel_tracking_camera", + "80282280": "update_fixed_camera", + "802826a0": "update_boss_fight_camera", + "80282c0c": "unused_update_mode_5_camera", + "80282c3c": "mode_boss_fight_camera", + "80282c7c": "mode_parallel_tracking_camera", + "80282ce0": "mode_fixed_camera", + "80282d78": "update_behind_mario_camera", + "80283340": "mode_behind_mario", + "80283578": "update_slide_camera", + "802839e4": "mode_behind_mario_camera", + "80283a18": "nop_update_water_camera", + "80283a34": "mode_water_surface_camera", + "80283a68": "update_mario_camera", + "80283af8": "update_default_camera", + "80284cb8": "mode_default_camera", + "80284cfc": "mode_lakitu_camera", + "80284d38": "mode_mario_camera", + "80284d74": "update_spiral_stairs_camera", + "802850ac": "mode_spiral_stairs_camera", + "802850ec": "update_slide_or_0f_camera", + "802851dc": "mode_slide_camera", + "8028526c": "store_lakitu_cam_info_for_c_up", + "802852f4": "set_mode_c_up", + "80285370": "exit_c_up", + "80285808": "update_c_up", + "802858a4": "move_mario_head_c_up", + "80285a2c": "move_into_c_up", + "80285d20": "mode_c_up_camera", + "80285ed8": "update_in_cannon", + "80285f60": "mode_cannon_camera", + "8028603c": "transition_next_state", + "80286088": "transition_to_camera_mode", + "80286188": "set_camera_mode", + "80286420": "update_lakitu", + "802868f8": "update_camera", + "80286f68": "reset_camera", + "8028724c": "init_camera", + "802879ec": "zoom_out_if_paused_and_outside", + "80287bc4": "select_mario_cam_mode", + "80287be0": "create_camera", + "80287cb8": "update_graph_node_camera", + "80287d30": "geo_camera_main", + "80287dc0": "stub_camera_2", + "80287dd4": "stub_camera_3", + "80287de8": "vec3f_sub", + "80287e28": "object_pos_to_vec3f", + "80287e50": "vec3f_to_object_pos", + "80287e78": "unused_object_angle_to_vec3s", + "80287ea0": "evaluate_cubic_spline", + "802882e4": "move_point_along_spline", + "80288624": "cam_select_alt_mode", + "80288718": "set_cam_angle", + "80288888": "set_handheld_shake", + "802889b0": "shake_camera_handheld", + "80288ce4": "find_c_buttons_pressed", + "80288e68": "update_camera_hud_status", + "80288f5c": "collide_with_walls", + "80289198": "vec3f_compare", + "80289214": "clamp_pitch", + "802892d8": "is_within_100_units_of_mario", + "8028935c": "set_or_approach_f32_asymptotic", + "802893f4": "approach_f32_asymptotic_bool", + "80289488": "approach_f32_asymptotic", + "802894b4": "approach_s16_asymptotic_bool", + "8028956c": "approach_s16_asymptotic", + "80289610": "approach_vec3f_asymptotic", + "80289684": "set_or_approach_vec3f_asymptotic", + "802896f8": "approach_vec3s_asymptotic", + "8028976c": "camera_approach_s16_symmetric_bool", + "8028984c": "camera_approach_s16_symmetric", + "8028993c": "set_or_approach_s16_symmetric", + "802899cc": "camera_approach_f32_symmetric_bool", + "80289b0c": "camera_approach_f32_symmetric", + "80289c00": "random_vec3s", + "80289d20": "reduce_by_dist_from_camera", + "80289f88": "clamp_positions_and_find_yaw", + "8028a080": "calc_avoid_yaw", + "8028a0f4": "is_surf_within_bounding_box", + "8028a4ec": "is_behind_surface", + "8028a6bc": "is_range_behind_surface", + "8028a7ec": "is_mario_behind_surface", + "8028a834": "scale_along_line", + "8028a8e8": "is_pos_in_bounds", + "8028aa28": "calculate_pitch", + "8028aad8": "calculate_yaw", + "8028ab60": "calculate_angles", + "8028ac28": "calc_abs_dist", + "8028accc": "calc_hor_dist", + "8028ad4c": "rotate_in_xz", + "8028ae1c": "rotate_in_yz", + "8028aef0": "set_camera_pitch_shake", + "8028af4c": "set_camera_yaw_shake", + "8028b00c": "set_camera_roll_shake", + "8028b068": "set_pitch_shake_from_point", + "8028b11c": "set_yaw_shake_from_point", + "8028b1d0": "increment_shake_offset", + "8028b218": "shake_camera_pitch", + "8028b32c": "shake_camera_yaw", + "8028b438": "shake_camera_roll", + "8028b50c": "offset_yaw_outward_radial", + "8028b724": "cutscene_intro_peach_play_message_music", + "8028b754": "cutscene_intro_peach_play_lakitu_flying_music", + "8028b784": "play_camera_buzz_if_cdown", + "8028b7c4": "play_camera_buzz_if_cbutton", + "8028b804": "play_camera_buzz_if_c_sideways", + "8028b850": "play_sound_cbutton_up", + "8028b884": "play_sound_cbutton_down", + "8028b8b8": "play_sound_cbutton_side", + "8028b8ec": "play_sound_button_change_blocked", + "8028b920": "play_sound_rbutton_changed", + "8028b954": "play_sound_if_cam_switched_to_lakitu_or_mario", + "8028b9c4": "radial_camera_input", + "8028bd34": "trigger_cutscene_dialog", + "8028bd98": "handle_c_button_movement", + "8028c038": "clear_cutscene_vars", + "8028c13c": "start_cutscene", + "8028c18c": "determine_dance_cutscene", + "8028c26c": "open_door_cutscene", + "8028c2c8": "get_cutscene_from_mario_status", + "8028c7a0": "warp_camera", + "8028c8f0": "approach_camera_height", + "8028c9ac": "stub_camera_4", + "8028c9cc": "set_focus_rel_mario", + "8028cbf0": "offset_rotated", + "8028cd94": "offset_rotated_coords", + "8028cdec": "determine_pushing_or_pulling_door", + "8028ce24": "next_lakitu_state", + "8028d44c": "set_camera_mode_fixed", + "8028d5ac": "set_camera_mode_8_directions", + "8028d5fc": "set_camera_mode_boss_fight", + "8028d658": "set_camera_mode_close_cam", + "8028d698": "set_camera_mode_radial", + "8028d79c": "parallel_tracking_init", + "8028d888": "set_fixed_cam_axis_sa_lobby", + "8028d92c": "check_blocking_area_processing", + "8028da18": "cam_rr_exit_building_side", + "8028da50": "cam_rr_exit_building_top", + "8028daec": "cam_rr_enter_building_window", + "8028db38": "cam_rr_enter_building", + "8028dbb4": "cam_rr_enter_building_side", + "8028dbf4": "cam_cotmc_exit_waterfall", + "8028dc1c": "cam_sl_snowman_head_8dir", + "8028dc70": "cam_sl_free_roam", + "8028dca4": "move_camera_through_floor_while_descending", + "8028dd48": "cam_hmc_enter_maze", + "8028de2c": "cam_hmc_elevator_black_hole", + "8028de5c": "cam_hmc_elevator_maze_emergency_exit", + "8028de90": "cam_hmc_elevator_lake", + "8028dec4": "cam_hmc_elevator_maze", + "8028def8": "cam_ssl_enter_pyramid_top", + "8028df24": "cam_ssl_pyramid_center", + "8028df6c": "cam_ssl_boss_room", + "8028dfb4": "cam_thi_move_cam_through_tunnel", + "8028dfe8": "cam_thi_look_through_tunnel", + "8028e01c": "cam_bob_tower", + "8028e064": "cam_bob_default_free_roam", + "8028e098": "cam_castle_hmc_start_pool_cutscene", + "8028e0ec": "cam_castle_lobby_entrance", + "8028e164": "cam_castle_look_upstairs", + "8028e210": "cam_castle_basement_look_downstairs", + "8028e298": "cam_castle_enter_lobby", + "8028e300": "cam_castle_enter_spiral_stairs", + "8028e38c": "cam_castle_close_mode", + "8028e3b8": "cam_castle_leave_lobby_sliding_door", + "8028e3f0": "cam_castle_enter_lobby_sliding_door", + "8028e41c": "cam_bbh_room_6", + "8028e450": "cam_bbh_fall_off_roof", + "8028e47c": "cam_bbh_fall_into_pool", + "8028e524": "cam_bbh_room_1", + "8028e55c": "cam_bbh_leave_front_door", + "8028e594": "cam_bbh_room_2_lower", + "8028e5cc": "cam_bbh_room_4", + "8028e604": "cam_bbh_room_8", + "8028e63c": "cam_bbh_room_5_library", + "8028e674": "cam_bbh_room_5_library_to_hidden_transition", + "8028e6c4": "cam_bbh_room_5_hidden_to_library_transition", + "8028e714": "cam_bbh_room_5_hidden", + "8028e758": "cam_bbh_room_3", + "8028e790": "cam_bbh_room_7_mr_i", + "8028e7c8": "cam_bbh_room_7_mr_i_to_coffins_transition", + "8028e818": "cam_bbh_room_7_coffins_to_mr_i_transition", + "8028e868": "cam_bbh_elevator_room_lower", + "8028e8a0": "cam_bbh_room_0_back_entrance", + "8028e8cc": "cam_bbh_elevator", + "8028e930": "cam_bbh_room_12_upper", + "8028e974": "cam_bbh_enter_front_door", + "8028e9a0": "cam_bbh_room_2_library", + "8028e9d8": "cam_bbh_room_2_library_to_trapdoor_transition", + "8028ea28": "cam_bbh_room_2_trapdoor", + "8028ea60": "cam_bbh_room_2_trapdoor_transition", + "8028eab0": "cam_bbh_room_9_attic", + "8028eae8": "cam_bbh_room_9_attic_transition", + "8028eb38": "cam_bbh_room_9_mr_i_transition", + "8028eb88": "cam_bbh_room_13_balcony", + "8028ebc0": "cam_bbh_room_0", + "8028ec04": "cam_ccm_enter_slide_shortcut", + "8028ec2c": "cam_ccm_leave_slide_shortcut", + "8028ec58": "surface_type_modes", + "8028ed30": "set_mode_if_not_set_by_surface", + "8028ed98": "surface_type_modes_thi", + "8028eeb0": "camera_course_processing", + "8028f670": "resolve_geometry_collisions", + "8028f914": "rotate_camera_around_walls", + "8028fc9c": "find_mario_floor_and_ceil", + "8028fe24": "start_object_cutscene", + "8028fe58": "start_object_cutscene_without_focus", + "8028fe84": "unused_dialog_cutscene_response", + "8028ff04": "cutscene_object_with_dialog", + "8028ffc8": "cutscene_object_without_dialog", + "8029000c": "cutscene_object", + "80290098": "update_camera_yaw", + "802900e0": "cutscene_reset_spline", + "80290104": "stop_cutscene_and_retrieve_stored_info", + "80290168": "cap_switch_save", + "802901a4": "init_spline_point", + "802901fc": "copy_spline_segment", + "802903b8": "cutscene_common_set_dialog_state", + "802904a8": "cutscene_intro_peach_start_letter_music", + "802904e4": "cutscene_intro_peach_start_flying_music", + "8029051c": "reset_pan_distance", + "8029053c": "player2_rotate_cam", + "80290784": "store_info_cannon", + "802907f4": "retrieve_info_cannon", + "80290864": "store_info_star", + "802908e8": "retrieve_info_star", + "802909d0": "pan_camera", + "80290a5c": "cutscene_shake_explosion", + "80290abc": "rotate_and_move_vec3f", + "80290b54": "set_flag_post_door", + "80290ba4": "cutscene_soften_music", + "80290bd8": "cutscene_unsoften_music", + "80290c1c": "cutscene_unused_start", + "80290c30": "cutscene_unused_loop", + "80290c44": "cutscene_ending_mario_fall_start", + "80290c9c": "cutscene_ending_mario_fall_focus_mario", + "80290d90": "cutscene_ending_mario_fall", + "80290e00": "cutscene_ending_mario_land_closeup", + "80290e74": "cutscene_ending_reset_spline", + "80290eb0": "cutscene_ending_fly_up_to_window", + "80290f1c": "cutscene_ending_stars_free_peach", + "80290f8c": "cutscene_ending_mario_land", + "80291074": "cutscene_ending_peach_appear_closeup", + "80291108": "cutscene_ending_peach_appears", + "802911c8": "cutscene_ending_peach_descends_start", + "80291208": "cutscene_ending_follow_peach_descent", + "8029127c": "cutscene_ending_peach_descent_lower_focus", + "802912b8": "cutscene_ending_peach_descent_back_to_mario", + "80291354": "cutscene_ending_peach_descends", + "8029142c": "cutscene_ending_mario_to_peach", + "802914cc": "cutscene_ending_look_up_at_castle", + "80291514": "cutscene_ending_peach_wakeup", + "802915d4": "cutscene_ending_dialog", + "80291654": "cutscene_ending_kiss_closeup", + "802916b8": "cutscene_ending_kiss_here_we_go", + "80291774": "cutscene_ending_kiss", + "802917e4": "cutscene_ending_look_at_sky", + "8029184c": "cutscene_ending_zoom_fov", + "80291870": "cutscene_ending_cake_for_mario", + "80291924": "cutscene_ending_stop", + "80291964": "cutscene_grand_star_start", + "802919dc": "cutscene_grand_star_front_of_mario", + "80291ab4": "cutscene_grand_star_mario_jump", + "80291b18": "cutscene_grand_star_accel_cvar2", + "80291b68": "cutscene_grand_star_approach_mario", + "80291bf4": "cutscene_grand_star_move_cvar2", + "80291c3c": "cutscene_grand_star_focus_mario", + "80291cd0": "cutscene_grand_star", + "80291db0": "cutscene_grand_star_fly_start", + "80291e84": "cutscene_grand_star_fly_move_to_mario", + "80291f18": "cutscene_grand_star_fly_mario_offscreen", + "80292038": "cutscene_grand_star_fly_app_cvars", + "80292164": "cutscene_grand_star_fly", + "802921fc": "focus_in_front_of_mario", + "8029228c": "cutscene_dance_move_to_mario", + "80292324": "cutscene_dance_rotate", + "80292370": "cutscene_dance_rotate_move_back", + "802923b8": "cutscene_dance_rotate_move_towards_mario", + "80292414": "cutscene_dance_default_focus_mario", + "8029244c": "cutscene_dance_rotate_focus_mario", + "80292484": "cutscene_dance_shake_fov", + "802924b8": "cutscene_dance_default_rotate", + "80292628": "star_dance_bound_yaw", + "802926dc": "cutscene_dance_closeup_start", + "802927d0": "cutscene_dance_closeup_focus_mario", + "80292868": "cutscene_dance_closeup_fly_above", + "80292974": "cutscene_dance_closeup_fly_closer", + "80292a20": "cutscene_dance_closeup_zoom", + "80292a4c": "cutscene_dance_closeup_shake_fov", + "80292a80": "cutscene_dance_closeup", + "80292c00": "cutscene_dance_fly_away_start", + "80292d80": "cutscene_dance_fly_away_approach_mario", + "80292e2c": "cutscene_dance_fly_away_focus_mario", + "80292ec4": "cutscene_pan_cvar9", + "80292f40": "cutscene_dance_fly_rotate_around_mario", + "80292f98": "cutscene_dance_fly_away_rotate_while_flying", + "80292fe4": "cutscene_dance_fly_away_shake_fov", + "80293018": "cutscene_dance_fly_away", + "802930f0": "cutscene_key_dance_jump_cvar", + "80293164": "cutscene_key_dance_jump_closeup", + "802931c0": "cutscene_key_dance_jump_lower_left", + "80293220": "cutscene_key_dance_jump_above", + "8029328c": "cutscene_key_dance_jump_last", + "802932f4": "cutscene_key_dance_shake_fov", + "80293328": "cutscene_key_dance_handheld_shake", + "80293354": "cutscene_key_dance_focus_mario", + "8029338c": "cutscene_key_dance", + "80293488": "cutscene_bowser_area_shake_fov", + "802934b4": "cutscene_bowser_area_start_bowser_walking", + "802934d8": "cutscene_bowser_arena_set_pos", + "80293548": "cutscene_bowser_arena_focus_sine", + "802935e0": "cutscene_bowser_arena_set_focus", + "80293624": "cutscene_bowser_arena_adjust_offsets", + "8029369c": "cutscene_bowser_arena_pan_left", + "802936dc": "cutscene_bowser_arena_mario_dialog", + "80293708": "cutscene_stop_dialog", + "80293734": "cutscene_bowser_arena_start", + "802937e8": "bowser_fight_intro_dialog", + "8029386c": "cutscene_bowser_arena_dialog", + "802938c8": "cutscene_bowser_arena_end", + "80293944": "cutscene_bowser_arena", + "80293abc": "cutscene_star_spawn_store_info", + "80293ae8": "cutscene_star_spawn_focus_star", + "80293b70": "cutscene_star_spawn_update_boss_fight", + "80293bf4": "cutscene_star_spawn_fly_back", + "80293c2c": "cutscene_star_spawn", + "80293cb0": "cutscene_star_spawn_back", + "80293d5c": "cutscene_star_spawn_end", + "80293d90": "cutscene_exit_waterfall_warp", + "80293dd4": "cutscene_exit_to_castle_grounds_focus_mario", + "80293e7c": "cutscene_exit_waterfall", + "80293ed8": "cutscene_exit_to_castle_grounds_end", + "80293f2c": "cutscene_exit_fall_to_castle_grounds_warp", + "80293f70": "cutscene_exit_fall_to_castle_grounds", + "80293fcc": "cutscene_red_coin_star_start", + "80294024": "cutscene_red_coin_star_focus_xz", + "80294088": "cutscene_red_coin_star_focus_y", + "802940cc": "cutscene_red_coin_star_look_up_at_star", + "8029410c": "cutscene_red_coin_star_warp", + "802942cc": "cutscene_red_coin_star_set_fov", + "802942f0": "cutscene_red_coin_star", + "802943d4": "cutscene_red_coin_star_end", + "80294428": "cutscene_goto_cvar_pos", + "80294718": "cutscene_prepare_cannon_start", + "802947a4": "cutscene_prepare_cannon_fly_to_cannon", + "8029480c": "cannon_approach_prev", + "802948a0": "cutscene_prepare_cannon_fly_back", + "80294a14": "cutscene_prepare_cannon", + "80294a94": "cutscene_prepare_cannon_end", + "80294ae8": "water_death_move_to_mario_side", + "80294b78": "death_goto_mario", + "80294bb4": "cutscene_death_standing_start", + "80294c28": "cutscene_death_standing_goto_mario", + "80294c5c": "cutscene_death_standing", + "80294cc4": "cutscene_death_stomach_start", + "80294d48": "cutscene_death_stomach_goto_mario", + "80294db4": "cutscene_death_stomach", + "80294e24": "cutscene_bbh_death_start", + "80294ea8": "cutscene_bbh_death_goto_mario", + "80294ee8": "cutscene_bbh_death", + "80294f58": "cutscene_quicksand_death_start", + "80294f94": "cutscene_quicksand_death_goto_mario", + "80294fec": "cutscene_quicksand_death", + "802950b0": "cutscene_suffocation_fly_away", + "80295140": "cutscene_suffocation_stay_above_gas", + "802951f0": "cutscene_suffocation_rotate", + "80295270": "cutscene_suffocation", + "80295310": "cutscene_enter_pool_start", + "802953dc": "cutscene_enter_pool_loop", + "80295418": "cutscene_enter_pool", + "80295480": "cutscene_pyramid_top_explode_start", + "802954ec": "cutscene_pyramid_top_explode_zoom_in", + "80295518": "cutscene_pyramid_top_explode_focus", + "80295580": "cutscene_pyramid_top_explode_warp", + "80295670": "cutscene_pyramid_top_explode_closeup", + "80295740": "cutscene_pyramid_top_explode_cam_shake", + "8029576c": "cutscene_pyramid_top_explode_warp_back", + "802957c8": "cutscene_pyramid_top_explode", + "80295894": "cutscene_pyramid_top_explode_end", + "802958d4": "cutscene_enter_pyramid_top_start", + "80295930": "cutscene_enter_pyramid_top", + "80295a58": "cutscene_dialog_start", + "80295bf0": "cutscene_dialog_move_mario_shoulder", + "80295e24": "cutscene_dialog_create_dialog_box", + "80295e8c": "cutscene_dialog", + "80295fb0": "cutscene_dialog_set_flag", + "80295fd8": "cutscene_dialog_end", + "80296020": "cutscene_read_message_start", + "80296160": "cutscene_read_message", + "802962c8": "cutscene_read_message_set_flag", + "802962f0": "cutscene_read_message_end", + "80296318": "cutscene_exit_succ_start", + "802963b8": "cutscene_non_painting_set_cam_pos", + "8029652c": "cutscene_non_painting_set_cam_focus", + "8029665c": "cutscene_exit_bowser_succ_focus_left", + "8029669c": "cutscene_exit_bowser_key_toss_shake", + "802966e4": "cutscene_exit_succ_shake_landing", + "80296710": "cutscene_exit_bowser_succ", + "802967c4": "cutscene_non_painting_end", + "8029685c": "cutscene_exit_non_painting_succ_override_cvar", + "802968a0": "cutscene_exit_non_painting_succ", + "8029695c": "cutscene_non_painting_death_start", + "802969f8": "cutscene_exit_bowser_death", + "80296a64": "cutscene_non_painting_death_override_offset", + "80296b30": "cutscene_non_painting_death", + "80296bc8": "cutscene_cap_switch_press_start", + "80296c4c": "cutscene_cap_switch_press_rotate_around_mario", + "80296d60": "cutscene_cap_switch_press_lower_cam", + "80296da8": "cutscene_cap_switch_press_approach_mario", + "80296eb4": "cutscene_cap_switch_press_pan_left", + "80296f38": "cutscene_cap_switch_press_create_dialog", + "80296fa8": "cutscene_cap_switch_press", + "80297148": "cutscene_unlock_key_door_start", + "8029720c": "cutscene_unlock_key_door_approach_mario", + "80297290": "cutscene_unlock_key_door_focus_lock", + "802972ec": "cutscene_unlock_key_door_stub", + "80297300": "cutscene_unlock_key_door_fly_back", + "80297384": "cutscene_unlock_key_door_fov_shake", + "802973b0": "cutscene_unlock_key_door", + "80297464": "intro_peach_move_camera_start_to_pipe", + "80297560": "peach_letter_text", + "8029758c": "play_sound_peach_reading_letter", + "802975c4": "cutscene_intro_peach_start_to_pipe_spline", + "8029762c": "cutscene_intro_peach_dialog", + "802976bc": "cutscene_intro_peach_follow_pipe_spline", + "80297728": "cutscene_intro_peach_clear_cutscene_status", + "80297748": "cutscene_intro_peach_zoom_fov", + "80297784": "cutscene_intro_peach_reset_spline", + "802977c8": "cutscene_intro_peach_handheld_shake_off", + "802977f4": "intro_pipe_exit_text", + "80297820": "play_sound_intro_turn_on_hud", + "8029784c": "cutscene_intro_peach_fly_to_pipe", + "80297908": "cutscene_intro_peach_mario_appears", + "80297a38": "cutscene_intro_peach_reset_fov", + "80297a64": "cutscene_intro_peach_letter", + "80297b58": "cutscene_end_waving_start", + "80297b84": "cutscene_end_waving", + "80297c14": "cutscene_credits_reset_spline", + "80297c40": "cutscene_credits", + "802980dc": "cutscene_sliding_doors_open_start", + "8029819c": "cutscene_sliding_doors_open_set_cvars", + "80298218": "cutscene_sliding_doors_go_under_doorway", + "80298254": "cutscene_sliding_doors_fly_back_up", + "80298290": "cutscene_sliding_doors_follow_mario", + "802983b4": "cutscene_sliding_doors_open", + "80298458": "cutscene_double_doors_end", + "802984a0": "cutscene_enter_painting_stub", + "802984b4": "cutscene_enter_painting", + "802987b0": "cutscene_exit_painting_start", + "8029894c": "cutscene_exit_painting_move_to_mario", + "802989e8": "cutscene_exit_painting_move_to_floor", + "80298af8": "cutscene_exit_painting", + "80298ba0": "cutscene_unused_exit_start", + "80298c2c": "cutscene_unused_exit_focus_mario", + "80298ccc": "cutscene_exit_painting_end", + "80298d44": "cutscene_enter_cannon_end", + "80298d9c": "cutscene_enter_cannon_raise", + "80298fe8": "cutscene_enter_cannon_start", + "80299100": "cutscene_door_start", + "80299154": "cutscene_door_fix_cam", + "802991a8": "cutscene_door_loop", + "802991f0": "cutscene_door_move_behind_mario", + "802992cc": "cutscene_door_follow_mario", + "80299360": "cutscene_door_end", + "80299404": "cutscene_door_mode", + "802994e8": "play_cutscene", + "8029a2f8": "cutscene_event", + "8029a37c": "cutscene_spawn_obj", + "8029a3b4": "set_fov_shake", + "8029a41c": "set_fov_shake_from_point", + "8029a4d0": "shake_camera_fov", + "8029a5e8": "set_fov_30", + "8029a60c": "approach_fov_20", + "8029a64c": "set_fov_45", + "8029a670": "set_fov_29", + "8029a694": "zoom_fov_30", + "8029a6f4": "fov_default", + "8029a858": "approach_fov_30", + "8029a894": "approach_fov_60", + "8029a8d0": "approach_fov_45", + "8029a968": "approach_fov_80", + "8029a9a4": "set_fov_bbh", + "8029aa3c": "geo_camera_fov", + "8029ab94": "set_fov_function", + "8029abb0": "cutscene_set_fov_shake_preset", + "8029ac30": "set_fov_shake_from_point_preset", + "8029aef8": "obj_rotate_towards_point", + "8029af98": "intro_peach_set_pos_and_opacity", + "8029b08c": "bhv_intro_peach_loop", + "8029b28c": "intro_lakitu_set_offset_from_camera", + "8029b358": "intro_lakitu_set_focus", + "8029b3c8": "intro_lakitu_set_pos_and_focus", + "8029b49c": "bhv_intro_lakitu_loop", + "8029bde4": "bhv_end_birds_1_loop", + "8029bf64": "bhv_end_birds_2_loop", + "8029c0e4": "spawn_child_obj_relative", + "8029c254": "bhv_intro_scene_loop", + "8029c770": "nop_change_course", + "8029c780": "copy_mario_state_to_object", + "8029c9cc": "spawn_particle", + "8029ca58": "bhv_mario_update", + "8029cb34": "update_objects_starting_at", + "8029cbc8": "update_objects_during_time_stop", + "8029cd28": "update_objects_in_list", + "8029cd98": "unload_deactivated_objects_in_list", + "8029ce58": "set_object_respawn_info_bits", + "8029cedc": "unload_objects_from_area", + "8029cfb0": "spawn_objects_from_info", + "8029d1d8": "stub_obj_list_processor_1", + "8029d1e8": "clear_objects", + "8029d324": "update_terrain_objects", + "8029d374": "update_non_terrain_objects", + "8029d428": "unload_deactivated_objects", + "8029d690": "update_objects", + "8029d890": "geo_update_projectile_pos_from_parent", + "8029d924": "geo_update_layer_transparency", + "8029db48": "geo_switch_anim_state", + "8029dbd4": "geo_switch_area", + "8029dcd4": "obj_update_pos_from_parent_transformation", + "8029dda8": "obj_apply_scale_to_matrix", + "8029de80": "create_transformation_from_matrices", + "8029e1b0": "obj_set_held_state", + "8029e27c": "lateral_dist_between_objects", + "8029e2f8": "dist_between_objects", + "8029e398": "cur_obj_forward_vel_approach_upward", + "8029e3e8": "approach_f32_signed", + "8029e494": "approach_f32_symmetric", + "8029e530": "approach_s16_symmetric", + "8029e5ec": "cur_obj_rotate_yaw_toward", + "8029e694": "obj_angle_to_object", + "8029e714": "obj_turn_toward_object", + "8029e8bc": "obj_set_parent_relative_pos", + "8029e914": "obj_set_pos", + "8029e96c": "obj_set_angle", + "8029e9ac": "spawn_object_abs_with_rot", + "8029ea24": "spawn_object_rel_with_rot", + "8029eaac": "spawn_obj_with_transform_flags", + "8029eb04": "spawn_water_droplet", + "8029ed20": "spawn_object_at_origin", + "8029edcc": "spawn_object", + "8029ee24": "try_to_spawn_object", + "8029eeb8": "spawn_object_with_scale", + "8029ef64": "spawn_object_relative", + "8029effc": "spawn_object_relative_with_scale", + "8029f070": "cur_obj_move_using_vel", + "8029f0c8": "obj_copy_graph_y_offset", + "8029f0e0": "obj_copy_pos_and_angle", + "8029f120": "obj_copy_pos", + "8029f148": "obj_copy_angle", + "8029f188": "obj_set_gfx_pos_from_pos", + "8029f1b0": "obj_init_animation", + "8029f200": "linear_mtxf_mul_vec3f", + "8029f274": "linear_mtxf_transpose_mul_vec3f", + "8029f2ec": "obj_apply_scale_to_transform", + "8029f3a8": "obj_copy_scale", + "8029f3d0": "obj_scale_xyz", + "8029f404": "obj_scale", + "8029f430": "cur_obj_scale", + "8029f464": "cur_obj_init_animation", + "8029f4b4": "cur_obj_init_animation_with_sound", + "8029f514": "cur_obj_init_animation_with_accel_and_sound", + "8029f59c": "obj_init_animation_with_sound", + "8029f600": "cur_obj_enable_rendering_and_become_tangible", + "8029f620": "cur_obj_enable_rendering", + "8029f644": "cur_obj_disable_rendering_and_become_intangible", + "8029f66c": "cur_obj_disable_rendering", + "8029f694": "cur_obj_unhide", + "8029f6bc": "cur_obj_hide", + "8029f6e0": "cur_obj_set_pos_relative", + "8029f7d8": "cur_obj_set_pos_relative_to_parent", + "8029f820": "cur_obj_enable_rendering_2", + "8029f848": "cur_obj_unused_init_on_floor", + "8029f8ec": "obj_set_face_angle_to_move_angle", + "8029f914": "get_object_list_from_behavior", + "8029f95c": "cur_obj_nearest_object_with_behavior", + "8029f998": "cur_obj_dist_to_nearest_object_with_behavior", + "8029f9ec": "cur_obj_find_nearest_object_with_behavior", + "8029fb1c": "find_unimportant_object", + "8029fb68": "count_unimportant_objects", + "8029fbdc": "count_objects_with_behavior", + "8029fc9c": "cur_obj_find_nearby_held_actor", + "8029fdb4": "cur_obj_change_action", + "8029fe00": "cur_obj_set_vel_from_mario_vel", + "8029fe6c": "cur_obj_reverse_animation", + "8029fea4": "cur_obj_extend_animation_if_at_end", + "8029ff04": "cur_obj_check_if_near_animation_end", + "8029ffa4": "cur_obj_check_if_at_animation_end", + "802a0008": "cur_obj_check_anim_frame", + "802a0050": "cur_obj_check_anim_frame_in_range", + "802a00ac": "cur_obj_check_frame_prior_current_frame", + "802a0114": "mario_is_in_air_action", + "802a0154": "mario_is_dive_sliding", + "802a0198": "cur_obj_set_y_vel_and_animation", + "802a01d8": "cur_obj_unrender_and_reset_state", + "802a0380": "cur_obj_get_thrown_or_placed", + "802a0474": "cur_obj_get_dropped", + "802a04c0": "cur_obj_set_model", + "802a04f0": "mario_set_flag", + "802a0514": "cur_obj_clear_interact_status_flag", + "802a0568": "obj_mark_for_deletion", + "802a057c": "cur_obj_disable", + "802a05b4": "cur_obj_become_intangible", + "802a05d4": "cur_obj_become_tangible", + "802a05f0": "obj_become_tangible", + "802a0604": "cur_obj_update_floor_height", + "802a064c": "cur_obj_update_floor_height_and_get_floor", + "802a079c": "cur_obj_apply_drag_xz", + "802a0e68": "cur_obj_move_y", + "802a113c": "cur_obj_unused_resolve_wall_collisions", + "802a11a8": "abs_angle_diff", + "802a120c": "cur_obj_move_xz_using_fvel_and_yaw", + "802a12a4": "cur_obj_move_y_with_terminal_vel", + "802a1308": "cur_obj_compute_vel_xz", + "802a1370": "increment_velocity_toward_range", + "802a1424": "obj_check_if_collided_with_object", + "802a148c": "cur_obj_set_behavior", + "802a14c4": "obj_set_behavior", + "802a14fc": "cur_obj_has_behavior", + "802a1554": "obj_has_behavior", + "802a15ac": "cur_obj_lateral_dist_from_mario_to_home", + "802a1634": "cur_obj_lateral_dist_to_home", + "802a16ac": "cur_obj_outside_home_square", + "802a1774": "cur_obj_outside_home_rectangle", + "802a184c": "cur_obj_set_pos_to_home", + "802a188c": "cur_obj_set_pos_to_home_and_stop", + "802a18dc": "cur_obj_shake_y", + "802a1930": "cur_obj_start_cam_event", + "802a1960": "set_mario_interact_hoot_if_in_range", + "802a19ac": "obj_set_billboard", + "802a19c8": "cur_obj_set_hitbox_radius_and_height", + "802a19f0": "cur_obj_set_hurtbox_radius_and_height", + "802a1b34": "obj_spawn_loot_blue_coins", + "802a1b8c": "obj_spawn_loot_yellow_coins", + "802a1bdc": "cur_obj_spawn_loot_coin_at_mario_pos", + "802a1c68": "cur_obj_abs_y_dist_to_home", + "802a1cc4": "cur_obj_advance_looping_anim", + "802a1f3c": "cur_obj_resolve_wall_collisions", + "802a2320": "cur_obj_update_floor_and_walls", + "802a2348": "cur_obj_move_standard", + "802a25b4": "cur_obj_move_using_vel_and_gravity", + "802a2644": "cur_obj_move_using_fvel_and_gravity", + "802a2674": "obj_set_pos_relative", + "802a2748": "cur_obj_angle_to_home", + "802a27b0": "obj_set_gfx_pos_at_obj_pos", + "802a2804": "obj_translate_local", + "802a2930": "obj_build_transform_from_pos_and_angle", + "802a2a18": "obj_set_throw_matrix_from_transform", + "802a2a84": "obj_build_transform_relative_to_parent", + "802a2b28": "obj_create_transform_from_self", + "802a2b6c": "cur_obj_rotate_move_angle_using_vel", + "802a2bc4": "cur_obj_rotate_face_angle_using_vel", + "802a2c1c": "cur_obj_set_face_angle_to_move_angle", + "802a2c5c": "cur_obj_follow_path", + "802a2ed4": "chain_segment_init", + "802a2f14": "random_f32_around_zero", + "802a2f5c": "obj_scale_random", + "802a2fc0": "obj_translate_xyz_random", + "802a308c": "obj_translate_xz_random", + "802a31e0": "cur_obj_set_pos_via_transform", + "802a3268": "cur_obj_reflect_move_angle_off_wall", + "802a32ac": "cur_obj_spawn_particles", + "802a34a4": "obj_set_hitbox", + "802a3604": "signum_positive", + "802a3634": "absf", + "802a3674": "absi", + "802a36a4": "cur_obj_wait_then_blink", + "802a3754": "cur_obj_is_mario_ground_pounding_platform", + "802a37ac": "spawn_mist_particles", + "802a37dc": "spawn_mist_particles_with_sound", + "802a3818": "cur_obj_push_mario_away", + "802a390c": "cur_obj_push_mario_away_from_cylinder", + "802a399c": "bhv_dust_smoke_loop", + "802a3a4c": "cur_obj_set_direction_table", + "802a3a88": "cur_obj_progress_direction_table", + "802a3b28": "stub_obj_helpers_3", + "802a3b40": "cur_obj_scale_over_time", + "802a3c18": "cur_obj_set_pos_to_home_with_debug", + "802a3cec": "stub_obj_helpers_4", + "802a3cfc": "cur_obj_is_mario_on_platform", + "802a3d40": "cur_obj_shake_y_until", + "802a3dd4": "cur_obj_move_up_and_down", + "802a3e30": "cur_obj_call_action_function", + "802a3ef8": "spawn_base_star_with_no_lvl_exit", + "802a3f24": "bit_shift_left", + "802a3f48": "cur_obj_mario_far_away", + "802a404c": "is_mario_moving_fast_or_in_air", + "802a40b8": "is_item_in_array", + "802a4120": "bhv_init_room", + "802a4210": "cur_obj_enable_rendering_if_mario_in_room", + "802a4360": "cur_obj_set_hitbox_and_die_if_attacked", + "802a4440": "obj_explode_and_spawn_coins", + "802a44f4": "obj_set_collision_data", + "802a452c": "cur_obj_if_hit_wall_bounce_away", + "802a4564": "cur_obj_hide_if_mario_far_away_y", + "802a45e4": "geo_offset_klepto_held_object", + "802a462c": "geo_offset_klepto_debug", + "802a46cc": "obj_is_hidden", + "802a4704": "enable_time_stop", + "802a4728": "disable_time_stop", + "802a4750": "set_time_stop_flags", + "802a4774": "clear_time_stop_flags", + "802a47a0": "cur_obj_can_mario_activate_textbox", + "802a48bc": "cur_obj_can_mario_activate_textbox_2", + "802a4960": "cur_obj_update_dialog", + "802a4be4": "cur_obj_update_dialog_with_cutscene", + "802a4f04": "cur_obj_has_model", + "802a4f58": "cur_obj_align_gfx_with_floor", + "802a5034": "mario_is_within_rectangle", + "802a50fc": "cur_obj_shake_screen", + "802a513c": "obj_attack_collided_from_other_object", + "802a51ac": "cur_obj_was_attacked_or_ground_pounded", + "802a5228": "obj_copy_behavior_params", + "802a5248": "cur_obj_init_animation_and_anim_frame", + "802a5288": "cur_obj_init_animation_and_check_if_near_end", + "802a52c4": "cur_obj_init_animation_and_extend_if_at_end", + "802a52f8": "cur_obj_check_grabbed_mario", + "802a5358": "player_performed_grab_escape_action", + "802a540c": "cur_obj_unused_play_footstep_sound", + "802a5460": "enable_time_stop_including_mario", + "802a5498": "disable_time_stop_including_mario", + "802a54d8": "cur_obj_check_interacted", + "802a5524": "cur_obj_spawn_loot_blue_coin", + "802a5588": "cur_obj_spawn_star_at_y_offset", + "802a5620": "star_door_update_pos", + "802a56bc": "bhv_star_door_loop", + "802a58dc": "bhv_piranha_particle_loop", + "802a597c": "mr_i_piranha_particle_act_0", + "802a5a44": "mr_i_piranha_particle_act_1", + "802a5aa0": "bhv_mr_i_particle_loop", + "802a5acc": "spawn_mr_i_particle", + "802a5bd4": "bhv_mr_i_body_loop", + "802a5d4c": "mr_i_act_3", + "802a6518": "mr_i_act_2", + "802a68a0": "mr_i_act_1", + "802a6ad8": "mr_i_act_0", + "802a6b7c": "bhv_mr_i_loop", + "802a6c20": "bhv_pole_init", + "802a6c74": "bhv_giant_pole_loop", + "802a6cf4": "bhv_thi_huge_island_top_loop", + "802a6d64": "bhv_thi_tiny_island_top_loop", + "802a6ee4": "cap_switch_act_0", + "802a7020": "cap_switch_act_1", + "802a708c": "cap_switch_act_2", + "802a7160": "cap_switch_act_3", + "802a7170": "bhv_cap_switch_loop", + "802a719c": "geo_update_held_mario_pos", + "802a7230": "bhv_bobomb_anchor_mario_loop", + "802a7264": "king_bobomb_act_0", + "802a7384": "mario_is_far_below_object", + "802a73d8": "king_bobomb_act_2", + "802a7598": "king_bobomb_act_3", + "802a7804": "king_bobomb_act_1", + "802a78d8": "king_bobomb_act_6", + "802a7a60": "king_bobomb_act_7", + "802a7b1c": "king_bobomb_act_8", + "802a7b5c": "king_bobomb_act_4", + "802a7d14": "king_bobomb_act_5", + "802a7fbc": "king_bobomb_move", + "802a8064": "bhv_king_bobomb_loop", + "802a816c": "bhv_beta_chest_bottom_init", + "802a81e8": "bhv_beta_chest_bottom_loop", + "802a821c": "bhv_beta_chest_lid_loop", + "802a8370": "bhv_water_air_bubble_init", + "802a83a0": "bhv_water_air_bubble_loop", + "802a8630": "bhv_bubble_wave_init", + "802a86bc": "scale_bubble_random", + "802a870c": "bhv_bubble_maybe_loop", + "802a88a4": "bhv_small_water_wave_loop", + "802a8a38": "scale_bubble_sin", + "802a8b18": "bhv_particle_init", + "802a8bc0": "bhv_particle_loop", + "802a8c88": "bhv_small_bubbles_loop", + "802a8cdc": "bhv_fish_group_loop", + "802a8d48": "bhv_water_waves_init", + "802a8d98": "bhv_cannon_base_unused_loop", + "802a8dc0": "opened_cannon_act_0", + "802a8f40": "opened_cannon_act_4", + "802a9114": "opened_cannon_act_6", + "802a92fc": "opened_cannon_act_5", + "802a93f8": "opened_cannon_act_1", + "802a9440": "opened_cannon_act_2", + "802a9460": "opened_cannon_act_3", + "802a9498": "bhv_cannon_base_loop", + "802a94f8": "bhv_cannon_barrel_loop", + "802a958c": "common_anchor_mario_behavior", + "802a9708": "bhv_chuckya_anchor_mario_loop", + "802a973c": "unknown_chuckya_function", + "802a98c4": "approach_forward_vel", + "802a9994": "chuckya_act_0", + "802a9d08": "chuckya_act_1", + "802a9f54": "chuckya_act_3", + "802a9fc8": "chuckya_act_2", + "802aa02c": "chuckya_move", + "802aa0ac": "bhv_chuckya_loop", + "802aa1b8": "bhv_wf_breakable_wall_loop", + "802aa280": "check_mario_attacking", + "802aa3c8": "init_kickable_board_rock", + "802aa3f4": "bhv_kickable_board_loop", + "802aa700": "bhv_tower_door_loop", + "802aa774": "bhv_wf_rotating_wooden_platform_loop", + "802aa830": "bhv_rotating_platform_loop", + "802aa948": "set_koopa_shell_underwater_hitbox", + "802aa97c": "bhv_koopa_shell_underwater_loop", + "802aaa60": "bhv_warp_loop", + "802aab54": "bhv_fading_warp_loop", + "802aac48": "bhv_white_puff_exploding_loop", + "802aae8c": "spawn_mist_particles_variable", + "802aaf48": "bhv_spawned_star_init", + "802aaffc": "set_sparkle_spawn_star_hitbox", + "802ab060": "set_home_to_mario", + "802ab158": "set_y_home_to_pos", + "802ab18c": "slow_star_rotation", + "802ab1c8": "bhv_spawned_star_loop", + "802ab558": "bhv_spawn_star_no_level_exit", + "802ab5c8": "bhv_coin_sparkles_init", + "802ab650": "bhv_yellow_coin_init", + "802ab70c": "bhv_yellow_coin_loop", + "802ab748": "bhv_temp_coin_loop", + "802ab7a4": "bhv_coin_init", + "802ab860": "bhv_coin_loop", + "802aba40": "bhv_coin_formation_spawn_loop", + "802abc04": "spawn_coin_in_formation", + "802abee4": "bhv_coin_formation_init", + "802abf0c": "bhv_coin_formation_loop", + "802ac068": "coin_inside_boo_act_1", + "802ac15c": "coin_inside_boo_act_0", + "802ac294": "bhv_coin_inside_boo_loop", + "802ac2c0": "bhv_coin_sparkles_loop", + "802ac2ec": "bhv_golden_coin_sparkles_loop", + "802ac3a8": "bhv_punch_tiny_triangle_loop", + "802ac4a0": "bhv_punch_tiny_triangle_init", + "802ac5b4": "bhv_wall_tiny_star_particle_loop", + "802ac678": "bhv_tiny_star_particles_init", + "802ac78c": "bhv_pound_tiny_star_particle_loop", + "802ac864": "bhv_pound_tiny_star_particle_init", + "802ac910": "door_animation_and_reset", + "802ac958": "set_door_camera_event", + "802ac9d0": "play_door_open_noise", + "802aca6c": "play_warp_door_open_noise", + "802acac8": "bhv_door_loop", + "802acc3c": "bhv_door_init", + "802ace80": "bhv_star_door_loop_2", + "802ad078": "grindel_thwomp_act_4", + "802ad10c": "grindel_thwomp_act_2", + "802ad1a4": "grindel_thwomp_act_3", + "802ad238": "grindel_thwomp_act_1", + "802ad2d0": "grindel_thwomp_act_0", + "802ad34c": "bhv_grindel_thwomp_loop", + "802ad378": "bhv_tumbling_bridge_platform_loop", + "802ad580": "tumbling_bridge_act_1", + "802ad76c": "tumbling_bridge_act_2", + "802ad7f4": "tumbling_bridge_act_3", + "802ad828": "tumbling_bridge_act_0", + "802ad890": "bhv_tumbling_bridge_loop", + "802ad8bc": "elevator_starting_shake", + "802ad8f0": "elevator_act_0", + "802ada4c": "elevator_act_1", + "802adb88": "elevator_act_2", + "802adce4": "elevator_act_4", + "802add70": "elevator_act_3", + "802addf8": "bhv_elevator_init", + "802adf6c": "bhv_elevator_loop", + "802adf98": "bhv_water_mist_spawn_loop", + "802adfd8": "bhv_water_mist_loop", + "802ae0cc": "spawn_triangle_break_particles", + "802ae238": "bhv_water_mist_2_loop", + "802ae304": "bhv_pound_white_puffs_init", + "802ae334": "spawn_mist_from_global", + "802ae360": "bhv_ground_sand_init", + "802ae394": "spawn_smoke_with_velocity", + "802ae45c": "clear_particle_flags", + "802ae48c": "bhv_ground_snow_init", + "802ae4c0": "spawn_wind_particles", + "802ae534": "bhv_wind_loop", + "802ae85c": "bhv_unused_particle_spawn_loop", + "802ae908": "bhv_ukiki_cage_star_loop", + "802aea6c": "ukiki_cage_act_wait_for_ukiki", + "802aeab8": "ukiki_cage_act_spin", + "802aeb1c": "ukiki_cage_act_fall", + "802aeb74": "ukiki_cage_act_hide", + "802aeb9c": "bhv_ukiki_cage_loop", + "802aebc8": "bhv_squishable_platform_loop", + "802aec40": "bhv_bitfs_sinking_platform_loop", + "802aeca8": "bhv_ddd_moving_pole_loop", + "802aecdc": "bhv_bitfs_sinking_cage_platform_loop", + "802aedc0": "bhv_beta_moving_flames_spawn_loop", + "802aeea4": "bhv_beta_moving_flames_loop", + "802aef1c": "bhv_flamethrower_flame_loop", + "802af1e8": "bhv_flamethrower_loop", + "802af3fc": "bhv_rr_rotating_bridge_platform_loop", + "802af448": "bhv_bouncing_fireball_flame_loop", + "802af5f8": "bhv_bouncing_fireball_loop", + "802af7c4": "bhv_bowser_shock_wave_loop", + "802af9cc": "bhv_black_smoke_upward_loop", + "802afa0c": "bhv_black_smoke_bowser_loop", + "802afae4": "bhv_black_smoke_mario_loop", + "802afbf8": "bhv_flame_mario_loop", + "802afce4": "bhv_beta_fish_splash_spawner_loop", + "802afd1c": "bhv_spindrift_loop", + "802afee8": "bhv_wf_solid_tower_platform_loop", + "802aff30": "bhv_wf_elevator_tower_platform_loop", + "802b00e4": "bhv_wf_sliding_tower_platform_loop", + "802b0244": "spawn_and_init_wf_platforms", + "802b039c": "spawn_wf_platform_group", + "802b04b4": "bhv_tower_platform_group_loop", + "802b0614": "bhv_tree_snow_or_leaf_loop", + "802b0974": "bhv_snow_leaf_particle_spawn_init", + "802b0b9c": "square_plat_set_yaw_until_timer", + "802b0bec": "bhv_squarish_path_moving_loop", + "802b0d48": "bhv_piranha_plant_waking_bubbles_loop", + "802b0df0": "bhv_piranha_plant_bubble_loop", + "802b1278": "bhv_purple_switch_loop", + "802b14f4": "check_if_moving_over_floor", + "802b15e8": "bhv_pushable_loop", + "802b1714": "breakable_box_init", + "802b17f4": "hidden_breakable_box_actions", + "802b19d8": "hidden_unbreakable_box_actions", + "802b1ae0": "bhv_hidden_object_loop", + "802b1b2c": "bhv_breakable_box_loop", + "802b1bb0": "geo_move_mario_part_from_parent", + "802b1c54": "bhv_heave_ho_throw_mario_loop", + "802b1d7c": "heave_ho_act_1", + "802b1e6c": "heave_ho_act_2", + "802b1ff4": "heave_ho_act_3", + "802b20a0": "heave_ho_act_0", + "802b2154": "heave_ho_move", + "802b2278": "bhv_heave_ho_loop", + "802b2340": "bhv_ccm_touched_star_spawn_loop", + "802b23e0": "bhv_unused_poundable_platform", + "802b2494": "bhv_beta_trampoline_spring_loop", + "802b25ac": "bhv_beta_trampoline_top_loop", + "802b26a4": "jumping_box_act_0", + "802b27d8": "jumping_box_act_1", + "802b2824": "jumping_box_free_update", + "802b288c": "bhv_jumping_box_loop", + "802b29b8": "bhv_boo_cage_loop", + "802b2bc8": "spawn_sparkle_particles", + "802b2d10": "bhv_alpha_boo_key_loop", + "802b3108": "bhv_beta_boo_key_loop", + "802b3134": "arc_to_goal_pos", + "802b3250": "grand_star_zero_velocity", + "802b329c": "bhv_grand_star_loop", + "802b3600": "bhv_bowser_key_loop", + "802b37b8": "bhv_white_puff_smoke_init", + "802b3810": "bhv_bullet_bill_init", + "802b3830": "bullet_bill_act_0", + "802b38b8": "bullet_bill_act_1", + "802b394c": "bullet_bill_act_2", + "802b3b08": "bullet_bill_act_3", + "802b3b24": "bullet_bill_act_4", + "802b3be0": "bhv_bullet_bill_loop", + "802b3c2c": "bowser_tail_anchor_act_0", + "802b3cdc": "bowser_tail_anchor_act_1", + "802b3d10": "bowser_tail_anchor_act_2", + "802b3d74": "bhv_bowser_tail_anchor_loop", + "802b3df4": "bhv_bowser_flame_spawn_loop", + "802b4080": "bhv_bowser_body_anchor_loop", + "802b4184": "bowser_spawn_shockwave", + "802b41fc": "bowser_bounce", + "802b4288": "bowser_set_anim_look_up_and_walk", + "802b4300": "bowser_set_anim_slow_gait", + "802b4368": "bowser_set_anim_look_down", + "802b43dc": "bowser_initialize_action", + "802b4478": "bowser_act_text_wait", + "802b44bc": "bowser_act_intro_walk", + "802b45f4": "bowser_bitdw_act_controller", + "802b473c": "bowser_bitfs_act_controller", + "802b48d4": "bowser_general_bits_act_controller", + "802b4a1c": "bowser_set_act_jump", + "802b4a3c": "bowser_bits_act_controller", + "802b4af4": "bowser_reset_fallen_off_stage", + "802b4bac": "bowser_act_unused_slow_walk", + "802b4be8": "bowser_act_default", + "802b4ca4": "bowser_act_breath_fire", + "802b4d14": "bowser_act_walk_to_mario", + "802b4f00": "bowser_act_teleport", + "802b5104": "bowser_act_spit_fire_into_sky", + "802b5218": "bowser_act_hit_mine", + "802b53f4": "bowser_set_anim_in_air", + "802b5444": "bowser_land", + "802b5554": "bowser_short_second_hop", + "802b55cc": "bowser_act_jump", + "802b5798": "bowser_act_jump_towards_mario", + "802b58bc": "bowser_act_hit_edge", + "802b59cc": "bowser_act_spit_fire_onto_floor", + "802b5aec": "bowser_turn_on_timer", + "802b5c00": "bowser_act_turn_from_edge", + "802b5c40": "bowser_act_charge_mario", + "802b5f6c": "bowser_check_hit_mine", + "802b5fec": "bowser_act_thrown_dropped", + "802b611c": "bowser_set_goal_invisible", + "802b6190": "bowser_act_jump_onto_stage", + "802b6568": "bowser_act_dance", + "802b65d0": "bowser_spawn_grand_star_key", + "802b6670": "bowser_fly_back_dead", + "802b6730": "bowser_dead_bounce", + "802b67d4": "bowser_dead_wait_for_mario", + "802b6878": "bowser_dead_twirl_into_trophy", + "802b6a10": "bowser_dead_hide", + "802b6a78": "bowser_dead_not_bits_end", + "802b6bac": "bowser_dead_bits_end", + "802b6cf0": "bowser_act_dead", + "802b6e40": "bowser_tilt_platform", + "802b6ee0": "bowser_act_ride_tilting_platform", + "802b711c": "bowser_check_fallen_off_stage", + "802b71e4": "bowser_free_update", + "802b72d4": "bowser_held_update", + "802b7418": "bowser_thrown_dropped_update", + "802b75a4": "bhv_bowser_loop", + "802b7878": "bhv_bowser_init", + "802b798c": "geo_update_body_rot_from_parent", + "802b7a20": "bowser_open_eye_switch", + "802b7c64": "geo_switch_bowser_eyes", + "802b7d44": "geo_bits_bowser_coloring", + "802b7e68": "falling_bowser_plat_act_0", + "802b7ef0": "falling_bowser_plat_act_1", + "802b8024": "falling_bowser_plat_act_2", + "802b8384": "bhv_falling_bowser_platform_loop", + "802b83b0": "bowser_flame_despawn", + "802b8434": "bowser_flame_should_despawn", + "802b84ac": "bhv_flame_bowser_init", + "802b85b0": "bhv_flame_large_burning_out_init", + "802b8654": "bowser_flame_move", + "802b8734": "bhv_flame_bowser_loop", + "802b8960": "bhv_flame_moving_forward_growing_init", + "802b89ec": "bhv_flame_moving_forward_growing_loop", + "802b8b1c": "bhv_flame_floating_landing_init", + "802b8c38": "bhv_flame_floating_landing_loop", + "802b8d68": "bhv_blue_bowser_flame_init", + "802b8e7c": "bhv_blue_bowser_flame_loop", + "802b9034": "bhv_flame_bouncing_init", + "802b90ec": "bhv_flame_bouncing_loop", + "802b921c": "bhv_blue_flames_group_loop", + "802b935c": "bhv_blue_fish_movement_loop", + "802b9790": "bhv_tank_fish_group_loop", + "802b98d4": "vec3f_copy_2", + "802b98fc": "bhv_checkerboard_elevator_group_init", + "802b9a78": "checkerboard_plat_act_move_y", + "802b9af8": "checkerboard_plat_act_rotate", + "802b9bb4": "bhv_checkerboard_platform_init", + "802b9bd8": "bhv_checkerboard_platform_loop", + "802b9e94": "bhv_ddd_warp_loop", + "802b9efc": "water_level_pillar_undrained", + "802ba13c": "water_level_pillar_drained", + "802ba19c": "bhv_water_level_pillar_init", + "802ba1e0": "bhv_water_level_pillar_loop", + "802ba25c": "bhv_invisible_objects_under_bridge_init", + "802ba2b0": "geo_scale_bowser_key", + "802ba2f8": "bhv_bowser_key_unlock_door_loop", + "802ba458": "bhv_bowser_key_course_exit_loop", + "802ba5bc": "bhv_moat_grills_loop", + "802ba608": "bhv_rotating_clock_arm_loop", + "802ba7e0": "handle_hat_ukiki_reset", + "802ba868": "is_hat_ukiki_and_mario_has_hat", + "802ba8c4": "geo_update_projectile_pos_from_parent_copy", + "802ba958": "idle_ukiki_taunt", + "802bab7c": "ukiki_act_idle", + "802bae40": "ukiki_act_return_home", + "802baec4": "ukiki_act_wait_to_respawn", + "802baf10": "ukiki_act_unused_turn", + "802baf64": "ukiki_act_turn_to_mario", + "802bb07c": "ukiki_act_run", + "802bb288": "ukiki_act_jump", + "802bb3b8": "ukiki_act_go_to_cage", + "802bb798": "ukiki_free_loop", + "802bb888": "cage_ukiki_held_loop", + "802bba3c": "hat_ukiki_held_loop", + "802bbb98": "bhv_ukiki_init", + "802bbc0c": "bhv_ukiki_loop", + "802bbd6c": "lll_octagonal_mesh_move", + "802bbfd8": "lll_octagonal_mesh_find_y_offset", + "802bc0f0": "bhv_lll_moving_octagonal_mesh_platform_loop", + "802bc22c": "bhv_lll_sinking_rock_block_loop", + "802bc294": "bhv_lll_rotating_hex_flame_loop", + "802bc348": "fire_bar_spawn_flames", + "802bc4f4": "fire_bar_act_0", + "802bc538": "fire_bar_act_1", + "802bc590": "fire_bar_act_2", + "802bc5fc": "fire_bar_act_3", + "802bc618": "bhv_lll_rotating_block_fire_bars_loop", + "802bc660": "bhv_lll_wood_piece_loop", + "802bc728": "bhv_lll_floating_wood_bridge_loop", + "802bc898": "bhv_volcano_flames_loop", + "802bc934": "hexagonal_ring_spawn_flames", + "802bca74": "bhv_lll_rotating_hexagonal_ring_loop", + "802bcce8": "sinking_rectangular_plat_actions", + "802bcda8": "bhv_lll_sinking_rectangular_platform_loop", + "802bce58": "bhv_lll_sinking_square_platforms_loop", + "802bce9c": "create_transform_from_normals", + "802bcf40": "bhv_platform_normals_init", + "802bcfc4": "approach_by_increment", + "802bd058": "bhv_tilting_inverted_pyramid_loop", + "802bd3e4": "koopa_shell_spawn_water_drop", + "802bd488": "bhv_koopa_shell_flame_loop", + "802bd5dc": "bhv_koopa_shell_flame_spawn", + "802bd62c": "koopa_shell_spawn_sparkles", + "802bd680": "bhv_koopa_shell_loop", + "802bd8d0": "tox_box_shake_screen", + "802bd91c": "tox_box_move", + "802bdb04": "tox_box_act_4", + "802bdb3c": "tox_box_act_5", + "802bdb74": "tox_box_act_6", + "802bdbac": "tox_box_act_7", + "802bdbe4": "tox_box_act_1", + "802bdc7c": "tox_box_act_2", + "802bdcc8": "tox_box_act_3", + "802bdd14": "tox_box_act_0", + "802bdd68": "bhv_tox_box_loop", + "802bdd9c": "piranha_plant_act_idle", + "802bde10": "piranha_plant_check_interactions", + "802bdeec": "piranha_plant_act_sleeping", + "802be034": "piranha_plant_act_woken_up", + "802be0b8": "piranha_plant_reset_when_far", + "802be0ec": "piranha_plant_attacked", + "802be150": "piranha_plant_act_shrink_and_die", + "802be234": "piranha_plant_act_wait_to_respawn", + "802be278": "piranha_plant_act_respawn", + "802be350": "piranha_plant_act_biting", + "802be49c": "mario_moving_fast_enough_to_make_piranha_plant_bite", + "802be50c": "piranha_plant_act_stopped_biting", + "802be5a0": "bhv_piranha_plant_loop", + "802be628": "bhv_lll_bowser_puzzle_spawn_piece", + "802be6d4": "bhv_lll_bowser_puzzle_spawn_pieces", + "802be79c": "bhv_lll_bowser_puzzle_loop", + "802be8a8": "bhv_lll_bowser_puzzle_piece_action_0", + "802be8b8": "bhv_lll_bowser_puzzle_piece_action_1", + "802be8f4": "bhv_lll_bowser_puzzle_piece_update", + "802be9dc": "bhv_lll_bowser_puzzle_piece_move", + "802beb14": "bhv_lll_bowser_puzzle_piece_idle", + "802beb54": "bhv_lll_bowser_puzzle_piece_move_left", + "802beb8c": "bhv_lll_bowser_puzzle_piece_move_right", + "802bebc4": "bhv_lll_bowser_puzzle_piece_move_up", + "802bebfc": "bhv_lll_bowser_puzzle_piece_move_down", + "802bec34": "bhv_lll_bowser_puzzle_piece_loop", + "802becb0": "set_obj_anim_with_accel_and_sound", + "802bed7c": "play_penguin_walking_sound", + "802bedec": "tuxies_mother_act_2", + "802bef8c": "tuxies_mother_act_1", + "802bf1d8": "tuxies_mother_act_0", + "802bf3c0": "bhv_tuxies_mother_loop", + "802bf424": "small_penguin_dive_with_mario", + "802bf474": "small_penguin_act_2", + "802bf57c": "small_penguin_act_1", + "802bf648": "small_penguin_act_3", + "802bf6e4": "small_penguin_act_4", + "802bf760": "small_penguin_act_0", + "802bf90c": "small_penguin_act_5", + "802bfa14": "small_penguin_free_actions", + "802bfa88": "bhv_small_penguin_loop", + "802bfbac": "geo_switch_tuxie_mother_eyes", + "802bfcd8": "fish_act_spawn", + "802bfeb8": "fish_act_respawn", + "802bff20": "fish_act_init", + "802bff3c": "bhv_large_fish_group_loop", + "802bff68": "fish_regroup", + "802c00b4": "fish_group_act_rotation", + "802c0348": "fish_group_act_move", + "802c06a8": "fish_group_act_animate", + "802c0768": "bhv_fish_loop", + "802c08a8": "bhv_wdw_express_elevator_loop", + "802c0aac": "bub_spawner_act_0", + "802c0b50": "bub_spawner_act_1", + "802c0ba4": "bub_spawner_act_2", + "802c0bc4": "bub_spawner_act_3", + "802c0be0": "bhv_bub_spawner_loop", + "802c0c0c": "bub_move_vertically", + "802c0cd4": "bub_act_0", + "802c0d44": "bub_act_1", + "802c0f90": "bub_act_2", + "802c1204": "bhv_bub_loop", + "802c12c0": "bhv_rotating_exclamation_box_loop", + "802c1308": "exclamation_box_act_0", + "802c13ec": "exclamation_box_act_1", + "802c14b0": "exclamation_box_act_2", + "802c15b8": "exclamation_box_act_3", + "802c17bc": "exclamation_box_spawn_contents", + "802c18d0": "exclamation_box_act_4", + "802c1988": "exclamation_box_act_5", + "802c19c0": "bhv_exclamation_box_loop", + "802c19fc": "bhv_sound_spawner_init", + "802c1a40": "bhv_bowsers_sub_loop", + "802c1a80": "bhv_sushi_shark_collision_loop", + "802c1a90": "bhv_sushi_shark_loop", + "802c1c44": "bhv_sunken_ship_part_loop", + "802c1cd4": "bhv_ship_part_3_loop", + "802c1e10": "bhv_jrb_sliding_box_loop", + "802c2190": "bhv_white_puff_1_loop", + "802c2274": "bhv_white_puff_2_loop", + "802c22b8": "bhv_hidden_blue_coin_loop", + "802c242c": "bhv_blue_coin_switch_loop", + "802c263c": "bhv_openable_cage_door_loop", + "802c26f8": "bhv_openable_grill_loop", + "802c2930": "bhv_init_changing_water_level_loop", + "802c2a24": "bhv_water_level_diamond_loop", + "802c2ce8": "tweester_scale_and_move", + "802c2ebc": "tweester_act_idle", + "802c2fbc": "tweester_act_chase", + "802c31c4": "tweester_act_hide", + "802c329c": "bhv_tweester_loop", + "802c32e8": "bhv_tweester_sand_particle_loop", + "802c3440": "bhv_boo_init", + "802c3684": "bhv_courtyard_boo_triplet_init", + "802c4824": "bhv_boo_loop", + "802c4f30": "bhv_big_boo_loop", + "802c515c": "bhv_boo_with_cage_init", + "802c51d4": "bhv_boo_with_cage_loop", + "802c5224": "bhv_merry_go_round_boo_manager_loop", + "802c53cc": "obj_set_secondary_camera_focus", + "802c53ec": "bhv_animated_texture_loop", + "802c5414": "bhv_boo_in_castle_loop", + "802c5688": "bhv_boo_boss_spawned_bridge_loop", + "802c5890": "bhv_bbh_tilting_trap_platform_loop", + "802c5a38": "bhv_haunted_bookshelf_loop", + "802c5ca8": "bhv_merry_go_round_loop", + "802c5dc0": "bhv_static_checkered_platform_loop", + "802c5f48": "bhv_beta_bowser_anchor_loop", + "802c5fdc": "bhv_play_music_track_when_touched_loop", + "802c6050": "bhv_floor_trap_in_castle_loop", + "802c60ac": "bhv_castle_floor_trap_init", + "802c6150": "bhv_castle_floor_trap_open_detect", + "802c61d4": "bhv_castle_floor_trap_open", + "802c6278": "bhv_castle_floor_trap_close_detect", + "802c62bc": "bhv_castle_floor_trap_close", + "802c6328": "bhv_castle_floor_trap_rotate", + "802c6348": "bhv_castle_floor_trap_loop", + "802c63e8": "bhv_pole_base_loop", + "802c64a4": "bhv_sparkle_spawn_loop", + "802c6538": "update_angle_from_move_flags", + "802c65c0": "bhv_scuttlebug_loop", + "802c6b6c": "bhv_scuttlebug_spawn_loop", + "802c6ca0": "whomp_play_sfx_from_pound_animation", + "802c6d6c": "whomp_act_0", + "802c6ec8": "whomp_act_7", + "802c6fb0": "whomp_act_1", + "802c710c": "whomp_act_2", + "802c7254": "whomp_act_3", + "802c72b4": "whomp_act_4", + "802c7380": "whomp_act_5", + "802c7428": "king_whomp_on_ground", + "802c75fc": "whomp_on_ground", + "802c76d4": "whomp_act_6", + "802c7858": "whomp_act_8", + "802c7998": "whomp_act_9", + "802c79d8": "bhv_whomp_loop", + "802c7a70": "bhv_water_splash_spawn_droplets", + "802c7b14": "bhv_water_droplet_loop", + "802c7cac": "bhv_idle_water_wave_loop", + "802c7d40": "bhv_water_droplet_splash_init", + "802c7d90": "bhv_bubble_splash_init", + "802c7dfc": "bhv_shallow_water_splash_init", + "802c7e5c": "bhv_wave_trail_shrink", + "802c7f98": "bhv_strong_wind_particle_loop", + "802c81b4": "cur_obj_spawn_strong_wind_particles", + "802c834c": "bhv_sl_snowman_wind_loop", + "802c863c": "bhv_sl_walking_penguin_loop", + "802c89f0": "update_mario_platform", + "802c8b4c": "get_mario_pos", + "802c8b8c": "set_mario_pos", + "802c8bc8": "apply_platform_displacement", + "802c8ec0": "apply_mario_platform_displacement", + "802c8f28": "clear_mario_platform", + "802c8f40": "debug_print_obj_collision", + "802c8fe4": "detect_object_hitbox_overlap", + "802c91ec": "detect_object_hurtbox_overlap", + "802c9388": "clear_object_collision", + "802c93f8": "check_collision_in_list", + "802c94ac": "check_player_object_collision", + "802c95b4": "check_pushable_object_collision", + "802c9630": "check_destructive_object_collision", + "802c9724": "detect_object_collisions", + "802c97d0": "unused_init_free_list", + "802c9840": "unused_try_allocate", + "802c98a4": "try_allocate_object", + "802c9950": "unused_deallocate", + "802c99b8": "init_free_object_list", + "802c9a3c": "clear_object_lists", + "802c9b68": "unload_object", + "802c9c00": "allocate_object", + "802c9f04": "create_object", + "802ca028": "mark_obj_for_deletion", + "802ca040": "exec_anim_sound_state", + "802ca144": "create_sound_spawner", + "802ca190": "cur_obj_play_sound_1", + "802ca1e0": "cur_obj_play_sound_2", + "802ca230": "calc_dist_to_volume_range_1", + "802ca2d4": "calc_dist_to_volume_range_2", + "802ca370": "stub_debug_1", + "802ca380": "stub_debug_2", + "802ca390": "stub_debug_3", + "802ca3a0": "stub_debug_4", + "802ca3b0": "get_current_clock", + "802ca3e0": "get_clock_difference", + "802ca418": "set_print_state_info", + "802ca460": "print_text_array_info", + "802ca51c": "set_text_array_x_y", + "802ca568": "print_debug_bottom_up", + "802ca5b8": "print_debug_top_down_objectinfo", + "802ca618": "print_debug_top_down_mapinfo", + "802ca680": "print_debug_top_down_normal", + "802ca6d0": "print_mapinfo", + "802ca8e8": "print_checkinfo", + "802ca918": "print_surfaceinfo", + "802ca94c": "print_stageinfo", + "802ca990": "print_string_array_info", + "802caa6c": "print_effectinfo", + "802caaa8": "print_enemyinfo", + "802caae4": "update_debug_dpadmask", + "802cabac": "debug_unknown_level_select_check", + "802cac20": "reset_debug_objectinfo", + "802cb0b0": "stub_debug_5", + "802cb0c0": "try_print_debug_mario_object_info", + "802cb1c0": "try_print_debug_mario_level_info", + "802cb264": "try_do_mario_debug_object_spawn", + "802cb564": "debug_enemy_unknown", + "802cb5c0": "set_and_reset_transition_fade_timer", + "802cb640": "set_transition_color_fade_alpha", + "802cb894": "vertex_transition_color", + "802cba18": "dl_transition_color", + "802cbbc4": "render_fade_transition_from_color", + "802cbc20": "render_fade_transition_into_color", + "802cbc7c": "calc_tex_transition_radius", + "802cbd54": "calc_tex_transition_time", + "802cbe64": "convert_tex_transition_angle_to_pos", + "802cbee0": "center_tex_transition_x", + "802cbf64": "center_tex_transition_y", + "802cbfe8": "make_tex_transition_vertex", + "802cc180": "load_tex_transition_vertex", + "802cc4d8": "render_textured_transition", + "802ccbe8": "render_screen_transition", + "802ccdc8": "render_cannon_circle_base", + "802cd1e8": "geo_cannon_circle_base", + "802cd280": "rotate_rectangle", + "802cd328": "atan2_deg", + "802cd388": "scale_shadow_with_distance", + "802cd444": "disable_shadow_with_distance", + "802cd48c": "dim_shadow_with_distance", + "802cd614": "get_water_level_below_shadow", + "802cd6c4": "init_shadow", + "802cd938": "get_texture_coords_9_vertices", + "802cd988": "get_texture_coords_4_vertices", + "802cd9ec": "make_shadow_vertex_at_xyz", + "802cdb20": "extrapolate_vertex_y_position", + "802cdb74": "get_vertex_coords", + "802cdc40": "calculate_vertex_xyz", + "802cde94": "floor_local_tilt", + "802cdf3c": "make_shadow_vertex", + "802ce128": "add_shadow_to_display_list", + "802ce2bc": "linearly_interpolate_solidity_positive", + "802ce3ec": "linearly_interpolate_solidity_negative", + "802ce524": "correct_shadow_solidity_for_animations", + "802ce690": "correct_lava_shadow_height", + "802ce79c": "create_shadow_player", + "802ce9d0": "create_shadow_circle_9_verts", + "802ceae8": "create_shadow_circle_4_verts", + "802cec04": "create_shadow_circle_assuming_flat_ground", + "802cedc0": "create_shadow_rectangle", + "802cef6c": "get_shadow_height_solidity", + "802cf080": "create_shadow_square", + "802cf1f0": "create_shadow_hardcoded_rectangle", + "802cf34c": "create_shadow_below_xyz", + "802cf5b0": "calculate_skybox_scaled_x", + "802cf69c": "calculate_skybox_scaled_y", + "802cf804": "make_skybox_rect", + "802cfa2c": "draw_skybox_tile_grid", + "802cfc68": "create_skybox_ortho_matrix", + "802cfd88": "init_skybox_display_list", + "802cfef4": "create_skybox_facing_camera", + "802d0080": "geo_wdw_set_initial_water_level", + "802d01e0": "geo_movtex_pause_control", + "802d0254": "movtex_make_quad_vertex", + "802d0484": "movtex_gen_from_quad", + "802d0a84": "movtex_gen_from_quad_array", + "802d0bb0": "movtex_gen_quads_id", + "802d0c84": "get_quad_collection_from_id", + "802d0f28": "movtex_change_texture_format", + "802d104c": "geo_movtex_draw_water_regions", + "802d1330": "update_moving_texture_offset", + "802d13cc": "movtex_write_vertex_first", + "802d1574": "movtex_write_vertex_index", + "802d18b4": "movtex_gen_list", + "802d1b70": "geo_movtex_draw_nocolor", + "802d1cdc": "geo_movtex_draw_colored", + "802d1e48": "geo_movtex_draw_colored_no_update", + "802d1fa8": "geo_movtex_draw_colored_2_no_update", + "802d2108": "geo_movtex_update_horizontal", + "802d2210": "make_vertex", + "802d22c4": "round_float", + "802d2360": "geo_exec_inside_castle_light", + "802d2470": "geo_exec_flying_carpet_timer_update", + "802d2520": "geo_exec_flying_carpet_create", + "802d28cc": "geo_exec_cake_end_screen", + "802d29c0": "stop_other_paintings", + "802d2a74": "painting_mario_y", + "802d2b08": "painting_mario_z", + "802d2b84": "painting_ripple_y", + "802d2c40": "painting_nearest_4th", + "802d2d80": "painting_mario_x", + "802d2dfc": "painting_ripple_x", + "802d2eb8": "painting_state", + "802d2ffc": "wall_painting_proximity_idle", + "802d319c": "wall_painting_proximity_rippling", + "802d327c": "wall_painting_continuous_idle", + "802d341c": "wall_painting_continuous_rippling", + "802d34fc": "floor_painting_proximity_idle", + "802d36ac": "floor_painting_proximity_rippling", + "802d379c": "floor_painting_continuous_idle", + "802d393c": "floor_painting_continuous_rippling", + "802d3a2c": "painting_update_floors", + "802d3bec": "painting_update_ripple_state", + "802d3cec": "calculate_ripple_at_point", + "802d3e6c": "ripple_if_movable", + "802d3ee4": "painting_generate_mesh", + "802d404c": "painting_calculate_triangle_normals", + "802d43f8": "normalize_component", + "802d44bc": "painting_average_vertex_normals", + "802d47d0": "render_painting", + "802d4edc": "painting_model_view_transform", + "802d50dc": "painting_ripple_image", + "802d5354": "painting_ripple_env_mapped", + "802d556c": "display_painting_rippling", + "802d568c": "display_painting_not_rippling", + "802d5778": "reset_painting", + "802d57a8": "move_ddd_painting", + "802d58e4": "set_painting_layer", + "802d593c": "display_painting", + "802d59a8": "wall_painting_update", + "802d5aa0": "floor_painting_update", + "802d5b98": "geo_painting_draw", + "802d5d0c": "geo_painting_update", + "802d5e00": "int_pow", + "802d5e54": "format_integer", + "802d6144": "parse_width_field", + "802d62d8": "print_text_fmt_int", + "802d6554": "print_text", + "802d66c0": "print_text_centered", + "802d6858": "char_to_glyph_index", + "802d69f8": "add_glyph_texture", + "802d6acc": "clip_to_bounds", + "802d6b3c": "render_textrect", + "802d6c88": "render_text_labels", + "802d6f20": "create_dl_identity_matrix", + "802d7070": "create_dl_translation_matrix", + "802d7174": "create_dl_rotation_matrix", + "802d7280": "create_dl_scale_matrix", + "802d7384": "create_dl_ortho_matrix", + "802d75dc": "render_generic_char", + "802d76c8": "render_multi_text_string", + "802d77dc": "print_generic_string", + "802d7b84": "print_hud_lut_string", + "802d7e88": "print_menu_generic_string", + "802d82d4": "print_credits_string", + "802d862c": "handle_menu_scrolling", + "802d8844": "get_str_x_pos_from_center", + "802d8934": "get_string_width", + "802d89b8": "print_hud_my_score_coins", + "802d8a80": "print_hud_my_score_stars", + "802d8b34": "int_to_str", + "802d8c6c": "get_dialog_id", + "802d8c88": "create_dialog_box", + "802d8cc4": "create_dialog_box_with_var", + "802d8d08": "create_dialog_inverted_box", + "802d8d48": "create_dialog_box_with_response", + "802d8d90": "reset_dialog_render_state", + "802d8e2c": "render_dialog_box_type", + "802d9148": "change_and_flash_dialog_text_color_lines", + "802d9388": "handle_dialog_scroll_page_state", + "802d944c": "render_star_count_dialog_text", + "802d9634": "render_multi_text_string_lines", + "802d9800": "ensure_nonnegative", + "802d982c": "handle_dialog_text_and_pages", + "802d9cb0": "render_dialog_triangle_choice", + "802d9dfc": "render_dialog_string_color", + "802d9f84": "handle_special_dialog_text", + "802da1ac": "render_dialog_entries", + "802da810": "set_menu_mode", + "802da844": "reset_cutscene_msg_fade", + "802da85c": "dl_rgba16_begin_cutscene_msg_fade", + "802da8e4": "dl_rgba16_stop_cutscene_msg_fade", + "802da964": "ascii_to_credits_char", + "802daa34": "print_credits_str_ascii", + "802daae4": "set_cutscene_message", + "802dab58": "do_cutscene_handler", + "802dad54": "print_peach_letter_message", + "802db08c": "render_hud_cannon_reticle", + "802db350": "reset_red_coins_collected", + "802db368": "change_dialog_camera_angle", + "802db3b8": "shade_screen", + "802db498": "print_animated_red_coin", + "802db6e8": "render_pause_red_coins", + "802db760": "render_pause_my_score_coins", + "802dbb24": "render_pause_camera_options", + "802dbe68": "render_pause_course_options", + "802dc15c": "render_pause_castle_menu_box", + "802dc418": "highlight_last_course_complete_stars", + "802dc478": "print_hud_pause_colorful_str", + "802dc570": "render_pause_castle_course_stars", + "802dc718": "render_pause_castle_main_strings", + "802dca88": "render_pause_courses_and_castle", + "802dcd04": "print_hud_course_complete_string", + "802dcf30": "print_hud_course_complete_coins", + "802dd194": "play_star_fanfare_and_flash_hud", + "802dd210": "render_course_complete_lvl_info_and_hud_str", + "802dd838": "render_save_confirmation", + "802ddae0": "render_course_complete_screen", + "802ddca4": "render_menus_and_dialogs", + "802dddf0": "envfx_init_snow", + "802ddf38": "envfx_update_snowflake_count", + "802de0bc": "envfx_cleanup_snow", + "802de114": "orbit_from_positions", + "802de23c": "pos_from_orbit", + "802de360": "envfx_is_snowflake_alive", + "802de458": "envfx_update_snow_normal", + "802de888": "envfx_update_snow_blizzard", + "802ded38": "envfx_update_snow_water", + "802def2c": "rotate_triangle_vertices", + "802df334": "append_snowflake_vertex_buffer", + "802df748": "envfx_update_snow", + "802dfbc8": "envfx_update_particles", + "802dfd50": "particle_is_laterally_close", + "802dfe00": "random_flower_offset", + "802dfe80": "envfx_update_flower", + "802e0120": "envfx_set_lava_bubble_position", + "802e048c": "envfx_update_lava", + "802e065c": "envfx_rotate_around_whirlpool", + "802e08a8": "envfx_is_whirlpool_bubble_alive", + "802e0934": "envfx_update_whirlpool", + "802e0e24": "envfx_is_jestream_bubble_alive", + "802e0eb8": "envfx_update_jetstream", + "802e1238": "envfx_init_bubble", + "802e1414": "envfx_bubbles_update_switch", + "802e1618": "append_bubble_vertex_buffer", + "802e1a20": "envfx_set_bubble_texture", + "802e1bb8": "envfx_update_bubble_particles", + "802e1ed8": "envfx_set_max_bubble_particles", + "802e1f48": "envfx_update_bubbles", + "802e20a0": "convert_rotation", + "802e2134": "spawn_macro_abs_yrot_2params", + "802e21dc": "spawn_macro_abs_yrot_param1", + "802e2284": "spawn_macro_abs_special", + "802e2414": "spawn_macro_objects", + "802e2690": "spawn_macro_objects_hardcoded", + "802e28ec": "spawn_special_objects", + "802e2cf0": "render_hud_tex_lut", + "802e2e58": "render_hud_small_tex_lut", + "802e30b4": "render_power_meter_health_segment", + "802e3214": "render_dl_power_meter", + "802e33b8": "animate_power_meter_emphasized", + "802e352c": "handle_power_meter_actions", + "802e3654": "render_hud_power_meter", + "802e3744": "render_hud_mario_lives", + "802e37a8": "render_hud_coins", + "802e380c": "render_hud_stars", + "802e38e4": "render_hud_keys", + "802e395c": "render_hud_timer", + "802e3b1c": "set_hud_camera_status", + "802e3b3c": "render_hud_camera_status", + "802e3d2c": "render_hud", + "802e3e50": "set_yoshi_as_not_dead", + "802e3e68": "geo_obj_transparency_something", + "802e3f68": "absf_2", + "802e3fac": "turn_obj_away_from_surface", + "802e405c": "obj_find_wall", + "802e41a4": "turn_obj_away_from_steep_floor", + "802e42e0": "obj_orient_graph", + "802e43e4": "calc_obj_friction", + "802e445c": "calc_new_obj_vel_and_pos_y", + "802e4814": "calc_new_obj_vel_and_pos_y_underwater", + "802e4cec": "obj_update_pos_vel_xz", + "802e4d88": "obj_splash", + "802e4e90": "object_step", + "802e5114": "object_step_without_floor_orient", + "802e5160": "obj_move_xyz_using_fvel_and_yaw", + "802e5208": "is_point_within_radius_of_mario", + "802e52b8": "is_point_close_to_object", + "802e5360": "set_object_visibility", + "802e53f4": "obj_return_home_if_safe", + "802e54b0": "obj_return_and_displace_home", + "802e55d0": "obj_check_if_facing_toward_angle", + "802e569c": "obj_find_wall_displacement", + "802e5760": "obj_spawn_yellow_coins", + "802e5824": "obj_flicker_and_disappear", + "802e58b4": "current_mario_room_check", + "802e5948": "trigger_obj_dialog_when_facing", + "802e5a80": "obj_check_floor_death", + "802e5b18": "obj_lava_death", + "802e5c6c": "spawn_orange_number", + "802e5d04": "debug_sequence_tracker", + "802e5de8": "coin_step", + "802e5e6c": "moving_coin_flicker", + "802e5ea4": "coin_collected", + "802e5ee8": "bhv_moving_yellow_coin_init", + "802e5f64": "bhv_moving_yellow_coin_loop", + "802e6098": "bhv_moving_blue_coin_init", + "802e6114": "bhv_moving_blue_coin_loop", + "802e62a4": "bhv_blue_coin_sliding_jumping_init", + "802e631c": "blue_coin_sliding_away_from_mario", + "802e63ec": "blue_coin_sliding_slow_down", + "802e6474": "bhv_blue_coin_sliding_loop", + "802e6628": "bhv_blue_coin_jumping_loop", + "802e6790": "bhv_seaweed_init", + "802e67dc": "bhv_seaweed_bundle_init", + "802e6a2c": "bhv_bobomb_init", + "802e6a8c": "bobomb_spawn_coin", + "802e6af8": "bobomb_act_explode", + "802e6bd4": "bobomb_check_interactions", + "802e6cf0": "bobomb_act_patrol", + "802e6dc8": "bobomb_act_chase_mario", + "802e6e84": "bobomb_act_launched", + "802e6ed8": "generic_bobomb_free_loop", + "802e7020": "stationary_bobomb_free_loop", + "802e7134": "bobomb_free_loop", + "802e7180": "bobomb_held_loop", + "802e7220": "bobomb_dropped_loop", + "802e7280": "bobomb_thrown_loop", + "802e7324": "curr_obj_random_blink", + "802e742c": "bhv_bobomb_loop", + "802e75a0": "bhv_bobomb_fuse_smoke_init", + "802e76ac": "bhv_bobomb_buddy_init", + "802e770c": "bobomb_buddy_act_idle", + "802e7814": "bobomb_buddy_cannon_dialog", + "802e79dc": "bobomb_buddy_act_talk", + "802e7b00": "bobomb_buddy_act_turn_to_talk", + "802e7bb0": "bobomb_buddy_actions", + "802e7c4c": "bhv_bobomb_buddy_loop", + "802e7c90": "bhv_cannon_closed_init", + "802e7d4c": "cannon_door_act_opening", + "802e7e54": "bhv_cannon_closed_loop", + "802e7f70": "bhv_whirlpool_init", + "802e7fb8": "whirlpool_set_hitbox", + "802e7fec": "whirpool_orient_graph", + "802e80dc": "bhv_whirlpool_loop", + "802e82b0": "bhv_jet_stream_loop", + "802e8388": "bhv_homing_amp_init", + "802e89d4": "bhv_homing_amp_loop", + "802e8ae4": "bhv_circling_amp_init", + "802e8ecc": "bhv_circling_amp_loop", + "802e8f68": "bhv_butterfly_init", + "802e9018": "butterfly_step", + "802e9278": "butterfly_calculate_angle", + "802e9470": "butterfly_act_rest", + "802e94e4": "butterfly_act_follow_mario", + "802e9548": "butterfly_act_return_home", + "802e96c8": "bhv_butterfly_loop", + "802e9764": "bhv_hoot_init", + "802e97fc": "hoot_find_next_floor", + "802e98c0": "hoot_floor_bounce", + "802e9a4c": "hoot_free_step", + "802e9cf4": "hoot_player_set_yaw", + "802e9d98": "hoot_carry_step", + "802e9f60": "hoot_surface_collision", + "802ea144": "hoot_act_ascent", + "802ea258": "hoot_action_loop", + "802ea3f0": "hoot_turn_to_home", + "802ea4ec": "hoot_awake_loop", + "802ea588": "bhv_hoot_loop", + "802ea6a8": "bhv_beta_holdable_object_init", + "802ea7e0": "bhv_beta_holdable_object_loop", + "802ea888": "bhv_object_bubble_init", + "802ea934": "bhv_object_bubble_loop", + "802eaa10": "bhv_object_water_wave_init", + "802eaa50": "bhv_object_water_wave_loop", + "802eaa8c": "bhv_explosion_init", + "802eaad0": "bhv_explosion_loop", + "802eabf0": "bhv_bobomb_bully_death_smoke_init", + "802eac3c": "bhv_bobomb_explosion_bubble_init", + "802ead3c": "bhv_bobomb_explosion_bubble_loop", + "802eaef8": "bhv_respawner_loop", + "802eaf84": "create_respawner", + "802eb05c": "bhv_small_bully_init", + "802eb104": "bhv_big_bully_init", + "802eb1c0": "bully_check_mario_collision", + "802eb288": "bully_act_chase_mario", + "802eb3f0": "bully_act_knockback", + "802eb510": "bully_act_back_up", + "802eb5c4": "bully_backup_check", + "802eb630": "bully_play_stomping_sound", + "802eb744": "bully_step", + "802eb7e0": "bully_spawn_coin", + "802eb8b0": "bully_act_level_death", + "802eb9d0": "bhv_bully_loop", + "802ebb74": "big_bully_spawn_minion", + "802ebc00": "bhv_big_bully_with_minions_init", + "802ebc88": "big_bully_spawn_star", + "802ebce0": "bhv_big_bully_with_minions_loop", + "802ebf70": "water_ring_calc_mario_dist", + "802ec030": "water_ring_init", + "802ec1b0": "bhv_jet_stream_water_ring_init", + "802ec200": "water_ring_check_collection", + "802ec3d0": "water_ring_set_scale", + "802ec4e0": "water_ring_act_collected", + "802ec59c": "water_ring_act_not_collected", + "802ec75c": "bhv_jet_stream_water_ring_loop", + "802ec7cc": "spawn_manta_ray_ring_manager", + "802ec818": "water_ring_spawner_act_inactive", + "802ec908": "bhv_jet_stream_ring_spawner_loop", + "802ec9b8": "bhv_manta_ray_water_ring_init", + "802ec9f0": "manta_water_ring_act_not_collected", + "802ecba4": "bhv_manta_ray_water_ring_loop", + "802ecc14": "bhv_bowser_bomb_loop", + "802ecd0c": "bhv_bowser_bomb_explosion_loop", + "802ecea0": "bhv_bowser_bomb_smoke_loop", + "802ecfac": "bhv_celebration_star_init", + "802ed10c": "celeb_star_act_spin_around_mario", + "802ed28c": "celeb_star_act_face_camera", + "802ed39c": "bhv_celebration_star_loop", + "802ed40c": "bhv_celebration_star_sparkle_loop", + "802ed45c": "bhv_star_key_collection_puff_spawner_loop", + "802ed498": "bhv_lll_drawbridge_spawner_loop", + "802ed62c": "bhv_lll_drawbridge_loop", + "802ed78c": "bhv_small_bomp_init", + "802ed7fc": "bhv_small_bomp_loop", + "802edacc": "bhv_large_bomp_init", + "802edb2c": "bhv_large_bomp_loop", + "802eddfc": "bhv_wf_sliding_platform_init", + "802edf28": "bhv_wf_sliding_platform_loop", + "802ee124": "bhv_moneybag_init", + "802ee1a0": "moneybag_check_mario_collision", + "802ee268": "moneybag_jump", + "802ee46c": "moneybag_act_move_around", + "802ee598": "moneybag_act_return_home", + "802ee728": "moneybag_act_disappear", + "802ee778": "moneybag_act_death", + "802ee7e0": "bhv_moneybag_loop", + "802ee8f4": "bhv_moneybag_hidden_loop", + "802ee9cc": "bhv_bowling_ball_init", + "802eea24": "bowling_ball_set_hitbox", + "802eea7c": "bowling_ball_set_waypoints", + "802eeb64": "bhv_bowling_ball_roll_loop", + "802eecb8": "bhv_bowling_ball_initializeLoop", + "802eedf0": "bhv_bowling_ball_loop", + "802eeeb4": "bhv_generic_bowling_ball_spawner_init", + "802eef9c": "bhv_generic_bowling_ball_spawner_loop", + "802ef0e8": "bhv_thi_bowling_ball_spawner_loop", + "802ef21c": "bhv_bob_pit_bowling_ball_init", + "802ef274": "bhv_bob_pit_bowling_ball_loop", + "802ef34c": "bhv_free_bowling_ball_init", + "802ef3f4": "bhv_free_bowling_ball_roll_loop", + "802ef524": "bhv_free_bowling_ball_loop", + "802ef63c": "bhv_rr_cruiser_wing_init", + "802ef66c": "bhv_rr_cruiser_wing_loop", + "802ef820": "bhv_spindel_init", + "802ef858": "bhv_spindel_loop", + "802efcd0": "bhv_ssl_moving_pyramid_wall_init", + "802efd8c": "bhv_ssl_moving_pyramid_wall_loop", + "802efe64": "bhv_pyramid_elevator_init", + "802efef4": "bhv_pyramid_elevator_loop", + "802f0104": "bhv_pyramid_elevator_trajectory_marker_ball_loop", + "802f0168": "bhv_pyramid_top_init", + "802f0288": "bhv_pyramid_top_spinning", + "802f04a0": "bhv_pyramid_top_explode", + "802f05b4": "bhv_pyramid_top_loop", + "802f06a8": "bhv_pyramid_top_fragment_init", + "802f0714": "bhv_pyramid_top_fragment_loop", + "802f0788": "bhv_pyramid_pillar_touch_detector_loop", + "802f07f4": "bhv_waterfall_sound_loop", + "802f0820": "bhv_volcano_sound_loop", + "802f084c": "bhv_castle_flag_init", + "802f0898": "bhv_birds_sound_loop", + "802f0950": "bhv_ambient_sounds_init", + "802f09a4": "bhv_sand_sound_loop", + "802f09f0": "bhv_castle_cannon_grate_init", + "802f0a40": "bhv_snowmans_bottom_init", + "802f0b7c": "set_rolling_sphere_hitbox", + "802f0bd4": "adjust_rolling_face_pitch", + "802f0c94": "snowmans_bottom_act_1", + "802f0df0": "snowmans_bottom_act_2", + "802f0fa8": "snowmans_bottom_act_3", + "802f105c": "bhv_snowmans_bottom_loop", + "802f120c": "bhv_snowmans_head_init", + "802f1370": "bhv_snowmans_head_loop", + "802f151c": "bhv_snowmans_body_checkpoint_loop", + "802f15a8": "bhv_big_boulder_init", + "802f162c": "boulder_act_1", + "802f1714": "bhv_big_boulder_loop", + "802f17f0": "bhv_big_boulder_generator_loop", + "802f1954": "cap_set_hitbox", + "802f19c8": "cap_despawn", + "802f1a10": "cap_check_quicksand", + "802f1bb8": "cap_sink_quicksand", + "802f1d64": "bhv_wing_cap_init", + "802f1dc0": "cap_scale_vertically", + "802f1e5c": "wing_vanish_cap_act_0", + "802f1f3c": "bhv_wing_vanish_cap_loop", + "802f1fd0": "bhv_metal_cap_init", + "802f2030": "metal_cap_act_0", + "802f20ac": "bhv_metal_cap_loop", + "802f2140": "bhv_normal_cap_init", + "802f21e0": "normal_cap_set_save_flags", + "802f2284": "normal_cap_act_0", + "802f23a8": "bhv_normal_cap_loop", + "802f2498": "bhv_vanish_cap_init", + "802f24f4": "bhv_collect_star_init", + "802f25b0": "bhv_collect_star_loop", + "802f2614": "bhv_star_spawn_init", + "802f2768": "bhv_star_spawn_loop", + "802f2aa0": "spawn_star", + "802f2b88": "spawn_default_star", + "802f2bd4": "spawn_red_coin_cutscene_star", + "802f2c24": "spawn_no_exit_star", + "802f2c84": "bhv_hidden_red_coin_star_init", + "802f2d8c": "bhv_hidden_red_coin_star_loop", + "802f2e6c": "bhv_red_coin_init", + "802f2f2c": "bhv_red_coin_loop", + "802f3014": "bhv_hidden_star_init", + "802f30f0": "bhv_hidden_star_loop", + "802f31bc": "bhv_hidden_star_trigger_loop", + "802f328c": "bhv_bowser_course_red_coin_star_loop", + "802f336c": "bhv_ttm_rolling_log_init", + "802f341c": "rolling_log_roll_log", + "802f36a4": "bhv_rolling_log_loop", + "802f38b0": "volcano_act_1", + "802f39b4": "volcano_act_3", + "802f3a30": "bhv_volcano_trap_loop", + "802f3b98": "bhv_lll_rolling_log_init", + "802f3c54": "bhv_1up_interact", + "802f3cc8": "bhv_1up_common_init", + "802f3d30": "bhv_1up_init", + "802f3dd0": "one_up_loop_in_air", + "802f3ea8": "pole_1up_move_towards_mario", + "802f401c": "one_up_move_away_from_mario", + "802f40cc": "bhv_1up_walking_loop", + "802f4248": "bhv_1up_running_away_loop", + "802f43b8": "sliding_1up_move", + "802f44c0": "bhv_1up_sliding_loop", + "802f45b8": "bhv_1up_loop", + "802f45f0": "bhv_1up_jump_on_approach_loop", + "802f4710": "bhv_1up_hidden_loop", + "802f48f4": "bhv_1up_hidden_trigger_loop", + "802f496c": "bhv_1up_hidden_in_pole_loop", + "802f4b00": "bhv_1up_hidden_in_pole_trigger_loop", + "802f4b78": "bhv_1up_hidden_in_pole_spawner_loop", + "802f4c68": "controllable_platform_act_1", + "802f4ce0": "controllable_platform_act_2", + "802f4d78": "bhv_controllable_platform_sub_loop", + "802f4eb4": "bhv_controllable_platform_init", + "802f5010": "controllable_platform_hit_wall", + "802f5068": "controllable_platform_check_walls", + "802f52c0": "controllable_platform_shake_on_wall_hit", + "802f547c": "controllable_platform_tilt_from_mario", + "802f55a4": "bhv_controllable_platform_loop", + "802f5cd4": "bhv_breakable_box_small_init", + "802f5d78": "small_breakable_box_spawn_dust", + "802f5e44": "small_breakable_box_act_move", + "802f5f48": "breakable_box_small_released_loop", + "802f6014": "breakable_box_small_idle_loop", + "802f60d8": "breakable_box_small_get_dropped", + "802f6150": "breakable_box_small_get_thrown", + "802f6228": "bhv_breakable_box_small_loop", + "802f62e4": "bhv_sliding_snow_mound_loop", + "802f6448": "bhv_snow_mound_spawn_loop", + "802f6588": "floating_platform_find_home_y", + "802f665c": "floating_platform_act_0", + "802f6984": "bhv_floating_platform_loop", + "802f6c0c": "bhv_arrow_lift_loop", + "802f6d20": "bhv_orange_number_init", + "802f6d58": "bhv_orange_number_loop", + "802f6e40": "bhv_manta_ray_init", + "802f6eb0": "manta_ray_move", + "802f7068": "manta_ray_act_spawn_ring", + "802f7264": "bhv_manta_ray_loop", + "802f7348": "bhv_falling_pillar_init", + "802f7398": "bhv_falling_pillar_spawn_hitboxes", + "802f7418": "bhv_falling_pillar_calculate_angle_in_front_of_mario", + "802f74dc": "bhv_falling_pillar_loop", + "802f7760": "bhv_falling_pillar_hitbox_loop", + "802f7924": "bhv_jrb_floating_box_loop", + "802f7978": "bhv_decorative_pendulum_init", + "802f79b0": "bhv_decorative_pendulum_loop", + "802f7a58": "bhv_treasure_chest_top_loop", + "802f7c9c": "bhv_treasure_chest_bottom_init", + "802f7d04": "bhv_treasure_chest_bottom_loop", + "802f7f1c": "spawn_treasure_chest", + "802f7fa0": "bhv_treasure_chest_ship_init", + "802f8044": "bhv_treasure_chest_ship_loop", + "802f8158": "bhv_treasure_chest_jrb_init", + "802f8208": "bhv_treasure_chest_jrb_loop", + "802f82f8": "bhv_treasure_chest_init", + "802f83a4": "bhv_treasure_chest_loop", + "802f8490": "bhv_mips_init", + "802f85e0": "bhv_mips_find_furthest_waypoint_to_mario", + "802f8760": "bhv_mips_act_wait_for_nearby_mario", + "802f8808": "bhv_mips_act_follow_path", + "802f893c": "bhv_mips_act_wait_for_animation_done", + "802f8988": "bhv_mips_act_fall_down", + "802f8a34": "bhv_mips_act_idle", + "802f8ab4": "bhv_mips_free", + "802f8b54": "bhv_mips_held", + "802f8c74": "bhv_mips_dropped", + "802f8cf8": "bhv_mips_thrown", + "802f8dac": "bhv_mips_loop", + "802f8e54": "bhv_yoshi_init", + "802f8f08": "yoshi_walk_loop", + "802f9054": "yoshi_idle_loop", + "802f923c": "yoshi_talk_loop", + "802f93a8": "yoshi_walk_and_jump_off_roof_loop", + "802f9500": "yoshi_finish_jumping_and_despawn_loop", + "802f95ac": "yoshi_give_present_loop", + "802f965c": "bhv_yoshi_loop", + "802fbc4c": "bhv_koopa_init", + "802fc414": "shelled_koopa_attack_handler", + "802fcc00": "obj_begin_race", + "802fd7f8": "bhv_koopa_update", + "802fd950": "bhv_koopa_race_endpoint_update", + "802fda28": "bhv_pokey_body_part_update", + "802fe3b0": "bhv_pokey_update", + "802fe8b4": "bhv_swoop_update", + "802ff040": "bhv_fly_guy_update", + "802ff214": "bhv_goomba_triplet_spawner_update", + "802ff408": "bhv_goomba_init", + "802ff94c": "huge_goomba_weakly_attacked", + "802ff96c": "bhv_goomba_update", + "802ffb38": "bhv_chain_chomp_chain_part_update", + "80300e40": "bhv_chain_chomp_update", + "80300ecc": "bhv_wooden_post_update", + "80301148": "bhv_chain_chomp_gate_init", + "80301180": "bhv_chain_chomp_gate_update", + "80301210": "bhv_wiggler_body_part_update", + "803014cc": "wiggler_init_segments", + "803016e0": "wiggler_update_segments", + "803020e4": "wiggler_jumped_on_attack_handler", + "80302154": "bhv_wiggler_update", + "80302910": "bhv_spiny_update", + "80303028": "bhv_enemy_lakitu_update", + "8030369c": "bhv_cloud_update", + "80303744": "bhv_cloud_part_update", + "80303984": "bhv_camera_lakitu_init", + "80303f64": "bhv_camera_lakitu_update", + "803043f8": "bhv_monty_mole_hole_update", + "80304474": "monty_mole_spawn_dirt_particles", + "803044c0": "bhv_monty_mole_init", + "80304ba8": "bhv_monty_mole_update", + "80304fd4": "bhv_monty_mole_rock_update", + "80305100": "bhv_platform_on_track_init", + "80305a58": "bhv_platform_on_track_update", + "80305bb0": "bhv_track_ball_update", + "80305c14": "bhv_seesaw_platform_init", + "80305c90": "bhv_seesaw_platform_update", + "80305e2c": "bhv_ferris_wheel_axle_init", + "80305f24": "bhv_ferris_wheel_platform_update", + "80306084": "bhv_water_bomb_spawner_update", + "803062a8": "water_bomb_spawn_explode_particles", + "803067e8": "bhv_water_bomb_update", + "803068c0": "bhv_water_bomb_shadow_update", + "8030699c": "bhv_ttc_rotating_solid_init", + "80306a38": "bhv_ttc_rotating_solid_update", + "80306cc4": "bhv_ttc_pendulum_init", + "80306d38": "bhv_ttc_pendulum_update", + "80306f48": "bhv_ttc_treadmill_init", + "80307010": "bhv_ttc_treadmill_update", + "803071b8": "bhv_ttc_moving_bar_init", + "80307670": "bhv_ttc_moving_bar_update", + "80307760": "bhv_ttc_cog_init", + "803077e0": "bhv_ttc_cog_update", + "80307930": "bhv_ttc_pit_block_init", + "803079c8": "bhv_ttc_pit_block_update", + "80307ae4": "bhv_ttc_elevator_init", + "80307b58": "bhv_ttc_elevator_update", + "80307c88": "bhv_ttc_2d_rotator_init", + "80307cf8": "bhv_ttc_2d_rotator_update", + "80307ea4": "bhv_ttc_spinner_update", + "80307fb8": "mr_blizzard_spawn_white_particles", + "8030803c": "bhv_mr_blizzard_init", + "80308d6c": "bhv_mr_blizzard_update", + "80309154": "bhv_mr_blizzard_snowball", + "803091e0": "bhv_sliding_plat_2_init", + "80309354": "bhv_sliding_plat_2_loop", + "80309454": "bhv_rotating_octagonal_plat_init", + "803094d0": "bhv_rotating_octagonal_plat_loop", + "803094f8": "bhv_animates_on_floor_switch_press_init", + "80309530": "bhv_animates_on_floor_switch_press_loop", + "803097a4": "bhv_activated_back_and_forth_platform_init", + "803098c0": "bhv_activated_back_and_forth_platform_update", + "80309b64": "bhv_recovery_heart_loop", + "80309cec": "bhv_bubble_cannon_barrel_loop", + "80309ed4": "water_bomb_cannon_act_0", + "80309f68": "water_bomb_cannon_act_1", + "8030a0e8": "water_bomb_cannon_act_2", + "8030a11c": "bhv_water_bomb_cannon_loop", + "8030a1c0": "bhv_unagi_init", + "8030a2a8": "unagi_act_0", + "8030a390": "unagi_act_1_4", + "8030a514": "unagi_act_2", + "8030a614": "unagi_act_3", + "8030a93c": "bhv_unagi_loop", + "8030aabc": "bhv_unagi_subobject_loop", + "8030ad04": "dorrie_raise_head", + "8030ae9c": "dorrie_act_move", + "8030b0b8": "dorrie_begin_head_raise", + "8030b0f0": "dorrie_act_lower_head", + "8030b220": "dorrie_act_raise_head", + "8030b2f4": "bhv_dorrie_update", + "8030b658": "bhv_haunted_chair_init", + "8030b6d8": "haunted_chair_act_0", + "8030ba68": "haunted_chair_act_1", + "8030bc90": "bhv_haunted_chair_loop", + "8030bfd0": "bhv_mad_piano_update", + "8030c06c": "flying_bookend_act_0", + "8030c0f0": "flying_bookend_act_1", + "8030c210": "flying_bookend_act_2", + "8030c2c8": "flying_bookend_act_3", + "8030c364": "bhv_flying_bookend_loop", + "8030c4b0": "bhv_bookend_spawn_loop", + "8030c564": "bookshelf_manager_act_0", + "8030c60c": "bookshelf_manager_act_1", + "8030c6a4": "bookshelf_manager_act_2", + "8030c828": "bookshelf_manager_act_3", + "8030c894": "bookshelf_manager_act_4", + "8030c8ec": "bhv_haunted_bookshelf_manager_loop", + "8030c98c": "bhv_book_switch_loop", + "8030cd30": "obj_spit_fire", + "8030cddc": "bhv_fire_piranha_plant_init", + "8030d2f0": "bhv_fire_piranha_plant_update", + "8030d598": "bhv_fire_spitter_update", + "8030d640": "bhv_small_piranha_flame_loop", + "8030d8d4": "bhv_fly_guy_flame_loop", + "8030d93c": "geo_snufit_move_mask", + "8030d9ac": "geo_snufit_scale_body", + "8030da14": "snufit_act_idle", + "8030db38": "snufit_act_shoot", + "8030dc70": "bhv_snufit_loop", + "8030dfc4": "bhv_snufit_balls_loop", + "8030e14c": "bhv_horizontal_grindel_init", + "8030e16c": "bhv_horizontal_grindel_update", + "8030ea9c": "bhv_eyerok_boss_loop", + "8030fff8": "bhv_eyerok_hand_loop", + "80310498": "bhv_klepto_init", + "8031126c": "obj_set_speed_to_zero", + "8031129c": "bhv_klepto_update", + "80311874": "bhv_bird_update", + "803118e4": "bhv_racing_penguin_init", + "80312070": "bhv_racing_penguin_update", + "80312168": "bhv_penguin_race_finish_line_update", + "80312200": "bhv_penguin_race_shortcut_check_update", + "80312248": "bhv_coffin_spawner_loop", + "80312370": "coffin_act_idle", + "8031262c": "coffin_act_stand_up", + "8031274c": "bhv_coffin_loop", + "80312804": "clam_act_0", + "80312900": "clam_act_1", + "80312a54": "bhv_clam_loop", + "80313110": "bhv_skeeter_update", + "803131e8": "bhv_skeeter_wave_update", + "8031326c": "bhv_swing_platform_init", + "80313294": "bhv_swing_platform_update", + "80313354": "bhv_donut_platform_spawner_update", + "80313530": "bhv_donut_platform_update", + "803136cc": "bhv_ddd_pole_init", + "80313754": "bhv_ddd_pole_update", + "803137f4": "bhv_red_coin_star_marker_init", + "80313fc0": "bhv_triplet_butterfly_update", + "80314098": "bubba_act_0", + "8031427c": "bubba_act_1", + "803145d4": "bhv_bubba_loop", + "80314a30": "prepare_reverb_ring_buffer", + "80314cc0": "get_volume_ramping", + "80314de4": "synthesis_execute", + "80314f64": "synthesis_do_one_audio_update", + "80315590": "synthesis_process_notes", + "80316010": "load_wave_samples", + "803160dc": "final_resample", + "80316138": "process_envelope", + "8031619c": "process_envelope_inner", + "803166fc": "note_apply_headset_pan_effects", + "80316ac8": "note_init_volume", + "80316af4": "note_set_vel_pan_reverb", + "80316da8": "note_set_frequency", + "80316db4": "note_enable", + "80316e00": "note_disable", + "80316e80": "reset_bank_and_seq_load_status", + "80316ec4": "discard_bank", + "80316fb4": "discard_sequence", + "80317040": "soundAlloc", + "803170b4": "sound_alloc_pool_init", + "803170d4": "persistent_pool_clear", + "803170e8": "temporary_pool_clear", + "80317118": "unused_803160F8", + "80317128": "sound_init_main_pools", + "80317184": "session_pools_init", + "80317200": "seq_and_bank_pool_init", + "8031727c": "persistent_pools_init", + "80317338": "temporary_pools_init", + "803173fc": "alloc_bank_or_seq", + "8031782c": "get_bank_or_seq", + "803178ec": "decrease_reverb_gain", + "80317914": "wait_for_audio_frames", + "80317948": "audio_reset_session", + "80318040": "audio_dma_copy_immediate", + "803180c4": "audio_dma_copy_async", + "80318130": "audio_dma_partial_copy_async", + "803181ec": "decrease_sample_dma_ttls", + "80318300": "dma_sample_data", + "80318634": "init_sample_dma_buffers", + "803188f4": "patch_audio_bank", + "80318b30": "bank_load_immediate", + "80318c8c": "bank_load_async", + "80318dc4": "sequence_dma_immediate", + "80318e70": "sequence_dma_async", + "80318fac": "get_missing_bank", + "803190f4": "load_banks_immediate", + "80319220": "preload_sequence", + "80319328": "load_sequence", + "80319388": "load_sequence_internal", + "8031950c": "audio_init", + "80319920": "note_init", + "80319998": "note_disable2", + "803199b8": "process_notes", + "80319db8": "seq_channel_layer_decay_release_internal", + "80319f64": "seq_channel_layer_note_decay", + "80319f84": "seq_channel_layer_note_release", + "80319fa4": "build_synthetic_wave", + "8031a1d0": "init_synthetic_wave", + "8031a254": "init_note_list", + "8031a264": "init_note_lists", + "8031a2b4": "init_note_free_list", + "8031a368": "note_pool_clear", + "8031a494": "note_pool_fill", + "8031a5d0": "audio_list_push_front", + "8031a610": "audio_list_remove", + "8031a63c": "pop_node_with_value_less_equal", + "8031a6cc": "note_init_for_layer", + "8031a794": "func_80319728", + "8031a7c8": "note_release_and_take_ownership", + "8031a820": "alloc_note_from_disabled", + "8031a89c": "alloc_note_from_decaying", + "8031a8f0": "alloc_note_from_active", + "8031a94c": "alloc_note", + "8031ac34": "reclaim_notes", + "8031adac": "note_init_all", + "8031aee8": "sequence_player_process_sound", + "8031b0cc": "get_portamento_freq_scale", + "8031b1c0": "get_vibrato_pitch_change", + "8031b248": "get_vibrato_freq_scale", + "8031b440": "note_vibrato_update", + "8031b4a0": "note_vibrato_init", + "8031b58c": "adsr_init", + "8031b5ac": "adsr_update", + "8031b830": "sequence_channel_init", + "8031b940": "seq_channel_set_layer", + "8031ba30": "seq_channel_layer_disable", + "8031ba6c": "seq_channel_layer_free", + "8031baf0": "sequence_channel_disable", + "8031bb5c": "allocate_sequence_channel", + "8031bba4": "sequence_player_init_channels", + "8031bcd0": "sequence_player_disable_channels", + "8031bda0": "sequence_channel_enable", + "8031be44": "sequence_player_disable", + "8031bf14": "audio_list_push_back", + "8031bf54": "audio_list_pop_back", + "8031bf94": "init_layer_freelist", + "8031c03c": "m64_read_u8", + "8031c050": "m64_read_s16", + "8031c080": "m64_read_compressed_u16", + "8031c0c4": "seq_channel_layer_process_script", + "8031c200": "L_U_8031C200", + "8031c23c": "L_U_8031C23C", + "8031c298": "L_U_8031C298", + "8031c2dc": "L_U_8031C2DC", + "8031c328": "L_U_8031C328", + "8031c36c": "L_U_8031C36C", + "8031c3bc": "L_U_8031C3BC", + "8031c3e8": "L_U_8031C3E8", + "8031c454": "L_U_8031C454", + "8031c4a4": "L_U_8031C4A4", + "8031c5c8": "L_U_8031C5C8", + "8031c698": "L_U_8031C698", + "8031c6a0": "L_U_8031C6A0", + "8031cbe0": "L_U_8031CBE0", + "8031cbec": "L_U_8031CBEC", + "8031ce54": "get_instrument", + "8031cfd4": "set_instrument", + "8031d068": "sequence_channel_set_volume", + "8031d08c": "sequence_channel_process_script", + "8031d144": "L_U_8031D144", + "8031d1f8": "L_U_8031D1F8", + "8031d234": "L_U_8031D234", + "8031d26c": "L_U_8031D26C", + "8031d2b4": "L_U_8031D2B4", + "8031d2c4": "L_U_8031D2C4", + "8031d31c": "L_U_8031D31C", + "8031d344": "L_U_8031D344", + "8031d354": "L_U_8031D354", + "8031d370": "L_U_8031D370", + "8031d3a8": "L_U_8031D3A8", + "8031d3c4": "L_U_8031D3C4", + "8031d3d4": "L_U_8031D3D4", + "8031d3e4": "L_U_8031D3E4", + "8031d400": "L_U_8031D400", + "8031d424": "L_U_8031D424", + "8031d44c": "L_U_8031D44C", + "8031d474": "L_U_8031D474", + "8031d498": "L_U_8031D498", + "8031d4bc": "L_U_8031D4BC", + "8031d4d4": "L_U_8031D4D4", + "8031d4f0": "L_U_8031D4F0", + "8031d500": "L_U_8031D500", + "8031d51c": "L_U_8031D51C", + "8031d538": "L_U_8031D538", + "8031d56c": "L_U_8031D56C", + "8031d5a0": "L_U_8031D5A0", + "8031d5b4": "L_U_8031D5B4", + "8031d5d4": "L_U_8031D5D4", + "8031d5e4": "L_U_8031D5E4", + "8031d640": "L_U_8031D640", + "8031d678": "L_U_8031D678", + "8031d6c4": "L_U_8031D6C4", + "8031d6d4": "L_U_8031D6D4", + "8031d6f4": "L_U_8031D6F4", + "8031d718": "L_U_8031D718", + "8031d728": "L_U_8031D728", + "8031d73c": "L_U_8031D73C", + "8031d7b8": "L_U_8031D7B8", + "8031d7e8": "L_U_8031D7E8", + "8031d7f8": "L_U_8031D7F8", + "8031d814": "L_U_8031D814", + "8031d830": "L_U_8031D830", + "8031d87c": "L_U_8031D87C", + "8031d898": "L_U_8031D898", + "8031d8f8": "L_U_8031D8F8", + "8031d900": "L_U_8031D900", + "8031d930": "L_U_8031D930", + "8031d94c": "L_U_8031D94C", + "8031d974": "L_U_8031D974", + "8031d9ec": "sequence_player_process_sequence", + "8031e240": "process_sequences", + "8031e2e8": "init_sequence_player", + "8031e374": "init_sequence_players", + "8031e4f0": "unused_8031E4F0", + "8031e568": "unused_8031E568", + "8031e578": "sequence_player_fade_out_internal", + "8031e5c0": "func_8031D690", + "8031e60c": "func_8031D6E4", + "8031e6a4": "func_8031D7B0", + "8031e710": "func_8031D838", + "8031e7b8": "create_next_audio_frame_task", + "8031eb00": "play_sound", + "8031eb30": "process_sound_request", + "8031edec": "process_all_sound_requests", + "8031ee70": "func_8031DFE8", + "8031ef6c": "func_8031E0E4", + "8031eff4": "func_8031E16C", + "8031f810": "get_sound_pan", + "8031f96c": "get_sound_dynamics", + "8031fb20": "get_sound_freq_scale", + "8031fbe8": "get_sound_reverb", + "8031fd84": "audio_signal_game_loop_tick", + "8031fdac": "update_game_sound", + "80320544": "play_sequence", + "80320678": "sequence_player_fade_out", + "803206bc": "fade_volume_scale", + "80320734": "fade_channel_volume_scale", + "8032080c": "func_8031F96C", + "803208ec": "process_level_music_dynamics", + "80320a4c": "L8031FBAC", + "80320a8c": "L8031FBEC", + "80320acc": "L8031FC2C", + "80320b0c": "L8031FC6C", + "80320b4c": "L8031FCAC", + "80320b8c": "L8031FCEC", + "80320bcc": "L8031FD2C", + "80320bf4": "L8031FD54", + "80320d70": "unused_8031FED0", + "80320e3c": "func_8031FFB4", + "80320ec4": "sequence_player_unlower", + "80320f68": "func_803200E4", + "803210d4": "set_sound_disabled", + "8032112c": "sound_init", + "80321398": "get_currently_playing_sound", + "80321474": "func_803205E8", + "80321584": "func_803206F8", + "8032171c": "func_80320890", + "8032174c": "sound_banks_disable", + "803217a8": "disable_all_sequence_players", + "8032180c": "sound_banks_enable", + "80321864": "unused_803209D8", + "803218d8": "func_80320A4C", + "803218f4": "play_dialog_sound", + "803219ac": "play_music", + "80321bac": "stop_background_music", + "80321ce4": "fadeout_background_music", + "80321d38": "drop_queued_background_music", + "80321d5c": "get_current_background_music", + "80321d9c": "func_80320ED8", + "80321e48": "play_secondary_music", + "80321f48": "func_80321080", + "80321f9c": "func_803210D4", + "80322078": "play_course_clear", + "803220b4": "play_peachs_jingle", + "803220f0": "play_puzzle_jingle", + "8032212c": "play_star_fanfare", + "80322168": "play_power_star_jingle", + "803221b8": "play_race_fanfare", + "803221f4": "play_toads_jingle", + "80322230": "sound_reset", + "8032231c": "audio_set_sound_mode", + "80322348": "unused_80321460", + "8032235c": "unused_80321474", + "803223b0": "osSetTime", + "803223e0": "osMapTLB", + "803224a0": "osUnmapTLBAll", + "803224f0": "sprintf", + "8032255c": "proutSprintf", + "803225a0": "osCreateMesgQueue", + "803225d0": "osSetEventMesg", + "80322640": "osViSetEvent", + "803226b0": "osCreateThread", + "80322800": "osRecvMesg", + "80322940": "_VirtualToPhysicalTask", + "80322a5c": "osSpTaskLoad", + "80322bbc": "osSpTaskStartGo", + "80322c00": "osSpTaskYield", + "80322c20": "osSendMesg", + "80322d70": "osSpTaskYielded", + "80322df0": "osStartThread", + "80322f40": "osWritebackDCacheAll", + "80322f70": "osCreateViManager", + "803230f4": "viMgrMain", + "803232d0": "osViSetMode", + "80323340": "osViBlack", + "803233b0": "osViSetSpecialFeatures", + "80323570": "osCreatePiManager", + "803236f0": "osSetThreadPri", + "803237d0": "osInitialize", + "80323a00": "osViSwapBuffer", + "80323a50": "sqrtf", + "80323a60": "osContStartReadData", + "80323b24": "osContGetReadData", + "80323bcc": "__osPackReadData", + "80323cc0": "osContInit", + "80323ebc": "__osContGetInitData", + "80323f8c": "__osPackRequestData", + "80324080": "osEepromProbe", + "803240f0": "__ull_rshift", + "8032411c": "__ull_rem", + "80324158": "__ull_div", + "80324194": "__ll_lshift", + "803241c0": "__ll_rem", + "803241fc": "__ll_div", + "80324258": "__ll_mul", + "80324288": "__ull_divremi", + "803242e8": "__ll_mod", + "80324384": "__ll_rshift", + "803243b0": "osInvalDCache", + "80324460": "osPiStartDma", + "80324570": "bzero", + "80324610": "osInvalICache", + "80324690": "osEepromLongRead", + "803247d0": "osEepromLongWrite", + "80324910": "bcopy", + "80324c20": "guOrthoF", + "80324d74": "guOrtho", + "80324de0": "guPerspectiveF", + "80325010": "guPerspective", + "80325070": "osGetTime", + "80325100": "__d_to_ll", + "8032511c": "__f_to_ll", + "80325138": "__d_to_ull", + "803251d8": "__f_to_ull", + "80325274": "__ll_to_d", + "8032528c": "__ll_to_f", + "803252a4": "__ull_to_d", + "803252d8": "__ull_to_f", + "80325310": "cosf", + "80325480": "sinf", + "80325640": "guTranslateF", + "80325688": "guTranslate", + "803256e0": "guRotateF", + "80325874": "guRotate", + "803258d0": "guScaleF", + "80325924": "guScale", + "80325970": "osAiSetFrequency", + "80325bd4": "alBnkfNew", + "80325cd8": "alSeqFileNew", + "80325d20": "osWritebackDCache", + "80325da0": "osAiGetLength", + "80325db0": "osAiSetNextBuffer", + "80325e60": "__osTimerServicesInit", + "80325eec": "__osTimerInterrupt", + "80326064": "__osSetTimerIntr", + "803260d8": "__osInsertTimer", + "80326260": "_Printf", + "803273f0": "memcpy", + "8032741c": "strlen", + "80327444": "strchr", + "80327490": "__osDequeueThread", + "803274d0": "__osDisableInt", + "803274f0": "__osRestoreInt", + "80327510": "__osViInit", + "80327640": "__osExceptionPreamble", + "80327650": "__osException", + "803278e4": "L80326964", + "80327904": "L80326984", + "80327938": "L803269B8", + "80327a68": "L80326AE8", + "80327ac4": "L80326B44", + "80327ae4": "L80326B64", + "80327b1c": "L80326B9C", + "80327b68": "L80326BE8", + "80327b98": "send_mesg", + "80327c80": "__osEnqueueAndYield", + "80327d10": "__osEnqueueThread", + "80327d58": "__osPopThread", + "80327d68": "__osDispatchThread", + "80327ea8": "__osCleanupThread", + "80327eb0": "osVirtualToPhysical", + "80327f30": "__osSpSetStatus", + "80327f40": "__osSpSetPc", + "80327f80": "__osSpRawStartDma", + "80328010": "__osSpDeviceBusy", + "80328040": "__osSpGetStatus", + "80328050": "osGetThreadPri", + "80328070": "__osViGetCurrentContext", + "80328080": "__osViSwapContext", + "803283e0": "osGetCount", + "803283f0": "__osPiCreateAccessQueue", + "80328440": "__osPiGetAccess", + "80328484": "__osPiRelAccess", + "803284b0": "osPiRawStartDma", + "80328590": "__osDevMgrMain", + "80328710": "__osSetSR", + "80328720": "__osGetSR", + "80328730": "__osSetFpcCsr", + "80328740": "__osSiRawReadIo", + "80328790": "__osSiRawWriteIo", + "803287e0": "osMapTLBRdb", + "80328840": "osPiRawReadIo", + "803288a0": "__osSiCreateAccessQueue", + "803288f0": "__osSiGetAccess", + "80328934": "__osSiRelAccess", + "80328960": "__osSiRawStartDma", + "80328a10": "osSetTimer", + "80328af0": "osEepromWrite", + "80328ca0": "__osPackEepWriteData", + "80328dac": "__osEepStatus", + "80328fd0": "osJamMesg", + "80329120": "osPiGetCmdQueue", + "80329150": "osEepromRead", + "80329340": "__osPackEepReadData", + "80329450": "guMtxF2L", + "80329550": "guMtxIdentF", + "803295d8": "guMtxIdent", + "80329608": "guMtxL2F", + "803296c0": "guNormalize", + "80329750": "__osAiDeviceBusy", + "80329780": "__osSetCompare", + "80329790": "_Litob", + "80329a90": "_Ldtob", + "8032a860": "u32_to_string", + "8032a890": "string_to_u32", + "8032a8e8": "send_packet", + "8032a9a8": "send", + "8032aa80": "process_command_memory", + "8032aacc": "process_command_register", + "8032aaf8": "kdebugserver", + "8032ace0": "__osSyncPutChars", + "8032ae10": "osSetIntMask", + "8032ae70": "osDestroyThread", + "8032af70": "__osProbeTLB", + "8032b030": "__osSiDeviceBusy", + "8032b060": "lldiv", + "8032b160": "ldiv", + "8032b1f0": "__osGetCause", + "8032b200": "__osAtomicDec", + "8032b260": "rspF3DBootStart", + "8032b330": "rspF3DBootEnd", + "8032b330": "rspF3DStart", + "8032c738": "rspF3DEnd", + "8032c740": "rspAspMainStart", + "8032d560": "rspAspMainEnd", + "8032d560": "gVblankHandler1", + "8032d564": "gVblankHandler2", + "8032d568": "gActiveSPTask", + "8032d56c": "sCurrentAudioSPTask", + "8032d570": "sCurrentDisplaySPTask", + "8032d574": "sNextAudioSPTask", + "8032d578": "sNextDisplaySPTask", + "8032d57c": "sAudioEnabled", + "8032d580": "sNumVblanks", + "8032d584": "gResetTimer", + "8032d588": "D_8032C648", + "8032d58c": "gDebugLevelSelect", + "8032d590": "D_8032C650", + "8032d594": "gShowProfiler", + "8032d598": "gShowDebugText", + "8032d5d0": "unused8032C690", + "8032d5d4": "gGlobalTimer", + "8032d5dc": "frameBufferIndex", + "8032d5e0": "D_8032C6A0", + "8032d5e4": "gPlayer1Controller", + "8032d5e8": "gPlayer2Controller", + "8032d5ec": "gPlayer3Controller", + "8032d5f0": "gCurrDemoInput", + "8032d5f4": "gDemoInputListID", + "8032d5f8": "gRecordedDemoInput", + "8032d6d0": "credits01", + "8032d6d8": "credits02", + "8032d6e4": "credits03", + "8032d6f0": "credits04", + "8032d700": "credits05", + "8032d710": "credits06", + "8032d71c": "credits07", + "8032d728": "credits08", + "8032d738": "credits09", + "8032d740": "credits10", + "8032d750": "credits11", + "8032d75c": "credits12", + "8032d764": "credits13", + "8032d774": "credits14", + "8032d77c": "credits15", + "8032d788": "credits16", + "8032d79c": "credits17", + "8032d7ac": "credits18", + "8032d7bc": "credits19", + "8032d7c4": "credits20", + "8032d7cc": "sCreditsSequence", + "8032d93c": "gMarioState", + "8032d940": "unused1", + "8032d944": "D_8032C9E0", + "8032daa0": "sTerrainSounds", + "8032dacc": "sSquishScaleOverTime", + "8032dae0": "sCapFlickerFrames", + "8032daf8": "gWaterSurfacePseudoFloor", + "8032dc50": "sJumpLandAction", + "8032dc68": "sFreefallLandAction", + "8032dc80": "sSideFlipLandAction", + "8032dc98": "sHoldJumpLandAction", + "8032dcb0": "sHoldFreefallLandAction", + "8032dcc8": "sLongJumpLandAction", + "8032dce0": "sDoubleJumpLandAction", + "8032dcf8": "sTripleJumpLandAction", + "8032dd10": "sBackflipLandAction", + "8032dd40": "sPunchingForwardVelocities", + "8032dd80": "gLastCompletedCourseNum", + "8032dd84": "gLastCompletedStarNum", + "8032dd88": "sUnusedGotGlobalCoinHiScore", + "8032dd8c": "gGotFileCoinHiScore", + "8032dd90": "gCurrCourseStarFlags", + "8032dd94": "gSpecialTripleJump", + "8032dd98": "gLevelToCourseNumTable", + "8032ddc0": "gMarioSpawnInfo", + "8032ddc4": "gLoadedGraphNodes", + "8032ddc8": "gAreas", + "8032ddcc": "gCurrentArea", + "8032ddd0": "gCurrCreditsEntry", + "8032ddd4": "D_8032CE74", + "8032ddd8": "D_8032CE78", + "8032dddc": "gWarpTransDelay", + "8032dde0": "gFBSetColor", + "8032dde4": "gWarpTransFBSetColor", + "8032dde8": "gWarpTransRed", + "8032ddec": "gWarpTransGreen", + "8032ddf0": "gWarpTransBlue", + "8032ddf4": "gCurrSaveFileNum", + "8032ddf8": "gCurrLevelNum", + "8032ddfc": "sWarpBhvSpawnTable", + "8032de4c": "sSpawnTypeFromWarpBhv", + "8032de60": "D_8032CF00", + "8032de70": "renderModeTable_1Cycle", + "8032deb0": "renderModeTable_2Cycle", + "8032def0": "gCurGraphNodeRoot", + "8032def4": "gCurGraphNodeMasterList", + "8032def8": "gCurGraphNodeCamFrustum", + "8032defc": "gCurGraphNodeCamera", + "8032df00": "gCurGraphNodeObject", + "8032df04": "gCurGraphNodeHeldObject", + "8032df08": "gAreaUpdateCounter", + "8032df10": "gProfilerMode", + "8032df14": "gCurrentFrameIndex1", + "8032df18": "gCurrentFrameIndex2", + "8032df20": "unused8032CFC0", + "8032df24": "gCutsceneFocus", + "8032df28": "unused8032CFC8", + "8032df2c": "unused8032CFCC", + "8032df30": "gSecondCameraFocus", + "8032df34": "sYawSpeed", + "8032df38": "gCurrLevelArea", + "8032df3c": "gPrevLevel", + "8032df40": "unused8032CFE0", + "8032df44": "unused8032CFE4", + "8032df48": "unused8032CFE8", + "8032df4c": "gCameraZoomDist", + "8032df50": "sObjectCutscene", + "8032df54": "gRecentCutscene", + "8032df58": "sFramesSinceCutsceneEnded", + "8032df5c": "sCutsceneDialogResponse", + "8032df60": "sMarioCamState", + "8032df64": "sLuigiCamState", + "8032df68": "unused8032D008", + "8032df6c": "sFixedModeBasePosition", + "8032df78": "sUnusedModeBasePosition_2", + "8032df84": "sUnusedModeBasePosition_3", + "8032df90": "sUnusedModeBasePosition_4", + "8032df9c": "sUnusedModeBasePosition_5", + "8032dfa8": "sModeTransitions", + "8032e008": "unused8032D0A8", + "8032e010": "unused8032D0B0", + "8032e018": "sDanceCutsceneTable", + "8032e024": "unusedDanceInfo1", + "8032e038": "unusedDanceType", + "8032e03c": "unusedDanceInfo2", + "8032e050": "sBBHLibraryParTrackPath", + "8032e098": "sCamSL", + "8032e0e0": "sCamTHI", + "8032e128": "sCamHMC", + "8032e1d0": "sCamSSL", + "8032e248": "sCamRR", + "8032e2f0": "sCamBOB", + "8032e338": "sCamCotMC", + "8032e368": "sCamCCM", + "8032e3b0": "sCamCastle", + "8032e6f8": "sCamBBH", + "8032ecb0": "sCameraTriggers", + "8032ed50": "sIntroStartToPipePosition", + "8032ee08": "sIntroStartToPipeFocus", + "8032eec0": "sIntroPipeToDialogPosition", + "8032ef30": "sIntroPipeToDialogFocus", + "8032efa0": "sEndingFlyToWindowPos", + "8032eff0": "sEndingFlyToWindowFocus", + "8032f048": "sEndingPeachDescentCamPos", + "8032f0e8": "sEndingMarioToPeachPos", + "8032f130": "sEndingMarioToPeachFocus", + "8032f178": "sEndingLookUpAtCastle", + "8032f1b8": "sEndingLookAtSkyFocus", + "8032f214": "gIntroLakituStartToPipeFocus", + "8032f32c": "gIntroLakituStartToPipeOffsetFromCamera", + "8032f444": "gEndWavingPos", + "8032f48c": "gEndWavingFocus", + "8032f4d4": "sCutsceneEnding", + "8032f534": "sCutsceneGrandStar", + "8032f544": "sCutsceneUnused", + "8032f554": "sCutsceneDoorWarp", + "8032f564": "sCutsceneEndWaving", + "8032f56c": "sCutsceneCredits", + "8032f574": "sCutsceneDoorPull", + "8032f59c": "sCutsceneDoorPush", + "8032f5c4": "sCutsceneDoorPullMode", + "8032f5dc": "sCutsceneDoorPushMode", + "8032f5f4": "sCutsceneEnterCannon", + "8032f60c": "sCutsceneStarSpawn", + "8032f624": "sCutsceneRedCoinStarSpawn", + "8032f634": "sCutsceneEnterPainting", + "8032f63c": "sCutsceneDeathExit", + "8032f64c": "sCutsceneExitPaintingSuccess", + "8032f65c": "sCutsceneUnusedExit", + "8032f674": "sCutsceneIntroPeach", + "8032f69c": "sCutscenePrepareCannon", + "8032f6ac": "sCutsceneExitWaterfall", + "8032f6bc": "sCutsceneFallToCastleGrounds", + "8032f6cc": "sCutsceneEnterPyramidTop", + "8032f6dc": "sCutscenePyramidTopExplode", + "8032f6f4": "sCutsceneStandingDeath", + "8032f6fc": "sCutsceneEnterPool", + "8032f70c": "sCutsceneDeathStomach", + "8032f714": "sCutsceneDeathOnBack", + "8032f71c": "sCutsceneQuicksandDeath", + "8032f724": "sCutsceneWaterDeath", + "8032f72c": "sCutsceneSuffocation", + "8032f734": "sCutsceneEnterBowserArena", + "8032f74c": "sCutsceneDanceDefaultRotate", + "8032f754": "sCutsceneDanceFlyAway", + "8032f75c": "sCutsceneDanceCloseup", + "8032f764": "sCutsceneKeyDance", + "8032f76c": "sCutsceneCapSwitchPress", + "8032f774": "sCutsceneSlidingDoorsOpen", + "8032f784": "sCutsceneUnlockKeyDoor", + "8032f794": "sCutsceneExitBowserSuccess", + "8032f7a4": "sCutsceneExitBowserDeath", + "8032f7b4": "sCutsceneExitSpecialSuccess", + "8032f7c4": "sCutsceneNonPaintingDeath", + "8032f7d4": "sCutsceneDialog", + "8032f7ec": "sCutsceneReadMessage", + "8032f804": "sDanceCutsceneIndexTable", + "8032f870": "sZoomOutAreaMasks", + "8032f884": "sBobCreditsSplinePositions", + "8032f8ac": "sBobCreditsSplineFocus", + "8032f8d4": "sWfCreditsSplinePositions", + "8032f8fc": "sWfCreditsSplineFocus", + "8032f924": "sJrbCreditsSplinePositions", + "8032f94c": "sJrbCreditsSplineFocus", + "8032f974": "sCcmSlideCreditsSplinePositions", + "8032f99c": "sCcmSlideCreditsSplineFocus", + "8032f9c4": "sBbhCreditsSplinePositions", + "8032f9e4": "sBbhCreditsSplineFocus", + "8032fa04": "sHmcCreditsSplinePositions", + "8032fa2c": "sHmcCreditsSplineFocus", + "8032fa54": "sThiWigglerCreditsSplinePositions", + "8032fa6c": "sThiWigglerCreditsSplineFocus", + "8032fa84": "sVolcanoCreditsSplinePositions", + "8032fab4": "sVolcanoCreditsSplineFocus", + "8032fae4": "sSslCreditsSplinePositions", + "8032fb14": "sSslCreditsSplineFocus", + "8032fb44": "sDddCreditsSplinePositions", + "8032fb7c": "sDddCreditsSplineFocus", + "8032fbb4": "sSlCreditsSplinePositions", + "8032fbd4": "sSlCreditsSplineFocus", + "8032fbf4": "sWdwCreditsSplinePositions", + "8032fc14": "sWdwCreditsSplineFocus", + "8032fc34": "sTtmCreditsSplinePositions", + "8032fc64": "sTtmCreditsSplineFocus", + "8032fc94": "sThiHugeCreditsSplinePositions", + "8032fccc": "sThiHugeCreditsSplineFocus", + "8032fd04": "sTtcCreditsSplinePositions", + "8032fd24": "sTtcCreditsSplineFocus", + "8032fd44": "sRrCreditsSplinePositions", + "8032fd64": "sRrCreditsSplineFocus", + "8032fd84": "sSaCreditsSplinePositions", + "8032fdac": "sSaCreditsSplineFocus", + "8032fdd4": "sCotmcCreditsSplinePositions", + "8032fdfc": "sCotmcCreditsSplineFocus", + "8032fe24": "sDddSubCreditsSplinePositions", + "8032fe4c": "sDddSubCreditsSplineFocus", + "8032fe74": "sCcmOutsideCreditsSplinePositions", + "8032fe94": "sCcmOutsideCreditsSplineFocus", + "8032fec0": "sObjectListUpdateOrder", + "8032fecc": "sParticleTypes", + "80330000": "D_8032F0A0", + "80330004": "D_8032F0A4", + "80330020": "D_8032F0C0", + "8033002c": "D_8032F0CC", + "8033006c": "sMrIParticleActions", + "80330074": "sMrIActions", + "80330084": "sMrIHitbox", + "80330094": "D_8032F134", + "803300a8": "unused8032F134", + "803300ac": "sCapSwitchActions", + "803300bc": "sKingBobombActions", + "803300e0": "sKingBobombSoundStates", + "80330140": "sOpenedCannonActions", + "8033015c": "unused0EA1FC", + "80330198": "sChuckyaActions", + "803301a8": "sWFRotatingPlatformData", + "803301c0": "sKoopaShellUnderwaterHitbox", + "803301d0": "D_8032F270", + "803301e4": "sSparkleSpawnStarHitbox", + "803301f4": "sYellowCoinHitbox", + "80330204": "D_8032F2A4", + "80330224": "sCoinInsideBooActions", + "8033022c": "D_8032F2CC", + "80330244": "D_8032F2E4", + "80330260": "D_8032F300", + "80330288": "D_8032F328", + "80330290": "D_8032F330", + "80330298": "sGrindelThwompActions", + "803302ac": "sTumblingBridgeParams", + "803302dc": "sTumblingBridgeActions", + "803302ec": "D_8032F38C", + "80330318": "sElevatorActions", + "8033032c": "D_8032F3CC", + "80330340": "D_8032F3E0", + "80330354": "D_8032F3F4", + "8033035c": "D_8032F3FC", + "80330370": "sUkikiCageActions", + "80330380": "D_8032F420", + "80330390": "sSpindriftHitbox", + "803303a0": "sMetalBoxHitbox", + "803303b0": "sBreakableBoxHitbox", + "803303c0": "D_8032F460", + "803303e8": "sHeaveHoActions", + "803303f8": "sJumpingBoxHitbox", + "80330408": "sJumpingBoxActions", + "8033042c": "sBowserKeyHitbox", + "8033043c": "sBulletBillActions", + "80330450": "sBowserTailAnchorActions", + "8033045c": "D_8032F4FC", + "8033046c": "D_8032F50C", + "80330470": "D_8032F510", + "80330474": "D_8032F514", + "80330478": "sBowserDefeatedDialogText", + "80330480": "D_8032F520", + "803304c8": "sBowserActions", + "80330518": "D_8032F5B8", + "803305f0": "D_8032F690", + "803305f4": "D_8032F694", + "803305f8": "D_8032F698", + "8033067c": "sFallingBowserPlatformActions", + "80330688": "sGrowingBowserFlameHitbox", + "80330698": "sBowserFlameHitbox", + "803306a8": "D_8032F748", + "803306b4": "D_8032F754", + "803306dc": "sCageUkikiPath", + "80330738": "sUkikiSoundStates", + "803307a0": "sUkikiActions", + "803307c0": "D_8032F860", + "803307f4": "D_8032F894", + "80330828": "D_8032F8C8", + "80330830": "sRotatingCwFireBarsActions", + "80330840": "sKoopaShellHitbox", + "80330850": "D_8032F8F0", + "80330884": "D_8032F924", + "803308a8": "D_8032F948", + "803308cc": "D_8032F96C", + "803308d8": "sToxBoxActions", + "80330900": "TablePiranhaPlantActions", + "80330b1c": "sBowserPuzzlePieceActions", + "80330b38": "sTuxiesMotherActions", + "80330b44": "sSmallPenguinActions", + "80330b5c": "sFishActions", + "80330b68": "sFishGroupActions", + "80330b74": "sBirdChirpChirpActions", + "80330b84": "sCheepCheepActions", + "80330b90": "sExclamationBoxHitbox", + "80330ba0": "sExclamationBoxContents", + "80330c20": "sExclamationBoxActions", + "80330c38": "sSkullSlidingBoxHitbox", + "80330c48": "D_8032FCE8", + "80330c58": "sTweesterHitbox", + "80330c68": "sTweesterActions", + "80330cd4": "sScuttlebugHitbox", + "80330ce4": "sWhompActions", + "80330d0c": "sWaterSplashDropletParams", + "80330d30": "sShallowWaterSplashDropletParams", + "80330d54": "sWaterDropletFishParams", + "80330d78": "sShallowWaterWaveDropletParams", + "80330d9c": "sStrongWindParticleHitbox", + "80330dac": "sSLWalkingPenguinErraticSteps", + "80330e20": "D_8032FEC0", + "80330e24": "unused_8032FEC4", + "80330e34": "gMarioPlatform", + "80330e40": "sDebugEffectStringInfo", + "80330e64": "sDebugEnemyStringInfo", + "80330e88": "sDebugInfoDPadMask", + "80330e8c": "sDebugInfoDPadUpdID", + "80330e90": "sDebugLvSelectCheckFlag", + "80330e94": "sDebugPage", + "80330e98": "sNoExtraDebug", + "80330e9c": "sDebugStringArrPrinted", + "80330ea0": "sDebugSysCursor", + "80330ea4": "sDebugInfoButtonSeqID", + "80330ea8": "sDebugInfoButtonSeq", + "80330ec0": "sTransitionColorFadeCount", + "80330ec4": "sTransitionTextureFadeCount", + "80330ec8": "sTextureTransitionID", + "80330ee0": "rectangles", + "80330f00": "sSkyboxTextures", + "80330f28": "sSkyboxColors", + "80330f30": "gMovtexCounter", + "80330f34": "gMovtexCounterPrev", + "80330f38": "gMovtexVtxColor", + "80330f3c": "gPaintingMarioYEntry", + "80330f40": "gWdwWaterLevelSet", + "80330f44": "gMovtexIdToTexture", + "80330f64": "gMovtexNonColored", + "803311a4": "gMovtexColored", + "8033127c": "gMovtexColored2", + "80331300": "sHmcPaintings", + "80331308": "sInsideCastlePaintings", + "80331344": "sTtmPaintings", + "8033134c": "sPaintingGroups", + "80331358": "gPaintingUpdateCounter", + "8033135c": "gLastPaintingUpdateCounter", + "80331360": "sTextLabelsCount", + "80331370": "gDialogCharWidths", + "80331470": "gDialogBoxState", + "80331474": "gDialogBoxOpenTimer", + "80331478": "gDialogBoxScale", + "8033147c": "gDialogScrollOffsetY", + "80331480": "gDialogBoxType", + "80331484": "gDialogID", + "80331488": "gLastDialogPageStrPos", + "8033148c": "gDialogTextPos", + "80331490": "gDialogLineNum", + "80331494": "gLastDialogResponse", + "80331498": "gMenuHoldKeyIndex", + "8033149c": "gMenuHoldKeyTimer", + "803314a0": "gDialogResponse", + "803314b0": "gHudSymCoin", + "803314b4": "gHudSymX", + "803314f8": "gMenuMode", + "803314fc": "gEndCutsceneStrEn0", + "80331504": "gEndCutsceneStrEn1", + "80331538": "gEndCutsceneStrEn2", + "80331558": "gEndCutsceneStrEn3", + "8033156c": "gEndCutsceneStrEn4", + "80331598": "gEndCutsceneStrEn5", + "803315ac": "gEndCutsceneStrEn6", + "803315cc": "gEndCutsceneStrEn7", + "803315dc": "gEndCutsceneStrEn8", + "803315e4": "gEndCutsceneStringsEn", + "8033160c": "gCutsceneMsgFade", + "80331610": "gCutsceneMsgIndex", + "80331614": "gCutsceneMsgDuration", + "80331618": "gCutsceneMsgTimer", + "8033161c": "gDialogCameraAngleIndex", + "80331620": "gDialogCourseActNum", + "803316c8": "gCourseCompleteCoinsEqual", + "803316cc": "gCourseDoneMenuTimer", + "803316d0": "gCourseCompleteCoins", + "803316d4": "gHudFlash", + "80331750": "gEnvFxMode", + "80331754": "D_80330644", + "80331758": "gSnowTempVtx", + "80331788": "gSnowFlakeVertex1", + "80331790": "gSnowFlakeVertex2", + "80331798": "gSnowFlakeVertex3", + "803317a0": "D_80330690", + "803317a4": "D_80330694", + "803317a8": "gBubbleTempVtx", + "803317e0": "MacroObjectPresets", + "803325fc": "sPowerMeterVisibleTimer", + "80332614": "sPrevCheckMarioRoom", + "80332618": "sYoshiDead", + "8033261c": "sDebugSequenceTracker", + "80332620": "sDebugTimer", + "803327a8": "sBreakableBoxSmallHitbox", + "80332b00": "sMrBlizzardHitbox", + "80332b24": "sMrBlizzardSnowballHitbox", + "80332b34": "D_80331A24", + "80332b54": "D_80331A44", + "80332b5c": "D_80331A4C", + "80332b64": "D_80331A54", + "80332bdc": "D_80331ACC", + "80332bf0": "sRecoveryHeartHitbox", + "80332c00": "sUnagiHitbox", + "80332c10": "sHauntedChairHitbox", + "80332c30": "sFlyingBookendHitbox", + "80332c40": "D_80331B30", + "80332c4c": "sBookSwitchHitbox", + "80332c5c": "sFirePiranhaPlantHitbox", + "80332c6c": "D_80331B5C", + "80332c74": "sPiranhaPlantFireHitbox", + "80332c84": "sSnufitHitbox", + "80332c94": "sSnufitBulletHitbox", + "80332ca4": "sEyerokHitbox", + "80332cb4": "D_80331BA4", + "80332d10": "coffinRelativePos", + "80332d28": "sClamShellHitbox", + "80332d38": "sSkeeterHitbox", + "80332d48": "D_80331C38", + "80332e50": "gAudioErrorFlags", + "80332e54": "sGameLoopTicked", + "80332e58": "sDialogSpeaker", + "80332f04": "sDialogSpeakerVoice", + "80332f40": "sNumProcessedSoundRequests", + "80332f44": "sSoundRequestCount", + "80332f48": "sDynBbh", + "80332f54": "sDynDdd", + "80332f6c": "sDynJrb", + "80332f88": "sDynWdw", + "80332f98": "sDynHmc", + "80332fa8": "sDynUnk38", + "80332fb8": "sDynNone", + "80332fbc": "sCurrentMusicDynamic", + "80332fc0": "sBackgroundMusicForDynamics", + "80332fc4": "sLevelDynamics", + "80333060": "sMusicDynamics", + "803330c0": "gAreaEchoLevel", + "80333138": "D_80332028", + "80333188": "sBackgroundMusicDefaultVolume", + "803331ac": "sPlayer0CurSeqId", + "803331b0": "sMusicDynamicDelay", + "803331b4": "D_803320A4", + "803331c0": "D_803320B0", + "803331cc": "D_803320BC", + "803331d8": "sMaxChannelsForSoundBank", + "803331e4": "sNumSoundsPerBank", + "803331f0": "gDefaultSoundArgs", + "803331fc": "sUnusedSoundArgs", + "80333208": "sSoundBankDisabled", + "80333218": "D_80332108", + "8033321c": "sHasStartedFadeOut", + "80333220": "D_80332110", + "80333224": "sUnused80332114", + "80333228": "sUnused80332118", + "8033322c": "D_8033211C", + "80333230": "D_80332120", + "80333234": "D_80332124", + "80333238": "sBackgroundMusicQueueSize", + "8033323c": "sUnused8033323C", + "803332a0": "gAudioSessionPresets", + "80333498": "gAudioCosineTable", + "80333598": "gPitchBendFrequencyScale", + "80333994": "gNoteFrequencies", + "80333b94": "gDefaultShortNoteVelocityTable", + "80333ba4": "gDefaultShortNoteDurationTable", + "80333bb4": "gVibratoCurve", + "80333bc4": "gDefaultEnvelope", + "80333bd0": "sSineWave", + "80333c50": "sSquareWave", + "80333cd0": "sTriangleWave", + "80333d50": "sSawtoothWave", + "80333dd0": "gWaveSamples", + "80333de0": "gHeadsetPanQuantization", + "80333df4": "gHeadsetPanVolume", + "80333ff4": "gStereoPanVolume", + "803341f4": "gDefaultPanVolume", + "803343f4": "gVolRampingLhs136", + "803345f4": "gVolRampingRhs136", + "803347f4": "gVolRampingLhs144", + "803349f4": "gVolRampingRhs144", + "80334bf4": "gVolRampingLhs128", + "80334df4": "gVolRampingRhs128", + "80334ff4": "gTatumsPerBeat", + "80334ff8": "gUnusedCount80333EE8", + "80334ffc": "gAudioHeapSize", + "80335000": "D_80333EF0", + "80335004": "gAudioLoadLock", + "80335008": "sUnused8033EF8", + "80335010": "osViModeTable", + "803358f0": "piMgrArgs", + "80335910": "osClockRate", + "80335918": "D_80334808", + "80335920": "D_80334810", + "80335930": "D_80334820", + "80335940": "D_80334830", + "80335950": "_spaces", + "80335974": "_zeroes", + "803359a0": "D_80334890", + "803359a4": "D_80334894", + "803359a8": "D_80334898", + "803359ac": "D_8033489C", + "803359b0": "D_803348A0", + "803359b4": "D_803348A4", + "803359c0": "D_803348B0", + "80335a20": "D_80334910", + "80335a24": "D_80334914", + "80335a28": "D_80334918", + "80335a2c": "D_8033491C", + "80335a30": "D_80334920", + "80335a44": "D_80334934", + "80335a48": "D_80334938", + "80335a50": "gOsPiAccessQueueCreated", + "80335a60": "gOsSiAccessQueueCreated", + "80335aa0": "D_80334990", + "80335af0": "D_803349E0", + "80335b40": "D_80334A30", + "80335b44": "D_80334A34", + "80335b48": "D_80334A38", + "80335b50": "D_80334A40", + "80335b54": "D_80334A44", + "80338e60": "jtbl_80337C90", + "80338e84": "jtbl_80337CB4", + "80338eac": "jtbl_80337CDC", + "80338ec0": "jtbl_80337D08", + "80338fbc": "jtbl_80337E04", + "8033978c": "jtbl_80338418", + "80339880": "length_str", + "80339884": "flags_str", + "8033988c": "flags_arr", + "80339980": "D_80338610", + "803399a0": "jtbl_80338630", + "803399d0": "NAN", + "803399e0": "D_80338670", + "80339a40": "D_803386D0", + "80339ac0": "rspF3DDataStart", + "8033a2c0": "rspF3DDataEnd", + "8033a2c0": "rspAspMainDataStart", + "8033a580": "rspAspMainDataEnd", + "8033a580": "_mainSegmentEnd", + "008c0c40": "_mainSegmentRomEnd", + "8033a580": "_mainSegmentNoloadStart", + "8033a580": "D_80339210", + "8033a730": "gIdleThread", + "8033a8e0": "gMainThread", + "8033aa90": "gGameLoopThread", + "8033ac40": "gSoundThread", + "8033adf0": "gPIMesgQueue", + "8033ae08": "gIntrMesgQueue", + "8033ae20": "gSPTaskMesgQueue", + "8033ae38": "gDmaMesgBuf", + "8033ae40": "gPIMesgBuf", + "8033aec0": "gSIEventMesgBuf", + "8033aec8": "gIntrMesgBuf", + "8033af08": "gUnknownMesgBuf", + "8033af48": "gDmaIoMesg", + "8033af5c": "D_80339BEC", + "8033af60": "gDmaMesgQueue", + "8033af78": "gSIEventMesgQueue", + "8033af90": "gControllers", + "8033afe8": "gControllerStatuses", + "8033aff8": "gControllerPads", + "8033b010": "gGameVblankQueue", + "8033b028": "D_80339CB8", + "8033b040": "D_80339CD0", + "8033b044": "D_80339CD4", + "8033b048": "gGameVblankHandler", + "8033b050": "gPhysicalFrameBuffers", + "8033b05c": "gPhysicalZBuffer", + "8033b060": "D_80339CF0", + "8033b064": "D_80339CF4", + "8033b068": "gGfxSPTask", + "8033b06c": "gDisplayListHead", + "8033b070": "gGfxPoolEnd", + "8033b074": "gGfxPool", + "8033b078": "gControllerBits", + "8033b079": "gEepromProbe", + "8033b080": "D_80339D10", + "8033b090": "gDemo", + "8033b0a0": "filler80339D30", + "8033b170": "gMarioStates", + "8033b238": "sCurrPlayMode", + "8033b23a": "D_80339ECA", + "8033b23c": "sTransitionTimer", + "8033b240": "sTransitionUpdate", + "8033b244": "unused3", + "8033b248": "sWarpDest", + "8033b250": "D_80339EE0", + "8033b252": "sDelayedWarpOp", + "8033b254": "sDelayedWarpTimer", + "8033b256": "sSourceWarpNodeId", + "8033b258": "sDelayedWarpArg", + "8033b25c": "unused4", + "8033b25e": "sTimerRunning", + "8033b260": "gHudDisplay", + "8033b26e": "gShouldNotPlayCastleMusic", + "8033b270": "sDelayInvincTimer", + "8033b272": "sInvulnerable", + "8033b280": "unused80339F10", + "8033b288": "filler80339F1C", + "8033b2c0": "D_80339F50", + "8033b350": "gMirrorMario", + "8033b3b0": "gBodyStates", + "8033b400": "sSegmentTable", + "8033b480": "sPoolFreeSpace", + "8033b484": "sPoolStart", + "8033b488": "sPoolEnd", + "8033b48c": "sPoolListHeadL", + "8033b490": "sPoolListHeadR", + "8033b494": "gEffectsMemoryPool", + "8033b4a0": "gWarpCheckpoint", + "8033b4a5": "gMainMenuDataModified", + "8033b4a6": "gSaveFileModified", + "8033b4b0": "gPlayerSpawnInfos", + "8033b4d0": "D_8033A160", + "8033b8d0": "gAreaData", + "8033bab0": "gWarpTransition", + "8033bac6": "gCurrCourseNum", + "8033bac8": "gCurrActNum", + "8033baca": "gCurrAreaIndex", + "8033bacc": "gSavedCourseNum", + "8033bace": "gPauseScreenMode", + "8033bad0": "gSaveOptSelectIndex", + "8033bae0": "gMatStackIndex", + "8033bae8": "gMatStack", + "8033c2e8": "gMatStackFixed", + "8033c368": "gGeoTempState", + "8033c378": "gCurAnimType", + "8033c379": "gCurAnimEnabled", + "8033c37a": "gCurrAnimFrame", + "8033c37c": "gCurAnimTranslationMultiplier", + "8033c380": "gCurrAnimAttribute", + "8033c384": "gCurAnimData", + "8033c388": "gDisplayListHeap", + "8033c390": "gProfilerFrameData", + "8033c520": "gPlayerCameraState", + "8033c568": "sOldPosition", + "8033c578": "sOldFocus", + "8033c588": "sPlayer2FocusOffset", + "8033c594": "sCreditsPlayer2Pitch", + "8033c596": "sCreditsPlayer2Yaw", + "8033c598": "sFramesPaused", + "8033c5a0": "sFOVState", + "8033c5c0": "sModeTransition", + "8033c5e8": "sMarioGeometry", + "8033c61c": "unusedFreeRoamWallYaw", + "8033c61e": "sAvoidYawVel", + "8033c620": "sCameraYawAfterDoorCutscene", + "8033c622": "unusedSplinePitch", + "8033c624": "unusedSplineYaw", + "8033c628": "sHandheldShakeSpline", + "8033c668": "sHandheldShakeMag", + "8033c66c": "sHandheldShakeTimer", + "8033c670": "sHandheldShakeInc", + "8033c674": "sHandheldShakePitch", + "8033c676": "sHandheldShakeYaw", + "8033c678": "sHandheldShakeRoll", + "8033c67c": "unused8033B30C", + "8033c680": "unused8033B310", + "8033c684": "sSelectionFlags", + "8033c686": "unused8033B316", + "8033c688": "s2ndRotateFlags", + "8033c68a": "unused8033B31A", + "8033c68c": "sCameraSoundFlags", + "8033c68e": "sCButtonsPressed", + "8033c690": "sCutsceneDialogID", + "8033c698": "gLakituState", + "8033c758": "unused8033B3E8", + "8033c75a": "sAreaYaw", + "8033c75c": "sAreaYawChange", + "8033c75e": "sLakituDist", + "8033c760": "sLakituPitch", + "8033c764": "sZoomAmount", + "8033c768": "sCSideButtonYaw", + "8033c76a": "sBehindMarioSoundTimer", + "8033c76c": "sZeroZoomDist", + "8033c770": "sCUpCameraPitch", + "8033c772": "sModeOffsetYaw", + "8033c774": "sSpiralStairsYawOffset", + "8033c776": "s8DirModeBaseYaw", + "8033c778": "s8DirModeYawOffset", + "8033c77c": "sPanDistance", + "8033c780": "sCannonYOffset", + "8033c788": "sModeInfo", + "8033c7d0": "sCastleEntranceOffset", + "8033c7dc": "sParTrackIndex", + "8033c7e0": "sParTrackPath", + "8033c7e8": "sParTrackTransOff", + "8033c808": "sCameraStoreCUp", + "8033c828": "sCameraStoreCutscene", + "8033c848": "gCameraMovementFlags", + "8033c84a": "sStatusFlags", + "8033c850": "sCurCreditsSplinePos", + "8033c950": "sCurCreditsSplineFocus", + "8033ca50": "sCutsceneSplineSegment", + "8033ca54": "sCutsceneSplineSegmentProgress", + "8033ca58": "unused8033B6E8", + "8033ca5a": "sCutsceneShot", + "8033ca5c": "gCutsceneTimer", + "8033ca60": "sCutsceneVars", + "8033cbc8": "gObjCutsceneDone", + "8033cbcc": "gCutsceneObjSpawn", + "8033cbd0": "gCamera", + "8033cbe0": "gObjectListArray", + "8033d260": "gDebugInfoFlags", + "8033d264": "gNumFindFloorMisses", + "8033d268": "unused_8033BEF8", + "8033d26c": "gUnknownWallCount", + "8033d270": "gObjectCounter", + "8033d274": "gNumCalls", + "8033d280": "gDebugInfo", + "8033d380": "gDebugInfoOverwrite", + "8033d480": "gTimeStopState", + "8033d488": "gObjectPool", + "80360e88": "gMacroObjectDefaultParent", + "803610e8": "gObjectLists", + "803610f0": "gFreeObjectList", + "80361158": "gMarioObject", + "8036115c": "gLuigiObject", + "80361160": "gCurrentObject", + "80361164": "gCurBhvCommand", + "80361168": "gPrevFrameObjectCount", + "8036116c": "gSurfaceNodesAllocated", + "80361170": "gSurfacesAllocated", + "80361174": "gNumStaticSurfaceNodes", + "80361178": "gNumStaticSurfaces", + "8036117c": "gObjectMemoryPool", + "80361180": "gCheckingSurfaceCollisionsForCamera", + "80361182": "gFindFloorIncludeSurfaceIntangible", + "80361184": "gEnvironmentRegions", + "80361188": "gEnvironmentLevels", + "803611d8": "gDoorAdjacentRooms", + "80361250": "gMarioCurrentRoom", + "80361252": "D_8035FEE2", + "80361254": "D_8035FEE4", + "80361256": "gTHIWaterDrained", + "80361258": "gTTCSpeedSetting", + "8036125a": "gMarioShotFromCannon", + "8036125c": "gCCMEnteredSlide", + "8036125e": "gNumRoomedObjectsInMarioRoom", + "80361260": "gNumRoomedObjectsNotInMarioRoom", + "80361262": "gWDWWaterLevelChanging", + "80361264": "gMarioOnMerryGoRound", + "80361280": "D_8035FF10", + "80361290": "gDebugPrintState1", + "803612a0": "gDebugPrintState2", + "803612b0": "sMarioOnFlyingCarpet", + "803612b2": "sSurfaceTypeBelowShadow", + "803612b4": "gShadowAboveWaterOrLava", + "803612b5": "gMarioOnIceOrCarpet", + "803612c0": "sSkyBoxInfo", + "803612e0": "gMovetexLastTextureId", + "803612f0": "gFlyingCarpetState", + "80361300": "gPaintingMarioFloorType", + "80361304": "gPaintingMarioXPos", + "80361308": "gPaintingMarioYPos", + "8036130c": "gPaintingMarioZPos", + "80361310": "gPaintingMesh", + "80361314": "gPaintingTriNorms", + "80361318": "gRipplingPainting", + "8036131c": "gDddPaintingStatus", + "80361320": "sTextLabels", + "803613f0": "gDialogColorFadeTimer", + "803613f2": "gLastDialogLineNum", + "803613f4": "gDialogVariable", + "803613f8": "gDialogTextAlpha", + "803613fa": "gCutsceneMsgXOffset", + "803613fc": "gCutsceneMsgYOffset", + "803613fe": "gRedCoinsCollected", + "80361400": "gEnvFxBuffer", + "80361408": "gSnowCylinderLastPos", + "80361414": "gSnowParticleCount", + "80361416": "gSnowParticleMaxCount", + "80361420": "gEnvFxBubbleConfig", + "80361460": "sNumActiveFirePiranhaPlants", + "80361464": "sNumKilledFirePiranhaPlants", + "80361468": "sObjSavedPosX", + "8036146c": "sObjSavedPosY", + "80361470": "sObjSavedPosZ", + "80361474": "sMontyMoleHoleList", + "80361478": "sMontyMoleKillStreak", + "8036147c": "sMontyMoleLastKilledPosX", + "80361480": "sMontyMoleLastKilledPosY", + "80361484": "sMontyMoleLastKilledPosZ", + "80361488": "sMasterTreadmill", + "80361490": "gCurrAiBuffer", + "80361498": "sSoundRequests", + "80361c98": "D_80360928", + "80361f98": "sUsedChannelsForSoundBank", + "80361fa8": "sCurrentSound", + "80361fb8": "gSoundBanks", + "80364b78": "D_80363808", + "80364b82": "D_80363812", + "80364b88": "sBackgroundMusicQueue", + "80364ba0": "D_80363830", + "80364c20": "D_803638B0", + "80365e70": "piMgrThread", + "80366020": "piMgrStack", + "80367020": "__osPiMesgQueue", + "80367038": "piMgrMesgBuff", + "80367040": "D_80365CD0", + "80367050": "D_80365CE0", + "8036708c": "D_80365D1C", + "80367090": "D_80365D20", + "80367091": "_osCont_numControllers", + "80367098": "D_80365D28", + "803670b8": "_osContMesgQueue", + "803670d0": "_osContMesgBuff", + "803670f0": "D_80365D80", + "80367110": "_osCurrentTime", + "80367118": "D_80365DA8", + "8036711c": "__osViIntrCount", + "80367120": "D_80365DB0", + "80367130": "osPiMesgBuff", + "80367138": "gOsPiMessageQueue", + "80367150": "osSiMesgBuff", + "80367158": "gOsSiMessageQueue", + "80367170": "D_80365E00", + "803671ac": "D_80365E3C", + "803671b0": "D_80365E40", + "803672b0": "gInterruptedThread", + "80367460": ".", + "80367460": "_mainSegmentNoloadEnd", + "0000cee0": "_mainSegmentNoloadSizeLo", + "00000002": "_mainSegmentNoloadSizeHi", + "00000001": "ASSERT", + "80378800": "_engineSegmentStart", + "007cc6c0": "_engineSegmentRomStart", + "80378800": "vec3f_copy", + "80378840": "vec3f_set", + "8037888c": "vec3f_add", + "803788e4": "vec3f_sum", + "8037893c": "vec3s_copy", + "8037897c": "vec3s_set", + "803789c8": "vec3s_add", + "80378a20": "vec3s_sum", + "80378a78": "vec3s_sub", + "80378ad0": "vec3s_to_vec3f", + "80378b34": "vec3f_to_vec3s", + "80378c50": "find_vector_perpendicular_to_plane", + "80378d38": "vec3f_cross", + "80378dc0": "vec3f_normalize", + "80378e68": "mtxf_copy", + "80378eb4": "mtxf_identity", + "80378f24": "mtxf_translate", + "80378f84": "mtxf_lookat", + "80379440": "mtxf_rotate_zxy_and_translate", + "803795f0": "mtxf_rotate_xyz_and_translate", + "80379798": "mtxf_billboard", + "80379918": "mtxf_align_terrain_normal", + "80379aa4": "mtxf_align_terrain_triangle", + "80379f60": "mtxf_mul", + "8037a29c": "mtxf_scale_vec3f", + "8037a348": "mtxf_mul_vec3s", + "8037a434": "mtxf_to_mtx", + "8037a4b8": "mtxf_rotate_xy", + "8037a550": "get_pos_from_transform_mtx", + "8037a69c": "vec3f_get_dist_and_angle", + "8037a788": "vec3f_set_dist_and_angle", + "8037a860": "approach_s32", + "8037a8b4": "approach_f32", + "8037a9a8": "atan2s", + "8037ab88": "atan2f", + "8037abec": "spline_get_weights", + "8037afb8": "anim_spline_init", + "8037afe8": "anim_spline_poll", + "8037b220": "init_scene_graph_node_links", + "8037b24c": "init_graph_node_root", + "8037b30c": "init_graph_node_ortho_projection", + "8037b380": "init_graph_node_perspective", + "8037b448": "init_graph_node_start", + "8037b4ac": "init_graph_node_master_list", + "8037b530": "init_graph_node_render_range", + "8037b5b4": "init_graph_node_switch_case", + "8037b670": "init_graph_node_camera", + "8037b744": "init_graph_node_translation_rotation", + "8037b7f8": "init_graph_node_translation", + "8037b89c": "init_graph_node_rotation", + "8037b940": "init_graph_node_scale", + "8037b9e0": "init_graph_node_object", + "8037bad4": "init_graph_node_culling_radius", + "8037bb48": "init_graph_node_animated_part", + "8037bbec": "init_graph_node_billboard", + "8037bc90": "init_graph_node_display_list", + "8037bd24": "init_graph_node_shadow", + "8037bdb4": "init_graph_node_object_parent", + "8037be28": "init_graph_node_generated", + "8037becc": "init_graph_node_background", + "8037bf84": "init_graph_node_held_object", + "8037c044": "geo_add_child", + "8037c0bc": "geo_remove_child", + "8037c138": "geo_make_first_child", + "8037c1e4": "geo_call_global_function_nodes_helper", + "8037c360": "geo_call_global_function_nodes", + "8037c3d0": "geo_reset_object_node", + "8037c448": "geo_obj_init", + "8037c51c": "geo_obj_init_spawninfo", + "8037c658": "geo_obj_init_animation", + "8037c708": "geo_obj_init_animation_accel", + "8037c7d8": "retrieve_animation_index", + "8037c844": "geo_update_animation_frame", + "8037c9e8": "geo_retreive_animation_translation", + "8037cb10": "geo_find_root", + "8037cb60": "read_vec3s_to_vec3f", + "8037cbc0": "read_vec3s", + "8037cbfc": "read_vec3s_angle", + "8037cc74": "register_scene_graph_node", + "8037cd60": "geo_layout_cmd_branch_and_link", + "8037ce24": "geo_layout_cmd_end", + "8037cee8": "geo_layout_cmd_branch", + "8037cf70": "geo_layout_cmd_return", + "8037cfc0": "geo_layout_cmd_open_node", + "8037d018": "geo_layout_cmd_close_node", + "8037d050": "geo_layout_cmd_assign_as_view", + "8037d0d0": "geo_layout_cmd_update_node_flags", + "8037d1d0": "geo_layout_cmd_node_root", + "8037d328": "geo_layout_cmd_node_ortho_projection", + "8037d3a4": "geo_layout_cmd_node_perspective", + "8037d48c": "geo_layout_cmd_node_start", + "8037d4dc": "geo_layout_cmd_nop3", + "8037d500": "geo_layout_cmd_node_master_list", + "8037d55c": "geo_layout_cmd_node_level_of_detail", + "8037d5d4": "geo_layout_cmd_node_switch_case", + "8037d640": "geo_layout_cmd_node_camera", + "8037d6f0": "geo_layout_cmd_node_translation_rotation", + "8037d8d4": "geo_layout_cmd_node_translation", + "8037d998": "geo_layout_cmd_node_rotation", + "8037da5c": "geo_layout_cmd_node_scale", + "8037db50": "geo_layout_cmd_nop2", + "8037db74": "geo_layout_cmd_node_animated_part", + "8037dc10": "geo_layout_cmd_node_billboard", + "8037dcd4": "geo_layout_cmd_node_display_list", + "8037dd4c": "geo_layout_cmd_node_shadow", + "8037dddc": "geo_layout_cmd_node_object_parent", + "8037de34": "geo_layout_cmd_node_generated", + "8037de94": "geo_layout_cmd_node_background", + "8037def8": "geo_layout_cmd_nop", + "8037df1c": "geo_layout_cmd_copy_view", + "8037dfd4": "geo_layout_cmd_node_held_obj", + "8037e058": "geo_layout_cmd_node_culling_radius", + "8037e0b4": "process_geo_layout", + "803805c8": "level_script_execute", + "80380de8": "f32_find_wall_collision", + "80380e8c": "find_wall_collisions", + "80381264": "find_ceil", + "80381470": "unused_obj_find_floor_height", + "803814b8": "find_floor_height_and_data", + "80381794": "find_floor_height", + "803817e0": "unused_find_dynamic_floor", + "80381900": "find_floor", + "80381ba0": "find_water_level", + "80381d3c": "find_poison_gas_level", + "80381f08": "debug_surface_list_info", + "80382294": "unused_resolve_floor_or_ceil_collisions", + "80383340": "alloc_surface_pools", + "803833b8": "load_area_terrain", + "803835a4": "clear_dynamic_surfaces", + "80383614": "transform_object_vertices", + "80383828": "load_object_surfaces", + "803839cc": "load_object_collision_model", + "80383bb0": "random_u16", + "80383cb4": "random_float", + "80383d1c": "random_sign", + "80383d68": "obj_update_gfx_pos_and_angle", + "80385bf0": "stub_behavior_script_2", + "80385c00": "cur_obj_update", + "80385f90": "identityMtx", + "80385fb0": "zeroMtx", + "80385fd0": "gVec3fZero", + "80385fdc": "gVec3sZero", + "80385fe4": "gVec3fOne", + "80385ff0": "gVec3sOne", + "80386000": "gSineTable", + "80387000": "gCosineTable", + "8038b000": "gArctanTable", + "8038b810": "GeoLayoutJumpTable", + "8038b894": "unused_8038B894", + "8038bc90": "_engineSegmentEnd", + "007dfb50": "_engineSegmentRomEnd", + "8038bc90": "_engineSegmentNoloadStart", + "8038bc90": "gSplineKeyframe", + "8038bc94": "gSplineKeyframeFraction", + "8038bc98": "gSplineState", + "8038bca0": "gGraphNodePool", + "8038bca4": "gCurRootGraphNode", + "8038bca8": "D_8038BCA8", + "8038bcac": "gGeoViews", + "8038bcb0": "gGeoNumViews", + "8038bcb8": "gGeoLayoutStack", + "8038bcf8": "gCurGraphNodeList", + "8038bd78": "gCurGraphNodeIndex", + "8038bd7a": "gGeoLayoutStackIndex", + "8038bd7c": "D_8038BD7C", + "8038bd7e": "gGeoLayoutReturnIndex", + "8038bd80": "gGeoLayoutCommand", + "8038bd88": "gObjParentGraphNode", + "8038be30": "sFloorGeo", + "8038be90": "unused8038BE90", + "8038be98": "gStaticSurfacePartition", + "8038d698": "gDynamicSurfacePartition", + "8038ee98": "sSurfaceNodePool", + "8038ee9c": "sSurfacePool", + "8038eea0": "sSurfacePoolSize", + "8038eea8": "unused8038EEA8", + "8038eef0": "_engineSegmentNoloadEnd", + "8038f800": ".", + "8038f800": "_framebuffersSegmentNoloadStart", + "8038f800": "0x70800", + "8038f800": "gFrameBuffer0", + "803b5000": "gFrameBuffer1", + "803da800": "gFrameBuffer2", + "80400000": "_framebuffersSegmentNoloadEnd", + "80400000": "__expansionRamStart", + "00000001": "ASSERT", + "10000000": "_entrySegmentStart", + "007cc6c0": "_entrySegmentRomStart", + "10000000": "level_script_entry", + "10000030": "_entrySegmentEnd", + "007cc6f0": "_entrySegmentRomEnd", + "02000000": "_segment2_mio0SegmentStart", + "007cc6c0": "_segment2_mio0SegmentRomStart", + "0200bd10": ".", + "0200bd10": "_segment2_mio0SegmentEnd", + "007d83d0": "_segment2_mio0SegmentRomEnd", + "04000000": "_group0_mio0SegmentStart", + "007cc6c0": "_group0_mio0SegmentRomStart", + "04013260": ".", + "04013260": "_group0_mio0SegmentEnd", + "007df920": "_group0_mio0SegmentRomEnd", + "17000000": "_group0_geoSegmentStart", + "007cc6c0": "_group0_geoSegmentRomStart", + "17000000": "bubble_geo", + "1700001c": "purple_marble_geo", + "17000038": "smoke_geo", + "17000084": "burn_smoke_geo", + "1700009c": "small_water_splash_geo", + "170000e0": "mario_TODO_geo_0000E0", + "17000124": "idle_water_wave_geo", + "17000168": "wave_trail_geo", + "170001bc": "sparkles_geo", + "17000230": "water_splash_geo", + "17000284": "sparkles_animation_geo", + "170002e0": "mario_geo_face_and_wings", + "1700041c": "mario_geo_left_hand", + "17000494": "mario_geo_right_hand", + "1700053c": "mario_geo_body", + "170006f8": "mario_geo_medium_poly_left_hand", + "17000770": "mario_geo_medium_poly_right_hand", + "17000818": "mario_geo_medium_poly_body", + "170009d4": "mario_geo_low_poly_face_and_wings", + "17000b10": "mario_geo_low_poly_left_hand", + "17000b88": "mario_geo_low_poly_right_hand", + "17000c30": "mario_geo_low_poly_body", + "17000dec": "mario_vanish_geo_face_and_wings", + "17000f28": "mario_vanish_geo_left_hand", + "17000fa0": "mario_vanish_geo_right_hand", + "17001048": "mario_vanish_geo_body", + "17001204": "mario_vanish_geo_medium_poly_left_hand", + "1700127c": "mario_vanish_geo_medium_poly_right_hand", + "17001324": "mario_vanish_geo_medium_poly_body", + "170014e0": "mario_vanish_geo_low_poly_face_and_wings", + "1700161c": "mario_vanish_geo_low_poly_left_hand", + "17001694": "mario_vanish_geo_low_poly_right_hand", + "1700173c": "mario_vanish_geo_low_poly_body", + "170018f8": "mario_metal_geo_face_and_wings", + "170019a4": "mario_metal_geo_left_hand", + "17001a1c": "mario_metal_geo_right_hand", + "17001ac4": "mario_metal_geo_body", + "17001c80": "mario_metal_geo_medium_poly_left_hand", + "17001cf8": "mario_metal_geo_medium_poly_right_hand", + "17001da0": "mario_metal_geo_medium_poly_body", + "17001f5c": "mario_metal_geo_low_poly_face_and_wings", + "17002008": "mario_metal_geo_low_poly_left_hand", + "17002080": "mario_metal_geo_low_poly_right_hand", + "17002128": "mario_metal_geo_low_poly_body", + "170022e4": "mario_metal_vanish_geo_face_and_wings", + "17002390": "mario_metal_vanish_geo_left_hand", + "17002408": "mario_metal_vanish_geo_right_hand", + "170024b0": "mario_metal_vanish_geo_body", + "1700266c": "mario_metal_vanish_geo_medium_poly_left_hand", + "170026e4": "mario_metal_vanish_geo_medium_poly_right_hand", + "1700278c": "mario_metal_vanish_geo_medium_poly_body", + "17002958": "mario_metal_vanish_geo_low_poly_face_and_wings", + "17002a04": "mario_metal_vanish_geo_low_poly_left_hand", + "17002a7c": "mario_metal_vanish_geo_low_poly_right_hand", + "17002b24": "mario_metal_vanish_geo_low_poly_body", + "17002ce0": "mario_geo_load_body", + "17002d14": "mario_geo_load_medium_poly_body", + "17002d48": "mario_geo_load_low_poly_body", + "17002d7c": "mario_geo_render_body", + "17002dd4": "mario_geo", + "17002e30": "_group0_geoSegmentEnd", + "007cf4f0": "_group0_geoSegmentRomEnd", + "05000000": "_group1_mio0SegmentStart", + "007cc6c0": "_group1_mio0SegmentRomStart", + "05008070": ".", + "05008070": "_group1_mio0SegmentEnd", + "007d4730": "_group1_mio0SegmentRomEnd", + "0c000000": "_group1_geoSegmentStart", + "007cc6c0": "_group1_geoSegmentRomStart", + "0c000000": "yellow_sphere_geo", + "0c000018": "hoot_geo", + "0c0001e4": "yoshi_egg_geo", + "0c000248": "thwomp_geo", + "0c000264": "bullet_bill_geo", + "0c00028c": "heave_ho_geo", + "0c000410": "_group1_geoSegmentEnd", + "007ccad0": "_group1_geoSegmentRomEnd", + "05000000": "_group2_mio0SegmentStart", + "007cc6c0": "_group2_mio0SegmentRomStart", + "05001e10": ".", + "05001e10": "_group2_mio0SegmentEnd", + "007ce4d0": "_group2_mio0SegmentRomEnd", + "0c000000": "_group2_geoSegmentStart", + "007cc6c0": "_group2_geoSegmentRomStart", + "0c000000": "bully_geo", + "0c000120": "bully_boss_geo", + "0c000240": "blargg_geo", + "0c0002b0": "_group2_geoSegmentEnd", + "007cc970": "_group2_geoSegmentRomEnd", + "05000000": "_group3_mio0SegmentStart", + "007cc6c0": "_group3_mio0SegmentRomStart", + "050068b0": ".", + "050068b0": "_group3_mio0SegmentEnd", + "007d2f70": "_group3_mio0SegmentRomEnd", + "0c000000": "_group3_geoSegmentStart", + "007cc6c0": "_group3_geoSegmentRomStart", + "0c000000": "king_bobomb_geo", + "0c000308": "water_bomb_geo", + "0c000328": "water_bomb_shadow_geo", + "0c000340": "_group3_geoSegmentEnd", + "007cca00": "_group3_geoSegmentRomEnd", + "05000000": "_group4_mio0SegmentStart", + "007cc6c0": "_group4_mio0SegmentRomStart", + "0500a300": ".", + "0500a300": "_group4_mio0SegmentEnd", + "007d69c0": "_group4_mio0SegmentRomEnd", + "0c000000": "_group4_geoSegmentStart", + "007cc6c0": "_group4_geoSegmentRomStart", + "0c000000": "clam_shell_geo", + "0c000068": "sushi_geo", + "0c00010c": "unagi_geo", + "0c000280": "_group4_geoSegmentEnd", + "007cc940": "_group4_geoSegmentRomEnd", + "05000000": "_group5_mio0SegmentStart", + "007cc6c0": "_group5_mio0SegmentRomStart", + "0500bce0": ".", + "0500bce0": "_group5_mio0SegmentEnd", + "007d83a0": "_group5_mio0SegmentRomEnd", + "0c000000": "_group5_geoSegmentStart", + "007cc6c0": "_group5_geoSegmentRomStart", + "0c000000": "klepto_geo", + "0c0002ac": "eyerok_geo_0002AC", + "0c0005a8": "eyerok_left_hand_geo", + "0c0005e4": "eyerok_right_hand_geo", + "0c000610": "pokey_head_geo", + "0c000644": "pokey_body_part_geo", + "0c000660": "_group5_geoSegmentEnd", + "007ccd20": "_group5_geoSegmentRomEnd", + "05000000": "_group6_mio0SegmentStart", + "007cc6c0": "_group6_mio0SegmentRomStart", + "0500e110": ".", + "0500e110": "_group6_mio0SegmentEnd", + "007da7d0": "_group6_mio0SegmentRomEnd", + "0c000000": "_group6_geoSegmentStart", + "007cc6c0": "_group6_geoSegmentRomStart", + "0c000000": "monty_mole_geo", + "0c000110": "ukiki_geo", + "0c00036c": "fwoosh_geo", + "0c000390": "_group6_geoSegmentEnd", + "007cca50": "_group6_geoSegmentRomEnd", + "05000000": "_group7_mio0SegmentStart", + "007cc6c0": "_group7_mio0SegmentRomStart", + "05005070": ".", + "05005070": "_group7_mio0SegmentEnd", + "007d1730": "_group7_mio0SegmentRomEnd", + "0c000000": "_group7_geoSegmentStart", + "007cc6c0": "_group7_geoSegmentRomStart", + "0c000000": "spindrift_geo", + "0c000104": "penguin_geo", + "0c00021c": "mr_blizzard_hidden_geo", + "0c000348": "mr_blizzard_geo", + "0c000370": "_group7_geoSegmentEnd", + "007cca30": "_group7_geoSegmentRomEnd", + "05000000": "_group8_mio0SegmentStart", + "007cc6c0": "_group8_mio0SegmentRomStart", + "05001180": ".", + "05001180": "_group8_mio0SegmentEnd", + "007cd840": "_group8_mio0SegmentRomEnd", + "0c000000": "_group8_geoSegmentStart", + "007cc6c0": "_group8_geoSegmentRomStart", + "0c000000": "springboard_top_geo", + "0c000018": "springboard_spring_geo", + "0c000030": "springboard_bottom_geo", + "0c000048": "cap_switch_geo", + "0c000090": "_group8_geoSegmentEnd", + "007cc750": "_group8_geoSegmentRomEnd", + "05000000": "_group9_mio0SegmentStart", + "007cc6c0": "_group9_mio0SegmentRomStart", + "05006960": ".", + "05006960": "_group9_mio0SegmentEnd", + "007d3020": "_group9_mio0SegmentRomEnd", + "0c000000": "_group9_geoSegmentStart", + "007cc6c0": "_group9_geoSegmentRomStart", + "0c000000": "bookend_part_geo", + "0c0000c0": "bookend_geo", + "0c0000d8": "haunted_chair_geo", + "0c000188": "small_key_geo", + "0c0001b4": "mad_piano_geo", + "0c000224": "boo_geo", + "0c000274": "haunted_cage_geo", + "0c0002b0": "_group9_geoSegmentEnd", + "007cc970": "_group9_geoSegmentRomEnd", + "05000000": "_group10_mio0SegmentStart", + "007cc6c0": "_group10_mio0SegmentRomStart", + "05012cd0": ".", + "05012cd0": "_group10_mio0SegmentEnd", + "007df390": "_group10_mio0SegmentRomEnd", + "0c000000": "_group10_geoSegmentStart", + "007cc6c0": "_group10_geoSegmentRomStart", + "0c000000": "birds_geo", + "0c000098": "peach_geo_000098", + "0c000254": "peach_geo_000254", + "0c000410": "peach_geo", + "0c000468": "yoshi_geo", + "0c000670": "_group10_geoSegmentEnd", + "007ccd30": "_group10_geoSegmentRomEnd", + "05000000": "_group11_mio0SegmentStart", + "007cc6c0": "_group11_mio0SegmentRomStart", + "050073f0": ".", + "050073f0": "_group11_mio0SegmentEnd", + "007d3ab0": "_group11_mio0SegmentRomEnd", + "0c000000": "_group11_geoSegmentStart", + "007cc6c0": "_group11_geoSegmentRomStart", + "0c000000": "bubba_geo", + "0c000030": "wiggler_head_geo", + "0c0001bc": "enemy_lakitu_geo", + "0c000290": "spiny_ball_geo", + "0c000328": "spiny_geo", + "0c0004a0": "_group11_geoSegmentEnd", + "007ccb60": "_group11_geoSegmentRomEnd", + "06000000": "_group12_mio0SegmentStart", + "007cc6c0": "_group12_mio0SegmentRomStart", + "06030c30": ".", + "06030c30": "_group12_mio0SegmentEnd", + "007fd2f0": "_group12_mio0SegmentRomEnd", + "0d000000": "_group12_geoSegmentStart", + "007cc6c0": "_group12_geoSegmentRomStart", + "0d000000": "bowser_flames_geo", + "0d000090": "invisible_bowser_accessory_geo", + "0d0000b0": "bowser_1_yellow_sphere_geo", + "0d0000d8": "bowser_geo_0000D8", + "0d000424": "bowser_geo_000424", + "0d000770": "bowser_geo_000770", + "0d000ab8": "bowser_shadow_geo", + "0d000ac4": "bowser_geo", + "0d000b40": "bowser2_geo", + "0d000bbc": "bowser_bomb_geo", + "0d000bfc": "bowser_impact_smoke_geo", + "0d000c50": "_group12_geoSegmentEnd", + "007cd310": "_group12_geoSegmentRomEnd", + "06000000": "_group13_mio0SegmentStart", + "007cc6c0": "_group13_mio0SegmentRomStart", + "0600a0f0": ".", + "0600a0f0": "_group13_mio0SegmentEnd", + "007d67b0": "_group13_mio0SegmentRomEnd", + "0d000000": "_group13_geoSegmentStart", + "007cc6c0": "_group13_geoSegmentRomStart", + "0d000000": "skeeter_geo", + "0d000284": "seaweed_geo", + "0d0002f4": "water_mine_geo", + "0d000324": "cyan_fish_geo", + "0d00038c": "bub_geo", + "0d000414": "water_ring_geo", + "0d000450": "treasure_chest_base_geo", + "0d000468": "treasure_chest_lid_geo", + "0d000480": "_group13_geoSegmentEnd", + "007ccb40": "_group13_geoSegmentRomEnd", + "06000000": "_group14_mio0SegmentStart", + "007cc6c0": "_group14_mio0SegmentRomStart", + "06013a60": ".", + "06013a60": "_group14_mio0SegmentEnd", + "007e0120": "_group14_mio0SegmentRomEnd", + "0d000000": "_group14_geoSegmentStart", + "007cc6c0": "_group14_geoSegmentRomStart", + "0d000000": "koopa_flag_geo", + "0d0000b8": "wooden_post_geo", + "0d0000d0": "koopa_without_shell_geo", + "0d000214": "koopa_with_shell_geo", + "0d000358": "piranha_plant_geo", + "0d000480": "whomp_geo", + "0d0005d0": "metallic_ball_geo", + "0d0005ec": "chain_chomp_geo", + "0d000680": "_group14_geoSegmentEnd", + "007ccd40": "_group14_geoSegmentRomEnd", + "06000000": "_group15_mio0SegmentStart", + "007cc6c0": "_group15_mio0SegmentRomStart", + "0600c8e0": ".", + "0600c8e0": "_group15_mio0SegmentEnd", + "007d8fa0": "_group15_mio0SegmentRomEnd", + "0d000000": "_group15_geoSegmentStart", + "007cc6c0": "_group15_geoSegmentRomStart", + "0d000000": "lakitu_geo", + "0d000114": "toad_geo_000114", + "0d00027c": "toad_geo_00027C", + "0d0003e4": "toad_geo", + "0d000448": "mips_geo", + "0d0005b0": "boo_castle_geo", + "0d000600": "_group15_geoSegmentEnd", + "007cccc0": "_group15_geoSegmentRomEnd", + "06000000": "_group16_mio0SegmentStart", + "007cc6c0": "_group16_mio0SegmentRomStart", + "06002ba0": ".", + "06002ba0": "_group16_mio0SegmentEnd", + "007cf260": "_group16_mio0SegmentRomEnd", + "0d000000": "_group16_geoSegmentStart", + "007cc6c0": "_group16_geoSegmentRomStart", + "0d000000": "moneybag_geo_000000", + "0d000078": "moneybag_geo_000078", + "0d0000f0": "moneybag_geo", + "0d000150": "_group16_geoSegmentEnd", + "007cc810": "_group16_geoSegmentRomEnd", + "06000000": "_group17_mio0SegmentStart", + "007cc6c0": "_group17_mio0SegmentRomStart", + "06009c50": ".", + "06009c50": "_group17_mio0SegmentEnd", + "007d6310": "_group17_mio0SegmentRomEnd", + "0d000000": "_group17_geoSegmentStart", + "007cc6c0": "_group17_geoSegmentRomStart", + "0d000000": "mr_i_geo", + "0d00001c": "mr_i_iris_geo", + "0d0000dc": "swoop_geo", + "0d0001a0": "snufit_geo", + "0d000230": "dorrie_geo", + "0d000394": "scuttlebug_geo", + "0d0006d0": "_group17_geoSegmentEnd", + "007ccd90": "_group17_geoSegmentRomEnd", + "08000000": "_common0_mio0SegmentStart", + "007cc6c0": "_common0_mio0SegmentRomStart", + "0800e6d0": ".", + "0800e6d0": "_common0_mio0SegmentEnd", + "007dad90": "_common0_mio0SegmentRomEnd", + "0f000000": "_common0_geoSegmentStart", + "007cc6c0": "_common0_geoSegmentRomStart", + "0f000000": "blue_coin_switch_geo", + "0f000020": "test_platform_geo", + "0f000028": "amp_geo", + "0f0001a8": "cannon_base_geo", + "0f0001c0": "cannon_barrel_geo", + "0f0001d8": "chuckya_geo", + "0f0004cc": "purple_switch_geo", + "0f0004e4": "checkerboard_platform_geo", + "0f0004fc": "heart_geo", + "0f000518": "flyguy_geo", + "0f0005d0": "breakable_box_geo", + "0f000610": "breakable_box_small_geo", + "0f000640": "bowling_ball_geo", + "0f00066c": "bowling_ball_track_geo", + "0f000694": "exclamation_box_geo", + "0f0006e4": "goomba_geo", + "0f0007b8": "black_bobomb_geo", + "0f0008f4": "bobomb_buddy_geo", + "0f000a30": "metal_box_geo", + "0f000a58": "exclamation_box_outline_geo", + "0f000ab0": "koopa_shell_geo", + "0f000adc": "koopa_shell2_geo", + "0f000b08": "koopa_shell3_geo", + "0f000b40": "_common0_geoSegmentEnd", + "007cd200": "_common0_geoSegmentRomEnd", + "03000000": "_common1_mio0SegmentStart", + "007cc6c0": "_common1_mio0SegmentRomStart", + "03017990": ".", + "03017990": "_common1_mio0SegmentEnd", + "007e4050": "_common1_mio0SegmentRomEnd", + "16000000": "_common1_geoSegmentStart", + "007cc6c0": "_common1_geoSegmentRomStart", + "16000000": "mist_geo", + "16000020": "white_puff_geo", + "16000040": "explosion_geo", + "160000a8": "butterfly_geo", + "1600013c": "yellow_coin_geo", + "160001a0": "yellow_coin_no_shadow_geo", + "16000200": "blue_coin_geo", + "16000264": "blue_coin_no_shadow_geo", + "160002c4": "red_coin_geo", + "16000328": "red_coin_no_shadow_geo", + "16000388": "warp_pipe_geo", + "160003a8": "castle_door_geo", + "1600043c": "cabin_door_geo", + "160004d0": "wooden_door_geo", + "16000564": "wooden_door2_geo", + "160005f8": "metal_door_geo", + "1600068c": "hazy_maze_door_geo", + "16000720": "haunted_door_geo", + "160007b4": "castle_door_0_star_geo", + "16000868": "castle_door_1_star_geo", + "1600091c": "castle_door_3_stars_geo", + "160009d0": "key_door_geo", + "16000a84": "bowser_key_geo", + "16000ab0": "bowser_key_cutscene_geo", + "16000b10": "red_flame_shadow_geo", + "16000b2c": "red_flame_geo", + "16000b8c": "blue_flame_geo", + "16000bec": "fish_shadow_geo", + "16000c44": "fish_geo", + "16000c8c": "leaves_geo", + "16000ca4": "marios_cap_geo", + "16000cf0": "marios_metal_cap_geo", + "16000d3c": "marios_wing_cap_geo", + "16000da8": "marios_winged_metal_cap_geo", + "16000e14": "number_geo", + "16000e84": "mushroom_1up_geo", + "16000ea0": "star_geo", + "16000ed4": "dirt_animation_geo", + "16000f24": "cartoon_star_geo", + "16000f6c": "transparent_star_geo", + "16000f98": "white_particle_geo", + "16000fb4": "wooden_signpost_geo", + "16000fe8": "bubbly_tree_geo", + "16001000": "spiky_tree_geo", + "16001018": "snow_tree_geo", + "16001030": "spiky_tree1_geo", + "16001048": "palm_tree_geo", + "16001060": "_common1_geoSegmentEnd", + "007cd720": "_common1_geoSegmentRomEnd", + "13000000": "_behaviorSegmentStart", + "007cc6c0": "_behaviorSegmentRomStart", + "13000000": "bhvStarDoor", + "13000054": "bhvMrI", + "1300008c": "bhvMrIBody", + "130000ac": "bhvMrIParticle", + "130000f8": "bhvPurpleParticle", + "13000118": "bhvGiantPole", + "13000144": "bhvPoleGrabbing", + "13000174": "bhvThiHugeIslandTop", + "13000194": "bhvThiTinyIslandTop", + "130001ac": "bhvCapSwitchBase", + "130001cc": "bhvCapSwitch", + "130001f4": "bhvKingBobomb", + "13000254": "bhvBobombAnchorMario", + "13000278": "bhvBetaChestBottom", + "1300029c": "bhvBetaChestLid", + "130002b8": "bhvBubbleParticleSpawner", + "130002e4": "bhvBubbleMaybe", + "13000338": "bhvSmallWaterWave", + "13000398": "bhvSmallWaterWave398", + "130003bc": "bhvWaterAirBubble", + "13000400": "bhvSmallParticle", + "13000428": "bhvPlungeBubble", + "13000444": "bhvSmallParticleSnow", + "1300046c": "bhvSmallParticleBubbles", + "13000494": "bhvFishGroup", + "130004a8": "bhvCannon", + "130004e4": "bhvCannonBarrel", + "13000500": "bhvCannonBaseUnused", + "13000528": "bhvChuckya", + "13000584": "bhvChuckyaAnchorMario", + "130005a8": "bhvUnused05A8", + "130005b4": "bhvRotatingPlatform", + "130005d8": "bhvTower", + "13000600": "bhvBulletBillCannon", + "13000624": "bhvWfBreakableWallRight", + "13000638": "bhvWfBreakableWallLeft", + "1300066c": "bhvKickableBoard", + "130006a4": "bhvTowerDoor", + "130006d8": "bhvRotatingCounterClockwise", + "130006e0": "bhvWfRotatingWoodenPlatform", + "13000708": "bhvKoopaShellUnderwater", + "13000720": "bhvExitPodiumWarp", + "1300075c": "bhvFadingWarp", + "13000780": "bhvWarp", + "130007a0": "bhvWarpPipe", + "130007dc": "bhvWhitePuffExplosion", + "130007f8": "bhvSpawnedStar", + "1300080c": "bhvSpawnedStarNoLevelExit", + "13000830": "bhvMrIBlueCoin", + "13000888": "bhvCoinInsideBoo", + "130008d0": "bhvCoinFormationSpawn", + "130008ec": "bhvCoinFormation", + "1300090c": "bhvOneCoin", + "1300091c": "bhvYellowCoin", + "13000940": "bhvTemporaryYellowCoin", + "13000964": "bhvThreeCoinsSpawn", + "13000984": "bhvTenCoinsSpawn", + "130009a4": "bhvSingleCoinGetsSpawned", + "130009e0": "bhvCoinSparkles", + "13000a14": "bhvGoldenCoinSparkles", + "13000a34": "bhvWallTinyStarParticle", + "13000a54": "bhvVertStarParticleSpawner", + "13000a78": "bhvPoundTinyStarParticle", + "13000a98": "bhvHorStarParticleSpawner", + "13000abc": "bhvPunchTinyTriangle", + "13000ad8": "bhvTriangleParticleSpawner", + "13000afc": "bhvDoorWarp", + "13000b0c": "bhvDoor", + "13000b58": "bhvGrindel", + "13000b8c": "bhvThwomp2", + "13000bc8": "bhvThwomp", + "13000c04": "bhvTumblingBridgePlatform", + "13000c28": "bhvWfTumblingBridge", + "13000c44": "bhvBbhTumblingBridge", + "13000c64": "bhvLllTumblingBridge", + "13000c84": "bhvFlame", + "13000cc8": "bhvAnotherElavator", + "13000cfc": "bhvRrElevatorPlatform", + "13000d30": "bhvHmcElevatorPlatform", + "13000d6c": "bhvWaterMist", + "13000d98": "bhvBreathParticleSpawner", + "13000db4": "bhvBreakBoxTriangle", + "13000dd8": "bhvWaterMist2", + "13000dfc": "bhvUnused0DFC", + "13000e24": "bhvMistCircParticleSpawner", + "13000e3c": "bhvDirtParticleSpawner", + "13000e58": "bhvSnowParticleSpawner", + "13000e70": "bhvWind", + "13000e88": "bhvEndToad", + "13000eac": "bhvEndPeach", + "13000ed0": "bhvUnusedParticleSpawn", + "13000f08": "bhvUkiki", + "13000f14": "bhvUkikiCageChild", + "13000f2c": "bhvUkikiCageStar", + "13000f48": "bhvUkikiCage", + "13000f9c": "bhvBitfsSinkingPlatforms", + "13000fc8": "bhvBitfsSinkingCagePlatform", + "13001000": "bhvDddMovingPole", + "13001030": "bhvBitfsTiltingInvertedPyramid", + "13001064": "bhvSquishablePlatform", + "13001098": "bhvCutOutObject", + "130010a8": "bhvBetaMovingFlamesSpawn", + "130010b8": "bhvBetaMovingFlames", + "130010d8": "bhvRrRotatingBridgePlatform", + "13001108": "bhvFlamethrower", + "13001124": "bhvFlamethrowerFlame", + "13001168": "bhvBouncingFireball", + "13001184": "bhvBouncingFireballFlame", + "130011d0": "bhvBowserShockWave", + "130011ec": "bhvFireParticleSpawner", + "13001214": "bhvBlackSmokeMario", + "13001254": "bhvBlackSmokeBowser", + "1300127c": "bhvBlackSmokeUpward", + "13001298": "bhvBetaFishSplashSpawner", + "130012b4": "bhvSpindrift", + "130012f4": "bhvTowerPlatformGroup", + "13001318": "bhvWfSlidingTowerPlatform", + "13001340": "bhvWfElevatorTowerPlatform", + "13001368": "bhvWfSolidTowerPlatform", + "13001390": "bhvLeafParticleSpawner", + "130013a8": "bhvTreeSnow", + "130013c4": "bhvTreeLeaf", + "130013dc": "bhvAnotherTiltingPlatform", + "13001408": "bhvSquarishPathMoving", + "1300142c": "bhvPiranhaPlantBubble", + "13001448": "bhvPiranhaPlantWakingBubbles", + "13001468": "bhvFloorSwitchAnimatesObject", + "13001478": "bhvFloorSwitchGrills", + "13001484": "bhvFloorSwitchHardcodedModel", + "130014ac": "bhvFloorSwitchHiddenObjects", + "130014bc": "bhvHiddenObject", + "130014e0": "bhvBreakableBox", + "13001518": "bhvPushableMetalBox", + "13001548": "bhvHeaveHo", + "130015a4": "bhvHeaveHoThrowMario", + "130015c0": "bhvCcmTouchedStarSpawn", + "130015e4": "bhvUnusedPoundablePlatform", + "13001608": "bhvBetaTrampolineTop", + "13001634": "bhvBetaTrampolineSpring", + "13001650": "bhvJumpingBox", + "1300167c": "bhvBooCage", + "130016ac": "bhvStub", + "130016b8": "bhvIgloo", + "130016e4": "bhvBowserKey", + "13001714": "bhvGrandStar", + "13001744": "bhvBetaBooKey", + "13001778": "bhvAlphaBooKey", + "1300179c": "bhvBulletBill", + "130017f4": "bhvWhitePuffSmoke", + "13001820": "bhvUnused1820", + "13001828": "bhvBowserTailAnchor", + "13001850": "bhvBowser", + "130018cc": "bhvBowserBodyAnchor", + "13001904": "bhvBowserFlameSpawn", + "13001920": "bhvTiltingBowserLavaPlatform", + "13001958": "bhvFallingBowserPlatform", + "13001984": "bhvBlueBowserFlame", + "130019c8": "bhvFlameFloatingLanding", + "13001a0c": "bhvBlueFlamesGroup", + "13001a30": "bhvFlameBouncing", + "13001a74": "bhvFlameMovingForwardGrowing", + "13001aa4": "bhvFlameBowser", + "13001ae8": "bhvFlameLargeBurningOut", + "13001b2c": "bhvBlueFish", + "13001b54": "bhvTankFishGroup", + "13001b70": "bhvCheckerboardElevatorGroup", + "13001b88": "bhvCheckerboardPlatformSub", + "13001bb4": "bhvBowserKeyUnlockDoor", + "13001bd4": "bhvBowserKeyCourseExit", + "13001bf4": "bhvInvisibleObjectsUnderBridge", + "13001c04": "bhvWaterLevelPillar", + "13001c34": "bhvDddWarp", + "13001c58": "bhvMoatGrills", + "13001c7c": "bhvClockMinuteHand", + "13001c8c": "bhvClockHourHand", + "13001cb0": "bhvMacroUkiki", + "13001d0c": "bhvStub1D0C", + "13001d14": "bhvLllRotatingHexagonalPlatform", + "13001d40": "bhvLllSinkingRockBlock", + "13001d70": "bhvStub1D70", + "13001d78": "bhvLllMovingOctagonalMeshPlatform", + "13001da4": "bhvSnowBall", + "13001da8": "bhvLllRotatingBlockWithFireBars", + "13001dcc": "bhvLllRotatingHexFlame", + "13001e04": "bhvLllWoodPiece", + "13001e30": "bhvLllFloatingWoodBridge", + "13001e4c": "bhvVolcanoFlames", + "13001e6c": "bhvLllRotatingHexagonalRing", + "13001e94": "bhvLllSinkingRectangularPlatform", + "13001ec4": "bhvLllSinkingSquarePlatforms", + "13001ef8": "bhvLllTiltingInvertedPyramid", + "13001f30": "bhvUnused1F30", + "13001f3c": "bhvKoopaShell", + "13001f68": "bhvKoopaShellFlame", + "13001f90": "bhvToxBox", + "13001fbc": "bhvPiranhaPlant", + "13002018": "bhvLllHexagonalMesh", + "13002038": "bhvLllBowserPuzzlePiece", + "13002068": "bhvLllBowserPuzzle", + "13002088": "bhvTuxiesMother", + "130020d8": "bhvPenguinBaby", + "130020e0": "bhvUnused20E0", + "130020e8": "bhvSmallPenguin", + "1300213c": "bhvFish2", + "1300214c": "bhvFish3", + "1300215c": "bhvLargeFishGroup", + "13002178": "bhvFish", + "13002194": "bhvWdwExpressElevator", + "130021c0": "bhvWdwExpressElevatorPlatform", + "130021e4": "bhvChirpChirp", + "130021f4": "bhvChirpChirpUnused", + "1300220c": "bhvBub", + "13002250": "bhvExclamationBox", + "1300227c": "bhvRotatingExclamationMark", + "1300229c": "bhvSoundSpawner", + "130022b8": "bhvRockSolid", + "130022d8": "bhvBowserSubDoor", + "13002308": "bhvBowsersSub", + "13002338": "bhvSushiShark", + "13002388": "bhvSushiSharkCollisionChild", + "130023a4": "bhvJrbSlidingBox", + "130023d0": "bhvShipPart3", + "130023ec": "bhvInSunkenShip3", + "1300241c": "bhvSunkenShipPart", + "1300243c": "bhvSunkenShipSetRotation", + "1300244c": "bhvSunkenShipPart2", + "1300246c": "bhvInSunkenShip", + "13002480": "bhvInSunkenShip2", + "130024ac": "bhvMistParticleSpawner", + "130024dc": "bhvWhitePuff1", + "13002500": "bhvWhitePuff2", + "13002528": "bhvWhitePuffSmoke2", + "13002558": "bhvPurpleSwitchHiddenBoxes", + "13002568": "bhvBlueCoinSwitch", + "13002588": "bhvHiddenBlueCoin", + "130025c0": "bhvOpenableCageDoor", + "130025e0": "bhvOpenableGrill", + "130025f8": "bhvWaterLevelDiamond", + "13002620": "bhvInitializeChangingWaterLevel", + "13002634": "bhvTweesterSandParticle", + "13002650": "bhvTweester", + "13002684": "bhvMerryGoRoundBooManager", + "1300269c": "bhvAnimatedTexture", + "130026d4": "bhvBooInCastle", + "13002710": "bhvBooWithCage", + "13002768": "bhvBalconyBigBoo", + "1300277c": "bhvMerryGoRoundBigBoo", + "13002790": "bhvGhostHuntBigBoo", + "130027d0": "bhvCourtyardBooTriplet", + "130027e4": "bhvBoo", + "130027f4": "bhvMerryGoRoundBoo", + "13002804": "bhvGhostHuntBoo", + "1300286c": "bhvHiddenStaircaseStep", + "13002898": "bhvBooBossSpawnedBridge", + "130028cc": "bhvBbhTiltingTrapPlatform", + "130028fc": "bhvHauntedBookshelf", + "1300292c": "bhvMeshElevator", + "13002968": "bhvMerryGoRound", + "13002998": "bhvPlaysMusicTrackWhenTouched", + "130029b0": "bhvInsideCannon", + "130029b4": "bhvBetaBowserAnchor", + "130029e4": "bhvStaticCheckeredPlatform", + "13002a10": "bhvUnused2A10", + "13002a20": "bhvUnusedFakeStar", + "13002a48": "bhvStaticObject", + "13002a54": "bhvUnused2A54", + "13002a5c": "bhvCastleFloorTrap", + "13002a7c": "bhvFloorTrapInCastle", + "13002aa4": "bhvTree", + "13002ad0": "bhvSparkle", + "13002af0": "bhvSparkleSpawn", + "13002b08": "bhvSparkleParticleSpawner", + "13002b5c": "bhvScuttlebug", + "13002ba0": "bhvScuttlebugSpawn", + "13002bb8": "bhvWhompKingBoss", + "13002bcc": "bhvSmallWhomp", + "13002c14": "bhvWaterSplash", + "13002c60": "bhvWaterDroplet", + "13002c7c": "bhvWaterDropletSplash", + "13002cb0": "bhvBubbleSplash", + "13002ce0": "bhvIdleWaterWave", + "13002d28": "bhvObjectWaterSplash", + "13002d50": "bhvShallowWaterWave", + "13002d7c": "bhvShallowWaterSplash", + "13002db0": "bhvObjectWaveTrail", + "13002dc0": "bhvWaveTrail", + "13002e04": "bhvTinyStrongWindParticle", + "13002e20": "bhvStrongWindParticle", + "13002e3c": "bhvSLSnowmanWind", + "13002e58": "bhvSLWalkingPenguin", + "13002ea8": "bhvYellowBall", + "13002ec0": "bhvMario", + "13002ef8": "bhvToadMessage", + "13002f40": "bhvUnlockDoorStar", + "13002f60": "bhvWarps60", + "13002f64": "bhvWarps64", + "13002f68": "bhvWarps68", + "13002f6c": "bhvWarps6C", + "13002f70": "bhvDeathWarp", + "13002f74": "bhvWarps74", + "13002f78": "bhvWarps78", + "13002f7c": "bhvWarps7C", + "13002f80": "bhvPaintingDeathWarp", + "13002f84": "bhvWarps84", + "13002f88": "bhvWarps88", + "13002f8c": "bhvWarps8C", + "13002f90": "bhvWarps90", + "13002f94": "bhvWarps94", + "13002fa0": "bhvRandomAnimatedTexture", + "13002fc0": "bhvYellowBackgroundInMenu", + "13002fe4": "bhvMenuButton", + "13003008": "bhvMenuButtonManager", + "1300302c": "bhvActSelectorStarType", + "13003048": "bhvActSelector", + "13003068": "bhvMovingYellowCoin", + "130030a4": "bhvMovingBlueCoin", + "130030d4": "bhvBlueCoinSliding", + "13003104": "bhvBlueCoinJumping", + "13003134": "bhvSeaweed", + "13003158": "bhvSeaweedBundle", + "13003174": "bhvBobomb", + "130031ac": "bhvBobombFuseSmoke", + "130031dc": "bhvBobombBuddy", + "13003228": "bhvBobombBuddyOpensCannon", + "13003274": "bhvCannonClosed", + "130032a8": "bhvWhirlpool", + "130032c8": "bhvJetStream", + "130032e0": "bhvMessagePanel", + "13003324": "bhvSignOnWall", + "13003354": "bhvHomingAmp", + "13003388": "bhvCirclingAmp", + "130033bc": "bhvButterfly", + "130033ec": "bhvHoot", + "13003420": "bhvBetaHoldableObject", + "13003454": "bhvCarrySomething1", + "1300345c": "bhvCarrySomething2", + "13003464": "bhvCarrySomething3", + "1300346c": "bhvCarrySomething4", + "13003474": "bhvCarrySomething5", + "1300347c": "bhvCarrySomething6", + "13003484": "bhvObjectBubble", + "130034c4": "bhvObjectWaterWave", + "13003510": "bhvExplosion", + "13003558": "bhvBobombBullyDeathSmoke", + "13003588": "bhvSmoke", + "130035b0": "bhvBobombExplosionBubble", + "13003600": "bhvBobombExplosionBubble3600", + "13003614": "bhvRespawner", + "1300362c": "bhvSmallBully", + "13003660": "bhvBigBully", + "13003694": "bhvBigBullyWithMinions", + "130036c8": "bhvSmallChillBully", + "13003700": "bhvBigChillBully", + "13003738": "bhvJetStreamRingSpawner", + "13003750": "bhvJetStreamWaterRing", + "13003798": "bhvMantaRayWaterRing", + "130037e0": "bhvMantaRayRingManager", + "130037ec": "bhvBowserBomb", + "1300381c": "bhvBowserBombExplosion", + "13003840": "bhvBowserBombSmoke", + "13003868": "bhvCelebrationStar", + "13003888": "bhvCelebrationStarSparkle", + "130038b0": "bhvStarKeyCollectionPuffSpawner", + "130038d0": "bhvLllDrawbridgeSpawner", + "130038e8": "bhvLllDrawbridge", + "13003910": "bhvSmallBomp", + "13003940": "bhvLargeBomp", + "13003970": "bhvWfSlidingPlatform", + "130039a0": "bhvMoneybag", + "130039d4": "bhvMoneybagHidden", + "13003a08": "bhvPitBowlingBall", + "13003a30": "bhvFreeBowlingBall", + "13003a58": "bhvBowlingBall", + "13003a80": "bhvTtmBowlingBallSpawner", + "13003aa4": "bhvBobBowlingBallSpawner", + "13003ac8": "bhvThiBowlingBallSpawner", + "13003ae0": "bhvRrCruiserWing", + "13003b00": "bhvSpindel", + "13003b30": "bhvSslMovingPyramidWall", + "13003b60": "bhvPyramidElevator", + "13003b98": "bhvPyramidElevatorTrajectoryMarkerBall", + "13003bb4": "bhvPyramidTop", + "13003bec": "bhvPyramidTopFragment", + "13003c0c": "bhvPyramidPillarTouchDetector", + "13003c30": "bhvWaterfallSoundLoop", + "13003c44": "bhvVolcanoSoundLoop", + "13003c58": "bhvCastleFlagWaving", + "13003c7c": "bhvBirdsSoundLoop", + "13003c90": "bhvAmbientSounds", + "13003ca4": "bhvSandSoundLoop", + "13003cb8": "bhvHiddenAt120Stars", + "13003ce4": "bhvSnowmansBottom", + "13003d0c": "bhvSnowmansHead", + "13003d34": "bhvSnowmansBodyCheckpoint", + "13003d4c": "bhvBigSnowmanWhole", + "13003d74": "bhvBigBoulder", + "13003da0": "bhvBigBoulderGenerator", + "13003db8": "bhvWingCap", + "13003dd8": "bhvMetalCap", + "13003df8": "bhvNormalCap", + "13003e1c": "bhvVanishCap", + "13003e3c": "bhvStar", + "13003e64": "bhvStarSpawnCoordinates", + "13003e8c": "bhvHiddenRedCoinStar", + "13003eac": "bhvRedCoin", + "13003ee4": "bhvBowserCourseRedCoinStar", + "13003efc": "bhvHiddenStar", + "13003f1c": "bhvHiddenStarTrigger", + "13003f40": "bhvTtmRollingLog", + "13003f78": "bhvLllVolcanoFallingTrap", + "13003fa4": "bhvLllRollingLog", + "13003fdc": "bhv1upWalking", + "13004010": "bhv1upRunningAway", + "13004044": "bhv1upSliding", + "1300407c": "bhv1Up", + "130040b4": "bhv1upJumpOnApproach", + "130040ec": "bhvHidden1up", + "13004124": "bhvHidden1upTrigger", + "13004148": "bhvHidden1upInPole", + "13004180": "bhvHidden1upInPoleTrigger", + "130041a4": "bhvHidden1upInPoleSpawner", + "130041bc": "bhvControllablePlatform", + "130041f0": "bhvControllablePlatformSub", + "13004218": "bhvBreakableBoxSmall", + "13004244": "bhvSlidingSnowMound", + "13004270": "bhvSnowMoundSpawn", + "13004284": "bhvWdwSquareFloatingPlatform", + "130042b4": "bhvWdwRectangularFloatingPlatform", + "130042e4": "bhvJrbFloatingPlatform", + "13004314": "bhvArrowLift", + "13004348": "bhvOrangeNumber", + "13004370": "bhvMantaRay", + "130043a0": "bhvFallingPillar", + "130043c4": "bhvFallingPillarHitbox", + "130043e0": "bhvPillarBase", + "13004400": "bhvJrbFloatingBox", + "1300442c": "bhvDecorativePendulum", + "1300444c": "bhvTreasureChestsShip", + "13004470": "bhvTreasureChestsJrb", + "13004494": "bhvTreasureChests", + "130044b8": "bhvTreasureChestBottom", + "130044e0": "bhvTreasureChestTop", + "130044fc": "bhvMips", + "13004538": "bhvYoshi", + "13004580": "bhvKoopa", + "130045d0": "bhvKoopaRaceEndpoint", + "130045f8": "bhvKoopaFlag", + "13004634": "bhvPokey", + "13004668": "bhvPokeyBodyPart", + "13004698": "bhvSwoop", + "130046dc": "bhvFlyGuy", + "1300472c": "bhvGoomba", + "13004770": "bhvGoombaTripletSpawner", + "1300478c": "bhvChainChomp", + "130047e4": "bhvChainChompChainPart", + "1300481c": "bhvWoodenPost", + "13004868": "bhvChainChompGate", + "13004898": "bhvWigglerHead", + "130048e0": "bhvWigglerBody", + "13004918": "bhvEnemyLakitu", + "13004954": "bhvCameraLakitu", + "13004988": "bhvCloud", + "130049ac": "bhvCloudPart", + "130049c8": "bhvSpiny", + "13004a00": "bhvMontyMole", + "13004a58": "bhvMontyMoleHole", + "13004a78": "bhvMontyMoleRock", + "13004ab0": "bhvPlatformOnTrack", + "13004af4": "bhvTrackBall", + "13004b1c": "bhvSeesawPlatform", + "13004b44": "bhvFerrisWheelAxle", + "13004b6c": "bhvFerrisWheelPlatform", + "13004b8c": "bhvWaterBombSpawner", + "13004ba8": "bhvWaterBomb", + "13004bd4": "bhvWaterBombShadow", + "13004bf0": "bhvTTCRotatingSolid", + "13004c24": "bhvTTCPendulum", + "13004c5c": "bhvTTCTreadmill", + "13004c94": "bhvTTCMovingBar", + "13004ccc": "bhvTTCCog", + "13004cf8": "bhvTTCPitBlock", + "13004d28": "bhvTTCElevator", + "13004d64": "bhvTTC2DRotator", + "13004d90": "bhvTTCSpinner", + "13004dbc": "bhvMrBlizzard", + "13004e08": "bhvMrBlizzardSnowball", + "13004e4c": "bhvSlidingPlatform2", + "13004e78": "bhvOctagonalPlatformRotating", + "13004ea0": "bhvAnimatesOnFloorSwitchPress", + "13004ecc": "bhvActivatedBackAndForthPlatform", + "13004ef8": "bhvRecoveryHeart", + "13004f10": "bhvWaterBombCannon", + "13004f28": "bhvCannonBarrelBubbles", + "13004f40": "bhvUnagi", + "13004f78": "bhvUnagiSubobject", + "13004f90": "bhvDorrie", + "13004fd4": "bhvHauntedChair", + "13005024": "bhvMadPiano", + "1300506c": "bhvFlyingBookend", + "130050b4": "bhvBookendSpawn", + "130050d4": "bhvHauntedBookshelfManager", + "130050f4": "bhvBookSwitch", + "13005120": "bhvFirePiranhaPlant", + "13005158": "bhvSmallPiranhaFlame", + "1300518c": "bhvFireSpitter", + "130051ac": "bhvFlyguyFlame", + "130051e0": "bhvSnufit", + "1300521c": "bhvSnufitBalls", + "1300525c": "bhvHorizontalGrindel", + "130052b4": "bhvEyerokBoss", + "130052d0": "bhvEyerokHand", + "13005310": "bhvKlepto", + "13005354": "bhvBird", + "13005380": "bhvRacingPenguin", + "130053c4": "bhvPenguinRaceFinishLine", + "130053dc": "bhvPenguinRaceShortcutCheck", + "130053f4": "bhvCoffinSpawner", + "13005414": "bhvCoffin", + "13005440": "bhvClamShell", + "13005468": "bhvSkeeter", + "130054a0": "bhvSkeeterWave", + "130054b8": "bhvSwingPlatform", + "130054ec": "bhvDonutPlatformSpawner", + "13005504": "bhvDonutPlatform", + "13005528": "bhvDDDPole", + "1300556c": "bhvRedCoinStarMarker", + "13005598": "bhvTripletButterfly", + "130055dc": "bhvBubba", + "13005610": "bhvBeginningLakitu", + "13005638": "bhvBeginningPeach", + "1300565c": "bhvEndBirds1", + "13005680": "bhvEndBirds2", + "130056a4": "bhvIntroScene", + "130056c0": "_behaviorSegmentEnd", + "007d1d80": "_behaviorSegmentRomEnd", + "8016f000": "_goddardSegmentStart", + "007cc6c0": "_goddardSegmentRomStart", + }, + "Refresh 10": { + "80000000": "EXCEPTION_TLB_MISS", + "a4000000": "SP_DMEM", + "a40004c0": "SP_DMEM_UNK0", + "a4000774": "SP_DMEM_UNK1", + "a4001000": "SP_IMEM", + "a4040010": "SP_STATUS_REG", + "a4080000": "SP_PC", + "a4300000": "MI_MODE_REG", + "a4300004": "MI_VERSION_REG", + "a4300008": "MI_INTR_REG", + "a430000c": "MI_INTR_MASK_REG", + "a4400010": "VI_CURRENT_REG", + "a450000c": "AI_STATUS_REG", + "a4600000": "PI_DRAM_ADDR_REG", + "a4600004": "PI_CART_ADDR_REG", + "a460000c": "PI_WR_LEN_REG", + "a4600010": "PI_STATUS_REG", + "a4700000": "RI_MODE_REG", + "a4700010": "RI_REFRESH_REG", + "a4800018": "SI_STATUS_REG", + "b0000008": "D_B0000008", + "b0000010": "D_B0000010", + "b0000014": "D_B0000014", + "c0000000": "D_C0000000", + "c0000008": "D_C0000008", + "c000000c": "D_C000000C", + "802f69cc": "func_sh_802F69CC", + "80302ef0": "osMotorStop", + "80303090": "osMotorStart", + "803033ac": "osMotorInit", + "803016a0": "func_sh_803016A0", + "803016d0": "func_sh_803016D0", + "80301820": "func_sh_80301820", + "00000000": "__romPos", + "04000000": "_bootSegmentStart", + "007cc6c0": "_bootSegmentRomStart", + "04000040": "ipl3_entry", + "04000b70": "ipl3_font", + "04001000": "_bootSegmentEnd", + "007cd6c0": "_bootSegmentRomEnd", + "80000400": ".", + "80000400": "_zbufferSegmentNoloadStart", + "80000400": "0x25800", + "80000400": "gZBuffer", + "80246000": "_mainSegmentStart", + "007cc6c0": "_mainSegmentRomStart", + "80246000": "entry_point", + "80246050": "handle_debug_key_sequences", + "80246170": "unknown_main_func", + "802461cc": "stub_main_1", + "802461dc": "stub_main_2", + "802461ec": "stub_main_3", + "802461fc": "setup_mesg_queues", + "802462e0": "alloc_pool", + "80246338": "create_thread", + "8024639c": "handle_nmi_request", + "802463ec": "receive_new_tasks", + "8024651c": "start_sptask", + "8024659c": "interrupt_gfx_sptask", + "802465ec": "start_gfx_sptask", + "80246648": "pretend_audio_sptask_done", + "8024669c": "handle_vblank", + "802467fc": "handle_sp_complete", + "8024694c": "handle_dp_complete", + "802469b8": "thread3_main", + "80246b14": "set_vblank_handler", + "80246b74": "send_sp_task_message", + "80246bb4": "dispatch_audio_sptask", + "80246c10": "send_display_list", + "80246c9c": "turn_on_audio", + "80246cb8": "turn_off_audio", + "80246cf0": "thread1_idle", + "80246df8": "main_func", + "80246e70": "my_rdp_init", + "802471a4": "my_rsp_init", + "80247284": "clear_z_buffer", + "802473c8": "display_frame_buffer", + "802474b8": "clear_frame_buffer", + "80247620": "clear_viewport", + "8024784c": "draw_screen_borders", + "802479bc": "make_viewport_clip_rect", + "80247b3c": "create_task_structure", + "80247ccc": "init_render_image", + "80247d14": "end_master_display_list", + "80247db4": "draw_reset_bars", + "80247f08": "rendering_init", + "80247fdc": "config_gfx_pool", + "80248090": "display_and_vsync", + "80248304": "adjust_analog_stick", + "80248498": "run_demo_inputs", + "80248638": "read_controller_inputs", + "80248824": "init_controllers", + "80248964": "setup_game_memory", + "80248af0": "thread5_game_loop", + "80248c40": "reset_volume", + "80248c58": "lower_background_noise", + "80248ce8": "raise_background_noise", + "80248d78": "disable_background_sound", + "80248dc0": "enable_background_sound", + "80248e08": "set_sound_mode", + "80248e54": "play_menu_sounds", + "80248fec": "play_painting_eject_sound", + "80249070": "play_infinite_stairs_music", + "80249178": "set_background_music", + "8024922c": "fadeout_music", + "8024927c": "fadeout_level_music", + "802492d0": "play_cutscene_music", + "80249310": "play_shell_music", + "8024934c": "stop_shell_music", + "80249398": "play_cap_music", + "80249404": "fadeout_cap_music", + "80249448": "stop_cap_music", + "80249494": "play_menu_sounds_extra", + "802494d8": "audio_game_loop_tick", + "80249500": "thread4_sound", + "802495e0": "level_control_timer", + "802496b8": "pressed_pause", + "80249764": "set_play_mode", + "8024978c": "warp_special", + "802497b8": "fade_into_special_warp", + "8024982c": "stub_level_update_1", + "8024983c": "load_level_init_text", + "8024995c": "init_door_warp", + "80249a10": "set_mario_initial_cap_powerup", + "80249ab4": "set_mario_initial_action", + "80249cd8": "init_mario_after_warp", + "8024a124": "warp_area", + "8024a18c": "warp_level", + "8024a1d8": "warp_credits", + "8024a374": "check_instant_warp", + "8024a584": "music_changed_through_warp", + "8024a700": "initiate_warp", + "8024a7b4": "get_painting_warp_node", + "8024a85c": "initiate_painting_warp", + "8024a9cc": "level_trigger_warp", + "8024aedc": "initiate_delayed_warp", + "8024b13c": "update_hud_values", + "8024b390": "basic_update", + "8024b3e4": "play_mode_normal", + "8024b5d4": "play_mode_paused", + "8024b6cc": "play_mode_frame_advance", + "8024b798": "level_set_transition", + "8024b7c0": "play_mode_change_area", + "8024b880": "play_mode_change_level", + "8024b9b8": "update_level", + "8024ba8c": "init_level", + "8024bcd8": "lvl_init_or_update", + "8024bd5c": "lvl_init_from_save_file", + "8024be14": "lvl_set_current_level", + "8024bfa0": "lvl_play_the_end_screen_sound", + "8024bff0": "get_mario_cap_flag", + "8024c0b8": "object_facing_mario", + "8024c16c": "mario_obj_angle_to_object", + "8024c1d8": "determine_interaction", + "8024c51c": "attack_object", + "8024c618": "mario_stop_riding_object", + "8024c66c": "mario_grab_used_object", + "8024c6c0": "mario_drop_held_object", + "8024c780": "mario_throw_held_object", + "8024c894": "mario_stop_riding_and_holding", + "8024c8fc": "does_mario_have_hat", + "8024c928": "mario_blow_off_cap", + "8024ca68": "mario_lose_cap_to_enemy", + "8024caf8": "mario_retrieve_cap", + "8024cb58": "able_to_grab_object", + "8024cbfc": "mario_get_collided_object", + "8024cc7c": "mario_check_object_grab", + "8024ce08": "bully_knock_back_mario", + "8024d0b4": "bounce_off_object", + "8024d130": "hit_object_from_below", + "8024d2bc": "determine_knockback_action", + "8024d578": "push_mario_out_of_object", + "8024d72c": "bounce_back_from_attack", + "8024d804": "should_push_or_pull_door", + "8024d8b0": "take_damage_from_interact_object", + "8024d998": "take_damage_and_knock_back", + "8024daac": "reset_mario_pitch", + "8024db2c": "interact_coin", + "8024dbf0": "interact_water_ring", + "8024dc28": "interact_star_or_key", + "8024de4c": "interact_bbh_entrance", + "8024df10": "interact_warp", + "8024e0c4": "interact_warp_door", + "8024e2fc": "get_door_save_file_flag", + "8024e420": "interact_door", + "8024e6ec": "interact_cannon_base", + "8024e778": "interact_igloo_barrier", + "8024e7d4": "interact_tornado", + "8024e8f0": "interact_whirlpool", + "8024e9d0": "interact_strong_wind", + "8024ead8": "interact_flame", + "8024ec54": "interact_snufit_bullet", + "8024ed84": "interact_clam_or_bubba", + "8024ee44": "interact_bully", + "8024eff8": "interact_shock", + "8024f170": "interact_mr_blizzard", + "8024f1e0": "interact_hit_from_below", + "8024f354": "interact_bounce_top", + "8024f4ac": "interact_unknown_08", + "8024f55c": "interact_damage", + "8024f5cc": "interact_breakable", + "8024f6a4": "interact_koopa_shell", + "8024f7a8": "check_object_grab_mario", + "8024f8bc": "interact_pole", + "8024fa60": "interact_hoot", + "8024fb30": "interact_cap", + "8024fd2c": "interact_grabbable", + "8024fe6c": "mario_can_talk", + "8024ff04": "check_read_sign", + "80250098": "check_npc_talk", + "80250198": "interact_text", + "80250230": "check_kick_or_punch_wall", + "802503f0": "mario_process_interactions", + "802505c8": "check_death_barrier", + "8025065c": "check_lava_boost", + "80250724": "pss_begin_slide", + "80250778": "pss_end_slide", + "802507fc": "mario_handle_special_floors", + "80250940": "is_anim_at_end", + "8025097c": "is_anim_past_end", + "802509b8": "set_mario_animation", + "80250b04": "set_mario_anim_with_accel", + "80250c7c": "set_anim_to_frame", + "80250d38": "is_anim_past_frame", + "80250e54": "find_mario_anim_flags_and_translation", + "80251020": "update_mario_pos_for_anim", + "802510dc": "return_mario_anim_y_translation", + "80251120": "play_sound_if_no_flag", + "8025118c": "play_mario_jump_sound", + "80251274": "adjust_sound_for_speed", + "80251310": "play_sound_and_spawn_particles", + "80251444": "play_mario_action_sound", + "802514ac": "play_mario_landing_sound", + "80251510": "play_mario_landing_sound_once", + "80251574": "play_mario_heavy_landing_sound", + "802515d8": "play_mario_heavy_landing_sound_once", + "8025163c": "play_mario_sound", + "80251708": "mario_set_forward_vel", + "8025177c": "mario_get_floor_class", + "802518a8": "mario_get_terrain_sound_addend", + "80251a48": "resolve_and_return_wall_collisions", + "80251afc": "vec3f_find_ceil", + "80251b54": "mario_facing_downhill", + "80251bd4": "mario_floor_is_slippery", + "80251cfc": "mario_floor_is_slope", + "80251e24": "mario_floor_is_steep", + "80251f24": "find_floor_height_relative_polar", + "80252000": "find_floor_slope", + "802521a0": "update_mario_sound_and_camera", + "8025229c": "set_steep_jump_action", + "80252cf4": "set_mario_action", + "80252e5c": "set_jump_from_landing", + "802530a0": "set_jumping_action", + "80253178": "drop_and_set_mario_action", + "802531c4": "hurt_and_set_mario_action", + "80253218": "check_common_action_exits", + "80253300": "check_common_hold_action_exits", + "802533e4": "transition_submerged_to_walking", + "80253488": "set_water_plunge_action", + "80253588": "squish_mario_model", + "80253720": "debug_print_speed_action_normal", + "80253838": "update_mario_button_inputs", + "8025395c": "update_mario_joystick_inputs", + "80253a60": "update_mario_geometry_inputs", + "80253d58": "update_mario_inputs", + "80253ec0": "set_submerged_cam_preset_and_spawn_bubbles", + "80254060": "update_mario_health", + "802542b4": "update_mario_info_for_cam", + "80254338": "mario_reset_bodystate", + "80254390": "sink_mario_in_quicksand", + "802543e8": "update_and_return_cap_flags", + "80254588": "mario_update_hitbox_and_cap_model", + "80254830": "execute_mario_action", + "80254b20": "init_mario", + "80254f44": "init_mario_from_save_file", + "80255080": "get_additive_y_vel_for_jumps", + "8025509c": "stub_mario_step_1", + "802550b0": "stub_mario_step_2", + "802550c0": "transfer_bully_speed", + "80255238": "init_bully_collision_data", + "802552fc": "mario_bonk_reflection", + "80255414": "mario_update_quicksand", + "80255654": "mario_push_off_steep_floor", + "8025570c": "mario_update_moving_sand", + "8025580c": "mario_update_windy_ground", + "802559b0": "stop_and_set_height_to_floor", + "80255a34": "stationary_ground_step", + "80255d88": "perform_ground_step", + "80255ec4": "check_ledge_grab", + "802560ac": "perform_air_quarter_step", + "802564e0": "apply_twirl_gravity", + "80256584": "should_strengthen_gravity_for_jump_ascent", + "8025661c": "apply_gravity", + "802569f8": "apply_vertical_wind", + "80256b24": "perform_air_step", + "80256cd8": "set_vel_from_pitch_and_yaw", + "80256d8c": "set_vel_from_yaw", + "80256e00": "get_credits_str_width", + "80256e88": "print_displaying_credits_entry", + "80257060": "bhv_end_peach_loop", + "802570dc": "bhv_end_toad_loop", + "80257198": "geo_switch_peach_eyes", + "802572b0": "get_star_collection_dialog", + "8025733c": "handle_save_menu", + "80257450": "spawn_obj_at_mario_rel_yaw", + "802574e8": "cutscene_take_cap_off", + "80257548": "cutscene_put_cap_on", + "802575a8": "mario_ready_to_speak", + "80257640": "set_mario_npc_dialog", + "80257748": "act_reading_npc_dialog", + "80257980": "act_waiting_for_dialog", + "80257a0c": "act_disappeared", + "80257ab0": "act_reading_automatic_dialog", + "80257ce4": "act_reading_sign", + "80257eac": "act_debug_free_move", + "80258184": "general_star_dance_handler", + "80258420": "act_star_dance", + "802584dc": "act_star_dance_water", + "802585c0": "act_fall_after_star_grab", + "802586cc": "common_death_handler", + "80258744": "act_standing_death", + "802587ec": "act_electrocution", + "8025883c": "act_suffocation", + "8025888c": "act_death_on_back", + "802588f8": "act_death_on_stomach", + "80258964": "act_quicksand_death", + "80258a7c": "act_eaten_by_bubba", + "80258b24": "launch_mario_until_land", + "80258ba8": "act_unlocking_key_door", + "80258dac": "act_unlocking_star_door", + "80258f94": "act_entering_star_door", + "80259264": "act_going_through_door", + "802593cc": "act_warp_door_spawn", + "802594d4": "act_emerge_from_pipe", + "80259608": "act_spawn_spin_airborne", + "80259740": "act_spawn_spin_landing", + "802597ac": "act_exit_airborne", + "80259854": "act_falling_exit_airborne", + "802598d0": "act_exit_land_save_dialog", + "80259c30": "act_death_exit", + "80259ce8": "act_unused_death_exit", + "80259d74": "act_falling_death_exit", + "80259e00": "act_special_exit_airborne", + "80259ef8": "act_special_death_exit", + "80259fcc": "act_spawn_no_spin_airborne", + "8025a040": "act_spawn_no_spin_landing", + "8025a0bc": "act_bbh_enter_spin", + "8025a494": "act_bbh_enter_jump", + "8025a610": "act_teleport_fade_out", + "8025a6fc": "act_teleport_fade_in", + "8025a858": "act_shocked", + "8025a9ac": "act_squished", + "8025ae0c": "act_putting_on_cap", + "8025aea8": "stuck_in_ground_handler", + "8025affc": "act_head_stuck_in_ground", + "8025b050": "act_butt_stuck_in_ground", + "8025b0a4": "act_feet_stuck_in_ground", + "8025bc80": "generate_yellow_sparkles", + "8025d798": "mario_execute_cutscene_action", + "8025dd70": "add_tree_leaf_particles", + "8025de1c": "play_climbing_sounds", + "8025df04": "set_pole_position", + "8025e21c": "act_holding_pole", + "8025e5a8": "act_climbing_pole", + "8025e7a4": "act_grab_pole_slow", + "8025e830": "act_grab_pole_fast", + "8025e930": "act_top_of_pole_transition", + "8025ea30": "act_top_of_pole", + "8025eb50": "perform_hanging_step", + "8025ecfc": "update_hang_moving", + "8025eed0": "update_hang_stationary", + "8025ef58": "act_start_hanging", + "8025f0b4": "act_hanging", + "8025f1e4": "act_hang_moving", + "8025f384": "let_go_of_ledge", + "8025f4b4": "climb_up_ledge", + "8025f560": "update_ledge_climb_camera", + "8025f644": "update_ledge_climb", + "8025f6c0": "act_ledge_grab", + "8025f970": "act_ledge_climb_slow", + "8025fa64": "act_ledge_climb_down", + "8025fae8": "act_ledge_climb_fast", + "8025fb90": "act_grabbed", + "8025fc6c": "act_in_cannon", + "80260154": "act_tornado_twirling", + "80260568": "check_common_automatic_cancels", + "802605d0": "mario_execute_automatic_action", + "802608b0": "check_common_idle_cancels", + "80260aac": "check_common_hold_idle_cancels", + "80260cb4": "act_idle", + "80260f94": "play_anim_sound", + "80261000": "act_start_sleeping", + "80261268": "act_sleeping", + "802614fc": "act_waking_up", + "8026168c": "act_shivering", + "802618d8": "act_coughing", + "802619d0": "act_hold_idle", + "80261ad0": "act_hold_heavy_idle", + "80261bf8": "act_standing_against_wall", + "80261cec": "act_in_quicksand", + "80261db4": "act_crouching", + "80261f70": "act_panting", + "80262080": "act_hold_panting_unused", + "8026217c": "stopping_step", + "802621dc": "act_braking_stop", + "802622dc": "act_butt_slide_stop", + "80262398": "act_hold_butt_slide_stop", + "80262490": "act_slide_kick_slide_stop", + "80262530": "act_start_crouching", + "80262650": "act_stop_crouching", + "80262770": "act_start_crawling", + "80262890": "act_stop_crawling", + "80262980": "act_shockwave_bounce", + "80262bc4": "landing_step", + "80262c34": "check_common_landing_cancels", + "80262d68": "act_jump_land_stop", + "80262dc4": "act_double_jump_land_stop", + "80262e20": "act_side_flip_land_stop", + "80262e94": "act_freefall_land_stop", + "80262ef0": "act_triple_jump_land_stop", + "80262f50": "act_backflip_land_stop", + "80262fec": "act_lava_boost_land", + "8026305c": "act_long_jump_land_stop", + "802630f8": "act_hold_jump_land_stop", + "802631f0": "act_hold_freefall_land_stop", + "802632e8": "act_air_throw_land", + "802633b4": "act_twirl_land", + "8026350c": "act_ground_pound_land", + "802635e8": "act_first_person", + "80263784": "check_common_stationary_cancels", + "80263898": "mario_execute_stationary_action", + "80263e60": "tilt_body_running", + "80263ee4": "play_step_sound", + "80264024": "align_with_floor", + "8026409c": "begin_walking_action", + "802640fc": "check_ledge_climb_down", + "802642b4": "slide_bonk", + "80264340": "set_triple_jump_action", + "8026440c": "update_sliding_angle", + "80264740": "update_sliding", + "80264b54": "apply_slope_accel", + "80264d80": "apply_landing_accel", + "80264e18": "update_shell_speed", + "80265080": "apply_slope_decel", + "802651b0": "update_decelerating_speed", + "80265244": "update_walking_speed", + "80265458": "should_begin_sliding", + "80265514": "analog_stick_held_back", + "80265558": "check_ground_dive_or_punch", + "80265620": "begin_braking_action", + "80265700": "anim_and_audio_for_walk", + "80265b1c": "anim_and_audio_for_hold_walk", + "80265d90": "anim_and_audio_for_heavy_walk", + "80265df8": "push_or_sidle_wall", + "80266038": "tilt_body_walking", + "802661cc": "tilt_body_ground_shell", + "80266354": "act_walking", + "802665b4": "act_move_punching", + "80266734": "act_hold_walking", + "8026699c": "act_hold_heavy_walking", + "80266af8": "act_turning_around", + "80266d4c": "act_finish_turning_around", + "80266e48": "act_braking", + "80266fc8": "act_decelerating", + "80267240": "act_hold_decelerating", + "80267504": "act_riding_shell_ground", + "80267728": "act_crawling", + "8026795c": "act_burning_ground", + "80267c24": "tilt_body_butt_slide", + "80267ce4": "common_slide_action", + "80267fa4": "common_slide_action_with_jump", + "80268074": "act_butt_slide", + "802680d4": "act_hold_butt_slide", + "80268168": "act_crouch_slide", + "80268338": "act_slide_kick_slide", + "802684ac": "stomach_slide_action", + "802685c0": "act_stomach_slide", + "80268608": "act_hold_stomach_slide", + "80268684": "act_dive_slide", + "802687b8": "common_ground_knockback_action", + "802689f8": "act_hard_backward_ground_kb", + "80268adc": "act_hard_forward_ground_kb", + "80268b64": "act_backward_ground_kb", + "80268bb0": "act_forward_ground_kb", + "80268bfc": "act_soft_backward_ground_kb", + "80268c48": "act_soft_forward_ground_kb", + "80268c94": "act_ground_bonk", + "80268d04": "act_death_exit_land", + "80268dcc": "common_landing_action", + "80268f78": "common_landing_cancels", + "80269108": "act_jump_land", + "80269170": "act_freefall_land", + "802691d8": "act_side_flip_land", + "80269264": "act_hold_jump_land", + "80269300": "act_hold_freefall_land", + "8026939c": "act_long_jump_land", + "8026947c": "act_double_jump_land", + "802694e4": "act_triple_jump_land", + "80269588": "act_backflip_land", + "80269640": "quicksand_jump_land_action", + "80269788": "act_quicksand_jump_land", + "802697dc": "act_hold_quicksand_jump_land", + "80269830": "check_common_moving_cancels", + "80269954": "mario_execute_moving_action", + "80269f40": "play_flip_sounds", + "80269fc0": "play_far_fall_sound", + "8026a090": "play_knockback_sound", + "8026a12c": "lava_boost_on_wall", + "8026a224": "check_fall_damage", + "8026a400": "check_kick_or_dive_in_air", + "8026a494": "should_get_stuck_in_ground", + "8026a598": "check_fall_damage_or_get_stuck", + "8026a62c": "check_horizontal_wind", + "8026a818": "update_air_with_turn", + "8026aa48": "update_air_without_turn", + "8026acd8": "update_lava_boost_or_twirling", + "8026ae5c": "update_flying_yaw", + "8026b004": "update_flying_pitch", + "8026b17c": "update_flying", + "8026b444": "common_air_action_step", + "8026b6a0": "act_jump", + "8026b740": "act_double_jump", + "8026b814": "act_triple_jump", + "8026b90c": "act_backflip", + "8026b9ac": "act_freefall", + "8026bab8": "act_hold_jump", + "8026bbb4": "act_hold_freefall", + "8026bcc0": "act_side_flip", + "8026bdcc": "act_wall_kick_air", + "8026be78": "act_long_jump", + "8026bf40": "act_riding_shell_air", + "8026c034": "act_twirling", + "8026c1e0": "act_dive", + "8026c4b8": "act_air_throw", + "8026c5d0": "act_water_jump", + "8026c738": "act_hold_water_jump", + "8026c880": "act_steep_jump", + "8026c9fc": "act_ground_pound", + "8026cd0c": "act_burning_jump", + "8026ce50": "act_burning_fall", + "8026cf28": "act_crazy_box_bounce", + "8026d1b0": "common_air_knockback_step", + "8026d33c": "check_wall_kick", + "8026d3c8": "act_backward_air_kb", + "8026d43c": "act_forward_air_kb", + "8026d4b0": "act_hard_backward_air_kb", + "8026d508": "act_hard_forward_air_kb", + "8026d560": "act_thrown_backward", + "8026d608": "act_thrown_forward", + "8026d6fc": "act_soft_bonk", + "8026d770": "act_getting_blown", + "8026d988": "act_air_hit_wall", + "8026db54": "act_forward_rollout", + "8026dcf4": "act_backward_rollout", + "8026de98": "act_butt_slide_air", + "8026e088": "act_hold_butt_slide_air", + "8026e2b4": "act_lava_boost", + "8026e59c": "act_slide_kick", + "8026e810": "act_jump_kick", + "8026e968": "act_shot_from_cannon", + "8026ec00": "act_flying", + "8026f158": "act_riding_hoot", + "8026f2ec": "act_flying_triple_jump", + "8026f614": "act_top_of_pole_jump", + "8026f660": "act_vertical_wind", + "8026f840": "act_special_triple_jump", + "8026fa18": "check_common_airborne_cancels", + "8026fb04": "mario_execute_airborne_action", + "8027499c": "mario_execute_submerged_action", + "80274eb0": "animated_stationary_ground_step", + "80274f10": "mario_update_punch_sequence", + "80275328": "act_punching", + "8027546c": "act_picking_up", + "802755fc": "act_dive_picking_up", + "802756c8": "act_placing_down", + "80275794": "act_throwing", + "802758c0": "act_heavy_throw", + "802759b4": "act_stomach_slide_stop", + "80275a80": "act_picking_up_bowser", + "80275b34": "act_holding_bowser", + "80275e78": "act_releasing_bowser", + "80275f0c": "check_common_object_cancels", + "80275fe0": "mario_execute_object_action", + "802761d0": "geo_envfx_main", + "802763d4": "geo_skybox_main", + "802764b0": "geo_draw_mario_head_goddard", + "8027684c": "bhv_toad_message_loop", + "80276910": "bhv_toad_message_init", + "80276bb8": "bhv_unlock_door_star_init", + "80276ccc": "bhv_unlock_door_star_loop", + "802770a4": "geo_mirror_mario_set_alpha", + "80277150": "geo_switch_mario_stand_run", + "802771bc": "geo_switch_mario_eyes", + "80277294": "geo_mario_tilt_torso", + "802773a4": "geo_mario_head_rotation", + "802774f4": "geo_switch_mario_hand", + "802775cc": "geo_mario_hand_foot_scaler", + "802776d8": "geo_switch_mario_cap_effect", + "80277740": "geo_switch_mario_cap_on_off", + "80277824": "geo_mario_rotate_wing_cap_wings", + "8027795c": "geo_switch_mario_hand_grab_pos", + "80277b14": "geo_render_mirror_mario", + "80277d6c": "geo_mirror_mario_backface_culling", + "80277ee0": "set_segment_base_addr", + "80277f20": "get_segment_base_addr", + "80277f50": "segmented_to_virtual", + "80277fa8": "virtual_to_segmented", + "80277ff0": "move_segment_table_to_dmem", + "80278074": "main_pool_init", + "80278120": "main_pool_alloc", + "80278238": "main_pool_free", + "80278358": "main_pool_realloc", + "802783c8": "main_pool_available", + "802783e8": "main_pool_push_state", + "80278498": "main_pool_pop_state", + "8027868c": "load_segment", + "802786f0": "load_to_fixed_pool_addr", + "802787d8": "load_segment_decompress", + "802788b4": "load_segment_decompress_heap", + "80278974": "load_engine_code_segment", + "80278a14": "alloc_only_pool_init", + "80278ab8": "alloc_only_pool_alloc", + "80278b28": "alloc_only_pool_resize", + "80278b98": "mem_pool_init", + "80278c58": "mem_pool_alloc", + "80278d74": "mem_pool_free", + "80278f2c": "alloc_display_list", + "80279028": "func_80278A78", + "80279084": "load_patchable_table", + "80279840": "save_file_do_save", + "802798fc": "save_file_erase", + "80279960": "save_file_copy", + "802799dc": "save_file_load_all", + "80279bc8": "save_file_reload", + "80279c44": "save_file_collect_star_or_key", + "80279e44": "save_file_exists", + "80279e80": "save_file_get_max_coin_score", + "80279f80": "save_file_get_course_star_count", + "8027a010": "save_file_get_total_star_count", + "8027a0a8": "save_file_set_flags", + "8027a0f4": "save_file_clear_flags", + "8027a16c": "save_file_get_flags", + "8027a1c8": "save_file_get_star_flags", + "8027a23c": "save_file_set_star_flags", + "8027a310": "save_file_get_course_coin_score", + "8027a340": "save_file_is_cannon_unlocked", + "8027a390": "save_file_set_cannon_unlocked", + "8027a418": "save_file_set_cap_pos", + "8027a4ac": "save_file_get_cap_pos", + "8027a564": "save_file_set_sound_mode", + "8027a5b4": "save_file_get_sound_mode", + "8027a5d4": "save_file_move_cap_to_default_location", + "8027a698": "disable_warp_checkpoint", + "8027a6b0": "check_if_should_set_warp_checkpoint", + "8027a718": "check_warp_checkpoint", + "8027a7d0": "override_viewport_and_clip", + "8027a83c": "set_warp_transition_rgb", + "8027a8b0": "print_intro_text", + "8027a93c": "get_mario_spawn_type", + "8027a9c8": "area_get_warp_node", + "8027aa28": "area_get_warp_node_from_params", + "8027aa74": "load_obj_warp_nodes", + "8027ab04": "clear_areas", + "8027ad74": "clear_area_graph_nodes", + "8027ae44": "load_area", + "8027af48": "unload_area", + "8027afbc": "load_mario_area", + "8027b038": "unload_mario_area", + "8027b0c0": "change_area", + "8027b164": "area_update_objects", + "8027b1a0": "play_transition", + "8027b35c": "play_transition_after_delay", + "8027b3b4": "render_game", + "8027cf38": "geo_set_animation_globals", + "8027da84": "geo_process_held_object", + "8027de68": "geo_try_process_children", + "8027dea8": "geo_process_node_and_siblings", + "8027e130": "geo_process_root", + "8027e3e0": "profiler_log_thread5_time", + "8027e490": "profiler_log_thread4_time", + "8027e520": "profiler_log_gfx_time", + "8027e5cc": "profiler_log_vblank_time", + "8027e65c": "draw_profiler_bar", + "8027e958": "draw_reference_profiler_bars", + "8027ebcc": "draw_profiler_mode_1", + "8027eeac": "draw_profiler_mode_0", + "8027f460": "draw_profiler", + "8027f4e0": "decompress", + "8027f590": "set_camera_shake_from_hit", + "8027f8b8": "set_environmental_camera_shake", + "8027f9f0": "set_camera_shake_from_point", + "8027fb74": "unused_set_camera_pitch_shake_env", + "8027fc18": "calc_y_to_curr_floor", + "8027fe20": "focus_on_mario", + "8027fff8": "set_camera_height", + "80280368": "look_down_slopes", + "802804f4": "pan_ahead_of_player", + "802806a4": "find_in_bounds_yaw_wdw_bob_thi", + "80280810": "update_radial_camera", + "80280970": "update_8_directions_camera", + "80280b00": "radial_camera_move", + "80281188": "lakitu_zoom", + "802813bc": "radial_camera_input_default", + "802813ec": "update_yaw_and_dist_from_c_up", + "8028146c": "mode_radial_camera", + "80281588": "mode_8_directions_camera", + "802816a0": "update_outward_radial_camera", + "802817fc": "mode_outward_radial_camera", + "80281904": "update_parallel_tracking_camera", + "80282280": "update_fixed_camera", + "802826a0": "update_boss_fight_camera", + "80282c0c": "unused_update_mode_5_camera", + "80282c3c": "mode_boss_fight_camera", + "80282c7c": "mode_parallel_tracking_camera", + "80282ce0": "mode_fixed_camera", + "80282d78": "update_behind_mario_camera", + "80283340": "mode_behind_mario", + "80283578": "update_slide_camera", + "802839e4": "mode_behind_mario_camera", + "80283a18": "nop_update_water_camera", + "80283a34": "mode_water_surface_camera", + "80283a68": "update_mario_camera", + "80283af8": "update_default_camera", + "80284cb8": "mode_default_camera", + "80284cfc": "mode_lakitu_camera", + "80284d38": "mode_mario_camera", + "80284d74": "update_spiral_stairs_camera", + "802850ac": "mode_spiral_stairs_camera", + "802850ec": "update_slide_or_0f_camera", + "802851dc": "mode_slide_camera", + "8028526c": "store_lakitu_cam_info_for_c_up", + "802852f4": "set_mode_c_up", + "80285370": "exit_c_up", + "80285808": "update_c_up", + "802858a4": "move_mario_head_c_up", + "80285a2c": "move_into_c_up", + "80285d20": "mode_c_up_camera", + "80285ed8": "update_in_cannon", + "80285f60": "mode_cannon_camera", + "8028603c": "transition_next_state", + "80286088": "transition_to_camera_mode", + "80286188": "set_camera_mode", + "80286420": "update_lakitu", + "802868f8": "update_camera", + "80286f68": "reset_camera", + "8028724c": "init_camera", + "802879ec": "zoom_out_if_paused_and_outside", + "80287bc4": "select_mario_cam_mode", + "80287be0": "create_camera", + "80287cb8": "update_graph_node_camera", + "80287d30": "geo_camera_main", + "80287dc0": "stub_camera_2", + "80287dd4": "stub_camera_3", + "80287de8": "vec3f_sub", + "80287e28": "object_pos_to_vec3f", + "80287e50": "vec3f_to_object_pos", + "80287e78": "unused_object_angle_to_vec3s", + "80287ea0": "evaluate_cubic_spline", + "802882e4": "move_point_along_spline", + "80288624": "cam_select_alt_mode", + "80288718": "set_cam_angle", + "80288888": "set_handheld_shake", + "802889b0": "shake_camera_handheld", + "80288ce4": "find_c_buttons_pressed", + "80288e68": "update_camera_hud_status", + "80288f5c": "collide_with_walls", + "80289198": "vec3f_compare", + "80289214": "clamp_pitch", + "802892d8": "is_within_100_units_of_mario", + "8028935c": "set_or_approach_f32_asymptotic", + "802893f4": "approach_f32_asymptotic_bool", + "80289488": "approach_f32_asymptotic", + "802894b4": "approach_s16_asymptotic_bool", + "8028956c": "approach_s16_asymptotic", + "80289610": "approach_vec3f_asymptotic", + "80289684": "set_or_approach_vec3f_asymptotic", + "802896f8": "approach_vec3s_asymptotic", + "8028976c": "camera_approach_s16_symmetric_bool", + "8028984c": "camera_approach_s16_symmetric", + "8028993c": "set_or_approach_s16_symmetric", + "802899cc": "camera_approach_f32_symmetric_bool", + "80289b0c": "camera_approach_f32_symmetric", + "80289c00": "random_vec3s", + "80289d20": "reduce_by_dist_from_camera", + "80289f88": "clamp_positions_and_find_yaw", + "8028a080": "calc_avoid_yaw", + "8028a0f4": "is_surf_within_bounding_box", + "8028a4ec": "is_behind_surface", + "8028a6bc": "is_range_behind_surface", + "8028a7ec": "is_mario_behind_surface", + "8028a834": "scale_along_line", + "8028a8e8": "is_pos_in_bounds", + "8028aa28": "calculate_pitch", + "8028aad8": "calculate_yaw", + "8028ab60": "calculate_angles", + "8028ac28": "calc_abs_dist", + "8028accc": "calc_hor_dist", + "8028ad4c": "rotate_in_xz", + "8028ae1c": "rotate_in_yz", + "8028aef0": "set_camera_pitch_shake", + "8028af4c": "set_camera_yaw_shake", + "8028b00c": "set_camera_roll_shake", + "8028b068": "set_pitch_shake_from_point", + "8028b11c": "set_yaw_shake_from_point", + "8028b1d0": "increment_shake_offset", + "8028b218": "shake_camera_pitch", + "8028b32c": "shake_camera_yaw", + "8028b438": "shake_camera_roll", + "8028b50c": "offset_yaw_outward_radial", + "8028b724": "cutscene_intro_peach_play_message_music", + "8028b754": "cutscene_intro_peach_play_lakitu_flying_music", + "8028b784": "play_camera_buzz_if_cdown", + "8028b7c4": "play_camera_buzz_if_cbutton", + "8028b804": "play_camera_buzz_if_c_sideways", + "8028b850": "play_sound_cbutton_up", + "8028b884": "play_sound_cbutton_down", + "8028b8b8": "play_sound_cbutton_side", + "8028b8ec": "play_sound_button_change_blocked", + "8028b920": "play_sound_rbutton_changed", + "8028b954": "play_sound_if_cam_switched_to_lakitu_or_mario", + "8028b9c4": "radial_camera_input", + "8028bd34": "trigger_cutscene_dialog", + "8028bd98": "handle_c_button_movement", + "8028c038": "clear_cutscene_vars", + "8028c13c": "start_cutscene", + "8028c18c": "determine_dance_cutscene", + "8028c26c": "open_door_cutscene", + "8028c2c8": "get_cutscene_from_mario_status", + "8028c7a0": "warp_camera", + "8028c8f0": "approach_camera_height", + "8028c9ac": "stub_camera_4", + "8028c9cc": "set_focus_rel_mario", + "8028cbf0": "offset_rotated", + "8028cd94": "offset_rotated_coords", + "8028cdec": "determine_pushing_or_pulling_door", + "8028ce24": "next_lakitu_state", + "8028d44c": "set_camera_mode_fixed", + "8028d5ac": "set_camera_mode_8_directions", + "8028d5fc": "set_camera_mode_boss_fight", + "8028d658": "set_camera_mode_close_cam", + "8028d698": "set_camera_mode_radial", + "8028d79c": "parallel_tracking_init", + "8028d888": "set_fixed_cam_axis_sa_lobby", + "8028d92c": "check_blocking_area_processing", + "8028da18": "cam_rr_exit_building_side", + "8028da50": "cam_rr_exit_building_top", + "8028daec": "cam_rr_enter_building_window", + "8028db38": "cam_rr_enter_building", + "8028dbb4": "cam_rr_enter_building_side", + "8028dbf4": "cam_cotmc_exit_waterfall", + "8028dc1c": "cam_sl_snowman_head_8dir", + "8028dc70": "cam_sl_free_roam", + "8028dca4": "move_camera_through_floor_while_descending", + "8028dd48": "cam_hmc_enter_maze", + "8028de2c": "cam_hmc_elevator_black_hole", + "8028de5c": "cam_hmc_elevator_maze_emergency_exit", + "8028de90": "cam_hmc_elevator_lake", + "8028dec4": "cam_hmc_elevator_maze", + "8028def8": "cam_ssl_enter_pyramid_top", + "8028df24": "cam_ssl_pyramid_center", + "8028df6c": "cam_ssl_boss_room", + "8028dfb4": "cam_thi_move_cam_through_tunnel", + "8028dfe8": "cam_thi_look_through_tunnel", + "8028e01c": "cam_bob_tower", + "8028e064": "cam_bob_default_free_roam", + "8028e098": "cam_castle_hmc_start_pool_cutscene", + "8028e0ec": "cam_castle_lobby_entrance", + "8028e164": "cam_castle_look_upstairs", + "8028e210": "cam_castle_basement_look_downstairs", + "8028e298": "cam_castle_enter_lobby", + "8028e300": "cam_castle_enter_spiral_stairs", + "8028e38c": "cam_castle_close_mode", + "8028e3b8": "cam_castle_leave_lobby_sliding_door", + "8028e3f0": "cam_castle_enter_lobby_sliding_door", + "8028e41c": "cam_bbh_room_6", + "8028e450": "cam_bbh_fall_off_roof", + "8028e47c": "cam_bbh_fall_into_pool", + "8028e524": "cam_bbh_room_1", + "8028e55c": "cam_bbh_leave_front_door", + "8028e594": "cam_bbh_room_2_lower", + "8028e5cc": "cam_bbh_room_4", + "8028e604": "cam_bbh_room_8", + "8028e63c": "cam_bbh_room_5_library", + "8028e674": "cam_bbh_room_5_library_to_hidden_transition", + "8028e6c4": "cam_bbh_room_5_hidden_to_library_transition", + "8028e714": "cam_bbh_room_5_hidden", + "8028e758": "cam_bbh_room_3", + "8028e790": "cam_bbh_room_7_mr_i", + "8028e7c8": "cam_bbh_room_7_mr_i_to_coffins_transition", + "8028e818": "cam_bbh_room_7_coffins_to_mr_i_transition", + "8028e868": "cam_bbh_elevator_room_lower", + "8028e8a0": "cam_bbh_room_0_back_entrance", + "8028e8cc": "cam_bbh_elevator", + "8028e930": "cam_bbh_room_12_upper", + "8028e974": "cam_bbh_enter_front_door", + "8028e9a0": "cam_bbh_room_2_library", + "8028e9d8": "cam_bbh_room_2_library_to_trapdoor_transition", + "8028ea28": "cam_bbh_room_2_trapdoor", + "8028ea60": "cam_bbh_room_2_trapdoor_transition", + "8028eab0": "cam_bbh_room_9_attic", + "8028eae8": "cam_bbh_room_9_attic_transition", + "8028eb38": "cam_bbh_room_9_mr_i_transition", + "8028eb88": "cam_bbh_room_13_balcony", + "8028ebc0": "cam_bbh_room_0", + "8028ec04": "cam_ccm_enter_slide_shortcut", + "8028ec2c": "cam_ccm_leave_slide_shortcut", + "8028ec58": "surface_type_modes", + "8028ed30": "set_mode_if_not_set_by_surface", + "8028ed98": "surface_type_modes_thi", + "8028eeb0": "camera_course_processing", + "8028f670": "resolve_geometry_collisions", + "8028f914": "rotate_camera_around_walls", + "8028fc9c": "find_mario_floor_and_ceil", + "8028fe24": "start_object_cutscene", + "8028fe58": "start_object_cutscene_without_focus", + "8028fe84": "unused_dialog_cutscene_response", + "8028ff04": "cutscene_object_with_dialog", + "8028ffc8": "cutscene_object_without_dialog", + "8029000c": "cutscene_object", + "80290098": "update_camera_yaw", + "802900e0": "cutscene_reset_spline", + "80290104": "stop_cutscene_and_retrieve_stored_info", + "80290168": "cap_switch_save", + "802901a4": "init_spline_point", + "802901fc": "copy_spline_segment", + "802903b8": "cutscene_common_set_dialog_state", + "802904a8": "cutscene_intro_peach_start_letter_music", + "802904e4": "cutscene_intro_peach_start_flying_music", + "8029051c": "reset_pan_distance", + "8029053c": "player2_rotate_cam", + "80290784": "store_info_cannon", + "802907f4": "retrieve_info_cannon", + "80290864": "store_info_star", + "802908e8": "retrieve_info_star", + "802909d0": "pan_camera", + "80290a5c": "cutscene_shake_explosion", + "80290abc": "rotate_and_move_vec3f", + "80290b54": "set_flag_post_door", + "80290ba4": "cutscene_soften_music", + "80290bd8": "cutscene_unsoften_music", + "80290c1c": "cutscene_unused_start", + "80290c30": "cutscene_unused_loop", + "80290c44": "cutscene_ending_mario_fall_start", + "80290c9c": "cutscene_ending_mario_fall_focus_mario", + "80290d90": "cutscene_ending_mario_fall", + "80290e00": "cutscene_ending_mario_land_closeup", + "80290e74": "cutscene_ending_reset_spline", + "80290eb0": "cutscene_ending_fly_up_to_window", + "80290f1c": "cutscene_ending_stars_free_peach", + "80290f8c": "cutscene_ending_mario_land", + "80291074": "cutscene_ending_peach_appear_closeup", + "80291108": "cutscene_ending_peach_appears", + "802911c8": "cutscene_ending_peach_descends_start", + "80291208": "cutscene_ending_follow_peach_descent", + "8029127c": "cutscene_ending_peach_descent_lower_focus", + "802912b8": "cutscene_ending_peach_descent_back_to_mario", + "80291354": "cutscene_ending_peach_descends", + "8029142c": "cutscene_ending_mario_to_peach", + "802914cc": "cutscene_ending_look_up_at_castle", + "80291514": "cutscene_ending_peach_wakeup", + "802915d4": "cutscene_ending_dialog", + "80291654": "cutscene_ending_kiss_closeup", + "802916b8": "cutscene_ending_kiss_here_we_go", + "80291774": "cutscene_ending_kiss", + "802917e4": "cutscene_ending_look_at_sky", + "8029184c": "cutscene_ending_zoom_fov", + "80291870": "cutscene_ending_cake_for_mario", + "80291924": "cutscene_ending_stop", + "80291964": "cutscene_grand_star_start", + "802919dc": "cutscene_grand_star_front_of_mario", + "80291ab4": "cutscene_grand_star_mario_jump", + "80291b18": "cutscene_grand_star_accel_cvar2", + "80291b68": "cutscene_grand_star_approach_mario", + "80291bf4": "cutscene_grand_star_move_cvar2", + "80291c3c": "cutscene_grand_star_focus_mario", + "80291cd0": "cutscene_grand_star", + "80291db0": "cutscene_grand_star_fly_start", + "80291e84": "cutscene_grand_star_fly_move_to_mario", + "80291f18": "cutscene_grand_star_fly_mario_offscreen", + "80292038": "cutscene_grand_star_fly_app_cvars", + "80292164": "cutscene_grand_star_fly", + "802921fc": "focus_in_front_of_mario", + "8029228c": "cutscene_dance_move_to_mario", + "80292324": "cutscene_dance_rotate", + "80292370": "cutscene_dance_rotate_move_back", + "802923b8": "cutscene_dance_rotate_move_towards_mario", + "80292414": "cutscene_dance_default_focus_mario", + "8029244c": "cutscene_dance_rotate_focus_mario", + "80292484": "cutscene_dance_shake_fov", + "802924b8": "cutscene_dance_default_rotate", + "80292628": "star_dance_bound_yaw", + "802926dc": "cutscene_dance_closeup_start", + "802927d0": "cutscene_dance_closeup_focus_mario", + "80292868": "cutscene_dance_closeup_fly_above", + "80292974": "cutscene_dance_closeup_fly_closer", + "80292a20": "cutscene_dance_closeup_zoom", + "80292a4c": "cutscene_dance_closeup_shake_fov", + "80292a80": "cutscene_dance_closeup", + "80292c00": "cutscene_dance_fly_away_start", + "80292d80": "cutscene_dance_fly_away_approach_mario", + "80292e2c": "cutscene_dance_fly_away_focus_mario", + "80292ec4": "cutscene_pan_cvar9", + "80292f40": "cutscene_dance_fly_rotate_around_mario", + "80292f98": "cutscene_dance_fly_away_rotate_while_flying", + "80292fe4": "cutscene_dance_fly_away_shake_fov", + "80293018": "cutscene_dance_fly_away", + "802930f0": "cutscene_key_dance_jump_cvar", + "80293164": "cutscene_key_dance_jump_closeup", + "802931c0": "cutscene_key_dance_jump_lower_left", + "80293220": "cutscene_key_dance_jump_above", + "8029328c": "cutscene_key_dance_jump_last", + "802932f4": "cutscene_key_dance_shake_fov", + "80293328": "cutscene_key_dance_handheld_shake", + "80293354": "cutscene_key_dance_focus_mario", + "8029338c": "cutscene_key_dance", + "80293488": "cutscene_bowser_area_shake_fov", + "802934b4": "cutscene_bowser_area_start_bowser_walking", + "802934d8": "cutscene_bowser_arena_set_pos", + "80293548": "cutscene_bowser_arena_focus_sine", + "802935e0": "cutscene_bowser_arena_set_focus", + "80293624": "cutscene_bowser_arena_adjust_offsets", + "8029369c": "cutscene_bowser_arena_pan_left", + "802936dc": "cutscene_bowser_arena_mario_dialog", + "80293708": "cutscene_stop_dialog", + "80293734": "cutscene_bowser_arena_start", + "802937e8": "bowser_fight_intro_dialog", + "8029386c": "cutscene_bowser_arena_dialog", + "802938c8": "cutscene_bowser_arena_end", + "80293944": "cutscene_bowser_arena", + "80293abc": "cutscene_star_spawn_store_info", + "80293ae8": "cutscene_star_spawn_focus_star", + "80293b70": "cutscene_star_spawn_update_boss_fight", + "80293bf4": "cutscene_star_spawn_fly_back", + "80293c2c": "cutscene_star_spawn", + "80293cb0": "cutscene_star_spawn_back", + "80293d5c": "cutscene_star_spawn_end", + "80293d90": "cutscene_exit_waterfall_warp", + "80293dd4": "cutscene_exit_to_castle_grounds_focus_mario", + "80293e7c": "cutscene_exit_waterfall", + "80293ed8": "cutscene_exit_to_castle_grounds_end", + "80293f2c": "cutscene_exit_fall_to_castle_grounds_warp", + "80293f70": "cutscene_exit_fall_to_castle_grounds", + "80293fcc": "cutscene_red_coin_star_start", + "80294024": "cutscene_red_coin_star_focus_xz", + "80294088": "cutscene_red_coin_star_focus_y", + "802940cc": "cutscene_red_coin_star_look_up_at_star", + "8029410c": "cutscene_red_coin_star_warp", + "802942cc": "cutscene_red_coin_star_set_fov", + "802942f0": "cutscene_red_coin_star", + "802943d4": "cutscene_red_coin_star_end", + "80294428": "cutscene_goto_cvar_pos", + "80294718": "cutscene_prepare_cannon_start", + "802947a4": "cutscene_prepare_cannon_fly_to_cannon", + "8029480c": "cannon_approach_prev", + "802948a0": "cutscene_prepare_cannon_fly_back", + "80294a14": "cutscene_prepare_cannon", + "80294a94": "cutscene_prepare_cannon_end", + "80294ae8": "water_death_move_to_mario_side", + "80294b78": "death_goto_mario", + "80294bb4": "cutscene_death_standing_start", + "80294c28": "cutscene_death_standing_goto_mario", + "80294c5c": "cutscene_death_standing", + "80294cc4": "cutscene_death_stomach_start", + "80294d48": "cutscene_death_stomach_goto_mario", + "80294db4": "cutscene_death_stomach", + "80294e24": "cutscene_bbh_death_start", + "80294ea8": "cutscene_bbh_death_goto_mario", + "80294ee8": "cutscene_bbh_death", + "80294f58": "cutscene_quicksand_death_start", + "80294f94": "cutscene_quicksand_death_goto_mario", + "80294fec": "cutscene_quicksand_death", + "802950b0": "cutscene_suffocation_fly_away", + "80295140": "cutscene_suffocation_stay_above_gas", + "802951f0": "cutscene_suffocation_rotate", + "80295270": "cutscene_suffocation", + "80295310": "cutscene_enter_pool_start", + "802953dc": "cutscene_enter_pool_loop", + "80295418": "cutscene_enter_pool", + "80295480": "cutscene_pyramid_top_explode_start", + "802954ec": "cutscene_pyramid_top_explode_zoom_in", + "80295518": "cutscene_pyramid_top_explode_focus", + "80295580": "cutscene_pyramid_top_explode_warp", + "80295670": "cutscene_pyramid_top_explode_closeup", + "80295740": "cutscene_pyramid_top_explode_cam_shake", + "8029576c": "cutscene_pyramid_top_explode_warp_back", + "802957c8": "cutscene_pyramid_top_explode", + "80295894": "cutscene_pyramid_top_explode_end", + "802958d4": "cutscene_enter_pyramid_top_start", + "80295930": "cutscene_enter_pyramid_top", + "80295a58": "cutscene_dialog_start", + "80295bf0": "cutscene_dialog_move_mario_shoulder", + "80295e24": "cutscene_dialog_create_dialog_box", + "80295e8c": "cutscene_dialog", + "80295fb0": "cutscene_dialog_set_flag", + "80295fd8": "cutscene_dialog_end", + "80296020": "cutscene_read_message_start", + "80296160": "cutscene_read_message", + "802962c8": "cutscene_read_message_set_flag", + "802962f0": "cutscene_read_message_end", + "80296318": "cutscene_exit_succ_start", + "802963b8": "cutscene_non_painting_set_cam_pos", + "8029652c": "cutscene_non_painting_set_cam_focus", + "8029665c": "cutscene_exit_bowser_succ_focus_left", + "8029669c": "cutscene_exit_bowser_key_toss_shake", + "802966e4": "cutscene_exit_succ_shake_landing", + "80296710": "cutscene_exit_bowser_succ", + "802967c4": "cutscene_non_painting_end", + "8029685c": "cutscene_exit_non_painting_succ_override_cvar", + "802968a0": "cutscene_exit_non_painting_succ", + "8029695c": "cutscene_non_painting_death_start", + "802969f8": "cutscene_exit_bowser_death", + "80296a64": "cutscene_non_painting_death_override_offset", + "80296b30": "cutscene_non_painting_death", + "80296bc8": "cutscene_cap_switch_press_start", + "80296c4c": "cutscene_cap_switch_press_rotate_around_mario", + "80296d60": "cutscene_cap_switch_press_lower_cam", + "80296da8": "cutscene_cap_switch_press_approach_mario", + "80296eb4": "cutscene_cap_switch_press_pan_left", + "80296f38": "cutscene_cap_switch_press_create_dialog", + "80296fa8": "cutscene_cap_switch_press", + "80297148": "cutscene_unlock_key_door_start", + "8029720c": "cutscene_unlock_key_door_approach_mario", + "80297290": "cutscene_unlock_key_door_focus_lock", + "802972ec": "cutscene_unlock_key_door_stub", + "80297300": "cutscene_unlock_key_door_fly_back", + "80297384": "cutscene_unlock_key_door_fov_shake", + "802973b0": "cutscene_unlock_key_door", + "80297464": "intro_peach_move_camera_start_to_pipe", + "80297560": "peach_letter_text", + "8029758c": "play_sound_peach_reading_letter", + "802975c4": "cutscene_intro_peach_start_to_pipe_spline", + "8029762c": "cutscene_intro_peach_dialog", + "802976bc": "cutscene_intro_peach_follow_pipe_spline", + "80297728": "cutscene_intro_peach_clear_cutscene_status", + "80297748": "cutscene_intro_peach_zoom_fov", + "80297784": "cutscene_intro_peach_reset_spline", + "802977c8": "cutscene_intro_peach_handheld_shake_off", + "802977f4": "intro_pipe_exit_text", + "80297820": "play_sound_intro_turn_on_hud", + "8029784c": "cutscene_intro_peach_fly_to_pipe", + "80297908": "cutscene_intro_peach_mario_appears", + "80297a38": "cutscene_intro_peach_reset_fov", + "80297a64": "cutscene_intro_peach_letter", + "80297b58": "cutscene_end_waving_start", + "80297b84": "cutscene_end_waving", + "80297c14": "cutscene_credits_reset_spline", + "80297c40": "cutscene_credits", + "802980dc": "cutscene_sliding_doors_open_start", + "8029819c": "cutscene_sliding_doors_open_set_cvars", + "80298218": "cutscene_sliding_doors_go_under_doorway", + "80298254": "cutscene_sliding_doors_fly_back_up", + "80298290": "cutscene_sliding_doors_follow_mario", + "802983b4": "cutscene_sliding_doors_open", + "80298458": "cutscene_double_doors_end", + "802984a0": "cutscene_enter_painting_stub", + "802984b4": "cutscene_enter_painting", + "802987b0": "cutscene_exit_painting_start", + "8029894c": "cutscene_exit_painting_move_to_mario", + "802989e8": "cutscene_exit_painting_move_to_floor", + "80298af8": "cutscene_exit_painting", + "80298ba0": "cutscene_unused_exit_start", + "80298c2c": "cutscene_unused_exit_focus_mario", + "80298ccc": "cutscene_exit_painting_end", + "80298d44": "cutscene_enter_cannon_end", + "80298d9c": "cutscene_enter_cannon_raise", + "80298fe8": "cutscene_enter_cannon_start", + "80299100": "cutscene_door_start", + "80299154": "cutscene_door_fix_cam", + "802991a8": "cutscene_door_loop", + "802991f0": "cutscene_door_move_behind_mario", + "802992cc": "cutscene_door_follow_mario", + "80299360": "cutscene_door_end", + "80299404": "cutscene_door_mode", + "802994e8": "play_cutscene", + "8029a2f8": "cutscene_event", + "8029a37c": "cutscene_spawn_obj", + "8029a3b4": "set_fov_shake", + "8029a41c": "set_fov_shake_from_point", + "8029a4d0": "shake_camera_fov", + "8029a5e8": "set_fov_30", + "8029a60c": "approach_fov_20", + "8029a64c": "set_fov_45", + "8029a670": "set_fov_29", + "8029a694": "zoom_fov_30", + "8029a6f4": "fov_default", + "8029a858": "approach_fov_30", + "8029a894": "approach_fov_60", + "8029a8d0": "approach_fov_45", + "8029a968": "approach_fov_80", + "8029a9a4": "set_fov_bbh", + "8029aa3c": "geo_camera_fov", + "8029ab94": "set_fov_function", + "8029abb0": "cutscene_set_fov_shake_preset", + "8029ac30": "set_fov_shake_from_point_preset", + "8029aef8": "obj_rotate_towards_point", + "8029af98": "intro_peach_set_pos_and_opacity", + "8029b08c": "bhv_intro_peach_loop", + "8029b28c": "intro_lakitu_set_offset_from_camera", + "8029b358": "intro_lakitu_set_focus", + "8029b3c8": "intro_lakitu_set_pos_and_focus", + "8029b49c": "bhv_intro_lakitu_loop", + "8029bde4": "bhv_end_birds_1_loop", + "8029bf64": "bhv_end_birds_2_loop", + "8029c0e4": "spawn_child_obj_relative", + "8029c254": "bhv_intro_scene_loop", + "8029c770": "nop_change_course", + "8029c780": "copy_mario_state_to_object", + "8029c9cc": "spawn_particle", + "8029ca58": "bhv_mario_update", + "8029cb34": "update_objects_starting_at", + "8029cbc8": "update_objects_during_time_stop", + "8029cd28": "update_objects_in_list", + "8029cd98": "unload_deactivated_objects_in_list", + "8029ce58": "set_object_respawn_info_bits", + "8029cedc": "unload_objects_from_area", + "8029cfb0": "spawn_objects_from_info", + "8029d1d8": "stub_obj_list_processor_1", + "8029d1e8": "clear_objects", + "8029d324": "update_terrain_objects", + "8029d374": "update_non_terrain_objects", + "8029d428": "unload_deactivated_objects", + "8029d690": "update_objects", + "8029d890": "geo_update_projectile_pos_from_parent", + "8029d924": "geo_update_layer_transparency", + "8029db48": "geo_switch_anim_state", + "8029dbd4": "geo_switch_area", + "8029dcd4": "obj_update_pos_from_parent_transformation", + "8029dda8": "obj_apply_scale_to_matrix", + "8029de80": "create_transformation_from_matrices", + "8029e1b0": "obj_set_held_state", + "8029e27c": "lateral_dist_between_objects", + "8029e2f8": "dist_between_objects", + "8029e398": "cur_obj_forward_vel_approach_upward", + "8029e3e8": "approach_f32_signed", + "8029e494": "approach_f32_symmetric", + "8029e530": "approach_s16_symmetric", + "8029e5ec": "cur_obj_rotate_yaw_toward", + "8029e694": "obj_angle_to_object", + "8029e714": "obj_turn_toward_object", + "8029e8bc": "obj_set_parent_relative_pos", + "8029e914": "obj_set_pos", + "8029e96c": "obj_set_angle", + "8029e9ac": "spawn_object_abs_with_rot", + "8029ea24": "spawn_object_rel_with_rot", + "8029eaac": "spawn_obj_with_transform_flags", + "8029eb04": "spawn_water_droplet", + "8029ed20": "spawn_object_at_origin", + "8029edcc": "spawn_object", + "8029ee24": "try_to_spawn_object", + "8029eeb8": "spawn_object_with_scale", + "8029ef64": "spawn_object_relative", + "8029effc": "spawn_object_relative_with_scale", + "8029f070": "cur_obj_move_using_vel", + "8029f0c8": "obj_copy_graph_y_offset", + "8029f0e0": "obj_copy_pos_and_angle", + "8029f120": "obj_copy_pos", + "8029f148": "obj_copy_angle", + "8029f188": "obj_set_gfx_pos_from_pos", + "8029f1b0": "obj_init_animation", + "8029f200": "linear_mtxf_mul_vec3f", + "8029f274": "linear_mtxf_transpose_mul_vec3f", + "8029f2ec": "obj_apply_scale_to_transform", + "8029f3a8": "obj_copy_scale", + "8029f3d0": "obj_scale_xyz", + "8029f404": "obj_scale", + "8029f430": "cur_obj_scale", + "8029f464": "cur_obj_init_animation", + "8029f4b4": "cur_obj_init_animation_with_sound", + "8029f514": "cur_obj_init_animation_with_accel_and_sound", + "8029f59c": "obj_init_animation_with_sound", + "8029f600": "cur_obj_enable_rendering_and_become_tangible", + "8029f620": "cur_obj_enable_rendering", + "8029f644": "cur_obj_disable_rendering_and_become_intangible", + "8029f66c": "cur_obj_disable_rendering", + "8029f694": "cur_obj_unhide", + "8029f6bc": "cur_obj_hide", + "8029f6e0": "cur_obj_set_pos_relative", + "8029f7d8": "cur_obj_set_pos_relative_to_parent", + "8029f820": "cur_obj_enable_rendering_2", + "8029f848": "cur_obj_unused_init_on_floor", + "8029f8ec": "obj_set_face_angle_to_move_angle", + "8029f914": "get_object_list_from_behavior", + "8029f95c": "cur_obj_nearest_object_with_behavior", + "8029f998": "cur_obj_dist_to_nearest_object_with_behavior", + "8029f9ec": "cur_obj_find_nearest_object_with_behavior", + "8029fb1c": "find_unimportant_object", + "8029fb68": "count_unimportant_objects", + "8029fbdc": "count_objects_with_behavior", + "8029fc9c": "cur_obj_find_nearby_held_actor", + "8029fdb4": "cur_obj_change_action", + "8029fe00": "cur_obj_set_vel_from_mario_vel", + "8029fe6c": "cur_obj_reverse_animation", + "8029fea4": "cur_obj_extend_animation_if_at_end", + "8029ff04": "cur_obj_check_if_near_animation_end", + "8029ffa4": "cur_obj_check_if_at_animation_end", + "802a0008": "cur_obj_check_anim_frame", + "802a0050": "cur_obj_check_anim_frame_in_range", + "802a00ac": "cur_obj_check_frame_prior_current_frame", + "802a0114": "mario_is_in_air_action", + "802a0154": "mario_is_dive_sliding", + "802a0198": "cur_obj_set_y_vel_and_animation", + "802a01d8": "cur_obj_unrender_and_reset_state", + "802a0380": "cur_obj_get_thrown_or_placed", + "802a0474": "cur_obj_get_dropped", + "802a04c0": "cur_obj_set_model", + "802a04f0": "mario_set_flag", + "802a0514": "cur_obj_clear_interact_status_flag", + "802a0568": "obj_mark_for_deletion", + "802a057c": "cur_obj_disable", + "802a05b4": "cur_obj_become_intangible", + "802a05d4": "cur_obj_become_tangible", + "802a05f0": "obj_become_tangible", + "802a0604": "cur_obj_update_floor_height", + "802a064c": "cur_obj_update_floor_height_and_get_floor", + "802a079c": "cur_obj_apply_drag_xz", + "802a0e68": "cur_obj_move_y", + "802a113c": "cur_obj_unused_resolve_wall_collisions", + "802a11a8": "abs_angle_diff", + "802a120c": "cur_obj_move_xz_using_fvel_and_yaw", + "802a12a4": "cur_obj_move_y_with_terminal_vel", + "802a1308": "cur_obj_compute_vel_xz", + "802a1370": "increment_velocity_toward_range", + "802a1424": "obj_check_if_collided_with_object", + "802a148c": "cur_obj_set_behavior", + "802a14c4": "obj_set_behavior", + "802a14fc": "cur_obj_has_behavior", + "802a1554": "obj_has_behavior", + "802a15ac": "cur_obj_lateral_dist_from_mario_to_home", + "802a1634": "cur_obj_lateral_dist_to_home", + "802a16ac": "cur_obj_outside_home_square", + "802a1774": "cur_obj_outside_home_rectangle", + "802a184c": "cur_obj_set_pos_to_home", + "802a188c": "cur_obj_set_pos_to_home_and_stop", + "802a18dc": "cur_obj_shake_y", + "802a1930": "cur_obj_start_cam_event", + "802a1960": "set_mario_interact_hoot_if_in_range", + "802a19ac": "obj_set_billboard", + "802a19c8": "cur_obj_set_hitbox_radius_and_height", + "802a19f0": "cur_obj_set_hurtbox_radius_and_height", + "802a1b34": "obj_spawn_loot_blue_coins", + "802a1b8c": "obj_spawn_loot_yellow_coins", + "802a1bdc": "cur_obj_spawn_loot_coin_at_mario_pos", + "802a1c68": "cur_obj_abs_y_dist_to_home", + "802a1cc4": "cur_obj_advance_looping_anim", + "802a1f3c": "cur_obj_resolve_wall_collisions", + "802a2320": "cur_obj_update_floor_and_walls", + "802a2348": "cur_obj_move_standard", + "802a25b4": "cur_obj_move_using_vel_and_gravity", + "802a2644": "cur_obj_move_using_fvel_and_gravity", + "802a2674": "obj_set_pos_relative", + "802a2748": "cur_obj_angle_to_home", + "802a27b0": "obj_set_gfx_pos_at_obj_pos", + "802a2804": "obj_translate_local", + "802a2930": "obj_build_transform_from_pos_and_angle", + "802a2a18": "obj_set_throw_matrix_from_transform", + "802a2a84": "obj_build_transform_relative_to_parent", + "802a2b28": "obj_create_transform_from_self", + "802a2b6c": "cur_obj_rotate_move_angle_using_vel", + "802a2bc4": "cur_obj_rotate_face_angle_using_vel", + "802a2c1c": "cur_obj_set_face_angle_to_move_angle", + "802a2c5c": "cur_obj_follow_path", + "802a2ed4": "chain_segment_init", + "802a2f14": "random_f32_around_zero", + "802a2f5c": "obj_scale_random", + "802a2fc0": "obj_translate_xyz_random", + "802a308c": "obj_translate_xz_random", + "802a31e0": "cur_obj_set_pos_via_transform", + "802a3268": "cur_obj_reflect_move_angle_off_wall", + "802a32ac": "cur_obj_spawn_particles", + "802a34a4": "obj_set_hitbox", + "802a3604": "signum_positive", + "802a3634": "absf", + "802a3674": "absi", + "802a36a4": "cur_obj_wait_then_blink", + "802a3754": "cur_obj_is_mario_ground_pounding_platform", + "802a37ac": "spawn_mist_particles", + "802a37dc": "spawn_mist_particles_with_sound", + "802a3818": "cur_obj_push_mario_away", + "802a390c": "cur_obj_push_mario_away_from_cylinder", + "802a399c": "bhv_dust_smoke_loop", + "802a3a4c": "cur_obj_set_direction_table", + "802a3a88": "cur_obj_progress_direction_table", + "802a3b28": "stub_obj_helpers_3", + "802a3b40": "cur_obj_scale_over_time", + "802a3c18": "cur_obj_set_pos_to_home_with_debug", + "802a3cec": "stub_obj_helpers_4", + "802a3cfc": "cur_obj_is_mario_on_platform", + "802a3d40": "cur_obj_shake_y_until", + "802a3dd4": "cur_obj_move_up_and_down", + "802a3e30": "cur_obj_call_action_function", + "802a3ef8": "spawn_base_star_with_no_lvl_exit", + "802a3f24": "bit_shift_left", + "802a3f48": "cur_obj_mario_far_away", + "802a404c": "is_mario_moving_fast_or_in_air", + "802a40b8": "is_item_in_array", + "802a4120": "bhv_init_room", + "802a4210": "cur_obj_enable_rendering_if_mario_in_room", + "802a4360": "cur_obj_set_hitbox_and_die_if_attacked", + "802a4440": "obj_explode_and_spawn_coins", + "802a44f4": "obj_set_collision_data", + "802a452c": "cur_obj_if_hit_wall_bounce_away", + "802a4564": "cur_obj_hide_if_mario_far_away_y", + "802a45e4": "geo_offset_klepto_held_object", + "802a462c": "geo_offset_klepto_debug", + "802a46cc": "obj_is_hidden", + "802a4704": "enable_time_stop", + "802a4728": "disable_time_stop", + "802a4750": "set_time_stop_flags", + "802a4774": "clear_time_stop_flags", + "802a47a0": "cur_obj_can_mario_activate_textbox", + "802a48bc": "cur_obj_can_mario_activate_textbox_2", + "802a4960": "cur_obj_update_dialog", + "802a4be4": "cur_obj_update_dialog_with_cutscene", + "802a4f04": "cur_obj_has_model", + "802a4f58": "cur_obj_align_gfx_with_floor", + "802a5034": "mario_is_within_rectangle", + "802a50fc": "cur_obj_shake_screen", + "802a513c": "obj_attack_collided_from_other_object", + "802a51ac": "cur_obj_was_attacked_or_ground_pounded", + "802a5228": "obj_copy_behavior_params", + "802a5248": "cur_obj_init_animation_and_anim_frame", + "802a5288": "cur_obj_init_animation_and_check_if_near_end", + "802a52c4": "cur_obj_init_animation_and_extend_if_at_end", + "802a52f8": "cur_obj_check_grabbed_mario", + "802a5358": "player_performed_grab_escape_action", + "802a540c": "cur_obj_unused_play_footstep_sound", + "802a5460": "enable_time_stop_including_mario", + "802a5498": "disable_time_stop_including_mario", + "802a54d8": "cur_obj_check_interacted", + "802a5524": "cur_obj_spawn_loot_blue_coin", + "802a5588": "cur_obj_spawn_star_at_y_offset", + "802a5620": "star_door_update_pos", + "802a56bc": "bhv_star_door_loop", + "802a58dc": "bhv_piranha_particle_loop", + "802a597c": "mr_i_piranha_particle_act_0", + "802a5a44": "mr_i_piranha_particle_act_1", + "802a5aa0": "bhv_mr_i_particle_loop", + "802a5acc": "spawn_mr_i_particle", + "802a5bd4": "bhv_mr_i_body_loop", + "802a5d4c": "mr_i_act_3", + "802a6518": "mr_i_act_2", + "802a68a0": "mr_i_act_1", + "802a6ad8": "mr_i_act_0", + "802a6b7c": "bhv_mr_i_loop", + "802a6c20": "bhv_pole_init", + "802a6c74": "bhv_giant_pole_loop", + "802a6cf4": "bhv_thi_huge_island_top_loop", + "802a6d64": "bhv_thi_tiny_island_top_loop", + "802a6ee4": "cap_switch_act_0", + "802a7020": "cap_switch_act_1", + "802a708c": "cap_switch_act_2", + "802a7160": "cap_switch_act_3", + "802a7170": "bhv_cap_switch_loop", + "802a719c": "geo_update_held_mario_pos", + "802a7230": "bhv_bobomb_anchor_mario_loop", + "802a7264": "king_bobomb_act_0", + "802a7384": "mario_is_far_below_object", + "802a73d8": "king_bobomb_act_2", + "802a7598": "king_bobomb_act_3", + "802a7804": "king_bobomb_act_1", + "802a78d8": "king_bobomb_act_6", + "802a7a60": "king_bobomb_act_7", + "802a7b1c": "king_bobomb_act_8", + "802a7b5c": "king_bobomb_act_4", + "802a7d14": "king_bobomb_act_5", + "802a7fbc": "king_bobomb_move", + "802a8064": "bhv_king_bobomb_loop", + "802a816c": "bhv_beta_chest_bottom_init", + "802a81e8": "bhv_beta_chest_bottom_loop", + "802a821c": "bhv_beta_chest_lid_loop", + "802a8370": "bhv_water_air_bubble_init", + "802a83a0": "bhv_water_air_bubble_loop", + "802a8630": "bhv_bubble_wave_init", + "802a86bc": "scale_bubble_random", + "802a870c": "bhv_bubble_maybe_loop", + "802a88a4": "bhv_small_water_wave_loop", + "802a8a38": "scale_bubble_sin", + "802a8b18": "bhv_particle_init", + "802a8bc0": "bhv_particle_loop", + "802a8c88": "bhv_small_bubbles_loop", + "802a8cdc": "bhv_fish_group_loop", + "802a8d48": "bhv_water_waves_init", + "802a8d98": "bhv_cannon_base_unused_loop", + "802a8dc0": "opened_cannon_act_0", + "802a8f40": "opened_cannon_act_4", + "802a9114": "opened_cannon_act_6", + "802a92fc": "opened_cannon_act_5", + "802a93f8": "opened_cannon_act_1", + "802a9440": "opened_cannon_act_2", + "802a9460": "opened_cannon_act_3", + "802a9498": "bhv_cannon_base_loop", + "802a94f8": "bhv_cannon_barrel_loop", + "802a958c": "common_anchor_mario_behavior", + "802a9708": "bhv_chuckya_anchor_mario_loop", + "802a973c": "unknown_chuckya_function", + "802a98c4": "approach_forward_vel", + "802a9994": "chuckya_act_0", + "802a9d08": "chuckya_act_1", + "802a9f54": "chuckya_act_3", + "802a9fc8": "chuckya_act_2", + "802aa02c": "chuckya_move", + "802aa0ac": "bhv_chuckya_loop", + "802aa1b8": "bhv_wf_breakable_wall_loop", + "802aa280": "check_mario_attacking", + "802aa3c8": "init_kickable_board_rock", + "802aa3f4": "bhv_kickable_board_loop", + "802aa700": "bhv_tower_door_loop", + "802aa774": "bhv_wf_rotating_wooden_platform_loop", + "802aa830": "bhv_rotating_platform_loop", + "802aa948": "set_koopa_shell_underwater_hitbox", + "802aa97c": "bhv_koopa_shell_underwater_loop", + "802aaa60": "bhv_warp_loop", + "802aab54": "bhv_fading_warp_loop", + "802aac48": "bhv_white_puff_exploding_loop", + "802aae8c": "spawn_mist_particles_variable", + "802aaf48": "bhv_spawned_star_init", + "802aaffc": "set_sparkle_spawn_star_hitbox", + "802ab060": "set_home_to_mario", + "802ab158": "set_y_home_to_pos", + "802ab18c": "slow_star_rotation", + "802ab1c8": "bhv_spawned_star_loop", + "802ab558": "bhv_spawn_star_no_level_exit", + "802ab5c8": "bhv_coin_sparkles_init", + "802ab650": "bhv_yellow_coin_init", + "802ab70c": "bhv_yellow_coin_loop", + "802ab748": "bhv_temp_coin_loop", + "802ab7a4": "bhv_coin_init", + "802ab860": "bhv_coin_loop", + "802aba40": "bhv_coin_formation_spawn_loop", + "802abc04": "spawn_coin_in_formation", + "802abee4": "bhv_coin_formation_init", + "802abf0c": "bhv_coin_formation_loop", + "802ac068": "coin_inside_boo_act_1", + "802ac15c": "coin_inside_boo_act_0", + "802ac294": "bhv_coin_inside_boo_loop", + "802ac2c0": "bhv_coin_sparkles_loop", + "802ac2ec": "bhv_golden_coin_sparkles_loop", + "802ac3a8": "bhv_punch_tiny_triangle_loop", + "802ac4a0": "bhv_punch_tiny_triangle_init", + "802ac5b4": "bhv_wall_tiny_star_particle_loop", + "802ac678": "bhv_tiny_star_particles_init", + "802ac78c": "bhv_pound_tiny_star_particle_loop", + "802ac864": "bhv_pound_tiny_star_particle_init", + "802ac910": "door_animation_and_reset", + "802ac958": "set_door_camera_event", + "802ac9d0": "play_door_open_noise", + "802aca6c": "play_warp_door_open_noise", + "802acac8": "bhv_door_loop", + "802acc3c": "bhv_door_init", + "802ace80": "bhv_star_door_loop_2", + "802ad078": "grindel_thwomp_act_4", + "802ad10c": "grindel_thwomp_act_2", + "802ad1a4": "grindel_thwomp_act_3", + "802ad238": "grindel_thwomp_act_1", + "802ad2d0": "grindel_thwomp_act_0", + "802ad34c": "bhv_grindel_thwomp_loop", + "802ad378": "bhv_tumbling_bridge_platform_loop", + "802ad580": "tumbling_bridge_act_1", + "802ad76c": "tumbling_bridge_act_2", + "802ad7f4": "tumbling_bridge_act_3", + "802ad828": "tumbling_bridge_act_0", + "802ad890": "bhv_tumbling_bridge_loop", + "802ad8bc": "elevator_starting_shake", + "802ad8f0": "elevator_act_0", + "802ada4c": "elevator_act_1", + "802adb88": "elevator_act_2", + "802adce4": "elevator_act_4", + "802add70": "elevator_act_3", + "802addf8": "bhv_elevator_init", + "802adf6c": "bhv_elevator_loop", + "802adf98": "bhv_water_mist_spawn_loop", + "802adfd8": "bhv_water_mist_loop", + "802ae0cc": "spawn_triangle_break_particles", + "802ae238": "bhv_water_mist_2_loop", + "802ae304": "bhv_pound_white_puffs_init", + "802ae334": "spawn_mist_from_global", + "802ae360": "bhv_ground_sand_init", + "802ae394": "spawn_smoke_with_velocity", + "802ae45c": "clear_particle_flags", + "802ae48c": "bhv_ground_snow_init", + "802ae4c0": "spawn_wind_particles", + "802ae534": "bhv_wind_loop", + "802ae85c": "bhv_unused_particle_spawn_loop", + "802ae908": "bhv_ukiki_cage_star_loop", + "802aea6c": "ukiki_cage_act_wait_for_ukiki", + "802aeab8": "ukiki_cage_act_spin", + "802aeb1c": "ukiki_cage_act_fall", + "802aeb74": "ukiki_cage_act_hide", + "802aeb9c": "bhv_ukiki_cage_loop", + "802aebc8": "bhv_squishable_platform_loop", + "802aec40": "bhv_bitfs_sinking_platform_loop", + "802aeca8": "bhv_ddd_moving_pole_loop", + "802aecdc": "bhv_bitfs_sinking_cage_platform_loop", + "802aedc0": "bhv_beta_moving_flames_spawn_loop", + "802aeea4": "bhv_beta_moving_flames_loop", + "802aef1c": "bhv_flamethrower_flame_loop", + "802af1e8": "bhv_flamethrower_loop", + "802af3fc": "bhv_rr_rotating_bridge_platform_loop", + "802af448": "bhv_bouncing_fireball_flame_loop", + "802af5f8": "bhv_bouncing_fireball_loop", + "802af7c4": "bhv_bowser_shock_wave_loop", + "802af9cc": "bhv_black_smoke_upward_loop", + "802afa0c": "bhv_black_smoke_bowser_loop", + "802afae4": "bhv_black_smoke_mario_loop", + "802afbf8": "bhv_flame_mario_loop", + "802afce4": "bhv_beta_fish_splash_spawner_loop", + "802afd1c": "bhv_spindrift_loop", + "802afee8": "bhv_wf_solid_tower_platform_loop", + "802aff30": "bhv_wf_elevator_tower_platform_loop", + "802b00e4": "bhv_wf_sliding_tower_platform_loop", + "802b0244": "spawn_and_init_wf_platforms", + "802b039c": "spawn_wf_platform_group", + "802b04b4": "bhv_tower_platform_group_loop", + "802b0614": "bhv_tree_snow_or_leaf_loop", + "802b0974": "bhv_snow_leaf_particle_spawn_init", + "802b0b9c": "square_plat_set_yaw_until_timer", + "802b0bec": "bhv_squarish_path_moving_loop", + "802b0d48": "bhv_piranha_plant_waking_bubbles_loop", + "802b0df0": "bhv_piranha_plant_bubble_loop", + "802b1278": "bhv_purple_switch_loop", + "802b14f4": "check_if_moving_over_floor", + "802b15e8": "bhv_pushable_loop", + "802b1714": "breakable_box_init", + "802b17f4": "hidden_breakable_box_actions", + "802b19d8": "hidden_unbreakable_box_actions", + "802b1ae0": "bhv_hidden_object_loop", + "802b1b2c": "bhv_breakable_box_loop", + "802b1bb0": "geo_move_mario_part_from_parent", + "802b1c54": "bhv_heave_ho_throw_mario_loop", + "802b1d7c": "heave_ho_act_1", + "802b1e6c": "heave_ho_act_2", + "802b1ff4": "heave_ho_act_3", + "802b20a0": "heave_ho_act_0", + "802b2154": "heave_ho_move", + "802b2278": "bhv_heave_ho_loop", + "802b2340": "bhv_ccm_touched_star_spawn_loop", + "802b23e0": "bhv_unused_poundable_platform", + "802b2494": "bhv_beta_trampoline_spring_loop", + "802b25ac": "bhv_beta_trampoline_top_loop", + "802b26a4": "jumping_box_act_0", + "802b27d8": "jumping_box_act_1", + "802b2824": "jumping_box_free_update", + "802b288c": "bhv_jumping_box_loop", + "802b29b8": "bhv_boo_cage_loop", + "802b2bc8": "spawn_sparkle_particles", + "802b2d10": "bhv_alpha_boo_key_loop", + "802b3108": "bhv_beta_boo_key_loop", + "802b3134": "arc_to_goal_pos", + "802b3250": "grand_star_zero_velocity", + "802b329c": "bhv_grand_star_loop", + "802b3600": "bhv_bowser_key_loop", + "802b37b8": "bhv_white_puff_smoke_init", + "802b3810": "bhv_bullet_bill_init", + "802b3830": "bullet_bill_act_0", + "802b38b8": "bullet_bill_act_1", + "802b394c": "bullet_bill_act_2", + "802b3b08": "bullet_bill_act_3", + "802b3b24": "bullet_bill_act_4", + "802b3be0": "bhv_bullet_bill_loop", + "802b3c2c": "bowser_tail_anchor_act_0", + "802b3cdc": "bowser_tail_anchor_act_1", + "802b3d10": "bowser_tail_anchor_act_2", + "802b3d74": "bhv_bowser_tail_anchor_loop", + "802b3df4": "bhv_bowser_flame_spawn_loop", + "802b4080": "bhv_bowser_body_anchor_loop", + "802b4184": "bowser_spawn_shockwave", + "802b41fc": "bowser_bounce", + "802b4288": "bowser_set_anim_look_up_and_walk", + "802b4300": "bowser_set_anim_slow_gait", + "802b4368": "bowser_set_anim_look_down", + "802b43dc": "bowser_initialize_action", + "802b4478": "bowser_act_text_wait", + "802b44bc": "bowser_act_intro_walk", + "802b45f4": "bowser_bitdw_act_controller", + "802b473c": "bowser_bitfs_act_controller", + "802b48d4": "bowser_general_bits_act_controller", + "802b4a1c": "bowser_set_act_jump", + "802b4a3c": "bowser_bits_act_controller", + "802b4af4": "bowser_reset_fallen_off_stage", + "802b4bac": "bowser_act_unused_slow_walk", + "802b4be8": "bowser_act_default", + "802b4ca4": "bowser_act_breath_fire", + "802b4d14": "bowser_act_walk_to_mario", + "802b4f00": "bowser_act_teleport", + "802b5104": "bowser_act_spit_fire_into_sky", + "802b5218": "bowser_act_hit_mine", + "802b53f4": "bowser_set_anim_in_air", + "802b5444": "bowser_land", + "802b5554": "bowser_short_second_hop", + "802b55cc": "bowser_act_jump", + "802b5798": "bowser_act_jump_towards_mario", + "802b58bc": "bowser_act_hit_edge", + "802b59cc": "bowser_act_spit_fire_onto_floor", + "802b5aec": "bowser_turn_on_timer", + "802b5c00": "bowser_act_turn_from_edge", + "802b5c40": "bowser_act_charge_mario", + "802b5f6c": "bowser_check_hit_mine", + "802b5fec": "bowser_act_thrown_dropped", + "802b611c": "bowser_set_goal_invisible", + "802b6190": "bowser_act_jump_onto_stage", + "802b6568": "bowser_act_dance", + "802b65d0": "bowser_spawn_grand_star_key", + "802b6670": "bowser_fly_back_dead", + "802b6730": "bowser_dead_bounce", + "802b67d4": "bowser_dead_wait_for_mario", + "802b6878": "bowser_dead_twirl_into_trophy", + "802b6a10": "bowser_dead_hide", + "802b6a78": "bowser_dead_not_bits_end", + "802b6bac": "bowser_dead_bits_end", + "802b6cf0": "bowser_act_dead", + "802b6e40": "bowser_tilt_platform", + "802b6ee0": "bowser_act_ride_tilting_platform", + "802b711c": "bowser_check_fallen_off_stage", + "802b71e4": "bowser_free_update", + "802b72d4": "bowser_held_update", + "802b7418": "bowser_thrown_dropped_update", + "802b75a4": "bhv_bowser_loop", + "802b7878": "bhv_bowser_init", + "802b798c": "geo_update_body_rot_from_parent", + "802b7a20": "bowser_open_eye_switch", + "802b7c64": "geo_switch_bowser_eyes", + "802b7d44": "geo_bits_bowser_coloring", + "802b7e68": "falling_bowser_plat_act_0", + "802b7ef0": "falling_bowser_plat_act_1", + "802b8024": "falling_bowser_plat_act_2", + "802b8384": "bhv_falling_bowser_platform_loop", + "802b83b0": "bowser_flame_despawn", + "802b8434": "bowser_flame_should_despawn", + "802b84ac": "bhv_flame_bowser_init", + "802b85b0": "bhv_flame_large_burning_out_init", + "802b8654": "bowser_flame_move", + "802b8734": "bhv_flame_bowser_loop", + "802b8960": "bhv_flame_moving_forward_growing_init", + "802b89ec": "bhv_flame_moving_forward_growing_loop", + "802b8b1c": "bhv_flame_floating_landing_init", + "802b8c38": "bhv_flame_floating_landing_loop", + "802b8d68": "bhv_blue_bowser_flame_init", + "802b8e7c": "bhv_blue_bowser_flame_loop", + "802b9034": "bhv_flame_bouncing_init", + "802b90ec": "bhv_flame_bouncing_loop", + "802b921c": "bhv_blue_flames_group_loop", + "802b935c": "bhv_blue_fish_movement_loop", + "802b9790": "bhv_tank_fish_group_loop", + "802b98d4": "vec3f_copy_2", + "802b98fc": "bhv_checkerboard_elevator_group_init", + "802b9a78": "checkerboard_plat_act_move_y", + "802b9af8": "checkerboard_plat_act_rotate", + "802b9bb4": "bhv_checkerboard_platform_init", + "802b9bd8": "bhv_checkerboard_platform_loop", + "802b9e94": "bhv_ddd_warp_loop", + "802b9efc": "water_level_pillar_undrained", + "802ba13c": "water_level_pillar_drained", + "802ba19c": "bhv_water_level_pillar_init", + "802ba1e0": "bhv_water_level_pillar_loop", + "802ba25c": "bhv_invisible_objects_under_bridge_init", + "802ba2b0": "geo_scale_bowser_key", + "802ba2f8": "bhv_bowser_key_unlock_door_loop", + "802ba458": "bhv_bowser_key_course_exit_loop", + "802ba5bc": "bhv_moat_grills_loop", + "802ba608": "bhv_rotating_clock_arm_loop", + "802ba7e0": "handle_hat_ukiki_reset", + "802ba868": "is_hat_ukiki_and_mario_has_hat", + "802ba8c4": "geo_update_projectile_pos_from_parent_copy", + "802ba958": "idle_ukiki_taunt", + "802bab7c": "ukiki_act_idle", + "802bae40": "ukiki_act_return_home", + "802baec4": "ukiki_act_wait_to_respawn", + "802baf10": "ukiki_act_unused_turn", + "802baf64": "ukiki_act_turn_to_mario", + "802bb07c": "ukiki_act_run", + "802bb288": "ukiki_act_jump", + "802bb3b8": "ukiki_act_go_to_cage", + "802bb798": "ukiki_free_loop", + "802bb888": "cage_ukiki_held_loop", + "802bba3c": "hat_ukiki_held_loop", + "802bbb98": "bhv_ukiki_init", + "802bbc0c": "bhv_ukiki_loop", + "802bbd6c": "lll_octagonal_mesh_move", + "802bbfd8": "lll_octagonal_mesh_find_y_offset", + "802bc0f0": "bhv_lll_moving_octagonal_mesh_platform_loop", + "802bc22c": "bhv_lll_sinking_rock_block_loop", + "802bc294": "bhv_lll_rotating_hex_flame_loop", + "802bc348": "fire_bar_spawn_flames", + "802bc4f4": "fire_bar_act_0", + "802bc538": "fire_bar_act_1", + "802bc590": "fire_bar_act_2", + "802bc5fc": "fire_bar_act_3", + "802bc618": "bhv_lll_rotating_block_fire_bars_loop", + "802bc660": "bhv_lll_wood_piece_loop", + "802bc728": "bhv_lll_floating_wood_bridge_loop", + "802bc898": "bhv_volcano_flames_loop", + "802bc934": "hexagonal_ring_spawn_flames", + "802bca74": "bhv_lll_rotating_hexagonal_ring_loop", + "802bcce8": "sinking_rectangular_plat_actions", + "802bcda8": "bhv_lll_sinking_rectangular_platform_loop", + "802bce58": "bhv_lll_sinking_square_platforms_loop", + "802bce9c": "create_transform_from_normals", + "802bcf40": "bhv_platform_normals_init", + "802bcfc4": "approach_by_increment", + "802bd058": "bhv_tilting_inverted_pyramid_loop", + "802bd3e4": "koopa_shell_spawn_water_drop", + "802bd488": "bhv_koopa_shell_flame_loop", + "802bd5dc": "bhv_koopa_shell_flame_spawn", + "802bd62c": "koopa_shell_spawn_sparkles", + "802bd680": "bhv_koopa_shell_loop", + "802bd8d0": "tox_box_shake_screen", + "802bd91c": "tox_box_move", + "802bdb04": "tox_box_act_4", + "802bdb3c": "tox_box_act_5", + "802bdb74": "tox_box_act_6", + "802bdbac": "tox_box_act_7", + "802bdbe4": "tox_box_act_1", + "802bdc7c": "tox_box_act_2", + "802bdcc8": "tox_box_act_3", + "802bdd14": "tox_box_act_0", + "802bdd68": "bhv_tox_box_loop", + "802bdd9c": "piranha_plant_act_idle", + "802bde10": "piranha_plant_check_interactions", + "802bdeec": "piranha_plant_act_sleeping", + "802be034": "piranha_plant_act_woken_up", + "802be0b8": "piranha_plant_reset_when_far", + "802be0ec": "piranha_plant_attacked", + "802be150": "piranha_plant_act_shrink_and_die", + "802be234": "piranha_plant_act_wait_to_respawn", + "802be278": "piranha_plant_act_respawn", + "802be350": "piranha_plant_act_biting", + "802be49c": "mario_moving_fast_enough_to_make_piranha_plant_bite", + "802be50c": "piranha_plant_act_stopped_biting", + "802be5a0": "bhv_piranha_plant_loop", + "802be628": "bhv_lll_bowser_puzzle_spawn_piece", + "802be6d4": "bhv_lll_bowser_puzzle_spawn_pieces", + "802be79c": "bhv_lll_bowser_puzzle_loop", + "802be8a8": "bhv_lll_bowser_puzzle_piece_action_0", + "802be8b8": "bhv_lll_bowser_puzzle_piece_action_1", + "802be8f4": "bhv_lll_bowser_puzzle_piece_update", + "802be9dc": "bhv_lll_bowser_puzzle_piece_move", + "802beb14": "bhv_lll_bowser_puzzle_piece_idle", + "802beb54": "bhv_lll_bowser_puzzle_piece_move_left", + "802beb8c": "bhv_lll_bowser_puzzle_piece_move_right", + "802bebc4": "bhv_lll_bowser_puzzle_piece_move_up", + "802bebfc": "bhv_lll_bowser_puzzle_piece_move_down", + "802bec34": "bhv_lll_bowser_puzzle_piece_loop", + "802becb0": "set_obj_anim_with_accel_and_sound", + "802bed7c": "play_penguin_walking_sound", + "802bedec": "tuxies_mother_act_2", + "802bef8c": "tuxies_mother_act_1", + "802bf1d8": "tuxies_mother_act_0", + "802bf3c0": "bhv_tuxies_mother_loop", + "802bf424": "small_penguin_dive_with_mario", + "802bf474": "small_penguin_act_2", + "802bf57c": "small_penguin_act_1", + "802bf648": "small_penguin_act_3", + "802bf6e4": "small_penguin_act_4", + "802bf760": "small_penguin_act_0", + "802bf90c": "small_penguin_act_5", + "802bfa14": "small_penguin_free_actions", + "802bfa88": "bhv_small_penguin_loop", + "802bfbac": "geo_switch_tuxie_mother_eyes", + "802bfcd8": "fish_act_spawn", + "802bfeb8": "fish_act_respawn", + "802bff20": "fish_act_init", + "802bff3c": "bhv_large_fish_group_loop", + "802bff68": "fish_regroup", + "802c00b4": "fish_group_act_rotation", + "802c0348": "fish_group_act_move", + "802c06a8": "fish_group_act_animate", + "802c0768": "bhv_fish_loop", + "802c08a8": "bhv_wdw_express_elevator_loop", + "802c0aac": "bub_spawner_act_0", + "802c0b50": "bub_spawner_act_1", + "802c0ba4": "bub_spawner_act_2", + "802c0bc4": "bub_spawner_act_3", + "802c0be0": "bhv_bub_spawner_loop", + "802c0c0c": "bub_move_vertically", + "802c0cd4": "bub_act_0", + "802c0d44": "bub_act_1", + "802c0f90": "bub_act_2", + "802c1204": "bhv_bub_loop", + "802c12c0": "bhv_rotating_exclamation_box_loop", + "802c1308": "exclamation_box_act_0", + "802c13ec": "exclamation_box_act_1", + "802c14b0": "exclamation_box_act_2", + "802c15b8": "exclamation_box_act_3", + "802c17bc": "exclamation_box_spawn_contents", + "802c18d0": "exclamation_box_act_4", + "802c1988": "exclamation_box_act_5", + "802c19c0": "bhv_exclamation_box_loop", + "802c19fc": "bhv_sound_spawner_init", + "802c1a40": "bhv_bowsers_sub_loop", + "802c1a80": "bhv_sushi_shark_collision_loop", + "802c1a90": "bhv_sushi_shark_loop", + "802c1c44": "bhv_sunken_ship_part_loop", + "802c1cd4": "bhv_ship_part_3_loop", + "802c1e10": "bhv_jrb_sliding_box_loop", + "802c2190": "bhv_white_puff_1_loop", + "802c2274": "bhv_white_puff_2_loop", + "802c22b8": "bhv_hidden_blue_coin_loop", + "802c242c": "bhv_blue_coin_switch_loop", + "802c263c": "bhv_openable_cage_door_loop", + "802c26f8": "bhv_openable_grill_loop", + "802c2930": "bhv_init_changing_water_level_loop", + "802c2a24": "bhv_water_level_diamond_loop", + "802c2ce8": "tweester_scale_and_move", + "802c2ebc": "tweester_act_idle", + "802c2fbc": "tweester_act_chase", + "802c31c4": "tweester_act_hide", + "802c329c": "bhv_tweester_loop", + "802c32e8": "bhv_tweester_sand_particle_loop", + "802c3440": "bhv_boo_init", + "802c3684": "bhv_courtyard_boo_triplet_init", + "802c4824": "bhv_boo_loop", + "802c4f30": "bhv_big_boo_loop", + "802c515c": "bhv_boo_with_cage_init", + "802c51d4": "bhv_boo_with_cage_loop", + "802c5224": "bhv_merry_go_round_boo_manager_loop", + "802c53cc": "obj_set_secondary_camera_focus", + "802c53ec": "bhv_animated_texture_loop", + "802c5414": "bhv_boo_in_castle_loop", + "802c5688": "bhv_boo_boss_spawned_bridge_loop", + "802c5890": "bhv_bbh_tilting_trap_platform_loop", + "802c5a38": "bhv_haunted_bookshelf_loop", + "802c5ca8": "bhv_merry_go_round_loop", + "802c5dc0": "bhv_static_checkered_platform_loop", + "802c5f48": "bhv_beta_bowser_anchor_loop", + "802c5fdc": "bhv_play_music_track_when_touched_loop", + "802c6050": "bhv_floor_trap_in_castle_loop", + "802c60ac": "bhv_castle_floor_trap_init", + "802c6150": "bhv_castle_floor_trap_open_detect", + "802c61d4": "bhv_castle_floor_trap_open", + "802c6278": "bhv_castle_floor_trap_close_detect", + "802c62bc": "bhv_castle_floor_trap_close", + "802c6328": "bhv_castle_floor_trap_rotate", + "802c6348": "bhv_castle_floor_trap_loop", + "802c63e8": "bhv_pole_base_loop", + "802c64a4": "bhv_sparkle_spawn_loop", + "802c6538": "update_angle_from_move_flags", + "802c65c0": "bhv_scuttlebug_loop", + "802c6b6c": "bhv_scuttlebug_spawn_loop", + "802c6ca0": "whomp_play_sfx_from_pound_animation", + "802c6d6c": "whomp_act_0", + "802c6ec8": "whomp_act_7", + "802c6fb0": "whomp_act_1", + "802c710c": "whomp_act_2", + "802c7254": "whomp_act_3", + "802c72b4": "whomp_act_4", + "802c7380": "whomp_act_5", + "802c7428": "king_whomp_on_ground", + "802c75fc": "whomp_on_ground", + "802c76d4": "whomp_act_6", + "802c7858": "whomp_act_8", + "802c7998": "whomp_act_9", + "802c79d8": "bhv_whomp_loop", + "802c7a70": "bhv_water_splash_spawn_droplets", + "802c7b14": "bhv_water_droplet_loop", + "802c7cac": "bhv_idle_water_wave_loop", + "802c7d40": "bhv_water_droplet_splash_init", + "802c7d90": "bhv_bubble_splash_init", + "802c7dfc": "bhv_shallow_water_splash_init", + "802c7e5c": "bhv_wave_trail_shrink", + "802c7f98": "bhv_strong_wind_particle_loop", + "802c81b4": "cur_obj_spawn_strong_wind_particles", + "802c834c": "bhv_sl_snowman_wind_loop", + "802c863c": "bhv_sl_walking_penguin_loop", + "802c89f0": "update_mario_platform", + "802c8b4c": "get_mario_pos", + "802c8b8c": "set_mario_pos", + "802c8bc8": "apply_platform_displacement", + "802c8ec0": "apply_mario_platform_displacement", + "802c8f28": "clear_mario_platform", + "802c8f40": "debug_print_obj_collision", + "802c8fe4": "detect_object_hitbox_overlap", + "802c91ec": "detect_object_hurtbox_overlap", + "802c9388": "clear_object_collision", + "802c93f8": "check_collision_in_list", + "802c94ac": "check_player_object_collision", + "802c95b4": "check_pushable_object_collision", + "802c9630": "check_destructive_object_collision", + "802c9724": "detect_object_collisions", + "802c97d0": "unused_init_free_list", + "802c9840": "unused_try_allocate", + "802c98a4": "try_allocate_object", + "802c9950": "unused_deallocate", + "802c99b8": "init_free_object_list", + "802c9a3c": "clear_object_lists", + "802c9b68": "unload_object", + "802c9c00": "allocate_object", + "802c9f04": "create_object", + "802ca028": "mark_obj_for_deletion", + "802ca040": "exec_anim_sound_state", + "802ca144": "create_sound_spawner", + "802ca190": "cur_obj_play_sound_1", + "802ca1e0": "cur_obj_play_sound_2", + "802ca230": "calc_dist_to_volume_range_1", + "802ca2d4": "calc_dist_to_volume_range_2", + "802ca370": "stub_debug_1", + "802ca380": "stub_debug_2", + "802ca390": "stub_debug_3", + "802ca3a0": "stub_debug_4", + "802ca3b0": "get_current_clock", + "802ca3e0": "get_clock_difference", + "802ca418": "set_print_state_info", + "802ca460": "print_text_array_info", + "802ca51c": "set_text_array_x_y", + "802ca568": "print_debug_bottom_up", + "802ca5b8": "print_debug_top_down_objectinfo", + "802ca618": "print_debug_top_down_mapinfo", + "802ca680": "print_debug_top_down_normal", + "802ca6d0": "print_mapinfo", + "802ca8e8": "print_checkinfo", + "802ca918": "print_surfaceinfo", + "802ca94c": "print_stageinfo", + "802ca990": "print_string_array_info", + "802caa6c": "print_effectinfo", + "802caaa8": "print_enemyinfo", + "802caae4": "update_debug_dpadmask", + "802cabac": "debug_unknown_level_select_check", + "802cac20": "reset_debug_objectinfo", + "802cb0b0": "stub_debug_5", + "802cb0c0": "try_print_debug_mario_object_info", + "802cb1c0": "try_print_debug_mario_level_info", + "802cb264": "try_do_mario_debug_object_spawn", + "802cb564": "debug_enemy_unknown", + "802cb5c0": "set_and_reset_transition_fade_timer", + "802cb640": "set_transition_color_fade_alpha", + "802cb894": "vertex_transition_color", + "802cba18": "dl_transition_color", + "802cbbc4": "render_fade_transition_from_color", + "802cbc20": "render_fade_transition_into_color", + "802cbc7c": "calc_tex_transition_radius", + "802cbd54": "calc_tex_transition_time", + "802cbe64": "convert_tex_transition_angle_to_pos", + "802cbee0": "center_tex_transition_x", + "802cbf64": "center_tex_transition_y", + "802cbfe8": "make_tex_transition_vertex", + "802cc180": "load_tex_transition_vertex", + "802cc4d8": "render_textured_transition", + "802ccbe8": "render_screen_transition", + "802ccdc8": "render_cannon_circle_base", + "802cd1e8": "geo_cannon_circle_base", + "802cd280": "rotate_rectangle", + "802cd328": "atan2_deg", + "802cd388": "scale_shadow_with_distance", + "802cd444": "disable_shadow_with_distance", + "802cd48c": "dim_shadow_with_distance", + "802cd614": "get_water_level_below_shadow", + "802cd6c4": "init_shadow", + "802cd938": "get_texture_coords_9_vertices", + "802cd988": "get_texture_coords_4_vertices", + "802cd9ec": "make_shadow_vertex_at_xyz", + "802cdb20": "extrapolate_vertex_y_position", + "802cdb74": "get_vertex_coords", + "802cdc40": "calculate_vertex_xyz", + "802cde94": "floor_local_tilt", + "802cdf3c": "make_shadow_vertex", + "802ce128": "add_shadow_to_display_list", + "802ce2bc": "linearly_interpolate_solidity_positive", + "802ce3ec": "linearly_interpolate_solidity_negative", + "802ce524": "correct_shadow_solidity_for_animations", + "802ce690": "correct_lava_shadow_height", + "802ce79c": "create_shadow_player", + "802ce9d0": "create_shadow_circle_9_verts", + "802ceae8": "create_shadow_circle_4_verts", + "802cec04": "create_shadow_circle_assuming_flat_ground", + "802cedc0": "create_shadow_rectangle", + "802cef6c": "get_shadow_height_solidity", + "802cf080": "create_shadow_square", + "802cf1f0": "create_shadow_hardcoded_rectangle", + "802cf34c": "create_shadow_below_xyz", + "802cf5b0": "calculate_skybox_scaled_x", + "802cf69c": "calculate_skybox_scaled_y", + "802cf804": "make_skybox_rect", + "802cfa2c": "draw_skybox_tile_grid", + "802cfc68": "create_skybox_ortho_matrix", + "802cfd88": "init_skybox_display_list", + "802cfef4": "create_skybox_facing_camera", + "802d0080": "geo_wdw_set_initial_water_level", + "802d01e0": "geo_movtex_pause_control", + "802d0254": "movtex_make_quad_vertex", + "802d0484": "movtex_gen_from_quad", + "802d0a84": "movtex_gen_from_quad_array", + "802d0bb0": "movtex_gen_quads_id", + "802d0c84": "get_quad_collection_from_id", + "802d0f28": "movtex_change_texture_format", + "802d104c": "geo_movtex_draw_water_regions", + "802d1330": "update_moving_texture_offset", + "802d13cc": "movtex_write_vertex_first", + "802d1574": "movtex_write_vertex_index", + "802d18b4": "movtex_gen_list", + "802d1b70": "geo_movtex_draw_nocolor", + "802d1cdc": "geo_movtex_draw_colored", + "802d1e48": "geo_movtex_draw_colored_no_update", + "802d1fa8": "geo_movtex_draw_colored_2_no_update", + "802d2108": "geo_movtex_update_horizontal", + "802d2210": "make_vertex", + "802d22c4": "round_float", + "802d2360": "geo_exec_inside_castle_light", + "802d2470": "geo_exec_flying_carpet_timer_update", + "802d2520": "geo_exec_flying_carpet_create", + "802d28cc": "geo_exec_cake_end_screen", + "802d29c0": "stop_other_paintings", + "802d2a74": "painting_mario_y", + "802d2b08": "painting_mario_z", + "802d2b84": "painting_ripple_y", + "802d2c40": "painting_nearest_4th", + "802d2d80": "painting_mario_x", + "802d2dfc": "painting_ripple_x", + "802d2eb8": "painting_state", + "802d2ffc": "wall_painting_proximity_idle", + "802d319c": "wall_painting_proximity_rippling", + "802d327c": "wall_painting_continuous_idle", + "802d341c": "wall_painting_continuous_rippling", + "802d34fc": "floor_painting_proximity_idle", + "802d36ac": "floor_painting_proximity_rippling", + "802d379c": "floor_painting_continuous_idle", + "802d393c": "floor_painting_continuous_rippling", + "802d3a2c": "painting_update_floors", + "802d3bec": "painting_update_ripple_state", + "802d3cec": "calculate_ripple_at_point", + "802d3e6c": "ripple_if_movable", + "802d3ee4": "painting_generate_mesh", + "802d404c": "painting_calculate_triangle_normals", + "802d43f8": "normalize_component", + "802d44bc": "painting_average_vertex_normals", + "802d47d0": "render_painting", + "802d4edc": "painting_model_view_transform", + "802d50dc": "painting_ripple_image", + "802d5354": "painting_ripple_env_mapped", + "802d556c": "display_painting_rippling", + "802d568c": "display_painting_not_rippling", + "802d5778": "reset_painting", + "802d57a8": "move_ddd_painting", + "802d58e4": "set_painting_layer", + "802d593c": "display_painting", + "802d59a8": "wall_painting_update", + "802d5aa0": "floor_painting_update", + "802d5b98": "geo_painting_draw", + "802d5d0c": "geo_painting_update", + "802d5e00": "int_pow", + "802d5e54": "format_integer", + "802d6144": "parse_width_field", + "802d62d8": "print_text_fmt_int", + "802d6554": "print_text", + "802d66c0": "print_text_centered", + "802d6858": "char_to_glyph_index", + "802d69f8": "add_glyph_texture", + "802d6acc": "clip_to_bounds", + "802d6b3c": "render_textrect", + "802d6c88": "render_text_labels", + "802d6f20": "create_dl_identity_matrix", + "802d7070": "create_dl_translation_matrix", + "802d7174": "create_dl_rotation_matrix", + "802d7280": "create_dl_scale_matrix", + "802d7384": "create_dl_ortho_matrix", + "802d75dc": "render_generic_char", + "802d76c8": "render_multi_text_string", + "802d77dc": "print_generic_string", + "802d7b84": "print_hud_lut_string", + "802d7e88": "print_menu_generic_string", + "802d82d4": "print_credits_string", + "802d862c": "handle_menu_scrolling", + "802d8844": "get_str_x_pos_from_center", + "802d8934": "get_string_width", + "802d89b8": "print_hud_my_score_coins", + "802d8a80": "print_hud_my_score_stars", + "802d8b34": "int_to_str", + "802d8c6c": "get_dialog_id", + "802d8c88": "create_dialog_box", + "802d8cc4": "create_dialog_box_with_var", + "802d8d08": "create_dialog_inverted_box", + "802d8d48": "create_dialog_box_with_response", + "802d8d90": "reset_dialog_render_state", + "802d8e2c": "render_dialog_box_type", + "802d9148": "change_and_flash_dialog_text_color_lines", + "802d9388": "handle_dialog_scroll_page_state", + "802d944c": "render_star_count_dialog_text", + "802d9634": "render_multi_text_string_lines", + "802d9800": "ensure_nonnegative", + "802d982c": "handle_dialog_text_and_pages", + "802d9cb0": "render_dialog_triangle_choice", + "802d9dfc": "render_dialog_string_color", + "802d9f84": "handle_special_dialog_text", + "802da1ac": "render_dialog_entries", + "802da810": "set_menu_mode", + "802da844": "reset_cutscene_msg_fade", + "802da85c": "dl_rgba16_begin_cutscene_msg_fade", + "802da8e4": "dl_rgba16_stop_cutscene_msg_fade", + "802da964": "ascii_to_credits_char", + "802daa34": "print_credits_str_ascii", + "802daae4": "set_cutscene_message", + "802dab58": "do_cutscene_handler", + "802dad54": "print_peach_letter_message", + "802db08c": "render_hud_cannon_reticle", + "802db350": "reset_red_coins_collected", + "802db368": "change_dialog_camera_angle", + "802db3b8": "shade_screen", + "802db498": "print_animated_red_coin", + "802db6e8": "render_pause_red_coins", + "802db760": "render_pause_my_score_coins", + "802dbb24": "render_pause_camera_options", + "802dbe68": "render_pause_course_options", + "802dc15c": "render_pause_castle_menu_box", + "802dc418": "highlight_last_course_complete_stars", + "802dc478": "print_hud_pause_colorful_str", + "802dc570": "render_pause_castle_course_stars", + "802dc718": "render_pause_castle_main_strings", + "802dca88": "render_pause_courses_and_castle", + "802dcd04": "print_hud_course_complete_string", + "802dcf30": "print_hud_course_complete_coins", + "802dd194": "play_star_fanfare_and_flash_hud", + "802dd210": "render_course_complete_lvl_info_and_hud_str", + "802dd838": "render_save_confirmation", + "802ddae0": "render_course_complete_screen", + "802ddca4": "render_menus_and_dialogs", + "802dddf0": "envfx_init_snow", + "802ddf38": "envfx_update_snowflake_count", + "802de0bc": "envfx_cleanup_snow", + "802de114": "orbit_from_positions", + "802de23c": "pos_from_orbit", + "802de360": "envfx_is_snowflake_alive", + "802de458": "envfx_update_snow_normal", + "802de888": "envfx_update_snow_blizzard", + "802ded38": "envfx_update_snow_water", + "802def2c": "rotate_triangle_vertices", + "802df334": "append_snowflake_vertex_buffer", + "802df748": "envfx_update_snow", + "802dfbc8": "envfx_update_particles", + "802dfd50": "particle_is_laterally_close", + "802dfe00": "random_flower_offset", + "802dfe80": "envfx_update_flower", + "802e0120": "envfx_set_lava_bubble_position", + "802e048c": "envfx_update_lava", + "802e065c": "envfx_rotate_around_whirlpool", + "802e08a8": "envfx_is_whirlpool_bubble_alive", + "802e0934": "envfx_update_whirlpool", + "802e0e24": "envfx_is_jestream_bubble_alive", + "802e0eb8": "envfx_update_jetstream", + "802e1238": "envfx_init_bubble", + "802e1414": "envfx_bubbles_update_switch", + "802e1618": "append_bubble_vertex_buffer", + "802e1a20": "envfx_set_bubble_texture", + "802e1bb8": "envfx_update_bubble_particles", + "802e1ed8": "envfx_set_max_bubble_particles", + "802e1f48": "envfx_update_bubbles", + "802e20a0": "convert_rotation", + "802e2134": "spawn_macro_abs_yrot_2params", + "802e21dc": "spawn_macro_abs_yrot_param1", + "802e2284": "spawn_macro_abs_special", + "802e2414": "spawn_macro_objects", + "802e2690": "spawn_macro_objects_hardcoded", + "802e28ec": "spawn_special_objects", + "802e2cf0": "render_hud_tex_lut", + "802e2e58": "render_hud_small_tex_lut", + "802e30b4": "render_power_meter_health_segment", + "802e3214": "render_dl_power_meter", + "802e33b8": "animate_power_meter_emphasized", + "802e352c": "handle_power_meter_actions", + "802e3654": "render_hud_power_meter", + "802e3744": "render_hud_mario_lives", + "802e37a8": "render_hud_coins", + "802e380c": "render_hud_stars", + "802e38e4": "render_hud_keys", + "802e395c": "render_hud_timer", + "802e3b1c": "set_hud_camera_status", + "802e3b3c": "render_hud_camera_status", + "802e3d2c": "render_hud", + "802e3e50": "set_yoshi_as_not_dead", + "802e3e68": "geo_obj_transparency_something", + "802e3f68": "absf_2", + "802e3fac": "turn_obj_away_from_surface", + "802e405c": "obj_find_wall", + "802e41a4": "turn_obj_away_from_steep_floor", + "802e42e0": "obj_orient_graph", + "802e43e4": "calc_obj_friction", + "802e445c": "calc_new_obj_vel_and_pos_y", + "802e4814": "calc_new_obj_vel_and_pos_y_underwater", + "802e4cec": "obj_update_pos_vel_xz", + "802e4d88": "obj_splash", + "802e4e90": "object_step", + "802e5114": "object_step_without_floor_orient", + "802e5160": "obj_move_xyz_using_fvel_and_yaw", + "802e5208": "is_point_within_radius_of_mario", + "802e52b8": "is_point_close_to_object", + "802e5360": "set_object_visibility", + "802e53f4": "obj_return_home_if_safe", + "802e54b0": "obj_return_and_displace_home", + "802e55d0": "obj_check_if_facing_toward_angle", + "802e569c": "obj_find_wall_displacement", + "802e5760": "obj_spawn_yellow_coins", + "802e5824": "obj_flicker_and_disappear", + "802e58b4": "current_mario_room_check", + "802e5948": "trigger_obj_dialog_when_facing", + "802e5a80": "obj_check_floor_death", + "802e5b18": "obj_lava_death", + "802e5c6c": "spawn_orange_number", + "802e5d04": "debug_sequence_tracker", + "802e5de8": "coin_step", + "802e5e6c": "moving_coin_flicker", + "802e5ea4": "coin_collected", + "802e5ee8": "bhv_moving_yellow_coin_init", + "802e5f64": "bhv_moving_yellow_coin_loop", + "802e6098": "bhv_moving_blue_coin_init", + "802e6114": "bhv_moving_blue_coin_loop", + "802e62a4": "bhv_blue_coin_sliding_jumping_init", + "802e631c": "blue_coin_sliding_away_from_mario", + "802e63ec": "blue_coin_sliding_slow_down", + "802e6474": "bhv_blue_coin_sliding_loop", + "802e6628": "bhv_blue_coin_jumping_loop", + "802e6790": "bhv_seaweed_init", + "802e67dc": "bhv_seaweed_bundle_init", + "802e6a2c": "bhv_bobomb_init", + "802e6a8c": "bobomb_spawn_coin", + "802e6af8": "bobomb_act_explode", + "802e6bd4": "bobomb_check_interactions", + "802e6cf0": "bobomb_act_patrol", + "802e6dc8": "bobomb_act_chase_mario", + "802e6e84": "bobomb_act_launched", + "802e6ed8": "generic_bobomb_free_loop", + "802e7020": "stationary_bobomb_free_loop", + "802e7134": "bobomb_free_loop", + "802e7180": "bobomb_held_loop", + "802e7220": "bobomb_dropped_loop", + "802e7280": "bobomb_thrown_loop", + "802e7324": "curr_obj_random_blink", + "802e742c": "bhv_bobomb_loop", + "802e75a0": "bhv_bobomb_fuse_smoke_init", + "802e76ac": "bhv_bobomb_buddy_init", + "802e770c": "bobomb_buddy_act_idle", + "802e7814": "bobomb_buddy_cannon_dialog", + "802e79dc": "bobomb_buddy_act_talk", + "802e7b00": "bobomb_buddy_act_turn_to_talk", + "802e7bb0": "bobomb_buddy_actions", + "802e7c4c": "bhv_bobomb_buddy_loop", + "802e7c90": "bhv_cannon_closed_init", + "802e7d4c": "cannon_door_act_opening", + "802e7e54": "bhv_cannon_closed_loop", + "802e7f70": "bhv_whirlpool_init", + "802e7fb8": "whirlpool_set_hitbox", + "802e7fec": "whirpool_orient_graph", + "802e80dc": "bhv_whirlpool_loop", + "802e82b0": "bhv_jet_stream_loop", + "802e8388": "bhv_homing_amp_init", + "802e89d4": "bhv_homing_amp_loop", + "802e8ae4": "bhv_circling_amp_init", + "802e8ecc": "bhv_circling_amp_loop", + "802e8f68": "bhv_butterfly_init", + "802e9018": "butterfly_step", + "802e9278": "butterfly_calculate_angle", + "802e9470": "butterfly_act_rest", + "802e94e4": "butterfly_act_follow_mario", + "802e9548": "butterfly_act_return_home", + "802e96c8": "bhv_butterfly_loop", + "802e9764": "bhv_hoot_init", + "802e97fc": "hoot_find_next_floor", + "802e98c0": "hoot_floor_bounce", + "802e9a4c": "hoot_free_step", + "802e9cf4": "hoot_player_set_yaw", + "802e9d98": "hoot_carry_step", + "802e9f60": "hoot_surface_collision", + "802ea144": "hoot_act_ascent", + "802ea258": "hoot_action_loop", + "802ea3f0": "hoot_turn_to_home", + "802ea4ec": "hoot_awake_loop", + "802ea588": "bhv_hoot_loop", + "802ea6a8": "bhv_beta_holdable_object_init", + "802ea7e0": "bhv_beta_holdable_object_loop", + "802ea888": "bhv_object_bubble_init", + "802ea934": "bhv_object_bubble_loop", + "802eaa10": "bhv_object_water_wave_init", + "802eaa50": "bhv_object_water_wave_loop", + "802eaa8c": "bhv_explosion_init", + "802eaad0": "bhv_explosion_loop", + "802eabf0": "bhv_bobomb_bully_death_smoke_init", + "802eac3c": "bhv_bobomb_explosion_bubble_init", + "802ead3c": "bhv_bobomb_explosion_bubble_loop", + "802eaef8": "bhv_respawner_loop", + "802eaf84": "create_respawner", + "802eb05c": "bhv_small_bully_init", + "802eb104": "bhv_big_bully_init", + "802eb1c0": "bully_check_mario_collision", + "802eb288": "bully_act_chase_mario", + "802eb3f0": "bully_act_knockback", + "802eb510": "bully_act_back_up", + "802eb5c4": "bully_backup_check", + "802eb630": "bully_play_stomping_sound", + "802eb744": "bully_step", + "802eb7e0": "bully_spawn_coin", + "802eb8b0": "bully_act_level_death", + "802eb9d0": "bhv_bully_loop", + "802ebb74": "big_bully_spawn_minion", + "802ebc00": "bhv_big_bully_with_minions_init", + "802ebc88": "big_bully_spawn_star", + "802ebce0": "bhv_big_bully_with_minions_loop", + "802ebf70": "water_ring_calc_mario_dist", + "802ec030": "water_ring_init", + "802ec1b0": "bhv_jet_stream_water_ring_init", + "802ec200": "water_ring_check_collection", + "802ec3d0": "water_ring_set_scale", + "802ec4e0": "water_ring_act_collected", + "802ec59c": "water_ring_act_not_collected", + "802ec75c": "bhv_jet_stream_water_ring_loop", + "802ec7cc": "spawn_manta_ray_ring_manager", + "802ec818": "water_ring_spawner_act_inactive", + "802ec908": "bhv_jet_stream_ring_spawner_loop", + "802ec9b8": "bhv_manta_ray_water_ring_init", + "802ec9f0": "manta_water_ring_act_not_collected", + "802ecba4": "bhv_manta_ray_water_ring_loop", + "802ecc14": "bhv_bowser_bomb_loop", + "802ecd0c": "bhv_bowser_bomb_explosion_loop", + "802ecea0": "bhv_bowser_bomb_smoke_loop", + "802ecfac": "bhv_celebration_star_init", + "802ed10c": "celeb_star_act_spin_around_mario", + "802ed28c": "celeb_star_act_face_camera", + "802ed39c": "bhv_celebration_star_loop", + "802ed40c": "bhv_celebration_star_sparkle_loop", + "802ed45c": "bhv_star_key_collection_puff_spawner_loop", + "802ed498": "bhv_lll_drawbridge_spawner_loop", + "802ed62c": "bhv_lll_drawbridge_loop", + "802ed78c": "bhv_small_bomp_init", + "802ed7fc": "bhv_small_bomp_loop", + "802edacc": "bhv_large_bomp_init", + "802edb2c": "bhv_large_bomp_loop", + "802eddfc": "bhv_wf_sliding_platform_init", + "802edf28": "bhv_wf_sliding_platform_loop", + "802ee124": "bhv_moneybag_init", + "802ee1a0": "moneybag_check_mario_collision", + "802ee268": "moneybag_jump", + "802ee46c": "moneybag_act_move_around", + "802ee598": "moneybag_act_return_home", + "802ee728": "moneybag_act_disappear", + "802ee778": "moneybag_act_death", + "802ee7e0": "bhv_moneybag_loop", + "802ee8f4": "bhv_moneybag_hidden_loop", + "802ee9cc": "bhv_bowling_ball_init", + "802eea24": "bowling_ball_set_hitbox", + "802eea7c": "bowling_ball_set_waypoints", + "802eeb64": "bhv_bowling_ball_roll_loop", + "802eecb8": "bhv_bowling_ball_initializeLoop", + "802eedf0": "bhv_bowling_ball_loop", + "802eeeb4": "bhv_generic_bowling_ball_spawner_init", + "802eef9c": "bhv_generic_bowling_ball_spawner_loop", + "802ef0e8": "bhv_thi_bowling_ball_spawner_loop", + "802ef21c": "bhv_bob_pit_bowling_ball_init", + "802ef274": "bhv_bob_pit_bowling_ball_loop", + "802ef34c": "bhv_free_bowling_ball_init", + "802ef3f4": "bhv_free_bowling_ball_roll_loop", + "802ef524": "bhv_free_bowling_ball_loop", + "802ef63c": "bhv_rr_cruiser_wing_init", + "802ef66c": "bhv_rr_cruiser_wing_loop", + "802ef820": "bhv_spindel_init", + "802ef858": "bhv_spindel_loop", + "802efcd0": "bhv_ssl_moving_pyramid_wall_init", + "802efd8c": "bhv_ssl_moving_pyramid_wall_loop", + "802efe64": "bhv_pyramid_elevator_init", + "802efef4": "bhv_pyramid_elevator_loop", + "802f0104": "bhv_pyramid_elevator_trajectory_marker_ball_loop", + "802f0168": "bhv_pyramid_top_init", + "802f0288": "bhv_pyramid_top_spinning", + "802f04a0": "bhv_pyramid_top_explode", + "802f05b4": "bhv_pyramid_top_loop", + "802f06a8": "bhv_pyramid_top_fragment_init", + "802f0714": "bhv_pyramid_top_fragment_loop", + "802f0788": "bhv_pyramid_pillar_touch_detector_loop", + "802f07f4": "bhv_waterfall_sound_loop", + "802f0820": "bhv_volcano_sound_loop", + "802f084c": "bhv_castle_flag_init", + "802f0898": "bhv_birds_sound_loop", + "802f0950": "bhv_ambient_sounds_init", + "802f09a4": "bhv_sand_sound_loop", + "802f09f0": "bhv_castle_cannon_grate_init", + "802f0a40": "bhv_snowmans_bottom_init", + "802f0b7c": "set_rolling_sphere_hitbox", + "802f0bd4": "adjust_rolling_face_pitch", + "802f0c94": "snowmans_bottom_act_1", + "802f0df0": "snowmans_bottom_act_2", + "802f0fa8": "snowmans_bottom_act_3", + "802f105c": "bhv_snowmans_bottom_loop", + "802f120c": "bhv_snowmans_head_init", + "802f1370": "bhv_snowmans_head_loop", + "802f151c": "bhv_snowmans_body_checkpoint_loop", + "802f15a8": "bhv_big_boulder_init", + "802f162c": "boulder_act_1", + "802f1714": "bhv_big_boulder_loop", + "802f17f0": "bhv_big_boulder_generator_loop", + "802f1954": "cap_set_hitbox", + "802f19c8": "cap_despawn", + "802f1a10": "cap_check_quicksand", + "802f1bb8": "cap_sink_quicksand", + "802f1d64": "bhv_wing_cap_init", + "802f1dc0": "cap_scale_vertically", + "802f1e5c": "wing_vanish_cap_act_0", + "802f1f3c": "bhv_wing_vanish_cap_loop", + "802f1fd0": "bhv_metal_cap_init", + "802f2030": "metal_cap_act_0", + "802f20ac": "bhv_metal_cap_loop", + "802f2140": "bhv_normal_cap_init", + "802f21e0": "normal_cap_set_save_flags", + "802f2284": "normal_cap_act_0", + "802f23a8": "bhv_normal_cap_loop", + "802f2498": "bhv_vanish_cap_init", + "802f24f4": "bhv_collect_star_init", + "802f25b0": "bhv_collect_star_loop", + "802f2614": "bhv_star_spawn_init", + "802f2768": "bhv_star_spawn_loop", + "802f2aa0": "spawn_star", + "802f2b88": "spawn_default_star", + "802f2bd4": "spawn_red_coin_cutscene_star", + "802f2c24": "spawn_no_exit_star", + "802f2c84": "bhv_hidden_red_coin_star_init", + "802f2d8c": "bhv_hidden_red_coin_star_loop", + "802f2e6c": "bhv_red_coin_init", + "802f2f2c": "bhv_red_coin_loop", + "802f3014": "bhv_hidden_star_init", + "802f30f0": "bhv_hidden_star_loop", + "802f31bc": "bhv_hidden_star_trigger_loop", + "802f328c": "bhv_bowser_course_red_coin_star_loop", + "802f336c": "bhv_ttm_rolling_log_init", + "802f341c": "rolling_log_roll_log", + "802f36a4": "bhv_rolling_log_loop", + "802f38b0": "volcano_act_1", + "802f39b4": "volcano_act_3", + "802f3a30": "bhv_volcano_trap_loop", + "802f3b98": "bhv_lll_rolling_log_init", + "802f3c54": "bhv_1up_interact", + "802f3cc8": "bhv_1up_common_init", + "802f3d30": "bhv_1up_init", + "802f3dd0": "one_up_loop_in_air", + "802f3ea8": "pole_1up_move_towards_mario", + "802f401c": "one_up_move_away_from_mario", + "802f40cc": "bhv_1up_walking_loop", + "802f4248": "bhv_1up_running_away_loop", + "802f43b8": "sliding_1up_move", + "802f44c0": "bhv_1up_sliding_loop", + "802f45b8": "bhv_1up_loop", + "802f45f0": "bhv_1up_jump_on_approach_loop", + "802f4710": "bhv_1up_hidden_loop", + "802f48f4": "bhv_1up_hidden_trigger_loop", + "802f496c": "bhv_1up_hidden_in_pole_loop", + "802f4b00": "bhv_1up_hidden_in_pole_trigger_loop", + "802f4b78": "bhv_1up_hidden_in_pole_spawner_loop", + "802f4c68": "controllable_platform_act_1", + "802f4ce0": "controllable_platform_act_2", + "802f4d78": "bhv_controllable_platform_sub_loop", + "802f4eb4": "bhv_controllable_platform_init", + "802f5010": "controllable_platform_hit_wall", + "802f5068": "controllable_platform_check_walls", + "802f52c0": "controllable_platform_shake_on_wall_hit", + "802f547c": "controllable_platform_tilt_from_mario", + "802f55a4": "bhv_controllable_platform_loop", + "802f5cd4": "bhv_breakable_box_small_init", + "802f5d78": "small_breakable_box_spawn_dust", + "802f5e44": "small_breakable_box_act_move", + "802f5f48": "breakable_box_small_released_loop", + "802f6014": "breakable_box_small_idle_loop", + "802f60d8": "breakable_box_small_get_dropped", + "802f6150": "breakable_box_small_get_thrown", + "802f6228": "bhv_breakable_box_small_loop", + "802f62e4": "bhv_sliding_snow_mound_loop", + "802f6448": "bhv_snow_mound_spawn_loop", + "802f6588": "floating_platform_find_home_y", + "802f665c": "floating_platform_act_0", + "802f6984": "bhv_floating_platform_loop", + "802f6c0c": "bhv_arrow_lift_loop", + "802f6d20": "bhv_orange_number_init", + "802f6d58": "bhv_orange_number_loop", + "802f6e40": "bhv_manta_ray_init", + "802f6eb0": "manta_ray_move", + "802f7068": "manta_ray_act_spawn_ring", + "802f7264": "bhv_manta_ray_loop", + "802f7348": "bhv_falling_pillar_init", + "802f7398": "bhv_falling_pillar_spawn_hitboxes", + "802f7418": "bhv_falling_pillar_calculate_angle_in_front_of_mario", + "802f74dc": "bhv_falling_pillar_loop", + "802f7760": "bhv_falling_pillar_hitbox_loop", + "802f7924": "bhv_jrb_floating_box_loop", + "802f7978": "bhv_decorative_pendulum_init", + "802f79b0": "bhv_decorative_pendulum_loop", + "802f7a58": "bhv_treasure_chest_top_loop", + "802f7c9c": "bhv_treasure_chest_bottom_init", + "802f7d04": "bhv_treasure_chest_bottom_loop", + "802f7f1c": "spawn_treasure_chest", + "802f7fa0": "bhv_treasure_chest_ship_init", + "802f8044": "bhv_treasure_chest_ship_loop", + "802f8158": "bhv_treasure_chest_jrb_init", + "802f8208": "bhv_treasure_chest_jrb_loop", + "802f82f8": "bhv_treasure_chest_init", + "802f83a4": "bhv_treasure_chest_loop", + "802f8490": "bhv_mips_init", + "802f85e0": "bhv_mips_find_furthest_waypoint_to_mario", + "802f8760": "bhv_mips_act_wait_for_nearby_mario", + "802f8808": "bhv_mips_act_follow_path", + "802f893c": "bhv_mips_act_wait_for_animation_done", + "802f8988": "bhv_mips_act_fall_down", + "802f8a34": "bhv_mips_act_idle", + "802f8ab4": "bhv_mips_free", + "802f8b54": "bhv_mips_held", + "802f8c74": "bhv_mips_dropped", + "802f8cf8": "bhv_mips_thrown", + "802f8dac": "bhv_mips_loop", + "802f8e54": "bhv_yoshi_init", + "802f8f08": "yoshi_walk_loop", + "802f9054": "yoshi_idle_loop", + "802f923c": "yoshi_talk_loop", + "802f93a8": "yoshi_walk_and_jump_off_roof_loop", + "802f9500": "yoshi_finish_jumping_and_despawn_loop", + "802f95ac": "yoshi_give_present_loop", + "802f965c": "bhv_yoshi_loop", + "802fbc4c": "bhv_koopa_init", + "802fc414": "shelled_koopa_attack_handler", + "802fcc00": "obj_begin_race", + "802fd7f8": "bhv_koopa_update", + "802fd950": "bhv_koopa_race_endpoint_update", + "802fda28": "bhv_pokey_body_part_update", + "802fe3b0": "bhv_pokey_update", + "802fe8b4": "bhv_swoop_update", + "802ff040": "bhv_fly_guy_update", + "802ff214": "bhv_goomba_triplet_spawner_update", + "802ff408": "bhv_goomba_init", + "802ff94c": "huge_goomba_weakly_attacked", + "802ff96c": "bhv_goomba_update", + "802ffb38": "bhv_chain_chomp_chain_part_update", + "80300e40": "bhv_chain_chomp_update", + "80300ecc": "bhv_wooden_post_update", + "80301148": "bhv_chain_chomp_gate_init", + "80301180": "bhv_chain_chomp_gate_update", + "80301210": "bhv_wiggler_body_part_update", + "803014cc": "wiggler_init_segments", + "803016e0": "wiggler_update_segments", + "803020e4": "wiggler_jumped_on_attack_handler", + "80302154": "bhv_wiggler_update", + "80302910": "bhv_spiny_update", + "80303028": "bhv_enemy_lakitu_update", + "8030369c": "bhv_cloud_update", + "80303744": "bhv_cloud_part_update", + "80303984": "bhv_camera_lakitu_init", + "80303f64": "bhv_camera_lakitu_update", + "803043f8": "bhv_monty_mole_hole_update", + "80304474": "monty_mole_spawn_dirt_particles", + "803044c0": "bhv_monty_mole_init", + "80304ba8": "bhv_monty_mole_update", + "80304fd4": "bhv_monty_mole_rock_update", + "80305100": "bhv_platform_on_track_init", + "80305a58": "bhv_platform_on_track_update", + "80305bb0": "bhv_track_ball_update", + "80305c14": "bhv_seesaw_platform_init", + "80305c90": "bhv_seesaw_platform_update", + "80305e2c": "bhv_ferris_wheel_axle_init", + "80305f24": "bhv_ferris_wheel_platform_update", + "80306084": "bhv_water_bomb_spawner_update", + "803062a8": "water_bomb_spawn_explode_particles", + "803067e8": "bhv_water_bomb_update", + "803068c0": "bhv_water_bomb_shadow_update", + "8030699c": "bhv_ttc_rotating_solid_init", + "80306a38": "bhv_ttc_rotating_solid_update", + "80306cc4": "bhv_ttc_pendulum_init", + "80306d38": "bhv_ttc_pendulum_update", + "80306f48": "bhv_ttc_treadmill_init", + "80307010": "bhv_ttc_treadmill_update", + "803071b8": "bhv_ttc_moving_bar_init", + "80307670": "bhv_ttc_moving_bar_update", + "80307760": "bhv_ttc_cog_init", + "803077e0": "bhv_ttc_cog_update", + "80307930": "bhv_ttc_pit_block_init", + "803079c8": "bhv_ttc_pit_block_update", + "80307ae4": "bhv_ttc_elevator_init", + "80307b58": "bhv_ttc_elevator_update", + "80307c88": "bhv_ttc_2d_rotator_init", + "80307cf8": "bhv_ttc_2d_rotator_update", + "80307ea4": "bhv_ttc_spinner_update", + "80307fb8": "mr_blizzard_spawn_white_particles", + "8030803c": "bhv_mr_blizzard_init", + "80308d6c": "bhv_mr_blizzard_update", + "80309154": "bhv_mr_blizzard_snowball", + "803091e0": "bhv_sliding_plat_2_init", + "80309354": "bhv_sliding_plat_2_loop", + "80309454": "bhv_rotating_octagonal_plat_init", + "803094d0": "bhv_rotating_octagonal_plat_loop", + "803094f8": "bhv_animates_on_floor_switch_press_init", + "80309530": "bhv_animates_on_floor_switch_press_loop", + "803097a4": "bhv_activated_back_and_forth_platform_init", + "803098c0": "bhv_activated_back_and_forth_platform_update", + "80309b64": "bhv_recovery_heart_loop", + "80309cec": "bhv_bubble_cannon_barrel_loop", + "80309ed4": "water_bomb_cannon_act_0", + "80309f68": "water_bomb_cannon_act_1", + "8030a0e8": "water_bomb_cannon_act_2", + "8030a11c": "bhv_water_bomb_cannon_loop", + "8030a1c0": "bhv_unagi_init", + "8030a2a8": "unagi_act_0", + "8030a390": "unagi_act_1_4", + "8030a514": "unagi_act_2", + "8030a614": "unagi_act_3", + "8030a93c": "bhv_unagi_loop", + "8030aabc": "bhv_unagi_subobject_loop", + "8030ad04": "dorrie_raise_head", + "8030ae9c": "dorrie_act_move", + "8030b0b8": "dorrie_begin_head_raise", + "8030b0f0": "dorrie_act_lower_head", + "8030b220": "dorrie_act_raise_head", + "8030b2f4": "bhv_dorrie_update", + "8030b658": "bhv_haunted_chair_init", + "8030b6d8": "haunted_chair_act_0", + "8030ba68": "haunted_chair_act_1", + "8030bc90": "bhv_haunted_chair_loop", + "8030bfd0": "bhv_mad_piano_update", + "8030c06c": "flying_bookend_act_0", + "8030c0f0": "flying_bookend_act_1", + "8030c210": "flying_bookend_act_2", + "8030c2c8": "flying_bookend_act_3", + "8030c364": "bhv_flying_bookend_loop", + "8030c4b0": "bhv_bookend_spawn_loop", + "8030c564": "bookshelf_manager_act_0", + "8030c60c": "bookshelf_manager_act_1", + "8030c6a4": "bookshelf_manager_act_2", + "8030c828": "bookshelf_manager_act_3", + "8030c894": "bookshelf_manager_act_4", + "8030c8ec": "bhv_haunted_bookshelf_manager_loop", + "8030c98c": "bhv_book_switch_loop", + "8030cd30": "obj_spit_fire", + "8030cddc": "bhv_fire_piranha_plant_init", + "8030d2f0": "bhv_fire_piranha_plant_update", + "8030d598": "bhv_fire_spitter_update", + "8030d640": "bhv_small_piranha_flame_loop", + "8030d8d4": "bhv_fly_guy_flame_loop", + "8030d93c": "geo_snufit_move_mask", + "8030d9ac": "geo_snufit_scale_body", + "8030da14": "snufit_act_idle", + "8030db38": "snufit_act_shoot", + "8030dc70": "bhv_snufit_loop", + "8030dfc4": "bhv_snufit_balls_loop", + "8030e14c": "bhv_horizontal_grindel_init", + "8030e16c": "bhv_horizontal_grindel_update", + "8030ea9c": "bhv_eyerok_boss_loop", + "8030fff8": "bhv_eyerok_hand_loop", + "80310498": "bhv_klepto_init", + "8031126c": "obj_set_speed_to_zero", + "8031129c": "bhv_klepto_update", + "80311874": "bhv_bird_update", + "803118e4": "bhv_racing_penguin_init", + "80312070": "bhv_racing_penguin_update", + "80312168": "bhv_penguin_race_finish_line_update", + "80312200": "bhv_penguin_race_shortcut_check_update", + "80312248": "bhv_coffin_spawner_loop", + "80312370": "coffin_act_idle", + "8031262c": "coffin_act_stand_up", + "8031274c": "bhv_coffin_loop", + "80312804": "clam_act_0", + "80312900": "clam_act_1", + "80312a54": "bhv_clam_loop", + "80313110": "bhv_skeeter_update", + "803131e8": "bhv_skeeter_wave_update", + "8031326c": "bhv_swing_platform_init", + "80313294": "bhv_swing_platform_update", + "80313354": "bhv_donut_platform_spawner_update", + "80313530": "bhv_donut_platform_update", + "803136cc": "bhv_ddd_pole_init", + "80313754": "bhv_ddd_pole_update", + "803137f4": "bhv_red_coin_star_marker_init", + "80313fc0": "bhv_triplet_butterfly_update", + "80314098": "bubba_act_0", + "8031427c": "bubba_act_1", + "803145d4": "bhv_bubba_loop", + "80314a30": "prepare_reverb_ring_buffer", + "80314cc0": "get_volume_ramping", + "80314de4": "synthesis_execute", + "80314f64": "synthesis_do_one_audio_update", + "80315590": "synthesis_process_notes", + "80316010": "load_wave_samples", + "803160dc": "final_resample", + "80316138": "process_envelope", + "8031619c": "process_envelope_inner", + "803166fc": "note_apply_headset_pan_effects", + "80316ac8": "note_init_volume", + "80316af4": "note_set_vel_pan_reverb", + "80316da8": "note_set_frequency", + "80316db4": "note_enable", + "80316e00": "note_disable", + "80316e80": "reset_bank_and_seq_load_status", + "80316ec4": "discard_bank", + "80316fb4": "discard_sequence", + "80317040": "soundAlloc", + "803170b4": "sound_alloc_pool_init", + "803170d4": "persistent_pool_clear", + "803170e8": "temporary_pool_clear", + "80317118": "unused_803160F8", + "80317128": "sound_init_main_pools", + "80317184": "session_pools_init", + "80317200": "seq_and_bank_pool_init", + "8031727c": "persistent_pools_init", + "80317338": "temporary_pools_init", + "803173fc": "alloc_bank_or_seq", + "8031782c": "get_bank_or_seq", + "803178ec": "decrease_reverb_gain", + "80317914": "wait_for_audio_frames", + "80317948": "audio_reset_session", + "80318040": "audio_dma_copy_immediate", + "803180c4": "audio_dma_copy_async", + "80318130": "audio_dma_partial_copy_async", + "803181ec": "decrease_sample_dma_ttls", + "80318300": "dma_sample_data", + "80318634": "init_sample_dma_buffers", + "803188f4": "patch_audio_bank", + "80318b30": "bank_load_immediate", + "80318c8c": "bank_load_async", + "80318dc4": "sequence_dma_immediate", + "80318e70": "sequence_dma_async", + "80318fac": "get_missing_bank", + "803190f4": "load_banks_immediate", + "80319220": "preload_sequence", + "80319328": "load_sequence", + "80319388": "load_sequence_internal", + "8031950c": "audio_init", + "80319920": "note_init", + "80319998": "note_disable2", + "803199b8": "process_notes", + "80319db8": "seq_channel_layer_decay_release_internal", + "80319f64": "seq_channel_layer_note_decay", + "80319f84": "seq_channel_layer_note_release", + "80319fa4": "build_synthetic_wave", + "8031a1d0": "init_synthetic_wave", + "8031a254": "init_note_list", + "8031a264": "init_note_lists", + "8031a2b4": "init_note_free_list", + "8031a368": "note_pool_clear", + "8031a494": "note_pool_fill", + "8031a5d0": "audio_list_push_front", + "8031a610": "audio_list_remove", + "8031a63c": "pop_node_with_value_less_equal", + "8031a6cc": "note_init_for_layer", + "8031a794": "func_80319728", + "8031a7c8": "note_release_and_take_ownership", + "8031a820": "alloc_note_from_disabled", + "8031a89c": "alloc_note_from_decaying", + "8031a8f0": "alloc_note_from_active", + "8031a94c": "alloc_note", + "8031ac34": "reclaim_notes", + "8031adac": "note_init_all", + "8031aee8": "sequence_player_process_sound", + "8031b0cc": "get_portamento_freq_scale", + "8031b1c0": "get_vibrato_pitch_change", + "8031b248": "get_vibrato_freq_scale", + "8031b440": "note_vibrato_update", + "8031b4a0": "note_vibrato_init", + "8031b58c": "adsr_init", + "8031b5ac": "adsr_update", + "8031b830": "sequence_channel_init", + "8031b940": "seq_channel_set_layer", + "8031ba30": "seq_channel_layer_disable", + "8031ba6c": "seq_channel_layer_free", + "8031baf0": "sequence_channel_disable", + "8031bb5c": "allocate_sequence_channel", + "8031bba4": "sequence_player_init_channels", + "8031bcd0": "sequence_player_disable_channels", + "8031bda0": "sequence_channel_enable", + "8031be44": "sequence_player_disable", + "8031bf14": "audio_list_push_back", + "8031bf54": "audio_list_pop_back", + "8031bf94": "init_layer_freelist", + "8031c03c": "m64_read_u8", + "8031c050": "m64_read_s16", + "8031c080": "m64_read_compressed_u16", + "8031c0c4": "seq_channel_layer_process_script", + "8031c200": "L8031C200", + "8031c23c": "L8031C23C", + "8031c298": "L8031C298", + "8031c2dc": "L8031C2DC", + "8031c328": "L8031C328", + "8031c36c": "L8031C36C", + "8031c3bc": "L8031C3BC", + "8031c3e8": "L8031C3E8", + "8031c454": "L8031C454", + "8031c4a4": "L8031C4A4", + "8031c5c8": "L8031C5C8", + "8031c698": "L8031C698", + "8031c6a0": "L8031C6A0", + "8031cbe0": "L8031CBE0", + "8031cbec": "L8031CBEC", + "8031ce54": "get_instrument", + "8031cfd4": "set_instrument", + "8031d068": "sequence_channel_set_volume", + "8031d08c": "sequence_channel_process_script", + "8031d144": "L_U_8031D144", + "8031d1f8": "L_U_8031D1F8", + "8031d234": "L_U_8031D234", + "8031d26c": "L_U_8031D26C", + "8031d2b4": "L_U_8031D2B4", + "8031d2c4": "L_U_8031D2C4", + "8031d31c": "L_U_8031D31C", + "8031d344": "L_U_8031D344", + "8031d354": "L_U_8031D354", + "8031d370": "L_U_8031D370", + "8031d3a8": "L_U_8031D3A8", + "8031d3c4": "L_U_8031D3C4", + "8031d3d4": "L_U_8031D3D4", + "8031d3e4": "L_U_8031D3E4", + "8031d400": "L_U_8031D400", + "8031d424": "L_U_8031D424", + "8031d44c": "L_U_8031D44C", + "8031d474": "L_U_8031D474", + "8031d498": "L_U_8031D498", + "8031d4bc": "L_U_8031D4BC", + "8031d4d4": "L_U_8031D4D4", + "8031d4f0": "L_U_8031D4F0", + "8031d500": "L_U_8031D500", + "8031d51c": "L_U_8031D51C", + "8031d538": "L_U_8031D538", + "8031d56c": "L_U_8031D56C", + "8031d5a0": "L_U_8031D5A0", + "8031d5b4": "L_U_8031D5B4", + "8031d5d4": "L_U_8031D5D4", + "8031d5e4": "L_U_8031D5E4", + "8031d640": "L_U_8031D640", + "8031d678": "L_U_8031D678", + "8031d6c4": "L_U_8031D6C4", + "8031d6d4": "L_U_8031D6D4", + "8031d6f4": "L_U_8031D6F4", + "8031d718": "L_U_8031D718", + "8031d728": "L_U_8031D728", + "8031d73c": "L_U_8031D73C", + "8031d7b8": "L_U_8031D7B8", + "8031d7e8": "L_U_8031D7E8", + "8031d7f8": "L_U_8031D7F8", + "8031d814": "L_U_8031D814", + "8031d830": "L_U_8031D830", + "8031d87c": "L_U_8031D87C", + "8031d898": "L_U_8031D898", + "8031d8f8": "L_U_8031D8F8", + "8031d900": "L_U_8031D900", + "8031d930": "L_U_8031D930", + "8031d94c": "L_U_8031D94C", + "8031d974": "L_U_8031D974", + "8031d9ec": "sequence_player_process_sequence", + "8031e240": "process_sequences", + "8031e2e8": "init_sequence_player", + "8031e374": "init_sequence_players", + "8031e4f0": "unused_8031E4F0", + "8031e568": "unused_8031E568", + "8031e578": "sequence_player_fade_out_internal", + "8031e5c0": "func_8031D690", + "8031e60c": "func_8031D6E4", + "8031e6a4": "func_8031D7B0", + "8031e710": "func_8031D838", + "8031e7b8": "create_next_audio_frame_task", + "8031eb00": "play_sound", + "8031eb30": "process_sound_request", + "8031edec": "process_all_sound_requests", + "8031ee70": "func_8031DFE8", + "8031ef6c": "func_8031E0E4", + "8031eff4": "func_8031E16C", + "8031f810": "get_sound_pan", + "8031f96c": "get_sound_dynamics", + "8031fb20": "get_sound_freq_scale", + "8031fbe8": "get_sound_reverb", + "8031fd84": "audio_signal_game_loop_tick", + "8031fdac": "update_game_sound", + "80320544": "play_sequence", + "80320678": "sequence_player_fade_out", + "803206bc": "fade_volume_scale", + "80320734": "fade_channel_volume_scale", + "8032080c": "func_8031F96C", + "803208ec": "process_level_music_dynamics", + "80320a4c": "L8031FBAC", + "80320a8c": "L8031FBEC", + "80320acc": "L8031FC2C", + "80320b0c": "L8031FC6C", + "80320b4c": "L8031FCAC", + "80320b8c": "L8031FCEC", + "80320bcc": "L8031FD2C", + "80320bf4": "L8031FD54", + "80320d70": "unused_8031FED0", + "80320e3c": "func_8031FFB4", + "80320ec4": "sequence_player_unlower", + "80320f68": "func_803200E4", + "803210d4": "set_sound_disabled", + "8032112c": "sound_init", + "80321398": "get_currently_playing_sound", + "80321474": "func_803205E8", + "80321584": "func_803206F8", + "8032171c": "func_80320890", + "8032174c": "sound_banks_disable", + "803217a8": "disable_all_sequence_players", + "8032180c": "sound_banks_enable", + "80321864": "unused_803209D8", + "803218d8": "func_80320A4C", + "803218f4": "play_dialog_sound", + "803219ac": "play_music", + "80321bac": "stop_background_music", + "80321ce4": "fadeout_background_music", + "80321d38": "drop_queued_background_music", + "80321d5c": "get_current_background_music", + "80321d9c": "func_80320ED8", + "80321e48": "play_secondary_music", + "80321f48": "func_80321080", + "80321f9c": "func_803210D4", + "80322078": "play_course_clear", + "803220b4": "play_peachs_jingle", + "803220f0": "play_puzzle_jingle", + "8032212c": "play_star_fanfare", + "80322168": "play_power_star_jingle", + "803221b8": "play_race_fanfare", + "803221f4": "play_toads_jingle", + "80322230": "sound_reset", + "8032231c": "audio_set_sound_mode", + "80322348": "unused_80321460", + "8032235c": "unused_80321474", + "803223b0": "osSetTime", + "803223e0": "osMapTLB", + "803224a0": "osUnmapTLBAll", + "803224f0": "sprintf", + "8032255c": "proutSprintf", + "803225a0": "osCreateMesgQueue", + "803225d0": "osSetEventMesg", + "80322640": "osViSetEvent", + "803226b0": "osCreateThread", + "80322800": "osRecvMesg", + "80322940": "_VirtualToPhysicalTask", + "80322a5c": "osSpTaskLoad", + "80322bbc": "osSpTaskStartGo", + "80322c00": "osSpTaskYield", + "80322c20": "osSendMesg", + "80322d70": "osSpTaskYielded", + "80322df0": "osStartThread", + "80322f40": "osWritebackDCacheAll", + "80322f70": "osCreateViManager", + "803230f4": "viMgrMain", + "803232d0": "osViSetMode", + "80323340": "osViBlack", + "803233b0": "osViSetSpecialFeatures", + "80323570": "osCreatePiManager", + "803236f0": "osSetThreadPri", + "803237d0": "osInitialize", + "80323a00": "osViSwapBuffer", + "80323a50": "sqrtf", + "80323a60": "osContStartReadData", + "80323b24": "osContGetReadData", + "80323bcc": "__osPackReadData", + "80323cc0": "osContInit", + "80323ebc": "__osContGetInitData", + "80323f8c": "__osPackRequestData", + "80324080": "osEepromProbe", + "803240f0": "__ull_rshift", + "8032411c": "__ull_rem", + "80324158": "__ull_div", + "80324194": "__ll_lshift", + "803241c0": "__ll_rem", + "803241fc": "__ll_div", + "80324258": "__ll_mul", + "80324288": "__ull_divremi", + "803242e8": "__ll_mod", + "80324384": "__ll_rshift", + "803243b0": "osInvalDCache", + "80324460": "osPiStartDma", + "80324570": "bzero", + "80324610": "osInvalICache", + "80324690": "osEepromLongRead", + "803247d0": "osEepromLongWrite", + "80324910": "bcopy", + "80324c20": "guOrthoF", + "80324d74": "guOrtho", + "80324de0": "guPerspectiveF", + "80325010": "guPerspective", + "80325070": "osGetTime", + "80325100": "__d_to_ll", + "8032511c": "__f_to_ll", + "80325138": "__d_to_ull", + "803251d8": "__f_to_ull", + "80325274": "__ll_to_d", + "8032528c": "__ll_to_f", + "803252a4": "__ull_to_d", + "803252d8": "__ull_to_f", + "80325310": "cosf", + "80325480": "sinf", + "80325640": "guTranslateF", + "80325688": "guTranslate", + "803256e0": "guRotateF", + "80325874": "guRotate", + "803258d0": "guScaleF", + "80325924": "guScale", + "80325970": "osAiSetFrequency", + "80325bd4": "alBnkfNew", + "80325cd8": "alSeqFileNew", + "80325d20": "osWritebackDCache", + "80325da0": "osAiGetLength", + "80325db0": "osAiSetNextBuffer", + "80325e60": "__osTimerServicesInit", + "80325eec": "__osTimerInterrupt", + "80326064": "__osSetTimerIntr", + "803260d8": "__osInsertTimer", + "80326260": "_Printf", + "803273f0": "memcpy", + "8032741c": "strlen", + "80327444": "strchr", + "80327490": "__osDequeueThread", + "803274d0": "__osDisableInt", + "803274f0": "__osRestoreInt", + "80327510": "__osViInit", + "80327640": "__osExceptionPreamble", + "80327650": "__osException", + "803278e4": "L80326964", + "80327904": "L80326984", + "80327938": "L803269B8", + "80327a68": "L80326AE8", + "80327ac4": "L80326B44", + "80327ae4": "L80326B64", + "80327b1c": "L80326B9C", + "80327b68": "L80326BE8", + "80327b98": "send_mesg", + "80327c80": "__osEnqueueAndYield", + "80327d10": "__osEnqueueThread", + "80327d58": "__osPopThread", + "80327d68": "__osDispatchThread", + "80327ea8": "__osCleanupThread", + "80327eb0": "osVirtualToPhysical", + "80327f30": "__osSpSetStatus", + "80327f40": "__osSpSetPc", + "80327f80": "__osSpRawStartDma", + "80328010": "__osSpDeviceBusy", + "80328040": "__osSpGetStatus", + "80328050": "osGetThreadPri", + "80328070": "__osViGetCurrentContext", + "80328080": "__osViSwapContext", + "803283e0": "osGetCount", + "803283f0": "__osPiCreateAccessQueue", + "80328440": "__osPiGetAccess", + "80328484": "__osPiRelAccess", + "803284b0": "osPiRawStartDma", + "80328590": "__osDevMgrMain", + "80328710": "__osSetSR", + "80328720": "__osGetSR", + "80328730": "__osSetFpcCsr", + "80328740": "__osSiRawReadIo", + "80328790": "__osSiRawWriteIo", + "803287e0": "osMapTLBRdb", + "80328840": "osPiRawReadIo", + "803288a0": "__osSiCreateAccessQueue", + "803288f0": "__osSiGetAccess", + "80328934": "__osSiRelAccess", + "80328960": "__osSiRawStartDma", + "80328a10": "osSetTimer", + "80328af0": "osEepromWrite", + "80328ca0": "__osPackEepWriteData", + "80328dac": "__osEepStatus", + "80328fd0": "osJamMesg", + "80329120": "osPiGetCmdQueue", + "80329150": "osEepromRead", + "80329340": "__osPackEepReadData", + "80329450": "guMtxF2L", + "80329550": "guMtxIdentF", + "803295d8": "guMtxIdent", + "80329608": "guMtxL2F", + "803296c0": "guNormalize", + "80329750": "__osAiDeviceBusy", + "80329780": "__osSetCompare", + "80329790": "_Litob", + "80329a90": "_Ldtob", + "8032a860": "u32_to_string", + "8032a890": "string_to_u32", + "8032a8e8": "send_packet", + "8032a9a8": "send", + "8032aa80": "process_command_memory", + "8032aacc": "process_command_register", + "8032aaf8": "kdebugserver", + "8032ace0": "__osSyncPutChars", + "8032ae10": "osSetIntMask", + "8032ae70": "osDestroyThread", + "8032af70": "__osProbeTLB", + "8032b030": "__osSiDeviceBusy", + "8032b060": "lldiv", + "8032b160": "ldiv", + "8032b1f0": "__osGetCause", + "8032b200": "__osAtomicDec", + "8032b260": "rspF3DBootStart", + "8032b330": "rspF3DBootEnd", + "8032b330": "rspF3DStart", + "8032c738": "rspF3DEnd", + "8032c740": "rspAspMainStart", + "8032d560": "rspAspMainEnd", + "8032d560": "gVblankHandler1", + "8032d564": "gVblankHandler2", + "8032d568": "gActiveSPTask", + "8032d56c": "sCurrentAudioSPTask", + "8032d570": "sCurrentDisplaySPTask", + "8032d574": "sNextAudioSPTask", + "8032d578": "sNextDisplaySPTask", + "8032d57c": "sAudioEnabled", + "8032d580": "sNumVblanks", + "8032d584": "gResetTimer", + "8032d588": "D_8032C648", + "8032d58c": "gDebugLevelSelect", + "8032d590": "D_8032C650", + "8032d594": "gShowProfiler", + "8032d598": "gShowDebugText", + "8032d5d0": "unused8032C690", + "8032d5d4": "gGlobalTimer", + "8032d5dc": "frameBufferIndex", + "8032d5e0": "D_8032C6A0", + "8032d5e4": "gPlayer1Controller", + "8032d5e8": "gPlayer2Controller", + "8032d5ec": "gPlayer3Controller", + "8032d5f0": "gCurrDemoInput", + "8032d5f4": "gDemoInputListID", + "8032d5f8": "gRecordedDemoInput", + "8032d6d0": "credits01", + "8032d6d8": "credits02", + "8032d6e4": "credits03", + "8032d6f0": "credits04", + "8032d700": "credits05", + "8032d710": "credits06", + "8032d71c": "credits07", + "8032d728": "credits08", + "8032d738": "credits09", + "8032d740": "credits10", + "8032d750": "credits11", + "8032d75c": "credits12", + "8032d764": "credits13", + "8032d774": "credits14", + "8032d77c": "credits15", + "8032d788": "credits16", + "8032d79c": "credits17", + "8032d7ac": "credits18", + "8032d7bc": "credits19", + "8032d7c4": "credits20", + "8032d7cc": "sCreditsSequence", + "8032d93c": "gMarioState", + "8032d940": "unused1", + "8032d944": "D_8032C9E0", + "8032daa0": "sTerrainSounds", + "8032dacc": "sSquishScaleOverTime", + "8032dae0": "sCapFlickerFrames", + "8032daf8": "gWaterSurfacePseudoFloor", + "8032dc50": "sJumpLandAction", + "8032dc68": "sFreefallLandAction", + "8032dc80": "sSideFlipLandAction", + "8032dc98": "sHoldJumpLandAction", + "8032dcb0": "sHoldFreefallLandAction", + "8032dcc8": "sLongJumpLandAction", + "8032dce0": "sDoubleJumpLandAction", + "8032dcf8": "sTripleJumpLandAction", + "8032dd10": "sBackflipLandAction", + "8032dd40": "sPunchingForwardVelocities", + "8032dd80": "gLastCompletedCourseNum", + "8032dd84": "gLastCompletedStarNum", + "8032dd88": "sUnusedGotGlobalCoinHiScore", + "8032dd8c": "gGotFileCoinHiScore", + "8032dd90": "gCurrCourseStarFlags", + "8032dd94": "gSpecialTripleJump", + "8032dd98": "gLevelToCourseNumTable", + "8032ddc0": "gMarioSpawnInfo", + "8032ddc4": "gLoadedGraphNodes", + "8032ddc8": "gAreas", + "8032ddcc": "gCurrentArea", + "8032ddd0": "gCurrCreditsEntry", + "8032ddd4": "D_8032CE74", + "8032ddd8": "D_8032CE78", + "8032dddc": "gWarpTransDelay", + "8032dde0": "gFBSetColor", + "8032dde4": "gWarpTransFBSetColor", + "8032dde8": "gWarpTransRed", + "8032ddec": "gWarpTransGreen", + "8032ddf0": "gWarpTransBlue", + "8032ddf4": "gCurrSaveFileNum", + "8032ddf8": "gCurrLevelNum", + "8032ddfc": "sWarpBhvSpawnTable", + "8032de4c": "sSpawnTypeFromWarpBhv", + "8032de60": "D_8032CF00", + "8032de70": "renderModeTable_1Cycle", + "8032deb0": "renderModeTable_2Cycle", + "8032def0": "gCurGraphNodeRoot", + "8032def4": "gCurGraphNodeMasterList", + "8032def8": "gCurGraphNodeCamFrustum", + "8032defc": "gCurGraphNodeCamera", + "8032df00": "gCurGraphNodeObject", + "8032df04": "gCurGraphNodeHeldObject", + "8032df08": "gAreaUpdateCounter", + "8032df10": "gProfilerMode", + "8032df14": "gCurrentFrameIndex1", + "8032df18": "gCurrentFrameIndex2", + "8032df20": "unused8032CFC0", + "8032df24": "gCutsceneFocus", + "8032df28": "unused8032CFC8", + "8032df2c": "unused8032CFCC", + "8032df30": "gSecondCameraFocus", + "8032df34": "sYawSpeed", + "8032df38": "gCurrLevelArea", + "8032df3c": "gPrevLevel", + "8032df40": "unused8032CFE0", + "8032df44": "unused8032CFE4", + "8032df48": "unused8032CFE8", + "8032df4c": "gCameraZoomDist", + "8032df50": "sObjectCutscene", + "8032df54": "gRecentCutscene", + "8032df58": "sFramesSinceCutsceneEnded", + "8032df5c": "sCutsceneDialogResponse", + "8032df60": "sMarioCamState", + "8032df64": "sLuigiCamState", + "8032df68": "unused8032D008", + "8032df6c": "sFixedModeBasePosition", + "8032df78": "sUnusedModeBasePosition_2", + "8032df84": "sUnusedModeBasePosition_3", + "8032df90": "sUnusedModeBasePosition_4", + "8032df9c": "sUnusedModeBasePosition_5", + "8032dfa8": "sModeTransitions", + "8032e008": "unused8032D0A8", + "8032e010": "unused8032D0B0", + "8032e018": "sDanceCutsceneTable", + "8032e024": "unusedDanceInfo1", + "8032e038": "unusedDanceType", + "8032e03c": "unusedDanceInfo2", + "8032e050": "sBBHLibraryParTrackPath", + "8032e098": "sCamSL", + "8032e0e0": "sCamTHI", + "8032e128": "sCamHMC", + "8032e1d0": "sCamSSL", + "8032e248": "sCamRR", + "8032e2f0": "sCamBOB", + "8032e338": "sCamCotMC", + "8032e368": "sCamCCM", + "8032e3b0": "sCamCastle", + "8032e6f8": "sCamBBH", + "8032ecb0": "sCameraTriggers", + "8032ed50": "sIntroStartToPipePosition", + "8032ee08": "sIntroStartToPipeFocus", + "8032eec0": "sIntroPipeToDialogPosition", + "8032ef30": "sIntroPipeToDialogFocus", + "8032efa0": "sEndingFlyToWindowPos", + "8032eff0": "sEndingFlyToWindowFocus", + "8032f048": "sEndingPeachDescentCamPos", + "8032f0e8": "sEndingMarioToPeachPos", + "8032f130": "sEndingMarioToPeachFocus", + "8032f178": "sEndingLookUpAtCastle", + "8032f1b8": "sEndingLookAtSkyFocus", + "8032f214": "gIntroLakituStartToPipeFocus", + "8032f32c": "gIntroLakituStartToPipeOffsetFromCamera", + "8032f444": "gEndWavingPos", + "8032f48c": "gEndWavingFocus", + "8032f4d4": "sCutsceneEnding", + "8032f534": "sCutsceneGrandStar", + "8032f544": "sCutsceneUnused", + "8032f554": "sCutsceneDoorWarp", + "8032f564": "sCutsceneEndWaving", + "8032f56c": "sCutsceneCredits", + "8032f574": "sCutsceneDoorPull", + "8032f59c": "sCutsceneDoorPush", + "8032f5c4": "sCutsceneDoorPullMode", + "8032f5dc": "sCutsceneDoorPushMode", + "8032f5f4": "sCutsceneEnterCannon", + "8032f60c": "sCutsceneStarSpawn", + "8032f624": "sCutsceneRedCoinStarSpawn", + "8032f634": "sCutsceneEnterPainting", + "8032f63c": "sCutsceneDeathExit", + "8032f64c": "sCutsceneExitPaintingSuccess", + "8032f65c": "sCutsceneUnusedExit", + "8032f674": "sCutsceneIntroPeach", + "8032f69c": "sCutscenePrepareCannon", + "8032f6ac": "sCutsceneExitWaterfall", + "8032f6bc": "sCutsceneFallToCastleGrounds", + "8032f6cc": "sCutsceneEnterPyramidTop", + "8032f6dc": "sCutscenePyramidTopExplode", + "8032f6f4": "sCutsceneStandingDeath", + "8032f6fc": "sCutsceneEnterPool", + "8032f70c": "sCutsceneDeathStomach", + "8032f714": "sCutsceneDeathOnBack", + "8032f71c": "sCutsceneQuicksandDeath", + "8032f724": "sCutsceneWaterDeath", + "8032f72c": "sCutsceneSuffocation", + "8032f734": "sCutsceneEnterBowserArena", + "8032f74c": "sCutsceneDanceDefaultRotate", + "8032f754": "sCutsceneDanceFlyAway", + "8032f75c": "sCutsceneDanceCloseup", + "8032f764": "sCutsceneKeyDance", + "8032f76c": "sCutsceneCapSwitchPress", + "8032f774": "sCutsceneSlidingDoorsOpen", + "8032f784": "sCutsceneUnlockKeyDoor", + "8032f794": "sCutsceneExitBowserSuccess", + "8032f7a4": "sCutsceneExitBowserDeath", + "8032f7b4": "sCutsceneExitSpecialSuccess", + "8032f7c4": "sCutsceneNonPaintingDeath", + "8032f7d4": "sCutsceneDialog", + "8032f7ec": "sCutsceneReadMessage", + "8032f804": "sDanceCutsceneIndexTable", + "8032f870": "sZoomOutAreaMasks", + "8032f884": "sBobCreditsSplinePositions", + "8032f8ac": "sBobCreditsSplineFocus", + "8032f8d4": "sWfCreditsSplinePositions", + "8032f8fc": "sWfCreditsSplineFocus", + "8032f924": "sJrbCreditsSplinePositions", + "8032f94c": "sJrbCreditsSplineFocus", + "8032f974": "sCcmSlideCreditsSplinePositions", + "8032f99c": "sCcmSlideCreditsSplineFocus", + "8032f9c4": "sBbhCreditsSplinePositions", + "8032f9e4": "sBbhCreditsSplineFocus", + "8032fa04": "sHmcCreditsSplinePositions", + "8032fa2c": "sHmcCreditsSplineFocus", + "8032fa54": "sThiWigglerCreditsSplinePositions", + "8032fa6c": "sThiWigglerCreditsSplineFocus", + "8032fa84": "sVolcanoCreditsSplinePositions", + "8032fab4": "sVolcanoCreditsSplineFocus", + "8032fae4": "sSslCreditsSplinePositions", + "8032fb14": "sSslCreditsSplineFocus", + "8032fb44": "sDddCreditsSplinePositions", + "8032fb7c": "sDddCreditsSplineFocus", + "8032fbb4": "sSlCreditsSplinePositions", + "8032fbd4": "sSlCreditsSplineFocus", + "8032fbf4": "sWdwCreditsSplinePositions", + "8032fc14": "sWdwCreditsSplineFocus", + "8032fc34": "sTtmCreditsSplinePositions", + "8032fc64": "sTtmCreditsSplineFocus", + "8032fc94": "sThiHugeCreditsSplinePositions", + "8032fccc": "sThiHugeCreditsSplineFocus", + "8032fd04": "sTtcCreditsSplinePositions", + "8032fd24": "sTtcCreditsSplineFocus", + "8032fd44": "sRrCreditsSplinePositions", + "8032fd64": "sRrCreditsSplineFocus", + "8032fd84": "sSaCreditsSplinePositions", + "8032fdac": "sSaCreditsSplineFocus", + "8032fdd4": "sCotmcCreditsSplinePositions", + "8032fdfc": "sCotmcCreditsSplineFocus", + "8032fe24": "sDddSubCreditsSplinePositions", + "8032fe4c": "sDddSubCreditsSplineFocus", + "8032fe74": "sCcmOutsideCreditsSplinePositions", + "8032fe94": "sCcmOutsideCreditsSplineFocus", + "8032fec0": "sObjectListUpdateOrder", + "8032fecc": "sParticleTypes", + "80330000": "D_8032F0A0", + "80330004": "D_8032F0A4", + "80330020": "D_8032F0C0", + "8033002c": "D_8032F0CC", + "8033006c": "sMrIParticleActions", + "80330074": "sMrIActions", + "80330084": "sMrIHitbox", + "80330094": "D_8032F134", + "803300a8": "unused8032F134", + "803300ac": "sCapSwitchActions", + "803300bc": "sKingBobombActions", + "803300e0": "sKingBobombSoundStates", + "80330140": "sOpenedCannonActions", + "8033015c": "unused0EA1FC", + "80330198": "sChuckyaActions", + "803301a8": "sWFRotatingPlatformData", + "803301c0": "sKoopaShellUnderwaterHitbox", + "803301d0": "D_8032F270", + "803301e4": "sSparkleSpawnStarHitbox", + "803301f4": "sYellowCoinHitbox", + "80330204": "D_8032F2A4", + "80330224": "sCoinInsideBooActions", + "8033022c": "D_8032F2CC", + "80330244": "D_8032F2E4", + "80330260": "D_8032F300", + "80330288": "D_8032F328", + "80330290": "D_8032F330", + "80330298": "sGrindelThwompActions", + "803302ac": "sTumblingBridgeParams", + "803302dc": "sTumblingBridgeActions", + "803302ec": "D_8032F38C", + "80330318": "sElevatorActions", + "8033032c": "D_8032F3CC", + "80330340": "D_8032F3E0", + "80330354": "D_8032F3F4", + "8033035c": "D_8032F3FC", + "80330370": "sUkikiCageActions", + "80330380": "D_8032F420", + "80330390": "sSpindriftHitbox", + "803303a0": "sMetalBoxHitbox", + "803303b0": "sBreakableBoxHitbox", + "803303c0": "D_8032F460", + "803303e8": "sHeaveHoActions", + "803303f8": "sJumpingBoxHitbox", + "80330408": "sJumpingBoxActions", + "8033042c": "sBowserKeyHitbox", + "8033043c": "sBulletBillActions", + "80330450": "sBowserTailAnchorActions", + "8033045c": "D_8032F4FC", + "8033046c": "D_8032F50C", + "80330470": "D_8032F510", + "80330474": "D_8032F514", + "80330478": "sBowserDefeatedDialogText", + "80330480": "D_8032F520", + "803304c8": "sBowserActions", + "80330518": "D_8032F5B8", + "803305f0": "D_8032F690", + "803305f4": "D_8032F694", + "803305f8": "D_8032F698", + "8033067c": "sFallingBowserPlatformActions", + "80330688": "sGrowingBowserFlameHitbox", + "80330698": "sBowserFlameHitbox", + "803306a8": "D_8032F748", + "803306b4": "D_8032F754", + "803306dc": "sCageUkikiPath", + "80330738": "sUkikiSoundStates", + "803307a0": "sUkikiActions", + "803307c0": "D_8032F860", + "803307f4": "D_8032F894", + "80330828": "D_8032F8C8", + "80330830": "sRotatingCwFireBarsActions", + "80330840": "sKoopaShellHitbox", + "80330850": "D_8032F8F0", + "80330884": "D_8032F924", + "803308a8": "D_8032F948", + "803308cc": "D_8032F96C", + "803308d8": "sToxBoxActions", + "80330900": "TablePiranhaPlantActions", + "80330b1c": "sBowserPuzzlePieceActions", + "80330b38": "sTuxiesMotherActions", + "80330b44": "sSmallPenguinActions", + "80330b5c": "sFishActions", + "80330b68": "sFishGroupActions", + "80330b74": "sBirdChirpChirpActions", + "80330b84": "sCheepCheepActions", + "80330b90": "sExclamationBoxHitbox", + "80330ba0": "sExclamationBoxContents", + "80330c20": "sExclamationBoxActions", + "80330c38": "sSkullSlidingBoxHitbox", + "80330c48": "gOpenableGrills", + "80330c58": "sTweesterHitbox", + "80330c68": "sTweesterActions", + "80330cd4": "sScuttlebugHitbox", + "80330ce4": "sWhompActions", + "80330d0c": "sWaterSplashDropletParams", + "80330d30": "gShallowWaterSplashDropletParams", + "80330d54": "sWaterDropletFishParams", + "80330d78": "gShallowWaterWaveDropletParams", + "80330d9c": "sStrongWindParticleHitbox", + "80330dac": "sSLWalkingPenguinErraticSteps", + "80330e20": "D_8032FEC0", + "80330e24": "unused_8032FEC4", + "80330e34": "gMarioPlatform", + "80330e40": "sDebugEffectStringInfo", + "80330e64": "sDebugEnemyStringInfo", + "80330e88": "sDebugInfoDPadMask", + "80330e8c": "sDebugInfoDPadUpdID", + "80330e90": "sDebugLvSelectCheckFlag", + "80330e94": "sDebugPage", + "80330e98": "sNoExtraDebug", + "80330e9c": "sDebugStringArrPrinted", + "80330ea0": "sDebugSysCursor", + "80330ea4": "sDebugInfoButtonSeqID", + "80330ea8": "sDebugInfoButtonSeq", + "80330ec0": "sTransitionColorFadeCount", + "80330ec4": "sTransitionTextureFadeCount", + "80330ec8": "sTextureTransitionID", + "80330ee0": "rectangles", + "80330f00": "sSkyboxTextures", + "80330f28": "sSkyboxColors", + "80330f30": "gMovtexCounter", + "80330f34": "gMovtexCounterPrev", + "80330f38": "gMovtexVtxColor", + "80330f3c": "gPaintingMarioYEntry", + "80330f40": "gWdwWaterLevelSet", + "80330f44": "gMovtexIdToTexture", + "80330f64": "gMovtexNonColored", + "803311a4": "gMovtexColored", + "8033127c": "gMovtexColored2", + "80331300": "sHmcPaintings", + "80331308": "sInsideCastlePaintings", + "80331344": "sTtmPaintings", + "8033134c": "sPaintingGroups", + "80331358": "gPaintingUpdateCounter", + "8033135c": "gLastPaintingUpdateCounter", + "80331360": "sTextLabelsCount", + "80331370": "gDialogCharWidths", + "80331470": "gDialogBoxState", + "80331474": "gDialogBoxOpenTimer", + "80331478": "gDialogBoxScale", + "8033147c": "gDialogScrollOffsetY", + "80331480": "gDialogBoxType", + "80331484": "gDialogID", + "80331488": "gLastDialogPageStrPos", + "8033148c": "gDialogTextPos", + "80331490": "gDialogLineNum", + "80331494": "gLastDialogResponse", + "80331498": "gMenuHoldKeyIndex", + "8033149c": "gMenuHoldKeyTimer", + "803314a0": "gDialogResponse", + "803314b0": "gHudSymCoin", + "803314b4": "gHudSymX", + "803314f8": "gMenuMode", + "803314fc": "gEndCutsceneStrEn0", + "80331504": "gEndCutsceneStrEn1", + "80331538": "gEndCutsceneStrEn2", + "80331558": "gEndCutsceneStrEn3", + "8033156c": "gEndCutsceneStrEn4", + "80331598": "gEndCutsceneStrEn5", + "803315ac": "gEndCutsceneStrEn6", + "803315cc": "gEndCutsceneStrEn7", + "803315dc": "gEndCutsceneStrEn8", + "803315e4": "gEndCutsceneStringsEn", + "8033160c": "gCutsceneMsgFade", + "80331610": "gCutsceneMsgIndex", + "80331614": "gCutsceneMsgDuration", + "80331618": "gCutsceneMsgTimer", + "8033161c": "gDialogCameraAngleIndex", + "80331620": "gDialogCourseActNum", + "803316c8": "gCourseCompleteCoinsEqual", + "803316cc": "gCourseDoneMenuTimer", + "803316d0": "gCourseCompleteCoins", + "803316d4": "gHudFlash", + "80331750": "gEnvFxMode", + "80331754": "D_80330644", + "80331758": "gSnowTempVtx", + "80331788": "gSnowFlakeVertex1", + "80331790": "gSnowFlakeVertex2", + "80331798": "gSnowFlakeVertex3", + "803317a0": "D_80330690", + "803317a4": "D_80330694", + "803317a8": "gBubbleTempVtx", + "803317e0": "MacroObjectPresets", + "803325fc": "sPowerMeterVisibleTimer", + "80332614": "sPrevCheckMarioRoom", + "80332618": "sYoshiDead", + "8033261c": "sDebugSequenceTracker", + "80332620": "sDebugTimer", + "803327a8": "sBreakableBoxSmallHitbox", + "80332b00": "sMrBlizzardHitbox", + "80332b24": "sMrBlizzardSnowballHitbox", + "80332b34": "D_80331A24", + "80332b54": "D_80331A44", + "80332b5c": "D_80331A4C", + "80332b64": "D_80331A54", + "80332bdc": "D_80331ACC", + "80332bf0": "sRecoveryHeartHitbox", + "80332c00": "sUnagiHitbox", + "80332c10": "sHauntedChairHitbox", + "80332c30": "sFlyingBookendHitbox", + "80332c40": "D_80331B30", + "80332c4c": "sBookSwitchHitbox", + "80332c5c": "sFirePiranhaPlantHitbox", + "80332c6c": "D_80331B5C", + "80332c74": "sPiranhaPlantFireHitbox", + "80332c84": "sSnufitHitbox", + "80332c94": "sSnufitBulletHitbox", + "80332ca4": "sEyerokHitbox", + "80332cb4": "D_80331BA4", + "80332d10": "coffinRelativePos", + "80332d28": "sClamShellHitbox", + "80332d38": "sSkeeterHitbox", + "80332d48": "D_80331C38", + "80332e50": "gAudioErrorFlags", + "80332e54": "sGameLoopTicked", + "80332e58": "sDialogSpeaker", + "80332f04": "sDialogSpeakerVoice", + "80332f40": "sNumProcessedSoundRequests", + "80332f44": "sSoundRequestCount", + "80332f48": "sDynBbh", + "80332f54": "sDynDdd", + "80332f6c": "sDynJrb", + "80332f88": "sDynWdw", + "80332f98": "sDynHmc", + "80332fa8": "sDynUnk38", + "80332fb8": "sDynNone", + "80332fbc": "sCurrentMusicDynamic", + "80332fc0": "sBackgroundMusicForDynamics", + "80332fc4": "sLevelDynamics", + "80333060": "sMusicDynamics", + "803330c0": "gAreaEchoLevel", + "80333138": "D_80332028", + "80333188": "sBackgroundMusicDefaultVolume", + "803331ac": "sPlayer0CurSeqId", + "803331b0": "sMusicDynamicDelay", + "803331b4": "D_803320A4", + "803331c0": "D_803320B0", + "803331cc": "D_803320BC", + "803331d8": "sMaxChannelsForSoundBank", + "803331e4": "sNumSoundsPerBank", + "803331f0": "gDefaultSoundArgs", + "803331fc": "sUnusedSoundArgs", + "80333208": "sSoundBankDisabled", + "80333218": "D_80332108", + "8033321c": "sHasStartedFadeOut", + "80333220": "D_80332110", + "80333224": "sUnused80332114", + "80333228": "sUnused80332118", + "8033322c": "D_8033211C", + "80333230": "D_80332120", + "80333234": "D_80332124", + "80333238": "sBackgroundMusicQueueSize", + "8033323c": "sUnused8033323C", + "803332a0": "gAudioSessionPresets", + "80333498": "gAudioCosineTable", + "80333598": "gPitchBendFrequencyScale", + "80333994": "gNoteFrequencies", + "80333b94": "gDefaultShortNoteVelocityTable", + "80333ba4": "gDefaultShortNoteDurationTable", + "80333bb4": "gVibratoCurve", + "80333bc4": "gDefaultEnvelope", + "80333bd0": "sSineWave", + "80333c50": "sSquareWave", + "80333cd0": "sTriangleWave", + "80333d50": "sSawtoothWave", + "80333dd0": "gWaveSamples", + "80333de0": "gHeadsetPanQuantization", + "80333df4": "gHeadsetPanVolume", + "80333ff4": "gStereoPanVolume", + "803341f4": "gDefaultPanVolume", + "803343f4": "gVolRampingLhs136", + "803345f4": "gVolRampingRhs136", + "803347f4": "gVolRampingLhs144", + "803349f4": "gVolRampingRhs144", + "80334bf4": "gVolRampingLhs128", + "80334df4": "gVolRampingRhs128", + "80334ff4": "gTatumsPerBeat", + "80334ff8": "gUnusedCount80333EE8", + "80334ffc": "gAudioHeapSize", + "80335000": "D_80333EF0", + "80335004": "gAudioLoadLock", + "80335008": "sUnused8033EF8", + "80335010": "osViModeTable", + "803358f0": "piMgrArgs", + "80335910": "osClockRate", + "80335918": "D_80334808", + "80335920": "_osContInitialized", + "80335930": "D_80334820", + "80335940": "D_80334830", + "80335950": "_spaces", + "80335974": "_zeroes", + "803359a0": "D_80334890", + "803359a4": "D_80334894", + "803359a8": "D_80334898", + "803359ac": "D_8033489C", + "803359b0": "D_803348A0", + "803359b4": "D_803348A4", + "803359c0": "D_803348B0", + "80335a20": "D_80334910", + "80335a24": "D_80334914", + "80335a28": "D_80334918", + "80335a2c": "D_8033491C", + "80335a30": "D_80334920", + "80335a44": "D_80334934", + "80335a48": "D_80334938", + "80335a50": "gOsPiAccessQueueCreated", + "80335a60": "gOsSiAccessQueueCreated", + "80335aa0": "D_80334990", + "80335af0": "D_803349E0", + "80335b40": "D_80334A30", + "80335b44": "D_80334A34", + "80335b48": "D_80334A38", + "80335b50": "D_80334A40", + "80335b54": "D_80334A44", + "80338e60": "jtbl_80337C90", + "80338e84": "jtbl_80337CB4", + "80338eac": "jtbl_80337CDC", + "80338ec0": "jtbl_80337D08", + "80338fbc": "jtbl_80337E04", + "8033978c": "jtbl_80338418", + "80339880": "length_str", + "80339884": "flags_str", + "8033988c": "flags_arr", + "80339980": "D_80338610", + "803399a0": "jtbl_80338630", + "803399d0": "NAN", + "803399e0": "D_80338670", + "80339a40": "D_803386D0", + "80339ac0": "rspF3DDataStart", + "8033a2c0": "rspF3DDataEnd", + "8033a2c0": "rspAspMainDataStart", + "8033a580": "rspAspMainDataEnd", + "8033a580": "_mainSegmentEnd", + "008c0c40": "_mainSegmentRomEnd", + "8033a580": "_mainSegmentNoloadStart", + "8033a580": "D_80339210", + "8033a730": "gIdleThread", + "8033a8e0": "gMainThread", + "8033aa90": "gGameLoopThread", + "8033ac40": "gSoundThread", + "8033adf0": "gPIMesgQueue", + "8033ae08": "gIntrMesgQueue", + "8033ae20": "gSPTaskMesgQueue", + "8033ae38": "gDmaMesgBuf", + "8033ae40": "gPIMesgBuf", + "8033aec0": "gSIEventMesgBuf", + "8033aec8": "gIntrMesgBuf", + "8033af08": "gUnknownMesgBuf", + "8033af48": "gDmaIoMesg", + "8033af5c": "D_80339BEC", + "8033af60": "gDmaMesgQueue", + "8033af78": "gSIEventMesgQueue", + "8033af90": "gControllers", + "8033afe8": "gControllerStatuses", + "8033aff8": "gControllerPads", + "8033b010": "gGameVblankQueue", + "8033b028": "D_80339CB8", + "8033b040": "D_80339CD0", + "8033b044": "D_80339CD4", + "8033b048": "gGameVblankHandler", + "8033b050": "gPhysicalFrameBuffers", + "8033b05c": "gPhysicalZBuffer", + "8033b060": "D_80339CF0", + "8033b064": "D_80339CF4", + "8033b068": "gGfxSPTask", + "8033b06c": "gDisplayListHead", + "8033b070": "gGfxPoolEnd", + "8033b074": "gGfxPool", + "8033b078": "gControllerBits", + "8033b079": "gEepromProbe", + "8033b080": "D_80339D10", + "8033b090": "gDemo", + "8033b0a0": "filler80339D30", + "8033b170": "gMarioStates", + "8033b238": "sCurrPlayMode", + "8033b23a": "D_80339ECA", + "8033b23c": "sTransitionTimer", + "8033b240": "sTransitionUpdate", + "8033b244": "unused3", + "8033b248": "sWarpDest", + "8033b250": "D_80339EE0", + "8033b252": "sDelayedWarpOp", + "8033b254": "sDelayedWarpTimer", + "8033b256": "sSourceWarpNodeId", + "8033b258": "sDelayedWarpArg", + "8033b25c": "unused4", + "8033b25e": "sTimerRunning", + "8033b260": "gHudDisplay", + "8033b26e": "gShouldNotPlayCastleMusic", + "8033b270": "sDelayInvincTimer", + "8033b272": "sInvulnerable", + "8033b280": "unused80339F10", + "8033b288": "filler80339F1C", + "8033b2c0": "D_80339F50", + "8033b350": "gMirrorMario", + "8033b3b0": "gBodyStates", + "8033b400": "sSegmentTable", + "8033b480": "sPoolFreeSpace", + "8033b484": "sPoolStart", + "8033b488": "sPoolEnd", + "8033b48c": "sPoolListHeadL", + "8033b490": "sPoolListHeadR", + "8033b494": "gEffectsMemoryPool", + "8033b4a0": "gWarpCheckpoint", + "8033b4a5": "gMainMenuDataModified", + "8033b4a6": "gSaveFileModified", + "8033b4b0": "gPlayerSpawnInfos", + "8033b4d0": "D_8033A160", + "8033b8d0": "gAreaData", + "8033bab0": "gWarpTransition", + "8033bac6": "gCurrCourseNum", + "8033bac8": "gCurrActNum", + "8033baca": "gCurrAreaIndex", + "8033bacc": "gSavedCourseNum", + "8033bace": "gPauseScreenMode", + "8033bad0": "gSaveOptSelectIndex", + "8033bae0": "gMatStackIndex", + "8033bae8": "gMatStack", + "8033c2e8": "gMatStackFixed", + "8033c368": "gGeoTempState", + "8033c378": "gCurAnimType", + "8033c379": "gCurAnimEnabled", + "8033c37a": "gCurrAnimFrame", + "8033c37c": "gCurAnimTranslationMultiplier", + "8033c380": "gCurrAnimAttribute", + "8033c384": "gCurAnimData", + "8033c388": "gDisplayListHeap", + "8033c390": "gProfilerFrameData", + "8033c520": "gPlayerCameraState", + "8033c568": "sOldPosition", + "8033c578": "sOldFocus", + "8033c588": "sPlayer2FocusOffset", + "8033c594": "sCreditsPlayer2Pitch", + "8033c596": "sCreditsPlayer2Yaw", + "8033c598": "sFramesPaused", + "8033c5a0": "sFOVState", + "8033c5c0": "sModeTransition", + "8033c5e8": "sMarioGeometry", + "8033c61c": "unusedFreeRoamWallYaw", + "8033c61e": "sAvoidYawVel", + "8033c620": "sCameraYawAfterDoorCutscene", + "8033c622": "unusedSplinePitch", + "8033c624": "unusedSplineYaw", + "8033c628": "sHandheldShakeSpline", + "8033c668": "sHandheldShakeMag", + "8033c66c": "sHandheldShakeTimer", + "8033c670": "sHandheldShakeInc", + "8033c674": "sHandheldShakePitch", + "8033c676": "sHandheldShakeYaw", + "8033c678": "sHandheldShakeRoll", + "8033c67c": "unused8033B30C", + "8033c680": "unused8033B310", + "8033c684": "sSelectionFlags", + "8033c686": "unused8033B316", + "8033c688": "s2ndRotateFlags", + "8033c68a": "unused8033B31A", + "8033c68c": "sCameraSoundFlags", + "8033c68e": "sCButtonsPressed", + "8033c690": "sCutsceneDialogID", + "8033c698": "gLakituState", + "8033c758": "unused8033B3E8", + "8033c75a": "sAreaYaw", + "8033c75c": "sAreaYawChange", + "8033c75e": "sLakituDist", + "8033c760": "sLakituPitch", + "8033c764": "sZoomAmount", + "8033c768": "sCSideButtonYaw", + "8033c76a": "sBehindMarioSoundTimer", + "8033c76c": "sZeroZoomDist", + "8033c770": "sCUpCameraPitch", + "8033c772": "sModeOffsetYaw", + "8033c774": "sSpiralStairsYawOffset", + "8033c776": "s8DirModeBaseYaw", + "8033c778": "s8DirModeYawOffset", + "8033c77c": "sPanDistance", + "8033c780": "sCannonYOffset", + "8033c788": "sModeInfo", + "8033c7d0": "sCastleEntranceOffset", + "8033c7dc": "sParTrackIndex", + "8033c7e0": "sParTrackPath", + "8033c7e8": "sParTrackTransOff", + "8033c808": "sCameraStoreCUp", + "8033c828": "sCameraStoreCutscene", + "8033c848": "gCameraMovementFlags", + "8033c84a": "sStatusFlags", + "8033c850": "sCurCreditsSplinePos", + "8033c950": "sCurCreditsSplineFocus", + "8033ca50": "sCutsceneSplineSegment", + "8033ca54": "sCutsceneSplineSegmentProgress", + "8033ca58": "unused8033B6E8", + "8033ca5a": "sCutsceneShot", + "8033ca5c": "gCutsceneTimer", + "8033ca60": "sCutsceneVars", + "8033cbc8": "gObjCutsceneDone", + "8033cbcc": "gCutsceneObjSpawn", + "8033cbd0": "gCamera", + "8033cbe0": "gObjectListArray", + "8033d260": "gDebugInfoFlags", + "8033d264": "gNumFindFloorMisses", + "8033d268": "unused_8033BEF8", + "8033d26c": "gUnknownWallCount", + "8033d270": "gObjectCounter", + "8033d274": "gNumCalls", + "8033d280": "gDebugInfo", + "8033d380": "gDebugInfoOverwrite", + "8033d480": "gTimeStopState", + "8033d488": "gObjectPool", + "80360e88": "gMacroObjectDefaultParent", + "803610e8": "gObjectLists", + "803610f0": "gFreeObjectList", + "80361158": "gMarioObject", + "8036115c": "gLuigiObject", + "80361160": "gCurrentObject", + "80361164": "gCurBhvCommand", + "80361168": "gPrevFrameObjectCount", + "8036116c": "gSurfaceNodesAllocated", + "80361170": "gSurfacesAllocated", + "80361174": "gNumStaticSurfaceNodes", + "80361178": "gNumStaticSurfaces", + "8036117c": "gObjectMemoryPool", + "80361180": "gCheckingSurfaceCollisionsForCamera", + "80361182": "gFindFloorIncludeSurfaceIntangible", + "80361184": "gEnvironmentRegions", + "80361188": "gEnvironmentLevels", + "803611d8": "gDoorAdjacentRooms", + "80361250": "gMarioCurrentRoom", + "80361252": "D_8035FEE2", + "80361254": "D_8035FEE4", + "80361256": "gTHIWaterDrained", + "80361258": "gTTCSpeedSetting", + "8036125a": "gMarioShotFromCannon", + "8036125c": "gCCMEnteredSlide", + "8036125e": "gNumRoomedObjectsInMarioRoom", + "80361260": "gNumRoomedObjectsNotInMarioRoom", + "80361262": "gWDWWaterLevelChanging", + "80361264": "gMarioOnMerryGoRound", + "80361280": "D_8035FF10", + "80361290": "gDebugPrintState1", + "803612a0": "gDebugPrintState2", + "803612b0": "sMarioOnFlyingCarpet", + "803612b2": "sSurfaceTypeBelowShadow", + "803612b4": "gShadowAboveWaterOrLava", + "803612b5": "gMarioOnIceOrCarpet", + "803612c0": "sSkyBoxInfo", + "803612e0": "gMovetexLastTextureId", + "803612f0": "gFlyingCarpetState", + "80361300": "gPaintingMarioFloorType", + "80361304": "gPaintingMarioXPos", + "80361308": "gPaintingMarioYPos", + "8036130c": "gPaintingMarioZPos", + "80361310": "gPaintingMesh", + "80361314": "gPaintingTriNorms", + "80361318": "gRipplingPainting", + "8036131c": "gDddPaintingStatus", + "80361320": "sTextLabels", + "803613f0": "gDialogColorFadeTimer", + "803613f2": "gLastDialogLineNum", + "803613f4": "gDialogVariable", + "803613f8": "gDialogTextAlpha", + "803613fa": "gCutsceneMsgXOffset", + "803613fc": "gCutsceneMsgYOffset", + "803613fe": "gRedCoinsCollected", + "80361400": "gEnvFxBuffer", + "80361408": "gSnowCylinderLastPos", + "80361414": "gSnowParticleCount", + "80361416": "gSnowParticleMaxCount", + "80361420": "gEnvFxBubbleConfig", + "80361460": "sNumActiveFirePiranhaPlants", + "80361464": "sNumKilledFirePiranhaPlants", + "80361468": "sObjSavedPosX", + "8036146c": "sObjSavedPosY", + "80361470": "sObjSavedPosZ", + "80361474": "sMontyMoleHoleList", + "80361478": "sMontyMoleKillStreak", + "8036147c": "sMontyMoleLastKilledPosX", + "80361480": "sMontyMoleLastKilledPosY", + "80361484": "sMontyMoleLastKilledPosZ", + "80361488": "sMasterTreadmill", + "80361490": "gCurrAiBuffer", + "80361498": "sSoundRequests", + "80361c98": "D_80360928", + "80361f98": "sUsedChannelsForSoundBank", + "80361fa8": "sCurrentSound", + "80361fb8": "gSoundBanks", + "80364b78": "D_80363808", + "80364b82": "D_80363812", + "80364b88": "sBackgroundMusicQueue", + "80364ba0": "D_80363830", + "80364c20": "D_803638B0", + "80365e70": "piMgrThread", + "80366020": "piMgrStack", + "80367020": "__osPiMesgQueue", + "80367038": "piMgrMesgBuff", + "80367040": "D_80365CD0", + "80367050": "_osContCmdBuf", + "8036708c": "_osContPifCtrl", + "80367090": "_osLastSentSiCmd", + "80367091": "_osContNumControllers", + "80367098": "D_80365D28", + "803670b8": "_osContMesgQueue", + "803670d0": "_osContMesgBuff", + "803670f0": "D_80365D80", + "80367110": "_osCurrentTime", + "80367118": "D_80365DA8", + "8036711c": "__osViIntrCount", + "80367120": "D_80365DB0", + "80367130": "osPiMesgBuff", + "80367138": "gOsPiMessageQueue", + "80367150": "osSiMesgBuff", + "80367158": "gOsSiMessageQueue", + "80367170": "D_80365E00", + "803671ac": "D_80365E3C", + "803671b0": "D_80365E40", + "803672b0": "gInterruptedThread", + "80367460": ".", + "80367460": "_mainSegmentNoloadEnd", + "0000cee0": "_mainSegmentNoloadSizeLo", + "00000002": "_mainSegmentNoloadSizeHi", + "00000001": "ASSERT", + "80378800": "_engineSegmentStart", + "007cc6c0": "_engineSegmentRomStart", + "80378800": "vec3f_copy", + "80378840": "vec3f_set", + "8037888c": "vec3f_add", + "803788e4": "vec3f_sum", + "8037893c": "vec3s_copy", + "8037897c": "vec3s_set", + "803789c8": "vec3s_add", + "80378a20": "vec3s_sum", + "80378a78": "vec3s_sub", + "80378ad0": "vec3s_to_vec3f", + "80378b34": "vec3f_to_vec3s", + "80378c50": "find_vector_perpendicular_to_plane", + "80378d38": "vec3f_cross", + "80378dc0": "vec3f_normalize", + "80378e68": "mtxf_copy", + "80378eb4": "mtxf_identity", + "80378f24": "mtxf_translate", + "80378f84": "mtxf_lookat", + "80379440": "mtxf_rotate_zxy_and_translate", + "803795f0": "mtxf_rotate_xyz_and_translate", + "80379798": "mtxf_billboard", + "80379918": "mtxf_align_terrain_normal", + "80379aa4": "mtxf_align_terrain_triangle", + "80379f60": "mtxf_mul", + "8037a29c": "mtxf_scale_vec3f", + "8037a348": "mtxf_mul_vec3s", + "8037a434": "mtxf_to_mtx", + "8037a4b8": "mtxf_rotate_xy", + "8037a550": "get_pos_from_transform_mtx", + "8037a69c": "vec3f_get_dist_and_angle", + "8037a788": "vec3f_set_dist_and_angle", + "8037a860": "approach_s32", + "8037a8b4": "approach_f32", + "8037a9a8": "atan2s", + "8037ab88": "atan2f", + "8037abec": "spline_get_weights", + "8037afb8": "anim_spline_init", + "8037afe8": "anim_spline_poll", + "8037b220": "init_scene_graph_node_links", + "8037b24c": "init_graph_node_root", + "8037b30c": "init_graph_node_ortho_projection", + "8037b380": "init_graph_node_perspective", + "8037b448": "init_graph_node_start", + "8037b4ac": "init_graph_node_master_list", + "8037b530": "init_graph_node_render_range", + "8037b5b4": "init_graph_node_switch_case", + "8037b670": "init_graph_node_camera", + "8037b744": "init_graph_node_translation_rotation", + "8037b7f8": "init_graph_node_translation", + "8037b89c": "init_graph_node_rotation", + "8037b940": "init_graph_node_scale", + "8037b9e0": "init_graph_node_object", + "8037bad4": "init_graph_node_culling_radius", + "8037bb48": "init_graph_node_animated_part", + "8037bbec": "init_graph_node_billboard", + "8037bc90": "init_graph_node_display_list", + "8037bd24": "init_graph_node_shadow", + "8037bdb4": "init_graph_node_object_parent", + "8037be28": "init_graph_node_generated", + "8037becc": "init_graph_node_background", + "8037bf84": "init_graph_node_held_object", + "8037c044": "geo_add_child", + "8037c0bc": "geo_remove_child", + "8037c138": "geo_make_first_child", + "8037c1e4": "geo_call_global_function_nodes_helper", + "8037c360": "geo_call_global_function_nodes", + "8037c3d0": "geo_reset_object_node", + "8037c448": "geo_obj_init", + "8037c51c": "geo_obj_init_spawninfo", + "8037c658": "geo_obj_init_animation", + "8037c708": "geo_obj_init_animation_accel", + "8037c7d8": "retrieve_animation_index", + "8037c844": "geo_update_animation_frame", + "8037c9e8": "geo_retreive_animation_translation", + "8037cb10": "geo_find_root", + "8037cb60": "read_vec3s_to_vec3f", + "8037cbc0": "read_vec3s", + "8037cbfc": "read_vec3s_angle", + "8037cc74": "register_scene_graph_node", + "8037cd60": "geo_layout_cmd_branch_and_link", + "8037ce24": "geo_layout_cmd_end", + "8037cee8": "geo_layout_cmd_branch", + "8037cf70": "geo_layout_cmd_return", + "8037cfc0": "geo_layout_cmd_open_node", + "8037d018": "geo_layout_cmd_close_node", + "8037d050": "geo_layout_cmd_assign_as_view", + "8037d0d0": "geo_layout_cmd_update_node_flags", + "8037d1d0": "geo_layout_cmd_node_root", + "8037d328": "geo_layout_cmd_node_ortho_projection", + "8037d3a4": "geo_layout_cmd_node_perspective", + "8037d48c": "geo_layout_cmd_node_start", + "8037d4dc": "geo_layout_cmd_nop3", + "8037d500": "geo_layout_cmd_node_master_list", + "8037d55c": "geo_layout_cmd_node_level_of_detail", + "8037d5d4": "geo_layout_cmd_node_switch_case", + "8037d640": "geo_layout_cmd_node_camera", + "8037d6f0": "geo_layout_cmd_node_translation_rotation", + "8037d8d4": "geo_layout_cmd_node_translation", + "8037d998": "geo_layout_cmd_node_rotation", + "8037da5c": "geo_layout_cmd_node_scale", + "8037db50": "geo_layout_cmd_nop2", + "8037db74": "geo_layout_cmd_node_animated_part", + "8037dc10": "geo_layout_cmd_node_billboard", + "8037dcd4": "geo_layout_cmd_node_display_list", + "8037dd4c": "geo_layout_cmd_node_shadow", + "8037dddc": "geo_layout_cmd_node_object_parent", + "8037de34": "geo_layout_cmd_node_generated", + "8037de94": "geo_layout_cmd_node_background", + "8037def8": "geo_layout_cmd_nop", + "8037df1c": "geo_layout_cmd_copy_view", + "8037dfd4": "geo_layout_cmd_node_held_obj", + "8037e058": "geo_layout_cmd_node_culling_radius", + "8037e0b4": "process_geo_layout", + "803805c8": "level_script_execute", + "80380de8": "f32_find_wall_collision", + "80380e8c": "find_wall_collisions", + "80381264": "find_ceil", + "80381470": "unused_obj_find_floor_height", + "803814b8": "find_floor_height_and_data", + "80381794": "find_floor_height", + "803817e0": "unused_find_dynamic_floor", + "80381900": "find_floor", + "80381ba0": "find_water_level", + "80381d3c": "find_poison_gas_level", + "80381f08": "debug_surface_list_info", + "80382294": "unused_resolve_floor_or_ceil_collisions", + "80383340": "alloc_surface_pools", + "803833b8": "load_area_terrain", + "803835a4": "clear_dynamic_surfaces", + "80383614": "transform_object_vertices", + "80383828": "load_object_surfaces", + "803839cc": "load_object_collision_model", + "80383bb0": "random_u16", + "80383cb4": "random_float", + "80383d1c": "random_sign", + "80383d68": "obj_update_gfx_pos_and_angle", + "80385bf0": "stub_behavior_script_2", + "80385c00": "cur_obj_update", + "80385f90": "identityMtx", + "80385fb0": "zeroMtx", + "80385fd0": "gVec3fZero", + "80385fdc": "gVec3sZero", + "80385fe4": "gVec3fOne", + "80385ff0": "gVec3sOne", + "80386000": "gSineTable", + "80387000": "gCosineTable", + "8038b000": "gArctanTable", + "8038b810": "GeoLayoutJumpTable", + "8038b894": "unused_8038B894", + "8038bc90": "_engineSegmentEnd", + "007dfb50": "_engineSegmentRomEnd", + "8038bc90": "_engineSegmentNoloadStart", + "8038bc90": "gSplineKeyframe", + "8038bc94": "gSplineKeyframeFraction", + "8038bc98": "gSplineState", + "8038bca0": "gGraphNodePool", + "8038bca4": "gCurRootGraphNode", + "8038bca8": "D_8038BCA8", + "8038bcac": "gGeoViews", + "8038bcb0": "gGeoNumViews", + "8038bcb8": "gGeoLayoutStack", + "8038bcf8": "gCurGraphNodeList", + "8038bd78": "gCurGraphNodeIndex", + "8038bd7a": "gGeoLayoutStackIndex", + "8038bd7c": "D_8038BD7C", + "8038bd7e": "gGeoLayoutReturnIndex", + "8038bd80": "gGeoLayoutCommand", + "8038bd88": "gObjParentGraphNode", + "8038be30": "sFloorGeo", + "8038be90": "unused8038BE90", + "8038be98": "gStaticSurfacePartition", + "8038d698": "gDynamicSurfacePartition", + "8038ee98": "sSurfaceNodePool", + "8038ee9c": "sSurfacePool", + "8038eea0": "sSurfacePoolSize", + "8038eea8": "unused8038EEA8", + "8038eef0": "_engineSegmentNoloadEnd", + "00000001": "ASSERT", + "8038f800": ".", + "8038f800": "_framebuffersSegmentNoloadStart", + "8038f800": "0x70800", + "8038f800": "gFrameBuffer0", + "803b5000": "gFrameBuffer1", + "803da800": "gFrameBuffer2", + "80400000": "_framebuffersSegmentNoloadEnd", + "80400000": "__expansionRamStart", + "00000001": "ASSERT", + "10000000": "_entrySegmentStart", + "007cc6c0": "_entrySegmentRomStart", + "10000000": "level_script_entry", + "10000030": "_entrySegmentEnd", + "007cc6f0": "_entrySegmentRomEnd", + "02000000": "_segment2_mio0SegmentStart", + "007cc6c0": "_segment2_mio0SegmentRomStart", + "0200bd10": ".", + "0200bd10": "_segment2_mio0SegmentEnd", + "007d83d0": "_segment2_mio0SegmentRomEnd", + "04000000": "_group0_mio0SegmentStart", + "007cc6c0": "_group0_mio0SegmentRomStart", + "04013260": ".", + "04013260": "_group0_mio0SegmentEnd", + "007df920": "_group0_mio0SegmentRomEnd", + "17000000": "_group0_geoSegmentStart", + "007cc6c0": "_group0_geoSegmentRomStart", + "17000000": "bubble_geo", + "1700001c": "purple_marble_geo", + "17000038": "smoke_geo", + "17000084": "burn_smoke_geo", + "1700009c": "small_water_splash_geo", + "170000e0": "mario_TODO_geo_0000E0", + "17000124": "idle_water_wave_geo", + "17000168": "wave_trail_geo", + "170001bc": "sparkles_geo", + "17000230": "water_splash_geo", + "17000284": "sparkles_animation_geo", + "170002e0": "mario_geo_face_and_wings", + "1700041c": "mario_geo_left_hand", + "17000494": "mario_geo_right_hand", + "1700053c": "mario_geo_body", + "170006f8": "mario_geo_medium_poly_left_hand", + "17000770": "mario_geo_medium_poly_right_hand", + "17000818": "mario_geo_medium_poly_body", + "170009d4": "mario_geo_low_poly_face_and_wings", + "17000b10": "mario_geo_low_poly_left_hand", + "17000b88": "mario_geo_low_poly_right_hand", + "17000c30": "mario_geo_low_poly_body", + "17000dec": "mario_vanish_geo_face_and_wings", + "17000f28": "mario_vanish_geo_left_hand", + "17000fa0": "mario_vanish_geo_right_hand", + "17001048": "mario_vanish_geo_body", + "17001204": "mario_vanish_geo_medium_poly_left_hand", + "1700127c": "mario_vanish_geo_medium_poly_right_hand", + "17001324": "mario_vanish_geo_medium_poly_body", + "170014e0": "mario_vanish_geo_low_poly_face_and_wings", + "1700161c": "mario_vanish_geo_low_poly_left_hand", + "17001694": "mario_vanish_geo_low_poly_right_hand", + "1700173c": "mario_vanish_geo_low_poly_body", + "170018f8": "mario_metal_geo_face_and_wings", + "170019a4": "mario_metal_geo_left_hand", + "17001a1c": "mario_metal_geo_right_hand", + "17001ac4": "mario_metal_geo_body", + "17001c80": "mario_metal_geo_medium_poly_left_hand", + "17001cf8": "mario_metal_geo_medium_poly_right_hand", + "17001da0": "mario_metal_geo_medium_poly_body", + "17001f5c": "mario_metal_geo_low_poly_face_and_wings", + "17002008": "mario_metal_geo_low_poly_left_hand", + "17002080": "mario_metal_geo_low_poly_right_hand", + "17002128": "mario_metal_geo_low_poly_body", + "170022e4": "mario_metal_vanish_geo_face_and_wings", + "17002390": "mario_metal_vanish_geo_left_hand", + "17002408": "mario_metal_vanish_geo_right_hand", + "170024b0": "mario_metal_vanish_geo_body", + "1700266c": "mario_metal_vanish_geo_medium_poly_left_hand", + "170026e4": "mario_metal_vanish_geo_medium_poly_right_hand", + "1700278c": "mario_metal_vanish_geo_medium_poly_body", + "17002958": "mario_metal_vanish_geo_low_poly_face_and_wings", + "17002a04": "mario_metal_vanish_geo_low_poly_left_hand", + "17002a7c": "mario_metal_vanish_geo_low_poly_right_hand", + "17002b24": "mario_metal_vanish_geo_low_poly_body", + "17002ce0": "mario_geo_load_body", + "17002d14": "mario_geo_load_medium_poly_body", + "17002d48": "mario_geo_load_low_poly_body", + "17002d7c": "mario_geo_render_body", + "17002dd4": "mario_geo", + "17002e30": "_group0_geoSegmentEnd", + "007cf4f0": "_group0_geoSegmentRomEnd", + "05000000": "_group1_mio0SegmentStart", + "007cc6c0": "_group1_mio0SegmentRomStart", + "05008070": ".", + "05008070": "_group1_mio0SegmentEnd", + "007d4730": "_group1_mio0SegmentRomEnd", + "0c000000": "_group1_geoSegmentStart", + "007cc6c0": "_group1_geoSegmentRomStart", + "0c000000": "yellow_sphere_geo", + "0c000018": "hoot_geo", + "0c0001e4": "yoshi_egg_geo", + "0c000248": "thwomp_geo", + "0c000264": "bullet_bill_geo", + "0c00028c": "heave_ho_geo", + "0c000410": "_group1_geoSegmentEnd", + "007ccad0": "_group1_geoSegmentRomEnd", + "05000000": "_group2_mio0SegmentStart", + "007cc6c0": "_group2_mio0SegmentRomStart", + "05001e10": ".", + "05001e10": "_group2_mio0SegmentEnd", + "007ce4d0": "_group2_mio0SegmentRomEnd", + "0c000000": "_group2_geoSegmentStart", + "007cc6c0": "_group2_geoSegmentRomStart", + "0c000000": "bully_geo", + "0c000120": "bully_boss_geo", + "0c000240": "blargg_geo", + "0c0002b0": "_group2_geoSegmentEnd", + "007cc970": "_group2_geoSegmentRomEnd", + "05000000": "_group3_mio0SegmentStart", + "007cc6c0": "_group3_mio0SegmentRomStart", + "050068b0": ".", + "050068b0": "_group3_mio0SegmentEnd", + "007d2f70": "_group3_mio0SegmentRomEnd", + "0c000000": "_group3_geoSegmentStart", + "007cc6c0": "_group3_geoSegmentRomStart", + "0c000000": "king_bobomb_geo", + "0c000308": "water_bomb_geo", + "0c000328": "water_bomb_shadow_geo", + "0c000340": "_group3_geoSegmentEnd", + "007cca00": "_group3_geoSegmentRomEnd", + "05000000": "_group4_mio0SegmentStart", + "007cc6c0": "_group4_mio0SegmentRomStart", + "0500a300": ".", + "0500a300": "_group4_mio0SegmentEnd", + "007d69c0": "_group4_mio0SegmentRomEnd", + "0c000000": "_group4_geoSegmentStart", + "007cc6c0": "_group4_geoSegmentRomStart", + "0c000000": "clam_shell_geo", + "0c000068": "sushi_geo", + "0c00010c": "unagi_geo", + "0c000280": "_group4_geoSegmentEnd", + "007cc940": "_group4_geoSegmentRomEnd", + "05000000": "_group5_mio0SegmentStart", + "007cc6c0": "_group5_mio0SegmentRomStart", + "0500bce0": ".", + "0500bce0": "_group5_mio0SegmentEnd", + "007d83a0": "_group5_mio0SegmentRomEnd", + "0c000000": "_group5_geoSegmentStart", + "007cc6c0": "_group5_geoSegmentRomStart", + "0c000000": "klepto_geo", + "0c0002ac": "eyerok_geo_0002AC", + "0c0005a8": "eyerok_left_hand_geo", + "0c0005e4": "eyerok_right_hand_geo", + "0c000610": "pokey_head_geo", + "0c000644": "pokey_body_part_geo", + "0c000660": "_group5_geoSegmentEnd", + "007ccd20": "_group5_geoSegmentRomEnd", + "05000000": "_group6_mio0SegmentStart", + "007cc6c0": "_group6_mio0SegmentRomStart", + "0500e110": ".", + "0500e110": "_group6_mio0SegmentEnd", + "007da7d0": "_group6_mio0SegmentRomEnd", + "0c000000": "_group6_geoSegmentStart", + "007cc6c0": "_group6_geoSegmentRomStart", + "0c000000": "monty_mole_geo", + "0c000110": "ukiki_geo", + "0c00036c": "fwoosh_geo", + "0c000390": "_group6_geoSegmentEnd", + "007cca50": "_group6_geoSegmentRomEnd", + "05000000": "_group7_mio0SegmentStart", + "007cc6c0": "_group7_mio0SegmentRomStart", + "05005070": ".", + "05005070": "_group7_mio0SegmentEnd", + "007d1730": "_group7_mio0SegmentRomEnd", + "0c000000": "_group7_geoSegmentStart", + "007cc6c0": "_group7_geoSegmentRomStart", + "0c000000": "spindrift_geo", + "0c000104": "penguin_geo", + "0c00021c": "mr_blizzard_hidden_geo", + "0c000348": "mr_blizzard_geo", + "0c000370": "_group7_geoSegmentEnd", + "007cca30": "_group7_geoSegmentRomEnd", + "05000000": "_group8_mio0SegmentStart", + "007cc6c0": "_group8_mio0SegmentRomStart", + "05001180": ".", + "05001180": "_group8_mio0SegmentEnd", + "007cd840": "_group8_mio0SegmentRomEnd", + "0c000000": "_group8_geoSegmentStart", + "007cc6c0": "_group8_geoSegmentRomStart", + "0c000000": "springboard_top_geo", + "0c000018": "springboard_spring_geo", + "0c000030": "springboard_bottom_geo", + "0c000048": "cap_switch_geo", + "0c000090": "_group8_geoSegmentEnd", + "007cc750": "_group8_geoSegmentRomEnd", + "05000000": "_group9_mio0SegmentStart", + "007cc6c0": "_group9_mio0SegmentRomStart", + "05006960": ".", + "05006960": "_group9_mio0SegmentEnd", + "007d3020": "_group9_mio0SegmentRomEnd", + "0c000000": "_group9_geoSegmentStart", + "007cc6c0": "_group9_geoSegmentRomStart", + "0c000000": "bookend_part_geo", + "0c0000c0": "bookend_geo", + "0c0000d8": "haunted_chair_geo", + "0c000188": "small_key_geo", + "0c0001b4": "mad_piano_geo", + "0c000224": "boo_geo", + "0c000274": "haunted_cage_geo", + "0c0002b0": "_group9_geoSegmentEnd", + "007cc970": "_group9_geoSegmentRomEnd", + "05000000": "_group10_mio0SegmentStart", + "007cc6c0": "_group10_mio0SegmentRomStart", + "05012cd0": ".", + "05012cd0": "_group10_mio0SegmentEnd", + "007df390": "_group10_mio0SegmentRomEnd", + "0c000000": "_group10_geoSegmentStart", + "007cc6c0": "_group10_geoSegmentRomStart", + "0c000000": "birds_geo", + "0c000098": "peach_geo_000098", + "0c000254": "peach_geo_000254", + "0c000410": "peach_geo", + "0c000468": "yoshi_geo", + "0c000670": "_group10_geoSegmentEnd", + "007ccd30": "_group10_geoSegmentRomEnd", + "05000000": "_group11_mio0SegmentStart", + "007cc6c0": "_group11_mio0SegmentRomStart", + "050073f0": ".", + "050073f0": "_group11_mio0SegmentEnd", + "007d3ab0": "_group11_mio0SegmentRomEnd", + "0c000000": "_group11_geoSegmentStart", + "007cc6c0": "_group11_geoSegmentRomStart", + "0c000000": "bubba_geo", + "0c000030": "wiggler_head_geo", + "0c0001bc": "enemy_lakitu_geo", + "0c000290": "spiny_ball_geo", + "0c000328": "spiny_geo", + "0c0004a0": "_group11_geoSegmentEnd", + "007ccb60": "_group11_geoSegmentRomEnd", + "06000000": "_group12_mio0SegmentStart", + "007cc6c0": "_group12_mio0SegmentRomStart", + "06030c30": ".", + "06030c30": "_group12_mio0SegmentEnd", + "007fd2f0": "_group12_mio0SegmentRomEnd", + "0d000000": "_group12_geoSegmentStart", + "007cc6c0": "_group12_geoSegmentRomStart", + "0d000000": "bowser_flames_geo", + "0d000090": "invisible_bowser_accessory_geo", + "0d0000b0": "bowser_1_yellow_sphere_geo", + "0d0000d8": "bowser_geo_0000D8", + "0d000424": "bowser_geo_000424", + "0d000770": "bowser_geo_000770", + "0d000ab8": "bowser_shadow_geo", + "0d000ac4": "bowser_geo", + "0d000b40": "bowser2_geo", + "0d000bbc": "bowser_bomb_geo", + "0d000bfc": "bowser_impact_smoke_geo", + "0d000c50": "_group12_geoSegmentEnd", + "007cd310": "_group12_geoSegmentRomEnd", + "06000000": "_group13_mio0SegmentStart", + "007cc6c0": "_group13_mio0SegmentRomStart", + "0600a0f0": ".", + "0600a0f0": "_group13_mio0SegmentEnd", + "007d67b0": "_group13_mio0SegmentRomEnd", + "0d000000": "_group13_geoSegmentStart", + "007cc6c0": "_group13_geoSegmentRomStart", + "0d000000": "skeeter_geo", + "0d000284": "seaweed_geo", + "0d0002f4": "water_mine_geo", + "0d000324": "cyan_fish_geo", + "0d00038c": "bub_geo", + "0d000414": "water_ring_geo", + "0d000450": "treasure_chest_base_geo", + "0d000468": "treasure_chest_lid_geo", + "0d000480": "_group13_geoSegmentEnd", + "007ccb40": "_group13_geoSegmentRomEnd", + "06000000": "_group14_mio0SegmentStart", + "007cc6c0": "_group14_mio0SegmentRomStart", + "06013a60": ".", + "06013a60": "_group14_mio0SegmentEnd", + "007e0120": "_group14_mio0SegmentRomEnd", + "0d000000": "_group14_geoSegmentStart", + "007cc6c0": "_group14_geoSegmentRomStart", + "0d000000": "koopa_flag_geo", + "0d0000b8": "wooden_post_geo", + "0d0000d0": "koopa_without_shell_geo", + "0d000214": "koopa_with_shell_geo", + "0d000358": "piranha_plant_geo", + "0d000480": "whomp_geo", + "0d0005d0": "metallic_ball_geo", + "0d0005ec": "chain_chomp_geo", + "0d000680": "_group14_geoSegmentEnd", + "007ccd40": "_group14_geoSegmentRomEnd", + "06000000": "_group15_mio0SegmentStart", + "007cc6c0": "_group15_mio0SegmentRomStart", + "0600c8e0": ".", + "0600c8e0": "_group15_mio0SegmentEnd", + "007d8fa0": "_group15_mio0SegmentRomEnd", + "0d000000": "_group15_geoSegmentStart", + "007cc6c0": "_group15_geoSegmentRomStart", + "0d000000": "lakitu_geo", + "0d000114": "toad_geo_000114", + "0d00027c": "toad_geo_00027C", + "0d0003e4": "toad_geo", + "0d000448": "mips_geo", + "0d0005b0": "boo_castle_geo", + "0d000600": "_group15_geoSegmentEnd", + "007cccc0": "_group15_geoSegmentRomEnd", + "06000000": "_group16_mio0SegmentStart", + "007cc6c0": "_group16_mio0SegmentRomStart", + "06002ba0": ".", + "06002ba0": "_group16_mio0SegmentEnd", + "007cf260": "_group16_mio0SegmentRomEnd", + "0d000000": "_group16_geoSegmentStart", + "007cc6c0": "_group16_geoSegmentRomStart", + "0d000000": "moneybag_geo_000000", + "0d000078": "moneybag_geo_000078", + "0d0000f0": "moneybag_geo", + "0d000150": "_group16_geoSegmentEnd", + "007cc810": "_group16_geoSegmentRomEnd", + "06000000": "_group17_mio0SegmentStart", + "007cc6c0": "_group17_mio0SegmentRomStart", + "06009c50": ".", + "06009c50": "_group17_mio0SegmentEnd", + "007d6310": "_group17_mio0SegmentRomEnd", + "0d000000": "_group17_geoSegmentStart", + "007cc6c0": "_group17_geoSegmentRomStart", + "0d000000": "mr_i_geo", + "0d00001c": "mr_i_iris_geo", + "0d0000dc": "swoop_geo", + "0d0001a0": "snufit_geo", + "0d000230": "dorrie_geo", + "0d000394": "scuttlebug_geo", + "0d0006d0": "_group17_geoSegmentEnd", + "007ccd90": "_group17_geoSegmentRomEnd", + "08000000": "_common0_mio0SegmentStart", + "007cc6c0": "_common0_mio0SegmentRomStart", + "0800e6d0": ".", + "0800e6d0": "_common0_mio0SegmentEnd", + "007dad90": "_common0_mio0SegmentRomEnd", + "0f000000": "_common0_geoSegmentStart", + "007cc6c0": "_common0_geoSegmentRomStart", + "0f000000": "blue_coin_switch_geo", + "0f000020": "test_platform_geo", + "0f000028": "amp_geo", + "0f0001a8": "cannon_base_geo", + "0f0001c0": "cannon_barrel_geo", + "0f0001d8": "chuckya_geo", + "0f0004cc": "purple_switch_geo", + "0f0004e4": "checkerboard_platform_geo", + "0f0004fc": "heart_geo", + "0f000518": "flyguy_geo", + "0f0005d0": "breakable_box_geo", + "0f000610": "breakable_box_small_geo", + "0f000640": "bowling_ball_geo", + "0f00066c": "bowling_ball_track_geo", + "0f000694": "exclamation_box_geo", + "0f0006e4": "goomba_geo", + "0f0007b8": "black_bobomb_geo", + "0f0008f4": "bobomb_buddy_geo", + "0f000a30": "metal_box_geo", + "0f000a58": "exclamation_box_outline_geo", + "0f000ab0": "koopa_shell_geo", + "0f000adc": "koopa_shell2_geo", + "0f000b08": "koopa_shell3_geo", + "0f000b40": "_common0_geoSegmentEnd", + "007cd200": "_common0_geoSegmentRomEnd", + "03000000": "_common1_mio0SegmentStart", + "007cc6c0": "_common1_mio0SegmentRomStart", + "03017990": ".", + "03017990": "_common1_mio0SegmentEnd", + "007e4050": "_common1_mio0SegmentRomEnd", + "16000000": "_common1_geoSegmentStart", + "007cc6c0": "_common1_geoSegmentRomStart", + "16000000": "mist_geo", + "16000020": "white_puff_geo", + "16000040": "explosion_geo", + "160000a8": "butterfly_geo", + "1600013c": "yellow_coin_geo", + "160001a0": "yellow_coin_no_shadow_geo", + "16000200": "blue_coin_geo", + "16000264": "blue_coin_no_shadow_geo", + "160002c4": "red_coin_geo", + "16000328": "red_coin_no_shadow_geo", + "16000388": "warp_pipe_geo", + "160003a8": "castle_door_geo", + "1600043c": "cabin_door_geo", + "160004d0": "wooden_door_geo", + "16000564": "wooden_door2_geo", + "160005f8": "metal_door_geo", + "1600068c": "hazy_maze_door_geo", + "16000720": "haunted_door_geo", + "160007b4": "castle_door_0_star_geo", + "16000868": "castle_door_1_star_geo", + "1600091c": "castle_door_3_stars_geo", + "160009d0": "key_door_geo", + "16000a84": "bowser_key_geo", + "16000ab0": "bowser_key_cutscene_geo", + "16000b10": "red_flame_shadow_geo", + "16000b2c": "red_flame_geo", + "16000b8c": "blue_flame_geo", + "16000bec": "fish_shadow_geo", + "16000c44": "fish_geo", + "16000c8c": "leaves_geo", + "16000ca4": "marios_cap_geo", + "16000cf0": "marios_metal_cap_geo", + "16000d3c": "marios_wing_cap_geo", + "16000da8": "marios_winged_metal_cap_geo", + "16000e14": "number_geo", + "16000e84": "mushroom_1up_geo", + "16000ea0": "star_geo", + "16000ed4": "dirt_animation_geo", + "16000f24": "cartoon_star_geo", + "16000f6c": "transparent_star_geo", + "16000f98": "white_particle_geo", + "16000fb4": "wooden_signpost_geo", + "16000fe8": "bubbly_tree_geo", + "16001000": "spiky_tree_geo", + "16001018": "snow_tree_geo", + "16001030": "spiky_tree1_geo", + "16001048": "palm_tree_geo", + "16001060": "_common1_geoSegmentEnd", + "007cd720": "_common1_geoSegmentRomEnd", + "13000000": "_behaviorSegmentStart", + "007cc6c0": "_behaviorSegmentRomStart", + "13000000": "bhvStarDoor", + "13000054": "bhvMrI", + "1300008c": "bhvMrIBody", + "130000ac": "bhvMrIParticle", + "130000f8": "bhvPurpleParticle", + "13000118": "bhvGiantPole", + "13000144": "bhvPoleGrabbing", + "13000174": "bhvThiHugeIslandTop", + "13000194": "bhvThiTinyIslandTop", + "130001ac": "bhvCapSwitchBase", + "130001cc": "bhvCapSwitch", + "130001f4": "bhvKingBobomb", + "13000254": "bhvBobombAnchorMario", + "13000278": "bhvBetaChestBottom", + "1300029c": "bhvBetaChestLid", + "130002b8": "bhvBubbleParticleSpawner", + "130002e4": "bhvBubbleMaybe", + "13000338": "bhvSmallWaterWave", + "13000398": "bhvSmallWaterWave398", + "130003bc": "bhvWaterAirBubble", + "13000400": "bhvSmallParticle", + "13000428": "bhvPlungeBubble", + "13000444": "bhvSmallParticleSnow", + "1300046c": "bhvSmallParticleBubbles", + "13000494": "bhvFishGroup", + "130004a8": "bhvCannon", + "130004e4": "bhvCannonBarrel", + "13000500": "bhvCannonBaseUnused", + "13000528": "bhvChuckya", + "13000584": "bhvChuckyaAnchorMario", + "130005a8": "bhvUnused05A8", + "130005b4": "bhvRotatingPlatform", + "130005d8": "bhvTower", + "13000600": "bhvBulletBillCannon", + "13000624": "bhvWfBreakableWallRight", + "13000638": "bhvWfBreakableWallLeft", + "1300066c": "bhvKickableBoard", + "130006a4": "bhvTowerDoor", + "130006d8": "bhvRotatingCounterClockwise", + "130006e0": "bhvWfRotatingWoodenPlatform", + "13000708": "bhvKoopaShellUnderwater", + "13000720": "bhvExitPodiumWarp", + "1300075c": "bhvFadingWarp", + "13000780": "bhvWarp", + "130007a0": "bhvWarpPipe", + "130007dc": "bhvWhitePuffExplosion", + "130007f8": "bhvSpawnedStar", + "1300080c": "bhvSpawnedStarNoLevelExit", + "13000830": "bhvMrIBlueCoin", + "13000888": "bhvCoinInsideBoo", + "130008d0": "bhvCoinFormationSpawn", + "130008ec": "bhvCoinFormation", + "1300090c": "bhvOneCoin", + "1300091c": "bhvYellowCoin", + "13000940": "bhvTemporaryYellowCoin", + "13000964": "bhvThreeCoinsSpawn", + "13000984": "bhvTenCoinsSpawn", + "130009a4": "bhvSingleCoinGetsSpawned", + "130009e0": "bhvCoinSparkles", + "13000a14": "bhvGoldenCoinSparkles", + "13000a34": "bhvWallTinyStarParticle", + "13000a54": "bhvVertStarParticleSpawner", + "13000a78": "bhvPoundTinyStarParticle", + "13000a98": "bhvHorStarParticleSpawner", + "13000abc": "bhvPunchTinyTriangle", + "13000ad8": "bhvTriangleParticleSpawner", + "13000afc": "bhvDoorWarp", + "13000b0c": "bhvDoor", + "13000b58": "bhvGrindel", + "13000b8c": "bhvThwomp2", + "13000bc8": "bhvThwomp", + "13000c04": "bhvTumblingBridgePlatform", + "13000c28": "bhvWfTumblingBridge", + "13000c44": "bhvBbhTumblingBridge", + "13000c64": "bhvLllTumblingBridge", + "13000c84": "bhvFlame", + "13000cc8": "bhvAnotherElavator", + "13000cfc": "bhvRrElevatorPlatform", + "13000d30": "bhvHmcElevatorPlatform", + "13000d6c": "bhvWaterMist", + "13000d98": "bhvBreathParticleSpawner", + "13000db4": "bhvBreakBoxTriangle", + "13000dd8": "bhvWaterMist2", + "13000dfc": "bhvUnused0DFC", + "13000e24": "bhvMistCircParticleSpawner", + "13000e3c": "bhvDirtParticleSpawner", + "13000e58": "bhvSnowParticleSpawner", + "13000e70": "bhvWind", + "13000e88": "bhvEndToad", + "13000eac": "bhvEndPeach", + "13000ed0": "bhvUnusedParticleSpawn", + "13000f08": "bhvUkiki", + "13000f14": "bhvUkikiCageChild", + "13000f2c": "bhvUkikiCageStar", + "13000f48": "bhvUkikiCage", + "13000f9c": "bhvBitfsSinkingPlatforms", + "13000fc8": "bhvBitfsSinkingCagePlatform", + "13001000": "bhvDddMovingPole", + "13001030": "bhvBitfsTiltingInvertedPyramid", + "13001064": "bhvSquishablePlatform", + "13001098": "bhvCutOutObject", + "130010a8": "bhvBetaMovingFlamesSpawn", + "130010b8": "bhvBetaMovingFlames", + "130010d8": "bhvRrRotatingBridgePlatform", + "13001108": "bhvFlamethrower", + "13001124": "bhvFlamethrowerFlame", + "13001168": "bhvBouncingFireball", + "13001184": "bhvBouncingFireballFlame", + "130011d0": "bhvBowserShockWave", + "130011ec": "bhvFireParticleSpawner", + "13001214": "bhvBlackSmokeMario", + "13001254": "bhvBlackSmokeBowser", + "1300127c": "bhvBlackSmokeUpward", + "13001298": "bhvBetaFishSplashSpawner", + "130012b4": "bhvSpindrift", + "130012f4": "bhvTowerPlatformGroup", + "13001318": "bhvWfSlidingTowerPlatform", + "13001340": "bhvWfElevatorTowerPlatform", + "13001368": "bhvWfSolidTowerPlatform", + "13001390": "bhvLeafParticleSpawner", + "130013a8": "bhvTreeSnow", + "130013c4": "bhvTreeLeaf", + "130013dc": "bhvAnotherTiltingPlatform", + "13001408": "bhvSquarishPathMoving", + "1300142c": "bhvPiranhaPlantBubble", + "13001448": "bhvPiranhaPlantWakingBubbles", + "13001468": "bhvFloorSwitchAnimatesObject", + "13001478": "bhvFloorSwitchGrills", + "13001484": "bhvFloorSwitchHardcodedModel", + "130014ac": "bhvFloorSwitchHiddenObjects", + "130014bc": "bhvHiddenObject", + "130014e0": "bhvBreakableBox", + "13001518": "bhvPushableMetalBox", + "13001548": "bhvHeaveHo", + "130015a4": "bhvHeaveHoThrowMario", + "130015c0": "bhvCcmTouchedStarSpawn", + "130015e4": "bhvUnusedPoundablePlatform", + "13001608": "bhvBetaTrampolineTop", + "13001634": "bhvBetaTrampolineSpring", + "13001650": "bhvJumpingBox", + "1300167c": "bhvBooCage", + "130016ac": "bhvStub", + "130016b8": "bhvIgloo", + "130016e4": "bhvBowserKey", + "13001714": "bhvGrandStar", + "13001744": "bhvBetaBooKey", + "13001778": "bhvAlphaBooKey", + "1300179c": "bhvBulletBill", + "130017f4": "bhvWhitePuffSmoke", + "13001820": "bhvUnused1820", + "13001828": "bhvBowserTailAnchor", + "13001850": "bhvBowser", + "130018cc": "bhvBowserBodyAnchor", + "13001904": "bhvBowserFlameSpawn", + "13001920": "bhvTiltingBowserLavaPlatform", + "13001958": "bhvFallingBowserPlatform", + "13001984": "bhvBlueBowserFlame", + "130019c8": "bhvFlameFloatingLanding", + "13001a0c": "bhvBlueFlamesGroup", + "13001a30": "bhvFlameBouncing", + "13001a74": "bhvFlameMovingForwardGrowing", + "13001aa4": "bhvFlameBowser", + "13001ae8": "bhvFlameLargeBurningOut", + "13001b2c": "bhvBlueFish", + "13001b54": "bhvTankFishGroup", + "13001b70": "bhvCheckerboardElevatorGroup", + "13001b88": "bhvCheckerboardPlatformSub", + "13001bb4": "bhvBowserKeyUnlockDoor", + "13001bd4": "bhvBowserKeyCourseExit", + "13001bf4": "bhvInvisibleObjectsUnderBridge", + "13001c04": "bhvWaterLevelPillar", + "13001c34": "bhvDddWarp", + "13001c58": "bhvMoatGrills", + "13001c7c": "bhvClockMinuteHand", + "13001c8c": "bhvClockHourHand", + "13001cb0": "bhvMacroUkiki", + "13001d0c": "bhvStub1D0C", + "13001d14": "bhvLllRotatingHexagonalPlatform", + "13001d40": "bhvLllSinkingRockBlock", + "13001d70": "bhvStub1D70", + "13001d78": "bhvLllMovingOctagonalMeshPlatform", + "13001da4": "bhvSnowBall", + "13001da8": "bhvLllRotatingBlockWithFireBars", + "13001dcc": "bhvLllRotatingHexFlame", + "13001e04": "bhvLllWoodPiece", + "13001e30": "bhvLllFloatingWoodBridge", + "13001e4c": "bhvVolcanoFlames", + "13001e6c": "bhvLllRotatingHexagonalRing", + "13001e94": "bhvLllSinkingRectangularPlatform", + "13001ec4": "bhvLllSinkingSquarePlatforms", + "13001ef8": "bhvLllTiltingInvertedPyramid", + "13001f30": "bhvUnused1F30", + "13001f3c": "bhvKoopaShell", + "13001f68": "bhvKoopaShellFlame", + "13001f90": "bhvToxBox", + "13001fbc": "bhvPiranhaPlant", + "13002018": "bhvLllHexagonalMesh", + "13002038": "bhvLllBowserPuzzlePiece", + "13002068": "bhvLllBowserPuzzle", + "13002088": "bhvTuxiesMother", + "130020d8": "bhvPenguinBaby", + "130020e0": "bhvUnused20E0", + "130020e8": "bhvSmallPenguin", + "1300213c": "bhvFish2", + "1300214c": "bhvFish3", + "1300215c": "bhvLargeFishGroup", + "13002178": "bhvFish", + "13002194": "bhvWdwExpressElevator", + "130021c0": "bhvWdwExpressElevatorPlatform", + "130021e4": "bhvChirpChirp", + "130021f4": "bhvChirpChirpUnused", + "1300220c": "bhvBub", + "13002250": "bhvExclamationBox", + "1300227c": "bhvRotatingExclamationMark", + "1300229c": "bhvSoundSpawner", + "130022b8": "bhvRockSolid", + "130022d8": "bhvBowserSubDoor", + "13002308": "bhvBowsersSub", + "13002338": "bhvSushiShark", + "13002388": "bhvSushiSharkCollisionChild", + "130023a4": "bhvJrbSlidingBox", + "130023d0": "bhvShipPart3", + "130023ec": "bhvInSunkenShip3", + "1300241c": "bhvSunkenShipPart", + "1300243c": "bhvSunkenShipSetRotation", + "1300244c": "bhvSunkenShipPart2", + "1300246c": "bhvInSunkenShip", + "13002480": "bhvInSunkenShip2", + "130024ac": "bhvMistParticleSpawner", + "130024dc": "bhvWhitePuff1", + "13002500": "bhvWhitePuff2", + "13002528": "bhvWhitePuffSmoke2", + "13002558": "bhvPurpleSwitchHiddenBoxes", + "13002568": "bhvBlueCoinSwitch", + "13002588": "bhvHiddenBlueCoin", + "130025c0": "bhvOpenableCageDoor", + "130025e0": "bhvOpenableGrill", + "130025f8": "bhvWaterLevelDiamond", + "13002620": "bhvInitializeChangingWaterLevel", + "13002634": "bhvTweesterSandParticle", + "13002650": "bhvTweester", + "13002684": "bhvMerryGoRoundBooManager", + "1300269c": "bhvAnimatedTexture", + "130026d4": "bhvBooInCastle", + "13002710": "bhvBooWithCage", + "13002768": "bhvBalconyBigBoo", + "1300277c": "bhvMerryGoRoundBigBoo", + "13002790": "bhvGhostHuntBigBoo", + "130027d0": "bhvCourtyardBooTriplet", + "130027e4": "bhvBoo", + "130027f4": "bhvMerryGoRoundBoo", + "13002804": "bhvGhostHuntBoo", + "1300286c": "bhvHiddenStaircaseStep", + "13002898": "bhvBooBossSpawnedBridge", + "130028cc": "bhvBbhTiltingTrapPlatform", + "130028fc": "bhvHauntedBookshelf", + "1300292c": "bhvMeshElevator", + "13002968": "bhvMerryGoRound", + "13002998": "bhvPlaysMusicTrackWhenTouched", + "130029b0": "bhvInsideCannon", + "130029b4": "bhvBetaBowserAnchor", + "130029e4": "bhvStaticCheckeredPlatform", + "13002a10": "bhvUnused2A10", + "13002a20": "bhvUnusedFakeStar", + "13002a48": "bhvStaticObject", + "13002a54": "bhvUnused2A54", + "13002a5c": "bhvCastleFloorTrap", + "13002a7c": "bhvFloorTrapInCastle", + "13002aa4": "bhvTree", + "13002ad0": "bhvSparkle", + "13002af0": "bhvSparkleSpawn", + "13002b08": "bhvSparkleParticleSpawner", + "13002b5c": "bhvScuttlebug", + "13002ba0": "bhvScuttlebugSpawn", + "13002bb8": "bhvWhompKingBoss", + "13002bcc": "bhvSmallWhomp", + "13002c14": "bhvWaterSplash", + "13002c60": "bhvWaterDroplet", + "13002c7c": "bhvWaterDropletSplash", + "13002cb0": "bhvBubbleSplash", + "13002ce0": "bhvIdleWaterWave", + "13002d28": "bhvObjectWaterSplash", + "13002d50": "bhvShallowWaterWave", + "13002d7c": "bhvShallowWaterSplash", + "13002db0": "bhvObjectWaveTrail", + "13002dc0": "bhvWaveTrail", + "13002e04": "bhvTinyStrongWindParticle", + "13002e20": "bhvStrongWindParticle", + "13002e3c": "bhvSLSnowmanWind", + "13002e58": "bhvSLWalkingPenguin", + "13002ea8": "bhvYellowBall", + "13002ec0": "bhvMario", + "13002ef8": "bhvToadMessage", + "13002f40": "bhvUnlockDoorStar", + "13002f60": "bhvInstantActiveWarp", + "13002f64": "bhvAirborneWarp", + "13002f68": "bhvHardAirKnockBackWarp", + "13002f6c": "bhvSpinAirborneCircleWarp", + "13002f70": "bhvDeathWarp", + "13002f74": "bhvSpinAirborneWarp", + "13002f78": "bhvFlyingWarp", + "13002f7c": "bhvPaintingStarCollectWarp", + "13002f80": "bhvPaintingDeathWarp", + "13002f84": "bhvAirborneDeathWarp", + "13002f88": "bhvAirborneStarCollectWarp", + "13002f8c": "bhvLaunchStarCollectWarp", + "13002f90": "bhvLaunchDeathWarp", + "13002f94": "bhvSwimmingWarp", + "13002fa0": "bhvRandomAnimatedTexture", + "13002fc0": "bhvYellowBackgroundInMenu", + "13002fe4": "bhvMenuButton", + "13003008": "bhvMenuButtonManager", + "1300302c": "bhvActSelectorStarType", + "13003048": "bhvActSelector", + "13003068": "bhvMovingYellowCoin", + "130030a4": "bhvMovingBlueCoin", + "130030d4": "bhvBlueCoinSliding", + "13003104": "bhvBlueCoinJumping", + "13003134": "bhvSeaweed", + "13003158": "bhvSeaweedBundle", + "13003174": "bhvBobomb", + "130031ac": "bhvBobombFuseSmoke", + "130031dc": "bhvBobombBuddy", + "13003228": "bhvBobombBuddyOpensCannon", + "13003274": "bhvCannonClosed", + "130032a8": "bhvWhirlpool", + "130032c8": "bhvJetStream", + "130032e0": "bhvMessagePanel", + "13003324": "bhvSignOnWall", + "13003354": "bhvHomingAmp", + "13003388": "bhvCirclingAmp", + "130033bc": "bhvButterfly", + "130033ec": "bhvHoot", + "13003420": "bhvBetaHoldableObject", + "13003454": "bhvCarrySomething1", + "1300345c": "bhvCarrySomething2", + "13003464": "bhvCarrySomething3", + "1300346c": "bhvCarrySomething4", + "13003474": "bhvCarrySomething5", + "1300347c": "bhvCarrySomething6", + "13003484": "bhvObjectBubble", + "130034c4": "bhvObjectWaterWave", + "13003510": "bhvExplosion", + "13003558": "bhvBobombBullyDeathSmoke", + "13003588": "bhvSmoke", + "130035b0": "bhvBobombExplosionBubble", + "13003600": "bhvBobombExplosionBubble3600", + "13003614": "bhvRespawner", + "1300362c": "bhvSmallBully", + "13003660": "bhvBigBully", + "13003694": "bhvBigBullyWithMinions", + "130036c8": "bhvSmallChillBully", + "13003700": "bhvBigChillBully", + "13003738": "bhvJetStreamRingSpawner", + "13003750": "bhvJetStreamWaterRing", + "13003798": "bhvMantaRayWaterRing", + "130037e0": "bhvMantaRayRingManager", + "130037ec": "bhvBowserBomb", + "1300381c": "bhvBowserBombExplosion", + "13003840": "bhvBowserBombSmoke", + "13003868": "bhvCelebrationStar", + "13003888": "bhvCelebrationStarSparkle", + "130038b0": "bhvStarKeyCollectionPuffSpawner", + "130038d0": "bhvLllDrawbridgeSpawner", + "130038e8": "bhvLllDrawbridge", + "13003910": "bhvSmallBomp", + "13003940": "bhvLargeBomp", + "13003970": "bhvWfSlidingPlatform", + "130039a0": "bhvMoneybag", + "130039d4": "bhvMoneybagHidden", + "13003a08": "bhvPitBowlingBall", + "13003a30": "bhvFreeBowlingBall", + "13003a58": "bhvBowlingBall", + "13003a80": "bhvTtmBowlingBallSpawner", + "13003aa4": "bhvBobBowlingBallSpawner", + "13003ac8": "bhvThiBowlingBallSpawner", + "13003ae0": "bhvRrCruiserWing", + "13003b00": "bhvSpindel", + "13003b30": "bhvSslMovingPyramidWall", + "13003b60": "bhvPyramidElevator", + "13003b98": "bhvPyramidElevatorTrajectoryMarkerBall", + "13003bb4": "bhvPyramidTop", + "13003bec": "bhvPyramidTopFragment", + "13003c0c": "bhvPyramidPillarTouchDetector", + "13003c30": "bhvWaterfallSoundLoop", + "13003c44": "bhvVolcanoSoundLoop", + "13003c58": "bhvCastleFlagWaving", + "13003c7c": "bhvBirdsSoundLoop", + "13003c90": "bhvAmbientSounds", + "13003ca4": "bhvSandSoundLoop", + "13003cb8": "bhvHiddenAt120Stars", + "13003ce4": "bhvSnowmansBottom", + "13003d0c": "bhvSnowmansHead", + "13003d34": "bhvSnowmansBodyCheckpoint", + "13003d4c": "bhvBigSnowmanWhole", + "13003d74": "bhvBigBoulder", + "13003da0": "bhvBigBoulderGenerator", + "13003db8": "bhvWingCap", + "13003dd8": "bhvMetalCap", + "13003df8": "bhvNormalCap", + "13003e1c": "bhvVanishCap", + "13003e3c": "bhvStar", + "13003e64": "bhvStarSpawnCoordinates", + "13003e8c": "bhvHiddenRedCoinStar", + "13003eac": "bhvRedCoin", + "13003ee4": "bhvBowserCourseRedCoinStar", + "13003efc": "bhvHiddenStar", + "13003f1c": "bhvHiddenStarTrigger", + "13003f40": "bhvTtmRollingLog", + "13003f78": "bhvLllVolcanoFallingTrap", + "13003fa4": "bhvLllRollingLog", + "13003fdc": "bhv1upWalking", + "13004010": "bhv1upRunningAway", + "13004044": "bhv1upSliding", + "1300407c": "bhv1Up", + "130040b4": "bhv1upJumpOnApproach", + "130040ec": "bhvHidden1up", + "13004124": "bhvHidden1upTrigger", + "13004148": "bhvHidden1upInPole", + "13004180": "bhvHidden1upInPoleTrigger", + "130041a4": "bhvHidden1upInPoleSpawner", + "130041bc": "bhvControllablePlatform", + "130041f0": "bhvControllablePlatformSub", + "13004218": "bhvBreakableBoxSmall", + "13004244": "bhvSlidingSnowMound", + "13004270": "bhvSnowMoundSpawn", + "13004284": "bhvWdwSquareFloatingPlatform", + "130042b4": "bhvWdwRectangularFloatingPlatform", + "130042e4": "bhvJrbFloatingPlatform", + "13004314": "bhvArrowLift", + "13004348": "bhvOrangeNumber", + "13004370": "bhvMantaRay", + "130043a0": "bhvFallingPillar", + "130043c4": "bhvFallingPillarHitbox", + "130043e0": "bhvPillarBase", + "13004400": "bhvJrbFloatingBox", + "1300442c": "bhvDecorativePendulum", + "1300444c": "bhvTreasureChestsShip", + "13004470": "bhvTreasureChestsJrb", + "13004494": "bhvTreasureChests", + "130044b8": "bhvTreasureChestBottom", + "130044e0": "bhvTreasureChestTop", + "130044fc": "bhvMips", + "13004538": "bhvYoshi", + "13004580": "bhvKoopa", + "130045d0": "bhvKoopaRaceEndpoint", + "130045f8": "bhvKoopaFlag", + "13004634": "bhvPokey", + "13004668": "bhvPokeyBodyPart", + "13004698": "bhvSwoop", + "130046dc": "bhvFlyGuy", + "1300472c": "bhvGoomba", + "13004770": "bhvGoombaTripletSpawner", + "1300478c": "bhvChainChomp", + "130047e4": "bhvChainChompChainPart", + "1300481c": "bhvWoodenPost", + "13004868": "bhvChainChompGate", + "13004898": "bhvWigglerHead", + "130048e0": "bhvWigglerBody", + "13004918": "bhvEnemyLakitu", + "13004954": "bhvCameraLakitu", + "13004988": "bhvCloud", + "130049ac": "bhvCloudPart", + "130049c8": "bhvSpiny", + "13004a00": "bhvMontyMole", + "13004a58": "bhvMontyMoleHole", + "13004a78": "bhvMontyMoleRock", + "13004ab0": "bhvPlatformOnTrack", + "13004af4": "bhvTrackBall", + "13004b1c": "bhvSeesawPlatform", + "13004b44": "bhvFerrisWheelAxle", + "13004b6c": "bhvFerrisWheelPlatform", + "13004b8c": "bhvWaterBombSpawner", + "13004ba8": "bhvWaterBomb", + "13004bd4": "bhvWaterBombShadow", + "13004bf0": "bhvTTCRotatingSolid", + "13004c24": "bhvTTCPendulum", + "13004c5c": "bhvTTCTreadmill", + "13004c94": "bhvTTCMovingBar", + "13004ccc": "bhvTTCCog", + "13004cf8": "bhvTTCPitBlock", + "13004d28": "bhvTTCElevator", + "13004d64": "bhvTTC2DRotator", + "13004d90": "bhvTTCSpinner", + "13004dbc": "bhvMrBlizzard", + "13004e08": "bhvMrBlizzardSnowball", + "13004e4c": "bhvSlidingPlatform2", + "13004e78": "bhvOctagonalPlatformRotating", + "13004ea0": "bhvAnimatesOnFloorSwitchPress", + "13004ecc": "bhvActivatedBackAndForthPlatform", + "13004ef8": "bhvRecoveryHeart", + "13004f10": "bhvWaterBombCannon", + "13004f28": "bhvCannonBarrelBubbles", + "13004f40": "bhvUnagi", + "13004f78": "bhvUnagiSubobject", + "13004f90": "bhvDorrie", + "13004fd4": "bhvHauntedChair", + "13005024": "bhvMadPiano", + "1300506c": "bhvFlyingBookend", + "130050b4": "bhvBookendSpawn", + "130050d4": "bhvHauntedBookshelfManager", + "130050f4": "bhvBookSwitch", + "13005120": "bhvFirePiranhaPlant", + "13005158": "bhvSmallPiranhaFlame", + "1300518c": "bhvFireSpitter", + "130051ac": "bhvFlyguyFlame", + "130051e0": "bhvSnufit", + "1300521c": "bhvSnufitBalls", + "1300525c": "bhvHorizontalGrindel", + "130052b4": "bhvEyerokBoss", + "130052d0": "bhvEyerokHand", + "13005310": "bhvKlepto", + "13005354": "bhvBird", + "13005380": "bhvRacingPenguin", + "130053c4": "bhvPenguinRaceFinishLine", + "130053dc": "bhvPenguinRaceShortcutCheck", + "130053f4": "bhvCoffinSpawner", + "13005414": "bhvCoffin", + "13005440": "bhvClamShell", + "13005468": "bhvSkeeter", + "130054a0": "bhvSkeeterWave", + "130054b8": "bhvSwingPlatform", + "130054ec": "bhvDonutPlatformSpawner", + "13005504": "bhvDonutPlatform", + "13005528": "bhvDDDPole", + "1300556c": "bhvRedCoinStarMarker", + "13005598": "bhvTripletButterfly", + "130055dc": "bhvBubba", + "13005610": "bhvBeginningLakitu", + "13005638": "bhvBeginningPeach", + "1300565c": "bhvEndBirds1", + "13005680": "bhvEndBirds2", + "130056a4": "bhvIntroScene", + "130056c0": "_behaviorSegmentEnd", + "007d1d80": "_behaviorSegmentRomEnd", + "8016f000": "_goddardSegmentStart", + "007cc6c0": "_goddardSegmentRomStart", + }, + "Refresh 11": { + "80000000": "EXCEPTION_TLB_MISS", + "a4000000": "SP_DMEM", + "a40004c0": "SP_DMEM_UNK0", + "a4000774": "SP_DMEM_UNK1", + "a4001000": "SP_IMEM", + "a4040010": "SP_STATUS_REG", + "a4080000": "SP_PC", + "a4300000": "MI_MODE_REG", + "a4300004": "MI_VERSION_REG", + "a4300008": "MI_INTR_REG", + "a430000c": "MI_INTR_MASK_REG", + "a4400010": "VI_CURRENT_REG", + "a450000c": "AI_STATUS_REG", + "a4600000": "PI_DRAM_ADDR_REG", + "a4600004": "PI_CART_ADDR_REG", + "a460000c": "PI_WR_LEN_REG", + "a4600010": "PI_STATUS_REG", + "a4700000": "RI_MODE_REG", + "a4700010": "RI_REFRESH_REG", + "a4800018": "SI_STATUS_REG", + "b0000008": "D_B0000008", + "b0000010": "D_B0000010", + "b0000014": "D_B0000014", + "c0000000": "D_C0000000", + "c0000008": "D_C0000008", + "c000000c": "D_C000000C", + "802f69cc": "func_sh_802F69CC", + "80302ef0": "osMotorStop", + "80303090": "osMotorStart", + "803033ac": "osMotorInit", + "803016a0": "func_sh_803016A0", + "803016d0": "func_sh_803016D0", + "80301820": "func_sh_80301820", + "00000000": "__romPos", + "04000000": "_bootSegmentStart", + "007cc6c0": "_bootSegmentRomStart", + "04000040": "ipl3_entry", + "04000b70": "ipl3_font", + "04001000": "_bootSegmentEnd", + "007cd6c0": "_bootSegmentRomEnd", + "80000400": ".", + "80000400": "_zbufferSegmentNoloadStart", + "80000400": "0x25800", + "80000400": "gZBuffer", + "80246000": "_mainSegmentStart", + "007cc6c0": "_mainSegmentRomStart", + "80246000": "entry_point", + "80246050": "handle_debug_key_sequences", + "80246170": "unknown_main_func", + "802461cc": "stub_main_1", + "802461dc": "stub_main_2", + "802461ec": "stub_main_3", + "802461fc": "setup_mesg_queues", + "802462e0": "alloc_pool", + "80246338": "create_thread", + "8024639c": "handle_nmi_request", + "802463ec": "receive_new_tasks", + "8024651c": "start_sptask", + "8024659c": "interrupt_gfx_sptask", + "802465ec": "start_gfx_sptask", + "80246648": "pretend_audio_sptask_done", + "8024669c": "handle_vblank", + "802467fc": "handle_sp_complete", + "8024694c": "handle_dp_complete", + "802469b8": "thread3_main", + "80246b14": "set_vblank_handler", + "80246b74": "send_sp_task_message", + "80246bb4": "dispatch_audio_sptask", + "80246c10": "send_display_list", + "80246c9c": "turn_on_audio", + "80246cb8": "turn_off_audio", + "80246cf0": "thread1_idle", + "80246df8": "main_func", + "80246e70": "my_rdp_init", + "802471a4": "my_rsp_init", + "80247284": "clear_z_buffer", + "802473c8": "display_frame_buffer", + "802474b8": "clear_frame_buffer", + "80247620": "clear_viewport", + "8024784c": "draw_screen_borders", + "802479bc": "make_viewport_clip_rect", + "80247b3c": "create_task_structure", + "80247ccc": "init_render_image", + "80247d14": "end_master_display_list", + "80247db4": "draw_reset_bars", + "80247f08": "rendering_init", + "80247fdc": "config_gfx_pool", + "80248090": "display_and_vsync", + "80248304": "adjust_analog_stick", + "80248498": "run_demo_inputs", + "80248638": "read_controller_inputs", + "80248824": "init_controllers", + "80248964": "setup_game_memory", + "80248af0": "thread5_game_loop", + "80248c40": "reset_volume", + "80248c58": "lower_background_noise", + "80248ce8": "raise_background_noise", + "80248d78": "disable_background_sound", + "80248dc0": "enable_background_sound", + "80248e08": "set_sound_mode", + "80248e54": "play_menu_sounds", + "80248fec": "play_painting_eject_sound", + "80249070": "play_infinite_stairs_music", + "80249178": "set_background_music", + "8024922c": "fadeout_music", + "8024927c": "fadeout_level_music", + "802492d0": "play_cutscene_music", + "80249310": "play_shell_music", + "8024934c": "stop_shell_music", + "80249398": "play_cap_music", + "80249404": "fadeout_cap_music", + "80249448": "stop_cap_music", + "80249494": "play_menu_sounds_extra", + "802494d8": "audio_game_loop_tick", + "80249500": "thread4_sound", + "802495e0": "level_control_timer", + "802496b8": "pressed_pause", + "80249764": "set_play_mode", + "8024978c": "warp_special", + "802497b8": "fade_into_special_warp", + "8024982c": "stub_level_update_1", + "8024983c": "load_level_init_text", + "8024995c": "init_door_warp", + "80249a10": "set_mario_initial_cap_powerup", + "80249ab4": "set_mario_initial_action", + "80249cd8": "init_mario_after_warp", + "8024a124": "warp_area", + "8024a18c": "warp_level", + "8024a1d8": "warp_credits", + "8024a374": "check_instant_warp", + "8024a584": "music_changed_through_warp", + "8024a700": "initiate_warp", + "8024a7b4": "get_painting_warp_node", + "8024a85c": "initiate_painting_warp", + "8024a9cc": "level_trigger_warp", + "8024aedc": "initiate_delayed_warp", + "8024b13c": "update_hud_values", + "8024b390": "basic_update", + "8024b3e4": "play_mode_normal", + "8024b5d4": "play_mode_paused", + "8024b6cc": "play_mode_frame_advance", + "8024b798": "level_set_transition", + "8024b7c0": "play_mode_change_area", + "8024b880": "play_mode_change_level", + "8024b9b8": "update_level", + "8024ba8c": "init_level", + "8024bcd8": "lvl_init_or_update", + "8024bd5c": "lvl_init_from_save_file", + "8024be14": "lvl_set_current_level", + "8024bfa0": "lvl_play_the_end_screen_sound", + "8024bff0": "get_mario_cap_flag", + "8024c0b8": "object_facing_mario", + "8024c16c": "mario_obj_angle_to_object", + "8024c1d8": "determine_interaction", + "8024c51c": "attack_object", + "8024c618": "mario_stop_riding_object", + "8024c66c": "mario_grab_used_object", + "8024c6c0": "mario_drop_held_object", + "8024c780": "mario_throw_held_object", + "8024c894": "mario_stop_riding_and_holding", + "8024c8fc": "does_mario_have_hat", + "8024c928": "mario_blow_off_cap", + "8024ca68": "mario_lose_cap_to_enemy", + "8024caf8": "mario_retrieve_cap", + "8024cb58": "able_to_grab_object", + "8024cbfc": "mario_get_collided_object", + "8024cc7c": "mario_check_object_grab", + "8024ce08": "bully_knock_back_mario", + "8024d0b4": "bounce_off_object", + "8024d130": "hit_object_from_below", + "8024d2bc": "determine_knockback_action", + "8024d578": "push_mario_out_of_object", + "8024d72c": "bounce_back_from_attack", + "8024d804": "should_push_or_pull_door", + "8024d8b0": "take_damage_from_interact_object", + "8024d998": "take_damage_and_knock_back", + "8024daac": "reset_mario_pitch", + "8024db2c": "interact_coin", + "8024dbf0": "interact_water_ring", + "8024dc28": "interact_star_or_key", + "8024de4c": "interact_bbh_entrance", + "8024df10": "interact_warp", + "8024e0c4": "interact_warp_door", + "8024e2fc": "get_door_save_file_flag", + "8024e420": "interact_door", + "8024e6ec": "interact_cannon_base", + "8024e778": "interact_igloo_barrier", + "8024e7d4": "interact_tornado", + "8024e8f0": "interact_whirlpool", + "8024e9d0": "interact_strong_wind", + "8024ead8": "interact_flame", + "8024ec54": "interact_snufit_bullet", + "8024ed84": "interact_clam_or_bubba", + "8024ee44": "interact_bully", + "8024eff8": "interact_shock", + "8024f170": "interact_mr_blizzard", + "8024f1e0": "interact_hit_from_below", + "8024f354": "interact_bounce_top", + "8024f4ac": "interact_unknown_08", + "8024f55c": "interact_damage", + "8024f5cc": "interact_breakable", + "8024f6a4": "interact_koopa_shell", + "8024f7a8": "check_object_grab_mario", + "8024f8bc": "interact_pole", + "8024fa60": "interact_hoot", + "8024fb30": "interact_cap", + "8024fd2c": "interact_grabbable", + "8024fe6c": "mario_can_talk", + "8024ff04": "check_read_sign", + "80250098": "check_npc_talk", + "80250198": "interact_text", + "80250230": "check_kick_or_punch_wall", + "802503f0": "mario_process_interactions", + "802505c8": "check_death_barrier", + "8025065c": "check_lava_boost", + "80250724": "pss_begin_slide", + "80250778": "pss_end_slide", + "802507fc": "mario_handle_special_floors", + "80250940": "is_anim_at_end", + "8025097c": "is_anim_past_end", + "802509b8": "set_mario_animation", + "80250b04": "set_mario_anim_with_accel", + "80250c7c": "set_anim_to_frame", + "80250d38": "is_anim_past_frame", + "80250e54": "find_mario_anim_flags_and_translation", + "80251020": "update_mario_pos_for_anim", + "802510dc": "return_mario_anim_y_translation", + "80251120": "play_sound_if_no_flag", + "8025118c": "play_mario_jump_sound", + "80251274": "adjust_sound_for_speed", + "80251310": "play_sound_and_spawn_particles", + "80251444": "play_mario_action_sound", + "802514ac": "play_mario_landing_sound", + "80251510": "play_mario_landing_sound_once", + "80251574": "play_mario_heavy_landing_sound", + "802515d8": "play_mario_heavy_landing_sound_once", + "8025163c": "play_mario_sound", + "80251708": "mario_set_forward_vel", + "8025177c": "mario_get_floor_class", + "802518a8": "mario_get_terrain_sound_addend", + "80251a48": "resolve_and_return_wall_collisions", + "80251afc": "vec3f_find_ceil", + "80251b54": "mario_facing_downhill", + "80251bd4": "mario_floor_is_slippery", + "80251cfc": "mario_floor_is_slope", + "80251e24": "mario_floor_is_steep", + "80251f24": "find_floor_height_relative_polar", + "80252000": "find_floor_slope", + "802521a0": "update_mario_sound_and_camera", + "8025229c": "set_steep_jump_action", + "80252cf4": "set_mario_action", + "80252e5c": "set_jump_from_landing", + "802530a0": "set_jumping_action", + "80253178": "drop_and_set_mario_action", + "802531c4": "hurt_and_set_mario_action", + "80253218": "check_common_action_exits", + "80253300": "check_common_hold_action_exits", + "802533e4": "transition_submerged_to_walking", + "80253488": "set_water_plunge_action", + "80253588": "squish_mario_model", + "80253720": "debug_print_speed_action_normal", + "80253838": "update_mario_button_inputs", + "8025395c": "update_mario_joystick_inputs", + "80253a60": "update_mario_geometry_inputs", + "80253d58": "update_mario_inputs", + "80253ec0": "set_submerged_cam_preset_and_spawn_bubbles", + "80254060": "update_mario_health", + "802542b4": "update_mario_info_for_cam", + "80254338": "mario_reset_bodystate", + "80254390": "sink_mario_in_quicksand", + "802543e8": "update_and_return_cap_flags", + "80254588": "mario_update_hitbox_and_cap_model", + "80254830": "execute_mario_action", + "80254b20": "init_mario", + "80254f44": "init_mario_from_save_file", + "80255080": "get_additive_y_vel_for_jumps", + "8025509c": "stub_mario_step_1", + "802550b0": "stub_mario_step_2", + "802550c0": "transfer_bully_speed", + "80255238": "init_bully_collision_data", + "802552fc": "mario_bonk_reflection", + "80255414": "mario_update_quicksand", + "80255654": "mario_push_off_steep_floor", + "8025570c": "mario_update_moving_sand", + "8025580c": "mario_update_windy_ground", + "802559b0": "stop_and_set_height_to_floor", + "80255a34": "stationary_ground_step", + "80255d88": "perform_ground_step", + "80255ec4": "check_ledge_grab", + "802560ac": "perform_air_quarter_step", + "802564e0": "apply_twirl_gravity", + "80256584": "should_strengthen_gravity_for_jump_ascent", + "8025661c": "apply_gravity", + "802569f8": "apply_vertical_wind", + "80256b24": "perform_air_step", + "80256cd8": "set_vel_from_pitch_and_yaw", + "80256d8c": "set_vel_from_yaw", + "80256e00": "get_credits_str_width", + "80256e88": "print_displaying_credits_entry", + "80257060": "bhv_end_peach_loop", + "802570dc": "bhv_end_toad_loop", + "80257198": "geo_switch_peach_eyes", + "802572b0": "get_star_collection_dialog", + "8025733c": "handle_save_menu", + "80257450": "spawn_obj_at_mario_rel_yaw", + "802574e8": "cutscene_take_cap_off", + "80257548": "cutscene_put_cap_on", + "802575a8": "mario_ready_to_speak", + "80257640": "set_mario_npc_dialog", + "80257748": "act_reading_npc_dialog", + "80257980": "act_waiting_for_dialog", + "80257a0c": "act_disappeared", + "80257ab0": "act_reading_automatic_dialog", + "80257ce4": "act_reading_sign", + "80257eac": "act_debug_free_move", + "80258184": "general_star_dance_handler", + "80258420": "act_star_dance", + "802584dc": "act_star_dance_water", + "802585c0": "act_fall_after_star_grab", + "802586cc": "common_death_handler", + "80258744": "act_standing_death", + "802587ec": "act_electrocution", + "8025883c": "act_suffocation", + "8025888c": "act_death_on_back", + "802588f8": "act_death_on_stomach", + "80258964": "act_quicksand_death", + "80258a7c": "act_eaten_by_bubba", + "80258b24": "launch_mario_until_land", + "80258ba8": "act_unlocking_key_door", + "80258dac": "act_unlocking_star_door", + "80258f94": "act_entering_star_door", + "80259264": "act_going_through_door", + "802593cc": "act_warp_door_spawn", + "802594d4": "act_emerge_from_pipe", + "80259608": "act_spawn_spin_airborne", + "80259740": "act_spawn_spin_landing", + "802597ac": "act_exit_airborne", + "80259854": "act_falling_exit_airborne", + "802598d0": "act_exit_land_save_dialog", + "80259c30": "act_death_exit", + "80259ce8": "act_unused_death_exit", + "80259d74": "act_falling_death_exit", + "80259e00": "act_special_exit_airborne", + "80259ef8": "act_special_death_exit", + "80259fcc": "act_spawn_no_spin_airborne", + "8025a040": "act_spawn_no_spin_landing", + "8025a0bc": "act_bbh_enter_spin", + "8025a494": "act_bbh_enter_jump", + "8025a610": "act_teleport_fade_out", + "8025a6fc": "act_teleport_fade_in", + "8025a858": "act_shocked", + "8025a9ac": "act_squished", + "8025ae0c": "act_putting_on_cap", + "8025aea8": "stuck_in_ground_handler", + "8025affc": "act_head_stuck_in_ground", + "8025b050": "act_butt_stuck_in_ground", + "8025b0a4": "act_feet_stuck_in_ground", + "8025bc80": "generate_yellow_sparkles", + "8025d798": "mario_execute_cutscene_action", + "8025dd70": "add_tree_leaf_particles", + "8025de1c": "play_climbing_sounds", + "8025df04": "set_pole_position", + "8025e21c": "act_holding_pole", + "8025e5a8": "act_climbing_pole", + "8025e7a4": "act_grab_pole_slow", + "8025e830": "act_grab_pole_fast", + "8025e930": "act_top_of_pole_transition", + "8025ea30": "act_top_of_pole", + "8025eb50": "perform_hanging_step", + "8025ecfc": "update_hang_moving", + "8025eed0": "update_hang_stationary", + "8025ef58": "act_start_hanging", + "8025f0b4": "act_hanging", + "8025f1e4": "act_hang_moving", + "8025f384": "let_go_of_ledge", + "8025f4b4": "climb_up_ledge", + "8025f560": "update_ledge_climb_camera", + "8025f644": "update_ledge_climb", + "8025f6c0": "act_ledge_grab", + "8025f970": "act_ledge_climb_slow", + "8025fa64": "act_ledge_climb_down", + "8025fae8": "act_ledge_climb_fast", + "8025fb90": "act_grabbed", + "8025fc6c": "act_in_cannon", + "80260154": "act_tornado_twirling", + "80260568": "check_common_automatic_cancels", + "802605d0": "mario_execute_automatic_action", + "802608b0": "check_common_idle_cancels", + "80260aac": "check_common_hold_idle_cancels", + "80260cb4": "act_idle", + "80260f94": "play_anim_sound", + "80261000": "act_start_sleeping", + "80261268": "act_sleeping", + "802614fc": "act_waking_up", + "8026168c": "act_shivering", + "802618d8": "act_coughing", + "802619d0": "act_hold_idle", + "80261ad0": "act_hold_heavy_idle", + "80261bf8": "act_standing_against_wall", + "80261cec": "act_in_quicksand", + "80261db4": "act_crouching", + "80261f70": "act_panting", + "80262080": "act_hold_panting_unused", + "8026217c": "stopping_step", + "802621dc": "act_braking_stop", + "802622dc": "act_butt_slide_stop", + "80262398": "act_hold_butt_slide_stop", + "80262490": "act_slide_kick_slide_stop", + "80262530": "act_start_crouching", + "80262650": "act_stop_crouching", + "80262770": "act_start_crawling", + "80262890": "act_stop_crawling", + "80262980": "act_shockwave_bounce", + "80262bc4": "landing_step", + "80262c34": "check_common_landing_cancels", + "80262d68": "act_jump_land_stop", + "80262dc4": "act_double_jump_land_stop", + "80262e20": "act_side_flip_land_stop", + "80262e94": "act_freefall_land_stop", + "80262ef0": "act_triple_jump_land_stop", + "80262f50": "act_backflip_land_stop", + "80262fec": "act_lava_boost_land", + "8026305c": "act_long_jump_land_stop", + "802630f8": "act_hold_jump_land_stop", + "802631f0": "act_hold_freefall_land_stop", + "802632e8": "act_air_throw_land", + "802633b4": "act_twirl_land", + "8026350c": "act_ground_pound_land", + "802635e8": "act_first_person", + "80263784": "check_common_stationary_cancels", + "80263898": "mario_execute_stationary_action", + "80263e60": "tilt_body_running", + "80263ee4": "play_step_sound", + "80264024": "align_with_floor", + "8026409c": "begin_walking_action", + "802640fc": "check_ledge_climb_down", + "802642b4": "slide_bonk", + "80264340": "set_triple_jump_action", + "8026440c": "update_sliding_angle", + "80264740": "update_sliding", + "80264b54": "apply_slope_accel", + "80264d80": "apply_landing_accel", + "80264e18": "update_shell_speed", + "80265080": "apply_slope_decel", + "802651b0": "update_decelerating_speed", + "80265244": "update_walking_speed", + "80265458": "should_begin_sliding", + "80265514": "analog_stick_held_back", + "80265558": "check_ground_dive_or_punch", + "80265620": "begin_braking_action", + "80265700": "anim_and_audio_for_walk", + "80265b1c": "anim_and_audio_for_hold_walk", + "80265d90": "anim_and_audio_for_heavy_walk", + "80265df8": "push_or_sidle_wall", + "80266038": "tilt_body_walking", + "802661cc": "tilt_body_ground_shell", + "80266354": "act_walking", + "802665b4": "act_move_punching", + "80266734": "act_hold_walking", + "8026699c": "act_hold_heavy_walking", + "80266af8": "act_turning_around", + "80266d4c": "act_finish_turning_around", + "80266e48": "act_braking", + "80266fc8": "act_decelerating", + "80267240": "act_hold_decelerating", + "80267504": "act_riding_shell_ground", + "80267728": "act_crawling", + "8026795c": "act_burning_ground", + "80267c24": "tilt_body_butt_slide", + "80267ce4": "common_slide_action", + "80267fa4": "common_slide_action_with_jump", + "80268074": "act_butt_slide", + "802680d4": "act_hold_butt_slide", + "80268168": "act_crouch_slide", + "80268338": "act_slide_kick_slide", + "802684ac": "stomach_slide_action", + "802685c0": "act_stomach_slide", + "80268608": "act_hold_stomach_slide", + "80268684": "act_dive_slide", + "802687b8": "common_ground_knockback_action", + "802689f8": "act_hard_backward_ground_kb", + "80268adc": "act_hard_forward_ground_kb", + "80268b64": "act_backward_ground_kb", + "80268bb0": "act_forward_ground_kb", + "80268bfc": "act_soft_backward_ground_kb", + "80268c48": "act_soft_forward_ground_kb", + "80268c94": "act_ground_bonk", + "80268d04": "act_death_exit_land", + "80268dcc": "common_landing_action", + "80268f78": "common_landing_cancels", + "80269108": "act_jump_land", + "80269170": "act_freefall_land", + "802691d8": "act_side_flip_land", + "80269264": "act_hold_jump_land", + "80269300": "act_hold_freefall_land", + "8026939c": "act_long_jump_land", + "8026947c": "act_double_jump_land", + "802694e4": "act_triple_jump_land", + "80269588": "act_backflip_land", + "80269640": "quicksand_jump_land_action", + "80269788": "act_quicksand_jump_land", + "802697dc": "act_hold_quicksand_jump_land", + "80269830": "check_common_moving_cancels", + "80269954": "mario_execute_moving_action", + "80269f40": "play_flip_sounds", + "80269fc0": "play_far_fall_sound", + "8026a090": "play_knockback_sound", + "8026a12c": "lava_boost_on_wall", + "8026a224": "check_fall_damage", + "8026a400": "check_kick_or_dive_in_air", + "8026a494": "should_get_stuck_in_ground", + "8026a598": "check_fall_damage_or_get_stuck", + "8026a62c": "check_horizontal_wind", + "8026a818": "update_air_with_turn", + "8026aa48": "update_air_without_turn", + "8026acd8": "update_lava_boost_or_twirling", + "8026ae5c": "update_flying_yaw", + "8026b004": "update_flying_pitch", + "8026b17c": "update_flying", + "8026b444": "common_air_action_step", + "8026b6a0": "act_jump", + "8026b740": "act_double_jump", + "8026b814": "act_triple_jump", + "8026b90c": "act_backflip", + "8026b9ac": "act_freefall", + "8026bab8": "act_hold_jump", + "8026bbb4": "act_hold_freefall", + "8026bcc0": "act_side_flip", + "8026bdcc": "act_wall_kick_air", + "8026be78": "act_long_jump", + "8026bf40": "act_riding_shell_air", + "8026c034": "act_twirling", + "8026c1e0": "act_dive", + "8026c4b8": "act_air_throw", + "8026c5d0": "act_water_jump", + "8026c738": "act_hold_water_jump", + "8026c880": "act_steep_jump", + "8026c9fc": "act_ground_pound", + "8026cd0c": "act_burning_jump", + "8026ce50": "act_burning_fall", + "8026cf28": "act_crazy_box_bounce", + "8026d1b0": "common_air_knockback_step", + "8026d33c": "check_wall_kick", + "8026d3c8": "act_backward_air_kb", + "8026d43c": "act_forward_air_kb", + "8026d4b0": "act_hard_backward_air_kb", + "8026d508": "act_hard_forward_air_kb", + "8026d560": "act_thrown_backward", + "8026d608": "act_thrown_forward", + "8026d6fc": "act_soft_bonk", + "8026d770": "act_getting_blown", + "8026d988": "act_air_hit_wall", + "8026db54": "act_forward_rollout", + "8026dcf4": "act_backward_rollout", + "8026de98": "act_butt_slide_air", + "8026e088": "act_hold_butt_slide_air", + "8026e2b4": "act_lava_boost", + "8026e59c": "act_slide_kick", + "8026e810": "act_jump_kick", + "8026e968": "act_shot_from_cannon", + "8026ec00": "act_flying", + "8026f158": "act_riding_hoot", + "8026f2ec": "act_flying_triple_jump", + "8026f614": "act_top_of_pole_jump", + "8026f660": "act_vertical_wind", + "8026f840": "act_special_triple_jump", + "8026fa18": "check_common_airborne_cancels", + "8026fb04": "mario_execute_airborne_action", + "8027499c": "mario_execute_submerged_action", + "80274eb0": "animated_stationary_ground_step", + "80274f10": "mario_update_punch_sequence", + "80275328": "act_punching", + "8027546c": "act_picking_up", + "802755fc": "act_dive_picking_up", + "802756c8": "act_placing_down", + "80275794": "act_throwing", + "802758c0": "act_heavy_throw", + "802759b4": "act_stomach_slide_stop", + "80275a80": "act_picking_up_bowser", + "80275b34": "act_holding_bowser", + "80275e78": "act_releasing_bowser", + "80275f0c": "check_common_object_cancels", + "80275fe0": "mario_execute_object_action", + "802761d0": "geo_envfx_main", + "802763d4": "geo_skybox_main", + "802764b0": "geo_draw_mario_head_goddard", + "8027684c": "bhv_toad_message_loop", + "80276910": "bhv_toad_message_init", + "80276bb8": "bhv_unlock_door_star_init", + "80276ccc": "bhv_unlock_door_star_loop", + "802770a4": "geo_mirror_mario_set_alpha", + "80277150": "geo_switch_mario_stand_run", + "802771bc": "geo_switch_mario_eyes", + "80277294": "geo_mario_tilt_torso", + "802773a4": "geo_mario_head_rotation", + "802774f4": "geo_switch_mario_hand", + "802775cc": "geo_mario_hand_foot_scaler", + "802776d8": "geo_switch_mario_cap_effect", + "80277740": "geo_switch_mario_cap_on_off", + "80277824": "geo_mario_rotate_wing_cap_wings", + "8027795c": "geo_switch_mario_hand_grab_pos", + "80277b14": "geo_render_mirror_mario", + "80277d6c": "geo_mirror_mario_backface_culling", + "80277ee0": "set_segment_base_addr", + "80277f20": "get_segment_base_addr", + "80277f50": "segmented_to_virtual", + "80277fa8": "virtual_to_segmented", + "80277ff0": "move_segment_table_to_dmem", + "80278074": "main_pool_init", + "80278120": "main_pool_alloc", + "80278238": "main_pool_free", + "80278358": "main_pool_realloc", + "802783c8": "main_pool_available", + "802783e8": "main_pool_push_state", + "80278498": "main_pool_pop_state", + "8027868c": "load_segment", + "802786f0": "load_to_fixed_pool_addr", + "802787d8": "load_segment_decompress", + "802788b4": "load_segment_decompress_heap", + "80278974": "load_engine_code_segment", + "80278a14": "alloc_only_pool_init", + "80278ab8": "alloc_only_pool_alloc", + "80278b28": "alloc_only_pool_resize", + "80278b98": "mem_pool_init", + "80278c58": "mem_pool_alloc", + "80278d74": "mem_pool_free", + "80278f2c": "alloc_display_list", + "80279028": "func_80278A78", + "80279084": "load_patchable_table", + "80279840": "save_file_do_save", + "802798fc": "save_file_erase", + "80279960": "save_file_copy", + "802799dc": "save_file_load_all", + "80279bc8": "save_file_reload", + "80279c44": "save_file_collect_star_or_key", + "80279e44": "save_file_exists", + "80279e80": "save_file_get_max_coin_score", + "80279f80": "save_file_get_course_star_count", + "8027a010": "save_file_get_total_star_count", + "8027a0a8": "save_file_set_flags", + "8027a0f4": "save_file_clear_flags", + "8027a16c": "save_file_get_flags", + "8027a1c8": "save_file_get_star_flags", + "8027a23c": "save_file_set_star_flags", + "8027a310": "save_file_get_course_coin_score", + "8027a340": "save_file_is_cannon_unlocked", + "8027a390": "save_file_set_cannon_unlocked", + "8027a418": "save_file_set_cap_pos", + "8027a4ac": "save_file_get_cap_pos", + "8027a564": "save_file_set_sound_mode", + "8027a5b4": "save_file_get_sound_mode", + "8027a5d4": "save_file_move_cap_to_default_location", + "8027a698": "disable_warp_checkpoint", + "8027a6b0": "check_if_should_set_warp_checkpoint", + "8027a718": "check_warp_checkpoint", + "8027a7d0": "override_viewport_and_clip", + "8027a83c": "set_warp_transition_rgb", + "8027a8b0": "print_intro_text", + "8027a93c": "get_mario_spawn_type", + "8027a9c8": "area_get_warp_node", + "8027aa28": "area_get_warp_node_from_params", + "8027aa74": "load_obj_warp_nodes", + "8027ab04": "clear_areas", + "8027ad74": "clear_area_graph_nodes", + "8027ae44": "load_area", + "8027af48": "unload_area", + "8027afbc": "load_mario_area", + "8027b038": "unload_mario_area", + "8027b0c0": "change_area", + "8027b164": "area_update_objects", + "8027b1a0": "play_transition", + "8027b35c": "play_transition_after_delay", + "8027b3b4": "render_game", + "8027cf38": "geo_set_animation_globals", + "8027da84": "geo_process_held_object", + "8027de68": "geo_try_process_children", + "8027dea8": "geo_process_node_and_siblings", + "8027e130": "geo_process_root", + "8027e3e0": "profiler_log_thread5_time", + "8027e490": "profiler_log_thread4_time", + "8027e520": "profiler_log_gfx_time", + "8027e5cc": "profiler_log_vblank_time", + "8027e65c": "draw_profiler_bar", + "8027e958": "draw_reference_profiler_bars", + "8027ebcc": "draw_profiler_mode_1", + "8027eeac": "draw_profiler_mode_0", + "8027f460": "draw_profiler", + "8027f4e0": "decompress", + "8027f590": "set_camera_shake_from_hit", + "8027f8b8": "set_environmental_camera_shake", + "8027f9f0": "set_camera_shake_from_point", + "8027fb74": "unused_set_camera_pitch_shake_env", + "8027fc18": "calc_y_to_curr_floor", + "8027fe20": "focus_on_mario", + "8027fff8": "set_camera_height", + "80280368": "look_down_slopes", + "802804f4": "pan_ahead_of_player", + "802806a4": "find_in_bounds_yaw_wdw_bob_thi", + "80280810": "update_radial_camera", + "80280970": "update_8_directions_camera", + "80280b00": "radial_camera_move", + "80281188": "lakitu_zoom", + "802813bc": "radial_camera_input_default", + "802813ec": "update_yaw_and_dist_from_c_up", + "8028146c": "mode_radial_camera", + "80281588": "mode_8_directions_camera", + "802816a0": "update_outward_radial_camera", + "802817fc": "mode_outward_radial_camera", + "80281904": "update_parallel_tracking_camera", + "80282280": "update_fixed_camera", + "802826a0": "update_boss_fight_camera", + "80282c0c": "unused_update_mode_5_camera", + "80282c3c": "mode_boss_fight_camera", + "80282c7c": "mode_parallel_tracking_camera", + "80282ce0": "mode_fixed_camera", + "80282d78": "update_behind_mario_camera", + "80283340": "mode_behind_mario", + "80283578": "update_slide_camera", + "802839e4": "mode_behind_mario_camera", + "80283a18": "nop_update_water_camera", + "80283a34": "mode_water_surface_camera", + "80283a68": "update_mario_camera", + "80283af8": "update_default_camera", + "80284cb8": "mode_default_camera", + "80284cfc": "mode_lakitu_camera", + "80284d38": "mode_mario_camera", + "80284d74": "update_spiral_stairs_camera", + "802850ac": "mode_spiral_stairs_camera", + "802850ec": "update_slide_or_0f_camera", + "802851dc": "mode_slide_camera", + "8028526c": "store_lakitu_cam_info_for_c_up", + "802852f4": "set_mode_c_up", + "80285370": "exit_c_up", + "80285808": "update_c_up", + "802858a4": "move_mario_head_c_up", + "80285a2c": "move_into_c_up", + "80285d20": "mode_c_up_camera", + "80285ed8": "update_in_cannon", + "80285f60": "mode_cannon_camera", + "8028603c": "transition_next_state", + "80286088": "transition_to_camera_mode", + "80286188": "set_camera_mode", + "80286420": "update_lakitu", + "802868f8": "update_camera", + "80286f68": "reset_camera", + "8028724c": "init_camera", + "802879ec": "zoom_out_if_paused_and_outside", + "80287bc4": "select_mario_cam_mode", + "80287be0": "create_camera", + "80287cb8": "update_graph_node_camera", + "80287d30": "geo_camera_main", + "80287dc0": "stub_camera_2", + "80287dd4": "stub_camera_3", + "80287de8": "vec3f_sub", + "80287e28": "object_pos_to_vec3f", + "80287e50": "vec3f_to_object_pos", + "80287e78": "unused_object_angle_to_vec3s", + "80287ea0": "evaluate_cubic_spline", + "802882e4": "move_point_along_spline", + "80288624": "cam_select_alt_mode", + "80288718": "set_cam_angle", + "80288888": "set_handheld_shake", + "802889b0": "shake_camera_handheld", + "80288ce4": "find_c_buttons_pressed", + "80288e68": "update_camera_hud_status", + "80288f5c": "collide_with_walls", + "80289198": "vec3f_compare", + "80289214": "clamp_pitch", + "802892d8": "is_within_100_units_of_mario", + "8028935c": "set_or_approach_f32_asymptotic", + "802893f4": "approach_f32_asymptotic_bool", + "80289488": "approach_f32_asymptotic", + "802894b4": "approach_s16_asymptotic_bool", + "8028956c": "approach_s16_asymptotic", + "80289610": "approach_vec3f_asymptotic", + "80289684": "set_or_approach_vec3f_asymptotic", + "802896f8": "approach_vec3s_asymptotic", + "8028976c": "camera_approach_s16_symmetric_bool", + "8028984c": "camera_approach_s16_symmetric", + "8028993c": "set_or_approach_s16_symmetric", + "802899cc": "camera_approach_f32_symmetric_bool", + "80289b0c": "camera_approach_f32_symmetric", + "80289c00": "random_vec3s", + "80289d20": "reduce_by_dist_from_camera", + "80289f88": "clamp_positions_and_find_yaw", + "8028a080": "calc_avoid_yaw", + "8028a0f4": "is_surf_within_bounding_box", + "8028a4ec": "is_behind_surface", + "8028a6bc": "is_range_behind_surface", + "8028a7ec": "is_mario_behind_surface", + "8028a834": "scale_along_line", + "8028a8e8": "is_pos_in_bounds", + "8028aa28": "calculate_pitch", + "8028aad8": "calculate_yaw", + "8028ab60": "calculate_angles", + "8028ac28": "calc_abs_dist", + "8028accc": "calc_hor_dist", + "8028ad4c": "rotate_in_xz", + "8028ae1c": "rotate_in_yz", + "8028aef0": "set_camera_pitch_shake", + "8028af4c": "set_camera_yaw_shake", + "8028b00c": "set_camera_roll_shake", + "8028b068": "set_pitch_shake_from_point", + "8028b11c": "set_yaw_shake_from_point", + "8028b1d0": "increment_shake_offset", + "8028b218": "shake_camera_pitch", + "8028b32c": "shake_camera_yaw", + "8028b438": "shake_camera_roll", + "8028b50c": "offset_yaw_outward_radial", + "8028b724": "cutscene_intro_peach_play_message_music", + "8028b754": "cutscene_intro_peach_play_lakitu_flying_music", + "8028b784": "play_camera_buzz_if_cdown", + "8028b7c4": "play_camera_buzz_if_cbutton", + "8028b804": "play_camera_buzz_if_c_sideways", + "8028b850": "play_sound_cbutton_up", + "8028b884": "play_sound_cbutton_down", + "8028b8b8": "play_sound_cbutton_side", + "8028b8ec": "play_sound_button_change_blocked", + "8028b920": "play_sound_rbutton_changed", + "8028b954": "play_sound_if_cam_switched_to_lakitu_or_mario", + "8028b9c4": "radial_camera_input", + "8028bd34": "trigger_cutscene_dialog", + "8028bd98": "handle_c_button_movement", + "8028c038": "clear_cutscene_vars", + "8028c13c": "start_cutscene", + "8028c18c": "determine_dance_cutscene", + "8028c26c": "open_door_cutscene", + "8028c2c8": "get_cutscene_from_mario_status", + "8028c7a0": "warp_camera", + "8028c8f0": "approach_camera_height", + "8028c9ac": "stub_camera_4", + "8028c9cc": "set_focus_rel_mario", + "8028cbf0": "offset_rotated", + "8028cd94": "offset_rotated_coords", + "8028cdec": "determine_pushing_or_pulling_door", + "8028ce24": "next_lakitu_state", + "8028d44c": "set_camera_mode_fixed", + "8028d5ac": "set_camera_mode_8_directions", + "8028d5fc": "set_camera_mode_boss_fight", + "8028d658": "set_camera_mode_close_cam", + "8028d698": "set_camera_mode_radial", + "8028d79c": "parallel_tracking_init", + "8028d888": "set_fixed_cam_axis_sa_lobby", + "8028d92c": "check_blocking_area_processing", + "8028da18": "cam_rr_exit_building_side", + "8028da50": "cam_rr_exit_building_top", + "8028daec": "cam_rr_enter_building_window", + "8028db38": "cam_rr_enter_building", + "8028dbb4": "cam_rr_enter_building_side", + "8028dbf4": "cam_cotmc_exit_waterfall", + "8028dc1c": "cam_sl_snowman_head_8dir", + "8028dc70": "cam_sl_free_roam", + "8028dca4": "move_camera_through_floor_while_descending", + "8028dd48": "cam_hmc_enter_maze", + "8028de2c": "cam_hmc_elevator_black_hole", + "8028de5c": "cam_hmc_elevator_maze_emergency_exit", + "8028de90": "cam_hmc_elevator_lake", + "8028dec4": "cam_hmc_elevator_maze", + "8028def8": "cam_ssl_enter_pyramid_top", + "8028df24": "cam_ssl_pyramid_center", + "8028df6c": "cam_ssl_boss_room", + "8028dfb4": "cam_thi_move_cam_through_tunnel", + "8028dfe8": "cam_thi_look_through_tunnel", + "8028e01c": "cam_bob_tower", + "8028e064": "cam_bob_default_free_roam", + "8028e098": "cam_castle_hmc_start_pool_cutscene", + "8028e0ec": "cam_castle_lobby_entrance", + "8028e164": "cam_castle_look_upstairs", + "8028e210": "cam_castle_basement_look_downstairs", + "8028e298": "cam_castle_enter_lobby", + "8028e300": "cam_castle_enter_spiral_stairs", + "8028e38c": "cam_castle_close_mode", + "8028e3b8": "cam_castle_leave_lobby_sliding_door", + "8028e3f0": "cam_castle_enter_lobby_sliding_door", + "8028e41c": "cam_bbh_room_6", + "8028e450": "cam_bbh_fall_off_roof", + "8028e47c": "cam_bbh_fall_into_pool", + "8028e524": "cam_bbh_room_1", + "8028e55c": "cam_bbh_leave_front_door", + "8028e594": "cam_bbh_room_2_lower", + "8028e5cc": "cam_bbh_room_4", + "8028e604": "cam_bbh_room_8", + "8028e63c": "cam_bbh_room_5_library", + "8028e674": "cam_bbh_room_5_library_to_hidden_transition", + "8028e6c4": "cam_bbh_room_5_hidden_to_library_transition", + "8028e714": "cam_bbh_room_5_hidden", + "8028e758": "cam_bbh_room_3", + "8028e790": "cam_bbh_room_7_mr_i", + "8028e7c8": "cam_bbh_room_7_mr_i_to_coffins_transition", + "8028e818": "cam_bbh_room_7_coffins_to_mr_i_transition", + "8028e868": "cam_bbh_elevator_room_lower", + "8028e8a0": "cam_bbh_room_0_back_entrance", + "8028e8cc": "cam_bbh_elevator", + "8028e930": "cam_bbh_room_12_upper", + "8028e974": "cam_bbh_enter_front_door", + "8028e9a0": "cam_bbh_room_2_library", + "8028e9d8": "cam_bbh_room_2_library_to_trapdoor_transition", + "8028ea28": "cam_bbh_room_2_trapdoor", + "8028ea60": "cam_bbh_room_2_trapdoor_transition", + "8028eab0": "cam_bbh_room_9_attic", + "8028eae8": "cam_bbh_room_9_attic_transition", + "8028eb38": "cam_bbh_room_9_mr_i_transition", + "8028eb88": "cam_bbh_room_13_balcony", + "8028ebc0": "cam_bbh_room_0", + "8028ec04": "cam_ccm_enter_slide_shortcut", + "8028ec2c": "cam_ccm_leave_slide_shortcut", + "8028ec58": "surface_type_modes", + "8028ed30": "set_mode_if_not_set_by_surface", + "8028ed98": "surface_type_modes_thi", + "8028eeb0": "camera_course_processing", + "8028f670": "resolve_geometry_collisions", + "8028f914": "rotate_camera_around_walls", + "8028fc9c": "find_mario_floor_and_ceil", + "8028fe24": "start_object_cutscene", + "8028fe58": "start_object_cutscene_without_focus", + "8028fe84": "unused_dialog_cutscene_response", + "8028ff04": "cutscene_object_with_dialog", + "8028ffc8": "cutscene_object_without_dialog", + "8029000c": "cutscene_object", + "80290098": "update_camera_yaw", + "802900e0": "cutscene_reset_spline", + "80290104": "stop_cutscene_and_retrieve_stored_info", + "80290168": "cap_switch_save", + "802901a4": "init_spline_point", + "802901fc": "copy_spline_segment", + "802903b8": "cutscene_common_set_dialog_state", + "802904a8": "cutscene_intro_peach_start_letter_music", + "802904e4": "cutscene_intro_peach_start_flying_music", + "8029051c": "reset_pan_distance", + "8029053c": "player2_rotate_cam", + "80290784": "store_info_cannon", + "802907f4": "retrieve_info_cannon", + "80290864": "store_info_star", + "802908e8": "retrieve_info_star", + "802909d0": "pan_camera", + "80290a5c": "cutscene_shake_explosion", + "80290abc": "rotate_and_move_vec3f", + "80290b54": "set_flag_post_door", + "80290ba4": "cutscene_soften_music", + "80290bd8": "cutscene_unsoften_music", + "80290c1c": "cutscene_unused_start", + "80290c30": "cutscene_unused_loop", + "80290c44": "cutscene_ending_mario_fall_start", + "80290c9c": "cutscene_ending_mario_fall_focus_mario", + "80290d90": "cutscene_ending_mario_fall", + "80290e00": "cutscene_ending_mario_land_closeup", + "80290e74": "cutscene_ending_reset_spline", + "80290eb0": "cutscene_ending_fly_up_to_window", + "80290f1c": "cutscene_ending_stars_free_peach", + "80290f8c": "cutscene_ending_mario_land", + "80291074": "cutscene_ending_peach_appear_closeup", + "80291108": "cutscene_ending_peach_appears", + "802911c8": "cutscene_ending_peach_descends_start", + "80291208": "cutscene_ending_follow_peach_descent", + "8029127c": "cutscene_ending_peach_descent_lower_focus", + "802912b8": "cutscene_ending_peach_descent_back_to_mario", + "80291354": "cutscene_ending_peach_descends", + "8029142c": "cutscene_ending_mario_to_peach", + "802914cc": "cutscene_ending_look_up_at_castle", + "80291514": "cutscene_ending_peach_wakeup", + "802915d4": "cutscene_ending_dialog", + "80291654": "cutscene_ending_kiss_closeup", + "802916b8": "cutscene_ending_kiss_here_we_go", + "80291774": "cutscene_ending_kiss", + "802917e4": "cutscene_ending_look_at_sky", + "8029184c": "cutscene_ending_zoom_fov", + "80291870": "cutscene_ending_cake_for_mario", + "80291924": "cutscene_ending_stop", + "80291964": "cutscene_grand_star_start", + "802919dc": "cutscene_grand_star_front_of_mario", + "80291ab4": "cutscene_grand_star_mario_jump", + "80291b18": "cutscene_grand_star_accel_cvar2", + "80291b68": "cutscene_grand_star_approach_mario", + "80291bf4": "cutscene_grand_star_move_cvar2", + "80291c3c": "cutscene_grand_star_focus_mario", + "80291cd0": "cutscene_grand_star", + "80291db0": "cutscene_grand_star_fly_start", + "80291e84": "cutscene_grand_star_fly_move_to_mario", + "80291f18": "cutscene_grand_star_fly_mario_offscreen", + "80292038": "cutscene_grand_star_fly_app_cvars", + "80292164": "cutscene_grand_star_fly", + "802921fc": "focus_in_front_of_mario", + "8029228c": "cutscene_dance_move_to_mario", + "80292324": "cutscene_dance_rotate", + "80292370": "cutscene_dance_rotate_move_back", + "802923b8": "cutscene_dance_rotate_move_towards_mario", + "80292414": "cutscene_dance_default_focus_mario", + "8029244c": "cutscene_dance_rotate_focus_mario", + "80292484": "cutscene_dance_shake_fov", + "802924b8": "cutscene_dance_default_rotate", + "80292628": "star_dance_bound_yaw", + "802926dc": "cutscene_dance_closeup_start", + "802927d0": "cutscene_dance_closeup_focus_mario", + "80292868": "cutscene_dance_closeup_fly_above", + "80292974": "cutscene_dance_closeup_fly_closer", + "80292a20": "cutscene_dance_closeup_zoom", + "80292a4c": "cutscene_dance_closeup_shake_fov", + "80292a80": "cutscene_dance_closeup", + "80292c00": "cutscene_dance_fly_away_start", + "80292d80": "cutscene_dance_fly_away_approach_mario", + "80292e2c": "cutscene_dance_fly_away_focus_mario", + "80292ec4": "cutscene_pan_cvar9", + "80292f40": "cutscene_dance_fly_rotate_around_mario", + "80292f98": "cutscene_dance_fly_away_rotate_while_flying", + "80292fe4": "cutscene_dance_fly_away_shake_fov", + "80293018": "cutscene_dance_fly_away", + "802930f0": "cutscene_key_dance_jump_cvar", + "80293164": "cutscene_key_dance_jump_closeup", + "802931c0": "cutscene_key_dance_jump_lower_left", + "80293220": "cutscene_key_dance_jump_above", + "8029328c": "cutscene_key_dance_jump_last", + "802932f4": "cutscene_key_dance_shake_fov", + "80293328": "cutscene_key_dance_handheld_shake", + "80293354": "cutscene_key_dance_focus_mario", + "8029338c": "cutscene_key_dance", + "80293488": "cutscene_bowser_area_shake_fov", + "802934b4": "cutscene_bowser_area_start_bowser_walking", + "802934d8": "cutscene_bowser_arena_set_pos", + "80293548": "cutscene_bowser_arena_focus_sine", + "802935e0": "cutscene_bowser_arena_set_focus", + "80293624": "cutscene_bowser_arena_adjust_offsets", + "8029369c": "cutscene_bowser_arena_pan_left", + "802936dc": "cutscene_bowser_arena_mario_dialog", + "80293708": "cutscene_stop_dialog", + "80293734": "cutscene_bowser_arena_start", + "802937e8": "bowser_fight_intro_dialog", + "8029386c": "cutscene_bowser_arena_dialog", + "802938c8": "cutscene_bowser_arena_end", + "80293944": "cutscene_bowser_arena", + "80293abc": "cutscene_star_spawn_store_info", + "80293ae8": "cutscene_star_spawn_focus_star", + "80293b70": "cutscene_star_spawn_update_boss_fight", + "80293bf4": "cutscene_star_spawn_fly_back", + "80293c2c": "cutscene_star_spawn", + "80293cb0": "cutscene_star_spawn_back", + "80293d5c": "cutscene_star_spawn_end", + "80293d90": "cutscene_exit_waterfall_warp", + "80293dd4": "cutscene_exit_to_castle_grounds_focus_mario", + "80293e7c": "cutscene_exit_waterfall", + "80293ed8": "cutscene_exit_to_castle_grounds_end", + "80293f2c": "cutscene_exit_fall_to_castle_grounds_warp", + "80293f70": "cutscene_exit_fall_to_castle_grounds", + "80293fcc": "cutscene_red_coin_star_start", + "80294024": "cutscene_red_coin_star_focus_xz", + "80294088": "cutscene_red_coin_star_focus_y", + "802940cc": "cutscene_red_coin_star_look_up_at_star", + "8029410c": "cutscene_red_coin_star_warp", + "802942cc": "cutscene_red_coin_star_set_fov", + "802942f0": "cutscene_red_coin_star", + "802943d4": "cutscene_red_coin_star_end", + "80294428": "cutscene_goto_cvar_pos", + "80294718": "cutscene_prepare_cannon_start", + "802947a4": "cutscene_prepare_cannon_fly_to_cannon", + "8029480c": "cannon_approach_prev", + "802948a0": "cutscene_prepare_cannon_fly_back", + "80294a14": "cutscene_prepare_cannon", + "80294a94": "cutscene_prepare_cannon_end", + "80294ae8": "water_death_move_to_mario_side", + "80294b78": "death_goto_mario", + "80294bb4": "cutscene_death_standing_start", + "80294c28": "cutscene_death_standing_goto_mario", + "80294c5c": "cutscene_death_standing", + "80294cc4": "cutscene_death_stomach_start", + "80294d48": "cutscene_death_stomach_goto_mario", + "80294db4": "cutscene_death_stomach", + "80294e24": "cutscene_bbh_death_start", + "80294ea8": "cutscene_bbh_death_goto_mario", + "80294ee8": "cutscene_bbh_death", + "80294f58": "cutscene_quicksand_death_start", + "80294f94": "cutscene_quicksand_death_goto_mario", + "80294fec": "cutscene_quicksand_death", + "802950b0": "cutscene_suffocation_fly_away", + "80295140": "cutscene_suffocation_stay_above_gas", + "802951f0": "cutscene_suffocation_rotate", + "80295270": "cutscene_suffocation", + "80295310": "cutscene_enter_pool_start", + "802953dc": "cutscene_enter_pool_loop", + "80295418": "cutscene_enter_pool", + "80295480": "cutscene_pyramid_top_explode_start", + "802954ec": "cutscene_pyramid_top_explode_zoom_in", + "80295518": "cutscene_pyramid_top_explode_focus", + "80295580": "cutscene_pyramid_top_explode_warp", + "80295670": "cutscene_pyramid_top_explode_closeup", + "80295740": "cutscene_pyramid_top_explode_cam_shake", + "8029576c": "cutscene_pyramid_top_explode_warp_back", + "802957c8": "cutscene_pyramid_top_explode", + "80295894": "cutscene_pyramid_top_explode_end", + "802958d4": "cutscene_enter_pyramid_top_start", + "80295930": "cutscene_enter_pyramid_top", + "80295a58": "cutscene_dialog_start", + "80295bf0": "cutscene_dialog_move_mario_shoulder", + "80295e24": "cutscene_dialog_create_dialog_box", + "80295e8c": "cutscene_dialog", + "80295fb0": "cutscene_dialog_set_flag", + "80295fd8": "cutscene_dialog_end", + "80296020": "cutscene_read_message_start", + "80296160": "cutscene_read_message", + "802962c8": "cutscene_read_message_set_flag", + "802962f0": "cutscene_read_message_end", + "80296318": "cutscene_exit_succ_start", + "802963b8": "cutscene_non_painting_set_cam_pos", + "8029652c": "cutscene_non_painting_set_cam_focus", + "8029665c": "cutscene_exit_bowser_succ_focus_left", + "8029669c": "cutscene_exit_bowser_key_toss_shake", + "802966e4": "cutscene_exit_succ_shake_landing", + "80296710": "cutscene_exit_bowser_succ", + "802967c4": "cutscene_non_painting_end", + "8029685c": "cutscene_exit_non_painting_succ_override_cvar", + "802968a0": "cutscene_exit_non_painting_succ", + "8029695c": "cutscene_non_painting_death_start", + "802969f8": "cutscene_exit_bowser_death", + "80296a64": "cutscene_non_painting_death_override_offset", + "80296b30": "cutscene_non_painting_death", + "80296bc8": "cutscene_cap_switch_press_start", + "80296c4c": "cutscene_cap_switch_press_rotate_around_mario", + "80296d60": "cutscene_cap_switch_press_lower_cam", + "80296da8": "cutscene_cap_switch_press_approach_mario", + "80296eb4": "cutscene_cap_switch_press_pan_left", + "80296f38": "cutscene_cap_switch_press_create_dialog", + "80296fa8": "cutscene_cap_switch_press", + "80297148": "cutscene_unlock_key_door_start", + "8029720c": "cutscene_unlock_key_door_approach_mario", + "80297290": "cutscene_unlock_key_door_focus_lock", + "802972ec": "cutscene_unlock_key_door_stub", + "80297300": "cutscene_unlock_key_door_fly_back", + "80297384": "cutscene_unlock_key_door_fov_shake", + "802973b0": "cutscene_unlock_key_door", + "80297464": "intro_peach_move_camera_start_to_pipe", + "80297560": "peach_letter_text", + "8029758c": "play_sound_peach_reading_letter", + "802975c4": "cutscene_intro_peach_start_to_pipe_spline", + "8029762c": "cutscene_intro_peach_dialog", + "802976bc": "cutscene_intro_peach_follow_pipe_spline", + "80297728": "cutscene_intro_peach_clear_cutscene_status", + "80297748": "cutscene_intro_peach_zoom_fov", + "80297784": "cutscene_intro_peach_reset_spline", + "802977c8": "cutscene_intro_peach_handheld_shake_off", + "802977f4": "intro_pipe_exit_text", + "80297820": "play_sound_intro_turn_on_hud", + "8029784c": "cutscene_intro_peach_fly_to_pipe", + "80297908": "cutscene_intro_peach_mario_appears", + "80297a38": "cutscene_intro_peach_reset_fov", + "80297a64": "cutscene_intro_peach_letter", + "80297b58": "cutscene_end_waving_start", + "80297b84": "cutscene_end_waving", + "80297c14": "cutscene_credits_reset_spline", + "80297c40": "cutscene_credits", + "802980dc": "cutscene_sliding_doors_open_start", + "8029819c": "cutscene_sliding_doors_open_set_cvars", + "80298218": "cutscene_sliding_doors_go_under_doorway", + "80298254": "cutscene_sliding_doors_fly_back_up", + "80298290": "cutscene_sliding_doors_follow_mario", + "802983b4": "cutscene_sliding_doors_open", + "80298458": "cutscene_double_doors_end", + "802984a0": "cutscene_enter_painting_stub", + "802984b4": "cutscene_enter_painting", + "802987b0": "cutscene_exit_painting_start", + "8029894c": "cutscene_exit_painting_move_to_mario", + "802989e8": "cutscene_exit_painting_move_to_floor", + "80298af8": "cutscene_exit_painting", + "80298ba0": "cutscene_unused_exit_start", + "80298c2c": "cutscene_unused_exit_focus_mario", + "80298ccc": "cutscene_exit_painting_end", + "80298d44": "cutscene_enter_cannon_end", + "80298d9c": "cutscene_enter_cannon_raise", + "80298fe8": "cutscene_enter_cannon_start", + "80299100": "cutscene_door_start", + "80299154": "cutscene_door_fix_cam", + "802991a8": "cutscene_door_loop", + "802991f0": "cutscene_door_move_behind_mario", + "802992cc": "cutscene_door_follow_mario", + "80299360": "cutscene_door_end", + "80299404": "cutscene_door_mode", + "802994e8": "play_cutscene", + "8029a2f8": "cutscene_event", + "8029a37c": "cutscene_spawn_obj", + "8029a3b4": "set_fov_shake", + "8029a41c": "set_fov_shake_from_point", + "8029a4d0": "shake_camera_fov", + "8029a5e8": "set_fov_30", + "8029a60c": "approach_fov_20", + "8029a64c": "set_fov_45", + "8029a670": "set_fov_29", + "8029a694": "zoom_fov_30", + "8029a6f4": "fov_default", + "8029a858": "approach_fov_30", + "8029a894": "approach_fov_60", + "8029a8d0": "approach_fov_45", + "8029a968": "approach_fov_80", + "8029a9a4": "set_fov_bbh", + "8029aa3c": "geo_camera_fov", + "8029ab94": "set_fov_function", + "8029abb0": "cutscene_set_fov_shake_preset", + "8029ac30": "set_fov_shake_from_point_preset", + "8029aef8": "obj_rotate_towards_point", + "8029af98": "intro_peach_set_pos_and_opacity", + "8029b08c": "bhv_intro_peach_loop", + "8029b28c": "intro_lakitu_set_offset_from_camera", + "8029b358": "intro_lakitu_set_focus", + "8029b3c8": "intro_lakitu_set_pos_and_focus", + "8029b49c": "bhv_intro_lakitu_loop", + "8029bde4": "bhv_end_birds_1_loop", + "8029bf64": "bhv_end_birds_2_loop", + "8029c0e4": "spawn_child_obj_relative", + "8029c254": "bhv_intro_scene_loop", + "8029c770": "nop_change_course", + "8029c780": "copy_mario_state_to_object", + "8029c9cc": "spawn_particle", + "8029ca58": "bhv_mario_update", + "8029cb34": "update_objects_starting_at", + "8029cbc8": "update_objects_during_time_stop", + "8029cd28": "update_objects_in_list", + "8029cd98": "unload_deactivated_objects_in_list", + "8029ce58": "set_object_respawn_info_bits", + "8029cedc": "unload_objects_from_area", + "8029cfb0": "spawn_objects_from_info", + "8029d1d8": "stub_obj_list_processor_1", + "8029d1e8": "clear_objects", + "8029d324": "update_terrain_objects", + "8029d374": "update_non_terrain_objects", + "8029d428": "unload_deactivated_objects", + "8029d690": "update_objects", + "8029d890": "geo_update_projectile_pos_from_parent", + "8029d924": "geo_update_layer_transparency", + "8029db48": "geo_switch_anim_state", + "8029dbd4": "geo_switch_area", + "8029dcd4": "obj_update_pos_from_parent_transformation", + "8029dda8": "obj_apply_scale_to_matrix", + "8029de80": "create_transformation_from_matrices", + "8029e1b0": "obj_set_held_state", + "8029e27c": "lateral_dist_between_objects", + "8029e2f8": "dist_between_objects", + "8029e398": "cur_obj_forward_vel_approach_upward", + "8029e3e8": "approach_f32_signed", + "8029e494": "approach_f32_symmetric", + "8029e530": "approach_s16_symmetric", + "8029e5ec": "cur_obj_rotate_yaw_toward", + "8029e694": "obj_angle_to_object", + "8029e714": "obj_turn_toward_object", + "8029e8bc": "obj_set_parent_relative_pos", + "8029e914": "obj_set_pos", + "8029e96c": "obj_set_angle", + "8029e9ac": "spawn_object_abs_with_rot", + "8029ea24": "spawn_object_rel_with_rot", + "8029eaac": "spawn_obj_with_transform_flags", + "8029eb04": "spawn_water_droplet", + "8029ed20": "spawn_object_at_origin", + "8029edcc": "spawn_object", + "8029ee24": "try_to_spawn_object", + "8029eeb8": "spawn_object_with_scale", + "8029ef64": "spawn_object_relative", + "8029effc": "spawn_object_relative_with_scale", + "8029f070": "cur_obj_move_using_vel", + "8029f0c8": "obj_copy_graph_y_offset", + "8029f0e0": "obj_copy_pos_and_angle", + "8029f120": "obj_copy_pos", + "8029f148": "obj_copy_angle", + "8029f188": "obj_set_gfx_pos_from_pos", + "8029f1b0": "obj_init_animation", + "8029f200": "linear_mtxf_mul_vec3f", + "8029f274": "linear_mtxf_transpose_mul_vec3f", + "8029f2ec": "obj_apply_scale_to_transform", + "8029f3a8": "obj_copy_scale", + "8029f3d0": "obj_scale_xyz", + "8029f404": "obj_scale", + "8029f430": "cur_obj_scale", + "8029f464": "cur_obj_init_animation", + "8029f4b4": "cur_obj_init_animation_with_sound", + "8029f514": "cur_obj_init_animation_with_accel_and_sound", + "8029f59c": "obj_init_animation_with_sound", + "8029f600": "cur_obj_enable_rendering_and_become_tangible", + "8029f620": "cur_obj_enable_rendering", + "8029f644": "cur_obj_disable_rendering_and_become_intangible", + "8029f66c": "cur_obj_disable_rendering", + "8029f694": "cur_obj_unhide", + "8029f6bc": "cur_obj_hide", + "8029f6e0": "cur_obj_set_pos_relative", + "8029f7d8": "cur_obj_set_pos_relative_to_parent", + "8029f820": "cur_obj_enable_rendering_2", + "8029f848": "cur_obj_unused_init_on_floor", + "8029f8ec": "obj_set_face_angle_to_move_angle", + "8029f914": "get_object_list_from_behavior", + "8029f95c": "cur_obj_nearest_object_with_behavior", + "8029f998": "cur_obj_dist_to_nearest_object_with_behavior", + "8029f9ec": "cur_obj_find_nearest_object_with_behavior", + "8029fb1c": "find_unimportant_object", + "8029fb68": "count_unimportant_objects", + "8029fbdc": "count_objects_with_behavior", + "8029fc9c": "cur_obj_find_nearby_held_actor", + "8029fdb4": "cur_obj_change_action", + "8029fe00": "cur_obj_set_vel_from_mario_vel", + "8029fe6c": "cur_obj_reverse_animation", + "8029fea4": "cur_obj_extend_animation_if_at_end", + "8029ff04": "cur_obj_check_if_near_animation_end", + "8029ffa4": "cur_obj_check_if_at_animation_end", + "802a0008": "cur_obj_check_anim_frame", + "802a0050": "cur_obj_check_anim_frame_in_range", + "802a00ac": "cur_obj_check_frame_prior_current_frame", + "802a0114": "mario_is_in_air_action", + "802a0154": "mario_is_dive_sliding", + "802a0198": "cur_obj_set_y_vel_and_animation", + "802a01d8": "cur_obj_unrender_and_reset_state", + "802a0380": "cur_obj_get_thrown_or_placed", + "802a0474": "cur_obj_get_dropped", + "802a04c0": "cur_obj_set_model", + "802a04f0": "mario_set_flag", + "802a0514": "cur_obj_clear_interact_status_flag", + "802a0568": "obj_mark_for_deletion", + "802a057c": "cur_obj_disable", + "802a05b4": "cur_obj_become_intangible", + "802a05d4": "cur_obj_become_tangible", + "802a05f0": "obj_become_tangible", + "802a0604": "cur_obj_update_floor_height", + "802a064c": "cur_obj_update_floor_height_and_get_floor", + "802a079c": "cur_obj_apply_drag_xz", + "802a0e68": "cur_obj_move_y", + "802a113c": "cur_obj_unused_resolve_wall_collisions", + "802a11a8": "abs_angle_diff", + "802a120c": "cur_obj_move_xz_using_fvel_and_yaw", + "802a12a4": "cur_obj_move_y_with_terminal_vel", + "802a1308": "cur_obj_compute_vel_xz", + "802a1370": "increment_velocity_toward_range", + "802a1424": "obj_check_if_collided_with_object", + "802a148c": "cur_obj_set_behavior", + "802a14c4": "obj_set_behavior", + "802a14fc": "cur_obj_has_behavior", + "802a1554": "obj_has_behavior", + "802a15ac": "cur_obj_lateral_dist_from_mario_to_home", + "802a1634": "cur_obj_lateral_dist_to_home", + "802a16ac": "cur_obj_outside_home_square", + "802a1774": "cur_obj_outside_home_rectangle", + "802a184c": "cur_obj_set_pos_to_home", + "802a188c": "cur_obj_set_pos_to_home_and_stop", + "802a18dc": "cur_obj_shake_y", + "802a1930": "cur_obj_start_cam_event", + "802a1960": "set_mario_interact_hoot_if_in_range", + "802a19ac": "obj_set_billboard", + "802a19c8": "cur_obj_set_hitbox_radius_and_height", + "802a19f0": "cur_obj_set_hurtbox_radius_and_height", + "802a1b34": "obj_spawn_loot_blue_coins", + "802a1b8c": "obj_spawn_loot_yellow_coins", + "802a1bdc": "cur_obj_spawn_loot_coin_at_mario_pos", + "802a1c68": "cur_obj_abs_y_dist_to_home", + "802a1cc4": "cur_obj_advance_looping_anim", + "802a1f3c": "cur_obj_resolve_wall_collisions", + "802a2320": "cur_obj_update_floor_and_walls", + "802a2348": "cur_obj_move_standard", + "802a25b4": "cur_obj_move_using_vel_and_gravity", + "802a2644": "cur_obj_move_using_fvel_and_gravity", + "802a2674": "obj_set_pos_relative", + "802a2748": "cur_obj_angle_to_home", + "802a27b0": "obj_set_gfx_pos_at_obj_pos", + "802a2804": "obj_translate_local", + "802a2930": "obj_build_transform_from_pos_and_angle", + "802a2a18": "obj_set_throw_matrix_from_transform", + "802a2a84": "obj_build_transform_relative_to_parent", + "802a2b28": "obj_create_transform_from_self", + "802a2b6c": "cur_obj_rotate_move_angle_using_vel", + "802a2bc4": "cur_obj_rotate_face_angle_using_vel", + "802a2c1c": "cur_obj_set_face_angle_to_move_angle", + "802a2c5c": "cur_obj_follow_path", + "802a2ed4": "chain_segment_init", + "802a2f14": "random_f32_around_zero", + "802a2f5c": "obj_scale_random", + "802a2fc0": "obj_translate_xyz_random", + "802a308c": "obj_translate_xz_random", + "802a31e0": "cur_obj_set_pos_via_transform", + "802a3268": "cur_obj_reflect_move_angle_off_wall", + "802a32ac": "cur_obj_spawn_particles", + "802a34a4": "obj_set_hitbox", + "802a3604": "signum_positive", + "802a3634": "absf", + "802a3674": "absi", + "802a36a4": "cur_obj_wait_then_blink", + "802a3754": "cur_obj_is_mario_ground_pounding_platform", + "802a37ac": "spawn_mist_particles", + "802a37dc": "spawn_mist_particles_with_sound", + "802a3818": "cur_obj_push_mario_away", + "802a390c": "cur_obj_push_mario_away_from_cylinder", + "802a399c": "bhv_dust_smoke_loop", + "802a3a4c": "cur_obj_set_direction_table", + "802a3a88": "cur_obj_progress_direction_table", + "802a3b28": "stub_obj_helpers_3", + "802a3b40": "cur_obj_scale_over_time", + "802a3c18": "cur_obj_set_pos_to_home_with_debug", + "802a3cec": "stub_obj_helpers_4", + "802a3cfc": "cur_obj_is_mario_on_platform", + "802a3d40": "cur_obj_shake_y_until", + "802a3dd4": "cur_obj_move_up_and_down", + "802a3e30": "cur_obj_call_action_function", + "802a3ef8": "spawn_base_star_with_no_lvl_exit", + "802a3f24": "bit_shift_left", + "802a3f48": "cur_obj_mario_far_away", + "802a404c": "is_mario_moving_fast_or_in_air", + "802a40b8": "is_item_in_array", + "802a4120": "bhv_init_room", + "802a4210": "cur_obj_enable_rendering_if_mario_in_room", + "802a4360": "cur_obj_set_hitbox_and_die_if_attacked", + "802a4440": "obj_explode_and_spawn_coins", + "802a44f4": "obj_set_collision_data", + "802a452c": "cur_obj_if_hit_wall_bounce_away", + "802a4564": "cur_obj_hide_if_mario_far_away_y", + "802a45e4": "geo_offset_klepto_held_object", + "802a462c": "geo_offset_klepto_debug", + "802a46cc": "obj_is_hidden", + "802a4704": "enable_time_stop", + "802a4728": "disable_time_stop", + "802a4750": "set_time_stop_flags", + "802a4774": "clear_time_stop_flags", + "802a47a0": "cur_obj_can_mario_activate_textbox", + "802a48bc": "cur_obj_can_mario_activate_textbox_2", + "802a4960": "cur_obj_update_dialog", + "802a4be4": "cur_obj_update_dialog_with_cutscene", + "802a4f04": "cur_obj_has_model", + "802a4f58": "cur_obj_align_gfx_with_floor", + "802a5034": "mario_is_within_rectangle", + "802a50fc": "cur_obj_shake_screen", + "802a513c": "obj_attack_collided_from_other_object", + "802a51ac": "cur_obj_was_attacked_or_ground_pounded", + "802a5228": "obj_copy_behavior_params", + "802a5248": "cur_obj_init_animation_and_anim_frame", + "802a5288": "cur_obj_init_animation_and_check_if_near_end", + "802a52c4": "cur_obj_init_animation_and_extend_if_at_end", + "802a52f8": "cur_obj_check_grabbed_mario", + "802a5358": "player_performed_grab_escape_action", + "802a540c": "cur_obj_unused_play_footstep_sound", + "802a5460": "enable_time_stop_including_mario", + "802a5498": "disable_time_stop_including_mario", + "802a54d8": "cur_obj_check_interacted", + "802a5524": "cur_obj_spawn_loot_blue_coin", + "802a5588": "cur_obj_spawn_star_at_y_offset", + "802a5620": "star_door_update_pos", + "802a56bc": "bhv_star_door_loop", + "802a58dc": "bhv_piranha_particle_loop", + "802a597c": "mr_i_piranha_particle_act_0", + "802a5a44": "mr_i_piranha_particle_act_1", + "802a5aa0": "bhv_mr_i_particle_loop", + "802a5acc": "spawn_mr_i_particle", + "802a5bd4": "bhv_mr_i_body_loop", + "802a5d4c": "mr_i_act_3", + "802a6518": "mr_i_act_2", + "802a68a0": "mr_i_act_1", + "802a6ad8": "mr_i_act_0", + "802a6b7c": "bhv_mr_i_loop", + "802a6c20": "bhv_pole_init", + "802a6c74": "bhv_giant_pole_loop", + "802a6cf4": "bhv_thi_huge_island_top_loop", + "802a6d64": "bhv_thi_tiny_island_top_loop", + "802a6ee4": "cap_switch_act_0", + "802a7020": "cap_switch_act_1", + "802a708c": "cap_switch_act_2", + "802a7160": "cap_switch_act_3", + "802a7170": "bhv_cap_switch_loop", + "802a719c": "geo_update_held_mario_pos", + "802a7230": "bhv_bobomb_anchor_mario_loop", + "802a7264": "king_bobomb_act_0", + "802a7384": "mario_is_far_below_object", + "802a73d8": "king_bobomb_act_2", + "802a7598": "king_bobomb_act_3", + "802a7804": "king_bobomb_act_1", + "802a78d8": "king_bobomb_act_6", + "802a7a60": "king_bobomb_act_7", + "802a7b1c": "king_bobomb_act_8", + "802a7b5c": "king_bobomb_act_4", + "802a7d14": "king_bobomb_act_5", + "802a7fbc": "king_bobomb_move", + "802a8064": "bhv_king_bobomb_loop", + "802a816c": "bhv_beta_chest_bottom_init", + "802a81e8": "bhv_beta_chest_bottom_loop", + "802a821c": "bhv_beta_chest_lid_loop", + "802a8370": "bhv_water_air_bubble_init", + "802a83a0": "bhv_water_air_bubble_loop", + "802a8630": "bhv_bubble_wave_init", + "802a86bc": "scale_bubble_random", + "802a870c": "bhv_bubble_maybe_loop", + "802a88a4": "bhv_small_water_wave_loop", + "802a8a38": "scale_bubble_sin", + "802a8b18": "bhv_particle_init", + "802a8bc0": "bhv_particle_loop", + "802a8c88": "bhv_small_bubbles_loop", + "802a8cdc": "bhv_fish_group_loop", + "802a8d48": "bhv_water_waves_init", + "802a8d98": "bhv_cannon_base_unused_loop", + "802a8dc0": "opened_cannon_act_0", + "802a8f40": "opened_cannon_act_4", + "802a9114": "opened_cannon_act_6", + "802a92fc": "opened_cannon_act_5", + "802a93f8": "opened_cannon_act_1", + "802a9440": "opened_cannon_act_2", + "802a9460": "opened_cannon_act_3", + "802a9498": "bhv_cannon_base_loop", + "802a94f8": "bhv_cannon_barrel_loop", + "802a958c": "common_anchor_mario_behavior", + "802a9708": "bhv_chuckya_anchor_mario_loop", + "802a973c": "unknown_chuckya_function", + "802a98c4": "approach_forward_vel", + "802a9994": "chuckya_act_0", + "802a9d08": "chuckya_act_1", + "802a9f54": "chuckya_act_3", + "802a9fc8": "chuckya_act_2", + "802aa02c": "chuckya_move", + "802aa0ac": "bhv_chuckya_loop", + "802aa1b8": "bhv_wf_breakable_wall_loop", + "802aa280": "check_mario_attacking", + "802aa3c8": "init_kickable_board_rock", + "802aa3f4": "bhv_kickable_board_loop", + "802aa700": "bhv_tower_door_loop", + "802aa774": "bhv_wf_rotating_wooden_platform_loop", + "802aa830": "bhv_rotating_platform_loop", + "802aa948": "set_koopa_shell_underwater_hitbox", + "802aa97c": "bhv_koopa_shell_underwater_loop", + "802aaa60": "bhv_warp_loop", + "802aab54": "bhv_fading_warp_loop", + "802aac48": "bhv_white_puff_exploding_loop", + "802aae8c": "spawn_mist_particles_variable", + "802aaf48": "bhv_spawned_star_init", + "802aaffc": "set_sparkle_spawn_star_hitbox", + "802ab060": "set_home_to_mario", + "802ab158": "set_y_home_to_pos", + "802ab18c": "slow_star_rotation", + "802ab1c8": "bhv_spawned_star_loop", + "802ab558": "bhv_spawn_star_no_level_exit", + "802ab5c8": "bhv_coin_sparkles_init", + "802ab650": "bhv_yellow_coin_init", + "802ab70c": "bhv_yellow_coin_loop", + "802ab748": "bhv_temp_coin_loop", + "802ab7a4": "bhv_coin_init", + "802ab860": "bhv_coin_loop", + "802aba40": "bhv_coin_formation_spawn_loop", + "802abc04": "spawn_coin_in_formation", + "802abee4": "bhv_coin_formation_init", + "802abf0c": "bhv_coin_formation_loop", + "802ac068": "coin_inside_boo_act_1", + "802ac15c": "coin_inside_boo_act_0", + "802ac294": "bhv_coin_inside_boo_loop", + "802ac2c0": "bhv_coin_sparkles_loop", + "802ac2ec": "bhv_golden_coin_sparkles_loop", + "802ac3a8": "bhv_punch_tiny_triangle_loop", + "802ac4a0": "bhv_punch_tiny_triangle_init", + "802ac5b4": "bhv_wall_tiny_star_particle_loop", + "802ac678": "bhv_tiny_star_particles_init", + "802ac78c": "bhv_pound_tiny_star_particle_loop", + "802ac864": "bhv_pound_tiny_star_particle_init", + "802ac910": "door_animation_and_reset", + "802ac958": "set_door_camera_event", + "802ac9d0": "play_door_open_noise", + "802aca6c": "play_warp_door_open_noise", + "802acac8": "bhv_door_loop", + "802acc3c": "bhv_door_init", + "802ace80": "bhv_star_door_loop_2", + "802ad078": "grindel_thwomp_act_4", + "802ad10c": "grindel_thwomp_act_2", + "802ad1a4": "grindel_thwomp_act_3", + "802ad238": "grindel_thwomp_act_1", + "802ad2d0": "grindel_thwomp_act_0", + "802ad34c": "bhv_grindel_thwomp_loop", + "802ad378": "bhv_tumbling_bridge_platform_loop", + "802ad580": "tumbling_bridge_act_1", + "802ad76c": "tumbling_bridge_act_2", + "802ad7f4": "tumbling_bridge_act_3", + "802ad828": "tumbling_bridge_act_0", + "802ad890": "bhv_tumbling_bridge_loop", + "802ad8bc": "elevator_starting_shake", + "802ad8f0": "elevator_act_0", + "802ada4c": "elevator_act_1", + "802adb88": "elevator_act_2", + "802adce4": "elevator_act_4", + "802add70": "elevator_act_3", + "802addf8": "bhv_elevator_init", + "802adf6c": "bhv_elevator_loop", + "802adf98": "bhv_water_mist_spawn_loop", + "802adfd8": "bhv_water_mist_loop", + "802ae0cc": "spawn_triangle_break_particles", + "802ae238": "bhv_water_mist_2_loop", + "802ae304": "bhv_pound_white_puffs_init", + "802ae334": "spawn_mist_from_global", + "802ae360": "bhv_ground_sand_init", + "802ae394": "spawn_smoke_with_velocity", + "802ae45c": "clear_particle_flags", + "802ae48c": "bhv_ground_snow_init", + "802ae4c0": "spawn_wind_particles", + "802ae534": "bhv_wind_loop", + "802ae85c": "bhv_unused_particle_spawn_loop", + "802ae908": "bhv_ukiki_cage_star_loop", + "802aea6c": "ukiki_cage_act_wait_for_ukiki", + "802aeab8": "ukiki_cage_act_spin", + "802aeb1c": "ukiki_cage_act_fall", + "802aeb74": "ukiki_cage_act_hide", + "802aeb9c": "bhv_ukiki_cage_loop", + "802aebc8": "bhv_squishable_platform_loop", + "802aec40": "bhv_bitfs_sinking_platform_loop", + "802aeca8": "bhv_ddd_moving_pole_loop", + "802aecdc": "bhv_bitfs_sinking_cage_platform_loop", + "802aedc0": "bhv_beta_moving_flames_spawn_loop", + "802aeea4": "bhv_beta_moving_flames_loop", + "802aef1c": "bhv_flamethrower_flame_loop", + "802af1e8": "bhv_flamethrower_loop", + "802af3fc": "bhv_rr_rotating_bridge_platform_loop", + "802af448": "bhv_bouncing_fireball_flame_loop", + "802af5f8": "bhv_bouncing_fireball_loop", + "802af7c4": "bhv_bowser_shock_wave_loop", + "802af9cc": "bhv_black_smoke_upward_loop", + "802afa0c": "bhv_black_smoke_bowser_loop", + "802afae4": "bhv_black_smoke_mario_loop", + "802afbf8": "bhv_flame_mario_loop", + "802afce4": "bhv_beta_fish_splash_spawner_loop", + "802afd1c": "bhv_spindrift_loop", + "802afee8": "bhv_wf_solid_tower_platform_loop", + "802aff30": "bhv_wf_elevator_tower_platform_loop", + "802b00e4": "bhv_wf_sliding_tower_platform_loop", + "802b0244": "spawn_and_init_wf_platforms", + "802b039c": "spawn_wf_platform_group", + "802b04b4": "bhv_tower_platform_group_loop", + "802b0614": "bhv_tree_snow_or_leaf_loop", + "802b0974": "bhv_snow_leaf_particle_spawn_init", + "802b0b9c": "square_plat_set_yaw_until_timer", + "802b0bec": "bhv_squarish_path_moving_loop", + "802b0d48": "bhv_piranha_plant_waking_bubbles_loop", + "802b0df0": "bhv_piranha_plant_bubble_loop", + "802b1278": "bhv_purple_switch_loop", + "802b14f4": "check_if_moving_over_floor", + "802b15e8": "bhv_pushable_loop", + "802b1714": "breakable_box_init", + "802b17f4": "hidden_breakable_box_actions", + "802b19d8": "hidden_unbreakable_box_actions", + "802b1ae0": "bhv_hidden_object_loop", + "802b1b2c": "bhv_breakable_box_loop", + "802b1bb0": "geo_move_mario_part_from_parent", + "802b1c54": "bhv_heave_ho_throw_mario_loop", + "802b1d7c": "heave_ho_act_1", + "802b1e6c": "heave_ho_act_2", + "802b1ff4": "heave_ho_act_3", + "802b20a0": "heave_ho_act_0", + "802b2154": "heave_ho_move", + "802b2278": "bhv_heave_ho_loop", + "802b2340": "bhv_ccm_touched_star_spawn_loop", + "802b23e0": "bhv_unused_poundable_platform", + "802b2494": "bhv_beta_trampoline_spring_loop", + "802b25ac": "bhv_beta_trampoline_top_loop", + "802b26a4": "jumping_box_act_0", + "802b27d8": "jumping_box_act_1", + "802b2824": "jumping_box_free_update", + "802b288c": "bhv_jumping_box_loop", + "802b29b8": "bhv_boo_cage_loop", + "802b2bc8": "spawn_sparkle_particles", + "802b2d10": "bhv_alpha_boo_key_loop", + "802b3108": "bhv_beta_boo_key_loop", + "802b3134": "arc_to_goal_pos", + "802b3250": "grand_star_zero_velocity", + "802b329c": "bhv_grand_star_loop", + "802b3600": "bhv_bowser_key_loop", + "802b37b8": "bhv_white_puff_smoke_init", + "802b3810": "bhv_bullet_bill_init", + "802b3830": "bullet_bill_act_0", + "802b38b8": "bullet_bill_act_1", + "802b394c": "bullet_bill_act_2", + "802b3b08": "bullet_bill_act_3", + "802b3b24": "bullet_bill_act_4", + "802b3be0": "bhv_bullet_bill_loop", + "802b3c2c": "bowser_tail_anchor_act_0", + "802b3cdc": "bowser_tail_anchor_act_1", + "802b3d10": "bowser_tail_anchor_act_2", + "802b3d74": "bhv_bowser_tail_anchor_loop", + "802b3df4": "bhv_bowser_flame_spawn_loop", + "802b4080": "bhv_bowser_body_anchor_loop", + "802b4184": "bowser_spawn_shockwave", + "802b41fc": "bowser_bounce", + "802b4288": "bowser_set_anim_look_up_and_walk", + "802b4300": "bowser_set_anim_slow_gait", + "802b4368": "bowser_set_anim_look_down", + "802b43dc": "bowser_initialize_action", + "802b4478": "bowser_act_text_wait", + "802b44bc": "bowser_act_intro_walk", + "802b45f4": "bowser_bitdw_act_controller", + "802b473c": "bowser_bitfs_act_controller", + "802b48d4": "bowser_general_bits_act_controller", + "802b4a1c": "bowser_set_act_jump", + "802b4a3c": "bowser_bits_act_controller", + "802b4af4": "bowser_reset_fallen_off_stage", + "802b4bac": "bowser_act_unused_slow_walk", + "802b4be8": "bowser_act_default", + "802b4ca4": "bowser_act_breath_fire", + "802b4d14": "bowser_act_walk_to_mario", + "802b4f00": "bowser_act_teleport", + "802b5104": "bowser_act_spit_fire_into_sky", + "802b5218": "bowser_act_hit_mine", + "802b53f4": "bowser_set_anim_in_air", + "802b5444": "bowser_land", + "802b5554": "bowser_short_second_hop", + "802b55cc": "bowser_act_jump", + "802b5798": "bowser_act_jump_towards_mario", + "802b58bc": "bowser_act_hit_edge", + "802b59cc": "bowser_act_spit_fire_onto_floor", + "802b5aec": "bowser_turn_on_timer", + "802b5c00": "bowser_act_turn_from_edge", + "802b5c40": "bowser_act_charge_mario", + "802b5f6c": "bowser_check_hit_mine", + "802b5fec": "bowser_act_thrown_dropped", + "802b611c": "bowser_set_goal_invisible", + "802b6190": "bowser_act_jump_onto_stage", + "802b6568": "bowser_act_dance", + "802b65d0": "bowser_spawn_grand_star_key", + "802b6670": "bowser_fly_back_dead", + "802b6730": "bowser_dead_bounce", + "802b67d4": "bowser_dead_wait_for_mario", + "802b6878": "bowser_dead_twirl_into_trophy", + "802b6a10": "bowser_dead_hide", + "802b6a78": "bowser_dead_not_bits_end", + "802b6bac": "bowser_dead_bits_end", + "802b6cf0": "bowser_act_dead", + "802b6e40": "bowser_tilt_platform", + "802b6ee0": "bowser_act_ride_tilting_platform", + "802b711c": "bowser_check_fallen_off_stage", + "802b71e4": "bowser_free_update", + "802b72d4": "bowser_held_update", + "802b7418": "bowser_thrown_dropped_update", + "802b75a4": "bhv_bowser_loop", + "802b7878": "bhv_bowser_init", + "802b798c": "geo_update_body_rot_from_parent", + "802b7a20": "bowser_open_eye_switch", + "802b7c64": "geo_switch_bowser_eyes", + "802b7d44": "geo_bits_bowser_coloring", + "802b7e68": "falling_bowser_plat_act_0", + "802b7ef0": "falling_bowser_plat_act_1", + "802b8024": "falling_bowser_plat_act_2", + "802b8384": "bhv_falling_bowser_platform_loop", + "802b83b0": "bowser_flame_despawn", + "802b8434": "bowser_flame_should_despawn", + "802b84ac": "bhv_flame_bowser_init", + "802b85b0": "bhv_flame_large_burning_out_init", + "802b8654": "bowser_flame_move", + "802b8734": "bhv_flame_bowser_loop", + "802b8960": "bhv_flame_moving_forward_growing_init", + "802b89ec": "bhv_flame_moving_forward_growing_loop", + "802b8b1c": "bhv_flame_floating_landing_init", + "802b8c38": "bhv_flame_floating_landing_loop", + "802b8d68": "bhv_blue_bowser_flame_init", + "802b8e7c": "bhv_blue_bowser_flame_loop", + "802b9034": "bhv_flame_bouncing_init", + "802b90ec": "bhv_flame_bouncing_loop", + "802b921c": "bhv_blue_flames_group_loop", + "802b935c": "bhv_blue_fish_movement_loop", + "802b9790": "bhv_tank_fish_group_loop", + "802b98d4": "vec3f_copy_2", + "802b98fc": "bhv_checkerboard_elevator_group_init", + "802b9a78": "checkerboard_plat_act_move_y", + "802b9af8": "checkerboard_plat_act_rotate", + "802b9bb4": "bhv_checkerboard_platform_init", + "802b9bd8": "bhv_checkerboard_platform_loop", + "802b9e94": "bhv_ddd_warp_loop", + "802b9efc": "water_level_pillar_undrained", + "802ba13c": "water_level_pillar_drained", + "802ba19c": "bhv_water_level_pillar_init", + "802ba1e0": "bhv_water_level_pillar_loop", + "802ba25c": "bhv_invisible_objects_under_bridge_init", + "802ba2b0": "geo_scale_bowser_key", + "802ba2f8": "bhv_bowser_key_unlock_door_loop", + "802ba458": "bhv_bowser_key_course_exit_loop", + "802ba5bc": "bhv_moat_grills_loop", + "802ba608": "bhv_rotating_clock_arm_loop", + "802ba7e0": "handle_hat_ukiki_reset", + "802ba868": "is_hat_ukiki_and_mario_has_hat", + "802ba8c4": "geo_update_projectile_pos_from_parent_copy", + "802ba958": "idle_ukiki_taunt", + "802bab7c": "ukiki_act_idle", + "802bae40": "ukiki_act_return_home", + "802baec4": "ukiki_act_wait_to_respawn", + "802baf10": "ukiki_act_unused_turn", + "802baf64": "ukiki_act_turn_to_mario", + "802bb07c": "ukiki_act_run", + "802bb288": "ukiki_act_jump", + "802bb3b8": "ukiki_act_go_to_cage", + "802bb798": "ukiki_free_loop", + "802bb888": "cage_ukiki_held_loop", + "802bba3c": "hat_ukiki_held_loop", + "802bbb98": "bhv_ukiki_init", + "802bbc0c": "bhv_ukiki_loop", + "802bbd6c": "lll_octagonal_mesh_move", + "802bbfd8": "lll_octagonal_mesh_find_y_offset", + "802bc0f0": "bhv_lll_moving_octagonal_mesh_platform_loop", + "802bc22c": "bhv_lll_sinking_rock_block_loop", + "802bc294": "bhv_lll_rotating_hex_flame_loop", + "802bc348": "fire_bar_spawn_flames", + "802bc4f4": "fire_bar_act_0", + "802bc538": "fire_bar_act_1", + "802bc590": "fire_bar_act_2", + "802bc5fc": "fire_bar_act_3", + "802bc618": "bhv_lll_rotating_block_fire_bars_loop", + "802bc660": "bhv_lll_wood_piece_loop", + "802bc728": "bhv_lll_floating_wood_bridge_loop", + "802bc898": "bhv_volcano_flames_loop", + "802bc934": "hexagonal_ring_spawn_flames", + "802bca74": "bhv_lll_rotating_hexagonal_ring_loop", + "802bcce8": "sinking_rectangular_plat_actions", + "802bcda8": "bhv_lll_sinking_rectangular_platform_loop", + "802bce58": "bhv_lll_sinking_square_platforms_loop", + "802bce9c": "create_transform_from_normals", + "802bcf40": "bhv_platform_normals_init", + "802bcfc4": "approach_by_increment", + "802bd058": "bhv_tilting_inverted_pyramid_loop", + "802bd3e4": "koopa_shell_spawn_water_drop", + "802bd488": "bhv_koopa_shell_flame_loop", + "802bd5dc": "bhv_koopa_shell_flame_spawn", + "802bd62c": "koopa_shell_spawn_sparkles", + "802bd680": "bhv_koopa_shell_loop", + "802bd8d0": "tox_box_shake_screen", + "802bd91c": "tox_box_move", + "802bdb04": "tox_box_act_4", + "802bdb3c": "tox_box_act_5", + "802bdb74": "tox_box_act_6", + "802bdbac": "tox_box_act_7", + "802bdbe4": "tox_box_act_1", + "802bdc7c": "tox_box_act_2", + "802bdcc8": "tox_box_act_3", + "802bdd14": "tox_box_act_0", + "802bdd68": "bhv_tox_box_loop", + "802bdd9c": "piranha_plant_act_idle", + "802bde10": "piranha_plant_check_interactions", + "802bdeec": "piranha_plant_act_sleeping", + "802be034": "piranha_plant_act_woken_up", + "802be0b8": "piranha_plant_reset_when_far", + "802be0ec": "piranha_plant_attacked", + "802be150": "piranha_plant_act_shrink_and_die", + "802be234": "piranha_plant_act_wait_to_respawn", + "802be278": "piranha_plant_act_respawn", + "802be350": "piranha_plant_act_biting", + "802be49c": "mario_moving_fast_enough_to_make_piranha_plant_bite", + "802be50c": "piranha_plant_act_stopped_biting", + "802be5a0": "bhv_piranha_plant_loop", + "802be628": "bhv_lll_bowser_puzzle_spawn_piece", + "802be6d4": "bhv_lll_bowser_puzzle_spawn_pieces", + "802be79c": "bhv_lll_bowser_puzzle_loop", + "802be8a8": "bhv_lll_bowser_puzzle_piece_action_0", + "802be8b8": "bhv_lll_bowser_puzzle_piece_action_1", + "802be8f4": "bhv_lll_bowser_puzzle_piece_update", + "802be9dc": "bhv_lll_bowser_puzzle_piece_move", + "802beb14": "bhv_lll_bowser_puzzle_piece_idle", + "802beb54": "bhv_lll_bowser_puzzle_piece_move_left", + "802beb8c": "bhv_lll_bowser_puzzle_piece_move_right", + "802bebc4": "bhv_lll_bowser_puzzle_piece_move_up", + "802bebfc": "bhv_lll_bowser_puzzle_piece_move_down", + "802bec34": "bhv_lll_bowser_puzzle_piece_loop", + "802becb0": "set_obj_anim_with_accel_and_sound", + "802bed7c": "play_penguin_walking_sound", + "802bedec": "tuxies_mother_act_2", + "802bef8c": "tuxies_mother_act_1", + "802bf1d8": "tuxies_mother_act_0", + "802bf3c0": "bhv_tuxies_mother_loop", + "802bf424": "small_penguin_dive_with_mario", + "802bf474": "small_penguin_act_2", + "802bf57c": "small_penguin_act_1", + "802bf648": "small_penguin_act_3", + "802bf6e4": "small_penguin_act_4", + "802bf760": "small_penguin_act_0", + "802bf90c": "small_penguin_act_5", + "802bfa14": "small_penguin_free_actions", + "802bfa88": "bhv_small_penguin_loop", + "802bfbac": "geo_switch_tuxie_mother_eyes", + "802bfcd8": "fish_act_spawn", + "802bfeb8": "fish_act_respawn", + "802bff20": "fish_act_init", + "802bff3c": "bhv_large_fish_group_loop", + "802bff68": "fish_regroup", + "802c00b4": "fish_group_act_rotation", + "802c0348": "fish_group_act_move", + "802c06a8": "fish_group_act_animate", + "802c0768": "bhv_fish_loop", + "802c08a8": "bhv_wdw_express_elevator_loop", + "802c0aac": "bub_spawner_act_0", + "802c0b50": "bub_spawner_act_1", + "802c0ba4": "bub_spawner_act_2", + "802c0bc4": "bub_spawner_act_3", + "802c0be0": "bhv_bub_spawner_loop", + "802c0c0c": "bub_move_vertically", + "802c0cd4": "bub_act_0", + "802c0d44": "bub_act_1", + "802c0f90": "bub_act_2", + "802c1204": "bhv_bub_loop", + "802c12c0": "bhv_rotating_exclamation_box_loop", + "802c1308": "exclamation_box_act_0", + "802c13ec": "exclamation_box_act_1", + "802c14b0": "exclamation_box_act_2", + "802c15b8": "exclamation_box_act_3", + "802c17bc": "exclamation_box_spawn_contents", + "802c18d0": "exclamation_box_act_4", + "802c1988": "exclamation_box_act_5", + "802c19c0": "bhv_exclamation_box_loop", + "802c19fc": "bhv_sound_spawner_init", + "802c1a40": "bhv_bowsers_sub_loop", + "802c1a80": "bhv_sushi_shark_collision_loop", + "802c1a90": "bhv_sushi_shark_loop", + "802c1c44": "bhv_sunken_ship_part_loop", + "802c1cd4": "bhv_ship_part_3_loop", + "802c1e10": "bhv_jrb_sliding_box_loop", + "802c2190": "bhv_white_puff_1_loop", + "802c2274": "bhv_white_puff_2_loop", + "802c22b8": "bhv_hidden_blue_coin_loop", + "802c242c": "bhv_blue_coin_switch_loop", + "802c263c": "bhv_openable_cage_door_loop", + "802c26f8": "bhv_openable_grill_loop", + "802c2930": "bhv_init_changing_water_level_loop", + "802c2a24": "bhv_water_level_diamond_loop", + "802c2ce8": "tweester_scale_and_move", + "802c2ebc": "tweester_act_idle", + "802c2fbc": "tweester_act_chase", + "802c31c4": "tweester_act_hide", + "802c329c": "bhv_tweester_loop", + "802c32e8": "bhv_tweester_sand_particle_loop", + "802c3440": "bhv_boo_init", + "802c3684": "bhv_courtyard_boo_triplet_init", + "802c4824": "bhv_boo_loop", + "802c4f30": "bhv_big_boo_loop", + "802c515c": "bhv_boo_with_cage_init", + "802c51d4": "bhv_boo_with_cage_loop", + "802c5224": "bhv_merry_go_round_boo_manager_loop", + "802c53cc": "obj_set_secondary_camera_focus", + "802c53ec": "bhv_animated_texture_loop", + "802c5414": "bhv_boo_in_castle_loop", + "802c5688": "bhv_boo_boss_spawned_bridge_loop", + "802c5890": "bhv_bbh_tilting_trap_platform_loop", + "802c5a38": "bhv_haunted_bookshelf_loop", + "802c5ca8": "bhv_merry_go_round_loop", + "802c5dc0": "bhv_static_checkered_platform_loop", + "802c5f48": "bhv_beta_bowser_anchor_loop", + "802c5fdc": "bhv_play_music_track_when_touched_loop", + "802c6050": "bhv_floor_trap_in_castle_loop", + "802c60ac": "bhv_castle_floor_trap_init", + "802c6150": "bhv_castle_floor_trap_open_detect", + "802c61d4": "bhv_castle_floor_trap_open", + "802c6278": "bhv_castle_floor_trap_close_detect", + "802c62bc": "bhv_castle_floor_trap_close", + "802c6328": "bhv_castle_floor_trap_rotate", + "802c6348": "bhv_castle_floor_trap_loop", + "802c63e8": "bhv_pole_base_loop", + "802c64a4": "bhv_sparkle_spawn_loop", + "802c6538": "update_angle_from_move_flags", + "802c65c0": "bhv_scuttlebug_loop", + "802c6b6c": "bhv_scuttlebug_spawn_loop", + "802c6ca0": "whomp_play_sfx_from_pound_animation", + "802c6d6c": "whomp_act_0", + "802c6ec8": "whomp_act_7", + "802c6fb0": "whomp_act_1", + "802c710c": "whomp_act_2", + "802c7254": "whomp_act_3", + "802c72b4": "whomp_act_4", + "802c7380": "whomp_act_5", + "802c7428": "king_whomp_on_ground", + "802c75fc": "whomp_on_ground", + "802c76d4": "whomp_act_6", + "802c7858": "whomp_act_8", + "802c7998": "whomp_act_9", + "802c79d8": "bhv_whomp_loop", + "802c7a70": "bhv_water_splash_spawn_droplets", + "802c7b14": "bhv_water_droplet_loop", + "802c7cac": "bhv_idle_water_wave_loop", + "802c7d40": "bhv_water_droplet_splash_init", + "802c7d90": "bhv_bubble_splash_init", + "802c7dfc": "bhv_shallow_water_splash_init", + "802c7e5c": "bhv_wave_trail_shrink", + "802c7f98": "bhv_strong_wind_particle_loop", + "802c81b4": "cur_obj_spawn_strong_wind_particles", + "802c834c": "bhv_sl_snowman_wind_loop", + "802c863c": "bhv_sl_walking_penguin_loop", + "802c89f0": "update_mario_platform", + "802c8b4c": "get_mario_pos", + "802c8b8c": "set_mario_pos", + "802c8bc8": "apply_platform_displacement", + "802c8ec0": "apply_mario_platform_displacement", + "802c8f28": "clear_mario_platform", + "802c8f40": "debug_print_obj_collision", + "802c8fe4": "detect_object_hitbox_overlap", + "802c91ec": "detect_object_hurtbox_overlap", + "802c9388": "clear_object_collision", + "802c93f8": "check_collision_in_list", + "802c94ac": "check_player_object_collision", + "802c95b4": "check_pushable_object_collision", + "802c9630": "check_destructive_object_collision", + "802c9724": "detect_object_collisions", + "802c97d0": "unused_init_free_list", + "802c9840": "unused_try_allocate", + "802c98a4": "try_allocate_object", + "802c9950": "unused_deallocate", + "802c99b8": "init_free_object_list", + "802c9a3c": "clear_object_lists", + "802c9b68": "unload_object", + "802c9c00": "allocate_object", + "802c9f04": "create_object", + "802ca028": "mark_obj_for_deletion", + "802ca040": "exec_anim_sound_state", + "802ca144": "create_sound_spawner", + "802ca190": "cur_obj_play_sound_1", + "802ca1e0": "cur_obj_play_sound_2", + "802ca230": "calc_dist_to_volume_range_1", + "802ca2d4": "calc_dist_to_volume_range_2", + "802ca370": "stub_debug_1", + "802ca380": "stub_debug_2", + "802ca390": "stub_debug_3", + "802ca3a0": "stub_debug_4", + "802ca3b0": "get_current_clock", + "802ca3e0": "get_clock_difference", + "802ca418": "set_print_state_info", + "802ca460": "print_text_array_info", + "802ca51c": "set_text_array_x_y", + "802ca568": "print_debug_bottom_up", + "802ca5b8": "print_debug_top_down_objectinfo", + "802ca618": "print_debug_top_down_mapinfo", + "802ca680": "print_debug_top_down_normal", + "802ca6d0": "print_mapinfo", + "802ca8e8": "print_checkinfo", + "802ca918": "print_surfaceinfo", + "802ca94c": "print_stageinfo", + "802ca990": "print_string_array_info", + "802caa6c": "print_effectinfo", + "802caaa8": "print_enemyinfo", + "802caae4": "update_debug_dpadmask", + "802cabac": "debug_unknown_level_select_check", + "802cac20": "reset_debug_objectinfo", + "802cb0b0": "stub_debug_5", + "802cb0c0": "try_print_debug_mario_object_info", + "802cb1c0": "try_print_debug_mario_level_info", + "802cb264": "try_do_mario_debug_object_spawn", + "802cb564": "debug_enemy_unknown", + "802cb5c0": "set_and_reset_transition_fade_timer", + "802cb640": "set_transition_color_fade_alpha", + "802cb894": "vertex_transition_color", + "802cba18": "dl_transition_color", + "802cbbc4": "render_fade_transition_from_color", + "802cbc20": "render_fade_transition_into_color", + "802cbc7c": "calc_tex_transition_radius", + "802cbd54": "calc_tex_transition_time", + "802cbe64": "convert_tex_transition_angle_to_pos", + "802cbee0": "center_tex_transition_x", + "802cbf64": "center_tex_transition_y", + "802cbfe8": "make_tex_transition_vertex", + "802cc180": "load_tex_transition_vertex", + "802cc4d8": "render_textured_transition", + "802ccbe8": "render_screen_transition", + "802ccdc8": "render_cannon_circle_base", + "802cd1e8": "geo_cannon_circle_base", + "802cd280": "rotate_rectangle", + "802cd328": "atan2_deg", + "802cd388": "scale_shadow_with_distance", + "802cd444": "disable_shadow_with_distance", + "802cd48c": "dim_shadow_with_distance", + "802cd614": "get_water_level_below_shadow", + "802cd6c4": "init_shadow", + "802cd938": "get_texture_coords_9_vertices", + "802cd988": "get_texture_coords_4_vertices", + "802cd9ec": "make_shadow_vertex_at_xyz", + "802cdb20": "extrapolate_vertex_y_position", + "802cdb74": "get_vertex_coords", + "802cdc40": "calculate_vertex_xyz", + "802cde94": "floor_local_tilt", + "802cdf3c": "make_shadow_vertex", + "802ce128": "add_shadow_to_display_list", + "802ce2bc": "linearly_interpolate_solidity_positive", + "802ce3ec": "linearly_interpolate_solidity_negative", + "802ce524": "correct_shadow_solidity_for_animations", + "802ce690": "correct_lava_shadow_height", + "802ce79c": "create_shadow_player", + "802ce9d0": "create_shadow_circle_9_verts", + "802ceae8": "create_shadow_circle_4_verts", + "802cec04": "create_shadow_circle_assuming_flat_ground", + "802cedc0": "create_shadow_rectangle", + "802cef6c": "get_shadow_height_solidity", + "802cf080": "create_shadow_square", + "802cf1f0": "create_shadow_hardcoded_rectangle", + "802cf34c": "create_shadow_below_xyz", + "802cf5b0": "calculate_skybox_scaled_x", + "802cf69c": "calculate_skybox_scaled_y", + "802cf804": "make_skybox_rect", + "802cfa2c": "draw_skybox_tile_grid", + "802cfc68": "create_skybox_ortho_matrix", + "802cfd88": "init_skybox_display_list", + "802cfef4": "create_skybox_facing_camera", + "802d0080": "geo_wdw_set_initial_water_level", + "802d01e0": "geo_movtex_pause_control", + "802d0254": "movtex_make_quad_vertex", + "802d0484": "movtex_gen_from_quad", + "802d0a84": "movtex_gen_from_quad_array", + "802d0bb0": "movtex_gen_quads_id", + "802d0c84": "get_quad_collection_from_id", + "802d0f28": "movtex_change_texture_format", + "802d104c": "geo_movtex_draw_water_regions", + "802d1330": "update_moving_texture_offset", + "802d13cc": "movtex_write_vertex_first", + "802d1574": "movtex_write_vertex_index", + "802d18b4": "movtex_gen_list", + "802d1b70": "geo_movtex_draw_nocolor", + "802d1cdc": "geo_movtex_draw_colored", + "802d1e48": "geo_movtex_draw_colored_no_update", + "802d1fa8": "geo_movtex_draw_colored_2_no_update", + "802d2108": "geo_movtex_update_horizontal", + "802d2210": "make_vertex", + "802d22c4": "round_float", + "802d2360": "geo_exec_inside_castle_light", + "802d2470": "geo_exec_flying_carpet_timer_update", + "802d2520": "geo_exec_flying_carpet_create", + "802d28cc": "geo_exec_cake_end_screen", + "802d29c0": "stop_other_paintings", + "802d2a74": "painting_mario_y", + "802d2b08": "painting_mario_z", + "802d2b84": "painting_ripple_y", + "802d2c40": "painting_nearest_4th", + "802d2d80": "painting_mario_x", + "802d2dfc": "painting_ripple_x", + "802d2eb8": "painting_state", + "802d2ffc": "wall_painting_proximity_idle", + "802d319c": "wall_painting_proximity_rippling", + "802d327c": "wall_painting_continuous_idle", + "802d341c": "wall_painting_continuous_rippling", + "802d34fc": "floor_painting_proximity_idle", + "802d36ac": "floor_painting_proximity_rippling", + "802d379c": "floor_painting_continuous_idle", + "802d393c": "floor_painting_continuous_rippling", + "802d3a2c": "painting_update_floors", + "802d3bec": "painting_update_ripple_state", + "802d3cec": "calculate_ripple_at_point", + "802d3e6c": "ripple_if_movable", + "802d3ee4": "painting_generate_mesh", + "802d404c": "painting_calculate_triangle_normals", + "802d43f8": "normalize_component", + "802d44bc": "painting_average_vertex_normals", + "802d47d0": "render_painting", + "802d4edc": "painting_model_view_transform", + "802d50dc": "painting_ripple_image", + "802d5354": "painting_ripple_env_mapped", + "802d556c": "display_painting_rippling", + "802d568c": "display_painting_not_rippling", + "802d5778": "reset_painting", + "802d57a8": "move_ddd_painting", + "802d58e4": "set_painting_layer", + "802d593c": "display_painting", + "802d59a8": "wall_painting_update", + "802d5aa0": "floor_painting_update", + "802d5b98": "geo_painting_draw", + "802d5d0c": "geo_painting_update", + "802d5e00": "int_pow", + "802d5e54": "format_integer", + "802d6144": "parse_width_field", + "802d62d8": "print_text_fmt_int", + "802d6554": "print_text", + "802d66c0": "print_text_centered", + "802d6858": "char_to_glyph_index", + "802d69f8": "add_glyph_texture", + "802d6acc": "clip_to_bounds", + "802d6b3c": "render_textrect", + "802d6c88": "render_text_labels", + "802d6f20": "create_dl_identity_matrix", + "802d7070": "create_dl_translation_matrix", + "802d7174": "create_dl_rotation_matrix", + "802d7280": "create_dl_scale_matrix", + "802d7384": "create_dl_ortho_matrix", + "802d75dc": "render_generic_char", + "802d76c8": "render_multi_text_string", + "802d77dc": "print_generic_string", + "802d7b84": "print_hud_lut_string", + "802d7e88": "print_menu_generic_string", + "802d82d4": "print_credits_string", + "802d862c": "handle_menu_scrolling", + "802d8844": "get_str_x_pos_from_center", + "802d8934": "get_string_width", + "802d89b8": "print_hud_my_score_coins", + "802d8a80": "print_hud_my_score_stars", + "802d8b34": "int_to_str", + "802d8c6c": "get_dialog_id", + "802d8c88": "create_dialog_box", + "802d8cc4": "create_dialog_box_with_var", + "802d8d08": "create_dialog_inverted_box", + "802d8d48": "create_dialog_box_with_response", + "802d8d90": "reset_dialog_render_state", + "802d8e2c": "render_dialog_box_type", + "802d9148": "change_and_flash_dialog_text_color_lines", + "802d9388": "handle_dialog_scroll_page_state", + "802d944c": "render_star_count_dialog_text", + "802d9634": "render_multi_text_string_lines", + "802d9800": "ensure_nonnegative", + "802d982c": "handle_dialog_text_and_pages", + "802d9cb0": "render_dialog_triangle_choice", + "802d9dfc": "render_dialog_string_color", + "802d9f84": "handle_special_dialog_text", + "802da1ac": "render_dialog_entries", + "802da810": "set_menu_mode", + "802da844": "reset_cutscene_msg_fade", + "802da85c": "dl_rgba16_begin_cutscene_msg_fade", + "802da8e4": "dl_rgba16_stop_cutscene_msg_fade", + "802da964": "ascii_to_credits_char", + "802daa34": "print_credits_str_ascii", + "802daae4": "set_cutscene_message", + "802dab58": "do_cutscene_handler", + "802dad54": "print_peach_letter_message", + "802db08c": "render_hud_cannon_reticle", + "802db350": "reset_red_coins_collected", + "802db368": "change_dialog_camera_angle", + "802db3b8": "shade_screen", + "802db498": "print_animated_red_coin", + "802db6e8": "render_pause_red_coins", + "802db760": "render_pause_my_score_coins", + "802dbb24": "render_pause_camera_options", + "802dbe68": "render_pause_course_options", + "802dc15c": "render_pause_castle_menu_box", + "802dc418": "highlight_last_course_complete_stars", + "802dc478": "print_hud_pause_colorful_str", + "802dc570": "render_pause_castle_course_stars", + "802dc718": "render_pause_castle_main_strings", + "802dca88": "render_pause_courses_and_castle", + "802dcd04": "print_hud_course_complete_string", + "802dcf30": "print_hud_course_complete_coins", + "802dd194": "play_star_fanfare_and_flash_hud", + "802dd210": "render_course_complete_lvl_info_and_hud_str", + "802dd838": "render_save_confirmation", + "802ddae0": "render_course_complete_screen", + "802ddca4": "render_menus_and_dialogs", + "802dddf0": "envfx_init_snow", + "802ddf38": "envfx_update_snowflake_count", + "802de0bc": "envfx_cleanup_snow", + "802de114": "orbit_from_positions", + "802de23c": "pos_from_orbit", + "802de360": "envfx_is_snowflake_alive", + "802de458": "envfx_update_snow_normal", + "802de888": "envfx_update_snow_blizzard", + "802ded38": "envfx_update_snow_water", + "802def2c": "rotate_triangle_vertices", + "802df334": "append_snowflake_vertex_buffer", + "802df748": "envfx_update_snow", + "802dfbc8": "envfx_update_particles", + "802dfd50": "particle_is_laterally_close", + "802dfe00": "random_flower_offset", + "802dfe80": "envfx_update_flower", + "802e0120": "envfx_set_lava_bubble_position", + "802e048c": "envfx_update_lava", + "802e065c": "envfx_rotate_around_whirlpool", + "802e08a8": "envfx_is_whirlpool_bubble_alive", + "802e0934": "envfx_update_whirlpool", + "802e0e24": "envfx_is_jestream_bubble_alive", + "802e0eb8": "envfx_update_jetstream", + "802e1238": "envfx_init_bubble", + "802e1414": "envfx_bubbles_update_switch", + "802e1618": "append_bubble_vertex_buffer", + "802e1a20": "envfx_set_bubble_texture", + "802e1bb8": "envfx_update_bubble_particles", + "802e1ed8": "envfx_set_max_bubble_particles", + "802e1f48": "envfx_update_bubbles", + "802e20a0": "convert_rotation", + "802e2134": "spawn_macro_abs_yrot_2params", + "802e21dc": "spawn_macro_abs_yrot_param1", + "802e2284": "spawn_macro_abs_special", + "802e2414": "spawn_macro_objects", + "802e2690": "spawn_macro_objects_hardcoded", + "802e28ec": "spawn_special_objects", + "802e2cf0": "render_hud_tex_lut", + "802e2e58": "render_hud_small_tex_lut", + "802e30b4": "render_power_meter_health_segment", + "802e3214": "render_dl_power_meter", + "802e33b8": "animate_power_meter_emphasized", + "802e352c": "handle_power_meter_actions", + "802e3654": "render_hud_power_meter", + "802e3744": "render_hud_mario_lives", + "802e37a8": "render_hud_coins", + "802e380c": "render_hud_stars", + "802e38e4": "render_hud_keys", + "802e395c": "render_hud_timer", + "802e3b1c": "set_hud_camera_status", + "802e3b3c": "render_hud_camera_status", + "802e3d2c": "render_hud", + "802e3e50": "set_yoshi_as_not_dead", + "802e3e68": "geo_obj_transparency_something", + "802e3f68": "absf_2", + "802e3fac": "turn_obj_away_from_surface", + "802e405c": "obj_find_wall", + "802e41a4": "turn_obj_away_from_steep_floor", + "802e42e0": "obj_orient_graph", + "802e43e4": "calc_obj_friction", + "802e445c": "calc_new_obj_vel_and_pos_y", + "802e4814": "calc_new_obj_vel_and_pos_y_underwater", + "802e4cec": "obj_update_pos_vel_xz", + "802e4d88": "obj_splash", + "802e4e90": "object_step", + "802e5114": "object_step_without_floor_orient", + "802e5160": "obj_move_xyz_using_fvel_and_yaw", + "802e5208": "is_point_within_radius_of_mario", + "802e52b8": "is_point_close_to_object", + "802e5360": "set_object_visibility", + "802e53f4": "obj_return_home_if_safe", + "802e54b0": "obj_return_and_displace_home", + "802e55d0": "obj_check_if_facing_toward_angle", + "802e569c": "obj_find_wall_displacement", + "802e5760": "obj_spawn_yellow_coins", + "802e5824": "obj_flicker_and_disappear", + "802e58b4": "current_mario_room_check", + "802e5948": "trigger_obj_dialog_when_facing", + "802e5a80": "obj_check_floor_death", + "802e5b18": "obj_lava_death", + "802e5c6c": "spawn_orange_number", + "802e5d04": "debug_sequence_tracker", + "802e5de8": "coin_step", + "802e5e6c": "moving_coin_flicker", + "802e5ea4": "coin_collected", + "802e5ee8": "bhv_moving_yellow_coin_init", + "802e5f64": "bhv_moving_yellow_coin_loop", + "802e6098": "bhv_moving_blue_coin_init", + "802e6114": "bhv_moving_blue_coin_loop", + "802e62a4": "bhv_blue_coin_sliding_jumping_init", + "802e631c": "blue_coin_sliding_away_from_mario", + "802e63ec": "blue_coin_sliding_slow_down", + "802e6474": "bhv_blue_coin_sliding_loop", + "802e6628": "bhv_blue_coin_jumping_loop", + "802e6790": "bhv_seaweed_init", + "802e67dc": "bhv_seaweed_bundle_init", + "802e6a2c": "bhv_bobomb_init", + "802e6a8c": "bobomb_spawn_coin", + "802e6af8": "bobomb_act_explode", + "802e6bd4": "bobomb_check_interactions", + "802e6cf0": "bobomb_act_patrol", + "802e6dc8": "bobomb_act_chase_mario", + "802e6e84": "bobomb_act_launched", + "802e6ed8": "generic_bobomb_free_loop", + "802e7020": "stationary_bobomb_free_loop", + "802e7134": "bobomb_free_loop", + "802e7180": "bobomb_held_loop", + "802e7220": "bobomb_dropped_loop", + "802e7280": "bobomb_thrown_loop", + "802e7324": "curr_obj_random_blink", + "802e742c": "bhv_bobomb_loop", + "802e75a0": "bhv_bobomb_fuse_smoke_init", + "802e76ac": "bhv_bobomb_buddy_init", + "802e770c": "bobomb_buddy_act_idle", + "802e7814": "bobomb_buddy_cannon_dialog", + "802e79dc": "bobomb_buddy_act_talk", + "802e7b00": "bobomb_buddy_act_turn_to_talk", + "802e7bb0": "bobomb_buddy_actions", + "802e7c4c": "bhv_bobomb_buddy_loop", + "802e7c90": "bhv_cannon_closed_init", + "802e7d4c": "cannon_door_act_opening", + "802e7e54": "bhv_cannon_closed_loop", + "802e7f70": "bhv_whirlpool_init", + "802e7fb8": "whirlpool_set_hitbox", + "802e7fec": "whirpool_orient_graph", + "802e80dc": "bhv_whirlpool_loop", + "802e82b0": "bhv_jet_stream_loop", + "802e8388": "bhv_homing_amp_init", + "802e89d4": "bhv_homing_amp_loop", + "802e8ae4": "bhv_circling_amp_init", + "802e8ecc": "bhv_circling_amp_loop", + "802e8f68": "bhv_butterfly_init", + "802e9018": "butterfly_step", + "802e9278": "butterfly_calculate_angle", + "802e9470": "butterfly_act_rest", + "802e94e4": "butterfly_act_follow_mario", + "802e9548": "butterfly_act_return_home", + "802e96c8": "bhv_butterfly_loop", + "802e9764": "bhv_hoot_init", + "802e97fc": "hoot_find_next_floor", + "802e98c0": "hoot_floor_bounce", + "802e9a4c": "hoot_free_step", + "802e9cf4": "hoot_player_set_yaw", + "802e9d98": "hoot_carry_step", + "802e9f60": "hoot_surface_collision", + "802ea144": "hoot_act_ascent", + "802ea258": "hoot_action_loop", + "802ea3f0": "hoot_turn_to_home", + "802ea4ec": "hoot_awake_loop", + "802ea588": "bhv_hoot_loop", + "802ea6a8": "bhv_beta_holdable_object_init", + "802ea7e0": "bhv_beta_holdable_object_loop", + "802ea888": "bhv_object_bubble_init", + "802ea934": "bhv_object_bubble_loop", + "802eaa10": "bhv_object_water_wave_init", + "802eaa50": "bhv_object_water_wave_loop", + "802eaa8c": "bhv_explosion_init", + "802eaad0": "bhv_explosion_loop", + "802eabf0": "bhv_bobomb_bully_death_smoke_init", + "802eac3c": "bhv_bobomb_explosion_bubble_init", + "802ead3c": "bhv_bobomb_explosion_bubble_loop", + "802eaef8": "bhv_respawner_loop", + "802eaf84": "create_respawner", + "802eb05c": "bhv_small_bully_init", + "802eb104": "bhv_big_bully_init", + "802eb1c0": "bully_check_mario_collision", + "802eb288": "bully_act_chase_mario", + "802eb3f0": "bully_act_knockback", + "802eb510": "bully_act_back_up", + "802eb5c4": "bully_backup_check", + "802eb630": "bully_play_stomping_sound", + "802eb744": "bully_step", + "802eb7e0": "bully_spawn_coin", + "802eb8b0": "bully_act_level_death", + "802eb9d0": "bhv_bully_loop", + "802ebb74": "big_bully_spawn_minion", + "802ebc00": "bhv_big_bully_with_minions_init", + "802ebc88": "big_bully_spawn_star", + "802ebce0": "bhv_big_bully_with_minions_loop", + "802ebf70": "water_ring_calc_mario_dist", + "802ec030": "water_ring_init", + "802ec1b0": "bhv_jet_stream_water_ring_init", + "802ec200": "water_ring_check_collection", + "802ec3d0": "water_ring_set_scale", + "802ec4e0": "water_ring_act_collected", + "802ec59c": "water_ring_act_not_collected", + "802ec75c": "bhv_jet_stream_water_ring_loop", + "802ec7cc": "spawn_manta_ray_ring_manager", + "802ec818": "water_ring_spawner_act_inactive", + "802ec908": "bhv_jet_stream_ring_spawner_loop", + "802ec9b8": "bhv_manta_ray_water_ring_init", + "802ec9f0": "manta_water_ring_act_not_collected", + "802ecba4": "bhv_manta_ray_water_ring_loop", + "802ecc14": "bhv_bowser_bomb_loop", + "802ecd0c": "bhv_bowser_bomb_explosion_loop", + "802ecea0": "bhv_bowser_bomb_smoke_loop", + "802ecfac": "bhv_celebration_star_init", + "802ed10c": "celeb_star_act_spin_around_mario", + "802ed28c": "celeb_star_act_face_camera", + "802ed39c": "bhv_celebration_star_loop", + "802ed40c": "bhv_celebration_star_sparkle_loop", + "802ed45c": "bhv_star_key_collection_puff_spawner_loop", + "802ed498": "bhv_lll_drawbridge_spawner_loop", + "802ed62c": "bhv_lll_drawbridge_loop", + "802ed78c": "bhv_small_bomp_init", + "802ed7fc": "bhv_small_bomp_loop", + "802edacc": "bhv_large_bomp_init", + "802edb2c": "bhv_large_bomp_loop", + "802eddfc": "bhv_wf_sliding_platform_init", + "802edf28": "bhv_wf_sliding_platform_loop", + "802ee124": "bhv_moneybag_init", + "802ee1a0": "moneybag_check_mario_collision", + "802ee268": "moneybag_jump", + "802ee46c": "moneybag_act_move_around", + "802ee598": "moneybag_act_return_home", + "802ee728": "moneybag_act_disappear", + "802ee778": "moneybag_act_death", + "802ee7e0": "bhv_moneybag_loop", + "802ee8f4": "bhv_moneybag_hidden_loop", + "802ee9cc": "bhv_bowling_ball_init", + "802eea24": "bowling_ball_set_hitbox", + "802eea7c": "bowling_ball_set_waypoints", + "802eeb64": "bhv_bowling_ball_roll_loop", + "802eecb8": "bhv_bowling_ball_initializeLoop", + "802eedf0": "bhv_bowling_ball_loop", + "802eeeb4": "bhv_generic_bowling_ball_spawner_init", + "802eef9c": "bhv_generic_bowling_ball_spawner_loop", + "802ef0e8": "bhv_thi_bowling_ball_spawner_loop", + "802ef21c": "bhv_bob_pit_bowling_ball_init", + "802ef274": "bhv_bob_pit_bowling_ball_loop", + "802ef34c": "bhv_free_bowling_ball_init", + "802ef3f4": "bhv_free_bowling_ball_roll_loop", + "802ef524": "bhv_free_bowling_ball_loop", + "802ef63c": "bhv_rr_cruiser_wing_init", + "802ef66c": "bhv_rr_cruiser_wing_loop", + "802ef820": "bhv_spindel_init", + "802ef858": "bhv_spindel_loop", + "802efcd0": "bhv_ssl_moving_pyramid_wall_init", + "802efd8c": "bhv_ssl_moving_pyramid_wall_loop", + "802efe64": "bhv_pyramid_elevator_init", + "802efef4": "bhv_pyramid_elevator_loop", + "802f0104": "bhv_pyramid_elevator_trajectory_marker_ball_loop", + "802f0168": "bhv_pyramid_top_init", + "802f0288": "bhv_pyramid_top_spinning", + "802f04a0": "bhv_pyramid_top_explode", + "802f05b4": "bhv_pyramid_top_loop", + "802f06a8": "bhv_pyramid_top_fragment_init", + "802f0714": "bhv_pyramid_top_fragment_loop", + "802f0788": "bhv_pyramid_pillar_touch_detector_loop", + "802f07f4": "bhv_waterfall_sound_loop", + "802f0820": "bhv_volcano_sound_loop", + "802f084c": "bhv_castle_flag_init", + "802f0898": "bhv_birds_sound_loop", + "802f0950": "bhv_ambient_sounds_init", + "802f09a4": "bhv_sand_sound_loop", + "802f09f0": "bhv_castle_cannon_grate_init", + "802f0a40": "bhv_snowmans_bottom_init", + "802f0b7c": "set_rolling_sphere_hitbox", + "802f0bd4": "adjust_rolling_face_pitch", + "802f0c94": "snowmans_bottom_act_1", + "802f0df0": "snowmans_bottom_act_2", + "802f0fa8": "snowmans_bottom_act_3", + "802f105c": "bhv_snowmans_bottom_loop", + "802f120c": "bhv_snowmans_head_init", + "802f1370": "bhv_snowmans_head_loop", + "802f151c": "bhv_snowmans_body_checkpoint_loop", + "802f15a8": "bhv_big_boulder_init", + "802f162c": "boulder_act_1", + "802f1714": "bhv_big_boulder_loop", + "802f17f0": "bhv_big_boulder_generator_loop", + "802f1954": "cap_set_hitbox", + "802f19c8": "cap_despawn", + "802f1a10": "cap_check_quicksand", + "802f1bb8": "cap_sink_quicksand", + "802f1d64": "bhv_wing_cap_init", + "802f1dc0": "cap_scale_vertically", + "802f1e5c": "wing_vanish_cap_act_0", + "802f1f3c": "bhv_wing_vanish_cap_loop", + "802f1fd0": "bhv_metal_cap_init", + "802f2030": "metal_cap_act_0", + "802f20ac": "bhv_metal_cap_loop", + "802f2140": "bhv_normal_cap_init", + "802f21e0": "normal_cap_set_save_flags", + "802f2284": "normal_cap_act_0", + "802f23a8": "bhv_normal_cap_loop", + "802f2498": "bhv_vanish_cap_init", + "802f24f4": "bhv_collect_star_init", + "802f25b0": "bhv_collect_star_loop", + "802f2614": "bhv_star_spawn_init", + "802f2768": "bhv_star_spawn_loop", + "802f2aa0": "spawn_star", + "802f2b88": "spawn_default_star", + "802f2bd4": "spawn_red_coin_cutscene_star", + "802f2c24": "spawn_no_exit_star", + "802f2c84": "bhv_hidden_red_coin_star_init", + "802f2d8c": "bhv_hidden_red_coin_star_loop", + "802f2e6c": "bhv_red_coin_init", + "802f2f2c": "bhv_red_coin_loop", + "802f3014": "bhv_hidden_star_init", + "802f30f0": "bhv_hidden_star_loop", + "802f31bc": "bhv_hidden_star_trigger_loop", + "802f328c": "bhv_bowser_course_red_coin_star_loop", + "802f336c": "bhv_ttm_rolling_log_init", + "802f341c": "rolling_log_roll_log", + "802f36a4": "bhv_rolling_log_loop", + "802f38b0": "volcano_act_1", + "802f39b4": "volcano_act_3", + "802f3a30": "bhv_volcano_trap_loop", + "802f3b98": "bhv_lll_rolling_log_init", + "802f3c54": "bhv_1up_interact", + "802f3cc8": "bhv_1up_common_init", + "802f3d30": "bhv_1up_init", + "802f3dd0": "one_up_loop_in_air", + "802f3ea8": "pole_1up_move_towards_mario", + "802f401c": "one_up_move_away_from_mario", + "802f40cc": "bhv_1up_walking_loop", + "802f4248": "bhv_1up_running_away_loop", + "802f43b8": "sliding_1up_move", + "802f44c0": "bhv_1up_sliding_loop", + "802f45b8": "bhv_1up_loop", + "802f45f0": "bhv_1up_jump_on_approach_loop", + "802f4710": "bhv_1up_hidden_loop", + "802f48f4": "bhv_1up_hidden_trigger_loop", + "802f496c": "bhv_1up_hidden_in_pole_loop", + "802f4b00": "bhv_1up_hidden_in_pole_trigger_loop", + "802f4b78": "bhv_1up_hidden_in_pole_spawner_loop", + "802f4c68": "controllable_platform_act_1", + "802f4ce0": "controllable_platform_act_2", + "802f4d78": "bhv_controllable_platform_sub_loop", + "802f4eb4": "bhv_controllable_platform_init", + "802f5010": "controllable_platform_hit_wall", + "802f5068": "controllable_platform_check_walls", + "802f52c0": "controllable_platform_shake_on_wall_hit", + "802f547c": "controllable_platform_tilt_from_mario", + "802f55a4": "bhv_controllable_platform_loop", + "802f5cd4": "bhv_breakable_box_small_init", + "802f5d78": "small_breakable_box_spawn_dust", + "802f5e44": "small_breakable_box_act_move", + "802f5f48": "breakable_box_small_released_loop", + "802f6014": "breakable_box_small_idle_loop", + "802f60d8": "breakable_box_small_get_dropped", + "802f6150": "breakable_box_small_get_thrown", + "802f6228": "bhv_breakable_box_small_loop", + "802f62e4": "bhv_sliding_snow_mound_loop", + "802f6448": "bhv_snow_mound_spawn_loop", + "802f6588": "floating_platform_find_home_y", + "802f665c": "floating_platform_act_0", + "802f6984": "bhv_floating_platform_loop", + "802f6c0c": "bhv_arrow_lift_loop", + "802f6d20": "bhv_orange_number_init", + "802f6d58": "bhv_orange_number_loop", + "802f6e40": "bhv_manta_ray_init", + "802f6eb0": "manta_ray_move", + "802f7068": "manta_ray_act_spawn_ring", + "802f7264": "bhv_manta_ray_loop", + "802f7348": "bhv_falling_pillar_init", + "802f7398": "bhv_falling_pillar_spawn_hitboxes", + "802f7418": "bhv_falling_pillar_calculate_angle_in_front_of_mario", + "802f74dc": "bhv_falling_pillar_loop", + "802f7760": "bhv_falling_pillar_hitbox_loop", + "802f7924": "bhv_jrb_floating_box_loop", + "802f7978": "bhv_decorative_pendulum_init", + "802f79b0": "bhv_decorative_pendulum_loop", + "802f7a58": "bhv_treasure_chest_top_loop", + "802f7c9c": "bhv_treasure_chest_bottom_init", + "802f7d04": "bhv_treasure_chest_bottom_loop", + "802f7f1c": "spawn_treasure_chest", + "802f7fa0": "bhv_treasure_chest_ship_init", + "802f8044": "bhv_treasure_chest_ship_loop", + "802f8158": "bhv_treasure_chest_jrb_init", + "802f8208": "bhv_treasure_chest_jrb_loop", + "802f82f8": "bhv_treasure_chest_init", + "802f83a4": "bhv_treasure_chest_loop", + "802f8490": "bhv_mips_init", + "802f85e0": "bhv_mips_find_furthest_waypoint_to_mario", + "802f8760": "bhv_mips_act_wait_for_nearby_mario", + "802f8808": "bhv_mips_act_follow_path", + "802f893c": "bhv_mips_act_wait_for_animation_done", + "802f8988": "bhv_mips_act_fall_down", + "802f8a34": "bhv_mips_act_idle", + "802f8ab4": "bhv_mips_free", + "802f8b54": "bhv_mips_held", + "802f8c74": "bhv_mips_dropped", + "802f8cf8": "bhv_mips_thrown", + "802f8dac": "bhv_mips_loop", + "802f8e54": "bhv_yoshi_init", + "802f8f08": "yoshi_walk_loop", + "802f9054": "yoshi_idle_loop", + "802f923c": "yoshi_talk_loop", + "802f93a8": "yoshi_walk_and_jump_off_roof_loop", + "802f9500": "yoshi_finish_jumping_and_despawn_loop", + "802f95ac": "yoshi_give_present_loop", + "802f965c": "bhv_yoshi_loop", + "802fbc4c": "bhv_koopa_init", + "802fc414": "shelled_koopa_attack_handler", + "802fcc00": "obj_begin_race", + "802fd7f8": "bhv_koopa_update", + "802fd950": "bhv_koopa_race_endpoint_update", + "802fda28": "bhv_pokey_body_part_update", + "802fe3b0": "bhv_pokey_update", + "802fe8b4": "bhv_swoop_update", + "802ff040": "bhv_fly_guy_update", + "802ff214": "bhv_goomba_triplet_spawner_update", + "802ff408": "bhv_goomba_init", + "802ff94c": "huge_goomba_weakly_attacked", + "802ff96c": "bhv_goomba_update", + "802ffb38": "bhv_chain_chomp_chain_part_update", + "80300e40": "bhv_chain_chomp_update", + "80300ecc": "bhv_wooden_post_update", + "80301148": "bhv_chain_chomp_gate_init", + "80301180": "bhv_chain_chomp_gate_update", + "80301210": "bhv_wiggler_body_part_update", + "803014cc": "wiggler_init_segments", + "803016e0": "wiggler_update_segments", + "803020e4": "wiggler_jumped_on_attack_handler", + "80302154": "bhv_wiggler_update", + "80302910": "bhv_spiny_update", + "80303028": "bhv_enemy_lakitu_update", + "8030369c": "bhv_cloud_update", + "80303744": "bhv_cloud_part_update", + "80303984": "bhv_camera_lakitu_init", + "80303f64": "bhv_camera_lakitu_update", + "803043f8": "bhv_monty_mole_hole_update", + "80304474": "monty_mole_spawn_dirt_particles", + "803044c0": "bhv_monty_mole_init", + "80304ba8": "bhv_monty_mole_update", + "80304fd4": "bhv_monty_mole_rock_update", + "80305100": "bhv_platform_on_track_init", + "80305a58": "bhv_platform_on_track_update", + "80305bb0": "bhv_track_ball_update", + "80305c14": "bhv_seesaw_platform_init", + "80305c90": "bhv_seesaw_platform_update", + "80305e2c": "bhv_ferris_wheel_axle_init", + "80305f24": "bhv_ferris_wheel_platform_update", + "80306084": "bhv_water_bomb_spawner_update", + "803062a8": "water_bomb_spawn_explode_particles", + "803067e8": "bhv_water_bomb_update", + "803068c0": "bhv_water_bomb_shadow_update", + "8030699c": "bhv_ttc_rotating_solid_init", + "80306a38": "bhv_ttc_rotating_solid_update", + "80306cc4": "bhv_ttc_pendulum_init", + "80306d38": "bhv_ttc_pendulum_update", + "80306f48": "bhv_ttc_treadmill_init", + "80307010": "bhv_ttc_treadmill_update", + "803071b8": "bhv_ttc_moving_bar_init", + "80307670": "bhv_ttc_moving_bar_update", + "80307760": "bhv_ttc_cog_init", + "803077e0": "bhv_ttc_cog_update", + "80307930": "bhv_ttc_pit_block_init", + "803079c8": "bhv_ttc_pit_block_update", + "80307ae4": "bhv_ttc_elevator_init", + "80307b58": "bhv_ttc_elevator_update", + "80307c88": "bhv_ttc_2d_rotator_init", + "80307cf8": "bhv_ttc_2d_rotator_update", + "80307ea4": "bhv_ttc_spinner_update", + "80307fb8": "mr_blizzard_spawn_white_particles", + "8030803c": "bhv_mr_blizzard_init", + "80308d6c": "bhv_mr_blizzard_update", + "80309154": "bhv_mr_blizzard_snowball", + "803091e0": "bhv_sliding_plat_2_init", + "80309354": "bhv_sliding_plat_2_loop", + "80309454": "bhv_rotating_octagonal_plat_init", + "803094d0": "bhv_rotating_octagonal_plat_loop", + "803094f8": "bhv_animates_on_floor_switch_press_init", + "80309530": "bhv_animates_on_floor_switch_press_loop", + "803097a4": "bhv_activated_back_and_forth_platform_init", + "803098c0": "bhv_activated_back_and_forth_platform_update", + "80309b64": "bhv_recovery_heart_loop", + "80309cec": "bhv_bubble_cannon_barrel_loop", + "80309ed4": "water_bomb_cannon_act_0", + "80309f68": "water_bomb_cannon_act_1", + "8030a0e8": "water_bomb_cannon_act_2", + "8030a11c": "bhv_water_bomb_cannon_loop", + "8030a1c0": "bhv_unagi_init", + "8030a2a8": "unagi_act_0", + "8030a390": "unagi_act_1_4", + "8030a514": "unagi_act_2", + "8030a614": "unagi_act_3", + "8030a93c": "bhv_unagi_loop", + "8030aabc": "bhv_unagi_subobject_loop", + "8030ad04": "dorrie_raise_head", + "8030ae9c": "dorrie_act_move", + "8030b0b8": "dorrie_begin_head_raise", + "8030b0f0": "dorrie_act_lower_head", + "8030b220": "dorrie_act_raise_head", + "8030b2f4": "bhv_dorrie_update", + "8030b658": "bhv_haunted_chair_init", + "8030b6d8": "haunted_chair_act_0", + "8030ba68": "haunted_chair_act_1", + "8030bc90": "bhv_haunted_chair_loop", + "8030bfd0": "bhv_mad_piano_update", + "8030c06c": "flying_bookend_act_0", + "8030c0f0": "flying_bookend_act_1", + "8030c210": "flying_bookend_act_2", + "8030c2c8": "flying_bookend_act_3", + "8030c364": "bhv_flying_bookend_loop", + "8030c4b0": "bhv_bookend_spawn_loop", + "8030c564": "bookshelf_manager_act_0", + "8030c60c": "bookshelf_manager_act_1", + "8030c6a4": "bookshelf_manager_act_2", + "8030c828": "bookshelf_manager_act_3", + "8030c894": "bookshelf_manager_act_4", + "8030c8ec": "bhv_haunted_bookshelf_manager_loop", + "8030c98c": "bhv_book_switch_loop", + "8030cd30": "obj_spit_fire", + "8030cddc": "bhv_fire_piranha_plant_init", + "8030d2f0": "bhv_fire_piranha_plant_update", + "8030d598": "bhv_fire_spitter_update", + "8030d640": "bhv_small_piranha_flame_loop", + "8030d8d4": "bhv_fly_guy_flame_loop", + "8030d93c": "geo_snufit_move_mask", + "8030d9ac": "geo_snufit_scale_body", + "8030da14": "snufit_act_idle", + "8030db38": "snufit_act_shoot", + "8030dc70": "bhv_snufit_loop", + "8030dfc4": "bhv_snufit_balls_loop", + "8030e14c": "bhv_horizontal_grindel_init", + "8030e16c": "bhv_horizontal_grindel_update", + "8030ea9c": "bhv_eyerok_boss_loop", + "8030fff8": "bhv_eyerok_hand_loop", + "80310498": "bhv_klepto_init", + "8031126c": "obj_set_speed_to_zero", + "8031129c": "bhv_klepto_update", + "80311874": "bhv_bird_update", + "803118e4": "bhv_racing_penguin_init", + "80312070": "bhv_racing_penguin_update", + "80312168": "bhv_penguin_race_finish_line_update", + "80312200": "bhv_penguin_race_shortcut_check_update", + "80312248": "bhv_coffin_spawner_loop", + "80312370": "coffin_act_idle", + "8031262c": "coffin_act_stand_up", + "8031274c": "bhv_coffin_loop", + "80312804": "clam_act_0", + "80312900": "clam_act_1", + "80312a54": "bhv_clam_loop", + "80313110": "bhv_skeeter_update", + "803131e8": "bhv_skeeter_wave_update", + "8031326c": "bhv_swing_platform_init", + "80313294": "bhv_swing_platform_update", + "80313354": "bhv_donut_platform_spawner_update", + "80313530": "bhv_donut_platform_update", + "803136cc": "bhv_ddd_pole_init", + "80313754": "bhv_ddd_pole_update", + "803137f4": "bhv_red_coin_star_marker_init", + "80313fc0": "bhv_triplet_butterfly_update", + "80314098": "bubba_act_0", + "8031427c": "bubba_act_1", + "803145d4": "bhv_bubba_loop", + "80314a30": "prepare_reverb_ring_buffer", + "80314cc0": "get_volume_ramping", + "80314de4": "synthesis_execute", + "80314f64": "synthesis_do_one_audio_update", + "80315590": "synthesis_process_notes", + "80316010": "load_wave_samples", + "803160dc": "final_resample", + "80316138": "process_envelope", + "8031619c": "process_envelope_inner", + "803166fc": "note_apply_headset_pan_effects", + "80316ac8": "note_init_volume", + "80316af4": "note_set_vel_pan_reverb", + "80316da8": "note_set_frequency", + "80316db4": "note_enable", + "80316e00": "note_disable", + "80316e80": "reset_bank_and_seq_load_status", + "80316ec4": "discard_bank", + "80316fb4": "discard_sequence", + "80317040": "soundAlloc", + "803170b4": "sound_alloc_pool_init", + "803170d4": "persistent_pool_clear", + "803170e8": "temporary_pool_clear", + "80317118": "unused_803160F8", + "80317128": "sound_init_main_pools", + "80317184": "session_pools_init", + "80317200": "seq_and_bank_pool_init", + "8031727c": "persistent_pools_init", + "80317338": "temporary_pools_init", + "803173fc": "alloc_bank_or_seq", + "8031782c": "get_bank_or_seq", + "803178ec": "decrease_reverb_gain", + "80317914": "wait_for_audio_frames", + "80317948": "audio_reset_session", + "80318040": "audio_dma_copy_immediate", + "803180c4": "audio_dma_copy_async", + "80318130": "audio_dma_partial_copy_async", + "803181ec": "decrease_sample_dma_ttls", + "80318300": "dma_sample_data", + "80318634": "init_sample_dma_buffers", + "803188f4": "patch_audio_bank", + "80318b30": "bank_load_immediate", + "80318c8c": "bank_load_async", + "80318dc4": "sequence_dma_immediate", + "80318e70": "sequence_dma_async", + "80318fac": "get_missing_bank", + "803190f4": "load_banks_immediate", + "80319220": "preload_sequence", + "80319328": "load_sequence", + "80319388": "load_sequence_internal", + "8031950c": "audio_init", + "80319920": "note_init", + "80319998": "note_disable2", + "803199b8": "process_notes", + "80319db8": "seq_channel_layer_decay_release_internal", + "80319f64": "seq_channel_layer_note_decay", + "80319f84": "seq_channel_layer_note_release", + "80319fa4": "build_synthetic_wave", + "8031a1d0": "init_synthetic_wave", + "8031a254": "init_note_list", + "8031a264": "init_note_lists", + "8031a2b4": "init_note_free_list", + "8031a368": "note_pool_clear", + "8031a494": "note_pool_fill", + "8031a5d0": "audio_list_push_front", + "8031a610": "audio_list_remove", + "8031a63c": "pop_node_with_value_less_equal", + "8031a6cc": "note_init_for_layer", + "8031a794": "func_80319728", + "8031a7c8": "note_release_and_take_ownership", + "8031a820": "alloc_note_from_disabled", + "8031a89c": "alloc_note_from_decaying", + "8031a8f0": "alloc_note_from_active", + "8031a94c": "alloc_note", + "8031ac34": "reclaim_notes", + "8031adac": "note_init_all", + "8031aee8": "sequence_player_process_sound", + "8031b0cc": "get_portamento_freq_scale", + "8031b1c0": "get_vibrato_pitch_change", + "8031b248": "get_vibrato_freq_scale", + "8031b440": "note_vibrato_update", + "8031b4a0": "note_vibrato_init", + "8031b58c": "adsr_init", + "8031b5ac": "adsr_update", + "8031b830": "sequence_channel_init", + "8031b940": "seq_channel_set_layer", + "8031ba30": "seq_channel_layer_disable", + "8031ba6c": "seq_channel_layer_free", + "8031baf0": "sequence_channel_disable", + "8031bb5c": "allocate_sequence_channel", + "8031bba4": "sequence_player_init_channels", + "8031bcd0": "sequence_player_disable_channels", + "8031bda0": "sequence_channel_enable", + "8031be44": "sequence_player_disable", + "8031bf14": "audio_list_push_back", + "8031bf54": "audio_list_pop_back", + "8031bf94": "init_layer_freelist", + "8031c03c": "m64_read_u8", + "8031c050": "m64_read_s16", + "8031c080": "m64_read_compressed_u16", + "8031c0c4": "seq_channel_layer_process_script", + "8031c200": "L8031C200", + "8031c23c": "L8031C23C", + "8031c298": "L8031C298", + "8031c2dc": "L8031C2DC", + "8031c328": "L8031C328", + "8031c36c": "L8031C36C", + "8031c3bc": "L8031C3BC", + "8031c3e8": "L8031C3E8", + "8031c454": "L8031C454", + "8031c4a4": "L8031C4A4", + "8031c5c8": "L8031C5C8", + "8031c698": "L8031C698", + "8031c6a0": "L8031C6A0", + "8031cbe0": "L8031CBE0", + "8031cbec": "L8031CBEC", + "8031ce54": "get_instrument", + "8031cfd4": "set_instrument", + "8031d068": "sequence_channel_set_volume", + "8031d08c": "sequence_channel_process_script", + "8031d144": "L_U_8031D144", + "8031d1f8": "L_U_8031D1F8", + "8031d234": "L_U_8031D234", + "8031d26c": "L_U_8031D26C", + "8031d2b4": "L_U_8031D2B4", + "8031d2c4": "L_U_8031D2C4", + "8031d31c": "L_U_8031D31C", + "8031d344": "L_U_8031D344", + "8031d354": "L_U_8031D354", + "8031d370": "L_U_8031D370", + "8031d3a8": "L_U_8031D3A8", + "8031d3c4": "L_U_8031D3C4", + "8031d3d4": "L_U_8031D3D4", + "8031d3e4": "L_U_8031D3E4", + "8031d400": "L_U_8031D400", + "8031d424": "L_U_8031D424", + "8031d44c": "L_U_8031D44C", + "8031d474": "L_U_8031D474", + "8031d498": "L_U_8031D498", + "8031d4bc": "L_U_8031D4BC", + "8031d4d4": "L_U_8031D4D4", + "8031d4f0": "L_U_8031D4F0", + "8031d500": "L_U_8031D500", + "8031d51c": "L_U_8031D51C", + "8031d538": "L_U_8031D538", + "8031d56c": "L_U_8031D56C", + "8031d5a0": "L_U_8031D5A0", + "8031d5b4": "L_U_8031D5B4", + "8031d5d4": "L_U_8031D5D4", + "8031d5e4": "L_U_8031D5E4", + "8031d640": "L_U_8031D640", + "8031d678": "L_U_8031D678", + "8031d6c4": "L_U_8031D6C4", + "8031d6d4": "L_U_8031D6D4", + "8031d6f4": "L_U_8031D6F4", + "8031d718": "L_U_8031D718", + "8031d728": "L_U_8031D728", + "8031d73c": "L_U_8031D73C", + "8031d7b8": "L_U_8031D7B8", + "8031d7e8": "L_U_8031D7E8", + "8031d7f8": "L_U_8031D7F8", + "8031d814": "L_U_8031D814", + "8031d830": "L_U_8031D830", + "8031d87c": "L_U_8031D87C", + "8031d898": "L_U_8031D898", + "8031d8f8": "L_U_8031D8F8", + "8031d900": "L_U_8031D900", + "8031d930": "L_U_8031D930", + "8031d94c": "L_U_8031D94C", + "8031d974": "L_U_8031D974", + "8031d9ec": "sequence_player_process_sequence", + "8031e240": "process_sequences", + "8031e2e8": "init_sequence_player", + "8031e374": "init_sequence_players", + "8031e4f0": "unused_8031E4F0", + "8031e568": "unused_8031E568", + "8031e578": "sequence_player_fade_out_internal", + "8031e5c0": "func_8031D690", + "8031e60c": "func_8031D6E4", + "8031e6a4": "func_8031D7B0", + "8031e710": "func_8031D838", + "8031e7b8": "create_next_audio_frame_task", + "8031eb00": "play_sound", + "8031eb30": "process_sound_request", + "8031edec": "process_all_sound_requests", + "8031ee70": "func_8031DFE8", + "8031ef6c": "func_8031E0E4", + "8031eff4": "func_8031E16C", + "8031f810": "get_sound_pan", + "8031f96c": "get_sound_dynamics", + "8031fb20": "get_sound_freq_scale", + "8031fbe8": "get_sound_reverb", + "8031fd84": "audio_signal_game_loop_tick", + "8031fdac": "update_game_sound", + "80320544": "play_sequence", + "80320678": "sequence_player_fade_out", + "803206bc": "fade_volume_scale", + "80320734": "fade_channel_volume_scale", + "8032080c": "func_8031F96C", + "803208ec": "process_level_music_dynamics", + "80320a4c": "L8031FBAC", + "80320a8c": "L8031FBEC", + "80320acc": "L8031FC2C", + "80320b0c": "L8031FC6C", + "80320b4c": "L8031FCAC", + "80320b8c": "L8031FCEC", + "80320bcc": "L8031FD2C", + "80320bf4": "L8031FD54", + "80320d70": "unused_8031FED0", + "80320e3c": "func_8031FFB4", + "80320ec4": "sequence_player_unlower", + "80320f68": "func_803200E4", + "803210d4": "set_sound_disabled", + "8032112c": "sound_init", + "80321398": "get_currently_playing_sound", + "80321474": "func_803205E8", + "80321584": "func_803206F8", + "8032171c": "func_80320890", + "8032174c": "sound_banks_disable", + "803217a8": "disable_all_sequence_players", + "8032180c": "sound_banks_enable", + "80321864": "unused_803209D8", + "803218d8": "func_80320A4C", + "803218f4": "play_dialog_sound", + "803219ac": "play_music", + "80321bac": "stop_background_music", + "80321ce4": "fadeout_background_music", + "80321d38": "drop_queued_background_music", + "80321d5c": "get_current_background_music", + "80321d9c": "func_80320ED8", + "80321e48": "play_secondary_music", + "80321f48": "func_80321080", + "80321f9c": "func_803210D4", + "80322078": "play_course_clear", + "803220b4": "play_peachs_jingle", + "803220f0": "play_puzzle_jingle", + "8032212c": "play_star_fanfare", + "80322168": "play_power_star_jingle", + "803221b8": "play_race_fanfare", + "803221f4": "play_toads_jingle", + "80322230": "sound_reset", + "8032231c": "audio_set_sound_mode", + "80322348": "unused_80321460", + "8032235c": "unused_80321474", + "803223b0": "osSetTime", + "803223e0": "osMapTLB", + "803224a0": "osUnmapTLBAll", + "803224f0": "sprintf", + "8032255c": "proutSprintf", + "803225a0": "osCreateMesgQueue", + "803225d0": "osSetEventMesg", + "80322640": "osViSetEvent", + "803226b0": "osCreateThread", + "80322800": "osRecvMesg", + "80322940": "_VirtualToPhysicalTask", + "80322a5c": "osSpTaskLoad", + "80322bbc": "osSpTaskStartGo", + "80322c00": "osSpTaskYield", + "80322c20": "osSendMesg", + "80322d70": "osSpTaskYielded", + "80322df0": "osStartThread", + "80322f40": "osWritebackDCacheAll", + "80322f70": "osCreateViManager", + "803230f4": "viMgrMain", + "803232d0": "osViSetMode", + "80323340": "osViBlack", + "803233b0": "osViSetSpecialFeatures", + "80323570": "osCreatePiManager", + "803236f0": "osSetThreadPri", + "803237d0": "osInitialize", + "80323a00": "osViSwapBuffer", + "80323a50": "sqrtf", + "80323a60": "osContStartReadData", + "80323b24": "osContGetReadData", + "80323bcc": "__osPackReadData", + "80323cc0": "osContInit", + "80323ebc": "__osContGetInitData", + "80323f8c": "__osPackRequestData", + "80324080": "osEepromProbe", + "803240f0": "__ull_rshift", + "8032411c": "__ull_rem", + "80324158": "__ull_div", + "80324194": "__ll_lshift", + "803241c0": "__ll_rem", + "803241fc": "__ll_div", + "80324258": "__ll_mul", + "80324288": "__ull_divremi", + "803242e8": "__ll_mod", + "80324384": "__ll_rshift", + "803243b0": "osInvalDCache", + "80324460": "osPiStartDma", + "80324570": "bzero", + "80324610": "osInvalICache", + "80324690": "osEepromLongRead", + "803247d0": "osEepromLongWrite", + "80324910": "bcopy", + "80324c20": "guOrthoF", + "80324d74": "guOrtho", + "80324de0": "guPerspectiveF", + "80325010": "guPerspective", + "80325070": "osGetTime", + "80325100": "__d_to_ll", + "8032511c": "__f_to_ll", + "80325138": "__d_to_ull", + "803251d8": "__f_to_ull", + "80325274": "__ll_to_d", + "8032528c": "__ll_to_f", + "803252a4": "__ull_to_d", + "803252d8": "__ull_to_f", + "80325310": "cosf", + "80325480": "sinf", + "80325640": "guTranslateF", + "80325688": "guTranslate", + "803256e0": "guRotateF", + "80325874": "guRotate", + "803258d0": "guScaleF", + "80325924": "guScale", + "80325970": "osAiSetFrequency", + "80325bd4": "alBnkfNew", + "80325cd8": "alSeqFileNew", + "80325d20": "osWritebackDCache", + "80325da0": "osAiGetLength", + "80325db0": "osAiSetNextBuffer", + "80325e60": "__osTimerServicesInit", + "80325eec": "__osTimerInterrupt", + "80326064": "__osSetTimerIntr", + "803260d8": "__osInsertTimer", + "80326260": "_Printf", + "803273f0": "memcpy", + "8032741c": "strlen", + "80327444": "strchr", + "80327490": "__osDequeueThread", + "803274d0": "__osDisableInt", + "803274f0": "__osRestoreInt", + "80327510": "__osViInit", + "80327640": "__osExceptionPreamble", + "80327650": "__osException", + "803278e4": "L80326964", + "80327904": "L80326984", + "80327938": "L803269B8", + "80327a68": "L80326AE8", + "80327ac4": "L80326B44", + "80327ae4": "L80326B64", + "80327b1c": "L80326B9C", + "80327b68": "L80326BE8", + "80327b98": "send_mesg", + "80327c80": "__osEnqueueAndYield", + "80327d10": "__osEnqueueThread", + "80327d58": "__osPopThread", + "80327d68": "__osDispatchThread", + "80327ea8": "__osCleanupThread", + "80327eb0": "osVirtualToPhysical", + "80327f30": "__osSpSetStatus", + "80327f40": "__osSpSetPc", + "80327f80": "__osSpRawStartDma", + "80328010": "__osSpDeviceBusy", + "80328040": "__osSpGetStatus", + "80328050": "osGetThreadPri", + "80328070": "__osViGetCurrentContext", + "80328080": "__osViSwapContext", + "803283e0": "osGetCount", + "803283f0": "__osPiCreateAccessQueue", + "80328440": "__osPiGetAccess", + "80328484": "__osPiRelAccess", + "803284b0": "osPiRawStartDma", + "80328590": "__osDevMgrMain", + "80328710": "__osSetSR", + "80328720": "__osGetSR", + "80328730": "__osSetFpcCsr", + "80328740": "__osSiRawReadIo", + "80328790": "__osSiRawWriteIo", + "803287e0": "osMapTLBRdb", + "80328840": "osPiRawReadIo", + "803288a0": "__osSiCreateAccessQueue", + "803288f0": "__osSiGetAccess", + "80328934": "__osSiRelAccess", + "80328960": "__osSiRawStartDma", + "80328a10": "osSetTimer", + "80328af0": "osEepromWrite", + "80328ca0": "__osPackEepWriteData", + "80328dac": "__osEepStatus", + "80328fd0": "osJamMesg", + "80329120": "osPiGetCmdQueue", + "80329150": "osEepromRead", + "80329340": "__osPackEepReadData", + "80329450": "guMtxF2L", + "80329550": "guMtxIdentF", + "803295d8": "guMtxIdent", + "80329608": "guMtxL2F", + "803296c0": "guNormalize", + "80329750": "__osAiDeviceBusy", + "80329780": "__osSetCompare", + "80329790": "_Litob", + "80329a90": "_Ldtob", + "8032a860": "u32_to_string", + "8032a890": "string_to_u32", + "8032a8e8": "send_packet", + "8032a9a8": "send", + "8032aa80": "process_command_memory", + "8032aacc": "process_command_register", + "8032aaf8": "kdebugserver", + "8032ace0": "__osSyncPutChars", + "8032ae10": "osSetIntMask", + "8032ae70": "osDestroyThread", + "8032af70": "__osProbeTLB", + "8032b030": "__osSiDeviceBusy", + "8032b060": "lldiv", + "8032b160": "ldiv", + "8032b1f0": "__osGetCause", + "8032b200": "__osAtomicDec", + "8032b260": "rspF3DBootStart", + "8032b330": "rspF3DBootEnd", + "8032b330": "rspF3DStart", + "8032c738": "rspF3DEnd", + "8032c740": "rspAspMainStart", + "8032d560": "rspAspMainEnd", + "8032d560": "gVblankHandler1", + "8032d564": "gVblankHandler2", + "8032d568": "gActiveSPTask", + "8032d56c": "sCurrentAudioSPTask", + "8032d570": "sCurrentDisplaySPTask", + "8032d574": "sNextAudioSPTask", + "8032d578": "sNextDisplaySPTask", + "8032d57c": "sAudioEnabled", + "8032d580": "sNumVblanks", + "8032d584": "gResetTimer", + "8032d588": "D_8032C648", + "8032d58c": "gDebugLevelSelect", + "8032d590": "D_8032C650", + "8032d594": "gShowProfiler", + "8032d598": "gShowDebugText", + "8032d5d0": "unused8032C690", + "8032d5d4": "gGlobalTimer", + "8032d5dc": "frameBufferIndex", + "8032d5e0": "D_8032C6A0", + "8032d5e4": "gPlayer1Controller", + "8032d5e8": "gPlayer2Controller", + "8032d5ec": "gPlayer3Controller", + "8032d5f0": "gCurrDemoInput", + "8032d5f4": "gDemoInputListID", + "8032d5f8": "gRecordedDemoInput", + "8032d6d0": "credits01", + "8032d6d8": "credits02", + "8032d6e4": "credits03", + "8032d6f0": "credits04", + "8032d700": "credits05", + "8032d710": "credits06", + "8032d71c": "credits07", + "8032d728": "credits08", + "8032d738": "credits09", + "8032d740": "credits10", + "8032d750": "credits11", + "8032d75c": "credits12", + "8032d764": "credits13", + "8032d774": "credits14", + "8032d77c": "credits15", + "8032d788": "credits16", + "8032d79c": "credits17", + "8032d7ac": "credits18", + "8032d7bc": "credits19", + "8032d7c4": "credits20", + "8032d7cc": "sCreditsSequence", + "8032d93c": "gMarioState", + "8032d940": "unused1", + "8032d944": "D_8032C9E0", + "8032daa0": "sTerrainSounds", + "8032dacc": "sSquishScaleOverTime", + "8032dae0": "sCapFlickerFrames", + "8032daf8": "gWaterSurfacePseudoFloor", + "8032dc50": "sJumpLandAction", + "8032dc68": "sFreefallLandAction", + "8032dc80": "sSideFlipLandAction", + "8032dc98": "sHoldJumpLandAction", + "8032dcb0": "sHoldFreefallLandAction", + "8032dcc8": "sLongJumpLandAction", + "8032dce0": "sDoubleJumpLandAction", + "8032dcf8": "sTripleJumpLandAction", + "8032dd10": "sBackflipLandAction", + "8032dd40": "sPunchingForwardVelocities", + "8032dd80": "gLastCompletedCourseNum", + "8032dd84": "gLastCompletedStarNum", + "8032dd88": "sUnusedGotGlobalCoinHiScore", + "8032dd8c": "gGotFileCoinHiScore", + "8032dd90": "gCurrCourseStarFlags", + "8032dd94": "gSpecialTripleJump", + "8032dd98": "gLevelToCourseNumTable", + "8032ddc0": "gMarioSpawnInfo", + "8032ddc4": "gLoadedGraphNodes", + "8032ddc8": "gAreas", + "8032ddcc": "gCurrentArea", + "8032ddd0": "gCurrCreditsEntry", + "8032ddd4": "D_8032CE74", + "8032ddd8": "D_8032CE78", + "8032dddc": "gWarpTransDelay", + "8032dde0": "gFBSetColor", + "8032dde4": "gWarpTransFBSetColor", + "8032dde8": "gWarpTransRed", + "8032ddec": "gWarpTransGreen", + "8032ddf0": "gWarpTransBlue", + "8032ddf4": "gCurrSaveFileNum", + "8032ddf8": "gCurrLevelNum", + "8032ddfc": "sWarpBhvSpawnTable", + "8032de4c": "sSpawnTypeFromWarpBhv", + "8032de60": "D_8032CF00", + "8032de70": "renderModeTable_1Cycle", + "8032deb0": "renderModeTable_2Cycle", + "8032def0": "gCurGraphNodeRoot", + "8032def4": "gCurGraphNodeMasterList", + "8032def8": "gCurGraphNodeCamFrustum", + "8032defc": "gCurGraphNodeCamera", + "8032df00": "gCurGraphNodeObject", + "8032df04": "gCurGraphNodeHeldObject", + "8032df08": "gAreaUpdateCounter", + "8032df10": "gProfilerMode", + "8032df14": "gCurrentFrameIndex1", + "8032df18": "gCurrentFrameIndex2", + "8032df20": "unused8032CFC0", + "8032df24": "gCutsceneFocus", + "8032df28": "unused8032CFC8", + "8032df2c": "unused8032CFCC", + "8032df30": "gSecondCameraFocus", + "8032df34": "sYawSpeed", + "8032df38": "gCurrLevelArea", + "8032df3c": "gPrevLevel", + "8032df40": "unused8032CFE0", + "8032df44": "unused8032CFE4", + "8032df48": "unused8032CFE8", + "8032df4c": "gCameraZoomDist", + "8032df50": "sObjectCutscene", + "8032df54": "gRecentCutscene", + "8032df58": "sFramesSinceCutsceneEnded", + "8032df5c": "sCutsceneDialogResponse", + "8032df60": "sMarioCamState", + "8032df64": "sLuigiCamState", + "8032df68": "unused8032D008", + "8032df6c": "sFixedModeBasePosition", + "8032df78": "sUnusedModeBasePosition_2", + "8032df84": "sUnusedModeBasePosition_3", + "8032df90": "sUnusedModeBasePosition_4", + "8032df9c": "sUnusedModeBasePosition_5", + "8032dfa8": "sModeTransitions", + "8032e008": "unused8032D0A8", + "8032e010": "unused8032D0B0", + "8032e018": "sDanceCutsceneTable", + "8032e024": "unusedDanceInfo1", + "8032e038": "unusedDanceType", + "8032e03c": "unusedDanceInfo2", + "8032e050": "sBBHLibraryParTrackPath", + "8032e098": "sCamSL", + "8032e0e0": "sCamTHI", + "8032e128": "sCamHMC", + "8032e1d0": "sCamSSL", + "8032e248": "sCamRR", + "8032e2f0": "sCamBOB", + "8032e338": "sCamCotMC", + "8032e368": "sCamCCM", + "8032e3b0": "sCamCastle", + "8032e6f8": "sCamBBH", + "8032ecb0": "sCameraTriggers", + "8032ed50": "sIntroStartToPipePosition", + "8032ee08": "sIntroStartToPipeFocus", + "8032eec0": "sIntroPipeToDialogPosition", + "8032ef30": "sIntroPipeToDialogFocus", + "8032efa0": "sEndingFlyToWindowPos", + "8032eff0": "sEndingFlyToWindowFocus", + "8032f048": "sEndingPeachDescentCamPos", + "8032f0e8": "sEndingMarioToPeachPos", + "8032f130": "sEndingMarioToPeachFocus", + "8032f178": "sEndingLookUpAtCastle", + "8032f1b8": "sEndingLookAtSkyFocus", + "8032f214": "gIntroLakituStartToPipeFocus", + "8032f32c": "gIntroLakituStartToPipeOffsetFromCamera", + "8032f444": "gEndWavingPos", + "8032f48c": "gEndWavingFocus", + "8032f4d4": "sCutsceneEnding", + "8032f534": "sCutsceneGrandStar", + "8032f544": "sCutsceneUnused", + "8032f554": "sCutsceneDoorWarp", + "8032f564": "sCutsceneEndWaving", + "8032f56c": "sCutsceneCredits", + "8032f574": "sCutsceneDoorPull", + "8032f59c": "sCutsceneDoorPush", + "8032f5c4": "sCutsceneDoorPullMode", + "8032f5dc": "sCutsceneDoorPushMode", + "8032f5f4": "sCutsceneEnterCannon", + "8032f60c": "sCutsceneStarSpawn", + "8032f624": "sCutsceneRedCoinStarSpawn", + "8032f634": "sCutsceneEnterPainting", + "8032f63c": "sCutsceneDeathExit", + "8032f64c": "sCutsceneExitPaintingSuccess", + "8032f65c": "sCutsceneUnusedExit", + "8032f674": "sCutsceneIntroPeach", + "8032f69c": "sCutscenePrepareCannon", + "8032f6ac": "sCutsceneExitWaterfall", + "8032f6bc": "sCutsceneFallToCastleGrounds", + "8032f6cc": "sCutsceneEnterPyramidTop", + "8032f6dc": "sCutscenePyramidTopExplode", + "8032f6f4": "sCutsceneStandingDeath", + "8032f6fc": "sCutsceneEnterPool", + "8032f70c": "sCutsceneDeathStomach", + "8032f714": "sCutsceneDeathOnBack", + "8032f71c": "sCutsceneQuicksandDeath", + "8032f724": "sCutsceneWaterDeath", + "8032f72c": "sCutsceneSuffocation", + "8032f734": "sCutsceneEnterBowserArena", + "8032f74c": "sCutsceneDanceDefaultRotate", + "8032f754": "sCutsceneDanceFlyAway", + "8032f75c": "sCutsceneDanceCloseup", + "8032f764": "sCutsceneKeyDance", + "8032f76c": "sCutsceneCapSwitchPress", + "8032f774": "sCutsceneSlidingDoorsOpen", + "8032f784": "sCutsceneUnlockKeyDoor", + "8032f794": "sCutsceneExitBowserSuccess", + "8032f7a4": "sCutsceneExitBowserDeath", + "8032f7b4": "sCutsceneExitSpecialSuccess", + "8032f7c4": "sCutsceneNonPaintingDeath", + "8032f7d4": "sCutsceneDialog", + "8032f7ec": "sCutsceneReadMessage", + "8032f804": "sDanceCutsceneIndexTable", + "8032f870": "sZoomOutAreaMasks", + "8032f884": "sBobCreditsSplinePositions", + "8032f8ac": "sBobCreditsSplineFocus", + "8032f8d4": "sWfCreditsSplinePositions", + "8032f8fc": "sWfCreditsSplineFocus", + "8032f924": "sJrbCreditsSplinePositions", + "8032f94c": "sJrbCreditsSplineFocus", + "8032f974": "sCcmSlideCreditsSplinePositions", + "8032f99c": "sCcmSlideCreditsSplineFocus", + "8032f9c4": "sBbhCreditsSplinePositions", + "8032f9e4": "sBbhCreditsSplineFocus", + "8032fa04": "sHmcCreditsSplinePositions", + "8032fa2c": "sHmcCreditsSplineFocus", + "8032fa54": "sThiWigglerCreditsSplinePositions", + "8032fa6c": "sThiWigglerCreditsSplineFocus", + "8032fa84": "sVolcanoCreditsSplinePositions", + "8032fab4": "sVolcanoCreditsSplineFocus", + "8032fae4": "sSslCreditsSplinePositions", + "8032fb14": "sSslCreditsSplineFocus", + "8032fb44": "sDddCreditsSplinePositions", + "8032fb7c": "sDddCreditsSplineFocus", + "8032fbb4": "sSlCreditsSplinePositions", + "8032fbd4": "sSlCreditsSplineFocus", + "8032fbf4": "sWdwCreditsSplinePositions", + "8032fc14": "sWdwCreditsSplineFocus", + "8032fc34": "sTtmCreditsSplinePositions", + "8032fc64": "sTtmCreditsSplineFocus", + "8032fc94": "sThiHugeCreditsSplinePositions", + "8032fccc": "sThiHugeCreditsSplineFocus", + "8032fd04": "sTtcCreditsSplinePositions", + "8032fd24": "sTtcCreditsSplineFocus", + "8032fd44": "sRrCreditsSplinePositions", + "8032fd64": "sRrCreditsSplineFocus", + "8032fd84": "sSaCreditsSplinePositions", + "8032fdac": "sSaCreditsSplineFocus", + "8032fdd4": "sCotmcCreditsSplinePositions", + "8032fdfc": "sCotmcCreditsSplineFocus", + "8032fe24": "sDddSubCreditsSplinePositions", + "8032fe4c": "sDddSubCreditsSplineFocus", + "8032fe74": "sCcmOutsideCreditsSplinePositions", + "8032fe94": "sCcmOutsideCreditsSplineFocus", + "8032fec0": "sObjectListUpdateOrder", + "8032fecc": "sParticleTypes", + "80330000": "D_8032F0A0", + "80330004": "D_8032F0A4", + "80330020": "D_8032F0C0", + "8033002c": "D_8032F0CC", + "8033006c": "sMrIParticleActions", + "80330074": "sMrIActions", + "80330084": "sMrIHitbox", + "80330094": "D_8032F134", + "803300a8": "unused8032F134", + "803300ac": "sCapSwitchActions", + "803300bc": "sKingBobombActions", + "803300e0": "sKingBobombSoundStates", + "80330140": "sOpenedCannonActions", + "8033015c": "unused0EA1FC", + "80330198": "sChuckyaActions", + "803301a8": "sWFRotatingPlatformData", + "803301c0": "sKoopaShellUnderwaterHitbox", + "803301d0": "D_8032F270", + "803301e4": "sSparkleSpawnStarHitbox", + "803301f4": "sYellowCoinHitbox", + "80330204": "D_8032F2A4", + "80330224": "sCoinInsideBooActions", + "8033022c": "D_8032F2CC", + "80330244": "D_8032F2E4", + "80330260": "D_8032F300", + "80330288": "D_8032F328", + "80330290": "D_8032F330", + "80330298": "sGrindelThwompActions", + "803302ac": "sTumblingBridgeParams", + "803302dc": "sTumblingBridgeActions", + "803302ec": "D_8032F38C", + "80330318": "sElevatorActions", + "8033032c": "D_8032F3CC", + "80330340": "D_8032F3E0", + "80330354": "D_8032F3F4", + "8033035c": "D_8032F3FC", + "80330370": "sUkikiCageActions", + "80330380": "D_8032F420", + "80330390": "sSpindriftHitbox", + "803303a0": "sMetalBoxHitbox", + "803303b0": "sBreakableBoxHitbox", + "803303c0": "D_8032F460", + "803303e8": "sHeaveHoActions", + "803303f8": "sJumpingBoxHitbox", + "80330408": "sJumpingBoxActions", + "8033042c": "sBowserKeyHitbox", + "8033043c": "sBulletBillActions", + "80330450": "sBowserTailAnchorActions", + "8033045c": "D_8032F4FC", + "8033046c": "D_8032F50C", + "80330470": "D_8032F510", + "80330474": "D_8032F514", + "80330478": "sBowserDefeatedDialogText", + "80330480": "D_8032F520", + "803304c8": "sBowserActions", + "80330518": "D_8032F5B8", + "803305f0": "D_8032F690", + "803305f4": "D_8032F694", + "803305f8": "D_8032F698", + "8033067c": "sFallingBowserPlatformActions", + "80330688": "sGrowingBowserFlameHitbox", + "80330698": "sBowserFlameHitbox", + "803306a8": "D_8032F748", + "803306b4": "D_8032F754", + "80330738": "sUkikiSoundStates", + "803307a0": "sUkikiActions", + "803307c0": "D_8032F860", + "803307f4": "D_8032F894", + "80330828": "D_8032F8C8", + "80330830": "sRotatingCwFireBarsActions", + "80330840": "sKoopaShellHitbox", + "80330850": "D_8032F8F0", + "80330884": "D_8032F924", + "803308a8": "D_8032F948", + "803308cc": "D_8032F96C", + "803308d8": "sToxBoxActions", + "80330900": "TablePiranhaPlantActions", + "80330b1c": "sBowserPuzzlePieceActions", + "80330b38": "sTuxiesMotherActions", + "80330b44": "sSmallPenguinActions", + "80330b5c": "sFishActions", + "80330b68": "sFishGroupActions", + "80330b74": "sBirdChirpChirpActions", + "80330b84": "sCheepCheepActions", + "80330b90": "sExclamationBoxHitbox", + "80330ba0": "sExclamationBoxContents", + "80330c20": "sExclamationBoxActions", + "80330c38": "sSkullSlidingBoxHitbox", + "80330c48": "gOpenableGrills", + "80330c58": "sTweesterHitbox", + "80330c68": "sTweesterActions", + "80330cd4": "sScuttlebugHitbox", + "80330ce4": "sWhompActions", + "80330d0c": "sWaterSplashDropletParams", + "80330d30": "gShallowWaterSplashDropletParams", + "80330d54": "sWaterDropletFishParams", + "80330d78": "gShallowWaterWaveDropletParams", + "80330d9c": "sStrongWindParticleHitbox", + "80330dac": "sSLWalkingPenguinErraticSteps", + "80330e20": "D_8032FEC0", + "80330e24": "unused_8032FEC4", + "80330e34": "gMarioPlatform", + "80330e40": "sDebugEffectStringInfo", + "80330e64": "sDebugEnemyStringInfo", + "80330e88": "sDebugInfoDPadMask", + "80330e8c": "sDebugInfoDPadUpdID", + "80330e90": "sDebugLvSelectCheckFlag", + "80330e94": "sDebugPage", + "80330e98": "sNoExtraDebug", + "80330e9c": "sDebugStringArrPrinted", + "80330ea0": "sDebugSysCursor", + "80330ea4": "sDebugInfoButtonSeqID", + "80330ea8": "sDebugInfoButtonSeq", + "80330ec0": "sTransitionColorFadeCount", + "80330ec4": "sTransitionTextureFadeCount", + "80330ec8": "sTextureTransitionID", + "80330ee0": "rectangles", + "80330f00": "sSkyboxTextures", + "80330f28": "sSkyboxColors", + "80330f30": "gMovtexCounter", + "80330f34": "gMovtexCounterPrev", + "80330f38": "gMovtexVtxColor", + "80330f3c": "gPaintingMarioYEntry", + "80330f40": "gWdwWaterLevelSet", + "80330f44": "gMovtexIdToTexture", + "80330f64": "gMovtexNonColored", + "803311a4": "gMovtexColored", + "8033127c": "gMovtexColored2", + "80331300": "sHmcPaintings", + "80331308": "sInsideCastlePaintings", + "80331344": "sTtmPaintings", + "8033134c": "sPaintingGroups", + "80331358": "gPaintingUpdateCounter", + "8033135c": "gLastPaintingUpdateCounter", + "80331360": "sTextLabelsCount", + "80331370": "gDialogCharWidths", + "80331470": "gDialogBoxState", + "80331474": "gDialogBoxOpenTimer", + "80331478": "gDialogBoxScale", + "8033147c": "gDialogScrollOffsetY", + "80331480": "gDialogBoxType", + "80331484": "gDialogID", + "80331488": "gLastDialogPageStrPos", + "8033148c": "gDialogTextPos", + "80331490": "gDialogLineNum", + "80331494": "gLastDialogResponse", + "80331498": "gMenuHoldKeyIndex", + "8033149c": "gMenuHoldKeyTimer", + "803314a0": "gDialogResponse", + "803314b0": "gHudSymCoin", + "803314b4": "gHudSymX", + "803314f8": "gMenuMode", + "803314fc": "gEndCutsceneStrEn0", + "80331504": "gEndCutsceneStrEn1", + "80331538": "gEndCutsceneStrEn2", + "80331558": "gEndCutsceneStrEn3", + "8033156c": "gEndCutsceneStrEn4", + "80331598": "gEndCutsceneStrEn5", + "803315ac": "gEndCutsceneStrEn6", + "803315cc": "gEndCutsceneStrEn7", + "803315dc": "gEndCutsceneStrEn8", + "803315e4": "gEndCutsceneStringsEn", + "8033160c": "gCutsceneMsgFade", + "80331610": "gCutsceneMsgIndex", + "80331614": "gCutsceneMsgDuration", + "80331618": "gCutsceneMsgTimer", + "8033161c": "gDialogCameraAngleIndex", + "80331620": "gDialogCourseActNum", + "803316c8": "gCourseCompleteCoinsEqual", + "803316cc": "gCourseDoneMenuTimer", + "803316d0": "gCourseCompleteCoins", + "803316d4": "gHudFlash", + "80331750": "gEnvFxMode", + "80331754": "D_80330644", + "80331758": "gSnowTempVtx", + "80331788": "gSnowFlakeVertex1", + "80331790": "gSnowFlakeVertex2", + "80331798": "gSnowFlakeVertex3", + "803317a0": "D_80330690", + "803317a4": "D_80330694", + "803317a8": "gBubbleTempVtx", + "803317e0": "MacroObjectPresets", + "803325fc": "sPowerMeterVisibleTimer", + "80332614": "sPrevCheckMarioRoom", + "80332618": "sYoshiDead", + "8033261c": "sDebugSequenceTracker", + "80332620": "sDebugTimer", + "803327a8": "sBreakableBoxSmallHitbox", + "80332b00": "sMrBlizzardHitbox", + "80332b24": "sMrBlizzardSnowballHitbox", + "80332b34": "D_80331A24", + "80332b54": "D_80331A44", + "80332b5c": "D_80331A4C", + "80332b64": "D_80331A54", + "80332bdc": "D_80331ACC", + "80332bf0": "sRecoveryHeartHitbox", + "80332c00": "sUnagiHitbox", + "80332c10": "sHauntedChairHitbox", + "80332c30": "sFlyingBookendHitbox", + "80332c40": "D_80331B30", + "80332c4c": "sBookSwitchHitbox", + "80332c5c": "sFirePiranhaPlantHitbox", + "80332c6c": "D_80331B5C", + "80332c74": "sPiranhaPlantFireHitbox", + "80332c84": "sSnufitHitbox", + "80332c94": "sSnufitBulletHitbox", + "80332ca4": "sEyerokHitbox", + "80332cb4": "D_80331BA4", + "80332d10": "coffinRelativePos", + "80332d28": "sClamShellHitbox", + "80332d38": "sSkeeterHitbox", + "80332d48": "D_80331C38", + "80332e50": "gAudioErrorFlags", + "80332e54": "sGameLoopTicked", + "80332e58": "sDialogSpeaker", + "80332f04": "sDialogSpeakerVoice", + "80332f40": "sNumProcessedSoundRequests", + "80332f44": "sSoundRequestCount", + "80332f48": "sDynBbh", + "80332f54": "sDynDdd", + "80332f6c": "sDynJrb", + "80332f88": "sDynWdw", + "80332f98": "sDynHmc", + "80332fa8": "sDynUnk38", + "80332fb8": "sDynNone", + "80332fbc": "sCurrentMusicDynamic", + "80332fc0": "sBackgroundMusicForDynamics", + "80332fc4": "sLevelDynamics", + "80333060": "sMusicDynamics", + "803330c0": "gAreaEchoLevel", + "80333138": "D_80332028", + "80333188": "sBackgroundMusicDefaultVolume", + "803331ac": "sPlayer0CurSeqId", + "803331b0": "sMusicDynamicDelay", + "803331b4": "D_803320A4", + "803331c0": "D_803320B0", + "803331cc": "D_803320BC", + "803331d8": "sMaxChannelsForSoundBank", + "803331e4": "sNumSoundsPerBank", + "803331f0": "gDefaultSoundArgs", + "803331fc": "sUnusedSoundArgs", + "80333208": "sSoundBankDisabled", + "80333218": "D_80332108", + "8033321c": "sHasStartedFadeOut", + "80333220": "D_80332110", + "80333224": "sUnused80332114", + "80333228": "sUnused80332118", + "8033322c": "D_8033211C", + "80333230": "D_80332120", + "80333234": "D_80332124", + "80333238": "sBackgroundMusicQueueSize", + "8033323c": "sUnused8033323C", + "803332a0": "gAudioSessionPresets", + "80333498": "gAudioCosineTable", + "80333598": "gPitchBendFrequencyScale", + "80333994": "gNoteFrequencies", + "80333b94": "gDefaultShortNoteVelocityTable", + "80333ba4": "gDefaultShortNoteDurationTable", + "80333bb4": "gVibratoCurve", + "80333bc4": "gDefaultEnvelope", + "80333bd0": "sSineWave", + "80333c50": "sSquareWave", + "80333cd0": "sTriangleWave", + "80333d50": "sSawtoothWave", + "80333dd0": "gWaveSamples", + "80333de0": "gHeadsetPanQuantization", + "80333df4": "gHeadsetPanVolume", + "80333ff4": "gStereoPanVolume", + "803341f4": "gDefaultPanVolume", + "803343f4": "gVolRampingLhs136", + "803345f4": "gVolRampingRhs136", + "803347f4": "gVolRampingLhs144", + "803349f4": "gVolRampingRhs144", + "80334bf4": "gVolRampingLhs128", + "80334df4": "gVolRampingRhs128", + "80334ff4": "gTatumsPerBeat", + "80334ff8": "gUnusedCount80333EE8", + "80334ffc": "gAudioHeapSize", + "80335000": "D_80333EF0", + "80335004": "gAudioLoadLock", + "80335008": "sUnused8033EF8", + "80335010": "osViModeTable", + "803358f0": "piMgrArgs", + "80335910": "osClockRate", + "80335918": "D_80334808", + "80335920": "_osContInitialized", + "80335930": "D_80334820", + "80335940": "D_80334830", + "80335950": "_spaces", + "80335974": "_zeroes", + "803359a0": "D_80334890", + "803359a4": "D_80334894", + "803359a8": "D_80334898", + "803359ac": "D_8033489C", + "803359b0": "D_803348A0", + "803359b4": "D_803348A4", + "803359c0": "D_803348B0", + "80335a20": "D_80334910", + "80335a24": "D_80334914", + "80335a28": "D_80334918", + "80335a2c": "D_8033491C", + "80335a30": "D_80334920", + "80335a44": "D_80334934", + "80335a48": "D_80334938", + "80335a50": "gOsPiAccessQueueCreated", + "80335a60": "gOsSiAccessQueueCreated", + "80335aa0": "D_80334990", + "80335af0": "D_803349E0", + "80335b40": "D_80334A30", + "80335b44": "D_80334A34", + "80335b48": "D_80334A38", + "80335b50": "D_80334A40", + "80335b54": "D_80334A44", + "80338e60": "jtbl_80337C90", + "80338e84": "jtbl_80337CB4", + "80338eac": "jtbl_80337CDC", + "80338ec0": "jtbl_80337D08", + "80338fbc": "jtbl_80337E04", + "8033978c": "jtbl_80338418", + "80339880": "length_str", + "80339884": "flags_str", + "8033988c": "flags_arr", + "80339980": "D_80338610", + "803399a0": "jtbl_80338630", + "803399d0": "NAN", + "803399e0": "D_80338670", + "80339a40": "D_803386D0", + "80339ac0": "rspF3DDataStart", + "8033a2c0": "rspF3DDataEnd", + "8033a2c0": "rspAspMainDataStart", + "8033a580": "rspAspMainDataEnd", + "8033a580": "_mainSegmentEnd", + "008c0c40": "_mainSegmentRomEnd", + "8033a580": "_mainSegmentNoloadStart", + "8033a580": "D_80339210", + "8033a730": "gIdleThread", + "8033a8e0": "gMainThread", + "8033aa90": "gGameLoopThread", + "8033ac40": "gSoundThread", + "8033adf0": "gPIMesgQueue", + "8033ae08": "gIntrMesgQueue", + "8033ae20": "gSPTaskMesgQueue", + "8033ae38": "gDmaMesgBuf", + "8033ae40": "gPIMesgBuf", + "8033aec0": "gSIEventMesgBuf", + "8033aec8": "gIntrMesgBuf", + "8033af08": "gUnknownMesgBuf", + "8033af48": "gDmaIoMesg", + "8033af5c": "D_80339BEC", + "8033af60": "gDmaMesgQueue", + "8033af78": "gSIEventMesgQueue", + "8033af90": "gControllers", + "8033afe8": "gControllerStatuses", + "8033aff8": "gControllerPads", + "8033b010": "gGameVblankQueue", + "8033b028": "D_80339CB8", + "8033b040": "D_80339CD0", + "8033b044": "D_80339CD4", + "8033b048": "gGameVblankHandler", + "8033b050": "gPhysicalFrameBuffers", + "8033b05c": "gPhysicalZBuffer", + "8033b060": "D_80339CF0", + "8033b064": "D_80339CF4", + "8033b068": "gGfxSPTask", + "8033b06c": "gDisplayListHead", + "8033b070": "gGfxPoolEnd", + "8033b074": "gGfxPool", + "8033b078": "gControllerBits", + "8033b079": "gEepromProbe", + "8033b080": "D_80339D10", + "8033b090": "gDemo", + "8033b0a0": "filler80339D30", + "8033b170": "gMarioStates", + "8033b238": "sCurrPlayMode", + "8033b23a": "D_80339ECA", + "8033b23c": "sTransitionTimer", + "8033b240": "sTransitionUpdate", + "8033b244": "unused3", + "8033b248": "sWarpDest", + "8033b250": "D_80339EE0", + "8033b252": "sDelayedWarpOp", + "8033b254": "sDelayedWarpTimer", + "8033b256": "sSourceWarpNodeId", + "8033b258": "sDelayedWarpArg", + "8033b25c": "unused4", + "8033b25e": "sTimerRunning", + "8033b260": "gHudDisplay", + "8033b26e": "gShouldNotPlayCastleMusic", + "8033b270": "sDelayInvincTimer", + "8033b272": "sInvulnerable", + "8033b280": "unused80339F10", + "8033b288": "filler80339F1C", + "8033b2c0": "sFloorAlignMatrix", + "8033b350": "gMirrorMario", + "8033b3b0": "gBodyStates", + "8033b400": "sSegmentTable", + "8033b480": "sPoolFreeSpace", + "8033b484": "sPoolStart", + "8033b488": "sPoolEnd", + "8033b48c": "sPoolListHeadL", + "8033b490": "sPoolListHeadR", + "8033b494": "gEffectsMemoryPool", + "8033b4a0": "gWarpCheckpoint", + "8033b4a5": "gMainMenuDataModified", + "8033b4a6": "gSaveFileModified", + "8033b4b0": "gPlayerSpawnInfos", + "8033b4d0": "D_8033A160", + "8033b8d0": "gAreaData", + "8033bab0": "gWarpTransition", + "8033bac6": "gCurrCourseNum", + "8033bac8": "gCurrActNum", + "8033baca": "gCurrAreaIndex", + "8033bacc": "gSavedCourseNum", + "8033bace": "gPauseScreenMode", + "8033bad0": "gSaveOptSelectIndex", + "8033bae0": "gMatStackIndex", + "8033bae8": "gMatStack", + "8033c2e8": "gMatStackFixed", + "8033c368": "gGeoTempState", + "8033c378": "gCurAnimType", + "8033c379": "gCurAnimEnabled", + "8033c37a": "gCurrAnimFrame", + "8033c37c": "gCurAnimTranslationMultiplier", + "8033c380": "gCurrAnimAttribute", + "8033c384": "gCurAnimData", + "8033c388": "gDisplayListHeap", + "8033c390": "gProfilerFrameData", + "8033c520": "gPlayerCameraState", + "8033c568": "sOldPosition", + "8033c578": "sOldFocus", + "8033c588": "sPlayer2FocusOffset", + "8033c594": "sCreditsPlayer2Pitch", + "8033c596": "sCreditsPlayer2Yaw", + "8033c598": "sFramesPaused", + "8033c5a0": "sFOVState", + "8033c5c0": "sModeTransition", + "8033c5e8": "sMarioGeometry", + "8033c61c": "unusedFreeRoamWallYaw", + "8033c61e": "sAvoidYawVel", + "8033c620": "sCameraYawAfterDoorCutscene", + "8033c622": "unusedSplinePitch", + "8033c624": "unusedSplineYaw", + "8033c628": "sHandheldShakeSpline", + "8033c668": "sHandheldShakeMag", + "8033c66c": "sHandheldShakeTimer", + "8033c670": "sHandheldShakeInc", + "8033c674": "sHandheldShakePitch", + "8033c676": "sHandheldShakeYaw", + "8033c678": "sHandheldShakeRoll", + "8033c67c": "unused8033B30C", + "8033c680": "unused8033B310", + "8033c684": "sSelectionFlags", + "8033c686": "unused8033B316", + "8033c688": "s2ndRotateFlags", + "8033c68a": "unused8033B31A", + "8033c68c": "sCameraSoundFlags", + "8033c68e": "sCButtonsPressed", + "8033c690": "sCutsceneDialogID", + "8033c698": "gLakituState", + "8033c758": "unused8033B3E8", + "8033c75a": "sAreaYaw", + "8033c75c": "sAreaYawChange", + "8033c75e": "sLakituDist", + "8033c760": "sLakituPitch", + "8033c764": "sZoomAmount", + "8033c768": "sCSideButtonYaw", + "8033c76a": "sBehindMarioSoundTimer", + "8033c76c": "sZeroZoomDist", + "8033c770": "sCUpCameraPitch", + "8033c772": "sModeOffsetYaw", + "8033c774": "sSpiralStairsYawOffset", + "8033c776": "s8DirModeBaseYaw", + "8033c778": "s8DirModeYawOffset", + "8033c77c": "sPanDistance", + "8033c780": "sCannonYOffset", + "8033c788": "sModeInfo", + "8033c7d0": "sCastleEntranceOffset", + "8033c7dc": "sParTrackIndex", + "8033c7e0": "sParTrackPath", + "8033c7e8": "sParTrackTransOff", + "8033c808": "sCameraStoreCUp", + "8033c828": "sCameraStoreCutscene", + "8033c848": "gCameraMovementFlags", + "8033c84a": "sStatusFlags", + "8033c850": "sCurCreditsSplinePos", + "8033c950": "sCurCreditsSplineFocus", + "8033ca50": "sCutsceneSplineSegment", + "8033ca54": "sCutsceneSplineSegmentProgress", + "8033ca58": "unused8033B6E8", + "8033ca5a": "sCutsceneShot", + "8033ca5c": "gCutsceneTimer", + "8033ca60": "sCutsceneVars", + "8033cbc8": "gObjCutsceneDone", + "8033cbcc": "gCutsceneObjSpawn", + "8033cbd0": "gCamera", + "8033cbe0": "gObjectListArray", + "8033d260": "gDebugInfoFlags", + "8033d264": "gNumFindFloorMisses", + "8033d268": "unused_8033BEF8", + "8033d26c": "gUnknownWallCount", + "8033d270": "gObjectCounter", + "8033d274": "gNumCalls", + "8033d280": "gDebugInfo", + "8033d380": "gDebugInfoOverwrite", + "8033d480": "gTimeStopState", + "8033d488": "gObjectPool", + "80360e88": "gMacroObjectDefaultParent", + "803610e8": "gObjectLists", + "803610f0": "gFreeObjectList", + "80361158": "gMarioObject", + "8036115c": "gLuigiObject", + "80361160": "gCurrentObject", + "80361164": "gCurBhvCommand", + "80361168": "gPrevFrameObjectCount", + "8036116c": "gSurfaceNodesAllocated", + "80361170": "gSurfacesAllocated", + "80361174": "gNumStaticSurfaceNodes", + "80361178": "gNumStaticSurfaces", + "8036117c": "gObjectMemoryPool", + "80361180": "gCheckingSurfaceCollisionsForCamera", + "80361182": "gFindFloorIncludeSurfaceIntangible", + "80361184": "gEnvironmentRegions", + "80361188": "gEnvironmentLevels", + "803611d8": "gDoorAdjacentRooms", + "80361250": "gMarioCurrentRoom", + "80361252": "D_8035FEE2", + "80361254": "D_8035FEE4", + "80361256": "gTHIWaterDrained", + "80361258": "gTTCSpeedSetting", + "8036125a": "gMarioShotFromCannon", + "8036125c": "gCCMEnteredSlide", + "8036125e": "gNumRoomedObjectsInMarioRoom", + "80361260": "gNumRoomedObjectsNotInMarioRoom", + "80361262": "gWDWWaterLevelChanging", + "80361264": "gMarioOnMerryGoRound", + "80361280": "D_8035FF10", + "80361290": "gDebugPrintState1", + "803612a0": "gDebugPrintState2", + "803612b0": "sMarioOnFlyingCarpet", + "803612b2": "sSurfaceTypeBelowShadow", + "803612b4": "gShadowAboveWaterOrLava", + "803612b5": "gMarioOnIceOrCarpet", + "803612c0": "sSkyBoxInfo", + "803612e0": "gMovetexLastTextureId", + "803612f0": "gFlyingCarpetState", + "80361300": "gPaintingMarioFloorType", + "80361304": "gPaintingMarioXPos", + "80361308": "gPaintingMarioYPos", + "8036130c": "gPaintingMarioZPos", + "80361310": "gPaintingMesh", + "80361314": "gPaintingTriNorms", + "80361318": "gRipplingPainting", + "8036131c": "gDddPaintingStatus", + "80361320": "sTextLabels", + "803613f0": "gDialogColorFadeTimer", + "803613f2": "gLastDialogLineNum", + "803613f4": "gDialogVariable", + "803613f8": "gDialogTextAlpha", + "803613fa": "gCutsceneMsgXOffset", + "803613fc": "gCutsceneMsgYOffset", + "803613fe": "gRedCoinsCollected", + "80361400": "gEnvFxBuffer", + "80361408": "gSnowCylinderLastPos", + "80361414": "gSnowParticleCount", + "80361416": "gSnowParticleMaxCount", + "80361420": "gEnvFxBubbleConfig", + "80361460": "sNumActiveFirePiranhaPlants", + "80361464": "sNumKilledFirePiranhaPlants", + "80361468": "sObjSavedPosX", + "8036146c": "sObjSavedPosY", + "80361470": "sObjSavedPosZ", + "80361474": "sMontyMoleHoleList", + "80361478": "sMontyMoleKillStreak", + "8036147c": "sMontyMoleLastKilledPosX", + "80361480": "sMontyMoleLastKilledPosY", + "80361484": "sMontyMoleLastKilledPosZ", + "80361488": "sMasterTreadmill", + "80361490": "gCurrAiBuffer", + "80361498": "sSoundRequests", + "80361c98": "D_80360928", + "80361f98": "sUsedChannelsForSoundBank", + "80361fa8": "sCurrentSound", + "80361fb8": "gSoundBanks", + "80364b78": "D_80363808", + "80364b82": "D_80363812", + "80364b88": "sBackgroundMusicQueue", + "80364ba0": "D_80363830", + "80364c20": "D_803638B0", + "80365e70": "piMgrThread", + "80366020": "piMgrStack", + "80367020": "__osPiMesgQueue", + "80367038": "piMgrMesgBuff", + "80367040": "D_80365CD0", + "80367050": "_osContCmdBuf", + "8036708c": "_osContPifCtrl", + "80367090": "_osLastSentSiCmd", + "80367091": "_osContNumControllers", + "80367098": "D_80365D28", + "803670b8": "_osContMesgQueue", + "803670d0": "_osContMesgBuff", + "803670f0": "D_80365D80", + "80367110": "_osCurrentTime", + "80367118": "D_80365DA8", + "8036711c": "__osViIntrCount", + "80367120": "D_80365DB0", + "80367130": "osPiMesgBuff", + "80367138": "gOsPiMessageQueue", + "80367150": "osSiMesgBuff", + "80367158": "gOsSiMessageQueue", + "80367170": "D_80365E00", + "803671ac": "D_80365E3C", + "803671b0": "D_80365E40", + "803672b0": "gInterruptedThread", + "80367460": ".", + "80367460": "_mainSegmentNoloadEnd", + "0000cee0": "_mainSegmentNoloadSizeLo", + "00000002": "_mainSegmentNoloadSizeHi", + "00000001": "ASSERT", + "80378800": "_engineSegmentStart", + "007cc6c0": "_engineSegmentRomStart", + "80378800": "vec3f_copy", + "80378840": "vec3f_set", + "8037888c": "vec3f_add", + "803788e4": "vec3f_sum", + "8037893c": "vec3s_copy", + "8037897c": "vec3s_set", + "803789c8": "vec3s_add", + "80378a20": "vec3s_sum", + "80378a78": "vec3s_sub", + "80378ad0": "vec3s_to_vec3f", + "80378b34": "vec3f_to_vec3s", + "80378c50": "find_vector_perpendicular_to_plane", + "80378d38": "vec3f_cross", + "80378dc0": "vec3f_normalize", + "80378e68": "mtxf_copy", + "80378eb4": "mtxf_identity", + "80378f24": "mtxf_translate", + "80378f84": "mtxf_lookat", + "80379440": "mtxf_rotate_zxy_and_translate", + "803795f0": "mtxf_rotate_xyz_and_translate", + "80379798": "mtxf_billboard", + "80379918": "mtxf_align_terrain_normal", + "80379aa4": "mtxf_align_terrain_triangle", + "80379f60": "mtxf_mul", + "8037a29c": "mtxf_scale_vec3f", + "8037a348": "mtxf_mul_vec3s", + "8037a434": "mtxf_to_mtx", + "8037a4b8": "mtxf_rotate_xy", + "8037a550": "get_pos_from_transform_mtx", + "8037a69c": "vec3f_get_dist_and_angle", + "8037a788": "vec3f_set_dist_and_angle", + "8037a860": "approach_s32", + "8037a8b4": "approach_f32", + "8037a9a8": "atan2s", + "8037ab88": "atan2f", + "8037abec": "spline_get_weights", + "8037afb8": "anim_spline_init", + "8037afe8": "anim_spline_poll", + "8037b220": "init_scene_graph_node_links", + "8037b24c": "init_graph_node_root", + "8037b30c": "init_graph_node_ortho_projection", + "8037b380": "init_graph_node_perspective", + "8037b448": "init_graph_node_start", + "8037b4ac": "init_graph_node_master_list", + "8037b530": "init_graph_node_render_range", + "8037b5b4": "init_graph_node_switch_case", + "8037b670": "init_graph_node_camera", + "8037b744": "init_graph_node_translation_rotation", + "8037b7f8": "init_graph_node_translation", + "8037b89c": "init_graph_node_rotation", + "8037b940": "init_graph_node_scale", + "8037b9e0": "init_graph_node_object", + "8037bad4": "init_graph_node_culling_radius", + "8037bb48": "init_graph_node_animated_part", + "8037bbec": "init_graph_node_billboard", + "8037bc90": "init_graph_node_display_list", + "8037bd24": "init_graph_node_shadow", + "8037bdb4": "init_graph_node_object_parent", + "8037be28": "init_graph_node_generated", + "8037becc": "init_graph_node_background", + "8037bf84": "init_graph_node_held_object", + "8037c044": "geo_add_child", + "8037c0bc": "geo_remove_child", + "8037c138": "geo_make_first_child", + "8037c1e4": "geo_call_global_function_nodes_helper", + "8037c360": "geo_call_global_function_nodes", + "8037c3d0": "geo_reset_object_node", + "8037c448": "geo_obj_init", + "8037c51c": "geo_obj_init_spawninfo", + "8037c658": "geo_obj_init_animation", + "8037c708": "geo_obj_init_animation_accel", + "8037c7d8": "retrieve_animation_index", + "8037c844": "geo_update_animation_frame", + "8037c9e8": "geo_retreive_animation_translation", + "8037cb10": "geo_find_root", + "8037cb60": "read_vec3s_to_vec3f", + "8037cbc0": "read_vec3s", + "8037cbfc": "read_vec3s_angle", + "8037cc74": "register_scene_graph_node", + "8037cd60": "geo_layout_cmd_branch_and_link", + "8037ce24": "geo_layout_cmd_end", + "8037cee8": "geo_layout_cmd_branch", + "8037cf70": "geo_layout_cmd_return", + "8037cfc0": "geo_layout_cmd_open_node", + "8037d018": "geo_layout_cmd_close_node", + "8037d050": "geo_layout_cmd_assign_as_view", + "8037d0d0": "geo_layout_cmd_update_node_flags", + "8037d1d0": "geo_layout_cmd_node_root", + "8037d328": "geo_layout_cmd_node_ortho_projection", + "8037d3a4": "geo_layout_cmd_node_perspective", + "8037d48c": "geo_layout_cmd_node_start", + "8037d4dc": "geo_layout_cmd_nop3", + "8037d500": "geo_layout_cmd_node_master_list", + "8037d55c": "geo_layout_cmd_node_level_of_detail", + "8037d5d4": "geo_layout_cmd_node_switch_case", + "8037d640": "geo_layout_cmd_node_camera", + "8037d6f0": "geo_layout_cmd_node_translation_rotation", + "8037d8d4": "geo_layout_cmd_node_translation", + "8037d998": "geo_layout_cmd_node_rotation", + "8037da5c": "geo_layout_cmd_node_scale", + "8037db50": "geo_layout_cmd_nop2", + "8037db74": "geo_layout_cmd_node_animated_part", + "8037dc10": "geo_layout_cmd_node_billboard", + "8037dcd4": "geo_layout_cmd_node_display_list", + "8037dd4c": "geo_layout_cmd_node_shadow", + "8037dddc": "geo_layout_cmd_node_object_parent", + "8037de34": "geo_layout_cmd_node_generated", + "8037de94": "geo_layout_cmd_node_background", + "8037def8": "geo_layout_cmd_nop", + "8037df1c": "geo_layout_cmd_copy_view", + "8037dfd4": "geo_layout_cmd_node_held_obj", + "8037e058": "geo_layout_cmd_node_culling_radius", + "8037e0b4": "process_geo_layout", + "803805c8": "level_script_execute", + "80380de8": "f32_find_wall_collision", + "80380e8c": "find_wall_collisions", + "80381264": "find_ceil", + "80381470": "unused_obj_find_floor_height", + "803814b8": "find_floor_height_and_data", + "80381794": "find_floor_height", + "803817e0": "unused_find_dynamic_floor", + "80381900": "find_floor", + "80381ba0": "find_water_level", + "80381d3c": "find_poison_gas_level", + "80381f08": "debug_surface_list_info", + "80382294": "unused_resolve_floor_or_ceil_collisions", + "80383340": "alloc_surface_pools", + "803833b8": "load_area_terrain", + "803835a4": "clear_dynamic_surfaces", + "80383614": "transform_object_vertices", + "80383828": "load_object_surfaces", + "803839cc": "load_object_collision_model", + "80383bb0": "random_u16", + "80383cb4": "random_float", + "80383d1c": "random_sign", + "80383d68": "obj_update_gfx_pos_and_angle", + "80385bf0": "stub_behavior_script_2", + "80385c00": "cur_obj_update", + "80385f90": "identityMtx", + "80385fb0": "zeroMtx", + "80385fd0": "gVec3fZero", + "80385fdc": "gVec3sZero", + "80385fe4": "gVec3fOne", + "80385ff0": "gVec3sOne", + "80386000": "gSineTable", + "80387000": "gCosineTable", + "8038b000": "gArctanTable", + "8038b810": "GeoLayoutJumpTable", + "8038b894": "unused_8038B894", + "8038bc90": "_engineSegmentEnd", + "007dfb50": "_engineSegmentRomEnd", + "8038bc90": "_engineSegmentNoloadStart", + "8038bc90": "gSplineKeyframe", + "8038bc94": "gSplineKeyframeFraction", + "8038bc98": "gSplineState", + "8038bca0": "gGraphNodePool", + "8038bca4": "gCurRootGraphNode", + "8038bca8": "D_8038BCA8", + "8038bcac": "gGeoViews", + "8038bcb0": "gGeoNumViews", + "8038bcb8": "gGeoLayoutStack", + "8038bcf8": "gCurGraphNodeList", + "8038bd78": "gCurGraphNodeIndex", + "8038bd7a": "gGeoLayoutStackIndex", + "8038bd7c": "D_8038BD7C", + "8038bd7e": "gGeoLayoutReturnIndex", + "8038bd80": "gGeoLayoutCommand", + "8038bd88": "gObjParentGraphNode", + "8038be30": "sFloorGeo", + "8038be90": "unused8038BE90", + "8038be98": "gStaticSurfacePartition", + "8038d698": "gDynamicSurfacePartition", + "8038ee98": "sSurfaceNodePool", + "8038ee9c": "sSurfacePool", + "8038eea0": "sSurfacePoolSize", + "8038eea8": "unused8038EEA8", + "8038eef0": "_engineSegmentNoloadEnd", + "00000001": "ASSERT", + "8038f800": ".", + "8038f800": "_framebuffersSegmentNoloadStart", + "8038f800": "0x70800", + "8038f800": "gFrameBuffer0", + "803b5000": "gFrameBuffer1", + "803da800": "gFrameBuffer2", + "80400000": "_framebuffersSegmentNoloadEnd", + "80400000": "__expansionRamStart", + "00000001": "ASSERT", + "10000000": "_entrySegmentStart", + "007cc6c0": "_entrySegmentRomStart", + "10000000": "level_script_entry", + "10000030": "_entrySegmentEnd", + "007cc6f0": "_entrySegmentRomEnd", + "02000000": "_segment2_mio0SegmentStart", + "007cc6c0": "_segment2_mio0SegmentRomStart", + "0200bd10": ".", + "0200bd10": "_segment2_mio0SegmentEnd", + "007d83d0": "_segment2_mio0SegmentRomEnd", + "04000000": "_group0_mio0SegmentStart", + "007cc6c0": "_group0_mio0SegmentRomStart", + "04013260": ".", + "04013260": "_group0_mio0SegmentEnd", + "007df920": "_group0_mio0SegmentRomEnd", + "17000000": "_group0_geoSegmentStart", + "007cc6c0": "_group0_geoSegmentRomStart", + "17000000": "bubble_geo", + "1700001c": "purple_marble_geo", + "17000038": "smoke_geo", + "17000084": "burn_smoke_geo", + "1700009c": "small_water_splash_geo", + "170000e0": "mario_TODO_geo_0000E0", + "17000124": "idle_water_wave_geo", + "17000168": "wave_trail_geo", + "170001bc": "sparkles_geo", + "17000230": "water_splash_geo", + "17000284": "sparkles_animation_geo", + "170002e0": "mario_geo_face_and_wings", + "1700041c": "mario_geo_left_hand", + "17000494": "mario_geo_right_hand", + "1700053c": "mario_geo_body", + "170006f8": "mario_geo_medium_poly_left_hand", + "17000770": "mario_geo_medium_poly_right_hand", + "17000818": "mario_geo_medium_poly_body", + "170009d4": "mario_geo_low_poly_face_and_wings", + "17000b10": "mario_geo_low_poly_left_hand", + "17000b88": "mario_geo_low_poly_right_hand", + "17000c30": "mario_geo_low_poly_body", + "17000dec": "mario_vanish_geo_face_and_wings", + "17000f28": "mario_vanish_geo_left_hand", + "17000fa0": "mario_vanish_geo_right_hand", + "17001048": "mario_vanish_geo_body", + "17001204": "mario_vanish_geo_medium_poly_left_hand", + "1700127c": "mario_vanish_geo_medium_poly_right_hand", + "17001324": "mario_vanish_geo_medium_poly_body", + "170014e0": "mario_vanish_geo_low_poly_face_and_wings", + "1700161c": "mario_vanish_geo_low_poly_left_hand", + "17001694": "mario_vanish_geo_low_poly_right_hand", + "1700173c": "mario_vanish_geo_low_poly_body", + "170018f8": "mario_metal_geo_face_and_wings", + "170019a4": "mario_metal_geo_left_hand", + "17001a1c": "mario_metal_geo_right_hand", + "17001ac4": "mario_metal_geo_body", + "17001c80": "mario_metal_geo_medium_poly_left_hand", + "17001cf8": "mario_metal_geo_medium_poly_right_hand", + "17001da0": "mario_metal_geo_medium_poly_body", + "17001f5c": "mario_metal_geo_low_poly_face_and_wings", + "17002008": "mario_metal_geo_low_poly_left_hand", + "17002080": "mario_metal_geo_low_poly_right_hand", + "17002128": "mario_metal_geo_low_poly_body", + "170022e4": "mario_metal_vanish_geo_face_and_wings", + "17002390": "mario_metal_vanish_geo_left_hand", + "17002408": "mario_metal_vanish_geo_right_hand", + "170024b0": "mario_metal_vanish_geo_body", + "1700266c": "mario_metal_vanish_geo_medium_poly_left_hand", + "170026e4": "mario_metal_vanish_geo_medium_poly_right_hand", + "1700278c": "mario_metal_vanish_geo_medium_poly_body", + "17002958": "mario_metal_vanish_geo_low_poly_face_and_wings", + "17002a04": "mario_metal_vanish_geo_low_poly_left_hand", + "17002a7c": "mario_metal_vanish_geo_low_poly_right_hand", + "17002b24": "mario_metal_vanish_geo_low_poly_body", + "17002ce0": "mario_geo_load_body", + "17002d14": "mario_geo_load_medium_poly_body", + "17002d48": "mario_geo_load_low_poly_body", + "17002d7c": "mario_geo_render_body", + "17002dd4": "mario_geo", + "17002e30": "_group0_geoSegmentEnd", + "007cf4f0": "_group0_geoSegmentRomEnd", + "05000000": "_group1_mio0SegmentStart", + "007cc6c0": "_group1_mio0SegmentRomStart", + "05008070": ".", + "05008070": "_group1_mio0SegmentEnd", + "007d4730": "_group1_mio0SegmentRomEnd", + "0c000000": "_group1_geoSegmentStart", + "007cc6c0": "_group1_geoSegmentRomStart", + "0c000000": "yellow_sphere_geo", + "0c000018": "hoot_geo", + "0c0001e4": "yoshi_egg_geo", + "0c000248": "thwomp_geo", + "0c000264": "bullet_bill_geo", + "0c00028c": "heave_ho_geo", + "0c000410": "_group1_geoSegmentEnd", + "007ccad0": "_group1_geoSegmentRomEnd", + "05000000": "_group2_mio0SegmentStart", + "007cc6c0": "_group2_mio0SegmentRomStart", + "05001e10": ".", + "05001e10": "_group2_mio0SegmentEnd", + "007ce4d0": "_group2_mio0SegmentRomEnd", + "0c000000": "_group2_geoSegmentStart", + "007cc6c0": "_group2_geoSegmentRomStart", + "0c000000": "bully_geo", + "0c000120": "bully_boss_geo", + "0c000240": "blargg_geo", + "0c0002b0": "_group2_geoSegmentEnd", + "007cc970": "_group2_geoSegmentRomEnd", + "05000000": "_group3_mio0SegmentStart", + "007cc6c0": "_group3_mio0SegmentRomStart", + "050068b0": ".", + "050068b0": "_group3_mio0SegmentEnd", + "007d2f70": "_group3_mio0SegmentRomEnd", + "0c000000": "_group3_geoSegmentStart", + "007cc6c0": "_group3_geoSegmentRomStart", + "0c000000": "king_bobomb_geo", + "0c000308": "water_bomb_geo", + "0c000328": "water_bomb_shadow_geo", + "0c000340": "_group3_geoSegmentEnd", + "007cca00": "_group3_geoSegmentRomEnd", + "05000000": "_group4_mio0SegmentStart", + "007cc6c0": "_group4_mio0SegmentRomStart", + "0500a300": ".", + "0500a300": "_group4_mio0SegmentEnd", + "007d69c0": "_group4_mio0SegmentRomEnd", + "0c000000": "_group4_geoSegmentStart", + "007cc6c0": "_group4_geoSegmentRomStart", + "0c000000": "clam_shell_geo", + "0c000068": "sushi_geo", + "0c00010c": "unagi_geo", + "0c000280": "_group4_geoSegmentEnd", + "007cc940": "_group4_geoSegmentRomEnd", + "05000000": "_group5_mio0SegmentStart", + "007cc6c0": "_group5_mio0SegmentRomStart", + "0500bce0": ".", + "0500bce0": "_group5_mio0SegmentEnd", + "007d83a0": "_group5_mio0SegmentRomEnd", + "0c000000": "_group5_geoSegmentStart", + "007cc6c0": "_group5_geoSegmentRomStart", + "0c000000": "klepto_geo", + "0c0002ac": "eyerok_geo_0002AC", + "0c0005a8": "eyerok_left_hand_geo", + "0c0005e4": "eyerok_right_hand_geo", + "0c000610": "pokey_head_geo", + "0c000644": "pokey_body_part_geo", + "0c000660": "_group5_geoSegmentEnd", + "007ccd20": "_group5_geoSegmentRomEnd", + "05000000": "_group6_mio0SegmentStart", + "007cc6c0": "_group6_mio0SegmentRomStart", + "0500e110": ".", + "0500e110": "_group6_mio0SegmentEnd", + "007da7d0": "_group6_mio0SegmentRomEnd", + "0c000000": "_group6_geoSegmentStart", + "007cc6c0": "_group6_geoSegmentRomStart", + "0c000000": "monty_mole_geo", + "0c000110": "ukiki_geo", + "0c00036c": "fwoosh_geo", + "0c000390": "_group6_geoSegmentEnd", + "007cca50": "_group6_geoSegmentRomEnd", + "05000000": "_group7_mio0SegmentStart", + "007cc6c0": "_group7_mio0SegmentRomStart", + "05005070": ".", + "05005070": "_group7_mio0SegmentEnd", + "007d1730": "_group7_mio0SegmentRomEnd", + "0c000000": "_group7_geoSegmentStart", + "007cc6c0": "_group7_geoSegmentRomStart", + "0c000000": "spindrift_geo", + "0c000104": "penguin_geo", + "0c00021c": "mr_blizzard_hidden_geo", + "0c000348": "mr_blizzard_geo", + "0c000370": "_group7_geoSegmentEnd", + "007cca30": "_group7_geoSegmentRomEnd", + "05000000": "_group8_mio0SegmentStart", + "007cc6c0": "_group8_mio0SegmentRomStart", + "05001180": ".", + "05001180": "_group8_mio0SegmentEnd", + "007cd840": "_group8_mio0SegmentRomEnd", + "0c000000": "_group8_geoSegmentStart", + "007cc6c0": "_group8_geoSegmentRomStart", + "0c000000": "springboard_top_geo", + "0c000018": "springboard_spring_geo", + "0c000030": "springboard_bottom_geo", + "0c000048": "cap_switch_geo", + "0c000090": "_group8_geoSegmentEnd", + "007cc750": "_group8_geoSegmentRomEnd", + "05000000": "_group9_mio0SegmentStart", + "007cc6c0": "_group9_mio0SegmentRomStart", + "05006960": ".", + "05006960": "_group9_mio0SegmentEnd", + "007d3020": "_group9_mio0SegmentRomEnd", + "0c000000": "_group9_geoSegmentStart", + "007cc6c0": "_group9_geoSegmentRomStart", + "0c000000": "bookend_part_geo", + "0c0000c0": "bookend_geo", + "0c0000d8": "haunted_chair_geo", + "0c000188": "small_key_geo", + "0c0001b4": "mad_piano_geo", + "0c000224": "boo_geo", + "0c000274": "haunted_cage_geo", + "0c0002b0": "_group9_geoSegmentEnd", + "007cc970": "_group9_geoSegmentRomEnd", + "05000000": "_group10_mio0SegmentStart", + "007cc6c0": "_group10_mio0SegmentRomStart", + "05012cd0": ".", + "05012cd0": "_group10_mio0SegmentEnd", + "007df390": "_group10_mio0SegmentRomEnd", + "0c000000": "_group10_geoSegmentStart", + "007cc6c0": "_group10_geoSegmentRomStart", + "0c000000": "birds_geo", + "0c000098": "peach_geo_000098", + "0c000254": "peach_geo_000254", + "0c000410": "peach_geo", + "0c000468": "yoshi_geo", + "0c000670": "_group10_geoSegmentEnd", + "007ccd30": "_group10_geoSegmentRomEnd", + "05000000": "_group11_mio0SegmentStart", + "007cc6c0": "_group11_mio0SegmentRomStart", + "050073f0": ".", + "050073f0": "_group11_mio0SegmentEnd", + "007d3ab0": "_group11_mio0SegmentRomEnd", + "0c000000": "_group11_geoSegmentStart", + "007cc6c0": "_group11_geoSegmentRomStart", + "0c000000": "bubba_geo", + "0c000030": "wiggler_head_geo", + "0c0001bc": "enemy_lakitu_geo", + "0c000290": "spiny_ball_geo", + "0c000328": "spiny_geo", + "0c0004a0": "_group11_geoSegmentEnd", + "007ccb60": "_group11_geoSegmentRomEnd", + "06000000": "_group12_mio0SegmentStart", + "007cc6c0": "_group12_mio0SegmentRomStart", + "06030c30": ".", + "06030c30": "_group12_mio0SegmentEnd", + "007fd2f0": "_group12_mio0SegmentRomEnd", + "0d000000": "_group12_geoSegmentStart", + "007cc6c0": "_group12_geoSegmentRomStart", + "0d000000": "bowser_flames_geo", + "0d000090": "invisible_bowser_accessory_geo", + "0d0000b0": "bowser_1_yellow_sphere_geo", + "0d0000d8": "bowser_geo_0000D8", + "0d000424": "bowser_geo_000424", + "0d000770": "bowser_geo_000770", + "0d000ab8": "bowser_shadow_geo", + "0d000ac4": "bowser_geo", + "0d000b40": "bowser2_geo", + "0d000bbc": "bowser_bomb_geo", + "0d000bfc": "bowser_impact_smoke_geo", + "0d000c50": "_group12_geoSegmentEnd", + "007cd310": "_group12_geoSegmentRomEnd", + "06000000": "_group13_mio0SegmentStart", + "007cc6c0": "_group13_mio0SegmentRomStart", + "0600a0f0": ".", + "0600a0f0": "_group13_mio0SegmentEnd", + "007d67b0": "_group13_mio0SegmentRomEnd", + "0d000000": "_group13_geoSegmentStart", + "007cc6c0": "_group13_geoSegmentRomStart", + "0d000000": "skeeter_geo", + "0d000284": "seaweed_geo", + "0d0002f4": "water_mine_geo", + "0d000324": "cyan_fish_geo", + "0d00038c": "bub_geo", + "0d000414": "water_ring_geo", + "0d000450": "treasure_chest_base_geo", + "0d000468": "treasure_chest_lid_geo", + "0d000480": "_group13_geoSegmentEnd", + "007ccb40": "_group13_geoSegmentRomEnd", + "06000000": "_group14_mio0SegmentStart", + "007cc6c0": "_group14_mio0SegmentRomStart", + "06013a60": ".", + "06013a60": "_group14_mio0SegmentEnd", + "007e0120": "_group14_mio0SegmentRomEnd", + "0d000000": "_group14_geoSegmentStart", + "007cc6c0": "_group14_geoSegmentRomStart", + "0d000000": "koopa_flag_geo", + "0d0000b8": "wooden_post_geo", + "0d0000d0": "koopa_without_shell_geo", + "0d000214": "koopa_with_shell_geo", + "0d000358": "piranha_plant_geo", + "0d000480": "whomp_geo", + "0d0005d0": "metallic_ball_geo", + "0d0005ec": "chain_chomp_geo", + "0d000680": "_group14_geoSegmentEnd", + "007ccd40": "_group14_geoSegmentRomEnd", + "06000000": "_group15_mio0SegmentStart", + "007cc6c0": "_group15_mio0SegmentRomStart", + "0600c8e0": ".", + "0600c8e0": "_group15_mio0SegmentEnd", + "007d8fa0": "_group15_mio0SegmentRomEnd", + "0d000000": "_group15_geoSegmentStart", + "007cc6c0": "_group15_geoSegmentRomStart", + "0d000000": "lakitu_geo", + "0d000114": "toad_geo_000114", + "0d00027c": "toad_geo_00027C", + "0d0003e4": "toad_geo", + "0d000448": "mips_geo", + "0d0005b0": "boo_castle_geo", + "0d000600": "_group15_geoSegmentEnd", + "007cccc0": "_group15_geoSegmentRomEnd", + "06000000": "_group16_mio0SegmentStart", + "007cc6c0": "_group16_mio0SegmentRomStart", + "06002ba0": ".", + "06002ba0": "_group16_mio0SegmentEnd", + "007cf260": "_group16_mio0SegmentRomEnd", + "0d000000": "_group16_geoSegmentStart", + "007cc6c0": "_group16_geoSegmentRomStart", + "0d000000": "moneybag_geo_000000", + "0d000078": "moneybag_geo_000078", + "0d0000f0": "moneybag_geo", + "0d000150": "_group16_geoSegmentEnd", + "007cc810": "_group16_geoSegmentRomEnd", + "06000000": "_group17_mio0SegmentStart", + "007cc6c0": "_group17_mio0SegmentRomStart", + "06009c50": ".", + "06009c50": "_group17_mio0SegmentEnd", + "007d6310": "_group17_mio0SegmentRomEnd", + "0d000000": "_group17_geoSegmentStart", + "007cc6c0": "_group17_geoSegmentRomStart", + "0d000000": "mr_i_geo", + "0d00001c": "mr_i_iris_geo", + "0d0000dc": "swoop_geo", + "0d0001a0": "snufit_geo", + "0d000230": "dorrie_geo", + "0d000394": "scuttlebug_geo", + "0d0006d0": "_group17_geoSegmentEnd", + "007ccd90": "_group17_geoSegmentRomEnd", + "08000000": "_common0_mio0SegmentStart", + "007cc6c0": "_common0_mio0SegmentRomStart", + "0800e6d0": ".", + "0800e6d0": "_common0_mio0SegmentEnd", + "007dad90": "_common0_mio0SegmentRomEnd", + "0f000000": "_common0_geoSegmentStart", + "007cc6c0": "_common0_geoSegmentRomStart", + "0f000000": "blue_coin_switch_geo", + "0f000020": "test_platform_geo", + "0f000028": "amp_geo", + "0f0001a8": "cannon_base_geo", + "0f0001c0": "cannon_barrel_geo", + "0f0001d8": "chuckya_geo", + "0f0004cc": "purple_switch_geo", + "0f0004e4": "checkerboard_platform_geo", + "0f0004fc": "heart_geo", + "0f000518": "flyguy_geo", + "0f0005d0": "breakable_box_geo", + "0f000610": "breakable_box_small_geo", + "0f000640": "bowling_ball_geo", + "0f00066c": "bowling_ball_track_geo", + "0f000694": "exclamation_box_geo", + "0f0006e4": "goomba_geo", + "0f0007b8": "black_bobomb_geo", + "0f0008f4": "bobomb_buddy_geo", + "0f000a30": "metal_box_geo", + "0f000a58": "exclamation_box_outline_geo", + "0f000ab0": "koopa_shell_geo", + "0f000adc": "koopa_shell2_geo", + "0f000b08": "koopa_shell3_geo", + "0f000b40": "_common0_geoSegmentEnd", + "007cd200": "_common0_geoSegmentRomEnd", + "03000000": "_common1_mio0SegmentStart", + "007cc6c0": "_common1_mio0SegmentRomStart", + "03017990": ".", + "03017990": "_common1_mio0SegmentEnd", + "007e4050": "_common1_mio0SegmentRomEnd", + "16000000": "_common1_geoSegmentStart", + "007cc6c0": "_common1_geoSegmentRomStart", + "16000000": "mist_geo", + "16000020": "white_puff_geo", + "16000040": "explosion_geo", + "160000a8": "butterfly_geo", + "1600013c": "yellow_coin_geo", + "160001a0": "yellow_coin_no_shadow_geo", + "16000200": "blue_coin_geo", + "16000264": "blue_coin_no_shadow_geo", + "160002c4": "red_coin_geo", + "16000328": "red_coin_no_shadow_geo", + "16000388": "warp_pipe_geo", + "160003a8": "castle_door_geo", + "1600043c": "cabin_door_geo", + "160004d0": "wooden_door_geo", + "16000564": "wooden_door2_geo", + "160005f8": "metal_door_geo", + "1600068c": "hazy_maze_door_geo", + "16000720": "haunted_door_geo", + "160007b4": "castle_door_0_star_geo", + "16000868": "castle_door_1_star_geo", + "1600091c": "castle_door_3_stars_geo", + "160009d0": "key_door_geo", + "16000a84": "bowser_key_geo", + "16000ab0": "bowser_key_cutscene_geo", + "16000b10": "red_flame_shadow_geo", + "16000b2c": "red_flame_geo", + "16000b8c": "blue_flame_geo", + "16000bec": "fish_shadow_geo", + "16000c44": "fish_geo", + "16000c8c": "leaves_geo", + "16000ca4": "marios_cap_geo", + "16000cf0": "marios_metal_cap_geo", + "16000d3c": "marios_wing_cap_geo", + "16000da8": "marios_winged_metal_cap_geo", + "16000e14": "number_geo", + "16000e84": "mushroom_1up_geo", + "16000ea0": "star_geo", + "16000ed4": "dirt_animation_geo", + "16000f24": "cartoon_star_geo", + "16000f6c": "transparent_star_geo", + "16000f98": "white_particle_geo", + "16000fb4": "wooden_signpost_geo", + "16000fe8": "bubbly_tree_geo", + "16001000": "spiky_tree_geo", + "16001018": "snow_tree_geo", + "16001030": "spiky_tree1_geo", + "16001048": "palm_tree_geo", + "16001060": "_common1_geoSegmentEnd", + "007cd720": "_common1_geoSegmentRomEnd", + "13000000": "_behaviorSegmentStart", + "007cc6c0": "_behaviorSegmentRomStart", + "13000000": "bhvStarDoor", + "13000054": "bhvMrI", + "1300008c": "bhvMrIBody", + "130000ac": "bhvMrIParticle", + "130000f8": "bhvPurpleParticle", + "13000118": "bhvGiantPole", + "13000144": "bhvPoleGrabbing", + "13000174": "bhvThiHugeIslandTop", + "13000194": "bhvThiTinyIslandTop", + "130001ac": "bhvCapSwitchBase", + "130001cc": "bhvCapSwitch", + "130001f4": "bhvKingBobomb", + "13000254": "bhvBobombAnchorMario", + "13000278": "bhvBetaChestBottom", + "1300029c": "bhvBetaChestLid", + "130002b8": "bhvBubbleParticleSpawner", + "130002e4": "bhvBubbleMaybe", + "13000338": "bhvSmallWaterWave", + "13000398": "bhvSmallWaterWave398", + "130003bc": "bhvWaterAirBubble", + "13000400": "bhvSmallParticle", + "13000428": "bhvPlungeBubble", + "13000444": "bhvSmallParticleSnow", + "1300046c": "bhvSmallParticleBubbles", + "13000494": "bhvFishGroup", + "130004a8": "bhvCannon", + "130004e4": "bhvCannonBarrel", + "13000500": "bhvCannonBaseUnused", + "13000528": "bhvChuckya", + "13000584": "bhvChuckyaAnchorMario", + "130005a8": "bhvUnused05A8", + "130005b4": "bhvRotatingPlatform", + "130005d8": "bhvTower", + "13000600": "bhvBulletBillCannon", + "13000624": "bhvWfBreakableWallRight", + "13000638": "bhvWfBreakableWallLeft", + "1300066c": "bhvKickableBoard", + "130006a4": "bhvTowerDoor", + "130006d8": "bhvRotatingCounterClockwise", + "130006e0": "bhvWfRotatingWoodenPlatform", + "13000708": "bhvKoopaShellUnderwater", + "13000720": "bhvExitPodiumWarp", + "1300075c": "bhvFadingWarp", + "13000780": "bhvWarp", + "130007a0": "bhvWarpPipe", + "130007dc": "bhvWhitePuffExplosion", + "130007f8": "bhvSpawnedStar", + "1300080c": "bhvSpawnedStarNoLevelExit", + "13000830": "bhvMrIBlueCoin", + "13000888": "bhvCoinInsideBoo", + "130008d0": "bhvCoinFormationSpawn", + "130008ec": "bhvCoinFormation", + "1300090c": "bhvOneCoin", + "1300091c": "bhvYellowCoin", + "13000940": "bhvTemporaryYellowCoin", + "13000964": "bhvThreeCoinsSpawn", + "13000984": "bhvTenCoinsSpawn", + "130009a4": "bhvSingleCoinGetsSpawned", + "130009e0": "bhvCoinSparkles", + "13000a14": "bhvGoldenCoinSparkles", + "13000a34": "bhvWallTinyStarParticle", + "13000a54": "bhvVertStarParticleSpawner", + "13000a78": "bhvPoundTinyStarParticle", + "13000a98": "bhvHorStarParticleSpawner", + "13000abc": "bhvPunchTinyTriangle", + "13000ad8": "bhvTriangleParticleSpawner", + "13000afc": "bhvDoorWarp", + "13000b0c": "bhvDoor", + "13000b58": "bhvGrindel", + "13000b8c": "bhvThwomp2", + "13000bc8": "bhvThwomp", + "13000c04": "bhvTumblingBridgePlatform", + "13000c28": "bhvWfTumblingBridge", + "13000c44": "bhvBbhTumblingBridge", + "13000c64": "bhvLllTumblingBridge", + "13000c84": "bhvFlame", + "13000cc8": "bhvAnotherElavator", + "13000cfc": "bhvRrElevatorPlatform", + "13000d30": "bhvHmcElevatorPlatform", + "13000d6c": "bhvWaterMist", + "13000d98": "bhvBreathParticleSpawner", + "13000db4": "bhvBreakBoxTriangle", + "13000dd8": "bhvWaterMist2", + "13000dfc": "bhvUnused0DFC", + "13000e24": "bhvMistCircParticleSpawner", + "13000e3c": "bhvDirtParticleSpawner", + "13000e58": "bhvSnowParticleSpawner", + "13000e70": "bhvWind", + "13000e88": "bhvEndToad", + "13000eac": "bhvEndPeach", + "13000ed0": "bhvUnusedParticleSpawn", + "13000f08": "bhvUkiki", + "13000f14": "bhvUkikiCageChild", + "13000f2c": "bhvUkikiCageStar", + "13000f48": "bhvUkikiCage", + "13000f9c": "bhvBitfsSinkingPlatforms", + "13000fc8": "bhvBitfsSinkingCagePlatform", + "13001000": "bhvDddMovingPole", + "13001030": "bhvBitfsTiltingInvertedPyramid", + "13001064": "bhvSquishablePlatform", + "13001098": "bhvCutOutObject", + "130010a8": "bhvBetaMovingFlamesSpawn", + "130010b8": "bhvBetaMovingFlames", + "130010d8": "bhvRrRotatingBridgePlatform", + "13001108": "bhvFlamethrower", + "13001124": "bhvFlamethrowerFlame", + "13001168": "bhvBouncingFireball", + "13001184": "bhvBouncingFireballFlame", + "130011d0": "bhvBowserShockWave", + "130011ec": "bhvFireParticleSpawner", + "13001214": "bhvBlackSmokeMario", + "13001254": "bhvBlackSmokeBowser", + "1300127c": "bhvBlackSmokeUpward", + "13001298": "bhvBetaFishSplashSpawner", + "130012b4": "bhvSpindrift", + "130012f4": "bhvTowerPlatformGroup", + "13001318": "bhvWfSlidingTowerPlatform", + "13001340": "bhvWfElevatorTowerPlatform", + "13001368": "bhvWfSolidTowerPlatform", + "13001390": "bhvLeafParticleSpawner", + "130013a8": "bhvTreeSnow", + "130013c4": "bhvTreeLeaf", + "130013dc": "bhvAnotherTiltingPlatform", + "13001408": "bhvSquarishPathMoving", + "1300142c": "bhvPiranhaPlantBubble", + "13001448": "bhvPiranhaPlantWakingBubbles", + "13001468": "bhvFloorSwitchAnimatesObject", + "13001478": "bhvFloorSwitchGrills", + "13001484": "bhvFloorSwitchHardcodedModel", + "130014ac": "bhvFloorSwitchHiddenObjects", + "130014bc": "bhvHiddenObject", + "130014e0": "bhvBreakableBox", + "13001518": "bhvPushableMetalBox", + "13001548": "bhvHeaveHo", + "130015a4": "bhvHeaveHoThrowMario", + "130015c0": "bhvCcmTouchedStarSpawn", + "130015e4": "bhvUnusedPoundablePlatform", + "13001608": "bhvBetaTrampolineTop", + "13001634": "bhvBetaTrampolineSpring", + "13001650": "bhvJumpingBox", + "1300167c": "bhvBooCage", + "130016ac": "bhvStub", + "130016b8": "bhvIgloo", + "130016e4": "bhvBowserKey", + "13001714": "bhvGrandStar", + "13001744": "bhvBetaBooKey", + "13001778": "bhvAlphaBooKey", + "1300179c": "bhvBulletBill", + "130017f4": "bhvWhitePuffSmoke", + "13001820": "bhvUnused1820", + "13001828": "bhvBowserTailAnchor", + "13001850": "bhvBowser", + "130018cc": "bhvBowserBodyAnchor", + "13001904": "bhvBowserFlameSpawn", + "13001920": "bhvTiltingBowserLavaPlatform", + "13001958": "bhvFallingBowserPlatform", + "13001984": "bhvBlueBowserFlame", + "130019c8": "bhvFlameFloatingLanding", + "13001a0c": "bhvBlueFlamesGroup", + "13001a30": "bhvFlameBouncing", + "13001a74": "bhvFlameMovingForwardGrowing", + "13001aa4": "bhvFlameBowser", + "13001ae8": "bhvFlameLargeBurningOut", + "13001b2c": "bhvBlueFish", + "13001b54": "bhvTankFishGroup", + "13001b70": "bhvCheckerboardElevatorGroup", + "13001b88": "bhvCheckerboardPlatformSub", + "13001bb4": "bhvBowserKeyUnlockDoor", + "13001bd4": "bhvBowserKeyCourseExit", + "13001bf4": "bhvInvisibleObjectsUnderBridge", + "13001c04": "bhvWaterLevelPillar", + "13001c34": "bhvDddWarp", + "13001c58": "bhvMoatGrills", + "13001c7c": "bhvClockMinuteHand", + "13001c8c": "bhvClockHourHand", + "13001cb0": "bhvMacroUkiki", + "13001d0c": "bhvStub1D0C", + "13001d14": "bhvLllRotatingHexagonalPlatform", + "13001d40": "bhvLllSinkingRockBlock", + "13001d70": "bhvStub1D70", + "13001d78": "bhvLllMovingOctagonalMeshPlatform", + "13001da4": "bhvSnowBall", + "13001da8": "bhvLllRotatingBlockWithFireBars", + "13001dcc": "bhvLllRotatingHexFlame", + "13001e04": "bhvLllWoodPiece", + "13001e30": "bhvLllFloatingWoodBridge", + "13001e4c": "bhvVolcanoFlames", + "13001e6c": "bhvLllRotatingHexagonalRing", + "13001e94": "bhvLllSinkingRectangularPlatform", + "13001ec4": "bhvLllSinkingSquarePlatforms", + "13001ef8": "bhvLllTiltingInvertedPyramid", + "13001f30": "bhvUnused1F30", + "13001f3c": "bhvKoopaShell", + "13001f68": "bhvKoopaShellFlame", + "13001f90": "bhvToxBox", + "13001fbc": "bhvPiranhaPlant", + "13002018": "bhvLllHexagonalMesh", + "13002038": "bhvLllBowserPuzzlePiece", + "13002068": "bhvLllBowserPuzzle", + "13002088": "bhvTuxiesMother", + "130020d8": "bhvPenguinBaby", + "130020e0": "bhvUnused20E0", + "130020e8": "bhvSmallPenguin", + "1300213c": "bhvFish2", + "1300214c": "bhvFish3", + "1300215c": "bhvLargeFishGroup", + "13002178": "bhvFish", + "13002194": "bhvWdwExpressElevator", + "130021c0": "bhvWdwExpressElevatorPlatform", + "130021e4": "bhvChirpChirp", + "130021f4": "bhvChirpChirpUnused", + "1300220c": "bhvBub", + "13002250": "bhvExclamationBox", + "1300227c": "bhvRotatingExclamationMark", + "1300229c": "bhvSoundSpawner", + "130022b8": "bhvRockSolid", + "130022d8": "bhvBowserSubDoor", + "13002308": "bhvBowsersSub", + "13002338": "bhvSushiShark", + "13002388": "bhvSushiSharkCollisionChild", + "130023a4": "bhvJrbSlidingBox", + "130023d0": "bhvShipPart3", + "130023ec": "bhvInSunkenShip3", + "1300241c": "bhvSunkenShipPart", + "1300243c": "bhvSunkenShipSetRotation", + "1300244c": "bhvSunkenShipPart2", + "1300246c": "bhvInSunkenShip", + "13002480": "bhvInSunkenShip2", + "130024ac": "bhvMistParticleSpawner", + "130024dc": "bhvWhitePuff1", + "13002500": "bhvWhitePuff2", + "13002528": "bhvWhitePuffSmoke2", + "13002558": "bhvPurpleSwitchHiddenBoxes", + "13002568": "bhvBlueCoinSwitch", + "13002588": "bhvHiddenBlueCoin", + "130025c0": "bhvOpenableCageDoor", + "130025e0": "bhvOpenableGrill", + "130025f8": "bhvWaterLevelDiamond", + "13002620": "bhvInitializeChangingWaterLevel", + "13002634": "bhvTweesterSandParticle", + "13002650": "bhvTweester", + "13002684": "bhvMerryGoRoundBooManager", + "1300269c": "bhvAnimatedTexture", + "130026d4": "bhvBooInCastle", + "13002710": "bhvBooWithCage", + "13002768": "bhvBalconyBigBoo", + "1300277c": "bhvMerryGoRoundBigBoo", + "13002790": "bhvGhostHuntBigBoo", + "130027d0": "bhvCourtyardBooTriplet", + "130027e4": "bhvBoo", + "130027f4": "bhvMerryGoRoundBoo", + "13002804": "bhvGhostHuntBoo", + "1300286c": "bhvHiddenStaircaseStep", + "13002898": "bhvBooBossSpawnedBridge", + "130028cc": "bhvBbhTiltingTrapPlatform", + "130028fc": "bhvHauntedBookshelf", + "1300292c": "bhvMeshElevator", + "13002968": "bhvMerryGoRound", + "13002998": "bhvPlaysMusicTrackWhenTouched", + "130029b0": "bhvInsideCannon", + "130029b4": "bhvBetaBowserAnchor", + "130029e4": "bhvStaticCheckeredPlatform", + "13002a10": "bhvUnused2A10", + "13002a20": "bhvUnusedFakeStar", + "13002a48": "bhvStaticObject", + "13002a54": "bhvUnused2A54", + "13002a5c": "bhvCastleFloorTrap", + "13002a7c": "bhvFloorTrapInCastle", + "13002aa4": "bhvTree", + "13002ad0": "bhvSparkle", + "13002af0": "bhvSparkleSpawn", + "13002b08": "bhvSparkleParticleSpawner", + "13002b5c": "bhvScuttlebug", + "13002ba0": "bhvScuttlebugSpawn", + "13002bb8": "bhvWhompKingBoss", + "13002bcc": "bhvSmallWhomp", + "13002c14": "bhvWaterSplash", + "13002c60": "bhvWaterDroplet", + "13002c7c": "bhvWaterDropletSplash", + "13002cb0": "bhvBubbleSplash", + "13002ce0": "bhvIdleWaterWave", + "13002d28": "bhvObjectWaterSplash", + "13002d50": "bhvShallowWaterWave", + "13002d7c": "bhvShallowWaterSplash", + "13002db0": "bhvObjectWaveTrail", + "13002dc0": "bhvWaveTrail", + "13002e04": "bhvTinyStrongWindParticle", + "13002e20": "bhvStrongWindParticle", + "13002e3c": "bhvSLSnowmanWind", + "13002e58": "bhvSLWalkingPenguin", + "13002ea8": "bhvYellowBall", + "13002ec0": "bhvMario", + "13002ef8": "bhvToadMessage", + "13002f40": "bhvUnlockDoorStar", + "13002f60": "bhvInstantActiveWarp", + "13002f64": "bhvAirborneWarp", + "13002f68": "bhvHardAirKnockBackWarp", + "13002f6c": "bhvSpinAirborneCircleWarp", + "13002f70": "bhvDeathWarp", + "13002f74": "bhvSpinAirborneWarp", + "13002f78": "bhvFlyingWarp", + "13002f7c": "bhvPaintingStarCollectWarp", + "13002f80": "bhvPaintingDeathWarp", + "13002f84": "bhvAirborneDeathWarp", + "13002f88": "bhvAirborneStarCollectWarp", + "13002f8c": "bhvLaunchStarCollectWarp", + "13002f90": "bhvLaunchDeathWarp", + "13002f94": "bhvSwimmingWarp", + "13002fa0": "bhvRandomAnimatedTexture", + "13002fc0": "bhvYellowBackgroundInMenu", + "13002fe4": "bhvMenuButton", + "13003008": "bhvMenuButtonManager", + "1300302c": "bhvActSelectorStarType", + "13003048": "bhvActSelector", + "13003068": "bhvMovingYellowCoin", + "130030a4": "bhvMovingBlueCoin", + "130030d4": "bhvBlueCoinSliding", + "13003104": "bhvBlueCoinJumping", + "13003134": "bhvSeaweed", + "13003158": "bhvSeaweedBundle", + "13003174": "bhvBobomb", + "130031ac": "bhvBobombFuseSmoke", + "130031dc": "bhvBobombBuddy", + "13003228": "bhvBobombBuddyOpensCannon", + "13003274": "bhvCannonClosed", + "130032a8": "bhvWhirlpool", + "130032c8": "bhvJetStream", + "130032e0": "bhvMessagePanel", + "13003324": "bhvSignOnWall", + "13003354": "bhvHomingAmp", + "13003388": "bhvCirclingAmp", + "130033bc": "bhvButterfly", + "130033ec": "bhvHoot", + "13003420": "bhvBetaHoldableObject", + "13003454": "bhvCarrySomething1", + "1300345c": "bhvCarrySomething2", + "13003464": "bhvCarrySomething3", + "1300346c": "bhvCarrySomething4", + "13003474": "bhvCarrySomething5", + "1300347c": "bhvCarrySomething6", + "13003484": "bhvObjectBubble", + "130034c4": "bhvObjectWaterWave", + "13003510": "bhvExplosion", + "13003558": "bhvBobombBullyDeathSmoke", + "13003588": "bhvSmoke", + "130035b0": "bhvBobombExplosionBubble", + "13003600": "bhvBobombExplosionBubble3600", + "13003614": "bhvRespawner", + "1300362c": "bhvSmallBully", + "13003660": "bhvBigBully", + "13003694": "bhvBigBullyWithMinions", + "130036c8": "bhvSmallChillBully", + "13003700": "bhvBigChillBully", + "13003738": "bhvJetStreamRingSpawner", + "13003750": "bhvJetStreamWaterRing", + "13003798": "bhvMantaRayWaterRing", + "130037e0": "bhvMantaRayRingManager", + "130037ec": "bhvBowserBomb", + "1300381c": "bhvBowserBombExplosion", + "13003840": "bhvBowserBombSmoke", + "13003868": "bhvCelebrationStar", + "13003888": "bhvCelebrationStarSparkle", + "130038b0": "bhvStarKeyCollectionPuffSpawner", + "130038d0": "bhvLllDrawbridgeSpawner", + "130038e8": "bhvLllDrawbridge", + "13003910": "bhvSmallBomp", + "13003940": "bhvLargeBomp", + "13003970": "bhvWfSlidingPlatform", + "130039a0": "bhvMoneybag", + "130039d4": "bhvMoneybagHidden", + "13003a08": "bhvPitBowlingBall", + "13003a30": "bhvFreeBowlingBall", + "13003a58": "bhvBowlingBall", + "13003a80": "bhvTtmBowlingBallSpawner", + "13003aa4": "bhvBobBowlingBallSpawner", + "13003ac8": "bhvThiBowlingBallSpawner", + "13003ae0": "bhvRrCruiserWing", + "13003b00": "bhvSpindel", + "13003b30": "bhvSslMovingPyramidWall", + "13003b60": "bhvPyramidElevator", + "13003b98": "bhvPyramidElevatorTrajectoryMarkerBall", + "13003bb4": "bhvPyramidTop", + "13003bec": "bhvPyramidTopFragment", + "13003c0c": "bhvPyramidPillarTouchDetector", + "13003c30": "bhvWaterfallSoundLoop", + "13003c44": "bhvVolcanoSoundLoop", + "13003c58": "bhvCastleFlagWaving", + "13003c7c": "bhvBirdsSoundLoop", + "13003c90": "bhvAmbientSounds", + "13003ca4": "bhvSandSoundLoop", + "13003cb8": "bhvHiddenAt120Stars", + "13003ce4": "bhvSnowmansBottom", + "13003d0c": "bhvSnowmansHead", + "13003d34": "bhvSnowmansBodyCheckpoint", + "13003d4c": "bhvBigSnowmanWhole", + "13003d74": "bhvBigBoulder", + "13003da0": "bhvBigBoulderGenerator", + "13003db8": "bhvWingCap", + "13003dd8": "bhvMetalCap", + "13003df8": "bhvNormalCap", + "13003e1c": "bhvVanishCap", + "13003e3c": "bhvStar", + "13003e64": "bhvStarSpawnCoordinates", + "13003e8c": "bhvHiddenRedCoinStar", + "13003eac": "bhvRedCoin", + "13003ee4": "bhvBowserCourseRedCoinStar", + "13003efc": "bhvHiddenStar", + "13003f1c": "bhvHiddenStarTrigger", + "13003f40": "bhvTtmRollingLog", + "13003f78": "bhvLllVolcanoFallingTrap", + "13003fa4": "bhvLllRollingLog", + "13003fdc": "bhv1upWalking", + "13004010": "bhv1upRunningAway", + "13004044": "bhv1upSliding", + "1300407c": "bhv1Up", + "130040b4": "bhv1upJumpOnApproach", + "130040ec": "bhvHidden1up", + "13004124": "bhvHidden1upTrigger", + "13004148": "bhvHidden1upInPole", + "13004180": "bhvHidden1upInPoleTrigger", + "130041a4": "bhvHidden1upInPoleSpawner", + "130041bc": "bhvControllablePlatform", + "130041f0": "bhvControllablePlatformSub", + "13004218": "bhvBreakableBoxSmall", + "13004244": "bhvSlidingSnowMound", + "13004270": "bhvSnowMoundSpawn", + "13004284": "bhvWdwSquareFloatingPlatform", + "130042b4": "bhvWdwRectangularFloatingPlatform", + "130042e4": "bhvJrbFloatingPlatform", + "13004314": "bhvArrowLift", + "13004348": "bhvOrangeNumber", + "13004370": "bhvMantaRay", + "130043a0": "bhvFallingPillar", + "130043c4": "bhvFallingPillarHitbox", + "130043e0": "bhvPillarBase", + "13004400": "bhvJrbFloatingBox", + "1300442c": "bhvDecorativePendulum", + "1300444c": "bhvTreasureChestsShip", + "13004470": "bhvTreasureChestsJrb", + "13004494": "bhvTreasureChests", + "130044b8": "bhvTreasureChestBottom", + "130044e0": "bhvTreasureChestTop", + "130044fc": "bhvMips", + "13004538": "bhvYoshi", + "13004580": "bhvKoopa", + "130045d0": "bhvKoopaRaceEndpoint", + "130045f8": "bhvKoopaFlag", + "13004634": "bhvPokey", + "13004668": "bhvPokeyBodyPart", + "13004698": "bhvSwoop", + "130046dc": "bhvFlyGuy", + "1300472c": "bhvGoomba", + "13004770": "bhvGoombaTripletSpawner", + "1300478c": "bhvChainChomp", + "130047e4": "bhvChainChompChainPart", + "1300481c": "bhvWoodenPost", + "13004868": "bhvChainChompGate", + "13004898": "bhvWigglerHead", + "130048e0": "bhvWigglerBody", + "13004918": "bhvEnemyLakitu", + "13004954": "bhvCameraLakitu", + "13004988": "bhvCloud", + "130049ac": "bhvCloudPart", + "130049c8": "bhvSpiny", + "13004a00": "bhvMontyMole", + "13004a58": "bhvMontyMoleHole", + "13004a78": "bhvMontyMoleRock", + "13004ab0": "bhvPlatformOnTrack", + "13004af4": "bhvTrackBall", + "13004b1c": "bhvSeesawPlatform", + "13004b44": "bhvFerrisWheelAxle", + "13004b6c": "bhvFerrisWheelPlatform", + "13004b8c": "bhvWaterBombSpawner", + "13004ba8": "bhvWaterBomb", + "13004bd4": "bhvWaterBombShadow", + "13004bf0": "bhvTTCRotatingSolid", + "13004c24": "bhvTTCPendulum", + "13004c5c": "bhvTTCTreadmill", + "13004c94": "bhvTTCMovingBar", + "13004ccc": "bhvTTCCog", + "13004cf8": "bhvTTCPitBlock", + "13004d28": "bhvTTCElevator", + "13004d64": "bhvTTC2DRotator", + "13004d90": "bhvTTCSpinner", + "13004dbc": "bhvMrBlizzard", + "13004e08": "bhvMrBlizzardSnowball", + "13004e4c": "bhvSlidingPlatform2", + "13004e78": "bhvOctagonalPlatformRotating", + "13004ea0": "bhvAnimatesOnFloorSwitchPress", + "13004ecc": "bhvActivatedBackAndForthPlatform", + "13004ef8": "bhvRecoveryHeart", + "13004f10": "bhvWaterBombCannon", + "13004f28": "bhvCannonBarrelBubbles", + "13004f40": "bhvUnagi", + "13004f78": "bhvUnagiSubobject", + "13004f90": "bhvDorrie", + "13004fd4": "bhvHauntedChair", + "13005024": "bhvMadPiano", + "1300506c": "bhvFlyingBookend", + "130050b4": "bhvBookendSpawn", + "130050d4": "bhvHauntedBookshelfManager", + "130050f4": "bhvBookSwitch", + "13005120": "bhvFirePiranhaPlant", + "13005158": "bhvSmallPiranhaFlame", + "1300518c": "bhvFireSpitter", + "130051ac": "bhvFlyguyFlame", + "130051e0": "bhvSnufit", + "1300521c": "bhvSnufitBalls", + "1300525c": "bhvHorizontalGrindel", + "130052b4": "bhvEyerokBoss", + "130052d0": "bhvEyerokHand", + "13005310": "bhvKlepto", + "13005354": "bhvBird", + "13005380": "bhvRacingPenguin", + "130053c4": "bhvPenguinRaceFinishLine", + "130053dc": "bhvPenguinRaceShortcutCheck", + "130053f4": "bhvCoffinSpawner", + "13005414": "bhvCoffin", + "13005440": "bhvClamShell", + "13005468": "bhvSkeeter", + "130054a0": "bhvSkeeterWave", + "130054b8": "bhvSwingPlatform", + "130054ec": "bhvDonutPlatformSpawner", + "13005504": "bhvDonutPlatform", + "13005528": "bhvDDDPole", + "1300556c": "bhvRedCoinStarMarker", + "13005598": "bhvTripletButterfly", + "130055dc": "bhvBubba", + "13005610": "bhvBeginningLakitu", + "13005638": "bhvBeginningPeach", + "1300565c": "bhvEndBirds1", + "13005680": "bhvEndBirds2", + "130056a4": "bhvIntroScene", + "130056c0": "_behaviorSegmentEnd", + "007d1d80": "_behaviorSegmentRomEnd", + "8016f000": "_goddardSegmentStart", + "007cc6c0": "_goddardSegmentRomStart", + }, + "Refresh 12": { + "80000000": "EXCEPTION_TLB_MISS", + "a4000000": "SP_DMEM", + "a40004c0": "SP_DMEM_UNK0", + "a4000774": "SP_DMEM_UNK1", + "a4001000": "SP_IMEM", + "a4040010": "SP_STATUS_REG", + "a4080000": "SP_PC", + "a4300000": "MI_MODE_REG", + "a4300004": "MI_VERSION_REG", + "a4300008": "MI_INTR_REG", + "a430000c": "MI_INTR_MASK_REG", + "a4400010": "VI_CURRENT_REG", + "a450000c": "AI_STATUS_REG", + "a4600000": "PI_DRAM_ADDR_REG", + "a4600004": "PI_CART_ADDR_REG", + "a460000c": "PI_WR_LEN_REG", + "a4600010": "PI_STATUS_REG", + "a4700000": "RI_MODE_REG", + "a4700010": "RI_REFRESH_REG", + "a4800018": "SI_STATUS_REG", + "b0000008": "D_B0000008", + "b0000010": "D_B0000010", + "b0000014": "D_B0000014", + "c0000000": "D_C0000000", + "c0000008": "D_C0000008", + "c000000c": "D_C000000C", + "802f69cc": "func_sh_802F69CC", + "80302ef0": "osMotorStop", + "80303090": "osMotorStart", + "803033ac": "osMotorInit", + "803016a0": "func_sh_803016A0", + "803016d0": "func_sh_803016D0", + "80301820": "func_sh_80301820", + "00000000": "__romPos", + "04000000": "_bootSegmentStart", + "007cc6c0": "_bootSegmentRomStart", + "04000040": "ipl3_entry", + "04000b70": "ipl3_font", + "04001000": "_bootSegmentEnd", + "007cd6c0": "_bootSegmentRomEnd", + "80000400": ".", + "80000400": "_zbufferSegmentNoloadStart", + "80000400": "0x25800", + "80000400": "gZBuffer", + "80246000": "_mainSegmentStart", + "007cc6c0": "_mainSegmentRomStart", + "80246000": "entry_point", + "80246050": "handle_debug_key_sequences", + "80246170": "unknown_main_func", + "802461cc": "stub_main_1", + "802461dc": "stub_main_2", + "802461ec": "stub_main_3", + "802461fc": "setup_mesg_queues", + "802462e0": "alloc_pool", + "80246338": "create_thread", + "8024639c": "handle_nmi_request", + "802463ec": "receive_new_tasks", + "8024651c": "start_sptask", + "8024659c": "interrupt_gfx_sptask", + "802465ec": "start_gfx_sptask", + "80246648": "pretend_audio_sptask_done", + "8024669c": "handle_vblank", + "802467fc": "handle_sp_complete", + "8024694c": "handle_dp_complete", + "802469b8": "thread3_main", + "80246b14": "set_vblank_handler", + "80246b74": "send_sp_task_message", + "80246bb4": "dispatch_audio_sptask", + "80246c10": "send_display_list", + "80246c9c": "turn_on_audio", + "80246cb8": "turn_off_audio", + "80246cf0": "thread1_idle", + "80246df8": "main_func", + "80246e70": "my_rdp_init", + "802471a4": "my_rsp_init", + "80247284": "clear_z_buffer", + "802473c8": "display_frame_buffer", + "802474b8": "clear_frame_buffer", + "80247620": "clear_viewport", + "8024784c": "draw_screen_borders", + "802479bc": "make_viewport_clip_rect", + "80247b3c": "create_task_structure", + "80247ccc": "init_render_image", + "80247d14": "end_master_display_list", + "80247db4": "draw_reset_bars", + "80247f08": "rendering_init", + "80247fdc": "config_gfx_pool", + "80248090": "display_and_vsync", + "80248304": "adjust_analog_stick", + "80248498": "run_demo_inputs", + "80248638": "read_controller_inputs", + "80248824": "init_controllers", + "80248964": "setup_game_memory", + "80248af0": "thread5_game_loop", + "80248c40": "reset_volume", + "80248c58": "lower_background_noise", + "80248ce8": "raise_background_noise", + "80248d78": "disable_background_sound", + "80248dc0": "enable_background_sound", + "80248e08": "set_sound_mode", + "80248e54": "play_menu_sounds", + "80248fec": "play_painting_eject_sound", + "80249070": "play_infinite_stairs_music", + "80249178": "set_background_music", + "8024922c": "fadeout_music", + "8024927c": "fadeout_level_music", + "802492d0": "play_cutscene_music", + "80249310": "play_shell_music", + "8024934c": "stop_shell_music", + "80249398": "play_cap_music", + "80249404": "fadeout_cap_music", + "80249448": "stop_cap_music", + "80249494": "play_menu_sounds_extra", + "802494d8": "audio_game_loop_tick", + "80249500": "thread4_sound", + "802495e0": "level_control_timer", + "802496b8": "pressed_pause", + "80249764": "set_play_mode", + "8024978c": "warp_special", + "802497b8": "fade_into_special_warp", + "8024982c": "stub_level_update_1", + "8024983c": "load_level_init_text", + "8024995c": "init_door_warp", + "80249a10": "set_mario_initial_cap_powerup", + "80249ab4": "set_mario_initial_action", + "80249cd8": "init_mario_after_warp", + "8024a124": "warp_area", + "8024a18c": "warp_level", + "8024a1d8": "warp_credits", + "8024a374": "check_instant_warp", + "8024a584": "music_changed_through_warp", + "8024a700": "initiate_warp", + "8024a7b4": "get_painting_warp_node", + "8024a85c": "initiate_painting_warp", + "8024a9cc": "level_trigger_warp", + "8024aedc": "initiate_delayed_warp", + "8024b13c": "update_hud_values", + "8024b390": "basic_update", + "8024b3e4": "play_mode_normal", + "8024b5d4": "play_mode_paused", + "8024b6cc": "play_mode_frame_advance", + "8024b798": "level_set_transition", + "8024b7c0": "play_mode_change_area", + "8024b880": "play_mode_change_level", + "8024b9b8": "update_level", + "8024ba8c": "init_level", + "8024bcd8": "lvl_init_or_update", + "8024bd5c": "lvl_init_from_save_file", + "8024be14": "lvl_set_current_level", + "8024bfa0": "lvl_play_the_end_screen_sound", + "8024bff0": "get_mario_cap_flag", + "8024c0b8": "object_facing_mario", + "8024c16c": "mario_obj_angle_to_object", + "8024c1d8": "determine_interaction", + "8024c51c": "attack_object", + "8024c618": "mario_stop_riding_object", + "8024c66c": "mario_grab_used_object", + "8024c6c0": "mario_drop_held_object", + "8024c780": "mario_throw_held_object", + "8024c894": "mario_stop_riding_and_holding", + "8024c8fc": "does_mario_have_normal_cap_on_head", + "8024c928": "mario_blow_off_cap", + "8024ca68": "mario_lose_cap_to_enemy", + "8024caf8": "mario_retrieve_cap", + "8024cb58": "able_to_grab_object", + "8024cbfc": "mario_get_collided_object", + "8024cc7c": "mario_check_object_grab", + "8024ce08": "bully_knock_back_mario", + "8024d0b4": "bounce_off_object", + "8024d130": "hit_object_from_below", + "8024d2bc": "determine_knockback_action", + "8024d578": "push_mario_out_of_object", + "8024d72c": "bounce_back_from_attack", + "8024d804": "should_push_or_pull_door", + "8024d8b0": "take_damage_from_interact_object", + "8024d998": "take_damage_and_knock_back", + "8024daac": "reset_mario_pitch", + "8024db2c": "interact_coin", + "8024dbf0": "interact_water_ring", + "8024dc28": "interact_star_or_key", + "8024de4c": "interact_bbh_entrance", + "8024df10": "interact_warp", + "8024e0c4": "interact_warp_door", + "8024e2fc": "get_door_save_file_flag", + "8024e420": "interact_door", + "8024e6ec": "interact_cannon_base", + "8024e778": "interact_igloo_barrier", + "8024e7d4": "interact_tornado", + "8024e8f0": "interact_whirlpool", + "8024e9d0": "interact_strong_wind", + "8024ead8": "interact_flame", + "8024ec54": "interact_snufit_bullet", + "8024ed84": "interact_clam_or_bubba", + "8024ee44": "interact_bully", + "8024eff8": "interact_shock", + "8024f170": "interact_mr_blizzard", + "8024f1e0": "interact_hit_from_below", + "8024f354": "interact_bounce_top", + "8024f4ac": "interact_unknown_08", + "8024f55c": "interact_damage", + "8024f5cc": "interact_breakable", + "8024f6a4": "interact_koopa_shell", + "8024f7a8": "check_object_grab_mario", + "8024f8bc": "interact_pole", + "8024fa60": "interact_hoot", + "8024fb30": "interact_cap", + "8024fd2c": "interact_grabbable", + "8024fe6c": "mario_can_talk", + "8024ff04": "check_read_sign", + "80250098": "check_npc_talk", + "80250198": "interact_text", + "80250230": "check_kick_or_punch_wall", + "802503f0": "mario_process_interactions", + "802505c8": "check_death_barrier", + "8025065c": "check_lava_boost", + "80250724": "pss_begin_slide", + "80250778": "pss_end_slide", + "802507fc": "mario_handle_special_floors", + "80250940": "is_anim_at_end", + "8025097c": "is_anim_past_end", + "802509b8": "set_mario_animation", + "80250b04": "set_mario_anim_with_accel", + "80250c7c": "set_anim_to_frame", + "80250d38": "is_anim_past_frame", + "80250e54": "find_mario_anim_flags_and_translation", + "80251020": "update_mario_pos_for_anim", + "802510dc": "return_mario_anim_y_translation", + "80251120": "play_sound_if_no_flag", + "8025118c": "play_mario_jump_sound", + "80251274": "adjust_sound_for_speed", + "80251310": "play_sound_and_spawn_particles", + "80251444": "play_mario_action_sound", + "802514ac": "play_mario_landing_sound", + "80251510": "play_mario_landing_sound_once", + "80251574": "play_mario_heavy_landing_sound", + "802515d8": "play_mario_heavy_landing_sound_once", + "8025163c": "play_mario_sound", + "80251708": "mario_set_forward_vel", + "8025177c": "mario_get_floor_class", + "802518a8": "mario_get_terrain_sound_addend", + "80251a48": "resolve_and_return_wall_collisions", + "80251afc": "vec3f_find_ceil", + "80251b54": "mario_facing_downhill", + "80251bd4": "mario_floor_is_slippery", + "80251cfc": "mario_floor_is_slope", + "80251e24": "mario_floor_is_steep", + "80251f24": "find_floor_height_relative_polar", + "80252000": "find_floor_slope", + "802521a0": "update_mario_sound_and_camera", + "8025229c": "set_steep_jump_action", + "80252cf4": "set_mario_action", + "80252e5c": "set_jump_from_landing", + "802530a0": "set_jumping_action", + "80253178": "drop_and_set_mario_action", + "802531c4": "hurt_and_set_mario_action", + "80253218": "check_common_action_exits", + "80253300": "check_common_hold_action_exits", + "802533e4": "transition_submerged_to_walking", + "80253488": "set_water_plunge_action", + "80253588": "squish_mario_model", + "80253720": "debug_print_speed_action_normal", + "80253838": "update_mario_button_inputs", + "8025395c": "update_mario_joystick_inputs", + "80253a60": "update_mario_geometry_inputs", + "80253d58": "update_mario_inputs", + "80253ec0": "set_submerged_cam_preset_and_spawn_bubbles", + "80254060": "update_mario_health", + "802542b4": "update_mario_info_for_cam", + "80254338": "mario_reset_bodystate", + "80254390": "sink_mario_in_quicksand", + "802543e8": "update_and_return_cap_flags", + "80254588": "mario_update_hitbox_and_cap_model", + "80254830": "execute_mario_action", + "80254b20": "init_mario", + "80254f44": "init_mario_from_save_file", + "80255080": "get_additive_y_vel_for_jumps", + "8025509c": "stub_mario_step_1", + "802550b0": "stub_mario_step_2", + "802550c0": "transfer_bully_speed", + "80255238": "init_bully_collision_data", + "802552fc": "mario_bonk_reflection", + "80255414": "mario_update_quicksand", + "80255654": "mario_push_off_steep_floor", + "8025570c": "mario_update_moving_sand", + "8025580c": "mario_update_windy_ground", + "802559b0": "stop_and_set_height_to_floor", + "80255a34": "stationary_ground_step", + "80255d88": "perform_ground_step", + "80255ec4": "check_ledge_grab", + "802560ac": "perform_air_quarter_step", + "802564e0": "apply_twirl_gravity", + "80256584": "should_strengthen_gravity_for_jump_ascent", + "8025661c": "apply_gravity", + "802569f8": "apply_vertical_wind", + "80256b24": "perform_air_step", + "80256cd8": "set_vel_from_pitch_and_yaw", + "80256d8c": "set_vel_from_yaw", + "80256e00": "get_credits_str_width", + "80256e88": "print_displaying_credits_entry", + "80257060": "bhv_end_peach_loop", + "802570dc": "bhv_end_toad_loop", + "80257198": "geo_switch_peach_eyes", + "802572b0": "get_star_collection_dialog", + "8025733c": "handle_save_menu", + "80257450": "spawn_obj_at_mario_rel_yaw", + "802574e8": "cutscene_take_cap_off", + "80257548": "cutscene_put_cap_on", + "802575a8": "mario_ready_to_speak", + "80257640": "set_mario_npc_dialog", + "80257748": "act_reading_npc_dialog", + "80257980": "act_waiting_for_dialog", + "80257a0c": "act_disappeared", + "80257ab0": "act_reading_automatic_dialog", + "80257ce4": "act_reading_sign", + "80257eac": "act_debug_free_move", + "80258184": "general_star_dance_handler", + "80258420": "act_star_dance", + "802584dc": "act_star_dance_water", + "802585c0": "act_fall_after_star_grab", + "802586cc": "common_death_handler", + "80258744": "act_standing_death", + "802587ec": "act_electrocution", + "8025883c": "act_suffocation", + "8025888c": "act_death_on_back", + "802588f8": "act_death_on_stomach", + "80258964": "act_quicksand_death", + "80258a7c": "act_eaten_by_bubba", + "80258b24": "launch_mario_until_land", + "80258ba8": "act_unlocking_key_door", + "80258dac": "act_unlocking_star_door", + "80258f94": "act_entering_star_door", + "80259264": "act_going_through_door", + "802593cc": "act_warp_door_spawn", + "802594d4": "act_emerge_from_pipe", + "80259608": "act_spawn_spin_airborne", + "80259740": "act_spawn_spin_landing", + "802597ac": "act_exit_airborne", + "80259854": "act_falling_exit_airborne", + "802598d0": "act_exit_land_save_dialog", + "80259c30": "act_death_exit", + "80259ce8": "act_unused_death_exit", + "80259d74": "act_falling_death_exit", + "80259e00": "act_special_exit_airborne", + "80259ef8": "act_special_death_exit", + "80259fcc": "act_spawn_no_spin_airborne", + "8025a040": "act_spawn_no_spin_landing", + "8025a0bc": "act_bbh_enter_spin", + "8025a494": "act_bbh_enter_jump", + "8025a610": "act_teleport_fade_out", + "8025a6fc": "act_teleport_fade_in", + "8025a858": "act_shocked", + "8025a9ac": "act_squished", + "8025ae0c": "act_putting_on_cap", + "8025aea8": "stuck_in_ground_handler", + "8025affc": "act_head_stuck_in_ground", + "8025b050": "act_butt_stuck_in_ground", + "8025b0a4": "act_feet_stuck_in_ground", + "8025bc80": "generate_yellow_sparkles", + "8025d798": "mario_execute_cutscene_action", + "8025dd70": "add_tree_leaf_particles", + "8025de1c": "play_climbing_sounds", + "8025df04": "set_pole_position", + "8025e21c": "act_holding_pole", + "8025e5a8": "act_climbing_pole", + "8025e7a4": "act_grab_pole_slow", + "8025e830": "act_grab_pole_fast", + "8025e930": "act_top_of_pole_transition", + "8025ea30": "act_top_of_pole", + "8025eb50": "perform_hanging_step", + "8025ecfc": "update_hang_moving", + "8025eed0": "update_hang_stationary", + "8025ef58": "act_start_hanging", + "8025f0b4": "act_hanging", + "8025f1e4": "act_hang_moving", + "8025f384": "let_go_of_ledge", + "8025f4b4": "climb_up_ledge", + "8025f560": "update_ledge_climb_camera", + "8025f644": "update_ledge_climb", + "8025f6c0": "act_ledge_grab", + "8025f970": "act_ledge_climb_slow", + "8025fa64": "act_ledge_climb_down", + "8025fae8": "act_ledge_climb_fast", + "8025fb90": "act_grabbed", + "8025fc6c": "act_in_cannon", + "80260154": "act_tornado_twirling", + "80260568": "check_common_automatic_cancels", + "802605d0": "mario_execute_automatic_action", + "802608b0": "check_common_idle_cancels", + "80260aac": "check_common_hold_idle_cancels", + "80260cb4": "act_idle", + "80260f94": "play_anim_sound", + "80261000": "act_start_sleeping", + "80261268": "act_sleeping", + "802614fc": "act_waking_up", + "8026168c": "act_shivering", + "802618d8": "act_coughing", + "802619d0": "act_hold_idle", + "80261ad0": "act_hold_heavy_idle", + "80261bf8": "act_standing_against_wall", + "80261cec": "act_in_quicksand", + "80261db4": "act_crouching", + "80261f70": "act_panting", + "80262080": "act_hold_panting_unused", + "8026217c": "stopping_step", + "802621dc": "act_braking_stop", + "802622dc": "act_butt_slide_stop", + "80262398": "act_hold_butt_slide_stop", + "80262490": "act_slide_kick_slide_stop", + "80262530": "act_start_crouching", + "80262650": "act_stop_crouching", + "80262770": "act_start_crawling", + "80262890": "act_stop_crawling", + "80262980": "act_shockwave_bounce", + "80262bc4": "landing_step", + "80262c34": "check_common_landing_cancels", + "80262d68": "act_jump_land_stop", + "80262dc4": "act_double_jump_land_stop", + "80262e20": "act_side_flip_land_stop", + "80262e94": "act_freefall_land_stop", + "80262ef0": "act_triple_jump_land_stop", + "80262f50": "act_backflip_land_stop", + "80262fec": "act_lava_boost_land", + "8026305c": "act_long_jump_land_stop", + "802630f8": "act_hold_jump_land_stop", + "802631f0": "act_hold_freefall_land_stop", + "802632e8": "act_air_throw_land", + "802633b4": "act_twirl_land", + "8026350c": "act_ground_pound_land", + "802635e8": "act_first_person", + "80263784": "check_common_stationary_cancels", + "80263898": "mario_execute_stationary_action", + "80263e60": "tilt_body_running", + "80263ee4": "play_step_sound", + "80264024": "align_with_floor", + "8026409c": "begin_walking_action", + "802640fc": "check_ledge_climb_down", + "802642b4": "slide_bonk", + "80264340": "set_triple_jump_action", + "8026440c": "update_sliding_angle", + "80264740": "update_sliding", + "80264b54": "apply_slope_accel", + "80264d80": "apply_landing_accel", + "80264e18": "update_shell_speed", + "80265080": "apply_slope_decel", + "802651b0": "update_decelerating_speed", + "80265244": "update_walking_speed", + "80265458": "should_begin_sliding", + "80265514": "analog_stick_held_back", + "80265558": "check_ground_dive_or_punch", + "80265620": "begin_braking_action", + "80265700": "anim_and_audio_for_walk", + "80265b1c": "anim_and_audio_for_hold_walk", + "80265d90": "anim_and_audio_for_heavy_walk", + "80265df8": "push_or_sidle_wall", + "80266038": "tilt_body_walking", + "802661cc": "tilt_body_ground_shell", + "80266354": "act_walking", + "802665b4": "act_move_punching", + "80266734": "act_hold_walking", + "8026699c": "act_hold_heavy_walking", + "80266af8": "act_turning_around", + "80266d4c": "act_finish_turning_around", + "80266e48": "act_braking", + "80266fc8": "act_decelerating", + "80267240": "act_hold_decelerating", + "80267504": "act_riding_shell_ground", + "80267728": "act_crawling", + "8026795c": "act_burning_ground", + "80267c24": "tilt_body_butt_slide", + "80267ce4": "common_slide_action", + "80267fa4": "common_slide_action_with_jump", + "80268074": "act_butt_slide", + "802680d4": "act_hold_butt_slide", + "80268168": "act_crouch_slide", + "80268338": "act_slide_kick_slide", + "802684ac": "stomach_slide_action", + "802685c0": "act_stomach_slide", + "80268608": "act_hold_stomach_slide", + "80268684": "act_dive_slide", + "802687b8": "common_ground_knockback_action", + "802689f8": "act_hard_backward_ground_kb", + "80268adc": "act_hard_forward_ground_kb", + "80268b64": "act_backward_ground_kb", + "80268bb0": "act_forward_ground_kb", + "80268bfc": "act_soft_backward_ground_kb", + "80268c48": "act_soft_forward_ground_kb", + "80268c94": "act_ground_bonk", + "80268d04": "act_death_exit_land", + "80268dcc": "common_landing_action", + "80268f78": "common_landing_cancels", + "80269108": "act_jump_land", + "80269170": "act_freefall_land", + "802691d8": "act_side_flip_land", + "80269264": "act_hold_jump_land", + "80269300": "act_hold_freefall_land", + "8026939c": "act_long_jump_land", + "8026947c": "act_double_jump_land", + "802694e4": "act_triple_jump_land", + "80269588": "act_backflip_land", + "80269640": "quicksand_jump_land_action", + "80269788": "act_quicksand_jump_land", + "802697dc": "act_hold_quicksand_jump_land", + "80269830": "check_common_moving_cancels", + "80269954": "mario_execute_moving_action", + "80269f40": "play_flip_sounds", + "80269fc0": "play_far_fall_sound", + "8026a090": "play_knockback_sound", + "8026a12c": "lava_boost_on_wall", + "8026a224": "check_fall_damage", + "8026a400": "check_kick_or_dive_in_air", + "8026a494": "should_get_stuck_in_ground", + "8026a598": "check_fall_damage_or_get_stuck", + "8026a62c": "check_horizontal_wind", + "8026a818": "update_air_with_turn", + "8026aa48": "update_air_without_turn", + "8026acd8": "update_lava_boost_or_twirling", + "8026ae5c": "update_flying_yaw", + "8026b004": "update_flying_pitch", + "8026b17c": "update_flying", + "8026b444": "common_air_action_step", + "8026b6a0": "act_jump", + "8026b740": "act_double_jump", + "8026b814": "act_triple_jump", + "8026b90c": "act_backflip", + "8026b9ac": "act_freefall", + "8026bab8": "act_hold_jump", + "8026bbb4": "act_hold_freefall", + "8026bcc0": "act_side_flip", + "8026bdcc": "act_wall_kick_air", + "8026be78": "act_long_jump", + "8026bf40": "act_riding_shell_air", + "8026c034": "act_twirling", + "8026c1e0": "act_dive", + "8026c4b8": "act_air_throw", + "8026c5d0": "act_water_jump", + "8026c738": "act_hold_water_jump", + "8026c880": "act_steep_jump", + "8026c9fc": "act_ground_pound", + "8026cd0c": "act_burning_jump", + "8026ce50": "act_burning_fall", + "8026cf28": "act_crazy_box_bounce", + "8026d1b0": "common_air_knockback_step", + "8026d33c": "check_wall_kick", + "8026d3c8": "act_backward_air_kb", + "8026d43c": "act_forward_air_kb", + "8026d4b0": "act_hard_backward_air_kb", + "8026d508": "act_hard_forward_air_kb", + "8026d560": "act_thrown_backward", + "8026d608": "act_thrown_forward", + "8026d6fc": "act_soft_bonk", + "8026d770": "act_getting_blown", + "8026d988": "act_air_hit_wall", + "8026db54": "act_forward_rollout", + "8026dcf4": "act_backward_rollout", + "8026de98": "act_butt_slide_air", + "8026e088": "act_hold_butt_slide_air", + "8026e2b4": "act_lava_boost", + "8026e59c": "act_slide_kick", + "8026e810": "act_jump_kick", + "8026e968": "act_shot_from_cannon", + "8026ec00": "act_flying", + "8026f158": "act_riding_hoot", + "8026f2ec": "act_flying_triple_jump", + "8026f614": "act_top_of_pole_jump", + "8026f660": "act_vertical_wind", + "8026f840": "act_special_triple_jump", + "8026fa18": "check_common_airborne_cancels", + "8026fb04": "mario_execute_airborne_action", + "8027499c": "mario_execute_submerged_action", + "80274eb0": "animated_stationary_ground_step", + "80274f10": "mario_update_punch_sequence", + "80275328": "act_punching", + "8027546c": "act_picking_up", + "802755fc": "act_dive_picking_up", + "802756c8": "act_placing_down", + "80275794": "act_throwing", + "802758c0": "act_heavy_throw", + "802759b4": "act_stomach_slide_stop", + "80275a80": "act_picking_up_bowser", + "80275b34": "act_holding_bowser", + "80275e78": "act_releasing_bowser", + "80275f0c": "check_common_object_cancels", + "80275fe0": "mario_execute_object_action", + "802761d0": "geo_envfx_main", + "802763d4": "geo_skybox_main", + "802764b0": "geo_draw_mario_head_goddard", + "8027684c": "bhv_toad_message_loop", + "80276910": "bhv_toad_message_init", + "80276bb8": "bhv_unlock_door_star_init", + "80276ccc": "bhv_unlock_door_star_loop", + "802770a4": "geo_mirror_mario_set_alpha", + "80277150": "geo_switch_mario_stand_run", + "802771bc": "geo_switch_mario_eyes", + "80277294": "geo_mario_tilt_torso", + "802773a4": "geo_mario_head_rotation", + "802774f4": "geo_switch_mario_hand", + "802775cc": "geo_mario_hand_foot_scaler", + "802776d8": "geo_switch_mario_cap_effect", + "80277740": "geo_switch_mario_cap_on_off", + "80277824": "geo_mario_rotate_wing_cap_wings", + "8027795c": "geo_switch_mario_hand_grab_pos", + "80277b14": "geo_render_mirror_mario", + "80277d6c": "geo_mirror_mario_backface_culling", + "80277ee0": "set_segment_base_addr", + "80277f20": "get_segment_base_addr", + "80277f50": "segmented_to_virtual", + "80277fa8": "virtual_to_segmented", + "80277ff0": "move_segment_table_to_dmem", + "80278074": "main_pool_init", + "80278120": "main_pool_alloc", + "80278238": "main_pool_free", + "80278358": "main_pool_realloc", + "802783c8": "main_pool_available", + "802783e8": "main_pool_push_state", + "80278498": "main_pool_pop_state", + "8027868c": "load_segment", + "802786f0": "load_to_fixed_pool_addr", + "802787d8": "load_segment_decompress", + "802788b4": "load_segment_decompress_heap", + "80278974": "load_engine_code_segment", + "80278a14": "alloc_only_pool_init", + "80278ab8": "alloc_only_pool_alloc", + "80278b28": "alloc_only_pool_resize", + "80278b98": "mem_pool_init", + "80278c58": "mem_pool_alloc", + "80278d74": "mem_pool_free", + "80278f2c": "alloc_display_list", + "80279028": "func_80278A78", + "80279084": "load_patchable_table", + "80279840": "save_file_do_save", + "802798fc": "save_file_erase", + "80279960": "save_file_copy", + "802799dc": "save_file_load_all", + "80279bc8": "save_file_reload", + "80279c44": "save_file_collect_star_or_key", + "80279e44": "save_file_exists", + "80279e80": "save_file_get_max_coin_score", + "80279f80": "save_file_get_course_star_count", + "8027a010": "save_file_get_total_star_count", + "8027a0a8": "save_file_set_flags", + "8027a0f4": "save_file_clear_flags", + "8027a16c": "save_file_get_flags", + "8027a1c8": "save_file_get_star_flags", + "8027a23c": "save_file_set_star_flags", + "8027a310": "save_file_get_course_coin_score", + "8027a340": "save_file_is_cannon_unlocked", + "8027a390": "save_file_set_cannon_unlocked", + "8027a418": "save_file_set_cap_pos", + "8027a4ac": "save_file_get_cap_pos", + "8027a564": "save_file_set_sound_mode", + "8027a5b4": "save_file_get_sound_mode", + "8027a5d4": "save_file_move_cap_to_default_location", + "8027a698": "disable_warp_checkpoint", + "8027a6b0": "check_if_should_set_warp_checkpoint", + "8027a718": "check_warp_checkpoint", + "8027a7d0": "override_viewport_and_clip", + "8027a83c": "set_warp_transition_rgb", + "8027a8b0": "print_intro_text", + "8027a93c": "get_mario_spawn_type", + "8027a9c8": "area_get_warp_node", + "8027aa28": "area_get_warp_node_from_params", + "8027aa74": "load_obj_warp_nodes", + "8027ab04": "clear_areas", + "8027ad74": "clear_area_graph_nodes", + "8027ae44": "load_area", + "8027af48": "unload_area", + "8027afbc": "load_mario_area", + "8027b038": "unload_mario_area", + "8027b0c0": "change_area", + "8027b164": "area_update_objects", + "8027b1a0": "play_transition", + "8027b35c": "play_transition_after_delay", + "8027b3b4": "render_game", + "8027cf38": "geo_set_animation_globals", + "8027da84": "geo_process_held_object", + "8027de68": "geo_try_process_children", + "8027dea8": "geo_process_node_and_siblings", + "8027e130": "geo_process_root", + "8027e3e0": "profiler_log_thread5_time", + "8027e490": "profiler_log_thread4_time", + "8027e520": "profiler_log_gfx_time", + "8027e5cc": "profiler_log_vblank_time", + "8027e65c": "draw_profiler_bar", + "8027e958": "draw_reference_profiler_bars", + "8027ebcc": "draw_profiler_mode_1", + "8027eeac": "draw_profiler_mode_0", + "8027f460": "draw_profiler", + "8027f4e0": "decompress", + "8027f590": "set_camera_shake_from_hit", + "8027f8b8": "set_environmental_camera_shake", + "8027f9f0": "set_camera_shake_from_point", + "8027fb74": "unused_set_camera_pitch_shake_env", + "8027fc18": "calc_y_to_curr_floor", + "8027fe20": "focus_on_mario", + "8027fff8": "set_camera_height", + "80280368": "look_down_slopes", + "802804f4": "pan_ahead_of_player", + "802806a4": "find_in_bounds_yaw_wdw_bob_thi", + "80280810": "update_radial_camera", + "80280970": "update_8_directions_camera", + "80280b00": "radial_camera_move", + "80281188": "lakitu_zoom", + "802813bc": "radial_camera_input_default", + "802813ec": "update_yaw_and_dist_from_c_up", + "8028146c": "mode_radial_camera", + "80281588": "mode_8_directions_camera", + "802816a0": "update_outward_radial_camera", + "802817fc": "mode_outward_radial_camera", + "80281904": "update_parallel_tracking_camera", + "80282280": "update_fixed_camera", + "802826a0": "update_boss_fight_camera", + "80282c0c": "unused_update_mode_5_camera", + "80282c3c": "mode_boss_fight_camera", + "80282c7c": "mode_parallel_tracking_camera", + "80282ce0": "mode_fixed_camera", + "80282d78": "update_behind_mario_camera", + "80283340": "mode_behind_mario", + "80283578": "update_slide_camera", + "802839e4": "mode_behind_mario_camera", + "80283a18": "nop_update_water_camera", + "80283a34": "mode_water_surface_camera", + "80283a68": "update_mario_camera", + "80283af8": "update_default_camera", + "80284cb8": "mode_default_camera", + "80284cfc": "mode_lakitu_camera", + "80284d38": "mode_mario_camera", + "80284d74": "update_spiral_stairs_camera", + "802850ac": "mode_spiral_stairs_camera", + "802850ec": "update_slide_or_0f_camera", + "802851dc": "mode_slide_camera", + "8028526c": "store_lakitu_cam_info_for_c_up", + "802852f4": "set_mode_c_up", + "80285370": "exit_c_up", + "80285808": "update_c_up", + "802858a4": "move_mario_head_c_up", + "80285a2c": "move_into_c_up", + "80285d20": "mode_c_up_camera", + "80285ed8": "update_in_cannon", + "80285f60": "mode_cannon_camera", + "8028603c": "transition_next_state", + "80286088": "transition_to_camera_mode", + "80286188": "set_camera_mode", + "80286420": "update_lakitu", + "802868f8": "update_camera", + "80286f68": "reset_camera", + "8028724c": "init_camera", + "802879ec": "zoom_out_if_paused_and_outside", + "80287bc4": "select_mario_cam_mode", + "80287be0": "create_camera", + "80287cb8": "update_graph_node_camera", + "80287d30": "geo_camera_main", + "80287dc0": "stub_camera_2", + "80287dd4": "stub_camera_3", + "80287de8": "vec3f_sub", + "80287e28": "object_pos_to_vec3f", + "80287e50": "vec3f_to_object_pos", + "80287e78": "unused_object_angle_to_vec3s", + "80287ea0": "evaluate_cubic_spline", + "802882e4": "move_point_along_spline", + "80288624": "cam_select_alt_mode", + "80288718": "set_cam_angle", + "80288888": "set_handheld_shake", + "802889b0": "shake_camera_handheld", + "80288ce4": "find_c_buttons_pressed", + "80288e68": "update_camera_hud_status", + "80288f5c": "collide_with_walls", + "80289198": "vec3f_compare", + "80289214": "clamp_pitch", + "802892d8": "is_within_100_units_of_mario", + "8028935c": "set_or_approach_f32_asymptotic", + "802893f4": "approach_f32_asymptotic_bool", + "80289488": "approach_f32_asymptotic", + "802894b4": "approach_s16_asymptotic_bool", + "8028956c": "approach_s16_asymptotic", + "80289610": "approach_vec3f_asymptotic", + "80289684": "set_or_approach_vec3f_asymptotic", + "802896f8": "approach_vec3s_asymptotic", + "8028976c": "camera_approach_s16_symmetric_bool", + "8028984c": "camera_approach_s16_symmetric", + "8028993c": "set_or_approach_s16_symmetric", + "802899cc": "camera_approach_f32_symmetric_bool", + "80289b0c": "camera_approach_f32_symmetric", + "80289c00": "random_vec3s", + "80289d20": "reduce_by_dist_from_camera", + "80289f88": "clamp_positions_and_find_yaw", + "8028a080": "calc_avoid_yaw", + "8028a0f4": "is_surf_within_bounding_box", + "8028a4ec": "is_behind_surface", + "8028a6bc": "is_range_behind_surface", + "8028a7ec": "is_mario_behind_surface", + "8028a834": "scale_along_line", + "8028a8e8": "is_pos_in_bounds", + "8028aa28": "calculate_pitch", + "8028aad8": "calculate_yaw", + "8028ab60": "calculate_angles", + "8028ac28": "calc_abs_dist", + "8028accc": "calc_hor_dist", + "8028ad4c": "rotate_in_xz", + "8028ae1c": "rotate_in_yz", + "8028aef0": "set_camera_pitch_shake", + "8028af4c": "set_camera_yaw_shake", + "8028b00c": "set_camera_roll_shake", + "8028b068": "set_pitch_shake_from_point", + "8028b11c": "set_yaw_shake_from_point", + "8028b1d0": "increment_shake_offset", + "8028b218": "shake_camera_pitch", + "8028b32c": "shake_camera_yaw", + "8028b438": "shake_camera_roll", + "8028b50c": "offset_yaw_outward_radial", + "8028b724": "cutscene_intro_peach_play_message_music", + "8028b754": "cutscene_intro_peach_play_lakitu_flying_music", + "8028b784": "play_camera_buzz_if_cdown", + "8028b7c4": "play_camera_buzz_if_cbutton", + "8028b804": "play_camera_buzz_if_c_sideways", + "8028b850": "play_sound_cbutton_up", + "8028b884": "play_sound_cbutton_down", + "8028b8b8": "play_sound_cbutton_side", + "8028b8ec": "play_sound_button_change_blocked", + "8028b920": "play_sound_rbutton_changed", + "8028b954": "play_sound_if_cam_switched_to_lakitu_or_mario", + "8028b9c4": "radial_camera_input", + "8028bd34": "trigger_cutscene_dialog", + "8028bd98": "handle_c_button_movement", + "8028c038": "clear_cutscene_vars", + "8028c13c": "start_cutscene", + "8028c18c": "determine_dance_cutscene", + "8028c26c": "open_door_cutscene", + "8028c2c8": "get_cutscene_from_mario_status", + "8028c7a0": "warp_camera", + "8028c8f0": "approach_camera_height", + "8028c9ac": "stub_camera_4", + "8028c9cc": "set_focus_rel_mario", + "8028cbf0": "offset_rotated", + "8028cd94": "offset_rotated_coords", + "8028cdec": "determine_pushing_or_pulling_door", + "8028ce24": "next_lakitu_state", + "8028d44c": "set_camera_mode_fixed", + "8028d5ac": "set_camera_mode_8_directions", + "8028d5fc": "set_camera_mode_boss_fight", + "8028d658": "set_camera_mode_close_cam", + "8028d698": "set_camera_mode_radial", + "8028d79c": "parallel_tracking_init", + "8028d888": "set_fixed_cam_axis_sa_lobby", + "8028d92c": "check_blocking_area_processing", + "8028da18": "cam_rr_exit_building_side", + "8028da50": "cam_rr_exit_building_top", + "8028daec": "cam_rr_enter_building_window", + "8028db38": "cam_rr_enter_building", + "8028dbb4": "cam_rr_enter_building_side", + "8028dbf4": "cam_cotmc_exit_waterfall", + "8028dc1c": "cam_sl_snowman_head_8dir", + "8028dc70": "cam_sl_free_roam", + "8028dca4": "move_camera_through_floor_while_descending", + "8028dd48": "cam_hmc_enter_maze", + "8028de2c": "cam_hmc_elevator_black_hole", + "8028de5c": "cam_hmc_elevator_maze_emergency_exit", + "8028de90": "cam_hmc_elevator_lake", + "8028dec4": "cam_hmc_elevator_maze", + "8028def8": "cam_ssl_enter_pyramid_top", + "8028df24": "cam_ssl_pyramid_center", + "8028df6c": "cam_ssl_boss_room", + "8028dfb4": "cam_thi_move_cam_through_tunnel", + "8028dfe8": "cam_thi_look_through_tunnel", + "8028e01c": "cam_bob_tower", + "8028e064": "cam_bob_default_free_roam", + "8028e098": "cam_castle_hmc_start_pool_cutscene", + "8028e0ec": "cam_castle_lobby_entrance", + "8028e164": "cam_castle_look_upstairs", + "8028e210": "cam_castle_basement_look_downstairs", + "8028e298": "cam_castle_enter_lobby", + "8028e300": "cam_castle_enter_spiral_stairs", + "8028e38c": "cam_castle_close_mode", + "8028e3b8": "cam_castle_leave_lobby_sliding_door", + "8028e3f0": "cam_castle_enter_lobby_sliding_door", + "8028e41c": "cam_bbh_room_6", + "8028e450": "cam_bbh_fall_off_roof", + "8028e47c": "cam_bbh_fall_into_pool", + "8028e524": "cam_bbh_room_1", + "8028e55c": "cam_bbh_leave_front_door", + "8028e594": "cam_bbh_room_2_lower", + "8028e5cc": "cam_bbh_room_4", + "8028e604": "cam_bbh_room_8", + "8028e63c": "cam_bbh_room_5_library", + "8028e674": "cam_bbh_room_5_library_to_hidden_transition", + "8028e6c4": "cam_bbh_room_5_hidden_to_library_transition", + "8028e714": "cam_bbh_room_5_hidden", + "8028e758": "cam_bbh_room_3", + "8028e790": "cam_bbh_room_7_mr_i", + "8028e7c8": "cam_bbh_room_7_mr_i_to_coffins_transition", + "8028e818": "cam_bbh_room_7_coffins_to_mr_i_transition", + "8028e868": "cam_bbh_elevator_room_lower", + "8028e8a0": "cam_bbh_room_0_back_entrance", + "8028e8cc": "cam_bbh_elevator", + "8028e930": "cam_bbh_room_12_upper", + "8028e974": "cam_bbh_enter_front_door", + "8028e9a0": "cam_bbh_room_2_library", + "8028e9d8": "cam_bbh_room_2_library_to_trapdoor_transition", + "8028ea28": "cam_bbh_room_2_trapdoor", + "8028ea60": "cam_bbh_room_2_trapdoor_transition", + "8028eab0": "cam_bbh_room_9_attic", + "8028eae8": "cam_bbh_room_9_attic_transition", + "8028eb38": "cam_bbh_room_9_mr_i_transition", + "8028eb88": "cam_bbh_room_13_balcony", + "8028ebc0": "cam_bbh_room_0", + "8028ec04": "cam_ccm_enter_slide_shortcut", + "8028ec2c": "cam_ccm_leave_slide_shortcut", + "8028ec58": "surface_type_modes", + "8028ed30": "set_mode_if_not_set_by_surface", + "8028ed98": "surface_type_modes_thi", + "8028eeb0": "camera_course_processing", + "8028f670": "resolve_geometry_collisions", + "8028f914": "rotate_camera_around_walls", + "8028fc9c": "find_mario_floor_and_ceil", + "8028fe24": "start_object_cutscene", + "8028fe58": "start_object_cutscene_without_focus", + "8028fe84": "unused_dialog_cutscene_response", + "8028ff04": "cutscene_object_with_dialog", + "8028ffc8": "cutscene_object_without_dialog", + "8029000c": "cutscene_object", + "80290098": "update_camera_yaw", + "802900e0": "cutscene_reset_spline", + "80290104": "stop_cutscene_and_retrieve_stored_info", + "80290168": "cap_switch_save", + "802901a4": "init_spline_point", + "802901fc": "copy_spline_segment", + "802903b8": "cutscene_common_set_dialog_state", + "802904a8": "cutscene_intro_peach_start_letter_music", + "802904e4": "cutscene_intro_peach_start_flying_music", + "8029051c": "reset_pan_distance", + "8029053c": "player2_rotate_cam", + "80290784": "store_info_cannon", + "802907f4": "retrieve_info_cannon", + "80290864": "store_info_star", + "802908e8": "retrieve_info_star", + "802909d0": "pan_camera", + "80290a5c": "cutscene_shake_explosion", + "80290abc": "rotate_and_move_vec3f", + "80290b54": "set_flag_post_door", + "80290ba4": "cutscene_soften_music", + "80290bd8": "cutscene_unsoften_music", + "80290c1c": "cutscene_unused_start", + "80290c30": "cutscene_unused_loop", + "80290c44": "cutscene_ending_mario_fall_start", + "80290c9c": "cutscene_ending_mario_fall_focus_mario", + "80290d90": "cutscene_ending_mario_fall", + "80290e00": "cutscene_ending_mario_land_closeup", + "80290e74": "cutscene_ending_reset_spline", + "80290eb0": "cutscene_ending_fly_up_to_window", + "80290f1c": "cutscene_ending_stars_free_peach", + "80290f8c": "cutscene_ending_mario_land", + "80291074": "cutscene_ending_peach_appear_closeup", + "80291108": "cutscene_ending_peach_appears", + "802911c8": "cutscene_ending_peach_descends_start", + "80291208": "cutscene_ending_follow_peach_descent", + "8029127c": "cutscene_ending_peach_descent_lower_focus", + "802912b8": "cutscene_ending_peach_descent_back_to_mario", + "80291354": "cutscene_ending_peach_descends", + "8029142c": "cutscene_ending_mario_to_peach", + "802914cc": "cutscene_ending_look_up_at_castle", + "80291514": "cutscene_ending_peach_wakeup", + "802915d4": "cutscene_ending_dialog", + "80291654": "cutscene_ending_kiss_closeup", + "802916b8": "cutscene_ending_kiss_here_we_go", + "80291774": "cutscene_ending_kiss", + "802917e4": "cutscene_ending_look_at_sky", + "8029184c": "cutscene_ending_zoom_fov", + "80291870": "cutscene_ending_cake_for_mario", + "80291924": "cutscene_ending_stop", + "80291964": "cutscene_grand_star_start", + "802919dc": "cutscene_grand_star_front_of_mario", + "80291ab4": "cutscene_grand_star_mario_jump", + "80291b18": "cutscene_grand_star_accel_cvar2", + "80291b68": "cutscene_grand_star_approach_mario", + "80291bf4": "cutscene_grand_star_move_cvar2", + "80291c3c": "cutscene_grand_star_focus_mario", + "80291cd0": "cutscene_grand_star", + "80291db0": "cutscene_grand_star_fly_start", + "80291e84": "cutscene_grand_star_fly_move_to_mario", + "80291f18": "cutscene_grand_star_fly_mario_offscreen", + "80292038": "cutscene_grand_star_fly_app_cvars", + "80292164": "cutscene_grand_star_fly", + "802921fc": "focus_in_front_of_mario", + "8029228c": "cutscene_dance_move_to_mario", + "80292324": "cutscene_dance_rotate", + "80292370": "cutscene_dance_rotate_move_back", + "802923b8": "cutscene_dance_rotate_move_towards_mario", + "80292414": "cutscene_dance_default_focus_mario", + "8029244c": "cutscene_dance_rotate_focus_mario", + "80292484": "cutscene_dance_shake_fov", + "802924b8": "cutscene_dance_default_rotate", + "80292628": "star_dance_bound_yaw", + "802926dc": "cutscene_dance_closeup_start", + "802927d0": "cutscene_dance_closeup_focus_mario", + "80292868": "cutscene_dance_closeup_fly_above", + "80292974": "cutscene_dance_closeup_fly_closer", + "80292a20": "cutscene_dance_closeup_zoom", + "80292a4c": "cutscene_dance_closeup_shake_fov", + "80292a80": "cutscene_dance_closeup", + "80292c00": "cutscene_dance_fly_away_start", + "80292d80": "cutscene_dance_fly_away_approach_mario", + "80292e2c": "cutscene_dance_fly_away_focus_mario", + "80292ec4": "cutscene_pan_cvar9", + "80292f40": "cutscene_dance_fly_rotate_around_mario", + "80292f98": "cutscene_dance_fly_away_rotate_while_flying", + "80292fe4": "cutscene_dance_fly_away_shake_fov", + "80293018": "cutscene_dance_fly_away", + "802930f0": "cutscene_key_dance_jump_cvar", + "80293164": "cutscene_key_dance_jump_closeup", + "802931c0": "cutscene_key_dance_jump_lower_left", + "80293220": "cutscene_key_dance_jump_above", + "8029328c": "cutscene_key_dance_jump_last", + "802932f4": "cutscene_key_dance_shake_fov", + "80293328": "cutscene_key_dance_handheld_shake", + "80293354": "cutscene_key_dance_focus_mario", + "8029338c": "cutscene_key_dance", + "80293488": "cutscene_bowser_area_shake_fov", + "802934b4": "cutscene_bowser_area_start_bowser_walking", + "802934d8": "cutscene_bowser_arena_set_pos", + "80293548": "cutscene_bowser_arena_focus_sine", + "802935e0": "cutscene_bowser_arena_set_focus", + "80293624": "cutscene_bowser_arena_adjust_offsets", + "8029369c": "cutscene_bowser_arena_pan_left", + "802936dc": "cutscene_bowser_arena_mario_dialog", + "80293708": "cutscene_stop_dialog", + "80293734": "cutscene_bowser_arena_start", + "802937e8": "bowser_fight_intro_dialog", + "8029386c": "cutscene_bowser_arena_dialog", + "802938c8": "cutscene_bowser_arena_end", + "80293944": "cutscene_bowser_arena", + "80293abc": "cutscene_star_spawn_store_info", + "80293ae8": "cutscene_star_spawn_focus_star", + "80293b70": "cutscene_star_spawn_update_boss_fight", + "80293bf4": "cutscene_star_spawn_fly_back", + "80293c2c": "cutscene_star_spawn", + "80293cb0": "cutscene_star_spawn_back", + "80293d5c": "cutscene_star_spawn_end", + "80293d90": "cutscene_exit_waterfall_warp", + "80293dd4": "cutscene_exit_to_castle_grounds_focus_mario", + "80293e7c": "cutscene_exit_waterfall", + "80293ed8": "cutscene_exit_to_castle_grounds_end", + "80293f2c": "cutscene_exit_fall_to_castle_grounds_warp", + "80293f70": "cutscene_exit_fall_to_castle_grounds", + "80293fcc": "cutscene_red_coin_star_start", + "80294024": "cutscene_red_coin_star_focus_xz", + "80294088": "cutscene_red_coin_star_focus_y", + "802940cc": "cutscene_red_coin_star_look_up_at_star", + "8029410c": "cutscene_red_coin_star_warp", + "802942cc": "cutscene_red_coin_star_set_fov", + "802942f0": "cutscene_red_coin_star", + "802943d4": "cutscene_red_coin_star_end", + "80294428": "cutscene_goto_cvar_pos", + "80294718": "cutscene_prepare_cannon_start", + "802947a4": "cutscene_prepare_cannon_fly_to_cannon", + "8029480c": "cannon_approach_prev", + "802948a0": "cutscene_prepare_cannon_fly_back", + "80294a14": "cutscene_prepare_cannon", + "80294a94": "cutscene_prepare_cannon_end", + "80294ae8": "water_death_move_to_mario_side", + "80294b78": "death_goto_mario", + "80294bb4": "cutscene_death_standing_start", + "80294c28": "cutscene_death_standing_goto_mario", + "80294c5c": "cutscene_death_standing", + "80294cc4": "cutscene_death_stomach_start", + "80294d48": "cutscene_death_stomach_goto_mario", + "80294db4": "cutscene_death_stomach", + "80294e24": "cutscene_bbh_death_start", + "80294ea8": "cutscene_bbh_death_goto_mario", + "80294ee8": "cutscene_bbh_death", + "80294f58": "cutscene_quicksand_death_start", + "80294f94": "cutscene_quicksand_death_goto_mario", + "80294fec": "cutscene_quicksand_death", + "802950b0": "cutscene_suffocation_fly_away", + "80295140": "cutscene_suffocation_stay_above_gas", + "802951f0": "cutscene_suffocation_rotate", + "80295270": "cutscene_suffocation", + "80295310": "cutscene_enter_pool_start", + "802953dc": "cutscene_enter_pool_loop", + "80295418": "cutscene_enter_pool", + "80295480": "cutscene_pyramid_top_explode_start", + "802954ec": "cutscene_pyramid_top_explode_zoom_in", + "80295518": "cutscene_pyramid_top_explode_focus", + "80295580": "cutscene_pyramid_top_explode_warp", + "80295670": "cutscene_pyramid_top_explode_closeup", + "80295740": "cutscene_pyramid_top_explode_cam_shake", + "8029576c": "cutscene_pyramid_top_explode_warp_back", + "802957c8": "cutscene_pyramid_top_explode", + "80295894": "cutscene_pyramid_top_explode_end", + "802958d4": "cutscene_enter_pyramid_top_start", + "80295930": "cutscene_enter_pyramid_top", + "80295a58": "cutscene_dialog_start", + "80295bf0": "cutscene_dialog_move_mario_shoulder", + "80295e24": "cutscene_dialog_create_dialog_box", + "80295e8c": "cutscene_dialog", + "80295fb0": "cutscene_dialog_set_flag", + "80295fd8": "cutscene_dialog_end", + "80296020": "cutscene_read_message_start", + "80296160": "cutscene_read_message", + "802962c8": "cutscene_read_message_set_flag", + "802962f0": "cutscene_read_message_end", + "80296318": "cutscene_exit_succ_start", + "802963b8": "cutscene_non_painting_set_cam_pos", + "8029652c": "cutscene_non_painting_set_cam_focus", + "8029665c": "cutscene_exit_bowser_succ_focus_left", + "8029669c": "cutscene_exit_bowser_key_toss_shake", + "802966e4": "cutscene_exit_succ_shake_landing", + "80296710": "cutscene_exit_bowser_succ", + "802967c4": "cutscene_non_painting_end", + "8029685c": "cutscene_exit_non_painting_succ_override_cvar", + "802968a0": "cutscene_exit_non_painting_succ", + "8029695c": "cutscene_non_painting_death_start", + "802969f8": "cutscene_exit_bowser_death", + "80296a64": "cutscene_non_painting_death_override_offset", + "80296b30": "cutscene_non_painting_death", + "80296bc8": "cutscene_cap_switch_press_start", + "80296c4c": "cutscene_cap_switch_press_rotate_around_mario", + "80296d60": "cutscene_cap_switch_press_lower_cam", + "80296da8": "cutscene_cap_switch_press_approach_mario", + "80296eb4": "cutscene_cap_switch_press_pan_left", + "80296f38": "cutscene_cap_switch_press_create_dialog", + "80296fa8": "cutscene_cap_switch_press", + "80297148": "cutscene_unlock_key_door_start", + "8029720c": "cutscene_unlock_key_door_approach_mario", + "80297290": "cutscene_unlock_key_door_focus_lock", + "802972ec": "cutscene_unlock_key_door_stub", + "80297300": "cutscene_unlock_key_door_fly_back", + "80297384": "cutscene_unlock_key_door_fov_shake", + "802973b0": "cutscene_unlock_key_door", + "80297464": "intro_peach_move_camera_start_to_pipe", + "80297560": "peach_letter_text", + "8029758c": "play_sound_peach_reading_letter", + "802975c4": "cutscene_intro_peach_start_to_pipe_spline", + "8029762c": "cutscene_intro_peach_dialog", + "802976bc": "cutscene_intro_peach_follow_pipe_spline", + "80297728": "cutscene_intro_peach_clear_cutscene_status", + "80297748": "cutscene_intro_peach_zoom_fov", + "80297784": "cutscene_intro_peach_reset_spline", + "802977c8": "cutscene_intro_peach_handheld_shake_off", + "802977f4": "intro_pipe_exit_text", + "80297820": "play_sound_intro_turn_on_hud", + "8029784c": "cutscene_intro_peach_fly_to_pipe", + "80297908": "cutscene_intro_peach_mario_appears", + "80297a38": "cutscene_intro_peach_reset_fov", + "80297a64": "cutscene_intro_peach_letter", + "80297b58": "cutscene_end_waving_start", + "80297b84": "cutscene_end_waving", + "80297c14": "cutscene_credits_reset_spline", + "80297c40": "cutscene_credits", + "802980dc": "cutscene_sliding_doors_open_start", + "8029819c": "cutscene_sliding_doors_open_set_cvars", + "80298218": "cutscene_sliding_doors_go_under_doorway", + "80298254": "cutscene_sliding_doors_fly_back_up", + "80298290": "cutscene_sliding_doors_follow_mario", + "802983b4": "cutscene_sliding_doors_open", + "80298458": "cutscene_double_doors_end", + "802984a0": "cutscene_enter_painting_stub", + "802984b4": "cutscene_enter_painting", + "802987b0": "cutscene_exit_painting_start", + "8029894c": "cutscene_exit_painting_move_to_mario", + "802989e8": "cutscene_exit_painting_move_to_floor", + "80298af8": "cutscene_exit_painting", + "80298ba0": "cutscene_unused_exit_start", + "80298c2c": "cutscene_unused_exit_focus_mario", + "80298ccc": "cutscene_exit_painting_end", + "80298d44": "cutscene_enter_cannon_end", + "80298d9c": "cutscene_enter_cannon_raise", + "80298fe8": "cutscene_enter_cannon_start", + "80299100": "cutscene_door_start", + "80299154": "cutscene_door_fix_cam", + "802991a8": "cutscene_door_loop", + "802991f0": "cutscene_door_move_behind_mario", + "802992cc": "cutscene_door_follow_mario", + "80299360": "cutscene_door_end", + "80299404": "cutscene_door_mode", + "802994e8": "play_cutscene", + "8029a2f8": "cutscene_event", + "8029a37c": "cutscene_spawn_obj", + "8029a3b4": "set_fov_shake", + "8029a41c": "set_fov_shake_from_point", + "8029a4d0": "shake_camera_fov", + "8029a5e8": "set_fov_30", + "8029a60c": "approach_fov_20", + "8029a64c": "set_fov_45", + "8029a670": "set_fov_29", + "8029a694": "zoom_fov_30", + "8029a6f4": "fov_default", + "8029a858": "approach_fov_30", + "8029a894": "approach_fov_60", + "8029a8d0": "approach_fov_45", + "8029a968": "approach_fov_80", + "8029a9a4": "set_fov_bbh", + "8029aa3c": "geo_camera_fov", + "8029ab94": "set_fov_function", + "8029abb0": "cutscene_set_fov_shake_preset", + "8029ac30": "set_fov_shake_from_point_preset", + "8029aef8": "obj_rotate_towards_point", + "8029af98": "intro_peach_set_pos_and_opacity", + "8029b08c": "bhv_intro_peach_loop", + "8029b28c": "intro_lakitu_set_offset_from_camera", + "8029b358": "intro_lakitu_set_focus", + "8029b3c8": "intro_lakitu_set_pos_and_focus", + "8029b49c": "bhv_intro_lakitu_loop", + "8029bde4": "bhv_end_birds_1_loop", + "8029bf64": "bhv_end_birds_2_loop", + "8029c0e4": "spawn_child_obj_relative", + "8029c254": "bhv_intro_scene_loop", + "8029c770": "nop_change_course", + "8029c780": "copy_mario_state_to_object", + "8029c9cc": "spawn_particle", + "8029ca58": "bhv_mario_update", + "8029cb34": "update_objects_starting_at", + "8029cbc8": "update_objects_during_time_stop", + "8029cd28": "update_objects_in_list", + "8029cd98": "unload_deactivated_objects_in_list", + "8029ce58": "set_object_respawn_info_bits", + "8029cedc": "unload_objects_from_area", + "8029cfb0": "spawn_objects_from_info", + "8029d1d8": "stub_obj_list_processor_1", + "8029d1e8": "clear_objects", + "8029d324": "update_terrain_objects", + "8029d374": "update_non_terrain_objects", + "8029d428": "unload_deactivated_objects", + "8029d690": "update_objects", + "8029d890": "geo_update_projectile_pos_from_parent", + "8029d924": "geo_update_layer_transparency", + "8029db48": "geo_switch_anim_state", + "8029dbd4": "geo_switch_area", + "8029dcd4": "obj_update_pos_from_parent_transformation", + "8029dda8": "obj_apply_scale_to_matrix", + "8029de80": "create_transformation_from_matrices", + "8029e1b0": "obj_set_held_state", + "8029e27c": "lateral_dist_between_objects", + "8029e2f8": "dist_between_objects", + "8029e398": "cur_obj_forward_vel_approach_upward", + "8029e3e8": "approach_f32_signed", + "8029e494": "approach_f32_symmetric", + "8029e530": "approach_s16_symmetric", + "8029e5ec": "cur_obj_rotate_yaw_toward", + "8029e694": "obj_angle_to_object", + "8029e714": "obj_turn_toward_object", + "8029e8bc": "obj_set_parent_relative_pos", + "8029e914": "obj_set_pos", + "8029e96c": "obj_set_angle", + "8029e9ac": "spawn_object_abs_with_rot", + "8029ea24": "spawn_object_rel_with_rot", + "8029eaac": "spawn_obj_with_transform_flags", + "8029eb04": "spawn_water_droplet", + "8029ed20": "spawn_object_at_origin", + "8029edcc": "spawn_object", + "8029ee24": "try_to_spawn_object", + "8029eeb8": "spawn_object_with_scale", + "8029ef64": "spawn_object_relative", + "8029effc": "spawn_object_relative_with_scale", + "8029f070": "cur_obj_move_using_vel", + "8029f0c8": "obj_copy_graph_y_offset", + "8029f0e0": "obj_copy_pos_and_angle", + "8029f120": "obj_copy_pos", + "8029f148": "obj_copy_angle", + "8029f188": "obj_set_gfx_pos_from_pos", + "8029f1b0": "obj_init_animation", + "8029f200": "linear_mtxf_mul_vec3f", + "8029f274": "linear_mtxf_transpose_mul_vec3f", + "8029f2ec": "obj_apply_scale_to_transform", + "8029f3a8": "obj_copy_scale", + "8029f3d0": "obj_scale_xyz", + "8029f404": "obj_scale", + "8029f430": "cur_obj_scale", + "8029f464": "cur_obj_init_animation", + "8029f4b4": "cur_obj_init_animation_with_sound", + "8029f514": "cur_obj_init_animation_with_accel_and_sound", + "8029f59c": "obj_init_animation_with_sound", + "8029f600": "cur_obj_enable_rendering_and_become_tangible", + "8029f620": "cur_obj_enable_rendering", + "8029f644": "cur_obj_disable_rendering_and_become_intangible", + "8029f66c": "cur_obj_disable_rendering", + "8029f694": "cur_obj_unhide", + "8029f6bc": "cur_obj_hide", + "8029f6e0": "cur_obj_set_pos_relative", + "8029f7d8": "cur_obj_set_pos_relative_to_parent", + "8029f820": "cur_obj_enable_rendering_2", + "8029f848": "cur_obj_unused_init_on_floor", + "8029f8ec": "obj_set_face_angle_to_move_angle", + "8029f914": "get_object_list_from_behavior", + "8029f95c": "cur_obj_nearest_object_with_behavior", + "8029f998": "cur_obj_dist_to_nearest_object_with_behavior", + "8029f9ec": "cur_obj_find_nearest_object_with_behavior", + "8029fb1c": "find_unimportant_object", + "8029fb68": "count_unimportant_objects", + "8029fbdc": "count_objects_with_behavior", + "8029fc9c": "cur_obj_find_nearby_held_actor", + "8029fdb4": "cur_obj_change_action", + "8029fe00": "cur_obj_set_vel_from_mario_vel", + "8029fe6c": "cur_obj_reverse_animation", + "8029fea4": "cur_obj_extend_animation_if_at_end", + "8029ff04": "cur_obj_check_if_near_animation_end", + "8029ffa4": "cur_obj_check_if_at_animation_end", + "802a0008": "cur_obj_check_anim_frame", + "802a0050": "cur_obj_check_anim_frame_in_range", + "802a00ac": "cur_obj_check_frame_prior_current_frame", + "802a0114": "mario_is_in_air_action", + "802a0154": "mario_is_dive_sliding", + "802a0198": "cur_obj_set_y_vel_and_animation", + "802a01d8": "cur_obj_unrender_and_reset_state", + "802a0380": "cur_obj_get_thrown_or_placed", + "802a0474": "cur_obj_get_dropped", + "802a04c0": "cur_obj_set_model", + "802a04f0": "mario_set_flag", + "802a0514": "cur_obj_clear_interact_status_flag", + "802a0568": "obj_mark_for_deletion", + "802a057c": "cur_obj_disable", + "802a05b4": "cur_obj_become_intangible", + "802a05d4": "cur_obj_become_tangible", + "802a05f0": "obj_become_tangible", + "802a0604": "cur_obj_update_floor_height", + "802a064c": "cur_obj_update_floor_height_and_get_floor", + "802a079c": "cur_obj_apply_drag_xz", + "802a0e68": "cur_obj_move_y", + "802a113c": "cur_obj_unused_resolve_wall_collisions", + "802a11a8": "abs_angle_diff", + "802a120c": "cur_obj_move_xz_using_fvel_and_yaw", + "802a12a4": "cur_obj_move_y_with_terminal_vel", + "802a1308": "cur_obj_compute_vel_xz", + "802a1370": "increment_velocity_toward_range", + "802a1424": "obj_check_if_collided_with_object", + "802a148c": "cur_obj_set_behavior", + "802a14c4": "obj_set_behavior", + "802a14fc": "cur_obj_has_behavior", + "802a1554": "obj_has_behavior", + "802a15ac": "cur_obj_lateral_dist_from_mario_to_home", + "802a1634": "cur_obj_lateral_dist_to_home", + "802a16ac": "cur_obj_outside_home_square", + "802a1774": "cur_obj_outside_home_rectangle", + "802a184c": "cur_obj_set_pos_to_home", + "802a188c": "cur_obj_set_pos_to_home_and_stop", + "802a18dc": "cur_obj_shake_y", + "802a1930": "cur_obj_start_cam_event", + "802a1960": "set_mario_interact_hoot_if_in_range", + "802a19ac": "obj_set_billboard", + "802a19c8": "cur_obj_set_hitbox_radius_and_height", + "802a19f0": "cur_obj_set_hurtbox_radius_and_height", + "802a1b34": "obj_spawn_loot_blue_coins", + "802a1b8c": "obj_spawn_loot_yellow_coins", + "802a1bdc": "cur_obj_spawn_loot_coin_at_mario_pos", + "802a1c68": "cur_obj_abs_y_dist_to_home", + "802a1cc4": "cur_obj_advance_looping_anim", + "802a1f3c": "cur_obj_resolve_wall_collisions", + "802a2320": "cur_obj_update_floor_and_walls", + "802a2348": "cur_obj_move_standard", + "802a25b4": "cur_obj_move_using_vel_and_gravity", + "802a2644": "cur_obj_move_using_fvel_and_gravity", + "802a2674": "obj_set_pos_relative", + "802a2748": "cur_obj_angle_to_home", + "802a27b0": "obj_set_gfx_pos_at_obj_pos", + "802a2804": "obj_translate_local", + "802a2930": "obj_build_transform_from_pos_and_angle", + "802a2a18": "obj_set_throw_matrix_from_transform", + "802a2a84": "obj_build_transform_relative_to_parent", + "802a2b28": "obj_create_transform_from_self", + "802a2b6c": "cur_obj_rotate_move_angle_using_vel", + "802a2bc4": "cur_obj_rotate_face_angle_using_vel", + "802a2c1c": "cur_obj_set_face_angle_to_move_angle", + "802a2c5c": "cur_obj_follow_path", + "802a2ed4": "chain_segment_init", + "802a2f14": "random_f32_around_zero", + "802a2f5c": "obj_scale_random", + "802a2fc0": "obj_translate_xyz_random", + "802a308c": "obj_translate_xz_random", + "802a31e0": "cur_obj_set_pos_via_transform", + "802a3268": "cur_obj_reflect_move_angle_off_wall", + "802a32ac": "cur_obj_spawn_particles", + "802a34a4": "obj_set_hitbox", + "802a3604": "signum_positive", + "802a3634": "absf", + "802a3674": "absi", + "802a36a4": "cur_obj_wait_then_blink", + "802a3754": "cur_obj_is_mario_ground_pounding_platform", + "802a37ac": "spawn_mist_particles", + "802a37dc": "spawn_mist_particles_with_sound", + "802a3818": "cur_obj_push_mario_away", + "802a390c": "cur_obj_push_mario_away_from_cylinder", + "802a399c": "bhv_dust_smoke_loop", + "802a3a4c": "cur_obj_set_direction_table", + "802a3a88": "cur_obj_progress_direction_table", + "802a3b28": "stub_obj_helpers_3", + "802a3b40": "cur_obj_scale_over_time", + "802a3c18": "cur_obj_set_pos_to_home_with_debug", + "802a3cec": "stub_obj_helpers_4", + "802a3cfc": "cur_obj_is_mario_on_platform", + "802a3d40": "cur_obj_shake_y_until", + "802a3dd4": "cur_obj_move_up_and_down", + "802a3e30": "cur_obj_call_action_function", + "802a3ef8": "spawn_base_star_with_no_lvl_exit", + "802a3f24": "bit_shift_left", + "802a3f48": "cur_obj_mario_far_away", + "802a404c": "is_mario_moving_fast_or_in_air", + "802a40b8": "is_item_in_array", + "802a4120": "bhv_init_room", + "802a4210": "cur_obj_enable_rendering_if_mario_in_room", + "802a4360": "cur_obj_set_hitbox_and_die_if_attacked", + "802a4440": "obj_explode_and_spawn_coins", + "802a44f4": "obj_set_collision_data", + "802a452c": "cur_obj_if_hit_wall_bounce_away", + "802a4564": "cur_obj_hide_if_mario_far_away_y", + "802a45e4": "geo_offset_klepto_held_object", + "802a462c": "geo_offset_klepto_debug", + "802a46cc": "obj_is_hidden", + "802a4704": "enable_time_stop", + "802a4728": "disable_time_stop", + "802a4750": "set_time_stop_flags", + "802a4774": "clear_time_stop_flags", + "802a47a0": "cur_obj_can_mario_activate_textbox", + "802a48bc": "cur_obj_can_mario_activate_textbox_2", + "802a4960": "cur_obj_update_dialog", + "802a4be4": "cur_obj_update_dialog_with_cutscene", + "802a4f04": "cur_obj_has_model", + "802a4f58": "cur_obj_align_gfx_with_floor", + "802a5034": "mario_is_within_rectangle", + "802a50fc": "cur_obj_shake_screen", + "802a513c": "obj_attack_collided_from_other_object", + "802a51ac": "cur_obj_was_attacked_or_ground_pounded", + "802a5228": "obj_copy_behavior_params", + "802a5248": "cur_obj_init_animation_and_anim_frame", + "802a5288": "cur_obj_init_animation_and_check_if_near_end", + "802a52c4": "cur_obj_init_animation_and_extend_if_at_end", + "802a52f8": "cur_obj_check_grabbed_mario", + "802a5358": "player_performed_grab_escape_action", + "802a540c": "cur_obj_unused_play_footstep_sound", + "802a5460": "enable_time_stop_including_mario", + "802a5498": "disable_time_stop_including_mario", + "802a54d8": "cur_obj_check_interacted", + "802a5524": "cur_obj_spawn_loot_blue_coin", + "802a5588": "cur_obj_spawn_star_at_y_offset", + "802a5620": "star_door_update_pos", + "802a56bc": "bhv_star_door_loop", + "802a58dc": "bhv_piranha_particle_loop", + "802a597c": "mr_i_piranha_particle_act_0", + "802a5a44": "mr_i_piranha_particle_act_1", + "802a5aa0": "bhv_mr_i_particle_loop", + "802a5acc": "spawn_mr_i_particle", + "802a5bd4": "bhv_mr_i_body_loop", + "802a5d4c": "mr_i_act_3", + "802a6518": "mr_i_act_2", + "802a68a0": "mr_i_act_1", + "802a6ad8": "mr_i_act_0", + "802a6b7c": "bhv_mr_i_loop", + "802a6c20": "bhv_pole_init", + "802a6c74": "bhv_giant_pole_loop", + "802a6cf4": "bhv_thi_huge_island_top_loop", + "802a6d64": "bhv_thi_tiny_island_top_loop", + "802a6ee4": "cap_switch_act_0", + "802a7020": "cap_switch_act_1", + "802a708c": "cap_switch_act_2", + "802a7160": "cap_switch_act_3", + "802a7170": "bhv_cap_switch_loop", + "802a719c": "geo_update_held_mario_pos", + "802a7230": "bhv_bobomb_anchor_mario_loop", + "802a7264": "king_bobomb_act_0", + "802a7384": "mario_is_far_below_object", + "802a73d8": "king_bobomb_act_2", + "802a7598": "king_bobomb_act_3", + "802a7804": "king_bobomb_act_1", + "802a78d8": "king_bobomb_act_6", + "802a7a60": "king_bobomb_act_7", + "802a7b1c": "king_bobomb_act_8", + "802a7b5c": "king_bobomb_act_4", + "802a7d14": "king_bobomb_act_5", + "802a7fbc": "king_bobomb_move", + "802a8064": "bhv_king_bobomb_loop", + "802a816c": "bhv_beta_chest_bottom_init", + "802a81e8": "bhv_beta_chest_bottom_loop", + "802a821c": "bhv_beta_chest_lid_loop", + "802a8370": "bhv_water_air_bubble_init", + "802a83a0": "bhv_water_air_bubble_loop", + "802a8630": "bhv_bubble_wave_init", + "802a86bc": "scale_bubble_random", + "802a870c": "bhv_bubble_maybe_loop", + "802a88a4": "bhv_small_water_wave_loop", + "802a8a38": "scale_bubble_sin", + "802a8b18": "bhv_particle_init", + "802a8bc0": "bhv_particle_loop", + "802a8c88": "bhv_small_bubbles_loop", + "802a8cdc": "bhv_fish_group_loop", + "802a8d48": "bhv_water_waves_init", + "802a8d98": "bhv_cannon_base_unused_loop", + "802a8dc0": "opened_cannon_act_0", + "802a8f40": "opened_cannon_act_4", + "802a9114": "opened_cannon_act_6", + "802a92fc": "opened_cannon_act_5", + "802a93f8": "opened_cannon_act_1", + "802a9440": "opened_cannon_act_2", + "802a9460": "opened_cannon_act_3", + "802a9498": "bhv_cannon_base_loop", + "802a94f8": "bhv_cannon_barrel_loop", + "802a958c": "common_anchor_mario_behavior", + "802a9708": "bhv_chuckya_anchor_mario_loop", + "802a973c": "unknown_chuckya_function", + "802a98c4": "approach_forward_vel", + "802a9994": "chuckya_act_0", + "802a9d08": "chuckya_act_1", + "802a9f54": "chuckya_act_3", + "802a9fc8": "chuckya_act_2", + "802aa02c": "chuckya_move", + "802aa0ac": "bhv_chuckya_loop", + "802aa1b8": "bhv_wf_breakable_wall_loop", + "802aa280": "check_mario_attacking", + "802aa3c8": "init_kickable_board_rock", + "802aa3f4": "bhv_kickable_board_loop", + "802aa700": "bhv_tower_door_loop", + "802aa774": "bhv_wf_rotating_wooden_platform_loop", + "802aa830": "bhv_rotating_platform_loop", + "802aa948": "set_koopa_shell_underwater_hitbox", + "802aa97c": "bhv_koopa_shell_underwater_loop", + "802aaa60": "bhv_warp_loop", + "802aab54": "bhv_fading_warp_loop", + "802aac48": "bhv_white_puff_exploding_loop", + "802aae8c": "spawn_mist_particles_variable", + "802aaf48": "bhv_spawned_star_init", + "802aaffc": "set_sparkle_spawn_star_hitbox", + "802ab060": "set_home_to_mario", + "802ab158": "set_y_home_to_pos", + "802ab18c": "slow_star_rotation", + "802ab1c8": "bhv_spawned_star_loop", + "802ab558": "bhv_spawn_star_no_level_exit", + "802ab5c8": "bhv_coin_sparkles_init", + "802ab650": "bhv_yellow_coin_init", + "802ab70c": "bhv_yellow_coin_loop", + "802ab748": "bhv_temp_coin_loop", + "802ab7a4": "bhv_coin_init", + "802ab860": "bhv_coin_loop", + "802aba40": "bhv_coin_formation_spawn_loop", + "802abc04": "spawn_coin_in_formation", + "802abee4": "bhv_coin_formation_init", + "802abf0c": "bhv_coin_formation_loop", + "802ac068": "coin_inside_boo_act_1", + "802ac15c": "coin_inside_boo_act_0", + "802ac294": "bhv_coin_inside_boo_loop", + "802ac2c0": "bhv_coin_sparkles_loop", + "802ac2ec": "bhv_golden_coin_sparkles_loop", + "802ac3a8": "bhv_punch_tiny_triangle_loop", + "802ac4a0": "bhv_punch_tiny_triangle_init", + "802ac5b4": "bhv_wall_tiny_star_particle_loop", + "802ac678": "bhv_tiny_star_particles_init", + "802ac78c": "bhv_pound_tiny_star_particle_loop", + "802ac864": "bhv_pound_tiny_star_particle_init", + "802ac910": "door_animation_and_reset", + "802ac958": "set_door_camera_event", + "802ac9d0": "play_door_open_noise", + "802aca6c": "play_warp_door_open_noise", + "802acac8": "bhv_door_loop", + "802acc3c": "bhv_door_init", + "802ace80": "bhv_star_door_loop_2", + "802ad078": "grindel_thwomp_act_4", + "802ad10c": "grindel_thwomp_act_2", + "802ad1a4": "grindel_thwomp_act_3", + "802ad238": "grindel_thwomp_act_1", + "802ad2d0": "grindel_thwomp_act_0", + "802ad34c": "bhv_grindel_thwomp_loop", + "802ad378": "bhv_tumbling_bridge_platform_loop", + "802ad580": "tumbling_bridge_act_1", + "802ad76c": "tumbling_bridge_act_2", + "802ad7f4": "tumbling_bridge_act_3", + "802ad828": "tumbling_bridge_act_0", + "802ad890": "bhv_tumbling_bridge_loop", + "802ad8bc": "elevator_starting_shake", + "802ad8f0": "elevator_act_0", + "802ada4c": "elevator_act_1", + "802adb88": "elevator_act_2", + "802adce4": "elevator_act_4", + "802add70": "elevator_act_3", + "802addf8": "bhv_elevator_init", + "802adf6c": "bhv_elevator_loop", + "802adf98": "bhv_water_mist_spawn_loop", + "802adfd8": "bhv_water_mist_loop", + "802ae0cc": "spawn_triangle_break_particles", + "802ae238": "bhv_water_mist_2_loop", + "802ae304": "bhv_pound_white_puffs_init", + "802ae334": "spawn_mist_from_global", + "802ae360": "bhv_ground_sand_init", + "802ae394": "spawn_smoke_with_velocity", + "802ae45c": "clear_particle_flags", + "802ae48c": "bhv_ground_snow_init", + "802ae4c0": "spawn_wind_particles", + "802ae534": "bhv_wind_loop", + "802ae85c": "bhv_unused_particle_spawn_loop", + "802ae908": "bhv_ukiki_cage_star_loop", + "802aea6c": "ukiki_cage_act_wait_for_ukiki", + "802aeab8": "ukiki_cage_act_spin", + "802aeb1c": "ukiki_cage_act_fall", + "802aeb74": "ukiki_cage_act_hide", + "802aeb9c": "bhv_ukiki_cage_loop", + "802aebc8": "bhv_squishable_platform_loop", + "802aec40": "bhv_bitfs_sinking_platform_loop", + "802aeca8": "bhv_ddd_moving_pole_loop", + "802aecdc": "bhv_bitfs_sinking_cage_platform_loop", + "802aedc0": "bhv_beta_moving_flames_spawn_loop", + "802aeea4": "bhv_beta_moving_flames_loop", + "802aef1c": "bhv_flamethrower_flame_loop", + "802af1e8": "bhv_flamethrower_loop", + "802af3fc": "bhv_rr_rotating_bridge_platform_loop", + "802af448": "bhv_bouncing_fireball_flame_loop", + "802af5f8": "bhv_bouncing_fireball_loop", + "802af7c4": "bhv_bowser_shock_wave_loop", + "802af9cc": "bhv_black_smoke_upward_loop", + "802afa0c": "bhv_black_smoke_bowser_loop", + "802afae4": "bhv_black_smoke_mario_loop", + "802afbf8": "bhv_flame_mario_loop", + "802afce4": "bhv_beta_fish_splash_spawner_loop", + "802afd1c": "bhv_spindrift_loop", + "802afee8": "bhv_wf_solid_tower_platform_loop", + "802aff30": "bhv_wf_elevator_tower_platform_loop", + "802b00e4": "bhv_wf_sliding_tower_platform_loop", + "802b0244": "spawn_and_init_wf_platforms", + "802b039c": "spawn_wf_platform_group", + "802b04b4": "bhv_tower_platform_group_loop", + "802b0614": "bhv_tree_snow_or_leaf_loop", + "802b0974": "bhv_snow_leaf_particle_spawn_init", + "802b0b9c": "square_plat_set_yaw_until_timer", + "802b0bec": "bhv_squarish_path_moving_loop", + "802b0d48": "bhv_piranha_plant_waking_bubbles_loop", + "802b0df0": "bhv_piranha_plant_bubble_loop", + "802b1278": "bhv_purple_switch_loop", + "802b14f4": "check_if_moving_over_floor", + "802b15e8": "bhv_pushable_loop", + "802b1714": "breakable_box_init", + "802b17f4": "hidden_breakable_box_actions", + "802b19d8": "hidden_unbreakable_box_actions", + "802b1ae0": "bhv_hidden_object_loop", + "802b1b2c": "bhv_breakable_box_loop", + "802b1bb0": "geo_move_mario_part_from_parent", + "802b1c54": "bhv_heave_ho_throw_mario_loop", + "802b1d7c": "heave_ho_act_1", + "802b1e6c": "heave_ho_act_2", + "802b1ff4": "heave_ho_act_3", + "802b20a0": "heave_ho_act_0", + "802b2154": "heave_ho_move", + "802b2278": "bhv_heave_ho_loop", + "802b2340": "bhv_ccm_touched_star_spawn_loop", + "802b23e0": "bhv_unused_poundable_platform", + "802b2494": "bhv_beta_trampoline_spring_loop", + "802b25ac": "bhv_beta_trampoline_top_loop", + "802b26a4": "jumping_box_act_0", + "802b27d8": "jumping_box_act_1", + "802b2824": "jumping_box_free_update", + "802b288c": "bhv_jumping_box_loop", + "802b29b8": "bhv_boo_cage_loop", + "802b2bc8": "spawn_sparkle_particles", + "802b2d10": "bhv_alpha_boo_key_loop", + "802b3108": "bhv_beta_boo_key_loop", + "802b3134": "arc_to_goal_pos", + "802b3250": "grand_star_zero_velocity", + "802b329c": "bhv_grand_star_loop", + "802b3600": "bhv_bowser_key_loop", + "802b37b8": "bhv_white_puff_smoke_init", + "802b3810": "bhv_bullet_bill_init", + "802b3830": "bullet_bill_act_0", + "802b38b8": "bullet_bill_act_1", + "802b394c": "bullet_bill_act_2", + "802b3b08": "bullet_bill_act_3", + "802b3b24": "bullet_bill_act_4", + "802b3be0": "bhv_bullet_bill_loop", + "802b3c2c": "bowser_tail_anchor_act_0", + "802b3cdc": "bowser_tail_anchor_act_1", + "802b3d10": "bowser_tail_anchor_act_2", + "802b3d74": "bhv_bowser_tail_anchor_loop", + "802b3df4": "bhv_bowser_flame_spawn_loop", + "802b4080": "bhv_bowser_body_anchor_loop", + "802b4184": "bowser_spawn_shockwave", + "802b41fc": "bowser_bounce", + "802b4288": "bowser_set_anim_look_up_and_walk", + "802b4300": "bowser_set_anim_slow_gait", + "802b4368": "bowser_set_anim_look_down", + "802b43dc": "bowser_initialize_action", + "802b4478": "bowser_act_text_wait", + "802b44bc": "bowser_act_intro_walk", + "802b45f4": "bowser_bitdw_act_controller", + "802b473c": "bowser_bitfs_act_controller", + "802b48d4": "bowser_general_bits_act_controller", + "802b4a1c": "bowser_set_act_jump", + "802b4a3c": "bowser_bits_act_controller", + "802b4af4": "bowser_reset_fallen_off_stage", + "802b4bac": "bowser_act_unused_slow_walk", + "802b4be8": "bowser_act_default", + "802b4ca4": "bowser_act_breath_fire", + "802b4d14": "bowser_act_walk_to_mario", + "802b4f00": "bowser_act_teleport", + "802b5104": "bowser_act_spit_fire_into_sky", + "802b5218": "bowser_act_hit_mine", + "802b53f4": "bowser_set_anim_in_air", + "802b5444": "bowser_land", + "802b5554": "bowser_short_second_hop", + "802b55cc": "bowser_act_jump", + "802b5798": "bowser_act_jump_towards_mario", + "802b58bc": "bowser_act_hit_edge", + "802b59cc": "bowser_act_spit_fire_onto_floor", + "802b5aec": "bowser_turn_on_timer", + "802b5c00": "bowser_act_turn_from_edge", + "802b5c40": "bowser_act_charge_mario", + "802b5f6c": "bowser_check_hit_mine", + "802b5fec": "bowser_act_thrown_dropped", + "802b611c": "bowser_set_goal_invisible", + "802b6190": "bowser_act_jump_onto_stage", + "802b6568": "bowser_act_dance", + "802b65d0": "bowser_spawn_grand_star_key", + "802b6670": "bowser_fly_back_dead", + "802b6730": "bowser_dead_bounce", + "802b67d4": "bowser_dead_wait_for_mario", + "802b6878": "bowser_dead_twirl_into_trophy", + "802b6a10": "bowser_dead_hide", + "802b6a78": "bowser_dead_not_bits_end", + "802b6bac": "bowser_dead_bits_end", + "802b6cf0": "bowser_act_dead", + "802b6e40": "bowser_tilt_platform", + "802b6ee0": "bowser_act_ride_tilting_platform", + "802b711c": "bowser_check_fallen_off_stage", + "802b71e4": "bowser_free_update", + "802b72d4": "bowser_held_update", + "802b7418": "bowser_thrown_dropped_update", + "802b75a4": "bhv_bowser_loop", + "802b7878": "bhv_bowser_init", + "802b798c": "geo_update_body_rot_from_parent", + "802b7a20": "bowser_open_eye_switch", + "802b7c64": "geo_switch_bowser_eyes", + "802b7d44": "geo_bits_bowser_coloring", + "802b7e68": "falling_bowser_plat_act_0", + "802b7ef0": "falling_bowser_plat_act_1", + "802b8024": "falling_bowser_plat_act_2", + "802b8384": "bhv_falling_bowser_platform_loop", + "802b83b0": "bowser_flame_despawn", + "802b8434": "bowser_flame_should_despawn", + "802b84ac": "bhv_flame_bowser_init", + "802b85b0": "bhv_flame_large_burning_out_init", + "802b8654": "bowser_flame_move", + "802b8734": "bhv_flame_bowser_loop", + "802b8960": "bhv_flame_moving_forward_growing_init", + "802b89ec": "bhv_flame_moving_forward_growing_loop", + "802b8b1c": "bhv_flame_floating_landing_init", + "802b8c38": "bhv_flame_floating_landing_loop", + "802b8d68": "bhv_blue_bowser_flame_init", + "802b8e7c": "bhv_blue_bowser_flame_loop", + "802b9034": "bhv_flame_bouncing_init", + "802b90ec": "bhv_flame_bouncing_loop", + "802b921c": "bhv_blue_flames_group_loop", + "802b935c": "bhv_blue_fish_movement_loop", + "802b9790": "bhv_tank_fish_group_loop", + "802b98d4": "vec3f_copy_2", + "802b98fc": "bhv_checkerboard_elevator_group_init", + "802b9a78": "checkerboard_plat_act_move_y", + "802b9af8": "checkerboard_plat_act_rotate", + "802b9bb4": "bhv_checkerboard_platform_init", + "802b9bd8": "bhv_checkerboard_platform_loop", + "802b9e94": "bhv_ddd_warp_loop", + "802b9efc": "water_level_pillar_undrained", + "802ba13c": "water_level_pillar_drained", + "802ba19c": "bhv_water_level_pillar_init", + "802ba1e0": "bhv_water_level_pillar_loop", + "802ba25c": "bhv_invisible_objects_under_bridge_init", + "802ba2b0": "geo_scale_bowser_key", + "802ba2f8": "bhv_bowser_key_unlock_door_loop", + "802ba458": "bhv_bowser_key_course_exit_loop", + "802ba5bc": "bhv_moat_grills_loop", + "802ba608": "bhv_rotating_clock_arm_loop", + "802ba7e0": "handle_cap_ukiki_reset", + "802ba868": "is_cap_ukiki_and_mario_has_normal_cap_on_head", + "802ba8c4": "geo_update_projectile_pos_from_parent_copy", + "802ba958": "idle_ukiki_taunt", + "802bab7c": "ukiki_act_idle", + "802bae40": "ukiki_act_return_home", + "802baec4": "ukiki_act_wait_to_respawn", + "802baf10": "ukiki_act_unused_turn", + "802baf64": "ukiki_act_turn_to_mario", + "802bb07c": "ukiki_act_run", + "802bb288": "ukiki_act_jump", + "802bb3b8": "ukiki_act_go_to_cage", + "802bb798": "ukiki_free_loop", + "802bb888": "cage_ukiki_held_loop", + "802bba3c": "cap_ukiki_held_loop", + "802bbb98": "bhv_ukiki_init", + "802bbc0c": "bhv_ukiki_loop", + "802bbd6c": "lll_octagonal_mesh_move", + "802bbfd8": "lll_octagonal_mesh_find_y_offset", + "802bc0f0": "bhv_lll_moving_octagonal_mesh_platform_loop", + "802bc22c": "bhv_lll_sinking_rock_block_loop", + "802bc294": "bhv_lll_rotating_hex_flame_loop", + "802bc348": "fire_bar_spawn_flames", + "802bc4f4": "fire_bar_act_0", + "802bc538": "fire_bar_act_1", + "802bc590": "fire_bar_act_2", + "802bc5fc": "fire_bar_act_3", + "802bc618": "bhv_lll_rotating_block_fire_bars_loop", + "802bc660": "bhv_lll_wood_piece_loop", + "802bc728": "bhv_lll_floating_wood_bridge_loop", + "802bc898": "bhv_volcano_flames_loop", + "802bc934": "hexagonal_ring_spawn_flames", + "802bca74": "bhv_lll_rotating_hexagonal_ring_loop", + "802bcce8": "sinking_rectangular_plat_actions", + "802bcda8": "bhv_lll_sinking_rectangular_platform_loop", + "802bce58": "bhv_lll_sinking_square_platforms_loop", + "802bce9c": "create_transform_from_normals", + "802bcf40": "bhv_platform_normals_init", + "802bcfc4": "approach_by_increment", + "802bd058": "bhv_tilting_inverted_pyramid_loop", + "802bd3e4": "koopa_shell_spawn_water_drop", + "802bd488": "bhv_koopa_shell_flame_loop", + "802bd5dc": "bhv_koopa_shell_flame_spawn", + "802bd62c": "koopa_shell_spawn_sparkles", + "802bd680": "bhv_koopa_shell_loop", + "802bd8d0": "tox_box_shake_screen", + "802bd91c": "tox_box_move", + "802bdb04": "tox_box_act_4", + "802bdb3c": "tox_box_act_5", + "802bdb74": "tox_box_act_6", + "802bdbac": "tox_box_act_7", + "802bdbe4": "tox_box_act_1", + "802bdc7c": "tox_box_act_2", + "802bdcc8": "tox_box_act_3", + "802bdd14": "tox_box_act_0", + "802bdd68": "bhv_tox_box_loop", + "802bdd9c": "piranha_plant_act_idle", + "802bde10": "piranha_plant_check_interactions", + "802bdeec": "piranha_plant_act_sleeping", + "802be034": "piranha_plant_act_woken_up", + "802be0b8": "piranha_plant_reset_when_far", + "802be0ec": "piranha_plant_attacked", + "802be150": "piranha_plant_act_shrink_and_die", + "802be234": "piranha_plant_act_wait_to_respawn", + "802be278": "piranha_plant_act_respawn", + "802be350": "piranha_plant_act_biting", + "802be49c": "mario_moving_fast_enough_to_make_piranha_plant_bite", + "802be50c": "piranha_plant_act_stopped_biting", + "802be5a0": "bhv_piranha_plant_loop", + "802be628": "bhv_lll_bowser_puzzle_spawn_piece", + "802be6d4": "bhv_lll_bowser_puzzle_spawn_pieces", + "802be79c": "bhv_lll_bowser_puzzle_loop", + "802be8a8": "bhv_lll_bowser_puzzle_piece_action_0", + "802be8b8": "bhv_lll_bowser_puzzle_piece_action_1", + "802be8f4": "bhv_lll_bowser_puzzle_piece_update", + "802be9dc": "bhv_lll_bowser_puzzle_piece_move", + "802beb14": "bhv_lll_bowser_puzzle_piece_idle", + "802beb54": "bhv_lll_bowser_puzzle_piece_move_left", + "802beb8c": "bhv_lll_bowser_puzzle_piece_move_right", + "802bebc4": "bhv_lll_bowser_puzzle_piece_move_up", + "802bebfc": "bhv_lll_bowser_puzzle_piece_move_down", + "802bec34": "bhv_lll_bowser_puzzle_piece_loop", + "802becb0": "set_obj_anim_with_accel_and_sound", + "802bed7c": "play_penguin_walking_sound", + "802bedec": "tuxies_mother_act_2", + "802bef8c": "tuxies_mother_act_1", + "802bf1d8": "tuxies_mother_act_0", + "802bf3c0": "bhv_tuxies_mother_loop", + "802bf424": "small_penguin_dive_with_mario", + "802bf474": "small_penguin_act_2", + "802bf57c": "small_penguin_act_1", + "802bf648": "small_penguin_act_3", + "802bf6e4": "small_penguin_act_4", + "802bf760": "small_penguin_act_0", + "802bf90c": "small_penguin_act_5", + "802bfa14": "small_penguin_free_actions", + "802bfa88": "bhv_small_penguin_loop", + "802bfbac": "geo_switch_tuxie_mother_eyes", + "802bfcd8": "fish_act_spawn", + "802bfeb8": "fish_act_respawn", + "802bff20": "fish_act_init", + "802bff3c": "bhv_large_fish_group_loop", + "802bff68": "fish_regroup", + "802c00b4": "fish_group_act_rotation", + "802c0348": "fish_group_act_move", + "802c06a8": "fish_group_act_animate", + "802c0768": "bhv_fish_loop", + "802c08a8": "bhv_wdw_express_elevator_loop", + "802c0aac": "bub_spawner_act_0", + "802c0b50": "bub_spawner_act_1", + "802c0ba4": "bub_spawner_act_2", + "802c0bc4": "bub_spawner_act_3", + "802c0be0": "bhv_bub_spawner_loop", + "802c0c0c": "bub_move_vertically", + "802c0cd4": "bub_act_0", + "802c0d44": "bub_act_1", + "802c0f90": "bub_act_2", + "802c1204": "bhv_bub_loop", + "802c12c0": "bhv_rotating_exclamation_box_loop", + "802c1308": "exclamation_box_act_0", + "802c13ec": "exclamation_box_act_1", + "802c14b0": "exclamation_box_act_2", + "802c15b8": "exclamation_box_act_3", + "802c17bc": "exclamation_box_spawn_contents", + "802c18d0": "exclamation_box_act_4", + "802c1988": "exclamation_box_act_5", + "802c19c0": "bhv_exclamation_box_loop", + "802c19fc": "bhv_sound_spawner_init", + "802c1a40": "bhv_bowsers_sub_loop", + "802c1a80": "bhv_sushi_shark_collision_loop", + "802c1a90": "bhv_sushi_shark_loop", + "802c1c44": "bhv_sunken_ship_part_loop", + "802c1cd4": "bhv_ship_part_3_loop", + "802c1e10": "bhv_jrb_sliding_box_loop", + "802c2190": "bhv_white_puff_1_loop", + "802c2274": "bhv_white_puff_2_loop", + "802c22b8": "bhv_hidden_blue_coin_loop", + "802c242c": "bhv_blue_coin_switch_loop", + "802c263c": "bhv_openable_cage_door_loop", + "802c26f8": "bhv_openable_grill_loop", + "802c2930": "bhv_init_changing_water_level_loop", + "802c2a24": "bhv_water_level_diamond_loop", + "802c2ce8": "tweester_scale_and_move", + "802c2ebc": "tweester_act_idle", + "802c2fbc": "tweester_act_chase", + "802c31c4": "tweester_act_hide", + "802c329c": "bhv_tweester_loop", + "802c32e8": "bhv_tweester_sand_particle_loop", + "802c3440": "bhv_boo_init", + "802c3684": "bhv_courtyard_boo_triplet_init", + "802c4824": "bhv_boo_loop", + "802c4f30": "bhv_big_boo_loop", + "802c515c": "bhv_boo_with_cage_init", + "802c51d4": "bhv_boo_with_cage_loop", + "802c5224": "bhv_merry_go_round_boo_manager_loop", + "802c53cc": "obj_set_secondary_camera_focus", + "802c53ec": "bhv_animated_texture_loop", + "802c5414": "bhv_boo_in_castle_loop", + "802c5688": "bhv_boo_boss_spawned_bridge_loop", + "802c5890": "bhv_bbh_tilting_trap_platform_loop", + "802c5a38": "bhv_haunted_bookshelf_loop", + "802c5ca8": "bhv_merry_go_round_loop", + "802c5dc0": "bhv_static_checkered_platform_loop", + "802c5f48": "bhv_beta_bowser_anchor_loop", + "802c5fdc": "bhv_play_music_track_when_touched_loop", + "802c6050": "bhv_floor_trap_in_castle_loop", + "802c60ac": "bhv_castle_floor_trap_init", + "802c6150": "bhv_castle_floor_trap_open_detect", + "802c61d4": "bhv_castle_floor_trap_open", + "802c6278": "bhv_castle_floor_trap_close_detect", + "802c62bc": "bhv_castle_floor_trap_close", + "802c6328": "bhv_castle_floor_trap_rotate", + "802c6348": "bhv_castle_floor_trap_loop", + "802c63e8": "bhv_pole_base_loop", + "802c64a4": "bhv_sparkle_spawn_loop", + "802c6538": "update_angle_from_move_flags", + "802c65c0": "bhv_scuttlebug_loop", + "802c6b6c": "bhv_scuttlebug_spawn_loop", + "802c6ca0": "whomp_play_sfx_from_pound_animation", + "802c6d6c": "whomp_act_0", + "802c6ec8": "whomp_act_7", + "802c6fb0": "whomp_act_1", + "802c710c": "whomp_act_2", + "802c7254": "whomp_act_3", + "802c72b4": "whomp_act_4", + "802c7380": "whomp_act_5", + "802c7428": "king_whomp_on_ground", + "802c75fc": "whomp_on_ground", + "802c76d4": "whomp_act_6", + "802c7858": "whomp_act_8", + "802c7998": "whomp_act_9", + "802c79d8": "bhv_whomp_loop", + "802c7a70": "bhv_water_splash_spawn_droplets", + "802c7b14": "bhv_water_droplet_loop", + "802c7cac": "bhv_idle_water_wave_loop", + "802c7d40": "bhv_water_droplet_splash_init", + "802c7d90": "bhv_bubble_splash_init", + "802c7dfc": "bhv_shallow_water_splash_init", + "802c7e5c": "bhv_wave_trail_shrink", + "802c7f98": "bhv_strong_wind_particle_loop", + "802c81b4": "cur_obj_spawn_strong_wind_particles", + "802c834c": "bhv_sl_snowman_wind_loop", + "802c863c": "bhv_sl_walking_penguin_loop", + "802c89f0": "update_mario_platform", + "802c8b4c": "get_mario_pos", + "802c8b8c": "set_mario_pos", + "802c8bc8": "apply_platform_displacement", + "802c8ec0": "apply_mario_platform_displacement", + "802c8f28": "clear_mario_platform", + "802c8f40": "debug_print_obj_collision", + "802c8fe4": "detect_object_hitbox_overlap", + "802c91ec": "detect_object_hurtbox_overlap", + "802c9388": "clear_object_collision", + "802c93f8": "check_collision_in_list", + "802c94ac": "check_player_object_collision", + "802c95b4": "check_pushable_object_collision", + "802c9630": "check_destructive_object_collision", + "802c9724": "detect_object_collisions", + "802c97d0": "unused_init_free_list", + "802c9840": "unused_try_allocate", + "802c98a4": "try_allocate_object", + "802c9950": "unused_deallocate", + "802c99b8": "init_free_object_list", + "802c9a3c": "clear_object_lists", + "802c9b68": "unload_object", + "802c9c00": "allocate_object", + "802c9f04": "create_object", + "802ca028": "mark_obj_for_deletion", + "802ca040": "exec_anim_sound_state", + "802ca144": "create_sound_spawner", + "802ca190": "cur_obj_play_sound_1", + "802ca1e0": "cur_obj_play_sound_2", + "802ca230": "calc_dist_to_volume_range_1", + "802ca2d4": "calc_dist_to_volume_range_2", + "802ca370": "stub_debug_1", + "802ca380": "stub_debug_2", + "802ca390": "stub_debug_3", + "802ca3a0": "stub_debug_4", + "802ca3b0": "get_current_clock", + "802ca3e0": "get_clock_difference", + "802ca418": "set_print_state_info", + "802ca460": "print_text_array_info", + "802ca51c": "set_text_array_x_y", + "802ca568": "print_debug_bottom_up", + "802ca5b8": "print_debug_top_down_objectinfo", + "802ca618": "print_debug_top_down_mapinfo", + "802ca680": "print_debug_top_down_normal", + "802ca6d0": "print_mapinfo", + "802ca8e8": "print_checkinfo", + "802ca918": "print_surfaceinfo", + "802ca94c": "print_stageinfo", + "802ca990": "print_string_array_info", + "802caa6c": "print_effectinfo", + "802caaa8": "print_enemyinfo", + "802caae4": "update_debug_dpadmask", + "802cabac": "debug_unknown_level_select_check", + "802cac20": "reset_debug_objectinfo", + "802cb0b0": "stub_debug_5", + "802cb0c0": "try_print_debug_mario_object_info", + "802cb1c0": "try_print_debug_mario_level_info", + "802cb264": "try_do_mario_debug_object_spawn", + "802cb564": "debug_enemy_unknown", + "802cb5c0": "set_and_reset_transition_fade_timer", + "802cb640": "set_transition_color_fade_alpha", + "802cb894": "vertex_transition_color", + "802cba18": "dl_transition_color", + "802cbbc4": "render_fade_transition_from_color", + "802cbc20": "render_fade_transition_into_color", + "802cbc7c": "calc_tex_transition_radius", + "802cbd54": "calc_tex_transition_time", + "802cbe64": "convert_tex_transition_angle_to_pos", + "802cbee0": "center_tex_transition_x", + "802cbf64": "center_tex_transition_y", + "802cbfe8": "make_tex_transition_vertex", + "802cc180": "load_tex_transition_vertex", + "802cc4d8": "render_textured_transition", + "802ccbe8": "render_screen_transition", + "802ccdc8": "render_cannon_circle_base", + "802cd1e8": "geo_cannon_circle_base", + "802cd280": "rotate_rectangle", + "802cd328": "atan2_deg", + "802cd388": "scale_shadow_with_distance", + "802cd444": "disable_shadow_with_distance", + "802cd48c": "dim_shadow_with_distance", + "802cd614": "get_water_level_below_shadow", + "802cd6c4": "init_shadow", + "802cd938": "get_texture_coords_9_vertices", + "802cd988": "get_texture_coords_4_vertices", + "802cd9ec": "make_shadow_vertex_at_xyz", + "802cdb20": "extrapolate_vertex_y_position", + "802cdb74": "get_vertex_coords", + "802cdc40": "calculate_vertex_xyz", + "802cde94": "floor_local_tilt", + "802cdf3c": "make_shadow_vertex", + "802ce128": "add_shadow_to_display_list", + "802ce2bc": "linearly_interpolate_solidity_positive", + "802ce3ec": "linearly_interpolate_solidity_negative", + "802ce524": "correct_shadow_solidity_for_animations", + "802ce690": "correct_lava_shadow_height", + "802ce79c": "create_shadow_player", + "802ce9d0": "create_shadow_circle_9_verts", + "802ceae8": "create_shadow_circle_4_verts", + "802cec04": "create_shadow_circle_assuming_flat_ground", + "802cedc0": "create_shadow_rectangle", + "802cef6c": "get_shadow_height_solidity", + "802cf080": "create_shadow_square", + "802cf1f0": "create_shadow_hardcoded_rectangle", + "802cf34c": "create_shadow_below_xyz", + "802cf5b0": "calculate_skybox_scaled_x", + "802cf69c": "calculate_skybox_scaled_y", + "802cf804": "make_skybox_rect", + "802cfa2c": "draw_skybox_tile_grid", + "802cfc68": "create_skybox_ortho_matrix", + "802cfd88": "init_skybox_display_list", + "802cfef4": "create_skybox_facing_camera", + "802d0080": "geo_wdw_set_initial_water_level", + "802d01e0": "geo_movtex_pause_control", + "802d0254": "movtex_make_quad_vertex", + "802d0484": "movtex_gen_from_quad", + "802d0a84": "movtex_gen_from_quad_array", + "802d0bb0": "movtex_gen_quads_id", + "802d0c84": "get_quad_collection_from_id", + "802d0f28": "movtex_change_texture_format", + "802d104c": "geo_movtex_draw_water_regions", + "802d1330": "update_moving_texture_offset", + "802d13cc": "movtex_write_vertex_first", + "802d1574": "movtex_write_vertex_index", + "802d18b4": "movtex_gen_list", + "802d1b70": "geo_movtex_draw_nocolor", + "802d1cdc": "geo_movtex_draw_colored", + "802d1e48": "geo_movtex_draw_colored_no_update", + "802d1fa8": "geo_movtex_draw_colored_2_no_update", + "802d2108": "geo_movtex_update_horizontal", + "802d2210": "make_vertex", + "802d22c4": "round_float", + "802d2360": "geo_exec_inside_castle_light", + "802d2470": "geo_exec_flying_carpet_timer_update", + "802d2520": "geo_exec_flying_carpet_create", + "802d28cc": "geo_exec_cake_end_screen", + "802d29c0": "stop_other_paintings", + "802d2a74": "painting_mario_y", + "802d2b08": "painting_mario_z", + "802d2b84": "painting_ripple_y", + "802d2c40": "painting_nearest_4th", + "802d2d80": "painting_mario_x", + "802d2dfc": "painting_ripple_x", + "802d2eb8": "painting_state", + "802d2ffc": "wall_painting_proximity_idle", + "802d319c": "wall_painting_proximity_rippling", + "802d327c": "wall_painting_continuous_idle", + "802d341c": "wall_painting_continuous_rippling", + "802d34fc": "floor_painting_proximity_idle", + "802d36ac": "floor_painting_proximity_rippling", + "802d379c": "floor_painting_continuous_idle", + "802d393c": "floor_painting_continuous_rippling", + "802d3a2c": "painting_update_floors", + "802d3bec": "painting_update_ripple_state", + "802d3cec": "calculate_ripple_at_point", + "802d3e6c": "ripple_if_movable", + "802d3ee4": "painting_generate_mesh", + "802d404c": "painting_calculate_triangle_normals", + "802d43f8": "normalize_component", + "802d44bc": "painting_average_vertex_normals", + "802d47d0": "render_painting", + "802d4edc": "painting_model_view_transform", + "802d50dc": "painting_ripple_image", + "802d5354": "painting_ripple_env_mapped", + "802d556c": "display_painting_rippling", + "802d568c": "display_painting_not_rippling", + "802d5778": "reset_painting", + "802d57a8": "move_ddd_painting", + "802d58e4": "set_painting_layer", + "802d593c": "display_painting", + "802d59a8": "wall_painting_update", + "802d5aa0": "floor_painting_update", + "802d5b98": "geo_painting_draw", + "802d5d0c": "geo_painting_update", + "802d5e00": "int_pow", + "802d5e54": "format_integer", + "802d6144": "parse_width_field", + "802d62d8": "print_text_fmt_int", + "802d6554": "print_text", + "802d66c0": "print_text_centered", + "802d6858": "char_to_glyph_index", + "802d69f8": "add_glyph_texture", + "802d6acc": "clip_to_bounds", + "802d6b3c": "render_textrect", + "802d6c88": "render_text_labels", + "802d6f20": "create_dl_identity_matrix", + "802d7070": "create_dl_translation_matrix", + "802d7174": "create_dl_rotation_matrix", + "802d7280": "create_dl_scale_matrix", + "802d7384": "create_dl_ortho_matrix", + "802d75dc": "render_generic_char", + "802d76c8": "render_multi_text_string", + "802d77dc": "print_generic_string", + "802d7b84": "print_hud_lut_string", + "802d7e88": "print_menu_generic_string", + "802d82d4": "print_credits_string", + "802d862c": "handle_menu_scrolling", + "802d8844": "get_str_x_pos_from_center", + "802d8934": "get_string_width", + "802d89b8": "print_hud_my_score_coins", + "802d8a80": "print_hud_my_score_stars", + "802d8b34": "int_to_str", + "802d8c6c": "get_dialog_id", + "802d8c88": "create_dialog_box", + "802d8cc4": "create_dialog_box_with_var", + "802d8d08": "create_dialog_inverted_box", + "802d8d48": "create_dialog_box_with_response", + "802d8d90": "reset_dialog_render_state", + "802d8e2c": "render_dialog_box_type", + "802d9148": "change_and_flash_dialog_text_color_lines", + "802d9388": "handle_dialog_scroll_page_state", + "802d944c": "render_star_count_dialog_text", + "802d9634": "render_multi_text_string_lines", + "802d9800": "ensure_nonnegative", + "802d982c": "handle_dialog_text_and_pages", + "802d9cb0": "render_dialog_triangle_choice", + "802d9dfc": "render_dialog_string_color", + "802d9f84": "handle_special_dialog_text", + "802da1ac": "render_dialog_entries", + "802da810": "set_menu_mode", + "802da844": "reset_cutscene_msg_fade", + "802da85c": "dl_rgba16_begin_cutscene_msg_fade", + "802da8e4": "dl_rgba16_stop_cutscene_msg_fade", + "802da964": "ascii_to_credits_char", + "802daa34": "print_credits_str_ascii", + "802daae4": "set_cutscene_message", + "802dab58": "do_cutscene_handler", + "802dad54": "print_peach_letter_message", + "802db08c": "render_hud_cannon_reticle", + "802db350": "reset_red_coins_collected", + "802db368": "change_dialog_camera_angle", + "802db3b8": "shade_screen", + "802db498": "print_animated_red_coin", + "802db6e8": "render_pause_red_coins", + "802db760": "render_pause_my_score_coins", + "802dbb24": "render_pause_camera_options", + "802dbe68": "render_pause_course_options", + "802dc15c": "render_pause_castle_menu_box", + "802dc418": "highlight_last_course_complete_stars", + "802dc478": "print_hud_pause_colorful_str", + "802dc570": "render_pause_castle_course_stars", + "802dc718": "render_pause_castle_main_strings", + "802dca88": "render_pause_courses_and_castle", + "802dcd04": "print_hud_course_complete_string", + "802dcf30": "print_hud_course_complete_coins", + "802dd194": "play_star_fanfare_and_flash_hud", + "802dd210": "render_course_complete_lvl_info_and_hud_str", + "802dd838": "render_save_confirmation", + "802ddae0": "render_course_complete_screen", + "802ddca4": "render_menus_and_dialogs", + "802dddf0": "envfx_init_snow", + "802ddf38": "envfx_update_snowflake_count", + "802de0bc": "envfx_cleanup_snow", + "802de114": "orbit_from_positions", + "802de23c": "pos_from_orbit", + "802de360": "envfx_is_snowflake_alive", + "802de458": "envfx_update_snow_normal", + "802de888": "envfx_update_snow_blizzard", + "802ded38": "envfx_update_snow_water", + "802def2c": "rotate_triangle_vertices", + "802df334": "append_snowflake_vertex_buffer", + "802df748": "envfx_update_snow", + "802dfbc8": "envfx_update_particles", + "802dfd50": "particle_is_laterally_close", + "802dfe00": "random_flower_offset", + "802dfe80": "envfx_update_flower", + "802e0120": "envfx_set_lava_bubble_position", + "802e048c": "envfx_update_lava", + "802e065c": "envfx_rotate_around_whirlpool", + "802e08a8": "envfx_is_whirlpool_bubble_alive", + "802e0934": "envfx_update_whirlpool", + "802e0e24": "envfx_is_jestream_bubble_alive", + "802e0eb8": "envfx_update_jetstream", + "802e1238": "envfx_init_bubble", + "802e1414": "envfx_bubbles_update_switch", + "802e1618": "append_bubble_vertex_buffer", + "802e1a20": "envfx_set_bubble_texture", + "802e1bb8": "envfx_update_bubble_particles", + "802e1ed8": "envfx_set_max_bubble_particles", + "802e1f48": "envfx_update_bubbles", + "802e20a0": "convert_rotation", + "802e2134": "spawn_macro_abs_yrot_2params", + "802e21dc": "spawn_macro_abs_yrot_param1", + "802e2284": "spawn_macro_abs_special", + "802e2414": "spawn_macro_objects", + "802e2690": "spawn_macro_objects_hardcoded", + "802e28ec": "spawn_special_objects", + "802e2cf0": "render_hud_tex_lut", + "802e2e58": "render_hud_small_tex_lut", + "802e30b4": "render_power_meter_health_segment", + "802e3214": "render_dl_power_meter", + "802e33b8": "animate_power_meter_emphasized", + "802e352c": "handle_power_meter_actions", + "802e3654": "render_hud_power_meter", + "802e3744": "render_hud_mario_lives", + "802e37a8": "render_hud_coins", + "802e380c": "render_hud_stars", + "802e38e4": "render_hud_keys", + "802e395c": "render_hud_timer", + "802e3b1c": "set_hud_camera_status", + "802e3b3c": "render_hud_camera_status", + "802e3d2c": "render_hud", + "802e3e50": "set_yoshi_as_not_dead", + "802e3e68": "geo_obj_transparency_something", + "802e3f68": "absf_2", + "802e3fac": "turn_obj_away_from_surface", + "802e405c": "obj_find_wall", + "802e41a4": "turn_obj_away_from_steep_floor", + "802e42e0": "obj_orient_graph", + "802e43e4": "calc_obj_friction", + "802e445c": "calc_new_obj_vel_and_pos_y", + "802e4814": "calc_new_obj_vel_and_pos_y_underwater", + "802e4cec": "obj_update_pos_vel_xz", + "802e4d88": "obj_splash", + "802e4e90": "object_step", + "802e5114": "object_step_without_floor_orient", + "802e5160": "obj_move_xyz_using_fvel_and_yaw", + "802e5208": "is_point_within_radius_of_mario", + "802e52b8": "is_point_close_to_object", + "802e5360": "set_object_visibility", + "802e53f4": "obj_return_home_if_safe", + "802e54b0": "obj_return_and_displace_home", + "802e55d0": "obj_check_if_facing_toward_angle", + "802e569c": "obj_find_wall_displacement", + "802e5760": "obj_spawn_yellow_coins", + "802e5824": "obj_flicker_and_disappear", + "802e58b4": "current_mario_room_check", + "802e5948": "trigger_obj_dialog_when_facing", + "802e5a80": "obj_check_floor_death", + "802e5b18": "obj_lava_death", + "802e5c6c": "spawn_orange_number", + "802e5d04": "debug_sequence_tracker", + "802e5de8": "coin_step", + "802e5e6c": "moving_coin_flicker", + "802e5ea4": "coin_collected", + "802e5ee8": "bhv_moving_yellow_coin_init", + "802e5f64": "bhv_moving_yellow_coin_loop", + "802e6098": "bhv_moving_blue_coin_init", + "802e6114": "bhv_moving_blue_coin_loop", + "802e62a4": "bhv_blue_coin_sliding_jumping_init", + "802e631c": "blue_coin_sliding_away_from_mario", + "802e63ec": "blue_coin_sliding_slow_down", + "802e6474": "bhv_blue_coin_sliding_loop", + "802e6628": "bhv_blue_coin_jumping_loop", + "802e6790": "bhv_seaweed_init", + "802e67dc": "bhv_seaweed_bundle_init", + "802e6a2c": "bhv_bobomb_init", + "802e6a8c": "bobomb_spawn_coin", + "802e6af8": "bobomb_act_explode", + "802e6bd4": "bobomb_check_interactions", + "802e6cf0": "bobomb_act_patrol", + "802e6dc8": "bobomb_act_chase_mario", + "802e6e84": "bobomb_act_launched", + "802e6ed8": "generic_bobomb_free_loop", + "802e7020": "stationary_bobomb_free_loop", + "802e7134": "bobomb_free_loop", + "802e7180": "bobomb_held_loop", + "802e7220": "bobomb_dropped_loop", + "802e7280": "bobomb_thrown_loop", + "802e7324": "curr_obj_random_blink", + "802e742c": "bhv_bobomb_loop", + "802e75a0": "bhv_bobomb_fuse_smoke_init", + "802e76ac": "bhv_bobomb_buddy_init", + "802e770c": "bobomb_buddy_act_idle", + "802e7814": "bobomb_buddy_cannon_dialog", + "802e79dc": "bobomb_buddy_act_talk", + "802e7b00": "bobomb_buddy_act_turn_to_talk", + "802e7bb0": "bobomb_buddy_actions", + "802e7c4c": "bhv_bobomb_buddy_loop", + "802e7c90": "bhv_cannon_closed_init", + "802e7d4c": "cannon_door_act_opening", + "802e7e54": "bhv_cannon_closed_loop", + "802e7f70": "bhv_whirlpool_init", + "802e7fb8": "whirlpool_set_hitbox", + "802e7fec": "whirpool_orient_graph", + "802e80dc": "bhv_whirlpool_loop", + "802e82b0": "bhv_jet_stream_loop", + "802e8388": "bhv_homing_amp_init", + "802e89d4": "bhv_homing_amp_loop", + "802e8ae4": "bhv_circling_amp_init", + "802e8ecc": "bhv_circling_amp_loop", + "802e8f68": "bhv_butterfly_init", + "802e9018": "butterfly_step", + "802e9278": "butterfly_calculate_angle", + "802e9470": "butterfly_act_rest", + "802e94e4": "butterfly_act_follow_mario", + "802e9548": "butterfly_act_return_home", + "802e96c8": "bhv_butterfly_loop", + "802e9764": "bhv_hoot_init", + "802e97fc": "hoot_find_next_floor", + "802e98c0": "hoot_floor_bounce", + "802e9a4c": "hoot_free_step", + "802e9cf4": "hoot_player_set_yaw", + "802e9d98": "hoot_carry_step", + "802e9f60": "hoot_surface_collision", + "802ea144": "hoot_act_ascent", + "802ea258": "hoot_action_loop", + "802ea3f0": "hoot_turn_to_home", + "802ea4ec": "hoot_awake_loop", + "802ea588": "bhv_hoot_loop", + "802ea6a8": "bhv_beta_holdable_object_init", + "802ea7e0": "bhv_beta_holdable_object_loop", + "802ea888": "bhv_object_bubble_init", + "802ea934": "bhv_object_bubble_loop", + "802eaa10": "bhv_object_water_wave_init", + "802eaa50": "bhv_object_water_wave_loop", + "802eaa8c": "bhv_explosion_init", + "802eaad0": "bhv_explosion_loop", + "802eabf0": "bhv_bobomb_bully_death_smoke_init", + "802eac3c": "bhv_bobomb_explosion_bubble_init", + "802ead3c": "bhv_bobomb_explosion_bubble_loop", + "802eaef8": "bhv_respawner_loop", + "802eaf84": "create_respawner", + "802eb05c": "bhv_small_bully_init", + "802eb104": "bhv_big_bully_init", + "802eb1c0": "bully_check_mario_collision", + "802eb288": "bully_act_chase_mario", + "802eb3f0": "bully_act_knockback", + "802eb510": "bully_act_back_up", + "802eb5c4": "bully_backup_check", + "802eb630": "bully_play_stomping_sound", + "802eb744": "bully_step", + "802eb7e0": "bully_spawn_coin", + "802eb8b0": "bully_act_level_death", + "802eb9d0": "bhv_bully_loop", + "802ebb74": "big_bully_spawn_minion", + "802ebc00": "bhv_big_bully_with_minions_init", + "802ebc88": "big_bully_spawn_star", + "802ebce0": "bhv_big_bully_with_minions_loop", + "802ebf70": "water_ring_calc_mario_dist", + "802ec030": "water_ring_init", + "802ec1b0": "bhv_jet_stream_water_ring_init", + "802ec200": "water_ring_check_collection", + "802ec3d0": "water_ring_set_scale", + "802ec4e0": "water_ring_act_collected", + "802ec59c": "water_ring_act_not_collected", + "802ec75c": "bhv_jet_stream_water_ring_loop", + "802ec7cc": "spawn_manta_ray_ring_manager", + "802ec818": "water_ring_spawner_act_inactive", + "802ec908": "bhv_jet_stream_ring_spawner_loop", + "802ec9b8": "bhv_manta_ray_water_ring_init", + "802ec9f0": "manta_water_ring_act_not_collected", + "802ecba4": "bhv_manta_ray_water_ring_loop", + "802ecc14": "bhv_bowser_bomb_loop", + "802ecd0c": "bhv_bowser_bomb_explosion_loop", + "802ecea0": "bhv_bowser_bomb_smoke_loop", + "802ecfac": "bhv_celebration_star_init", + "802ed10c": "celeb_star_act_spin_around_mario", + "802ed28c": "celeb_star_act_face_camera", + "802ed39c": "bhv_celebration_star_loop", + "802ed40c": "bhv_celebration_star_sparkle_loop", + "802ed45c": "bhv_star_key_collection_puff_spawner_loop", + "802ed498": "bhv_lll_drawbridge_spawner_loop", + "802ed62c": "bhv_lll_drawbridge_loop", + "802ed78c": "bhv_small_bomp_init", + "802ed7fc": "bhv_small_bomp_loop", + "802edacc": "bhv_large_bomp_init", + "802edb2c": "bhv_large_bomp_loop", + "802eddfc": "bhv_wf_sliding_platform_init", + "802edf28": "bhv_wf_sliding_platform_loop", + "802ee124": "bhv_moneybag_init", + "802ee1a0": "moneybag_check_mario_collision", + "802ee268": "moneybag_jump", + "802ee46c": "moneybag_act_move_around", + "802ee598": "moneybag_act_return_home", + "802ee728": "moneybag_act_disappear", + "802ee778": "moneybag_act_death", + "802ee7e0": "bhv_moneybag_loop", + "802ee8f4": "bhv_moneybag_hidden_loop", + "802ee9cc": "bhv_bowling_ball_init", + "802eea24": "bowling_ball_set_hitbox", + "802eea7c": "bowling_ball_set_waypoints", + "802eeb64": "bhv_bowling_ball_roll_loop", + "802eecb8": "bhv_bowling_ball_initializeLoop", + "802eedf0": "bhv_bowling_ball_loop", + "802eeeb4": "bhv_generic_bowling_ball_spawner_init", + "802eef9c": "bhv_generic_bowling_ball_spawner_loop", + "802ef0e8": "bhv_thi_bowling_ball_spawner_loop", + "802ef21c": "bhv_bob_pit_bowling_ball_init", + "802ef274": "bhv_bob_pit_bowling_ball_loop", + "802ef34c": "bhv_free_bowling_ball_init", + "802ef3f4": "bhv_free_bowling_ball_roll_loop", + "802ef524": "bhv_free_bowling_ball_loop", + "802ef63c": "bhv_rr_cruiser_wing_init", + "802ef66c": "bhv_rr_cruiser_wing_loop", + "802ef820": "bhv_spindel_init", + "802ef858": "bhv_spindel_loop", + "802efcd0": "bhv_ssl_moving_pyramid_wall_init", + "802efd8c": "bhv_ssl_moving_pyramid_wall_loop", + "802efe64": "bhv_pyramid_elevator_init", + "802efef4": "bhv_pyramid_elevator_loop", + "802f0104": "bhv_pyramid_elevator_trajectory_marker_ball_loop", + "802f0168": "bhv_pyramid_top_init", + "802f0288": "bhv_pyramid_top_spinning", + "802f04a0": "bhv_pyramid_top_explode", + "802f05b4": "bhv_pyramid_top_loop", + "802f06a8": "bhv_pyramid_top_fragment_init", + "802f0714": "bhv_pyramid_top_fragment_loop", + "802f0788": "bhv_pyramid_pillar_touch_detector_loop", + "802f07f4": "bhv_waterfall_sound_loop", + "802f0820": "bhv_volcano_sound_loop", + "802f084c": "bhv_castle_flag_init", + "802f0898": "bhv_birds_sound_loop", + "802f0950": "bhv_ambient_sounds_init", + "802f09a4": "bhv_sand_sound_loop", + "802f09f0": "bhv_castle_cannon_grate_init", + "802f0a40": "bhv_snowmans_bottom_init", + "802f0b7c": "set_rolling_sphere_hitbox", + "802f0bd4": "adjust_rolling_face_pitch", + "802f0c94": "snowmans_bottom_act_1", + "802f0df0": "snowmans_bottom_act_2", + "802f0fa8": "snowmans_bottom_act_3", + "802f105c": "bhv_snowmans_bottom_loop", + "802f120c": "bhv_snowmans_head_init", + "802f1370": "bhv_snowmans_head_loop", + "802f151c": "bhv_snowmans_body_checkpoint_loop", + "802f15a8": "bhv_big_boulder_init", + "802f162c": "boulder_act_1", + "802f1714": "bhv_big_boulder_loop", + "802f17f0": "bhv_big_boulder_generator_loop", + "802f1954": "cap_set_hitbox", + "802f19c8": "cap_despawn", + "802f1a10": "cap_check_quicksand", + "802f1bb8": "cap_sink_quicksand", + "802f1d64": "bhv_wing_cap_init", + "802f1dc0": "cap_scale_vertically", + "802f1e5c": "wing_vanish_cap_act_0", + "802f1f3c": "bhv_wing_vanish_cap_loop", + "802f1fd0": "bhv_metal_cap_init", + "802f2030": "metal_cap_act_0", + "802f20ac": "bhv_metal_cap_loop", + "802f2140": "bhv_normal_cap_init", + "802f21e0": "normal_cap_set_save_flags", + "802f2284": "normal_cap_act_0", + "802f23a8": "bhv_normal_cap_loop", + "802f2498": "bhv_vanish_cap_init", + "802f24f4": "bhv_collect_star_init", + "802f25b0": "bhv_collect_star_loop", + "802f2614": "bhv_star_spawn_init", + "802f2768": "bhv_star_spawn_loop", + "802f2aa0": "spawn_star", + "802f2b88": "spawn_default_star", + "802f2bd4": "spawn_red_coin_cutscene_star", + "802f2c24": "spawn_no_exit_star", + "802f2c84": "bhv_hidden_red_coin_star_init", + "802f2d8c": "bhv_hidden_red_coin_star_loop", + "802f2e6c": "bhv_red_coin_init", + "802f2f2c": "bhv_red_coin_loop", + "802f3014": "bhv_hidden_star_init", + "802f30f0": "bhv_hidden_star_loop", + "802f31bc": "bhv_hidden_star_trigger_loop", + "802f328c": "bhv_bowser_course_red_coin_star_loop", + "802f336c": "bhv_ttm_rolling_log_init", + "802f341c": "rolling_log_roll_log", + "802f36a4": "bhv_rolling_log_loop", + "802f38b0": "volcano_act_1", + "802f39b4": "volcano_act_3", + "802f3a30": "bhv_volcano_trap_loop", + "802f3b98": "bhv_lll_rolling_log_init", + "802f3c54": "bhv_1up_interact", + "802f3cc8": "bhv_1up_common_init", + "802f3d30": "bhv_1up_init", + "802f3dd0": "one_up_loop_in_air", + "802f3ea8": "pole_1up_move_towards_mario", + "802f401c": "one_up_move_away_from_mario", + "802f40cc": "bhv_1up_walking_loop", + "802f4248": "bhv_1up_running_away_loop", + "802f43b8": "sliding_1up_move", + "802f44c0": "bhv_1up_sliding_loop", + "802f45b8": "bhv_1up_loop", + "802f45f0": "bhv_1up_jump_on_approach_loop", + "802f4710": "bhv_1up_hidden_loop", + "802f48f4": "bhv_1up_hidden_trigger_loop", + "802f496c": "bhv_1up_hidden_in_pole_loop", + "802f4b00": "bhv_1up_hidden_in_pole_trigger_loop", + "802f4b78": "bhv_1up_hidden_in_pole_spawner_loop", + "802f4c68": "controllable_platform_act_1", + "802f4ce0": "controllable_platform_act_2", + "802f4d78": "bhv_controllable_platform_sub_loop", + "802f4eb4": "bhv_controllable_platform_init", + "802f5010": "controllable_platform_hit_wall", + "802f5068": "controllable_platform_check_walls", + "802f52c0": "controllable_platform_shake_on_wall_hit", + "802f547c": "controllable_platform_tilt_from_mario", + "802f55a4": "bhv_controllable_platform_loop", + "802f5cd4": "bhv_breakable_box_small_init", + "802f5d78": "small_breakable_box_spawn_dust", + "802f5e44": "small_breakable_box_act_move", + "802f5f48": "breakable_box_small_released_loop", + "802f6014": "breakable_box_small_idle_loop", + "802f60d8": "breakable_box_small_get_dropped", + "802f6150": "breakable_box_small_get_thrown", + "802f6228": "bhv_breakable_box_small_loop", + "802f62e4": "bhv_sliding_snow_mound_loop", + "802f6448": "bhv_snow_mound_spawn_loop", + "802f6588": "floating_platform_find_home_y", + "802f665c": "floating_platform_act_0", + "802f6984": "bhv_floating_platform_loop", + "802f6c0c": "bhv_arrow_lift_loop", + "802f6d20": "bhv_orange_number_init", + "802f6d58": "bhv_orange_number_loop", + "802f6e40": "bhv_manta_ray_init", + "802f6eb0": "manta_ray_move", + "802f7068": "manta_ray_act_spawn_ring", + "802f7264": "bhv_manta_ray_loop", + "802f7348": "bhv_falling_pillar_init", + "802f7398": "bhv_falling_pillar_spawn_hitboxes", + "802f7418": "bhv_falling_pillar_calculate_angle_in_front_of_mario", + "802f74dc": "bhv_falling_pillar_loop", + "802f7760": "bhv_falling_pillar_hitbox_loop", + "802f7924": "bhv_jrb_floating_box_loop", + "802f7978": "bhv_decorative_pendulum_init", + "802f79b0": "bhv_decorative_pendulum_loop", + "802f7a58": "bhv_treasure_chest_top_loop", + "802f7c9c": "bhv_treasure_chest_bottom_init", + "802f7d04": "bhv_treasure_chest_bottom_loop", + "802f7f1c": "spawn_treasure_chest", + "802f7fa0": "bhv_treasure_chest_ship_init", + "802f8044": "bhv_treasure_chest_ship_loop", + "802f8158": "bhv_treasure_chest_jrb_init", + "802f8208": "bhv_treasure_chest_jrb_loop", + "802f82f8": "bhv_treasure_chest_init", + "802f83a4": "bhv_treasure_chest_loop", + "802f8490": "bhv_mips_init", + "802f85e0": "bhv_mips_find_furthest_waypoint_to_mario", + "802f8760": "bhv_mips_act_wait_for_nearby_mario", + "802f8808": "bhv_mips_act_follow_path", + "802f893c": "bhv_mips_act_wait_for_animation_done", + "802f8988": "bhv_mips_act_fall_down", + "802f8a34": "bhv_mips_act_idle", + "802f8ab4": "bhv_mips_free", + "802f8b54": "bhv_mips_held", + "802f8c74": "bhv_mips_dropped", + "802f8cf8": "bhv_mips_thrown", + "802f8dac": "bhv_mips_loop", + "802f8e54": "bhv_yoshi_init", + "802f8f08": "yoshi_walk_loop", + "802f9054": "yoshi_idle_loop", + "802f923c": "yoshi_talk_loop", + "802f93a8": "yoshi_walk_and_jump_off_roof_loop", + "802f9500": "yoshi_finish_jumping_and_despawn_loop", + "802f95ac": "yoshi_give_present_loop", + "802f965c": "bhv_yoshi_loop", + "802fbc4c": "bhv_koopa_init", + "802fc414": "shelled_koopa_attack_handler", + "802fcc00": "obj_begin_race", + "802fd7f8": "bhv_koopa_update", + "802fd950": "bhv_koopa_race_endpoint_update", + "802fda28": "bhv_pokey_body_part_update", + "802fe3b0": "bhv_pokey_update", + "802fe8b4": "bhv_swoop_update", + "802ff040": "bhv_fly_guy_update", + "802ff214": "bhv_goomba_triplet_spawner_update", + "802ff408": "bhv_goomba_init", + "802ff94c": "huge_goomba_weakly_attacked", + "802ff96c": "bhv_goomba_update", + "802ffb38": "bhv_chain_chomp_chain_part_update", + "80300e40": "bhv_chain_chomp_update", + "80300ecc": "bhv_wooden_post_update", + "80301148": "bhv_chain_chomp_gate_init", + "80301180": "bhv_chain_chomp_gate_update", + "80301210": "bhv_wiggler_body_part_update", + "803014cc": "wiggler_init_segments", + "803016e0": "wiggler_update_segments", + "803020e4": "wiggler_jumped_on_attack_handler", + "80302154": "bhv_wiggler_update", + "80302910": "bhv_spiny_update", + "80303028": "bhv_enemy_lakitu_update", + "8030369c": "bhv_cloud_update", + "80303744": "bhv_cloud_part_update", + "80303984": "bhv_camera_lakitu_init", + "80303f64": "bhv_camera_lakitu_update", + "803043f8": "bhv_monty_mole_hole_update", + "80304474": "monty_mole_spawn_dirt_particles", + "803044c0": "bhv_monty_mole_init", + "80304ba8": "bhv_monty_mole_update", + "80304fd4": "bhv_monty_mole_rock_update", + "80305100": "bhv_platform_on_track_init", + "80305a58": "bhv_platform_on_track_update", + "80305bb0": "bhv_track_ball_update", + "80305c14": "bhv_seesaw_platform_init", + "80305c90": "bhv_seesaw_platform_update", + "80305e2c": "bhv_ferris_wheel_axle_init", + "80305f24": "bhv_ferris_wheel_platform_update", + "80306084": "bhv_water_bomb_spawner_update", + "803062a8": "water_bomb_spawn_explode_particles", + "803067e8": "bhv_water_bomb_update", + "803068c0": "bhv_water_bomb_shadow_update", + "8030699c": "bhv_ttc_rotating_solid_init", + "80306a38": "bhv_ttc_rotating_solid_update", + "80306cc4": "bhv_ttc_pendulum_init", + "80306d38": "bhv_ttc_pendulum_update", + "80306f48": "bhv_ttc_treadmill_init", + "80307010": "bhv_ttc_treadmill_update", + "803071b8": "bhv_ttc_moving_bar_init", + "80307670": "bhv_ttc_moving_bar_update", + "80307760": "bhv_ttc_cog_init", + "803077e0": "bhv_ttc_cog_update", + "80307930": "bhv_ttc_pit_block_init", + "803079c8": "bhv_ttc_pit_block_update", + "80307ae4": "bhv_ttc_elevator_init", + "80307b58": "bhv_ttc_elevator_update", + "80307c88": "bhv_ttc_2d_rotator_init", + "80307cf8": "bhv_ttc_2d_rotator_update", + "80307ea4": "bhv_ttc_spinner_update", + "80307fb8": "mr_blizzard_spawn_white_particles", + "8030803c": "bhv_mr_blizzard_init", + "80308d6c": "bhv_mr_blizzard_update", + "80309154": "bhv_mr_blizzard_snowball", + "803091e0": "bhv_sliding_plat_2_init", + "80309354": "bhv_sliding_plat_2_loop", + "80309454": "bhv_rotating_octagonal_plat_init", + "803094d0": "bhv_rotating_octagonal_plat_loop", + "803094f8": "bhv_animates_on_floor_switch_press_init", + "80309530": "bhv_animates_on_floor_switch_press_loop", + "803097a4": "bhv_activated_back_and_forth_platform_init", + "803098c0": "bhv_activated_back_and_forth_platform_update", + "80309b64": "bhv_recovery_heart_loop", + "80309cec": "bhv_bubble_cannon_barrel_loop", + "80309ed4": "water_bomb_cannon_act_0", + "80309f68": "water_bomb_cannon_act_1", + "8030a0e8": "water_bomb_cannon_act_2", + "8030a11c": "bhv_water_bomb_cannon_loop", + "8030a1c0": "bhv_unagi_init", + "8030a2a8": "unagi_act_0", + "8030a390": "unagi_act_1_4", + "8030a514": "unagi_act_2", + "8030a614": "unagi_act_3", + "8030a93c": "bhv_unagi_loop", + "8030aabc": "bhv_unagi_subobject_loop", + "8030ad04": "dorrie_raise_head", + "8030ae9c": "dorrie_act_move", + "8030b0b8": "dorrie_begin_head_raise", + "8030b0f0": "dorrie_act_lower_head", + "8030b220": "dorrie_act_raise_head", + "8030b2f4": "bhv_dorrie_update", + "8030b658": "bhv_haunted_chair_init", + "8030b6d8": "haunted_chair_act_0", + "8030ba68": "haunted_chair_act_1", + "8030bc90": "bhv_haunted_chair_loop", + "8030bfd0": "bhv_mad_piano_update", + "8030c06c": "flying_bookend_act_0", + "8030c0f0": "flying_bookend_act_1", + "8030c210": "flying_bookend_act_2", + "8030c2c8": "flying_bookend_act_3", + "8030c364": "bhv_flying_bookend_loop", + "8030c4b0": "bhv_bookend_spawn_loop", + "8030c564": "bookshelf_manager_act_0", + "8030c60c": "bookshelf_manager_act_1", + "8030c6a4": "bookshelf_manager_act_2", + "8030c828": "bookshelf_manager_act_3", + "8030c894": "bookshelf_manager_act_4", + "8030c8ec": "bhv_haunted_bookshelf_manager_loop", + "8030c98c": "bhv_book_switch_loop", + "8030cd30": "obj_spit_fire", + "8030cddc": "bhv_fire_piranha_plant_init", + "8030d2f0": "bhv_fire_piranha_plant_update", + "8030d598": "bhv_fire_spitter_update", + "8030d640": "bhv_small_piranha_flame_loop", + "8030d8d4": "bhv_fly_guy_flame_loop", + "8030d93c": "geo_snufit_move_mask", + "8030d9ac": "geo_snufit_scale_body", + "8030da14": "snufit_act_idle", + "8030db38": "snufit_act_shoot", + "8030dc70": "bhv_snufit_loop", + "8030dfc4": "bhv_snufit_balls_loop", + "8030e14c": "bhv_horizontal_grindel_init", + "8030e16c": "bhv_horizontal_grindel_update", + "8030ea9c": "bhv_eyerok_boss_loop", + "8030fff8": "bhv_eyerok_hand_loop", + "80310498": "bhv_klepto_init", + "8031126c": "obj_set_speed_to_zero", + "8031129c": "bhv_klepto_update", + "80311874": "bhv_bird_update", + "803118e4": "bhv_racing_penguin_init", + "80312070": "bhv_racing_penguin_update", + "80312168": "bhv_penguin_race_finish_line_update", + "80312200": "bhv_penguin_race_shortcut_check_update", + "80312248": "bhv_coffin_spawner_loop", + "80312370": "coffin_act_idle", + "8031262c": "coffin_act_stand_up", + "8031274c": "bhv_coffin_loop", + "80312804": "clam_act_0", + "80312900": "clam_act_1", + "80312a54": "bhv_clam_loop", + "80313110": "bhv_skeeter_update", + "803131e8": "bhv_skeeter_wave_update", + "8031326c": "bhv_swing_platform_init", + "80313294": "bhv_swing_platform_update", + "80313354": "bhv_donut_platform_spawner_update", + "80313530": "bhv_donut_platform_update", + "803136cc": "bhv_ddd_pole_init", + "80313754": "bhv_ddd_pole_update", + "803137f4": "bhv_red_coin_star_marker_init", + "80313fc0": "bhv_triplet_butterfly_update", + "80314098": "bubba_act_0", + "8031427c": "bubba_act_1", + "803145d4": "bhv_bubba_loop", + "80314a30": "prepare_reverb_ring_buffer", + "80314cc0": "get_volume_ramping", + "80314de4": "synthesis_execute", + "80314f64": "synthesis_do_one_audio_update", + "80315590": "synthesis_process_notes", + "80316010": "load_wave_samples", + "803160dc": "final_resample", + "80316138": "process_envelope", + "8031619c": "process_envelope_inner", + "803166fc": "note_apply_headset_pan_effects", + "80316ac8": "note_init_volume", + "80316af4": "note_set_vel_pan_reverb", + "80316da8": "note_set_frequency", + "80316db4": "note_enable", + "80316e00": "note_disable", + "80316e80": "reset_bank_and_seq_load_status", + "80316ec4": "discard_bank", + "80316fb4": "discard_sequence", + "80317040": "soundAlloc", + "803170b4": "sound_alloc_pool_init", + "803170d4": "persistent_pool_clear", + "803170e8": "temporary_pool_clear", + "80317118": "unused_803160F8", + "80317128": "sound_init_main_pools", + "80317184": "session_pools_init", + "80317200": "seq_and_bank_pool_init", + "8031727c": "persistent_pools_init", + "80317338": "temporary_pools_init", + "803173fc": "alloc_bank_or_seq", + "8031782c": "get_bank_or_seq", + "803178ec": "decrease_reverb_gain", + "80317914": "wait_for_audio_frames", + "80317948": "audio_reset_session", + "80318040": "audio_dma_copy_immediate", + "803180c4": "audio_dma_copy_async", + "80318130": "audio_dma_partial_copy_async", + "803181ec": "decrease_sample_dma_ttls", + "80318300": "dma_sample_data", + "80318634": "init_sample_dma_buffers", + "803188f4": "patch_audio_bank", + "80318b30": "bank_load_immediate", + "80318c8c": "bank_load_async", + "80318dc4": "sequence_dma_immediate", + "80318e70": "sequence_dma_async", + "80318fac": "get_missing_bank", + "803190f4": "load_banks_immediate", + "80319220": "preload_sequence", + "80319328": "load_sequence", + "80319388": "load_sequence_internal", + "8031950c": "audio_init", + "80319920": "note_init", + "80319998": "note_disable2", + "803199b8": "process_notes", + "80319db8": "seq_channel_layer_decay_release_internal", + "80319f64": "seq_channel_layer_note_decay", + "80319f84": "seq_channel_layer_note_release", + "80319fa4": "build_synthetic_wave", + "8031a1d0": "init_synthetic_wave", + "8031a254": "init_note_list", + "8031a264": "init_note_lists", + "8031a2b4": "init_note_free_list", + "8031a368": "note_pool_clear", + "8031a494": "note_pool_fill", + "8031a5d0": "audio_list_push_front", + "8031a610": "audio_list_remove", + "8031a63c": "pop_node_with_lower_prio", + "8031a6cc": "note_init_for_layer", + "8031a794": "func_80319728", + "8031a7c8": "note_release_and_take_ownership", + "8031a820": "alloc_note_from_disabled", + "8031a89c": "alloc_note_from_decaying", + "8031a8f0": "alloc_note_from_active", + "8031a94c": "alloc_note", + "8031ac34": "reclaim_notes", + "8031adac": "note_init_all", + "8031aee8": "sequence_player_process_sound", + "8031b0cc": "get_portamento_freq_scale", + "8031b1c0": "get_vibrato_pitch_change", + "8031b248": "get_vibrato_freq_scale", + "8031b440": "note_vibrato_update", + "8031b4a0": "note_vibrato_init", + "8031b58c": "adsr_init", + "8031b5ac": "adsr_update", + "8031b830": "sequence_channel_init", + "8031b940": "seq_channel_set_layer", + "8031ba30": "seq_channel_layer_disable", + "8031ba6c": "seq_channel_layer_free", + "8031baf0": "sequence_channel_disable", + "8031bb5c": "allocate_sequence_channel", + "8031bba4": "sequence_player_init_channels", + "8031bcd0": "sequence_player_disable_channels", + "8031bda0": "sequence_channel_enable", + "8031be44": "sequence_player_disable", + "8031bf14": "audio_list_push_back", + "8031bf54": "audio_list_pop_back", + "8031bf94": "init_layer_freelist", + "8031c03c": "m64_read_u8", + "8031c050": "m64_read_s16", + "8031c080": "m64_read_compressed_u16", + "8031c0c4": "seq_channel_layer_process_script", + "8031c200": "L8031C200", + "8031c23c": "L8031C23C", + "8031c298": "L8031C298", + "8031c2dc": "L8031C2DC", + "8031c328": "L8031C328", + "8031c36c": "L8031C36C", + "8031c3bc": "L8031C3BC", + "8031c3e8": "L8031C3E8", + "8031c454": "L8031C454", + "8031c4a4": "L8031C4A4", + "8031c5c8": "L8031C5C8", + "8031c698": "L8031C698", + "8031c6a0": "L8031C6A0", + "8031cbe0": "L8031CBE0", + "8031cbec": "L8031CBEC", + "8031ce54": "get_instrument", + "8031cfd4": "set_instrument", + "8031d068": "sequence_channel_set_volume", + "8031d08c": "sequence_channel_process_script", + "8031d144": "L_U_8031D144", + "8031d1f8": "L_U_8031D1F8", + "8031d234": "L_U_8031D234", + "8031d26c": "L_U_8031D26C", + "8031d2b4": "L_U_8031D2B4", + "8031d2c4": "L_U_8031D2C4", + "8031d31c": "L_U_8031D31C", + "8031d344": "L_U_8031D344", + "8031d354": "L_U_8031D354", + "8031d370": "L_U_8031D370", + "8031d3a8": "L_U_8031D3A8", + "8031d3c4": "L_U_8031D3C4", + "8031d3d4": "L_U_8031D3D4", + "8031d3e4": "L_U_8031D3E4", + "8031d400": "L_U_8031D400", + "8031d424": "L_U_8031D424", + "8031d44c": "L_U_8031D44C", + "8031d474": "L_U_8031D474", + "8031d498": "L_U_8031D498", + "8031d4bc": "L_U_8031D4BC", + "8031d4d4": "L_U_8031D4D4", + "8031d4f0": "L_U_8031D4F0", + "8031d500": "L_U_8031D500", + "8031d51c": "L_U_8031D51C", + "8031d538": "L_U_8031D538", + "8031d56c": "L_U_8031D56C", + "8031d5a0": "L_U_8031D5A0", + "8031d5b4": "L_U_8031D5B4", + "8031d5d4": "L_U_8031D5D4", + "8031d5e4": "L_U_8031D5E4", + "8031d640": "L_U_8031D640", + "8031d678": "L_U_8031D678", + "8031d6c4": "L_U_8031D6C4", + "8031d6d4": "L_U_8031D6D4", + "8031d6f4": "L_U_8031D6F4", + "8031d718": "L_U_8031D718", + "8031d728": "L_U_8031D728", + "8031d73c": "L_U_8031D73C", + "8031d7b8": "L_U_8031D7B8", + "8031d7e8": "L_U_8031D7E8", + "8031d7f8": "L_U_8031D7F8", + "8031d814": "L_U_8031D814", + "8031d830": "L_U_8031D830", + "8031d87c": "L_U_8031D87C", + "8031d898": "L_U_8031D898", + "8031d8f8": "L_U_8031D8F8", + "8031d900": "L_U_8031D900", + "8031d930": "L_U_8031D930", + "8031d94c": "L_U_8031D94C", + "8031d974": "L_U_8031D974", + "8031d9ec": "sequence_player_process_sequence", + "8031e240": "process_sequences", + "8031e2e8": "init_sequence_player", + "8031e374": "init_sequence_players", + "8031e4f0": "unused_8031E4F0", + "8031e568": "unused_8031E568", + "8031e578": "sequence_player_fade_out_internal", + "8031e5c0": "func_8031D690", + "8031e60c": "func_8031D6E4", + "8031e6a4": "func_8031D7B0", + "8031e710": "func_8031D838", + "8031e7b8": "create_next_audio_frame_task", + "8031eb00": "play_sound", + "8031eb30": "process_sound_request", + "8031edec": "process_all_sound_requests", + "8031ee70": "func_8031DFE8", + "8031ef6c": "func_8031E0E4", + "8031eff4": "func_8031E16C", + "8031f810": "get_sound_pan", + "8031f96c": "get_sound_dynamics", + "8031fb20": "get_sound_freq_scale", + "8031fbe8": "get_sound_reverb", + "8031fd84": "audio_signal_game_loop_tick", + "8031fdac": "update_game_sound", + "80320544": "play_sequence", + "80320678": "sequence_player_fade_out", + "803206bc": "fade_volume_scale", + "80320734": "fade_channel_volume_scale", + "8032080c": "func_8031F96C", + "803208ec": "process_level_music_dynamics", + "80320a4c": "L8031FBAC", + "80320a8c": "L8031FBEC", + "80320acc": "L8031FC2C", + "80320b0c": "L8031FC6C", + "80320b4c": "L8031FCAC", + "80320b8c": "L8031FCEC", + "80320bcc": "L8031FD2C", + "80320bf4": "L8031FD54", + "80320d70": "unused_8031FED0", + "80320e3c": "func_8031FFB4", + "80320ec4": "sequence_player_unlower", + "80320f68": "func_803200E4", + "803210d4": "set_sound_disabled", + "8032112c": "sound_init", + "80321398": "get_currently_playing_sound", + "80321474": "func_803205E8", + "80321584": "func_803206F8", + "8032171c": "func_80320890", + "8032174c": "sound_banks_disable", + "803217a8": "disable_all_sequence_players", + "8032180c": "sound_banks_enable", + "80321864": "unused_803209D8", + "803218d8": "func_80320A4C", + "803218f4": "play_dialog_sound", + "803219ac": "play_music", + "80321bac": "stop_background_music", + "80321ce4": "fadeout_background_music", + "80321d38": "drop_queued_background_music", + "80321d5c": "get_current_background_music", + "80321d9c": "func_80320ED8", + "80321e48": "play_secondary_music", + "80321f48": "func_80321080", + "80321f9c": "func_803210D4", + "80322078": "play_course_clear", + "803220b4": "play_peachs_jingle", + "803220f0": "play_puzzle_jingle", + "8032212c": "play_star_fanfare", + "80322168": "play_power_star_jingle", + "803221b8": "play_race_fanfare", + "803221f4": "play_toads_jingle", + "80322230": "sound_reset", + "8032231c": "audio_set_sound_mode", + "80322348": "unused_80321460", + "8032235c": "unused_80321474", + "803223b0": "osSetTime", + "803223e0": "osMapTLB", + "803224a0": "osUnmapTLBAll", + "803224f0": "sprintf", + "8032255c": "proutSprintf", + "803225a0": "osCreateMesgQueue", + "803225d0": "osSetEventMesg", + "80322640": "osViSetEvent", + "803226b0": "osCreateThread", + "80322800": "osRecvMesg", + "80322940": "_VirtualToPhysicalTask", + "80322a5c": "osSpTaskLoad", + "80322bbc": "osSpTaskStartGo", + "80322c00": "osSpTaskYield", + "80322c20": "osSendMesg", + "80322d70": "osSpTaskYielded", + "80322df0": "osStartThread", + "80322f40": "osWritebackDCacheAll", + "80322f70": "osCreateViManager", + "803230f4": "viMgrMain", + "803232d0": "osViSetMode", + "80323340": "osViBlack", + "803233b0": "osViSetSpecialFeatures", + "80323570": "osCreatePiManager", + "803236f0": "osSetThreadPri", + "803237d0": "osInitialize", + "80323a00": "osViSwapBuffer", + "80323a50": "sqrtf", + "80323a60": "osContStartReadData", + "80323b24": "osContGetReadData", + "80323bcc": "__osPackReadData", + "80323cc0": "osContInit", + "80323ebc": "__osContGetInitData", + "80323f8c": "__osPackRequestData", + "80324080": "osEepromProbe", + "803240f0": "__ull_rshift", + "8032411c": "__ull_rem", + "80324158": "__ull_div", + "80324194": "__ll_lshift", + "803241c0": "__ll_rem", + "803241fc": "__ll_div", + "80324258": "__ll_mul", + "80324288": "__ull_divremi", + "803242e8": "__ll_mod", + "80324384": "__ll_rshift", + "803243b0": "osInvalDCache", + "80324460": "osPiStartDma", + "80324570": "bzero", + "80324610": "osInvalICache", + "80324690": "osEepromLongRead", + "803247d0": "osEepromLongWrite", + "80324910": "bcopy", + "80324c20": "guOrthoF", + "80324d74": "guOrtho", + "80324de0": "guPerspectiveF", + "80325010": "guPerspective", + "80325070": "osGetTime", + "80325100": "__d_to_ll", + "8032511c": "__f_to_ll", + "80325138": "__d_to_ull", + "803251d8": "__f_to_ull", + "80325274": "__ll_to_d", + "8032528c": "__ll_to_f", + "803252a4": "__ull_to_d", + "803252d8": "__ull_to_f", + "80325310": "cosf", + "80325480": "sinf", + "80325640": "guTranslateF", + "80325688": "guTranslate", + "803256e0": "guRotateF", + "80325874": "guRotate", + "803258d0": "guScaleF", + "80325924": "guScale", + "80325970": "osAiSetFrequency", + "80325bd4": "alBnkfNew", + "80325cd8": "alSeqFileNew", + "80325d20": "osWritebackDCache", + "80325da0": "osAiGetLength", + "80325db0": "osAiSetNextBuffer", + "80325e60": "__osTimerServicesInit", + "80325eec": "__osTimerInterrupt", + "80326064": "__osSetTimerIntr", + "803260d8": "__osInsertTimer", + "80326260": "_Printf", + "803273f0": "memcpy", + "8032741c": "strlen", + "80327444": "strchr", + "80327490": "__osDequeueThread", + "803274d0": "__osDisableInt", + "803274f0": "__osRestoreInt", + "80327510": "__osViInit", + "80327640": "__osExceptionPreamble", + "80327650": "__osException", + "803278e4": "L80326964", + "80327904": "L80326984", + "80327938": "L803269B8", + "80327a68": "L80326AE8", + "80327ac4": "L80326B44", + "80327ae4": "L80326B64", + "80327b1c": "L80326B9C", + "80327b68": "L80326BE8", + "80327b98": "send_mesg", + "80327c80": "__osEnqueueAndYield", + "80327d10": "__osEnqueueThread", + "80327d58": "__osPopThread", + "80327d68": "__osDispatchThread", + "80327ea8": "__osCleanupThread", + "80327eb0": "osVirtualToPhysical", + "80327f30": "__osSpSetStatus", + "80327f40": "__osSpSetPc", + "80327f80": "__osSpRawStartDma", + "80328010": "__osSpDeviceBusy", + "80328040": "__osSpGetStatus", + "80328050": "osGetThreadPri", + "80328070": "__osViGetCurrentContext", + "80328080": "__osViSwapContext", + "803283e0": "osGetCount", + "803283f0": "__osPiCreateAccessQueue", + "80328440": "__osPiGetAccess", + "80328484": "__osPiRelAccess", + "803284b0": "osPiRawStartDma", + "80328590": "__osDevMgrMain", + "80328710": "__osSetSR", + "80328720": "__osGetSR", + "80328730": "__osSetFpcCsr", + "80328740": "__osSiRawReadIo", + "80328790": "__osSiRawWriteIo", + "803287e0": "osMapTLBRdb", + "80328840": "osPiRawReadIo", + "803288a0": "__osSiCreateAccessQueue", + "803288f0": "__osSiGetAccess", + "80328934": "__osSiRelAccess", + "80328960": "__osSiRawStartDma", + "80328a10": "osSetTimer", + "80328af0": "osEepromWrite", + "80328ca0": "__osPackEepWriteData", + "80328dac": "__osEepStatus", + "80328fd0": "osJamMesg", + "80329120": "osPiGetCmdQueue", + "80329150": "osEepromRead", + "80329340": "__osPackEepReadData", + "80329450": "guMtxF2L", + "80329550": "guMtxIdentF", + "803295d8": "guMtxIdent", + "80329608": "guMtxL2F", + "803296c0": "guNormalize", + "80329750": "__osAiDeviceBusy", + "80329780": "__osSetCompare", + "80329790": "_Litob", + "80329a90": "_Ldtob", + "8032a860": "u32_to_string", + "8032a890": "string_to_u32", + "8032a8e8": "send_packet", + "8032a9a8": "send", + "8032aa80": "process_command_memory", + "8032aacc": "process_command_register", + "8032aaf8": "kdebugserver", + "8032ace0": "__osSyncPutChars", + "8032ae10": "osSetIntMask", + "8032ae70": "osDestroyThread", + "8032af70": "__osProbeTLB", + "8032b030": "__osSiDeviceBusy", + "8032b060": "lldiv", + "8032b160": "ldiv", + "8032b1f0": "__osGetCause", + "8032b200": "__osAtomicDec", + "8032b260": "rspF3DBootStart", + "8032b330": "rspF3DBootEnd", + "8032b330": "rspF3DStart", + "8032c738": "rspF3DEnd", + "8032c740": "rspAspMainStart", + "8032d560": "rspAspMainEnd", + "8032d560": "gVblankHandler1", + "8032d564": "gVblankHandler2", + "8032d568": "gActiveSPTask", + "8032d56c": "sCurrentAudioSPTask", + "8032d570": "sCurrentDisplaySPTask", + "8032d574": "sNextAudioSPTask", + "8032d578": "sNextDisplaySPTask", + "8032d57c": "sAudioEnabled", + "8032d580": "sNumVblanks", + "8032d584": "gResetTimer", + "8032d588": "D_8032C648", + "8032d58c": "gDebugLevelSelect", + "8032d590": "D_8032C650", + "8032d594": "gShowProfiler", + "8032d598": "gShowDebugText", + "8032d5d0": "unused8032C690", + "8032d5d4": "gGlobalTimer", + "8032d5dc": "frameBufferIndex", + "8032d5e0": "D_8032C6A0", + "8032d5e4": "gPlayer1Controller", + "8032d5e8": "gPlayer2Controller", + "8032d5ec": "gPlayer3Controller", + "8032d5f0": "gCurrDemoInput", + "8032d5f4": "gDemoInputListID", + "8032d5f8": "gRecordedDemoInput", + "8032d6d0": "credits01", + "8032d6d8": "credits02", + "8032d6e4": "credits03", + "8032d6f0": "credits04", + "8032d700": "credits05", + "8032d710": "credits06", + "8032d71c": "credits07", + "8032d728": "credits08", + "8032d738": "credits09", + "8032d740": "credits10", + "8032d750": "credits11", + "8032d75c": "credits12", + "8032d764": "credits13", + "8032d774": "credits14", + "8032d77c": "credits15", + "8032d788": "credits16", + "8032d79c": "credits17", + "8032d7ac": "credits18", + "8032d7bc": "credits19", + "8032d7c4": "credits20", + "8032d7cc": "sCreditsSequence", + "8032d93c": "gMarioState", + "8032d940": "unused1", + "8032d944": "sWarpCheckpointActive", + "8032daa0": "sTerrainSounds", + "8032dacc": "sSquishScaleOverTime", + "8032dae0": "sCapFlickerFrames", + "8032daf8": "gWaterSurfacePseudoFloor", + "8032dc50": "sJumpLandAction", + "8032dc68": "sFreefallLandAction", + "8032dc80": "sSideFlipLandAction", + "8032dc98": "sHoldJumpLandAction", + "8032dcb0": "sHoldFreefallLandAction", + "8032dcc8": "sLongJumpLandAction", + "8032dce0": "sDoubleJumpLandAction", + "8032dcf8": "sTripleJumpLandAction", + "8032dd10": "sBackflipLandAction", + "8032dd40": "sPunchingForwardVelocities", + "8032dd80": "gLastCompletedCourseNum", + "8032dd84": "gLastCompletedStarNum", + "8032dd88": "sUnusedGotGlobalCoinHiScore", + "8032dd8c": "gGotFileCoinHiScore", + "8032dd90": "gCurrCourseStarFlags", + "8032dd94": "gSpecialTripleJump", + "8032dd98": "gLevelToCourseNumTable", + "8032ddc0": "gMarioSpawnInfo", + "8032ddc4": "gLoadedGraphNodes", + "8032ddc8": "gAreas", + "8032ddcc": "gCurrentArea", + "8032ddd0": "gCurrCreditsEntry", + "8032ddd4": "D_8032CE74", + "8032ddd8": "D_8032CE78", + "8032dddc": "gWarpTransDelay", + "8032dde0": "gFBSetColor", + "8032dde4": "gWarpTransFBSetColor", + "8032dde8": "gWarpTransRed", + "8032ddec": "gWarpTransGreen", + "8032ddf0": "gWarpTransBlue", + "8032ddf4": "gCurrSaveFileNum", + "8032ddf8": "gCurrLevelNum", + "8032ddfc": "sWarpBhvSpawnTable", + "8032de4c": "sSpawnTypeFromWarpBhv", + "8032de60": "D_8032CF00", + "8032de70": "renderModeTable_1Cycle", + "8032deb0": "renderModeTable_2Cycle", + "8032def0": "gCurGraphNodeRoot", + "8032def4": "gCurGraphNodeMasterList", + "8032def8": "gCurGraphNodeCamFrustum", + "8032defc": "gCurGraphNodeCamera", + "8032df00": "gCurGraphNodeObject", + "8032df04": "gCurGraphNodeHeldObject", + "8032df08": "gAreaUpdateCounter", + "8032df10": "gProfilerMode", + "8032df14": "gCurrentFrameIndex1", + "8032df18": "gCurrentFrameIndex2", + "8032df20": "unused8032CFC0", + "8032df24": "gCutsceneFocus", + "8032df28": "unused8032CFC8", + "8032df2c": "unused8032CFCC", + "8032df30": "gSecondCameraFocus", + "8032df34": "sYawSpeed", + "8032df38": "gCurrLevelArea", + "8032df3c": "gPrevLevel", + "8032df40": "unused8032CFE0", + "8032df44": "unused8032CFE4", + "8032df48": "unused8032CFE8", + "8032df4c": "gCameraZoomDist", + "8032df50": "sObjectCutscene", + "8032df54": "gRecentCutscene", + "8032df58": "sFramesSinceCutsceneEnded", + "8032df5c": "sCutsceneDialogResponse", + "8032df60": "sMarioCamState", + "8032df64": "sLuigiCamState", + "8032df68": "unused8032D008", + "8032df6c": "sFixedModeBasePosition", + "8032df78": "sUnusedModeBasePosition_2", + "8032df84": "sUnusedModeBasePosition_3", + "8032df90": "sUnusedModeBasePosition_4", + "8032df9c": "sUnusedModeBasePosition_5", + "8032dfa8": "sModeTransitions", + "8032e008": "unused8032D0A8", + "8032e010": "unused8032D0B0", + "8032e018": "sDanceCutsceneTable", + "8032e024": "unusedDanceInfo1", + "8032e038": "unusedDanceType", + "8032e03c": "unusedDanceInfo2", + "8032e050": "sBBHLibraryParTrackPath", + "8032e098": "sCamSL", + "8032e0e0": "sCamTHI", + "8032e128": "sCamHMC", + "8032e1d0": "sCamSSL", + "8032e248": "sCamRR", + "8032e2f0": "sCamBOB", + "8032e338": "sCamCotMC", + "8032e368": "sCamCCM", + "8032e3b0": "sCamCastle", + "8032e6f8": "sCamBBH", + "8032ecb0": "sCameraTriggers", + "8032ed50": "sIntroStartToPipePosition", + "8032ee08": "sIntroStartToPipeFocus", + "8032eec0": "sIntroPipeToDialogPosition", + "8032ef30": "sIntroPipeToDialogFocus", + "8032efa0": "sEndingFlyToWindowPos", + "8032eff0": "sEndingFlyToWindowFocus", + "8032f048": "sEndingPeachDescentCamPos", + "8032f0e8": "sEndingMarioToPeachPos", + "8032f130": "sEndingMarioToPeachFocus", + "8032f178": "sEndingLookUpAtCastle", + "8032f1b8": "sEndingLookAtSkyFocus", + "8032f214": "gIntroLakituStartToPipeFocus", + "8032f32c": "gIntroLakituStartToPipeOffsetFromCamera", + "8032f444": "gEndWavingPos", + "8032f48c": "gEndWavingFocus", + "8032f4d4": "sCutsceneEnding", + "8032f534": "sCutsceneGrandStar", + "8032f544": "sCutsceneUnused", + "8032f554": "sCutsceneDoorWarp", + "8032f564": "sCutsceneEndWaving", + "8032f56c": "sCutsceneCredits", + "8032f574": "sCutsceneDoorPull", + "8032f59c": "sCutsceneDoorPush", + "8032f5c4": "sCutsceneDoorPullMode", + "8032f5dc": "sCutsceneDoorPushMode", + "8032f5f4": "sCutsceneEnterCannon", + "8032f60c": "sCutsceneStarSpawn", + "8032f624": "sCutsceneRedCoinStarSpawn", + "8032f634": "sCutsceneEnterPainting", + "8032f63c": "sCutsceneDeathExit", + "8032f64c": "sCutsceneExitPaintingSuccess", + "8032f65c": "sCutsceneUnusedExit", + "8032f674": "sCutsceneIntroPeach", + "8032f69c": "sCutscenePrepareCannon", + "8032f6ac": "sCutsceneExitWaterfall", + "8032f6bc": "sCutsceneFallToCastleGrounds", + "8032f6cc": "sCutsceneEnterPyramidTop", + "8032f6dc": "sCutscenePyramidTopExplode", + "8032f6f4": "sCutsceneStandingDeath", + "8032f6fc": "sCutsceneEnterPool", + "8032f70c": "sCutsceneDeathStomach", + "8032f714": "sCutsceneDeathOnBack", + "8032f71c": "sCutsceneQuicksandDeath", + "8032f724": "sCutsceneWaterDeath", + "8032f72c": "sCutsceneSuffocation", + "8032f734": "sCutsceneEnterBowserArena", + "8032f74c": "sCutsceneDanceDefaultRotate", + "8032f754": "sCutsceneDanceFlyAway", + "8032f75c": "sCutsceneDanceCloseup", + "8032f764": "sCutsceneKeyDance", + "8032f76c": "sCutsceneCapSwitchPress", + "8032f774": "sCutsceneSlidingDoorsOpen", + "8032f784": "sCutsceneUnlockKeyDoor", + "8032f794": "sCutsceneExitBowserSuccess", + "8032f7a4": "sCutsceneExitBowserDeath", + "8032f7b4": "sCutsceneExitSpecialSuccess", + "8032f7c4": "sCutsceneNonPaintingDeath", + "8032f7d4": "sCutsceneDialog", + "8032f7ec": "sCutsceneReadMessage", + "8032f804": "sDanceCutsceneIndexTable", + "8032f870": "sZoomOutAreaMasks", + "8032f884": "sBobCreditsSplinePositions", + "8032f8ac": "sBobCreditsSplineFocus", + "8032f8d4": "sWfCreditsSplinePositions", + "8032f8fc": "sWfCreditsSplineFocus", + "8032f924": "sJrbCreditsSplinePositions", + "8032f94c": "sJrbCreditsSplineFocus", + "8032f974": "sCcmSlideCreditsSplinePositions", + "8032f99c": "sCcmSlideCreditsSplineFocus", + "8032f9c4": "sBbhCreditsSplinePositions", + "8032f9e4": "sBbhCreditsSplineFocus", + "8032fa04": "sHmcCreditsSplinePositions", + "8032fa2c": "sHmcCreditsSplineFocus", + "8032fa54": "sThiWigglerCreditsSplinePositions", + "8032fa6c": "sThiWigglerCreditsSplineFocus", + "8032fa84": "sVolcanoCreditsSplinePositions", + "8032fab4": "sVolcanoCreditsSplineFocus", + "8032fae4": "sSslCreditsSplinePositions", + "8032fb14": "sSslCreditsSplineFocus", + "8032fb44": "sDddCreditsSplinePositions", + "8032fb7c": "sDddCreditsSplineFocus", + "8032fbb4": "sSlCreditsSplinePositions", + "8032fbd4": "sSlCreditsSplineFocus", + "8032fbf4": "sWdwCreditsSplinePositions", + "8032fc14": "sWdwCreditsSplineFocus", + "8032fc34": "sTtmCreditsSplinePositions", + "8032fc64": "sTtmCreditsSplineFocus", + "8032fc94": "sThiHugeCreditsSplinePositions", + "8032fccc": "sThiHugeCreditsSplineFocus", + "8032fd04": "sTtcCreditsSplinePositions", + "8032fd24": "sTtcCreditsSplineFocus", + "8032fd44": "sRrCreditsSplinePositions", + "8032fd64": "sRrCreditsSplineFocus", + "8032fd84": "sSaCreditsSplinePositions", + "8032fdac": "sSaCreditsSplineFocus", + "8032fdd4": "sCotmcCreditsSplinePositions", + "8032fdfc": "sCotmcCreditsSplineFocus", + "8032fe24": "sDddSubCreditsSplinePositions", + "8032fe4c": "sDddSubCreditsSplineFocus", + "8032fe74": "sCcmOutsideCreditsSplinePositions", + "8032fe94": "sCcmOutsideCreditsSplineFocus", + "8032fec0": "sObjectListUpdateOrder", + "8032fecc": "sParticleTypes", + "80330000": "D_8032F0A0", + "80330004": "D_8032F0A4", + "80330020": "D_8032F0C0", + "8033002c": "D_8032F0CC", + "8033006c": "sMrIParticleActions", + "80330074": "sMrIActions", + "80330084": "sMrIHitbox", + "80330094": "D_8032F134", + "803300a8": "unused8032F134", + "803300ac": "sCapSwitchActions", + "803300bc": "sKingBobombActions", + "803300e0": "sKingBobombSoundStates", + "80330140": "sOpenedCannonActions", + "8033015c": "unused0EA1FC", + "80330198": "sChuckyaActions", + "803301a8": "sWFRotatingPlatformData", + "803301c0": "sKoopaShellUnderwaterHitbox", + "803301d0": "D_8032F270", + "803301e4": "sSparkleSpawnStarHitbox", + "803301f4": "sYellowCoinHitbox", + "80330204": "D_8032F2A4", + "80330224": "sCoinInsideBooActions", + "8033022c": "D_8032F2CC", + "80330244": "D_8032F2E4", + "80330260": "D_8032F300", + "80330288": "D_8032F328", + "80330290": "D_8032F330", + "80330298": "sGrindelThwompActions", + "803302ac": "sTumblingBridgeParams", + "803302dc": "sTumblingBridgeActions", + "803302ec": "D_8032F38C", + "80330318": "sElevatorActions", + "8033032c": "D_8032F3CC", + "80330340": "D_8032F3E0", + "80330354": "D_8032F3F4", + "8033035c": "D_8032F3FC", + "80330370": "sUkikiCageActions", + "80330380": "D_8032F420", + "80330390": "sSpindriftHitbox", + "803303a0": "sMetalBoxHitbox", + "803303b0": "sBreakableBoxHitbox", + "803303c0": "D_8032F460", + "803303e8": "sHeaveHoActions", + "803303f8": "sJumpingBoxHitbox", + "80330408": "sJumpingBoxActions", + "8033042c": "sBowserKeyHitbox", + "8033043c": "sBulletBillActions", + "80330450": "sBowserTailAnchorActions", + "8033045c": "D_8032F4FC", + "8033046c": "D_8032F50C", + "80330470": "D_8032F510", + "80330474": "D_8032F514", + "80330478": "sBowserDefeatedDialogText", + "80330480": "D_8032F520", + "803304c8": "sBowserActions", + "80330518": "D_8032F5B8", + "803305f0": "D_8032F690", + "803305f4": "D_8032F694", + "803305f8": "D_8032F698", + "8033067c": "sFallingBowserPlatformActions", + "80330688": "sGrowingBowserFlameHitbox", + "80330698": "sBowserFlameHitbox", + "803306a8": "D_8032F748", + "803306b4": "D_8032F754", + "80330738": "sUkikiSoundStates", + "803307a0": "sUkikiActions", + "803307c0": "D_8032F860", + "803307f4": "D_8032F894", + "80330828": "D_8032F8C8", + "80330830": "sRotatingCwFireBarsActions", + "80330840": "sKoopaShellHitbox", + "80330850": "D_8032F8F0", + "80330884": "D_8032F924", + "803308a8": "D_8032F948", + "803308cc": "D_8032F96C", + "803308d8": "sToxBoxActions", + "80330900": "TablePiranhaPlantActions", + "80330b1c": "sBowserPuzzlePieceActions", + "80330b38": "sTuxiesMotherActions", + "80330b44": "sSmallPenguinActions", + "80330b5c": "sFishActions", + "80330b68": "sFishGroupActions", + "80330b74": "sBirdChirpChirpActions", + "80330b84": "sCheepCheepActions", + "80330b90": "sExclamationBoxHitbox", + "80330ba0": "sExclamationBoxContents", + "80330c20": "sExclamationBoxActions", + "80330c38": "sSkullSlidingBoxHitbox", + "80330c48": "gOpenableGrills", + "80330c58": "sTweesterHitbox", + "80330c68": "sTweesterActions", + "80330cd4": "sScuttlebugHitbox", + "80330ce4": "sWhompActions", + "80330d0c": "sWaterSplashDropletParams", + "80330d30": "gShallowWaterSplashDropletParams", + "80330d54": "sWaterDropletFishParams", + "80330d78": "gShallowWaterWaveDropletParams", + "80330d9c": "sStrongWindParticleHitbox", + "80330dac": "sSLWalkingPenguinErraticSteps", + "80330e20": "D_8032FEC0", + "80330e24": "unused_8032FEC4", + "80330e34": "gMarioPlatform", + "80330e40": "sDebugEffectStringInfo", + "80330e64": "sDebugEnemyStringInfo", + "80330e88": "sDebugInfoDPadMask", + "80330e8c": "sDebugInfoDPadUpdID", + "80330e90": "sDebugLvSelectCheckFlag", + "80330e94": "sDebugPage", + "80330e98": "sNoExtraDebug", + "80330e9c": "sDebugStringArrPrinted", + "80330ea0": "sDebugSysCursor", + "80330ea4": "sDebugInfoButtonSeqID", + "80330ea8": "sDebugInfoButtonSeq", + "80330ec0": "sTransitionColorFadeCount", + "80330ec4": "sTransitionTextureFadeCount", + "80330ec8": "sTextureTransitionID", + "80330ee0": "rectangles", + "80330f00": "sSkyboxTextures", + "80330f28": "sSkyboxColors", + "80330f30": "gMovtexCounter", + "80330f34": "gMovtexCounterPrev", + "80330f38": "gMovtexVtxColor", + "80330f3c": "gPaintingMarioYEntry", + "80330f40": "gWdwWaterLevelSet", + "80330f44": "gMovtexIdToTexture", + "80330f64": "gMovtexNonColored", + "803311a4": "gMovtexColored", + "8033127c": "gMovtexColored2", + "80331300": "sHmcPaintings", + "80331308": "sInsideCastlePaintings", + "80331344": "sTtmPaintings", + "8033134c": "sPaintingGroups", + "80331358": "gPaintingUpdateCounter", + "8033135c": "gLastPaintingUpdateCounter", + "80331360": "sTextLabelsCount", + "80331370": "gDialogCharWidths", + "80331470": "gDialogBoxState", + "80331474": "gDialogBoxOpenTimer", + "80331478": "gDialogBoxScale", + "8033147c": "gDialogScrollOffsetY", + "80331480": "gDialogBoxType", + "80331484": "gDialogID", + "80331488": "gLastDialogPageStrPos", + "8033148c": "gDialogTextPos", + "80331490": "gDialogLineNum", + "80331494": "gLastDialogResponse", + "80331498": "gMenuHoldKeyIndex", + "8033149c": "gMenuHoldKeyTimer", + "803314a0": "gDialogResponse", + "803314b0": "gHudSymCoin", + "803314b4": "gHudSymX", + "803314f8": "gMenuMode", + "803314fc": "gEndCutsceneStrEn0", + "80331504": "gEndCutsceneStrEn1", + "80331538": "gEndCutsceneStrEn2", + "80331558": "gEndCutsceneStrEn3", + "8033156c": "gEndCutsceneStrEn4", + "80331598": "gEndCutsceneStrEn5", + "803315ac": "gEndCutsceneStrEn6", + "803315cc": "gEndCutsceneStrEn7", + "803315dc": "gEndCutsceneStrEn8", + "803315e4": "gEndCutsceneStringsEn", + "8033160c": "gCutsceneMsgFade", + "80331610": "gCutsceneMsgIndex", + "80331614": "gCutsceneMsgDuration", + "80331618": "gCutsceneMsgTimer", + "8033161c": "gDialogCameraAngleIndex", + "80331620": "gDialogCourseActNum", + "803316c8": "gCourseCompleteCoinsEqual", + "803316cc": "gCourseDoneMenuTimer", + "803316d0": "gCourseCompleteCoins", + "803316d4": "gHudFlash", + "80331750": "gEnvFxMode", + "80331754": "D_80330644", + "80331758": "gSnowTempVtx", + "80331788": "gSnowFlakeVertex1", + "80331790": "gSnowFlakeVertex2", + "80331798": "gSnowFlakeVertex3", + "803317a0": "D_80330690", + "803317a4": "D_80330694", + "803317a8": "gBubbleTempVtx", + "803317e0": "MacroObjectPresets", + "803325fc": "sPowerMeterVisibleTimer", + "80332614": "sPrevCheckMarioRoom", + "80332618": "sYoshiDead", + "8033261c": "sDebugSequenceTracker", + "80332620": "sDebugTimer", + "803327a8": "sBreakableBoxSmallHitbox", + "80332b00": "sMrBlizzardHitbox", + "80332b24": "sMrBlizzardSnowballHitbox", + "80332b34": "D_80331A24", + "80332b54": "D_80331A44", + "80332b5c": "D_80331A4C", + "80332b64": "D_80331A54", + "80332bdc": "D_80331ACC", + "80332bf0": "sRecoveryHeartHitbox", + "80332c00": "sUnagiHitbox", + "80332c10": "sHauntedChairHitbox", + "80332c30": "sFlyingBookendHitbox", + "80332c40": "D_80331B30", + "80332c4c": "sBookSwitchHitbox", + "80332c5c": "sFirePiranhaPlantHitbox", + "80332c6c": "D_80331B5C", + "80332c74": "sPiranhaPlantFireHitbox", + "80332c84": "sSnufitHitbox", + "80332c94": "sSnufitBulletHitbox", + "80332ca4": "sEyerokHitbox", + "80332cb4": "D_80331BA4", + "80332d10": "coffinRelativePos", + "80332d28": "sClamShellHitbox", + "80332d38": "sSkeeterHitbox", + "80332d48": "D_80331C38", + "80332e50": "gAudioErrorFlags", + "80332e54": "sGameLoopTicked", + "80332e58": "sDialogSpeaker", + "80332f04": "sDialogSpeakerVoice", + "80332f40": "sNumProcessedSoundRequests", + "80332f44": "sSoundRequestCount", + "80332f48": "sDynBbh", + "80332f54": "sDynDdd", + "80332f6c": "sDynJrb", + "80332f88": "sDynWdw", + "80332f98": "sDynHmc", + "80332fa8": "sDynUnk38", + "80332fb8": "sDynNone", + "80332fbc": "sCurrentMusicDynamic", + "80332fc0": "sBackgroundMusicForDynamics", + "80332fc4": "sLevelDynamics", + "80333060": "sMusicDynamics", + "803330c0": "gAreaEchoLevel", + "80333138": "D_80332028", + "80333188": "sBackgroundMusicDefaultVolume", + "803331ac": "sPlayer0CurSeqId", + "803331b0": "sMusicDynamicDelay", + "803331b4": "D_803320A4", + "803331c0": "D_803320B0", + "803331cc": "D_803320BC", + "803331d8": "sMaxChannelsForSoundBank", + "803331e4": "sNumSoundsPerBank", + "803331f0": "gDefaultSoundArgs", + "803331fc": "sUnusedSoundArgs", + "80333208": "sSoundBankDisabled", + "80333218": "D_80332108", + "8033321c": "sHasStartedFadeOut", + "80333220": "D_80332110", + "80333224": "sUnused80332114", + "80333228": "sUnused80332118", + "8033322c": "D_8033211C", + "80333230": "D_80332120", + "80333234": "D_80332124", + "80333238": "sBackgroundMusicQueueSize", + "8033323c": "sUnused8033323C", + "803332a0": "gAudioSessionPresets", + "80333498": "gAudioCosineTable", + "80333598": "gPitchBendFrequencyScale", + "80333994": "gNoteFrequencies", + "80333b94": "gDefaultShortNoteVelocityTable", + "80333ba4": "gDefaultShortNoteDurationTable", + "80333bb4": "gVibratoCurve", + "80333bc4": "gDefaultEnvelope", + "80333bd0": "sSineWave", + "80333c50": "sSquareWave", + "80333cd0": "sTriangleWave", + "80333d50": "sSawtoothWave", + "80333dd0": "gWaveSamples", + "80333de0": "gHeadsetPanQuantization", + "80333df4": "gHeadsetPanVolume", + "80333ff4": "gStereoPanVolume", + "803341f4": "gDefaultPanVolume", + "803343f4": "gVolRampingLhs136", + "803345f4": "gVolRampingRhs136", + "803347f4": "gVolRampingLhs144", + "803349f4": "gVolRampingRhs144", + "80334bf4": "gVolRampingLhs128", + "80334df4": "gVolRampingRhs128", + "80334ff4": "gTatumsPerBeat", + "80334ff8": "gUnusedCount80333EE8", + "80334ffc": "gAudioHeapSize", + "80335000": "gAudioInitPoolSize", + "80335004": "gAudioLoadLock", + "80335008": "sUnused8033EF8", + "80335010": "osViModeTable", + "803358f0": "piMgrArgs", + "80335910": "osClockRate", + "80335918": "D_80334808", + "80335920": "_osContInitialized", + "80335930": "D_80334820", + "80335940": "D_80334830", + "80335950": "_spaces", + "80335974": "_zeroes", + "803359a0": "D_80334890", + "803359a4": "D_80334894", + "803359a8": "D_80334898", + "803359ac": "D_8033489C", + "803359b0": "D_803348A0", + "803359b4": "D_803348A4", + "803359c0": "D_803348B0", + "80335a20": "D_80334910", + "80335a24": "D_80334914", + "80335a28": "D_80334918", + "80335a2c": "D_8033491C", + "80335a30": "D_80334920", + "80335a44": "D_80334934", + "80335a48": "D_80334938", + "80335a50": "gOsPiAccessQueueCreated", + "80335a60": "gOsSiAccessQueueCreated", + "80335aa0": "D_80334990", + "80335af0": "D_803349E0", + "80335b40": "D_80334A30", + "80335b44": "D_80334A34", + "80335b48": "D_80334A38", + "80335b50": "D_80334A40", + "80335b54": "D_80334A44", + "80338e60": "jtbl_80337C90", + "80338e84": "jtbl_80337CB4", + "80338eac": "jtbl_80337CDC", + "80338ec0": "jtbl_80337D08", + "80338fbc": "jtbl_80337E04", + "8033978c": "jtbl_80338418", + "80339880": "length_str", + "80339884": "flags_str", + "8033988c": "flags_arr", + "80339980": "D_80338610", + "803399a0": "jtbl_80338630", + "803399d0": "NAN", + "803399e0": "D_80338670", + "80339a40": "D_803386D0", + "80339ac0": "rspF3DDataStart", + "8033a2c0": "rspF3DDataEnd", + "8033a2c0": "rspAspMainDataStart", + "8033a580": "rspAspMainDataEnd", + "8033a580": "_mainSegmentEnd", + "008c0c40": "_mainSegmentRomEnd", + "8033a580": "_mainSegmentNoloadStart", + "8033a580": "D_80339210", + "8033a730": "gIdleThread", + "8033a8e0": "gMainThread", + "8033aa90": "gGameLoopThread", + "8033ac40": "gSoundThread", + "8033adf0": "gPIMesgQueue", + "8033ae08": "gIntrMesgQueue", + "8033ae20": "gSPTaskMesgQueue", + "8033ae38": "gDmaMesgBuf", + "8033ae40": "gPIMesgBuf", + "8033aec0": "gSIEventMesgBuf", + "8033aec8": "gIntrMesgBuf", + "8033af08": "gUnknownMesgBuf", + "8033af48": "gDmaIoMesg", + "8033af5c": "D_80339BEC", + "8033af60": "gDmaMesgQueue", + "8033af78": "gSIEventMesgQueue", + "8033af90": "gControllers", + "8033afe8": "gControllerStatuses", + "8033aff8": "gControllerPads", + "8033b010": "gGameVblankQueue", + "8033b028": "D_80339CB8", + "8033b040": "D_80339CD0", + "8033b044": "D_80339CD4", + "8033b048": "gGameVblankHandler", + "8033b050": "gPhysicalFrameBuffers", + "8033b05c": "gPhysicalZBuffer", + "8033b060": "D_80339CF0", + "8033b064": "D_80339CF4", + "8033b068": "gGfxSPTask", + "8033b06c": "gDisplayListHead", + "8033b070": "gGfxPoolEnd", + "8033b074": "gGfxPool", + "8033b078": "gControllerBits", + "8033b079": "gEepromProbe", + "8033b080": "D_80339D10", + "8033b090": "gDemo", + "8033b0a0": "filler80339D30", + "8033b170": "gMarioStates", + "8033b238": "sCurrPlayMode", + "8033b23a": "D_80339ECA", + "8033b23c": "sTransitionTimer", + "8033b240": "sTransitionUpdate", + "8033b244": "unused3", + "8033b248": "sWarpDest", + "8033b250": "D_80339EE0", + "8033b252": "sDelayedWarpOp", + "8033b254": "sDelayedWarpTimer", + "8033b256": "sSourceWarpNodeId", + "8033b258": "sDelayedWarpArg", + "8033b25c": "unused4", + "8033b25e": "sTimerRunning", + "8033b260": "gHudDisplay", + "8033b26e": "gNeverEnteredCastle", + "8033b270": "sDelayInvincTimer", + "8033b272": "sInvulnerable", + "8033b280": "unused80339F10", + "8033b288": "filler80339F1C", + "8033b2c0": "sFloorAlignMatrix", + "8033b350": "gMirrorMario", + "8033b3b0": "gBodyStates", + "8033b400": "sSegmentTable", + "8033b480": "sPoolFreeSpace", + "8033b484": "sPoolStart", + "8033b488": "sPoolEnd", + "8033b48c": "sPoolListHeadL", + "8033b490": "sPoolListHeadR", + "8033b494": "gEffectsMemoryPool", + "8033b4a0": "gWarpCheckpoint", + "8033b4a5": "gMainMenuDataModified", + "8033b4a6": "gSaveFileModified", + "8033b4b0": "gPlayerSpawnInfos", + "8033b4d0": "D_8033A160", + "8033b8d0": "gAreaData", + "8033bab0": "gWarpTransition", + "8033bac6": "gCurrCourseNum", + "8033bac8": "gCurrActNum", + "8033baca": "gCurrAreaIndex", + "8033bacc": "gSavedCourseNum", + "8033bace": "gPauseScreenMode", + "8033bad0": "gSaveOptSelectIndex", + "8033bae0": "gMatStackIndex", + "8033bae8": "gMatStack", + "8033c2e8": "gMatStackFixed", + "8033c368": "gGeoTempState", + "8033c378": "gCurAnimType", + "8033c379": "gCurAnimEnabled", + "8033c37a": "gCurrAnimFrame", + "8033c37c": "gCurAnimTranslationMultiplier", + "8033c380": "gCurrAnimAttribute", + "8033c384": "gCurAnimData", + "8033c388": "gDisplayListHeap", + "8033c390": "gProfilerFrameData", + "8033c520": "gPlayerCameraState", + "8033c568": "sOldPosition", + "8033c578": "sOldFocus", + "8033c588": "sPlayer2FocusOffset", + "8033c594": "sCreditsPlayer2Pitch", + "8033c596": "sCreditsPlayer2Yaw", + "8033c598": "sFramesPaused", + "8033c5a0": "sFOVState", + "8033c5c0": "sModeTransition", + "8033c5e8": "sMarioGeometry", + "8033c61c": "unusedFreeRoamWallYaw", + "8033c61e": "sAvoidYawVel", + "8033c620": "sCameraYawAfterDoorCutscene", + "8033c622": "unusedSplinePitch", + "8033c624": "unusedSplineYaw", + "8033c628": "sHandheldShakeSpline", + "8033c668": "sHandheldShakeMag", + "8033c66c": "sHandheldShakeTimer", + "8033c670": "sHandheldShakeInc", + "8033c674": "sHandheldShakePitch", + "8033c676": "sHandheldShakeYaw", + "8033c678": "sHandheldShakeRoll", + "8033c67c": "unused8033B30C", + "8033c680": "unused8033B310", + "8033c684": "sSelectionFlags", + "8033c686": "unused8033B316", + "8033c688": "s2ndRotateFlags", + "8033c68a": "unused8033B31A", + "8033c68c": "sCameraSoundFlags", + "8033c68e": "sCButtonsPressed", + "8033c690": "sCutsceneDialogID", + "8033c698": "gLakituState", + "8033c758": "unused8033B3E8", + "8033c75a": "sAreaYaw", + "8033c75c": "sAreaYawChange", + "8033c75e": "sLakituDist", + "8033c760": "sLakituPitch", + "8033c764": "sZoomAmount", + "8033c768": "sCSideButtonYaw", + "8033c76a": "sBehindMarioSoundTimer", + "8033c76c": "sZeroZoomDist", + "8033c770": "sCUpCameraPitch", + "8033c772": "sModeOffsetYaw", + "8033c774": "sSpiralStairsYawOffset", + "8033c776": "s8DirModeBaseYaw", + "8033c778": "s8DirModeYawOffset", + "8033c77c": "sPanDistance", + "8033c780": "sCannonYOffset", + "8033c788": "sModeInfo", + "8033c7d0": "sCastleEntranceOffset", + "8033c7dc": "sParTrackIndex", + "8033c7e0": "sParTrackPath", + "8033c7e8": "sParTrackTransOff", + "8033c808": "sCameraStoreCUp", + "8033c828": "sCameraStoreCutscene", + "8033c848": "gCameraMovementFlags", + "8033c84a": "sStatusFlags", + "8033c850": "sCurCreditsSplinePos", + "8033c950": "sCurCreditsSplineFocus", + "8033ca50": "sCutsceneSplineSegment", + "8033ca54": "sCutsceneSplineSegmentProgress", + "8033ca58": "unused8033B6E8", + "8033ca5a": "sCutsceneShot", + "8033ca5c": "gCutsceneTimer", + "8033ca60": "sCutsceneVars", + "8033cbc8": "gObjCutsceneDone", + "8033cbcc": "gCutsceneObjSpawn", + "8033cbd0": "gCamera", + "8033cbe0": "gObjectListArray", + "8033d260": "gDebugInfoFlags", + "8033d264": "gNumFindFloorMisses", + "8033d268": "unused_8033BEF8", + "8033d26c": "gUnknownWallCount", + "8033d270": "gObjectCounter", + "8033d274": "gNumCalls", + "8033d280": "gDebugInfo", + "8033d380": "gDebugInfoOverwrite", + "8033d480": "gTimeStopState", + "8033d488": "gObjectPool", + "80360e88": "gMacroObjectDefaultParent", + "803610e8": "gObjectLists", + "803610f0": "gFreeObjectList", + "80361158": "gMarioObject", + "8036115c": "gLuigiObject", + "80361160": "gCurrentObject", + "80361164": "gCurBhvCommand", + "80361168": "gPrevFrameObjectCount", + "8036116c": "gSurfaceNodesAllocated", + "80361170": "gSurfacesAllocated", + "80361174": "gNumStaticSurfaceNodes", + "80361178": "gNumStaticSurfaces", + "8036117c": "gObjectMemoryPool", + "80361180": "gCheckingSurfaceCollisionsForCamera", + "80361182": "gFindFloorIncludeSurfaceIntangible", + "80361184": "gEnvironmentRegions", + "80361188": "gEnvironmentLevels", + "803611d8": "gDoorAdjacentRooms", + "80361250": "gMarioCurrentRoom", + "80361252": "D_8035FEE2", + "80361254": "D_8035FEE4", + "80361256": "gTHIWaterDrained", + "80361258": "gTTCSpeedSetting", + "8036125a": "gMarioShotFromCannon", + "8036125c": "gCCMEnteredSlide", + "8036125e": "gNumRoomedObjectsInMarioRoom", + "80361260": "gNumRoomedObjectsNotInMarioRoom", + "80361262": "gWDWWaterLevelChanging", + "80361264": "gMarioOnMerryGoRound", + "80361280": "D_8035FF10", + "80361290": "gDebugPrintState1", + "803612a0": "gDebugPrintState2", + "803612b0": "sMarioOnFlyingCarpet", + "803612b2": "sSurfaceTypeBelowShadow", + "803612b4": "gShadowAboveWaterOrLava", + "803612b5": "gMarioOnIceOrCarpet", + "803612c0": "sSkyBoxInfo", + "803612e0": "gMovetexLastTextureId", + "803612f0": "gFlyingCarpetState", + "80361300": "gPaintingMarioFloorType", + "80361304": "gPaintingMarioXPos", + "80361308": "gPaintingMarioYPos", + "8036130c": "gPaintingMarioZPos", + "80361310": "gPaintingMesh", + "80361314": "gPaintingTriNorms", + "80361318": "gRipplingPainting", + "8036131c": "gDddPaintingStatus", + "80361320": "sTextLabels", + "803613f0": "gDialogColorFadeTimer", + "803613f2": "gLastDialogLineNum", + "803613f4": "gDialogVariable", + "803613f8": "gDialogTextAlpha", + "803613fa": "gCutsceneMsgXOffset", + "803613fc": "gCutsceneMsgYOffset", + "803613fe": "gRedCoinsCollected", + "80361400": "gEnvFxBuffer", + "80361408": "gSnowCylinderLastPos", + "80361414": "gSnowParticleCount", + "80361416": "gSnowParticleMaxCount", + "80361420": "gEnvFxBubbleConfig", + "80361460": "sNumActiveFirePiranhaPlants", + "80361464": "sNumKilledFirePiranhaPlants", + "80361468": "sObjSavedPosX", + "8036146c": "sObjSavedPosY", + "80361470": "sObjSavedPosZ", + "80361474": "sMontyMoleHoleList", + "80361478": "sMontyMoleKillStreak", + "8036147c": "sMontyMoleLastKilledPosX", + "80361480": "sMontyMoleLastKilledPosY", + "80361484": "sMontyMoleLastKilledPosZ", + "80361488": "sMasterTreadmill", + "80361490": "gCurrAiBuffer", + "80361498": "sSoundRequests", + "80361c98": "D_80360928", + "80361f98": "sUsedChannelsForSoundBank", + "80361fa8": "sCurrentSound", + "80361fb8": "gSoundBanks", + "80364b78": "D_80363808", + "80364b82": "D_80363812", + "80364b88": "sBackgroundMusicQueue", + "80364ba0": "D_80363830", + "80364c20": "D_803638B0", + "80365e70": "piMgrThread", + "80366020": "piMgrStack", + "80367020": "__osPiMesgQueue", + "80367038": "piMgrMesgBuff", + "80367040": "D_80365CD0", + "80367050": "_osContCmdBuf", + "8036708c": "_osContPifCtrl", + "80367090": "_osLastSentSiCmd", + "80367091": "_osContNumControllers", + "80367098": "D_80365D28", + "803670b8": "_osContMesgQueue", + "803670d0": "_osContMesgBuff", + "803670f0": "D_80365D80", + "80367110": "_osCurrentTime", + "80367118": "D_80365DA8", + "8036711c": "__osViIntrCount", + "80367120": "D_80365DB0", + "80367130": "osPiMesgBuff", + "80367138": "gOsPiMessageQueue", + "80367150": "osSiMesgBuff", + "80367158": "gOsSiMessageQueue", + "80367170": "D_80365E00", + "803671ac": "D_80365E3C", + "803671b0": "D_80365E40", + "803672b0": "gInterruptedThread", + "80367460": ".", + "80367460": "_mainSegmentNoloadEnd", + "0000cee0": "_mainSegmentNoloadSizeLo", + "00000002": "_mainSegmentNoloadSizeHi", + "00000001": "ASSERT", + "80378800": "_engineSegmentStart", + "007cc6c0": "_engineSegmentRomStart", + "80378800": "vec3f_copy", + "80378840": "vec3f_set", + "8037888c": "vec3f_add", + "803788e4": "vec3f_sum", + "8037893c": "vec3s_copy", + "8037897c": "vec3s_set", + "803789c8": "vec3s_add", + "80378a20": "vec3s_sum", + "80378a78": "vec3s_sub", + "80378ad0": "vec3s_to_vec3f", + "80378b34": "vec3f_to_vec3s", + "80378c50": "find_vector_perpendicular_to_plane", + "80378d38": "vec3f_cross", + "80378dc0": "vec3f_normalize", + "80378e68": "mtxf_copy", + "80378eb4": "mtxf_identity", + "80378f24": "mtxf_translate", + "80378f84": "mtxf_lookat", + "80379440": "mtxf_rotate_zxy_and_translate", + "803795f0": "mtxf_rotate_xyz_and_translate", + "80379798": "mtxf_billboard", + "80379918": "mtxf_align_terrain_normal", + "80379aa4": "mtxf_align_terrain_triangle", + "80379f60": "mtxf_mul", + "8037a29c": "mtxf_scale_vec3f", + "8037a348": "mtxf_mul_vec3s", + "8037a434": "mtxf_to_mtx", + "8037a4b8": "mtxf_rotate_xy", + "8037a550": "get_pos_from_transform_mtx", + "8037a69c": "vec3f_get_dist_and_angle", + "8037a788": "vec3f_set_dist_and_angle", + "8037a860": "approach_s32", + "8037a8b4": "approach_f32", + "8037a9a8": "atan2s", + "8037ab88": "atan2f", + "8037abec": "spline_get_weights", + "8037afb8": "anim_spline_init", + "8037afe8": "anim_spline_poll", + "8037b220": "init_scene_graph_node_links", + "8037b24c": "init_graph_node_root", + "8037b30c": "init_graph_node_ortho_projection", + "8037b380": "init_graph_node_perspective", + "8037b448": "init_graph_node_start", + "8037b4ac": "init_graph_node_master_list", + "8037b530": "init_graph_node_render_range", + "8037b5b4": "init_graph_node_switch_case", + "8037b670": "init_graph_node_camera", + "8037b744": "init_graph_node_translation_rotation", + "8037b7f8": "init_graph_node_translation", + "8037b89c": "init_graph_node_rotation", + "8037b940": "init_graph_node_scale", + "8037b9e0": "init_graph_node_object", + "8037bad4": "init_graph_node_culling_radius", + "8037bb48": "init_graph_node_animated_part", + "8037bbec": "init_graph_node_billboard", + "8037bc90": "init_graph_node_display_list", + "8037bd24": "init_graph_node_shadow", + "8037bdb4": "init_graph_node_object_parent", + "8037be28": "init_graph_node_generated", + "8037becc": "init_graph_node_background", + "8037bf84": "init_graph_node_held_object", + "8037c044": "geo_add_child", + "8037c0bc": "geo_remove_child", + "8037c138": "geo_make_first_child", + "8037c1e4": "geo_call_global_function_nodes_helper", + "8037c360": "geo_call_global_function_nodes", + "8037c3d0": "geo_reset_object_node", + "8037c448": "geo_obj_init", + "8037c51c": "geo_obj_init_spawninfo", + "8037c658": "geo_obj_init_animation", + "8037c708": "geo_obj_init_animation_accel", + "8037c7d8": "retrieve_animation_index", + "8037c844": "geo_update_animation_frame", + "8037c9e8": "geo_retreive_animation_translation", + "8037cb10": "geo_find_root", + "8037cb60": "read_vec3s_to_vec3f", + "8037cbc0": "read_vec3s", + "8037cbfc": "read_vec3s_angle", + "8037cc74": "register_scene_graph_node", + "8037cd60": "geo_layout_cmd_branch_and_link", + "8037ce24": "geo_layout_cmd_end", + "8037cee8": "geo_layout_cmd_branch", + "8037cf70": "geo_layout_cmd_return", + "8037cfc0": "geo_layout_cmd_open_node", + "8037d018": "geo_layout_cmd_close_node", + "8037d050": "geo_layout_cmd_assign_as_view", + "8037d0d0": "geo_layout_cmd_update_node_flags", + "8037d1d0": "geo_layout_cmd_node_root", + "8037d328": "geo_layout_cmd_node_ortho_projection", + "8037d3a4": "geo_layout_cmd_node_perspective", + "8037d48c": "geo_layout_cmd_node_start", + "8037d4dc": "geo_layout_cmd_nop3", + "8037d500": "geo_layout_cmd_node_master_list", + "8037d55c": "geo_layout_cmd_node_level_of_detail", + "8037d5d4": "geo_layout_cmd_node_switch_case", + "8037d640": "geo_layout_cmd_node_camera", + "8037d6f0": "geo_layout_cmd_node_translation_rotation", + "8037d8d4": "geo_layout_cmd_node_translation", + "8037d998": "geo_layout_cmd_node_rotation", + "8037da5c": "geo_layout_cmd_node_scale", + "8037db50": "geo_layout_cmd_nop2", + "8037db74": "geo_layout_cmd_node_animated_part", + "8037dc10": "geo_layout_cmd_node_billboard", + "8037dcd4": "geo_layout_cmd_node_display_list", + "8037dd4c": "geo_layout_cmd_node_shadow", + "8037dddc": "geo_layout_cmd_node_object_parent", + "8037de34": "geo_layout_cmd_node_generated", + "8037de94": "geo_layout_cmd_node_background", + "8037def8": "geo_layout_cmd_nop", + "8037df1c": "geo_layout_cmd_copy_view", + "8037dfd4": "geo_layout_cmd_node_held_obj", + "8037e058": "geo_layout_cmd_node_culling_radius", + "8037e0b4": "process_geo_layout", + "803805c8": "level_script_execute", + "80380de8": "f32_find_wall_collision", + "80380e8c": "find_wall_collisions", + "80381264": "find_ceil", + "80381470": "unused_obj_find_floor_height", + "803814b8": "find_floor_height_and_data", + "80381794": "find_floor_height", + "803817e0": "unused_find_dynamic_floor", + "80381900": "find_floor", + "80381ba0": "find_water_level", + "80381d3c": "find_poison_gas_level", + "80381f08": "debug_surface_list_info", + "80382294": "unused_resolve_floor_or_ceil_collisions", + "80383340": "alloc_surface_pools", + "803833b8": "load_area_terrain", + "803835a4": "clear_dynamic_surfaces", + "80383614": "transform_object_vertices", + "80383828": "load_object_surfaces", + "803839cc": "load_object_collision_model", + "80383bb0": "random_u16", + "80383cb4": "random_float", + "80383d1c": "random_sign", + "80383d68": "obj_update_gfx_pos_and_angle", + "80385bf0": "stub_behavior_script_2", + "80385c00": "cur_obj_update", + "80385f90": "identityMtx", + "80385fb0": "zeroMtx", + "80385fd0": "gVec3fZero", + "80385fdc": "gVec3sZero", + "80385fe4": "gVec3fOne", + "80385ff0": "gVec3sOne", + "80386000": "gSineTable", + "80387000": "gCosineTable", + "8038b000": "gArctanTable", + "8038b810": "GeoLayoutJumpTable", + "8038b894": "unused_8038B894", + "8038bc90": "_engineSegmentEnd", + "007dfb50": "_engineSegmentRomEnd", + "8038bc90": "_engineSegmentNoloadStart", + "8038bc90": "gSplineKeyframe", + "8038bc94": "gSplineKeyframeFraction", + "8038bc98": "gSplineState", + "8038bca0": "gGraphNodePool", + "8038bca4": "gCurRootGraphNode", + "8038bca8": "D_8038BCA8", + "8038bcac": "gGeoViews", + "8038bcb0": "gGeoNumViews", + "8038bcb8": "gGeoLayoutStack", + "8038bcf8": "gCurGraphNodeList", + "8038bd78": "gCurGraphNodeIndex", + "8038bd7a": "gGeoLayoutStackIndex", + "8038bd7c": "D_8038BD7C", + "8038bd7e": "gGeoLayoutReturnIndex", + "8038bd80": "gGeoLayoutCommand", + "8038bd88": "gObjParentGraphNode", + "8038be30": "sFloorGeo", + "8038be90": "unused8038BE90", + "8038be98": "gStaticSurfacePartition", + "8038d698": "gDynamicSurfacePartition", + "8038ee98": "sSurfaceNodePool", + "8038ee9c": "sSurfacePool", + "8038eea0": "sSurfacePoolSize", + "8038eea8": "unused8038EEA8", + "8038eef0": "_engineSegmentNoloadEnd", + "00000001": "ASSERT", + "8038f800": ".", + "8038f800": "_framebuffersSegmentNoloadStart", + "8038f800": "0x70800", + "8038f800": "gFrameBuffer0", + "803b5000": "gFrameBuffer1", + "803da800": "gFrameBuffer2", + "80400000": "_framebuffersSegmentNoloadEnd", + "80400000": "__expansionRamStart", + "00000001": "ASSERT", + "10000000": "_entrySegmentStart", + "007cc6c0": "_entrySegmentRomStart", + "10000000": "level_script_entry", + "10000030": "_entrySegmentEnd", + "007cc6f0": "_entrySegmentRomEnd", + "02000000": "_segment2_mio0SegmentStart", + "007cc6c0": "_segment2_mio0SegmentRomStart", + "0200bd10": ".", + "0200bd10": "_segment2_mio0SegmentEnd", + "007d83d0": "_segment2_mio0SegmentRomEnd", + "04000000": "_group0_mio0SegmentStart", + "007cc6c0": "_group0_mio0SegmentRomStart", + "04013260": ".", + "04013260": "_group0_mio0SegmentEnd", + "007df920": "_group0_mio0SegmentRomEnd", + "17000000": "_group0_geoSegmentStart", + "007cc6c0": "_group0_geoSegmentRomStart", + "17000000": "bubble_geo", + "1700001c": "purple_marble_geo", + "17000038": "smoke_geo", + "17000084": "burn_smoke_geo", + "1700009c": "small_water_splash_geo", + "170000e0": "mario_TODO_geo_0000E0", + "17000124": "idle_water_wave_geo", + "17000168": "wave_trail_geo", + "170001bc": "sparkles_geo", + "17000230": "water_splash_geo", + "17000284": "sparkles_animation_geo", + "170002e0": "mario_geo_face_and_wings", + "1700041c": "mario_geo_left_hand", + "17000494": "mario_geo_right_hand", + "1700053c": "mario_geo_body", + "170006f8": "mario_geo_medium_poly_left_hand", + "17000770": "mario_geo_medium_poly_right_hand", + "17000818": "mario_geo_medium_poly_body", + "170009d4": "mario_geo_low_poly_face_and_wings", + "17000b10": "mario_geo_low_poly_left_hand", + "17000b88": "mario_geo_low_poly_right_hand", + "17000c30": "mario_geo_low_poly_body", + "17000dec": "mario_vanish_geo_face_and_wings", + "17000f28": "mario_vanish_geo_left_hand", + "17000fa0": "mario_vanish_geo_right_hand", + "17001048": "mario_vanish_geo_body", + "17001204": "mario_vanish_geo_medium_poly_left_hand", + "1700127c": "mario_vanish_geo_medium_poly_right_hand", + "17001324": "mario_vanish_geo_medium_poly_body", + "170014e0": "mario_vanish_geo_low_poly_face_and_wings", + "1700161c": "mario_vanish_geo_low_poly_left_hand", + "17001694": "mario_vanish_geo_low_poly_right_hand", + "1700173c": "mario_vanish_geo_low_poly_body", + "170018f8": "mario_metal_geo_face_and_wings", + "170019a4": "mario_metal_geo_left_hand", + "17001a1c": "mario_metal_geo_right_hand", + "17001ac4": "mario_metal_geo_body", + "17001c80": "mario_metal_geo_medium_poly_left_hand", + "17001cf8": "mario_metal_geo_medium_poly_right_hand", + "17001da0": "mario_metal_geo_medium_poly_body", + "17001f5c": "mario_metal_geo_low_poly_face_and_wings", + "17002008": "mario_metal_geo_low_poly_left_hand", + "17002080": "mario_metal_geo_low_poly_right_hand", + "17002128": "mario_metal_geo_low_poly_body", + "170022e4": "mario_metal_vanish_geo_face_and_wings", + "17002390": "mario_metal_vanish_geo_left_hand", + "17002408": "mario_metal_vanish_geo_right_hand", + "170024b0": "mario_metal_vanish_geo_body", + "1700266c": "mario_metal_vanish_geo_medium_poly_left_hand", + "170026e4": "mario_metal_vanish_geo_medium_poly_right_hand", + "1700278c": "mario_metal_vanish_geo_medium_poly_body", + "17002958": "mario_metal_vanish_geo_low_poly_face_and_wings", + "17002a04": "mario_metal_vanish_geo_low_poly_left_hand", + "17002a7c": "mario_metal_vanish_geo_low_poly_right_hand", + "17002b24": "mario_metal_vanish_geo_low_poly_body", + "17002ce0": "mario_geo_load_body", + "17002d14": "mario_geo_load_medium_poly_body", + "17002d48": "mario_geo_load_low_poly_body", + "17002d7c": "mario_geo_render_body", + "17002dd4": "mario_geo", + "17002e30": "_group0_geoSegmentEnd", + "007cf4f0": "_group0_geoSegmentRomEnd", + "05000000": "_group1_mio0SegmentStart", + "007cc6c0": "_group1_mio0SegmentRomStart", + "05008070": ".", + "05008070": "_group1_mio0SegmentEnd", + "007d4730": "_group1_mio0SegmentRomEnd", + "0c000000": "_group1_geoSegmentStart", + "007cc6c0": "_group1_geoSegmentRomStart", + "0c000000": "yellow_sphere_geo", + "0c000018": "hoot_geo", + "0c0001e4": "yoshi_egg_geo", + "0c000248": "thwomp_geo", + "0c000264": "bullet_bill_geo", + "0c00028c": "heave_ho_geo", + "0c000410": "_group1_geoSegmentEnd", + "007ccad0": "_group1_geoSegmentRomEnd", + "05000000": "_group2_mio0SegmentStart", + "007cc6c0": "_group2_mio0SegmentRomStart", + "05001e10": ".", + "05001e10": "_group2_mio0SegmentEnd", + "007ce4d0": "_group2_mio0SegmentRomEnd", + "0c000000": "_group2_geoSegmentStart", + "007cc6c0": "_group2_geoSegmentRomStart", + "0c000000": "bully_geo", + "0c000120": "bully_boss_geo", + "0c000240": "blargg_geo", + "0c0002b0": "_group2_geoSegmentEnd", + "007cc970": "_group2_geoSegmentRomEnd", + "05000000": "_group3_mio0SegmentStart", + "007cc6c0": "_group3_mio0SegmentRomStart", + "050068b0": ".", + "050068b0": "_group3_mio0SegmentEnd", + "007d2f70": "_group3_mio0SegmentRomEnd", + "0c000000": "_group3_geoSegmentStart", + "007cc6c0": "_group3_geoSegmentRomStart", + "0c000000": "king_bobomb_geo", + "0c000308": "water_bomb_geo", + "0c000328": "water_bomb_shadow_geo", + "0c000340": "_group3_geoSegmentEnd", + "007cca00": "_group3_geoSegmentRomEnd", + "05000000": "_group4_mio0SegmentStart", + "007cc6c0": "_group4_mio0SegmentRomStart", + "0500a300": ".", + "0500a300": "_group4_mio0SegmentEnd", + "007d69c0": "_group4_mio0SegmentRomEnd", + "0c000000": "_group4_geoSegmentStart", + "007cc6c0": "_group4_geoSegmentRomStart", + "0c000000": "clam_shell_geo", + "0c000068": "sushi_geo", + "0c00010c": "unagi_geo", + "0c000280": "_group4_geoSegmentEnd", + "007cc940": "_group4_geoSegmentRomEnd", + "05000000": "_group5_mio0SegmentStart", + "007cc6c0": "_group5_mio0SegmentRomStart", + "0500bce0": ".", + "0500bce0": "_group5_mio0SegmentEnd", + "007d83a0": "_group5_mio0SegmentRomEnd", + "0c000000": "_group5_geoSegmentStart", + "007cc6c0": "_group5_geoSegmentRomStart", + "0c000000": "klepto_geo", + "0c0002ac": "eyerok_geo_0002AC", + "0c0005a8": "eyerok_left_hand_geo", + "0c0005e4": "eyerok_right_hand_geo", + "0c000610": "pokey_head_geo", + "0c000644": "pokey_body_part_geo", + "0c000660": "_group5_geoSegmentEnd", + "007ccd20": "_group5_geoSegmentRomEnd", + "05000000": "_group6_mio0SegmentStart", + "007cc6c0": "_group6_mio0SegmentRomStart", + "0500e110": ".", + "0500e110": "_group6_mio0SegmentEnd", + "007da7d0": "_group6_mio0SegmentRomEnd", + "0c000000": "_group6_geoSegmentStart", + "007cc6c0": "_group6_geoSegmentRomStart", + "0c000000": "monty_mole_geo", + "0c000110": "ukiki_geo", + "0c00036c": "fwoosh_geo", + "0c000390": "_group6_geoSegmentEnd", + "007cca50": "_group6_geoSegmentRomEnd", + "05000000": "_group7_mio0SegmentStart", + "007cc6c0": "_group7_mio0SegmentRomStart", + "05005070": ".", + "05005070": "_group7_mio0SegmentEnd", + "007d1730": "_group7_mio0SegmentRomEnd", + "0c000000": "_group7_geoSegmentStart", + "007cc6c0": "_group7_geoSegmentRomStart", + "0c000000": "spindrift_geo", + "0c000104": "penguin_geo", + "0c00021c": "mr_blizzard_hidden_geo", + "0c000348": "mr_blizzard_geo", + "0c000370": "_group7_geoSegmentEnd", + "007cca30": "_group7_geoSegmentRomEnd", + "05000000": "_group8_mio0SegmentStart", + "007cc6c0": "_group8_mio0SegmentRomStart", + "05001180": ".", + "05001180": "_group8_mio0SegmentEnd", + "007cd840": "_group8_mio0SegmentRomEnd", + "0c000000": "_group8_geoSegmentStart", + "007cc6c0": "_group8_geoSegmentRomStart", + "0c000000": "springboard_top_geo", + "0c000018": "springboard_spring_geo", + "0c000030": "springboard_bottom_geo", + "0c000048": "cap_switch_geo", + "0c000090": "_group8_geoSegmentEnd", + "007cc750": "_group8_geoSegmentRomEnd", + "05000000": "_group9_mio0SegmentStart", + "007cc6c0": "_group9_mio0SegmentRomStart", + "05006960": ".", + "05006960": "_group9_mio0SegmentEnd", + "007d3020": "_group9_mio0SegmentRomEnd", + "0c000000": "_group9_geoSegmentStart", + "007cc6c0": "_group9_geoSegmentRomStart", + "0c000000": "bookend_part_geo", + "0c0000c0": "bookend_geo", + "0c0000d8": "haunted_chair_geo", + "0c000188": "small_key_geo", + "0c0001b4": "mad_piano_geo", + "0c000224": "boo_geo", + "0c000274": "haunted_cage_geo", + "0c0002b0": "_group9_geoSegmentEnd", + "007cc970": "_group9_geoSegmentRomEnd", + "05000000": "_group10_mio0SegmentStart", + "007cc6c0": "_group10_mio0SegmentRomStart", + "05012cd0": ".", + "05012cd0": "_group10_mio0SegmentEnd", + "007df390": "_group10_mio0SegmentRomEnd", + "0c000000": "_group10_geoSegmentStart", + "007cc6c0": "_group10_geoSegmentRomStart", + "0c000000": "birds_geo", + "0c000098": "peach_geo_000098", + "0c000254": "peach_geo_000254", + "0c000410": "peach_geo", + "0c000468": "yoshi_geo", + "0c000670": "_group10_geoSegmentEnd", + "007ccd30": "_group10_geoSegmentRomEnd", + "05000000": "_group11_mio0SegmentStart", + "007cc6c0": "_group11_mio0SegmentRomStart", + "050073f0": ".", + "050073f0": "_group11_mio0SegmentEnd", + "007d3ab0": "_group11_mio0SegmentRomEnd", + "0c000000": "_group11_geoSegmentStart", + "007cc6c0": "_group11_geoSegmentRomStart", + "0c000000": "bubba_geo", + "0c000030": "wiggler_head_geo", + "0c0001bc": "enemy_lakitu_geo", + "0c000290": "spiny_ball_geo", + "0c000328": "spiny_geo", + "0c0004a0": "_group11_geoSegmentEnd", + "007ccb60": "_group11_geoSegmentRomEnd", + "06000000": "_group12_mio0SegmentStart", + "007cc6c0": "_group12_mio0SegmentRomStart", + "06030c30": ".", + "06030c30": "_group12_mio0SegmentEnd", + "007fd2f0": "_group12_mio0SegmentRomEnd", + "0d000000": "_group12_geoSegmentStart", + "007cc6c0": "_group12_geoSegmentRomStart", + "0d000000": "bowser_flames_geo", + "0d000090": "invisible_bowser_accessory_geo", + "0d0000b0": "bowser_1_yellow_sphere_geo", + "0d0000d8": "bowser_geo_0000D8", + "0d000424": "bowser_geo_000424", + "0d000770": "bowser_geo_000770", + "0d000ab8": "bowser_shadow_geo", + "0d000ac4": "bowser_geo", + "0d000b40": "bowser2_geo", + "0d000bbc": "bowser_bomb_geo", + "0d000bfc": "bowser_impact_smoke_geo", + "0d000c50": "_group12_geoSegmentEnd", + "007cd310": "_group12_geoSegmentRomEnd", + "06000000": "_group13_mio0SegmentStart", + "007cc6c0": "_group13_mio0SegmentRomStart", + "0600a0f0": ".", + "0600a0f0": "_group13_mio0SegmentEnd", + "007d67b0": "_group13_mio0SegmentRomEnd", + "0d000000": "_group13_geoSegmentStart", + "007cc6c0": "_group13_geoSegmentRomStart", + "0d000000": "skeeter_geo", + "0d000284": "seaweed_geo", + "0d0002f4": "water_mine_geo", + "0d000324": "cyan_fish_geo", + "0d00038c": "bub_geo", + "0d000414": "water_ring_geo", + "0d000450": "treasure_chest_base_geo", + "0d000468": "treasure_chest_lid_geo", + "0d000480": "_group13_geoSegmentEnd", + "007ccb40": "_group13_geoSegmentRomEnd", + "06000000": "_group14_mio0SegmentStart", + "007cc6c0": "_group14_mio0SegmentRomStart", + "06013a60": ".", + "06013a60": "_group14_mio0SegmentEnd", + "007e0120": "_group14_mio0SegmentRomEnd", + "0d000000": "_group14_geoSegmentStart", + "007cc6c0": "_group14_geoSegmentRomStart", + "0d000000": "koopa_flag_geo", + "0d0000b8": "wooden_post_geo", + "0d0000d0": "koopa_without_shell_geo", + "0d000214": "koopa_with_shell_geo", + "0d000358": "piranha_plant_geo", + "0d000480": "whomp_geo", + "0d0005d0": "metallic_ball_geo", + "0d0005ec": "chain_chomp_geo", + "0d000680": "_group14_geoSegmentEnd", + "007ccd40": "_group14_geoSegmentRomEnd", + "06000000": "_group15_mio0SegmentStart", + "007cc6c0": "_group15_mio0SegmentRomStart", + "0600c8e0": ".", + "0600c8e0": "_group15_mio0SegmentEnd", + "007d8fa0": "_group15_mio0SegmentRomEnd", + "0d000000": "_group15_geoSegmentStart", + "007cc6c0": "_group15_geoSegmentRomStart", + "0d000000": "lakitu_geo", + "0d000114": "toad_geo_000114", + "0d00027c": "toad_geo_00027C", + "0d0003e4": "toad_geo", + "0d000448": "mips_geo", + "0d0005b0": "boo_castle_geo", + "0d000600": "_group15_geoSegmentEnd", + "007cccc0": "_group15_geoSegmentRomEnd", + "06000000": "_group16_mio0SegmentStart", + "007cc6c0": "_group16_mio0SegmentRomStart", + "06002ba0": ".", + "06002ba0": "_group16_mio0SegmentEnd", + "007cf260": "_group16_mio0SegmentRomEnd", + "0d000000": "_group16_geoSegmentStart", + "007cc6c0": "_group16_geoSegmentRomStart", + "0d000000": "moneybag_geo_000000", + "0d000078": "moneybag_geo_000078", + "0d0000f0": "moneybag_geo", + "0d000150": "_group16_geoSegmentEnd", + "007cc810": "_group16_geoSegmentRomEnd", + "06000000": "_group17_mio0SegmentStart", + "007cc6c0": "_group17_mio0SegmentRomStart", + "06009c50": ".", + "06009c50": "_group17_mio0SegmentEnd", + "007d6310": "_group17_mio0SegmentRomEnd", + "0d000000": "_group17_geoSegmentStart", + "007cc6c0": "_group17_geoSegmentRomStart", + "0d000000": "mr_i_geo", + "0d00001c": "mr_i_iris_geo", + "0d0000dc": "swoop_geo", + "0d0001a0": "snufit_geo", + "0d000230": "dorrie_geo", + "0d000394": "scuttlebug_geo", + "0d0006d0": "_group17_geoSegmentEnd", + "007ccd90": "_group17_geoSegmentRomEnd", + "08000000": "_common0_mio0SegmentStart", + "007cc6c0": "_common0_mio0SegmentRomStart", + "0800e6d0": ".", + "0800e6d0": "_common0_mio0SegmentEnd", + "007dad90": "_common0_mio0SegmentRomEnd", + "0f000000": "_common0_geoSegmentStart", + "007cc6c0": "_common0_geoSegmentRomStart", + "0f000000": "blue_coin_switch_geo", + "0f000020": "test_platform_geo", + "0f000028": "amp_geo", + "0f0001a8": "cannon_base_geo", + "0f0001c0": "cannon_barrel_geo", + "0f0001d8": "chuckya_geo", + "0f0004cc": "purple_switch_geo", + "0f0004e4": "checkerboard_platform_geo", + "0f0004fc": "heart_geo", + "0f000518": "flyguy_geo", + "0f0005d0": "breakable_box_geo", + "0f000610": "breakable_box_small_geo", + "0f000640": "bowling_ball_geo", + "0f00066c": "bowling_ball_track_geo", + "0f000694": "exclamation_box_geo", + "0f0006e4": "goomba_geo", + "0f0007b8": "black_bobomb_geo", + "0f0008f4": "bobomb_buddy_geo", + "0f000a30": "metal_box_geo", + "0f000a58": "exclamation_box_outline_geo", + "0f000ab0": "koopa_shell_geo", + "0f000adc": "koopa_shell2_geo", + "0f000b08": "koopa_shell3_geo", + "0f000b40": "_common0_geoSegmentEnd", + "007cd200": "_common0_geoSegmentRomEnd", + "03000000": "_common1_mio0SegmentStart", + "007cc6c0": "_common1_mio0SegmentRomStart", + "03017990": ".", + "03017990": "_common1_mio0SegmentEnd", + "007e4050": "_common1_mio0SegmentRomEnd", + "16000000": "_common1_geoSegmentStart", + "007cc6c0": "_common1_geoSegmentRomStart", + "16000000": "mist_geo", + "16000020": "white_puff_geo", + "16000040": "explosion_geo", + "160000a8": "butterfly_geo", + "1600013c": "yellow_coin_geo", + "160001a0": "yellow_coin_no_shadow_geo", + "16000200": "blue_coin_geo", + "16000264": "blue_coin_no_shadow_geo", + "160002c4": "red_coin_geo", + "16000328": "red_coin_no_shadow_geo", + "16000388": "warp_pipe_geo", + "160003a8": "castle_door_geo", + "1600043c": "cabin_door_geo", + "160004d0": "wooden_door_geo", + "16000564": "wooden_door2_geo", + "160005f8": "metal_door_geo", + "1600068c": "hazy_maze_door_geo", + "16000720": "haunted_door_geo", + "160007b4": "castle_door_0_star_geo", + "16000868": "castle_door_1_star_geo", + "1600091c": "castle_door_3_stars_geo", + "160009d0": "key_door_geo", + "16000a84": "bowser_key_geo", + "16000ab0": "bowser_key_cutscene_geo", + "16000b10": "red_flame_shadow_geo", + "16000b2c": "red_flame_geo", + "16000b8c": "blue_flame_geo", + "16000bec": "fish_shadow_geo", + "16000c44": "fish_geo", + "16000c8c": "leaves_geo", + "16000ca4": "marios_cap_geo", + "16000cf0": "marios_metal_cap_geo", + "16000d3c": "marios_wing_cap_geo", + "16000da8": "marios_winged_metal_cap_geo", + "16000e14": "number_geo", + "16000e84": "mushroom_1up_geo", + "16000ea0": "star_geo", + "16000ed4": "dirt_animation_geo", + "16000f24": "cartoon_star_geo", + "16000f6c": "transparent_star_geo", + "16000f98": "white_particle_geo", + "16000fb4": "wooden_signpost_geo", + "16000fe8": "bubbly_tree_geo", + "16001000": "spiky_tree_geo", + "16001018": "snow_tree_geo", + "16001030": "spiky_tree1_geo", + "16001048": "palm_tree_geo", + "16001060": "_common1_geoSegmentEnd", + "007cd720": "_common1_geoSegmentRomEnd", + "13000000": "_behaviorSegmentStart", + "007cc6c0": "_behaviorSegmentRomStart", + "13000000": "bhvStarDoor", + "13000054": "bhvMrI", + "1300008c": "bhvMrIBody", + "130000ac": "bhvMrIParticle", + "130000f8": "bhvPurpleParticle", + "13000118": "bhvGiantPole", + "13000144": "bhvPoleGrabbing", + "13000174": "bhvThiHugeIslandTop", + "13000194": "bhvThiTinyIslandTop", + "130001ac": "bhvCapSwitchBase", + "130001cc": "bhvCapSwitch", + "130001f4": "bhvKingBobomb", + "13000254": "bhvBobombAnchorMario", + "13000278": "bhvBetaChestBottom", + "1300029c": "bhvBetaChestLid", + "130002b8": "bhvBubbleParticleSpawner", + "130002e4": "bhvBubbleMaybe", + "13000338": "bhvSmallWaterWave", + "13000398": "bhvSmallWaterWave398", + "130003bc": "bhvWaterAirBubble", + "13000400": "bhvSmallParticle", + "13000428": "bhvPlungeBubble", + "13000444": "bhvSmallParticleSnow", + "1300046c": "bhvSmallParticleBubbles", + "13000494": "bhvFishGroup", + "130004a8": "bhvCannon", + "130004e4": "bhvCannonBarrel", + "13000500": "bhvCannonBaseUnused", + "13000528": "bhvChuckya", + "13000584": "bhvChuckyaAnchorMario", + "130005a8": "bhvUnused05A8", + "130005b4": "bhvRotatingPlatform", + "130005d8": "bhvTower", + "13000600": "bhvBulletBillCannon", + "13000624": "bhvWfBreakableWallRight", + "13000638": "bhvWfBreakableWallLeft", + "1300066c": "bhvKickableBoard", + "130006a4": "bhvTowerDoor", + "130006d8": "bhvRotatingCounterClockwise", + "130006e0": "bhvWfRotatingWoodenPlatform", + "13000708": "bhvKoopaShellUnderwater", + "13000720": "bhvExitPodiumWarp", + "1300075c": "bhvFadingWarp", + "13000780": "bhvWarp", + "130007a0": "bhvWarpPipe", + "130007dc": "bhvWhitePuffExplosion", + "130007f8": "bhvSpawnedStar", + "1300080c": "bhvSpawnedStarNoLevelExit", + "13000830": "bhvMrIBlueCoin", + "13000888": "bhvCoinInsideBoo", + "130008d0": "bhvCoinFormationSpawn", + "130008ec": "bhvCoinFormation", + "1300090c": "bhvOneCoin", + "1300091c": "bhvYellowCoin", + "13000940": "bhvTemporaryYellowCoin", + "13000964": "bhvThreeCoinsSpawn", + "13000984": "bhvTenCoinsSpawn", + "130009a4": "bhvSingleCoinGetsSpawned", + "130009e0": "bhvCoinSparkles", + "13000a14": "bhvGoldenCoinSparkles", + "13000a34": "bhvWallTinyStarParticle", + "13000a54": "bhvVertStarParticleSpawner", + "13000a78": "bhvPoundTinyStarParticle", + "13000a98": "bhvHorStarParticleSpawner", + "13000abc": "bhvPunchTinyTriangle", + "13000ad8": "bhvTriangleParticleSpawner", + "13000afc": "bhvDoorWarp", + "13000b0c": "bhvDoor", + "13000b58": "bhvGrindel", + "13000b8c": "bhvThwomp2", + "13000bc8": "bhvThwomp", + "13000c04": "bhvTumblingBridgePlatform", + "13000c28": "bhvWfTumblingBridge", + "13000c44": "bhvBbhTumblingBridge", + "13000c64": "bhvLllTumblingBridge", + "13000c84": "bhvFlame", + "13000cc8": "bhvAnotherElavator", + "13000cfc": "bhvRrElevatorPlatform", + "13000d30": "bhvHmcElevatorPlatform", + "13000d6c": "bhvWaterMist", + "13000d98": "bhvBreathParticleSpawner", + "13000db4": "bhvBreakBoxTriangle", + "13000dd8": "bhvWaterMist2", + "13000dfc": "bhvUnused0DFC", + "13000e24": "bhvMistCircParticleSpawner", + "13000e3c": "bhvDirtParticleSpawner", + "13000e58": "bhvSnowParticleSpawner", + "13000e70": "bhvWind", + "13000e88": "bhvEndToad", + "13000eac": "bhvEndPeach", + "13000ed0": "bhvUnusedParticleSpawn", + "13000f08": "bhvUkiki", + "13000f14": "bhvUkikiCageChild", + "13000f2c": "bhvUkikiCageStar", + "13000f48": "bhvUkikiCage", + "13000f9c": "bhvBitfsSinkingPlatforms", + "13000fc8": "bhvBitfsSinkingCagePlatform", + "13001000": "bhvDddMovingPole", + "13001030": "bhvBitfsTiltingInvertedPyramid", + "13001064": "bhvSquishablePlatform", + "13001098": "bhvCutOutObject", + "130010a8": "bhvBetaMovingFlamesSpawn", + "130010b8": "bhvBetaMovingFlames", + "130010d8": "bhvRrRotatingBridgePlatform", + "13001108": "bhvFlamethrower", + "13001124": "bhvFlamethrowerFlame", + "13001168": "bhvBouncingFireball", + "13001184": "bhvBouncingFireballFlame", + "130011d0": "bhvBowserShockWave", + "130011ec": "bhvFireParticleSpawner", + "13001214": "bhvBlackSmokeMario", + "13001254": "bhvBlackSmokeBowser", + "1300127c": "bhvBlackSmokeUpward", + "13001298": "bhvBetaFishSplashSpawner", + "130012b4": "bhvSpindrift", + "130012f4": "bhvTowerPlatformGroup", + "13001318": "bhvWfSlidingTowerPlatform", + "13001340": "bhvWfElevatorTowerPlatform", + "13001368": "bhvWfSolidTowerPlatform", + "13001390": "bhvLeafParticleSpawner", + "130013a8": "bhvTreeSnow", + "130013c4": "bhvTreeLeaf", + "130013dc": "bhvAnotherTiltingPlatform", + "13001408": "bhvSquarishPathMoving", + "1300142c": "bhvPiranhaPlantBubble", + "13001448": "bhvPiranhaPlantWakingBubbles", + "13001468": "bhvFloorSwitchAnimatesObject", + "13001478": "bhvFloorSwitchGrills", + "13001484": "bhvFloorSwitchHardcodedModel", + "130014ac": "bhvFloorSwitchHiddenObjects", + "130014bc": "bhvHiddenObject", + "130014e0": "bhvBreakableBox", + "13001518": "bhvPushableMetalBox", + "13001548": "bhvHeaveHo", + "130015a4": "bhvHeaveHoThrowMario", + "130015c0": "bhvCcmTouchedStarSpawn", + "130015e4": "bhvUnusedPoundablePlatform", + "13001608": "bhvBetaTrampolineTop", + "13001634": "bhvBetaTrampolineSpring", + "13001650": "bhvJumpingBox", + "1300167c": "bhvBooCage", + "130016ac": "bhvStub", + "130016b8": "bhvIgloo", + "130016e4": "bhvBowserKey", + "13001714": "bhvGrandStar", + "13001744": "bhvBetaBooKey", + "13001778": "bhvAlphaBooKey", + "1300179c": "bhvBulletBill", + "130017f4": "bhvWhitePuffSmoke", + "13001820": "bhvUnused1820", + "13001828": "bhvBowserTailAnchor", + "13001850": "bhvBowser", + "130018cc": "bhvBowserBodyAnchor", + "13001904": "bhvBowserFlameSpawn", + "13001920": "bhvTiltingBowserLavaPlatform", + "13001958": "bhvFallingBowserPlatform", + "13001984": "bhvBlueBowserFlame", + "130019c8": "bhvFlameFloatingLanding", + "13001a0c": "bhvBlueFlamesGroup", + "13001a30": "bhvFlameBouncing", + "13001a74": "bhvFlameMovingForwardGrowing", + "13001aa4": "bhvFlameBowser", + "13001ae8": "bhvFlameLargeBurningOut", + "13001b2c": "bhvBlueFish", + "13001b54": "bhvTankFishGroup", + "13001b70": "bhvCheckerboardElevatorGroup", + "13001b88": "bhvCheckerboardPlatformSub", + "13001bb4": "bhvBowserKeyUnlockDoor", + "13001bd4": "bhvBowserKeyCourseExit", + "13001bf4": "bhvInvisibleObjectsUnderBridge", + "13001c04": "bhvWaterLevelPillar", + "13001c34": "bhvDddWarp", + "13001c58": "bhvMoatGrills", + "13001c7c": "bhvClockMinuteHand", + "13001c8c": "bhvClockHourHand", + "13001cb0": "bhvMacroUkiki", + "13001d0c": "bhvStub1D0C", + "13001d14": "bhvLllRotatingHexagonalPlatform", + "13001d40": "bhvLllSinkingRockBlock", + "13001d70": "bhvStub1D70", + "13001d78": "bhvLllMovingOctagonalMeshPlatform", + "13001da4": "bhvSnowBall", + "13001da8": "bhvLllRotatingBlockWithFireBars", + "13001dcc": "bhvLllRotatingHexFlame", + "13001e04": "bhvLllWoodPiece", + "13001e30": "bhvLllFloatingWoodBridge", + "13001e4c": "bhvVolcanoFlames", + "13001e6c": "bhvLllRotatingHexagonalRing", + "13001e94": "bhvLllSinkingRectangularPlatform", + "13001ec4": "bhvLllSinkingSquarePlatforms", + "13001ef8": "bhvLllTiltingInvertedPyramid", + "13001f30": "bhvUnused1F30", + "13001f3c": "bhvKoopaShell", + "13001f68": "bhvKoopaShellFlame", + "13001f90": "bhvToxBox", + "13001fbc": "bhvPiranhaPlant", + "13002018": "bhvLllHexagonalMesh", + "13002038": "bhvLllBowserPuzzlePiece", + "13002068": "bhvLllBowserPuzzle", + "13002088": "bhvTuxiesMother", + "130020d8": "bhvPenguinBaby", + "130020e0": "bhvUnused20E0", + "130020e8": "bhvSmallPenguin", + "1300213c": "bhvFish2", + "1300214c": "bhvFish3", + "1300215c": "bhvLargeFishGroup", + "13002178": "bhvFish", + "13002194": "bhvWdwExpressElevator", + "130021c0": "bhvWdwExpressElevatorPlatform", + "130021e4": "bhvChirpChirp", + "130021f4": "bhvChirpChirpUnused", + "1300220c": "bhvBub", + "13002250": "bhvExclamationBox", + "1300227c": "bhvRotatingExclamationMark", + "1300229c": "bhvSoundSpawner", + "130022b8": "bhvRockSolid", + "130022d8": "bhvBowserSubDoor", + "13002308": "bhvBowsersSub", + "13002338": "bhvSushiShark", + "13002388": "bhvSushiSharkCollisionChild", + "130023a4": "bhvJrbSlidingBox", + "130023d0": "bhvShipPart3", + "130023ec": "bhvInSunkenShip3", + "1300241c": "bhvSunkenShipPart", + "1300243c": "bhvSunkenShipSetRotation", + "1300244c": "bhvSunkenShipPart2", + "1300246c": "bhvInSunkenShip", + "13002480": "bhvInSunkenShip2", + "130024ac": "bhvMistParticleSpawner", + "130024dc": "bhvWhitePuff1", + "13002500": "bhvWhitePuff2", + "13002528": "bhvWhitePuffSmoke2", + "13002558": "bhvPurpleSwitchHiddenBoxes", + "13002568": "bhvBlueCoinSwitch", + "13002588": "bhvHiddenBlueCoin", + "130025c0": "bhvOpenableCageDoor", + "130025e0": "bhvOpenableGrill", + "130025f8": "bhvWaterLevelDiamond", + "13002620": "bhvInitializeChangingWaterLevel", + "13002634": "bhvTweesterSandParticle", + "13002650": "bhvTweester", + "13002684": "bhvMerryGoRoundBooManager", + "1300269c": "bhvAnimatedTexture", + "130026d4": "bhvBooInCastle", + "13002710": "bhvBooWithCage", + "13002768": "bhvBalconyBigBoo", + "1300277c": "bhvMerryGoRoundBigBoo", + "13002790": "bhvGhostHuntBigBoo", + "130027d0": "bhvCourtyardBooTriplet", + "130027e4": "bhvBoo", + "130027f4": "bhvMerryGoRoundBoo", + "13002804": "bhvGhostHuntBoo", + "1300286c": "bhvHiddenStaircaseStep", + "13002898": "bhvBooBossSpawnedBridge", + "130028cc": "bhvBbhTiltingTrapPlatform", + "130028fc": "bhvHauntedBookshelf", + "1300292c": "bhvMeshElevator", + "13002968": "bhvMerryGoRound", + "13002998": "bhvPlaysMusicTrackWhenTouched", + "130029b0": "bhvInsideCannon", + "130029b4": "bhvBetaBowserAnchor", + "130029e4": "bhvStaticCheckeredPlatform", + "13002a10": "bhvUnused2A10", + "13002a20": "bhvUnusedFakeStar", + "13002a48": "bhvStaticObject", + "13002a54": "bhvUnused2A54", + "13002a5c": "bhvCastleFloorTrap", + "13002a7c": "bhvFloorTrapInCastle", + "13002aa4": "bhvTree", + "13002ad0": "bhvSparkle", + "13002af0": "bhvSparkleSpawn", + "13002b08": "bhvSparkleParticleSpawner", + "13002b5c": "bhvScuttlebug", + "13002ba0": "bhvScuttlebugSpawn", + "13002bb8": "bhvWhompKingBoss", + "13002bcc": "bhvSmallWhomp", + "13002c14": "bhvWaterSplash", + "13002c60": "bhvWaterDroplet", + "13002c7c": "bhvWaterDropletSplash", + "13002cb0": "bhvBubbleSplash", + "13002ce0": "bhvIdleWaterWave", + "13002d28": "bhvObjectWaterSplash", + "13002d50": "bhvShallowWaterWave", + "13002d7c": "bhvShallowWaterSplash", + "13002db0": "bhvObjectWaveTrail", + "13002dc0": "bhvWaveTrail", + "13002e04": "bhvTinyStrongWindParticle", + "13002e20": "bhvStrongWindParticle", + "13002e3c": "bhvSLSnowmanWind", + "13002e58": "bhvSLWalkingPenguin", + "13002ea8": "bhvYellowBall", + "13002ec0": "bhvMario", + "13002ef8": "bhvToadMessage", + "13002f40": "bhvUnlockDoorStar", + "13002f60": "bhvInstantActiveWarp", + "13002f64": "bhvAirborneWarp", + "13002f68": "bhvHardAirKnockBackWarp", + "13002f6c": "bhvSpinAirborneCircleWarp", + "13002f70": "bhvDeathWarp", + "13002f74": "bhvSpinAirborneWarp", + "13002f78": "bhvFlyingWarp", + "13002f7c": "bhvPaintingStarCollectWarp", + "13002f80": "bhvPaintingDeathWarp", + "13002f84": "bhvAirborneDeathWarp", + "13002f88": "bhvAirborneStarCollectWarp", + "13002f8c": "bhvLaunchStarCollectWarp", + "13002f90": "bhvLaunchDeathWarp", + "13002f94": "bhvSwimmingWarp", + "13002fa0": "bhvRandomAnimatedTexture", + "13002fc0": "bhvYellowBackgroundInMenu", + "13002fe4": "bhvMenuButton", + "13003008": "bhvMenuButtonManager", + "1300302c": "bhvActSelectorStarType", + "13003048": "bhvActSelector", + "13003068": "bhvMovingYellowCoin", + "130030a4": "bhvMovingBlueCoin", + "130030d4": "bhvBlueCoinSliding", + "13003104": "bhvBlueCoinJumping", + "13003134": "bhvSeaweed", + "13003158": "bhvSeaweedBundle", + "13003174": "bhvBobomb", + "130031ac": "bhvBobombFuseSmoke", + "130031dc": "bhvBobombBuddy", + "13003228": "bhvBobombBuddyOpensCannon", + "13003274": "bhvCannonClosed", + "130032a8": "bhvWhirlpool", + "130032c8": "bhvJetStream", + "130032e0": "bhvMessagePanel", + "13003324": "bhvSignOnWall", + "13003354": "bhvHomingAmp", + "13003388": "bhvCirclingAmp", + "130033bc": "bhvButterfly", + "130033ec": "bhvHoot", + "13003420": "bhvBetaHoldableObject", + "13003454": "bhvCarrySomething1", + "1300345c": "bhvCarrySomething2", + "13003464": "bhvCarrySomething3", + "1300346c": "bhvCarrySomething4", + "13003474": "bhvCarrySomething5", + "1300347c": "bhvCarrySomething6", + "13003484": "bhvObjectBubble", + "130034c4": "bhvObjectWaterWave", + "13003510": "bhvExplosion", + "13003558": "bhvBobombBullyDeathSmoke", + "13003588": "bhvSmoke", + "130035b0": "bhvBobombExplosionBubble", + "13003600": "bhvBobombExplosionBubble3600", + "13003614": "bhvRespawner", + "1300362c": "bhvSmallBully", + "13003660": "bhvBigBully", + "13003694": "bhvBigBullyWithMinions", + "130036c8": "bhvSmallChillBully", + "13003700": "bhvBigChillBully", + "13003738": "bhvJetStreamRingSpawner", + "13003750": "bhvJetStreamWaterRing", + "13003798": "bhvMantaRayWaterRing", + "130037e0": "bhvMantaRayRingManager", + "130037ec": "bhvBowserBomb", + "1300381c": "bhvBowserBombExplosion", + "13003840": "bhvBowserBombSmoke", + "13003868": "bhvCelebrationStar", + "13003888": "bhvCelebrationStarSparkle", + "130038b0": "bhvStarKeyCollectionPuffSpawner", + "130038d0": "bhvLllDrawbridgeSpawner", + "130038e8": "bhvLllDrawbridge", + "13003910": "bhvSmallBomp", + "13003940": "bhvLargeBomp", + "13003970": "bhvWfSlidingPlatform", + "130039a0": "bhvMoneybag", + "130039d4": "bhvMoneybagHidden", + "13003a08": "bhvPitBowlingBall", + "13003a30": "bhvFreeBowlingBall", + "13003a58": "bhvBowlingBall", + "13003a80": "bhvTtmBowlingBallSpawner", + "13003aa4": "bhvBobBowlingBallSpawner", + "13003ac8": "bhvThiBowlingBallSpawner", + "13003ae0": "bhvRrCruiserWing", + "13003b00": "bhvSpindel", + "13003b30": "bhvSslMovingPyramidWall", + "13003b60": "bhvPyramidElevator", + "13003b98": "bhvPyramidElevatorTrajectoryMarkerBall", + "13003bb4": "bhvPyramidTop", + "13003bec": "bhvPyramidTopFragment", + "13003c0c": "bhvPyramidPillarTouchDetector", + "13003c30": "bhvWaterfallSoundLoop", + "13003c44": "bhvVolcanoSoundLoop", + "13003c58": "bhvCastleFlagWaving", + "13003c7c": "bhvBirdsSoundLoop", + "13003c90": "bhvAmbientSounds", + "13003ca4": "bhvSandSoundLoop", + "13003cb8": "bhvHiddenAt120Stars", + "13003ce4": "bhvSnowmansBottom", + "13003d0c": "bhvSnowmansHead", + "13003d34": "bhvSnowmansBodyCheckpoint", + "13003d4c": "bhvBigSnowmanWhole", + "13003d74": "bhvBigBoulder", + "13003da0": "bhvBigBoulderGenerator", + "13003db8": "bhvWingCap", + "13003dd8": "bhvMetalCap", + "13003df8": "bhvNormalCap", + "13003e1c": "bhvVanishCap", + "13003e3c": "bhvStar", + "13003e64": "bhvStarSpawnCoordinates", + "13003e8c": "bhvHiddenRedCoinStar", + "13003eac": "bhvRedCoin", + "13003ee4": "bhvBowserCourseRedCoinStar", + "13003efc": "bhvHiddenStar", + "13003f1c": "bhvHiddenStarTrigger", + "13003f40": "bhvTtmRollingLog", + "13003f78": "bhvLllVolcanoFallingTrap", + "13003fa4": "bhvLllRollingLog", + "13003fdc": "bhv1upWalking", + "13004010": "bhv1upRunningAway", + "13004044": "bhv1upSliding", + "1300407c": "bhv1Up", + "130040b4": "bhv1upJumpOnApproach", + "130040ec": "bhvHidden1up", + "13004124": "bhvHidden1upTrigger", + "13004148": "bhvHidden1upInPole", + "13004180": "bhvHidden1upInPoleTrigger", + "130041a4": "bhvHidden1upInPoleSpawner", + "130041bc": "bhvControllablePlatform", + "130041f0": "bhvControllablePlatformSub", + "13004218": "bhvBreakableBoxSmall", + "13004244": "bhvSlidingSnowMound", + "13004270": "bhvSnowMoundSpawn", + "13004284": "bhvWdwSquareFloatingPlatform", + "130042b4": "bhvWdwRectangularFloatingPlatform", + "130042e4": "bhvJrbFloatingPlatform", + "13004314": "bhvArrowLift", + "13004348": "bhvOrangeNumber", + "13004370": "bhvMantaRay", + "130043a0": "bhvFallingPillar", + "130043c4": "bhvFallingPillarHitbox", + "130043e0": "bhvPillarBase", + "13004400": "bhvJrbFloatingBox", + "1300442c": "bhvDecorativePendulum", + "1300444c": "bhvTreasureChestsShip", + "13004470": "bhvTreasureChestsJrb", + "13004494": "bhvTreasureChests", + "130044b8": "bhvTreasureChestBottom", + "130044e0": "bhvTreasureChestTop", + "130044fc": "bhvMips", + "13004538": "bhvYoshi", + "13004580": "bhvKoopa", + "130045d0": "bhvKoopaRaceEndpoint", + "130045f8": "bhvKoopaFlag", + "13004634": "bhvPokey", + "13004668": "bhvPokeyBodyPart", + "13004698": "bhvSwoop", + "130046dc": "bhvFlyGuy", + "1300472c": "bhvGoomba", + "13004770": "bhvGoombaTripletSpawner", + "1300478c": "bhvChainChomp", + "130047e4": "bhvChainChompChainPart", + "1300481c": "bhvWoodenPost", + "13004868": "bhvChainChompGate", + "13004898": "bhvWigglerHead", + "130048e0": "bhvWigglerBody", + "13004918": "bhvEnemyLakitu", + "13004954": "bhvCameraLakitu", + "13004988": "bhvCloud", + "130049ac": "bhvCloudPart", + "130049c8": "bhvSpiny", + "13004a00": "bhvMontyMole", + "13004a58": "bhvMontyMoleHole", + "13004a78": "bhvMontyMoleRock", + "13004ab0": "bhvPlatformOnTrack", + "13004af4": "bhvTrackBall", + "13004b1c": "bhvSeesawPlatform", + "13004b44": "bhvFerrisWheelAxle", + "13004b6c": "bhvFerrisWheelPlatform", + "13004b8c": "bhvWaterBombSpawner", + "13004ba8": "bhvWaterBomb", + "13004bd4": "bhvWaterBombShadow", + "13004bf0": "bhvTTCRotatingSolid", + "13004c24": "bhvTTCPendulum", + "13004c5c": "bhvTTCTreadmill", + "13004c94": "bhvTTCMovingBar", + "13004ccc": "bhvTTCCog", + "13004cf8": "bhvTTCPitBlock", + "13004d28": "bhvTTCElevator", + "13004d64": "bhvTTC2DRotator", + "13004d90": "bhvTTCSpinner", + "13004dbc": "bhvMrBlizzard", + "13004e08": "bhvMrBlizzardSnowball", + "13004e4c": "bhvSlidingPlatform2", + "13004e78": "bhvOctagonalPlatformRotating", + "13004ea0": "bhvAnimatesOnFloorSwitchPress", + "13004ecc": "bhvActivatedBackAndForthPlatform", + "13004ef8": "bhvRecoveryHeart", + "13004f10": "bhvWaterBombCannon", + "13004f28": "bhvCannonBarrelBubbles", + "13004f40": "bhvUnagi", + "13004f78": "bhvUnagiSubobject", + "13004f90": "bhvDorrie", + "13004fd4": "bhvHauntedChair", + "13005024": "bhvMadPiano", + "1300506c": "bhvFlyingBookend", + "130050b4": "bhvBookendSpawn", + "130050d4": "bhvHauntedBookshelfManager", + "130050f4": "bhvBookSwitch", + "13005120": "bhvFirePiranhaPlant", + "13005158": "bhvSmallPiranhaFlame", + "1300518c": "bhvFireSpitter", + "130051ac": "bhvFlyguyFlame", + "130051e0": "bhvSnufit", + "1300521c": "bhvSnufitBalls", + "1300525c": "bhvHorizontalGrindel", + "130052b4": "bhvEyerokBoss", + "130052d0": "bhvEyerokHand", + "13005310": "bhvKlepto", + "13005354": "bhvBird", + "13005380": "bhvRacingPenguin", + "130053c4": "bhvPenguinRaceFinishLine", + "130053dc": "bhvPenguinRaceShortcutCheck", + "130053f4": "bhvCoffinSpawner", + "13005414": "bhvCoffin", + "13005440": "bhvClamShell", + "13005468": "bhvSkeeter", + "130054a0": "bhvSkeeterWave", + "130054b8": "bhvSwingPlatform", + "130054ec": "bhvDonutPlatformSpawner", + "13005504": "bhvDonutPlatform", + "13005528": "bhvDDDPole", + "1300556c": "bhvRedCoinStarMarker", + "13005598": "bhvTripletButterfly", + "130055dc": "bhvBubba", + "13005610": "bhvBeginningLakitu", + "13005638": "bhvBeginningPeach", + "1300565c": "bhvEndBirds1", + "13005680": "bhvEndBirds2", + "130056a4": "bhvIntroScene", + "130056c0": "_behaviorSegmentEnd", + "007d1d80": "_behaviorSegmentRomEnd", + "8016f000": "_goddardSegmentStart", + "007cc6c0": "_goddardSegmentRomStart", + }, + "Refresh 13": { + "80000000": "EXCEPTION_TLB_MISS", + "a4000000": "SP_DMEM", + "a40004c0": "SP_DMEM_UNK0", + "a4000774": "SP_DMEM_UNK1", + "a4001000": "SP_IMEM", + "a4040010": "SP_STATUS_REG", + "a4080000": "SP_PC", + "a4300000": "MI_MODE_REG", + "a4300004": "MI_VERSION_REG", + "a4300008": "MI_INTR_REG", + "a430000c": "MI_INTR_MASK_REG", + "a4400010": "VI_CURRENT_REG", + "a450000c": "AI_STATUS_REG", + "a4600000": "PI_DRAM_ADDR_REG", + "a4600004": "PI_CART_ADDR_REG", + "a460000c": "PI_WR_LEN_REG", + "a4600010": "PI_STATUS_REG", + "a4600014": "PI_BSD_DOM1_LAT_REG", + "a4600018": "PI_BSD_DOM1_PWD_REG", + "a460001c": "PI_BSD_DOM1_PGS_REG", + "a4600020": "PI_BSD_DOM1_RLS_REG", + "a4700000": "RI_MODE_REG", + "a4700010": "RI_REFRESH_REG", + "a4800018": "SI_STATUS_REG", + "b0000008": "D_B0000008", + "b0000010": "D_B0000010", + "b0000014": "D_B0000014", + "c0000000": "D_C0000000", + "c0000008": "D_C0000008", + "c000000c": "D_C000000C", + "00000000": "__romPos", + "04000000": "_bootSegmentStart", + "007cc6c0": "_bootSegmentRomStart", + "04000040": "ipl3_entry", + "04000b70": "ipl3_font", + "04001000": "_bootSegmentEnd", + "007cd6c0": "_bootSegmentRomEnd", + "80000400": ".", + "80000400": "_zbufferSegmentNoloadStart", + "80000400": "0x25800", + "80000400": "gZBuffer", + "80246000": "_mainSegmentStart", + "007cc6c0": "_mainSegmentRomStart", + "80246000": "entry_point", + "80246050": "handle_debug_key_sequences", + "80246170": "unknown_main_func", + "802461cc": "stub_main_1", + "802461dc": "stub_main_2", + "802461ec": "stub_main_3", + "802461fc": "setup_mesg_queues", + "802462e0": "alloc_pool", + "80246338": "create_thread", + "8024639c": "handle_nmi_request", + "802463ec": "receive_new_tasks", + "8024651c": "start_sptask", + "8024659c": "interrupt_gfx_sptask", + "802465ec": "start_gfx_sptask", + "80246648": "pretend_audio_sptask_done", + "8024669c": "handle_vblank", + "802467fc": "handle_sp_complete", + "8024694c": "handle_dp_complete", + "802469b8": "thread3_main", + "80246b14": "set_vblank_handler", + "80246b74": "send_sp_task_message", + "80246bb4": "dispatch_audio_sptask", + "80246c10": "send_display_list", + "80246c9c": "turn_on_audio", + "80246cb8": "turn_off_audio", + "80246cf0": "thread1_idle", + "80246df8": "main_func", + "80246e70": "my_rdp_init", + "802471a4": "my_rsp_init", + "80247284": "clear_z_buffer", + "802473c8": "display_frame_buffer", + "802474b8": "clear_frame_buffer", + "80247620": "clear_viewport", + "8024784c": "draw_screen_borders", + "802479bc": "make_viewport_clip_rect", + "80247b3c": "create_task_structure", + "80247ccc": "init_render_image", + "80247d14": "end_master_display_list", + "80247db4": "draw_reset_bars", + "80247f08": "rendering_init", + "80247fdc": "config_gfx_pool", + "80248090": "display_and_vsync", + "80248304": "adjust_analog_stick", + "80248498": "run_demo_inputs", + "80248638": "read_controller_inputs", + "80248824": "init_controllers", + "80248964": "setup_game_memory", + "80248af0": "thread5_game_loop", + "80248c40": "reset_volume", + "80248c58": "lower_background_noise", + "80248ce8": "raise_background_noise", + "80248d78": "disable_background_sound", + "80248dc0": "enable_background_sound", + "80248e08": "set_sound_mode", + "80248e54": "play_menu_sounds", + "80248fec": "play_painting_eject_sound", + "80249070": "play_infinite_stairs_music", + "80249178": "set_background_music", + "8024922c": "fadeout_music", + "8024927c": "fadeout_level_music", + "802492d0": "play_cutscene_music", + "80249310": "play_shell_music", + "8024934c": "stop_shell_music", + "80249398": "play_cap_music", + "80249404": "fadeout_cap_music", + "80249448": "stop_cap_music", + "80249494": "play_menu_sounds_extra", + "802494d8": "audio_game_loop_tick", + "80249500": "thread4_sound", + "802495e0": "level_control_timer", + "802496b8": "pressed_pause", + "80249764": "set_play_mode", + "8024978c": "warp_special", + "802497b8": "fade_into_special_warp", + "8024982c": "stub_level_update_1", + "8024983c": "load_level_init_text", + "8024995c": "init_door_warp", + "80249a10": "set_mario_initial_cap_powerup", + "80249ab4": "set_mario_initial_action", + "80249cd8": "init_mario_after_warp", + "8024a124": "warp_area", + "8024a18c": "warp_level", + "8024a1d8": "warp_credits", + "8024a374": "check_instant_warp", + "8024a584": "music_changed_through_warp", + "8024a700": "initiate_warp", + "8024a7b4": "get_painting_warp_node", + "8024a85c": "initiate_painting_warp", + "8024a9cc": "level_trigger_warp", + "8024aedc": "initiate_delayed_warp", + "8024b13c": "update_hud_values", + "8024b390": "basic_update", + "8024b3e4": "play_mode_normal", + "8024b5d4": "play_mode_paused", + "8024b6cc": "play_mode_frame_advance", + "8024b798": "level_set_transition", + "8024b7c0": "play_mode_change_area", + "8024b880": "play_mode_change_level", + "8024b9b8": "update_level", + "8024ba8c": "init_level", + "8024bcd8": "lvl_init_or_update", + "8024bd5c": "lvl_init_from_save_file", + "8024be14": "lvl_set_current_level", + "8024bfa0": "lvl_play_the_end_screen_sound", + "8024bff0": "get_mario_cap_flag", + "8024c0b8": "object_facing_mario", + "8024c16c": "mario_obj_angle_to_object", + "8024c1d8": "determine_interaction", + "8024c51c": "attack_object", + "8024c618": "mario_stop_riding_object", + "8024c66c": "mario_grab_used_object", + "8024c6c0": "mario_drop_held_object", + "8024c780": "mario_throw_held_object", + "8024c894": "mario_stop_riding_and_holding", + "8024c8fc": "does_mario_have_normal_cap_on_head", + "8024c928": "mario_blow_off_cap", + "8024ca68": "mario_lose_cap_to_enemy", + "8024caf8": "mario_retrieve_cap", + "8024cb58": "able_to_grab_object", + "8024cbfc": "mario_get_collided_object", + "8024cc7c": "mario_check_object_grab", + "8024ce08": "bully_knock_back_mario", + "8024d0b4": "bounce_off_object", + "8024d130": "hit_object_from_below", + "8024d2bc": "determine_knockback_action", + "8024d578": "push_mario_out_of_object", + "8024d72c": "bounce_back_from_attack", + "8024d804": "should_push_or_pull_door", + "8024d8b0": "take_damage_from_interact_object", + "8024d998": "take_damage_and_knock_back", + "8024daac": "reset_mario_pitch", + "8024db2c": "interact_coin", + "8024dbf0": "interact_water_ring", + "8024dc28": "interact_star_or_key", + "8024de4c": "interact_bbh_entrance", + "8024df10": "interact_warp", + "8024e0c4": "interact_warp_door", + "8024e2fc": "get_door_save_file_flag", + "8024e420": "interact_door", + "8024e6ec": "interact_cannon_base", + "8024e778": "interact_igloo_barrier", + "8024e7d4": "interact_tornado", + "8024e8f0": "interact_whirlpool", + "8024e9d0": "interact_strong_wind", + "8024ead8": "interact_flame", + "8024ec54": "interact_snufit_bullet", + "8024ed84": "interact_clam_or_bubba", + "8024ee44": "interact_bully", + "8024eff8": "interact_shock", + "8024f170": "interact_mr_blizzard", + "8024f1e0": "interact_hit_from_below", + "8024f354": "interact_bounce_top", + "8024f4ac": "interact_unknown_08", + "8024f55c": "interact_damage", + "8024f5cc": "interact_breakable", + "8024f6a4": "interact_koopa_shell", + "8024f7a8": "check_object_grab_mario", + "8024f8bc": "interact_pole", + "8024fa60": "interact_hoot", + "8024fb30": "interact_cap", + "8024fd2c": "interact_grabbable", + "8024fe6c": "mario_can_talk", + "8024ff04": "check_read_sign", + "80250098": "check_npc_talk", + "80250198": "interact_text", + "80250230": "check_kick_or_punch_wall", + "802503f0": "mario_process_interactions", + "802505c8": "check_death_barrier", + "8025065c": "check_lava_boost", + "80250724": "pss_begin_slide", + "80250778": "pss_end_slide", + "802507fc": "mario_handle_special_floors", + "80250940": "is_anim_at_end", + "8025097c": "is_anim_past_end", + "802509b8": "set_mario_animation", + "80250b04": "set_mario_anim_with_accel", + "80250c7c": "set_anim_to_frame", + "80250d38": "is_anim_past_frame", + "80250e54": "find_mario_anim_flags_and_translation", + "80251020": "update_mario_pos_for_anim", + "802510dc": "return_mario_anim_y_translation", + "80251120": "play_sound_if_no_flag", + "8025118c": "play_mario_jump_sound", + "80251274": "adjust_sound_for_speed", + "80251310": "play_sound_and_spawn_particles", + "80251444": "play_mario_action_sound", + "802514ac": "play_mario_landing_sound", + "80251510": "play_mario_landing_sound_once", + "80251574": "play_mario_heavy_landing_sound", + "802515d8": "play_mario_heavy_landing_sound_once", + "8025163c": "play_mario_sound", + "80251708": "mario_set_forward_vel", + "8025177c": "mario_get_floor_class", + "802518a8": "mario_get_terrain_sound_addend", + "80251a48": "resolve_and_return_wall_collisions", + "80251afc": "vec3f_find_ceil", + "80251b54": "mario_facing_downhill", + "80251bd4": "mario_floor_is_slippery", + "80251cfc": "mario_floor_is_slope", + "80251e24": "mario_floor_is_steep", + "80251f24": "find_floor_height_relative_polar", + "80252000": "find_floor_slope", + "802521a0": "update_mario_sound_and_camera", + "8025229c": "set_steep_jump_action", + "80252cf4": "set_mario_action", + "80252e5c": "set_jump_from_landing", + "802530a0": "set_jumping_action", + "80253178": "drop_and_set_mario_action", + "802531c4": "hurt_and_set_mario_action", + "80253218": "check_common_action_exits", + "80253300": "check_common_hold_action_exits", + "802533e4": "transition_submerged_to_walking", + "80253488": "set_water_plunge_action", + "80253588": "squish_mario_model", + "80253720": "debug_print_speed_action_normal", + "80253838": "update_mario_button_inputs", + "8025395c": "update_mario_joystick_inputs", + "80253a60": "update_mario_geometry_inputs", + "80253d58": "update_mario_inputs", + "80253ec0": "set_submerged_cam_preset_and_spawn_bubbles", + "80254060": "update_mario_health", + "802542b4": "update_mario_info_for_cam", + "80254338": "mario_reset_bodystate", + "80254390": "sink_mario_in_quicksand", + "802543e8": "update_and_return_cap_flags", + "80254588": "mario_update_hitbox_and_cap_model", + "80254830": "execute_mario_action", + "80254b20": "init_mario", + "80254f44": "init_mario_from_save_file", + "80255080": "get_additive_y_vel_for_jumps", + "8025509c": "stub_mario_step_1", + "802550b0": "stub_mario_step_2", + "802550c0": "transfer_bully_speed", + "80255238": "init_bully_collision_data", + "802552fc": "mario_bonk_reflection", + "80255414": "mario_update_quicksand", + "80255654": "mario_push_off_steep_floor", + "8025570c": "mario_update_moving_sand", + "8025580c": "mario_update_windy_ground", + "802559b0": "stop_and_set_height_to_floor", + "80255a34": "stationary_ground_step", + "80255d88": "perform_ground_step", + "80255ec4": "check_ledge_grab", + "802560ac": "perform_air_quarter_step", + "802564e0": "apply_twirl_gravity", + "80256584": "should_strengthen_gravity_for_jump_ascent", + "8025661c": "apply_gravity", + "802569f8": "apply_vertical_wind", + "80256b24": "perform_air_step", + "80256cd8": "set_vel_from_pitch_and_yaw", + "80256d8c": "set_vel_from_yaw", + "80256e00": "get_credits_str_width", + "80256e88": "print_displaying_credits_entry", + "80257060": "bhv_end_peach_loop", + "802570dc": "bhv_end_toad_loop", + "80257198": "geo_switch_peach_eyes", + "802572b0": "get_star_collection_dialog", + "8025733c": "handle_save_menu", + "80257450": "spawn_obj_at_mario_rel_yaw", + "802574e8": "cutscene_take_cap_off", + "80257548": "cutscene_put_cap_on", + "802575a8": "mario_ready_to_speak", + "80257640": "set_mario_npc_dialog", + "80257748": "act_reading_npc_dialog", + "80257980": "act_waiting_for_dialog", + "80257a0c": "act_disappeared", + "80257ab0": "act_reading_automatic_dialog", + "80257ce4": "act_reading_sign", + "80257eac": "act_debug_free_move", + "80258184": "general_star_dance_handler", + "80258420": "act_star_dance", + "802584dc": "act_star_dance_water", + "802585c0": "act_fall_after_star_grab", + "802586cc": "common_death_handler", + "80258744": "act_standing_death", + "802587ec": "act_electrocution", + "8025883c": "act_suffocation", + "8025888c": "act_death_on_back", + "802588f8": "act_death_on_stomach", + "80258964": "act_quicksand_death", + "80258a7c": "act_eaten_by_bubba", + "80258b24": "launch_mario_until_land", + "80258ba8": "act_unlocking_key_door", + "80258dac": "act_unlocking_star_door", + "80258f94": "act_entering_star_door", + "80259264": "act_going_through_door", + "802593cc": "act_warp_door_spawn", + "802594d4": "act_emerge_from_pipe", + "80259608": "act_spawn_spin_airborne", + "80259740": "act_spawn_spin_landing", + "802597ac": "act_exit_airborne", + "80259854": "act_falling_exit_airborne", + "802598d0": "act_exit_land_save_dialog", + "80259c30": "act_death_exit", + "80259ce8": "act_unused_death_exit", + "80259d74": "act_falling_death_exit", + "80259e00": "act_special_exit_airborne", + "80259ef8": "act_special_death_exit", + "80259fcc": "act_spawn_no_spin_airborne", + "8025a040": "act_spawn_no_spin_landing", + "8025a0bc": "act_bbh_enter_spin", + "8025a494": "act_bbh_enter_jump", + "8025a610": "act_teleport_fade_out", + "8025a6fc": "act_teleport_fade_in", + "8025a858": "act_shocked", + "8025a9ac": "act_squished", + "8025ae0c": "act_putting_on_cap", + "8025aea8": "stuck_in_ground_handler", + "8025affc": "act_head_stuck_in_ground", + "8025b050": "act_butt_stuck_in_ground", + "8025b0a4": "act_feet_stuck_in_ground", + "8025bc80": "generate_yellow_sparkles", + "8025d798": "mario_execute_cutscene_action", + "8025dd70": "add_tree_leaf_particles", + "8025de1c": "play_climbing_sounds", + "8025df04": "set_pole_position", + "8025e21c": "act_holding_pole", + "8025e5a8": "act_climbing_pole", + "8025e7a4": "act_grab_pole_slow", + "8025e830": "act_grab_pole_fast", + "8025e930": "act_top_of_pole_transition", + "8025ea30": "act_top_of_pole", + "8025eb50": "perform_hanging_step", + "8025ecfc": "update_hang_moving", + "8025eed0": "update_hang_stationary", + "8025ef58": "act_start_hanging", + "8025f0b4": "act_hanging", + "8025f1e4": "act_hang_moving", + "8025f384": "let_go_of_ledge", + "8025f4b4": "climb_up_ledge", + "8025f560": "update_ledge_climb_camera", + "8025f644": "update_ledge_climb", + "8025f6c0": "act_ledge_grab", + "8025f970": "act_ledge_climb_slow", + "8025fa64": "act_ledge_climb_down", + "8025fae8": "act_ledge_climb_fast", + "8025fb90": "act_grabbed", + "8025fc6c": "act_in_cannon", + "80260154": "act_tornado_twirling", + "80260568": "check_common_automatic_cancels", + "802605d0": "mario_execute_automatic_action", + "802608b0": "check_common_idle_cancels", + "80260aac": "check_common_hold_idle_cancels", + "80260cb4": "act_idle", + "80260f94": "play_anim_sound", + "80261000": "act_start_sleeping", + "80261268": "act_sleeping", + "802614fc": "act_waking_up", + "8026168c": "act_shivering", + "802618d8": "act_coughing", + "802619d0": "act_hold_idle", + "80261ad0": "act_hold_heavy_idle", + "80261bf8": "act_standing_against_wall", + "80261cec": "act_in_quicksand", + "80261db4": "act_crouching", + "80261f70": "act_panting", + "80262080": "act_hold_panting_unused", + "8026217c": "stopping_step", + "802621dc": "act_braking_stop", + "802622dc": "act_butt_slide_stop", + "80262398": "act_hold_butt_slide_stop", + "80262490": "act_slide_kick_slide_stop", + "80262530": "act_start_crouching", + "80262650": "act_stop_crouching", + "80262770": "act_start_crawling", + "80262890": "act_stop_crawling", + "80262980": "act_shockwave_bounce", + "80262bc4": "landing_step", + "80262c34": "check_common_landing_cancels", + "80262d68": "act_jump_land_stop", + "80262dc4": "act_double_jump_land_stop", + "80262e20": "act_side_flip_land_stop", + "80262e94": "act_freefall_land_stop", + "80262ef0": "act_triple_jump_land_stop", + "80262f50": "act_backflip_land_stop", + "80262fec": "act_lava_boost_land", + "8026305c": "act_long_jump_land_stop", + "802630f8": "act_hold_jump_land_stop", + "802631f0": "act_hold_freefall_land_stop", + "802632e8": "act_air_throw_land", + "802633b4": "act_twirl_land", + "8026350c": "act_ground_pound_land", + "802635e8": "act_first_person", + "80263784": "check_common_stationary_cancels", + "80263898": "mario_execute_stationary_action", + "80263e60": "tilt_body_running", + "80263ee4": "play_step_sound", + "80264024": "align_with_floor", + "8026409c": "begin_walking_action", + "802640fc": "check_ledge_climb_down", + "802642b4": "slide_bonk", + "80264340": "set_triple_jump_action", + "8026440c": "update_sliding_angle", + "80264740": "update_sliding", + "80264b54": "apply_slope_accel", + "80264d80": "apply_landing_accel", + "80264e18": "update_shell_speed", + "80265080": "apply_slope_decel", + "802651b0": "update_decelerating_speed", + "80265244": "update_walking_speed", + "80265458": "should_begin_sliding", + "80265514": "analog_stick_held_back", + "80265558": "check_ground_dive_or_punch", + "80265620": "begin_braking_action", + "80265700": "anim_and_audio_for_walk", + "80265b1c": "anim_and_audio_for_hold_walk", + "80265d90": "anim_and_audio_for_heavy_walk", + "80265df8": "push_or_sidle_wall", + "80266038": "tilt_body_walking", + "802661cc": "tilt_body_ground_shell", + "80266354": "act_walking", + "802665b4": "act_move_punching", + "80266734": "act_hold_walking", + "8026699c": "act_hold_heavy_walking", + "80266af8": "act_turning_around", + "80266d4c": "act_finish_turning_around", + "80266e48": "act_braking", + "80266fc8": "act_decelerating", + "80267240": "act_hold_decelerating", + "80267504": "act_riding_shell_ground", + "80267728": "act_crawling", + "8026795c": "act_burning_ground", + "80267c24": "tilt_body_butt_slide", + "80267ce4": "common_slide_action", + "80267fa4": "common_slide_action_with_jump", + "80268074": "act_butt_slide", + "802680d4": "act_hold_butt_slide", + "80268168": "act_crouch_slide", + "80268338": "act_slide_kick_slide", + "802684ac": "stomach_slide_action", + "802685c0": "act_stomach_slide", + "80268608": "act_hold_stomach_slide", + "80268684": "act_dive_slide", + "802687b8": "common_ground_knockback_action", + "802689f8": "act_hard_backward_ground_kb", + "80268adc": "act_hard_forward_ground_kb", + "80268b64": "act_backward_ground_kb", + "80268bb0": "act_forward_ground_kb", + "80268bfc": "act_soft_backward_ground_kb", + "80268c48": "act_soft_forward_ground_kb", + "80268c94": "act_ground_bonk", + "80268d04": "act_death_exit_land", + "80268dcc": "common_landing_action", + "80268f78": "common_landing_cancels", + "80269108": "act_jump_land", + "80269170": "act_freefall_land", + "802691d8": "act_side_flip_land", + "80269264": "act_hold_jump_land", + "80269300": "act_hold_freefall_land", + "8026939c": "act_long_jump_land", + "8026947c": "act_double_jump_land", + "802694e4": "act_triple_jump_land", + "80269588": "act_backflip_land", + "80269640": "quicksand_jump_land_action", + "80269788": "act_quicksand_jump_land", + "802697dc": "act_hold_quicksand_jump_land", + "80269830": "check_common_moving_cancels", + "80269954": "mario_execute_moving_action", + "80269f40": "play_flip_sounds", + "80269fc0": "play_far_fall_sound", + "8026a090": "play_knockback_sound", + "8026a12c": "lava_boost_on_wall", + "8026a224": "check_fall_damage", + "8026a400": "check_kick_or_dive_in_air", + "8026a494": "should_get_stuck_in_ground", + "8026a598": "check_fall_damage_or_get_stuck", + "8026a62c": "check_horizontal_wind", + "8026a818": "update_air_with_turn", + "8026aa48": "update_air_without_turn", + "8026acd8": "update_lava_boost_or_twirling", + "8026ae5c": "update_flying_yaw", + "8026b004": "update_flying_pitch", + "8026b17c": "update_flying", + "8026b444": "common_air_action_step", + "8026b6a0": "act_jump", + "8026b740": "act_double_jump", + "8026b814": "act_triple_jump", + "8026b90c": "act_backflip", + "8026b9ac": "act_freefall", + "8026bab8": "act_hold_jump", + "8026bbb4": "act_hold_freefall", + "8026bcc0": "act_side_flip", + "8026bdcc": "act_wall_kick_air", + "8026be78": "act_long_jump", + "8026bf40": "act_riding_shell_air", + "8026c034": "act_twirling", + "8026c1e0": "act_dive", + "8026c4b8": "act_air_throw", + "8026c5d0": "act_water_jump", + "8026c738": "act_hold_water_jump", + "8026c880": "act_steep_jump", + "8026c9fc": "act_ground_pound", + "8026cd0c": "act_burning_jump", + "8026ce50": "act_burning_fall", + "8026cf28": "act_crazy_box_bounce", + "8026d1b0": "common_air_knockback_step", + "8026d33c": "check_wall_kick", + "8026d3c8": "act_backward_air_kb", + "8026d43c": "act_forward_air_kb", + "8026d4b0": "act_hard_backward_air_kb", + "8026d508": "act_hard_forward_air_kb", + "8026d560": "act_thrown_backward", + "8026d608": "act_thrown_forward", + "8026d6fc": "act_soft_bonk", + "8026d770": "act_getting_blown", + "8026d988": "act_air_hit_wall", + "8026db54": "act_forward_rollout", + "8026dcf4": "act_backward_rollout", + "8026de98": "act_butt_slide_air", + "8026e088": "act_hold_butt_slide_air", + "8026e2b4": "act_lava_boost", + "8026e59c": "act_slide_kick", + "8026e810": "act_jump_kick", + "8026e968": "act_shot_from_cannon", + "8026ec00": "act_flying", + "8026f158": "act_riding_hoot", + "8026f2ec": "act_flying_triple_jump", + "8026f614": "act_top_of_pole_jump", + "8026f660": "act_vertical_wind", + "8026f840": "act_special_triple_jump", + "8026fa18": "check_common_airborne_cancels", + "8026fb04": "mario_execute_airborne_action", + "8027499c": "mario_execute_submerged_action", + "80274eb0": "animated_stationary_ground_step", + "80274f10": "mario_update_punch_sequence", + "80275328": "act_punching", + "8027546c": "act_picking_up", + "802755fc": "act_dive_picking_up", + "802756c8": "act_placing_down", + "80275794": "act_throwing", + "802758c0": "act_heavy_throw", + "802759b4": "act_stomach_slide_stop", + "80275a80": "act_picking_up_bowser", + "80275b34": "act_holding_bowser", + "80275e78": "act_releasing_bowser", + "80275f0c": "check_common_object_cancels", + "80275fe0": "mario_execute_object_action", + "802761d0": "geo_envfx_main", + "802763d4": "geo_skybox_main", + "802764b0": "geo_draw_mario_head_goddard", + "8027684c": "bhv_toad_message_loop", + "80276910": "bhv_toad_message_init", + "80276bb8": "bhv_unlock_door_star_init", + "80276ccc": "bhv_unlock_door_star_loop", + "802770a4": "geo_mirror_mario_set_alpha", + "80277150": "geo_switch_mario_stand_run", + "802771bc": "geo_switch_mario_eyes", + "80277294": "geo_mario_tilt_torso", + "802773a4": "geo_mario_head_rotation", + "802774f4": "geo_switch_mario_hand", + "802775cc": "geo_mario_hand_foot_scaler", + "802776d8": "geo_switch_mario_cap_effect", + "80277740": "geo_switch_mario_cap_on_off", + "80277824": "geo_mario_rotate_wing_cap_wings", + "8027795c": "geo_switch_mario_hand_grab_pos", + "80277b14": "geo_render_mirror_mario", + "80277d6c": "geo_mirror_mario_backface_culling", + "80277ee0": "set_segment_base_addr", + "80277f20": "get_segment_base_addr", + "80277f50": "segmented_to_virtual", + "80277fa8": "virtual_to_segmented", + "80277ff0": "move_segment_table_to_dmem", + "80278074": "main_pool_init", + "80278120": "main_pool_alloc", + "80278238": "main_pool_free", + "80278358": "main_pool_realloc", + "802783c8": "main_pool_available", + "802783e8": "main_pool_push_state", + "80278498": "main_pool_pop_state", + "8027868c": "load_segment", + "802786f0": "load_to_fixed_pool_addr", + "802787d8": "load_segment_decompress", + "802788b4": "load_segment_decompress_heap", + "80278974": "load_engine_code_segment", + "80278a14": "alloc_only_pool_init", + "80278ab8": "alloc_only_pool_alloc", + "80278b28": "alloc_only_pool_resize", + "80278b98": "mem_pool_init", + "80278c58": "mem_pool_alloc", + "80278d74": "mem_pool_free", + "80278f2c": "alloc_display_list", + "80279028": "func_80278A78", + "80279084": "load_patchable_table", + "80279840": "save_file_do_save", + "802798fc": "save_file_erase", + "80279960": "save_file_copy", + "802799dc": "save_file_load_all", + "80279bc8": "save_file_reload", + "80279c44": "save_file_collect_star_or_key", + "80279e44": "save_file_exists", + "80279e80": "save_file_get_max_coin_score", + "80279f80": "save_file_get_course_star_count", + "8027a010": "save_file_get_total_star_count", + "8027a0a8": "save_file_set_flags", + "8027a0f4": "save_file_clear_flags", + "8027a16c": "save_file_get_flags", + "8027a1c8": "save_file_get_star_flags", + "8027a23c": "save_file_set_star_flags", + "8027a310": "save_file_get_course_coin_score", + "8027a340": "save_file_is_cannon_unlocked", + "8027a390": "save_file_set_cannon_unlocked", + "8027a418": "save_file_set_cap_pos", + "8027a4ac": "save_file_get_cap_pos", + "8027a564": "save_file_set_sound_mode", + "8027a5b4": "save_file_get_sound_mode", + "8027a5d4": "save_file_move_cap_to_default_location", + "8027a698": "disable_warp_checkpoint", + "8027a6b0": "check_if_should_set_warp_checkpoint", + "8027a718": "check_warp_checkpoint", + "8027a7d0": "override_viewport_and_clip", + "8027a83c": "set_warp_transition_rgb", + "8027a8b0": "print_intro_text", + "8027a93c": "get_mario_spawn_type", + "8027a9c8": "area_get_warp_node", + "8027aa28": "area_get_warp_node_from_params", + "8027aa74": "load_obj_warp_nodes", + "8027ab04": "clear_areas", + "8027ad74": "clear_area_graph_nodes", + "8027ae44": "load_area", + "8027af48": "unload_area", + "8027afbc": "load_mario_area", + "8027b038": "unload_mario_area", + "8027b0c0": "change_area", + "8027b164": "area_update_objects", + "8027b1a0": "play_transition", + "8027b35c": "play_transition_after_delay", + "8027b3b4": "render_game", + "8027cf38": "geo_set_animation_globals", + "8027da84": "geo_process_held_object", + "8027de68": "geo_try_process_children", + "8027dea8": "geo_process_node_and_siblings", + "8027e130": "geo_process_root", + "8027e3e0": "profiler_log_thread5_time", + "8027e490": "profiler_log_thread4_time", + "8027e520": "profiler_log_gfx_time", + "8027e5cc": "profiler_log_vblank_time", + "8027e65c": "draw_profiler_bar", + "8027e958": "draw_reference_profiler_bars", + "8027ebcc": "draw_profiler_mode_1", + "8027eeac": "draw_profiler_mode_0", + "8027f460": "draw_profiler", + "8027f4e0": "decompress", + "8027f590": "set_camera_shake_from_hit", + "8027f8b8": "set_environmental_camera_shake", + "8027f9f0": "set_camera_shake_from_point", + "8027fb74": "unused_set_camera_pitch_shake_env", + "8027fc18": "calc_y_to_curr_floor", + "8027fe20": "focus_on_mario", + "8027fff8": "set_camera_height", + "80280368": "look_down_slopes", + "802804f4": "pan_ahead_of_player", + "802806a4": "find_in_bounds_yaw_wdw_bob_thi", + "80280810": "update_radial_camera", + "80280970": "update_8_directions_camera", + "80280b00": "radial_camera_move", + "80281188": "lakitu_zoom", + "802813bc": "radial_camera_input_default", + "802813ec": "update_yaw_and_dist_from_c_up", + "8028146c": "mode_radial_camera", + "80281588": "mode_8_directions_camera", + "802816a0": "update_outward_radial_camera", + "802817fc": "mode_outward_radial_camera", + "80281904": "update_parallel_tracking_camera", + "80282280": "update_fixed_camera", + "802826a0": "update_boss_fight_camera", + "80282c0c": "unused_update_mode_5_camera", + "80282c3c": "mode_boss_fight_camera", + "80282c7c": "mode_parallel_tracking_camera", + "80282ce0": "mode_fixed_camera", + "80282d78": "update_behind_mario_camera", + "80283340": "mode_behind_mario", + "80283578": "update_slide_camera", + "802839e4": "mode_behind_mario_camera", + "80283a18": "nop_update_water_camera", + "80283a34": "mode_water_surface_camera", + "80283a68": "update_mario_camera", + "80283af8": "update_default_camera", + "80284cb8": "mode_default_camera", + "80284cfc": "mode_lakitu_camera", + "80284d38": "mode_mario_camera", + "80284d74": "update_spiral_stairs_camera", + "802850ac": "mode_spiral_stairs_camera", + "802850ec": "update_slide_or_0f_camera", + "802851dc": "mode_slide_camera", + "8028526c": "store_lakitu_cam_info_for_c_up", + "802852f4": "set_mode_c_up", + "80285370": "exit_c_up", + "80285808": "update_c_up", + "802858a4": "move_mario_head_c_up", + "80285a2c": "move_into_c_up", + "80285d20": "mode_c_up_camera", + "80285ed8": "update_in_cannon", + "80285f60": "mode_cannon_camera", + "8028603c": "transition_next_state", + "80286088": "transition_to_camera_mode", + "80286188": "set_camera_mode", + "80286420": "update_lakitu", + "802868f8": "update_camera", + "80286f68": "reset_camera", + "8028724c": "init_camera", + "802879ec": "zoom_out_if_paused_and_outside", + "80287bc4": "select_mario_cam_mode", + "80287be0": "create_camera", + "80287cb8": "update_graph_node_camera", + "80287d30": "geo_camera_main", + "80287dc0": "stub_camera_2", + "80287dd4": "stub_camera_3", + "80287de8": "vec3f_sub", + "80287e28": "object_pos_to_vec3f", + "80287e50": "vec3f_to_object_pos", + "80287e78": "unused_object_angle_to_vec3s", + "80287ea0": "evaluate_cubic_spline", + "802882e4": "move_point_along_spline", + "80288624": "cam_select_alt_mode", + "80288718": "set_cam_angle", + "80288888": "set_handheld_shake", + "802889b0": "shake_camera_handheld", + "80288ce4": "find_c_buttons_pressed", + "80288e68": "update_camera_hud_status", + "80288f5c": "collide_with_walls", + "80289198": "vec3f_compare", + "80289214": "clamp_pitch", + "802892d8": "is_within_100_units_of_mario", + "8028935c": "set_or_approach_f32_asymptotic", + "802893f4": "approach_f32_asymptotic_bool", + "80289488": "approach_f32_asymptotic", + "802894b4": "approach_s16_asymptotic_bool", + "8028956c": "approach_s16_asymptotic", + "80289610": "approach_vec3f_asymptotic", + "80289684": "set_or_approach_vec3f_asymptotic", + "802896f8": "approach_vec3s_asymptotic", + "8028976c": "camera_approach_s16_symmetric_bool", + "8028984c": "camera_approach_s16_symmetric", + "8028993c": "set_or_approach_s16_symmetric", + "802899cc": "camera_approach_f32_symmetric_bool", + "80289b0c": "camera_approach_f32_symmetric", + "80289c00": "random_vec3s", + "80289d20": "reduce_by_dist_from_camera", + "80289f88": "clamp_positions_and_find_yaw", + "8028a080": "calc_avoid_yaw", + "8028a0f4": "is_surf_within_bounding_box", + "8028a4ec": "is_behind_surface", + "8028a6bc": "is_range_behind_surface", + "8028a7ec": "is_mario_behind_surface", + "8028a834": "scale_along_line", + "8028a8e8": "is_pos_in_bounds", + "8028aa28": "calculate_pitch", + "8028aad8": "calculate_yaw", + "8028ab60": "calculate_angles", + "8028ac28": "calc_abs_dist", + "8028accc": "calc_hor_dist", + "8028ad4c": "rotate_in_xz", + "8028ae1c": "rotate_in_yz", + "8028aef0": "set_camera_pitch_shake", + "8028af4c": "set_camera_yaw_shake", + "8028b00c": "set_camera_roll_shake", + "8028b068": "set_pitch_shake_from_point", + "8028b11c": "set_yaw_shake_from_point", + "8028b1d0": "increment_shake_offset", + "8028b218": "shake_camera_pitch", + "8028b32c": "shake_camera_yaw", + "8028b438": "shake_camera_roll", + "8028b50c": "offset_yaw_outward_radial", + "8028b724": "cutscene_intro_peach_play_message_music", + "8028b754": "cutscene_intro_peach_play_lakitu_flying_music", + "8028b784": "play_camera_buzz_if_cdown", + "8028b7c4": "play_camera_buzz_if_cbutton", + "8028b804": "play_camera_buzz_if_c_sideways", + "8028b850": "play_sound_cbutton_up", + "8028b884": "play_sound_cbutton_down", + "8028b8b8": "play_sound_cbutton_side", + "8028b8ec": "play_sound_button_change_blocked", + "8028b920": "play_sound_rbutton_changed", + "8028b954": "play_sound_if_cam_switched_to_lakitu_or_mario", + "8028b9c4": "radial_camera_input", + "8028bd34": "trigger_cutscene_dialog", + "8028bd98": "handle_c_button_movement", + "8028c038": "clear_cutscene_vars", + "8028c13c": "start_cutscene", + "8028c18c": "determine_dance_cutscene", + "8028c26c": "open_door_cutscene", + "8028c2c8": "get_cutscene_from_mario_status", + "8028c7a0": "warp_camera", + "8028c8f0": "approach_camera_height", + "8028c9ac": "stub_camera_4", + "8028c9cc": "set_focus_rel_mario", + "8028cbf0": "offset_rotated", + "8028cd94": "offset_rotated_coords", + "8028cdec": "determine_pushing_or_pulling_door", + "8028ce24": "next_lakitu_state", + "8028d44c": "set_camera_mode_fixed", + "8028d5ac": "set_camera_mode_8_directions", + "8028d5fc": "set_camera_mode_boss_fight", + "8028d658": "set_camera_mode_close_cam", + "8028d698": "set_camera_mode_radial", + "8028d79c": "parallel_tracking_init", + "8028d888": "set_fixed_cam_axis_sa_lobby", + "8028d92c": "check_blocking_area_processing", + "8028da18": "cam_rr_exit_building_side", + "8028da50": "cam_rr_exit_building_top", + "8028daec": "cam_rr_enter_building_window", + "8028db38": "cam_rr_enter_building", + "8028dbb4": "cam_rr_enter_building_side", + "8028dbf4": "cam_cotmc_exit_waterfall", + "8028dc1c": "cam_sl_snowman_head_8dir", + "8028dc70": "cam_sl_free_roam", + "8028dca4": "move_camera_through_floor_while_descending", + "8028dd48": "cam_hmc_enter_maze", + "8028de2c": "cam_hmc_elevator_black_hole", + "8028de5c": "cam_hmc_elevator_maze_emergency_exit", + "8028de90": "cam_hmc_elevator_lake", + "8028dec4": "cam_hmc_elevator_maze", + "8028def8": "cam_ssl_enter_pyramid_top", + "8028df24": "cam_ssl_pyramid_center", + "8028df6c": "cam_ssl_boss_room", + "8028dfb4": "cam_thi_move_cam_through_tunnel", + "8028dfe8": "cam_thi_look_through_tunnel", + "8028e01c": "cam_bob_tower", + "8028e064": "cam_bob_default_free_roam", + "8028e098": "cam_castle_hmc_start_pool_cutscene", + "8028e0ec": "cam_castle_lobby_entrance", + "8028e164": "cam_castle_look_upstairs", + "8028e210": "cam_castle_basement_look_downstairs", + "8028e298": "cam_castle_enter_lobby", + "8028e300": "cam_castle_enter_spiral_stairs", + "8028e38c": "cam_castle_close_mode", + "8028e3b8": "cam_castle_leave_lobby_sliding_door", + "8028e3f0": "cam_castle_enter_lobby_sliding_door", + "8028e41c": "cam_bbh_room_6", + "8028e450": "cam_bbh_fall_off_roof", + "8028e47c": "cam_bbh_fall_into_pool", + "8028e524": "cam_bbh_room_1", + "8028e55c": "cam_bbh_leave_front_door", + "8028e594": "cam_bbh_room_2_lower", + "8028e5cc": "cam_bbh_room_4", + "8028e604": "cam_bbh_room_8", + "8028e63c": "cam_bbh_room_5_library", + "8028e674": "cam_bbh_room_5_library_to_hidden_transition", + "8028e6c4": "cam_bbh_room_5_hidden_to_library_transition", + "8028e714": "cam_bbh_room_5_hidden", + "8028e758": "cam_bbh_room_3", + "8028e790": "cam_bbh_room_7_mr_i", + "8028e7c8": "cam_bbh_room_7_mr_i_to_coffins_transition", + "8028e818": "cam_bbh_room_7_coffins_to_mr_i_transition", + "8028e868": "cam_bbh_elevator_room_lower", + "8028e8a0": "cam_bbh_room_0_back_entrance", + "8028e8cc": "cam_bbh_elevator", + "8028e930": "cam_bbh_room_12_upper", + "8028e974": "cam_bbh_enter_front_door", + "8028e9a0": "cam_bbh_room_2_library", + "8028e9d8": "cam_bbh_room_2_library_to_trapdoor_transition", + "8028ea28": "cam_bbh_room_2_trapdoor", + "8028ea60": "cam_bbh_room_2_trapdoor_transition", + "8028eab0": "cam_bbh_room_9_attic", + "8028eae8": "cam_bbh_room_9_attic_transition", + "8028eb38": "cam_bbh_room_9_mr_i_transition", + "8028eb88": "cam_bbh_room_13_balcony", + "8028ebc0": "cam_bbh_room_0", + "8028ec04": "cam_ccm_enter_slide_shortcut", + "8028ec2c": "cam_ccm_leave_slide_shortcut", + "8028ec58": "surface_type_modes", + "8028ed30": "set_mode_if_not_set_by_surface", + "8028ed98": "surface_type_modes_thi", + "8028eeb0": "camera_course_processing", + "8028f670": "resolve_geometry_collisions", + "8028f914": "rotate_camera_around_walls", + "8028fc9c": "find_mario_floor_and_ceil", + "8028fe24": "start_object_cutscene", + "8028fe58": "start_object_cutscene_without_focus", + "8028fe84": "unused_dialog_cutscene_response", + "8028ff04": "cutscene_object_with_dialog", + "8028ffc8": "cutscene_object_without_dialog", + "8029000c": "cutscene_object", + "80290098": "update_camera_yaw", + "802900e0": "cutscene_reset_spline", + "80290104": "stop_cutscene_and_retrieve_stored_info", + "80290168": "cap_switch_save", + "802901a4": "init_spline_point", + "802901fc": "copy_spline_segment", + "802903b8": "cutscene_common_set_dialog_state", + "802904a8": "cutscene_intro_peach_start_letter_music", + "802904e4": "cutscene_intro_peach_start_flying_music", + "8029051c": "reset_pan_distance", + "8029053c": "player2_rotate_cam", + "80290784": "store_info_cannon", + "802907f4": "retrieve_info_cannon", + "80290864": "store_info_star", + "802908e8": "retrieve_info_star", + "802909d0": "pan_camera", + "80290a5c": "cutscene_shake_explosion", + "80290abc": "rotate_and_move_vec3f", + "80290b54": "set_flag_post_door", + "80290ba4": "cutscene_soften_music", + "80290bd8": "cutscene_unsoften_music", + "80290c1c": "cutscene_unused_start", + "80290c30": "cutscene_unused_loop", + "80290c44": "cutscene_ending_mario_fall_start", + "80290c9c": "cutscene_ending_mario_fall_focus_mario", + "80290d90": "cutscene_ending_mario_fall", + "80290e00": "cutscene_ending_mario_land_closeup", + "80290e74": "cutscene_ending_reset_spline", + "80290eb0": "cutscene_ending_fly_up_to_window", + "80290f1c": "cutscene_ending_stars_free_peach", + "80290f8c": "cutscene_ending_mario_land", + "80291074": "cutscene_ending_peach_appear_closeup", + "80291108": "cutscene_ending_peach_appears", + "802911c8": "cutscene_ending_peach_descends_start", + "80291208": "cutscene_ending_follow_peach_descent", + "8029127c": "cutscene_ending_peach_descent_lower_focus", + "802912b8": "cutscene_ending_peach_descent_back_to_mario", + "80291354": "cutscene_ending_peach_descends", + "8029142c": "cutscene_ending_mario_to_peach", + "802914cc": "cutscene_ending_look_up_at_castle", + "80291514": "cutscene_ending_peach_wakeup", + "802915d4": "cutscene_ending_dialog", + "80291654": "cutscene_ending_kiss_closeup", + "802916b8": "cutscene_ending_kiss_here_we_go", + "80291774": "cutscene_ending_kiss", + "802917e4": "cutscene_ending_look_at_sky", + "8029184c": "cutscene_ending_zoom_fov", + "80291870": "cutscene_ending_cake_for_mario", + "80291924": "cutscene_ending_stop", + "80291964": "cutscene_grand_star_start", + "802919dc": "cutscene_grand_star_front_of_mario", + "80291ab4": "cutscene_grand_star_mario_jump", + "80291b18": "cutscene_grand_star_accel_cvar2", + "80291b68": "cutscene_grand_star_approach_mario", + "80291bf4": "cutscene_grand_star_move_cvar2", + "80291c3c": "cutscene_grand_star_focus_mario", + "80291cd0": "cutscene_grand_star", + "80291db0": "cutscene_grand_star_fly_start", + "80291e84": "cutscene_grand_star_fly_move_to_mario", + "80291f18": "cutscene_grand_star_fly_mario_offscreen", + "80292038": "cutscene_grand_star_fly_app_cvars", + "80292164": "cutscene_grand_star_fly", + "802921fc": "focus_in_front_of_mario", + "8029228c": "cutscene_dance_move_to_mario", + "80292324": "cutscene_dance_rotate", + "80292370": "cutscene_dance_rotate_move_back", + "802923b8": "cutscene_dance_rotate_move_towards_mario", + "80292414": "cutscene_dance_default_focus_mario", + "8029244c": "cutscene_dance_rotate_focus_mario", + "80292484": "cutscene_dance_shake_fov", + "802924b8": "cutscene_dance_default_rotate", + "80292628": "star_dance_bound_yaw", + "802926dc": "cutscene_dance_closeup_start", + "802927d0": "cutscene_dance_closeup_focus_mario", + "80292868": "cutscene_dance_closeup_fly_above", + "80292974": "cutscene_dance_closeup_fly_closer", + "80292a20": "cutscene_dance_closeup_zoom", + "80292a4c": "cutscene_dance_closeup_shake_fov", + "80292a80": "cutscene_dance_closeup", + "80292c00": "cutscene_dance_fly_away_start", + "80292d80": "cutscene_dance_fly_away_approach_mario", + "80292e2c": "cutscene_dance_fly_away_focus_mario", + "80292ec4": "cutscene_pan_cvar9", + "80292f40": "cutscene_dance_fly_rotate_around_mario", + "80292f98": "cutscene_dance_fly_away_rotate_while_flying", + "80292fe4": "cutscene_dance_fly_away_shake_fov", + "80293018": "cutscene_dance_fly_away", + "802930f0": "cutscene_key_dance_jump_cvar", + "80293164": "cutscene_key_dance_jump_closeup", + "802931c0": "cutscene_key_dance_jump_lower_left", + "80293220": "cutscene_key_dance_jump_above", + "8029328c": "cutscene_key_dance_jump_last", + "802932f4": "cutscene_key_dance_shake_fov", + "80293328": "cutscene_key_dance_handheld_shake", + "80293354": "cutscene_key_dance_focus_mario", + "8029338c": "cutscene_key_dance", + "80293488": "cutscene_bowser_area_shake_fov", + "802934b4": "cutscene_bowser_area_start_bowser_walking", + "802934d8": "cutscene_bowser_arena_set_pos", + "80293548": "cutscene_bowser_arena_focus_sine", + "802935e0": "cutscene_bowser_arena_set_focus", + "80293624": "cutscene_bowser_arena_adjust_offsets", + "8029369c": "cutscene_bowser_arena_pan_left", + "802936dc": "cutscene_bowser_arena_mario_dialog", + "80293708": "cutscene_stop_dialog", + "80293734": "cutscene_bowser_arena_start", + "802937e8": "bowser_fight_intro_dialog", + "8029386c": "cutscene_bowser_arena_dialog", + "802938c8": "cutscene_bowser_arena_end", + "80293944": "cutscene_bowser_arena", + "80293abc": "cutscene_star_spawn_store_info", + "80293ae8": "cutscene_star_spawn_focus_star", + "80293b70": "cutscene_star_spawn_update_boss_fight", + "80293bf4": "cutscene_star_spawn_fly_back", + "80293c2c": "cutscene_star_spawn", + "80293cb0": "cutscene_star_spawn_back", + "80293d5c": "cutscene_star_spawn_end", + "80293d90": "cutscene_exit_waterfall_warp", + "80293dd4": "cutscene_exit_to_castle_grounds_focus_mario", + "80293e7c": "cutscene_exit_waterfall", + "80293ed8": "cutscene_exit_to_castle_grounds_end", + "80293f2c": "cutscene_exit_fall_to_castle_grounds_warp", + "80293f70": "cutscene_exit_fall_to_castle_grounds", + "80293fcc": "cutscene_red_coin_star_start", + "80294024": "cutscene_red_coin_star_focus_xz", + "80294088": "cutscene_red_coin_star_focus_y", + "802940cc": "cutscene_red_coin_star_look_up_at_star", + "8029410c": "cutscene_red_coin_star_warp", + "802942cc": "cutscene_red_coin_star_set_fov", + "802942f0": "cutscene_red_coin_star", + "802943d4": "cutscene_red_coin_star_end", + "80294428": "cutscene_goto_cvar_pos", + "80294718": "cutscene_prepare_cannon_start", + "802947a4": "cutscene_prepare_cannon_fly_to_cannon", + "8029480c": "cannon_approach_prev", + "802948a0": "cutscene_prepare_cannon_fly_back", + "80294a14": "cutscene_prepare_cannon", + "80294a94": "cutscene_prepare_cannon_end", + "80294ae8": "water_death_move_to_mario_side", + "80294b78": "death_goto_mario", + "80294bb4": "cutscene_death_standing_start", + "80294c28": "cutscene_death_standing_goto_mario", + "80294c5c": "cutscene_death_standing", + "80294cc4": "cutscene_death_stomach_start", + "80294d48": "cutscene_death_stomach_goto_mario", + "80294db4": "cutscene_death_stomach", + "80294e24": "cutscene_bbh_death_start", + "80294ea8": "cutscene_bbh_death_goto_mario", + "80294ee8": "cutscene_bbh_death", + "80294f58": "cutscene_quicksand_death_start", + "80294f94": "cutscene_quicksand_death_goto_mario", + "80294fec": "cutscene_quicksand_death", + "802950b0": "cutscene_suffocation_fly_away", + "80295140": "cutscene_suffocation_stay_above_gas", + "802951f0": "cutscene_suffocation_rotate", + "80295270": "cutscene_suffocation", + "80295310": "cutscene_enter_pool_start", + "802953dc": "cutscene_enter_pool_loop", + "80295418": "cutscene_enter_pool", + "80295480": "cutscene_pyramid_top_explode_start", + "802954ec": "cutscene_pyramid_top_explode_zoom_in", + "80295518": "cutscene_pyramid_top_explode_focus", + "80295580": "cutscene_pyramid_top_explode_warp", + "80295670": "cutscene_pyramid_top_explode_closeup", + "80295740": "cutscene_pyramid_top_explode_cam_shake", + "8029576c": "cutscene_pyramid_top_explode_warp_back", + "802957c8": "cutscene_pyramid_top_explode", + "80295894": "cutscene_pyramid_top_explode_end", + "802958d4": "cutscene_enter_pyramid_top_start", + "80295930": "cutscene_enter_pyramid_top", + "80295a58": "cutscene_dialog_start", + "80295bf0": "cutscene_dialog_move_mario_shoulder", + "80295e24": "cutscene_dialog_create_dialog_box", + "80295e8c": "cutscene_dialog", + "80295fb0": "cutscene_dialog_set_flag", + "80295fd8": "cutscene_dialog_end", + "80296020": "cutscene_read_message_start", + "80296160": "cutscene_read_message", + "802962c8": "cutscene_read_message_set_flag", + "802962f0": "cutscene_read_message_end", + "80296318": "cutscene_exit_succ_start", + "802963b8": "cutscene_non_painting_set_cam_pos", + "8029652c": "cutscene_non_painting_set_cam_focus", + "8029665c": "cutscene_exit_bowser_succ_focus_left", + "8029669c": "cutscene_exit_bowser_key_toss_shake", + "802966e4": "cutscene_exit_succ_shake_landing", + "80296710": "cutscene_exit_bowser_succ", + "802967c4": "cutscene_non_painting_end", + "8029685c": "cutscene_exit_non_painting_succ_override_cvar", + "802968a0": "cutscene_exit_non_painting_succ", + "8029695c": "cutscene_non_painting_death_start", + "802969f8": "cutscene_exit_bowser_death", + "80296a64": "cutscene_non_painting_death_override_offset", + "80296b30": "cutscene_non_painting_death", + "80296bc8": "cutscene_cap_switch_press_start", + "80296c4c": "cutscene_cap_switch_press_rotate_around_mario", + "80296d60": "cutscene_cap_switch_press_lower_cam", + "80296da8": "cutscene_cap_switch_press_approach_mario", + "80296eb4": "cutscene_cap_switch_press_pan_left", + "80296f38": "cutscene_cap_switch_press_create_dialog", + "80296fa8": "cutscene_cap_switch_press", + "80297148": "cutscene_unlock_key_door_start", + "8029720c": "cutscene_unlock_key_door_approach_mario", + "80297290": "cutscene_unlock_key_door_focus_lock", + "802972ec": "cutscene_unlock_key_door_stub", + "80297300": "cutscene_unlock_key_door_fly_back", + "80297384": "cutscene_unlock_key_door_fov_shake", + "802973b0": "cutscene_unlock_key_door", + "80297464": "intro_peach_move_camera_start_to_pipe", + "80297560": "peach_letter_text", + "8029758c": "play_sound_peach_reading_letter", + "802975c4": "cutscene_intro_peach_start_to_pipe_spline", + "8029762c": "cutscene_intro_peach_dialog", + "802976bc": "cutscene_intro_peach_follow_pipe_spline", + "80297728": "cutscene_intro_peach_clear_cutscene_status", + "80297748": "cutscene_intro_peach_zoom_fov", + "80297784": "cutscene_intro_peach_reset_spline", + "802977c8": "cutscene_intro_peach_handheld_shake_off", + "802977f4": "intro_pipe_exit_text", + "80297820": "play_sound_intro_turn_on_hud", + "8029784c": "cutscene_intro_peach_fly_to_pipe", + "80297908": "cutscene_intro_peach_mario_appears", + "80297a38": "cutscene_intro_peach_reset_fov", + "80297a64": "cutscene_intro_peach_letter", + "80297b58": "cutscene_end_waving_start", + "80297b84": "cutscene_end_waving", + "80297c14": "cutscene_credits_reset_spline", + "80297c40": "cutscene_credits", + "802980dc": "cutscene_sliding_doors_open_start", + "8029819c": "cutscene_sliding_doors_open_set_cvars", + "80298218": "cutscene_sliding_doors_go_under_doorway", + "80298254": "cutscene_sliding_doors_fly_back_up", + "80298290": "cutscene_sliding_doors_follow_mario", + "802983b4": "cutscene_sliding_doors_open", + "80298458": "cutscene_double_doors_end", + "802984a0": "cutscene_enter_painting_stub", + "802984b4": "cutscene_enter_painting", + "802987b0": "cutscene_exit_painting_start", + "8029894c": "cutscene_exit_painting_move_to_mario", + "802989e8": "cutscene_exit_painting_move_to_floor", + "80298af8": "cutscene_exit_painting", + "80298ba0": "cutscene_unused_exit_start", + "80298c2c": "cutscene_unused_exit_focus_mario", + "80298ccc": "cutscene_exit_painting_end", + "80298d44": "cutscene_enter_cannon_end", + "80298d9c": "cutscene_enter_cannon_raise", + "80298fe8": "cutscene_enter_cannon_start", + "80299100": "cutscene_door_start", + "80299154": "cutscene_door_fix_cam", + "802991a8": "cutscene_door_loop", + "802991f0": "cutscene_door_move_behind_mario", + "802992cc": "cutscene_door_follow_mario", + "80299360": "cutscene_door_end", + "80299404": "cutscene_door_mode", + "802994e8": "play_cutscene", + "8029a2f8": "cutscene_event", + "8029a37c": "cutscene_spawn_obj", + "8029a3b4": "set_fov_shake", + "8029a41c": "set_fov_shake_from_point", + "8029a4d0": "shake_camera_fov", + "8029a5e8": "set_fov_30", + "8029a60c": "approach_fov_20", + "8029a64c": "set_fov_45", + "8029a670": "set_fov_29", + "8029a694": "zoom_fov_30", + "8029a6f4": "fov_default", + "8029a858": "approach_fov_30", + "8029a894": "approach_fov_60", + "8029a8d0": "approach_fov_45", + "8029a968": "approach_fov_80", + "8029a9a4": "set_fov_bbh", + "8029aa3c": "geo_camera_fov", + "8029ab94": "set_fov_function", + "8029abb0": "cutscene_set_fov_shake_preset", + "8029ac30": "set_fov_shake_from_point_preset", + "8029aef8": "obj_rotate_towards_point", + "8029af98": "intro_peach_set_pos_and_opacity", + "8029b08c": "bhv_intro_peach_loop", + "8029b28c": "intro_lakitu_set_offset_from_camera", + "8029b358": "intro_lakitu_set_focus", + "8029b3c8": "intro_lakitu_set_pos_and_focus", + "8029b49c": "bhv_intro_lakitu_loop", + "8029bde4": "bhv_end_birds_1_loop", + "8029bf64": "bhv_end_birds_2_loop", + "8029c0e4": "spawn_child_obj_relative", + "8029c254": "bhv_intro_scene_loop", + "8029c770": "nop_change_course", + "8029c780": "copy_mario_state_to_object", + "8029c9cc": "spawn_particle", + "8029ca58": "bhv_mario_update", + "8029cb34": "update_objects_starting_at", + "8029cbc8": "update_objects_during_time_stop", + "8029cd28": "update_objects_in_list", + "8029cd98": "unload_deactivated_objects_in_list", + "8029ce58": "set_object_respawn_info_bits", + "8029cedc": "unload_objects_from_area", + "8029cfb0": "spawn_objects_from_info", + "8029d1d8": "stub_obj_list_processor_1", + "8029d1e8": "clear_objects", + "8029d324": "update_terrain_objects", + "8029d374": "update_non_terrain_objects", + "8029d428": "unload_deactivated_objects", + "8029d690": "update_objects", + "8029d890": "geo_update_projectile_pos_from_parent", + "8029d924": "geo_update_layer_transparency", + "8029db48": "geo_switch_anim_state", + "8029dbd4": "geo_switch_area", + "8029dcd4": "obj_update_pos_from_parent_transformation", + "8029dda8": "obj_apply_scale_to_matrix", + "8029de80": "create_transformation_from_matrices", + "8029e1b0": "obj_set_held_state", + "8029e27c": "lateral_dist_between_objects", + "8029e2f8": "dist_between_objects", + "8029e398": "cur_obj_forward_vel_approach_upward", + "8029e3e8": "approach_f32_signed", + "8029e494": "approach_f32_symmetric", + "8029e530": "approach_s16_symmetric", + "8029e5ec": "cur_obj_rotate_yaw_toward", + "8029e694": "obj_angle_to_object", + "8029e714": "obj_turn_toward_object", + "8029e8bc": "obj_set_parent_relative_pos", + "8029e914": "obj_set_pos", + "8029e96c": "obj_set_angle", + "8029e9ac": "spawn_object_abs_with_rot", + "8029ea24": "spawn_object_rel_with_rot", + "8029eaac": "spawn_obj_with_transform_flags", + "8029eb04": "spawn_water_droplet", + "8029ed20": "spawn_object_at_origin", + "8029edcc": "spawn_object", + "8029ee24": "try_to_spawn_object", + "8029eeb8": "spawn_object_with_scale", + "8029ef64": "spawn_object_relative", + "8029effc": "spawn_object_relative_with_scale", + "8029f070": "cur_obj_move_using_vel", + "8029f0c8": "obj_copy_graph_y_offset", + "8029f0e0": "obj_copy_pos_and_angle", + "8029f120": "obj_copy_pos", + "8029f148": "obj_copy_angle", + "8029f188": "obj_set_gfx_pos_from_pos", + "8029f1b0": "obj_init_animation", + "8029f200": "linear_mtxf_mul_vec3f", + "8029f274": "linear_mtxf_transpose_mul_vec3f", + "8029f2ec": "obj_apply_scale_to_transform", + "8029f3a8": "obj_copy_scale", + "8029f3d0": "obj_scale_xyz", + "8029f404": "obj_scale", + "8029f430": "cur_obj_scale", + "8029f464": "cur_obj_init_animation", + "8029f4b4": "cur_obj_init_animation_with_sound", + "8029f514": "cur_obj_init_animation_with_accel_and_sound", + "8029f59c": "obj_init_animation_with_sound", + "8029f600": "cur_obj_enable_rendering_and_become_tangible", + "8029f620": "cur_obj_enable_rendering", + "8029f644": "cur_obj_disable_rendering_and_become_intangible", + "8029f66c": "cur_obj_disable_rendering", + "8029f694": "cur_obj_unhide", + "8029f6bc": "cur_obj_hide", + "8029f6e0": "cur_obj_set_pos_relative", + "8029f7d8": "cur_obj_set_pos_relative_to_parent", + "8029f820": "cur_obj_enable_rendering_2", + "8029f848": "cur_obj_unused_init_on_floor", + "8029f8ec": "obj_set_face_angle_to_move_angle", + "8029f914": "get_object_list_from_behavior", + "8029f95c": "cur_obj_nearest_object_with_behavior", + "8029f998": "cur_obj_dist_to_nearest_object_with_behavior", + "8029f9ec": "cur_obj_find_nearest_object_with_behavior", + "8029fb1c": "find_unimportant_object", + "8029fb68": "count_unimportant_objects", + "8029fbdc": "count_objects_with_behavior", + "8029fc9c": "cur_obj_find_nearby_held_actor", + "8029fdb4": "cur_obj_change_action", + "8029fe00": "cur_obj_set_vel_from_mario_vel", + "8029fe6c": "cur_obj_reverse_animation", + "8029fea4": "cur_obj_extend_animation_if_at_end", + "8029ff04": "cur_obj_check_if_near_animation_end", + "8029ffa4": "cur_obj_check_if_at_animation_end", + "802a0008": "cur_obj_check_anim_frame", + "802a0050": "cur_obj_check_anim_frame_in_range", + "802a00ac": "cur_obj_check_frame_prior_current_frame", + "802a0114": "mario_is_in_air_action", + "802a0154": "mario_is_dive_sliding", + "802a0198": "cur_obj_set_y_vel_and_animation", + "802a01d8": "cur_obj_unrender_and_reset_state", + "802a0380": "cur_obj_get_thrown_or_placed", + "802a0474": "cur_obj_get_dropped", + "802a04c0": "cur_obj_set_model", + "802a04f0": "mario_set_flag", + "802a0514": "cur_obj_clear_interact_status_flag", + "802a0568": "obj_mark_for_deletion", + "802a057c": "cur_obj_disable", + "802a05b4": "cur_obj_become_intangible", + "802a05d4": "cur_obj_become_tangible", + "802a05f0": "obj_become_tangible", + "802a0604": "cur_obj_update_floor_height", + "802a064c": "cur_obj_update_floor_height_and_get_floor", + "802a079c": "cur_obj_apply_drag_xz", + "802a0e68": "cur_obj_move_y", + "802a113c": "cur_obj_unused_resolve_wall_collisions", + "802a11a8": "abs_angle_diff", + "802a120c": "cur_obj_move_xz_using_fvel_and_yaw", + "802a12a4": "cur_obj_move_y_with_terminal_vel", + "802a1308": "cur_obj_compute_vel_xz", + "802a1370": "increment_velocity_toward_range", + "802a1424": "obj_check_if_collided_with_object", + "802a148c": "cur_obj_set_behavior", + "802a14c4": "obj_set_behavior", + "802a14fc": "cur_obj_has_behavior", + "802a1554": "obj_has_behavior", + "802a15ac": "cur_obj_lateral_dist_from_mario_to_home", + "802a1634": "cur_obj_lateral_dist_to_home", + "802a16ac": "cur_obj_outside_home_square", + "802a1774": "cur_obj_outside_home_rectangle", + "802a184c": "cur_obj_set_pos_to_home", + "802a188c": "cur_obj_set_pos_to_home_and_stop", + "802a18dc": "cur_obj_shake_y", + "802a1930": "cur_obj_start_cam_event", + "802a1960": "set_mario_interact_hoot_if_in_range", + "802a19ac": "obj_set_billboard", + "802a19c8": "cur_obj_set_hitbox_radius_and_height", + "802a19f0": "cur_obj_set_hurtbox_radius_and_height", + "802a1b34": "obj_spawn_loot_blue_coins", + "802a1b8c": "obj_spawn_loot_yellow_coins", + "802a1bdc": "cur_obj_spawn_loot_coin_at_mario_pos", + "802a1c68": "cur_obj_abs_y_dist_to_home", + "802a1cc4": "cur_obj_advance_looping_anim", + "802a1f3c": "cur_obj_resolve_wall_collisions", + "802a2320": "cur_obj_update_floor_and_walls", + "802a2348": "cur_obj_move_standard", + "802a25b4": "cur_obj_move_using_vel_and_gravity", + "802a2644": "cur_obj_move_using_fvel_and_gravity", + "802a2674": "obj_set_pos_relative", + "802a2748": "cur_obj_angle_to_home", + "802a27b0": "obj_set_gfx_pos_at_obj_pos", + "802a2804": "obj_translate_local", + "802a2930": "obj_build_transform_from_pos_and_angle", + "802a2a18": "obj_set_throw_matrix_from_transform", + "802a2a84": "obj_build_transform_relative_to_parent", + "802a2b28": "obj_create_transform_from_self", + "802a2b6c": "cur_obj_rotate_move_angle_using_vel", + "802a2bc4": "cur_obj_rotate_face_angle_using_vel", + "802a2c1c": "cur_obj_set_face_angle_to_move_angle", + "802a2c5c": "cur_obj_follow_path", + "802a2ed4": "chain_segment_init", + "802a2f14": "random_f32_around_zero", + "802a2f5c": "obj_scale_random", + "802a2fc0": "obj_translate_xyz_random", + "802a308c": "obj_translate_xz_random", + "802a31e0": "cur_obj_set_pos_via_transform", + "802a3268": "cur_obj_reflect_move_angle_off_wall", + "802a32ac": "cur_obj_spawn_particles", + "802a34a4": "obj_set_hitbox", + "802a3604": "signum_positive", + "802a3634": "absf", + "802a3674": "absi", + "802a36a4": "cur_obj_wait_then_blink", + "802a3754": "cur_obj_is_mario_ground_pounding_platform", + "802a37ac": "spawn_mist_particles", + "802a37dc": "spawn_mist_particles_with_sound", + "802a3818": "cur_obj_push_mario_away", + "802a390c": "cur_obj_push_mario_away_from_cylinder", + "802a399c": "bhv_dust_smoke_loop", + "802a3a4c": "cur_obj_set_direction_table", + "802a3a88": "cur_obj_progress_direction_table", + "802a3b28": "stub_obj_helpers_3", + "802a3b40": "cur_obj_scale_over_time", + "802a3c18": "cur_obj_set_pos_to_home_with_debug", + "802a3cec": "stub_obj_helpers_4", + "802a3cfc": "cur_obj_is_mario_on_platform", + "802a3d40": "cur_obj_shake_y_until", + "802a3dd4": "cur_obj_move_up_and_down", + "802a3e30": "cur_obj_call_action_function", + "802a3ef8": "spawn_base_star_with_no_lvl_exit", + "802a3f24": "bit_shift_left", + "802a3f48": "cur_obj_mario_far_away", + "802a404c": "is_mario_moving_fast_or_in_air", + "802a40b8": "is_item_in_array", + "802a4120": "bhv_init_room", + "802a4210": "cur_obj_enable_rendering_if_mario_in_room", + "802a4360": "cur_obj_set_hitbox_and_die_if_attacked", + "802a4440": "obj_explode_and_spawn_coins", + "802a44f4": "obj_set_collision_data", + "802a452c": "cur_obj_if_hit_wall_bounce_away", + "802a4564": "cur_obj_hide_if_mario_far_away_y", + "802a45e4": "geo_offset_klepto_held_object", + "802a462c": "geo_offset_klepto_debug", + "802a46cc": "obj_is_hidden", + "802a4704": "enable_time_stop", + "802a4728": "disable_time_stop", + "802a4750": "set_time_stop_flags", + "802a4774": "clear_time_stop_flags", + "802a47a0": "cur_obj_can_mario_activate_textbox", + "802a48bc": "cur_obj_can_mario_activate_textbox_2", + "802a4960": "cur_obj_update_dialog", + "802a4be4": "cur_obj_update_dialog_with_cutscene", + "802a4f04": "cur_obj_has_model", + "802a4f58": "cur_obj_align_gfx_with_floor", + "802a5034": "mario_is_within_rectangle", + "802a50fc": "cur_obj_shake_screen", + "802a513c": "obj_attack_collided_from_other_object", + "802a51ac": "cur_obj_was_attacked_or_ground_pounded", + "802a5228": "obj_copy_behavior_params", + "802a5248": "cur_obj_init_animation_and_anim_frame", + "802a5288": "cur_obj_init_animation_and_check_if_near_end", + "802a52c4": "cur_obj_init_animation_and_extend_if_at_end", + "802a52f8": "cur_obj_check_grabbed_mario", + "802a5358": "player_performed_grab_escape_action", + "802a540c": "cur_obj_unused_play_footstep_sound", + "802a5460": "enable_time_stop_including_mario", + "802a5498": "disable_time_stop_including_mario", + "802a54d8": "cur_obj_check_interacted", + "802a5524": "cur_obj_spawn_loot_blue_coin", + "802a5588": "cur_obj_spawn_star_at_y_offset", + "802a5620": "star_door_update_pos", + "802a56bc": "bhv_star_door_loop", + "802a58dc": "bhv_piranha_particle_loop", + "802a597c": "mr_i_piranha_particle_act_0", + "802a5a44": "mr_i_piranha_particle_act_1", + "802a5aa0": "bhv_mr_i_particle_loop", + "802a5acc": "spawn_mr_i_particle", + "802a5bd4": "bhv_mr_i_body_loop", + "802a5d4c": "mr_i_act_3", + "802a6518": "mr_i_act_2", + "802a68a0": "mr_i_act_1", + "802a6ad8": "mr_i_act_0", + "802a6b7c": "bhv_mr_i_loop", + "802a6c20": "bhv_pole_init", + "802a6c74": "bhv_giant_pole_loop", + "802a6cf4": "bhv_thi_huge_island_top_loop", + "802a6d64": "bhv_thi_tiny_island_top_loop", + "802a6ee4": "cap_switch_act_0", + "802a7020": "cap_switch_act_1", + "802a708c": "cap_switch_act_2", + "802a7160": "cap_switch_act_3", + "802a7170": "bhv_cap_switch_loop", + "802a719c": "geo_update_held_mario_pos", + "802a7230": "bhv_bobomb_anchor_mario_loop", + "802a7264": "king_bobomb_act_0", + "802a7384": "mario_is_far_below_object", + "802a73d8": "king_bobomb_act_2", + "802a7598": "king_bobomb_act_3", + "802a7804": "king_bobomb_act_1", + "802a78d8": "king_bobomb_act_6", + "802a7a60": "king_bobomb_act_7", + "802a7b1c": "king_bobomb_act_8", + "802a7b5c": "king_bobomb_act_4", + "802a7d14": "king_bobomb_act_5", + "802a7fbc": "king_bobomb_move", + "802a8064": "bhv_king_bobomb_loop", + "802a816c": "bhv_beta_chest_bottom_init", + "802a81e8": "bhv_beta_chest_bottom_loop", + "802a821c": "bhv_beta_chest_lid_loop", + "802a8370": "bhv_water_air_bubble_init", + "802a83a0": "bhv_water_air_bubble_loop", + "802a8630": "bhv_bubble_wave_init", + "802a86bc": "scale_bubble_random", + "802a870c": "bhv_bubble_maybe_loop", + "802a88a4": "bhv_small_water_wave_loop", + "802a8a38": "scale_bubble_sin", + "802a8b18": "bhv_particle_init", + "802a8bc0": "bhv_particle_loop", + "802a8c88": "bhv_small_bubbles_loop", + "802a8cdc": "bhv_fish_group_loop", + "802a8d48": "bhv_water_waves_init", + "802a8d98": "bhv_cannon_base_unused_loop", + "802a8dc0": "opened_cannon_act_0", + "802a8f40": "opened_cannon_act_4", + "802a9114": "opened_cannon_act_6", + "802a92fc": "opened_cannon_act_5", + "802a93f8": "opened_cannon_act_1", + "802a9440": "opened_cannon_act_2", + "802a9460": "opened_cannon_act_3", + "802a9498": "bhv_cannon_base_loop", + "802a94f8": "bhv_cannon_barrel_loop", + "802a958c": "common_anchor_mario_behavior", + "802a9708": "bhv_chuckya_anchor_mario_loop", + "802a973c": "unknown_chuckya_function", + "802a98c4": "approach_forward_vel", + "802a9994": "chuckya_act_0", + "802a9d08": "chuckya_act_1", + "802a9f54": "chuckya_act_3", + "802a9fc8": "chuckya_act_2", + "802aa02c": "chuckya_move", + "802aa0ac": "bhv_chuckya_loop", + "802aa1b8": "bhv_wf_breakable_wall_loop", + "802aa280": "check_mario_attacking", + "802aa3c8": "init_kickable_board_rock", + "802aa3f4": "bhv_kickable_board_loop", + "802aa700": "bhv_tower_door_loop", + "802aa774": "bhv_wf_rotating_wooden_platform_loop", + "802aa830": "bhv_rotating_platform_loop", + "802aa948": "set_koopa_shell_underwater_hitbox", + "802aa97c": "bhv_koopa_shell_underwater_loop", + "802aaa60": "bhv_warp_loop", + "802aab54": "bhv_fading_warp_loop", + "802aac48": "bhv_white_puff_exploding_loop", + "802aae8c": "spawn_mist_particles_variable", + "802aaf48": "bhv_spawned_star_init", + "802aaffc": "set_sparkle_spawn_star_hitbox", + "802ab060": "set_home_to_mario", + "802ab158": "set_y_home_to_pos", + "802ab18c": "slow_star_rotation", + "802ab1c8": "bhv_spawned_star_loop", + "802ab558": "bhv_spawn_star_no_level_exit", + "802ab5c8": "bhv_coin_sparkles_init", + "802ab650": "bhv_yellow_coin_init", + "802ab70c": "bhv_yellow_coin_loop", + "802ab748": "bhv_temp_coin_loop", + "802ab7a4": "bhv_coin_init", + "802ab860": "bhv_coin_loop", + "802aba40": "bhv_coin_formation_spawn_loop", + "802abc04": "spawn_coin_in_formation", + "802abee4": "bhv_coin_formation_init", + "802abf0c": "bhv_coin_formation_loop", + "802ac068": "coin_inside_boo_act_1", + "802ac15c": "coin_inside_boo_act_0", + "802ac294": "bhv_coin_inside_boo_loop", + "802ac2c0": "bhv_coin_sparkles_loop", + "802ac2ec": "bhv_golden_coin_sparkles_loop", + "802ac3a8": "bhv_punch_tiny_triangle_loop", + "802ac4a0": "bhv_punch_tiny_triangle_init", + "802ac5b4": "bhv_wall_tiny_star_particle_loop", + "802ac678": "bhv_tiny_star_particles_init", + "802ac78c": "bhv_pound_tiny_star_particle_loop", + "802ac864": "bhv_pound_tiny_star_particle_init", + "802ac910": "door_animation_and_reset", + "802ac958": "set_door_camera_event", + "802ac9d0": "play_door_open_noise", + "802aca6c": "play_warp_door_open_noise", + "802acac8": "bhv_door_loop", + "802acc3c": "bhv_door_init", + "802ace80": "bhv_star_door_loop_2", + "802ad078": "grindel_thwomp_act_4", + "802ad10c": "grindel_thwomp_act_2", + "802ad1a4": "grindel_thwomp_act_3", + "802ad238": "grindel_thwomp_act_1", + "802ad2d0": "grindel_thwomp_act_0", + "802ad34c": "bhv_grindel_thwomp_loop", + "802ad378": "bhv_tumbling_bridge_platform_loop", + "802ad580": "tumbling_bridge_act_1", + "802ad76c": "tumbling_bridge_act_2", + "802ad7f4": "tumbling_bridge_act_3", + "802ad828": "tumbling_bridge_act_0", + "802ad890": "bhv_tumbling_bridge_loop", + "802ad8bc": "elevator_starting_shake", + "802ad8f0": "elevator_act_0", + "802ada4c": "elevator_act_1", + "802adb88": "elevator_act_2", + "802adce4": "elevator_act_4", + "802add70": "elevator_act_3", + "802addf8": "bhv_elevator_init", + "802adf6c": "bhv_elevator_loop", + "802adf98": "bhv_water_mist_spawn_loop", + "802adfd8": "bhv_water_mist_loop", + "802ae0cc": "spawn_triangle_break_particles", + "802ae238": "bhv_water_mist_2_loop", + "802ae304": "bhv_pound_white_puffs_init", + "802ae334": "spawn_mist_from_global", + "802ae360": "bhv_ground_sand_init", + "802ae394": "spawn_smoke_with_velocity", + "802ae45c": "clear_particle_flags", + "802ae48c": "bhv_ground_snow_init", + "802ae4c0": "spawn_wind_particles", + "802ae534": "bhv_wind_loop", + "802ae85c": "bhv_unused_particle_spawn_loop", + "802ae908": "bhv_ukiki_cage_star_loop", + "802aea6c": "ukiki_cage_act_wait_for_ukiki", + "802aeab8": "ukiki_cage_act_spin", + "802aeb1c": "ukiki_cage_act_fall", + "802aeb74": "ukiki_cage_act_hide", + "802aeb9c": "bhv_ukiki_cage_loop", + "802aebc8": "bhv_squishable_platform_loop", + "802aec40": "bhv_bitfs_sinking_platform_loop", + "802aeca8": "bhv_ddd_moving_pole_loop", + "802aecdc": "bhv_bitfs_sinking_cage_platform_loop", + "802aedc0": "bhv_beta_moving_flames_spawn_loop", + "802aeea4": "bhv_beta_moving_flames_loop", + "802aef1c": "bhv_flamethrower_flame_loop", + "802af1e8": "bhv_flamethrower_loop", + "802af3fc": "bhv_rr_rotating_bridge_platform_loop", + "802af448": "bhv_bouncing_fireball_flame_loop", + "802af5f8": "bhv_bouncing_fireball_loop", + "802af7c4": "bhv_bowser_shock_wave_loop", + "802af9cc": "bhv_black_smoke_upward_loop", + "802afa0c": "bhv_black_smoke_bowser_loop", + "802afae4": "bhv_black_smoke_mario_loop", + "802afbf8": "bhv_flame_mario_loop", + "802afce4": "bhv_beta_fish_splash_spawner_loop", + "802afd1c": "bhv_spindrift_loop", + "802afee8": "bhv_wf_solid_tower_platform_loop", + "802aff30": "bhv_wf_elevator_tower_platform_loop", + "802b00e4": "bhv_wf_sliding_tower_platform_loop", + "802b0244": "spawn_and_init_wf_platforms", + "802b039c": "spawn_wf_platform_group", + "802b04b4": "bhv_tower_platform_group_loop", + "802b0614": "bhv_tree_snow_or_leaf_loop", + "802b0974": "bhv_snow_leaf_particle_spawn_init", + "802b0b9c": "square_plat_set_yaw_until_timer", + "802b0bec": "bhv_squarish_path_moving_loop", + "802b0d48": "bhv_piranha_plant_waking_bubbles_loop", + "802b0df0": "bhv_piranha_plant_bubble_loop", + "802b1278": "bhv_purple_switch_loop", + "802b14f4": "check_if_moving_over_floor", + "802b15e8": "bhv_pushable_loop", + "802b1714": "breakable_box_init", + "802b17f4": "hidden_breakable_box_actions", + "802b19d8": "hidden_unbreakable_box_actions", + "802b1ae0": "bhv_hidden_object_loop", + "802b1b2c": "bhv_breakable_box_loop", + "802b1bb0": "geo_move_mario_part_from_parent", + "802b1c54": "bhv_heave_ho_throw_mario_loop", + "802b1d7c": "heave_ho_act_1", + "802b1e6c": "heave_ho_act_2", + "802b1ff4": "heave_ho_act_3", + "802b20a0": "heave_ho_act_0", + "802b2154": "heave_ho_move", + "802b2278": "bhv_heave_ho_loop", + "802b2340": "bhv_ccm_touched_star_spawn_loop", + "802b23e0": "bhv_unused_poundable_platform", + "802b2494": "bhv_beta_trampoline_spring_loop", + "802b25ac": "bhv_beta_trampoline_top_loop", + "802b26a4": "jumping_box_act_0", + "802b27d8": "jumping_box_act_1", + "802b2824": "jumping_box_free_update", + "802b288c": "bhv_jumping_box_loop", + "802b29b8": "bhv_boo_cage_loop", + "802b2bc8": "spawn_sparkle_particles", + "802b2d10": "bhv_alpha_boo_key_loop", + "802b3108": "bhv_beta_boo_key_loop", + "802b3134": "arc_to_goal_pos", + "802b3250": "grand_star_zero_velocity", + "802b329c": "bhv_grand_star_loop", + "802b3600": "bhv_bowser_key_loop", + "802b37b8": "bhv_white_puff_smoke_init", + "802b3810": "bhv_bullet_bill_init", + "802b3830": "bullet_bill_act_0", + "802b38b8": "bullet_bill_act_1", + "802b394c": "bullet_bill_act_2", + "802b3b08": "bullet_bill_act_3", + "802b3b24": "bullet_bill_act_4", + "802b3be0": "bhv_bullet_bill_loop", + "802b3c2c": "bowser_tail_anchor_act_0", + "802b3cdc": "bowser_tail_anchor_act_1", + "802b3d10": "bowser_tail_anchor_act_2", + "802b3d74": "bhv_bowser_tail_anchor_loop", + "802b3df4": "bhv_bowser_flame_spawn_loop", + "802b4080": "bhv_bowser_body_anchor_loop", + "802b4184": "bowser_spawn_shockwave", + "802b41fc": "bowser_bounce", + "802b4288": "bowser_set_anim_look_up_and_walk", + "802b4300": "bowser_set_anim_slow_gait", + "802b4368": "bowser_set_anim_look_down", + "802b43dc": "bowser_initialize_action", + "802b4478": "bowser_act_text_wait", + "802b44bc": "bowser_act_intro_walk", + "802b45f4": "bowser_bitdw_act_controller", + "802b473c": "bowser_bitfs_act_controller", + "802b48d4": "bowser_general_bits_act_controller", + "802b4a1c": "bowser_set_act_jump", + "802b4a3c": "bowser_bits_act_controller", + "802b4af4": "bowser_reset_fallen_off_stage", + "802b4bac": "bowser_act_unused_slow_walk", + "802b4be8": "bowser_act_default", + "802b4ca4": "bowser_act_breath_fire", + "802b4d14": "bowser_act_walk_to_mario", + "802b4f00": "bowser_act_teleport", + "802b5104": "bowser_act_spit_fire_into_sky", + "802b5218": "bowser_act_hit_mine", + "802b53f4": "bowser_set_anim_in_air", + "802b5444": "bowser_land", + "802b5554": "bowser_short_second_hop", + "802b55cc": "bowser_act_jump", + "802b5798": "bowser_act_jump_towards_mario", + "802b58bc": "bowser_act_hit_edge", + "802b59cc": "bowser_act_spit_fire_onto_floor", + "802b5aec": "bowser_turn_on_timer", + "802b5c00": "bowser_act_turn_from_edge", + "802b5c40": "bowser_act_charge_mario", + "802b5f6c": "bowser_check_hit_mine", + "802b5fec": "bowser_act_thrown_dropped", + "802b611c": "bowser_set_goal_invisible", + "802b6190": "bowser_act_jump_onto_stage", + "802b6568": "bowser_act_dance", + "802b65d0": "bowser_spawn_grand_star_key", + "802b6670": "bowser_fly_back_dead", + "802b6730": "bowser_dead_bounce", + "802b67d4": "bowser_dead_wait_for_mario", + "802b6878": "bowser_dead_twirl_into_trophy", + "802b6a10": "bowser_dead_hide", + "802b6a78": "bowser_dead_not_bits_end", + "802b6bac": "bowser_dead_bits_end", + "802b6cf0": "bowser_act_dead", + "802b6e40": "bowser_tilt_platform", + "802b6ee0": "bowser_act_ride_tilting_platform", + "802b711c": "bowser_check_fallen_off_stage", + "802b71e4": "bowser_free_update", + "802b72d4": "bowser_held_update", + "802b7418": "bowser_thrown_dropped_update", + "802b75a4": "bhv_bowser_loop", + "802b7878": "bhv_bowser_init", + "802b798c": "geo_update_body_rot_from_parent", + "802b7a20": "bowser_open_eye_switch", + "802b7c64": "geo_switch_bowser_eyes", + "802b7d44": "geo_bits_bowser_coloring", + "802b7e68": "falling_bowser_plat_act_0", + "802b7ef0": "falling_bowser_plat_act_1", + "802b8024": "falling_bowser_plat_act_2", + "802b8384": "bhv_falling_bowser_platform_loop", + "802b83b0": "bowser_flame_despawn", + "802b8434": "bowser_flame_should_despawn", + "802b84ac": "bhv_flame_bowser_init", + "802b85b0": "bhv_flame_large_burning_out_init", + "802b8654": "bowser_flame_move", + "802b8734": "bhv_flame_bowser_loop", + "802b8960": "bhv_flame_moving_forward_growing_init", + "802b89ec": "bhv_flame_moving_forward_growing_loop", + "802b8b1c": "bhv_flame_floating_landing_init", + "802b8c38": "bhv_flame_floating_landing_loop", + "802b8d68": "bhv_blue_bowser_flame_init", + "802b8e7c": "bhv_blue_bowser_flame_loop", + "802b9034": "bhv_flame_bouncing_init", + "802b90ec": "bhv_flame_bouncing_loop", + "802b921c": "bhv_blue_flames_group_loop", + "802b935c": "bhv_blue_fish_movement_loop", + "802b9790": "bhv_tank_fish_group_loop", + "802b98d4": "vec3f_copy_2", + "802b98fc": "bhv_checkerboard_elevator_group_init", + "802b9a78": "checkerboard_plat_act_move_y", + "802b9af8": "checkerboard_plat_act_rotate", + "802b9bb4": "bhv_checkerboard_platform_init", + "802b9bd8": "bhv_checkerboard_platform_loop", + "802b9e94": "bhv_ddd_warp_loop", + "802b9efc": "water_level_pillar_undrained", + "802ba13c": "water_level_pillar_drained", + "802ba19c": "bhv_water_level_pillar_init", + "802ba1e0": "bhv_water_level_pillar_loop", + "802ba25c": "bhv_invisible_objects_under_bridge_init", + "802ba2b0": "geo_scale_bowser_key", + "802ba2f8": "bhv_bowser_key_unlock_door_loop", + "802ba458": "bhv_bowser_key_course_exit_loop", + "802ba5bc": "bhv_moat_grills_loop", + "802ba608": "bhv_rotating_clock_arm_loop", + "802ba7e0": "handle_cap_ukiki_reset", + "802ba868": "is_cap_ukiki_and_mario_has_normal_cap_on_head", + "802ba8c4": "geo_update_projectile_pos_from_parent_copy", + "802ba958": "idle_ukiki_taunt", + "802bab7c": "ukiki_act_idle", + "802bae40": "ukiki_act_return_home", + "802baec4": "ukiki_act_wait_to_respawn", + "802baf10": "ukiki_act_unused_turn", + "802baf64": "ukiki_act_turn_to_mario", + "802bb07c": "ukiki_act_run", + "802bb288": "ukiki_act_jump", + "802bb3b8": "ukiki_act_go_to_cage", + "802bb798": "ukiki_free_loop", + "802bb888": "cage_ukiki_held_loop", + "802bba3c": "cap_ukiki_held_loop", + "802bbb98": "bhv_ukiki_init", + "802bbc0c": "bhv_ukiki_loop", + "802bbd6c": "lll_octagonal_mesh_move", + "802bbfd8": "lll_octagonal_mesh_find_y_offset", + "802bc0f0": "bhv_lll_moving_octagonal_mesh_platform_loop", + "802bc22c": "bhv_lll_sinking_rock_block_loop", + "802bc294": "bhv_lll_rotating_hex_flame_loop", + "802bc348": "fire_bar_spawn_flames", + "802bc4f4": "fire_bar_act_0", + "802bc538": "fire_bar_act_1", + "802bc590": "fire_bar_act_2", + "802bc5fc": "fire_bar_act_3", + "802bc618": "bhv_lll_rotating_block_fire_bars_loop", + "802bc660": "bhv_lll_wood_piece_loop", + "802bc728": "bhv_lll_floating_wood_bridge_loop", + "802bc898": "bhv_volcano_flames_loop", + "802bc934": "hexagonal_ring_spawn_flames", + "802bca74": "bhv_lll_rotating_hexagonal_ring_loop", + "802bcce8": "sinking_rectangular_plat_actions", + "802bcda8": "bhv_lll_sinking_rectangular_platform_loop", + "802bce58": "bhv_lll_sinking_square_platforms_loop", + "802bce9c": "create_transform_from_normals", + "802bcf40": "bhv_platform_normals_init", + "802bcfc4": "approach_by_increment", + "802bd058": "bhv_tilting_inverted_pyramid_loop", + "802bd3e4": "koopa_shell_spawn_water_drop", + "802bd488": "bhv_koopa_shell_flame_loop", + "802bd5dc": "bhv_koopa_shell_flame_spawn", + "802bd62c": "koopa_shell_spawn_sparkles", + "802bd680": "bhv_koopa_shell_loop", + "802bd8d0": "tox_box_shake_screen", + "802bd91c": "tox_box_move", + "802bdb04": "tox_box_act_4", + "802bdb3c": "tox_box_act_5", + "802bdb74": "tox_box_act_6", + "802bdbac": "tox_box_act_7", + "802bdbe4": "tox_box_act_1", + "802bdc7c": "tox_box_act_2", + "802bdcc8": "tox_box_act_3", + "802bdd14": "tox_box_act_0", + "802bdd68": "bhv_tox_box_loop", + "802bdd9c": "piranha_plant_act_idle", + "802bde10": "piranha_plant_check_interactions", + "802bdeec": "piranha_plant_act_sleeping", + "802be034": "piranha_plant_act_woken_up", + "802be0b8": "piranha_plant_reset_when_far", + "802be0ec": "piranha_plant_attacked", + "802be150": "piranha_plant_act_shrink_and_die", + "802be234": "piranha_plant_act_wait_to_respawn", + "802be278": "piranha_plant_act_respawn", + "802be350": "piranha_plant_act_biting", + "802be49c": "mario_moving_fast_enough_to_make_piranha_plant_bite", + "802be50c": "piranha_plant_act_stopped_biting", + "802be5a0": "bhv_piranha_plant_loop", + "802be628": "bhv_lll_bowser_puzzle_spawn_piece", + "802be6d4": "bhv_lll_bowser_puzzle_spawn_pieces", + "802be79c": "bhv_lll_bowser_puzzle_loop", + "802be8a8": "bhv_lll_bowser_puzzle_piece_action_0", + "802be8b8": "bhv_lll_bowser_puzzle_piece_action_1", + "802be8f4": "bhv_lll_bowser_puzzle_piece_update", + "802be9dc": "bhv_lll_bowser_puzzle_piece_move", + "802beb14": "bhv_lll_bowser_puzzle_piece_idle", + "802beb54": "bhv_lll_bowser_puzzle_piece_move_left", + "802beb8c": "bhv_lll_bowser_puzzle_piece_move_right", + "802bebc4": "bhv_lll_bowser_puzzle_piece_move_up", + "802bebfc": "bhv_lll_bowser_puzzle_piece_move_down", + "802bec34": "bhv_lll_bowser_puzzle_piece_loop", + "802becb0": "set_obj_anim_with_accel_and_sound", + "802bed7c": "play_penguin_walking_sound", + "802bedec": "tuxies_mother_act_2", + "802bef8c": "tuxies_mother_act_1", + "802bf1d8": "tuxies_mother_act_0", + "802bf3c0": "bhv_tuxies_mother_loop", + "802bf424": "small_penguin_dive_with_mario", + "802bf474": "small_penguin_act_2", + "802bf57c": "small_penguin_act_1", + "802bf648": "small_penguin_act_3", + "802bf6e4": "small_penguin_act_4", + "802bf760": "small_penguin_act_0", + "802bf90c": "small_penguin_act_5", + "802bfa14": "small_penguin_free_actions", + "802bfa88": "bhv_small_penguin_loop", + "802bfbac": "geo_switch_tuxie_mother_eyes", + "802bff3c": "bhv_fish_spawner_loop", + "802c0768": "bhv_fish_loop", + "802c08a8": "bhv_wdw_express_elevator_loop", + "802c0aac": "bub_spawner_act_0", + "802c0b50": "bub_spawner_act_1", + "802c0ba4": "bub_spawner_act_2", + "802c0bc4": "bub_spawner_act_3", + "802c0be0": "bhv_bub_spawner_loop", + "802c0c0c": "bub_move_vertically", + "802c0cd4": "bub_act_0", + "802c0d44": "bub_act_1", + "802c0f90": "bub_act_2", + "802c1204": "bhv_bub_loop", + "802c12c0": "bhv_rotating_exclamation_box_loop", + "802c1308": "exclamation_box_act_0", + "802c13ec": "exclamation_box_act_1", + "802c14b0": "exclamation_box_act_2", + "802c15b8": "exclamation_box_act_3", + "802c17bc": "exclamation_box_spawn_contents", + "802c18d0": "exclamation_box_act_4", + "802c1988": "exclamation_box_act_5", + "802c19c0": "bhv_exclamation_box_loop", + "802c19fc": "bhv_sound_spawner_init", + "802c1a40": "bhv_bowsers_sub_loop", + "802c1a80": "bhv_sushi_shark_collision_loop", + "802c1a90": "bhv_sushi_shark_loop", + "802c1c44": "bhv_sunken_ship_part_loop", + "802c1cd4": "bhv_ship_part_3_loop", + "802c1e10": "bhv_jrb_sliding_box_loop", + "802c2190": "bhv_white_puff_1_loop", + "802c2274": "bhv_white_puff_2_loop", + "802c22b8": "bhv_hidden_blue_coin_loop", + "802c242c": "bhv_blue_coin_switch_loop", + "802c263c": "bhv_openable_cage_door_loop", + "802c26f8": "bhv_openable_grill_loop", + "802c2930": "bhv_init_changing_water_level_loop", + "802c2a24": "bhv_water_level_diamond_loop", + "802c2ce8": "tweester_scale_and_move", + "802c2ebc": "tweester_act_idle", + "802c2fbc": "tweester_act_chase", + "802c31c4": "tweester_act_hide", + "802c329c": "bhv_tweester_loop", + "802c32e8": "bhv_tweester_sand_particle_loop", + "802c3440": "bhv_boo_init", + "802c3684": "bhv_courtyard_boo_triplet_init", + "802c4824": "bhv_boo_loop", + "802c4f30": "bhv_big_boo_loop", + "802c515c": "bhv_boo_with_cage_init", + "802c51d4": "bhv_boo_with_cage_loop", + "802c5224": "bhv_merry_go_round_boo_manager_loop", + "802c53cc": "obj_set_secondary_camera_focus", + "802c53ec": "bhv_animated_texture_loop", + "802c5414": "bhv_boo_in_castle_loop", + "802c5688": "bhv_boo_boss_spawned_bridge_loop", + "802c5890": "bhv_bbh_tilting_trap_platform_loop", + "802c5a38": "bhv_haunted_bookshelf_loop", + "802c5ca8": "bhv_merry_go_round_loop", + "802c5dc0": "bhv_static_checkered_platform_loop", + "802c5f48": "bhv_beta_bowser_anchor_loop", + "802c5fdc": "bhv_play_music_track_when_touched_loop", + "802c6050": "bhv_floor_trap_in_castle_loop", + "802c60ac": "bhv_castle_floor_trap_init", + "802c6150": "bhv_castle_floor_trap_open_detect", + "802c61d4": "bhv_castle_floor_trap_open", + "802c6278": "bhv_castle_floor_trap_close_detect", + "802c62bc": "bhv_castle_floor_trap_close", + "802c6328": "bhv_castle_floor_trap_rotate", + "802c6348": "bhv_castle_floor_trap_loop", + "802c63e8": "bhv_pole_base_loop", + "802c64a4": "bhv_sparkle_spawn_loop", + "802c6538": "update_angle_from_move_flags", + "802c65c0": "bhv_scuttlebug_loop", + "802c6b6c": "bhv_scuttlebug_spawn_loop", + "802c6ca0": "whomp_play_sfx_from_pound_animation", + "802c6d6c": "whomp_act_0", + "802c6ec8": "whomp_act_7", + "802c6fb0": "whomp_act_1", + "802c710c": "whomp_act_2", + "802c7254": "whomp_act_3", + "802c72b4": "whomp_act_4", + "802c7380": "whomp_act_5", + "802c7428": "king_whomp_on_ground", + "802c75fc": "whomp_on_ground", + "802c76d4": "whomp_act_6", + "802c7858": "whomp_act_8", + "802c7998": "whomp_act_9", + "802c79d8": "bhv_whomp_loop", + "802c7a70": "bhv_water_splash_spawn_droplets", + "802c7b14": "bhv_water_droplet_loop", + "802c7cac": "bhv_idle_water_wave_loop", + "802c7d40": "bhv_water_droplet_splash_init", + "802c7d90": "bhv_bubble_splash_init", + "802c7dfc": "bhv_shallow_water_splash_init", + "802c7e5c": "bhv_wave_trail_shrink", + "802c7f98": "bhv_strong_wind_particle_loop", + "802c81b4": "cur_obj_spawn_strong_wind_particles", + "802c834c": "bhv_sl_snowman_wind_loop", + "802c863c": "bhv_sl_walking_penguin_loop", + "802c89f0": "update_mario_platform", + "802c8b4c": "get_mario_pos", + "802c8b8c": "set_mario_pos", + "802c8bc8": "apply_platform_displacement", + "802c8ec0": "apply_mario_platform_displacement", + "802c8f28": "clear_mario_platform", + "802c8f40": "debug_print_obj_collision", + "802c8fe4": "detect_object_hitbox_overlap", + "802c91ec": "detect_object_hurtbox_overlap", + "802c9388": "clear_object_collision", + "802c93f8": "check_collision_in_list", + "802c94ac": "check_player_object_collision", + "802c95b4": "check_pushable_object_collision", + "802c9630": "check_destructive_object_collision", + "802c9724": "detect_object_collisions", + "802c97d0": "unused_init_free_list", + "802c9840": "unused_try_allocate", + "802c98a4": "try_allocate_object", + "802c9950": "unused_deallocate", + "802c99b8": "init_free_object_list", + "802c9a3c": "clear_object_lists", + "802c9b68": "unload_object", + "802c9c00": "allocate_object", + "802c9f04": "create_object", + "802ca028": "mark_obj_for_deletion", + "802ca040": "exec_anim_sound_state", + "802ca144": "create_sound_spawner", + "802ca190": "cur_obj_play_sound_1", + "802ca1e0": "cur_obj_play_sound_2", + "802ca230": "calc_dist_to_volume_range_1", + "802ca2d4": "calc_dist_to_volume_range_2", + "802ca370": "stub_debug_1", + "802ca380": "stub_debug_2", + "802ca390": "stub_debug_3", + "802ca3a0": "stub_debug_4", + "802ca3b0": "get_current_clock", + "802ca3e0": "get_clock_difference", + "802ca418": "set_print_state_info", + "802ca460": "print_text_array_info", + "802ca51c": "set_text_array_x_y", + "802ca568": "print_debug_bottom_up", + "802ca5b8": "print_debug_top_down_objectinfo", + "802ca618": "print_debug_top_down_mapinfo", + "802ca680": "print_debug_top_down_normal", + "802ca6d0": "print_mapinfo", + "802ca8e8": "print_checkinfo", + "802ca918": "print_surfaceinfo", + "802ca94c": "print_stageinfo", + "802ca990": "print_string_array_info", + "802caa6c": "print_effectinfo", + "802caaa8": "print_enemyinfo", + "802caae4": "update_debug_dpadmask", + "802cabac": "debug_unknown_level_select_check", + "802cac20": "reset_debug_objectinfo", + "802cb0b0": "stub_debug_5", + "802cb0c0": "try_print_debug_mario_object_info", + "802cb1c0": "try_print_debug_mario_level_info", + "802cb264": "try_do_mario_debug_object_spawn", + "802cb564": "debug_enemy_unknown", + "802cb5c0": "set_and_reset_transition_fade_timer", + "802cb640": "set_transition_color_fade_alpha", + "802cb894": "vertex_transition_color", + "802cba18": "dl_transition_color", + "802cbbc4": "render_fade_transition_from_color", + "802cbc20": "render_fade_transition_into_color", + "802cbc7c": "calc_tex_transition_radius", + "802cbd54": "calc_tex_transition_time", + "802cbe64": "convert_tex_transition_angle_to_pos", + "802cbee0": "center_tex_transition_x", + "802cbf64": "center_tex_transition_y", + "802cbfe8": "make_tex_transition_vertex", + "802cc180": "load_tex_transition_vertex", + "802cc4d8": "render_textured_transition", + "802ccbe8": "render_screen_transition", + "802ccdc8": "render_cannon_circle_base", + "802cd1e8": "geo_cannon_circle_base", + "802cd280": "rotate_rectangle", + "802cd328": "atan2_deg", + "802cd388": "scale_shadow_with_distance", + "802cd444": "disable_shadow_with_distance", + "802cd48c": "dim_shadow_with_distance", + "802cd614": "get_water_level_below_shadow", + "802cd6c4": "init_shadow", + "802cd938": "get_texture_coords_9_vertices", + "802cd988": "get_texture_coords_4_vertices", + "802cd9ec": "make_shadow_vertex_at_xyz", + "802cdb20": "extrapolate_vertex_y_position", + "802cdb74": "get_vertex_coords", + "802cdc40": "calculate_vertex_xyz", + "802cde94": "floor_local_tilt", + "802cdf3c": "make_shadow_vertex", + "802ce128": "add_shadow_to_display_list", + "802ce2bc": "linearly_interpolate_solidity_positive", + "802ce3ec": "linearly_interpolate_solidity_negative", + "802ce524": "correct_shadow_solidity_for_animations", + "802ce690": "correct_lava_shadow_height", + "802ce79c": "create_shadow_player", + "802ce9d0": "create_shadow_circle_9_verts", + "802ceae8": "create_shadow_circle_4_verts", + "802cec04": "create_shadow_circle_assuming_flat_ground", + "802cedc0": "create_shadow_rectangle", + "802cef6c": "get_shadow_height_solidity", + "802cf080": "create_shadow_square", + "802cf1f0": "create_shadow_hardcoded_rectangle", + "802cf34c": "create_shadow_below_xyz", + "802cf5b0": "calculate_skybox_scaled_x", + "802cf69c": "calculate_skybox_scaled_y", + "802cf804": "make_skybox_rect", + "802cfa2c": "draw_skybox_tile_grid", + "802cfc68": "create_skybox_ortho_matrix", + "802cfd88": "init_skybox_display_list", + "802cfef4": "create_skybox_facing_camera", + "802d0080": "geo_wdw_set_initial_water_level", + "802d01e0": "geo_movtex_pause_control", + "802d0254": "movtex_make_quad_vertex", + "802d0484": "movtex_gen_from_quad", + "802d0a84": "movtex_gen_from_quad_array", + "802d0bb0": "movtex_gen_quads_id", + "802d0c84": "get_quad_collection_from_id", + "802d0f28": "movtex_change_texture_format", + "802d104c": "geo_movtex_draw_water_regions", + "802d1330": "update_moving_texture_offset", + "802d13cc": "movtex_write_vertex_first", + "802d1574": "movtex_write_vertex_index", + "802d18b4": "movtex_gen_list", + "802d1b70": "geo_movtex_draw_nocolor", + "802d1cdc": "geo_movtex_draw_colored", + "802d1e48": "geo_movtex_draw_colored_no_update", + "802d1fa8": "geo_movtex_draw_colored_2_no_update", + "802d2108": "geo_movtex_update_horizontal", + "802d2210": "make_vertex", + "802d22c4": "round_float", + "802d2360": "geo_exec_inside_castle_light", + "802d2470": "geo_exec_flying_carpet_timer_update", + "802d2520": "geo_exec_flying_carpet_create", + "802d28cc": "geo_exec_cake_end_screen", + "802d29c0": "stop_other_paintings", + "802d2a74": "painting_mario_y", + "802d2b08": "painting_mario_z", + "802d2b84": "painting_ripple_y", + "802d2c40": "painting_nearest_4th", + "802d2d80": "painting_mario_x", + "802d2dfc": "painting_ripple_x", + "802d2eb8": "painting_state", + "802d2ffc": "wall_painting_proximity_idle", + "802d319c": "wall_painting_proximity_rippling", + "802d327c": "wall_painting_continuous_idle", + "802d341c": "wall_painting_continuous_rippling", + "802d34fc": "floor_painting_proximity_idle", + "802d36ac": "floor_painting_proximity_rippling", + "802d379c": "floor_painting_continuous_idle", + "802d393c": "floor_painting_continuous_rippling", + "802d3a2c": "painting_update_floors", + "802d3bec": "painting_update_ripple_state", + "802d3cec": "calculate_ripple_at_point", + "802d3e6c": "ripple_if_movable", + "802d3ee4": "painting_generate_mesh", + "802d404c": "painting_calculate_triangle_normals", + "802d43f8": "normalize_component", + "802d44bc": "painting_average_vertex_normals", + "802d47d0": "render_painting", + "802d4edc": "painting_model_view_transform", + "802d50dc": "painting_ripple_image", + "802d5354": "painting_ripple_env_mapped", + "802d556c": "display_painting_rippling", + "802d568c": "display_painting_not_rippling", + "802d5778": "reset_painting", + "802d57a8": "move_ddd_painting", + "802d58e4": "set_painting_layer", + "802d593c": "display_painting", + "802d59a8": "wall_painting_update", + "802d5aa0": "floor_painting_update", + "802d5b98": "geo_painting_draw", + "802d5d0c": "geo_painting_update", + "802d5e00": "int_pow", + "802d5e54": "format_integer", + "802d6144": "parse_width_field", + "802d62d8": "print_text_fmt_int", + "802d6554": "print_text", + "802d66c0": "print_text_centered", + "802d6858": "char_to_glyph_index", + "802d69f8": "add_glyph_texture", + "802d6acc": "clip_to_bounds", + "802d6b3c": "render_textrect", + "802d6c88": "render_text_labels", + "802d6f20": "create_dl_identity_matrix", + "802d7070": "create_dl_translation_matrix", + "802d7174": "create_dl_rotation_matrix", + "802d7280": "create_dl_scale_matrix", + "802d7384": "create_dl_ortho_matrix", + "802d75dc": "render_generic_char", + "802d76c8": "render_multi_text_string", + "802d77dc": "print_generic_string", + "802d7b84": "print_hud_lut_string", + "802d7e88": "print_menu_generic_string", + "802d82d4": "print_credits_string", + "802d862c": "handle_menu_scrolling", + "802d8844": "get_str_x_pos_from_center", + "802d8934": "get_string_width", + "802d89b8": "print_hud_my_score_coins", + "802d8a80": "print_hud_my_score_stars", + "802d8b34": "int_to_str", + "802d8c6c": "get_dialog_id", + "802d8c88": "create_dialog_box", + "802d8cc4": "create_dialog_box_with_var", + "802d8d08": "create_dialog_inverted_box", + "802d8d48": "create_dialog_box_with_response", + "802d8d90": "reset_dialog_render_state", + "802d8e2c": "render_dialog_box_type", + "802d9148": "change_and_flash_dialog_text_color_lines", + "802d9388": "handle_dialog_scroll_page_state", + "802d944c": "render_star_count_dialog_text", + "802d9634": "render_multi_text_string_lines", + "802d9800": "ensure_nonnegative", + "802d982c": "handle_dialog_text_and_pages", + "802d9cb0": "render_dialog_triangle_choice", + "802d9dfc": "render_dialog_string_color", + "802d9f84": "handle_special_dialog_text", + "802da1ac": "render_dialog_entries", + "802da810": "set_menu_mode", + "802da844": "reset_cutscene_msg_fade", + "802da85c": "dl_rgba16_begin_cutscene_msg_fade", + "802da8e4": "dl_rgba16_stop_cutscene_msg_fade", + "802da964": "ascii_to_credits_char", + "802daa34": "print_credits_str_ascii", + "802daae4": "set_cutscene_message", + "802dab58": "do_cutscene_handler", + "802dad54": "print_peach_letter_message", + "802db08c": "render_hud_cannon_reticle", + "802db350": "reset_red_coins_collected", + "802db368": "change_dialog_camera_angle", + "802db3b8": "shade_screen", + "802db498": "print_animated_red_coin", + "802db6e8": "render_pause_red_coins", + "802db760": "render_pause_my_score_coins", + "802dbb24": "render_pause_camera_options", + "802dbe68": "render_pause_course_options", + "802dc15c": "render_pause_castle_menu_box", + "802dc418": "highlight_last_course_complete_stars", + "802dc478": "print_hud_pause_colorful_str", + "802dc570": "render_pause_castle_course_stars", + "802dc718": "render_pause_castle_main_strings", + "802dca88": "render_pause_courses_and_castle", + "802dcd04": "print_hud_course_complete_string", + "802dcf30": "print_hud_course_complete_coins", + "802dd194": "play_star_fanfare_and_flash_hud", + "802dd210": "render_course_complete_lvl_info_and_hud_str", + "802dd838": "render_save_confirmation", + "802ddae0": "render_course_complete_screen", + "802ddca4": "render_menus_and_dialogs", + "802dddf0": "envfx_init_snow", + "802ddf38": "envfx_update_snowflake_count", + "802de0bc": "envfx_cleanup_snow", + "802de114": "orbit_from_positions", + "802de23c": "pos_from_orbit", + "802de360": "envfx_is_snowflake_alive", + "802de458": "envfx_update_snow_normal", + "802de888": "envfx_update_snow_blizzard", + "802ded38": "envfx_update_snow_water", + "802def2c": "rotate_triangle_vertices", + "802df334": "append_snowflake_vertex_buffer", + "802df748": "envfx_update_snow", + "802dfbc8": "envfx_update_particles", + "802dfd50": "particle_is_laterally_close", + "802dfe00": "random_flower_offset", + "802dfe80": "envfx_update_flower", + "802e0120": "envfx_set_lava_bubble_position", + "802e048c": "envfx_update_lava", + "802e065c": "envfx_rotate_around_whirlpool", + "802e08a8": "envfx_is_whirlpool_bubble_alive", + "802e0934": "envfx_update_whirlpool", + "802e0e24": "envfx_is_jestream_bubble_alive", + "802e0eb8": "envfx_update_jetstream", + "802e1238": "envfx_init_bubble", + "802e1414": "envfx_bubbles_update_switch", + "802e1618": "append_bubble_vertex_buffer", + "802e1a20": "envfx_set_bubble_texture", + "802e1bb8": "envfx_update_bubble_particles", + "802e1ed8": "envfx_set_max_bubble_particles", + "802e1f48": "envfx_update_bubbles", + "802e20a0": "convert_rotation", + "802e2134": "spawn_macro_abs_yrot_2params", + "802e21dc": "spawn_macro_abs_yrot_param1", + "802e2284": "spawn_macro_abs_special", + "802e2414": "spawn_macro_objects", + "802e2690": "spawn_macro_objects_hardcoded", + "802e28ec": "spawn_special_objects", + "802e2cf0": "render_hud_tex_lut", + "802e2e58": "render_hud_small_tex_lut", + "802e30b4": "render_power_meter_health_segment", + "802e3214": "render_dl_power_meter", + "802e33b8": "animate_power_meter_emphasized", + "802e352c": "handle_power_meter_actions", + "802e3654": "render_hud_power_meter", + "802e3744": "render_hud_mario_lives", + "802e37a8": "render_hud_coins", + "802e380c": "render_hud_stars", + "802e38e4": "render_hud_keys", + "802e395c": "render_hud_timer", + "802e3b1c": "set_hud_camera_status", + "802e3b3c": "render_hud_camera_status", + "802e3d2c": "render_hud", + "802e3e50": "set_yoshi_as_not_dead", + "802e3e68": "geo_obj_transparency_something", + "802e3f68": "absf_2", + "802e3fac": "turn_obj_away_from_surface", + "802e405c": "obj_find_wall", + "802e41a4": "turn_obj_away_from_steep_floor", + "802e42e0": "obj_orient_graph", + "802e43e4": "calc_obj_friction", + "802e445c": "calc_new_obj_vel_and_pos_y", + "802e4814": "calc_new_obj_vel_and_pos_y_underwater", + "802e4cec": "obj_update_pos_vel_xz", + "802e4d88": "obj_splash", + "802e4e90": "object_step", + "802e5114": "object_step_without_floor_orient", + "802e5160": "obj_move_xyz_using_fvel_and_yaw", + "802e5208": "is_point_within_radius_of_mario", + "802e52b8": "is_point_close_to_object", + "802e5360": "set_object_visibility", + "802e53f4": "obj_return_home_if_safe", + "802e54b0": "obj_return_and_displace_home", + "802e55d0": "obj_check_if_facing_toward_angle", + "802e569c": "obj_find_wall_displacement", + "802e5760": "obj_spawn_yellow_coins", + "802e5824": "obj_flicker_and_disappear", + "802e58b4": "current_mario_room_check", + "802e5948": "trigger_obj_dialog_when_facing", + "802e5a80": "obj_check_floor_death", + "802e5b18": "obj_lava_death", + "802e5c6c": "spawn_orange_number", + "802e5d04": "debug_sequence_tracker", + "802e5de8": "coin_step", + "802e5e6c": "moving_coin_flicker", + "802e5ea4": "coin_collected", + "802e5ee8": "bhv_moving_yellow_coin_init", + "802e5f64": "bhv_moving_yellow_coin_loop", + "802e6098": "bhv_moving_blue_coin_init", + "802e6114": "bhv_moving_blue_coin_loop", + "802e62a4": "bhv_blue_coin_sliding_jumping_init", + "802e631c": "blue_coin_sliding_away_from_mario", + "802e63ec": "blue_coin_sliding_slow_down", + "802e6474": "bhv_blue_coin_sliding_loop", + "802e6628": "bhv_blue_coin_jumping_loop", + "802e6790": "bhv_seaweed_init", + "802e67dc": "bhv_seaweed_bundle_init", + "802e6a2c": "bhv_bobomb_init", + "802e6a8c": "bobomb_spawn_coin", + "802e6af8": "bobomb_act_explode", + "802e6bd4": "bobomb_check_interactions", + "802e6cf0": "bobomb_act_patrol", + "802e6dc8": "bobomb_act_chase_mario", + "802e6e84": "bobomb_act_launched", + "802e6ed8": "generic_bobomb_free_loop", + "802e7020": "stationary_bobomb_free_loop", + "802e7134": "bobomb_free_loop", + "802e7180": "bobomb_held_loop", + "802e7220": "bobomb_dropped_loop", + "802e7280": "bobomb_thrown_loop", + "802e7324": "curr_obj_random_blink", + "802e742c": "bhv_bobomb_loop", + "802e75a0": "bhv_bobomb_fuse_smoke_init", + "802e76ac": "bhv_bobomb_buddy_init", + "802e770c": "bobomb_buddy_act_idle", + "802e7814": "bobomb_buddy_cannon_dialog", + "802e79dc": "bobomb_buddy_act_talk", + "802e7b00": "bobomb_buddy_act_turn_to_talk", + "802e7bb0": "bobomb_buddy_actions", + "802e7c4c": "bhv_bobomb_buddy_loop", + "802e7c90": "bhv_cannon_closed_init", + "802e7d4c": "cannon_door_act_opening", + "802e7e54": "bhv_cannon_closed_loop", + "802e7f70": "bhv_whirlpool_init", + "802e7fb8": "whirlpool_set_hitbox", + "802e7fec": "whirpool_orient_graph", + "802e80dc": "bhv_whirlpool_loop", + "802e82b0": "bhv_jet_stream_loop", + "802e8388": "bhv_homing_amp_init", + "802e89d4": "bhv_homing_amp_loop", + "802e8ae4": "bhv_circling_amp_init", + "802e8ecc": "bhv_circling_amp_loop", + "802e8f68": "bhv_butterfly_init", + "802e9018": "butterfly_step", + "802e9278": "butterfly_calculate_angle", + "802e9470": "butterfly_act_rest", + "802e94e4": "butterfly_act_follow_mario", + "802e9548": "butterfly_act_return_home", + "802e96c8": "bhv_butterfly_loop", + "802e9764": "bhv_hoot_init", + "802e97fc": "hoot_find_next_floor", + "802e98c0": "hoot_floor_bounce", + "802e9a4c": "hoot_free_step", + "802e9cf4": "hoot_player_set_yaw", + "802e9d98": "hoot_carry_step", + "802e9f60": "hoot_surface_collision", + "802ea144": "hoot_act_ascent", + "802ea258": "hoot_action_loop", + "802ea3f0": "hoot_turn_to_home", + "802ea4ec": "hoot_awake_loop", + "802ea588": "bhv_hoot_loop", + "802ea6a8": "bhv_beta_holdable_object_init", + "802ea7e0": "bhv_beta_holdable_object_loop", + "802ea888": "bhv_object_bubble_init", + "802ea934": "bhv_object_bubble_loop", + "802eaa10": "bhv_object_water_wave_init", + "802eaa50": "bhv_object_water_wave_loop", + "802eaa8c": "bhv_explosion_init", + "802eaad0": "bhv_explosion_loop", + "802eabf0": "bhv_bobomb_bully_death_smoke_init", + "802eac3c": "bhv_bobomb_explosion_bubble_init", + "802ead3c": "bhv_bobomb_explosion_bubble_loop", + "802eaef8": "bhv_respawner_loop", + "802eaf84": "create_respawner", + "802eb05c": "bhv_small_bully_init", + "802eb104": "bhv_big_bully_init", + "802eb1c0": "bully_check_mario_collision", + "802eb288": "bully_act_chase_mario", + "802eb3f0": "bully_act_knockback", + "802eb510": "bully_act_back_up", + "802eb5c4": "bully_backup_check", + "802eb630": "bully_play_stomping_sound", + "802eb744": "bully_step", + "802eb7e0": "bully_spawn_coin", + "802eb8b0": "bully_act_level_death", + "802eb9d0": "bhv_bully_loop", + "802ebb74": "big_bully_spawn_minion", + "802ebc00": "bhv_big_bully_with_minions_init", + "802ebc88": "big_bully_spawn_star", + "802ebce0": "bhv_big_bully_with_minions_loop", + "802ebf70": "water_ring_calc_mario_dist", + "802ec030": "water_ring_init", + "802ec1b0": "bhv_jet_stream_water_ring_init", + "802ec200": "water_ring_check_collection", + "802ec3d0": "water_ring_set_scale", + "802ec4e0": "water_ring_act_collected", + "802ec59c": "water_ring_act_not_collected", + "802ec75c": "bhv_jet_stream_water_ring_loop", + "802ec7cc": "spawn_manta_ray_ring_manager", + "802ec818": "water_ring_spawner_act_inactive", + "802ec908": "bhv_jet_stream_ring_spawner_loop", + "802ec9b8": "bhv_manta_ray_water_ring_init", + "802ec9f0": "manta_water_ring_act_not_collected", + "802ecba4": "bhv_manta_ray_water_ring_loop", + "802ecc14": "bhv_bowser_bomb_loop", + "802ecd0c": "bhv_bowser_bomb_explosion_loop", + "802ecea0": "bhv_bowser_bomb_smoke_loop", + "802ecfac": "bhv_celebration_star_init", + "802ed10c": "celeb_star_act_spin_around_mario", + "802ed28c": "celeb_star_act_face_camera", + "802ed39c": "bhv_celebration_star_loop", + "802ed40c": "bhv_celebration_star_sparkle_loop", + "802ed45c": "bhv_star_key_collection_puff_spawner_loop", + "802ed498": "bhv_lll_drawbridge_spawner_loop", + "802ed62c": "bhv_lll_drawbridge_loop", + "802ed78c": "bhv_small_bomp_init", + "802ed7fc": "bhv_small_bomp_loop", + "802edacc": "bhv_large_bomp_init", + "802edb2c": "bhv_large_bomp_loop", + "802eddfc": "bhv_wf_sliding_platform_init", + "802edf28": "bhv_wf_sliding_platform_loop", + "802ee124": "bhv_moneybag_init", + "802ee1a0": "moneybag_check_mario_collision", + "802ee268": "moneybag_jump", + "802ee46c": "moneybag_act_move_around", + "802ee598": "moneybag_act_return_home", + "802ee728": "moneybag_act_disappear", + "802ee778": "moneybag_act_death", + "802ee7e0": "bhv_moneybag_loop", + "802ee8f4": "bhv_moneybag_hidden_loop", + "802ee9cc": "bhv_bowling_ball_init", + "802eea24": "bowling_ball_set_hitbox", + "802eea7c": "bowling_ball_set_waypoints", + "802eeb64": "bhv_bowling_ball_roll_loop", + "802eecb8": "bhv_bowling_ball_initializeLoop", + "802eedf0": "bhv_bowling_ball_loop", + "802eeeb4": "bhv_generic_bowling_ball_spawner_init", + "802eef9c": "bhv_generic_bowling_ball_spawner_loop", + "802ef0e8": "bhv_thi_bowling_ball_spawner_loop", + "802ef21c": "bhv_bob_pit_bowling_ball_init", + "802ef274": "bhv_bob_pit_bowling_ball_loop", + "802ef34c": "bhv_free_bowling_ball_init", + "802ef3f4": "bhv_free_bowling_ball_roll_loop", + "802ef524": "bhv_free_bowling_ball_loop", + "802ef63c": "bhv_rr_cruiser_wing_init", + "802ef66c": "bhv_rr_cruiser_wing_loop", + "802ef820": "bhv_spindel_init", + "802ef858": "bhv_spindel_loop", + "802efcd0": "bhv_ssl_moving_pyramid_wall_init", + "802efd8c": "bhv_ssl_moving_pyramid_wall_loop", + "802efe64": "bhv_pyramid_elevator_init", + "802efef4": "bhv_pyramid_elevator_loop", + "802f0104": "bhv_pyramid_elevator_trajectory_marker_ball_loop", + "802f0168": "bhv_pyramid_top_init", + "802f0288": "bhv_pyramid_top_spinning", + "802f04a0": "bhv_pyramid_top_explode", + "802f05b4": "bhv_pyramid_top_loop", + "802f06a8": "bhv_pyramid_top_fragment_init", + "802f0714": "bhv_pyramid_top_fragment_loop", + "802f0788": "bhv_pyramid_pillar_touch_detector_loop", + "802f07f4": "bhv_waterfall_sound_loop", + "802f0820": "bhv_volcano_sound_loop", + "802f084c": "bhv_castle_flag_init", + "802f0898": "bhv_birds_sound_loop", + "802f0950": "bhv_ambient_sounds_init", + "802f09a4": "bhv_sand_sound_loop", + "802f09f0": "bhv_castle_cannon_grate_init", + "802f0a40": "bhv_snowmans_bottom_init", + "802f0b7c": "set_rolling_sphere_hitbox", + "802f0bd4": "adjust_rolling_face_pitch", + "802f0c94": "snowmans_bottom_act_1", + "802f0df0": "snowmans_bottom_act_2", + "802f0fa8": "snowmans_bottom_act_3", + "802f105c": "bhv_snowmans_bottom_loop", + "802f120c": "bhv_snowmans_head_init", + "802f1370": "bhv_snowmans_head_loop", + "802f151c": "bhv_snowmans_body_checkpoint_loop", + "802f15a8": "bhv_big_boulder_init", + "802f162c": "boulder_act_1", + "802f1714": "bhv_big_boulder_loop", + "802f17f0": "bhv_big_boulder_generator_loop", + "802f1954": "cap_set_hitbox", + "802f19c8": "cap_despawn", + "802f1a10": "cap_check_quicksand", + "802f1bb8": "cap_sink_quicksand", + "802f1d64": "bhv_wing_cap_init", + "802f1dc0": "cap_scale_vertically", + "802f1e5c": "wing_vanish_cap_act_0", + "802f1f3c": "bhv_wing_vanish_cap_loop", + "802f1fd0": "bhv_metal_cap_init", + "802f2030": "metal_cap_act_0", + "802f20ac": "bhv_metal_cap_loop", + "802f2140": "bhv_normal_cap_init", + "802f21e0": "normal_cap_set_save_flags", + "802f2284": "normal_cap_act_0", + "802f23a8": "bhv_normal_cap_loop", + "802f2498": "bhv_vanish_cap_init", + "802f24f4": "bhv_collect_star_init", + "802f25b0": "bhv_collect_star_loop", + "802f2614": "bhv_star_spawn_init", + "802f2768": "bhv_star_spawn_loop", + "802f2aa0": "spawn_star", + "802f2b88": "spawn_default_star", + "802f2bd4": "spawn_red_coin_cutscene_star", + "802f2c24": "spawn_no_exit_star", + "802f2c84": "bhv_hidden_red_coin_star_init", + "802f2d8c": "bhv_hidden_red_coin_star_loop", + "802f2e6c": "bhv_red_coin_init", + "802f2f2c": "bhv_red_coin_loop", + "802f3014": "bhv_hidden_star_init", + "802f30f0": "bhv_hidden_star_loop", + "802f31bc": "bhv_hidden_star_trigger_loop", + "802f328c": "bhv_bowser_course_red_coin_star_loop", + "802f336c": "bhv_ttm_rolling_log_init", + "802f341c": "rolling_log_roll_log", + "802f36a4": "bhv_rolling_log_loop", + "802f38b0": "volcano_act_1", + "802f39b4": "volcano_act_3", + "802f3a30": "bhv_volcano_trap_loop", + "802f3b98": "bhv_lll_rolling_log_init", + "802f3c54": "bhv_1up_interact", + "802f3cc8": "bhv_1up_common_init", + "802f3d30": "bhv_1up_init", + "802f3dd0": "one_up_loop_in_air", + "802f3ea8": "pole_1up_move_towards_mario", + "802f401c": "one_up_move_away_from_mario", + "802f40cc": "bhv_1up_walking_loop", + "802f4248": "bhv_1up_running_away_loop", + "802f43b8": "sliding_1up_move", + "802f44c0": "bhv_1up_sliding_loop", + "802f45b8": "bhv_1up_loop", + "802f45f0": "bhv_1up_jump_on_approach_loop", + "802f4710": "bhv_1up_hidden_loop", + "802f48f4": "bhv_1up_hidden_trigger_loop", + "802f496c": "bhv_1up_hidden_in_pole_loop", + "802f4b00": "bhv_1up_hidden_in_pole_trigger_loop", + "802f4b78": "bhv_1up_hidden_in_pole_spawner_loop", + "802f4c68": "controllable_platform_act_1", + "802f4ce0": "controllable_platform_act_2", + "802f4d78": "bhv_controllable_platform_sub_loop", + "802f4eb4": "bhv_controllable_platform_init", + "802f5010": "controllable_platform_hit_wall", + "802f5068": "controllable_platform_check_walls", + "802f52c0": "controllable_platform_shake_on_wall_hit", + "802f547c": "controllable_platform_tilt_from_mario", + "802f55a4": "bhv_controllable_platform_loop", + "802f5cd4": "bhv_breakable_box_small_init", + "802f5d78": "small_breakable_box_spawn_dust", + "802f5e44": "small_breakable_box_act_move", + "802f5f48": "breakable_box_small_released_loop", + "802f6014": "breakable_box_small_idle_loop", + "802f60d8": "breakable_box_small_get_dropped", + "802f6150": "breakable_box_small_get_thrown", + "802f6228": "bhv_breakable_box_small_loop", + "802f62e4": "bhv_sliding_snow_mound_loop", + "802f6448": "bhv_snow_mound_spawn_loop", + "802f6588": "floating_platform_find_home_y", + "802f665c": "floating_platform_act_0", + "802f6984": "bhv_floating_platform_loop", + "802f6c0c": "bhv_arrow_lift_loop", + "802f6d20": "bhv_orange_number_init", + "802f6d58": "bhv_orange_number_loop", + "802f6e40": "bhv_manta_ray_init", + "802f7264": "bhv_manta_ray_loop", + "802f7348": "bhv_falling_pillar_init", + "802f7398": "bhv_falling_pillar_spawn_hitboxes", + "802f7418": "bhv_falling_pillar_calculate_angle_in_front_of_mario", + "802f74dc": "bhv_falling_pillar_loop", + "802f7760": "bhv_falling_pillar_hitbox_loop", + "802f7924": "bhv_jrb_floating_box_loop", + "802f7978": "bhv_decorative_pendulum_init", + "802f79b0": "bhv_decorative_pendulum_loop", + "802f7a58": "bhv_treasure_chest_top_loop", + "802f7c9c": "bhv_treasure_chest_bottom_init", + "802f7d04": "bhv_treasure_chest_bottom_loop", + "802f7f1c": "spawn_treasure_chest", + "802f7fa0": "bhv_treasure_chest_ship_init", + "802f8044": "bhv_treasure_chest_ship_loop", + "802f8158": "bhv_treasure_chest_jrb_init", + "802f8208": "bhv_treasure_chest_jrb_loop", + "802f82f8": "bhv_treasure_chest_init", + "802f83a4": "bhv_treasure_chest_loop", + "802f8490": "bhv_mips_init", + "802f85e0": "bhv_mips_find_furthest_waypoint_to_mario", + "802f8760": "bhv_mips_act_wait_for_nearby_mario", + "802f8808": "bhv_mips_act_follow_path", + "802f893c": "bhv_mips_act_wait_for_animation_done", + "802f8988": "bhv_mips_act_fall_down", + "802f8a34": "bhv_mips_act_idle", + "802f8ab4": "bhv_mips_free", + "802f8b54": "bhv_mips_held", + "802f8c74": "bhv_mips_dropped", + "802f8cf8": "bhv_mips_thrown", + "802f8dac": "bhv_mips_loop", + "802f8e54": "bhv_yoshi_init", + "802f8f08": "yoshi_walk_loop", + "802f9054": "yoshi_idle_loop", + "802f923c": "yoshi_talk_loop", + "802f93a8": "yoshi_walk_and_jump_off_roof_loop", + "802f9500": "yoshi_finish_jumping_and_despawn_loop", + "802f95ac": "yoshi_give_present_loop", + "802f965c": "bhv_yoshi_loop", + "802fbc4c": "bhv_koopa_init", + "802fc414": "shelled_koopa_attack_handler", + "802fcc00": "obj_begin_race", + "802fd7f8": "bhv_koopa_update", + "802fd950": "bhv_koopa_race_endpoint_update", + "802fda28": "bhv_pokey_body_part_update", + "802fe3b0": "bhv_pokey_update", + "802fe8b4": "bhv_swoop_update", + "802ff040": "bhv_fly_guy_update", + "802ff214": "bhv_goomba_triplet_spawner_update", + "802ff408": "bhv_goomba_init", + "802ff94c": "huge_goomba_weakly_attacked", + "802ff96c": "bhv_goomba_update", + "802ffb38": "bhv_chain_chomp_chain_part_update", + "80300e40": "bhv_chain_chomp_update", + "80300ecc": "bhv_wooden_post_update", + "80301148": "bhv_chain_chomp_gate_init", + "80301180": "bhv_chain_chomp_gate_update", + "80301210": "bhv_wiggler_body_part_update", + "803014cc": "wiggler_init_segments", + "803016e0": "wiggler_update_segments", + "803020e4": "wiggler_jumped_on_attack_handler", + "80302154": "bhv_wiggler_update", + "80302910": "bhv_spiny_update", + "80303028": "bhv_enemy_lakitu_update", + "8030369c": "bhv_cloud_update", + "80303744": "bhv_cloud_part_update", + "80303984": "bhv_camera_lakitu_init", + "80303f64": "bhv_camera_lakitu_update", + "803043f8": "bhv_monty_mole_hole_update", + "80304474": "monty_mole_spawn_dirt_particles", + "803044c0": "bhv_monty_mole_init", + "80304ba8": "bhv_monty_mole_update", + "80304fd4": "bhv_monty_mole_rock_update", + "80305100": "bhv_platform_on_track_init", + "80305a58": "bhv_platform_on_track_update", + "80305bb0": "bhv_track_ball_update", + "80305c14": "bhv_seesaw_platform_init", + "80305c90": "bhv_seesaw_platform_update", + "80305e2c": "bhv_ferris_wheel_axle_init", + "80305f24": "bhv_ferris_wheel_platform_update", + "80306084": "bhv_water_bomb_spawner_update", + "803062a8": "water_bomb_spawn_explode_particles", + "803067e8": "bhv_water_bomb_update", + "803068c0": "bhv_water_bomb_shadow_update", + "8030699c": "bhv_ttc_rotating_solid_init", + "80306a38": "bhv_ttc_rotating_solid_update", + "80306cc4": "bhv_ttc_pendulum_init", + "80306d38": "bhv_ttc_pendulum_update", + "80306f48": "bhv_ttc_treadmill_init", + "80307010": "bhv_ttc_treadmill_update", + "803071b8": "bhv_ttc_moving_bar_init", + "80307670": "bhv_ttc_moving_bar_update", + "80307760": "bhv_ttc_cog_init", + "803077e0": "bhv_ttc_cog_update", + "80307930": "bhv_ttc_pit_block_init", + "803079c8": "bhv_ttc_pit_block_update", + "80307ae4": "bhv_ttc_elevator_init", + "80307b58": "bhv_ttc_elevator_update", + "80307c88": "bhv_ttc_2d_rotator_init", + "80307cf8": "bhv_ttc_2d_rotator_update", + "80307ea4": "bhv_ttc_spinner_update", + "80307fb8": "mr_blizzard_spawn_white_particles", + "8030803c": "bhv_mr_blizzard_init", + "80308d6c": "bhv_mr_blizzard_update", + "80309154": "bhv_mr_blizzard_snowball", + "803091e0": "bhv_sliding_plat_2_init", + "80309354": "bhv_sliding_plat_2_loop", + "80309454": "bhv_rotating_octagonal_plat_init", + "803094d0": "bhv_rotating_octagonal_plat_loop", + "803094f8": "bhv_animates_on_floor_switch_press_init", + "80309530": "bhv_animates_on_floor_switch_press_loop", + "803097a4": "bhv_activated_back_and_forth_platform_init", + "803098c0": "bhv_activated_back_and_forth_platform_update", + "80309b64": "bhv_recovery_heart_loop", + "80309cec": "bhv_bubble_cannon_barrel_loop", + "80309ed4": "water_bomb_cannon_act_0", + "80309f68": "water_bomb_cannon_act_1", + "8030a0e8": "water_bomb_cannon_act_2", + "8030a11c": "bhv_water_bomb_cannon_loop", + "8030a1c0": "bhv_unagi_init", + "8030a2a8": "unagi_act_0", + "8030a390": "unagi_act_1_4", + "8030a514": "unagi_act_2", + "8030a614": "unagi_act_3", + "8030a93c": "bhv_unagi_loop", + "8030aabc": "bhv_unagi_subobject_loop", + "8030ad04": "dorrie_raise_head", + "8030ae9c": "dorrie_act_move", + "8030b0b8": "dorrie_begin_head_raise", + "8030b0f0": "dorrie_act_lower_head", + "8030b220": "dorrie_act_raise_head", + "8030b2f4": "bhv_dorrie_update", + "8030b658": "bhv_haunted_chair_init", + "8030b6d8": "haunted_chair_act_0", + "8030ba68": "haunted_chair_act_1", + "8030bc90": "bhv_haunted_chair_loop", + "8030bfd0": "bhv_mad_piano_update", + "8030c06c": "flying_bookend_act_0", + "8030c0f0": "flying_bookend_act_1", + "8030c210": "flying_bookend_act_2", + "8030c2c8": "flying_bookend_act_3", + "8030c364": "bhv_flying_bookend_loop", + "8030c4b0": "bhv_bookend_spawn_loop", + "8030c564": "bookshelf_manager_act_0", + "8030c60c": "bookshelf_manager_act_1", + "8030c6a4": "bookshelf_manager_act_2", + "8030c828": "bookshelf_manager_act_3", + "8030c894": "bookshelf_manager_act_4", + "8030c8ec": "bhv_haunted_bookshelf_manager_loop", + "8030c98c": "bhv_book_switch_loop", + "8030cd30": "obj_spit_fire", + "8030cddc": "bhv_fire_piranha_plant_init", + "8030d2f0": "bhv_fire_piranha_plant_update", + "8030d598": "bhv_fire_spitter_update", + "8030d640": "bhv_small_piranha_flame_loop", + "8030d8d4": "bhv_fly_guy_flame_loop", + "8030d93c": "geo_snufit_move_mask", + "8030d9ac": "geo_snufit_scale_body", + "8030da14": "snufit_act_idle", + "8030db38": "snufit_act_shoot", + "8030dc70": "bhv_snufit_loop", + "8030dfc4": "bhv_snufit_balls_loop", + "8030e14c": "bhv_horizontal_grindel_init", + "8030e16c": "bhv_horizontal_grindel_update", + "8030ea9c": "bhv_eyerok_boss_loop", + "8030fff8": "bhv_eyerok_hand_loop", + "80310498": "bhv_klepto_init", + "8031126c": "obj_set_speed_to_zero", + "8031129c": "bhv_klepto_update", + "80311874": "bhv_bird_update", + "803118e4": "bhv_racing_penguin_init", + "80312070": "bhv_racing_penguin_update", + "80312168": "bhv_penguin_race_finish_line_update", + "80312200": "bhv_penguin_race_shortcut_check_update", + "80312248": "bhv_coffin_spawner_loop", + "80312370": "coffin_act_idle", + "8031262c": "coffin_act_stand_up", + "8031274c": "bhv_coffin_loop", + "80312804": "clam_act_0", + "80312900": "clam_act_1", + "80312a54": "bhv_clam_loop", + "80313110": "bhv_skeeter_update", + "803131e8": "bhv_skeeter_wave_update", + "8031326c": "bhv_swing_platform_init", + "80313294": "bhv_swing_platform_update", + "80313354": "bhv_donut_platform_spawner_update", + "80313530": "bhv_donut_platform_update", + "803136cc": "bhv_ddd_pole_init", + "80313754": "bhv_ddd_pole_update", + "803137f4": "bhv_red_coin_star_marker_init", + "80313fc0": "bhv_triplet_butterfly_update", + "80314098": "bubba_act_0", + "8031427c": "bubba_act_1", + "803145d4": "bhv_bubba_loop", + "80314a30": "prepare_reverb_ring_buffer", + "80314cc0": "get_volume_ramping", + "80314de4": "synthesis_execute", + "80314f64": "synthesis_do_one_audio_update", + "80315590": "synthesis_process_notes", + "80316010": "load_wave_samples", + "803160dc": "final_resample", + "80316138": "process_envelope", + "8031619c": "process_envelope_inner", + "803166fc": "note_apply_headset_pan_effects", + "80316ac8": "note_init_volume", + "80316af4": "note_set_vel_pan_reverb", + "80316da8": "note_set_frequency", + "80316db4": "note_enable", + "80316e00": "note_disable", + "80316e80": "reset_bank_and_seq_load_status", + "80316ec4": "discard_bank", + "80316fb4": "discard_sequence", + "80317040": "soundAlloc", + "803170b4": "sound_alloc_pool_init", + "803170d4": "persistent_pool_clear", + "803170e8": "temporary_pool_clear", + "80317118": "unused_803160F8", + "80317128": "sound_init_main_pools", + "80317184": "session_pools_init", + "80317200": "seq_and_bank_pool_init", + "8031727c": "persistent_pools_init", + "80317338": "temporary_pools_init", + "803173fc": "alloc_bank_or_seq", + "8031782c": "get_bank_or_seq", + "803178ec": "decrease_reverb_gain", + "80317914": "wait_for_audio_frames", + "80317948": "audio_reset_session", + "80318040": "audio_dma_copy_immediate", + "803180c4": "audio_dma_copy_async", + "80318130": "audio_dma_partial_copy_async", + "803181ec": "decrease_sample_dma_ttls", + "80318300": "dma_sample_data", + "80318634": "init_sample_dma_buffers", + "803188f4": "patch_audio_bank", + "80318b30": "bank_load_immediate", + "80318c8c": "bank_load_async", + "80318dc4": "sequence_dma_immediate", + "80318e70": "sequence_dma_async", + "80318fac": "get_missing_bank", + "803190f4": "load_banks_immediate", + "80319220": "preload_sequence", + "80319328": "load_sequence", + "80319388": "load_sequence_internal", + "8031950c": "audio_init", + "80319920": "note_init", + "80319998": "note_disable2", + "803199b8": "process_notes", + "80319db8": "seq_channel_layer_decay_release_internal", + "80319f64": "seq_channel_layer_note_decay", + "80319f84": "seq_channel_layer_note_release", + "80319fa4": "build_synthetic_wave", + "8031a1d0": "init_synthetic_wave", + "8031a254": "init_note_list", + "8031a264": "init_note_lists", + "8031a2b4": "init_note_free_list", + "8031a368": "note_pool_clear", + "8031a494": "note_pool_fill", + "8031a5d0": "audio_list_push_front", + "8031a610": "audio_list_remove", + "8031a63c": "pop_node_with_lower_prio", + "8031a6cc": "note_init_for_layer", + "8031a794": "func_80319728", + "8031a7c8": "note_release_and_take_ownership", + "8031a820": "alloc_note_from_disabled", + "8031a89c": "alloc_note_from_decaying", + "8031a8f0": "alloc_note_from_active", + "8031a94c": "alloc_note", + "8031ac34": "reclaim_notes", + "8031adac": "note_init_all", + "8031aee8": "sequence_player_process_sound", + "8031b0cc": "get_portamento_freq_scale", + "8031b1c0": "get_vibrato_pitch_change", + "8031b248": "get_vibrato_freq_scale", + "8031b440": "note_vibrato_update", + "8031b4a0": "note_vibrato_init", + "8031b58c": "adsr_init", + "8031b5ac": "adsr_update", + "8031b830": "sequence_channel_init", + "8031b940": "seq_channel_set_layer", + "8031ba30": "seq_channel_layer_disable", + "8031ba6c": "seq_channel_layer_free", + "8031baf0": "sequence_channel_disable", + "8031bb5c": "allocate_sequence_channel", + "8031bba4": "sequence_player_init_channels", + "8031bcd0": "sequence_player_disable_channels", + "8031bda0": "sequence_channel_enable", + "8031be44": "sequence_player_disable", + "8031bf14": "audio_list_push_back", + "8031bf54": "audio_list_pop_back", + "8031bf94": "init_layer_freelist", + "8031c03c": "m64_read_u8", + "8031c050": "m64_read_s16", + "8031c080": "m64_read_compressed_u16", + "8031c0c4": "seq_channel_layer_process_script", + "8031ce54": "get_instrument", + "8031cfd4": "set_instrument", + "8031d068": "sequence_channel_set_volume", + "8031d08c": "sequence_channel_process_script", + "8031d9ec": "sequence_player_process_sequence", + "8031e240": "process_sequences", + "8031e2e8": "init_sequence_player", + "8031e374": "init_sequence_players", + "8031e4f0": "unused_8031E4F0", + "8031e568": "unused_8031E568", + "8031e7b8": "create_next_audio_frame_task", + "8031eb00": "play_sound", + "8031fd84": "audio_signal_game_loop_tick", + "80320678": "seq_player_fade_out", + "803206bc": "fade_volume_scale", + "803208ec": "process_level_music_dynamics", + "80320d70": "unused_8031FED0", + "80320e3c": "seq_player_lower_volume", + "80320ec4": "seq_player_unlower_volume", + "803210d4": "set_audio_muted", + "8032112c": "sound_init", + "80321398": "get_currently_playing_sound", + "80321474": "stop_sound", + "80321584": "stop_sounds_from_source", + "8032171c": "stop_sounds_in_continuous_banks", + "8032174c": "sound_banks_disable", + "8032180c": "sound_banks_enable", + "80321864": "unused_803209D8", + "803218d8": "set_sound_moving_speed", + "803218f4": "play_dialog_sound", + "803219ac": "play_music", + "80321bac": "stop_background_music", + "80321ce4": "fadeout_background_music", + "80321d38": "drop_queued_background_music", + "80321d5c": "get_current_background_music", + "80321d9c": "func_80320ED8", + "80321e48": "play_secondary_music", + "80321f48": "func_80321080", + "80321f9c": "func_803210D4", + "80322078": "play_course_clear", + "803220b4": "play_peachs_jingle", + "803220f0": "play_puzzle_jingle", + "8032212c": "play_star_fanfare", + "80322168": "play_power_star_jingle", + "803221b8": "play_race_fanfare", + "803221f4": "play_toads_jingle", + "80322230": "sound_reset", + "8032231c": "audio_set_sound_mode", + "80322348": "unused_80321460", + "8032235c": "unused_80321474", + "803223b0": "osSetTime", + "803223e0": "osMapTLB", + "803224a0": "osUnmapTLBAll", + "803224f0": "sprintf", + "8032255c": "proutSprintf", + "803225a0": "osCreateMesgQueue", + "803225d0": "osSetEventMesg", + "80322640": "osViSetEvent", + "803226b0": "osCreateThread", + "80322800": "osRecvMesg", + "80322940": "_VirtualToPhysicalTask", + "80322a5c": "osSpTaskLoad", + "80322bbc": "osSpTaskStartGo", + "80322c00": "osSpTaskYield", + "80322c20": "osSendMesg", + "80322d70": "osSpTaskYielded", + "80322df0": "osStartThread", + "80322f40": "osWritebackDCacheAll", + "80322f70": "osCreateViManager", + "803230f4": "viMgrMain", + "803232d0": "osViSetMode", + "80323340": "osViBlack", + "803233b0": "osViSetSpecialFeatures", + "80323570": "osCreatePiManager", + "803236f0": "osSetThreadPri", + "803237d0": "osInitialize", + "80323a00": "osViSwapBuffer", + "80323a50": "sqrtf", + "80323a60": "osContStartReadData", + "80323b24": "osContGetReadData", + "80323bcc": "__osPackReadData", + "80323cc0": "osContInit", + "80323ebc": "__osContGetInitData", + "80323f8c": "__osPackRequestData", + "80324080": "osEepromProbe", + "803240f0": "__ull_rshift", + "8032411c": "__ull_rem", + "80324158": "__ull_div", + "80324194": "__ll_lshift", + "803241c0": "__ll_rem", + "803241fc": "__ll_div", + "80324258": "__ll_mul", + "80324288": "__ull_divremi", + "803242e8": "__ll_mod", + "80324384": "__ll_rshift", + "803243b0": "osInvalDCache", + "80324460": "osPiStartDma", + "80324570": "bzero", + "80324610": "osInvalICache", + "80324690": "osEepromLongRead", + "803247d0": "osEepromLongWrite", + "80324910": "bcopy", + "80324c20": "guOrthoF", + "80324d74": "guOrtho", + "80324de0": "guPerspectiveF", + "80325010": "guPerspective", + "80325070": "osGetTime", + "80325100": "__d_to_ll", + "8032511c": "__f_to_ll", + "80325138": "__d_to_ull", + "803251d8": "__f_to_ull", + "80325274": "__ll_to_d", + "8032528c": "__ll_to_f", + "803252a4": "__ull_to_d", + "803252d8": "__ull_to_f", + "80325310": "cosf", + "80325480": "sinf", + "80325640": "guTranslateF", + "80325688": "guTranslate", + "803256e0": "guRotateF", + "80325874": "guRotate", + "803258d0": "guScaleF", + "80325924": "guScale", + "80325970": "osAiSetFrequency", + "80325bd4": "alBnkfNew", + "80325cd8": "alSeqFileNew", + "80325d20": "osWritebackDCache", + "80325da0": "osAiGetLength", + "80325db0": "osAiSetNextBuffer", + "80325e60": "__osTimerServicesInit", + "80325eec": "__osTimerInterrupt", + "80326064": "__osSetTimerIntr", + "803260d8": "__osInsertTimer", + "80326260": "_Printf", + "803273f0": "memcpy", + "8032741c": "strlen", + "80327444": "strchr", + "80327490": "__osDequeueThread", + "803274d0": "__osDisableInt", + "803274f0": "__osRestoreInt", + "80327510": "__osViInit", + "80327640": "__osExceptionPreamble", + "80327650": "__osException", + "803278e4": "L80326964", + "80327904": "L80326984", + "80327938": "L803269B8", + "80327a68": "L80326AE8", + "80327ac4": "L80326B44", + "80327ae4": "L80326B64", + "80327b1c": "L80326B9C", + "80327b68": "L80326BE8", + "80327b98": "send_mesg", + "80327c80": "__osEnqueueAndYield", + "80327d10": "__osEnqueueThread", + "80327d58": "__osPopThread", + "80327d68": "__osDispatchThread", + "80327ea8": "__osCleanupThread", + "80327eb0": "osVirtualToPhysical", + "80327f30": "__osSpSetStatus", + "80327f40": "__osSpSetPc", + "80327f80": "__osSpRawStartDma", + "80328010": "__osSpDeviceBusy", + "80328040": "__osSpGetStatus", + "80328050": "osGetThreadPri", + "80328070": "__osViGetCurrentContext", + "80328080": "__osViSwapContext", + "803283e0": "osGetCount", + "803283f0": "__osPiCreateAccessQueue", + "80328440": "__osPiGetAccess", + "80328484": "__osPiRelAccess", + "803284b0": "osPiRawStartDma", + "80328590": "__osDevMgrMain", + "80328710": "__osSetSR", + "80328720": "__osGetSR", + "80328730": "__osSetFpcCsr", + "80328740": "__osSiRawReadIo", + "80328790": "__osSiRawWriteIo", + "803287e0": "osMapTLBRdb", + "80328840": "osPiRawReadIo", + "803288a0": "__osSiCreateAccessQueue", + "803288f0": "__osSiGetAccess", + "80328934": "__osSiRelAccess", + "80328960": "__osSiRawStartDma", + "80328a10": "osSetTimer", + "80328af0": "osEepromWrite", + "80328ca0": "__osPackEepWriteData", + "80328dac": "__osEepStatus", + "80328fd0": "osJamMesg", + "80329120": "osPiGetCmdQueue", + "80329150": "osEepromRead", + "80329340": "__osPackEepReadData", + "80329450": "guMtxF2L", + "80329550": "guMtxIdentF", + "803295d8": "guMtxIdent", + "80329608": "guMtxL2F", + "803296c0": "guNormalize", + "80329750": "__osAiDeviceBusy", + "80329780": "__osSetCompare", + "80329790": "_Litob", + "80329a90": "_Ldtob", + "8032a860": "u32_to_string", + "8032a890": "string_to_u32", + "8032a8e8": "send_packet", + "8032a9a8": "send", + "8032aa80": "process_command_memory", + "8032aacc": "process_command_register", + "8032aaf8": "kdebugserver", + "8032ace0": "__osSyncPutChars", + "8032ae10": "osSetIntMask", + "8032ae70": "osDestroyThread", + "8032af70": "__osProbeTLB", + "8032b030": "__osSiDeviceBusy", + "8032b060": "lldiv", + "8032b160": "ldiv", + "8032b1f0": "__osGetCause", + "8032b200": "__osAtomicDec", + "8032b260": "rspF3DBootStart", + "8032b330": "rspF3DBootEnd", + "8032b330": "rspF3DStart", + "8032c738": "rspF3DEnd", + "8032c740": "rspAspMainStart", + "8032d560": "rspAspMainEnd", + "8032d560": "gVblankHandler1", + "8032d564": "gVblankHandler2", + "8032d568": "gActiveSPTask", + "8032d56c": "sCurrentAudioSPTask", + "8032d570": "sCurrentDisplaySPTask", + "8032d574": "sNextAudioSPTask", + "8032d578": "sNextDisplaySPTask", + "8032d57c": "sAudioEnabled", + "8032d580": "gNumVblanks", + "8032d584": "gResetTimer", + "8032d588": "D_8032C648", + "8032d58c": "gDebugLevelSelect", + "8032d590": "D_8032C650", + "8032d594": "gShowProfiler", + "8032d598": "gShowDebugText", + "8032d5d0": "unused8032C690", + "8032d5d4": "gGlobalTimer", + "8032d5dc": "frameBufferIndex", + "8032d5e0": "gGoddardVblankCallback", + "8032d5e4": "gPlayer1Controller", + "8032d5e8": "gPlayer2Controller", + "8032d5ec": "gPlayer3Controller", + "8032d5f0": "gCurrDemoInput", + "8032d5f4": "gDemoInputListID", + "8032d5f8": "gRecordedDemoInput", + "8032d6d0": "credits01", + "8032d6d8": "credits02", + "8032d6e4": "credits03", + "8032d6f0": "credits04", + "8032d700": "credits05", + "8032d710": "credits06", + "8032d71c": "credits07", + "8032d728": "credits08", + "8032d738": "credits09", + "8032d740": "credits10", + "8032d750": "credits11", + "8032d75c": "credits12", + "8032d764": "credits13", + "8032d774": "credits14", + "8032d77c": "credits15", + "8032d788": "credits16", + "8032d79c": "credits17", + "8032d7ac": "credits18", + "8032d7bc": "credits19", + "8032d7c4": "credits20", + "8032d7cc": "sCreditsSequence", + "8032d93c": "gMarioState", + "8032d940": "unused1", + "8032d944": "sWarpCheckpointActive", + "8032daa0": "sTerrainSounds", + "8032dacc": "sSquishScaleOverTime", + "8032dae0": "sCapFlickerFrames", + "8032daf8": "gWaterSurfacePseudoFloor", + "8032dc50": "sJumpLandAction", + "8032dc68": "sFreefallLandAction", + "8032dc80": "sSideFlipLandAction", + "8032dc98": "sHoldJumpLandAction", + "8032dcb0": "sHoldFreefallLandAction", + "8032dcc8": "sLongJumpLandAction", + "8032dce0": "sDoubleJumpLandAction", + "8032dcf8": "sTripleJumpLandAction", + "8032dd10": "sBackflipLandAction", + "8032dd40": "sPunchingForwardVelocities", + "8032dd80": "gLastCompletedCourseNum", + "8032dd84": "gLastCompletedStarNum", + "8032dd88": "sUnusedGotGlobalCoinHiScore", + "8032dd8c": "gGotFileCoinHiScore", + "8032dd90": "gCurrCourseStarFlags", + "8032dd94": "gSpecialTripleJump", + "8032dd98": "gLevelToCourseNumTable", + "8032ddc0": "gMarioSpawnInfo", + "8032ddc4": "gLoadedGraphNodes", + "8032ddc8": "gAreas", + "8032ddcc": "gCurrentArea", + "8032ddd0": "gCurrCreditsEntry", + "8032ddd4": "D_8032CE74", + "8032ddd8": "D_8032CE78", + "8032dddc": "gWarpTransDelay", + "8032dde0": "gFBSetColor", + "8032dde4": "gWarpTransFBSetColor", + "8032dde8": "gWarpTransRed", + "8032ddec": "gWarpTransGreen", + "8032ddf0": "gWarpTransBlue", + "8032ddf4": "gCurrSaveFileNum", + "8032ddf8": "gCurrLevelNum", + "8032ddfc": "sWarpBhvSpawnTable", + "8032de4c": "sSpawnTypeFromWarpBhv", + "8032de60": "D_8032CF00", + "8032de70": "renderModeTable_1Cycle", + "8032deb0": "renderModeTable_2Cycle", + "8032def0": "gCurGraphNodeRoot", + "8032def4": "gCurGraphNodeMasterList", + "8032def8": "gCurGraphNodeCamFrustum", + "8032defc": "gCurGraphNodeCamera", + "8032df00": "gCurGraphNodeObject", + "8032df04": "gCurGraphNodeHeldObject", + "8032df08": "gAreaUpdateCounter", + "8032df10": "gProfilerMode", + "8032df14": "gCurrentFrameIndex1", + "8032df18": "gCurrentFrameIndex2", + "8032df20": "unused8032CFC0", + "8032df24": "gCutsceneFocus", + "8032df28": "unused8032CFC8", + "8032df2c": "unused8032CFCC", + "8032df30": "gSecondCameraFocus", + "8032df34": "sYawSpeed", + "8032df38": "gCurrLevelArea", + "8032df3c": "gPrevLevel", + "8032df40": "unused8032CFE0", + "8032df44": "unused8032CFE4", + "8032df48": "unused8032CFE8", + "8032df4c": "gCameraZoomDist", + "8032df50": "sObjectCutscene", + "8032df54": "gRecentCutscene", + "8032df58": "sFramesSinceCutsceneEnded", + "8032df5c": "sCutsceneDialogResponse", + "8032df60": "sMarioCamState", + "8032df64": "sLuigiCamState", + "8032df68": "unused8032D008", + "8032df6c": "sFixedModeBasePosition", + "8032df78": "sUnusedModeBasePosition_2", + "8032df84": "sUnusedModeBasePosition_3", + "8032df90": "sUnusedModeBasePosition_4", + "8032df9c": "sUnusedModeBasePosition_5", + "8032dfa8": "sModeTransitions", + "8032e008": "unused8032D0A8", + "8032e010": "unused8032D0B0", + "8032e018": "sDanceCutsceneTable", + "8032e024": "unusedDanceInfo1", + "8032e038": "unusedDanceType", + "8032e03c": "unusedDanceInfo2", + "8032e050": "sBBHLibraryParTrackPath", + "8032e098": "sCamSL", + "8032e0e0": "sCamTHI", + "8032e128": "sCamHMC", + "8032e1d0": "sCamSSL", + "8032e248": "sCamRR", + "8032e2f0": "sCamBOB", + "8032e338": "sCamCotMC", + "8032e368": "sCamCCM", + "8032e3b0": "sCamCastle", + "8032e6f8": "sCamBBH", + "8032ecb0": "sCameraTriggers", + "8032ed50": "sIntroStartToPipePosition", + "8032ee08": "sIntroStartToPipeFocus", + "8032eec0": "sIntroPipeToDialogPosition", + "8032ef30": "sIntroPipeToDialogFocus", + "8032efa0": "sEndingFlyToWindowPos", + "8032eff0": "sEndingFlyToWindowFocus", + "8032f048": "sEndingPeachDescentCamPos", + "8032f0e8": "sEndingMarioToPeachPos", + "8032f130": "sEndingMarioToPeachFocus", + "8032f178": "sEndingLookUpAtCastle", + "8032f1b8": "sEndingLookAtSkyFocus", + "8032f214": "gIntroLakituStartToPipeFocus", + "8032f32c": "gIntroLakituStartToPipeOffsetFromCamera", + "8032f444": "gEndWavingPos", + "8032f48c": "gEndWavingFocus", + "8032f4d4": "sCutsceneEnding", + "8032f534": "sCutsceneGrandStar", + "8032f544": "sCutsceneUnused", + "8032f554": "sCutsceneDoorWarp", + "8032f564": "sCutsceneEndWaving", + "8032f56c": "sCutsceneCredits", + "8032f574": "sCutsceneDoorPull", + "8032f59c": "sCutsceneDoorPush", + "8032f5c4": "sCutsceneDoorPullMode", + "8032f5dc": "sCutsceneDoorPushMode", + "8032f5f4": "sCutsceneEnterCannon", + "8032f60c": "sCutsceneStarSpawn", + "8032f624": "sCutsceneRedCoinStarSpawn", + "8032f634": "sCutsceneEnterPainting", + "8032f63c": "sCutsceneDeathExit", + "8032f64c": "sCutsceneExitPaintingSuccess", + "8032f65c": "sCutsceneUnusedExit", + "8032f674": "sCutsceneIntroPeach", + "8032f69c": "sCutscenePrepareCannon", + "8032f6ac": "sCutsceneExitWaterfall", + "8032f6bc": "sCutsceneFallToCastleGrounds", + "8032f6cc": "sCutsceneEnterPyramidTop", + "8032f6dc": "sCutscenePyramidTopExplode", + "8032f6f4": "sCutsceneStandingDeath", + "8032f6fc": "sCutsceneEnterPool", + "8032f70c": "sCutsceneDeathStomach", + "8032f714": "sCutsceneDeathOnBack", + "8032f71c": "sCutsceneQuicksandDeath", + "8032f724": "sCutsceneWaterDeath", + "8032f72c": "sCutsceneSuffocation", + "8032f734": "sCutsceneEnterBowserArena", + "8032f74c": "sCutsceneDanceDefaultRotate", + "8032f754": "sCutsceneDanceFlyAway", + "8032f75c": "sCutsceneDanceCloseup", + "8032f764": "sCutsceneKeyDance", + "8032f76c": "sCutsceneCapSwitchPress", + "8032f774": "sCutsceneSlidingDoorsOpen", + "8032f784": "sCutsceneUnlockKeyDoor", + "8032f794": "sCutsceneExitBowserSuccess", + "8032f7a4": "sCutsceneExitBowserDeath", + "8032f7b4": "sCutsceneExitSpecialSuccess", + "8032f7c4": "sCutsceneNonPaintingDeath", + "8032f7d4": "sCutsceneDialog", + "8032f7ec": "sCutsceneReadMessage", + "8032f804": "sDanceCutsceneIndexTable", + "8032f870": "sZoomOutAreaMasks", + "8032f884": "sBobCreditsSplinePositions", + "8032f8ac": "sBobCreditsSplineFocus", + "8032f8d4": "sWfCreditsSplinePositions", + "8032f8fc": "sWfCreditsSplineFocus", + "8032f924": "sJrbCreditsSplinePositions", + "8032f94c": "sJrbCreditsSplineFocus", + "8032f974": "sCcmSlideCreditsSplinePositions", + "8032f99c": "sCcmSlideCreditsSplineFocus", + "8032f9c4": "sBbhCreditsSplinePositions", + "8032f9e4": "sBbhCreditsSplineFocus", + "8032fa04": "sHmcCreditsSplinePositions", + "8032fa2c": "sHmcCreditsSplineFocus", + "8032fa54": "sThiWigglerCreditsSplinePositions", + "8032fa6c": "sThiWigglerCreditsSplineFocus", + "8032fa84": "sVolcanoCreditsSplinePositions", + "8032fab4": "sVolcanoCreditsSplineFocus", + "8032fae4": "sSslCreditsSplinePositions", + "8032fb14": "sSslCreditsSplineFocus", + "8032fb44": "sDddCreditsSplinePositions", + "8032fb7c": "sDddCreditsSplineFocus", + "8032fbb4": "sSlCreditsSplinePositions", + "8032fbd4": "sSlCreditsSplineFocus", + "8032fbf4": "sWdwCreditsSplinePositions", + "8032fc14": "sWdwCreditsSplineFocus", + "8032fc34": "sTtmCreditsSplinePositions", + "8032fc64": "sTtmCreditsSplineFocus", + "8032fc94": "sThiHugeCreditsSplinePositions", + "8032fccc": "sThiHugeCreditsSplineFocus", + "8032fd04": "sTtcCreditsSplinePositions", + "8032fd24": "sTtcCreditsSplineFocus", + "8032fd44": "sRrCreditsSplinePositions", + "8032fd64": "sRrCreditsSplineFocus", + "8032fd84": "sSaCreditsSplinePositions", + "8032fdac": "sSaCreditsSplineFocus", + "8032fdd4": "sCotmcCreditsSplinePositions", + "8032fdfc": "sCotmcCreditsSplineFocus", + "8032fe24": "sDddSubCreditsSplinePositions", + "8032fe4c": "sDddSubCreditsSplineFocus", + "8032fe74": "sCcmOutsideCreditsSplinePositions", + "8032fe94": "sCcmOutsideCreditsSplineFocus", + "8032fec0": "sObjectListUpdateOrder", + "8032fecc": "sParticleTypes", + "80330000": "D_8032F0A0", + "80330004": "D_8032F0A4", + "80330020": "D_8032F0C0", + "8033002c": "D_8032F0CC", + "8033006c": "sMrIParticleActions", + "80330074": "sMrIActions", + "80330084": "sMrIHitbox", + "80330094": "D_8032F134", + "803300a8": "unused8032F134", + "803300ac": "sCapSwitchActions", + "803300bc": "sKingBobombActions", + "803300e0": "sKingBobombSoundStates", + "80330140": "sOpenedCannonActions", + "8033015c": "unused0EA1FC", + "80330198": "sChuckyaActions", + "803301a8": "sWFRotatingPlatformData", + "803301c0": "sKoopaShellUnderwaterHitbox", + "803301d0": "D_8032F270", + "803301e4": "sSparkleSpawnStarHitbox", + "803301f4": "sYellowCoinHitbox", + "80330204": "D_8032F2A4", + "80330224": "sCoinInsideBooActions", + "8033022c": "D_8032F2CC", + "80330244": "D_8032F2E4", + "80330260": "D_8032F300", + "80330288": "D_8032F328", + "80330290": "D_8032F330", + "80330298": "sGrindelThwompActions", + "803302ac": "sTumblingBridgeParams", + "803302dc": "sTumblingBridgeActions", + "803302ec": "D_8032F38C", + "80330318": "sElevatorActions", + "8033032c": "D_8032F3CC", + "80330340": "D_8032F3E0", + "80330354": "D_8032F3F4", + "8033035c": "D_8032F3FC", + "80330370": "sUkikiCageActions", + "80330380": "D_8032F420", + "80330390": "sSpindriftHitbox", + "803303a0": "sMetalBoxHitbox", + "803303b0": "sBreakableBoxHitbox", + "803303c0": "D_8032F460", + "803303e8": "sHeaveHoActions", + "803303f8": "sJumpingBoxHitbox", + "80330408": "sJumpingBoxActions", + "8033042c": "sBowserKeyHitbox", + "8033043c": "sBulletBillActions", + "80330450": "sBowserTailAnchorActions", + "8033045c": "D_8032F4FC", + "8033046c": "D_8032F50C", + "80330470": "D_8032F510", + "80330474": "D_8032F514", + "80330478": "sBowserDefeatedDialogText", + "80330480": "D_8032F520", + "803304c8": "sBowserActions", + "80330518": "D_8032F5B8", + "803305f0": "D_8032F690", + "803305f4": "D_8032F694", + "803305f8": "D_8032F698", + "8033067c": "sFallingBowserPlatformActions", + "80330688": "sGrowingBowserFlameHitbox", + "80330698": "sBowserFlameHitbox", + "803306a8": "D_8032F748", + "803306b4": "D_8032F754", + "80330738": "sUkikiSoundStates", + "803307a0": "sUkikiActions", + "803307c0": "D_8032F860", + "803307f4": "D_8032F894", + "80330828": "D_8032F8C8", + "80330830": "sRotatingCwFireBarsActions", + "80330840": "sKoopaShellHitbox", + "80330850": "D_8032F8F0", + "80330884": "D_8032F924", + "803308a8": "D_8032F948", + "803308cc": "D_8032F96C", + "803308d8": "sToxBoxActions", + "80330900": "TablePiranhaPlantActions", + "80330b1c": "sBowserPuzzlePieceActions", + "80330b38": "sTuxiesMotherActions", + "80330b44": "sSmallPenguinActions", + "80330b74": "sBirdChirpChirpActions", + "80330b84": "sCheepCheepActions", + "80330b90": "sExclamationBoxHitbox", + "80330ba0": "sExclamationBoxContents", + "80330c20": "sExclamationBoxActions", + "80330c38": "sSkullSlidingBoxHitbox", + "80330c48": "gOpenableGrills", + "80330c58": "sTweesterHitbox", + "80330c68": "sTweesterActions", + "80330cd4": "sScuttlebugHitbox", + "80330ce4": "sWhompActions", + "80330d0c": "sWaterSplashDropletParams", + "80330d30": "gShallowWaterSplashDropletParams", + "80330d54": "sWaterDropletFishParams", + "80330d78": "gShallowWaterWaveDropletParams", + "80330d9c": "sStrongWindParticleHitbox", + "80330dac": "sSLWalkingPenguinErraticSteps", + "80330e20": "D_8032FEC0", + "80330e24": "unused_8032FEC4", + "80330e34": "gMarioPlatform", + "80330e40": "sDebugEffectStringInfo", + "80330e64": "sDebugEnemyStringInfo", + "80330e88": "sDebugInfoDPadMask", + "80330e8c": "sDebugInfoDPadUpdID", + "80330e90": "sDebugLvSelectCheckFlag", + "80330e94": "sDebugPage", + "80330e98": "sNoExtraDebug", + "80330e9c": "sDebugStringArrPrinted", + "80330ea0": "sDebugSysCursor", + "80330ea4": "sDebugInfoButtonSeqID", + "80330ea8": "sDebugInfoButtonSeq", + "80330ec0": "sTransitionColorFadeCount", + "80330ec4": "sTransitionTextureFadeCount", + "80330ec8": "sTextureTransitionID", + "80330ee0": "rectangles", + "80330f00": "sSkyboxTextures", + "80330f28": "sSkyboxColors", + "80330f30": "gMovtexCounter", + "80330f34": "gMovtexCounterPrev", + "80330f38": "gMovtexVtxColor", + "80330f3c": "gPaintingMarioYEntry", + "80330f40": "gWdwWaterLevelSet", + "80330f44": "gMovtexIdToTexture", + "80330f64": "gMovtexNonColored", + "803311a4": "gMovtexColored", + "8033127c": "gMovtexColored2", + "80331300": "sHmcPaintings", + "80331308": "sInsideCastlePaintings", + "80331344": "sTtmPaintings", + "8033134c": "sPaintingGroups", + "80331358": "gPaintingUpdateCounter", + "8033135c": "gLastPaintingUpdateCounter", + "80331360": "sTextLabelsCount", + "80331370": "gDialogCharWidths", + "80331470": "gDialogBoxState", + "80331474": "gDialogBoxOpenTimer", + "80331478": "gDialogBoxScale", + "8033147c": "gDialogScrollOffsetY", + "80331480": "gDialogBoxType", + "80331484": "gDialogID", + "80331488": "gLastDialogPageStrPos", + "8033148c": "gDialogTextPos", + "80331490": "gDialogLineNum", + "80331494": "gLastDialogResponse", + "80331498": "gMenuHoldKeyIndex", + "8033149c": "gMenuHoldKeyTimer", + "803314a0": "gDialogResponse", + "803314b0": "gHudSymCoin", + "803314b4": "gHudSymX", + "803314f8": "gMenuMode", + "803314fc": "gEndCutsceneStrEn0", + "80331504": "gEndCutsceneStrEn1", + "80331538": "gEndCutsceneStrEn2", + "80331558": "gEndCutsceneStrEn3", + "8033156c": "gEndCutsceneStrEn4", + "80331598": "gEndCutsceneStrEn5", + "803315ac": "gEndCutsceneStrEn6", + "803315cc": "gEndCutsceneStrEn7", + "803315dc": "gEndCutsceneStrEn8", + "803315e4": "gEndCutsceneStringsEn", + "8033160c": "gCutsceneMsgFade", + "80331610": "gCutsceneMsgIndex", + "80331614": "gCutsceneMsgDuration", + "80331618": "gCutsceneMsgTimer", + "8033161c": "gDialogCameraAngleIndex", + "80331620": "gDialogCourseActNum", + "803316c8": "gCourseCompleteCoinsEqual", + "803316cc": "gCourseDoneMenuTimer", + "803316d0": "gCourseCompleteCoins", + "803316d4": "gHudFlash", + "80331750": "gEnvFxMode", + "80331754": "D_80330644", + "80331758": "gSnowTempVtx", + "80331788": "gSnowFlakeVertex1", + "80331790": "gSnowFlakeVertex2", + "80331798": "gSnowFlakeVertex3", + "803317a0": "D_80330690", + "803317a4": "D_80330694", + "803317a8": "gBubbleTempVtx", + "803317e0": "MacroObjectPresets", + "803325fc": "sPowerMeterVisibleTimer", + "80332614": "sPrevCheckMarioRoom", + "80332618": "sYoshiDead", + "8033261c": "sDebugSequenceTracker", + "80332620": "sDebugTimer", + "803327a8": "sBreakableBoxSmallHitbox", + "80332b00": "sMrBlizzardHitbox", + "80332b24": "sMrBlizzardSnowballHitbox", + "80332b54": "D_80331A44", + "80332b5c": "D_80331A4C", + "80332b64": "D_80331A54", + "80332bdc": "D_80331ACC", + "80332bf0": "sRecoveryHeartHitbox", + "80332c00": "sUnagiHitbox", + "80332c10": "sHauntedChairHitbox", + "80332c30": "sFlyingBookendHitbox", + "80332c40": "D_80331B30", + "80332c4c": "sBookSwitchHitbox", + "80332c5c": "sFirePiranhaPlantHitbox", + "80332c6c": "D_80331B5C", + "80332c74": "sPiranhaPlantFireHitbox", + "80332c84": "sSnufitHitbox", + "80332c94": "sSnufitBulletHitbox", + "80332ca4": "sEyerokHitbox", + "80332cb4": "D_80331BA4", + "80332d10": "coffinRelativePos", + "80332d28": "sClamShellHitbox", + "80332d38": "sSkeeterHitbox", + "80332d48": "D_80331C38", + "80332e50": "gAudioErrorFlags", + "80332e54": "sGameLoopTicked", + "80332e58": "sDialogSpeaker", + "80332f04": "sDialogSpeakerVoice", + "80332f40": "sNumProcessedSoundRequests", + "80332f44": "sSoundRequestCount", + "80332f48": "sDynBbh", + "80332f54": "sDynDdd", + "80332f6c": "sDynJrb", + "80332f88": "sDynWdw", + "80332f98": "sDynHmc", + "80332fa8": "sDynUnk38", + "80332fb8": "sDynNone", + "80332fbc": "sCurrentMusicDynamic", + "80332fc0": "sBackgroundMusicForDynamics", + "80332fc4": "sLevelDynamics", + "80333060": "sMusicDynamics", + "803330c0": "sLevelAreaReverbs", + "80333138": "sLevelAcousticReaches", + "80333188": "sBackgroundMusicDefaultVolume", + "803331ac": "sCurrentBackgroundMusicSeqId", + "803331b0": "sMusicDynamicDelay", + "803331b4": "sSoundBankUsedListBack", + "803331c0": "sSoundBankFreeListFront", + "803331cc": "sNumSoundsInBank", + "803331d8": "sMaxChannelsForSoundBank", + "803331e4": "sNumSoundsPerBank", + "803331f0": "gGlobalSoundSource", + "803331fc": "sUnusedSoundArgs", + "80333208": "sSoundBankDisabled", + "80333218": "D_80332108", + "8033321c": "sHasStartedFadeOut", + "80333220": "sSoundBanksThatLowerBackgroundMusic", + "80333224": "sUnused80332114", + "80333228": "sUnused80332118", + "8033322c": "sBackgroundMusicMaxTargetVolume", + "80333230": "D_80332120", + "80333234": "D_80332124", + "80333238": "sBackgroundMusicQueueSize", + "8033323c": "sUnused8033323C", + "803332a0": "gAudioSessionPresets", + "80333498": "gAudioCosineTable", + "80333598": "gPitchBendFrequencyScale", + "80333994": "gNoteFrequencies", + "80333b94": "gDefaultShortNoteVelocityTable", + "80333ba4": "gDefaultShortNoteDurationTable", + "80333bb4": "gVibratoCurve", + "80333bc4": "gDefaultEnvelope", + "80333bd0": "sSineWave", + "80333c50": "sSquareWave", + "80333cd0": "sTriangleWave", + "80333d50": "sSawtoothWave", + "80333dd0": "gWaveSamples", + "80333de0": "gHeadsetPanQuantization", + "80333df4": "gHeadsetPanVolume", + "80333ff4": "gStereoPanVolume", + "803341f4": "gDefaultPanVolume", + "803343f4": "gVolRampingLhs136", + "803345f4": "gVolRampingRhs136", + "803347f4": "gVolRampingLhs144", + "803349f4": "gVolRampingRhs144", + "80334bf4": "gVolRampingLhs128", + "80334df4": "gVolRampingRhs128", + "80334ff4": "gTatumsPerBeat", + "80334ff8": "gUnusedCount80333EE8", + "80334ffc": "gAudioHeapSize", + "80335000": "gAudioInitPoolSize", + "80335004": "gAudioLoadLock", + "80335008": "sUnused8033EF8", + "80335010": "osViModeTable", + "803358d0": "viMgrMainArgs", + "803358f0": "__osPiDevMgr", + "80335910": "osClockRate", + "80335918": "D_80334808", + "80335920": "_osContInitialized", + "80335930": "D_80334820", + "80335940": "D_80334830", + "80335950": "_spaces", + "80335974": "_zeroes", + "803359a0": "D_80334890", + "803359a4": "D_80334894", + "803359a8": "D_80334898", + "803359ac": "D_8033489C", + "803359b0": "D_803348A0", + "803359b4": "D_803348A4", + "803359c0": "sViContexts", + "80335a20": "__osViCurr", + "80335a24": "__osViNext", + "80335a28": "sTvType", + "80335a2c": "osViClock", + "80335a30": "D_80334920", + "80335a44": "D_80334934", + "80335a48": "D_80334938", + "80335a50": "gOsPiAccessQueueCreated", + "80335a60": "gOsSiAccessQueueCreated", + "80335aa0": "D_80334990", + "80335af0": "D_803349E0", + "80335b40": "D_80334A30", + "80335b44": "D_80334A34", + "80335b48": "D_80334A38", + "80335b50": "D_80334A40", + "80335b54": "D_80334A44", + "80339880": "length_str", + "80339884": "flags_str", + "8033988c": "flags_arr", + "80339980": "D_80338610", + "803399a0": "jtbl_80338630", + "803399d0": "NAN", + "803399e0": "D_80338670", + "80339a40": "D_803386D0", + "80339ac0": "rspF3DDataStart", + "8033a2c0": "rspF3DDataEnd", + "8033a2c0": "rspAspMainDataStart", + "8033a580": "rspAspMainDataEnd", + "8033a580": "_mainSegmentEnd", + "008c0c40": "_mainSegmentRomEnd", + "8033a580": "_mainSegmentNoloadStart", + "8033a580": "D_80339210", + "8033a730": "gIdleThread", + "8033a8e0": "gMainThread", + "8033aa90": "gGameLoopThread", + "8033ac40": "gSoundThread", + "8033adf0": "gPIMesgQueue", + "8033ae08": "gIntrMesgQueue", + "8033ae20": "gSPTaskMesgQueue", + "8033ae38": "gDmaMesgBuf", + "8033ae40": "gPIMesgBuf", + "8033aec0": "gSIEventMesgBuf", + "8033aec8": "gIntrMesgBuf", + "8033af08": "gUnknownMesgBuf", + "8033af48": "gDmaIoMesg", + "8033af5c": "D_80339BEC", + "8033af60": "gDmaMesgQueue", + "8033af78": "gSIEventMesgQueue", + "8033af90": "gControllers", + "8033afe8": "gControllerStatuses", + "8033aff8": "gControllerPads", + "8033b010": "gGameVblankQueue", + "8033b028": "D_80339CB8", + "8033b040": "D_80339CD0", + "8033b044": "D_80339CD4", + "8033b048": "gGameVblankHandler", + "8033b050": "gPhysicalFrameBuffers", + "8033b05c": "gPhysicalZBuffer", + "8033b060": "D_80339CF0", + "8033b064": "D_80339CF4", + "8033b068": "gGfxSPTask", + "8033b06c": "gDisplayListHead", + "8033b070": "gGfxPoolEnd", + "8033b074": "gGfxPool", + "8033b078": "gControllerBits", + "8033b079": "gEepromProbe", + "8033b080": "D_80339D10", + "8033b090": "gDemo", + "8033b0a0": "filler80339D30", + "8033b170": "gMarioStates", + "8033b238": "sCurrPlayMode", + "8033b23a": "D_80339ECA", + "8033b23c": "sTransitionTimer", + "8033b240": "sTransitionUpdate", + "8033b244": "unused3", + "8033b248": "sWarpDest", + "8033b250": "D_80339EE0", + "8033b252": "sDelayedWarpOp", + "8033b254": "sDelayedWarpTimer", + "8033b256": "sSourceWarpNodeId", + "8033b258": "sDelayedWarpArg", + "8033b25c": "unused4", + "8033b25e": "sTimerRunning", + "8033b260": "gHudDisplay", + "8033b26e": "gNeverEnteredCastle", + "8033b270": "sDelayInvincTimer", + "8033b272": "sInvulnerable", + "8033b280": "unused80339F10", + "8033b288": "filler80339F1C", + "8033b2c0": "sFloorAlignMatrix", + "8033b350": "gMirrorMario", + "8033b3b0": "gBodyStates", + "8033b400": "sSegmentTable", + "8033b480": "sPoolFreeSpace", + "8033b484": "sPoolStart", + "8033b488": "sPoolEnd", + "8033b48c": "sPoolListHeadL", + "8033b490": "sPoolListHeadR", + "8033b494": "gEffectsMemoryPool", + "8033b4a0": "gWarpCheckpoint", + "8033b4a5": "gMainMenuDataModified", + "8033b4a6": "gSaveFileModified", + "8033b4b0": "gPlayerSpawnInfos", + "8033b4d0": "D_8033A160", + "8033b8d0": "gAreaData", + "8033bab0": "gWarpTransition", + "8033bac6": "gCurrCourseNum", + "8033bac8": "gCurrActNum", + "8033baca": "gCurrAreaIndex", + "8033bacc": "gSavedCourseNum", + "8033bace": "gPauseScreenMode", + "8033bad0": "gSaveOptSelectIndex", + "8033bae0": "gMatStackIndex", + "8033bae8": "gMatStack", + "8033c2e8": "gMatStackFixed", + "8033c368": "gGeoTempState", + "8033c378": "gCurAnimType", + "8033c379": "gCurAnimEnabled", + "8033c37a": "gCurrAnimFrame", + "8033c37c": "gCurAnimTranslationMultiplier", + "8033c380": "gCurrAnimAttribute", + "8033c384": "gCurAnimData", + "8033c388": "gDisplayListHeap", + "8033c390": "gProfilerFrameData", + "8033c520": "gPlayerCameraState", + "8033c568": "sOldPosition", + "8033c578": "sOldFocus", + "8033c588": "sPlayer2FocusOffset", + "8033c594": "sCreditsPlayer2Pitch", + "8033c596": "sCreditsPlayer2Yaw", + "8033c598": "sFramesPaused", + "8033c5a0": "sFOVState", + "8033c5c0": "sModeTransition", + "8033c5e8": "sMarioGeometry", + "8033c61c": "unusedFreeRoamWallYaw", + "8033c61e": "sAvoidYawVel", + "8033c620": "sCameraYawAfterDoorCutscene", + "8033c622": "unusedSplinePitch", + "8033c624": "unusedSplineYaw", + "8033c628": "sHandheldShakeSpline", + "8033c668": "sHandheldShakeMag", + "8033c66c": "sHandheldShakeTimer", + "8033c670": "sHandheldShakeInc", + "8033c674": "sHandheldShakePitch", + "8033c676": "sHandheldShakeYaw", + "8033c678": "sHandheldShakeRoll", + "8033c67c": "unused8033B30C", + "8033c680": "unused8033B310", + "8033c684": "sSelectionFlags", + "8033c686": "unused8033B316", + "8033c688": "s2ndRotateFlags", + "8033c68a": "unused8033B31A", + "8033c68c": "sCameraSoundFlags", + "8033c68e": "sCButtonsPressed", + "8033c690": "sCutsceneDialogID", + "8033c698": "gLakituState", + "8033c758": "unused8033B3E8", + "8033c75a": "sAreaYaw", + "8033c75c": "sAreaYawChange", + "8033c75e": "sLakituDist", + "8033c760": "sLakituPitch", + "8033c764": "sZoomAmount", + "8033c768": "sCSideButtonYaw", + "8033c76a": "sBehindMarioSoundTimer", + "8033c76c": "sZeroZoomDist", + "8033c770": "sCUpCameraPitch", + "8033c772": "sModeOffsetYaw", + "8033c774": "sSpiralStairsYawOffset", + "8033c776": "s8DirModeBaseYaw", + "8033c778": "s8DirModeYawOffset", + "8033c77c": "sPanDistance", + "8033c780": "sCannonYOffset", + "8033c788": "sModeInfo", + "8033c7d0": "sCastleEntranceOffset", + "8033c7dc": "sParTrackIndex", + "8033c7e0": "sParTrackPath", + "8033c7e8": "sParTrackTransOff", + "8033c808": "sCameraStoreCUp", + "8033c828": "sCameraStoreCutscene", + "8033c848": "gCameraMovementFlags", + "8033c84a": "sStatusFlags", + "8033c850": "sCurCreditsSplinePos", + "8033c950": "sCurCreditsSplineFocus", + "8033ca50": "sCutsceneSplineSegment", + "8033ca54": "sCutsceneSplineSegmentProgress", + "8033ca58": "unused8033B6E8", + "8033ca5a": "sCutsceneShot", + "8033ca5c": "gCutsceneTimer", + "8033ca60": "sCutsceneVars", + "8033cbc8": "gObjCutsceneDone", + "8033cbcc": "gCutsceneObjSpawn", + "8033cbd0": "gCamera", + "8033cbe0": "gObjectListArray", + "8033d260": "gDebugInfoFlags", + "8033d264": "gNumFindFloorMisses", + "8033d268": "unused_8033BEF8", + "8033d26c": "gUnknownWallCount", + "8033d270": "gObjectCounter", + "8033d274": "gNumCalls", + "8033d280": "gDebugInfo", + "8033d380": "gDebugInfoOverwrite", + "8033d480": "gTimeStopState", + "8033d488": "gObjectPool", + "80360e88": "gMacroObjectDefaultParent", + "803610e8": "gObjectLists", + "803610f0": "gFreeObjectList", + "80361158": "gMarioObject", + "8036115c": "gLuigiObject", + "80361160": "gCurrentObject", + "80361164": "gCurBhvCommand", + "80361168": "gPrevFrameObjectCount", + "8036116c": "gSurfaceNodesAllocated", + "80361170": "gSurfacesAllocated", + "80361174": "gNumStaticSurfaceNodes", + "80361178": "gNumStaticSurfaces", + "8036117c": "gObjectMemoryPool", + "80361180": "gCheckingSurfaceCollisionsForCamera", + "80361182": "gFindFloorIncludeSurfaceIntangible", + "80361184": "gEnvironmentRegions", + "80361188": "gEnvironmentLevels", + "803611d8": "gDoorAdjacentRooms", + "80361250": "gMarioCurrentRoom", + "80361252": "D_8035FEE2", + "80361254": "D_8035FEE4", + "80361256": "gTHIWaterDrained", + "80361258": "gTTCSpeedSetting", + "8036125a": "gMarioShotFromCannon", + "8036125c": "gCCMEnteredSlide", + "8036125e": "gNumRoomedObjectsInMarioRoom", + "80361260": "gNumRoomedObjectsNotInMarioRoom", + "80361262": "gWDWWaterLevelChanging", + "80361264": "gMarioOnMerryGoRound", + "80361290": "gDebugPrintState1", + "803612a0": "gDebugPrintState2", + "803612b0": "sMarioOnFlyingCarpet", + "803612b2": "sSurfaceTypeBelowShadow", + "803612b4": "gShadowAboveWaterOrLava", + "803612b5": "gMarioOnIceOrCarpet", + "803612c0": "sSkyBoxInfo", + "803612e0": "gMovetexLastTextureId", + "803612f0": "gFlyingCarpetState", + "80361300": "gPaintingMarioFloorType", + "80361304": "gPaintingMarioXPos", + "80361308": "gPaintingMarioYPos", + "8036130c": "gPaintingMarioZPos", + "80361310": "gPaintingMesh", + "80361314": "gPaintingTriNorms", + "80361318": "gRipplingPainting", + "8036131c": "gDddPaintingStatus", + "80361320": "sTextLabels", + "803613f0": "gDialogColorFadeTimer", + "803613f2": "gLastDialogLineNum", + "803613f4": "gDialogVariable", + "803613f8": "gDialogTextAlpha", + "803613fa": "gCutsceneMsgXOffset", + "803613fc": "gCutsceneMsgYOffset", + "803613fe": "gRedCoinsCollected", + "80361400": "gEnvFxBuffer", + "80361408": "gSnowCylinderLastPos", + "80361414": "gSnowParticleCount", + "80361416": "gSnowParticleMaxCount", + "80361420": "gEnvFxBubbleConfig", + "80361460": "sNumActiveFirePiranhaPlants", + "80361464": "sNumKilledFirePiranhaPlants", + "80361468": "sObjSavedPosX", + "8036146c": "sObjSavedPosY", + "80361470": "sObjSavedPosZ", + "80361474": "sMontyMoleHoleList", + "80361478": "sMontyMoleKillStreak", + "8036147c": "sMontyMoleLastKilledPosX", + "80361480": "sMontyMoleLastKilledPosY", + "80361484": "sMontyMoleLastKilledPosZ", + "80361488": "sMasterTreadmill", + "80361490": "gCurrAiBuffer", + "80361498": "sSoundRequests", + "80361c98": "D_80360928", + "80361f98": "sUsedChannelsForSoundBank", + "80361fa8": "sCurrentSound", + "80361fb8": "sSoundBanks", + "80364b78": "sSoundMovingSpeed", + "80364b82": "sBackgroundMusicTargetVolume", + "80364b88": "sBackgroundMusicQueue", + "80364ba0": "__osEventStateTab", + "80364c20": "D_803638B0", + "80365e70": "piMgrThread", + "80366020": "piMgrStack", + "80367020": "__osPiMesgQueue", + "80367038": "piMgrMesgBuff", + "80367040": "D_80365CD0", + "80367050": "_osContCmdBuf", + "8036708c": "_osContPifCtrl", + "80367090": "_osLastSentSiCmd", + "80367091": "_osContNumControllers", + "80367098": "D_80365D28", + "803670b8": "_osContMesgQueue", + "803670d0": "_osContMesgBuff", + "803670f0": "D_80365D80", + "80367110": "_osCurrentTime", + "80367118": "D_80365DA8", + "8036711c": "__osViIntrCount", + "80367120": "D_80365DB0", + "80367130": "osPiMesgBuff", + "80367138": "gOsPiMessageQueue", + "80367150": "osSiMesgBuff", + "80367158": "gOsSiMessageQueue", + "80367170": "D_80365E00", + "803671ac": "D_80365E3C", + "803671b0": "D_80365E40", + "803672b0": "gInterruptedThread", + "80367460": ".", + "80367460": "_mainSegmentNoloadEnd", + "0000cee0": "_mainSegmentNoloadSizeLo", + "00000002": "_mainSegmentNoloadSizeHi", + "00000001": "ASSERT", + "80378800": "_engineSegmentStart", + "007cc6c0": "_engineSegmentRomStart", + "80378800": "vec3f_copy", + "80378840": "vec3f_set", + "8037888c": "vec3f_add", + "803788e4": "vec3f_sum", + "8037893c": "vec3s_copy", + "8037897c": "vec3s_set", + "803789c8": "vec3s_add", + "80378a20": "vec3s_sum", + "80378a78": "vec3s_sub", + "80378ad0": "vec3s_to_vec3f", + "80378b34": "vec3f_to_vec3s", + "80378c50": "find_vector_perpendicular_to_plane", + "80378d38": "vec3f_cross", + "80378dc0": "vec3f_normalize", + "80378e68": "mtxf_copy", + "80378eb4": "mtxf_identity", + "80378f24": "mtxf_translate", + "80378f84": "mtxf_lookat", + "80379440": "mtxf_rotate_zxy_and_translate", + "803795f0": "mtxf_rotate_xyz_and_translate", + "80379798": "mtxf_billboard", + "80379918": "mtxf_align_terrain_normal", + "80379aa4": "mtxf_align_terrain_triangle", + "80379f60": "mtxf_mul", + "8037a29c": "mtxf_scale_vec3f", + "8037a348": "mtxf_mul_vec3s", + "8037a434": "mtxf_to_mtx", + "8037a4b8": "mtxf_rotate_xy", + "8037a550": "get_pos_from_transform_mtx", + "8037a69c": "vec3f_get_dist_and_angle", + "8037a788": "vec3f_set_dist_and_angle", + "8037a860": "approach_s32", + "8037a8b4": "approach_f32", + "8037a9a8": "atan2s", + "8037ab88": "atan2f", + "8037abec": "spline_get_weights", + "8037afb8": "anim_spline_init", + "8037afe8": "anim_spline_poll", + "8037b220": "init_scene_graph_node_links", + "8037b24c": "init_graph_node_root", + "8037b30c": "init_graph_node_ortho_projection", + "8037b380": "init_graph_node_perspective", + "8037b448": "init_graph_node_start", + "8037b4ac": "init_graph_node_master_list", + "8037b530": "init_graph_node_render_range", + "8037b5b4": "init_graph_node_switch_case", + "8037b670": "init_graph_node_camera", + "8037b744": "init_graph_node_translation_rotation", + "8037b7f8": "init_graph_node_translation", + "8037b89c": "init_graph_node_rotation", + "8037b940": "init_graph_node_scale", + "8037b9e0": "init_graph_node_object", + "8037bad4": "init_graph_node_culling_radius", + "8037bb48": "init_graph_node_animated_part", + "8037bbec": "init_graph_node_billboard", + "8037bc90": "init_graph_node_display_list", + "8037bd24": "init_graph_node_shadow", + "8037bdb4": "init_graph_node_object_parent", + "8037be28": "init_graph_node_generated", + "8037becc": "init_graph_node_background", + "8037bf84": "init_graph_node_held_object", + "8037c044": "geo_add_child", + "8037c0bc": "geo_remove_child", + "8037c138": "geo_make_first_child", + "8037c1e4": "geo_call_global_function_nodes_helper", + "8037c360": "geo_call_global_function_nodes", + "8037c3d0": "geo_reset_object_node", + "8037c448": "geo_obj_init", + "8037c51c": "geo_obj_init_spawninfo", + "8037c658": "geo_obj_init_animation", + "8037c708": "geo_obj_init_animation_accel", + "8037c7d8": "retrieve_animation_index", + "8037c844": "geo_update_animation_frame", + "8037c9e8": "geo_retreive_animation_translation", + "8037cb10": "geo_find_root", + "8037cb60": "read_vec3s_to_vec3f", + "8037cbc0": "read_vec3s", + "8037cbfc": "read_vec3s_angle", + "8037cc74": "register_scene_graph_node", + "8037cd60": "geo_layout_cmd_branch_and_link", + "8037ce24": "geo_layout_cmd_end", + "8037cee8": "geo_layout_cmd_branch", + "8037cf70": "geo_layout_cmd_return", + "8037cfc0": "geo_layout_cmd_open_node", + "8037d018": "geo_layout_cmd_close_node", + "8037d050": "geo_layout_cmd_assign_as_view", + "8037d0d0": "geo_layout_cmd_update_node_flags", + "8037d1d0": "geo_layout_cmd_node_root", + "8037d328": "geo_layout_cmd_node_ortho_projection", + "8037d3a4": "geo_layout_cmd_node_perspective", + "8037d48c": "geo_layout_cmd_node_start", + "8037d4dc": "geo_layout_cmd_nop3", + "8037d500": "geo_layout_cmd_node_master_list", + "8037d55c": "geo_layout_cmd_node_level_of_detail", + "8037d5d4": "geo_layout_cmd_node_switch_case", + "8037d640": "geo_layout_cmd_node_camera", + "8037d6f0": "geo_layout_cmd_node_translation_rotation", + "8037d8d4": "geo_layout_cmd_node_translation", + "8037d998": "geo_layout_cmd_node_rotation", + "8037da5c": "geo_layout_cmd_node_scale", + "8037db50": "geo_layout_cmd_nop2", + "8037db74": "geo_layout_cmd_node_animated_part", + "8037dc10": "geo_layout_cmd_node_billboard", + "8037dcd4": "geo_layout_cmd_node_display_list", + "8037dd4c": "geo_layout_cmd_node_shadow", + "8037dddc": "geo_layout_cmd_node_object_parent", + "8037de34": "geo_layout_cmd_node_generated", + "8037de94": "geo_layout_cmd_node_background", + "8037def8": "geo_layout_cmd_nop", + "8037df1c": "geo_layout_cmd_copy_view", + "8037dfd4": "geo_layout_cmd_node_held_obj", + "8037e058": "geo_layout_cmd_node_culling_radius", + "8037e0b4": "process_geo_layout", + "803805c8": "level_script_execute", + "80380de8": "f32_find_wall_collision", + "80380e8c": "find_wall_collisions", + "80381264": "find_ceil", + "80381470": "unused_obj_find_floor_height", + "803814b8": "find_floor_height_and_data", + "80381794": "find_floor_height", + "803817e0": "unused_find_dynamic_floor", + "80381900": "find_floor", + "80381ba0": "find_water_level", + "80381d3c": "find_poison_gas_level", + "80381f08": "debug_surface_list_info", + "80382294": "unused_resolve_floor_or_ceil_collisions", + "80383340": "alloc_surface_pools", + "803833b8": "load_area_terrain", + "803835a4": "clear_dynamic_surfaces", + "80383614": "transform_object_vertices", + "80383828": "load_object_surfaces", + "803839cc": "load_object_collision_model", + "80383bb0": "random_u16", + "80383cb4": "random_float", + "80383d1c": "random_sign", + "80383d68": "obj_update_gfx_pos_and_angle", + "80385bf0": "stub_behavior_script_2", + "80385c00": "cur_obj_update", + "80385f90": "identityMtx", + "80385fb0": "zeroMtx", + "80385fd0": "gVec3fZero", + "80385fdc": "gVec3sZero", + "80385fe4": "gVec3fOne", + "80385ff0": "gVec3sOne", + "80386000": "gSineTable", + "80387000": "gCosineTable", + "8038b000": "gArctanTable", + "8038b810": "GeoLayoutJumpTable", + "8038b894": "unused_8038B894", + "8038bc90": "_engineSegmentEnd", + "007dfb50": "_engineSegmentRomEnd", + "8038bc90": "_engineSegmentNoloadStart", + "8038bc90": "gSplineKeyframe", + "8038bc94": "gSplineKeyframeFraction", + "8038bc98": "gSplineState", + "8038bca0": "gGraphNodePool", + "8038bca4": "gCurRootGraphNode", + "8038bca8": "D_8038BCA8", + "8038bcac": "gGeoViews", + "8038bcb0": "gGeoNumViews", + "8038bcb8": "gGeoLayoutStack", + "8038bcf8": "gCurGraphNodeList", + "8038bd78": "gCurGraphNodeIndex", + "8038bd7a": "gGeoLayoutStackIndex", + "8038bd7c": "D_8038BD7C", + "8038bd7e": "gGeoLayoutReturnIndex", + "8038bd80": "gGeoLayoutCommand", + "8038bd88": "gObjParentGraphNode", + "8038be30": "sFloorGeo", + "8038be90": "unused8038BE90", + "8038be98": "gStaticSurfacePartition", + "8038d698": "gDynamicSurfacePartition", + "8038ee98": "sSurfaceNodePool", + "8038ee9c": "sSurfacePool", + "8038eea0": "sSurfacePoolSize", + "8038eea8": "unused8038EEA8", + "8038eef0": "_engineSegmentNoloadEnd", + "00000001": "ASSERT", + "8038f800": ".", + "8038f800": "_framebuffersSegmentNoloadStart", + "8038f800": "0x70800", + "8038f800": "gFrameBuffer0", + "803b5000": "gFrameBuffer1", + "803da800": "gFrameBuffer2", + "80400000": "_framebuffersSegmentNoloadEnd", + "80400000": "__expansionRamStart", + "00000001": "ASSERT", + "10000000": "_entrySegmentStart", + "007cc6c0": "_entrySegmentRomStart", + "10000000": "level_script_entry", + "10000030": "_entrySegmentEnd", + "007cc6f0": "_entrySegmentRomEnd", + "02000000": "_segment2_mio0SegmentStart", + "007cc6c0": "_segment2_mio0SegmentRomStart", + "0200bd10": ".", + "0200bd10": "_segment2_mio0SegmentEnd", + "007d83d0": "_segment2_mio0SegmentRomEnd", + "04000000": "_group0_mio0SegmentStart", + "007cc6c0": "_group0_mio0SegmentRomStart", + "04013260": ".", + "04013260": "_group0_mio0SegmentEnd", + "007df920": "_group0_mio0SegmentRomEnd", + "17000000": "_group0_geoSegmentStart", + "007cc6c0": "_group0_geoSegmentRomStart", + "17000000": "bubble_geo", + "1700001c": "purple_marble_geo", + "17000038": "smoke_geo", + "17000084": "burn_smoke_geo", + "1700009c": "small_water_splash_geo", + "170000e0": "mario_TODO_geo_0000E0", + "17000124": "idle_water_wave_geo", + "17000168": "wave_trail_geo", + "170001bc": "sparkles_geo", + "17000230": "water_splash_geo", + "17000284": "sparkles_animation_geo", + "170002e0": "mario_geo_face_and_wings", + "1700041c": "mario_geo_left_hand", + "17000494": "mario_geo_right_hand", + "1700053c": "mario_geo_body", + "170006f8": "mario_geo_medium_poly_left_hand", + "17000770": "mario_geo_medium_poly_right_hand", + "17000818": "mario_geo_medium_poly_body", + "170009d4": "mario_geo_low_poly_face_and_wings", + "17000b10": "mario_geo_low_poly_left_hand", + "17000b88": "mario_geo_low_poly_right_hand", + "17000c30": "mario_geo_low_poly_body", + "17000dec": "mario_vanish_geo_face_and_wings", + "17000f28": "mario_vanish_geo_left_hand", + "17000fa0": "mario_vanish_geo_right_hand", + "17001048": "mario_vanish_geo_body", + "17001204": "mario_vanish_geo_medium_poly_left_hand", + "1700127c": "mario_vanish_geo_medium_poly_right_hand", + "17001324": "mario_vanish_geo_medium_poly_body", + "170014e0": "mario_vanish_geo_low_poly_face_and_wings", + "1700161c": "mario_vanish_geo_low_poly_left_hand", + "17001694": "mario_vanish_geo_low_poly_right_hand", + "1700173c": "mario_vanish_geo_low_poly_body", + "170018f8": "mario_metal_geo_face_and_wings", + "170019a4": "mario_metal_geo_left_hand", + "17001a1c": "mario_metal_geo_right_hand", + "17001ac4": "mario_metal_geo_body", + "17001c80": "mario_metal_geo_medium_poly_left_hand", + "17001cf8": "mario_metal_geo_medium_poly_right_hand", + "17001da0": "mario_metal_geo_medium_poly_body", + "17001f5c": "mario_metal_geo_low_poly_face_and_wings", + "17002008": "mario_metal_geo_low_poly_left_hand", + "17002080": "mario_metal_geo_low_poly_right_hand", + "17002128": "mario_metal_geo_low_poly_body", + "170022e4": "mario_metal_vanish_geo_face_and_wings", + "17002390": "mario_metal_vanish_geo_left_hand", + "17002408": "mario_metal_vanish_geo_right_hand", + "170024b0": "mario_metal_vanish_geo_body", + "1700266c": "mario_metal_vanish_geo_medium_poly_left_hand", + "170026e4": "mario_metal_vanish_geo_medium_poly_right_hand", + "1700278c": "mario_metal_vanish_geo_medium_poly_body", + "17002958": "mario_metal_vanish_geo_low_poly_face_and_wings", + "17002a04": "mario_metal_vanish_geo_low_poly_left_hand", + "17002a7c": "mario_metal_vanish_geo_low_poly_right_hand", + "17002b24": "mario_metal_vanish_geo_low_poly_body", + "17002ce0": "mario_geo_load_body", + "17002d14": "mario_geo_load_medium_poly_body", + "17002d48": "mario_geo_load_low_poly_body", + "17002d7c": "mario_geo_render_body", + "17002dd4": "mario_geo", + "17002e30": "_group0_geoSegmentEnd", + "007cf4f0": "_group0_geoSegmentRomEnd", + "05000000": "_group1_mio0SegmentStart", + "007cc6c0": "_group1_mio0SegmentRomStart", + "05008070": ".", + "05008070": "_group1_mio0SegmentEnd", + "007d4730": "_group1_mio0SegmentRomEnd", + "0c000000": "_group1_geoSegmentStart", + "007cc6c0": "_group1_geoSegmentRomStart", + "0c000000": "yellow_sphere_geo", + "0c000018": "hoot_geo", + "0c0001e4": "yoshi_egg_geo", + "0c000248": "thwomp_geo", + "0c000264": "bullet_bill_geo", + "0c00028c": "heave_ho_geo", + "0c000410": "_group1_geoSegmentEnd", + "007ccad0": "_group1_geoSegmentRomEnd", + "05000000": "_group2_mio0SegmentStart", + "007cc6c0": "_group2_mio0SegmentRomStart", + "05001e10": ".", + "05001e10": "_group2_mio0SegmentEnd", + "007ce4d0": "_group2_mio0SegmentRomEnd", + "0c000000": "_group2_geoSegmentStart", + "007cc6c0": "_group2_geoSegmentRomStart", + "0c000000": "bully_geo", + "0c000120": "bully_boss_geo", + "0c000240": "blargg_geo", + "0c0002b0": "_group2_geoSegmentEnd", + "007cc970": "_group2_geoSegmentRomEnd", + "05000000": "_group3_mio0SegmentStart", + "007cc6c0": "_group3_mio0SegmentRomStart", + "050068b0": ".", + "050068b0": "_group3_mio0SegmentEnd", + "007d2f70": "_group3_mio0SegmentRomEnd", + "0c000000": "_group3_geoSegmentStart", + "007cc6c0": "_group3_geoSegmentRomStart", + "0c000000": "king_bobomb_geo", + "0c000308": "water_bomb_geo", + "0c000328": "water_bomb_shadow_geo", + "0c000340": "_group3_geoSegmentEnd", + "007cca00": "_group3_geoSegmentRomEnd", + "05000000": "_group4_mio0SegmentStart", + "007cc6c0": "_group4_mio0SegmentRomStart", + "0500a300": ".", + "0500a300": "_group4_mio0SegmentEnd", + "007d69c0": "_group4_mio0SegmentRomEnd", + "0c000000": "_group4_geoSegmentStart", + "007cc6c0": "_group4_geoSegmentRomStart", + "0c000000": "clam_shell_geo", + "0c000068": "sushi_geo", + "0c00010c": "unagi_geo", + "0c000280": "_group4_geoSegmentEnd", + "007cc940": "_group4_geoSegmentRomEnd", + "05000000": "_group5_mio0SegmentStart", + "007cc6c0": "_group5_mio0SegmentRomStart", + "0500bce0": ".", + "0500bce0": "_group5_mio0SegmentEnd", + "007d83a0": "_group5_mio0SegmentRomEnd", + "0c000000": "_group5_geoSegmentStart", + "007cc6c0": "_group5_geoSegmentRomStart", + "0c000000": "klepto_geo", + "0c0002ac": "eyerok_geo_0002AC", + "0c0005a8": "eyerok_left_hand_geo", + "0c0005e4": "eyerok_right_hand_geo", + "0c000610": "pokey_head_geo", + "0c000644": "pokey_body_part_geo", + "0c000660": "_group5_geoSegmentEnd", + "007ccd20": "_group5_geoSegmentRomEnd", + "05000000": "_group6_mio0SegmentStart", + "007cc6c0": "_group6_mio0SegmentRomStart", + "0500e110": ".", + "0500e110": "_group6_mio0SegmentEnd", + "007da7d0": "_group6_mio0SegmentRomEnd", + "0c000000": "_group6_geoSegmentStart", + "007cc6c0": "_group6_geoSegmentRomStart", + "0c000000": "monty_mole_geo", + "0c000110": "ukiki_geo", + "0c00036c": "fwoosh_geo", + "0c000390": "_group6_geoSegmentEnd", + "007cca50": "_group6_geoSegmentRomEnd", + "05000000": "_group7_mio0SegmentStart", + "007cc6c0": "_group7_mio0SegmentRomStart", + "05005070": ".", + "05005070": "_group7_mio0SegmentEnd", + "007d1730": "_group7_mio0SegmentRomEnd", + "0c000000": "_group7_geoSegmentStart", + "007cc6c0": "_group7_geoSegmentRomStart", + "0c000000": "spindrift_geo", + "0c000104": "penguin_geo", + "0c00021c": "mr_blizzard_hidden_geo", + "0c000348": "mr_blizzard_geo", + "0c000370": "_group7_geoSegmentEnd", + "007cca30": "_group7_geoSegmentRomEnd", + "05000000": "_group8_mio0SegmentStart", + "007cc6c0": "_group8_mio0SegmentRomStart", + "05001180": ".", + "05001180": "_group8_mio0SegmentEnd", + "007cd840": "_group8_mio0SegmentRomEnd", + "0c000000": "_group8_geoSegmentStart", + "007cc6c0": "_group8_geoSegmentRomStart", + "0c000000": "springboard_top_geo", + "0c000018": "springboard_spring_geo", + "0c000030": "springboard_bottom_geo", + "0c000048": "cap_switch_geo", + "0c000090": "_group8_geoSegmentEnd", + "007cc750": "_group8_geoSegmentRomEnd", + "05000000": "_group9_mio0SegmentStart", + "007cc6c0": "_group9_mio0SegmentRomStart", + "05006960": ".", + "05006960": "_group9_mio0SegmentEnd", + "007d3020": "_group9_mio0SegmentRomEnd", + "0c000000": "_group9_geoSegmentStart", + "007cc6c0": "_group9_geoSegmentRomStart", + "0c000000": "bookend_part_geo", + "0c0000c0": "bookend_geo", + "0c0000d8": "haunted_chair_geo", + "0c000188": "small_key_geo", + "0c0001b4": "mad_piano_geo", + "0c000224": "boo_geo", + "0c000274": "haunted_cage_geo", + "0c0002b0": "_group9_geoSegmentEnd", + "007cc970": "_group9_geoSegmentRomEnd", + "05000000": "_group10_mio0SegmentStart", + "007cc6c0": "_group10_mio0SegmentRomStart", + "05012cd0": ".", + "05012cd0": "_group10_mio0SegmentEnd", + "007df390": "_group10_mio0SegmentRomEnd", + "0c000000": "_group10_geoSegmentStart", + "007cc6c0": "_group10_geoSegmentRomStart", + "0c000000": "birds_geo", + "0c000098": "peach_geo_000098", + "0c000254": "peach_geo_000254", + "0c000410": "peach_geo", + "0c000468": "yoshi_geo", + "0c000670": "_group10_geoSegmentEnd", + "007ccd30": "_group10_geoSegmentRomEnd", + "05000000": "_group11_mio0SegmentStart", + "007cc6c0": "_group11_mio0SegmentRomStart", + "050073f0": ".", + "050073f0": "_group11_mio0SegmentEnd", + "007d3ab0": "_group11_mio0SegmentRomEnd", + "0c000000": "_group11_geoSegmentStart", + "007cc6c0": "_group11_geoSegmentRomStart", + "0c000000": "bubba_geo", + "0c000030": "wiggler_head_geo", + "0c0001bc": "enemy_lakitu_geo", + "0c000290": "spiny_ball_geo", + "0c000328": "spiny_geo", + "0c0004a0": "_group11_geoSegmentEnd", + "007ccb60": "_group11_geoSegmentRomEnd", + "06000000": "_group12_mio0SegmentStart", + "007cc6c0": "_group12_mio0SegmentRomStart", + "06030c30": ".", + "06030c30": "_group12_mio0SegmentEnd", + "007fd2f0": "_group12_mio0SegmentRomEnd", + "0d000000": "_group12_geoSegmentStart", + "007cc6c0": "_group12_geoSegmentRomStart", + "0d000000": "bowser_flames_geo", + "0d000090": "invisible_bowser_accessory_geo", + "0d0000b0": "bowser_1_yellow_sphere_geo", + "0d0000d8": "bowser_geo_0000D8", + "0d000424": "bowser_geo_000424", + "0d000770": "bowser_geo_000770", + "0d000ab8": "bowser_shadow_geo", + "0d000ac4": "bowser_geo", + "0d000b40": "bowser2_geo", + "0d000bbc": "bowser_bomb_geo", + "0d000bfc": "bowser_impact_smoke_geo", + "0d000c50": "_group12_geoSegmentEnd", + "007cd310": "_group12_geoSegmentRomEnd", + "06000000": "_group13_mio0SegmentStart", + "007cc6c0": "_group13_mio0SegmentRomStart", + "0600a0f0": ".", + "0600a0f0": "_group13_mio0SegmentEnd", + "007d67b0": "_group13_mio0SegmentRomEnd", + "0d000000": "_group13_geoSegmentStart", + "007cc6c0": "_group13_geoSegmentRomStart", + "0d000000": "skeeter_geo", + "0d000284": "seaweed_geo", + "0d0002f4": "water_mine_geo", + "0d000324": "cyan_fish_geo", + "0d00038c": "bub_geo", + "0d000414": "water_ring_geo", + "0d000450": "treasure_chest_base_geo", + "0d000468": "treasure_chest_lid_geo", + "0d000480": "_group13_geoSegmentEnd", + "007ccb40": "_group13_geoSegmentRomEnd", + "06000000": "_group14_mio0SegmentStart", + "007cc6c0": "_group14_mio0SegmentRomStart", + "06013a60": ".", + "06013a60": "_group14_mio0SegmentEnd", + "007e0120": "_group14_mio0SegmentRomEnd", + "0d000000": "_group14_geoSegmentStart", + "007cc6c0": "_group14_geoSegmentRomStart", + "0d000000": "koopa_flag_geo", + "0d0000b8": "wooden_post_geo", + "0d0000d0": "koopa_without_shell_geo", + "0d000214": "koopa_with_shell_geo", + "0d000358": "piranha_plant_geo", + "0d000480": "whomp_geo", + "0d0005d0": "metallic_ball_geo", + "0d0005ec": "chain_chomp_geo", + "0d000680": "_group14_geoSegmentEnd", + "007ccd40": "_group14_geoSegmentRomEnd", + "06000000": "_group15_mio0SegmentStart", + "007cc6c0": "_group15_mio0SegmentRomStart", + "0600c8e0": ".", + "0600c8e0": "_group15_mio0SegmentEnd", + "007d8fa0": "_group15_mio0SegmentRomEnd", + "0d000000": "_group15_geoSegmentStart", + "007cc6c0": "_group15_geoSegmentRomStart", + "0d000000": "lakitu_geo", + "0d000114": "toad_geo_000114", + "0d00027c": "toad_geo_00027C", + "0d0003e4": "toad_geo", + "0d000448": "mips_geo", + "0d0005b0": "boo_castle_geo", + "0d000600": "_group15_geoSegmentEnd", + "007cccc0": "_group15_geoSegmentRomEnd", + "06000000": "_group16_mio0SegmentStart", + "007cc6c0": "_group16_mio0SegmentRomStart", + "06002ba0": ".", + "06002ba0": "_group16_mio0SegmentEnd", + "007cf260": "_group16_mio0SegmentRomEnd", + "0d000000": "_group16_geoSegmentStart", + "007cc6c0": "_group16_geoSegmentRomStart", + "0d000000": "moneybag_geo_000000", + "0d000078": "moneybag_geo_000078", + "0d0000f0": "moneybag_geo", + "0d000150": "_group16_geoSegmentEnd", + "007cc810": "_group16_geoSegmentRomEnd", + "06000000": "_group17_mio0SegmentStart", + "007cc6c0": "_group17_mio0SegmentRomStart", + "06009c50": ".", + "06009c50": "_group17_mio0SegmentEnd", + "007d6310": "_group17_mio0SegmentRomEnd", + "0d000000": "_group17_geoSegmentStart", + "007cc6c0": "_group17_geoSegmentRomStart", + "0d000000": "mr_i_geo", + "0d00001c": "mr_i_iris_geo", + "0d0000dc": "swoop_geo", + "0d0001a0": "snufit_geo", + "0d000230": "dorrie_geo", + "0d000394": "scuttlebug_geo", + "0d0006d0": "_group17_geoSegmentEnd", + "007ccd90": "_group17_geoSegmentRomEnd", + "08000000": "_common0_mio0SegmentStart", + "007cc6c0": "_common0_mio0SegmentRomStart", + "0800e6d0": ".", + "0800e6d0": "_common0_mio0SegmentEnd", + "007dad90": "_common0_mio0SegmentRomEnd", + "0f000000": "_common0_geoSegmentStart", + "007cc6c0": "_common0_geoSegmentRomStart", + "0f000000": "blue_coin_switch_geo", + "0f000020": "test_platform_geo", + "0f000028": "amp_geo", + "0f0001a8": "cannon_base_geo", + "0f0001c0": "cannon_barrel_geo", + "0f0001d8": "chuckya_geo", + "0f0004cc": "purple_switch_geo", + "0f0004e4": "checkerboard_platform_geo", + "0f0004fc": "heart_geo", + "0f000518": "flyguy_geo", + "0f0005d0": "breakable_box_geo", + "0f000610": "breakable_box_small_geo", + "0f000640": "bowling_ball_geo", + "0f00066c": "bowling_ball_track_geo", + "0f000694": "exclamation_box_geo", + "0f0006e4": "goomba_geo", + "0f0007b8": "black_bobomb_geo", + "0f0008f4": "bobomb_buddy_geo", + "0f000a30": "metal_box_geo", + "0f000a58": "exclamation_box_outline_geo", + "0f000ab0": "koopa_shell_geo", + "0f000adc": "koopa_shell2_geo", + "0f000b08": "koopa_shell3_geo", + "0f000b40": "_common0_geoSegmentEnd", + "007cd200": "_common0_geoSegmentRomEnd", + "03000000": "_common1_mio0SegmentStart", + "007cc6c0": "_common1_mio0SegmentRomStart", + "03017990": ".", + "03017990": "_common1_mio0SegmentEnd", + "007e4050": "_common1_mio0SegmentRomEnd", + "16000000": "_common1_geoSegmentStart", + "007cc6c0": "_common1_geoSegmentRomStart", + "16000000": "mist_geo", + "16000020": "white_puff_geo", + "16000040": "explosion_geo", + "160000a8": "butterfly_geo", + "1600013c": "yellow_coin_geo", + "160001a0": "yellow_coin_no_shadow_geo", + "16000200": "blue_coin_geo", + "16000264": "blue_coin_no_shadow_geo", + "160002c4": "red_coin_geo", + "16000328": "red_coin_no_shadow_geo", + "16000388": "warp_pipe_geo", + "160003a8": "castle_door_geo", + "1600043c": "cabin_door_geo", + "160004d0": "wooden_door_geo", + "16000564": "wooden_door2_geo", + "160005f8": "metal_door_geo", + "1600068c": "hazy_maze_door_geo", + "16000720": "haunted_door_geo", + "160007b4": "castle_door_0_star_geo", + "16000868": "castle_door_1_star_geo", + "1600091c": "castle_door_3_stars_geo", + "160009d0": "key_door_geo", + "16000a84": "bowser_key_geo", + "16000ab0": "bowser_key_cutscene_geo", + "16000b10": "red_flame_shadow_geo", + "16000b2c": "red_flame_geo", + "16000b8c": "blue_flame_geo", + "16000bec": "fish_shadow_geo", + "16000c44": "fish_geo", + "16000c8c": "leaves_geo", + "16000ca4": "marios_cap_geo", + "16000cf0": "marios_metal_cap_geo", + "16000d3c": "marios_wing_cap_geo", + "16000da8": "marios_winged_metal_cap_geo", + "16000e14": "number_geo", + "16000e84": "mushroom_1up_geo", + "16000ea0": "star_geo", + "16000ed4": "dirt_animation_geo", + "16000f24": "cartoon_star_geo", + "16000f6c": "transparent_star_geo", + "16000f98": "white_particle_geo", + "16000fb4": "wooden_signpost_geo", + "16000fe8": "bubbly_tree_geo", + "16001000": "spiky_tree_geo", + "16001018": "snow_tree_geo", + "16001030": "spiky_tree1_geo", + "16001048": "palm_tree_geo", + "16001060": "_common1_geoSegmentEnd", + "007cd720": "_common1_geoSegmentRomEnd", + "13000000": "_behaviorSegmentStart", + "007cc6c0": "_behaviorSegmentRomStart", + "13000000": "bhvStarDoor", + "13000054": "bhvMrI", + "1300008c": "bhvMrIBody", + "130000ac": "bhvMrIParticle", + "130000f8": "bhvPurpleParticle", + "13000118": "bhvGiantPole", + "13000144": "bhvPoleGrabbing", + "13000174": "bhvThiHugeIslandTop", + "13000194": "bhvThiTinyIslandTop", + "130001ac": "bhvCapSwitchBase", + "130001cc": "bhvCapSwitch", + "130001f4": "bhvKingBobomb", + "13000254": "bhvBobombAnchorMario", + "13000278": "bhvBetaChestBottom", + "1300029c": "bhvBetaChestLid", + "130002b8": "bhvBubbleParticleSpawner", + "130002e4": "bhvBubbleMaybe", + "13000338": "bhvSmallWaterWave", + "13000398": "bhvSmallWaterWave398", + "130003bc": "bhvWaterAirBubble", + "13000400": "bhvSmallParticle", + "13000428": "bhvPlungeBubble", + "13000444": "bhvSmallParticleSnow", + "1300046c": "bhvSmallParticleBubbles", + "13000494": "bhvFishGroup", + "130004a8": "bhvCannon", + "130004e4": "bhvCannonBarrel", + "13000500": "bhvCannonBaseUnused", + "13000528": "bhvChuckya", + "13000584": "bhvChuckyaAnchorMario", + "130005a8": "bhvUnused05A8", + "130005b4": "bhvRotatingPlatform", + "130005d8": "bhvTower", + "13000600": "bhvBulletBillCannon", + "13000624": "bhvWfBreakableWallRight", + "13000638": "bhvWfBreakableWallLeft", + "1300066c": "bhvKickableBoard", + "130006a4": "bhvTowerDoor", + "130006d8": "bhvRotatingCounterClockwise", + "130006e0": "bhvWfRotatingWoodenPlatform", + "13000708": "bhvKoopaShellUnderwater", + "13000720": "bhvExitPodiumWarp", + "1300075c": "bhvFadingWarp", + "13000780": "bhvWarp", + "130007a0": "bhvWarpPipe", + "130007dc": "bhvWhitePuffExplosion", + "130007f8": "bhvSpawnedStar", + "1300080c": "bhvSpawnedStarNoLevelExit", + "13000830": "bhvMrIBlueCoin", + "13000888": "bhvCoinInsideBoo", + "130008d0": "bhvCoinFormationSpawn", + "130008ec": "bhvCoinFormation", + "1300090c": "bhvOneCoin", + "1300091c": "bhvYellowCoin", + "13000940": "bhvTemporaryYellowCoin", + "13000964": "bhvThreeCoinsSpawn", + "13000984": "bhvTenCoinsSpawn", + "130009a4": "bhvSingleCoinGetsSpawned", + "130009e0": "bhvCoinSparkles", + "13000a14": "bhvGoldenCoinSparkles", + "13000a34": "bhvWallTinyStarParticle", + "13000a54": "bhvVertStarParticleSpawner", + "13000a78": "bhvPoundTinyStarParticle", + "13000a98": "bhvHorStarParticleSpawner", + "13000abc": "bhvPunchTinyTriangle", + "13000ad8": "bhvTriangleParticleSpawner", + "13000afc": "bhvDoorWarp", + "13000b0c": "bhvDoor", + "13000b58": "bhvGrindel", + "13000b8c": "bhvThwomp2", + "13000bc8": "bhvThwomp", + "13000c04": "bhvTumblingBridgePlatform", + "13000c28": "bhvWfTumblingBridge", + "13000c44": "bhvBbhTumblingBridge", + "13000c64": "bhvLllTumblingBridge", + "13000c84": "bhvFlame", + "13000cc8": "bhvAnotherElavator", + "13000cfc": "bhvRrElevatorPlatform", + "13000d30": "bhvHmcElevatorPlatform", + "13000d6c": "bhvWaterMist", + "13000d98": "bhvBreathParticleSpawner", + "13000db4": "bhvBreakBoxTriangle", + "13000dd8": "bhvWaterMist2", + "13000dfc": "bhvUnused0DFC", + "13000e24": "bhvMistCircParticleSpawner", + "13000e3c": "bhvDirtParticleSpawner", + "13000e58": "bhvSnowParticleSpawner", + "13000e70": "bhvWind", + "13000e88": "bhvEndToad", + "13000eac": "bhvEndPeach", + "13000ed0": "bhvUnusedParticleSpawn", + "13000f08": "bhvUkiki", + "13000f14": "bhvUkikiCageChild", + "13000f2c": "bhvUkikiCageStar", + "13000f48": "bhvUkikiCage", + "13000f9c": "bhvBitfsSinkingPlatforms", + "13000fc8": "bhvBitfsSinkingCagePlatform", + "13001000": "bhvDddMovingPole", + "13001030": "bhvBitfsTiltingInvertedPyramid", + "13001064": "bhvSquishablePlatform", + "13001098": "bhvCutOutObject", + "130010a8": "bhvBetaMovingFlamesSpawn", + "130010b8": "bhvBetaMovingFlames", + "130010d8": "bhvRrRotatingBridgePlatform", + "13001108": "bhvFlamethrower", + "13001124": "bhvFlamethrowerFlame", + "13001168": "bhvBouncingFireball", + "13001184": "bhvBouncingFireballFlame", + "130011d0": "bhvBowserShockWave", + "130011ec": "bhvFireParticleSpawner", + "13001214": "bhvBlackSmokeMario", + "13001254": "bhvBlackSmokeBowser", + "1300127c": "bhvBlackSmokeUpward", + "13001298": "bhvBetaFishSplashSpawner", + "130012b4": "bhvSpindrift", + "130012f4": "bhvTowerPlatformGroup", + "13001318": "bhvWfSlidingTowerPlatform", + "13001340": "bhvWfElevatorTowerPlatform", + "13001368": "bhvWfSolidTowerPlatform", + "13001390": "bhvLeafParticleSpawner", + "130013a8": "bhvTreeSnow", + "130013c4": "bhvTreeLeaf", + "130013dc": "bhvAnotherTiltingPlatform", + "13001408": "bhvSquarishPathMoving", + "1300142c": "bhvPiranhaPlantBubble", + "13001448": "bhvPiranhaPlantWakingBubbles", + "13001468": "bhvFloorSwitchAnimatesObject", + "13001478": "bhvFloorSwitchGrills", + "13001484": "bhvFloorSwitchHardcodedModel", + "130014ac": "bhvFloorSwitchHiddenObjects", + "130014bc": "bhvHiddenObject", + "130014e0": "bhvBreakableBox", + "13001518": "bhvPushableMetalBox", + "13001548": "bhvHeaveHo", + "130015a4": "bhvHeaveHoThrowMario", + "130015c0": "bhvCcmTouchedStarSpawn", + "130015e4": "bhvUnusedPoundablePlatform", + "13001608": "bhvBetaTrampolineTop", + "13001634": "bhvBetaTrampolineSpring", + "13001650": "bhvJumpingBox", + "1300167c": "bhvBooCage", + "130016ac": "bhvStub", + "130016b8": "bhvIgloo", + "130016e4": "bhvBowserKey", + "13001714": "bhvGrandStar", + "13001744": "bhvBetaBooKey", + "13001778": "bhvAlphaBooKey", + "1300179c": "bhvBulletBill", + "130017f4": "bhvWhitePuffSmoke", + "13001820": "bhvUnused1820", + "13001828": "bhvBowserTailAnchor", + "13001850": "bhvBowser", + "130018cc": "bhvBowserBodyAnchor", + "13001904": "bhvBowserFlameSpawn", + "13001920": "bhvTiltingBowserLavaPlatform", + "13001958": "bhvFallingBowserPlatform", + "13001984": "bhvBlueBowserFlame", + "130019c8": "bhvFlameFloatingLanding", + "13001a0c": "bhvBlueFlamesGroup", + "13001a30": "bhvFlameBouncing", + "13001a74": "bhvFlameMovingForwardGrowing", + "13001aa4": "bhvFlameBowser", + "13001ae8": "bhvFlameLargeBurningOut", + "13001b2c": "bhvBlueFish", + "13001b54": "bhvTankFishGroup", + "13001b70": "bhvCheckerboardElevatorGroup", + "13001b88": "bhvCheckerboardPlatformSub", + "13001bb4": "bhvBowserKeyUnlockDoor", + "13001bd4": "bhvBowserKeyCourseExit", + "13001bf4": "bhvInvisibleObjectsUnderBridge", + "13001c04": "bhvWaterLevelPillar", + "13001c34": "bhvDddWarp", + "13001c58": "bhvMoatGrills", + "13001c7c": "bhvClockMinuteHand", + "13001c8c": "bhvClockHourHand", + "13001cb0": "bhvMacroUkiki", + "13001d0c": "bhvStub1D0C", + "13001d14": "bhvLllRotatingHexagonalPlatform", + "13001d40": "bhvLllSinkingRockBlock", + "13001d70": "bhvStub1D70", + "13001d78": "bhvLllMovingOctagonalMeshPlatform", + "13001da4": "bhvSnowBall", + "13001da8": "bhvLllRotatingBlockWithFireBars", + "13001dcc": "bhvLllRotatingHexFlame", + "13001e04": "bhvLllWoodPiece", + "13001e30": "bhvLllFloatingWoodBridge", + "13001e4c": "bhvVolcanoFlames", + "13001e6c": "bhvLllRotatingHexagonalRing", + "13001e94": "bhvLllSinkingRectangularPlatform", + "13001ec4": "bhvLllSinkingSquarePlatforms", + "13001ef8": "bhvLllTiltingInvertedPyramid", + "13001f30": "bhvUnused1F30", + "13001f3c": "bhvKoopaShell", + "13001f68": "bhvKoopaShellFlame", + "13001f90": "bhvToxBox", + "13001fbc": "bhvPiranhaPlant", + "13002018": "bhvLllHexagonalMesh", + "13002038": "bhvLllBowserPuzzlePiece", + "13002068": "bhvLllBowserPuzzle", + "13002088": "bhvTuxiesMother", + "130020d8": "bhvPenguinBaby", + "130020e0": "bhvUnused20E0", + "130020e8": "bhvSmallPenguin", + "1300213c": "bhvManyBlueFishSpawner", + "1300214c": "bhvFewBlueFishSpawner", + "1300215c": "bhvFishSpawner", + "13002178": "bhvFish", + "13002194": "bhvWdwExpressElevator", + "130021c0": "bhvWdwExpressElevatorPlatform", + "130021e4": "bhvChirpChirp", + "130021f4": "bhvChirpChirpUnused", + "1300220c": "bhvBub", + "13002250": "bhvExclamationBox", + "1300227c": "bhvRotatingExclamationMark", + "1300229c": "bhvSoundSpawner", + "130022b8": "bhvRockSolid", + "130022d8": "bhvBowserSubDoor", + "13002308": "bhvBowsersSub", + "13002338": "bhvSushiShark", + "13002388": "bhvSushiSharkCollisionChild", + "130023a4": "bhvJrbSlidingBox", + "130023d0": "bhvShipPart3", + "130023ec": "bhvInSunkenShip3", + "1300241c": "bhvSunkenShipPart", + "1300243c": "bhvSunkenShipSetRotation", + "1300244c": "bhvSunkenShipPart2", + "1300246c": "bhvInSunkenShip", + "13002480": "bhvInSunkenShip2", + "130024ac": "bhvMistParticleSpawner", + "130024dc": "bhvWhitePuff1", + "13002500": "bhvWhitePuff2", + "13002528": "bhvWhitePuffSmoke2", + "13002558": "bhvPurpleSwitchHiddenBoxes", + "13002568": "bhvBlueCoinSwitch", + "13002588": "bhvHiddenBlueCoin", + "130025c0": "bhvOpenableCageDoor", + "130025e0": "bhvOpenableGrill", + "130025f8": "bhvWaterLevelDiamond", + "13002620": "bhvInitializeChangingWaterLevel", + "13002634": "bhvTweesterSandParticle", + "13002650": "bhvTweester", + "13002684": "bhvMerryGoRoundBooManager", + "1300269c": "bhvAnimatedTexture", + "130026d4": "bhvBooInCastle", + "13002710": "bhvBooWithCage", + "13002768": "bhvBalconyBigBoo", + "1300277c": "bhvMerryGoRoundBigBoo", + "13002790": "bhvGhostHuntBigBoo", + "130027d0": "bhvCourtyardBooTriplet", + "130027e4": "bhvBoo", + "130027f4": "bhvMerryGoRoundBoo", + "13002804": "bhvGhostHuntBoo", + "1300286c": "bhvHiddenStaircaseStep", + "13002898": "bhvBooBossSpawnedBridge", + "130028cc": "bhvBbhTiltingTrapPlatform", + "130028fc": "bhvHauntedBookshelf", + "1300292c": "bhvMeshElevator", + "13002968": "bhvMerryGoRound", + "13002998": "bhvPlaysMusicTrackWhenTouched", + "130029b0": "bhvInsideCannon", + "130029b4": "bhvBetaBowserAnchor", + "130029e4": "bhvStaticCheckeredPlatform", + "13002a10": "bhvUnused2A10", + "13002a20": "bhvUnusedFakeStar", + "13002a48": "bhvStaticObject", + "13002a54": "bhvUnused2A54", + "13002a5c": "bhvCastleFloorTrap", + "13002a7c": "bhvFloorTrapInCastle", + "13002aa4": "bhvTree", + "13002ad0": "bhvSparkle", + "13002af0": "bhvSparkleSpawn", + "13002b08": "bhvSparkleParticleSpawner", + "13002b5c": "bhvScuttlebug", + "13002ba0": "bhvScuttlebugSpawn", + "13002bb8": "bhvWhompKingBoss", + "13002bcc": "bhvSmallWhomp", + "13002c14": "bhvWaterSplash", + "13002c60": "bhvWaterDroplet", + "13002c7c": "bhvWaterDropletSplash", + "13002cb0": "bhvBubbleSplash", + "13002ce0": "bhvIdleWaterWave", + "13002d28": "bhvObjectWaterSplash", + "13002d50": "bhvShallowWaterWave", + "13002d7c": "bhvShallowWaterSplash", + "13002db0": "bhvObjectWaveTrail", + "13002dc0": "bhvWaveTrail", + "13002e04": "bhvTinyStrongWindParticle", + "13002e20": "bhvStrongWindParticle", + "13002e3c": "bhvSLSnowmanWind", + "13002e58": "bhvSLWalkingPenguin", + "13002ea8": "bhvYellowBall", + "13002ec0": "bhvMario", + "13002ef8": "bhvToadMessage", + "13002f40": "bhvUnlockDoorStar", + "13002f60": "bhvInstantActiveWarp", + "13002f64": "bhvAirborneWarp", + "13002f68": "bhvHardAirKnockBackWarp", + "13002f6c": "bhvSpinAirborneCircleWarp", + "13002f70": "bhvDeathWarp", + "13002f74": "bhvSpinAirborneWarp", + "13002f78": "bhvFlyingWarp", + "13002f7c": "bhvPaintingStarCollectWarp", + "13002f80": "bhvPaintingDeathWarp", + "13002f84": "bhvAirborneDeathWarp", + "13002f88": "bhvAirborneStarCollectWarp", + "13002f8c": "bhvLaunchStarCollectWarp", + "13002f90": "bhvLaunchDeathWarp", + "13002f94": "bhvSwimmingWarp", + "13002fa0": "bhvRandomAnimatedTexture", + "13002fc0": "bhvYellowBackgroundInMenu", + "13002fe4": "bhvMenuButton", + "13003008": "bhvMenuButtonManager", + "1300302c": "bhvActSelectorStarType", + "13003048": "bhvActSelector", + "13003068": "bhvMovingYellowCoin", + "130030a4": "bhvMovingBlueCoin", + "130030d4": "bhvBlueCoinSliding", + "13003104": "bhvBlueCoinJumping", + "13003134": "bhvSeaweed", + "13003158": "bhvSeaweedBundle", + "13003174": "bhvBobomb", + "130031ac": "bhvBobombFuseSmoke", + "130031dc": "bhvBobombBuddy", + "13003228": "bhvBobombBuddyOpensCannon", + "13003274": "bhvCannonClosed", + "130032a8": "bhvWhirlpool", + "130032c8": "bhvJetStream", + "130032e0": "bhvMessagePanel", + "13003324": "bhvSignOnWall", + "13003354": "bhvHomingAmp", + "13003388": "bhvCirclingAmp", + "130033bc": "bhvButterfly", + "130033ec": "bhvHoot", + "13003420": "bhvBetaHoldableObject", + "13003454": "bhvCarrySomething1", + "1300345c": "bhvCarrySomething2", + "13003464": "bhvCarrySomething3", + "1300346c": "bhvCarrySomething4", + "13003474": "bhvCarrySomething5", + "1300347c": "bhvCarrySomething6", + "13003484": "bhvObjectBubble", + "130034c4": "bhvObjectWaterWave", + "13003510": "bhvExplosion", + "13003558": "bhvBobombBullyDeathSmoke", + "13003588": "bhvSmoke", + "130035b0": "bhvBobombExplosionBubble", + "13003600": "bhvBobombExplosionBubble3600", + "13003614": "bhvRespawner", + "1300362c": "bhvSmallBully", + "13003660": "bhvBigBully", + "13003694": "bhvBigBullyWithMinions", + "130036c8": "bhvSmallChillBully", + "13003700": "bhvBigChillBully", + "13003738": "bhvJetStreamRingSpawner", + "13003750": "bhvJetStreamWaterRing", + "13003798": "bhvMantaRayWaterRing", + "130037e0": "bhvMantaRayRingManager", + "130037ec": "bhvBowserBomb", + "1300381c": "bhvBowserBombExplosion", + "13003840": "bhvBowserBombSmoke", + "13003868": "bhvCelebrationStar", + "13003888": "bhvCelebrationStarSparkle", + "130038b0": "bhvStarKeyCollectionPuffSpawner", + "130038d0": "bhvLllDrawbridgeSpawner", + "130038e8": "bhvLllDrawbridge", + "13003910": "bhvSmallBomp", + "13003940": "bhvLargeBomp", + "13003970": "bhvWfSlidingPlatform", + "130039a0": "bhvMoneybag", + "130039d4": "bhvMoneybagHidden", + "13003a08": "bhvPitBowlingBall", + "13003a30": "bhvFreeBowlingBall", + "13003a58": "bhvBowlingBall", + "13003a80": "bhvTtmBowlingBallSpawner", + "13003aa4": "bhvBobBowlingBallSpawner", + "13003ac8": "bhvThiBowlingBallSpawner", + "13003ae0": "bhvRrCruiserWing", + "13003b00": "bhvSpindel", + "13003b30": "bhvSslMovingPyramidWall", + "13003b60": "bhvPyramidElevator", + "13003b98": "bhvPyramidElevatorTrajectoryMarkerBall", + "13003bb4": "bhvPyramidTop", + "13003bec": "bhvPyramidTopFragment", + "13003c0c": "bhvPyramidPillarTouchDetector", + "13003c30": "bhvWaterfallSoundLoop", + "13003c44": "bhvVolcanoSoundLoop", + "13003c58": "bhvCastleFlagWaving", + "13003c7c": "bhvBirdsSoundLoop", + "13003c90": "bhvAmbientSounds", + "13003ca4": "bhvSandSoundLoop", + "13003cb8": "bhvHiddenAt120Stars", + "13003ce4": "bhvSnowmansBottom", + "13003d0c": "bhvSnowmansHead", + "13003d34": "bhvSnowmansBodyCheckpoint", + "13003d4c": "bhvBigSnowmanWhole", + "13003d74": "bhvBigBoulder", + "13003da0": "bhvBigBoulderGenerator", + "13003db8": "bhvWingCap", + "13003dd8": "bhvMetalCap", + "13003df8": "bhvNormalCap", + "13003e1c": "bhvVanishCap", + "13003e3c": "bhvStar", + "13003e64": "bhvStarSpawnCoordinates", + "13003e8c": "bhvHiddenRedCoinStar", + "13003eac": "bhvRedCoin", + "13003ee4": "bhvBowserCourseRedCoinStar", + "13003efc": "bhvHiddenStar", + "13003f1c": "bhvHiddenStarTrigger", + "13003f40": "bhvTtmRollingLog", + "13003f78": "bhvLllVolcanoFallingTrap", + "13003fa4": "bhvLllRollingLog", + "13003fdc": "bhv1upWalking", + "13004010": "bhv1upRunningAway", + "13004044": "bhv1upSliding", + "1300407c": "bhv1Up", + "130040b4": "bhv1upJumpOnApproach", + "130040ec": "bhvHidden1up", + "13004124": "bhvHidden1upTrigger", + "13004148": "bhvHidden1upInPole", + "13004180": "bhvHidden1upInPoleTrigger", + "130041a4": "bhvHidden1upInPoleSpawner", + "130041bc": "bhvControllablePlatform", + "130041f0": "bhvControllablePlatformSub", + "13004218": "bhvBreakableBoxSmall", + "13004244": "bhvSlidingSnowMound", + "13004270": "bhvSnowMoundSpawn", + "13004284": "bhvWdwSquareFloatingPlatform", + "130042b4": "bhvWdwRectangularFloatingPlatform", + "130042e4": "bhvJrbFloatingPlatform", + "13004314": "bhvArrowLift", + "13004348": "bhvOrangeNumber", + "13004370": "bhvMantaRay", + "130043a0": "bhvFallingPillar", + "130043c4": "bhvFallingPillarHitbox", + "130043e0": "bhvPillarBase", + "13004400": "bhvJrbFloatingBox", + "1300442c": "bhvDecorativePendulum", + "1300444c": "bhvTreasureChestsShip", + "13004470": "bhvTreasureChestsJrb", + "13004494": "bhvTreasureChests", + "130044b8": "bhvTreasureChestBottom", + "130044e0": "bhvTreasureChestTop", + "130044fc": "bhvMips", + "13004538": "bhvYoshi", + "13004580": "bhvKoopa", + "130045d0": "bhvKoopaRaceEndpoint", + "130045f8": "bhvKoopaFlag", + "13004634": "bhvPokey", + "13004668": "bhvPokeyBodyPart", + "13004698": "bhvSwoop", + "130046dc": "bhvFlyGuy", + "1300472c": "bhvGoomba", + "13004770": "bhvGoombaTripletSpawner", + "1300478c": "bhvChainChomp", + "130047e4": "bhvChainChompChainPart", + "1300481c": "bhvWoodenPost", + "13004868": "bhvChainChompGate", + "13004898": "bhvWigglerHead", + "130048e0": "bhvWigglerBody", + "13004918": "bhvEnemyLakitu", + "13004954": "bhvCameraLakitu", + "13004988": "bhvCloud", + "130049ac": "bhvCloudPart", + "130049c8": "bhvSpiny", + "13004a00": "bhvMontyMole", + "13004a58": "bhvMontyMoleHole", + "13004a78": "bhvMontyMoleRock", + "13004ab0": "bhvPlatformOnTrack", + "13004af4": "bhvTrackBall", + "13004b1c": "bhvSeesawPlatform", + "13004b44": "bhvFerrisWheelAxle", + "13004b6c": "bhvFerrisWheelPlatform", + "13004b8c": "bhvWaterBombSpawner", + "13004ba8": "bhvWaterBomb", + "13004bd4": "bhvWaterBombShadow", + "13004bf0": "bhvTTCRotatingSolid", + "13004c24": "bhvTTCPendulum", + "13004c5c": "bhvTTCTreadmill", + "13004c94": "bhvTTCMovingBar", + "13004ccc": "bhvTTCCog", + "13004cf8": "bhvTTCPitBlock", + "13004d28": "bhvTTCElevator", + "13004d64": "bhvTTC2DRotator", + "13004d90": "bhvTTCSpinner", + "13004dbc": "bhvMrBlizzard", + "13004e08": "bhvMrBlizzardSnowball", + "13004e4c": "bhvSlidingPlatform2", + "13004e78": "bhvOctagonalPlatformRotating", + "13004ea0": "bhvAnimatesOnFloorSwitchPress", + "13004ecc": "bhvActivatedBackAndForthPlatform", + "13004ef8": "bhvRecoveryHeart", + "13004f10": "bhvWaterBombCannon", + "13004f28": "bhvCannonBarrelBubbles", + "13004f40": "bhvUnagi", + "13004f78": "bhvUnagiSubobject", + "13004f90": "bhvDorrie", + "13004fd4": "bhvHauntedChair", + "13005024": "bhvMadPiano", + "1300506c": "bhvFlyingBookend", + "130050b4": "bhvBookendSpawn", + "130050d4": "bhvHauntedBookshelfManager", + "130050f4": "bhvBookSwitch", + "13005120": "bhvFirePiranhaPlant", + "13005158": "bhvSmallPiranhaFlame", + "1300518c": "bhvFireSpitter", + "130051ac": "bhvFlyguyFlame", + "130051e0": "bhvSnufit", + "1300521c": "bhvSnufitBalls", + "1300525c": "bhvHorizontalGrindel", + "130052b4": "bhvEyerokBoss", + "130052d0": "bhvEyerokHand", + "13005310": "bhvKlepto", + "13005354": "bhvBird", + "13005380": "bhvRacingPenguin", + "130053c4": "bhvPenguinRaceFinishLine", + "130053dc": "bhvPenguinRaceShortcutCheck", + "130053f4": "bhvCoffinSpawner", + "13005414": "bhvCoffin", + "13005440": "bhvClamShell", + "13005468": "bhvSkeeter", + "130054a0": "bhvSkeeterWave", + "130054b8": "bhvSwingPlatform", + "130054ec": "bhvDonutPlatformSpawner", + "13005504": "bhvDonutPlatform", + "13005528": "bhvDDDPole", + "1300556c": "bhvRedCoinStarMarker", + "13005598": "bhvTripletButterfly", + "130055dc": "bhvBubba", + "13005610": "bhvBeginningLakitu", + "13005638": "bhvBeginningPeach", + "1300565c": "bhvEndBirds1", + "13005680": "bhvEndBirds2", + "130056a4": "bhvIntroScene", + "130056c0": "_behaviorSegmentEnd", + "007d1d80": "_behaviorSegmentRomEnd", + "8016f000": "_goddardSegmentStart", + "007cc6c0": "_goddardSegmentRomStart", + }, } diff --git a/fast64_internal/sm64/sm64_geolayout_bone.py b/fast64_internal/sm64/sm64_geolayout_bone.py index d79708988..c57a2190e 100644 --- a/fast64_internal/sm64/sm64_geolayout_bone.py +++ b/fast64_internal/sm64/sm64_geolayout_bone.py @@ -5,372 +5,455 @@ from ..f3d.f3d_material import * enumBoneType = [ - ("Switch", "Switch (0x0E)", "Switch"), - ("Start", "Start (0x0B)", "Start"), - ("TranslateRotate", "Translate Rotate (0x10)", "Translate Rotate"), - ("Translate", "Translate (0x11)", "Translate"), - ("Rotate", "Rotate (0x12)", "Rotate"), - ("Billboard", "Billboard (0x14)", "Billboard"), - ("DisplayList", "Display List (0x15)", "Display List"), - ("Shadow", "Shadow (0x16)", "Shadow"), - ("Function", "Function (0x18)", "Function"), - ("HeldObject", "Held Object (0x1C)", "Held Object"), - ("Scale", "Scale (0x1D)", "Scale"), - ("StartRenderArea", "Start Render Area (0x20)", "Start Render Area"), - ("Ignore", "Ignore", "Ignore bones when exporting."), - ("SwitchOption", "Switch Option", "Switch Option"), - ("DisplayListWithOffset", "Animated Part (0x13)", "Animated Part (Animatable Bone)"), - ("CustomAnimated", "Custom Animated", "Custom Bone used for animation"), - ("CustomNonAnimated", "Custom (Non-animated)", "Custom geolayout bone, non animated"), + ("Switch", "Switch (0x0E)", "Switch"), + ("Start", "Start (0x0B)", "Start"), + ("TranslateRotate", "Translate Rotate (0x10)", "Translate Rotate"), + ("Translate", "Translate (0x11)", "Translate"), + ("Rotate", "Rotate (0x12)", "Rotate"), + ("Billboard", "Billboard (0x14)", "Billboard"), + ("DisplayList", "Display List (0x15)", "Display List"), + ("Shadow", "Shadow (0x16)", "Shadow"), + ("Function", "Function (0x18)", "Function"), + ("HeldObject", "Held Object (0x1C)", "Held Object"), + ("Scale", "Scale (0x1D)", "Scale"), + ("StartRenderArea", "Start Render Area (0x20)", "Start Render Area"), + ("Ignore", "Ignore", "Ignore bones when exporting."), + ("SwitchOption", "Switch Option", "Switch Option"), + ( + "DisplayListWithOffset", + "Animated Part (0x13)", + "Animated Part (Animatable Bone)", + ), + ("CustomAnimated", "Custom Animated", "Custom Bone used for animation"), + ( + "CustomNonAnimated", + "Custom (Non-animated)", + "Custom geolayout bone, non animated", + ), ] animatableBoneTypes = {"DisplayListWithOffset", "CustomAnimated"} enumGeoStaticType = [ - ("Billboard", "Billboard (0x14)", "Billboard"), - ("DisplayListWithOffset", "Animated Part (0x13)", "Animated Part (Animatable Bone)"), - ("Optimal", "Optimal", "Optimal"), + ("Billboard", "Billboard (0x14)", "Billboard"), + ( + "DisplayListWithOffset", + "Animated Part (0x13)", + "Animated Part (Animatable Bone)", + ), + ("Optimal", "Optimal", "Optimal"), ] enumFieldLayout = [ - ('0', 'Translate And Rotate', 'Translate And Rotate'), - ('1', 'Translate', 'Translate'), - ('2', 'Rotate', 'Rotate'), - #('3', 'Rotate Y', 'Rotate Y'), - # Rotate Y complicates exporting code, so we treat it as Rotate. + ("0", "Translate And Rotate", "Translate And Rotate"), + ("1", "Translate", "Translate"), + ("2", "Rotate", "Rotate"), + # ('3', 'Rotate Y', 'Rotate Y'), + # Rotate Y complicates exporting code, so we treat it as Rotate. ] enumShadowType = [ - ('0', 'Circle Scalable (9 verts)', 'Circle Scalable (9 verts)'), - ('1', 'Circle Scalable (4 verts)', 'Circle Scalable (4 verts)'), - ('2', 'Circle Permanent (4 verts)', 'Circle Permanent (4 verts)'), - ('10', 'Square Permanent', 'Square Permanent'), - ('11', 'Square Scalable', 'Square Scalable'), - ('12', 'Square Togglable', 'Square Togglable'), - ('50', 'Rectangle', 'Rectangle'), - ('99', 'Circle Player', 'Circle Player'), + ("0", "Circle Scalable (9 verts)", "Circle Scalable (9 verts)"), + ("1", "Circle Scalable (4 verts)", "Circle Scalable (4 verts)"), + ("2", "Circle Permanent (4 verts)", "Circle Permanent (4 verts)"), + ("10", "Square Permanent", "Square Permanent"), + ("11", "Square Scalable", "Square Scalable"), + ("12", "Square Togglable", "Square Togglable"), + ("50", "Rectangle", "Rectangle"), + ("99", "Circle Player", "Circle Player"), ] enumSwitchOptions = [ - ('Mesh', 'Mesh Override', 'Switch to a different mesh hierarchy.'), - ('Material', 'Material Override', 'Use the same mesh hierarchy, but override material on ALL meshes. Optionally override draw layer.'), - ('Draw Layer', 'Draw Layer Override', 'Override draw layer only.'), + ("Mesh", "Mesh Override", "Switch to a different mesh hierarchy."), + ( + "Material", + "Material Override", + "Use the same mesh hierarchy, but override material on ALL meshes. Optionally override draw layer.", + ), + ("Draw Layer", "Draw Layer Override", "Override draw layer only."), ] enumMatOverrideOptions = [ - ("All", 'All', 'Override every material with this one.'), - ("Specific", 'Specific', 'Only override instances of give material.'), + ("All", "All", "Override every material with this one."), + ("Specific", "Specific", "Only override instances of give material."), ] + def drawGeoInfo(panel: bpy.types.Panel, bone: bpy.types.Bone): - - panel.layout.box().label(text = 'Geolayout Inspector') - if bone is None: - panel.layout.label(text = 'Edit geolayout properties in Pose mode.') - return - - col = panel.layout.column() - - prop_split(col, bone, 'geo_cmd', 'Geolayout Command') - - if bone.geo_cmd in ['TranslateRotate', 'Translate', 'Rotate', - 'Billboard', 'DisplayList', 'Scale', 'DisplayListWithOffset', 'CustomAnimated']: - drawLayerWarningBox(col, bone, "draw_layer") - - if bone.geo_cmd == 'Scale': - prop_split(col, bone, 'geo_scale', 'Scale') - - elif bone.geo_cmd == 'HeldObject': - prop_split(col, bone, 'geo_func', 'Function') - - elif bone.geo_cmd == 'Switch': - prop_split(col, bone, 'geo_func', 'Function') - prop_split(col, bone, 'func_param', 'Parameter') - col.label(text = 'Switch Option 0 is always this bone\'s children.') - col.operator(AddSwitchOption.bl_idname).option = len(bone.switch_options) - for i in range(len(bone.switch_options)): - drawSwitchOptionProperty(col, bone.switch_options[i], i) - - elif bone.geo_cmd == 'Function': - prop_split(col, bone, 'geo_func', 'Function') - prop_split(col, bone, 'func_param', 'Parameter') - infoBox2 = col.box() - infoBox2.label(text = 'This affects the next sibling bone in ' +\ - 'alphabetical order.') - - elif bone.geo_cmd == 'TranslateRotate': - prop_split(col, bone, 'field_layout', 'Field Layout') - - elif bone.geo_cmd == 'Shadow': - prop_split(col, bone, 'shadow_type', 'Type') - prop_split(col, bone, 'shadow_solidity', 'Alpha') - prop_split(col, bone, 'shadow_scale', 'Scale') - - elif bone.geo_cmd == 'StartRenderArea': - infoBoxRenderArea = col.box() - infoBoxRenderArea.label(text = "WARNING: This command is deprecated for bones.") - infoBoxRenderArea.label(text = 'See the object properties window for the armature instead.') - prop_split(col, bone, 'culling_radius', 'Culling Radius') - - elif bone.geo_cmd in {'CustomAnimated', 'CustomNonAnimated'}: - prop_split(col, bone.fast64.sm64, 'custom_geo_cmd_macro', 'Geo Command Macro') - if bone.geo_cmd == 'CustomNonAnimated': - prop_split(col, bone.fast64.sm64, 'custom_geo_cmd_args', 'Geo Command Args') - else: # It's animated - infobox = col.box() - infobox.label(text = "Command's args will be filled with layer, translate, and rotate", icon = "INFO") - infobox.label(text = "e.g. `GEO_CUSTOM(layer, tX, tY, tZ, rX, rY, rZ, displayList)`") - - #if bone.geo_cmd == 'SwitchOption': - # prop_split(col, bone, 'switch_bone', 'Switch Bone') - - layerInfoBox = panel.layout.box() - layerInfoBox.label(text = - 'Regular bones (0x13) are on armature layer 0.') - layerInfoBox.label(text = - 'Other bones are on armature layer 1.') - layerInfoBox.label(text = - "'Ignore' bones are on any layer.") -class GeolayoutBonePanel(bpy.types.Panel): - bl_label = "Geolayout Inspector" - bl_idname = "BONE_PT_SM64_Geolayout_Inspector" - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "bone" - bl_options = {'HIDE_HEADER'} + panel.layout.box().label(text="Geolayout Inspector") + if bone is None: + panel.layout.label(text="Edit geolayout properties in Pose mode.") + return + + col = panel.layout.column() + + prop_split(col, bone, "geo_cmd", "Geolayout Command") + + if bone.geo_cmd in [ + "TranslateRotate", + "Translate", + "Rotate", + "Billboard", + "DisplayList", + "Scale", + "DisplayListWithOffset", + "CustomAnimated", + ]: + drawLayerWarningBox(col, bone, "draw_layer") + + if bone.geo_cmd == "Scale": + prop_split(col, bone, "geo_scale", "Scale") + + elif bone.geo_cmd == "HeldObject": + prop_split(col, bone, "geo_func", "Function") + + elif bone.geo_cmd == "Switch": + prop_split(col, bone, "geo_func", "Function") + prop_split(col, bone, "func_param", "Parameter") + col.label(text="Switch Option 0 is always this bone's children.") + col.operator(AddSwitchOption.bl_idname).option = len(bone.switch_options) + for i in range(len(bone.switch_options)): + drawSwitchOptionProperty(col, bone.switch_options[i], i) + + elif bone.geo_cmd == "Function": + prop_split(col, bone, "geo_func", "Function") + prop_split(col, bone, "func_param", "Parameter") + infoBox2 = col.box() + infoBox2.label( + text="This affects the next sibling bone in " + "alphabetical order." + ) + + elif bone.geo_cmd == "TranslateRotate": + prop_split(col, bone, "field_layout", "Field Layout") + + elif bone.geo_cmd == "Shadow": + prop_split(col, bone, "shadow_type", "Type") + prop_split(col, bone, "shadow_solidity", "Alpha") + prop_split(col, bone, "shadow_scale", "Scale") + + elif bone.geo_cmd == "StartRenderArea": + infoBoxRenderArea = col.box() + infoBoxRenderArea.label(text="WARNING: This command is deprecated for bones.") + infoBoxRenderArea.label( + text="See the object properties window for the armature instead." + ) + prop_split(col, bone, "culling_radius", "Culling Radius") + + elif bone.geo_cmd in {"CustomAnimated", "CustomNonAnimated"}: + prop_split(col, bone.fast64.sm64, "custom_geo_cmd_macro", "Geo Command Macro") + if bone.geo_cmd == "CustomNonAnimated": + prop_split(col, bone.fast64.sm64, "custom_geo_cmd_args", "Geo Command Args") + else: # It's animated + infobox = col.box() + infobox.label( + text="Command's args will be filled with layer, translate, and rotate", + icon="INFO", + ) + infobox.label( + text="e.g. `GEO_CUSTOM(layer, tX, tY, tZ, rX, rY, rZ, displayList)`" + ) + + # if bone.geo_cmd == 'SwitchOption': + # prop_split(col, bone, 'switch_bone', 'Switch Bone') + + layerInfoBox = panel.layout.box() + layerInfoBox.label(text="Regular bones (0x13) are on armature layer 0.") + layerInfoBox.label(text="Other bones are on armature layer 1.") + layerInfoBox.label(text="'Ignore' bones are on any layer.") - @classmethod - def poll(cls, context): - return context.scene.gameEditorMode == "SM64" - def draw(self, context): - drawGeoInfo(self, context.bone) +class GeolayoutBonePanel(bpy.types.Panel): + bl_label = "Geolayout Inspector" + bl_idname = "BONE_PT_SM64_Geolayout_Inspector" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "bone" + bl_options = {"HIDE_HEADER"} -class GeolayoutArmaturePanel(bpy.types.Panel): - bl_label = "Geolayout Armature Inspector" - bl_idname = "OBJECT_PT_SM64_Armature_Geolayout_Inspector" - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "object" - bl_options = {'HIDE_HEADER'} + @classmethod + def poll(cls, context): + return context.scene.gameEditorMode == "SM64" - @classmethod - def poll(cls, context): - return context.scene.gameEditorMode == "SM64" and context.object is not None and \ - isinstance(context.object.data, bpy.types.Armature) + def draw(self, context): + drawGeoInfo(self, context.bone) - def draw(self, context): - obj = context.object - col = self.layout.column().box() - col.box().label(text = 'Armature Geolayout Inspector') - col.prop(obj, 'use_render_area') - if obj.use_render_area: - col.box().label(text = 'This is in blender units.') - prop_split(col, obj, 'culling_radius', 'Culling Radius') +class GeolayoutArmaturePanel(bpy.types.Panel): + bl_label = "Geolayout Armature Inspector" + bl_idname = "OBJECT_PT_SM64_Armature_Geolayout_Inspector" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "object" + bl_options = {"HIDE_HEADER"} + + @classmethod + def poll(cls, context): + return ( + context.scene.gameEditorMode == "SM64" + and context.object is not None + and isinstance(context.object.data, bpy.types.Armature) + ) + + def draw(self, context): + obj = context.object + col = self.layout.column().box() + col.box().label(text="Armature Geolayout Inspector") + + col.prop(obj, "use_render_area") + if obj.use_render_area: + col.box().label(text="This is in blender units.") + prop_split(col, obj, "culling_radius", "Culling Radius") + def drawLayerWarningBox(layout, prop, data): - warningBox = layout.box().column() - prop_split(warningBox, prop, data, 'Draw Layer (v3)') - warningBox.label(text = "This applies to v3 materials and down only.", icon = 'LOOP_FORWARDS') - warningBox.label(text = "This is moved to material settings in v4+.") + warningBox = layout.box().column() + prop_split(warningBox, prop, data, "Draw Layer (v3)") + warningBox.label( + text="This applies to v3 materials and down only.", icon="LOOP_FORWARDS" + ) + warningBox.label(text="This is moved to material settings in v4+.") -class GeolayoutObjectPanel(bpy.types.Panel): - bl_label = "Object Geolayout Inspector" - bl_idname = "OBJECT_PT_SM64_Object_Geolayout_Inspector" - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "object" - bl_options = {'HIDE_HEADER'} - @classmethod - def poll(cls, context): - return context.scene.gameEditorMode == "SM64" and context.object is not None and \ - isinstance(context.object.data, bpy.types.Mesh) +class GeolayoutObjectPanel(bpy.types.Panel): + bl_label = "Object Geolayout Inspector" + bl_idname = "OBJECT_PT_SM64_Object_Geolayout_Inspector" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "object" + bl_options = {"HIDE_HEADER"} + + @classmethod + def poll(cls, context): + return ( + context.scene.gameEditorMode == "SM64" + and context.object is not None + and isinstance(context.object.data, bpy.types.Mesh) + ) + + def draw(self, context): + obj = context.object + col = self.layout.column().box() + col.box().label(text="Object Geolayout Inspector") + + prop_split(col, obj, "geo_cmd_static", "Geolayout Command") + drawLayerWarningBox(col, obj, "draw_layer_static") + col.prop(obj, "use_render_area") + if obj.use_render_area: + renderAreaBox = col.box() + renderAreaBox.label(text="This is in blender units.") + renderAreaBox.label( + text="This only applies if this is the root object of an object geolayout." + ) + renderAreaBox.label( + text="For armature geolayouts, see the armature's object properties instead." + ) + prop_split(col, obj, "culling_radius", "Culling Radius") + col.prop(obj, "use_render_range") + if obj.use_render_range: + col.box().label(text="This is in blender units.") + prop_split(col, obj, "render_range", "Render Range") + col.prop(obj, "add_shadow") + if obj.add_shadow: + prop_split(col, obj, "shadow_type", "Type") + prop_split(col, obj, "shadow_solidity", "Alpha") + prop_split(col, obj, "shadow_scale", "Scale") + col.prop(obj, "add_func") + if obj.add_func: + geo_asm = obj.fast64.sm64.geo_asm + prop_split(col, geo_asm, "func", "Function") + prop_split(col, geo_asm, "param", "Parameter") + col.prop(obj, "ignore_render") + col.prop(obj, "ignore_collision") + col.prop(obj, "use_f3d_culling") + if obj_scale_is_unified(obj) and len(obj.modifiers) == 0: + col.prop(obj, "scaleFromGeolayout") + # prop_split(col, obj, 'room_num', 'Room') - def draw(self, context): - obj = context.object - col = self.layout.column().box() - col.box().label(text = 'Object Geolayout Inspector') - - prop_split(col, obj, 'geo_cmd_static', 'Geolayout Command') - drawLayerWarningBox(col, obj, "draw_layer_static") - col.prop(obj, 'use_render_area') - if obj.use_render_area: - renderAreaBox = col.box() - renderAreaBox.label(text = 'This is in blender units.') - renderAreaBox.label(text = 'This only applies if this is the root object of an object geolayout.') - renderAreaBox.label(text = 'For armature geolayouts, see the armature\'s object properties instead.') - prop_split(col, obj, 'culling_radius', 'Culling Radius') - col.prop(obj, 'use_render_range') - if obj.use_render_range: - col.box().label(text = 'This is in blender units.') - prop_split(col, obj, 'render_range', "Render Range") - col.prop(obj, 'add_shadow') - if obj.add_shadow: - prop_split(col, obj, 'shadow_type', 'Type') - prop_split(col, obj, 'shadow_solidity', 'Alpha') - prop_split(col, obj, 'shadow_scale', 'Scale') - col.prop(obj, 'add_func') - if obj.add_func: - geo_asm = obj.fast64.sm64.geo_asm - prop_split(col, geo_asm, 'func', 'Function') - prop_split(col, geo_asm, 'param', 'Parameter') - col.prop(obj, 'ignore_render') - col.prop(obj, 'ignore_collision') - col.prop(obj, 'use_f3d_culling') - if obj_scale_is_unified(obj) and len(obj.modifiers) == 0: - col.prop(obj, 'scaleFromGeolayout') - #prop_split(col, obj, 'room_num', 'Room') class MaterialPointerProperty(bpy.types.PropertyGroup): - material : bpy.props.PointerProperty(type = bpy.types.Material) + material: bpy.props.PointerProperty(type=bpy.types.Material) + class SwitchOptionProperty(bpy.types.PropertyGroup): - switchType : bpy.props.EnumProperty(name = 'Option Type', - items = enumSwitchOptions) - optionArmature : bpy.props.PointerProperty(name = 'Option Armature', - type = bpy.types.Object) - materialOverride : bpy.props.PointerProperty(type = bpy.types.Material, - name = 'Material Override') - materialOverrideType : bpy.props.EnumProperty(name = 'Material Override Type', - items = enumMatOverrideOptions) - specificOverrideArray : bpy.props.CollectionProperty(type = MaterialPointerProperty, - name = 'Specified Materials To Override') - specificIgnoreArray : bpy.props.CollectionProperty(type = MaterialPointerProperty, - name = 'Specified Materials To Ignore') - overrideDrawLayer : bpy.props.BoolProperty() - drawLayer : bpy.props.EnumProperty(items = sm64EnumDrawLayers, name = 'Draw Layer') - expand : bpy.props.BoolProperty() + switchType: bpy.props.EnumProperty(name="Option Type", items=enumSwitchOptions) + optionArmature: bpy.props.PointerProperty( + name="Option Armature", type=bpy.types.Object + ) + materialOverride: bpy.props.PointerProperty( + type=bpy.types.Material, name="Material Override" + ) + materialOverrideType: bpy.props.EnumProperty( + name="Material Override Type", items=enumMatOverrideOptions + ) + specificOverrideArray: bpy.props.CollectionProperty( + type=MaterialPointerProperty, name="Specified Materials To Override" + ) + specificIgnoreArray: bpy.props.CollectionProperty( + type=MaterialPointerProperty, name="Specified Materials To Ignore" + ) + overrideDrawLayer: bpy.props.BoolProperty() + drawLayer: bpy.props.EnumProperty(items=sm64EnumDrawLayers, name="Draw Layer") + expand: bpy.props.BoolProperty() + def drawSwitchOptionProperty(layout, switchOption, index): - box = layout.box() - #box.box().label(text = 'Switch Option ' + str(index + 1)) - box.prop(switchOption, 'expand', text = 'Switch Option ' + \ - str(index + 1), icon = 'TRIA_DOWN' if switchOption.expand else \ - 'TRIA_RIGHT') - if switchOption.expand: - prop_split(box, switchOption, 'switchType', 'Type') - if switchOption.switchType == 'Material': - prop_split(box, switchOption, 'materialOverride', 'Material') - prop_split(box, switchOption, 'materialOverrideType', - "Material Override Type") - if switchOption.materialOverrideType == 'Specific': - matArrayBox = box.box() - matArrayBox.label(text = "Specified Materials To Override") - drawMatArray(matArrayBox, index, switchOption, - switchOption.specificOverrideArray, True) - else: - matArrayBox = box.box() - matArrayBox.label(text = "Specified Materials To Ignore") - drawMatArray(matArrayBox, index, switchOption, - switchOption.specificIgnoreArray, False) - prop_split(box, switchOption, 'overrideDrawLayer', - "Override Draw Layer") - if switchOption.overrideDrawLayer: - prop_split(box, switchOption, 'drawLayer', 'Draw Layer') - elif switchOption.switchType == 'Draw Layer': - prop_split(box, switchOption, 'drawLayer', "Draw Layer") - else: - prop_split(box, switchOption, 'optionArmature', 'Option Armature') - buttons = box.row(align = True) - buttons.operator(RemoveSwitchOption.bl_idname, - text = 'Remove Option').option = index - buttons.operator(AddSwitchOption.bl_idname, - text = 'Add Option').option = index + 1 - - moveButtons = box.row(align = True) - moveUp = moveButtons.operator(MoveSwitchOption.bl_idname, - text = 'Move Up') - moveUp.option = index - moveUp.offset = -1 - moveDown = moveButtons.operator(MoveSwitchOption.bl_idname, - text = 'Move Down') - moveDown.option = index - moveDown.offset = 1 + box = layout.box() + # box.box().label(text = 'Switch Option ' + str(index + 1)) + box.prop( + switchOption, + "expand", + text="Switch Option " + str(index + 1), + icon="TRIA_DOWN" if switchOption.expand else "TRIA_RIGHT", + ) + if switchOption.expand: + prop_split(box, switchOption, "switchType", "Type") + if switchOption.switchType == "Material": + prop_split(box, switchOption, "materialOverride", "Material") + prop_split( + box, switchOption, "materialOverrideType", "Material Override Type" + ) + if switchOption.materialOverrideType == "Specific": + matArrayBox = box.box() + matArrayBox.label(text="Specified Materials To Override") + drawMatArray( + matArrayBox, + index, + switchOption, + switchOption.specificOverrideArray, + True, + ) + else: + matArrayBox = box.box() + matArrayBox.label(text="Specified Materials To Ignore") + drawMatArray( + matArrayBox, + index, + switchOption, + switchOption.specificIgnoreArray, + False, + ) + prop_split(box, switchOption, "overrideDrawLayer", "Override Draw Layer") + if switchOption.overrideDrawLayer: + prop_split(box, switchOption, "drawLayer", "Draw Layer") + elif switchOption.switchType == "Draw Layer": + prop_split(box, switchOption, "drawLayer", "Draw Layer") + else: + prop_split(box, switchOption, "optionArmature", "Option Armature") + buttons = box.row(align=True) + buttons.operator( + RemoveSwitchOption.bl_idname, text="Remove Option" + ).option = index + buttons.operator(AddSwitchOption.bl_idname, text="Add Option").option = ( + index + 1 + ) + + moveButtons = box.row(align=True) + moveUp = moveButtons.operator(MoveSwitchOption.bl_idname, text="Move Up") + moveUp.option = index + moveUp.offset = -1 + moveDown = moveButtons.operator(MoveSwitchOption.bl_idname, text="Move Down") + moveDown.option = index + moveDown.offset = 1 + def drawMatArray(layout, option, switchOption, matArray, isSpecific): - addOp = layout.operator(AddSwitchOptionMat.bl_idname, text = 'Add Material') - addOp.option = option - addOp.isSpecific = isSpecific + addOp = layout.operator(AddSwitchOptionMat.bl_idname, text="Add Material") + addOp.option = option + addOp.isSpecific = isSpecific + + for i in range(len(matArray)): + drawMatArrayProperty(layout, matArray[i], option, i, isSpecific) - for i in range(len(matArray)): - drawMatArrayProperty(layout, matArray[i], option, i, isSpecific) def drawMatArrayProperty(layout, materialPointer, option, index, isSpecific): - row = layout.box().row() - row.prop(materialPointer, 'material', text = '') - removeOp = row.operator(RemoveSwitchOptionMat.bl_idname, text = 'Remove Material') - removeOp.option = option - removeOp.index = index - removeOp.isSpecific = isSpecific + row = layout.box().row() + row.prop(materialPointer, "material", text="") + removeOp = row.operator(RemoveSwitchOptionMat.bl_idname, text="Remove Material") + removeOp.option = option + removeOp.index = index + removeOp.isSpecific = isSpecific + class AddSwitchOptionMat(bpy.types.Operator): - bl_idname = 'bone.add_switch_option_mat' - bl_label = 'Add Switch Option Material' - bl_options = {'REGISTER', 'UNDO'} - option : bpy.props.IntProperty() - isSpecific : bpy.props.BoolProperty() - def execute(self, context): - bone = context.bone - if self.isSpecific: - bone.switch_options[self.option].specificOverrideArray.add() - else: - bone.switch_options[self.option].specificIgnoreArray.add() - self.report({'INFO'}, 'Success!') - return {'FINISHED'} + bl_idname = "bone.add_switch_option_mat" + bl_label = "Add Switch Option Material" + bl_options = {"REGISTER", "UNDO"} + option: bpy.props.IntProperty() + isSpecific: bpy.props.BoolProperty() + + def execute(self, context): + bone = context.bone + if self.isSpecific: + bone.switch_options[self.option].specificOverrideArray.add() + else: + bone.switch_options[self.option].specificIgnoreArray.add() + self.report({"INFO"}, "Success!") + return {"FINISHED"} + class RemoveSwitchOptionMat(bpy.types.Operator): - bl_idname = 'bone.remove_switch_option_mat' - bl_label = 'Remove Switch Option Material' - bl_options = {'REGISTER', 'UNDO'} - option : bpy.props.IntProperty() - index : bpy.props.IntProperty() - isSpecific : bpy.props.BoolProperty() - def execute(self, context): - if self.isSpecific: - context.bone.switch_options[self.option].specificOverrideArray.remove(self.index) - else: - context.bone.switch_options[self.option].specificIgnoreArray.remove(self.index) - self.report({'INFO'}, 'Success!') - return {'FINISHED'} + bl_idname = "bone.remove_switch_option_mat" + bl_label = "Remove Switch Option Material" + bl_options = {"REGISTER", "UNDO"} + option: bpy.props.IntProperty() + index: bpy.props.IntProperty() + isSpecific: bpy.props.BoolProperty() + + def execute(self, context): + if self.isSpecific: + context.bone.switch_options[self.option].specificOverrideArray.remove( + self.index + ) + else: + context.bone.switch_options[self.option].specificIgnoreArray.remove( + self.index + ) + self.report({"INFO"}, "Success!") + return {"FINISHED"} + class AddSwitchOption(bpy.types.Operator): - bl_idname = 'bone.add_switch_option' - bl_label = 'Add Switch Option' - bl_options = {'REGISTER', 'UNDO'} - option : bpy.props.IntProperty() - def execute(self, context): - bone = context.bone - bone.switch_options.add() - bone.switch_options.move(len(bone.switch_options)-1, self.option) - self.report({'INFO'}, 'Success!') - return {'FINISHED'} + bl_idname = "bone.add_switch_option" + bl_label = "Add Switch Option" + bl_options = {"REGISTER", "UNDO"} + option: bpy.props.IntProperty() + + def execute(self, context): + bone = context.bone + bone.switch_options.add() + bone.switch_options.move(len(bone.switch_options) - 1, self.option) + self.report({"INFO"}, "Success!") + return {"FINISHED"} + class RemoveSwitchOption(bpy.types.Operator): - bl_idname = 'bone.remove_switch_option' - bl_label = 'Remove Switch Option' - bl_options = {'REGISTER', 'UNDO'} - option : bpy.props.IntProperty() - def execute(self, context): - context.bone.switch_options.remove(self.option) - self.report({'INFO'}, 'Success!') - return {'FINISHED'} + bl_idname = "bone.remove_switch_option" + bl_label = "Remove Switch Option" + bl_options = {"REGISTER", "UNDO"} + option: bpy.props.IntProperty() + + def execute(self, context): + context.bone.switch_options.remove(self.option) + self.report({"INFO"}, "Success!") + return {"FINISHED"} + class MoveSwitchOption(bpy.types.Operator): - bl_idname = 'bone.move_switch_option' - bl_label = 'Move Switch Option' - bl_options = {'REGISTER', 'UNDO'} - option : bpy.props.IntProperty() - offset : bpy.props.IntProperty() - def execute(self, context): - bone = context.bone - bone.switch_options.move(self.option, self.option + self.offset) - self.report({'INFO'}, 'Success!') - return {'FINISHED'} - -''' + bl_idname = "bone.move_switch_option" + bl_label = "Move Switch Option" + bl_options = {"REGISTER", "UNDO"} + option: bpy.props.IntProperty() + offset: bpy.props.IntProperty() + + def execute(self, context): + bone = context.bone + bone.switch_options.move(self.option, self.option + self.offset) + self.report({"INFO"}, "Success!") + return {"FINISHED"} + + +""" class GeolayoutBoneSidePanel(bpy.types.Panel): bl_idname = "SM64_Geolayout_Inspector_Side" bl_label = "SM64 Geolayout Inspector" @@ -385,184 +468,219 @@ def poll(cls, context): def draw(self, context): drawGeoInfo(self, context.selected_bones[0]) -''' +""" + def getSwitchOptionBone(switchArmature): - optionBones = [] - for poseBone in switchArmature.pose.bones: - if poseBone.bone_group is not None and \ - poseBone.bone_group.name == 'SwitchOption': - optionBones.append(poseBone.name) - if len(optionBones) > 1: - raise PluginError("There should only be one switch option bone in " +\ - switchArmature.name + '.') - elif len(optionBones) < 1: - raise PluginError("Could not find a switch option bone in " +\ - switchArmature.name + ', which should be the root bone in the hierarchy.') - return optionBones[0] + optionBones = [] + for poseBone in switchArmature.pose.bones: + if ( + poseBone.bone_group is not None + and poseBone.bone_group.name == "SwitchOption" + ): + optionBones.append(poseBone.name) + if len(optionBones) > 1: + raise PluginError( + "There should only be one switch option bone in " + + switchArmature.name + + "." + ) + elif len(optionBones) < 1: + raise PluginError( + "Could not find a switch option bone in " + + switchArmature.name + + ", which should be the root bone in the hierarchy." + ) + return optionBones[0] + def updateBone(self, context): - if not hasattr(context, 'bone'): - print("No bone in context.") - return - armatureObj = context.object - - createBoneGroups(armatureObj) - if context.bone.geo_cmd not in animatableBoneTypes: - addBoneToGroup(armatureObj, context.bone.name, context.bone.geo_cmd) - bpy.ops.object.mode_set(mode="POSE") - else: - addBoneToGroup(armatureObj, context.bone.name, None) - bpy.ops.object.mode_set(mode="POSE") + if not hasattr(context, "bone"): + print("No bone in context.") + return + armatureObj = context.object + + createBoneGroups(armatureObj) + if context.bone.geo_cmd not in animatableBoneTypes: + addBoneToGroup(armatureObj, context.bone.name, context.bone.geo_cmd) + bpy.ops.object.mode_set(mode="POSE") + else: + addBoneToGroup(armatureObj, context.bone.name, None) + bpy.ops.object.mode_set(mode="POSE") + class SM64_BoneProperties(bpy.types.PropertyGroup): - version: bpy.props.IntProperty(name="SM64_BoneProperties Version", default=0) + version: bpy.props.IntProperty(name="SM64_BoneProperties Version", default=0) - custom_geo_cmd_macro: bpy.props.StringProperty(name="Geo Command Macro", default="GEO_BONE") - custom_geo_cmd_args: bpy.props.StringProperty(name="Geo Command Args", default="") + custom_geo_cmd_macro: bpy.props.StringProperty( + name="Geo Command Macro", default="GEO_BONE" + ) + custom_geo_cmd_args: bpy.props.StringProperty(name="Geo Command Args", default="") sm64_bone_classes = ( - AddSwitchOption, - RemoveSwitchOption, - AddSwitchOptionMat, - RemoveSwitchOptionMat, - MoveSwitchOption, - MaterialPointerProperty, - SwitchOptionProperty, - SM64_BoneProperties, + AddSwitchOption, + RemoveSwitchOption, + AddSwitchOptionMat, + RemoveSwitchOptionMat, + MoveSwitchOption, + MaterialPointerProperty, + SwitchOptionProperty, + SM64_BoneProperties, ) sm64_bone_panel_classes = ( - GeolayoutBonePanel, - GeolayoutObjectPanel, - GeolayoutArmaturePanel, + GeolayoutBonePanel, + GeolayoutObjectPanel, + GeolayoutArmaturePanel, ) + def sm64_bone_panel_register(): - for cls in sm64_bone_panel_classes: - register_class(cls) + for cls in sm64_bone_panel_classes: + register_class(cls) + def sm64_bone_panel_unregister(): - for cls in sm64_bone_panel_classes: - unregister_class(cls) + for cls in sm64_bone_panel_classes: + unregister_class(cls) + def sm64_bone_register(): - for cls in sm64_bone_classes: - register_class(cls) - - bpy.types.Bone.geo_cmd = bpy.props.EnumProperty( - name = 'Geolayout Command', items = enumBoneType, - default = 'DisplayListWithOffset', update = updateBone) - - bpy.types.Bone.draw_layer = bpy.props.EnumProperty( - name = 'Draw Layer', items = sm64EnumDrawLayers, default = '1') - - # Scale - bpy.types.Bone.geo_scale = bpy.props.FloatProperty( - name = 'Scale', min = 2**(-16), max = 2**(16), default = 1) - - # Function, HeldObject, Switch - # 8027795C for HeldObject - bpy.types.Bone.geo_func = bpy.props.StringProperty( - name = 'Function', default = '', - description = 'Name of function for C, hex address for binary.') - - # Function - bpy.types.Bone.func_param = bpy.props.IntProperty( - name = 'Function Parameter', min = -2**(15), max = 2**(15) - 1, default = 0) - - # TranslateRotate - bpy.types.Bone.field_layout = bpy.props.EnumProperty( - name = 'Field Layout', items = enumFieldLayout, default = '0') - - # Shadow - bpy.types.Bone.shadow_type = bpy.props.EnumProperty( - name = 'Shadow Type', items = enumShadowType, default = '1') - - bpy.types.Bone.shadow_solidity = bpy.props.FloatProperty( - name = 'Shadow Alpha', min = 0, max = 1, default = 1) - - bpy.types.Bone.shadow_scale = bpy.props.IntProperty( - name = 'Shadow Scale', min = -2**(15), max = 2**(15) - 1, default = 100) - - #bpy.types.Bone.switch_bone = bpy.props.StringProperty( - # name = 'Switch Bone') - - # StartRenderArea - bpy.types.Bone.culling_radius = bpy.props.FloatProperty( - name = 'Culling Radius', default = 10) - - - bpy.types.Bone.switch_options = bpy.props.CollectionProperty( - type = SwitchOptionProperty) - - # Static Geolayout - bpy.types.Object.geo_cmd_static = bpy.props.EnumProperty( - name = 'Geolayout Command', - items = enumGeoStaticType, default = 'Optimal') - bpy.types.Object.draw_layer_static = bpy.props.EnumProperty( - name = 'Draw Layer', items = sm64EnumDrawLayers, default = '1') - bpy.types.Object.use_render_area = bpy.props.BoolProperty( - name = 'Use Render Area') - bpy.types.Object.culling_radius = bpy.props.FloatProperty( - name = 'Culling Radius', default = 10) - - bpy.types.Object.add_shadow = bpy.props.BoolProperty( - name = 'Add Shadow') - bpy.types.Object.shadow_type = bpy.props.EnumProperty( - name = 'Shadow Type', items = enumShadowType, default = '1') - - bpy.types.Object.shadow_solidity = bpy.props.FloatProperty( - name = 'Shadow Alpha', min = 0, max = 1, default = 1) - - bpy.types.Object.shadow_scale = bpy.props.IntProperty( - name = 'Shadow Scale', min = -2**(15), max = 2**(15) - 1, default = 100) - - bpy.types.Object.add_func = bpy.props.BoolProperty( - name = 'Add Function Node') - - bpy.types.Object.use_render_range = bpy.props.BoolProperty(name = 'Use Render Range (LOD)') - bpy.types.Object.render_range = bpy.props.FloatVectorProperty(name = 'Render Range', - size = 2, default = (0,100)) - - bpy.types.Object.scaleFromGeolayout = bpy.props.BoolProperty( - name = 'Scale from Geolayout', - description = 'If scale is all a single value (e.g. 2, 2, 2), do not apply scale when exporting, and instead use GeoLayout to scale. Can be used to enhance precision by setting scaling values to a value less than 1.', - default = False - ) - - # Used during object duplication on export - bpy.types.Object.original_name = bpy.props.StringProperty() + for cls in sm64_bone_classes: + register_class(cls) + + bpy.types.Bone.geo_cmd = bpy.props.EnumProperty( + name="Geolayout Command", + items=enumBoneType, + default="DisplayListWithOffset", + update=updateBone, + ) + + bpy.types.Bone.draw_layer = bpy.props.EnumProperty( + name="Draw Layer", items=sm64EnumDrawLayers, default="1" + ) + + # Scale + bpy.types.Bone.geo_scale = bpy.props.FloatProperty( + name="Scale", min=2 ** (-16), max=2 ** (16), default=1 + ) + + # Function, HeldObject, Switch + # 8027795C for HeldObject + bpy.types.Bone.geo_func = bpy.props.StringProperty( + name="Function", + default="", + description="Name of function for C, hex address for binary.", + ) + + # Function + bpy.types.Bone.func_param = bpy.props.IntProperty( + name="Function Parameter", min=-(2 ** (15)), max=2 ** (15) - 1, default=0 + ) + + # TranslateRotate + bpy.types.Bone.field_layout = bpy.props.EnumProperty( + name="Field Layout", items=enumFieldLayout, default="0" + ) + + # Shadow + bpy.types.Bone.shadow_type = bpy.props.EnumProperty( + name="Shadow Type", items=enumShadowType, default="1" + ) + + bpy.types.Bone.shadow_solidity = bpy.props.FloatProperty( + name="Shadow Alpha", min=0, max=1, default=1 + ) + + bpy.types.Bone.shadow_scale = bpy.props.IntProperty( + name="Shadow Scale", min=-(2 ** (15)), max=2 ** (15) - 1, default=100 + ) + + # bpy.types.Bone.switch_bone = bpy.props.StringProperty( + # name = 'Switch Bone') + + # StartRenderArea + bpy.types.Bone.culling_radius = bpy.props.FloatProperty( + name="Culling Radius", default=10 + ) + + bpy.types.Bone.switch_options = bpy.props.CollectionProperty( + type=SwitchOptionProperty + ) + + # Static Geolayout + bpy.types.Object.geo_cmd_static = bpy.props.EnumProperty( + name="Geolayout Command", items=enumGeoStaticType, default="Optimal" + ) + bpy.types.Object.draw_layer_static = bpy.props.EnumProperty( + name="Draw Layer", items=sm64EnumDrawLayers, default="1" + ) + bpy.types.Object.use_render_area = bpy.props.BoolProperty(name="Use Render Area") + bpy.types.Object.culling_radius = bpy.props.FloatProperty( + name="Culling Radius", default=10 + ) + + bpy.types.Object.add_shadow = bpy.props.BoolProperty(name="Add Shadow") + bpy.types.Object.shadow_type = bpy.props.EnumProperty( + name="Shadow Type", items=enumShadowType, default="1" + ) + + bpy.types.Object.shadow_solidity = bpy.props.FloatProperty( + name="Shadow Alpha", min=0, max=1, default=1 + ) + + bpy.types.Object.shadow_scale = bpy.props.IntProperty( + name="Shadow Scale", min=-(2 ** (15)), max=2 ** (15) - 1, default=100 + ) + + bpy.types.Object.add_func = bpy.props.BoolProperty(name="Add Function Node") + + bpy.types.Object.use_render_range = bpy.props.BoolProperty( + name="Use Render Range (LOD)" + ) + bpy.types.Object.render_range = bpy.props.FloatVectorProperty( + name="Render Range", size=2, default=(0, 100) + ) + + bpy.types.Object.scaleFromGeolayout = bpy.props.BoolProperty( + name="Scale from Geolayout", + description="If scale is all a single value (e.g. 2, 2, 2), do not apply scale when exporting, and instead use GeoLayout to scale. Can be used to enhance precision by setting scaling values to a value less than 1.", + default=False, + ) + + # Used during object duplication on export + bpy.types.Object.original_name = bpy.props.StringProperty() + def sm64_bone_unregister(): - for cls in reversed(sm64_bone_classes): - unregister_class(cls) - - del bpy.types.Bone.geo_cmd - del bpy.types.Bone.draw_layer - del bpy.types.Bone.geo_scale - del bpy.types.Bone.geo_func - del bpy.types.Bone.func_param - del bpy.types.Bone.field_layout - del bpy.types.Bone.shadow_type - del bpy.types.Bone.shadow_solidity - del bpy.types.Bone.shadow_scale - del bpy.types.Bone.culling_radius - del bpy.types.Bone.switch_options - - del bpy.types.Object.geo_cmd_static - del bpy.types.Object.draw_layer_static - del bpy.types.Object.use_render_area - del bpy.types.Object.culling_radius - - del bpy.types.Object.add_shadow - del bpy.types.Object.shadow_type - del bpy.types.Object.shadow_solidity - del bpy.types.Object.shadow_scale - del bpy.types.Object.add_func - - del bpy.types.Object.use_render_range - del bpy.types.Object.render_range - - del bpy.types.Object.scaleFromGeolayout + for cls in reversed(sm64_bone_classes): + unregister_class(cls) + + del bpy.types.Bone.geo_cmd + del bpy.types.Bone.draw_layer + del bpy.types.Bone.geo_scale + del bpy.types.Bone.geo_func + del bpy.types.Bone.func_param + del bpy.types.Bone.field_layout + del bpy.types.Bone.shadow_type + del bpy.types.Bone.shadow_solidity + del bpy.types.Bone.shadow_scale + del bpy.types.Bone.culling_radius + del bpy.types.Bone.switch_options + + del bpy.types.Object.geo_cmd_static + del bpy.types.Object.draw_layer_static + del bpy.types.Object.use_render_area + del bpy.types.Object.culling_radius + + del bpy.types.Object.add_shadow + del bpy.types.Object.shadow_type + del bpy.types.Object.shadow_solidity + del bpy.types.Object.shadow_scale + del bpy.types.Object.add_func + + del bpy.types.Object.use_render_range + del bpy.types.Object.render_range + + del bpy.types.Object.scaleFromGeolayout diff --git a/fast64_internal/sm64/sm64_geolayout_classes.py b/fast64_internal/sm64/sm64_geolayout_classes.py index 62574ad00..b04e892e6 100644 --- a/fast64_internal/sm64/sm64_geolayout_classes.py +++ b/fast64_internal/sm64/sm64_geolayout_classes.py @@ -6,1156 +6,1293 @@ import struct, copy drawLayerNames = { - 0 : 'LAYER_FORCE', - 1 : 'LAYER_OPAQUE', - 2 : 'LAYER_OPAQUE_DECAL', - 3 : 'LAYER_OPAQUE_INTER', - 4 : 'LAYER_ALPHA', - 5 : 'LAYER_TRANSPARENT', - 6 : 'LAYER_TRANSPARENT_DECAL', - 7 : 'LAYER_TRANSPARENT_INTER', + 0: "LAYER_FORCE", + 1: "LAYER_OPAQUE", + 2: "LAYER_OPAQUE_DECAL", + 3: "LAYER_OPAQUE_INTER", + 4: "LAYER_ALPHA", + 5: "LAYER_TRANSPARENT", + 6: "LAYER_TRANSPARENT_DECAL", + 7: "LAYER_TRANSPARENT_INTER", } + def getDrawLayerName(drawLayer): - layer = drawLayer - if drawLayer is not None: - try: - # Cast draw layer to int so it can be mapped to a name - layer = int(drawLayer) - except ValueError: - pass - if layer in drawLayerNames: - return drawLayerNames[layer] - else: - return str(drawLayer) + layer = drawLayer + if drawLayer is not None: + try: + # Cast draw layer to int so it can be mapped to a name + layer = int(drawLayer) + except ValueError: + pass + if layer in drawLayerNames: + return drawLayerNames[layer] + else: + return str(drawLayer) + def addFuncAddress(command, func): - try: - command.extend(bytes.fromhex(func)) - except ValueError: - raise PluginError("In geolayout node, could not convert function \"" + str(func) + '\" to hexadecimal.') + try: + command.extend(bytes.fromhex(func)) + except ValueError: + raise PluginError( + 'In geolayout node, could not convert function "' + + str(func) + + '" to hexadecimal.' + ) + class GeolayoutGraph: - def __init__(self, name): - self.startGeolayout = Geolayout(name, True) - # dict of Object : Geolayout - self.secondaryGeolayouts = {} - # dict of Geolayout : Geolayout List (which geolayouts are called) - self.geolayoutCalls = {} - self.sortedList = [] - self.sortedListGenerated = False - - def checkListSorted(self): - if not self.sortedListGenerated: - raise PluginError("Must generate sorted geolayout list first " +\ - 'before calling this function.') - - def get_ptr_addresses(self): - self.checkListSorted() - addresses = [] - for geolayout in self.sortedList: - addresses.extend(geolayout.get_ptr_addresses()) - return addresses - - def size(self): - self.checkListSorted() - size = 0 - for geolayout in self.sortedList: - size += geolayout.size() - - return size - - def addGeolayout(self, obj, name): - geolayout = Geolayout(name, False) - self.secondaryGeolayouts[obj] = geolayout - return geolayout - - def addJumpNode(self, parentNode, caller, callee, index = None): - if index is None: - parentNode.children.append(TransformNode(JumpNode( - True, callee))) - else: - parentNode.children.insert(index, TransformNode(JumpNode( - True, callee))) - self.addGeolayoutCall(caller, callee) - - def addGeolayoutCall(self, caller, callee): - if caller not in self.geolayoutCalls: - self.geolayoutCalls[caller] = [] - self.geolayoutCalls[caller].append(callee) - - def sortGeolayouts(self, geolayoutList, geolayout, callOrder): - if geolayout in self.geolayoutCalls: - for calledGeolayout in self.geolayoutCalls[geolayout]: - geoIndex = geolayoutList.index(geolayout) - if calledGeolayout in geolayoutList: - callIndex = geolayoutList.index(calledGeolayout) - if callIndex < geoIndex: - continue - else: - raise PluginError('Circular geolayout dependency.' +\ - str(callOrder)) - else: - geolayoutList.insert(geolayoutList.index(geolayout), - calledGeolayout) - callOrder = copy.copy(callOrder) - callOrder.append(calledGeolayout) - self.sortGeolayouts(geolayoutList, calledGeolayout, - callOrder) - return geolayoutList - - def generateSortedList(self): - self.sortedList = self.sortGeolayouts([self.startGeolayout], - self.startGeolayout, [self.startGeolayout]) - self.sortedListGenerated = True - - def set_addr(self, address): - self.checkListSorted() - for geolayout in self.sortedList: - geolayout.startAddress = address - address += geolayout.size() - print(geolayout.name + " - " + \ - str(geolayout.startAddress)) - return address - - def to_binary(self, segmentData): - self.checkListSorted() - data = bytearray(0) - for geolayout in self.sortedList: - data += geolayout.to_binary(segmentData) - return data - - def save_binary(self, romfile, segmentData): - for geolayout in self.sortedList: - geolayout.save_binary(romfile, segmentData) - - def to_c(self): - data = CData() - self.checkListSorted() - data.source = '#include "src/game/envfx_snow.h"\n\n' - for geolayout in self.sortedList: - data.append(geolayout.to_c()) - return data - - def toTextDump(self, segmentData): - self.checkListSorted() - data = '' - for geolayout in self.sortedList: - data += geolayout.toTextDump(segmentData) + '\n' - return data - - def convertToDynamic(self): - self.checkListSorted() - for geolayout in self.sortedList: - for node in geolayout.nodes: - node.convertToDynamic() - - def getDrawLayers(self): - drawLayers = self.startGeolayout.getDrawLayers() - for obj, geolayout in self.secondaryGeolayouts.items(): - drawLayers |= geolayout.getDrawLayers() - - return drawLayers + def __init__(self, name): + self.startGeolayout = Geolayout(name, True) + # dict of Object : Geolayout + self.secondaryGeolayouts = {} + # dict of Geolayout : Geolayout List (which geolayouts are called) + self.geolayoutCalls = {} + self.sortedList = [] + self.sortedListGenerated = False + + def checkListSorted(self): + if not self.sortedListGenerated: + raise PluginError( + "Must generate sorted geolayout list first " + + "before calling this function." + ) + + def get_ptr_addresses(self): + self.checkListSorted() + addresses = [] + for geolayout in self.sortedList: + addresses.extend(geolayout.get_ptr_addresses()) + return addresses + + def size(self): + self.checkListSorted() + size = 0 + for geolayout in self.sortedList: + size += geolayout.size() + + return size + + def addGeolayout(self, obj, name): + geolayout = Geolayout(name, False) + self.secondaryGeolayouts[obj] = geolayout + return geolayout + + def addJumpNode(self, parentNode, caller, callee, index=None): + if index is None: + parentNode.children.append(TransformNode(JumpNode(True, callee))) + else: + parentNode.children.insert(index, TransformNode(JumpNode(True, callee))) + self.addGeolayoutCall(caller, callee) + + def addGeolayoutCall(self, caller, callee): + if caller not in self.geolayoutCalls: + self.geolayoutCalls[caller] = [] + self.geolayoutCalls[caller].append(callee) + + def sortGeolayouts(self, geolayoutList, geolayout, callOrder): + if geolayout in self.geolayoutCalls: + for calledGeolayout in self.geolayoutCalls[geolayout]: + geoIndex = geolayoutList.index(geolayout) + if calledGeolayout in geolayoutList: + callIndex = geolayoutList.index(calledGeolayout) + if callIndex < geoIndex: + continue + else: + raise PluginError( + "Circular geolayout dependency." + str(callOrder) + ) + else: + geolayoutList.insert( + geolayoutList.index(geolayout), calledGeolayout + ) + callOrder = copy.copy(callOrder) + callOrder.append(calledGeolayout) + self.sortGeolayouts(geolayoutList, calledGeolayout, callOrder) + return geolayoutList + + def generateSortedList(self): + self.sortedList = self.sortGeolayouts( + [self.startGeolayout], self.startGeolayout, [self.startGeolayout] + ) + self.sortedListGenerated = True + + def set_addr(self, address): + self.checkListSorted() + for geolayout in self.sortedList: + geolayout.startAddress = address + address += geolayout.size() + print(geolayout.name + " - " + str(geolayout.startAddress)) + return address + + def to_binary(self, segmentData): + self.checkListSorted() + data = bytearray(0) + for geolayout in self.sortedList: + data += geolayout.to_binary(segmentData) + return data + + def save_binary(self, romfile, segmentData): + for geolayout in self.sortedList: + geolayout.save_binary(romfile, segmentData) + + def to_c(self): + data = CData() + self.checkListSorted() + data.source = '#include "src/game/envfx_snow.h"\n\n' + for geolayout in self.sortedList: + data.append(geolayout.to_c()) + return data + + def toTextDump(self, segmentData): + self.checkListSorted() + data = "" + for geolayout in self.sortedList: + data += geolayout.toTextDump(segmentData) + "\n" + return data + + def convertToDynamic(self): + self.checkListSorted() + for geolayout in self.sortedList: + for node in geolayout.nodes: + node.convertToDynamic() + + def getDrawLayers(self): + drawLayers = self.startGeolayout.getDrawLayers() + for obj, geolayout in self.secondaryGeolayouts.items(): + drawLayers |= geolayout.getDrawLayers() + + return drawLayers + class Geolayout: - def __init__(self, name, isStartGeo): - self.nodes = [] - self.name = toAlnum(name) - self.startAddress = 0 - self.isStartGeo = isStartGeo - - def size(self): - size = 4 # end command - for node in self.nodes: - size += node.size() - return size - - def get_ptr_addresses(self): - address = self.startAddress - addresses = [] - for node in self.nodes: - address, ptrs = node.get_ptr_addresses(address) - addresses.extend(ptrs) - return addresses - - def to_binary(self, segmentData): - endCmd = GEO_END if self.isStartGeo else GEO_RETURN - data = bytearray(0) - for node in self.nodes: - data += node.to_binary(segmentData) - data += bytearray([endCmd, 0x00, 0x00, 0x00]) - return data - - def save_binary(self, romfile, segmentData): - romfile.seek(self.startAddress) - romfile.write(self.to_binary(segmentData)) - - def to_c(self): - endCmd = 'GEO_END' if self.isStartGeo else 'GEO_RETURN' - data = CData() - data.header = 'extern const GeoLayout ' + self.name + '[];\n' - data.source = 'const GeoLayout ' + self.name + '[] = {\n' - for node in self.nodes: - data.source += node.to_c(1) - data.source += '\t' + endCmd + '(),\n' - data.source += '};\n' - return data - - def toTextDump(self, segmentData): - endCmd = '01' if self.isStartGeo else '03' - data = '' - for node in self.nodes: - data += node.toTextDump(0, segmentData) - data += endCmd + ' 00 00 00\n' - return data - - def getDrawLayers(self): - drawLayers = set() - for node in self.nodes: - drawLayers |= node.getDrawLayers() - return drawLayers + def __init__(self, name, isStartGeo): + self.nodes = [] + self.name = toAlnum(name) + self.startAddress = 0 + self.isStartGeo = isStartGeo + + def size(self): + size = 4 # end command + for node in self.nodes: + size += node.size() + return size + + def get_ptr_addresses(self): + address = self.startAddress + addresses = [] + for node in self.nodes: + address, ptrs = node.get_ptr_addresses(address) + addresses.extend(ptrs) + return addresses + + def to_binary(self, segmentData): + endCmd = GEO_END if self.isStartGeo else GEO_RETURN + data = bytearray(0) + for node in self.nodes: + data += node.to_binary(segmentData) + data += bytearray([endCmd, 0x00, 0x00, 0x00]) + return data + + def save_binary(self, romfile, segmentData): + romfile.seek(self.startAddress) + romfile.write(self.to_binary(segmentData)) + + def to_c(self): + endCmd = "GEO_END" if self.isStartGeo else "GEO_RETURN" + data = CData() + data.header = "extern const GeoLayout " + self.name + "[];\n" + data.source = "const GeoLayout " + self.name + "[] = {\n" + for node in self.nodes: + data.source += node.to_c(1) + data.source += "\t" + endCmd + "(),\n" + data.source += "};\n" + return data + + def toTextDump(self, segmentData): + endCmd = "01" if self.isStartGeo else "03" + data = "" + for node in self.nodes: + data += node.toTextDump(0, segmentData) + data += endCmd + " 00 00 00\n" + return data + + def getDrawLayers(self): + drawLayers = set() + for node in self.nodes: + drawLayers |= node.getDrawLayers() + return drawLayers + class BaseDisplayListNode: - '''Base displaylist node with common helper functions dealing with displaylists''' - dl_ext = 'WITH_DL' # add dl_ext to geo command if command has a displaylist - - def get_dl_address(self): - if self.hasDL and (self.dlRef or self.DLmicrocode is not None): - return self.dlRef or self.DLmicrocode.startAddress - return None - - def get_dl_name(self): - if self.hasDL and (self.dlRef or self.DLmicrocode is not None): - return self.dlRef or self.DLmicrocode.name - return 'NULL' - - def get_c_func_macro(self, base_cmd: str): - return f'{base_cmd}_{self.dl_ext}' if self.hasDL else base_cmd - - def c_func_macro(self, base_cmd: str, *args: str): - ''' - Supply base command and all arguments for command. - if self.hasDL: - this will add self.dl_ext to the command, and - adds the name of the displaylist to the end of the command - Example return: 'GEO_YOUR_COMMAND_WITH_DL(arg, arg2),' - ''' - all_args = list(args) - if self.hasDL: - all_args.append(self.get_dl_name()) - return f'{self.get_c_func_macro(base_cmd)}({", ".join(all_args)}),' + """Base displaylist node with common helper functions dealing with displaylists""" + + dl_ext = "WITH_DL" # add dl_ext to geo command if command has a displaylist + + def get_dl_address(self): + if self.hasDL and (self.dlRef or self.DLmicrocode is not None): + return self.dlRef or self.DLmicrocode.startAddress + return None + + def get_dl_name(self): + if self.hasDL and (self.dlRef or self.DLmicrocode is not None): + return self.dlRef or self.DLmicrocode.name + return "NULL" + + def get_c_func_macro(self, base_cmd: str): + return f"{base_cmd}_{self.dl_ext}" if self.hasDL else base_cmd + + def c_func_macro(self, base_cmd: str, *args: str): + """ + Supply base command and all arguments for command. + if self.hasDL: + this will add self.dl_ext to the command, and + adds the name of the displaylist to the end of the command + Example return: 'GEO_YOUR_COMMAND_WITH_DL(arg, arg2),' + """ + all_args = list(args) + if self.hasDL: + all_args.append(self.get_dl_name()) + return f'{self.get_c_func_macro(base_cmd)}({", ".join(all_args)}),' + class TransformNode: - def __init__(self, node): - self.node = node - self.children = [] - self.parent = None - self.skinned = False - self.skinnedWithoutDL = False - - def convertToDynamic(self): - if self.node.hasDL: - funcNode = FunctionNode(self.node.DLmicrocode.name, self.node.drawLayer) - - if isinstance(self.node, DisplayListNode): - self.node = funcNode - else: - self.node.hasDL = False - transformNode = TransformNode(funcNode) - self.children.insert(0, transformNode) - - for child in self.children: - child.convertToDynamic() - - def get_ptr_addresses(self, address): - addresses = [] - if self.node is not None: - if type(self.node) in DLNodes: - for offset in self.node.get_ptr_offsets(): - addresses.append(address + offset) - else: - addresses = [] - address += self.node.size() - if len(self.children) > 0: - address += 4 - for node in self.children: - address, ptrs = node.get_ptr_addresses(address) - addresses.extend(ptrs) - address += 4 - return address, addresses - - def size(self): - size = self.node.size() if self.node is not None else 0 - if len(self.children) > 0 and type(self.node) in nodeGroupClasses: - size += 8 # node open/close - for child in self.children: - size += child.size() - - return size - - # Function commands usually effect the following command, so it is similar - # to a parent child relationship. - def to_binary(self, segmentData): - if self.node is not None: - data = self.node.to_binary(segmentData) - else: - data = bytearray(0) - if len(self.children) > 0: - if type(self.node) is FunctionNode: - raise PluginError("An FunctionNode cannot have children.") - - if data[0] in nodeGroupCmds: - data.extend(bytearray([GEO_NODE_OPEN, 0x00, 0x00, 0x00])) - for child in self.children: - data.extend(child.to_binary(segmentData)) - if data[0] in nodeGroupCmds: - data.extend(bytearray([GEO_NODE_CLOSE, 0x00, 0x00, 0x00])) - elif type(self.node) is SwitchNode: - raise PluginError("A switch bone must have at least one child bone.") - return data - - def to_c(self, depth): - if self.node is not None: - nodeC = self.node.to_c() - if nodeC is not None: # Should only be the case for DisplayListNode with no DL - data = depth * '\t' + self.node.to_c() + '\n' - else: - data = '' - else: - data = '' - if len(self.children) > 0: - if type(self.node) in nodeGroupClasses: - data += depth * '\t' + 'GEO_OPEN_NODE(),\n' - for child in self.children: - data += child.to_c(depth + (1 if \ - type(self.node) in nodeGroupClasses else 0)) - if type(self.node) in nodeGroupClasses: - data += depth * '\t' + 'GEO_CLOSE_NODE(),\n' - elif type(self.node) is SwitchNode: - raise PluginError("A switch bone must have at least one child bone.") - return data - - def toTextDump(self, nodeLevel, segmentData): - data = '' - if self.node is not None: - command = self.node.to_binary(segmentData) - else: - command = bytearray(0) - - data += '\t' * nodeLevel - for byteVal in command: - data += (format(byteVal, '02X') + ' ') - data += '\n' - - if len(self.children) > 0: - if len(command) == 0 or command[0] in nodeGroupCmds: - data += '\t' * nodeLevel + '04 00 00 00\n' - for child in self.children: - data += child.toTextDump(nodeLevel + 1, segmentData) - if len(command) == 0 or command[0] in nodeGroupCmds: - data += '\t' * nodeLevel + '05 00 00 00\n' - elif type(self.node) is SwitchNode: - raise PluginError("A switch bone must have at least one child bone.") - return data - - def getDrawLayers(self): - if self.node is not None and self.node.hasDL: - drawLayers = set([self.node.drawLayer]) - else: - drawLayers = set() - for child in self.children: - if hasattr(child, 'getDrawLayers'): # not every child will have draw layers (e.g. GEO_ASM) - drawLayers |= child.getDrawLayers() - return drawLayers + def __init__(self, node): + self.node = node + self.children = [] + self.parent = None + self.skinned = False + self.skinnedWithoutDL = False + + def convertToDynamic(self): + if self.node.hasDL: + funcNode = FunctionNode(self.node.DLmicrocode.name, self.node.drawLayer) + + if isinstance(self.node, DisplayListNode): + self.node = funcNode + else: + self.node.hasDL = False + transformNode = TransformNode(funcNode) + self.children.insert(0, transformNode) + + for child in self.children: + child.convertToDynamic() + + def get_ptr_addresses(self, address): + addresses = [] + if self.node is not None: + if type(self.node) in DLNodes: + for offset in self.node.get_ptr_offsets(): + addresses.append(address + offset) + else: + addresses = [] + address += self.node.size() + if len(self.children) > 0: + address += 4 + for node in self.children: + address, ptrs = node.get_ptr_addresses(address) + addresses.extend(ptrs) + address += 4 + return address, addresses + + def size(self): + size = self.node.size() if self.node is not None else 0 + if len(self.children) > 0 and type(self.node) in nodeGroupClasses: + size += 8 # node open/close + for child in self.children: + size += child.size() + + return size + + # Function commands usually effect the following command, so it is similar + # to a parent child relationship. + def to_binary(self, segmentData): + if self.node is not None: + data = self.node.to_binary(segmentData) + else: + data = bytearray(0) + if len(self.children) > 0: + if type(self.node) is FunctionNode: + raise PluginError("An FunctionNode cannot have children.") + + if data[0] in nodeGroupCmds: + data.extend(bytearray([GEO_NODE_OPEN, 0x00, 0x00, 0x00])) + for child in self.children: + data.extend(child.to_binary(segmentData)) + if data[0] in nodeGroupCmds: + data.extend(bytearray([GEO_NODE_CLOSE, 0x00, 0x00, 0x00])) + elif type(self.node) is SwitchNode: + raise PluginError("A switch bone must have at least one child bone.") + return data + + def to_c(self, depth): + if self.node is not None: + nodeC = self.node.to_c() + if ( + nodeC is not None + ): # Should only be the case for DisplayListNode with no DL + data = depth * "\t" + self.node.to_c() + "\n" + else: + data = "" + else: + data = "" + if len(self.children) > 0: + if type(self.node) in nodeGroupClasses: + data += depth * "\t" + "GEO_OPEN_NODE(),\n" + for child in self.children: + data += child.to_c( + depth + (1 if type(self.node) in nodeGroupClasses else 0) + ) + if type(self.node) in nodeGroupClasses: + data += depth * "\t" + "GEO_CLOSE_NODE(),\n" + elif type(self.node) is SwitchNode: + raise PluginError("A switch bone must have at least one child bone.") + return data + + def toTextDump(self, nodeLevel, segmentData): + data = "" + if self.node is not None: + command = self.node.to_binary(segmentData) + else: + command = bytearray(0) + + data += "\t" * nodeLevel + for byteVal in command: + data += format(byteVal, "02X") + " " + data += "\n" + + if len(self.children) > 0: + if len(command) == 0 or command[0] in nodeGroupCmds: + data += "\t" * nodeLevel + "04 00 00 00\n" + for child in self.children: + data += child.toTextDump(nodeLevel + 1, segmentData) + if len(command) == 0 or command[0] in nodeGroupCmds: + data += "\t" * nodeLevel + "05 00 00 00\n" + elif type(self.node) is SwitchNode: + raise PluginError("A switch bone must have at least one child bone.") + return data + + def getDrawLayers(self): + if self.node is not None and self.node.hasDL: + drawLayers = set([self.node.drawLayer]) + else: + drawLayers = set() + for child in self.children: + if hasattr( + child, "getDrawLayers" + ): # not every child will have draw layers (e.g. GEO_ASM) + drawLayers |= child.getDrawLayers() + return drawLayers + class SwitchOverrideNode: - def __init__(self, material, specificMat, drawLayer, overrideType, texDimensions): - self.material = material - self.specificMat = specificMat - self.drawLayer = drawLayer - self.overrideType = overrideType - self.texDimensions = texDimensions # None implies a draw layer override + def __init__(self, material, specificMat, drawLayer, overrideType, texDimensions): + self.material = material + self.specificMat = specificMat + self.drawLayer = drawLayer + self.overrideType = overrideType + self.texDimensions = texDimensions # None implies a draw layer override + class JumpNode: - def __init__(self, storeReturn, geolayout, geoRef: str = None): - self.geolayout = geolayout - self.storeReturn = storeReturn - self.hasDL = False - self.geoRef = geoRef - - def size(self): - return 8 - - def get_ptr_offsets(self): - return [4] - - def to_binary(self, segmentData): - if segmentData is not None: - address = self.geoRef or self.geolayout.startAddress - startAddress = encodeSegmentedAddr(address, segmentData) - else: - startAddress = bytearray([0x00] * 4) - command = bytearray([GEO_BRANCH, - 0x01 if self.storeReturn else 0x00, 0x00, 0x00]) - command.extend(startAddress) - return command - - def to_c(self): - geo_name = self.geoRef or self.geolayout.name - return "GEO_BRANCH(" + ('1, ' if self.storeReturn else '0, ') + \ - geo_name + '),' + def __init__(self, storeReturn, geolayout, geoRef: str = None): + self.geolayout = geolayout + self.storeReturn = storeReturn + self.hasDL = False + self.geoRef = geoRef + + def size(self): + return 8 + + def get_ptr_offsets(self): + return [4] + + def to_binary(self, segmentData): + if segmentData is not None: + address = self.geoRef or self.geolayout.startAddress + startAddress = encodeSegmentedAddr(address, segmentData) + else: + startAddress = bytearray([0x00] * 4) + command = bytearray( + [GEO_BRANCH, 0x01 if self.storeReturn else 0x00, 0x00, 0x00] + ) + command.extend(startAddress) + return command + + def to_c(self): + geo_name = self.geoRef or self.geolayout.name + return "GEO_BRANCH(" + ("1, " if self.storeReturn else "0, ") + geo_name + ")," + def convertAddrToFunc(addr): - if addr == '': - raise PluginError("Geolayout node cannot have an empty function name/address.") - refresh_func_map = func_map[bpy.context.scene.refreshVer] - if addr.lower() in refresh_func_map: - return refresh_func_map[addr.lower()] - else: - return toAlnum(addr) + if addr == "": + raise PluginError("Geolayout node cannot have an empty function name/address.") + refresh_func_map = func_map[bpy.context.scene.refreshVer] + if addr.lower() in refresh_func_map: + return refresh_func_map[addr.lower()] + else: + return toAlnum(addr) + # We add Function commands to nonDeformTransformData because any skinned # 0x15 commands should go before them, as they are usually preceding # an empty transform command (of which they modify?) class FunctionNode: - def __init__(self, geo_func, func_param): - self.geo_func = geo_func - self.func_param = func_param - self.hasDL = False - - def size(self): - return 8 + def __init__(self, geo_func, func_param): + self.geo_func = geo_func + self.func_param = func_param + self.hasDL = False + + def size(self): + return 8 + + def to_binary(self, segmentData): + command = bytearray([GEO_CALL_ASM, 0x00]) + func_param = int(self.func_param) + command.extend(func_param.to_bytes(2, "big", signed=True)) + addFuncAddress(command, self.geo_func) + return command + + def to_c(self): + return ( + "GEO_ASM(" + + str(self.func_param) + + ", " + + convertAddrToFunc(self.geo_func) + + ")," + ) - def to_binary(self, segmentData): - command = bytearray([GEO_CALL_ASM, 0x00]) - func_param = int(self.func_param) - command.extend(func_param.to_bytes(2, 'big', signed = True)) - addFuncAddress(command, self.geo_func) - return command - - def to_c(self): - return "GEO_ASM(" + str(self.func_param) + ', ' + \ - convertAddrToFunc(self.geo_func) + '),' class HeldObjectNode: - def __init__(self, geo_func, translate): - self.geo_func = geo_func - self.translate = translate - self.hasDL = False - - def size(self): - return 12 - - def to_binary(self, segmentData): - command = bytearray([GEO_HELD_OBJECT, 0x00]) - command.extend(bytearray([0x00] * 6)) - writeVectorToShorts(command, 2, self.translate) - addFuncAddress(command, self.geo_func) - return command - - def to_c(self): - return "GEO_HELD_OBJECT(0, " + \ - str(convertFloatToShort(self.translate[0])) + ', ' +\ - str(convertFloatToShort(self.translate[1])) + ', ' +\ - str(convertFloatToShort(self.translate[2])) + ', ' +\ - convertAddrToFunc(self.geo_func) + '),' + def __init__(self, geo_func, translate): + self.geo_func = geo_func + self.translate = translate + self.hasDL = False + + def size(self): + return 12 + + def to_binary(self, segmentData): + command = bytearray([GEO_HELD_OBJECT, 0x00]) + command.extend(bytearray([0x00] * 6)) + writeVectorToShorts(command, 2, self.translate) + addFuncAddress(command, self.geo_func) + return command + + def to_c(self): + return ( + "GEO_HELD_OBJECT(0, " + + str(convertFloatToShort(self.translate[0])) + + ", " + + str(convertFloatToShort(self.translate[1])) + + ", " + + str(convertFloatToShort(self.translate[2])) + + ", " + + convertAddrToFunc(self.geo_func) + + ")," + ) + class StartNode: - def __init__(self): - self.hasDL = False + def __init__(self): + self.hasDL = False + + def size(self): + return 4 - def size(self): - return 4 + def to_binary(self, segmentData): + command = bytearray([GEO_START, 0x00, 0x00, 0x00]) + return command - def to_binary(self, segmentData): - command = bytearray([GEO_START, 0x00, 0x00, 0x00]) - return command + def to_c(self): + return "GEO_NODE_START()," - def to_c(self): - return "GEO_NODE_START()," class EndNode: - def __init__(self): - self.hasDL = False + def __init__(self): + self.hasDL = False - def size(self): - return 4 + def size(self): + return 4 - def to_binary(self, segmentData): - command = bytearray([GEO_END, 0x00, 0x00, 0x00]) - return command + def to_binary(self, segmentData): + command = bytearray([GEO_END, 0x00, 0x00, 0x00]) + return command + + def to_c(self): + return "GEO_END()," - def to_c(self): - return 'GEO_END(),' # Geolayout node hierarchy is first generated without material/draw layer # override options, but with material override DL's being generated. # Afterward, for each switch node the node hierarchy is duplicated and # the correct diplsay lists are added. class SwitchNode: - def __init__(self, geo_func, func_param, name): - self.switchFunc = geo_func - self.defaultCase = func_param - self.hasDL = False - self.name = name - - def size(self): - return 8 - - def to_binary(self, segmentData): - command = bytearray([GEO_SWITCH, 0x00]) - defaultCase = int(self.defaultCase) - command.extend(defaultCase.to_bytes(2, 'big', signed = True)) - addFuncAddress(command, self.switchFunc) - return command - - def to_c(self): - return "GEO_SWITCH_CASE(" + \ - str(self.defaultCase) + ', ' +\ - convertAddrToFunc(self.switchFunc) + '),' + def __init__(self, geo_func, func_param, name): + self.switchFunc = geo_func + self.defaultCase = func_param + self.hasDL = False + self.name = name + + def size(self): + return 8 + + def to_binary(self, segmentData): + command = bytearray([GEO_SWITCH, 0x00]) + defaultCase = int(self.defaultCase) + command.extend(defaultCase.to_bytes(2, "big", signed=True)) + addFuncAddress(command, self.switchFunc) + return command + + def to_c(self): + return ( + "GEO_SWITCH_CASE(" + + str(self.defaultCase) + + ", " + + convertAddrToFunc(self.switchFunc) + + ")," + ) + class TranslateRotateNode(BaseDisplayListNode): - def __init__(self, drawLayer, fieldLayout, hasDL, translate, rotate, dlRef: str = None): - - self.drawLayer = drawLayer - self.fieldLayout = fieldLayout - self.hasDL = hasDL - - self.translate = translate - self.rotate = rotate - - self.fMesh = None - self.DLmicrocode = None - self.dlRef = dlRef - - def get_ptr_offsets(self): - if self.hasDL: - if self.fieldLayout == 0: - return [16] - elif self.fieldLayout == 1: - return [8] - elif self.fieldLayout == 2: - return [8] - elif self.fieldLayout == 3: - return [4] - else: - return [] - - def size(self): - if self.fieldLayout == 0: - size = 16 - elif self.fieldLayout == 1: - size = 8 - elif self.fieldLayout == 2: - size = 8 - elif self.fieldLayout == 3: - size = 4 - - if self.hasDL: - size += 4 - return size - - def to_binary(self, segmentData): - params = ((1 if self.hasDL else 0) << 7) & \ - (self.fieldLayout << 4) | int(self.drawLayer) - - start_address = self.get_dl_address() - - command = bytearray([GEO_TRANSLATE_ROTATE, params]) - if self.fieldLayout == 0: - command.extend(bytearray([0x00] * 14)) - writeVectorToShorts(command, 4, self.translate) - writeEulerVectorToShorts(command, 10, - self.rotate.to_euler(geoNodeRotateOrder)) - elif self.fieldLayout == 1: - command.extend(bytearray([0x00] * 6)) - writeVectorToShorts(command, 2, self.translate) - elif self.fieldLayout == 2: - command.extend(bytearray([0x00] * 6)) - writeEulerVectorToShorts(command, 2, - self.rotate.to_euler(geoNodeRotateOrder)) - elif self.fieldLayout == 3: - command.extend(bytearray([0x00] * 2)) - writeFloatToShort(command, 2, - self.rotate.to_euler(geoNodeRotateOrder).y) - if start_address: - if segmentData is not None: - command.extend(encodeSegmentedAddr(start_address, segmentData)) - else: - command.extend(bytearray([0x00] * 4)) - return command - - def to_c(self): - if self.fieldLayout == 0: - return self.c_func_macro("GEO_TRANSLATE_ROTATE", - getDrawLayerName(self.drawLayer), - str(convertFloatToShort(self.translate[0])), - str(convertFloatToShort(self.translate[1])), - str(convertFloatToShort(self.translate[2])), - str(convertEulerFloatToShort(self.rotate.to_euler( - geoNodeRotateOrder)[0])), - str(convertEulerFloatToShort(self.rotate.to_euler( - geoNodeRotateOrder)[1])), - str(convertEulerFloatToShort(self.rotate.to_euler( - geoNodeRotateOrder)[2])) - ) - elif self.fieldLayout == 1: - return self.c_func_macro("GEO_TRANSLATE", - getDrawLayerName(self.drawLayer), - str(convertFloatToShort(self.translate[0])), - str(convertFloatToShort(self.translate[1])), - str(convertFloatToShort(self.translate[2])) - ) - elif self.fieldLayout == 2: - return self.c_func_macro("GEO_ROTATE", - getDrawLayerName(self.drawLayer), - str(convertEulerFloatToShort(self.rotate.to_euler( - geoNodeRotateOrder)[0])), - str(convertEulerFloatToShort(self.rotate.to_euler( - geoNodeRotateOrder)[1])), - str(convertEulerFloatToShort(self.rotate.to_euler( - geoNodeRotateOrder)[2])) - ) - elif self.fieldLayout == 3: - return self.c_func_macro("GEO_ROTATE_Y", - getDrawLayerName(self.drawLayer), - str(convertEulerFloatToShort(self.rotate.to_euler( - geoNodeRotateOrder)[1])) - ) + def __init__( + self, drawLayer, fieldLayout, hasDL, translate, rotate, dlRef: str = None + ): + + self.drawLayer = drawLayer + self.fieldLayout = fieldLayout + self.hasDL = hasDL + + self.translate = translate + self.rotate = rotate + + self.fMesh = None + self.DLmicrocode = None + self.dlRef = dlRef + + def get_ptr_offsets(self): + if self.hasDL: + if self.fieldLayout == 0: + return [16] + elif self.fieldLayout == 1: + return [8] + elif self.fieldLayout == 2: + return [8] + elif self.fieldLayout == 3: + return [4] + else: + return [] + + def size(self): + if self.fieldLayout == 0: + size = 16 + elif self.fieldLayout == 1: + size = 8 + elif self.fieldLayout == 2: + size = 8 + elif self.fieldLayout == 3: + size = 4 + + if self.hasDL: + size += 4 + return size + + def to_binary(self, segmentData): + params = ((1 if self.hasDL else 0) << 7) & (self.fieldLayout << 4) | int( + self.drawLayer + ) + + start_address = self.get_dl_address() + + command = bytearray([GEO_TRANSLATE_ROTATE, params]) + if self.fieldLayout == 0: + command.extend(bytearray([0x00] * 14)) + writeVectorToShorts(command, 4, self.translate) + writeEulerVectorToShorts( + command, 10, self.rotate.to_euler(geoNodeRotateOrder) + ) + elif self.fieldLayout == 1: + command.extend(bytearray([0x00] * 6)) + writeVectorToShorts(command, 2, self.translate) + elif self.fieldLayout == 2: + command.extend(bytearray([0x00] * 6)) + writeEulerVectorToShorts( + command, 2, self.rotate.to_euler(geoNodeRotateOrder) + ) + elif self.fieldLayout == 3: + command.extend(bytearray([0x00] * 2)) + writeFloatToShort(command, 2, self.rotate.to_euler(geoNodeRotateOrder).y) + if start_address: + if segmentData is not None: + command.extend(encodeSegmentedAddr(start_address, segmentData)) + else: + command.extend(bytearray([0x00] * 4)) + return command + + def to_c(self): + if self.fieldLayout == 0: + return self.c_func_macro( + "GEO_TRANSLATE_ROTATE", + getDrawLayerName(self.drawLayer), + str(convertFloatToShort(self.translate[0])), + str(convertFloatToShort(self.translate[1])), + str(convertFloatToShort(self.translate[2])), + str( + convertEulerFloatToShort( + self.rotate.to_euler(geoNodeRotateOrder)[0] + ) + ), + str( + convertEulerFloatToShort( + self.rotate.to_euler(geoNodeRotateOrder)[1] + ) + ), + str( + convertEulerFloatToShort( + self.rotate.to_euler(geoNodeRotateOrder)[2] + ) + ), + ) + elif self.fieldLayout == 1: + return self.c_func_macro( + "GEO_TRANSLATE", + getDrawLayerName(self.drawLayer), + str(convertFloatToShort(self.translate[0])), + str(convertFloatToShort(self.translate[1])), + str(convertFloatToShort(self.translate[2])), + ) + elif self.fieldLayout == 2: + return self.c_func_macro( + "GEO_ROTATE", + getDrawLayerName(self.drawLayer), + str( + convertEulerFloatToShort( + self.rotate.to_euler(geoNodeRotateOrder)[0] + ) + ), + str( + convertEulerFloatToShort( + self.rotate.to_euler(geoNodeRotateOrder)[1] + ) + ), + str( + convertEulerFloatToShort( + self.rotate.to_euler(geoNodeRotateOrder)[2] + ) + ), + ) + elif self.fieldLayout == 3: + return self.c_func_macro( + "GEO_ROTATE_Y", + getDrawLayerName(self.drawLayer), + str( + convertEulerFloatToShort( + self.rotate.to_euler(geoNodeRotateOrder)[1] + ) + ), + ) + class TranslateNode(BaseDisplayListNode): - def __init__(self, drawLayer, useDeform, translate, dlRef: str = None): - self.drawLayer = drawLayer - self.hasDL = useDeform - self.translate = translate - self.fMesh = None - self.DLmicrocode = None - self.dlRef = dlRef - - def get_ptr_offsets(self): - return [8] if self.hasDL else [] - - def size(self): - return 12 if self.hasDL else 8 - - def to_binary(self, segmentData): - params = ((1 if self.hasDL else 0) << 7) | int(self.drawLayer) - command = bytearray([GEO_TRANSLATE, params]) - command.extend(bytearray([0x00] * 6)) - writeVectorToShorts(command, 2, self.translate) - - if self.hasDL: - start_address = self.get_dl_address() - if segmentData is not None: - command.extend(encodeSegmentedAddr(start_address, segmentData)) - else: - command.extend(bytearray([0x00] * 4)) - return command - - def to_c(self): - return self.c_func_macro("GEO_TRANSLATE_NODE", - getDrawLayerName(self.drawLayer), - str(convertFloatToShort(self.translate[0])), - str(convertFloatToShort(self.translate[1])), - str(convertFloatToShort(self.translate[2])), - ) + def __init__(self, drawLayer, useDeform, translate, dlRef: str = None): + self.drawLayer = drawLayer + self.hasDL = useDeform + self.translate = translate + self.fMesh = None + self.DLmicrocode = None + self.dlRef = dlRef + + def get_ptr_offsets(self): + return [8] if self.hasDL else [] + + def size(self): + return 12 if self.hasDL else 8 + + def to_binary(self, segmentData): + params = ((1 if self.hasDL else 0) << 7) | int(self.drawLayer) + command = bytearray([GEO_TRANSLATE, params]) + command.extend(bytearray([0x00] * 6)) + writeVectorToShorts(command, 2, self.translate) + + if self.hasDL: + start_address = self.get_dl_address() + if segmentData is not None: + command.extend(encodeSegmentedAddr(start_address, segmentData)) + else: + command.extend(bytearray([0x00] * 4)) + return command + + def to_c(self): + return self.c_func_macro( + "GEO_TRANSLATE_NODE", + getDrawLayerName(self.drawLayer), + str(convertFloatToShort(self.translate[0])), + str(convertFloatToShort(self.translate[1])), + str(convertFloatToShort(self.translate[2])), + ) + class RotateNode(BaseDisplayListNode): - def __init__(self, drawLayer, hasDL, rotate, dlRef: str = None): - # In the case for automatically inserting rotate nodes between - # 0x13 bones. - - self.drawLayer = drawLayer - self.hasDL = hasDL - self.rotate = rotate - self.fMesh = None - self.DLmicrocode = None - self.dlRef = dlRef - - def get_ptr_offsets(self): - return [8] if self.hasDL else [] - - def size(self): - return 12 if self.hasDL else 8 - - def to_binary(self, segmentData): - params = ((1 if self.hasDL else 0) << 7) | int(self.drawLayer) - command = bytearray([GEO_ROTATE, params]) - command.extend(bytearray([0x00] * 6)) - writeEulerVectorToShorts(command, 2, - self.rotate.to_euler(geoNodeRotateOrder)) - if self.hasDL: - start_address = self.get_dl_address() - if segmentData is not None: - command.extend(encodeSegmentedAddr(start_address, segmentData)) - else: - command.extend(bytearray([0x00] * 4)) - return command - - def to_c(self): - return self.c_func_macro("GEO_ROTATION_NODE", - getDrawLayerName(self.drawLayer), - str(convertEulerFloatToShort(self.rotate.to_euler( - geoNodeRotateOrder)[0])), - str(convertEulerFloatToShort(self.rotate.to_euler( - geoNodeRotateOrder)[1])), - str(convertEulerFloatToShort(self.rotate.to_euler( - geoNodeRotateOrder)[2])) - ) + def __init__(self, drawLayer, hasDL, rotate, dlRef: str = None): + # In the case for automatically inserting rotate nodes between + # 0x13 bones. + + self.drawLayer = drawLayer + self.hasDL = hasDL + self.rotate = rotate + self.fMesh = None + self.DLmicrocode = None + self.dlRef = dlRef + + def get_ptr_offsets(self): + return [8] if self.hasDL else [] + + def size(self): + return 12 if self.hasDL else 8 + + def to_binary(self, segmentData): + params = ((1 if self.hasDL else 0) << 7) | int(self.drawLayer) + command = bytearray([GEO_ROTATE, params]) + command.extend(bytearray([0x00] * 6)) + writeEulerVectorToShorts(command, 2, self.rotate.to_euler(geoNodeRotateOrder)) + if self.hasDL: + start_address = self.get_dl_address() + if segmentData is not None: + command.extend(encodeSegmentedAddr(start_address, segmentData)) + else: + command.extend(bytearray([0x00] * 4)) + return command + + def to_c(self): + return self.c_func_macro( + "GEO_ROTATION_NODE", + getDrawLayerName(self.drawLayer), + str(convertEulerFloatToShort(self.rotate.to_euler(geoNodeRotateOrder)[0])), + str(convertEulerFloatToShort(self.rotate.to_euler(geoNodeRotateOrder)[1])), + str(convertEulerFloatToShort(self.rotate.to_euler(geoNodeRotateOrder)[2])), + ) + class BillboardNode(BaseDisplayListNode): - dl_ext = 'AND_DL' - - def __init__(self, drawLayer, hasDL, translate, dlRef: str = None): - self.drawLayer = drawLayer - self.hasDL = hasDL - self.translate = translate - self.fMesh = None - self.DLmicrocode = None - self.dlRef = dlRef - - def get_ptr_offsets(self): - return [8] if self.hasDL else [] - - def size(self): - return 12 if self.hasDL else 8 - - def to_binary(self, segmentData): - params = ((1 if self.hasDL else 0) << 7) | int(self.drawLayer) - command = bytearray([GEO_BILLBOARD, params]) - command.extend(bytearray([0x00] * 6)) - writeVectorToShorts(command, 2, self.translate) - if self.hasDL: - start_address = self.get_dl_address() - if segmentData is not None: - command.extend(encodeSegmentedAddr(start_address, segmentData)) - else: - command.extend(bytearray([0x00] * 4)) - return command - - def to_c(self): - return self.c_func_macro("GEO_BILLBOARD_WITH_PARAMS", - getDrawLayerName(self.drawLayer), - str(convertFloatToShort(self.translate[0])), - str(convertFloatToShort(self.translate[1])), - str(convertFloatToShort(self.translate[2])) - ) + dl_ext = "AND_DL" + + def __init__(self, drawLayer, hasDL, translate, dlRef: str = None): + self.drawLayer = drawLayer + self.hasDL = hasDL + self.translate = translate + self.fMesh = None + self.DLmicrocode = None + self.dlRef = dlRef + + def get_ptr_offsets(self): + return [8] if self.hasDL else [] + + def size(self): + return 12 if self.hasDL else 8 + + def to_binary(self, segmentData): + params = ((1 if self.hasDL else 0) << 7) | int(self.drawLayer) + command = bytearray([GEO_BILLBOARD, params]) + command.extend(bytearray([0x00] * 6)) + writeVectorToShorts(command, 2, self.translate) + if self.hasDL: + start_address = self.get_dl_address() + if segmentData is not None: + command.extend(encodeSegmentedAddr(start_address, segmentData)) + else: + command.extend(bytearray([0x00] * 4)) + return command + + def to_c(self): + return self.c_func_macro( + "GEO_BILLBOARD_WITH_PARAMS", + getDrawLayerName(self.drawLayer), + str(convertFloatToShort(self.translate[0])), + str(convertFloatToShort(self.translate[1])), + str(convertFloatToShort(self.translate[2])), + ) + class DisplayListNode(BaseDisplayListNode): - def __init__(self, drawLayer, dlRef: str = None): - self.drawLayer = drawLayer - self.hasDL = True - self.fMesh = None - self.DLmicrocode = None - self.dlRef = dlRef - - def get_ptr_offsets(self): - return [4] - - def size(self): - return 8 - - def to_binary(self, segmentData): - command = bytearray([GEO_LOAD_DL, int(self.drawLayer), 0x00, 0x00]) - start_address = self.get_dl_address() - if start_address and segmentData is not None: - command.extend(encodeSegmentedAddr(start_address, segmentData)) - else: - command.extend(bytearray([0x00] * 4)) - return command - - def to_c(self): - if not self.hasDL: - return None - args = [getDrawLayerName(self.drawLayer), self.get_dl_name()] - return f"GEO_DISPLAY_LIST({join_c_args(args)})," + def __init__(self, drawLayer, dlRef: str = None): + self.drawLayer = drawLayer + self.hasDL = True + self.fMesh = None + self.DLmicrocode = None + self.dlRef = dlRef + + def get_ptr_offsets(self): + return [4] + + def size(self): + return 8 + + def to_binary(self, segmentData): + command = bytearray([GEO_LOAD_DL, int(self.drawLayer), 0x00, 0x00]) + start_address = self.get_dl_address() + if start_address and segmentData is not None: + command.extend(encodeSegmentedAddr(start_address, segmentData)) + else: + command.extend(bytearray([0x00] * 4)) + return command + + def to_c(self): + if not self.hasDL: + return None + args = [getDrawLayerName(self.drawLayer), self.get_dl_name()] + return f"GEO_DISPLAY_LIST({join_c_args(args)})," class ShadowNode: - def __init__(self, shadow_type, shadow_solidity, shadow_scale): - self.shadowType = int(shadow_type) - self.shadowSolidity = int(round(shadow_solidity * 0xFF)) - self.shadowScale = shadow_scale - self.hasDL = False - - def size(self): - return 8 - - def to_binary(self, segmentData): - command = bytearray([GEO_START_W_SHADOW, 0x00]) - command.extend(self.shadowType.to_bytes(2, 'big')) - command.extend(self.shadowSolidity.to_bytes(2, 'big')) - command.extend(self.shadowScale.to_bytes(2, 'big')) - return command - - def to_c(self): - return "GEO_SHADOW(" + \ - str(self.shadowType) + ', ' +\ - str(self.shadowSolidity) + ', ' +\ - str(self.shadowScale) + '),' + def __init__(self, shadow_type, shadow_solidity, shadow_scale): + self.shadowType = int(shadow_type) + self.shadowSolidity = int(round(shadow_solidity * 0xFF)) + self.shadowScale = shadow_scale + self.hasDL = False + + def size(self): + return 8 + + def to_binary(self, segmentData): + command = bytearray([GEO_START_W_SHADOW, 0x00]) + command.extend(self.shadowType.to_bytes(2, "big")) + command.extend(self.shadowSolidity.to_bytes(2, "big")) + command.extend(self.shadowScale.to_bytes(2, "big")) + return command + + def to_c(self): + return ( + "GEO_SHADOW(" + + str(self.shadowType) + + ", " + + str(self.shadowSolidity) + + ", " + + str(self.shadowScale) + + ")," + ) + class ScaleNode(BaseDisplayListNode): - def __init__(self, drawLayer, geo_scale, use_deform, dlRef: str = None): - self.drawLayer = drawLayer - self.scaleValue = geo_scale - self.hasDL = use_deform - self.fMesh = None - self.DLmicrocode = None - self.dlRef = dlRef - - def get_ptr_offsets(self): - return [8] if self.hasDL else [] - - def size(self): - return 12 if self.hasDL else 8 - - def to_binary(self, segmentData): - params = ((1 if self.hasDL else 0) << 7) | int(self.drawLayer) - command = bytearray([GEO_SCALE, params, 0x00, 0x00]) - command.extend(int(self.scaleValue * 0x10000).to_bytes(4, 'big')) - if self.hasDL: - if segmentData is not None: - command.extend(encodeSegmentedAddr(self.get_dl_address(), segmentData)) - else: - command.extend(bytearray([0x00] * 4)) - return command - - def to_c(self): - return self.c_func_macro("GEO_SCALE", - getDrawLayerName(self.drawLayer), - str(int(round(self.scaleValue * 0x10000))) - ) + def __init__(self, drawLayer, geo_scale, use_deform, dlRef: str = None): + self.drawLayer = drawLayer + self.scaleValue = geo_scale + self.hasDL = use_deform + self.fMesh = None + self.DLmicrocode = None + self.dlRef = dlRef + + def get_ptr_offsets(self): + return [8] if self.hasDL else [] + + def size(self): + return 12 if self.hasDL else 8 + + def to_binary(self, segmentData): + params = ((1 if self.hasDL else 0) << 7) | int(self.drawLayer) + command = bytearray([GEO_SCALE, params, 0x00, 0x00]) + command.extend(int(self.scaleValue * 0x10000).to_bytes(4, "big")) + if self.hasDL: + if segmentData is not None: + command.extend(encodeSegmentedAddr(self.get_dl_address(), segmentData)) + else: + command.extend(bytearray([0x00] * 4)) + return command + + def to_c(self): + return self.c_func_macro( + "GEO_SCALE", + getDrawLayerName(self.drawLayer), + str(int(round(self.scaleValue * 0x10000))), + ) + class StartRenderAreaNode: - def __init__(self, cullingRadius): - self.cullingRadius = cullingRadius - self.hasDL = False + def __init__(self, cullingRadius): + self.cullingRadius = cullingRadius + self.hasDL = False - def size(self): - return 4 + def size(self): + return 4 - def to_binary(self, segmentData): - command = bytearray([GEO_START_W_RENDERAREA, 0x00]) - command.extend(convertFloatToShort(self.cullingRadius).to_bytes(2, 'big')) - return command + def to_binary(self, segmentData): + command = bytearray([GEO_START_W_RENDERAREA, 0x00]) + command.extend(convertFloatToShort(self.cullingRadius).to_bytes(2, "big")) + return command + + def to_c(self): + cullingRadius = convertFloatToShort(self.cullingRadius) + # if abs(cullingRadius) > 2**15 - 1: + # raise PluginError("A render area node has a culling radius that does not fit an s16.\n Radius is " +\ + # str(cullingRadius) + ' when converted to SM64 units.') + return ( + "GEO_CULLING_RADIUS(" + str(convertFloatToShort(self.cullingRadius)) + ")," + ) - def to_c(self): - cullingRadius = convertFloatToShort(self.cullingRadius) - #if abs(cullingRadius) > 2**15 - 1: - # raise PluginError("A render area node has a culling radius that does not fit an s16.\n Radius is " +\ - # str(cullingRadius) + ' when converted to SM64 units.') - return 'GEO_CULLING_RADIUS(' + str(convertFloatToShort(self.cullingRadius)) + '),' class RenderRangeNode: - def __init__(self, minDist, maxDist): - self.minDist = minDist - self.maxDist = maxDist - self.hasDL = False - - def size(self): - return 8 - - def to_binary(self, segmentData): - command = bytearray([GEO_SET_RENDER_RANGE, 0x00, 0x00, 0x00]) - command.extend(convertFloatToShort(self.minDist).to_bytes(2, 'big')) - command.extend(convertFloatToShort(self.maxDist).to_bytes(2, 'big')) - return command - - def to_c(self): - minDist = convertFloatToShort(self.minDist) - maxDist = convertFloatToShort(self.maxDist) - #if (abs(minDist) > 2**15 - 1) or (abs(maxDist) > 2**15 - 1): - # raise PluginError("A render range (LOD) node has a range that does not fit an s16.\n Range is " +\ - # str(minDist) + ', ' + str(maxDist) + ' when converted to SM64 units.') - return 'GEO_RENDER_RANGE(' + str(minDist) + ', ' +\ - str(maxDist) + '),' + def __init__(self, minDist, maxDist): + self.minDist = minDist + self.maxDist = maxDist + self.hasDL = False + + def size(self): + return 8 + + def to_binary(self, segmentData): + command = bytearray([GEO_SET_RENDER_RANGE, 0x00, 0x00, 0x00]) + command.extend(convertFloatToShort(self.minDist).to_bytes(2, "big")) + command.extend(convertFloatToShort(self.maxDist).to_bytes(2, "big")) + return command + + def to_c(self): + minDist = convertFloatToShort(self.minDist) + maxDist = convertFloatToShort(self.maxDist) + # if (abs(minDist) > 2**15 - 1) or (abs(maxDist) > 2**15 - 1): + # raise PluginError("A render range (LOD) node has a range that does not fit an s16.\n Range is " +\ + # str(minDist) + ', ' + str(maxDist) + ' when converted to SM64 units.') + return "GEO_RENDER_RANGE(" + str(minDist) + ", " + str(maxDist) + ")," + class DisplayListWithOffsetNode(BaseDisplayListNode): - def __init__(self, drawLayer, use_deform, translate, dlRef: str = None): - self.drawLayer = drawLayer - self.hasDL = use_deform - self.translate = translate - self.fMesh = None - self.DLmicrocode = None - self.dlRef = dlRef - - def size(self): - return 12 - - def get_ptr_offsets(self): - return [8] if self.hasDL else [] - - def to_binary(self, segmentData): - command = bytearray([GEO_LOAD_DL_W_OFFSET, int(self.drawLayer)]) - command.extend(bytearray([0x00] * 6)) - writeVectorToShorts(command, 2, self.translate) - start_address = self.get_dl_address() - if start_address is not None and segmentData is not None: - command.extend(encodeSegmentedAddr(start_address, segmentData)) - else: - command.extend(bytearray([0x00] * 4)) - return command - - def to_c(self): - args = [ - getDrawLayerName(self.drawLayer), - str(convertFloatToShort(self.translate[0])), - str(convertFloatToShort(self.translate[1])), - str(convertFloatToShort(self.translate[2])), - self.get_dl_name() # This node requires 'NULL' if there is no DL - ] - return f"GEO_ANIMATED_PART({join_c_args(args)})," + def __init__(self, drawLayer, use_deform, translate, dlRef: str = None): + self.drawLayer = drawLayer + self.hasDL = use_deform + self.translate = translate + self.fMesh = None + self.DLmicrocode = None + self.dlRef = dlRef + + def size(self): + return 12 + + def get_ptr_offsets(self): + return [8] if self.hasDL else [] + + def to_binary(self, segmentData): + command = bytearray([GEO_LOAD_DL_W_OFFSET, int(self.drawLayer)]) + command.extend(bytearray([0x00] * 6)) + writeVectorToShorts(command, 2, self.translate) + start_address = self.get_dl_address() + if start_address is not None and segmentData is not None: + command.extend(encodeSegmentedAddr(start_address, segmentData)) + else: + command.extend(bytearray([0x00] * 4)) + return command + + def to_c(self): + args = [ + getDrawLayerName(self.drawLayer), + str(convertFloatToShort(self.translate[0])), + str(convertFloatToShort(self.translate[1])), + str(convertFloatToShort(self.translate[2])), + self.get_dl_name(), # This node requires 'NULL' if there is no DL + ] + return f"GEO_ANIMATED_PART({join_c_args(args)})," + class ScreenAreaNode: - def __init__(self, useDefaults, entryMinus2Count, position, dimensions): - self.useDefaults = useDefaults - self.entryMinus2Count = entryMinus2Count - self.position = position - self.dimensions = dimensions - self.hasDL = False - - def size(self): - return 12 - - def to_binary(self, segmentData): - position = [160, 120] if self.useDefaults else self.position - dimensions = [160, 120] if self.useDefaults else self.dimensions - entryMinus2Count = 0xA if self.useDefaults else self.entryMinus2Count - command = bytearray([GEO_SET_RENDER_AREA, 0x00]) - command.extend(entryMinus2Count.to_bytes(2, 'big', signed = False)) - command.extend(position[0].to_bytes(2, 'big', signed = True)) - command.extend(position[1].to_bytes(2, 'big', signed = True)) - command.extend(dimensions[0].to_bytes(2, 'big', signed = True)) - command.extend(dimensions[1].to_bytes(2, 'big', signed = True)) - return command - - def to_c(self): - if self.useDefaults: - return 'GEO_NODE_SCREEN_AREA(10, ' +\ - 'SCREEN_WIDTH/2, SCREEN_HEIGHT/2, ' +\ - 'SCREEN_WIDTH/2, SCREEN_HEIGHT/2),' - else: - return 'GEO_NODE_SCREEN_AREA(' + str(self.entryMinus2Count) +\ - ', ' + str(self.position[0]) + ', ' + str(self.position[1]) +\ - ', ' + str(self.dimensions[0]) + ', ' + \ - str(self.dimensions[1]) + '),' + def __init__(self, useDefaults, entryMinus2Count, position, dimensions): + self.useDefaults = useDefaults + self.entryMinus2Count = entryMinus2Count + self.position = position + self.dimensions = dimensions + self.hasDL = False + + def size(self): + return 12 + + def to_binary(self, segmentData): + position = [160, 120] if self.useDefaults else self.position + dimensions = [160, 120] if self.useDefaults else self.dimensions + entryMinus2Count = 0xA if self.useDefaults else self.entryMinus2Count + command = bytearray([GEO_SET_RENDER_AREA, 0x00]) + command.extend(entryMinus2Count.to_bytes(2, "big", signed=False)) + command.extend(position[0].to_bytes(2, "big", signed=True)) + command.extend(position[1].to_bytes(2, "big", signed=True)) + command.extend(dimensions[0].to_bytes(2, "big", signed=True)) + command.extend(dimensions[1].to_bytes(2, "big", signed=True)) + return command + + def to_c(self): + if self.useDefaults: + return ( + "GEO_NODE_SCREEN_AREA(10, " + + "SCREEN_WIDTH/2, SCREEN_HEIGHT/2, " + + "SCREEN_WIDTH/2, SCREEN_HEIGHT/2)," + ) + else: + return ( + "GEO_NODE_SCREEN_AREA(" + + str(self.entryMinus2Count) + + ", " + + str(self.position[0]) + + ", " + + str(self.position[1]) + + ", " + + str(self.dimensions[0]) + + ", " + + str(self.dimensions[1]) + + ")," + ) + class OrthoNode: - def __init__(self, scale): - self.scale = scale - self.hasDL = False + def __init__(self, scale): + self.scale = scale + self.hasDL = False + + def size(self): + return 4 - def size(self): - return 4 + def to_binary(self, segmentData): + command = bytearray([GEO_SET_ORTHO, 0x00]) + # FIX: This should be f32. + command.extend(bytearray(struct.pack(">f", self.scale))) + return command - def to_binary(self, segmentData): - command = bytearray([GEO_SET_ORTHO, 0x00]) - # FIX: This should be f32. - command.extend(bytearray(struct.pack(">f", self.scale))) - return command + def to_c(self): + return "GEO_NODE_ORTHO(" + format(self.scale, ".4f") + ")," - def to_c(self): - return 'GEO_NODE_ORTHO(' + format(self.scale, '.4f') + '),' class FrustumNode: - def __init__(self, fov, near, far): - self.fov = fov - self.near = int(round(near)) - self.far = int(round(far)) - self.useFunc = True # Always use function? - self.hasDL = False - - def size(self): - return 12 if self.useFunc else 8 - - def to_binary(self, segmentData): - command = bytearray([GEO_SET_CAMERA_FRUSTRUM, - 0x01 if self.useFunc else 0x00]) - command.extend(bytearray(struct.pack(">f", self.fov))) - command.extend(self.near.to_bytes(2, 'big', signed = True)) # Conversion? - command.extend(self.far.to_bytes(2, 'big', signed = True)) # Conversion? - - if self.useFunc: - command.extend(bytes.fromhex('8029AA3C')) - return command - - def to_c(self): - if not self.useFunc: - return 'GEO_CAMERA_FRUSTUM(' + format(self.fov, '.4f') +\ - ', ' + str(self.near) + ', ' + str(self.far) + '),' - else: - return 'GEO_CAMERA_FRUSTUM_WITH_FUNC(' + format(self.fov, '.4f') +\ - ', ' + str(self.near) + ', ' + str(self.far) +\ - ', geo_camera_fov),' + def __init__(self, fov, near, far): + self.fov = fov + self.near = int(round(near)) + self.far = int(round(far)) + self.useFunc = True # Always use function? + self.hasDL = False + + def size(self): + return 12 if self.useFunc else 8 + + def to_binary(self, segmentData): + command = bytearray([GEO_SET_CAMERA_FRUSTRUM, 0x01 if self.useFunc else 0x00]) + command.extend(bytearray(struct.pack(">f", self.fov))) + command.extend(self.near.to_bytes(2, "big", signed=True)) # Conversion? + command.extend(self.far.to_bytes(2, "big", signed=True)) # Conversion? + + if self.useFunc: + command.extend(bytes.fromhex("8029AA3C")) + return command + + def to_c(self): + if not self.useFunc: + return ( + "GEO_CAMERA_FRUSTUM(" + + format(self.fov, ".4f") + + ", " + + str(self.near) + + ", " + + str(self.far) + + ")," + ) + else: + return ( + "GEO_CAMERA_FRUSTUM_WITH_FUNC(" + + format(self.fov, ".4f") + + ", " + + str(self.near) + + ", " + + str(self.far) + + ", geo_camera_fov)," + ) + class ZBufferNode: - def __init__(self, enable): - self.enable = enable - self.hasDL = False + def __init__(self, enable): + self.enable = enable + self.hasDL = False + + def size(self): + return 4 - def size(self): - return 4 + def to_binary(self, segmentData): + command = bytearray([GEO_SET_Z_BUF, 0x01 if self.enable else 0x00, 0x00, 0x00]) + return command - def to_binary(self, segmentData): - command = bytearray([GEO_SET_Z_BUF, 0x01 if self.enable else 0x00, - 0x00, 0x00]) - return command + def to_c(self): + return "GEO_ZBUFFER(" + ("1" if self.enable else "0") + ")," - def to_c(self): - return 'GEO_ZBUFFER(' + ('1' if self.enable else '0') + '),' class CameraNode: - def __init__(self, camType, position, lookAt): - self.camType = camType - self.position = \ - [int(round(value * bpy.context.scene.blenderToSM64Scale)) for value in position] - self.lookAt = \ - [int(round(value * bpy.context.scene.blenderToSM64Scale)) for value in lookAt] - self.geo_func = '80287D30' - self.hasDL = False - - def size(self): - return 20 - - def to_binary(self, segmentData): - command = bytearray([GEO_CAMERA, 0x00]) - command.extend(self.camType.to_bytes(2, 'big', signed = True)) - command.extend(self.position[0].to_bytes(2, 'big', signed = True)) - command.extend(self.position[1].to_bytes(2, 'big', signed = True)) - command.extend(self.position[2].to_bytes(2, 'big', signed = True)) - command.extend(self.lookAt[0].to_bytes(2, 'big', signed = True)) - command.extend(self.lookAt[1].to_bytes(2, 'big', signed = True)) - command.extend(self.lookAt[2].to_bytes(2, 'big', signed = True)) - addFuncAddress(command, self.geo_func) - return command - - def to_c(self): - return 'GEO_CAMERA(' + str(self.camType) + ', ' + \ - str(self.position[0]) + ', ' + \ - str(self.position[1]) + ', ' + \ - str(self.position[2]) + ', ' + \ - str(self.lookAt[0]) + ', ' + \ - str(self.lookAt[1]) + ', ' + \ - str(self.lookAt[2]) + ', ' + \ - convertAddrToFunc(self.geo_func) + '),' + def __init__(self, camType, position, lookAt): + self.camType = camType + self.position = [ + int(round(value * bpy.context.scene.blenderToSM64Scale)) + for value in position + ] + self.lookAt = [ + int(round(value * bpy.context.scene.blenderToSM64Scale)) for value in lookAt + ] + self.geo_func = "80287D30" + self.hasDL = False + + def size(self): + return 20 + + def to_binary(self, segmentData): + command = bytearray([GEO_CAMERA, 0x00]) + command.extend(self.camType.to_bytes(2, "big", signed=True)) + command.extend(self.position[0].to_bytes(2, "big", signed=True)) + command.extend(self.position[1].to_bytes(2, "big", signed=True)) + command.extend(self.position[2].to_bytes(2, "big", signed=True)) + command.extend(self.lookAt[0].to_bytes(2, "big", signed=True)) + command.extend(self.lookAt[1].to_bytes(2, "big", signed=True)) + command.extend(self.lookAt[2].to_bytes(2, "big", signed=True)) + addFuncAddress(command, self.geo_func) + return command + + def to_c(self): + return ( + "GEO_CAMERA(" + + str(self.camType) + + ", " + + str(self.position[0]) + + ", " + + str(self.position[1]) + + ", " + + str(self.position[2]) + + ", " + + str(self.lookAt[0]) + + ", " + + str(self.lookAt[1]) + + ", " + + str(self.lookAt[2]) + + ", " + + convertAddrToFunc(self.geo_func) + + ")," + ) + class RenderObjNode: - def __init__(self): - self.hasDL = False - pass + def __init__(self): + self.hasDL = False + pass + + def size(self): + return 4 - def size(self): - return 4 + def to_binary(self, segmentData): + command = bytearray([GEO_SETUP_OBJ_RENDER, 0x00, 0x00, 0x00]) + return command - def to_binary(self, segmentData): - command = bytearray([GEO_SETUP_OBJ_RENDER, 0x00, 0x00, 0x00]) - return command + def to_c(self): + return "GEO_RENDER_OBJ()," - def to_c(self): - return 'GEO_RENDER_OBJ(),' class BackgroundNode: - def __init__(self, isColor, backgroundValue): - self.isColor = isColor - self.backgroundValue = backgroundValue - self.geo_func = '802763D4' - self.hasDL = False - - def size(self): - return 8 - - def to_binary(self, segmentData): - command = bytearray([GEO_SET_BG, 0x00]) - command.extend(self.backgroundValue.to_bytes(2, 'big', signed = False)) - if self.isColor: - command.extend(bytes.fromhex('00000000')) - else: - addFuncAddress(command, self.geo_func) - return command - - def to_c(self): - if self.isColor: - return 'GEO_BACKGROUND_COLOR(0x' + \ - format(self.backgroundValue, '04x').upper() + '),' - else: - return 'GEO_BACKGROUND(' + \ - str(self.backgroundValue) + \ - ', ' + convertAddrToFunc(self.geo_func) + '),' + def __init__(self, isColor, backgroundValue): + self.isColor = isColor + self.backgroundValue = backgroundValue + self.geo_func = "802763D4" + self.hasDL = False + + def size(self): + return 8 + + def to_binary(self, segmentData): + command = bytearray([GEO_SET_BG, 0x00]) + command.extend(self.backgroundValue.to_bytes(2, "big", signed=False)) + if self.isColor: + command.extend(bytes.fromhex("00000000")) + else: + addFuncAddress(command, self.geo_func) + return command + + def to_c(self): + if self.isColor: + return ( + "GEO_BACKGROUND_COLOR(0x" + + format(self.backgroundValue, "04x").upper() + + ")," + ) + else: + return ( + "GEO_BACKGROUND(" + + str(self.backgroundValue) + + ", " + + convertAddrToFunc(self.geo_func) + + ")," + ) + class CustomNode: - def __init__(self, command: str, args: str): - self.command = command - self.args = args or '' # command may not have args - self.hasDL = False + def __init__(self, command: str, args: str): + self.command = command + self.args = args or "" # command may not have args + self.hasDL = False - def size(self): - return 8 + def size(self): + return 8 - def to_binary(self, segmentData): - raise PluginError('Custom Geo Nodes are not supported for binary exports.') + def to_binary(self, segmentData): + raise PluginError("Custom Geo Nodes are not supported for binary exports.") + + def to_c(self): + return f"{self.command}({self.args})," - def to_c(self): - return f"{self.command}({self.args})," class CustomAnimatedNode(BaseDisplayListNode): - def __init__(self, command: str, drawLayer, translate, rotate, dlRef: str = None): - self.command = command - self.drawLayer = drawLayer - self.hasDL = True - self.translate = translate - self.rotate = rotate - self.fMesh = None - self.DLmicrocode = None - self.dlRef = dlRef - - def size(self): - return 16 - - def get_ptr_offsets(self): - return [] - - def to_binary(self, segmentData): - raise PluginError('Custom Geo Nodes are not supported for binary exports.') - - def to_c(self): - args = [ - getDrawLayerName(self.drawLayer), - str(convertFloatToShort(self.translate[0])), - str(convertFloatToShort(self.translate[1])), - str(convertFloatToShort(self.translate[2])), - *(str(radians_to_s16(r)) for r in self.rotate.to_euler('XYZ')), - self.get_dl_name() # This node requires 'NULL' if there is no DL - ] - return f"{self.command}({join_c_args(args)})," + def __init__(self, command: str, drawLayer, translate, rotate, dlRef: str = None): + self.command = command + self.drawLayer = drawLayer + self.hasDL = True + self.translate = translate + self.rotate = rotate + self.fMesh = None + self.DLmicrocode = None + self.dlRef = dlRef + + def size(self): + return 16 + + def get_ptr_offsets(self): + return [] + + def to_binary(self, segmentData): + raise PluginError("Custom Geo Nodes are not supported for binary exports.") + + def to_c(self): + args = [ + getDrawLayerName(self.drawLayer), + str(convertFloatToShort(self.translate[0])), + str(convertFloatToShort(self.translate[1])), + str(convertFloatToShort(self.translate[2])), + *(str(radians_to_s16(r)) for r in self.rotate.to_euler("XYZ")), + self.get_dl_name(), # This node requires 'NULL' if there is no DL + ] + return f"{self.command}({join_c_args(args)})," + nodeGroupClasses = [ - StartNode, - SwitchNode, - TranslateRotateNode, - TranslateNode, - RotateNode, - DisplayListWithOffsetNode, - BillboardNode, - ShadowNode, - ScaleNode, - StartRenderAreaNode, - ScreenAreaNode, - OrthoNode, - FrustumNode, - ZBufferNode, - CameraNode, - RenderRangeNode, - CustomNode, - CustomAnimatedNode + StartNode, + SwitchNode, + TranslateRotateNode, + TranslateNode, + RotateNode, + DisplayListWithOffsetNode, + BillboardNode, + ShadowNode, + ScaleNode, + StartRenderAreaNode, + ScreenAreaNode, + OrthoNode, + FrustumNode, + ZBufferNode, + CameraNode, + RenderRangeNode, + CustomNode, + CustomAnimatedNode, ] DLNodes = [ - JumpNode, - TranslateRotateNode, - TranslateNode, - RotateNode, - ScaleNode, - DisplayListNode, - DisplayListWithOffsetNode, - CustomAnimatedNode + JumpNode, + TranslateRotateNode, + TranslateNode, + RotateNode, + ScaleNode, + DisplayListNode, + DisplayListWithOffsetNode, + CustomAnimatedNode, ] diff --git a/fast64_internal/sm64/sm64_geolayout_constants.py b/fast64_internal/sm64/sm64_geolayout_constants.py index 9ca2cee9e..fae4175d0 100644 --- a/fast64_internal/sm64/sm64_geolayout_constants.py +++ b/fast64_internal/sm64/sm64_geolayout_constants.py @@ -1,106 +1,103 @@ drawLayers = { - 'Unused' : [0, 3], - 'Solid' : 1, - 'Decal' : 2, - 'AlphaTest' : 4, - 'Blend' : 5, - 'BlendBehind' : 6 + "Unused": [0, 3], + "Solid": 1, + "Decal": 2, + "AlphaTest": 4, + "Blend": 5, + "BlendBehind": 6, } -GEO_BRANCH_STORE = 0x00 -GEO_END = 0x01 -GEO_BRANCH = 0x02 -GEO_RETURN = 0x03 -GEO_NODE_OPEN = 0x04 -GEO_NODE_CLOSE = 0x05 -GEO_SET_RENDER_AREA = 0x08 -GEO_SET_ORTHO = 0x09 +GEO_BRANCH_STORE = 0x00 +GEO_END = 0x01 +GEO_BRANCH = 0x02 +GEO_RETURN = 0x03 +GEO_NODE_OPEN = 0x04 +GEO_NODE_CLOSE = 0x05 +GEO_SET_RENDER_AREA = 0x08 +GEO_SET_ORTHO = 0x09 GEO_SET_CAMERA_FRUSTRUM = 0x0A -GEO_START = 0x0B -GEO_SET_Z_BUF = 0x0C -GEO_SET_RENDER_RANGE = 0x0D -GEO_SWITCH = 0x0E -GEO_CAMERA = 0x0F -GEO_TRANSLATE_ROTATE = 0x10 -GEO_TRANSLATE = 0x11 -GEO_ROTATE = 0x12 -GEO_LOAD_DL_W_OFFSET = 0x13 -GEO_BILLBOARD = 0x14 -GEO_LOAD_DL = 0x15 -GEO_START_W_SHADOW = 0x16 -GEO_SETUP_OBJ_RENDER = 0x17 -GEO_CALL_ASM = 0x18 -GEO_SET_BG = 0x19 -GEO_HELD_OBJECT = 0x1C -GEO_NOP = [0x1A, 0x1E, 0x1F] -GEO_SCALE = 0x1D -GEO_START_W_RENDERAREA = 0x20 +GEO_START = 0x0B +GEO_SET_Z_BUF = 0x0C +GEO_SET_RENDER_RANGE = 0x0D +GEO_SWITCH = 0x0E +GEO_CAMERA = 0x0F +GEO_TRANSLATE_ROTATE = 0x10 +GEO_TRANSLATE = 0x11 +GEO_ROTATE = 0x12 +GEO_LOAD_DL_W_OFFSET = 0x13 +GEO_BILLBOARD = 0x14 +GEO_LOAD_DL = 0x15 +GEO_START_W_SHADOW = 0x16 +GEO_SETUP_OBJ_RENDER = 0x17 +GEO_CALL_ASM = 0x18 +GEO_SET_BG = 0x19 +GEO_HELD_OBJECT = 0x1C +GEO_NOP = [0x1A, 0x1E, 0x1F] +GEO_SCALE = 0x1D +GEO_START_W_RENDERAREA = 0x20 -startCommands = [ - GEO_START, - GEO_START_W_SHADOW, - GEO_START_W_RENDERAREA -] +startCommands = [GEO_START, GEO_START_W_SHADOW, GEO_START_W_RENDERAREA] nodeGroupCmds = [ - GEO_START, - GEO_SWITCH, - GEO_TRANSLATE_ROTATE, - GEO_TRANSLATE, - GEO_ROTATE, - GEO_LOAD_DL_W_OFFSET, - GEO_BILLBOARD, - GEO_START_W_SHADOW, - GEO_SCALE, - GEO_START_W_RENDERAREA + GEO_START, + GEO_SWITCH, + GEO_TRANSLATE_ROTATE, + GEO_TRANSLATE, + GEO_ROTATE, + GEO_LOAD_DL_W_OFFSET, + GEO_BILLBOARD, + GEO_START_W_SHADOW, + GEO_SCALE, + GEO_START_W_RENDERAREA, ] nodeDeformCmds = [ - GEO_TRANSLATE_ROTATE, - GEO_TRANSLATE, - GEO_ROTATE, - GEO_LOAD_DL_W_OFFSET, - GEO_BILLBOARD, - GEO_LOAD_DL, - GEO_SCALE, + GEO_TRANSLATE_ROTATE, + GEO_TRANSLATE, + GEO_ROTATE, + GEO_LOAD_DL_W_OFFSET, + GEO_BILLBOARD, + GEO_LOAD_DL, + GEO_SCALE, ] nodeDeformCmdsBoneGroups = [ - 'TranslateRotate', - 'Translate', - 'Rotate', - 'Billboard', - 'DisplayList', - 'Scale' + "TranslateRotate", + "Translate", + "Rotate", + "Billboard", + "DisplayList", + "Scale", ] nodeCmds = [ - GEO_NODE_OPEN, - #GEO_START, - #GEO_START_W_SHADOW, - #GEO_START_W_RENDERAREA, - GEO_LOAD_DL, - GEO_LOAD_DL_W_OFFSET, - GEO_BRANCH, - #GEO_SWITCH, - #GEO_SCALE, - #GEO_TRANSLATE_ROTATE + GEO_NODE_OPEN, + # GEO_START, + # GEO_START_W_SHADOW, + # GEO_START_W_RENDERAREA, + GEO_LOAD_DL, + GEO_LOAD_DL_W_OFFSET, + GEO_BRANCH, + # GEO_SWITCH, + # GEO_SCALE, + # GEO_TRANSLATE_ROTATE ] geoCmdStatic = { - 0x04: [0x01, 0x03, 0x04, 0x05, 0x09, 0x0B, 0x0C, 0x17, 0x20], - 0x08: [0x00, 0x02, 0x0D, 0x0E, 0x12, 0x14, 0x15, 0x16, 0x18, 0x19], - 0x0C: [0x08, 0x13, 0x1C], - 0x14: [0x0F], + 0x04: [0x01, 0x03, 0x04, 0x05, 0x09, 0x0B, 0x0C, 0x17, 0x20], + 0x08: [0x00, 0x02, 0x0D, 0x0E, 0x12, 0x14, 0x15, 0x16, 0x18, 0x19], + 0x0C: [0x08, 0x13, 0x1C], + 0x14: [0x0F], } + def getGeoLayoutCmdLength(byte0, byte1): - for length, cmdList in geoCmdStatic.items(): - if byte0 in cmdList: - return length + for length, cmdList in geoCmdStatic.items(): + if byte0 in cmdList: + return length - # handle variable length - if byte0 in [0x0A]: - return 0x08 if byte1 == 0 else 0x0C - else: - raise PluginError("Unhandled geolayout command: " + hex(byte0)) + # handle variable length + if byte0 in [0x0A]: + return 0x08 if byte1 == 0 else 0x0C + else: + raise PluginError("Unhandled geolayout command: " + hex(byte0)) diff --git a/fast64_internal/sm64/sm64_geolayout_parser.py b/fast64_internal/sm64/sm64_geolayout_parser.py index 946899991..0f8a01004 100644 --- a/fast64_internal/sm64/sm64_geolayout_parser.py +++ b/fast64_internal/sm64/sm64_geolayout_parser.py @@ -13,1248 +13,1747 @@ from ..utility import * from ..panels import SM64_Panel, sm64GoalImport -blender_modes = {'OBJECT', 'BONE'} +blender_modes = {"OBJECT", "BONE"} # This geolayout parser is designed to rip armature / model. # It will only handle transform/mesh related commands. # For switch cases, only the first option will be chosen. -def parseGeoLayout(romfile, startAddress, scene, segmentData, - convertTransformMatrix, useArmature, ignoreSwitch, shadeSmooth, - f3dType, isHWv1): - currentAddress = startAddress - romfile.seek(currentAddress) - - # Create new skinned mesh - #bpy.ops.object.mode_set(mode = 'OBJECT') - mesh = bpy.data.meshes.new('skinnned-mesh') - obj = bpy.data.objects.new('skinned', mesh) - scene.collection.objects.link(obj) - createBlankMaterial(obj) - - bMesh = bmesh.new() - bMesh.from_mesh(mesh) - - # Create new armature - if useArmature: - armature = bpy.data.armatures.new('Armature') - armatureObj = bpy.data.objects.new('ArmatureObj', armature) - armatureObj.show_in_front = True - armature.show_names = True - - bpy.context.scene.collection.objects.link(armatureObj) - bpy.context.view_layer.objects.active = armatureObj - bpy.ops.object.mode_set(mode = 'EDIT') - createBoneGroups(armatureObj) - else: - armatureObj = None - - # Parse geolayout - # Pretend that command starts with an 0x04 - currentAddress, armatureMeshGroups = parseNode( - romfile, startAddress, currentAddress - 4, [0x04, 0x00], - [currentAddress], convertTransformMatrix.to_4x4(), - bMesh, obj, armatureObj, None, ignoreSwitch, False, 0, 0, - [None] * 16 * 16, f3dType, isHWv1, - segmentData = segmentData) - - armatureMeshGroups.insert(0, (armatureObj, bMesh, obj)) - - for i in range (len(armatureMeshGroups)): - listObj = armatureMeshGroups[i][2] - listBMesh = armatureMeshGroups[i][1] - listBMesh.to_mesh(listObj.data) - listBMesh.free() - listObj.data.update() - - if shadeSmooth: - if bpy.context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - bpy.ops.object.select_all(action = 'DESELECT') - listObj.select_set(True) - bpy.ops.object.shade_smooth() - - # Dont remove doubles here, as importing geolayout all at once results - # in some overlapping verts from different display lists. - # bmesh.ops.remove_doubles(bMesh, verts = bMesh.verts, dist = 0.000001) - - if useArmature: - # Set bone rotation mode. - for bone in armatureObj.pose.bones: - bone.rotation_mode = 'XYZ' - - for i in range(len(armatureMeshGroups)): - obj = armatureMeshGroups[i][2] - switchArmatureObj = armatureMeshGroups[i][0] - # Apply mesh to armature. - if bpy.context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - bpy.ops.object.select_all(action = 'DESELECT') - obj.select_set(True) - switchArmatureObj.select_set(True) - bpy.context.view_layer.objects.active = switchArmatureObj - bpy.ops.object.parent_set(type = "ARMATURE") - switchArmatureObj.matrix_world = switchArmatureObj.matrix_world @ \ - mathutils.Matrix.Translation(mathutils.Vector((3*i, 0 ,0))) - - - # Make Mario face forward. - #bpy.ops.object.select_all(action = 'DESELECT') - #armatureObj.select_set(True) - #bpy.ops.transform.rotate(value = math.radians(-90), orient_axis = 'X') - #bpy.ops.object.transform_apply() - - - if useArmature: - armatureObj.data.layers[1] = True - - ''' + +def parseGeoLayout( + romfile, + startAddress, + scene, + segmentData, + convertTransformMatrix, + useArmature, + ignoreSwitch, + shadeSmooth, + f3dType, + isHWv1, +): + currentAddress = startAddress + romfile.seek(currentAddress) + + # Create new skinned mesh + # bpy.ops.object.mode_set(mode = 'OBJECT') + mesh = bpy.data.meshes.new("skinnned-mesh") + obj = bpy.data.objects.new("skinned", mesh) + scene.collection.objects.link(obj) + createBlankMaterial(obj) + + bMesh = bmesh.new() + bMesh.from_mesh(mesh) + + # Create new armature + if useArmature: + armature = bpy.data.armatures.new("Armature") + armatureObj = bpy.data.objects.new("ArmatureObj", armature) + armatureObj.show_in_front = True + armature.show_names = True + + bpy.context.scene.collection.objects.link(armatureObj) + bpy.context.view_layer.objects.active = armatureObj + bpy.ops.object.mode_set(mode="EDIT") + createBoneGroups(armatureObj) + else: + armatureObj = None + + # Parse geolayout + # Pretend that command starts with an 0x04 + currentAddress, armatureMeshGroups = parseNode( + romfile, + startAddress, + currentAddress - 4, + [0x04, 0x00], + [currentAddress], + convertTransformMatrix.to_4x4(), + bMesh, + obj, + armatureObj, + None, + ignoreSwitch, + False, + 0, + 0, + [None] * 16 * 16, + f3dType, + isHWv1, + segmentData=segmentData, + ) + + armatureMeshGroups.insert(0, (armatureObj, bMesh, obj)) + + for i in range(len(armatureMeshGroups)): + listObj = armatureMeshGroups[i][2] + listBMesh = armatureMeshGroups[i][1] + listBMesh.to_mesh(listObj.data) + listBMesh.free() + listObj.data.update() + + if shadeSmooth: + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + bpy.ops.object.select_all(action="DESELECT") + listObj.select_set(True) + bpy.ops.object.shade_smooth() + + # Dont remove doubles here, as importing geolayout all at once results + # in some overlapping verts from different display lists. + # bmesh.ops.remove_doubles(bMesh, verts = bMesh.verts, dist = 0.000001) + + if useArmature: + # Set bone rotation mode. + for bone in armatureObj.pose.bones: + bone.rotation_mode = "XYZ" + + for i in range(len(armatureMeshGroups)): + obj = armatureMeshGroups[i][2] + switchArmatureObj = armatureMeshGroups[i][0] + # Apply mesh to armature. + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + bpy.ops.object.select_all(action="DESELECT") + obj.select_set(True) + switchArmatureObj.select_set(True) + bpy.context.view_layer.objects.active = switchArmatureObj + bpy.ops.object.parent_set(type="ARMATURE") + switchArmatureObj.matrix_world = ( + switchArmatureObj.matrix_world + @ mathutils.Matrix.Translation(mathutils.Vector((3 * i, 0, 0))) + ) + + # Make Mario face forward. + # bpy.ops.object.select_all(action = 'DESELECT') + # armatureObj.select_set(True) + # bpy.ops.transform.rotate(value = math.radians(-90), orient_axis = 'X') + # bpy.ops.object.transform_apply() + + if useArmature: + armatureObj.data.layers[1] = True + + """ if useMetarig: metaBones = [bone for bone in armatureObj.data.bones if \ bone.layers[boneLayers['meta']] or bone.layers[boneLayers['visual']]] for bone in metaBones: addBoneToGroup(armatureObj, bone.name, 'Ignore') - ''' - return armatureMeshGroups, armatureObj + """ + return armatureMeshGroups, armatureObj + # Every node is passed in the address of its OWN command. # Every node returns the address AFTER the end of its processing extent. # Make sure to NOT create blender objects if the node is being ignored. -def parseNode(romfile, geoStartAddress, currentAddress, currentCmd, jumps, - currentTransform, bMesh, obj, armatureObj, parentBoneName, ignoreSwitch, ignoreNode, switchLevel, switchCount, - vertexBuffer, f3dType, isHWv1, singleChild = False, - endCmd = GEO_NODE_CLOSE, segmentData = None): - print("NODE " + hex(currentAddress)) - currentTransform = copy.deepcopy(currentTransform) - originalTransform = copy.deepcopy(currentTransform) - currentAddress += getGeoLayoutCmdLength(*currentCmd) - romfile.seek(currentAddress) - currentCmd = romfile.read(2) - armatureMeshGroups = [] - - # True if at least one complete node processed. - # This is used for switch cases. - nodeProcessed = False - - # True when a complete node group is processed. - # Certain commands like 0x13 will be grouped with a proceeding 0x4 commmand. - # However, they will stand individually if this is not the case. - # This distinction is important when handling switch cases. - completeNodeProcessed = False - - # In the case of branches in switches we must treat the branch as one option, - # not just the first node that is being branched to. - # We cannot treat a branch as a node because some branches don't return. - singleChildStack = [singleChild] - switchActive = False - localSwitchCount = 0 - - # a 0x13 command creates a bone, but we only use it as a parent if - # a 0x4 command follows. If another 0x13 command follows, we don't use it. - nextParentBoneName = parentBoneName - nextParentTransform = copy.deepcopy(currentTransform) - nodeIndex = [0] - while currentCmd[0] is not endCmd and currentCmd[0] is not GEO_END: - isSwitchOption = singleChildStack[-1] and nodeProcessed and \ - completeNodeProcessed - - # Create a separate sub-armature for switch options. - if isSwitchOption: - switchCount += 1 - localSwitchCount += 1 - if ignoreSwitch: - ignoreNode = True - if not ignoreNode: - parentBoneName, armatureMeshTuple, currentTransform, \ - nextParentTransform = \ - createSwitchOption(armatureObj, parentBoneName, - format(nodeIndex[-1], '03') + '-switch_option', currentTransform, nextParentTransform, - switchLevel, switchCount) - armatureMeshGroups.append(armatureMeshTuple) - obj = armatureMeshTuple[2] - bMesh = armatureMeshTuple[1] - nextParentBoneName = parentBoneName - armatureObj = armatureMeshTuple[0] - switchLevel = switchCount - - if currentCmd[0] == GEO_BRANCH_STORE and not ignoreNode: #0x00 - currentAddress = parseBranchStore(romfile, currentCmd, currentAddress, - jumps, segmentData = segmentData) - singleChildStack.append(False) - nodeIndex.append(0) - elif currentCmd[0] == GEO_BRANCH and not ignoreNode: # 0x02 - currentAddress = parseBranch(romfile, currentCmd, currentAddress, - jumps, segmentData = segmentData) - singleChildStack.append(False) - nodeIndex.append(0) - - elif currentCmd[0] == GEO_RETURN and not ignoreNode: # 0x03 - currentAddress = parseReturn( - currentCmd, currentAddress, jumps) - singleChildStack = singleChildStack[:-1] - nodeIndex = nodeIndex[:-1] - - elif currentCmd[0] == GEO_NODE_OPEN: # 0x04 - #print(str(switchCount) + " - " + str(localSwitchCount) + " - " + \ - # str(switchLevel)) - currentAddress, newArmatureMeshGroups = \ - parseNode(romfile, geoStartAddress, currentAddress, - currentCmd, jumps, nextParentTransform, bMesh, obj, - armatureObj, nextParentBoneName, ignoreSwitch, ignoreNode, - switchLevel, switchCount, - vertexBuffer, f3dType, isHWv1, - singleChild = switchActive, segmentData = segmentData) - armatureMeshGroups.extend(newArmatureMeshGroups) - switchActive = False - nextParentTransform = copy.deepcopy(currentTransform) - - elif currentCmd[0] == GEO_START: # 0x0B - currentAddress, nextParentBoneName, nextParentTransform = \ - parseStart(romfile, currentAddress, currentTransform, - armatureObj, parentBoneName, ignoreNode, nodeIndex[-1], - segmentData) - - elif currentCmd[0] == GEO_SWITCH: # 0x0E - currentAddress, nextParentBoneName = \ - parseSwitch(romfile, currentAddress, - currentTransform, armatureObj, parentBoneName, ignoreNode, - nodeIndex[-1], segmentData) - switchActive = True - - # We skip translate/rotate/scale nodes if before the first 0x13 node. - # This allows us to import model animations without having to transform keyframes. - elif currentCmd[0] == GEO_TRANSLATE_ROTATE: #0x10 - currentAddress, nextParentBoneName, nextParentTransform = \ - parseTranslateRotate(romfile, - currentAddress, currentCmd, currentTransform, - bMesh, obj, armatureObj, parentBoneName, ignoreNode, - nodeIndex[-1], segmentData, vertexBuffer, - f3dType, isHWv1) - - elif currentCmd[0] == GEO_TRANSLATE: #0x11 - currentAddress, nextParentBoneName, nextParentTransform = \ - parseTranslate(romfile, - currentAddress, currentCmd, currentTransform, - bMesh, obj, armatureObj, parentBoneName, ignoreNode, - nodeIndex[-1],segmentData, vertexBuffer, - f3dType, isHWv1) - - elif currentCmd[0] == GEO_ROTATE: # 0x12 - currentAddress, nextParentBoneName, nextParentTransform = \ - parseRotate(romfile, - currentAddress, currentCmd, currentTransform, - bMesh, obj, armatureObj, parentBoneName, ignoreNode, - nodeIndex[-1],segmentData, vertexBuffer, - f3dType, isHWv1) - - elif currentCmd[0] == GEO_LOAD_DL_W_OFFSET: # 0x13 - currentAddress, nextParentBoneName, nextParentTransform = \ - parseDLWithOffset(romfile, - currentAddress, currentTransform, bMesh, obj, armatureObj, - parentBoneName, ignoreNode, nodeIndex[-1], - currentCmd, segmentData, vertexBuffer, - f3dType, isHWv1) - - elif currentCmd[0] == GEO_BILLBOARD: # 0x14 - currentAddress, nextParentBoneName, nextParentTransform = \ - parseBillboard(romfile, currentAddress, - currentCmd, currentTransform, bMesh, obj, - armatureObj, parentBoneName, ignoreNode, nodeIndex[-1], - segmentData, vertexBuffer, - f3dType, isHWv1) - - elif currentCmd[0] == GEO_LOAD_DL: # 0x15 - currentAddress = parseDL(romfile, currentAddress, - currentTransform, bMesh, obj, armatureObj, - parentBoneName, ignoreNode, currentCmd, - nodeIndex[-1], segmentData, vertexBuffer, f3dType, isHWv1) - - elif currentCmd[0] == GEO_START_W_SHADOW: # 0x16 - currentAddress, nextParentBoneName, nextParentTransform = \ - parseShadow(romfile, currentAddress, - currentTransform, armatureObj, parentBoneName, ignoreNode, - nodeIndex[-1], segmentData) - - elif currentCmd[0] == GEO_CALL_ASM: # 0x18 - currentAddress = parseFunction(romfile, currentAddress, - currentTransform, armatureObj, parentBoneName, ignoreNode, - nodeIndex[-1], segmentData) - - elif currentCmd[0] == GEO_HELD_OBJECT: # 0x1C - currentAddress, nextParentTransform = \ - parseHeldObject(romfile, currentAddress, - currentTransform, armatureObj, parentBoneName, ignoreNode, - nodeIndex[-1], segmentData) - - elif currentCmd[0] == GEO_SCALE: # 0x1D - currentAddress, nextParentBoneName, nextParentTransform = \ - parseScale(romfile, - currentAddress, currentCmd, currentTransform, - bMesh, obj, armatureObj, parentBoneName, ignoreNode, nodeIndex[-1], segmentData, vertexBuffer, - f3dType, isHWv1) - - elif currentCmd[0] == GEO_START_W_RENDERAREA: # 0x20 - currentAddress, nextParentBoneName, nextParentTransform = \ - parseStartWithRenderArea(romfile, currentAddress, - currentTransform, armatureObj, parentBoneName, ignoreNode, - nodeIndex[-1], segmentData) - - else: - currentAddress += getGeoLayoutCmdLength(*currentCmd) - print("Unhandled command: " + hex(currentCmd[0])) - - nodeIndex[-1] += 1 - - romfile.seek(currentAddress) - previousCmdType = currentCmd[0] - currentCmd = romfile.read(2) - - if previousCmdType not in nodeGroupCmds or \ - currentCmd[0] != GEO_NODE_OPEN: - completeNodeProcessed = True - nodeProcessed = True - else: - completeNodeProcessed = False - - if currentCmd[0] == GEO_END: - currentAddress = jumps.pop() - else: - currentAddress += getGeoLayoutCmdLength(*currentCmd) - return currentAddress, armatureMeshGroups +def parseNode( + romfile, + geoStartAddress, + currentAddress, + currentCmd, + jumps, + currentTransform, + bMesh, + obj, + armatureObj, + parentBoneName, + ignoreSwitch, + ignoreNode, + switchLevel, + switchCount, + vertexBuffer, + f3dType, + isHWv1, + singleChild=False, + endCmd=GEO_NODE_CLOSE, + segmentData=None, +): + print("NODE " + hex(currentAddress)) + currentTransform = copy.deepcopy(currentTransform) + originalTransform = copy.deepcopy(currentTransform) + currentAddress += getGeoLayoutCmdLength(*currentCmd) + romfile.seek(currentAddress) + currentCmd = romfile.read(2) + armatureMeshGroups = [] + + # True if at least one complete node processed. + # This is used for switch cases. + nodeProcessed = False + + # True when a complete node group is processed. + # Certain commands like 0x13 will be grouped with a proceeding 0x4 commmand. + # However, they will stand individually if this is not the case. + # This distinction is important when handling switch cases. + completeNodeProcessed = False + + # In the case of branches in switches we must treat the branch as one option, + # not just the first node that is being branched to. + # We cannot treat a branch as a node because some branches don't return. + singleChildStack = [singleChild] + switchActive = False + localSwitchCount = 0 + + # a 0x13 command creates a bone, but we only use it as a parent if + # a 0x4 command follows. If another 0x13 command follows, we don't use it. + nextParentBoneName = parentBoneName + nextParentTransform = copy.deepcopy(currentTransform) + nodeIndex = [0] + while currentCmd[0] is not endCmd and currentCmd[0] is not GEO_END: + isSwitchOption = ( + singleChildStack[-1] and nodeProcessed and completeNodeProcessed + ) + + # Create a separate sub-armature for switch options. + if isSwitchOption: + switchCount += 1 + localSwitchCount += 1 + if ignoreSwitch: + ignoreNode = True + if not ignoreNode: + ( + parentBoneName, + armatureMeshTuple, + currentTransform, + nextParentTransform, + ) = createSwitchOption( + armatureObj, + parentBoneName, + format(nodeIndex[-1], "03") + "-switch_option", + currentTransform, + nextParentTransform, + switchLevel, + switchCount, + ) + armatureMeshGroups.append(armatureMeshTuple) + obj = armatureMeshTuple[2] + bMesh = armatureMeshTuple[1] + nextParentBoneName = parentBoneName + armatureObj = armatureMeshTuple[0] + switchLevel = switchCount + + if currentCmd[0] == GEO_BRANCH_STORE and not ignoreNode: # 0x00 + currentAddress = parseBranchStore( + romfile, currentCmd, currentAddress, jumps, segmentData=segmentData + ) + singleChildStack.append(False) + nodeIndex.append(0) + elif currentCmd[0] == GEO_BRANCH and not ignoreNode: # 0x02 + currentAddress = parseBranch( + romfile, currentCmd, currentAddress, jumps, segmentData=segmentData + ) + singleChildStack.append(False) + nodeIndex.append(0) + + elif currentCmd[0] == GEO_RETURN and not ignoreNode: # 0x03 + currentAddress = parseReturn(currentCmd, currentAddress, jumps) + singleChildStack = singleChildStack[:-1] + nodeIndex = nodeIndex[:-1] + + elif currentCmd[0] == GEO_NODE_OPEN: # 0x04 + # print(str(switchCount) + " - " + str(localSwitchCount) + " - " + \ + # str(switchLevel)) + currentAddress, newArmatureMeshGroups = parseNode( + romfile, + geoStartAddress, + currentAddress, + currentCmd, + jumps, + nextParentTransform, + bMesh, + obj, + armatureObj, + nextParentBoneName, + ignoreSwitch, + ignoreNode, + switchLevel, + switchCount, + vertexBuffer, + f3dType, + isHWv1, + singleChild=switchActive, + segmentData=segmentData, + ) + armatureMeshGroups.extend(newArmatureMeshGroups) + switchActive = False + nextParentTransform = copy.deepcopy(currentTransform) + + elif currentCmd[0] == GEO_START: # 0x0B + currentAddress, nextParentBoneName, nextParentTransform = parseStart( + romfile, + currentAddress, + currentTransform, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex[-1], + segmentData, + ) + + elif currentCmd[0] == GEO_SWITCH: # 0x0E + currentAddress, nextParentBoneName = parseSwitch( + romfile, + currentAddress, + currentTransform, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex[-1], + segmentData, + ) + switchActive = True + + # We skip translate/rotate/scale nodes if before the first 0x13 node. + # This allows us to import model animations without having to transform keyframes. + elif currentCmd[0] == GEO_TRANSLATE_ROTATE: # 0x10 + ( + currentAddress, + nextParentBoneName, + nextParentTransform, + ) = parseTranslateRotate( + romfile, + currentAddress, + currentCmd, + currentTransform, + bMesh, + obj, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex[-1], + segmentData, + vertexBuffer, + f3dType, + isHWv1, + ) + + elif currentCmd[0] == GEO_TRANSLATE: # 0x11 + currentAddress, nextParentBoneName, nextParentTransform = parseTranslate( + romfile, + currentAddress, + currentCmd, + currentTransform, + bMesh, + obj, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex[-1], + segmentData, + vertexBuffer, + f3dType, + isHWv1, + ) + + elif currentCmd[0] == GEO_ROTATE: # 0x12 + currentAddress, nextParentBoneName, nextParentTransform = parseRotate( + romfile, + currentAddress, + currentCmd, + currentTransform, + bMesh, + obj, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex[-1], + segmentData, + vertexBuffer, + f3dType, + isHWv1, + ) + + elif currentCmd[0] == GEO_LOAD_DL_W_OFFSET: # 0x13 + currentAddress, nextParentBoneName, nextParentTransform = parseDLWithOffset( + romfile, + currentAddress, + currentTransform, + bMesh, + obj, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex[-1], + currentCmd, + segmentData, + vertexBuffer, + f3dType, + isHWv1, + ) + + elif currentCmd[0] == GEO_BILLBOARD: # 0x14 + currentAddress, nextParentBoneName, nextParentTransform = parseBillboard( + romfile, + currentAddress, + currentCmd, + currentTransform, + bMesh, + obj, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex[-1], + segmentData, + vertexBuffer, + f3dType, + isHWv1, + ) + + elif currentCmd[0] == GEO_LOAD_DL: # 0x15 + currentAddress = parseDL( + romfile, + currentAddress, + currentTransform, + bMesh, + obj, + armatureObj, + parentBoneName, + ignoreNode, + currentCmd, + nodeIndex[-1], + segmentData, + vertexBuffer, + f3dType, + isHWv1, + ) + + elif currentCmd[0] == GEO_START_W_SHADOW: # 0x16 + currentAddress, nextParentBoneName, nextParentTransform = parseShadow( + romfile, + currentAddress, + currentTransform, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex[-1], + segmentData, + ) + + elif currentCmd[0] == GEO_CALL_ASM: # 0x18 + currentAddress = parseFunction( + romfile, + currentAddress, + currentTransform, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex[-1], + segmentData, + ) + + elif currentCmd[0] == GEO_HELD_OBJECT: # 0x1C + currentAddress, nextParentTransform = parseHeldObject( + romfile, + currentAddress, + currentTransform, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex[-1], + segmentData, + ) + + elif currentCmd[0] == GEO_SCALE: # 0x1D + currentAddress, nextParentBoneName, nextParentTransform = parseScale( + romfile, + currentAddress, + currentCmd, + currentTransform, + bMesh, + obj, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex[-1], + segmentData, + vertexBuffer, + f3dType, + isHWv1, + ) + + elif currentCmd[0] == GEO_START_W_RENDERAREA: # 0x20 + ( + currentAddress, + nextParentBoneName, + nextParentTransform, + ) = parseStartWithRenderArea( + romfile, + currentAddress, + currentTransform, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex[-1], + segmentData, + ) + + else: + currentAddress += getGeoLayoutCmdLength(*currentCmd) + print("Unhandled command: " + hex(currentCmd[0])) + + nodeIndex[-1] += 1 + + romfile.seek(currentAddress) + previousCmdType = currentCmd[0] + currentCmd = romfile.read(2) + + if previousCmdType not in nodeGroupCmds or currentCmd[0] != GEO_NODE_OPEN: + completeNodeProcessed = True + nodeProcessed = True + else: + completeNodeProcessed = False + + if currentCmd[0] == GEO_END: + currentAddress = jumps.pop() + else: + currentAddress += getGeoLayoutCmdLength(*currentCmd) + return currentAddress, armatureMeshGroups + def generateMetarig(armatureObj): - startBones = findStartBones(armatureObj) - createBoneGroups(armatureObj) - for boneName in startBones: - traverseArmatureForMetarig(armatureObj, boneName, None) - armatureObj.data.layers = createBoneLayerMask([boneLayers['visual']]) - if bpy.context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = "OBJECT") + startBones = findStartBones(armatureObj) + createBoneGroups(armatureObj) + for boneName in startBones: + traverseArmatureForMetarig(armatureObj, boneName, None) + armatureObj.data.layers = createBoneLayerMask([boneLayers["visual"]]) + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + def traverseArmatureForMetarig(armatureObj, boneName, parentName): - if bpy.context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = "OBJECT") - poseBone = armatureObj.pose.bones[boneName] - if poseBone.bone_group is None: - processBoneMeta(armatureObj, boneName, parentName) - elif poseBone.bone_group.name == 'Ignore': - return - - poseBone = armatureObj.pose.bones[boneName] - nextParentName = boneName if poseBone.bone_group is None else parentName - childrenNames = [child.name for child in poseBone.children] - for childName in childrenNames: - traverseArmatureForMetarig(armatureObj, childName, nextParentName) + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + poseBone = armatureObj.pose.bones[boneName] + if poseBone.bone_group is None: + processBoneMeta(armatureObj, boneName, parentName) + elif poseBone.bone_group.name == "Ignore": + return + + poseBone = armatureObj.pose.bones[boneName] + nextParentName = boneName if poseBone.bone_group is None else parentName + childrenNames = [child.name for child in poseBone.children] + for childName in childrenNames: + traverseArmatureForMetarig(armatureObj, childName, nextParentName) + def processBoneMeta(armatureObj, boneName, parentName): - bpy.ops.object.mode_set(mode = "EDIT") - bone = armatureObj.data.edit_bones[boneName] - - # create meta bone, which the actual bone copies the rotation of - metabone = armatureObj.data.edit_bones.new("meta_" + boneName) - metabone.use_connect = False - metabone.head = bone.head - metabone.tail = bone.tail - metabone.roll = bone.roll - - # create visual bone, which visually connect parent bone to child - visualBone = armatureObj.data.edit_bones.new("vis_" + boneName) - visualBone.use_connect = False - visualBone.head = bone.head - visualBone.tail = bone.head + sm64BoneUp * 0.2 - metabone.parent = visualBone - - metaboneName = metabone.name - visualBoneName = visualBone.name - - if bpy.context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - poseBone = armatureObj.pose.bones[boneName] - metabonePose = armatureObj.pose.bones[metaboneName] - visualBonePose = armatureObj.pose.bones[visualBoneName] - - metabone = armatureObj.data.bones[metaboneName] - visualBone = armatureObj.data.bones[visualBoneName] - metabone.geo_cmd = 'Ignore' - visualBone.geo_cmd = 'Ignore' - - # apply rotation constraint - constraint = poseBone.constraints.new(type = "COPY_ROTATION") - constraint.target = armatureObj - constraint.subtarget = metaboneName - - translateConstraint = poseBone.constraints.new(type = "COPY_LOCATION") - translateConstraint.target = armatureObj - translateConstraint.subtarget = metaboneName - - metabone.layers = createBoneLayerMask([boneLayers['meta']]) - metabone.use_deform = False - metabonePose.lock_rotation = (True, True, True) - - visualBone.layers = createBoneLayerMask([boneLayers['visual']]) - visualBone.use_deform = False - - metabonePose.bone_group_index = getBoneGroupIndex(armatureObj, 'Ignore') - visualBonePose.bone_group_index = getBoneGroupIndex(armatureObj, 'Ignore') - - bpy.ops.object.mode_set(mode = 'EDIT') - metabone = armatureObj.data.edit_bones[metaboneName] - visualBone = armatureObj.data.edit_bones[visualBoneName] - - if parentName is not None: - parentVisualBone = \ - armatureObj.data.edit_bones["vis_" + parentName] - parentVisualBoneName = parentVisualBone.name - visualChildren = [child for child in parentVisualBone.children if\ - child.name[:5] != 'meta_'] - print(str(parentVisualBoneName) + " " + str([child.name for child in parentVisualBone.children])) - if len(visualChildren) == 0: - print("Zero children: " + str(visualBone.name)) - parentVisualBone.tail = visualBone.head - if parentVisualBone.length < 0.00001: - parentVisualBone.tail = parentVisualBone.head + sm64BoneUp * 0.1 - else: - visualBone.use_connect = True - visualBone.parent = parentVisualBone - - else: - print("Some children: " + str(visualBone.name) + " " + str([child.name for child in visualChildren])) - # If multiple children, make parent bone a "straight upward" - # bone, then add "connection" bones to connect children to parent - for child in visualChildren: - #if parentVisualBone.vector.angle(sm64BoneUp, 1) > 0.0001: - child.use_connect = False - parentVisualBone.tail = parentVisualBone.head + \ - sm64BoneUp * 0.2 - #createConnectBone(armatureObj, child.name, parentVisualBoneName) - visualBone = armatureObj.data.edit_bones[visualBoneName] - parentVisualBone = armatureObj.data.edit_bones[parentVisualBoneName] - #createConnectBone(armatureObj, visualBone.name, - # parentVisualBone.name) - visualBone.use_connect = False - visualBone.parent = parentVisualBone - else: - pass # connect to root anim bone + bpy.ops.object.mode_set(mode="EDIT") + bone = armatureObj.data.edit_bones[boneName] + + # create meta bone, which the actual bone copies the rotation of + metabone = armatureObj.data.edit_bones.new("meta_" + boneName) + metabone.use_connect = False + metabone.head = bone.head + metabone.tail = bone.tail + metabone.roll = bone.roll + + # create visual bone, which visually connect parent bone to child + visualBone = armatureObj.data.edit_bones.new("vis_" + boneName) + visualBone.use_connect = False + visualBone.head = bone.head + visualBone.tail = bone.head + sm64BoneUp * 0.2 + metabone.parent = visualBone + + metaboneName = metabone.name + visualBoneName = visualBone.name + + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + poseBone = armatureObj.pose.bones[boneName] + metabonePose = armatureObj.pose.bones[metaboneName] + visualBonePose = armatureObj.pose.bones[visualBoneName] + + metabone = armatureObj.data.bones[metaboneName] + visualBone = armatureObj.data.bones[visualBoneName] + metabone.geo_cmd = "Ignore" + visualBone.geo_cmd = "Ignore" + + # apply rotation constraint + constraint = poseBone.constraints.new(type="COPY_ROTATION") + constraint.target = armatureObj + constraint.subtarget = metaboneName + + translateConstraint = poseBone.constraints.new(type="COPY_LOCATION") + translateConstraint.target = armatureObj + translateConstraint.subtarget = metaboneName + + metabone.layers = createBoneLayerMask([boneLayers["meta"]]) + metabone.use_deform = False + metabonePose.lock_rotation = (True, True, True) + + visualBone.layers = createBoneLayerMask([boneLayers["visual"]]) + visualBone.use_deform = False + + metabonePose.bone_group_index = getBoneGroupIndex(armatureObj, "Ignore") + visualBonePose.bone_group_index = getBoneGroupIndex(armatureObj, "Ignore") + + bpy.ops.object.mode_set(mode="EDIT") + metabone = armatureObj.data.edit_bones[metaboneName] + visualBone = armatureObj.data.edit_bones[visualBoneName] + + if parentName is not None: + parentVisualBone = armatureObj.data.edit_bones["vis_" + parentName] + parentVisualBoneName = parentVisualBone.name + visualChildren = [ + child for child in parentVisualBone.children if child.name[:5] != "meta_" + ] + print( + str(parentVisualBoneName) + + " " + + str([child.name for child in parentVisualBone.children]) + ) + if len(visualChildren) == 0: + print("Zero children: " + str(visualBone.name)) + parentVisualBone.tail = visualBone.head + if parentVisualBone.length < 0.00001: + parentVisualBone.tail = parentVisualBone.head + sm64BoneUp * 0.1 + else: + visualBone.use_connect = True + visualBone.parent = parentVisualBone + + else: + print( + "Some children: " + + str(visualBone.name) + + " " + + str([child.name for child in visualChildren]) + ) + # If multiple children, make parent bone a "straight upward" + # bone, then add "connection" bones to connect children to parent + for child in visualChildren: + # if parentVisualBone.vector.angle(sm64BoneUp, 1) > 0.0001: + child.use_connect = False + parentVisualBone.tail = parentVisualBone.head + sm64BoneUp * 0.2 + # createConnectBone(armatureObj, child.name, parentVisualBoneName) + visualBone = armatureObj.data.edit_bones[visualBoneName] + parentVisualBone = armatureObj.data.edit_bones[parentVisualBoneName] + # createConnectBone(armatureObj, visualBone.name, + # parentVisualBone.name) + visualBone.use_connect = False + visualBone.parent = parentVisualBone + else: + pass # connect to root anim bone + def createConnectBone(armatureObj, childName, parentName): - child = armatureObj.data.edit_bones[childName] - parent = armatureObj.data.edit_bones[parentName] - - connectBone = armatureObj.data.edit_bones.new( - "connect_" + child.name) - connectBoneName = connectBone.name - connectBone.head = parent.head - connectBone.use_connect = False - connectBone.parent = parent - connectBone.tail = child.head - child.use_connect = False - connectBone.use_deform = False - child.parent = connectBone - if (connectBone.head - connectBone.tail).length < 0.0001: - connectBone.tail = connectBone.head + sm64BoneUp * 0.2 - else: - child.use_connect = True - - if bpy.context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - connectPoseBone = armatureObj.pose.bones[connectBoneName] - connectBone = armatureObj.data.bones[connectBoneName] - connectBone.layers = createBoneLayerMask([boneLayers['visual']]) - connectPoseBone.bone_group_index = \ - getBoneGroupIndex(armatureObj, 'Ignore') - connectPoseBone.lock_rotation = (True, True, True) - bpy.ops.object.mode_set(mode = 'EDIT') - -def createBone(armatureObj, parentBoneName, boneName, currentTransform, - boneGroup, loadDL): - if bpy.context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode="OBJECT") - bpy.ops.object.select_all(action = 'DESELECT') - bpy.context.view_layer.objects.active = armatureObj - bpy.ops.object.mode_set(mode="EDIT") - bone = armatureObj.data.edit_bones.new(boneName) - bone.use_connect = False - if parentBoneName is not None: - bone.parent = armatureObj.data.edit_bones[parentBoneName] - bone.head = currentTransform @ mathutils.Vector((0,0,0)) - bone.tail = bone.head + (currentTransform.to_quaternion() @ \ - mathutils.Vector((0,1,0))* \ - (0.2 if boneGroup != 'DisplayList' else 0.1)) - - # Connect bone to parent if it is possible without changing parent direction. - - if parentBoneName is not None: - nodeOffsetVector = mathutils.Vector(bone.head - bone.parent.head) - # set fallback to nonzero to avoid creating zero length bones - if(nodeOffsetVector.angle(bone.parent.tail - bone.parent.head, 1) \ - < 0.0001 and loadDL): - for child in bone.parent.children: - if child != bone: - child.use_connect = False - bone.parent.tail = bone.head - bone.use_connect = True - elif bone.head == bone.parent.head and bone.tail == bone.parent.tail: - bone.tail += currentTransform.to_quaternion() @ mathutils.Vector((0,1,0)) * 0.02 - - boneName = bone.name - addBoneToGroup(armatureObj, bone.name, boneGroup) - bone = armatureObj.data.bones[boneName] - bone.geo_cmd = boneGroup if boneGroup is not None else \ - 'DisplayListWithOffset' - - return boneName - -def createSwitchOption(armatureObj, switchBoneName, boneName, currentTransform, - nextParentTransform, switchLevel, switchCount): - bpy.ops.object.mode_set(mode="OBJECT") - bpy.ops.object.select_all(action = 'DESELECT') - #bpy.context.view_layer.objects.active = armatureObj - #bpy.ops.object.mode_set(mode="EDIT") - #bone = armatureObj.data.edit_bones.new(boneName) - #bone.use_connect = False - - # calculate transform - translation = mathutils.Matrix.Translation( - mathutils.Vector((0,3 * (switchCount - switchLevel),0))) - translation = mathutils.Matrix.Translation((0,0,0)) - finalTransform = translation @ currentTransform - finalNextParentTransform = translation @ nextParentTransform - - # create armature - armature = bpy.data.armatures.new('Armature') - switchArmature = bpy.data.objects.new('armature_' + boneName, armature) - switchArmature.show_in_front = True - armature.show_names = True - - bpy.context.scene.collection.objects.link(switchArmature) - bpy.ops.object.mode_set(mode = 'POSE') - bpy.ops.object.mode_set(mode = 'OBJECT') - createBoneGroups(switchArmature) - bpy.context.view_layer.objects.active = switchArmature - #switchArmature.matrix_world = mathutils.Matrix.Translation( - # finalTransform.to_translation()) - bpy.ops.object.mode_set(mode = 'EDIT') - - # create switch option bone - bone = switchArmature.data.edit_bones.new(boneName) - bone.use_connect = False - bone.head = finalTransform @ mathutils.Vector((0,0,0)) - bone.tail = bone.head + currentTransform.to_quaternion() @ \ - mathutils.Vector((0,1,0)) * 0.2 - - boneName = bone.name - bpy.ops.object.mode_set(mode='OBJECT') - bone = switchArmature.data.bones[boneName] - #poseBone = switchArmature.pose.bones[boneName] - switchBone = armatureObj.data.bones[switchBoneName] - - #rotConstraint = poseBone.constraints.new(type = 'COPY_ROTATION') - #rotConstraint.target = armatureObj - #rotConstraint.subtarget = switchBone.name - - bone.geo_cmd = 'SwitchOption' - - #switchOption = switchBone.switch_options.add() - #switchOption.switchType = 'Mesh' - #switchOption.optionArmature = switchArmature - - # Create new mesh as well - mesh = bpy.data.meshes.new('skinnned-mesh') - obj = bpy.data.objects.new('skinned', mesh) - bpy.context.scene.collection.objects.link(obj) - obj.matrix_world = switchArmature.matrix_world - #material = createF3DMat(obj) - #material.node_tree.nodes['Case A 1'].inA = '1' - #material.set_env = False - - bMesh = bmesh.new() - bMesh.from_mesh(mesh) - - addBoneToGroup(switchArmature, boneName, 'SwitchOption') - - return boneName, (switchArmature, bMesh, obj), finalTransform, \ - finalNextParentTransform - -def parseSwitch(romfile, currentAddress, currentTransform, - armatureObj, parentBoneName, ignoreNode, nodeIndex, - segmentData): - print("SWITCH " + hex(currentAddress)) - - commandSize = 8 - - if not ignoreNode: - romfile.seek(currentAddress) - command = romfile.read(commandSize) - funcParam = int.from_bytes(command[2:4], 'big', signed = True) - switchFunc = bytesToHexClean(command[4:8]) - - boneName = format(nodeIndex, '03') + "-switch" - if armatureObj is not None: - boneName = createBone(armatureObj, parentBoneName, boneName, - currentTransform, 'Switch', False) - bone = armatureObj.data.bones[boneName] - bone.geo_func = switchFunc - bone.func_param = funcParam - else: - boneName = None - - currentAddress += commandSize - return currentAddress, boneName - -def parseDL(romfile, currentAddress, currentTransform, bMesh, obj, armatureObj, - parentBoneName, ignoreNode, currentCmd, nodeIndex, segmentData, vertexBuffer, f3dType, isHWv1): - - drawLayer = bitMask(currentCmd[1], 0, 4) - - romfile.seek(currentAddress) - commandSize = 8 - command = romfile.read(commandSize) - - if not ignoreNode: - boneName = handleNodeCommon(romfile, armatureObj, parentBoneName, - currentTransform, True, command, segmentData, bMesh, obj, - nodeIndex, 'DisplayList', vertexBuffer, - f3dType, isHWv1) - if armatureObj is not None: - bone = armatureObj.data.bones[boneName] - bone.draw_layer = str(drawLayer) - - currentAddress += commandSize - return currentAddress - -def parseDLWithOffset(romfile, currentAddress, - currentTransform, bMesh, obj, armatureObj, parentBoneName, ignoreNode, nodeIndex, currentCmd, segmentData, vertexBuffer, - f3dType, isHWv1): - print("DL_OFFSET " + hex(currentAddress)) - romfile.seek(currentAddress) - - command = romfile.read(getGeoLayoutCmdLength(*currentCmd)) - - drawLayer = command[1] - - translationVector = readVectorFromShorts(command, 2) - translation = mathutils.Matrix.Translation( - mathutils.Vector(translationVector)) - finalTransform = currentTransform @ translation - - boneName = format(nodeIndex, '03') + '-offset' - - # Handle parent object and transformation - # Note: Since we are storing the world transform for each node, - # we must set the transforms in preorder traversal. - segmentedAddr = command[8:12] - hasMeshData = int.from_bytes(segmentedAddr, 'big') != 0 - - if not ignoreNode: - if armatureObj is not None: - # Create bone - boneName = createBone(armatureObj, parentBoneName, boneName, finalTransform, None, hasMeshData) - if bpy.context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - bone = armatureObj.data.bones[boneName] - bone.draw_layer = str(drawLayer) - armatureObj.data.bones[boneName].use_deform = hasMeshData - bpy.ops.object.mode_set(mode = 'EDIT') - - # load mesh data - if hasMeshData: - displayListStartAddress = decodeSegmentedAddr(segmentedAddr, - segmentData = segmentData) - #print(displayListStartAddress) - parseF3DBinary(romfile, displayListStartAddress, bpy.context.scene, - bMesh, obj, finalTransform, boneName, segmentData, vertexBuffer) - - # Handle child objects - # Validate that next command is 04 (open node) - currentAddress += getGeoLayoutCmdLength(*currentCmd) - romfile.seek(currentAddress) # DONT FORGET THIS, FIXES PARENTING BUG - currentCmd = romfile.read(2) - - return currentAddress, boneName, finalTransform - -def parseBranch(romfile, currentCmd, currentAddress, jumps, - segmentData = None): - print("BRANCH " + hex(currentAddress)) - romfile.seek(currentAddress) - postJumpAddr = currentAddress + getGeoLayoutCmdLength(*currentCmd) - currentCmd = romfile.read(getGeoLayoutCmdLength(*currentCmd)) - - if currentCmd[1] == 1: - jumps.append(postJumpAddr) - currentAddress = decodeSegmentedAddr(currentCmd[4:8], - segmentData = segmentData) - - return currentAddress - -def parseBranchStore(romfile, currentCmd, currentAddress, jumps, - segmentData = None): - print("BRANCH AND STORE " + hex(currentAddress)) - romfile.seek(currentAddress) - postJumpAddr = currentAddress + getGeoLayoutCmdLength(*currentCmd) - currentCmd = romfile.read(getGeoLayoutCmdLength(*currentCmd)) - - jumps.append(postJumpAddr) - currentAddress = decodeSegmentedAddr(currentCmd[4:8], - segmentData = segmentData) - - return currentAddress + child = armatureObj.data.edit_bones[childName] + parent = armatureObj.data.edit_bones[parentName] + + connectBone = armatureObj.data.edit_bones.new("connect_" + child.name) + connectBoneName = connectBone.name + connectBone.head = parent.head + connectBone.use_connect = False + connectBone.parent = parent + connectBone.tail = child.head + child.use_connect = False + connectBone.use_deform = False + child.parent = connectBone + if (connectBone.head - connectBone.tail).length < 0.0001: + connectBone.tail = connectBone.head + sm64BoneUp * 0.2 + else: + child.use_connect = True + + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + connectPoseBone = armatureObj.pose.bones[connectBoneName] + connectBone = armatureObj.data.bones[connectBoneName] + connectBone.layers = createBoneLayerMask([boneLayers["visual"]]) + connectPoseBone.bone_group_index = getBoneGroupIndex(armatureObj, "Ignore") + connectPoseBone.lock_rotation = (True, True, True) + bpy.ops.object.mode_set(mode="EDIT") + + +def createBone( + armatureObj, parentBoneName, boneName, currentTransform, boneGroup, loadDL +): + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + bpy.ops.object.select_all(action="DESELECT") + bpy.context.view_layer.objects.active = armatureObj + bpy.ops.object.mode_set(mode="EDIT") + bone = armatureObj.data.edit_bones.new(boneName) + bone.use_connect = False + if parentBoneName is not None: + bone.parent = armatureObj.data.edit_bones[parentBoneName] + bone.head = currentTransform @ mathutils.Vector((0, 0, 0)) + bone.tail = bone.head + ( + currentTransform.to_quaternion() + @ mathutils.Vector((0, 1, 0)) + * (0.2 if boneGroup != "DisplayList" else 0.1) + ) + + # Connect bone to parent if it is possible without changing parent direction. + + if parentBoneName is not None: + nodeOffsetVector = mathutils.Vector(bone.head - bone.parent.head) + # set fallback to nonzero to avoid creating zero length bones + if ( + nodeOffsetVector.angle(bone.parent.tail - bone.parent.head, 1) < 0.0001 + and loadDL + ): + for child in bone.parent.children: + if child != bone: + child.use_connect = False + bone.parent.tail = bone.head + bone.use_connect = True + elif bone.head == bone.parent.head and bone.tail == bone.parent.tail: + bone.tail += ( + currentTransform.to_quaternion() @ mathutils.Vector((0, 1, 0)) * 0.02 + ) + + boneName = bone.name + addBoneToGroup(armatureObj, bone.name, boneGroup) + bone = armatureObj.data.bones[boneName] + bone.geo_cmd = boneGroup if boneGroup is not None else "DisplayListWithOffset" + + return boneName + + +def createSwitchOption( + armatureObj, + switchBoneName, + boneName, + currentTransform, + nextParentTransform, + switchLevel, + switchCount, +): + bpy.ops.object.mode_set(mode="OBJECT") + bpy.ops.object.select_all(action="DESELECT") + # bpy.context.view_layer.objects.active = armatureObj + # bpy.ops.object.mode_set(mode="EDIT") + # bone = armatureObj.data.edit_bones.new(boneName) + # bone.use_connect = False + + # calculate transform + translation = mathutils.Matrix.Translation( + mathutils.Vector((0, 3 * (switchCount - switchLevel), 0)) + ) + translation = mathutils.Matrix.Translation((0, 0, 0)) + finalTransform = translation @ currentTransform + finalNextParentTransform = translation @ nextParentTransform + + # create armature + armature = bpy.data.armatures.new("Armature") + switchArmature = bpy.data.objects.new("armature_" + boneName, armature) + switchArmature.show_in_front = True + armature.show_names = True + + bpy.context.scene.collection.objects.link(switchArmature) + bpy.ops.object.mode_set(mode="POSE") + bpy.ops.object.mode_set(mode="OBJECT") + createBoneGroups(switchArmature) + bpy.context.view_layer.objects.active = switchArmature + # switchArmature.matrix_world = mathutils.Matrix.Translation( + # finalTransform.to_translation()) + bpy.ops.object.mode_set(mode="EDIT") + + # create switch option bone + bone = switchArmature.data.edit_bones.new(boneName) + bone.use_connect = False + bone.head = finalTransform @ mathutils.Vector((0, 0, 0)) + bone.tail = ( + bone.head + currentTransform.to_quaternion() @ mathutils.Vector((0, 1, 0)) * 0.2 + ) + + boneName = bone.name + bpy.ops.object.mode_set(mode="OBJECT") + bone = switchArmature.data.bones[boneName] + # poseBone = switchArmature.pose.bones[boneName] + switchBone = armatureObj.data.bones[switchBoneName] + + # rotConstraint = poseBone.constraints.new(type = 'COPY_ROTATION') + # rotConstraint.target = armatureObj + # rotConstraint.subtarget = switchBone.name + + bone.geo_cmd = "SwitchOption" + + # switchOption = switchBone.switch_options.add() + # switchOption.switchType = 'Mesh' + # switchOption.optionArmature = switchArmature + + # Create new mesh as well + mesh = bpy.data.meshes.new("skinnned-mesh") + obj = bpy.data.objects.new("skinned", mesh) + bpy.context.scene.collection.objects.link(obj) + obj.matrix_world = switchArmature.matrix_world + # material = createF3DMat(obj) + # material.node_tree.nodes['Case A 1'].inA = '1' + # material.set_env = False + + bMesh = bmesh.new() + bMesh.from_mesh(mesh) + + addBoneToGroup(switchArmature, boneName, "SwitchOption") + + return ( + boneName, + (switchArmature, bMesh, obj), + finalTransform, + finalNextParentTransform, + ) + + +def parseSwitch( + romfile, + currentAddress, + currentTransform, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex, + segmentData, +): + print("SWITCH " + hex(currentAddress)) + + commandSize = 8 + + if not ignoreNode: + romfile.seek(currentAddress) + command = romfile.read(commandSize) + funcParam = int.from_bytes(command[2:4], "big", signed=True) + switchFunc = bytesToHexClean(command[4:8]) + + boneName = format(nodeIndex, "03") + "-switch" + if armatureObj is not None: + boneName = createBone( + armatureObj, parentBoneName, boneName, currentTransform, "Switch", False + ) + bone = armatureObj.data.bones[boneName] + bone.geo_func = switchFunc + bone.func_param = funcParam + else: + boneName = None + + currentAddress += commandSize + return currentAddress, boneName + + +def parseDL( + romfile, + currentAddress, + currentTransform, + bMesh, + obj, + armatureObj, + parentBoneName, + ignoreNode, + currentCmd, + nodeIndex, + segmentData, + vertexBuffer, + f3dType, + isHWv1, +): + + drawLayer = bitMask(currentCmd[1], 0, 4) + + romfile.seek(currentAddress) + commandSize = 8 + command = romfile.read(commandSize) + + if not ignoreNode: + boneName = handleNodeCommon( + romfile, + armatureObj, + parentBoneName, + currentTransform, + True, + command, + segmentData, + bMesh, + obj, + nodeIndex, + "DisplayList", + vertexBuffer, + f3dType, + isHWv1, + ) + if armatureObj is not None: + bone = armatureObj.data.bones[boneName] + bone.draw_layer = str(drawLayer) + + currentAddress += commandSize + return currentAddress + + +def parseDLWithOffset( + romfile, + currentAddress, + currentTransform, + bMesh, + obj, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex, + currentCmd, + segmentData, + vertexBuffer, + f3dType, + isHWv1, +): + print("DL_OFFSET " + hex(currentAddress)) + romfile.seek(currentAddress) + + command = romfile.read(getGeoLayoutCmdLength(*currentCmd)) + + drawLayer = command[1] + + translationVector = readVectorFromShorts(command, 2) + translation = mathutils.Matrix.Translation(mathutils.Vector(translationVector)) + finalTransform = currentTransform @ translation + + boneName = format(nodeIndex, "03") + "-offset" + + # Handle parent object and transformation + # Note: Since we are storing the world transform for each node, + # we must set the transforms in preorder traversal. + segmentedAddr = command[8:12] + hasMeshData = int.from_bytes(segmentedAddr, "big") != 0 + + if not ignoreNode: + if armatureObj is not None: + # Create bone + boneName = createBone( + armatureObj, parentBoneName, boneName, finalTransform, None, hasMeshData + ) + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + bone = armatureObj.data.bones[boneName] + bone.draw_layer = str(drawLayer) + armatureObj.data.bones[boneName].use_deform = hasMeshData + bpy.ops.object.mode_set(mode="EDIT") + + # load mesh data + if hasMeshData: + displayListStartAddress = decodeSegmentedAddr( + segmentedAddr, segmentData=segmentData + ) + # print(displayListStartAddress) + parseF3DBinary( + romfile, + displayListStartAddress, + bpy.context.scene, + bMesh, + obj, + finalTransform, + boneName, + segmentData, + vertexBuffer, + ) + + # Handle child objects + # Validate that next command is 04 (open node) + currentAddress += getGeoLayoutCmdLength(*currentCmd) + romfile.seek(currentAddress) # DONT FORGET THIS, FIXES PARENTING BUG + currentCmd = romfile.read(2) + + return currentAddress, boneName, finalTransform + + +def parseBranch(romfile, currentCmd, currentAddress, jumps, segmentData=None): + print("BRANCH " + hex(currentAddress)) + romfile.seek(currentAddress) + postJumpAddr = currentAddress + getGeoLayoutCmdLength(*currentCmd) + currentCmd = romfile.read(getGeoLayoutCmdLength(*currentCmd)) + + if currentCmd[1] == 1: + jumps.append(postJumpAddr) + currentAddress = decodeSegmentedAddr(currentCmd[4:8], segmentData=segmentData) + + return currentAddress + + +def parseBranchStore(romfile, currentCmd, currentAddress, jumps, segmentData=None): + print("BRANCH AND STORE " + hex(currentAddress)) + romfile.seek(currentAddress) + postJumpAddr = currentAddress + getGeoLayoutCmdLength(*currentCmd) + currentCmd = romfile.read(getGeoLayoutCmdLength(*currentCmd)) + + jumps.append(postJumpAddr) + currentAddress = decodeSegmentedAddr(currentCmd[4:8], segmentData=segmentData) + + return currentAddress + def parseReturn(currentCmd, currentAddress, jumps): - print("RETURN " + hex(currentAddress)) - currentAddress = jumps.pop() - return currentAddress + print("RETURN " + hex(currentAddress)) + currentAddress = jumps.pop() + return currentAddress + # Create bone and load geometry -def handleNodeCommon(romfile, armatureObj, parentBoneName, finalTransform, - loadDL, command, segmentData, bMesh, obj, nodeIndex, - boneGroupName, vertexBuffer, - f3dType, isHWv1): - - boneName = format(nodeIndex, '03') + "-" + boneGroupName.lower() - - if armatureObj is not None: - # Create bone - boneName = createBone(armatureObj, parentBoneName, boneName, - finalTransform, boneGroupName, loadDL) - - if loadDL: - segmentedAddr = command[-4:] - hasMeshData = int.from_bytes(segmentedAddr, 'big') != 0 - if hasMeshData: - startAddress = decodeSegmentedAddr(segmentedAddr, segmentData) - parseF3DBinary(romfile, startAddress, bpy.context.scene, bMesh, obj, - finalTransform, boneName, segmentData, vertexBuffer) - elif armatureObj is not None: - armatureObj.data.bones[boneName].use_deform = False - return boneName - -def parseScale(romfile, currentAddress, currentCmd, currentTransform, - bMesh, obj, armatureObj, parentBoneName, ignoreNode, nodeIndex, - segmentData , vertexBuffer, f3dType, isHWv1): - print("SCALE " + hex(currentAddress)) - - loadDL = bitMask(currentCmd[1], 7, 1) - drawLayer = bitMask(currentCmd[1], 0, 4) - - romfile.seek(currentAddress) - commandSize = 8 + (4 if loadDL else 0) - command = romfile.read(commandSize) - - scale = int.from_bytes(command[4:8], 'big') / 0x10000 - #finalTransform = currentTransform @ mathutils.Matrix.Scale(scale, 4) - finalTransform = currentTransform # Don't apply to armature - - if not ignoreNode: - boneName = handleNodeCommon(romfile, armatureObj, parentBoneName, - finalTransform, loadDL, command, segmentData, bMesh, obj, - nodeIndex, 'Scale', vertexBuffer, - f3dType, isHWv1) - if armatureObj is not None: - bone = armatureObj.data.bones[boneName] - bone.draw_layer = str(drawLayer) - bone.geo_scale = scale - else: - boneName = None - - currentAddress += commandSize - return (currentAddress, boneName, finalTransform) - -def parseTranslateRotate(romfile, currentAddress, - currentCmd, currentTransform, bMesh, obj, armatureObj, - parentBoneName, ignoreNode, nodeIndex, segmentData , vertexBuffer, f3dType, isHWv1): - print("TRANSLATE_ROTATE " + hex(currentAddress)) - - loadDL = bitMask(currentCmd[1], 7, 1) - fieldLayout = bitMask(currentCmd[1], 4, 3) - drawLayer = bitMask(currentCmd[1], 0, 4) - - if fieldLayout == 0: - commandSize = 16 - elif fieldLayout == 1 or fieldLayout == 2: - commandSize = 8 - else: - commandSize = 4 - if loadDL: - commandSize += 4 - - romfile.seek(currentAddress) - command = romfile.read(commandSize) - - if fieldLayout == 0: - pos = readVectorFromShorts(command, 4) - rot = readEulerVectorFromShorts(command, 10) - - rotation = mathutils.Euler(rot, geoNodeRotateOrder).to_matrix().to_4x4() - translation = mathutils.Matrix.Translation( - mathutils.Vector(pos)) - finalTransform = currentTransform @ translation @ rotation - - elif fieldLayout == 1: - pos = readVectorFromShorts(command, 2) - translation = mathutils.Matrix.Translation( - mathutils.Vector(pos)) - finalTransform = currentTransform @ translation - - elif fieldLayout == 2: - rot = readEulerVectorFromShorts(command, 2) - rotation = mathutils.Euler(rot, geoNodeRotateOrder).to_matrix().to_4x4() - finalTransform = currentTransform @ rotation - - else: - yRot = readFloatFromShort(command, 2) - rotation = mathutils.Euler((0, yRot, 0), geoNodeRotateOrder - ).to_matrix().to_4x4() - finalTransform = currentTransform @ rotation - - if not ignoreNode: - boneName = handleNodeCommon(romfile, armatureObj, parentBoneName, - finalTransform, loadDL, command, segmentData, bMesh, obj, - nodeIndex, 'TranslateRotate', vertexBuffer, - f3dType, isHWv1) - if armatureObj is not None: - bone = armatureObj.data.bones[boneName] - bone.draw_layer = str(drawLayer) - - # Rotate Y complicates exporting code, so we treat it as Rotate. - if fieldLayout == 3: - fieldLayout = 2 - bone.field_layout = str(fieldLayout) - else: - boneName = None - - currentAddress += commandSize - - return (currentAddress, boneName, finalTransform) - -def parseTranslate(romfile, currentAddress, - currentCmd, currentTransform, bMesh, obj, armatureObj, parentBoneName, ignoreNode, nodeIndex, - segmentData, vertexBuffer, f3dType, isHWv1): - print("TRANSLATE " + hex(currentAddress)) - - loadDL = bitMask(currentCmd[1], 7, 1) - drawLayer = bitMask(currentCmd[1], 0, 4) - - if loadDL: - commandSize = 12 - else: - commandSize = 8 - - romfile.seek(currentAddress) - command = romfile.read(commandSize) - - pos = readVectorFromShorts(command, 2) - translation = mathutils.Matrix.Translation( - mathutils.Vector(pos)) - finalTransform = currentTransform @ translation - - if not ignoreNode: - boneName = handleNodeCommon(romfile, armatureObj, parentBoneName, - finalTransform, loadDL, command, segmentData, bMesh, obj, - nodeIndex, 'Translate', vertexBuffer, - f3dType, isHWv1) - if armatureObj is not None: - bone = armatureObj.data.bones[boneName] - bone.draw_layer = str(drawLayer) - else: - boneName = None - - currentAddress += commandSize - - return (currentAddress, boneName, finalTransform) - -def parseRotate(romfile, currentAddress, - currentCmd, currentTransform, bMesh, obj, armatureObj, parentBoneName, ignoreNode, nodeIndex, - segmentData, vertexBuffer, f3dType, isHWv1): - print("ROTATE " + hex(currentAddress)) - - loadDL = bitMask(currentCmd[1], 7, 1) - drawLayer = bitMask(currentCmd[1], 0, 4) - - if loadDL: - commandSize = 12 - else: - commandSize = 8 - - romfile.seek(currentAddress) - command = romfile.read(commandSize) - - rot = readEulerVectorFromShorts(command, 2) - rotation = mathutils.Euler(rot, geoNodeRotateOrder).to_matrix().to_4x4() - finalTransform = currentTransform @ rotation - - if not ignoreNode: - boneName = handleNodeCommon(romfile, armatureObj, parentBoneName, - finalTransform, loadDL, command, segmentData, bMesh, obj, - nodeIndex, 'Rotate', vertexBuffer, - f3dType, isHWv1) - if armatureObj is not None: - bone = armatureObj.data.bones[boneName] - bone.draw_layer = str(drawLayer) - else: - boneName = None - - currentAddress += commandSize - return (currentAddress, boneName, finalTransform) - -def parseBillboard(romfile, currentAddress, - currentCmd, currentTransform, bMesh, obj, armatureObj, parentBoneName, ignoreNode, nodeIndex, segmentData, vertexBuffer, - f3dType, isHWv1): - print("BILLBOARD " + hex(currentAddress)) - - loadDL = bitMask(currentCmd[1], 7, 1) - drawLayer = bitMask(currentCmd[1], 0, 4) - - if loadDL: - commandSize = 12 - else: - commandSize = 8 - - romfile.seek(currentAddress) - command = romfile.read(commandSize) - - pos = readVectorFromShorts(command, 2) - translation = mathutils.Matrix.Translation( - mathutils.Vector(pos)) - finalTransform = currentTransform @ translation - - if not ignoreNode: - boneName = handleNodeCommon(romfile, armatureObj, parentBoneName, - finalTransform, loadDL, command, segmentData, bMesh, obj, - nodeIndex, 'Billboard', vertexBuffer, - f3dType, isHWv1) - if armatureObj is not None: - bone = armatureObj.data.bones[boneName] - bone.draw_layer = str(drawLayer) - else: - boneName = None - - currentAddress += commandSize - - return (currentAddress, boneName, finalTransform) - -def parseShadow(romfile, currentAddress, currentTransform, - armatureObj, parentBoneName, ignoreNode, nodeIndex, - segmentData): - print("SHADOW " + hex(currentAddress)) - commandSize = 8 - - romfile.seek(currentAddress) - command = romfile.read(commandSize) - shadowType = int.from_bytes(command[2:4], 'big') - if str(shadowType) not in enumShadowType: - if shadowType > 12 and shadowType < 50: # Square Shadow - shadowType = 12 - elif shadowType > 50 and shadowType < 99: # Rectangle Shadow - shadowType = 50 - else: # Invalid shadow - shadowType = 0 - shadowSolidity = int.from_bytes(command[4:6], 'big') - shadowScale = int.from_bytes(command[6:8], 'big') - - if not ignoreNode: - boneName = format(nodeIndex, '03') + "-shadow" - if armatureObj is not None: - boneName = createBone(armatureObj, parentBoneName, boneName, - currentTransform, 'Shadow', False) - bone = armatureObj.data.bones[boneName] - bone.shadow_type = str(shadowType) - bone.shadow_solidity = shadowSolidity / 0xFF - bone.shadow_scale = shadowScale - else: - boneName = None - - currentAddress += commandSize - return currentAddress, boneName, copy.deepcopy(currentTransform) - -def parseStart(romfile, currentAddress, currentTransform, - armatureObj, parentBoneName, ignoreNode, nodeIndex, - segmentData): - print("START " + hex(currentAddress)) - - commandSize = 4 - romfile.seek(currentAddress) - - if not ignoreNode: - boneName = format(nodeIndex, '03') + "-start" - if armatureObj is not None: - boneName = createBone(armatureObj, parentBoneName, boneName, - currentTransform, 'Start', False) - else: - boneName = None - - currentAddress += commandSize - return currentAddress, boneName, copy.deepcopy(currentTransform) - -def parseStartWithRenderArea(romfile, currentAddress, currentTransform, - armatureObj, parentBoneName, ignoreNode, nodeIndex, - segmentData): - print("START W/ RENDER AREA" + hex(currentAddress)) - - commandSize = 4 - romfile.seek(currentAddress) - command = romfile.read(commandSize) - cullingRadius = int.from_bytes(command[2:4], 'big') / bpy.context.scene.blenderToSM64Scale - - if not ignoreNode: - boneName = format(nodeIndex, '03') + "-start_render_area" - if armatureObj is not None: - boneName = createBone(armatureObj, parentBoneName, boneName, - currentTransform, 'StartRenderArea', False) - bone = armatureObj.data.bones[boneName] - bone.geo_cmd = 'StartRenderArea' - bone.culling_radius = cullingRadius - else: - boneName = None - - currentAddress += commandSize - return currentAddress, boneName, copy.deepcopy(currentTransform) - -def parseFunction(romfile, currentAddress, currentTransform, - armatureObj, parentBoneName, ignoreNode, nodeIndex, - segmentData): - print("Function " + hex(currentAddress)) - - commandSize = 8 - - romfile.seek(currentAddress) - command = romfile.read(commandSize) - asmParam = int.from_bytes(command[2:4], 'big', signed = True) - asmFunc = bytesToHexClean(command[4:8]) - - boneName = format(nodeIndex, '03') + "-asm" - if armatureObj is not None and not ignoreNode: - boneName = createBone(armatureObj, parentBoneName, boneName, - currentTransform, 'Function', False) - bone = armatureObj.data.bones[boneName] - bone.geo_func = asmFunc - bone.func_param = asmParam - - currentAddress += commandSize - return currentAddress - -def parseHeldObject(romfile, currentAddress, currentTransform, - armatureObj, parentBoneName, ignoreNode, nodeIndex, segmentData): - print("HELD OBJECT " + hex(currentAddress)) - commandSize = 12 - romfile.seek(currentAddress) - command = romfile.read(commandSize) - - pos = readVectorFromShorts(command, 2) - translation = mathutils.Matrix.Translation( - mathutils.Vector(pos)) - finalTransform = currentTransform @ translation - asmFunc = bytesToHexClean(command[8:12]) - - if not ignoreNode: - boneName = format(nodeIndex, '03') + "-held_object" - if armatureObj is not None: - boneName = createBone(armatureObj, parentBoneName, boneName, - finalTransform, 'HeldObject', False) - bone = armatureObj.data.bones[boneName] - bone.geo_func = asmFunc - - currentAddress += commandSize - return currentAddress, finalTransform - -def getMarioBoneName(startRelativeAddr, armatureData, default = 'sm64_mesh'): - try: - boneName = armatureData.findBoneByOffset(startRelativeAddr).name - return boneName - except Exception: - return default - -def assignMarioGeoMetadata(obj, commandAddress, geoStartAddress, - cmdType, armatureData, lastTransRotAddr = None): - - # for geo_pointer reading offsets: - # cmd = 0 - # draw layer = 1 - # translation = 2 (for 0x13) - # display lists = 4 (for 0x15) or 8 (for 0x13) - sm64_geo_meta = { - 'geo_start' : geoStartAddress, - 'geo_pointer_relative' : commandAddress - geoStartAddress, - 'geo_cmd_type' : cmdType, - 'geo_has_mesh' : len(obj.data.loops) > 0, - 'geo_top_overlap_ptr' : None, - 'geo_other_overlap_ptrs': [] - } - - # actual value doesn't matter, just a flag - if lastTransRotAddr is not None: - sm64_geo_meta['geo_trans_ptr'] = lastTransRotAddr - - obj['sm64_geo_meta'] = sm64_geo_meta - - if armatureData is not None: - obj['sm64_part_names'] = [armatureData.findBoneByOffset( - commandAddress - geoStartAddress).name] +def handleNodeCommon( + romfile, + armatureObj, + parentBoneName, + finalTransform, + loadDL, + command, + segmentData, + bMesh, + obj, + nodeIndex, + boneGroupName, + vertexBuffer, + f3dType, + isHWv1, +): + + boneName = format(nodeIndex, "03") + "-" + boneGroupName.lower() + + if armatureObj is not None: + # Create bone + boneName = createBone( + armatureObj, parentBoneName, boneName, finalTransform, boneGroupName, loadDL + ) + + if loadDL: + segmentedAddr = command[-4:] + hasMeshData = int.from_bytes(segmentedAddr, "big") != 0 + if hasMeshData: + startAddress = decodeSegmentedAddr(segmentedAddr, segmentData) + parseF3DBinary( + romfile, + startAddress, + bpy.context.scene, + bMesh, + obj, + finalTransform, + boneName, + segmentData, + vertexBuffer, + ) + elif armatureObj is not None: + armatureObj.data.bones[boneName].use_deform = False + return boneName + + +def parseScale( + romfile, + currentAddress, + currentCmd, + currentTransform, + bMesh, + obj, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex, + segmentData, + vertexBuffer, + f3dType, + isHWv1, +): + print("SCALE " + hex(currentAddress)) + + loadDL = bitMask(currentCmd[1], 7, 1) + drawLayer = bitMask(currentCmd[1], 0, 4) + + romfile.seek(currentAddress) + commandSize = 8 + (4 if loadDL else 0) + command = romfile.read(commandSize) + + scale = int.from_bytes(command[4:8], "big") / 0x10000 + # finalTransform = currentTransform @ mathutils.Matrix.Scale(scale, 4) + finalTransform = currentTransform # Don't apply to armature + + if not ignoreNode: + boneName = handleNodeCommon( + romfile, + armatureObj, + parentBoneName, + finalTransform, + loadDL, + command, + segmentData, + bMesh, + obj, + nodeIndex, + "Scale", + vertexBuffer, + f3dType, + isHWv1, + ) + if armatureObj is not None: + bone = armatureObj.data.bones[boneName] + bone.draw_layer = str(drawLayer) + bone.geo_scale = scale + else: + boneName = None + + currentAddress += commandSize + return (currentAddress, boneName, finalTransform) + + +def parseTranslateRotate( + romfile, + currentAddress, + currentCmd, + currentTransform, + bMesh, + obj, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex, + segmentData, + vertexBuffer, + f3dType, + isHWv1, +): + print("TRANSLATE_ROTATE " + hex(currentAddress)) + + loadDL = bitMask(currentCmd[1], 7, 1) + fieldLayout = bitMask(currentCmd[1], 4, 3) + drawLayer = bitMask(currentCmd[1], 0, 4) + + if fieldLayout == 0: + commandSize = 16 + elif fieldLayout == 1 or fieldLayout == 2: + commandSize = 8 + else: + commandSize = 4 + if loadDL: + commandSize += 4 + + romfile.seek(currentAddress) + command = romfile.read(commandSize) + + if fieldLayout == 0: + pos = readVectorFromShorts(command, 4) + rot = readEulerVectorFromShorts(command, 10) + + rotation = mathutils.Euler(rot, geoNodeRotateOrder).to_matrix().to_4x4() + translation = mathutils.Matrix.Translation(mathutils.Vector(pos)) + finalTransform = currentTransform @ translation @ rotation + + elif fieldLayout == 1: + pos = readVectorFromShorts(command, 2) + translation = mathutils.Matrix.Translation(mathutils.Vector(pos)) + finalTransform = currentTransform @ translation + + elif fieldLayout == 2: + rot = readEulerVectorFromShorts(command, 2) + rotation = mathutils.Euler(rot, geoNodeRotateOrder).to_matrix().to_4x4() + finalTransform = currentTransform @ rotation + + else: + yRot = readFloatFromShort(command, 2) + rotation = ( + mathutils.Euler((0, yRot, 0), geoNodeRotateOrder).to_matrix().to_4x4() + ) + finalTransform = currentTransform @ rotation + + if not ignoreNode: + boneName = handleNodeCommon( + romfile, + armatureObj, + parentBoneName, + finalTransform, + loadDL, + command, + segmentData, + bMesh, + obj, + nodeIndex, + "TranslateRotate", + vertexBuffer, + f3dType, + isHWv1, + ) + if armatureObj is not None: + bone = armatureObj.data.bones[boneName] + bone.draw_layer = str(drawLayer) + + # Rotate Y complicates exporting code, so we treat it as Rotate. + if fieldLayout == 3: + fieldLayout = 2 + bone.field_layout = str(fieldLayout) + else: + boneName = None + + currentAddress += commandSize + + return (currentAddress, boneName, finalTransform) + + +def parseTranslate( + romfile, + currentAddress, + currentCmd, + currentTransform, + bMesh, + obj, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex, + segmentData, + vertexBuffer, + f3dType, + isHWv1, +): + print("TRANSLATE " + hex(currentAddress)) + + loadDL = bitMask(currentCmd[1], 7, 1) + drawLayer = bitMask(currentCmd[1], 0, 4) + + if loadDL: + commandSize = 12 + else: + commandSize = 8 + + romfile.seek(currentAddress) + command = romfile.read(commandSize) + + pos = readVectorFromShorts(command, 2) + translation = mathutils.Matrix.Translation(mathutils.Vector(pos)) + finalTransform = currentTransform @ translation + + if not ignoreNode: + boneName = handleNodeCommon( + romfile, + armatureObj, + parentBoneName, + finalTransform, + loadDL, + command, + segmentData, + bMesh, + obj, + nodeIndex, + "Translate", + vertexBuffer, + f3dType, + isHWv1, + ) + if armatureObj is not None: + bone = armatureObj.data.bones[boneName] + bone.draw_layer = str(drawLayer) + else: + boneName = None + + currentAddress += commandSize + + return (currentAddress, boneName, finalTransform) + + +def parseRotate( + romfile, + currentAddress, + currentCmd, + currentTransform, + bMesh, + obj, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex, + segmentData, + vertexBuffer, + f3dType, + isHWv1, +): + print("ROTATE " + hex(currentAddress)) + + loadDL = bitMask(currentCmd[1], 7, 1) + drawLayer = bitMask(currentCmd[1], 0, 4) + + if loadDL: + commandSize = 12 + else: + commandSize = 8 + + romfile.seek(currentAddress) + command = romfile.read(commandSize) + + rot = readEulerVectorFromShorts(command, 2) + rotation = mathutils.Euler(rot, geoNodeRotateOrder).to_matrix().to_4x4() + finalTransform = currentTransform @ rotation + + if not ignoreNode: + boneName = handleNodeCommon( + romfile, + armatureObj, + parentBoneName, + finalTransform, + loadDL, + command, + segmentData, + bMesh, + obj, + nodeIndex, + "Rotate", + vertexBuffer, + f3dType, + isHWv1, + ) + if armatureObj is not None: + bone = armatureObj.data.bones[boneName] + bone.draw_layer = str(drawLayer) + else: + boneName = None + + currentAddress += commandSize + return (currentAddress, boneName, finalTransform) + + +def parseBillboard( + romfile, + currentAddress, + currentCmd, + currentTransform, + bMesh, + obj, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex, + segmentData, + vertexBuffer, + f3dType, + isHWv1, +): + print("BILLBOARD " + hex(currentAddress)) + + loadDL = bitMask(currentCmd[1], 7, 1) + drawLayer = bitMask(currentCmd[1], 0, 4) + + if loadDL: + commandSize = 12 + else: + commandSize = 8 + + romfile.seek(currentAddress) + command = romfile.read(commandSize) + + pos = readVectorFromShorts(command, 2) + translation = mathutils.Matrix.Translation(mathutils.Vector(pos)) + finalTransform = currentTransform @ translation + + if not ignoreNode: + boneName = handleNodeCommon( + romfile, + armatureObj, + parentBoneName, + finalTransform, + loadDL, + command, + segmentData, + bMesh, + obj, + nodeIndex, + "Billboard", + vertexBuffer, + f3dType, + isHWv1, + ) + if armatureObj is not None: + bone = armatureObj.data.bones[boneName] + bone.draw_layer = str(drawLayer) + else: + boneName = None + + currentAddress += commandSize + + return (currentAddress, boneName, finalTransform) + + +def parseShadow( + romfile, + currentAddress, + currentTransform, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex, + segmentData, +): + print("SHADOW " + hex(currentAddress)) + commandSize = 8 + + romfile.seek(currentAddress) + command = romfile.read(commandSize) + shadowType = int.from_bytes(command[2:4], "big") + if str(shadowType) not in enumShadowType: + if shadowType > 12 and shadowType < 50: # Square Shadow + shadowType = 12 + elif shadowType > 50 and shadowType < 99: # Rectangle Shadow + shadowType = 50 + else: # Invalid shadow + shadowType = 0 + shadowSolidity = int.from_bytes(command[4:6], "big") + shadowScale = int.from_bytes(command[6:8], "big") + + if not ignoreNode: + boneName = format(nodeIndex, "03") + "-shadow" + if armatureObj is not None: + boneName = createBone( + armatureObj, parentBoneName, boneName, currentTransform, "Shadow", False + ) + bone = armatureObj.data.bones[boneName] + bone.shadow_type = str(shadowType) + bone.shadow_solidity = shadowSolidity / 0xFF + bone.shadow_scale = shadowScale + else: + boneName = None + + currentAddress += commandSize + return currentAddress, boneName, copy.deepcopy(currentTransform) + + +def parseStart( + romfile, + currentAddress, + currentTransform, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex, + segmentData, +): + print("START " + hex(currentAddress)) + + commandSize = 4 + romfile.seek(currentAddress) + + if not ignoreNode: + boneName = format(nodeIndex, "03") + "-start" + if armatureObj is not None: + boneName = createBone( + armatureObj, parentBoneName, boneName, currentTransform, "Start", False + ) + else: + boneName = None + + currentAddress += commandSize + return currentAddress, boneName, copy.deepcopy(currentTransform) + + +def parseStartWithRenderArea( + romfile, + currentAddress, + currentTransform, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex, + segmentData, +): + print("START W/ RENDER AREA" + hex(currentAddress)) + + commandSize = 4 + romfile.seek(currentAddress) + command = romfile.read(commandSize) + cullingRadius = ( + int.from_bytes(command[2:4], "big") / bpy.context.scene.blenderToSM64Scale + ) + + if not ignoreNode: + boneName = format(nodeIndex, "03") + "-start_render_area" + if armatureObj is not None: + boneName = createBone( + armatureObj, + parentBoneName, + boneName, + currentTransform, + "StartRenderArea", + False, + ) + bone = armatureObj.data.bones[boneName] + bone.geo_cmd = "StartRenderArea" + bone.culling_radius = cullingRadius + else: + boneName = None + + currentAddress += commandSize + return currentAddress, boneName, copy.deepcopy(currentTransform) + + +def parseFunction( + romfile, + currentAddress, + currentTransform, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex, + segmentData, +): + print("Function " + hex(currentAddress)) + + commandSize = 8 + + romfile.seek(currentAddress) + command = romfile.read(commandSize) + asmParam = int.from_bytes(command[2:4], "big", signed=True) + asmFunc = bytesToHexClean(command[4:8]) + + boneName = format(nodeIndex, "03") + "-asm" + if armatureObj is not None and not ignoreNode: + boneName = createBone( + armatureObj, parentBoneName, boneName, currentTransform, "Function", False + ) + bone = armatureObj.data.bones[boneName] + bone.geo_func = asmFunc + bone.func_param = asmParam + + currentAddress += commandSize + return currentAddress + + +def parseHeldObject( + romfile, + currentAddress, + currentTransform, + armatureObj, + parentBoneName, + ignoreNode, + nodeIndex, + segmentData, +): + print("HELD OBJECT " + hex(currentAddress)) + commandSize = 12 + romfile.seek(currentAddress) + command = romfile.read(commandSize) + + pos = readVectorFromShorts(command, 2) + translation = mathutils.Matrix.Translation(mathutils.Vector(pos)) + finalTransform = currentTransform @ translation + asmFunc = bytesToHexClean(command[8:12]) + + if not ignoreNode: + boneName = format(nodeIndex, "03") + "-held_object" + if armatureObj is not None: + boneName = createBone( + armatureObj, + parentBoneName, + boneName, + finalTransform, + "HeldObject", + False, + ) + bone = armatureObj.data.bones[boneName] + bone.geo_func = asmFunc + + currentAddress += commandSize + return currentAddress, finalTransform + + +def getMarioBoneName(startRelativeAddr, armatureData, default="sm64_mesh"): + try: + boneName = armatureData.findBoneByOffset(startRelativeAddr).name + return boneName + except Exception: + return default + + +def assignMarioGeoMetadata( + obj, commandAddress, geoStartAddress, cmdType, armatureData, lastTransRotAddr=None +): + + # for geo_pointer reading offsets: + # cmd = 0 + # draw layer = 1 + # translation = 2 (for 0x13) + # display lists = 4 (for 0x15) or 8 (for 0x13) + sm64_geo_meta = { + "geo_start": geoStartAddress, + "geo_pointer_relative": commandAddress - geoStartAddress, + "geo_cmd_type": cmdType, + "geo_has_mesh": len(obj.data.loops) > 0, + "geo_top_overlap_ptr": None, + "geo_other_overlap_ptrs": [], + } + + # actual value doesn't matter, just a flag + if lastTransRotAddr is not None: + sm64_geo_meta["geo_trans_ptr"] = lastTransRotAddr + + obj["sm64_geo_meta"] = sm64_geo_meta + + if armatureData is not None: + obj["sm64_part_names"] = [ + armatureData.findBoneByOffset(commandAddress - geoStartAddress).name + ] + def handleOverlapGeoMetadata(bone): - parentBone = bone.parent - if parentBone is not None and 'sm64_geo_meta' in parentBone: - #boneMeta = copyBlenderPropDict(bone['sm64_geo_meta']) - boneMeta = bone['sm64_geo_meta'] - parentBoneMeta = parentBone['sm64_geo_meta'] + parentBone = bone.parent + if parentBone is not None and "sm64_geo_meta" in parentBone: + # boneMeta = copyBlenderPropDict(bone['sm64_geo_meta']) + boneMeta = bone["sm64_geo_meta"] + parentBoneMeta = parentBone["sm64_geo_meta"] - if parentBoneMeta['geo_top_overlap_ptr'] is None: - parentBoneMeta['geo_top_overlap_ptr'] = \ - parentBoneMeta['geo_pointer_relative'] + if parentBoneMeta["geo_top_overlap_ptr"] is None: + parentBoneMeta["geo_top_overlap_ptr"] = parentBoneMeta[ + "geo_pointer_relative" + ] - else: - # Done this way since we cannot deepcopy blender ID property arrays - parentBoneMeta['geo_other_overlap_ptrs'] = \ - [ptr for ptr in parentBoneMeta['geo_other_overlap_ptrs']] + \ - [parentBoneMeta['geo_pointer_relative']] + else: + # Done this way since we cannot deepcopy blender ID property arrays + parentBoneMeta["geo_other_overlap_ptrs"] = [ + ptr for ptr in parentBoneMeta["geo_other_overlap_ptrs"] + ] + [parentBoneMeta["geo_pointer_relative"]] - parentBoneMeta['geo_pointer_relative'] = \ - boneMeta['geo_pointer_relative'] - parentBoneMeta['geo_cmd_type'] = \ - boneMeta['geo_cmd_type'] - parentBoneMeta['geo_has_mesh'] = \ - boneMeta['geo_has_mesh'] + parentBoneMeta["geo_pointer_relative"] = boneMeta["geo_pointer_relative"] + parentBoneMeta["geo_cmd_type"] = boneMeta["geo_cmd_type"] + parentBoneMeta["geo_has_mesh"] = boneMeta["geo_has_mesh"] - bone['sm64_geo_meta'] = parentBoneMeta - del parentBone['sm64_geo_meta'] + bone["sm64_geo_meta"] = parentBoneMeta + del parentBone["sm64_geo_meta"] # See SM64GeoLayoutPtrsByLevels.txt by VLTone class SM64_ImportGeolayout(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.sm64_import_geolayout' - bl_label = "Import Geolayout" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - romfileSrc = None - try: - geoImportAddr = context.scene.geoImportAddr - generateArmature = context.scene.generateArmature - levelGeoImport = context.scene.levelGeoImport - importRom = context.scene.importRom - ignoreSwitch = context.scene.ignoreSwitch - - #finalTransform = mathutils.Matrix.Rotation(math.radians(-90), 4, 'X') - finalTransform = mathutils.Matrix.Identity(4) - if context.mode != 'OBJECT': - raise PluginError("Operator can only be used in object mode.") - except Exception as e: - raisePluginError(self, e) - return {'CANCELLED'} - try: - romfileSrc = open(bpy.path.abspath(importRom), 'rb') - checkExpanded(bpy.path.abspath(importRom)) - - armatureObj = None - - # Get segment data - levelParsed = parseLevelAtPointer(romfileSrc, - level_pointers[levelGeoImport]) - segmentData = levelParsed.segmentData - geoStart = int(geoImportAddr, 16) - if context.scene.geoIsSegPtr: - geoStart = decodeSegmentedAddr( - geoStart.to_bytes(4, 'big'), segmentData) - - # Armature mesh groups includes armatureObj. - armatureMeshGroups, armatureObj = parseGeoLayout(romfileSrc, - geoStart, - context.scene, segmentData, - finalTransform, generateArmature, - ignoreSwitch, True, context.scene.f3d_type, - context.scene.isHWv1) - romfileSrc.close() - - bpy.ops.object.select_all(action = 'DESELECT') - if armatureObj is not None: - for armatureMeshGroup in armatureMeshGroups: - armatureMeshGroup[0].select_set(True) - doRotation(math.radians(-90), 'X') - - for armatureMeshGroup in armatureMeshGroups: - bpy.ops.object.select_all(action = 'DESELECT') - armatureMeshGroup[0].select_set(True) - bpy.context.view_layer.objects.active = armatureMeshGroup[0] - bpy.ops.object.make_single_user(obdata = True) - bpy.ops.object.transform_apply(location = False, - rotation = True, scale = False, properties = False) - else: - doRotation(math.radians(-90), 'X') - bpy.ops.object.select_all(action = 'DESELECT') - #objs[-1].select_set(True) - - self.report({'INFO'}, 'Generic import succeeded.') - return {'FINISHED'} # must return a set - - except Exception as e: - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - - if romfileSrc is not None: - romfileSrc.close() - raisePluginError(self, e) - return {'CANCELLED'} # must return a set + # set bl_ properties + bl_idname = "object.sm64_import_geolayout" + bl_label = "Import Geolayout" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + romfileSrc = None + try: + geoImportAddr = context.scene.geoImportAddr + generateArmature = context.scene.generateArmature + levelGeoImport = context.scene.levelGeoImport + importRom = context.scene.importRom + ignoreSwitch = context.scene.ignoreSwitch + + # finalTransform = mathutils.Matrix.Rotation(math.radians(-90), 4, 'X') + finalTransform = mathutils.Matrix.Identity(4) + if context.mode != "OBJECT": + raise PluginError("Operator can only be used in object mode.") + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} + try: + romfileSrc = open(bpy.path.abspath(importRom), "rb") + checkExpanded(bpy.path.abspath(importRom)) + + armatureObj = None + + # Get segment data + levelParsed = parseLevelAtPointer( + romfileSrc, level_pointers[levelGeoImport] + ) + segmentData = levelParsed.segmentData + geoStart = int(geoImportAddr, 16) + if context.scene.geoIsSegPtr: + geoStart = decodeSegmentedAddr(geoStart.to_bytes(4, "big"), segmentData) + + # Armature mesh groups includes armatureObj. + armatureMeshGroups, armatureObj = parseGeoLayout( + romfileSrc, + geoStart, + context.scene, + segmentData, + finalTransform, + generateArmature, + ignoreSwitch, + True, + context.scene.f3d_type, + context.scene.isHWv1, + ) + romfileSrc.close() + + bpy.ops.object.select_all(action="DESELECT") + if armatureObj is not None: + for armatureMeshGroup in armatureMeshGroups: + armatureMeshGroup[0].select_set(True) + doRotation(math.radians(-90), "X") + + for armatureMeshGroup in armatureMeshGroups: + bpy.ops.object.select_all(action="DESELECT") + armatureMeshGroup[0].select_set(True) + bpy.context.view_layer.objects.active = armatureMeshGroup[0] + bpy.ops.object.make_single_user(obdata=True) + bpy.ops.object.transform_apply( + location=False, rotation=True, scale=False, properties=False + ) + else: + doRotation(math.radians(-90), "X") + bpy.ops.object.select_all(action="DESELECT") + # objs[-1].select_set(True) + + self.report({"INFO"}, "Generic import succeeded.") + return {"FINISHED"} # must return a set + + except Exception as e: + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + + if romfileSrc is not None: + romfileSrc.close() + raisePluginError(self, e) + return {"CANCELLED"} # must return a set + class SM64_ImportGeolayoutPanel(SM64_Panel): - bl_idname = "SM64_PT_import_geolayout" - bl_label = "SM64 Geolayout Importer" - goal = sm64GoalImport - - # called every frame - def draw(self, context): - col = self.layout.column() - propsGeoI = col.operator(SM64_ImportGeolayout.bl_idname) - - #col.prop(context.scene, 'rotationOrder') - #col.prop(context.scene, 'rotationAxis') - #col.prop(context.scene, 'rotationAngle') - prop_split(col, context.scene, 'geoImportAddr', 'Start Address') - col.prop(context.scene, 'geoIsSegPtr') - col.prop(context.scene, 'levelGeoImport') - col.prop(context.scene, 'generateArmature') - col.prop(context.scene, 'ignoreSwitch') - if not context.scene.ignoreSwitch: - boxLayout = col.box() - boxLayout.label(text = "WARNING: May take a long time.") - boxLayout.label(text = "Switch nodes won't be setup.") - col.box().label(text = "Only Fast3D mesh importing allowed.") - -sm64_geo_parser_classes = ( - SM64_ImportGeolayout, -) - -sm64_geo_parser_panel_classes = ( - SM64_ImportGeolayoutPanel, -) + bl_idname = "SM64_PT_import_geolayout" + bl_label = "SM64 Geolayout Importer" + goal = sm64GoalImport + + # called every frame + def draw(self, context): + col = self.layout.column() + propsGeoI = col.operator(SM64_ImportGeolayout.bl_idname) + + # col.prop(context.scene, 'rotationOrder') + # col.prop(context.scene, 'rotationAxis') + # col.prop(context.scene, 'rotationAngle') + prop_split(col, context.scene, "geoImportAddr", "Start Address") + col.prop(context.scene, "geoIsSegPtr") + col.prop(context.scene, "levelGeoImport") + col.prop(context.scene, "generateArmature") + col.prop(context.scene, "ignoreSwitch") + if not context.scene.ignoreSwitch: + boxLayout = col.box() + boxLayout.label(text="WARNING: May take a long time.") + boxLayout.label(text="Switch nodes won't be setup.") + col.box().label(text="Only Fast3D mesh importing allowed.") + + +sm64_geo_parser_classes = (SM64_ImportGeolayout,) + +sm64_geo_parser_panel_classes = (SM64_ImportGeolayoutPanel,) + def sm64_geo_parser_panel_register(): - for cls in sm64_geo_parser_panel_classes: - register_class(cls) + for cls in sm64_geo_parser_panel_classes: + register_class(cls) + def sm64_geo_parser_panel_unregister(): - for cls in sm64_geo_parser_panel_classes: - unregister_class(cls) + for cls in sm64_geo_parser_panel_classes: + unregister_class(cls) + def sm64_geo_parser_register(): - for cls in sm64_geo_parser_classes: - register_class(cls) - - bpy.types.Scene.geoImportAddr = bpy.props.StringProperty( - name ='Start Address', default = '1F1D60') - bpy.types.Scene.generateArmature = bpy.props.BoolProperty( - name ='Generate Armature?', default = True) - bpy.types.Scene.levelGeoImport = bpy.props.EnumProperty(items = level_enums, - name = 'Level', default = 'HMC') - bpy.types.Scene.ignoreSwitch = bpy.props.BoolProperty( - name = 'Ignore Switch Nodes', default = True) + for cls in sm64_geo_parser_classes: + register_class(cls) + + bpy.types.Scene.geoImportAddr = bpy.props.StringProperty( + name="Start Address", default="1F1D60" + ) + bpy.types.Scene.generateArmature = bpy.props.BoolProperty( + name="Generate Armature?", default=True + ) + bpy.types.Scene.levelGeoImport = bpy.props.EnumProperty( + items=level_enums, name="Level", default="HMC" + ) + bpy.types.Scene.ignoreSwitch = bpy.props.BoolProperty( + name="Ignore Switch Nodes", default=True + ) + def sm64_geo_parser_unregister(): - for cls in reversed(sm64_geo_parser_classes): - unregister_class(cls) + for cls in reversed(sm64_geo_parser_classes): + unregister_class(cls) - del bpy.types.Scene.generateArmature - del bpy.types.Scene.geoImportAddr - del bpy.types.Scene.levelGeoImport - del bpy.types.Scene.ignoreSwitch + del bpy.types.Scene.generateArmature + del bpy.types.Scene.geoImportAddr + del bpy.types.Scene.levelGeoImport + del bpy.types.Scene.ignoreSwitch diff --git a/fast64_internal/sm64/sm64_geolayout_utility.py b/fast64_internal/sm64/sm64_geolayout_utility.py index 590625d33..c69fb0829 100644 --- a/fast64_internal/sm64/sm64_geolayout_utility.py +++ b/fast64_internal/sm64/sm64_geolayout_utility.py @@ -1,92 +1,93 @@ from ..utility import PluginError import bpy + def getBoneGroupByName(armatureObj, name): - for boneGroup in armatureObj.pose.bone_groups: - if boneGroup.name == name: - return boneGroup - return None + for boneGroup in armatureObj.pose.bone_groups: + if boneGroup.name == name: + return boneGroup + return None + def getBoneGroupIndex(armatureObj, name): - index = 0 - for boneGroup in armatureObj.pose.bone_groups: - if boneGroup.name == name: - return index - else: - index += 1 - return -1 + index = 0 + for boneGroup in armatureObj.pose.bone_groups: + if boneGroup.name == name: + return index + else: + index += 1 + return -1 + class BoneNodeProperties: - def __init__(self, deform, theme): - self.deform = deform - self.theme = theme + def __init__(self, deform, theme): + self.deform = deform + self.theme = theme + # Only 0x13 commands are keyframe animated. # We want to ignore/prevent animations on these other nodes. boneNodeProperties = { - "Switch" : BoneNodeProperties(False, 'THEME01'), #0xE - "Start" : BoneNodeProperties(True, 'THEME12'), #0x0B - "TranslateRotate" : BoneNodeProperties(True, 'THEME02'), #0x10 - "Translate" : BoneNodeProperties(True, 'THEME03'), #0x11 - "Rotate" : BoneNodeProperties(True, 'THEME04'), #0x12 - "Billboard" : BoneNodeProperties(True, 'THEME14'), #0x14 - "DisplayList" : BoneNodeProperties(True, 'THEME06'), #0x15 - "Shadow" : BoneNodeProperties(False, 'THEME07'), #0x16 - "Function" : BoneNodeProperties(False, 'THEME05'), #0x18 - "HeldObject" : BoneNodeProperties(False, 'THEME09'), #0x1C - "Scale" : BoneNodeProperties(True, 'THEME10'), #0x1D - "StartRenderArea" : BoneNodeProperties(True, 'THEME13'), #0x20 - "Ignore" : BoneNodeProperties(False, 'THEME08'), # Used for rigging - - "SwitchOption" : BoneNodeProperties(False, 'THEME11') + "Switch": BoneNodeProperties(False, "THEME01"), # 0xE + "Start": BoneNodeProperties(True, "THEME12"), # 0x0B + "TranslateRotate": BoneNodeProperties(True, "THEME02"), # 0x10 + "Translate": BoneNodeProperties(True, "THEME03"), # 0x11 + "Rotate": BoneNodeProperties(True, "THEME04"), # 0x12 + "Billboard": BoneNodeProperties(True, "THEME14"), # 0x14 + "DisplayList": BoneNodeProperties(True, "THEME06"), # 0x15 + "Shadow": BoneNodeProperties(False, "THEME07"), # 0x16 + "Function": BoneNodeProperties(False, "THEME05"), # 0x18 + "HeldObject": BoneNodeProperties(False, "THEME09"), # 0x1C + "Scale": BoneNodeProperties(True, "THEME10"), # 0x1D + "StartRenderArea": BoneNodeProperties(True, "THEME13"), # 0x20 + "Ignore": BoneNodeProperties(False, "THEME08"), # Used for rigging + "SwitchOption": BoneNodeProperties(False, "THEME11"), } -boneLayers = { - 'anim' : 0, - 'other' : 1, - 'meta' : 2, - 'visual' : 3 -} +boneLayers = {"anim": 0, "other": 1, "meta": 2, "visual": 3} + def createBoneLayerMask(values): - mask = [False] * 32 - for value in values: - mask[value] = True - return mask + mask = [False] * 32 + for value in values: + mask[value] = True + return mask + def createBoneGroups(armatureObj): - for (groupName, properties) in boneNodeProperties.items(): - if getBoneGroupByName(armatureObj, groupName) is None: - boneGroup = armatureObj.pose.bone_groups.new(name = groupName) - boneGroup.color_set = properties.theme + for (groupName, properties) in boneNodeProperties.items(): + if getBoneGroupByName(armatureObj, groupName) is None: + boneGroup = armatureObj.pose.bone_groups.new(name=groupName) + boneGroup.color_set = properties.theme + def addBoneToGroup(armatureObj, boneName, groupName): - if groupName is None: - if bpy.context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode="OBJECT") - posebone = armatureObj.pose.bones[boneName] - bone = armatureObj.data.bones[boneName] - posebone.bone_group = None - bone.use_deform = True - bone.layers = createBoneLayerMask([boneLayers['anim']]) - posebone.lock_location = (False, False, False) - posebone.lock_rotation = (False, False, False) - posebone.lock_scale = (False, False, False) - return - - elif groupName not in boneNodeProperties: - raise PluginError("Bone group " + groupName + " doesn't exist.") - - if bpy.context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode="OBJECT") - posebone = armatureObj.pose.bones[boneName] - bone = armatureObj.data.bones[boneName] - posebone.bone_group_index = getBoneGroupIndex(armatureObj, groupName) - if groupName != 'Ignore': - bone.use_deform = boneNodeProperties[groupName].deform - if groupName != "DisplayList": - bone.layers = createBoneLayerMask([boneLayers['other']]) - if groupName != "SwitchOption": - posebone.lock_location = (True, True, True) - posebone.lock_rotation = (True, True, True) - posebone.lock_scale = (True, True, True) + if groupName is None: + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + posebone = armatureObj.pose.bones[boneName] + bone = armatureObj.data.bones[boneName] + posebone.bone_group = None + bone.use_deform = True + bone.layers = createBoneLayerMask([boneLayers["anim"]]) + posebone.lock_location = (False, False, False) + posebone.lock_rotation = (False, False, False) + posebone.lock_scale = (False, False, False) + return + + elif groupName not in boneNodeProperties: + raise PluginError("Bone group " + groupName + " doesn't exist.") + + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + posebone = armatureObj.pose.bones[boneName] + bone = armatureObj.data.bones[boneName] + posebone.bone_group_index = getBoneGroupIndex(armatureObj, groupName) + if groupName != "Ignore": + bone.use_deform = boneNodeProperties[groupName].deform + if groupName != "DisplayList": + bone.layers = createBoneLayerMask([boneLayers["other"]]) + if groupName != "SwitchOption": + posebone.lock_location = (True, True, True) + posebone.lock_rotation = (True, True, True) + posebone.lock_scale = (True, True, True) diff --git a/fast64_internal/sm64/sm64_geolayout_writer.py b/fast64_internal/sm64/sm64_geolayout_writer.py index 1b01e750a..13a120adf 100644 --- a/fast64_internal/sm64/sm64_geolayout_writer.py +++ b/fast64_internal/sm64/sm64_geolayout_writer.py @@ -19,399 +19,648 @@ from ..operators import ObjectDataExporter from ..panels import SM64_Panel -def appendSecondaryGeolayout(geoDirPath, geoName1, geoName2, additionalNode = ''): - geoPath = os.path.join(geoDirPath, 'geo.inc.c') - geoFile = open(geoPath, 'a', newline='\n') - geoFile.write('\n\nconst GeoLayout ' + geoName2 + '_geo[] = {\n' +\ - (('\t' + additionalNode + ',\n') if additionalNode is not None else '') +\ - '\tGEO_BRANCH(1, ' + geoName1 + '_geo),\n' +\ - '\tGEO_END(),\n};\n') - geoFile.close() -def replaceStarReferences(basePath): - kleptoPattern = 'GEO\_SCALE\(0x00\, 16384\)\,\s*' +\ - 'GEO\_OPEN\_NODE\(\)\,\s*' +\ - 'GEO\_ASM\([^\)]*?\)\,\s*' +\ - 'GEO\_TRANSLATE\_ROTATE\_WITH\_DL\([^\)]*? star\_seg3.*?GEO\_CLOSE\_NODE\(\)\,' - - unagiPattern = 'GEO\_SCALE\(0x00\, 16384\)\,\s*' +\ - 'GEO\_OPEN\_NODE\(\)\,\s*' +\ - 'GEO\_TRANSLATE\_ROTATE\_WITH\_DL\([^\)]*? star\_seg3.*?GEO\_CLOSE\_NODE\(\)\,' +def appendSecondaryGeolayout(geoDirPath, geoName1, geoName2, additionalNode=""): + geoPath = os.path.join(geoDirPath, "geo.inc.c") + geoFile = open(geoPath, "a", newline="\n") + geoFile.write( + "\n\nconst GeoLayout " + + geoName2 + + "_geo[] = {\n" + + (("\t" + additionalNode + ",\n") if additionalNode is not None else "") + + "\tGEO_BRANCH(1, " + + geoName1 + + "_geo),\n" + + "\tGEO_END(),\n};\n" + ) + geoFile.close() - unagiReplacement = 'GEO_TRANSLATE_ROTATE(LAYER_OPAQUE, 500, 0, 0, 0, 0, 0),\n' +\ - '\t' * 10 + 'GEO_OPEN_NODE(),\n' +\ - '\t' * 10 + '\tGEO_BRANCH_AND_LINK(star_geo),\n' +\ - '\t' * 10 + 'GEO_CLOSE_NODE(),' - kleptoReplacement = 'GEO_TRANSLATE_ROTATE(LAYER_OPAQUE, 75, 75, 0, 180, 270, 0),\n' +\ - '\t' * 10 + 'GEO_OPEN_NODE(),\n' +\ - '\t' * 10 + '\tGEO_BRANCH_AND_LINK(star_geo),\n' +\ - '\t' * 10 + 'GEO_CLOSE_NODE(),' - - unagiPath = os.path.join(basePath, 'actors/unagi/geo.inc.c') - replaceDLReferenceInGeo(unagiPath, unagiPattern, unagiReplacement) +def replaceStarReferences(basePath): + kleptoPattern = ( + "GEO\_SCALE\(0x00\, 16384\)\,\s*" + + "GEO\_OPEN\_NODE\(\)\,\s*" + + "GEO\_ASM\([^\)]*?\)\,\s*" + + "GEO\_TRANSLATE\_ROTATE\_WITH\_DL\([^\)]*? star\_seg3.*?GEO\_CLOSE\_NODE\(\)\," + ) + + unagiPattern = ( + "GEO\_SCALE\(0x00\, 16384\)\,\s*" + + "GEO\_OPEN\_NODE\(\)\,\s*" + + "GEO\_TRANSLATE\_ROTATE\_WITH\_DL\([^\)]*? star\_seg3.*?GEO\_CLOSE\_NODE\(\)\," + ) + + unagiReplacement = ( + "GEO_TRANSLATE_ROTATE(LAYER_OPAQUE, 500, 0, 0, 0, 0, 0),\n" + + "\t" * 10 + + "GEO_OPEN_NODE(),\n" + + "\t" * 10 + + "\tGEO_BRANCH_AND_LINK(star_geo),\n" + + "\t" * 10 + + "GEO_CLOSE_NODE()," + ) + + kleptoReplacement = ( + "GEO_TRANSLATE_ROTATE(LAYER_OPAQUE, 75, 75, 0, 180, 270, 0),\n" + + "\t" * 10 + + "GEO_OPEN_NODE(),\n" + + "\t" * 10 + + "\tGEO_BRANCH_AND_LINK(star_geo),\n" + + "\t" * 10 + + "GEO_CLOSE_NODE()," + ) + + unagiPath = os.path.join(basePath, "actors/unagi/geo.inc.c") + replaceDLReferenceInGeo(unagiPath, unagiPattern, unagiReplacement) + + kleptoPath = os.path.join(basePath, "actors/klepto/geo.inc.c") + replaceDLReferenceInGeo(kleptoPath, kleptoPattern, kleptoReplacement) - kleptoPath = os.path.join(basePath, 'actors/klepto/geo.inc.c') - replaceDLReferenceInGeo(kleptoPath, kleptoPattern, kleptoReplacement) def replaceTransparentStarReferences(basePath): - pattern = 'GEO\_SCALE\(0x00\, 16384\)\,\s*' +\ - 'GEO\_OPEN\_NODE\(\)\,\s*' +\ - 'GEO\_ASM\([^\)]*?\)\,\s*' +\ - 'GEO\_TRANSLATE\_ROTATE\_WITH\_DL\([^\)]*? transparent_star\_seg3.*?GEO\_CLOSE\_NODE\(\)\,' + pattern = ( + "GEO\_SCALE\(0x00\, 16384\)\,\s*" + + "GEO\_OPEN\_NODE\(\)\,\s*" + + "GEO\_ASM\([^\)]*?\)\,\s*" + + "GEO\_TRANSLATE\_ROTATE\_WITH\_DL\([^\)]*? transparent_star\_seg3.*?GEO\_CLOSE\_NODE\(\)\," + ) + + kleptoReplacement = ( + "GEO_TRANSLATE_ROTATE(LAYER_OPAQUE, 75, 75, 0, 180, 270, 0),\n" + + "\t" * 10 + + "GEO_OPEN_NODE(),\n" + + "\t" * 10 + + "\tGEO_BRANCH_AND_LINK(transparent_star_geo),\n" + + "\t" * 10 + + "GEO_CLOSE_NODE()," + ) + + kleptoPath = os.path.join(basePath, "actors/klepto/geo.inc.c") + replaceDLReferenceInGeo(kleptoPath, pattern, kleptoReplacement) - kleptoReplacement = 'GEO_TRANSLATE_ROTATE(LAYER_OPAQUE, 75, 75, 0, 180, 270, 0),\n' +\ - '\t' * 10 + 'GEO_OPEN_NODE(),\n' +\ - '\t' * 10 + '\tGEO_BRANCH_AND_LINK(transparent_star_geo),\n' +\ - '\t' * 10 + 'GEO_CLOSE_NODE(),' - - kleptoPath = os.path.join(basePath, 'actors/klepto/geo.inc.c') - replaceDLReferenceInGeo(kleptoPath, pattern, kleptoReplacement) def replaceCapReferences(basePath): - pattern = 'GEO\_TRANSLATE\_ROTATE\_WITH\_DL\([^\)]*?mario\_cap\_seg3.*?\)\,' - kleptoPattern = 'GEO\_SCALE\(0x00\, 16384\)\,\s*' +\ - 'GEO\_OPEN\_NODE\(\)\,\s*' +\ - 'GEO\_ASM\([^\)]*?\)\,\s*' +\ - 'GEO\_TRANSLATE\_ROTATE\_WITH\_DL\([^\)]*? mario\_cap\_seg3.*?GEO\_CLOSE\_NODE\(\)\,' - - kleptoReplacement = 'GEO_TRANSLATE_ROTATE(LAYER_OPAQUE, 75, 75, 0, 180, 270, 0),\n' +\ - '\t' * 10 + 'GEO_OPEN_NODE(),\n' +\ - '\t' * 10 + '\tGEO_BRANCH_AND_LINK(marios_cap_geo),\n' +\ - '\t' * 10 + 'GEO_CLOSE_NODE(),' - - ukikiReplacement = 'GEO_TRANSLATE_ROTATE(LAYER_OPAQUE, 100, 0, 0, -90, -90, 0),\n' +\ - '\t' * 8 + 'GEO_OPEN_NODE(),\n' +\ - '\t' * 8 + 'GEO_SCALE(0x00, 0x40000),\n' +\ - '\t' * 8 + '\tGEO_OPEN_NODE(),\n' +\ - '\t' * 8 + '\t\tGEO_BRANCH_AND_LINK(marios_cap_geo),\n' +\ - '\t' * 8 + '\tGEO_CLOSE_NODE(),' +\ - '\t' * 8 + 'GEO_CLOSE_NODE(),' - - snowmanReplacement = 'GEO_TRANSLATE_ROTATE(LAYER_OPAQUE, 490, 14, 43, 305, 0, 248),\n' +\ - '\t' * 7 + 'GEO_OPEN_NODE(),\n' +\ - '\t' * 7 + 'GEO_SCALE(0x00, 0x40000),\n' +\ - '\t' * 7 + '\tGEO_OPEN_NODE(),\n' +\ - '\t' * 7 + '\t\tGEO_BRANCH_AND_LINK(marios_cap_geo),\n' +\ - '\t' * 7 + '\tGEO_CLOSE_NODE(),' +\ - '\t' * 7 + 'GEO_CLOSE_NODE(),' - - ukikiPath = os.path.join(basePath, 'actors/ukiki/geo.inc.c') - replaceDLReferenceInGeo(ukikiPath, pattern, ukikiReplacement) - - snowmanPath = os.path.join(basePath, 'actors/snowman/geo.inc.c') - replaceDLReferenceInGeo(snowmanPath, pattern, snowmanReplacement) - - kleptoPath = os.path.join(basePath, 'actors/klepto/geo.inc.c') - replaceDLReferenceInGeo(kleptoPath, kleptoPattern, kleptoReplacement) + pattern = "GEO\_TRANSLATE\_ROTATE\_WITH\_DL\([^\)]*?mario\_cap\_seg3.*?\)\," + kleptoPattern = ( + "GEO\_SCALE\(0x00\, 16384\)\,\s*" + + "GEO\_OPEN\_NODE\(\)\,\s*" + + "GEO\_ASM\([^\)]*?\)\,\s*" + + "GEO\_TRANSLATE\_ROTATE\_WITH\_DL\([^\)]*? mario\_cap\_seg3.*?GEO\_CLOSE\_NODE\(\)\," + ) + + kleptoReplacement = ( + "GEO_TRANSLATE_ROTATE(LAYER_OPAQUE, 75, 75, 0, 180, 270, 0),\n" + + "\t" * 10 + + "GEO_OPEN_NODE(),\n" + + "\t" * 10 + + "\tGEO_BRANCH_AND_LINK(marios_cap_geo),\n" + + "\t" * 10 + + "GEO_CLOSE_NODE()," + ) + + ukikiReplacement = ( + "GEO_TRANSLATE_ROTATE(LAYER_OPAQUE, 100, 0, 0, -90, -90, 0),\n" + + "\t" * 8 + + "GEO_OPEN_NODE(),\n" + + "\t" * 8 + + "GEO_SCALE(0x00, 0x40000),\n" + + "\t" * 8 + + "\tGEO_OPEN_NODE(),\n" + + "\t" * 8 + + "\t\tGEO_BRANCH_AND_LINK(marios_cap_geo),\n" + + "\t" * 8 + + "\tGEO_CLOSE_NODE()," + + "\t" * 8 + + "GEO_CLOSE_NODE()," + ) + + snowmanReplacement = ( + "GEO_TRANSLATE_ROTATE(LAYER_OPAQUE, 490, 14, 43, 305, 0, 248),\n" + + "\t" * 7 + + "GEO_OPEN_NODE(),\n" + + "\t" * 7 + + "GEO_SCALE(0x00, 0x40000),\n" + + "\t" * 7 + + "\tGEO_OPEN_NODE(),\n" + + "\t" * 7 + + "\t\tGEO_BRANCH_AND_LINK(marios_cap_geo),\n" + + "\t" * 7 + + "\tGEO_CLOSE_NODE()," + + "\t" * 7 + + "GEO_CLOSE_NODE()," + ) + + ukikiPath = os.path.join(basePath, "actors/ukiki/geo.inc.c") + replaceDLReferenceInGeo(ukikiPath, pattern, ukikiReplacement) + + snowmanPath = os.path.join(basePath, "actors/snowman/geo.inc.c") + replaceDLReferenceInGeo(snowmanPath, pattern, snowmanReplacement) + + kleptoPath = os.path.join(basePath, "actors/klepto/geo.inc.c") + replaceDLReferenceInGeo(kleptoPath, kleptoPattern, kleptoReplacement) + def replaceDLReferenceInGeo(geoPath, pattern, replacement): - if not os.path.exists(geoPath): - return - geoFile = open(geoPath, 'r', newline = '\n') - geoData = geoFile.read() - geoFile.close() - - newData = re.sub(pattern, replacement, geoData, flags = re.DOTALL) - if newData != geoData: - geoFile = open(geoPath, 'w', newline = '\n') - geoFile.write(newData) - geoFile.close() + if not os.path.exists(geoPath): + return + geoFile = open(geoPath, "r", newline="\n") + geoData = geoFile.read() + geoFile.close() + + newData = re.sub(pattern, replacement, geoData, flags=re.DOTALL) + if newData != geoData: + geoFile = open(geoPath, "w", newline="\n") + geoFile.write(newData) + geoFile.close() + def prepareGeolayoutExport(armatureObj, obj): - # Make object and armature space the same. - setOrigin(armatureObj, obj) + # Make object and armature space the same. + setOrigin(armatureObj, obj) + + # Apply armature scale. + bpy.ops.object.select_all(action="DESELECT") + armatureObj.select_set(True) + bpy.context.view_layer.objects.active = armatureObj + bpy.ops.object.transform_apply( + location=False, rotation=False, scale=True, properties=False + ) - # Apply armature scale. - bpy.ops.object.select_all(action = "DESELECT") - armatureObj.select_set(True) - bpy.context.view_layer.objects.active = armatureObj - bpy.ops.object.transform_apply(location = False, rotation = False, - scale = True, properties = False) def getAllArmatures(armatureObj, currentArmatures): - linkedArmatures = [] - for bone in armatureObj.data.bones: - if bone.geo_cmd == 'Switch': - for switchOption in bone.switch_options: - if switchOption.switchType == 'Mesh': - if switchOption.optionArmature is None: - raise PluginError('"' + bone.name + '" in armature "' +\ - armatureObj.name + '" has a mesh switch option ' +\ - 'with no defined mesh.') - elif switchOption.optionArmature not in linkedArmatures and \ - switchOption.optionArmature not in currentArmatures: - linkedArmatures.append(switchOption.optionArmature) - - currentArmatures.extend(linkedArmatures) - for linkedArmature in linkedArmatures: - getAllArmatures(linkedArmature, currentArmatures) + linkedArmatures = [] + for bone in armatureObj.data.bones: + if bone.geo_cmd == "Switch": + for switchOption in bone.switch_options: + if switchOption.switchType == "Mesh": + if switchOption.optionArmature is None: + raise PluginError( + '"' + + bone.name + + '" in armature "' + + armatureObj.name + + '" has a mesh switch option ' + + "with no defined mesh." + ) + elif ( + switchOption.optionArmature not in linkedArmatures + and switchOption.optionArmature not in currentArmatures + ): + linkedArmatures.append(switchOption.optionArmature) + + currentArmatures.extend(linkedArmatures) + for linkedArmature in linkedArmatures: + getAllArmatures(linkedArmature, currentArmatures) + def getCameraObj(camera): - for obj in bpy.data.objects: - if obj.data == camera: - return obj - raise PluginError('The level camera ' + camera.name + \ - ' is no longer in the scene.') + for obj in bpy.data.objects: + if obj.data == camera: + return obj + raise PluginError("The level camera " + camera.name + " is no longer in the scene.") + def appendRevertToGeolayout(geolayoutGraph, fModel): - fModel.materialRevert = GfxList(fModel.name + "_" + 'material_revert_render_settings', - GfxListTag.MaterialRevert, fModel.DLFormat) - revertMatAndEndDraw(fModel.materialRevert, - [DPSetEnvColor(0xFF, 0xFF, 0xFF, 0xFF), - DPSetAlphaCompare("G_AC_NONE")]) - - # Get all draw layers, turn layers into strings (some are ints), deduplicate using a set - drawLayers = set(str(layer) for layer in geolayoutGraph.getDrawLayers()) - - # Revert settings in each draw layer - for layer in sorted(drawLayers): # Must be sorted, otherwise ordering is random due to `set` behavior - dlNode = DisplayListNode(layer) - dlNode.DLmicrocode = fModel.materialRevert - - # Assume first node is start render area - # This is important, since a render area groups things separately. - # If we added these nodes outside the render area, they would not happen - # right after the nodes inside. - geolayoutGraph.startGeolayout.nodes[0].children.append(TransformNode(dlNode)) + fModel.materialRevert = GfxList( + fModel.name + "_" + "material_revert_render_settings", + GfxListTag.MaterialRevert, + fModel.DLFormat, + ) + revertMatAndEndDraw( + fModel.materialRevert, + [DPSetEnvColor(0xFF, 0xFF, 0xFF, 0xFF), DPSetAlphaCompare("G_AC_NONE")], + ) + + # Get all draw layers, turn layers into strings (some are ints), deduplicate using a set + drawLayers = set(str(layer) for layer in geolayoutGraph.getDrawLayers()) + + # Revert settings in each draw layer + for layer in sorted( + drawLayers + ): # Must be sorted, otherwise ordering is random due to `set` behavior + dlNode = DisplayListNode(layer) + dlNode.DLmicrocode = fModel.materialRevert + + # Assume first node is start render area + # This is important, since a render area groups things separately. + # If we added these nodes outside the render area, they would not happen + # right after the nodes inside. + geolayoutGraph.startGeolayout.nodes[0].children.append(TransformNode(dlNode)) + # Convert to Geolayout -def convertArmatureToGeolayout(armatureObj, obj, convertTransformMatrix, - f3dType, isHWv1, camera, name, DLFormat, convertTextureData): - - fModel = SM64Model(f3dType, isHWv1, name, DLFormat) - - if len(armatureObj.children) == 0: - raise PluginError("No mesh parented to armature.") - - infoDict = getInfoDict(obj) - - # Find start bone, which is not root. Root is the start for animation. - startBoneNames = findStartBones(armatureObj) - - convertTransformMatrix = convertTransformMatrix @ \ - mathutils.Matrix.Diagonal(armatureObj.scale).to_4x4() - - # Start geolayout - if camera is not None: - geolayoutGraph = GeolayoutGraph(name) - cameraObj = getCameraObj(camera) - meshGeolayout = saveCameraSettingsToGeolayout( - geolayoutGraph, cameraObj, armatureObj, name + "_geo") - else: - geolayoutGraph = GeolayoutGraph(name + "_geo") - if armatureObj.use_render_area: - rootNode = TransformNode(StartRenderAreaNode(armatureObj.culling_radius)) - else: - rootNode = TransformNode(StartNode()) - geolayoutGraph.startGeolayout.nodes.append(rootNode) - meshGeolayout = geolayoutGraph.startGeolayout - - for i in range(len(startBoneNames)): - startBoneName = startBoneNames[i] - if i > 0: - meshGeolayout.nodes.append(TransformNode(StartNode())) - processBone(fModel, startBoneName, obj, armatureObj, - convertTransformMatrix, None, None, None, meshGeolayout.nodes[i], - [], name, meshGeolayout, geolayoutGraph, infoDict, convertTextureData) - generateSwitchOptions(meshGeolayout.nodes[0], meshGeolayout, geolayoutGraph, - name) - appendRevertToGeolayout(geolayoutGraph, fModel) - geolayoutGraph.generateSortedList() - #if DLFormat == DLFormat.GameSpecific: - # geolayoutGraph.convertToDynamic() - return geolayoutGraph, fModel +def convertArmatureToGeolayout( + armatureObj, + obj, + convertTransformMatrix, + f3dType, + isHWv1, + camera, + name, + DLFormat, + convertTextureData, +): + + fModel = SM64Model(f3dType, isHWv1, name, DLFormat) + + if len(armatureObj.children) == 0: + raise PluginError("No mesh parented to armature.") + + infoDict = getInfoDict(obj) + + # Find start bone, which is not root. Root is the start for animation. + startBoneNames = findStartBones(armatureObj) + + convertTransformMatrix = ( + convertTransformMatrix @ mathutils.Matrix.Diagonal(armatureObj.scale).to_4x4() + ) + + # Start geolayout + if camera is not None: + geolayoutGraph = GeolayoutGraph(name) + cameraObj = getCameraObj(camera) + meshGeolayout = saveCameraSettingsToGeolayout( + geolayoutGraph, cameraObj, armatureObj, name + "_geo" + ) + else: + geolayoutGraph = GeolayoutGraph(name + "_geo") + if armatureObj.use_render_area: + rootNode = TransformNode(StartRenderAreaNode(armatureObj.culling_radius)) + else: + rootNode = TransformNode(StartNode()) + geolayoutGraph.startGeolayout.nodes.append(rootNode) + meshGeolayout = geolayoutGraph.startGeolayout + + for i in range(len(startBoneNames)): + startBoneName = startBoneNames[i] + if i > 0: + meshGeolayout.nodes.append(TransformNode(StartNode())) + processBone( + fModel, + startBoneName, + obj, + armatureObj, + convertTransformMatrix, + None, + None, + None, + meshGeolayout.nodes[i], + [], + name, + meshGeolayout, + geolayoutGraph, + infoDict, + convertTextureData, + ) + generateSwitchOptions(meshGeolayout.nodes[0], meshGeolayout, geolayoutGraph, name) + appendRevertToGeolayout(geolayoutGraph, fModel) + geolayoutGraph.generateSortedList() + # if DLFormat == DLFormat.GameSpecific: + # geolayoutGraph.convertToDynamic() + return geolayoutGraph, fModel + # Camera is unused here -def convertObjectToGeolayout(obj, convertTransformMatrix, - f3dType, isHWv1, camera, name, fModel: FModel, areaObj, DLFormat, convertTextureData): - - if fModel is None: - fModel = SM64Model(f3dType, isHWv1, name, DLFormat) - - #convertTransformMatrix = convertTransformMatrix @ \ - # mathutils.Matrix.Diagonal(obj.scale).to_4x4() - - # Start geolayout - if areaObj is not None: - geolayoutGraph = GeolayoutGraph(name) - #cameraObj = getCameraObj(camera) - meshGeolayout = saveCameraSettingsToGeolayout( - geolayoutGraph, areaObj, obj, name + '_geo') - rootObj = areaObj - fModel.global_data.addAreaData(areaObj.areaIndex, - FAreaData(FFogData(areaObj.area_fog_position, areaObj.area_fog_color))) - - else: - geolayoutGraph = GeolayoutGraph(name + '_geo') - if isinstance(obj.data, bpy.types.Mesh) and obj.use_render_area: - rootNode = TransformNode(StartRenderAreaNode(obj.culling_radius)) - else: - rootNode = TransformNode(StartNode()) - geolayoutGraph.startGeolayout.nodes.append(rootNode) - meshGeolayout = geolayoutGraph.startGeolayout - rootObj = obj - - # Duplicate objects to apply scale / modifiers / linked data - tempObj, allObjs = \ - duplicateHierarchy(rootObj, 'ignore_render', True, None if areaObj is None else areaObj.areaIndex) - try: - processMesh(fModel, tempObj, convertTransformMatrix, - meshGeolayout.nodes[0], geolayoutGraph.startGeolayout, - geolayoutGraph, True, convertTextureData) - cleanupDuplicatedObjects(allObjs) - rootObj.select_set(True) - bpy.context.view_layer.objects.active = rootObj - except Exception as e: - cleanupDuplicatedObjects(allObjs) - rootObj.select_set(True) - bpy.context.view_layer.objects.active = rootObj - raise Exception(str(e)) - - appendRevertToGeolayout(geolayoutGraph, fModel) - geolayoutGraph.generateSortedList() - #if DLFormat == DLFormat.GameSpecific: - # geolayoutGraph.convertToDynamic() - return geolayoutGraph, fModel +def convertObjectToGeolayout( + obj, + convertTransformMatrix, + f3dType, + isHWv1, + camera, + name, + fModel: FModel, + areaObj, + DLFormat, + convertTextureData, +): + + if fModel is None: + fModel = SM64Model(f3dType, isHWv1, name, DLFormat) + + # convertTransformMatrix = convertTransformMatrix @ \ + # mathutils.Matrix.Diagonal(obj.scale).to_4x4() + + # Start geolayout + if areaObj is not None: + geolayoutGraph = GeolayoutGraph(name) + # cameraObj = getCameraObj(camera) + meshGeolayout = saveCameraSettingsToGeolayout( + geolayoutGraph, areaObj, obj, name + "_geo" + ) + rootObj = areaObj + fModel.global_data.addAreaData( + areaObj.areaIndex, + FAreaData(FFogData(areaObj.area_fog_position, areaObj.area_fog_color)), + ) + + else: + geolayoutGraph = GeolayoutGraph(name + "_geo") + if isinstance(obj.data, bpy.types.Mesh) and obj.use_render_area: + rootNode = TransformNode(StartRenderAreaNode(obj.culling_radius)) + else: + rootNode = TransformNode(StartNode()) + geolayoutGraph.startGeolayout.nodes.append(rootNode) + meshGeolayout = geolayoutGraph.startGeolayout + rootObj = obj + + # Duplicate objects to apply scale / modifiers / linked data + tempObj, allObjs = duplicateHierarchy( + rootObj, "ignore_render", True, None if areaObj is None else areaObj.areaIndex + ) + try: + processMesh( + fModel, + tempObj, + convertTransformMatrix, + meshGeolayout.nodes[0], + geolayoutGraph.startGeolayout, + geolayoutGraph, + True, + convertTextureData, + ) + cleanupDuplicatedObjects(allObjs) + rootObj.select_set(True) + bpy.context.view_layer.objects.active = rootObj + except Exception as e: + cleanupDuplicatedObjects(allObjs) + rootObj.select_set(True) + bpy.context.view_layer.objects.active = rootObj + raise Exception(str(e)) + + appendRevertToGeolayout(geolayoutGraph, fModel) + geolayoutGraph.generateSortedList() + # if DLFormat == DLFormat.GameSpecific: + # geolayoutGraph.convertToDynamic() + return geolayoutGraph, fModel + # C Export -def exportGeolayoutArmatureC(armatureObj, obj, convertTransformMatrix, - f3dType, isHWv1, dirPath, texDir, savePNG, texSeparate, camera, groupName, - headerType, dirName, geoName, levelName, customExport, DLFormat): - geolayoutGraph, fModel = convertArmatureToGeolayout(armatureObj, obj, - convertTransformMatrix, f3dType, isHWv1, camera, dirName, DLFormat, not savePNG) - - return saveGeolayoutC(geoName, dirName, geolayoutGraph, fModel, dirPath, texDir, - savePNG, texSeparate, groupName, headerType, levelName, customExport, DLFormat) - -def exportGeolayoutObjectC(obj, convertTransformMatrix, - f3dType, isHWv1, dirPath, texDir, savePNG, texSeparate, camera, groupName, - headerType, dirName, geoName, levelName, customExport, DLFormat): - geolayoutGraph, fModel = convertObjectToGeolayout(obj, - convertTransformMatrix, f3dType, isHWv1, camera, dirName, None, None, DLFormat, not savePNG) - - return saveGeolayoutC(geoName, dirName, geolayoutGraph, fModel, dirPath, texDir, - savePNG, texSeparate, groupName, headerType, levelName, customExport, DLFormat) - -def saveGeolayoutC(geoName, dirName, geolayoutGraph: GeolayoutGraph, fModel: FModel, exportDir, texDir, savePNG, - texSeparate, groupName, headerType, levelName, customExport, DLFormat): - dirPath, texDir = getExportDir(customExport, exportDir, headerType, - levelName, texDir, dirName) - - dirName = toAlnum(dirName) - groupName = toAlnum(groupName) - geoDirPath = os.path.join(dirPath, toAlnum(dirName)) - - if not os.path.exists(geoDirPath): - os.mkdir(geoDirPath) - - if headerType == 'Actor': - scrollName = 'actor_geo_' + dirName - elif headerType == 'Level': - scrollName = levelName + '_level_geo_' + dirName - - gfxFormatter = SM64GfxFormatter(ScrollMethod.Vertex) - if not customExport and headerType == 'Level': - texExportPath = dirPath - else: - texExportPath = geoDirPath - exportData = fModel.to_c(TextureExportSettings(texSeparate, savePNG, texDir, texExportPath), gfxFormatter) - staticData = exportData.staticData - dynamicData = exportData.dynamicData - texC = exportData.textureData - - scrollData, hasScrolling = fModel.to_c_vertex_scroll(scrollName, gfxFormatter) - scroll_data = scrollData.source - cDefineScroll = scrollData.header - geolayoutGraph.startGeolayout.name = geoName - - # Handle cases where geolayout name != folder name + _geo - #if dirName == 'blue_fish': - # geolayoutGraph.startGeolayout.name = 'fish_geo' - #if dirName == 'bomb': - # geolayoutGraph.startGeolayout.name = 'bowser_bomb_geo' - #if dirName == 'book': - # geolayoutGraph.startGeolayout.name = 'bookend_geo' - #if dirName == 'bookend': - # geolayoutGraph.startGeolayout.name = 'bookend_part_geo' - #if dirName == 'bowser_flame': - # geolayoutGraph.startGeolayout.name = 'bowser_flames_geo' - #if dirName == 'capswitch': - # geolayoutGraph.startGeolayout.name = 'cap_switch_geo' - geoData = geolayoutGraph.to_c() - - if headerType == 'Actor': - matCInclude = '#include "actors/' + dirName + '/material.inc.c"' - matHInclude = '#include "actors/' + dirName + '/material.inc.h"' - headerInclude = '#include "actors/' + dirName + '/geo_header.h"' - - if not customExport: - # Group name checking, before anything is exported to prevent invalid state on error. - if groupName == '' or groupName is None: - raise PluginError("Actor header type chosen but group name not provided.") - - groupPathC = os.path.join(dirPath, groupName + ".c") - groupPathGeoC = os.path.join(dirPath, groupName + "_geo.c") - groupPathH = os.path.join(dirPath, groupName + ".h") - - if not os.path.exists(groupPathC): - raise PluginError(groupPathC + ' not found.\n Most likely issue is that \"' + groupName + '\" is an invalid group name.') - elif not os.path.exists(groupPathGeoC): - raise PluginError(groupPathGeoC + ' not found.\n Most likely issue is that \"' + groupName + '\" is an invalid group name.') - elif not os.path.exists(groupPathH): - raise PluginError(groupPathH + ' not found.\n Most likely issue is that \"' + groupName + '\" is an invalid group name.') - - else: - matCInclude = '#include "levels/' + levelName + '/' + dirName + '/material.inc.c"' - matHInclude = '#include "levels/' + levelName + '/' + dirName + '/material.inc.h"' - headerInclude = '#include "levels/' + levelName + '/' + dirName + '/geo_header.h"' - - modifyTexScrollFiles(exportDir, geoDirPath, cDefineScroll, scroll_data, hasScrolling) - - if DLFormat == DLFormat.Static: - staticData.source += '\n' + dynamicData.source - staticData.header = geoData.header + staticData.header + dynamicData.header - else: - geoData.source = writeMaterialFiles(exportDir, geoDirPath, - headerInclude, matHInclude, - dynamicData.header, dynamicData.source, geoData.source, customExport) - - modelPath = os.path.join(geoDirPath, 'model.inc.c') - modelFile = open(modelPath, 'w', newline='\n') - modelFile.write(staticData.source) - modelFile.close() - - if texSeparate: - texPath = os.path.join(geoDirPath, 'texture.inc.c') - texFile = open(texPath, 'w', newline='\n') - texFile.write(texC.source) - texFile.close() - - fModel.freePalettes() - - # save geolayout - geoPath = os.path.join(geoDirPath, 'geo.inc.c') - geoFile = open(geoPath, 'w', newline='\n') - geoFile.write(geoData.source) - geoFile.close() - - # save header - headerPath = os.path.join(geoDirPath, 'geo_header.h') - cDefFile = open(headerPath, 'w', newline='\n') - cDefFile.write(staticData.header) - cDefFile.close() - - fileStatus = None - if not customExport: - if headerType == 'Actor': - if dirName == 'star' and bpy.context.scene.replaceStarRefs: - replaceStarReferences(exportDir) - if dirName == 'transparent_star' and bpy.context.scene.replaceTransparentStarRefs: - replaceTransparentStarReferences(exportDir) - if dirName == 'marios_cap' and bpy.context.scene.replaceCapRefs: - replaceCapReferences(exportDir) - - ''' +def exportGeolayoutArmatureC( + armatureObj, + obj, + convertTransformMatrix, + f3dType, + isHWv1, + dirPath, + texDir, + savePNG, + texSeparate, + camera, + groupName, + headerType, + dirName, + geoName, + levelName, + customExport, + DLFormat, +): + geolayoutGraph, fModel = convertArmatureToGeolayout( + armatureObj, + obj, + convertTransformMatrix, + f3dType, + isHWv1, + camera, + dirName, + DLFormat, + not savePNG, + ) + + return saveGeolayoutC( + geoName, + dirName, + geolayoutGraph, + fModel, + dirPath, + texDir, + savePNG, + texSeparate, + groupName, + headerType, + levelName, + customExport, + DLFormat, + ) + + +def exportGeolayoutObjectC( + obj, + convertTransformMatrix, + f3dType, + isHWv1, + dirPath, + texDir, + savePNG, + texSeparate, + camera, + groupName, + headerType, + dirName, + geoName, + levelName, + customExport, + DLFormat, +): + geolayoutGraph, fModel = convertObjectToGeolayout( + obj, + convertTransformMatrix, + f3dType, + isHWv1, + camera, + dirName, + None, + None, + DLFormat, + not savePNG, + ) + + return saveGeolayoutC( + geoName, + dirName, + geolayoutGraph, + fModel, + dirPath, + texDir, + savePNG, + texSeparate, + groupName, + headerType, + levelName, + customExport, + DLFormat, + ) + + +def saveGeolayoutC( + geoName, + dirName, + geolayoutGraph: GeolayoutGraph, + fModel: FModel, + exportDir, + texDir, + savePNG, + texSeparate, + groupName, + headerType, + levelName, + customExport, + DLFormat, +): + dirPath, texDir = getExportDir( + customExport, exportDir, headerType, levelName, texDir, dirName + ) + + dirName = toAlnum(dirName) + groupName = toAlnum(groupName) + geoDirPath = os.path.join(dirPath, toAlnum(dirName)) + + if not os.path.exists(geoDirPath): + os.mkdir(geoDirPath) + + if headerType == "Actor": + scrollName = "actor_geo_" + dirName + elif headerType == "Level": + scrollName = levelName + "_level_geo_" + dirName + + gfxFormatter = SM64GfxFormatter(ScrollMethod.Vertex) + if not customExport and headerType == "Level": + texExportPath = dirPath + else: + texExportPath = geoDirPath + exportData = fModel.to_c( + TextureExportSettings(texSeparate, savePNG, texDir, texExportPath), gfxFormatter + ) + staticData = exportData.staticData + dynamicData = exportData.dynamicData + texC = exportData.textureData + + scrollData, hasScrolling = fModel.to_c_vertex_scroll(scrollName, gfxFormatter) + scroll_data = scrollData.source + cDefineScroll = scrollData.header + geolayoutGraph.startGeolayout.name = geoName + + # Handle cases where geolayout name != folder name + _geo + # if dirName == 'blue_fish': + # geolayoutGraph.startGeolayout.name = 'fish_geo' + # if dirName == 'bomb': + # geolayoutGraph.startGeolayout.name = 'bowser_bomb_geo' + # if dirName == 'book': + # geolayoutGraph.startGeolayout.name = 'bookend_geo' + # if dirName == 'bookend': + # geolayoutGraph.startGeolayout.name = 'bookend_part_geo' + # if dirName == 'bowser_flame': + # geolayoutGraph.startGeolayout.name = 'bowser_flames_geo' + # if dirName == 'capswitch': + # geolayoutGraph.startGeolayout.name = 'cap_switch_geo' + geoData = geolayoutGraph.to_c() + + if headerType == "Actor": + matCInclude = '#include "actors/' + dirName + '/material.inc.c"' + matHInclude = '#include "actors/' + dirName + '/material.inc.h"' + headerInclude = '#include "actors/' + dirName + '/geo_header.h"' + + if not customExport: + # Group name checking, before anything is exported to prevent invalid state on error. + if groupName == "" or groupName is None: + raise PluginError( + "Actor header type chosen but group name not provided." + ) + + groupPathC = os.path.join(dirPath, groupName + ".c") + groupPathGeoC = os.path.join(dirPath, groupName + "_geo.c") + groupPathH = os.path.join(dirPath, groupName + ".h") + + if not os.path.exists(groupPathC): + raise PluginError( + groupPathC + + ' not found.\n Most likely issue is that "' + + groupName + + '" is an invalid group name.' + ) + elif not os.path.exists(groupPathGeoC): + raise PluginError( + groupPathGeoC + + ' not found.\n Most likely issue is that "' + + groupName + + '" is an invalid group name.' + ) + elif not os.path.exists(groupPathH): + raise PluginError( + groupPathH + + ' not found.\n Most likely issue is that "' + + groupName + + '" is an invalid group name.' + ) + + else: + matCInclude = ( + '#include "levels/' + levelName + "/" + dirName + '/material.inc.c"' + ) + matHInclude = ( + '#include "levels/' + levelName + "/" + dirName + '/material.inc.h"' + ) + headerInclude = ( + '#include "levels/' + levelName + "/" + dirName + '/geo_header.h"' + ) + + modifyTexScrollFiles( + exportDir, geoDirPath, cDefineScroll, scroll_data, hasScrolling + ) + + if DLFormat == DLFormat.Static: + staticData.source += "\n" + dynamicData.source + staticData.header = geoData.header + staticData.header + dynamicData.header + else: + geoData.source = writeMaterialFiles( + exportDir, + geoDirPath, + headerInclude, + matHInclude, + dynamicData.header, + dynamicData.source, + geoData.source, + customExport, + ) + + modelPath = os.path.join(geoDirPath, "model.inc.c") + modelFile = open(modelPath, "w", newline="\n") + modelFile.write(staticData.source) + modelFile.close() + + if texSeparate: + texPath = os.path.join(geoDirPath, "texture.inc.c") + texFile = open(texPath, "w", newline="\n") + texFile.write(texC.source) + texFile.close() + + fModel.freePalettes() + + # save geolayout + geoPath = os.path.join(geoDirPath, "geo.inc.c") + geoFile = open(geoPath, "w", newline="\n") + geoFile.write(geoData.source) + geoFile.close() + + # save header + headerPath = os.path.join(geoDirPath, "geo_header.h") + cDefFile = open(headerPath, "w", newline="\n") + cDefFile.write(staticData.header) + cDefFile.close() + + fileStatus = None + if not customExport: + if headerType == "Actor": + if dirName == "star" and bpy.context.scene.replaceStarRefs: + replaceStarReferences(exportDir) + if ( + dirName == "transparent_star" + and bpy.context.scene.replaceTransparentStarRefs + ): + replaceTransparentStarReferences(exportDir) + if dirName == "marios_cap" and bpy.context.scene.replaceCapRefs: + replaceCapReferences(exportDir) + + """ capPath = os.path.join(exportDir, 'actors/mario_cap/geo.inc.c') if dirName == 'marios_cap' and bpy.context.scene.modifyOldGeo: replaceDLReferenceInGeo(capPath, 'marios\_cap\_geo\[\]', 'marios_cap_geo_old[]') @@ -451,186 +700,389 @@ def saveGeolayoutC(geoName, dirName, geolayoutGraph: GeolayoutGraph, fModel: FMo appendSecondaryGeolayout(geoDirPath, 'breakable_box', 'breakable_box_small') if dirName == 'bully': appendSecondaryGeolayout(geoDirPath, 'bully', 'bully_boss', 'GEO_SCALE(0x00, 0x2000), GEO_NODE_OPEN(),') - ''' - - # Write to group files - groupPathC = os.path.join(dirPath, groupName + ".c") - groupPathGeoC = os.path.join(dirPath, groupName + "_geo.c") - groupPathH = os.path.join(dirPath, groupName + ".h") - - writeIfNotFound(groupPathC, '\n#include "' + dirName + '/model.inc.c"', '') - writeIfNotFound(groupPathGeoC, '\n#include "' + dirName + '/geo.inc.c"', '') - writeIfNotFound(groupPathH, '\n#include "' + dirName + '/geo_header.h"', '\n#endif') - - texscrollIncludeC = '#include "actors/' + dirName + '/texscroll.inc.c"' - texscrollIncludeH = '#include "actors/' + dirName + '/texscroll.inc.h"' - texscrollGroup = groupName - texscrollGroupInclude = '#include "actors/' + groupName + '.h"' - - elif headerType == 'Level': - groupPathC = os.path.join(dirPath, "leveldata.c") - groupPathGeoC = os.path.join(dirPath, "geo.c") - groupPathH = os.path.join(dirPath, "header.h") + """ + + # Write to group files + groupPathC = os.path.join(dirPath, groupName + ".c") + groupPathGeoC = os.path.join(dirPath, groupName + "_geo.c") + groupPathH = os.path.join(dirPath, groupName + ".h") + + writeIfNotFound(groupPathC, '\n#include "' + dirName + '/model.inc.c"', "") + writeIfNotFound(groupPathGeoC, '\n#include "' + dirName + '/geo.inc.c"', "") + writeIfNotFound( + groupPathH, '\n#include "' + dirName + '/geo_header.h"', "\n#endif" + ) + + texscrollIncludeC = '#include "actors/' + dirName + '/texscroll.inc.c"' + texscrollIncludeH = '#include "actors/' + dirName + '/texscroll.inc.h"' + texscrollGroup = groupName + texscrollGroupInclude = '#include "actors/' + groupName + '.h"' + + elif headerType == "Level": + groupPathC = os.path.join(dirPath, "leveldata.c") + groupPathGeoC = os.path.join(dirPath, "geo.c") + groupPathH = os.path.join(dirPath, "header.h") + + writeIfNotFound( + groupPathC, + '\n#include "levels/' + levelName + "/" + dirName + '/model.inc.c"', + "", + ) + writeIfNotFound( + groupPathGeoC, + '\n#include "levels/' + levelName + "/" + dirName + '/geo.inc.c"', + "", + ) + writeIfNotFound( + groupPathH, + '\n#include "levels/' + levelName + "/" + dirName + '/geo_header.h"', + "\n#endif", + ) + + texscrollIncludeC = ( + '#include "levels/' + levelName + "/" + dirName + '/texscroll.inc.c"' + ) + texscrollIncludeH = ( + '#include "levels/' + levelName + "/" + dirName + '/texscroll.inc.h"' + ) + texscrollGroup = levelName + texscrollGroupInclude = '#include "levels/' + levelName + '/header.h"' + + fileStatus = modifyTexScrollHeadersGroup( + exportDir, + texscrollIncludeC, + texscrollIncludeH, + texscrollGroup, + cDefineScroll, + texscrollGroupInclude, + hasScrolling, + ) + + if DLFormat != DLFormat.Static: # Change this + writeMaterialHeaders(exportDir, matCInclude, matHInclude) + + return staticData.header, fileStatus - writeIfNotFound(groupPathC, '\n#include "levels/' + levelName + '/' + dirName + '/model.inc.c"', '') - writeIfNotFound(groupPathGeoC, '\n#include "levels/' + levelName + '/' + dirName + '/geo.inc.c"', '') - writeIfNotFound(groupPathH, '\n#include "levels/' + levelName + '/' + dirName + '/geo_header.h"', '\n#endif') - - texscrollIncludeC = '#include "levels/' + levelName + '/' + dirName + '/texscroll.inc.c"' - texscrollIncludeH = '#include "levels/' + levelName + '/' + dirName + '/texscroll.inc.h"' - texscrollGroup = levelName - texscrollGroupInclude = '#include "levels/' + levelName + '/header.h"' - - fileStatus = modifyTexScrollHeadersGroup(exportDir, texscrollIncludeC, texscrollIncludeH, - texscrollGroup, cDefineScroll, texscrollGroupInclude, hasScrolling) - - if DLFormat != DLFormat.Static: # Change this - writeMaterialHeaders(exportDir, matCInclude, matHInclude) - - return staticData.header, fileStatus # Insertable Binary -def exportGeolayoutArmatureInsertableBinary(armatureObj, obj, - convertTransformMatrix, f3dType, isHWv1, filepath, camera): - geolayoutGraph, fModel = convertArmatureToGeolayout(armatureObj, obj, - convertTransformMatrix, f3dType, isHWv1, camera, armatureObj.name, DLFormat.Static, True) - - saveGeolayoutInsertableBinary(geolayoutGraph, fModel, filepath, f3dType) - -def exportGeolayoutObjectInsertableBinary(obj, convertTransformMatrix, - f3dType, isHWv1, filepath, camera): - geolayoutGraph, fModel = convertObjectToGeolayout(obj, - convertTransformMatrix, f3dType, isHWv1, camera, obj.name, None, None, DLFormat.Static, True) +def exportGeolayoutArmatureInsertableBinary( + armatureObj, obj, convertTransformMatrix, f3dType, isHWv1, filepath, camera +): + geolayoutGraph, fModel = convertArmatureToGeolayout( + armatureObj, + obj, + convertTransformMatrix, + f3dType, + isHWv1, + camera, + armatureObj.name, + DLFormat.Static, + True, + ) + + saveGeolayoutInsertableBinary(geolayoutGraph, fModel, filepath, f3dType) + + +def exportGeolayoutObjectInsertableBinary( + obj, convertTransformMatrix, f3dType, isHWv1, filepath, camera +): + geolayoutGraph, fModel = convertObjectToGeolayout( + obj, + convertTransformMatrix, + f3dType, + isHWv1, + camera, + obj.name, + None, + None, + DLFormat.Static, + True, + ) + + saveGeolayoutInsertableBinary(geolayoutGraph, fModel, filepath, f3dType) - saveGeolayoutInsertableBinary(geolayoutGraph, fModel, filepath, f3dType) def saveGeolayoutInsertableBinary(geolayoutGraph, fModel, filepath, f3d): - data, startRAM = \ - getBinaryBank0GeolayoutData(fModel, geolayoutGraph, 0, [0, 0xFFFFFF]) - - address_ptrs = geolayoutGraph.get_ptr_addresses() - address_ptrs.extend(fModel.get_ptr_addresses(f3d)) - - writeInsertableFile(filepath, insertableBinaryTypes['Geolayout'], - address_ptrs, geolayoutGraph.startGeolayout.startAddress, data) + data, startRAM = getBinaryBank0GeolayoutData( + fModel, geolayoutGraph, 0, [0, 0xFFFFFF] + ) -# Binary Bank 0 Export -def exportGeolayoutArmatureBinaryBank0(romfile, armatureObj, obj, exportRange, - convertTransformMatrix, levelCommandPos, modelID, textDumpFilePath, - f3dType, isHWv1, RAMAddr, camera): + address_ptrs = geolayoutGraph.get_ptr_addresses() + address_ptrs.extend(fModel.get_ptr_addresses(f3d)) - geolayoutGraph, fModel = convertArmatureToGeolayout(armatureObj, obj, - convertTransformMatrix, f3dType, isHWv1, camera, armatureObj.name, DLFormat.Static, True) + writeInsertableFile( + filepath, + insertableBinaryTypes["Geolayout"], + address_ptrs, + geolayoutGraph.startGeolayout.startAddress, + data, + ) - return saveGeolayoutBinaryBank0(romfile, fModel, geolayoutGraph, - exportRange, levelCommandPos, modelID, textDumpFilePath, RAMAddr) -def exportGeolayoutObjectBinaryBank0(romfile, obj, exportRange, - convertTransformMatrix, levelCommandPos, modelID, textDumpFilePath, - f3dType, isHWv1, RAMAddr, camera): +# Binary Bank 0 Export +def exportGeolayoutArmatureBinaryBank0( + romfile, + armatureObj, + obj, + exportRange, + convertTransformMatrix, + levelCommandPos, + modelID, + textDumpFilePath, + f3dType, + isHWv1, + RAMAddr, + camera, +): - geolayoutGraph, fModel = convertObjectToGeolayout(obj, - convertTransformMatrix, f3dType, isHWv1, camera, obj.name, None, None, DLFormat.Static, True) + geolayoutGraph, fModel = convertArmatureToGeolayout( + armatureObj, + obj, + convertTransformMatrix, + f3dType, + isHWv1, + camera, + armatureObj.name, + DLFormat.Static, + True, + ) + + return saveGeolayoutBinaryBank0( + romfile, + fModel, + geolayoutGraph, + exportRange, + levelCommandPos, + modelID, + textDumpFilePath, + RAMAddr, + ) + + +def exportGeolayoutObjectBinaryBank0( + romfile, + obj, + exportRange, + convertTransformMatrix, + levelCommandPos, + modelID, + textDumpFilePath, + f3dType, + isHWv1, + RAMAddr, + camera, +): - return saveGeolayoutBinaryBank0(romfile, fModel, geolayoutGraph, - exportRange, levelCommandPos, modelID, textDumpFilePath, RAMAddr) + geolayoutGraph, fModel = convertObjectToGeolayout( + obj, + convertTransformMatrix, + f3dType, + isHWv1, + camera, + obj.name, + None, + None, + DLFormat.Static, + True, + ) + + return saveGeolayoutBinaryBank0( + romfile, + fModel, + geolayoutGraph, + exportRange, + levelCommandPos, + modelID, + textDumpFilePath, + RAMAddr, + ) + + +def saveGeolayoutBinaryBank0( + romfile, + fModel, + geolayoutGraph, + exportRange, + levelCommandPos, + modelID, + textDumpFilePath, + RAMAddr, +): + data, startRAM = getBinaryBank0GeolayoutData( + fModel, geolayoutGraph, RAMAddr, exportRange + ) + segmentData = copy.copy(bank0Segment) -def saveGeolayoutBinaryBank0(romfile, fModel, geolayoutGraph, exportRange, - levelCommandPos, modelID, textDumpFilePath, RAMAddr): - data, startRAM = getBinaryBank0GeolayoutData( - fModel, geolayoutGraph, RAMAddr, exportRange) - segmentData = copy.copy(bank0Segment) + startAddress = get64bitAlignedAddr(exportRange[0]) + romfile.seek(startAddress) + romfile.write(data) - startAddress = get64bitAlignedAddr(exportRange[0]) - romfile.seek(startAddress) - romfile.write(data) + geoStart = geolayoutGraph.startGeolayout.startAddress + segPointerData = encodeSegmentedAddr(geoStart, segmentData) + geoWriteLevelCommand(romfile, segPointerData, levelCommandPos, modelID) + geoWriteTextDump(textDumpFilePath, geolayoutGraph, segmentData) - geoStart = geolayoutGraph.startGeolayout.startAddress - segPointerData = encodeSegmentedAddr(geoStart, segmentData) - geoWriteLevelCommand(romfile, segPointerData, levelCommandPos, modelID) - geoWriteTextDump(textDumpFilePath, geolayoutGraph, segmentData) + return ( + (startAddress, startAddress + len(data)), + startRAM + 0x80000000, + geoStart + 0x80000000, + ) - return ((startAddress, startAddress + len(data)), startRAM + 0x80000000, - geoStart + 0x80000000) def getBinaryBank0GeolayoutData(fModel, geolayoutGraph, RAMAddr, exportRange): - fModel.freePalettes() - segmentData = copy.copy(bank0Segment) - startRAM = get64bitAlignedAddr(RAMAddr) - nonGeoStartAddr = startRAM + geolayoutGraph.size() - - geolayoutGraph.set_addr(startRAM) - addrRange = fModel.set_addr(nonGeoStartAddr) - addrEndInROM = addrRange[1] - startRAM + exportRange[0] - if addrEndInROM > exportRange[1]: - raise PluginError('Size too big: Data ends at ' + hex(addrEndInROM) +\ - ', which is larger than the specified range.') - bytesIO = BytesIO() - #actualRAMAddr = get64bitAlignedAddr(RAMAddr) - geolayoutGraph.save_binary(bytesIO, segmentData) - fModel.save_binary(bytesIO, segmentData) - - data = bytesIO.getvalue()[startRAM:] - bytesIO.close() - return data, startRAM - -# Binary Export -def exportGeolayoutArmatureBinary(romfile, armatureObj, obj, exportRange, - convertTransformMatrix, levelData, levelCommandPos, modelID, - textDumpFilePath, f3dType, isHWv1, camera): - - geolayoutGraph, fModel = convertArmatureToGeolayout(armatureObj, obj, - convertTransformMatrix, f3dType, isHWv1, camera, armatureObj.name, DLFormat.Static, True) + fModel.freePalettes() + segmentData = copy.copy(bank0Segment) + startRAM = get64bitAlignedAddr(RAMAddr) + nonGeoStartAddr = startRAM + geolayoutGraph.size() + + geolayoutGraph.set_addr(startRAM) + addrRange = fModel.set_addr(nonGeoStartAddr) + addrEndInROM = addrRange[1] - startRAM + exportRange[0] + if addrEndInROM > exportRange[1]: + raise PluginError( + "Size too big: Data ends at " + + hex(addrEndInROM) + + ", which is larger than the specified range." + ) + bytesIO = BytesIO() + # actualRAMAddr = get64bitAlignedAddr(RAMAddr) + geolayoutGraph.save_binary(bytesIO, segmentData) + fModel.save_binary(bytesIO, segmentData) + + data = bytesIO.getvalue()[startRAM:] + bytesIO.close() + return data, startRAM - return saveGeolayoutBinary(romfile, geolayoutGraph, fModel, exportRange, - levelData, levelCommandPos, modelID, textDumpFilePath) -def exportGeolayoutObjectBinary(romfile, obj, exportRange, - convertTransformMatrix, levelData, levelCommandPos, modelID, - textDumpFilePath, f3dType, isHWv1, camera): +# Binary Export +def exportGeolayoutArmatureBinary( + romfile, + armatureObj, + obj, + exportRange, + convertTransformMatrix, + levelData, + levelCommandPos, + modelID, + textDumpFilePath, + f3dType, + isHWv1, + camera, +): - geolayoutGraph, fModel = convertObjectToGeolayout(obj, - convertTransformMatrix, f3dType, isHWv1, camera, obj.name, None, None, DLFormat.Static, True) + geolayoutGraph, fModel = convertArmatureToGeolayout( + armatureObj, + obj, + convertTransformMatrix, + f3dType, + isHWv1, + camera, + armatureObj.name, + DLFormat.Static, + True, + ) + + return saveGeolayoutBinary( + romfile, + geolayoutGraph, + fModel, + exportRange, + levelData, + levelCommandPos, + modelID, + textDumpFilePath, + ) + + +def exportGeolayoutObjectBinary( + romfile, + obj, + exportRange, + convertTransformMatrix, + levelData, + levelCommandPos, + modelID, + textDumpFilePath, + f3dType, + isHWv1, + camera, +): - return saveGeolayoutBinary(romfile, geolayoutGraph, fModel, exportRange, - levelData, levelCommandPos, modelID, textDumpFilePath) + geolayoutGraph, fModel = convertObjectToGeolayout( + obj, + convertTransformMatrix, + f3dType, + isHWv1, + camera, + obj.name, + None, + None, + DLFormat.Static, + True, + ) + + return saveGeolayoutBinary( + romfile, + geolayoutGraph, + fModel, + exportRange, + levelData, + levelCommandPos, + modelID, + textDumpFilePath, + ) + + +def saveGeolayoutBinary( + romfile, + geolayoutGraph, + fModel, + exportRange, + levelData, + levelCommandPos, + modelID, + textDumpFilePath, +): + fModel.freePalettes() -def saveGeolayoutBinary(romfile, geolayoutGraph, fModel, exportRange, - levelData, levelCommandPos, modelID, textDumpFilePath): - fModel.freePalettes() + # Get length of data, then actually write it after relative addresses + # are found. + startAddress = get64bitAlignedAddr(exportRange[0]) + nonGeoStartAddr = startAddress + geolayoutGraph.size() - # Get length of data, then actually write it after relative addresses - # are found. - startAddress = get64bitAlignedAddr(exportRange[0]) - nonGeoStartAddr = startAddress + geolayoutGraph.size() + geolayoutGraph.set_addr(startAddress) + addrRange = fModel.set_addr(nonGeoStartAddr) + if addrRange[1] > exportRange[1]: + raise PluginError( + "Size too big: Data ends at " + + hex(addrRange[1]) + + ", which is larger than the specified range." + ) + geolayoutGraph.save_binary(romfile, levelData) + fModel.save_binary(romfile, levelData) - geolayoutGraph.set_addr(startAddress) - addrRange = fModel.set_addr(nonGeoStartAddr) - if addrRange[1] > exportRange[1]: - raise PluginError('Size too big: Data ends at ' + hex(addrRange[1]) +\ - ', which is larger than the specified range.') - geolayoutGraph.save_binary(romfile, levelData) - fModel.save_binary(romfile, levelData) + geoStart = geolayoutGraph.startGeolayout.startAddress + segPointerData = encodeSegmentedAddr(geoStart, levelData) + geoWriteLevelCommand(romfile, segPointerData, levelCommandPos, modelID) + geoWriteTextDump(textDumpFilePath, geolayoutGraph, levelData) - geoStart = geolayoutGraph.startGeolayout.startAddress - segPointerData = encodeSegmentedAddr(geoStart, levelData) - geoWriteLevelCommand(romfile, segPointerData, levelCommandPos, modelID) - geoWriteTextDump(textDumpFilePath, geolayoutGraph, levelData) + return (startAddress, addrRange[1]), bytesToHex(segPointerData) - return (startAddress, addrRange[1]), bytesToHex(segPointerData) def geoWriteLevelCommand(romfile, segPointerData, levelCommandPos, modelID): - if levelCommandPos is not None and modelID is not None: - romfile.seek(levelCommandPos + 3) - romfile.write(modelID.to_bytes(1, byteorder='big')) - romfile.seek(levelCommandPos + 4) - romfile.write(segPointerData) + if levelCommandPos is not None and modelID is not None: + romfile.seek(levelCommandPos + 3) + romfile.write(modelID.to_bytes(1, byteorder="big")) + romfile.seek(levelCommandPos + 4) + romfile.write(segPointerData) + def geoWriteTextDump(textDumpFilePath, geolayoutGraph, levelData): - if textDumpFilePath is not None: - openfile = open(textDumpFilePath, 'w', newline='\n') - openfile.write(geolayoutGraph.toTextDump(levelData)) - openfile.close() + if textDumpFilePath is not None: + openfile = open(textDumpFilePath, "w", newline="\n") + openfile.write(geolayoutGraph.toTextDump(levelData)) + openfile.close() + # Switch Handling Process # When convert armature to geolayout node hierarchy, mesh switch options @@ -641,471 +1093,671 @@ def geoWriteTextDump(textDumpFilePath, geolayoutGraph, levelData): # Afterward, the node hierarchy is traversed again, and any SwitchOverride # nodes are converted to actual geolayout node hierarchies. def generateSwitchOptions(transformNode, geolayout, geolayoutGraph, prefix): - if isinstance(transformNode.node, JumpNode): - for node in transformNode.node.geolayout.nodes: - generateSwitchOptions(node, transformNode.node.geolayout, - geolayoutGraph, prefix) - overrideNodes = [] - if isinstance(transformNode.node, SwitchNode): - switchName = transformNode.node.name - prefix += '_' + switchName - #prefix = switchName - - materialOverrideTexDimensions = None - - i = 0 - while i < len(transformNode.children): - prefixName = prefix + '_opt' + str(i) - childNode = transformNode.children[i] - if isinstance(childNode.node, SwitchOverrideNode): - drawLayer = childNode.node.drawLayer - material = childNode.node.material - specificMat = childNode.node.specificMat - overrideType = childNode.node.overrideType - texDimensions = childNode.node.texDimensions - if texDimensions is not None and materialOverrideTexDimensions is not None and\ - materialOverrideTexDimensions != tuple(texDimensions): - raise PluginError('In switch bone "' + switchName + '", some material ' +\ - 'overrides \nhave textures with dimensions differing from the original material.\n' +\ - 'UV coordinates are in pixel units, so there will be UV errors in those overrides.\n '+\ - 'Make sure that all overrides have the same texture dimensions as the original material.\n' +\ - 'Note that materials with no textures default to dimensions of 32x32.') - - if texDimensions is not None: - materialOverrideTexDimensions = tuple(texDimensions) - - # This should be a 0xB node - #copyNode = duplicateNode(transformNode.children[0], - # transformNode, transformNode.children.index(childNode)) - index = transformNode.children.index(childNode) - transformNode.children.remove(childNode) - - # Switch option bones should have unique names across all - # armatures. - optionGeolayout = geolayoutGraph.addGeolayout( - childNode, prefixName) - geolayoutGraph.addJumpNode(transformNode, geolayout, - optionGeolayout, index) - optionGeolayout.nodes.append(TransformNode(StartNode())) - copyNode = optionGeolayout.nodes[0] - - #i -= 1 - # Assumes first child is a start node, where option 0 is - # assumes overrideChild starts with a Start node - option0Nodes = [transformNode.children[0]] - if len(option0Nodes) == 1 and \ - isinstance(option0Nodes[0].node, StartNode): - for startChild in option0Nodes[0].children: - generateOverrideHierarchy(copyNode, startChild, - material, specificMat, overrideType, drawLayer, - option0Nodes[0].children.index(startChild), - optionGeolayout, geolayoutGraph, - optionGeolayout.name) - else: - for overrideChild in option0Nodes: - generateOverrideHierarchy(copyNode, overrideChild, - material, specificMat, overrideType, drawLayer, - option0Nodes.index(overrideChild), - optionGeolayout, geolayoutGraph, - optionGeolayout.name) - if material is not None: - overrideNodes.append(copyNode) - i += 1 - for i in range(len(transformNode.children)): - childNode = transformNode.children[i] - if isinstance(transformNode.node, SwitchNode): - prefixName = prefix + '_opt' + str(i) - else: - prefixName = prefix - - if childNode not in overrideNodes: - generateSwitchOptions(childNode, geolayout, geolayoutGraph, prefixName) - -def generateOverrideHierarchy(parentCopyNode, transformNode, - material, specificMat, overrideType, drawLayer, index, geolayout, - geolayoutGraph, switchOptionName): - #print(transformNode.node) - if isinstance(transformNode.node, SwitchOverrideNode) and \ - material is not None: - return - - copyNode = TransformNode(copy.copy(transformNode.node)) - copyNode.parent = parentCopyNode - parentCopyNode.children.insert(index, copyNode) - if isinstance(transformNode.node, JumpNode): - jumpName = switchOptionName + '_jump_' +\ - transformNode.node.geolayout.name - jumpGeolayout = geolayoutGraph.addGeolayout(transformNode, jumpName) - oldGeolayout = copyNode.node.geolayout - copyNode.node.geolayout = jumpGeolayout - geolayoutGraph.addGeolayoutCall(geolayout, jumpGeolayout) - startNode = TransformNode(StartNode()) - jumpGeolayout.nodes.append(startNode) - if len(oldGeolayout.nodes) == 1 and \ - isinstance(oldGeolayout.nodes[0].node, StartNode): - for node in oldGeolayout.nodes[0].children: - generateOverrideHierarchy(startNode, node, material, specificMat, - overrideType, drawLayer, - oldGeolayout.nodes[0].children.index(node), - jumpGeolayout, geolayoutGraph, jumpName) - else: - for node in oldGeolayout.nodes: - generateOverrideHierarchy(startNode, node, material, specificMat, - overrideType, drawLayer, oldGeolayout.nodes.index(node), - jumpGeolayout, geolayoutGraph, jumpName) - - elif not isinstance(copyNode.node, SwitchOverrideNode) and\ - copyNode.node.hasDL: - if material is not None: - copyNode.node.DLmicrocode = \ - copyNode.node.fMesh.drawMatOverrides[(material, specificMat, overrideType)] - if drawLayer is not None: - copyNode.node.drawLayer = drawLayer - - for child in transformNode.children: - generateOverrideHierarchy(copyNode, child, material, specificMat, - overrideType, drawLayer, transformNode.children.index(child), - geolayout, geolayoutGraph, switchOptionName) + if isinstance(transformNode.node, JumpNode): + for node in transformNode.node.geolayout.nodes: + generateSwitchOptions( + node, transformNode.node.geolayout, geolayoutGraph, prefix + ) + overrideNodes = [] + if isinstance(transformNode.node, SwitchNode): + switchName = transformNode.node.name + prefix += "_" + switchName + # prefix = switchName + + materialOverrideTexDimensions = None + + i = 0 + while i < len(transformNode.children): + prefixName = prefix + "_opt" + str(i) + childNode = transformNode.children[i] + if isinstance(childNode.node, SwitchOverrideNode): + drawLayer = childNode.node.drawLayer + material = childNode.node.material + specificMat = childNode.node.specificMat + overrideType = childNode.node.overrideType + texDimensions = childNode.node.texDimensions + if ( + texDimensions is not None + and materialOverrideTexDimensions is not None + and materialOverrideTexDimensions != tuple(texDimensions) + ): + raise PluginError( + 'In switch bone "' + + switchName + + '", some material ' + + "overrides \nhave textures with dimensions differing from the original material.\n" + + "UV coordinates are in pixel units, so there will be UV errors in those overrides.\n " + + "Make sure that all overrides have the same texture dimensions as the original material.\n" + + "Note that materials with no textures default to dimensions of 32x32." + ) + + if texDimensions is not None: + materialOverrideTexDimensions = tuple(texDimensions) + + # This should be a 0xB node + # copyNode = duplicateNode(transformNode.children[0], + # transformNode, transformNode.children.index(childNode)) + index = transformNode.children.index(childNode) + transformNode.children.remove(childNode) + + # Switch option bones should have unique names across all + # armatures. + optionGeolayout = geolayoutGraph.addGeolayout(childNode, prefixName) + geolayoutGraph.addJumpNode( + transformNode, geolayout, optionGeolayout, index + ) + optionGeolayout.nodes.append(TransformNode(StartNode())) + copyNode = optionGeolayout.nodes[0] + + # i -= 1 + # Assumes first child is a start node, where option 0 is + # assumes overrideChild starts with a Start node + option0Nodes = [transformNode.children[0]] + if len(option0Nodes) == 1 and isinstance( + option0Nodes[0].node, StartNode + ): + for startChild in option0Nodes[0].children: + generateOverrideHierarchy( + copyNode, + startChild, + material, + specificMat, + overrideType, + drawLayer, + option0Nodes[0].children.index(startChild), + optionGeolayout, + geolayoutGraph, + optionGeolayout.name, + ) + else: + for overrideChild in option0Nodes: + generateOverrideHierarchy( + copyNode, + overrideChild, + material, + specificMat, + overrideType, + drawLayer, + option0Nodes.index(overrideChild), + optionGeolayout, + geolayoutGraph, + optionGeolayout.name, + ) + if material is not None: + overrideNodes.append(copyNode) + i += 1 + for i in range(len(transformNode.children)): + childNode = transformNode.children[i] + if isinstance(transformNode.node, SwitchNode): + prefixName = prefix + "_opt" + str(i) + else: + prefixName = prefix + + if childNode not in overrideNodes: + generateSwitchOptions(childNode, geolayout, geolayoutGraph, prefixName) + + +def generateOverrideHierarchy( + parentCopyNode, + transformNode, + material, + specificMat, + overrideType, + drawLayer, + index, + geolayout, + geolayoutGraph, + switchOptionName, +): + # print(transformNode.node) + if isinstance(transformNode.node, SwitchOverrideNode) and material is not None: + return + + copyNode = TransformNode(copy.copy(transformNode.node)) + copyNode.parent = parentCopyNode + parentCopyNode.children.insert(index, copyNode) + if isinstance(transformNode.node, JumpNode): + jumpName = switchOptionName + "_jump_" + transformNode.node.geolayout.name + jumpGeolayout = geolayoutGraph.addGeolayout(transformNode, jumpName) + oldGeolayout = copyNode.node.geolayout + copyNode.node.geolayout = jumpGeolayout + geolayoutGraph.addGeolayoutCall(geolayout, jumpGeolayout) + startNode = TransformNode(StartNode()) + jumpGeolayout.nodes.append(startNode) + if len(oldGeolayout.nodes) == 1 and isinstance( + oldGeolayout.nodes[0].node, StartNode + ): + for node in oldGeolayout.nodes[0].children: + generateOverrideHierarchy( + startNode, + node, + material, + specificMat, + overrideType, + drawLayer, + oldGeolayout.nodes[0].children.index(node), + jumpGeolayout, + geolayoutGraph, + jumpName, + ) + else: + for node in oldGeolayout.nodes: + generateOverrideHierarchy( + startNode, + node, + material, + specificMat, + overrideType, + drawLayer, + oldGeolayout.nodes.index(node), + jumpGeolayout, + geolayoutGraph, + jumpName, + ) + + elif not isinstance(copyNode.node, SwitchOverrideNode) and copyNode.node.hasDL: + if material is not None: + copyNode.node.DLmicrocode = copyNode.node.fMesh.drawMatOverrides[ + (material, specificMat, overrideType) + ] + if drawLayer is not None: + copyNode.node.drawLayer = drawLayer + + for child in transformNode.children: + generateOverrideHierarchy( + copyNode, + child, + material, + specificMat, + overrideType, + drawLayer, + transformNode.children.index(child), + geolayout, + geolayoutGraph, + switchOptionName, + ) + def addParentNode(parentTransformNode: TransformNode, geoNode): - transformNode = TransformNode(geoNode) - transformNode.parent = parentTransformNode - parentTransformNode.children.append(transformNode) - return transformNode + transformNode = TransformNode(geoNode) + transformNode.parent = parentTransformNode + parentTransformNode.children.append(transformNode) + return transformNode + def duplicateNode(transformNode, parentNode, index): - optionNode = TransformNode(copy.copy(transformNode.node)) - optionNode.parent = parentNode - parentNode.children.insert(index, optionNode) - return optionNode + optionNode = TransformNode(copy.copy(transformNode.node)) + optionNode.parent = parentNode + parentNode.children.insert(index, optionNode) + return optionNode + def partOfGeolayout(obj): - useGeoEmpty = obj.data is None and checkSM64EmptyUsesGeoLayout(obj.sm64_obj_type) + useGeoEmpty = obj.data is None and checkSM64EmptyUsesGeoLayout(obj.sm64_obj_type) + + return isinstance(obj.data, bpy.types.Mesh) or useGeoEmpty - return isinstance(obj.data, bpy.types.Mesh) or useGeoEmpty def getSwitchChildren(areaRoot): - geoChildren = [child for child in areaRoot.children if partOfGeolayout(child)] - alphabeticalChildren = sorted(geoChildren, key = lambda childObj: childObj.original_name.lower()) - return alphabeticalChildren - -def setRooms(obj, roomIndex = None): - # Child objects - if roomIndex is not None: - obj.room_num = roomIndex - for childObj in obj.children: - setRooms(childObj, roomIndex) - - # Area root object - else: - alphabeticalChildren = getSwitchChildren(obj) - for i in range(len(alphabeticalChildren)): - setRooms(alphabeticalChildren[i], i) # index starts at 1, but 0 is reserved for no room. + geoChildren = [child for child in areaRoot.children if partOfGeolayout(child)] + alphabeticalChildren = sorted( + geoChildren, key=lambda childObj: childObj.original_name.lower() + ) + return alphabeticalChildren + + +def setRooms(obj, roomIndex=None): + # Child objects + if roomIndex is not None: + obj.room_num = roomIndex + for childObj in obj.children: + setRooms(childObj, roomIndex) + + # Area root object + else: + alphabeticalChildren = getSwitchChildren(obj) + for i in range(len(alphabeticalChildren)): + setRooms( + alphabeticalChildren[i], i + ) # index starts at 1, but 0 is reserved for no room. + def isZeroRotation(rotate: mathutils.Quaternion): - eulerRot = rotate.to_euler(geoNodeRotateOrder) - return convertEulerFloatToShort(eulerRot[0]) == 0 and \ - convertEulerFloatToShort(eulerRot[1]) == 0 and \ - convertEulerFloatToShort(eulerRot[2]) == 0 + eulerRot = rotate.to_euler(geoNodeRotateOrder) + return ( + convertEulerFloatToShort(eulerRot[0]) == 0 + and convertEulerFloatToShort(eulerRot[1]) == 0 + and convertEulerFloatToShort(eulerRot[2]) == 0 + ) + def isZeroTranslation(translate: mathutils.Vector): - return convertFloatToShort(translate[0]) == 0 and \ - convertFloatToShort(translate[1]) == 0 and \ - convertFloatToShort(translate[2]) == 0 + return ( + convertFloatToShort(translate[0]) == 0 + and convertFloatToShort(translate[1]) == 0 + and convertFloatToShort(translate[2]) == 0 + ) + def isZeroScaleChange(scale: mathutils.Vector): - return int(round(scale[0] * 0x10000)) == 0x10000 and \ - int(round(scale[1] * 0x10000)) == 0x10000 and \ - int(round(scale[2] * 0x10000)) == 0x10000 + return ( + int(round(scale[0] * 0x10000)) == 0x10000 + and int(round(scale[1] * 0x10000)) == 0x10000 + and int(round(scale[2] * 0x10000)) == 0x10000 + ) + def getOptimalNode(translate, rotate, drawLayer, hasDL, zeroTranslation, zeroRotation): - if zeroRotation and zeroTranslation: - node = DisplayListNode(drawLayer) - elif zeroRotation: - node = TranslateNode(drawLayer, hasDL, translate) - elif zeroTranslation: - node = RotateNode(drawLayer, hasDL, rotate) - else: - node = TranslateRotateNode(drawLayer, 0, hasDL, translate, rotate) - return node - -def processPreInlineGeo(inlineGeoConfig: InlineGeolayoutObjConfig, obj: bpy.types.Object, parentTransformNode: TransformNode): - if inlineGeoConfig.name == 'Geo ASM': - node = FunctionNode(obj.fast64.sm64.geo_asm.func, obj.fast64.sm64.geo_asm.param) - elif inlineGeoConfig.name == 'Geo Branch': - node = JumpNode(True, None, obj.geoReference) - elif inlineGeoConfig.name == 'Geo Displaylist': - node = DisplayListNode(int(obj.draw_layer_static), obj.dlReference) - elif inlineGeoConfig.name == 'Custom Geo Command': - node = CustomNode(obj.customGeoCommand, obj.customGeoCommandArgs) - addParentNode(parentTransformNode, node) # Allow this node to be translated/rotated + if zeroRotation and zeroTranslation: + node = DisplayListNode(drawLayer) + elif zeroRotation: + node = TranslateNode(drawLayer, hasDL, translate) + elif zeroTranslation: + node = RotateNode(drawLayer, hasDL, rotate) + else: + node = TranslateRotateNode(drawLayer, 0, hasDL, translate, rotate) + return node + + +def processPreInlineGeo( + inlineGeoConfig: InlineGeolayoutObjConfig, + obj: bpy.types.Object, + parentTransformNode: TransformNode, +): + if inlineGeoConfig.name == "Geo ASM": + node = FunctionNode(obj.fast64.sm64.geo_asm.func, obj.fast64.sm64.geo_asm.param) + elif inlineGeoConfig.name == "Geo Branch": + node = JumpNode(True, None, obj.geoReference) + elif inlineGeoConfig.name == "Geo Displaylist": + node = DisplayListNode(int(obj.draw_layer_static), obj.dlReference) + elif inlineGeoConfig.name == "Custom Geo Command": + node = CustomNode(obj.customGeoCommand, obj.customGeoCommandArgs) + addParentNode(parentTransformNode, node) # Allow this node to be translated/rotated + def processInlineGeoNode( - inlineGeoConfig: InlineGeolayoutObjConfig, - obj: bpy.types.Object, - parentTransformNode: TransformNode, - translate: mathutils.Vector, - rotate: mathutils.Quaternion, - scale: mathutils.Vector + inlineGeoConfig: InlineGeolayoutObjConfig, + obj: bpy.types.Object, + parentTransformNode: TransformNode, + translate: mathutils.Vector, + rotate: mathutils.Quaternion, + scale: mathutils.Vector, ): - node = None - if inlineGeoConfig.name == 'Geo Translate/Rotate': - node = TranslateRotateNode(obj.draw_layer_static, 0, obj.useDLReference, translate, rotate, obj.dlReference) - elif inlineGeoConfig.name == 'Geo Billboard': - node = BillboardNode(obj.draw_layer_static, obj.useDLReference, translate, obj.dlReference) - elif inlineGeoConfig.name == 'Geo Translate Node': - node = TranslateNode(obj.draw_layer_static, obj.useDLReference, translate, obj.dlReference) - elif inlineGeoConfig.name == 'Geo Rotation Node': - node = RotateNode(obj.draw_layer_static, obj.useDLReference, rotate, obj.dlReference) - elif inlineGeoConfig.name == 'Geo Scale': - node = ScaleNode(obj.draw_layer_static, scale, obj.useDLReference, obj.dlReference) - else: - raise PluginError(f'Ooops! Didnt implement inline geo exporting for {inlineGeoConfig.name}') - - return node, parentTransformNode + node = None + if inlineGeoConfig.name == "Geo Translate/Rotate": + node = TranslateRotateNode( + obj.draw_layer_static, + 0, + obj.useDLReference, + translate, + rotate, + obj.dlReference, + ) + elif inlineGeoConfig.name == "Geo Billboard": + node = BillboardNode( + obj.draw_layer_static, obj.useDLReference, translate, obj.dlReference + ) + elif inlineGeoConfig.name == "Geo Translate Node": + node = TranslateNode( + obj.draw_layer_static, obj.useDLReference, translate, obj.dlReference + ) + elif inlineGeoConfig.name == "Geo Rotation Node": + node = RotateNode( + obj.draw_layer_static, obj.useDLReference, rotate, obj.dlReference + ) + elif inlineGeoConfig.name == "Geo Scale": + node = ScaleNode( + obj.draw_layer_static, scale, obj.useDLReference, obj.dlReference + ) + else: + raise PluginError( + f"Ooops! Didnt implement inline geo exporting for {inlineGeoConfig.name}" + ) + + return node, parentTransformNode + # This function should be called on a copy of an object # The copy will have modifiers / scale applied and will be made single user def processMesh( - fModel: FModel, - obj: bpy.types.Object, - transformMatrix: mathutils.Matrix, - parentTransformNode: TransformNode, - geolayout: Geolayout, - geolayoutGraph: GeolayoutGraph, - isRoot: bool, - convertTextureData: bool + fModel: FModel, + obj: bpy.types.Object, + transformMatrix: mathutils.Matrix, + parentTransformNode: TransformNode, + geolayout: Geolayout, + geolayoutGraph: GeolayoutGraph, + isRoot: bool, + convertTextureData: bool, ): - #finalTransform = copy.deepcopy(transformMatrix) - - useGeoEmpty = obj.data is None and checkSM64EmptyUsesGeoLayout(obj.sm64_obj_type) - - useSwitchNode = obj.data is None and \ - obj.sm64_obj_type == 'Switch' - - useInlineGeo = obj.data is None and checkIsSM64InlineGeoLayout(obj.sm64_obj_type) - - addRooms = isRoot and obj.data is None and \ - obj.sm64_obj_type == 'Area Root' and \ - obj.enableRoomSwitch - - #if useAreaEmpty and areaIndex is not None and obj.areaIndex != areaIndex: - # return - - inlineGeoConfig: InlineGeolayoutObjConfig = inlineGeoLayoutObjects.get(obj.sm64_obj_type) - processed_inline_geo = False - - isPreInlineGeoLayout = checkIsSM64PreInlineGeoLayout(obj.sm64_obj_type) - if useInlineGeo and isPreInlineGeoLayout: - processed_inline_geo = True - processPreInlineGeo(inlineGeoConfig, obj, parentTransformNode) - - # Its okay to return if ignore_render, because when we duplicated obj hierarchy we stripped all - # ignore_renders from geolayout. - if not partOfGeolayout(obj) or obj.ignore_render: - return - - if isRoot: - translate = mathutils.Vector((0,0,0)) - rotate = mathutils.Quaternion() - scale = mathutils.Vector((1,1,1)) - elif obj.get('original_mtx'): # object is instanced or a transformation - orig_mtx = mathutils.Matrix(obj['original_mtx']) - translate, rotate, scale = orig_mtx.decompose() - translate = translate_blender_to_n64(translate) - rotate = rotate_quat_blender_to_n64(rotate) - else: # object is NOT instanced - translate, rotate, scale = obj.matrix_local.decompose() - - zeroRotation = isZeroRotation(rotate) - zeroTranslation = isZeroTranslation(translate) - zeroScaleChange = isZeroScaleChange(scale) - - if useSwitchNode or addRooms: # Specific empty types - if useSwitchNode: - switchFunc = obj.switchFunc - switchParam = obj.switchParam - elif addRooms: - switchFunc = 'geo_switch_area' - switchParam = len(obj.children) - - # Rooms are not set here (since this is just a copy of the original hierarchy) - # They should be set previously, using setRooms() - preRoomSwitchParentNode = parentTransformNode - parentTransformNode = addParentNode(parentTransformNode, SwitchNode(switchFunc, switchParam, obj.original_name)) - alphabeticalChildren = getSwitchChildren(obj) - for i in range(len(alphabeticalChildren)): - childObj = alphabeticalChildren[i] - if i == 0: # Outside room system - # TODO: Allow users to specify whether this should be rendered before or after rooms (currently, it is after) - processMesh(fModel, childObj, transformMatrix, preRoomSwitchParentNode, - geolayout, geolayoutGraph, False, convertTextureData) - else: - optionGeolayout = geolayoutGraph.addGeolayout( - childObj, fModel.name + '_' + childObj.original_name + '_geo') - geolayoutGraph.addJumpNode(parentTransformNode, geolayout, - optionGeolayout) - if not zeroRotation or not zeroTranslation: - startNode = TransformNode(getOptimalNode(translate, rotate, 1, False, - zeroTranslation, zeroRotation)) - else: - startNode = TransformNode(StartNode()) - optionGeolayout.nodes.append(startNode) - processMesh(fModel, childObj, transformMatrix, startNode, - optionGeolayout, geolayoutGraph, False, convertTextureData) - - else: - if useInlineGeo and not processed_inline_geo: - node, parentTransformNode = processInlineGeoNode( - inlineGeoConfig, obj, parentTransformNode, - translate, rotate, scale[0] - ) - processed_inline_geo = True - - elif obj.geo_cmd_static == 'Optimal' or useGeoEmpty: - if not zeroScaleChange: - # - first translate/rotate without a DL - # - then child -> scale with DL - if not zeroTranslation or not zeroRotation: - pNode = getOptimalNode(translate, rotate, int(obj.draw_layer_static), False, - zeroTranslation, zeroRotation) - parentTransformNode = addParentNode(parentTransformNode, pNode) - node = ScaleNode(int(obj.draw_layer_static), scale[0], True) - else: - node = getOptimalNode(translate, rotate, int(obj.draw_layer_static), True, - zeroTranslation, zeroRotation) - - elif obj.geo_cmd_static == "DisplayListWithOffset": - if not zeroRotation or not zeroScaleChange: - # translate/rotate -> scale -> DisplayListWithOffset - node = DisplayListWithOffsetNode(int(obj.draw_layer_static), True, - mathutils.Vector((0,0,0))) - - parentTransformNode = addParentNode(parentTransformNode, - TranslateRotateNode(1, 0, False, translate, rotate)) - - if not zeroScaleChange: - parentTransformNode = addParentNode(parentTransformNode, - ScaleNode(int(obj.draw_layer_static), scale[0], False)) - else: - node = DisplayListWithOffsetNode(int(obj.draw_layer_static), True, - translate) - - else: # Billboard - if not zeroRotation or not zeroScaleChange: # If rotated or scaled - # Order here MUST be billboard with translation -> rotation -> scale -> displaylist - node = DisplayListNode(int(obj.draw_layer_static)) - - # Add billboard to top layer with translation - parentTransformNode = addParentNode(parentTransformNode, - BillboardNode(int(obj.draw_layer_static), False, translate) - ) - - if not zeroRotation: - # Add rotation to top layer - parentTransformNode = addParentNode(parentTransformNode, - RotateNode(int(obj.draw_layer_static), False, rotate) - ) - - if not zeroScaleChange: - # Add scale node after billboard - parentTransformNode = addParentNode(parentTransformNode, - ScaleNode(int(obj.draw_layer_static), scale[0], False)) - else: # Use basic billboard node - node = BillboardNode(int(obj.draw_layer_static), True, translate) - - transformNode = TransformNode(node) - - if obj.data is not None and \ - (obj.use_render_range or obj.add_shadow or obj.add_func): - - parentTransformNode.children.append(transformNode) - transformNode.parent = parentTransformNode - transformNode.node.hasDL = False - parentTransformNode = transformNode - - node = DisplayListNode(int(obj.draw_layer_static)) - transformNode = TransformNode(node) - - if obj.use_render_range: - parentTransformNode = \ - addParentNode(parentTransformNode, RenderRangeNode(obj.render_range[0], obj.render_range[1])) - - if obj.add_shadow: - parentTransformNode = \ - addParentNode(parentTransformNode, ShadowNode(obj.shadow_type, obj.shadow_solidity, obj.shadow_scale)) - - if obj.add_func: - geo_asm = obj.fast64.sm64.geo_asm - addParentNode(parentTransformNode, FunctionNode(geo_asm.func, geo_asm.param)) - - # Make sure to add additional cases to if statement above - - if obj.data is None: - fMeshes = {} - elif obj.get('instanced_mesh_name'): - temp_obj = get_obj_temp_mesh(obj) - if temp_obj is None: - raise ValueError('The source of an instanced mesh could not be found. Please contact a Fast64 maintainer for support.') - - src_meshes = temp_obj.get('src_meshes', []) - - if len(src_meshes): - fMeshes = {} - node.dlRef = src_meshes[0]['name'] - node.drawLayer = src_meshes[0]['layer'] - processed_inline_geo = True - - for src_mesh in src_meshes[1:]: - additionalNode = DisplayListNode(src_mesh['layer'], src_mesh['name']) if not isinstance(node, BillboardNode) else \ - BillboardNode(src_mesh['layer'], True, [0,0,0], src_mesh['name']) - additionalTransformNode = TransformNode(additionalNode) - transformNode.children.append(additionalTransformNode) - additionalTransformNode.parent = transformNode - - else: - triConverterInfo = TriangleConverterInfo(temp_obj, None, fModel.f3d, transformMatrix, getInfoDict(temp_obj)) - fMeshes = saveStaticModel(triConverterInfo, fModel, temp_obj, transformMatrix, fModel.name, - convertTextureData, False, 'sm64') - if fMeshes: - temp_obj['src_meshes'] = [({ 'name': fMesh.draw.name, 'layer': drawLayer }) for drawLayer, fMesh in fMeshes.items()] - node.dlRef = temp_obj['src_meshes'][0]['name'] - else: - # TODO: Display warning to the user that there is an object that doesn't have polygons - print('Object', obj.original_name, 'does not have any polygons.') - - else: - triConverterInfo = TriangleConverterInfo(obj, None, fModel.f3d, transformMatrix, getInfoDict(obj)) - fMeshes = saveStaticModel(triConverterInfo, fModel, obj, transformMatrix, fModel.name, - convertTextureData, False, 'sm64') - - if fMeshes is None or len(fMeshes) == 0: - if not processed_inline_geo or isPreInlineGeoLayout: - node.hasDL = False - else: - firstNodeProcessed = False - for drawLayer, fMesh in fMeshes.items(): - if not firstNodeProcessed: - node.DLmicrocode = fMesh.draw - node.fMesh = fMesh - node.drawLayer = drawLayer # previous drawLayer assigments useless? - firstNodeProcessed = True - else: - additionalNode = DisplayListNode(drawLayer) if not isinstance(node, BillboardNode) else \ - BillboardNode(drawLayer, True, [0,0,0]) - additionalNode.DLmicrocode = fMesh.draw - additionalNode.fMesh = fMesh - additionalTransformNode = TransformNode(additionalNode) - transformNode.children.append(additionalTransformNode) - additionalTransformNode.parent = transformNode - - parentTransformNode.children.append(transformNode) - transformNode.parent = parentTransformNode - - alphabeticalChildren = sorted(obj.children, key = lambda childObj: childObj.original_name.lower()) - for childObj in alphabeticalChildren: - processMesh(fModel, childObj, transformMatrix, transformNode, - geolayout, geolayoutGraph, False, convertTextureData) + # finalTransform = copy.deepcopy(transformMatrix) + + useGeoEmpty = obj.data is None and checkSM64EmptyUsesGeoLayout(obj.sm64_obj_type) + + useSwitchNode = obj.data is None and obj.sm64_obj_type == "Switch" + + useInlineGeo = obj.data is None and checkIsSM64InlineGeoLayout(obj.sm64_obj_type) + + addRooms = ( + isRoot + and obj.data is None + and obj.sm64_obj_type == "Area Root" + and obj.enableRoomSwitch + ) + + # if useAreaEmpty and areaIndex is not None and obj.areaIndex != areaIndex: + # return + + inlineGeoConfig: InlineGeolayoutObjConfig = inlineGeoLayoutObjects.get( + obj.sm64_obj_type + ) + processed_inline_geo = False + + isPreInlineGeoLayout = checkIsSM64PreInlineGeoLayout(obj.sm64_obj_type) + if useInlineGeo and isPreInlineGeoLayout: + processed_inline_geo = True + processPreInlineGeo(inlineGeoConfig, obj, parentTransformNode) + + # Its okay to return if ignore_render, because when we duplicated obj hierarchy we stripped all + # ignore_renders from geolayout. + if not partOfGeolayout(obj) or obj.ignore_render: + return + + if isRoot: + translate = mathutils.Vector((0, 0, 0)) + rotate = mathutils.Quaternion() + scale = mathutils.Vector((1, 1, 1)) + elif obj.get("original_mtx"): # object is instanced or a transformation + orig_mtx = mathutils.Matrix(obj["original_mtx"]) + translate, rotate, scale = orig_mtx.decompose() + translate = translate_blender_to_n64(translate) + rotate = rotate_quat_blender_to_n64(rotate) + else: # object is NOT instanced + translate, rotate, scale = obj.matrix_local.decompose() + + zeroRotation = isZeroRotation(rotate) + zeroTranslation = isZeroTranslation(translate) + zeroScaleChange = isZeroScaleChange(scale) + + if useSwitchNode or addRooms: # Specific empty types + if useSwitchNode: + switchFunc = obj.switchFunc + switchParam = obj.switchParam + elif addRooms: + switchFunc = "geo_switch_area" + switchParam = len(obj.children) + + # Rooms are not set here (since this is just a copy of the original hierarchy) + # They should be set previously, using setRooms() + preRoomSwitchParentNode = parentTransformNode + parentTransformNode = addParentNode( + parentTransformNode, SwitchNode(switchFunc, switchParam, obj.original_name) + ) + alphabeticalChildren = getSwitchChildren(obj) + for i in range(len(alphabeticalChildren)): + childObj = alphabeticalChildren[i] + if i == 0: # Outside room system + # TODO: Allow users to specify whether this should be rendered before or after rooms (currently, it is after) + processMesh( + fModel, + childObj, + transformMatrix, + preRoomSwitchParentNode, + geolayout, + geolayoutGraph, + False, + convertTextureData, + ) + else: + optionGeolayout = geolayoutGraph.addGeolayout( + childObj, fModel.name + "_" + childObj.original_name + "_geo" + ) + geolayoutGraph.addJumpNode( + parentTransformNode, geolayout, optionGeolayout + ) + if not zeroRotation or not zeroTranslation: + startNode = TransformNode( + getOptimalNode( + translate, rotate, 1, False, zeroTranslation, zeroRotation + ) + ) + else: + startNode = TransformNode(StartNode()) + optionGeolayout.nodes.append(startNode) + processMesh( + fModel, + childObj, + transformMatrix, + startNode, + optionGeolayout, + geolayoutGraph, + False, + convertTextureData, + ) + + else: + if useInlineGeo and not processed_inline_geo: + node, parentTransformNode = processInlineGeoNode( + inlineGeoConfig, obj, parentTransformNode, translate, rotate, scale[0] + ) + processed_inline_geo = True + + elif obj.geo_cmd_static == "Optimal" or useGeoEmpty: + if not zeroScaleChange: + # - first translate/rotate without a DL + # - then child -> scale with DL + if not zeroTranslation or not zeroRotation: + pNode = getOptimalNode( + translate, + rotate, + int(obj.draw_layer_static), + False, + zeroTranslation, + zeroRotation, + ) + parentTransformNode = addParentNode(parentTransformNode, pNode) + node = ScaleNode(int(obj.draw_layer_static), scale[0], True) + else: + node = getOptimalNode( + translate, + rotate, + int(obj.draw_layer_static), + True, + zeroTranslation, + zeroRotation, + ) + + elif obj.geo_cmd_static == "DisplayListWithOffset": + if not zeroRotation or not zeroScaleChange: + # translate/rotate -> scale -> DisplayListWithOffset + node = DisplayListWithOffsetNode( + int(obj.draw_layer_static), True, mathutils.Vector((0, 0, 0)) + ) + + parentTransformNode = addParentNode( + parentTransformNode, + TranslateRotateNode(1, 0, False, translate, rotate), + ) + + if not zeroScaleChange: + parentTransformNode = addParentNode( + parentTransformNode, + ScaleNode(int(obj.draw_layer_static), scale[0], False), + ) + else: + node = DisplayListWithOffsetNode( + int(obj.draw_layer_static), True, translate + ) + + else: # Billboard + if not zeroRotation or not zeroScaleChange: # If rotated or scaled + # Order here MUST be billboard with translation -> rotation -> scale -> displaylist + node = DisplayListNode(int(obj.draw_layer_static)) + + # Add billboard to top layer with translation + parentTransformNode = addParentNode( + parentTransformNode, + BillboardNode(int(obj.draw_layer_static), False, translate), + ) + + if not zeroRotation: + # Add rotation to top layer + parentTransformNode = addParentNode( + parentTransformNode, + RotateNode(int(obj.draw_layer_static), False, rotate), + ) + + if not zeroScaleChange: + # Add scale node after billboard + parentTransformNode = addParentNode( + parentTransformNode, + ScaleNode(int(obj.draw_layer_static), scale[0], False), + ) + else: # Use basic billboard node + node = BillboardNode(int(obj.draw_layer_static), True, translate) + + transformNode = TransformNode(node) + + if obj.data is not None and ( + obj.use_render_range or obj.add_shadow or obj.add_func + ): + + parentTransformNode.children.append(transformNode) + transformNode.parent = parentTransformNode + transformNode.node.hasDL = False + parentTransformNode = transformNode + + node = DisplayListNode(int(obj.draw_layer_static)) + transformNode = TransformNode(node) + + if obj.use_render_range: + parentTransformNode = addParentNode( + parentTransformNode, + RenderRangeNode(obj.render_range[0], obj.render_range[1]), + ) + + if obj.add_shadow: + parentTransformNode = addParentNode( + parentTransformNode, + ShadowNode(obj.shadow_type, obj.shadow_solidity, obj.shadow_scale), + ) + + if obj.add_func: + geo_asm = obj.fast64.sm64.geo_asm + addParentNode( + parentTransformNode, FunctionNode(geo_asm.func, geo_asm.param) + ) + + # Make sure to add additional cases to if statement above + + if obj.data is None: + fMeshes = {} + elif obj.get("instanced_mesh_name"): + temp_obj = get_obj_temp_mesh(obj) + if temp_obj is None: + raise ValueError( + "The source of an instanced mesh could not be found. Please contact a Fast64 maintainer for support." + ) + + src_meshes = temp_obj.get("src_meshes", []) + + if len(src_meshes): + fMeshes = {} + node.dlRef = src_meshes[0]["name"] + node.drawLayer = src_meshes[0]["layer"] + processed_inline_geo = True + + for src_mesh in src_meshes[1:]: + additionalNode = ( + DisplayListNode(src_mesh["layer"], src_mesh["name"]) + if not isinstance(node, BillboardNode) + else BillboardNode( + src_mesh["layer"], True, [0, 0, 0], src_mesh["name"] + ) + ) + additionalTransformNode = TransformNode(additionalNode) + transformNode.children.append(additionalTransformNode) + additionalTransformNode.parent = transformNode + + else: + triConverterInfo = TriangleConverterInfo( + temp_obj, None, fModel.f3d, transformMatrix, getInfoDict(temp_obj) + ) + fMeshes = saveStaticModel( + triConverterInfo, + fModel, + temp_obj, + transformMatrix, + fModel.name, + convertTextureData, + False, + "sm64", + ) + if fMeshes: + temp_obj["src_meshes"] = [ + ({"name": fMesh.draw.name, "layer": drawLayer}) + for drawLayer, fMesh in fMeshes.items() + ] + node.dlRef = temp_obj["src_meshes"][0]["name"] + else: + # TODO: Display warning to the user that there is an object that doesn't have polygons + print("Object", obj.original_name, "does not have any polygons.") + + else: + triConverterInfo = TriangleConverterInfo( + obj, None, fModel.f3d, transformMatrix, getInfoDict(obj) + ) + fMeshes = saveStaticModel( + triConverterInfo, + fModel, + obj, + transformMatrix, + fModel.name, + convertTextureData, + False, + "sm64", + ) + + if fMeshes is None or len(fMeshes) == 0: + if not processed_inline_geo or isPreInlineGeoLayout: + node.hasDL = False + else: + firstNodeProcessed = False + for drawLayer, fMesh in fMeshes.items(): + if not firstNodeProcessed: + node.DLmicrocode = fMesh.draw + node.fMesh = fMesh + node.drawLayer = drawLayer # previous drawLayer assigments useless? + firstNodeProcessed = True + else: + additionalNode = ( + DisplayListNode(drawLayer) + if not isinstance(node, BillboardNode) + else BillboardNode(drawLayer, True, [0, 0, 0]) + ) + additionalNode.DLmicrocode = fMesh.draw + additionalNode.fMesh = fMesh + additionalTransformNode = TransformNode(additionalNode) + transformNode.children.append(additionalTransformNode) + additionalTransformNode.parent = transformNode + + parentTransformNode.children.append(transformNode) + transformNode.parent = parentTransformNode + + alphabeticalChildren = sorted( + obj.children, key=lambda childObj: childObj.original_name.lower() + ) + for childObj in alphabeticalChildren: + processMesh( + fModel, + childObj, + transformMatrix, + transformNode, + geolayout, + geolayoutGraph, + False, + convertTextureData, + ) + # need to remember last geometry holding parent bone. # to do skinning, add the 0x15 command before any non-geometry bone groups. @@ -1122,426 +1774,601 @@ def processMesh( # rotation. Thus we don't want a bone's matrix relative to armature, but # relative to the root bone of the armature. -def processBone(fModel, boneName, obj, armatureObj, transformMatrix, - lastTranslateName, lastRotateName, lastDeformName, parentTransformNode, - materialOverrides, namePrefix, geolayout, geolayoutGraph, infoDict, convertTextureData): - bone = armatureObj.data.bones[boneName] - poseBone = armatureObj.pose.bones[boneName] - boneGroup = poseBone.bone_group - finalTransform = copy.deepcopy(transformMatrix) - materialOverrides = copy.copy(materialOverrides) - - if bone.geo_cmd == 'Ignore': - return - - # Get translate - if lastTranslateName is not None: - translateParent = armatureObj.data.bones[lastTranslateName] - translate = (translateParent.matrix_local.inverted() @ \ - bone.matrix_local).decompose()[0] - else: - translateParent = None - translate = bone.matrix_local.decompose()[0] - - # Get rotate - if lastRotateName is not None: - rotateParent = armatureObj.data.bones[lastRotateName] - rotate = (rotateParent.matrix_local.inverted() @ \ - bone.matrix_local).decompose()[1] - else: - rotateParent = None - rotate = bone.matrix_local.decompose()[1] - - translation = mathutils.Matrix.Translation(translate) - rotation = rotate.to_matrix().to_4x4() - zeroTranslation = isZeroTranslation(translate) - zeroRotation = isZeroRotation(rotate) - - #hasDL = bone.use_deform - hasDL = True - if bone.geo_cmd in animatableBoneTypes: - if bone.geo_cmd == 'CustomAnimated': - if not bone.fast64.sm64.custom_geo_cmd_macro: - raise PluginError(f'Bone "{boneName}" on armature "{armatureObj.name}" needs a geo command macro.') - node = CustomAnimatedNode(bone.fast64.sm64.custom_geo_cmd_macro, int(bone.draw_layer), translate, rotate) - lastTranslateName = boneName - lastRotateName = boneName - else: # DisplayListWithOffset - if not zeroRotation: - node = DisplayListWithOffsetNode(int(bone.draw_layer), - hasDL, mathutils.Vector((0,0,0))) - - parentTransformNode = addParentNode(parentTransformNode, - TranslateRotateNode(1, 0, False, translate, rotate)) - - lastTranslateName = boneName - lastRotateName = boneName - else: - node = DisplayListWithOffsetNode(int(bone.draw_layer), - hasDL, translate) - lastTranslateName = boneName - - finalTransform = transformMatrix @ translation - - elif bone.geo_cmd == 'CustomNonAnimated': - if bone.fast64.sm64.custom_geo_cmd_macro == '': - raise PluginError(f'Bone "{boneName}" on armature "{armatureObj.name}" needs a geo command macro.') - node = CustomNode(bone.fast64.sm64.custom_geo_cmd_macro, bone.fast64.sm64.custom_geo_cmd_args) - elif bone.geo_cmd == 'Function': - if bone.geo_func == '': - raise PluginError('Function bone ' + boneName + ' function value is empty.') - node = FunctionNode(bone.geo_func, bone.func_param) - elif bone.geo_cmd == 'HeldObject': - if bone.geo_func == '': - raise PluginError('Held object bone ' + boneName + ' function value is empty.') - node = HeldObjectNode(bone.geo_func, translate) - else: - if bone.geo_cmd == 'Switch': - # This is done so we can easily calculate transforms - # of switch options. - - if bone.geo_func == '': - raise PluginError('Switch bone ' + boneName + \ - ' function value is empty.') - node = SwitchNode(bone.geo_func, bone.func_param, boneName) - processSwitchBoneMatOverrides(materialOverrides, bone) - - elif bone.geo_cmd == 'Start': - node = StartNode() - elif bone.geo_cmd == 'TranslateRotate': - drawLayer = int(bone.draw_layer) - fieldLayout = int(bone.field_layout) - - node = TranslateRotateNode(drawLayer, fieldLayout, hasDL, - translate, rotate) - - if node.fieldLayout == 0: - finalTransform = transformMatrix @ translation @ rotation - lastTranslateName = boneName - lastRotateName = boneName - elif node.fieldLayout == 1: - finalTransform = transformMatrix @ translation - lastTranslateName = boneName - elif node.fieldLayout == 2: - finalTransform = transformMatrix @ rotation - lastRotateName = boneName - else: - yRot = rotate.to_euler().y - rotation = mathutils.Euler((0, yRot, 0)).to_matrix().to_4x4() - finalTransform = transformMatrix @ rotation - lastRotateName = boneName - - elif bone.geo_cmd == 'Translate': - node = TranslateNode(int(bone.draw_layer), hasDL, - translate) - finalTransform = transformMatrix @ translation - lastTranslateName = boneName - elif bone.geo_cmd == 'Rotate': - node = RotateNode(int(bone.draw_layer), hasDL, rotate) - finalTransform = transformMatrix @ rotation - lastRotateName = boneName - elif bone.geo_cmd == 'Billboard': - node = BillboardNode(int(bone.draw_layer), hasDL, - translate) - finalTransform = transformMatrix @ translation - lastTranslateName = boneName - elif bone.geo_cmd == 'DisplayList': - node = DisplayListNode(int(bone.draw_layer)) - if not armatureObj.data.bones[boneName].use_deform: - raise PluginError("Display List (0x15) " + boneName + ' must be a deform bone. Make sure deform is checked in bone properties.') - elif bone.geo_cmd == 'Shadow': - shadowType = int(bone.shadow_type) - shadowSolidity = bone.shadow_solidity - shadowScale = bone.shadow_scale - node = ShadowNode(shadowType, shadowSolidity, shadowScale) - elif bone.geo_cmd == 'Scale': - node = ScaleNode(int(bone.draw_layer), bone.geo_scale, - hasDL) - finalTransform = transformMatrix @ \ - mathutils.Matrix.Scale(node.scaleValue, 4) - elif bone.geo_cmd == 'StartRenderArea': - node = StartRenderAreaNode(bone.culling_radius) - else: - raise PluginError("Invalid geometry command: " + bone.geo_cmd) - - transformNode = TransformNode(node) - additionalNodes = [] - - if node.hasDL: - triConverterInfo = TriangleConverterInfo(obj, armatureObj.data, fModel.f3d, - mathutils.Matrix.Scale(bpy.context.scene.blenderToSM64Scale, 4) @ bone.matrix_local.inverted(), infoDict) - fMeshes, fSkinnedMeshes, usedDrawLayers = saveModelGivenVertexGroup( - fModel, obj, bone.name, lastDeformName, armatureObj, materialOverrides, - namePrefix, infoDict, convertTextureData, triConverterInfo, 'sm64', int(bone.draw_layer)) - - if (fMeshes is None or len(fMeshes) == 0) and (fSkinnedMeshes is None or len(fSkinnedMeshes) == 0): - #print("No mesh data.") - node.hasDL = False - transformNode.skinnedWithoutDL = usedDrawLayers is not None - #bone.use_deform = False - if usedDrawLayers is not None: - lastDeformName = boneName - parentTransformNode.children.append(transformNode) - transformNode.parent = parentTransformNode - else: - lastDeformName = boneName - if not bone.use_deform: - raise PluginError(bone.name + " has vertices in its vertex group but is not set to deformable. Make sure to enable deform on this bone.") - for drawLayer, fMesh in fMeshes.items(): - drawLayer = int(drawLayer) # IMPORTANT, otherwise 1 and '1' will be considered separate keys - if node.DLmicrocode is not None: - print("Adding additional node from layer " + str(drawLayer)) - additionalNode = DisplayListNode(drawLayer) if not isinstance(node, BillboardNode) else \ - BillboardNode(drawLayer, True, [0,0,0]) - additionalNode.DLmicrocode = fMesh.draw - additionalNode.fMesh = fMesh - additionalTransformNode = TransformNode(additionalNode) - additionalNodes.append(additionalTransformNode) - else: - print("Adding node from layer " + str(drawLayer)) - # Setting drawLayer on construction is useless? - node.drawLayer = drawLayer - node.DLmicrocode = fMesh.draw - node.fMesh = fMesh # Used for material override switches - - parentTransformNode.children.append(transformNode) - transformNode.parent = parentTransformNode - - if lastDeformName is not None and \ - armatureObj.data.bones[lastDeformName].geo_cmd == 'SwitchOption' \ - and len(fSkinnedMeshes) > 0: - raise PluginError("Cannot skin geometry to a Switch Option " +\ - "bone. Skinning cannot occur across a switch node.") - - for drawLayer, fSkinnedMesh in fSkinnedMeshes.items(): - print("Adding skinned mesh node.") - transformNode = addSkinnedMeshNode(armatureObj, boneName, - fSkinnedMesh, transformNode, parentTransformNode, int(drawLayer)) - - for additionalTransformNode in additionalNodes: - transformNode.children.append(additionalTransformNode) - additionalTransformNode.parent = transformNode - #print(boneName) - else: - parentTransformNode.children.append(transformNode) - transformNode.parent = parentTransformNode - - if not isinstance(transformNode.node, SwitchNode): - #print(boneGroup.name if boneGroup is not None else "Offset") - if len(bone.children) > 0: - #print("\tHas Children") - if bone.geo_cmd == 'Function': - raise PluginError("Function bones cannot have children. They instead affect the next sibling bone in alphabetical order.") - - # Handle child nodes - # nonDeformTransformData should be modified to be sent to children, - # otherwise it should not be modified for parent. - # This is so it can be used for siblings. - childrenNames = sorted([bone.name for bone in bone.children]) - for name in childrenNames: - processBone(fModel, name, obj, armatureObj, - finalTransform, lastTranslateName, lastRotateName, - lastDeformName, transformNode, materialOverrides, - namePrefix, geolayout, - geolayoutGraph, infoDict, convertTextureData) - #transformNode.children.append(childNode) - #childNode.parent = transformNode - - # see generateSwitchOptions() for explanation. - else: - #print(boneGroup.name if boneGroup is not None else "Offset") - if len(bone.children) > 0: - #optionGeolayout = \ - # geolayoutGraph.addGeolayout( - # transformNode, boneName + '_opt0') - #geolayoutGraph.addJumpNode(transformNode, geolayout, - # optionGeolayout) - #optionGeolayout.nodes.append(TransformNode(StartNode())) - nextStartNode = TransformNode(StartNode()) - transformNode.children.append(nextStartNode) - nextStartNode.parent = transformNode - - childrenNames = sorted([bone.name for bone in bone.children]) - for name in childrenNames: - processBone(fModel, name, obj, armatureObj, - finalTransform, lastTranslateName, lastRotateName, - lastDeformName, nextStartNode, materialOverrides, - namePrefix, geolayout, - geolayoutGraph, infoDict, convertTextureData) - #transformNode.children.append(childNode) - #childNode.parent = transformNode - else: - raise PluginError("Switch bone \"" + bone.name + "\" must have child bones with geometry attached.") - - bone = armatureObj.data.bones[boneName] - for switchIndex in range(len( bone.switch_options)): - switchOption = bone.switch_options[switchIndex] - if switchOption.switchType == 'Mesh': - optionArmature = switchOption.optionArmature - if optionArmature is None: - raise PluginError('Error: In switch bone ' + boneName +\ - ' for option ' + str(switchIndex) + \ - ', the switch option armature is None.') - elif not isinstance(optionArmature.data, bpy.types.Armature): - raise PluginError('Error: In switch bone ' + boneName +\ - ' for option ' + str(switchIndex) + \ - ', the object provided is not an armature.') - elif optionArmature in geolayoutGraph.secondaryGeolayouts: - optionGeolayout = geolayoutGraph.secondaryGeolayouts[ - optionArmature] - geolayoutGraph.addJumpNode( - transformNode, geolayout, optionGeolayout) - continue - - #optionNode = addParentNode(switchTransformNode, StartNode()) - - optionBoneName = getSwitchOptionBone(optionArmature) - optionBone = optionArmature.data.bones[optionBoneName] - - # Armature doesn't matter here since node is not based off bone - optionGeolayout = \ - geolayoutGraph.addGeolayout( - optionArmature, namePrefix + "_" + optionArmature.name) - geolayoutGraph.addJumpNode(transformNode, geolayout, - optionGeolayout) - - if not zeroRotation or not zeroTranslation: - startNode = TransformNode( - TranslateRotateNode(1, 0, False, translate, rotate)) - else: - startNode = TransformNode(StartNode()) - optionGeolayout.nodes.append(startNode) - - childrenNames = sorted( - [bone.name for bone in optionBone.children]) - for name in childrenNames: - # We can use optionBone as the last translate/rotate - # since we added a TranslateRotate node before - # the switch node. - optionObjs = [] - for childObj in optionArmature.children: - if isinstance(childObj.data, bpy.types.Mesh): - optionObjs.append(childObj) - if len(optionObjs) > 1: - raise PluginError('Error: In switch bone ' + boneName +\ - ' for option ' + str(switchIndex) + \ - ', the switch option armature has more than one mesh child.') - elif len(optionObjs) < 1: - raise PluginError('Error: In switch bone ' + boneName +\ - ' for option ' + str(switchIndex) + \ - ', the switch option armature has no mesh children.') - optionObj = optionObjs[0] - optionInfoDict = getInfoDict(optionObj) - processBone(fModel, name, optionObj, - optionArmature, - finalTransform, optionBone.name, optionBone.name, - optionBone.name, startNode, - materialOverrides, namePrefix + '_' + optionBone.name, - optionGeolayout, geolayoutGraph, optionInfoDict, convertTextureData) - else: - if switchOption.switchType == 'Material': - material = switchOption.materialOverride - if switchOption.overrideDrawLayer: - drawLayer = int(switchOption.drawLayer) - else: - drawLayer = None - if switchOption.materialOverrideType == 'Specific': - specificMat = tuple([matPtr.material for matPtr in \ - switchOption.specificOverrideArray]) - else: - specificMat = tuple([matPtr.material for matPtr in \ - switchOption.specificIgnoreArray]) - else: - material = None - specificMat = None - drawLayer = int(switchOption.drawLayer) - - texDimensions = getTexDimensions(material) if material is not None else None - overrideNode = TransformNode(SwitchOverrideNode( - material, specificMat, drawLayer, - switchOption.materialOverrideType, texDimensions)) - overrideNode.parent = transformNode - transformNode.children.append(overrideNode) + +def processBone( + fModel, + boneName, + obj, + armatureObj, + transformMatrix, + lastTranslateName, + lastRotateName, + lastDeformName, + parentTransformNode, + materialOverrides, + namePrefix, + geolayout, + geolayoutGraph, + infoDict, + convertTextureData, +): + bone = armatureObj.data.bones[boneName] + poseBone = armatureObj.pose.bones[boneName] + boneGroup = poseBone.bone_group + finalTransform = copy.deepcopy(transformMatrix) + materialOverrides = copy.copy(materialOverrides) + + if bone.geo_cmd == "Ignore": + return + + # Get translate + if lastTranslateName is not None: + translateParent = armatureObj.data.bones[lastTranslateName] + translate = ( + translateParent.matrix_local.inverted() @ bone.matrix_local + ).decompose()[0] + else: + translateParent = None + translate = bone.matrix_local.decompose()[0] + + # Get rotate + if lastRotateName is not None: + rotateParent = armatureObj.data.bones[lastRotateName] + rotate = (rotateParent.matrix_local.inverted() @ bone.matrix_local).decompose()[ + 1 + ] + else: + rotateParent = None + rotate = bone.matrix_local.decompose()[1] + + translation = mathutils.Matrix.Translation(translate) + rotation = rotate.to_matrix().to_4x4() + zeroTranslation = isZeroTranslation(translate) + zeroRotation = isZeroRotation(rotate) + + # hasDL = bone.use_deform + hasDL = True + if bone.geo_cmd in animatableBoneTypes: + if bone.geo_cmd == "CustomAnimated": + if not bone.fast64.sm64.custom_geo_cmd_macro: + raise PluginError( + f'Bone "{boneName}" on armature "{armatureObj.name}" needs a geo command macro.' + ) + node = CustomAnimatedNode( + bone.fast64.sm64.custom_geo_cmd_macro, + int(bone.draw_layer), + translate, + rotate, + ) + lastTranslateName = boneName + lastRotateName = boneName + else: # DisplayListWithOffset + if not zeroRotation: + node = DisplayListWithOffsetNode( + int(bone.draw_layer), hasDL, mathutils.Vector((0, 0, 0)) + ) + + parentTransformNode = addParentNode( + parentTransformNode, + TranslateRotateNode(1, 0, False, translate, rotate), + ) + + lastTranslateName = boneName + lastRotateName = boneName + else: + node = DisplayListWithOffsetNode(int(bone.draw_layer), hasDL, translate) + lastTranslateName = boneName + + finalTransform = transformMatrix @ translation + + elif bone.geo_cmd == "CustomNonAnimated": + if bone.fast64.sm64.custom_geo_cmd_macro == "": + raise PluginError( + f'Bone "{boneName}" on armature "{armatureObj.name}" needs a geo command macro.' + ) + node = CustomNode( + bone.fast64.sm64.custom_geo_cmd_macro, bone.fast64.sm64.custom_geo_cmd_args + ) + elif bone.geo_cmd == "Function": + if bone.geo_func == "": + raise PluginError("Function bone " + boneName + " function value is empty.") + node = FunctionNode(bone.geo_func, bone.func_param) + elif bone.geo_cmd == "HeldObject": + if bone.geo_func == "": + raise PluginError( + "Held object bone " + boneName + " function value is empty." + ) + node = HeldObjectNode(bone.geo_func, translate) + else: + if bone.geo_cmd == "Switch": + # This is done so we can easily calculate transforms + # of switch options. + + if bone.geo_func == "": + raise PluginError( + "Switch bone " + boneName + " function value is empty." + ) + node = SwitchNode(bone.geo_func, bone.func_param, boneName) + processSwitchBoneMatOverrides(materialOverrides, bone) + + elif bone.geo_cmd == "Start": + node = StartNode() + elif bone.geo_cmd == "TranslateRotate": + drawLayer = int(bone.draw_layer) + fieldLayout = int(bone.field_layout) + + node = TranslateRotateNode(drawLayer, fieldLayout, hasDL, translate, rotate) + + if node.fieldLayout == 0: + finalTransform = transformMatrix @ translation @ rotation + lastTranslateName = boneName + lastRotateName = boneName + elif node.fieldLayout == 1: + finalTransform = transformMatrix @ translation + lastTranslateName = boneName + elif node.fieldLayout == 2: + finalTransform = transformMatrix @ rotation + lastRotateName = boneName + else: + yRot = rotate.to_euler().y + rotation = mathutils.Euler((0, yRot, 0)).to_matrix().to_4x4() + finalTransform = transformMatrix @ rotation + lastRotateName = boneName + + elif bone.geo_cmd == "Translate": + node = TranslateNode(int(bone.draw_layer), hasDL, translate) + finalTransform = transformMatrix @ translation + lastTranslateName = boneName + elif bone.geo_cmd == "Rotate": + node = RotateNode(int(bone.draw_layer), hasDL, rotate) + finalTransform = transformMatrix @ rotation + lastRotateName = boneName + elif bone.geo_cmd == "Billboard": + node = BillboardNode(int(bone.draw_layer), hasDL, translate) + finalTransform = transformMatrix @ translation + lastTranslateName = boneName + elif bone.geo_cmd == "DisplayList": + node = DisplayListNode(int(bone.draw_layer)) + if not armatureObj.data.bones[boneName].use_deform: + raise PluginError( + "Display List (0x15) " + + boneName + + " must be a deform bone. Make sure deform is checked in bone properties." + ) + elif bone.geo_cmd == "Shadow": + shadowType = int(bone.shadow_type) + shadowSolidity = bone.shadow_solidity + shadowScale = bone.shadow_scale + node = ShadowNode(shadowType, shadowSolidity, shadowScale) + elif bone.geo_cmd == "Scale": + node = ScaleNode(int(bone.draw_layer), bone.geo_scale, hasDL) + finalTransform = transformMatrix @ mathutils.Matrix.Scale( + node.scaleValue, 4 + ) + elif bone.geo_cmd == "StartRenderArea": + node = StartRenderAreaNode(bone.culling_radius) + else: + raise PluginError("Invalid geometry command: " + bone.geo_cmd) + + transformNode = TransformNode(node) + additionalNodes = [] + + if node.hasDL: + triConverterInfo = TriangleConverterInfo( + obj, + armatureObj.data, + fModel.f3d, + mathutils.Matrix.Scale(bpy.context.scene.blenderToSM64Scale, 4) + @ bone.matrix_local.inverted(), + infoDict, + ) + fMeshes, fSkinnedMeshes, usedDrawLayers = saveModelGivenVertexGroup( + fModel, + obj, + bone.name, + lastDeformName, + armatureObj, + materialOverrides, + namePrefix, + infoDict, + convertTextureData, + triConverterInfo, + "sm64", + int(bone.draw_layer), + ) + + if (fMeshes is None or len(fMeshes) == 0) and ( + fSkinnedMeshes is None or len(fSkinnedMeshes) == 0 + ): + # print("No mesh data.") + node.hasDL = False + transformNode.skinnedWithoutDL = usedDrawLayers is not None + # bone.use_deform = False + if usedDrawLayers is not None: + lastDeformName = boneName + parentTransformNode.children.append(transformNode) + transformNode.parent = parentTransformNode + else: + lastDeformName = boneName + if not bone.use_deform: + raise PluginError( + bone.name + + " has vertices in its vertex group but is not set to deformable. Make sure to enable deform on this bone." + ) + for drawLayer, fMesh in fMeshes.items(): + drawLayer = int( + drawLayer + ) # IMPORTANT, otherwise 1 and '1' will be considered separate keys + if node.DLmicrocode is not None: + print("Adding additional node from layer " + str(drawLayer)) + additionalNode = ( + DisplayListNode(drawLayer) + if not isinstance(node, BillboardNode) + else BillboardNode(drawLayer, True, [0, 0, 0]) + ) + additionalNode.DLmicrocode = fMesh.draw + additionalNode.fMesh = fMesh + additionalTransformNode = TransformNode(additionalNode) + additionalNodes.append(additionalTransformNode) + else: + print("Adding node from layer " + str(drawLayer)) + # Setting drawLayer on construction is useless? + node.drawLayer = drawLayer + node.DLmicrocode = fMesh.draw + node.fMesh = fMesh # Used for material override switches + + parentTransformNode.children.append(transformNode) + transformNode.parent = parentTransformNode + + if ( + lastDeformName is not None + and armatureObj.data.bones[lastDeformName].geo_cmd == "SwitchOption" + and len(fSkinnedMeshes) > 0 + ): + raise PluginError( + "Cannot skin geometry to a Switch Option " + + "bone. Skinning cannot occur across a switch node." + ) + + for drawLayer, fSkinnedMesh in fSkinnedMeshes.items(): + print("Adding skinned mesh node.") + transformNode = addSkinnedMeshNode( + armatureObj, + boneName, + fSkinnedMesh, + transformNode, + parentTransformNode, + int(drawLayer), + ) + + for additionalTransformNode in additionalNodes: + transformNode.children.append(additionalTransformNode) + additionalTransformNode.parent = transformNode + # print(boneName) + else: + parentTransformNode.children.append(transformNode) + transformNode.parent = parentTransformNode + + if not isinstance(transformNode.node, SwitchNode): + # print(boneGroup.name if boneGroup is not None else "Offset") + if len(bone.children) > 0: + # print("\tHas Children") + if bone.geo_cmd == "Function": + raise PluginError( + "Function bones cannot have children. They instead affect the next sibling bone in alphabetical order." + ) + + # Handle child nodes + # nonDeformTransformData should be modified to be sent to children, + # otherwise it should not be modified for parent. + # This is so it can be used for siblings. + childrenNames = sorted([bone.name for bone in bone.children]) + for name in childrenNames: + processBone( + fModel, + name, + obj, + armatureObj, + finalTransform, + lastTranslateName, + lastRotateName, + lastDeformName, + transformNode, + materialOverrides, + namePrefix, + geolayout, + geolayoutGraph, + infoDict, + convertTextureData, + ) + # transformNode.children.append(childNode) + # childNode.parent = transformNode + + # see generateSwitchOptions() for explanation. + else: + # print(boneGroup.name if boneGroup is not None else "Offset") + if len(bone.children) > 0: + # optionGeolayout = \ + # geolayoutGraph.addGeolayout( + # transformNode, boneName + '_opt0') + # geolayoutGraph.addJumpNode(transformNode, geolayout, + # optionGeolayout) + # optionGeolayout.nodes.append(TransformNode(StartNode())) + nextStartNode = TransformNode(StartNode()) + transformNode.children.append(nextStartNode) + nextStartNode.parent = transformNode + + childrenNames = sorted([bone.name for bone in bone.children]) + for name in childrenNames: + processBone( + fModel, + name, + obj, + armatureObj, + finalTransform, + lastTranslateName, + lastRotateName, + lastDeformName, + nextStartNode, + materialOverrides, + namePrefix, + geolayout, + geolayoutGraph, + infoDict, + convertTextureData, + ) + # transformNode.children.append(childNode) + # childNode.parent = transformNode + else: + raise PluginError( + 'Switch bone "' + + bone.name + + '" must have child bones with geometry attached.' + ) + + bone = armatureObj.data.bones[boneName] + for switchIndex in range(len(bone.switch_options)): + switchOption = bone.switch_options[switchIndex] + if switchOption.switchType == "Mesh": + optionArmature = switchOption.optionArmature + if optionArmature is None: + raise PluginError( + "Error: In switch bone " + + boneName + + " for option " + + str(switchIndex) + + ", the switch option armature is None." + ) + elif not isinstance(optionArmature.data, bpy.types.Armature): + raise PluginError( + "Error: In switch bone " + + boneName + + " for option " + + str(switchIndex) + + ", the object provided is not an armature." + ) + elif optionArmature in geolayoutGraph.secondaryGeolayouts: + optionGeolayout = geolayoutGraph.secondaryGeolayouts[optionArmature] + geolayoutGraph.addJumpNode( + transformNode, geolayout, optionGeolayout + ) + continue + + # optionNode = addParentNode(switchTransformNode, StartNode()) + + optionBoneName = getSwitchOptionBone(optionArmature) + optionBone = optionArmature.data.bones[optionBoneName] + + # Armature doesn't matter here since node is not based off bone + optionGeolayout = geolayoutGraph.addGeolayout( + optionArmature, namePrefix + "_" + optionArmature.name + ) + geolayoutGraph.addJumpNode(transformNode, geolayout, optionGeolayout) + + if not zeroRotation or not zeroTranslation: + startNode = TransformNode( + TranslateRotateNode(1, 0, False, translate, rotate) + ) + else: + startNode = TransformNode(StartNode()) + optionGeolayout.nodes.append(startNode) + + childrenNames = sorted([bone.name for bone in optionBone.children]) + for name in childrenNames: + # We can use optionBone as the last translate/rotate + # since we added a TranslateRotate node before + # the switch node. + optionObjs = [] + for childObj in optionArmature.children: + if isinstance(childObj.data, bpy.types.Mesh): + optionObjs.append(childObj) + if len(optionObjs) > 1: + raise PluginError( + "Error: In switch bone " + + boneName + + " for option " + + str(switchIndex) + + ", the switch option armature has more than one mesh child." + ) + elif len(optionObjs) < 1: + raise PluginError( + "Error: In switch bone " + + boneName + + " for option " + + str(switchIndex) + + ", the switch option armature has no mesh children." + ) + optionObj = optionObjs[0] + optionInfoDict = getInfoDict(optionObj) + processBone( + fModel, + name, + optionObj, + optionArmature, + finalTransform, + optionBone.name, + optionBone.name, + optionBone.name, + startNode, + materialOverrides, + namePrefix + "_" + optionBone.name, + optionGeolayout, + geolayoutGraph, + optionInfoDict, + convertTextureData, + ) + else: + if switchOption.switchType == "Material": + material = switchOption.materialOverride + if switchOption.overrideDrawLayer: + drawLayer = int(switchOption.drawLayer) + else: + drawLayer = None + if switchOption.materialOverrideType == "Specific": + specificMat = tuple( + [ + matPtr.material + for matPtr in switchOption.specificOverrideArray + ] + ) + else: + specificMat = tuple( + [ + matPtr.material + for matPtr in switchOption.specificIgnoreArray + ] + ) + else: + material = None + specificMat = None + drawLayer = int(switchOption.drawLayer) + + texDimensions = ( + getTexDimensions(material) if material is not None else None + ) + overrideNode = TransformNode( + SwitchOverrideNode( + material, + specificMat, + drawLayer, + switchOption.materialOverrideType, + texDimensions, + ) + ) + overrideNode.parent = transformNode + transformNode.children.append(overrideNode) + def processSwitchBoneMatOverrides(materialOverrides, switchBone): - for switchOption in switchBone.switch_options: - if switchOption.switchType == 'Material': - if switchOption.materialOverride is None: - raise PluginError("Error: On switch bone " + \ - switchBone.name + ', a switch option' + \ - ' is a Material Override, but no material is provided.') - if switchOption.materialOverrideType == 'Specific': - for mat in switchOption.specificOverrideArray: - if mat is None: - raise PluginError("Error: On switch bone " + \ - switchBone.name + ', a switch option' + \ - ' has a material override field that is None.') - specificMat = tuple([matPtr.material for matPtr in \ - switchOption.specificOverrideArray]) - else: - for mat in switchOption.specificIgnoreArray: - if mat is None: - raise PluginError("Error: On switch bone " + \ - switchBone.name + ', a switch option' + \ - ' has a material ignore field that is None.') - specificMat = tuple([matPtr.material for matPtr in \ - switchOption.specificIgnoreArray]) - - materialOverrides.append((switchOption.materialOverride, specificMat, - switchOption.materialOverrideType)) + for switchOption in switchBone.switch_options: + if switchOption.switchType == "Material": + if switchOption.materialOverride is None: + raise PluginError( + "Error: On switch bone " + + switchBone.name + + ", a switch option" + + " is a Material Override, but no material is provided." + ) + if switchOption.materialOverrideType == "Specific": + for mat in switchOption.specificOverrideArray: + if mat is None: + raise PluginError( + "Error: On switch bone " + + switchBone.name + + ", a switch option" + + " has a material override field that is None." + ) + specificMat = tuple( + [matPtr.material for matPtr in switchOption.specificOverrideArray] + ) + else: + for mat in switchOption.specificIgnoreArray: + if mat is None: + raise PluginError( + "Error: On switch bone " + + switchBone.name + + ", a switch option" + + " has a material ignore field that is None." + ) + specificMat = tuple( + [matPtr.material for matPtr in switchOption.specificIgnoreArray] + ) + + materialOverrides.append( + ( + switchOption.materialOverride, + specificMat, + switchOption.materialOverrideType, + ) + ) + def getGroupIndex(vert, armatureObj, obj): - actualGroups = [] - belowLimitGroups = [] - nonBoneGroups = [] - for group in vert.groups: - groupName = getGroupNameFromIndex(obj, group.group) - if groupName is not None: - if groupName in armatureObj.data.bones: - if group.weight > 0.4: - actualGroups.append(group) - else: - belowLimitGroups.append(groupName) - else: - nonBoneGroups.append(groupName) - - if len(actualGroups) == 0: - highlightWeightErrors(obj, [vert], "VERT") - raise VertexWeightError("All vertices must be part of a vertex group, be non-trivially weighted (> 0.4), and the vertex group must correspond to a bone in the armature.\n" +\ - "Groups of the bad vert that don't correspond to a bone: " + str(nonBoneGroups) + '. If a vert is supposed to belong to this group then either a bone is missing or you have the wrong group.\n' +\ - "Groups of the bad vert below weight limit: " + str(belowLimitGroups) + \ - ". If a vert is supposed to belong to one of these groups then make sure to increase its weight.") - vertGroup = actualGroups[0] - significantWeightGroup = None - for group in actualGroups: - if group.weight > 0.5: - if significantWeightGroup is None: - significantWeightGroup = group - else: - highlightWeightErrors(obj, [vert], "VERT") - raise VertexWeightError("A vertex was found that was significantly weighted to multiple groups. Make sure each vertex only belongs to one group whose weight is greater than 0.5. (" + \ - getGroupNameFromIndex(obj, group.group) + ', ' + getGroupNameFromIndex(obj, significantWeightGroup.group) + ')') - if group.weight > vertGroup.weight: - vertGroup = group - #if vertGroup not in actualGroups: - #raise VertexWeightError("A vertex was found that was primarily weighted to a group that does not correspond to a bone in #the armature. (" + getGroupNameFromIndex(obj, vertGroup.group) + ') Either decrease the weights of this vertex group or remove it. If you think this group should correspond to a bone, make sure to check your spelling.') - return vertGroup.group - -class SimpleSkinnedFace(): - def __init__(self, bFace, loopsInGroup, loopsNotInGroup): - self.bFace= bFace - self.loopsInGroup = loopsInGroup - self.loopsNotInGroup = loopsNotInGroup + actualGroups = [] + belowLimitGroups = [] + nonBoneGroups = [] + for group in vert.groups: + groupName = getGroupNameFromIndex(obj, group.group) + if groupName is not None: + if groupName in armatureObj.data.bones: + if group.weight > 0.4: + actualGroups.append(group) + else: + belowLimitGroups.append(groupName) + else: + nonBoneGroups.append(groupName) + + if len(actualGroups) == 0: + highlightWeightErrors(obj, [vert], "VERT") + raise VertexWeightError( + "All vertices must be part of a vertex group, be non-trivially weighted (> 0.4), and the vertex group must correspond to a bone in the armature.\n" + + "Groups of the bad vert that don't correspond to a bone: " + + str(nonBoneGroups) + + ". If a vert is supposed to belong to this group then either a bone is missing or you have the wrong group.\n" + + "Groups of the bad vert below weight limit: " + + str(belowLimitGroups) + + ". If a vert is supposed to belong to one of these groups then make sure to increase its weight." + ) + vertGroup = actualGroups[0] + significantWeightGroup = None + for group in actualGroups: + if group.weight > 0.5: + if significantWeightGroup is None: + significantWeightGroup = group + else: + highlightWeightErrors(obj, [vert], "VERT") + raise VertexWeightError( + "A vertex was found that was significantly weighted to multiple groups. Make sure each vertex only belongs to one group whose weight is greater than 0.5. (" + + getGroupNameFromIndex(obj, group.group) + + ", " + + getGroupNameFromIndex(obj, significantWeightGroup.group) + + ")" + ) + if group.weight > vertGroup.weight: + vertGroup = group + # if vertGroup not in actualGroups: + # raise VertexWeightError("A vertex was found that was primarily weighted to a group that does not correspond to a bone in #the armature. (" + getGroupNameFromIndex(obj, vertGroup.group) + ') Either decrease the weights of this vertex group or remove it. If you think this group should correspond to a bone, make sure to check your spelling.') + return vertGroup.group + + +class SimpleSkinnedFace: + def __init__(self, bFace, loopsInGroup, loopsNotInGroup): + self.bFace = bFace + self.loopsInGroup = loopsInGroup + self.loopsNotInGroup = loopsNotInGroup + def checkIfFirstNonASMNode(childNode): - index = childNode.parent.children.index(childNode) - if index == 0: - return True - while index > 0 and \ - (isinstance(childNode.parent.children[index - 1].node, FunctionNode) or \ - not childNode.parent.children[index - 1].skinned): - index -= 1 - return index == 0 + index = childNode.parent.children.index(childNode) + if index == 0: + return True + while index > 0 and ( + isinstance(childNode.parent.children[index - 1].node, FunctionNode) + or not childNode.parent.children[index - 1].skinned + ): + index -= 1 + return index == 0 + # parent connects child node to itself # skinned node handled by child @@ -1553,108 +2380,129 @@ def checkIfFirstNonASMNode(childNode): # If they are both deform. # Additionally, ASM nodes should count as modifiers for other nodes if # they precede them -def addSkinnedMeshNode(armatureObj, boneName, skinnedMesh, transformNode, parentNode, drawLayer): - # Add node to its immediate parent - #print(str(type(parentNode.node)) + str(type(transformNode.node))) - - transformNode.skinned = True - #print("Skinned mesh exists.") - - # Get skinned node - bone = armatureObj.data.bones[boneName] - skinnedNode = DisplayListNode(drawLayer) - skinnedNode.fMesh = skinnedMesh - skinnedNode.DLmicrocode = skinnedMesh.draw - skinnedTransformNode = TransformNode(skinnedNode) - - # Ascend heirarchy until reaching first node before a deform parent. - # We duplicate the hierarchy along the way to possibly use later. - highestChildNode = transformNode - transformNodeCopy = TransformNode(copy.copy(transformNode.node)) - transformNodeCopy.parent = parentNode - highestChildCopy = transformNodeCopy - isFirstChild = True - hasNonDeform0x13Command = False - acrossSwitchNode = False - while highestChildNode.parent is not None and\ - not (highestChildNode.parent.node.hasDL or highestChildNode.parent.skinnedWithoutDL): # empty 0x13 command? - isFirstChild &= checkIfFirstNonASMNode(highestChildNode) - hasNonDeform0x13Command |= isinstance(highestChildNode.parent.node, - DisplayListWithOffsetNode) - - acrossSwitchNode |= isinstance(highestChildNode.parent.node, SwitchNode) - - highestChildNode = highestChildNode.parent - highestChildCopyParent = TransformNode(copy.copy(highestChildNode.node)) - highestChildCopyParent.children = [highestChildCopy] - highestChildCopy.parent = highestChildCopyParent - #print(str(highestChildCopy.node) + " " + str(isFirstChild)) - highestChildCopy = highestChildCopyParent - #isFirstChild &= checkIfFirstNonASMNode(highestChildNode) - if highestChildNode.parent is None: - raise PluginError("Issue with \"" + boneName + "\": Deform parent bone not found for skinning.") - #raise PluginError("There shouldn't be a skinned mesh section if there is no deform parent. This error may have ocurred if a switch option node is trying to skin to a parent but no deform parent exists.") - - # Otherwise, remove the transformNode from the parent and - # duplicate the node heirarchy up to the last deform parent. - # Add the skinned node first to the last deform parent, - # then add the duplicated node hierarchy afterward. - if highestChildNode != transformNode: - if not isFirstChild: - #print("Hierarchy but not first child.") - if hasNonDeform0x13Command: - raise PluginError("Error with " + boneName + ': You cannot have more that one child skinned mesh connected to a parent skinned mesh with a non deform 0x13 bone in between. Try removing any unnecessary non-deform bones.') - - if acrossSwitchNode: - raise PluginError("Error with " + boneName + ': You can not' +\ - ' skin across a switch node with more than one child.') - - # Remove transformNode - parentNode.children.remove(transformNode) - transformNode.parent = None - - # copy hierarchy, along with any preceding Function commands - highestChildIndex = \ - highestChildNode.parent.children.index(highestChildNode) - precedingFunctionCmds = [] - while highestChildIndex > 0 and \ - type(highestChildNode.parent.children[\ - highestChildIndex - 1].node) is FunctionNode: - - precedingFunctionCmds.insert(0, copy.deepcopy( - highestChildNode.parent.children[highestChildIndex - 1])) - highestChildIndex -= 1 - #_____________ - # add skinned mesh node - highestChildCopy.parent = highestChildNode.parent - highestChildCopy.parent.children.append(skinnedTransformNode) - skinnedTransformNode.parent = highestChildCopy.parent - - # add Function cmd nodes - for asmCmdNode in precedingFunctionCmds: - highestChildCopy.parent.children.append(asmCmdNode) - - # add heirarchy to parent - highestChildCopy.parent.children.append(highestChildCopy) - - transformNode = transformNodeCopy - else: - #print("Hierarchy with first child.") - nodeIndex = highestChildNode.parent.children.index(highestChildNode) - while nodeIndex > 0 and \ - type(highestChildNode.parent.children[\ - nodeIndex - 1].node) is FunctionNode: - nodeIndex -= 1 - highestChildNode.parent.children.insert( - nodeIndex, skinnedTransformNode) - skinnedTransformNode.parent = highestChildNode.parent - else: - #print("Immediate child.") - nodeIndex = parentNode.children.index(transformNode) - parentNode.children.insert(nodeIndex, skinnedTransformNode) - skinnedTransformNode.parent = parentNode - - return transformNode +def addSkinnedMeshNode( + armatureObj, boneName, skinnedMesh, transformNode, parentNode, drawLayer +): + # Add node to its immediate parent + # print(str(type(parentNode.node)) + str(type(transformNode.node))) + + transformNode.skinned = True + # print("Skinned mesh exists.") + + # Get skinned node + bone = armatureObj.data.bones[boneName] + skinnedNode = DisplayListNode(drawLayer) + skinnedNode.fMesh = skinnedMesh + skinnedNode.DLmicrocode = skinnedMesh.draw + skinnedTransformNode = TransformNode(skinnedNode) + + # Ascend heirarchy until reaching first node before a deform parent. + # We duplicate the hierarchy along the way to possibly use later. + highestChildNode = transformNode + transformNodeCopy = TransformNode(copy.copy(transformNode.node)) + transformNodeCopy.parent = parentNode + highestChildCopy = transformNodeCopy + isFirstChild = True + hasNonDeform0x13Command = False + acrossSwitchNode = False + while highestChildNode.parent is not None and not ( + highestChildNode.parent.node.hasDL or highestChildNode.parent.skinnedWithoutDL + ): # empty 0x13 command? + isFirstChild &= checkIfFirstNonASMNode(highestChildNode) + hasNonDeform0x13Command |= isinstance( + highestChildNode.parent.node, DisplayListWithOffsetNode + ) + + acrossSwitchNode |= isinstance(highestChildNode.parent.node, SwitchNode) + + highestChildNode = highestChildNode.parent + highestChildCopyParent = TransformNode(copy.copy(highestChildNode.node)) + highestChildCopyParent.children = [highestChildCopy] + highestChildCopy.parent = highestChildCopyParent + # print(str(highestChildCopy.node) + " " + str(isFirstChild)) + highestChildCopy = highestChildCopyParent + # isFirstChild &= checkIfFirstNonASMNode(highestChildNode) + if highestChildNode.parent is None: + raise PluginError( + 'Issue with "' + boneName + '": Deform parent bone not found for skinning.' + ) + # raise PluginError("There shouldn't be a skinned mesh section if there is no deform parent. This error may have ocurred if a switch option node is trying to skin to a parent but no deform parent exists.") + + # Otherwise, remove the transformNode from the parent and + # duplicate the node heirarchy up to the last deform parent. + # Add the skinned node first to the last deform parent, + # then add the duplicated node hierarchy afterward. + if highestChildNode != transformNode: + if not isFirstChild: + # print("Hierarchy but not first child.") + if hasNonDeform0x13Command: + raise PluginError( + "Error with " + + boneName + + ": You cannot have more that one child skinned mesh connected to a parent skinned mesh with a non deform 0x13 bone in between. Try removing any unnecessary non-deform bones." + ) + + if acrossSwitchNode: + raise PluginError( + "Error with " + + boneName + + ": You can not" + + " skin across a switch node with more than one child." + ) + + # Remove transformNode + parentNode.children.remove(transformNode) + transformNode.parent = None + + # copy hierarchy, along with any preceding Function commands + highestChildIndex = highestChildNode.parent.children.index(highestChildNode) + precedingFunctionCmds = [] + while ( + highestChildIndex > 0 + and type(highestChildNode.parent.children[highestChildIndex - 1].node) + is FunctionNode + ): + + precedingFunctionCmds.insert( + 0, + copy.deepcopy( + highestChildNode.parent.children[highestChildIndex - 1] + ), + ) + highestChildIndex -= 1 + # _____________ + # add skinned mesh node + highestChildCopy.parent = highestChildNode.parent + highestChildCopy.parent.children.append(skinnedTransformNode) + skinnedTransformNode.parent = highestChildCopy.parent + + # add Function cmd nodes + for asmCmdNode in precedingFunctionCmds: + highestChildCopy.parent.children.append(asmCmdNode) + + # add heirarchy to parent + highestChildCopy.parent.children.append(highestChildCopy) + + transformNode = transformNodeCopy + else: + # print("Hierarchy with first child.") + nodeIndex = highestChildNode.parent.children.index(highestChildNode) + while ( + nodeIndex > 0 + and type(highestChildNode.parent.children[nodeIndex - 1].node) + is FunctionNode + ): + nodeIndex -= 1 + highestChildNode.parent.children.insert(nodeIndex, skinnedTransformNode) + skinnedTransformNode.parent = highestChildNode.parent + else: + # print("Immediate child.") + nodeIndex = parentNode.children.index(transformNode) + parentNode.children.insert(nodeIndex, skinnedTransformNode) + skinnedTransformNode.parent = parentNode + + return transformNode + def getAncestorGroups(parentGroup, vertexGroup, armatureObj, obj): if parentGroup is None: @@ -1674,394 +2522,567 @@ def getAncestorGroups(parentGroup, vertexGroup, armatureObj, obj): currentBone = currentBone.parent ancestorBones.append(armatureObj.data.bones[parentGroup]) - #print(vertexGroup + ", " + parentGroup) - #print([bone.name for bone in ancestorBones]) - return [getGroupIndexFromname(obj, bone.name) for bone in armatureObj.data.bones if bone not in ancestorBones] + # print(vertexGroup + ", " + parentGroup) + # print([bone.name for bone in ancestorBones]) + return [ + getGroupIndexFromname(obj, bone.name) + for bone in armatureObj.data.bones + if bone not in ancestorBones + ] + # returns fMeshes, fSkinnedMeshes, makeLastDeformBone -def saveModelGivenVertexGroup(fModel, obj, vertexGroup, - parentGroup, armatureObj, materialOverrides, namePrefix, - infoDict, convertTextureData, triConverterInfo, drawLayerField, drawLayerV3): - #checkForF3DMaterial(obj) - - #print("GROUP " + vertexGroup) - - # TODO: Implement lastMaterialName optimization - lastMaterialName = None - - mesh = obj.data - currentGroupIndex = getGroupIndexFromname(obj, vertexGroup) - vertIndices = [vert.index for vert in obj.data.vertices if\ - getGroupIndex(vert, armatureObj, obj) == currentGroupIndex] - parentGroupIndex = getGroupIndexFromname(obj, parentGroup) \ - if parentGroup is not None else -1 - - if len(vertIndices) == 0: - print("No vert indices in " + vertexGroup) - return None, None, None - - transformMatrix = mathutils.Matrix.Scale(bpy.context.scene.blenderToSM64Scale, 4) - if parentGroup is None: - parentMatrix = transformMatrix - else: - parentBone = armatureObj.data.bones[parentGroup] - parentMatrix = transformMatrix @ parentBone.matrix_local.inverted() - - groupFaces = {} # draw layer : {material_index : [faces]} - skinnedFaces = {} # draw layer : {material_index : [skinned faces]} - handledFaces = [] - usedDrawLayers = set() - ancestorGroups = {} # vertexGroup : ancestor list - - for vertIndex in vertIndices: - if vertIndex not in infoDict.vert: - continue - for face in infoDict.vert[vertIndex]: - material = obj.material_slots[face.material_index].material - if material.mat_ver > 3: - drawLayer = int(getattr(material.f3d_mat.draw_layer, drawLayerField)) - else: - drawLayer = drawLayerV3 - - # Ignore repeat faces - if face in handledFaces: - continue - else: - handledFaces.append(face) - - loopsInGroup = [] - loopsNotInGroup = [] - isChildSkinnedFace = False - - # loop is interpreted as face + loop index - for i in range(3): - vertGroupIndex = getGroupIndex(mesh.vertices[face.vertices[i]], armatureObj, obj) - if vertGroupIndex not in ancestorGroups: - ancestorGroups[vertGroupIndex] = getAncestorGroups(parentGroup, vertexGroup, armatureObj, obj) - - if vertGroupIndex == currentGroupIndex: - loopsInGroup.append((face, mesh.loops[face.loops[i]])) - elif vertGroupIndex == parentGroupIndex: - loopsNotInGroup.append((face, mesh.loops[face.loops[i]])) - elif vertGroupIndex not in ancestorGroups[vertGroupIndex]: - # Only want to handle skinned faces connected to parent - isChildSkinnedFace = True - break - else: - highlightWeightErrors(obj, [face], 'FACE') - raise VertexWeightError("Error with " + vertexGroup + ": Verts attached to one bone can not be attached to any of its ancestor or sibling bones besides its first immediate deformable parent bone. For example, a foot vertex can be connected to a leg vertex, but a foot vertex cannot be connected to a thigh vertex.") - if isChildSkinnedFace: - usedDrawLayers.add(drawLayer) - continue - - if len(loopsNotInGroup) == 0: - if drawLayer not in groupFaces: - groupFaces[drawLayer] = {} - drawLayerFaces = groupFaces[drawLayer] - if face.material_index not in drawLayerFaces: - drawLayerFaces[face.material_index] = [] - drawLayerFaces[face.material_index].append(face) - else: - if drawLayer not in skinnedFaces: - skinnedFaces[drawLayer] = {} - drawLayerSkinnedFaces = skinnedFaces[drawLayer] - if face.material_index not in drawLayerSkinnedFaces: - drawLayerSkinnedFaces[face.material_index] = [] - drawLayerSkinnedFaces[face.material_index].append( - SimpleSkinnedFace(face, loopsInGroup, loopsNotInGroup)) - - if len(groupFaces) == 0 and len(skinnedFaces) == 0: - print("No faces in " + vertexGroup) - return None, None, usedDrawLayers - - # Save skinned mesh - fMeshes = {} - fSkinnedMeshes = {} - for drawLayer, materialFaces in skinnedFaces.items(): - - meshName = getFMeshName(vertexGroup, namePrefix, drawLayer, False) - checkUniqueBoneNames(fModel, meshName, vertexGroup) - skinnedMeshName = getFMeshName(vertexGroup, namePrefix, drawLayer, True) - checkUniqueBoneNames(fModel, skinnedMeshName, vertexGroup) - - fMesh, fSkinnedMesh = saveSkinnedMeshByMaterial(materialFaces, fModel, - meshName, skinnedMeshName, obj, parentMatrix, namePrefix, - vertexGroup, drawLayer, convertTextureData, triConverterInfo) - - fSkinnedMeshes[drawLayer] = fSkinnedMesh - fMeshes[drawLayer] = fMesh - - fModel.meshes[skinnedMeshName] = fSkinnedMeshes[drawLayer] - fModel.meshes[meshName] = fMeshes[drawLayer] - - if drawLayer not in groupFaces: - fMeshes[drawLayer].draw.commands.extend([SPEndDisplayList(),]) - - # Save unskinned mesh - for drawLayer, materialFaces in groupFaces.items(): - if drawLayer not in fMeshes: - fMesh = fModel.addMesh(vertexGroup, namePrefix, drawLayer, False, None) - fMeshes[drawLayer] = fMesh - - for material_index, bFaces in materialFaces.items(): - material = obj.material_slots[material_index].material - checkForF3dMaterialInFaces(obj, material) - fMaterial, texDimensions = \ - saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData) - if fMaterial.useLargeTextures: - currentGroupIndex = saveMeshWithLargeTexturesByFaces(material, bFaces, fModel, - fMeshes[drawLayer], obj, drawLayer, convertTextureData, None, triConverterInfo, None, None) - else: - saveMeshByFaces(material, bFaces, fModel, fMeshes[drawLayer], obj, - drawLayer, convertTextureData, None, triConverterInfo, None, None, lastMaterialName) - - fMeshes[drawLayer].draw.commands.extend([ - SPEndDisplayList(), - ]) - - # Must be done after all geometry saved - for (material, specificMat, overrideType) in materialOverrides: - for drawLayer, fMesh in fMeshes.items(): - saveOverrideDraw(obj, fModel, material, specificMat, overrideType, - fMesh, drawLayer, convertTextureData) - for drawLayer, fMesh in fSkinnedMeshes.items(): - saveOverrideDraw(obj, fModel, material, specificMat, overrideType, - fMesh, drawLayer, convertTextureData) - - return fMeshes, fSkinnedMeshes, usedDrawLayers - -def saveOverrideDraw(obj, fModel, material, specificMat, overrideType, fMesh, drawLayer, convertTextureData): - fOverrideMat, texDimensions = \ - saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData) - overrideIndex = str(len(fMesh.drawMatOverrides)) - if (material, specificMat, overrideType) in fMesh.drawMatOverrides: - overrideIndex = fMesh.drawMatOverrides[(material, specificMat, overrideType)].name[-1] - meshMatOverride = GfxList( - fMesh.name + '_mat_override_' + toAlnum(material.name) + \ - '_' + overrideIndex, GfxListTag.Draw, fModel.DLFormat) - #print(fMesh.drawMatOverrides) - #print('fdddddddddddddddd ' + str(fMesh.name) + " " + str(material) + " " + str(specificMat) + " " + str(overrideType)) - fMesh.drawMatOverrides[(material, specificMat, overrideType)] = meshMatOverride - removeReverts = [] - triCommands = [] - for command in fMesh.draw.commands: - meshMatOverride.commands.append(copy.copy(command)) - for command in meshMatOverride.commands: - if isinstance(command, SPDisplayList): - for (modelMaterial, modelDrawLayer, modelAreaIndex), (fMaterial, texDimensions) in \ - fModel.getAllMaterials().items(): - shouldModify = \ - (overrideType == 'Specific' and modelMaterial in specificMat) or \ - (overrideType == 'All' and modelMaterial not in specificMat) - if command.displayList == fMaterial.material and shouldModify: - #print(fOverrideMat.material.name) - command.displayList = fOverrideMat.material - triCommand = meshMatOverride.commands[meshMatOverride.commands.index(command) + 1] - if triCommand not in triCommands: - triCommands.append(triCommand) - - if command.displayList == fMaterial.revert and shouldModify: - removeReverts.append(command) - for command in removeReverts: - meshMatOverride.commands.remove(command) - if fOverrideMat.revert is not None: - for command in triCommands: - meshMatOverride.commands.insert(meshMatOverride.commands.index(command) + 1, - SPDisplayList(fOverrideMat.revert)) - - #else: - # meshMatOverride.commands.append(SPDisplayList(fOverrideMat.material)) - # for triList in fMesh.triangleLists: - # meshMatOverride.commands.append(SPDisplayList(triList)) - # if fOverrideMat.revert is not None: - # meshMatOverride.commands.append(SPDisplayList(fOverrideMat.revert)) - # meshMatOverride.commands.append(SPEndDisplayList()) +def saveModelGivenVertexGroup( + fModel, + obj, + vertexGroup, + parentGroup, + armatureObj, + materialOverrides, + namePrefix, + infoDict, + convertTextureData, + triConverterInfo, + drawLayerField, + drawLayerV3, +): + # checkForF3DMaterial(obj) + + # print("GROUP " + vertexGroup) + + # TODO: Implement lastMaterialName optimization + lastMaterialName = None + + mesh = obj.data + currentGroupIndex = getGroupIndexFromname(obj, vertexGroup) + vertIndices = [ + vert.index + for vert in obj.data.vertices + if getGroupIndex(vert, armatureObj, obj) == currentGroupIndex + ] + parentGroupIndex = ( + getGroupIndexFromname(obj, parentGroup) if parentGroup is not None else -1 + ) + + if len(vertIndices) == 0: + print("No vert indices in " + vertexGroup) + return None, None, None + + transformMatrix = mathutils.Matrix.Scale(bpy.context.scene.blenderToSM64Scale, 4) + if parentGroup is None: + parentMatrix = transformMatrix + else: + parentBone = armatureObj.data.bones[parentGroup] + parentMatrix = transformMatrix @ parentBone.matrix_local.inverted() + + groupFaces = {} # draw layer : {material_index : [faces]} + skinnedFaces = {} # draw layer : {material_index : [skinned faces]} + handledFaces = [] + usedDrawLayers = set() + ancestorGroups = {} # vertexGroup : ancestor list + + for vertIndex in vertIndices: + if vertIndex not in infoDict.vert: + continue + for face in infoDict.vert[vertIndex]: + material = obj.material_slots[face.material_index].material + if material.mat_ver > 3: + drawLayer = int(getattr(material.f3d_mat.draw_layer, drawLayerField)) + else: + drawLayer = drawLayerV3 + + # Ignore repeat faces + if face in handledFaces: + continue + else: + handledFaces.append(face) + + loopsInGroup = [] + loopsNotInGroup = [] + isChildSkinnedFace = False + + # loop is interpreted as face + loop index + for i in range(3): + vertGroupIndex = getGroupIndex( + mesh.vertices[face.vertices[i]], armatureObj, obj + ) + if vertGroupIndex not in ancestorGroups: + ancestorGroups[vertGroupIndex] = getAncestorGroups( + parentGroup, vertexGroup, armatureObj, obj + ) + + if vertGroupIndex == currentGroupIndex: + loopsInGroup.append((face, mesh.loops[face.loops[i]])) + elif vertGroupIndex == parentGroupIndex: + loopsNotInGroup.append((face, mesh.loops[face.loops[i]])) + elif vertGroupIndex not in ancestorGroups[vertGroupIndex]: + # Only want to handle skinned faces connected to parent + isChildSkinnedFace = True + break + else: + highlightWeightErrors(obj, [face], "FACE") + raise VertexWeightError( + "Error with " + + vertexGroup + + ": Verts attached to one bone can not be attached to any of its ancestor or sibling bones besides its first immediate deformable parent bone. For example, a foot vertex can be connected to a leg vertex, but a foot vertex cannot be connected to a thigh vertex." + ) + if isChildSkinnedFace: + usedDrawLayers.add(drawLayer) + continue + + if len(loopsNotInGroup) == 0: + if drawLayer not in groupFaces: + groupFaces[drawLayer] = {} + drawLayerFaces = groupFaces[drawLayer] + if face.material_index not in drawLayerFaces: + drawLayerFaces[face.material_index] = [] + drawLayerFaces[face.material_index].append(face) + else: + if drawLayer not in skinnedFaces: + skinnedFaces[drawLayer] = {} + drawLayerSkinnedFaces = skinnedFaces[drawLayer] + if face.material_index not in drawLayerSkinnedFaces: + drawLayerSkinnedFaces[face.material_index] = [] + drawLayerSkinnedFaces[face.material_index].append( + SimpleSkinnedFace(face, loopsInGroup, loopsNotInGroup) + ) + + if len(groupFaces) == 0 and len(skinnedFaces) == 0: + print("No faces in " + vertexGroup) + return None, None, usedDrawLayers + + # Save skinned mesh + fMeshes = {} + fSkinnedMeshes = {} + for drawLayer, materialFaces in skinnedFaces.items(): + + meshName = getFMeshName(vertexGroup, namePrefix, drawLayer, False) + checkUniqueBoneNames(fModel, meshName, vertexGroup) + skinnedMeshName = getFMeshName(vertexGroup, namePrefix, drawLayer, True) + checkUniqueBoneNames(fModel, skinnedMeshName, vertexGroup) + + fMesh, fSkinnedMesh = saveSkinnedMeshByMaterial( + materialFaces, + fModel, + meshName, + skinnedMeshName, + obj, + parentMatrix, + namePrefix, + vertexGroup, + drawLayer, + convertTextureData, + triConverterInfo, + ) + + fSkinnedMeshes[drawLayer] = fSkinnedMesh + fMeshes[drawLayer] = fMesh + + fModel.meshes[skinnedMeshName] = fSkinnedMeshes[drawLayer] + fModel.meshes[meshName] = fMeshes[drawLayer] + + if drawLayer not in groupFaces: + fMeshes[drawLayer].draw.commands.extend( + [ + SPEndDisplayList(), + ] + ) + + # Save unskinned mesh + for drawLayer, materialFaces in groupFaces.items(): + if drawLayer not in fMeshes: + fMesh = fModel.addMesh(vertexGroup, namePrefix, drawLayer, False, None) + fMeshes[drawLayer] = fMesh + + for material_index, bFaces in materialFaces.items(): + material = obj.material_slots[material_index].material + checkForF3dMaterialInFaces(obj, material) + fMaterial, texDimensions = saveOrGetF3DMaterial( + material, fModel, obj, drawLayer, convertTextureData + ) + if fMaterial.useLargeTextures: + currentGroupIndex = saveMeshWithLargeTexturesByFaces( + material, + bFaces, + fModel, + fMeshes[drawLayer], + obj, + drawLayer, + convertTextureData, + None, + triConverterInfo, + None, + None, + ) + else: + saveMeshByFaces( + material, + bFaces, + fModel, + fMeshes[drawLayer], + obj, + drawLayer, + convertTextureData, + None, + triConverterInfo, + None, + None, + lastMaterialName, + ) + + fMeshes[drawLayer].draw.commands.extend( + [ + SPEndDisplayList(), + ] + ) + + # Must be done after all geometry saved + for (material, specificMat, overrideType) in materialOverrides: + for drawLayer, fMesh in fMeshes.items(): + saveOverrideDraw( + obj, + fModel, + material, + specificMat, + overrideType, + fMesh, + drawLayer, + convertTextureData, + ) + for drawLayer, fMesh in fSkinnedMeshes.items(): + saveOverrideDraw( + obj, + fModel, + material, + specificMat, + overrideType, + fMesh, + drawLayer, + convertTextureData, + ) + + return fMeshes, fSkinnedMeshes, usedDrawLayers + + +def saveOverrideDraw( + obj, + fModel, + material, + specificMat, + overrideType, + fMesh, + drawLayer, + convertTextureData, +): + fOverrideMat, texDimensions = saveOrGetF3DMaterial( + material, fModel, obj, drawLayer, convertTextureData + ) + overrideIndex = str(len(fMesh.drawMatOverrides)) + if (material, specificMat, overrideType) in fMesh.drawMatOverrides: + overrideIndex = fMesh.drawMatOverrides[ + (material, specificMat, overrideType) + ].name[-1] + meshMatOverride = GfxList( + fMesh.name + "_mat_override_" + toAlnum(material.name) + "_" + overrideIndex, + GfxListTag.Draw, + fModel.DLFormat, + ) + # print(fMesh.drawMatOverrides) + # print('fdddddddddddddddd ' + str(fMesh.name) + " " + str(material) + " " + str(specificMat) + " " + str(overrideType)) + fMesh.drawMatOverrides[(material, specificMat, overrideType)] = meshMatOverride + removeReverts = [] + triCommands = [] + for command in fMesh.draw.commands: + meshMatOverride.commands.append(copy.copy(command)) + for command in meshMatOverride.commands: + if isinstance(command, SPDisplayList): + for (modelMaterial, modelDrawLayer, modelAreaIndex), ( + fMaterial, + texDimensions, + ) in fModel.getAllMaterials().items(): + shouldModify = ( + overrideType == "Specific" and modelMaterial in specificMat + ) or (overrideType == "All" and modelMaterial not in specificMat) + if command.displayList == fMaterial.material and shouldModify: + # print(fOverrideMat.material.name) + command.displayList = fOverrideMat.material + triCommand = meshMatOverride.commands[ + meshMatOverride.commands.index(command) + 1 + ] + if triCommand not in triCommands: + triCommands.append(triCommand) + + if command.displayList == fMaterial.revert and shouldModify: + removeReverts.append(command) + for command in removeReverts: + meshMatOverride.commands.remove(command) + if fOverrideMat.revert is not None: + for command in triCommands: + meshMatOverride.commands.insert( + meshMatOverride.commands.index(command) + 1, + SPDisplayList(fOverrideMat.revert), + ) + + # else: + # meshMatOverride.commands.append(SPDisplayList(fOverrideMat.material)) + # for triList in fMesh.triangleLists: + # meshMatOverride.commands.append(SPDisplayList(triList)) + # if fOverrideMat.revert is not None: + # meshMatOverride.commands.append(SPDisplayList(fOverrideMat.revert)) + # meshMatOverride.commands.append(SPEndDisplayList()) + def findVertIndexInBuffer(loop, buffer, loopDict): - i = 0 - for material_index, vertData in buffer: - for f3dVert in vertData: - if f3dVert == loopDict[loop]: - return i - i += 1 - #print("Can't find " + str(loop)) - return -1 + i = 0 + for material_index, vertData in buffer: + for f3dVert in vertData: + if f3dVert == loopDict[loop]: + return i + i += 1 + # print("Can't find " + str(loop)) + return -1 + def convertVertDictToArray(vertDict): - data = [] - matRegions = {} - for material_index, vertData in vertDict: - start = len(data) - data.extend(vertData) - end = len(data) - matRegions[material_index] = (start, end) - return data, matRegions + data = [] + matRegions = {} + for material_index, vertData in vertDict: + start = len(data) + data.extend(vertData) + end = len(data) + matRegions[material_index] = (start, end) + return data, matRegions + # This collapses similar loops together IF they are in the same material. -def splitSkinnedFacesIntoTwoGroups(skinnedFaces, fModel, obj, uv_data, drawLayer, convertTextureData): - inGroupVertArray = [] - notInGroupVertArray = [] - - # For selecting on error - notInGroupBlenderVerts = [] - loopDict = {} - for material_index, skinnedFaceArray in skinnedFaces.items(): - # These MUST be arrays (not dicts) as order is important - inGroupVerts = [] - inGroupVertArray.append([material_index, inGroupVerts]) - - notInGroupVerts = [] - notInGroupVertArray.append([material_index, notInGroupVerts]) - - material = obj.material_slots[material_index].material - fMaterial, texDimensions = \ - saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData) - - exportVertexColors = isLightingDisabled(material) - convertInfo = LoopConvertInfo(uv_data, obj, exportVertexColors) - for skinnedFace in skinnedFaceArray: - for (face, loop) in skinnedFace.loopsInGroup: - f3dVert = getF3DVert(loop, face, convertInfo, obj.data) - bufferVert = BufferVertex(f3dVert, None, material_index) - if bufferVert not in inGroupVerts: - inGroupVerts.append(bufferVert) - loopDict[loop] = f3dVert - for (face, loop) in skinnedFace.loopsNotInGroup: - vert = obj.data.vertices[loop.vertex_index] - if vert not in notInGroupBlenderVerts: - notInGroupBlenderVerts.append(vert) - f3dVert = getF3DVert(loop, face, convertInfo, obj.data) - bufferVert = BufferVertex(f3dVert, None, material_index) - if bufferVert not in notInGroupVerts: - notInGroupVerts.append(bufferVert) - loopDict[loop] = f3dVert - - return inGroupVertArray, notInGroupVertArray, loopDict, notInGroupBlenderVerts +def splitSkinnedFacesIntoTwoGroups( + skinnedFaces, fModel, obj, uv_data, drawLayer, convertTextureData +): + inGroupVertArray = [] + notInGroupVertArray = [] + + # For selecting on error + notInGroupBlenderVerts = [] + loopDict = {} + for material_index, skinnedFaceArray in skinnedFaces.items(): + # These MUST be arrays (not dicts) as order is important + inGroupVerts = [] + inGroupVertArray.append([material_index, inGroupVerts]) + + notInGroupVerts = [] + notInGroupVertArray.append([material_index, notInGroupVerts]) + + material = obj.material_slots[material_index].material + fMaterial, texDimensions = saveOrGetF3DMaterial( + material, fModel, obj, drawLayer, convertTextureData + ) + + exportVertexColors = isLightingDisabled(material) + convertInfo = LoopConvertInfo(uv_data, obj, exportVertexColors) + for skinnedFace in skinnedFaceArray: + for (face, loop) in skinnedFace.loopsInGroup: + f3dVert = getF3DVert(loop, face, convertInfo, obj.data) + bufferVert = BufferVertex(f3dVert, None, material_index) + if bufferVert not in inGroupVerts: + inGroupVerts.append(bufferVert) + loopDict[loop] = f3dVert + for (face, loop) in skinnedFace.loopsNotInGroup: + vert = obj.data.vertices[loop.vertex_index] + if vert not in notInGroupBlenderVerts: + notInGroupBlenderVerts.append(vert) + f3dVert = getF3DVert(loop, face, convertInfo, obj.data) + bufferVert = BufferVertex(f3dVert, None, material_index) + if bufferVert not in notInGroupVerts: + notInGroupVerts.append(bufferVert) + loopDict[loop] = f3dVert + + return inGroupVertArray, notInGroupVertArray, loopDict, notInGroupBlenderVerts + def getGroupVertCount(group): - count = 0 - for material_index, vertData in group: - count += len(vertData) - return count - -def saveSkinnedMeshByMaterial(skinnedFaces, fModel, meshName, skinnedMeshName, obj, - parentMatrix, namePrefix, vertexGroup, drawLayer, convertTextureData, triConverterInfo): - # We choose one or more loops per vert to represent a material from which - # texDimensions can be found, since it is required for UVs. - uv_data = obj.data.uv_layers['UVMap'].data - inGroupVertArray, notInGroupVertArray, loopDict, notInGroupBlenderVerts = \ - splitSkinnedFacesIntoTwoGroups(skinnedFaces, fModel, obj, uv_data, drawLayer, convertTextureData) - - notInGroupCount = getGroupVertCount(notInGroupVertArray) - if notInGroupCount > fModel.f3d.vert_load_size - 2: - highlightWeightErrors(obj, notInGroupBlenderVerts, 'VERT') - raise VertexWeightError("Too many connecting vertices in skinned " +\ - "triangles for bone '" + vertexGroup + "'. Max is " + str(fModel.f3d.vert_load_size - 2) + \ - " on parent bone, currently at " + str(notInGroupCount) +\ - ". Note that a vertex with different UVs/normals/materials in " +\ - "connected faces will count more than once. Try " +\ - "keeping UVs contiguous, and avoid using " +\ - "split normals.") - - # TODO: Implement lastMaterialName optimization - lastMaterialName = None - - # Load parent group vertices - fSkinnedMesh = FMesh(skinnedMeshName, fModel.DLFormat) - - # Load verts into buffer by material. - # It seems like material setup must be done BEFORE triangles are drawn. - # Because of this we cannot share verts between materials (?) - curIndex = 0 - for material_index, vertData in notInGroupVertArray: - material = obj.material_slots[material_index].material - checkForF3dMaterialInFaces(obj, material) - f3dMat = material.f3d_mat if material.mat_ver > 3 else material - if f3dMat.rdp_settings.set_rendermode: - drawLayerKey = drawLayer - else: - drawLayerKey = None - - materialKey = (material, drawLayerKey, fModel.global_data.getCurrentAreaKey(material)) - fMaterial, texDimensions = fModel.getMaterialAndHandleShared(materialKey) - isPointSampled = isTexturePointSampled(material) - exportVertexColors = isLightingDisabled(material) - - skinnedTriGroup = fSkinnedMesh.tri_group_new(fMaterial) - fSkinnedMesh.draw.commands.append(SPDisplayList(fMaterial.material)) - fSkinnedMesh.draw.commands.append(SPDisplayList(skinnedTriGroup.triList)) - skinnedTriGroup.triList.commands.append( - SPVertex(skinnedTriGroup.vertexList, - len(skinnedTriGroup.vertexList.vertices), - len(vertData), curIndex)) - curIndex += len(vertData) - - for bufferVert in vertData: - skinnedTriGroup.vertexList.vertices.append(convertVertexData(obj.data, - bufferVert.f3dVert[0], bufferVert.f3dVert[1], bufferVert.f3dVert[2], texDimensions, - parentMatrix, isPointSampled, exportVertexColors)) - - skinnedTriGroup.triList.commands.append(SPEndDisplayList()) - if fMaterial.revert is not None: - fSkinnedMesh.draw.commands.append(SPDisplayList(fMaterial.revert)) - - # End skinned mesh vertices. - fSkinnedMesh.draw.commands.append(SPEndDisplayList()) - - fMesh = FMesh(meshName, fModel.DLFormat) - - # Load current group vertices, then draw commands by material - existingVertData, matRegionDict = \ - convertVertDictToArray(notInGroupVertArray) - - for material_index, skinnedFaceArray in skinnedFaces.items(): - material = obj.material_slots[material_index].material - faces = [skinnedFace.bFace for skinnedFace in skinnedFaceArray] - fMaterial, texDimensions = \ - saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData) - if fMaterial.useLargeTextures: - saveMeshWithLargeTexturesByFaces(material, faces, fModel, fMesh, obj, - drawLayer, convertTextureData, None, triConverterInfo, - copy.deepcopy(existingVertData), copy.deepcopy(matRegionDict)) - else: - saveMeshByFaces(material, faces, - fModel, fMesh, obj, drawLayer, - convertTextureData, None, triConverterInfo, - copy.deepcopy(existingVertData), copy.deepcopy(matRegionDict), - lastMaterialName) - - return fMesh, fSkinnedMesh - #for material_index, skinnedFaceArray in skinnedFaces.items(): -# - # # We've already saved all materials, this just returns the existing ones. - # material = obj.material_slots[material_index].material - # fMaterial, texDimensions = \ - # saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData) - # isPointSampled = isTexturePointSampled(material) - # exportVertexColors = isLightingDisabled(material) -# - # triGroup = fMesh.tri_group_new(fMaterial) - # fMesh.draw.commands.append(SPDisplayList(fMaterial.material)) - # fMesh.draw.commands.append(SPDisplayList(triGroup.triList)) - # if fMaterial.revert is not None: - # fMesh.draw.commands.append(SPDisplayList(fMaterial.revert)) -# - # convertInfo = LoopConvertInfo(uv_data, obj, exportVertexColors) - # triConverter = TriangleConverter(triConverterInfo, texDimensions, material, - # None, triGroup.triList, triGroup.vertexList, copy.deepcopy(existingVertData), copy.deepcopy(matRegionDict)) - # saveTriangleStrip(triConverter, [skinnedFace.bFace for skinnedFace in skinnedFaceArray], obj.data, True) - # saveTriangleStrip(triConverterClass, - # [skinnedFace.bFace for skinnedFace in skinnedFaceArray], - # convertInfo, triGroup.triList, triGroup.vertexList, fModel.f3d, - # texDimensions, currentMatrix, isPointSampled, exportVertexColors, - # copy.deepcopy(existingVertData), copy.deepcopy(matRegionDict), - # infoDict, obj.data, None, True) - - return fMesh, fSkinnedMesh + count = 0 + for material_index, vertData in group: + count += len(vertData) + return count + + +def saveSkinnedMeshByMaterial( + skinnedFaces, + fModel, + meshName, + skinnedMeshName, + obj, + parentMatrix, + namePrefix, + vertexGroup, + drawLayer, + convertTextureData, + triConverterInfo, +): + # We choose one or more loops per vert to represent a material from which + # texDimensions can be found, since it is required for UVs. + uv_data = obj.data.uv_layers["UVMap"].data + ( + inGroupVertArray, + notInGroupVertArray, + loopDict, + notInGroupBlenderVerts, + ) = splitSkinnedFacesIntoTwoGroups( + skinnedFaces, fModel, obj, uv_data, drawLayer, convertTextureData + ) + + notInGroupCount = getGroupVertCount(notInGroupVertArray) + if notInGroupCount > fModel.f3d.vert_load_size - 2: + highlightWeightErrors(obj, notInGroupBlenderVerts, "VERT") + raise VertexWeightError( + "Too many connecting vertices in skinned " + + "triangles for bone '" + + vertexGroup + + "'. Max is " + + str(fModel.f3d.vert_load_size - 2) + + " on parent bone, currently at " + + str(notInGroupCount) + + ". Note that a vertex with different UVs/normals/materials in " + + "connected faces will count more than once. Try " + + "keeping UVs contiguous, and avoid using " + + "split normals." + ) + + # TODO: Implement lastMaterialName optimization + lastMaterialName = None + + # Load parent group vertices + fSkinnedMesh = FMesh(skinnedMeshName, fModel.DLFormat) + + # Load verts into buffer by material. + # It seems like material setup must be done BEFORE triangles are drawn. + # Because of this we cannot share verts between materials (?) + curIndex = 0 + for material_index, vertData in notInGroupVertArray: + material = obj.material_slots[material_index].material + checkForF3dMaterialInFaces(obj, material) + f3dMat = material.f3d_mat if material.mat_ver > 3 else material + if f3dMat.rdp_settings.set_rendermode: + drawLayerKey = drawLayer + else: + drawLayerKey = None + + materialKey = ( + material, + drawLayerKey, + fModel.global_data.getCurrentAreaKey(material), + ) + fMaterial, texDimensions = fModel.getMaterialAndHandleShared(materialKey) + isPointSampled = isTexturePointSampled(material) + exportVertexColors = isLightingDisabled(material) + + skinnedTriGroup = fSkinnedMesh.tri_group_new(fMaterial) + fSkinnedMesh.draw.commands.append(SPDisplayList(fMaterial.material)) + fSkinnedMesh.draw.commands.append(SPDisplayList(skinnedTriGroup.triList)) + skinnedTriGroup.triList.commands.append( + SPVertex( + skinnedTriGroup.vertexList, + len(skinnedTriGroup.vertexList.vertices), + len(vertData), + curIndex, + ) + ) + curIndex += len(vertData) + + for bufferVert in vertData: + skinnedTriGroup.vertexList.vertices.append( + convertVertexData( + obj.data, + bufferVert.f3dVert[0], + bufferVert.f3dVert[1], + bufferVert.f3dVert[2], + texDimensions, + parentMatrix, + isPointSampled, + exportVertexColors, + ) + ) + + skinnedTriGroup.triList.commands.append(SPEndDisplayList()) + if fMaterial.revert is not None: + fSkinnedMesh.draw.commands.append(SPDisplayList(fMaterial.revert)) + + # End skinned mesh vertices. + fSkinnedMesh.draw.commands.append(SPEndDisplayList()) + + fMesh = FMesh(meshName, fModel.DLFormat) + + # Load current group vertices, then draw commands by material + existingVertData, matRegionDict = convertVertDictToArray(notInGroupVertArray) + + for material_index, skinnedFaceArray in skinnedFaces.items(): + material = obj.material_slots[material_index].material + faces = [skinnedFace.bFace for skinnedFace in skinnedFaceArray] + fMaterial, texDimensions = saveOrGetF3DMaterial( + material, fModel, obj, drawLayer, convertTextureData + ) + if fMaterial.useLargeTextures: + saveMeshWithLargeTexturesByFaces( + material, + faces, + fModel, + fMesh, + obj, + drawLayer, + convertTextureData, + None, + triConverterInfo, + copy.deepcopy(existingVertData), + copy.deepcopy(matRegionDict), + ) + else: + saveMeshByFaces( + material, + faces, + fModel, + fMesh, + obj, + drawLayer, + convertTextureData, + None, + triConverterInfo, + copy.deepcopy(existingVertData), + copy.deepcopy(matRegionDict), + lastMaterialName, + ) + + return fMesh, fSkinnedMesh + # for material_index, skinnedFaceArray in skinnedFaces.items(): + # + # # We've already saved all materials, this just returns the existing ones. + # material = obj.material_slots[material_index].material + # fMaterial, texDimensions = \ + # saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData) + # isPointSampled = isTexturePointSampled(material) + # exportVertexColors = isLightingDisabled(material) + # + # triGroup = fMesh.tri_group_new(fMaterial) + # fMesh.draw.commands.append(SPDisplayList(fMaterial.material)) + # fMesh.draw.commands.append(SPDisplayList(triGroup.triList)) + # if fMaterial.revert is not None: + # fMesh.draw.commands.append(SPDisplayList(fMaterial.revert)) + # + # convertInfo = LoopConvertInfo(uv_data, obj, exportVertexColors) + # triConverter = TriangleConverter(triConverterInfo, texDimensions, material, + # None, triGroup.triList, triGroup.vertexList, copy.deepcopy(existingVertData), copy.deepcopy(matRegionDict)) + # saveTriangleStrip(triConverter, [skinnedFace.bFace for skinnedFace in skinnedFaceArray], obj.data, True) + # saveTriangleStrip(triConverterClass, + # [skinnedFace.bFace for skinnedFace in skinnedFaceArray], + # convertInfo, triGroup.triList, triGroup.vertexList, fModel.f3d, + # texDimensions, currentMatrix, isPointSampled, exportVertexColors, + # copy.deepcopy(existingVertData), copy.deepcopy(matRegionDict), + # infoDict, obj.data, None, True) + + return fMesh, fSkinnedMesh + def writeDynamicMeshFunction(name, displayList): - data = \ -"""Gfx *{}(s32 callContext, struct GraphNode *node, UNUSED Mat4 *c) { + data = """Gfx *{}(s32 callContext, struct GraphNode *node, UNUSED Mat4 *c) { struct GraphNodeGenerated *asmNode = (struct GraphNodeGenerated *) node; Gfx *displayListStart = NULL; if (callContext == GEO_CONTEXT_RENDER) { @@ -2070,380 +3091,504 @@ def writeDynamicMeshFunction(name, displayList): {} } return displayListStart; -}""".format(name, str(len(displayList.commands)), displayList.to_c(False)) +}""".format( + name, str(len(displayList.commands)), displayList.to_c(False) + ) + + return data - return data class SM64_ExportGeolayoutObject(ObjectDataExporter): - # set bl_ properties - bl_idname = 'object.sm64_export_geolayout_object' - bl_label = "Export Object Geolayout" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - romfileOutput = None - tempROM = None - try: - obj = None - if context.mode != 'OBJECT': - raise PluginError("Operator can only be used in object mode.") - if len(context.selected_objects) == 0: - raise PluginError("Object not selected.") - obj = context.active_object - if type(obj.data) is not bpy.types.Mesh and \ - not (obj.data is None and (obj.sm64_obj_type == 'None' or obj.sm64_obj_type == 'Switch')): - raise PluginError("Selected object must be a mesh or an empty with the \"None\" or \"Switch\" type.") - #if context.scene.saveCameraSettings and \ - # context.scene.levelCamera is None: - # raise PluginError("Cannot save camera settings with no camera provided.") - #levelCamera = context.scene.levelCamera if \ - # context.scene.saveCameraSettings else None - - finalTransform = mathutils.Matrix.Identity(4) - scaleValue = bpy.context.scene.blenderToSM64Scale - finalTransform = mathutils.Matrix.Diagonal(mathutils.Vector(( - scaleValue, scaleValue, scaleValue))).to_4x4() - except Exception as e: - raisePluginError(self, e) - return {'CANCELLED'} - - try: - self.store_object_data() - - # Rotate all armatures 90 degrees - applyRotation([obj], math.radians(90), 'X') - - saveTextures = bpy.context.scene.saveTextures or bpy.context.scene.ignoreTextureRestrictions - - if context.scene.fast64.sm64.exportType == 'C': - exportPath, levelName = getPathAndLevel(context.scene.geoCustomExport, - context.scene.geoExportPath, context.scene.geoLevelName, - context.scene.geoLevelOption) - if not context.scene.geoCustomExport: - applyBasicTweaks(exportPath) - exportGeolayoutObjectC(obj, finalTransform, - context.scene.f3d_type, context.scene.isHWv1, - exportPath, - bpy.context.scene.geoTexDir, - saveTextures, - saveTextures and bpy.context.scene.geoSeparateTextureDef, - None, bpy.context.scene.geoGroupName, - context.scene.geoExportHeaderType, - context.scene.geoName, context.scene.geoStructName, levelName, context.scene.geoCustomExport, DLFormat.Static) - self.report({'INFO'}, 'Success!') - elif context.scene.fast64.sm64.exportType == 'Insertable Binary': - exportGeolayoutObjectInsertableBinary(obj, - finalTransform, context.scene.f3d_type, - context.scene.isHWv1, - bpy.path.abspath(bpy.context.scene.geoInsertableBinaryPath), - None) - self.report({'INFO'}, 'Success! Data at ' + \ - context.scene.geoInsertableBinaryPath) - else: - tempROM = tempName(context.scene.outputRom) - checkExpanded(bpy.path.abspath(context.scene.exportRom)) - romfileExport = open( - bpy.path.abspath(context.scene.exportRom), 'rb') - shutil.copy(bpy.path.abspath(context.scene.exportRom), - bpy.path.abspath(tempROM)) - romfileExport.close() - romfileOutput = open(bpy.path.abspath(tempROM), 'rb+') - - levelParsed = parseLevelAtPointer(romfileOutput, - level_pointers[context.scene.levelGeoExport]) - segmentData = levelParsed.segmentData - - if context.scene.extendBank4: - ExtendBank0x04(romfileOutput, segmentData, - defaultExtendSegment4) - - exportRange = [int(context.scene.geoExportStart, 16), - int(context.scene.geoExportEnd, 16)] - textDumpFilePath = \ - bpy.path.abspath(context.scene.textDumpGeoPath) \ - if context.scene.textDumpGeo else None - if context.scene.overwriteModelLoad: - modelLoadInfo = \ - (int(context.scene.modelLoadLevelScriptCmd, 16), - int(context.scene.modelID,16)) - else: - modelLoadInfo = (None, None) - - if context.scene.geoUseBank0: - addrRange, startRAM, geoStart = \ - exportGeolayoutObjectBinaryBank0( - romfileOutput, obj, exportRange, - finalTransform, *modelLoadInfo, textDumpFilePath, - context.scene.f3d_type, context.scene.isHWv1, - getAddressFromRAMAddress(int( - context.scene.geoRAMAddr, 16)), - None) - else: - addrRange, segPointer = exportGeolayoutObjectBinary( - romfileOutput, obj, - exportRange, finalTransform, segmentData, - *modelLoadInfo, textDumpFilePath, - context.scene.f3d_type, context.scene.isHWv1, - None) - - romfileOutput.close() - bpy.ops.object.select_all(action = 'DESELECT') - obj.select_set(True) - context.view_layer.objects.active = obj - - if os.path.exists(bpy.path.abspath(context.scene.outputRom)): - os.remove(bpy.path.abspath(context.scene.outputRom)) - os.rename(bpy.path.abspath(tempROM), - bpy.path.abspath(context.scene.outputRom)) - - if context.scene.geoUseBank0: - self.report({'INFO'}, 'Success! Geolayout at (' + \ - hex(addrRange[0]) + ', ' + hex(addrRange[1]) + \ - '), to write to RAM Address ' + hex(startRAM) + \ - ', with geolayout starting at ' + hex(geoStart)) - else: - self.report({'INFO'}, 'Success! Geolayout at (' + \ - hex(addrRange[0]) + ', ' + hex(addrRange[1]) + \ - ') (Seg. ' + segPointer + ').') - - self.cleanup_temp_object_data() - applyRotation([obj], math.radians(-90), 'X') - self.show_warnings() - return {'FINISHED'} # must return a set - - except Exception as e: - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - - self.cleanup_temp_object_data() - applyRotation([obj], math.radians(-90), 'X') - - if context.scene.fast64.sm64.exportType == 'Binary': - if romfileOutput is not None: - romfileOutput.close() - if tempROM is not None and os.path.exists(bpy.path.abspath(tempROM)): - os.remove(bpy.path.abspath(tempROM)) - raisePluginError(self, e) - return {'CANCELLED'} # must return a set + # set bl_ properties + bl_idname = "object.sm64_export_geolayout_object" + bl_label = "Export Object Geolayout" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + romfileOutput = None + tempROM = None + try: + obj = None + if context.mode != "OBJECT": + raise PluginError("Operator can only be used in object mode.") + if len(context.selected_objects) == 0: + raise PluginError("Object not selected.") + obj = context.active_object + if type(obj.data) is not bpy.types.Mesh and not ( + obj.data is None + and (obj.sm64_obj_type == "None" or obj.sm64_obj_type == "Switch") + ): + raise PluginError( + 'Selected object must be a mesh or an empty with the "None" or "Switch" type.' + ) + # if context.scene.saveCameraSettings and \ + # context.scene.levelCamera is None: + # raise PluginError("Cannot save camera settings with no camera provided.") + # levelCamera = context.scene.levelCamera if \ + # context.scene.saveCameraSettings else None + + finalTransform = mathutils.Matrix.Identity(4) + scaleValue = bpy.context.scene.blenderToSM64Scale + finalTransform = mathutils.Matrix.Diagonal( + mathutils.Vector((scaleValue, scaleValue, scaleValue)) + ).to_4x4() + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} + + try: + self.store_object_data() + + # Rotate all armatures 90 degrees + applyRotation([obj], math.radians(90), "X") + + saveTextures = ( + bpy.context.scene.saveTextures + or bpy.context.scene.ignoreTextureRestrictions + ) + + if context.scene.fast64.sm64.exportType == "C": + exportPath, levelName = getPathAndLevel( + context.scene.geoCustomExport, + context.scene.geoExportPath, + context.scene.geoLevelName, + context.scene.geoLevelOption, + ) + if not context.scene.geoCustomExport: + applyBasicTweaks(exportPath) + exportGeolayoutObjectC( + obj, + finalTransform, + context.scene.f3d_type, + context.scene.isHWv1, + exportPath, + bpy.context.scene.geoTexDir, + saveTextures, + saveTextures and bpy.context.scene.geoSeparateTextureDef, + None, + bpy.context.scene.geoGroupName, + context.scene.geoExportHeaderType, + context.scene.geoName, + context.scene.geoStructName, + levelName, + context.scene.geoCustomExport, + DLFormat.Static, + ) + self.report({"INFO"}, "Success!") + elif context.scene.fast64.sm64.exportType == "Insertable Binary": + exportGeolayoutObjectInsertableBinary( + obj, + finalTransform, + context.scene.f3d_type, + context.scene.isHWv1, + bpy.path.abspath(bpy.context.scene.geoInsertableBinaryPath), + None, + ) + self.report( + {"INFO"}, + "Success! Data at " + context.scene.geoInsertableBinaryPath, + ) + else: + tempROM = tempName(context.scene.outputRom) + checkExpanded(bpy.path.abspath(context.scene.exportRom)) + romfileExport = open(bpy.path.abspath(context.scene.exportRom), "rb") + shutil.copy( + bpy.path.abspath(context.scene.exportRom), bpy.path.abspath(tempROM) + ) + romfileExport.close() + romfileOutput = open(bpy.path.abspath(tempROM), "rb+") + + levelParsed = parseLevelAtPointer( + romfileOutput, level_pointers[context.scene.levelGeoExport] + ) + segmentData = levelParsed.segmentData + + if context.scene.extendBank4: + ExtendBank0x04(romfileOutput, segmentData, defaultExtendSegment4) + + exportRange = [ + int(context.scene.geoExportStart, 16), + int(context.scene.geoExportEnd, 16), + ] + textDumpFilePath = ( + bpy.path.abspath(context.scene.textDumpGeoPath) + if context.scene.textDumpGeo + else None + ) + if context.scene.overwriteModelLoad: + modelLoadInfo = ( + int(context.scene.modelLoadLevelScriptCmd, 16), + int(context.scene.modelID, 16), + ) + else: + modelLoadInfo = (None, None) + + if context.scene.geoUseBank0: + addrRange, startRAM, geoStart = exportGeolayoutObjectBinaryBank0( + romfileOutput, + obj, + exportRange, + finalTransform, + *modelLoadInfo, + textDumpFilePath, + context.scene.f3d_type, + context.scene.isHWv1, + getAddressFromRAMAddress(int(context.scene.geoRAMAddr, 16)), + None, + ) + else: + addrRange, segPointer = exportGeolayoutObjectBinary( + romfileOutput, + obj, + exportRange, + finalTransform, + segmentData, + *modelLoadInfo, + textDumpFilePath, + context.scene.f3d_type, + context.scene.isHWv1, + None, + ) + + romfileOutput.close() + bpy.ops.object.select_all(action="DESELECT") + obj.select_set(True) + context.view_layer.objects.active = obj + + if os.path.exists(bpy.path.abspath(context.scene.outputRom)): + os.remove(bpy.path.abspath(context.scene.outputRom)) + os.rename( + bpy.path.abspath(tempROM), bpy.path.abspath(context.scene.outputRom) + ) + + if context.scene.geoUseBank0: + self.report( + {"INFO"}, + "Success! Geolayout at (" + + hex(addrRange[0]) + + ", " + + hex(addrRange[1]) + + "), to write to RAM Address " + + hex(startRAM) + + ", with geolayout starting at " + + hex(geoStart), + ) + else: + self.report( + {"INFO"}, + "Success! Geolayout at (" + + hex(addrRange[0]) + + ", " + + hex(addrRange[1]) + + ") (Seg. " + + segPointer + + ").", + ) + + self.cleanup_temp_object_data() + applyRotation([obj], math.radians(-90), "X") + self.show_warnings() + return {"FINISHED"} # must return a set + + except Exception as e: + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + + self.cleanup_temp_object_data() + applyRotation([obj], math.radians(-90), "X") + + if context.scene.fast64.sm64.exportType == "Binary": + if romfileOutput is not None: + romfileOutput.close() + if tempROM is not None and os.path.exists(bpy.path.abspath(tempROM)): + os.remove(bpy.path.abspath(tempROM)) + raisePluginError(self, e) + return {"CANCELLED"} # must return a set + class SM64_ExportGeolayoutArmature(bpy.types.Operator): - # set bl_ properties - bl_idname = 'object.sm64_export_geolayout_armature' - bl_label = "Export Armature Geolayout" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - # Called on demand (i.e. button press, menu item) - # Can also be called from operator search menu (Spacebar) - def execute(self, context): - romfileOutput = None - tempROM = None - try: - armatureObj = None - if context.mode != 'OBJECT': - raise PluginError("Operator can only be used in object mode.") - if len(context.selected_objects) == 0: - raise PluginError("Armature not selected.") - armatureObj = context.active_object - if type(armatureObj.data) is not bpy.types.Armature: - raise PluginError("Armature not selected.") - - if len(armatureObj.children) == 0 or \ - not isinstance(armatureObj.children[0].data, bpy.types.Mesh): - raise PluginError("Armature does not have any mesh children, or " +\ - 'has a non-mesh child.') - #if context.scene.saveCameraSettings and \ - # context.scene.levelCamera is None: - # raise PluginError("Cannot save camera settings with no camera provided.") - #levelCamera = context.scene.levelCamera if \ - # context.scene.saveCameraSettings else None - - obj = armatureObj.children[0] - finalTransform = mathutils.Matrix.Identity(4) - - # get all switch option armatures as well - linkedArmatures = [armatureObj] - getAllArmatures(armatureObj, linkedArmatures) - - linkedArmatureDict = {} - - for linkedArmature in linkedArmatures: - # IMPORTANT: Do this BEFORE rotation - optionObjs = [] - for childObj in linkedArmature.children: - if isinstance(childObj.data, bpy.types.Mesh): - optionObjs.append(childObj) - if len(optionObjs) > 1: - raise PluginError('Error: ' + linkedArmature.name +\ - ' has more than one mesh child.') - elif len(optionObjs) < 1: - raise PluginError('Error: ' + linkedArmature.name +\ - ' has no mesh children.') - linkedMesh = optionObjs[0] - prepareGeolayoutExport(linkedArmature, linkedMesh) - linkedArmatureDict[linkedArmature] = linkedMesh - except Exception as e: - raisePluginError(self, e) - return {'CANCELLED'} - - try: - # Rotate all armatures 90 degrees - applyRotation([armatureObj] + linkedArmatures, - math.radians(90), 'X') - - # You must ALSO apply object rotation after armature rotation. - bpy.ops.object.select_all(action = "DESELECT") - for linkedArmature, linkedMesh in linkedArmatureDict.items(): - linkedMesh.select_set(True) - obj.select_set(True) - bpy.context.view_layer.objects.active = obj - bpy.ops.object.transform_apply(location = False, rotation = True, - scale = True, properties = False) - if context.scene.fast64.sm64.exportType == 'C': - exportPath, levelName = getPathAndLevel(context.scene.geoCustomExport, - context.scene.geoExportPath, context.scene.geoLevelName, - context.scene.geoLevelOption) - - saveTextures = bpy.context.scene.saveTextures or bpy.context.scene.ignoreTextureRestrictions - if not context.scene.geoCustomExport: - applyBasicTweaks(exportPath) - header, fileStatus = exportGeolayoutArmatureC(armatureObj, obj, finalTransform, - context.scene.f3d_type, context.scene.isHWv1, - exportPath, - bpy.context.scene.geoTexDir, - saveTextures, - saveTextures and bpy.context.scene.geoSeparateTextureDef, - None, bpy.context.scene.geoGroupName, context.scene.geoExportHeaderType, - context.scene.geoName, context.scene.geoStructName, levelName, context.scene.geoCustomExport, DLFormat.Static) - starSelectWarning(self, fileStatus) - self.report({'INFO'}, 'Success!') - elif context.scene.fast64.sm64.exportType == 'Insertable Binary': - exportGeolayoutArmatureInsertableBinary(armatureObj, obj, - finalTransform, context.scene.f3d_type, - context.scene.isHWv1, - bpy.path.abspath(bpy.context.scene.geoInsertableBinaryPath), - None) - self.report({'INFO'}, 'Success! Data at ' + \ - context.scene.geoInsertableBinaryPath) - else: - tempROM = tempName(context.scene.outputRom) - checkExpanded(bpy.path.abspath(context.scene.exportRom)) - romfileExport = open( - bpy.path.abspath(context.scene.exportRom), 'rb') - shutil.copy(bpy.path.abspath(context.scene.exportRom), - bpy.path.abspath(tempROM)) - romfileExport.close() - romfileOutput = open(bpy.path.abspath(tempROM), 'rb+') - - levelParsed = parseLevelAtPointer(romfileOutput, - level_pointers[context.scene.levelGeoExport]) - segmentData = levelParsed.segmentData - - if context.scene.extendBank4: - ExtendBank0x04(romfileOutput, segmentData, - defaultExtendSegment4) - - exportRange = [int(context.scene.geoExportStart, 16), - int(context.scene.geoExportEnd, 16)] - textDumpFilePath = \ - bpy.path.abspath(context.scene.textDumpGeoPath) \ - if context.scene.textDumpGeo else None - if context.scene.overwriteModelLoad: - modelLoadInfo = \ - (int(context.scene.modelLoadLevelScriptCmd, 16), - int(context.scene.modelID, 16)) - else: - modelLoadInfo = (None, None) - - if context.scene.geoUseBank0: - addrRange, startRAM, geoStart = \ - exportGeolayoutArmatureBinaryBank0( - romfileOutput, armatureObj, obj, exportRange, - finalTransform, *modelLoadInfo, textDumpFilePath, - context.scene.f3d_type, context.scene.isHWv1, - getAddressFromRAMAddress(int( - context.scene.geoRAMAddr, 16)), None) - else: - addrRange, segPointer = exportGeolayoutArmatureBinary( - romfileOutput, armatureObj, obj, - exportRange, finalTransform, segmentData, - *modelLoadInfo, textDumpFilePath, - context.scene.f3d_type, context.scene.isHWv1, - None) - - romfileOutput.close() - bpy.ops.object.select_all(action = 'DESELECT') - armatureObj.select_set(True) - context.view_layer.objects.active = armatureObj - - if os.path.exists(bpy.path.abspath(context.scene.outputRom)): - os.remove(bpy.path.abspath(context.scene.outputRom)) - os.rename(bpy.path.abspath(tempROM), - bpy.path.abspath(context.scene.outputRom)) - - if context.scene.geoUseBank0: - self.report({'INFO'}, 'Success! Geolayout at (' + \ - hex(addrRange[0]) + ', ' + hex(addrRange[1]) + \ - '), to write to RAM Address ' + hex(startRAM) + \ - ', with geolayout starting at ' + hex(geoStart)) - else: - self.report({'INFO'}, 'Success! Geolayout at (' + \ - hex(addrRange[0]) + ', ' + hex(addrRange[1]) + \ - ') (Seg. ' + segPointer + ').') - - applyRotation([armatureObj] + linkedArmatures, - math.radians(-90), 'X') - - return {'FINISHED'} # must return a set - - except Exception as e: - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - - applyRotation([armatureObj] + linkedArmatures, - math.radians(-90), 'X') - - if context.scene.fast64.sm64.exportType == 'Binary': - if romfileOutput is not None: - romfileOutput.close() - if tempROM is not None and os.path.exists(bpy.path.abspath(tempROM)): - os.remove(bpy.path.abspath(tempROM)) - if armatureObj is not None: - armatureObj.select_set(True) - context.view_layer.objects.active = armatureObj - raisePluginError(self, e) - return {'CANCELLED'} # must return a set + # set bl_ properties + bl_idname = "object.sm64_export_geolayout_armature" + bl_label = "Export Armature Geolayout" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + # Called on demand (i.e. button press, menu item) + # Can also be called from operator search menu (Spacebar) + def execute(self, context): + romfileOutput = None + tempROM = None + try: + armatureObj = None + if context.mode != "OBJECT": + raise PluginError("Operator can only be used in object mode.") + if len(context.selected_objects) == 0: + raise PluginError("Armature not selected.") + armatureObj = context.active_object + if type(armatureObj.data) is not bpy.types.Armature: + raise PluginError("Armature not selected.") + + if len(armatureObj.children) == 0 or not isinstance( + armatureObj.children[0].data, bpy.types.Mesh + ): + raise PluginError( + "Armature does not have any mesh children, or " + + "has a non-mesh child." + ) + # if context.scene.saveCameraSettings and \ + # context.scene.levelCamera is None: + # raise PluginError("Cannot save camera settings with no camera provided.") + # levelCamera = context.scene.levelCamera if \ + # context.scene.saveCameraSettings else None + + obj = armatureObj.children[0] + finalTransform = mathutils.Matrix.Identity(4) + + # get all switch option armatures as well + linkedArmatures = [armatureObj] + getAllArmatures(armatureObj, linkedArmatures) + + linkedArmatureDict = {} + + for linkedArmature in linkedArmatures: + # IMPORTANT: Do this BEFORE rotation + optionObjs = [] + for childObj in linkedArmature.children: + if isinstance(childObj.data, bpy.types.Mesh): + optionObjs.append(childObj) + if len(optionObjs) > 1: + raise PluginError( + "Error: " + + linkedArmature.name + + " has more than one mesh child." + ) + elif len(optionObjs) < 1: + raise PluginError( + "Error: " + linkedArmature.name + " has no mesh children." + ) + linkedMesh = optionObjs[0] + prepareGeolayoutExport(linkedArmature, linkedMesh) + linkedArmatureDict[linkedArmature] = linkedMesh + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} + + try: + # Rotate all armatures 90 degrees + applyRotation([armatureObj] + linkedArmatures, math.radians(90), "X") + + # You must ALSO apply object rotation after armature rotation. + bpy.ops.object.select_all(action="DESELECT") + for linkedArmature, linkedMesh in linkedArmatureDict.items(): + linkedMesh.select_set(True) + obj.select_set(True) + bpy.context.view_layer.objects.active = obj + bpy.ops.object.transform_apply( + location=False, rotation=True, scale=True, properties=False + ) + if context.scene.fast64.sm64.exportType == "C": + exportPath, levelName = getPathAndLevel( + context.scene.geoCustomExport, + context.scene.geoExportPath, + context.scene.geoLevelName, + context.scene.geoLevelOption, + ) + + saveTextures = ( + bpy.context.scene.saveTextures + or bpy.context.scene.ignoreTextureRestrictions + ) + if not context.scene.geoCustomExport: + applyBasicTweaks(exportPath) + header, fileStatus = exportGeolayoutArmatureC( + armatureObj, + obj, + finalTransform, + context.scene.f3d_type, + context.scene.isHWv1, + exportPath, + bpy.context.scene.geoTexDir, + saveTextures, + saveTextures and bpy.context.scene.geoSeparateTextureDef, + None, + bpy.context.scene.geoGroupName, + context.scene.geoExportHeaderType, + context.scene.geoName, + context.scene.geoStructName, + levelName, + context.scene.geoCustomExport, + DLFormat.Static, + ) + starSelectWarning(self, fileStatus) + self.report({"INFO"}, "Success!") + elif context.scene.fast64.sm64.exportType == "Insertable Binary": + exportGeolayoutArmatureInsertableBinary( + armatureObj, + obj, + finalTransform, + context.scene.f3d_type, + context.scene.isHWv1, + bpy.path.abspath(bpy.context.scene.geoInsertableBinaryPath), + None, + ) + self.report( + {"INFO"}, + "Success! Data at " + context.scene.geoInsertableBinaryPath, + ) + else: + tempROM = tempName(context.scene.outputRom) + checkExpanded(bpy.path.abspath(context.scene.exportRom)) + romfileExport = open(bpy.path.abspath(context.scene.exportRom), "rb") + shutil.copy( + bpy.path.abspath(context.scene.exportRom), bpy.path.abspath(tempROM) + ) + romfileExport.close() + romfileOutput = open(bpy.path.abspath(tempROM), "rb+") + + levelParsed = parseLevelAtPointer( + romfileOutput, level_pointers[context.scene.levelGeoExport] + ) + segmentData = levelParsed.segmentData + + if context.scene.extendBank4: + ExtendBank0x04(romfileOutput, segmentData, defaultExtendSegment4) + + exportRange = [ + int(context.scene.geoExportStart, 16), + int(context.scene.geoExportEnd, 16), + ] + textDumpFilePath = ( + bpy.path.abspath(context.scene.textDumpGeoPath) + if context.scene.textDumpGeo + else None + ) + if context.scene.overwriteModelLoad: + modelLoadInfo = ( + int(context.scene.modelLoadLevelScriptCmd, 16), + int(context.scene.modelID, 16), + ) + else: + modelLoadInfo = (None, None) + + if context.scene.geoUseBank0: + addrRange, startRAM, geoStart = exportGeolayoutArmatureBinaryBank0( + romfileOutput, + armatureObj, + obj, + exportRange, + finalTransform, + *modelLoadInfo, + textDumpFilePath, + context.scene.f3d_type, + context.scene.isHWv1, + getAddressFromRAMAddress(int(context.scene.geoRAMAddr, 16)), + None, + ) + else: + addrRange, segPointer = exportGeolayoutArmatureBinary( + romfileOutput, + armatureObj, + obj, + exportRange, + finalTransform, + segmentData, + *modelLoadInfo, + textDumpFilePath, + context.scene.f3d_type, + context.scene.isHWv1, + None, + ) + + romfileOutput.close() + bpy.ops.object.select_all(action="DESELECT") + armatureObj.select_set(True) + context.view_layer.objects.active = armatureObj + + if os.path.exists(bpy.path.abspath(context.scene.outputRom)): + os.remove(bpy.path.abspath(context.scene.outputRom)) + os.rename( + bpy.path.abspath(tempROM), bpy.path.abspath(context.scene.outputRom) + ) + + if context.scene.geoUseBank0: + self.report( + {"INFO"}, + "Success! Geolayout at (" + + hex(addrRange[0]) + + ", " + + hex(addrRange[1]) + + "), to write to RAM Address " + + hex(startRAM) + + ", with geolayout starting at " + + hex(geoStart), + ) + else: + self.report( + {"INFO"}, + "Success! Geolayout at (" + + hex(addrRange[0]) + + ", " + + hex(addrRange[1]) + + ") (Seg. " + + segPointer + + ").", + ) + + applyRotation([armatureObj] + linkedArmatures, math.radians(-90), "X") + + return {"FINISHED"} # must return a set + + except Exception as e: + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + + applyRotation([armatureObj] + linkedArmatures, math.radians(-90), "X") + + if context.scene.fast64.sm64.exportType == "Binary": + if romfileOutput is not None: + romfileOutput.close() + if tempROM is not None and os.path.exists(bpy.path.abspath(tempROM)): + os.remove(bpy.path.abspath(tempROM)) + if armatureObj is not None: + armatureObj.select_set(True) + context.view_layer.objects.active = armatureObj + raisePluginError(self, e) + return {"CANCELLED"} # must return a set + class SM64_ExportGeolayoutPanel(SM64_Panel): - bl_idname = "SM64_PT_export_geolayout" - bl_label = "SM64 Geolayout Exporter" - goal = 'Export Object/Actor/Anim' - - # called every frame - def draw(self, context): - col = self.layout.column() - propsGeoE = col.operator(SM64_ExportGeolayoutArmature.bl_idname) - propsGeoE = col.operator(SM64_ExportGeolayoutObject.bl_idname) - - if context.scene.fast64.sm64.exportType == 'C': - if not bpy.context.scene.ignoreTextureRestrictions and context.scene.saveTextures: - if context.scene.geoCustomExport: - prop_split(col, context.scene, 'geoTexDir', 'Texture Include Path') - col.prop(context.scene, 'geoSeparateTextureDef') - - col.prop(context.scene, 'geoCustomExport') - if context.scene.geoCustomExport: - col.prop(context.scene, 'geoExportPath') - prop_split(col, context.scene, 'geoName', 'Folder Name') - prop_split(col, context.scene, 'geoStructName', 'Geolayout Name') - customExportWarning(col) - else: - prop_split(col, context.scene, 'geoExportHeaderType', 'Export Type') - if context.scene.geoExportHeaderType == 'Actor': - prop_split(col, context.scene, 'geoGroupName', 'Group Name') - - ''' + bl_idname = "SM64_PT_export_geolayout" + bl_label = "SM64 Geolayout Exporter" + goal = "Export Object/Actor/Anim" + + # called every frame + def draw(self, context): + col = self.layout.column() + propsGeoE = col.operator(SM64_ExportGeolayoutArmature.bl_idname) + propsGeoE = col.operator(SM64_ExportGeolayoutObject.bl_idname) + + if context.scene.fast64.sm64.exportType == "C": + if ( + not bpy.context.scene.ignoreTextureRestrictions + and context.scene.saveTextures + ): + if context.scene.geoCustomExport: + prop_split(col, context.scene, "geoTexDir", "Texture Include Path") + col.prop(context.scene, "geoSeparateTextureDef") + + col.prop(context.scene, "geoCustomExport") + if context.scene.geoCustomExport: + col.prop(context.scene, "geoExportPath") + prop_split(col, context.scene, "geoName", "Folder Name") + prop_split(col, context.scene, "geoStructName", "Geolayout Name") + customExportWarning(col) + else: + prop_split(col, context.scene, "geoExportHeaderType", "Export Type") + if context.scene.geoExportHeaderType == "Actor": + prop_split(col, context.scene, "geoGroupName", "Group Name") + + """ if context.scene.geoName == 'marios_cap' or\ context.scene.geoName == 'marios_metal_cap' or\ context.scene.geoName == 'marios_wing_cap' or\ @@ -2489,155 +3634,182 @@ def draw(self, context): warningBox.label(text = 'WARNING: SECONDARY GEOLAYOUTS.', icon = "QUESTION") warningBox.label(text = 'If you replace this you must also replace purple_marble.') warningBox.label(text = 'Otherwise you will get a compilation error.') - ''' - - elif context.scene.geoExportHeaderType == 'Level': - prop_split(col, context.scene, 'geoLevelOption', 'Level') - if context.scene.geoLevelOption == 'custom': - prop_split(col, context.scene, 'geoLevelName', 'Level Name') - prop_split(col, context.scene, 'geoName', 'Folder Name') - prop_split(col, context.scene, 'geoStructName', 'Geolayout Name') - if context.scene.geoExportHeaderType == 'Actor': - if context.scene.geoName == 'star': - col.prop(context.scene, 'replaceStarRefs') - if context.scene.geoName == 'transparent_star': - col.prop(context.scene, 'replaceTransparentStarRefs') - if context.scene.geoName == 'marios_cap': - col.prop(context.scene, 'replaceCapRefs') - infoBox = col.box() - infoBox.label(text = 'If a geolayout file contains multiple actors,') - infoBox.label(text = 'all other actors must also be replaced (with unique folder names)') - infoBox.label(text = 'to prevent compilation errors.') - decompFolderMessage(col) - writeBox = makeWriteInfoBox(col) - writeBoxExportType(writeBox, context.scene.geoExportHeaderType, - context.scene.geoName, context.scene.geoLevelName, - context.scene.geoLevelOption) - - #extendedRAMLabel(col) - elif context.scene.fast64.sm64.exportType == 'Insertable Binary': - col.prop(context.scene, 'geoInsertableBinaryPath') - else: - prop_split(col, context.scene, 'geoExportStart', 'Start Address') - prop_split(col, context.scene, 'geoExportEnd', 'End Address') - - col.prop(context.scene, 'geoUseBank0') - if context.scene.geoUseBank0: - prop_split(col, context.scene, 'geoRAMAddr', 'RAM Address') - else: - col.prop(context.scene, 'levelGeoExport') - - col.prop(context.scene, 'overwriteModelLoad') - if context.scene.overwriteModelLoad: - prop_split(col, context.scene, 'modelLoadLevelScriptCmd', 'Model Load Command') - prop_split(col, context.scene, 'modelID', 'Model ID') - col.prop(context.scene, 'textDumpGeo') - if context.scene.textDumpGeo: - col.prop(context.scene, 'textDumpGeoPath') + """ + + elif context.scene.geoExportHeaderType == "Level": + prop_split(col, context.scene, "geoLevelOption", "Level") + if context.scene.geoLevelOption == "custom": + prop_split(col, context.scene, "geoLevelName", "Level Name") + prop_split(col, context.scene, "geoName", "Folder Name") + prop_split(col, context.scene, "geoStructName", "Geolayout Name") + if context.scene.geoExportHeaderType == "Actor": + if context.scene.geoName == "star": + col.prop(context.scene, "replaceStarRefs") + if context.scene.geoName == "transparent_star": + col.prop(context.scene, "replaceTransparentStarRefs") + if context.scene.geoName == "marios_cap": + col.prop(context.scene, "replaceCapRefs") + infoBox = col.box() + infoBox.label(text="If a geolayout file contains multiple actors,") + infoBox.label( + text="all other actors must also be replaced (with unique folder names)" + ) + infoBox.label(text="to prevent compilation errors.") + decompFolderMessage(col) + writeBox = makeWriteInfoBox(col) + writeBoxExportType( + writeBox, + context.scene.geoExportHeaderType, + context.scene.geoName, + context.scene.geoLevelName, + context.scene.geoLevelOption, + ) + + # extendedRAMLabel(col) + elif context.scene.fast64.sm64.exportType == "Insertable Binary": + col.prop(context.scene, "geoInsertableBinaryPath") + else: + prop_split(col, context.scene, "geoExportStart", "Start Address") + prop_split(col, context.scene, "geoExportEnd", "End Address") + + col.prop(context.scene, "geoUseBank0") + if context.scene.geoUseBank0: + prop_split(col, context.scene, "geoRAMAddr", "RAM Address") + else: + col.prop(context.scene, "levelGeoExport") + + col.prop(context.scene, "overwriteModelLoad") + if context.scene.overwriteModelLoad: + prop_split( + col, context.scene, "modelLoadLevelScriptCmd", "Model Load Command" + ) + prop_split(col, context.scene, "modelID", "Model ID") + col.prop(context.scene, "textDumpGeo") + if context.scene.textDumpGeo: + col.prop(context.scene, "textDumpGeoPath") sm64_geo_writer_classes = ( - SM64_ExportGeolayoutObject, - SM64_ExportGeolayoutArmature, + SM64_ExportGeolayoutObject, + SM64_ExportGeolayoutArmature, ) -sm64_geo_writer_panel_classes = ( - SM64_ExportGeolayoutPanel, -) +sm64_geo_writer_panel_classes = (SM64_ExportGeolayoutPanel,) + def sm64_geo_writer_panel_register(): - for cls in sm64_geo_writer_panel_classes: - register_class(cls) + for cls in sm64_geo_writer_panel_classes: + register_class(cls) + def sm64_geo_writer_panel_unregister(): - for cls in sm64_geo_writer_panel_classes: - unregister_class(cls) + for cls in sm64_geo_writer_panel_classes: + unregister_class(cls) + def sm64_geo_writer_register(): - for cls in sm64_geo_writer_classes: - register_class(cls) - - bpy.types.Scene.levelGeoExport = bpy.props.EnumProperty(items = level_enums, - name = 'Level', default = 'HMC') - bpy.types.Scene.geoExportStart = bpy.props.StringProperty( - name = 'Start', default = '11D8930') - bpy.types.Scene.geoExportEnd = bpy.props.StringProperty( - name = 'End', default = '11FFF00') - - bpy.types.Scene.overwriteModelLoad = bpy.props.BoolProperty( - name = 'Modify level script', default = True) - bpy.types.Scene.modelLoadLevelScriptCmd = bpy.props.StringProperty( - name = 'Level script model load command', default = '2ABCE0') - bpy.types.Scene.modelID = bpy.props.StringProperty(name = 'Model ID', - default = '1') - - bpy.types.Scene.textDumpGeo = bpy.props.BoolProperty( - name = 'Dump geolayout as text', default = False) - bpy.types.Scene.textDumpGeoPath = bpy.props.StringProperty( - name ='Text Dump Path', subtype = 'FILE_PATH') - bpy.types.Scene.geoExportPath = bpy.props.StringProperty( - name = 'Directory', subtype = 'FILE_PATH') - bpy.types.Scene.geoUseBank0 = bpy.props.BoolProperty(name = 'Use Bank 0') - bpy.types.Scene.geoRAMAddr = bpy.props.StringProperty(name = 'RAM Address', - default = '80000000') - bpy.types.Scene.geoTexDir = bpy.props.StringProperty( - name ='Include Path', default = 'actors/mario/') - bpy.types.Scene.geoSeparateTextureDef = bpy.props.BoolProperty( - name = 'Save texture.inc.c separately') - bpy.types.Scene.geoInsertableBinaryPath = bpy.props.StringProperty( - name = 'Filepath', subtype = 'FILE_PATH') - bpy.types.Scene.geoIsSegPtr = bpy.props.BoolProperty( - name = 'Is Segmented Address') - bpy.types.Scene.geoName = bpy.props.StringProperty( - name = 'Directory Name', default = 'mario') - bpy.types.Scene.geoGroupName = bpy.props.StringProperty( - name = 'Name', default = 'group0') - bpy.types.Scene.geoExportHeaderType = bpy.props.EnumProperty( - name = 'Header Export', items = enumExportHeaderType, default = 'Actor') - bpy.types.Scene.geoCustomExport = bpy.props.BoolProperty( - name = 'Custom Export Path') - bpy.types.Scene.geoLevelName = bpy.props.StringProperty(name = 'Level', - default = 'bob') - bpy.types.Scene.geoLevelOption = bpy.props.EnumProperty( - items = enumLevelNames, name = 'Level', default = 'bob') - bpy.types.Scene.replaceStarRefs = bpy.props.BoolProperty( - name = 'Replace old DL references in other actors', default = True) - bpy.types.Scene.replaceTransparentStarRefs = bpy.props.BoolProperty( - name = 'Replace old DL references in other actors', default = True) - bpy.types.Scene.replaceCapRefs = bpy.props.BoolProperty( - name = 'Replace old DL references in other actors', default = True) - bpy.types.Scene.modifyOldGeo = bpy.props.BoolProperty( - name = 'Rename old geolayout to avoid conflicts', default = True) - bpy.types.Scene.geoStructName = bpy.props.StringProperty(name = 'Geolayout Name', - default = 'mario_geo') + for cls in sm64_geo_writer_classes: + register_class(cls) + + bpy.types.Scene.levelGeoExport = bpy.props.EnumProperty( + items=level_enums, name="Level", default="HMC" + ) + bpy.types.Scene.geoExportStart = bpy.props.StringProperty( + name="Start", default="11D8930" + ) + bpy.types.Scene.geoExportEnd = bpy.props.StringProperty( + name="End", default="11FFF00" + ) + + bpy.types.Scene.overwriteModelLoad = bpy.props.BoolProperty( + name="Modify level script", default=True + ) + bpy.types.Scene.modelLoadLevelScriptCmd = bpy.props.StringProperty( + name="Level script model load command", default="2ABCE0" + ) + bpy.types.Scene.modelID = bpy.props.StringProperty(name="Model ID", default="1") + + bpy.types.Scene.textDumpGeo = bpy.props.BoolProperty( + name="Dump geolayout as text", default=False + ) + bpy.types.Scene.textDumpGeoPath = bpy.props.StringProperty( + name="Text Dump Path", subtype="FILE_PATH" + ) + bpy.types.Scene.geoExportPath = bpy.props.StringProperty( + name="Directory", subtype="FILE_PATH" + ) + bpy.types.Scene.geoUseBank0 = bpy.props.BoolProperty(name="Use Bank 0") + bpy.types.Scene.geoRAMAddr = bpy.props.StringProperty( + name="RAM Address", default="80000000" + ) + bpy.types.Scene.geoTexDir = bpy.props.StringProperty( + name="Include Path", default="actors/mario/" + ) + bpy.types.Scene.geoSeparateTextureDef = bpy.props.BoolProperty( + name="Save texture.inc.c separately" + ) + bpy.types.Scene.geoInsertableBinaryPath = bpy.props.StringProperty( + name="Filepath", subtype="FILE_PATH" + ) + bpy.types.Scene.geoIsSegPtr = bpy.props.BoolProperty(name="Is Segmented Address") + bpy.types.Scene.geoName = bpy.props.StringProperty( + name="Directory Name", default="mario" + ) + bpy.types.Scene.geoGroupName = bpy.props.StringProperty( + name="Name", default="group0" + ) + bpy.types.Scene.geoExportHeaderType = bpy.props.EnumProperty( + name="Header Export", items=enumExportHeaderType, default="Actor" + ) + bpy.types.Scene.geoCustomExport = bpy.props.BoolProperty(name="Custom Export Path") + bpy.types.Scene.geoLevelName = bpy.props.StringProperty(name="Level", default="bob") + bpy.types.Scene.geoLevelOption = bpy.props.EnumProperty( + items=enumLevelNames, name="Level", default="bob" + ) + bpy.types.Scene.replaceStarRefs = bpy.props.BoolProperty( + name="Replace old DL references in other actors", default=True + ) + bpy.types.Scene.replaceTransparentStarRefs = bpy.props.BoolProperty( + name="Replace old DL references in other actors", default=True + ) + bpy.types.Scene.replaceCapRefs = bpy.props.BoolProperty( + name="Replace old DL references in other actors", default=True + ) + bpy.types.Scene.modifyOldGeo = bpy.props.BoolProperty( + name="Rename old geolayout to avoid conflicts", default=True + ) + bpy.types.Scene.geoStructName = bpy.props.StringProperty( + name="Geolayout Name", default="mario_geo" + ) + def sm64_geo_writer_unregister(): - for cls in reversed(sm64_geo_writer_classes): - unregister_class(cls) - - del bpy.types.Scene.levelGeoExport - del bpy.types.Scene.geoExportStart - del bpy.types.Scene.geoExportEnd - del bpy.types.Scene.overwriteModelLoad - del bpy.types.Scene.modelLoadLevelScriptCmd - del bpy.types.Scene.modelID - del bpy.types.Scene.textDumpGeo - del bpy.types.Scene.textDumpGeoPath - del bpy.types.Scene.geoExportPath - del bpy.types.Scene.geoUseBank0 - del bpy.types.Scene.geoRAMAddr - del bpy.types.Scene.geoTexDir - del bpy.types.Scene.geoSeparateTextureDef - del bpy.types.Scene.geoInsertableBinaryPath - del bpy.types.Scene.geoIsSegPtr - del bpy.types.Scene.geoName - del bpy.types.Scene.geoGroupName - del bpy.types.Scene.geoExportHeaderType - del bpy.types.Scene.geoCustomExport - del bpy.types.Scene.geoLevelName - del bpy.types.Scene.geoLevelOption - del bpy.types.Scene.replaceStarRefs - del bpy.types.Scene.replaceTransparentStarRefs - del bpy.types.Scene.replaceCapRefs - del bpy.types.Scene.modifyOldGeo - del bpy.types.Scene.geoStructName + for cls in reversed(sm64_geo_writer_classes): + unregister_class(cls) + + del bpy.types.Scene.levelGeoExport + del bpy.types.Scene.geoExportStart + del bpy.types.Scene.geoExportEnd + del bpy.types.Scene.overwriteModelLoad + del bpy.types.Scene.modelLoadLevelScriptCmd + del bpy.types.Scene.modelID + del bpy.types.Scene.textDumpGeo + del bpy.types.Scene.textDumpGeoPath + del bpy.types.Scene.geoExportPath + del bpy.types.Scene.geoUseBank0 + del bpy.types.Scene.geoRAMAddr + del bpy.types.Scene.geoTexDir + del bpy.types.Scene.geoSeparateTextureDef + del bpy.types.Scene.geoInsertableBinaryPath + del bpy.types.Scene.geoIsSegPtr + del bpy.types.Scene.geoName + del bpy.types.Scene.geoGroupName + del bpy.types.Scene.geoExportHeaderType + del bpy.types.Scene.geoCustomExport + del bpy.types.Scene.geoLevelName + del bpy.types.Scene.geoLevelOption + del bpy.types.Scene.replaceStarRefs + del bpy.types.Scene.replaceTransparentStarRefs + del bpy.types.Scene.replaceCapRefs + del bpy.types.Scene.modifyOldGeo + del bpy.types.Scene.geoStructName diff --git a/fast64_internal/sm64/sm64_level_constants.py b/fast64_internal/sm64/sm64_level_constants.py index ff51ad655..4f6883c74 100644 --- a/fast64_internal/sm64/sm64_level_constants.py +++ b/fast64_internal/sm64/sm64_level_constants.py @@ -1,81 +1,80 @@ terrain_types = { - 'Normal A' : 0x00, - 'Normal B' : 0x01, - 'Snow' : 0x02, - 'Sand' : 0x03, - 'Haunted House' : 0x04, - 'Water Level' : 0x05, - 'Slippery Slide': 0x06, + "Normal A": 0x00, + "Normal B": 0x01, + "Snow": 0x02, + "Sand": 0x03, + "Haunted House": 0x04, + "Water Level": 0x05, + "Slippery Slide": 0x06, } default_dialog_ID = { - 'BOB' : 0x00, - 'WF' : 0x1E, - 'BFC' : 0x5A, - 'VC' : 0x81, - 'MC' : 0x82, - 'WC' : 0x83, + "BOB": 0x00, + "WF": 0x1E, + "BFC": 0x5A, + "VC": 0x81, + "MC": 0x82, + "WC": 0x83, } -L_LOAD_RAW_JUMP0 = 0x00 -L_LOAD_RAW_JUMP1 = 0x01 -L_END = 0x02 -L_DELAY1 = 0x03 -L_DELAY2 = 0x04 -L_JUMP = 0x05 -L_PUSH = 0x06 -L_POP = 0x07 -L_PUSH_16 = 0x08 -L_POP_16 = 0x09 -L_PUSH_00 = 0x0A -L_COND_POP = 0x0B -L_COND_JUMP = 0x0C -L_COND_PUSH = 0x0D -L_COND_SKIP = 0x0E -L_SKIP = 0x0F -L_NOOP = 0x10 -L_SET_ACC_ASM = 0x11 -L_ACTIVE_SET_ACC = 0x12 -L_SET_ACC = 0x13 -L_POOL_PUSH = 0x14 -L_POOL_POP = 0x15 -L_LOAD_ROM_RAM = 0x16 -L_LOAD_ROM_SEG = 0x17 -L_LOAD_MIO0_SEG = 0x18 -L_MARIO_DEMO = 0x19 -L_LOAD_MIO0_TEX = 0x1A -L_LOAD_START = 0x1B -L_MEM_CLEANUP = 0x1C -L_LOAD_END = 0x1D -L_POOL_ALLOC = 0x1E -L_AREA_START = 0x1F -L_AREA_END = 0x20 -L_LOAD_POLY_WO_GEO = 0x21 -L_LOAD_POLY_W_GEO = 0x22 -L_23 = 0x23 -L_PLACE_OBJECT = 0x24 -L_LOAD_MARIO = 0x25 -L_WARP_CONNECT = 0x26 -L_WARP_PAINTING = 0x27 -L_WARP_AREA = 0x28 -L_29 = 0x29 -L_2A = 0x2A -L_SET_DEFAULT_MARIO_POS = 0x2B -L_2C = 0x2C -L_2D = 0x2D -L_LOAD_COLLISION = 0x2E -L_RENDER_AREA = 0x2F -L_SHOW_DIALOG = 0x30 -L_SET_DEFAULT_TERRAIN = 0x31 -L_NOOP2 = 0x32 -L_FADE_OVERLAY = 0x33 -L_BLACKOUT_SCREEN = 0x34 -L_35 = 0x35 -L_SET_MUSIC_SCREEN = 0x36 -L_SET_MUSIC_LEVEL = 0x37 -L_38 = 0x38 -L_PLACE_MACRO_OBJECT = 0x39 -L_3A = 0x3A -L_JET_STREAM = 0x3B -L_3C = 0x3C - +L_LOAD_RAW_JUMP0 = 0x00 +L_LOAD_RAW_JUMP1 = 0x01 +L_END = 0x02 +L_DELAY1 = 0x03 +L_DELAY2 = 0x04 +L_JUMP = 0x05 +L_PUSH = 0x06 +L_POP = 0x07 +L_PUSH_16 = 0x08 +L_POP_16 = 0x09 +L_PUSH_00 = 0x0A +L_COND_POP = 0x0B +L_COND_JUMP = 0x0C +L_COND_PUSH = 0x0D +L_COND_SKIP = 0x0E +L_SKIP = 0x0F +L_NOOP = 0x10 +L_SET_ACC_ASM = 0x11 +L_ACTIVE_SET_ACC = 0x12 +L_SET_ACC = 0x13 +L_POOL_PUSH = 0x14 +L_POOL_POP = 0x15 +L_LOAD_ROM_RAM = 0x16 +L_LOAD_ROM_SEG = 0x17 +L_LOAD_MIO0_SEG = 0x18 +L_MARIO_DEMO = 0x19 +L_LOAD_MIO0_TEX = 0x1A +L_LOAD_START = 0x1B +L_MEM_CLEANUP = 0x1C +L_LOAD_END = 0x1D +L_POOL_ALLOC = 0x1E +L_AREA_START = 0x1F +L_AREA_END = 0x20 +L_LOAD_POLY_WO_GEO = 0x21 +L_LOAD_POLY_W_GEO = 0x22 +L_23 = 0x23 +L_PLACE_OBJECT = 0x24 +L_LOAD_MARIO = 0x25 +L_WARP_CONNECT = 0x26 +L_WARP_PAINTING = 0x27 +L_WARP_AREA = 0x28 +L_29 = 0x29 +L_2A = 0x2A +L_SET_DEFAULT_MARIO_POS = 0x2B +L_2C = 0x2C +L_2D = 0x2D +L_LOAD_COLLISION = 0x2E +L_RENDER_AREA = 0x2F +L_SHOW_DIALOG = 0x30 +L_SET_DEFAULT_TERRAIN = 0x31 +L_NOOP2 = 0x32 +L_FADE_OVERLAY = 0x33 +L_BLACKOUT_SCREEN = 0x34 +L_35 = 0x35 +L_SET_MUSIC_SCREEN = 0x36 +L_SET_MUSIC_LEVEL = 0x37 +L_38 = 0x38 +L_PLACE_MACRO_OBJECT = 0x39 +L_3A = 0x3A +L_JET_STREAM = 0x3B +L_3C = 0x3C diff --git a/fast64_internal/sm64/sm64_level_parser.py b/fast64_internal/sm64/sm64_level_parser.py index 5251b4465..796dbf735 100644 --- a/fast64_internal/sm64/sm64_level_parser.py +++ b/fast64_internal/sm64/sm64_level_parser.py @@ -7,427 +7,455 @@ from ..utility import * + def parseLevelAtPointer(romfile, pointerAddress): - segmentData = parseCommonSegmentLoad(romfile) + segmentData = parseCommonSegmentLoad(romfile) + + romfile.seek(pointerAddress) + command = romfile.read(16) + segment = command[3] + segmentStart = int.from_bytes(command[4:8], "big") + segmentEnd = int.from_bytes(command[8:12], "big") - romfile.seek(pointerAddress) - command = romfile.read(16) - segment = command[3] - segmentStart = int.from_bytes(command[4:8], 'big') - segmentEnd = int.from_bytes(command[8:12], 'big') + segmentData[segment] = (segmentStart, segmentEnd) - segmentData[segment] = (segmentStart, segmentEnd) + startAddress = decodeSegmentedAddr(command[12:16], segmentData) - startAddress = decodeSegmentedAddr( - command[12:16], segmentData) + parsedLevel = parseLevel(romfile, startAddress, segmentData) + for segment, interval in parsedLevel.segmentData.items(): + print( + "Segment " + + format(segment, "#04x") + + ": " + + hex(interval[0]) + + " - " + + hex(interval[1]) + ) - parsedLevel = parseLevel(romfile, startAddress, segmentData) - for segment, interval in parsedLevel.segmentData.items(): - print("Segment " + format(segment, '#04x') + ': ' + hex(interval[0])\ - + " - " + hex(interval[1])) + return parsedLevel - return parsedLevel def parseCommonSegmentLoad(romfile): - segmentData = copy.deepcopy(mainLevelLoadScriptSegment) - for segment, pointer in loadSegmentAddresses.items(): - romfile.seek(pointer) - command = romfile.read(12) - - segment = command[3] - segmentStart = int.from_bytes(command[4:8], 'big') - segmentEnd = int.from_bytes(command[8:12], 'big') - - segmentData[segment] = (segmentStart, segmentEnd) - - return segmentData + segmentData = copy.deepcopy(mainLevelLoadScriptSegment) + for segment, pointer in loadSegmentAddresses.items(): + romfile.seek(pointer) + command = romfile.read(12) + + segment = command[3] + segmentStart = int.from_bytes(command[4:8], "big") + segmentEnd = int.from_bytes(command[8:12], "big") + + segmentData[segment] = (segmentStart, segmentEnd) + + return segmentData + # second byte = command length def parseLevel(romfile, startAddress, segmentData): - currentAddress = startAddress - - romfile.seek(currentAddress) - currentCmd = romfile.read(2) - romfile.seek(currentAddress) # second seek is because reading moves read pointer forward - currentCmd = romfile.read(currentCmd[1]) - #currentAddress += currentCmd[1] - - scriptStack = [currentAddress] - currentLevel = SM64_Level() - currentLevel.segmentData = segmentData - currentArea = currentLevel.nonArea - - # Note that this is only applicable for specific levels, - # accessed through a jump table in the main level script. - while len(scriptStack) > 0 and currentCmd[0] is not L_END: - #print(bytesToHex(currentCmd) + " at " + hex(currentAddress)) - - if currentCmd[0] == L_JUMP: - currentAddress = decodeSegmentedAddr( - currentCmd[4:8], segmentData) - - elif currentCmd[0] == L_PUSH: - scriptStack.append(currentAddress) - #print([hex(value) for value in scriptStack]) - currentAddress = decodeSegmentedAddr( - currentCmd[4:8], segmentData) - - elif currentCmd[0] == L_POP: - currentAddress = scriptStack.pop() - romfile.seek(currentAddress) - currentCmd = romfile.read(2) - romfile.seek(currentAddress) - currentCmd = romfile.read(currentCmd[1]) - currentAddress += currentCmd[1] - #print([hex(value) for value in scriptStack]) - - elif currentCmd[0] == L_NOOP or \ - currentCmd[0] == L_NOOP2: - pass - - elif currentCmd[0] == L_LOAD_ROM_SEG or\ - currentCmd[0] == L_LOAD_MIO0_SEG or\ - currentCmd[0] == L_LOAD_MIO0_TEX: - segmentData[currentCmd[3]] = [ - int.from_bytes(currentCmd[4:8], 'big'), - int.from_bytes(currentCmd[8:12], 'big') - ] - - elif currentCmd[0] == L_AREA_START: - if currentArea is not currentLevel.nonArea: - raise PluginError("Nested areas not supported.") - else: - currentArea = SM64_Area(currentAddress, currentCmd) - - elif currentCmd[0] == L_AREA_END: - currentLevel.areas.append(currentArea) - currentArea = currentLevel.nonArea - - elif currentCmd[0] == L_LOAD_POLY_W_GEO or\ - currentCmd[0] == L_LOAD_POLY_WO_GEO: - polygonData = SM64_Geometry(currentCmd, currentAddress) - currentLevel.geometry.append(polygonData) - - elif currentCmd[0] == L_PLACE_OBJECT: - newObj = SM64_Object(currentCmd, currentAddress) - currentArea.objects.append(newObj) - - elif currentCmd[0] == L_WARP_CONNECT or\ - currentCmd[0] == L_WARP_PAINTING: - warp = SM64_Warp(currentCmd, currentAddress) - currentArea.warps.append(warp) - - elif currentCmd[0] == L_WARP_AREA: - areaWarp = SM64_Area_Warp(currentCmd, currentAddress) - currentArea.areaWarps.append(areaWarp) - - elif currentCmd[0] == L_SET_DEFAULT_MARIO_POS: - marioPos = SM64_MarioStart(currentCmd, currentAddress) - currentLevel.marioStartPosition = marioPos - - elif currentCmd[0] == L_LOAD_COLLISION: - col = SM64_Collider(currentCmd, currentAddress) - currentArea.collider = col - - elif currentCmd[0] == L_SHOW_DIALOG: - dialog = SM64_Dialog_ID(currentCmd, currentAddress) - currentArea.startDialogID = dialog - - elif currentCmd[0] == L_SET_DEFAULT_TERRAIN: - terrain = SM64_Default_Terrain(currentCmd, currentAddress) - currentArea.defaultTerrainType = terrain - - elif currentCmd[0] == L_SET_MUSIC_LEVEL: - music = SM64_Music_Level(currentCmd, currentAddress) - currentArea.music = music - - elif currentCmd[0] == L_PLACE_MACRO_OBJECT: - macroObj = SM64_Macro_Object(currentCmd, currentAddress) - currentArea.macroObjects.append(macroObj) - - elif currentCmd[0] == L_JET_STREAM: - jetStream = SM64_Jet_Stream(currentCmd, currentAddress) - currentArea.jetStreams.append(jetStream) - - else: - print("Unhandled command: " + hex(currentCmd[0])) - - if currentCmd[0] != L_PUSH and currentCmd[0] != L_JUMP and currentCmd[0] != L_POP: - currentAddress += currentCmd[1] - romfile.seek(currentAddress) - currentCmd = romfile.read(2) - romfile.seek(currentAddress) - currentCmd = romfile.read(currentCmd[1]) - #currentAddress += currentCmd[1] - - return currentLevel + currentAddress = startAddress + + romfile.seek(currentAddress) + currentCmd = romfile.read(2) + romfile.seek( + currentAddress + ) # second seek is because reading moves read pointer forward + currentCmd = romfile.read(currentCmd[1]) + # currentAddress += currentCmd[1] + + scriptStack = [currentAddress] + currentLevel = SM64_Level() + currentLevel.segmentData = segmentData + currentArea = currentLevel.nonArea + + # Note that this is only applicable for specific levels, + # accessed through a jump table in the main level script. + while len(scriptStack) > 0 and currentCmd[0] is not L_END: + # print(bytesToHex(currentCmd) + " at " + hex(currentAddress)) + + if currentCmd[0] == L_JUMP: + currentAddress = decodeSegmentedAddr(currentCmd[4:8], segmentData) + + elif currentCmd[0] == L_PUSH: + scriptStack.append(currentAddress) + # print([hex(value) for value in scriptStack]) + currentAddress = decodeSegmentedAddr(currentCmd[4:8], segmentData) + + elif currentCmd[0] == L_POP: + currentAddress = scriptStack.pop() + romfile.seek(currentAddress) + currentCmd = romfile.read(2) + romfile.seek(currentAddress) + currentCmd = romfile.read(currentCmd[1]) + currentAddress += currentCmd[1] + # print([hex(value) for value in scriptStack]) + + elif currentCmd[0] == L_NOOP or currentCmd[0] == L_NOOP2: + pass + + elif ( + currentCmd[0] == L_LOAD_ROM_SEG + or currentCmd[0] == L_LOAD_MIO0_SEG + or currentCmd[0] == L_LOAD_MIO0_TEX + ): + segmentData[currentCmd[3]] = [ + int.from_bytes(currentCmd[4:8], "big"), + int.from_bytes(currentCmd[8:12], "big"), + ] + + elif currentCmd[0] == L_AREA_START: + if currentArea is not currentLevel.nonArea: + raise PluginError("Nested areas not supported.") + else: + currentArea = SM64_Area(currentAddress, currentCmd) + + elif currentCmd[0] == L_AREA_END: + currentLevel.areas.append(currentArea) + currentArea = currentLevel.nonArea + + elif currentCmd[0] == L_LOAD_POLY_W_GEO or currentCmd[0] == L_LOAD_POLY_WO_GEO: + polygonData = SM64_Geometry(currentCmd, currentAddress) + currentLevel.geometry.append(polygonData) + + elif currentCmd[0] == L_PLACE_OBJECT: + newObj = SM64_Object(currentCmd, currentAddress) + currentArea.objects.append(newObj) + + elif currentCmd[0] == L_WARP_CONNECT or currentCmd[0] == L_WARP_PAINTING: + warp = SM64_Warp(currentCmd, currentAddress) + currentArea.warps.append(warp) + + elif currentCmd[0] == L_WARP_AREA: + areaWarp = SM64_Area_Warp(currentCmd, currentAddress) + currentArea.areaWarps.append(areaWarp) + + elif currentCmd[0] == L_SET_DEFAULT_MARIO_POS: + marioPos = SM64_MarioStart(currentCmd, currentAddress) + currentLevel.marioStartPosition = marioPos + + elif currentCmd[0] == L_LOAD_COLLISION: + col = SM64_Collider(currentCmd, currentAddress) + currentArea.collider = col + + elif currentCmd[0] == L_SHOW_DIALOG: + dialog = SM64_Dialog_ID(currentCmd, currentAddress) + currentArea.startDialogID = dialog + + elif currentCmd[0] == L_SET_DEFAULT_TERRAIN: + terrain = SM64_Default_Terrain(currentCmd, currentAddress) + currentArea.defaultTerrainType = terrain + + elif currentCmd[0] == L_SET_MUSIC_LEVEL: + music = SM64_Music_Level(currentCmd, currentAddress) + currentArea.music = music + + elif currentCmd[0] == L_PLACE_MACRO_OBJECT: + macroObj = SM64_Macro_Object(currentCmd, currentAddress) + currentArea.macroObjects.append(macroObj) + + elif currentCmd[0] == L_JET_STREAM: + jetStream = SM64_Jet_Stream(currentCmd, currentAddress) + currentArea.jetStreams.append(jetStream) + + else: + print("Unhandled command: " + hex(currentCmd[0])) + + if ( + currentCmd[0] != L_PUSH + and currentCmd[0] != L_JUMP + and currentCmd[0] != L_POP + ): + currentAddress += currentCmd[1] + romfile.seek(currentAddress) + currentCmd = romfile.read(2) + romfile.seek(currentAddress) + currentCmd = romfile.read(currentCmd[1]) + # currentAddress += currentCmd[1] + + return currentLevel + class SM64_Level: - def __init__(self): - self.segmentData = {} - self.geometry = [] - self.areas = [] - self.marioStartPosition = None - self.nonArea = SM64_Area(0, [0x00, 0x00, 0x00, 0x00]) + def __init__(self): + self.segmentData = {} + self.geometry = [] + self.areas = [] + self.marioStartPosition = None + self.nonArea = SM64_Area(0, [0x00, 0x00, 0x00, 0x00]) + class SM64_Area: - def __init__(self, startAddress, command): - self.objects = [] - self.warps = [] - self.areaWarps = [] - self.collider = None - self.macroObjects = [] - self.startDialogID = None - self.music = None - self.defaultTerrainType = None - self.marioStart = None - self.startAddress = startAddress - self.areaNum = command[2] - self.geoAddress = command[4:8] - self.jetStreams = [] + def __init__(self, startAddress, command): + self.objects = [] + self.warps = [] + self.areaWarps = [] + self.collider = None + self.macroObjects = [] + self.startDialogID = None + self.music = None + self.defaultTerrainType = None + self.marioStart = None + self.startAddress = startAddress + self.areaNum = command[2] + self.geoAddress = command[4:8] + self.jetStreams = [] + class SM64_Music_Screen: - def __init__(self, command = None, address = None): - if command is None: - self.seqNum = None - self.params = None - else: - self.seqNum = command[5] - self.params = command[2:5] - self.address = address - - def to_microcode(self): - command = bytearray(8) - command[0] = L_SET_MUSIC_SCREEN - command[1] = 8 - command[2:5] = self.params - command[5] = seqNum - - return command + def __init__(self, command=None, address=None): + if command is None: + self.seqNum = None + self.params = None + else: + self.seqNum = command[5] + self.params = command[2:5] + self.address = address + + def to_microcode(self): + command = bytearray(8) + command[0] = L_SET_MUSIC_SCREEN + command[1] = 8 + command[2:5] = self.params + command[5] = seqNum + + return command + class SM64_Music_Level: - def __init__(self, command = None, address = None): - if command is None: - self.seqNum = None - else: - self.seqNum = command[3] - self.address = address + def __init__(self, command=None, address=None): + if command is None: + self.seqNum = None + else: + self.seqNum = command[3] + self.address = address + + def to_microcode(self): + command = bytearray(8) + command[0] = L_SET_MUSIC_LEVEL + command[1] = 4 + command[3] = seqNum - def to_microcode(self): - command = bytearray(8) - command[0] = L_SET_MUSIC_LEVEL - command[1] = 4 - command[3] = seqNum + return command - return command class SM64_Geometry: - def __init__(self, command = None, address = None): - if command is None: - self.geoCmd = None - self.drawLayer = None - self.modelID = None - self.geoAddress = None - else: - self.geoCmd = command[0] - self.drawLayer = command[2] >> 4 - self.modelID = command[3] - self.geoAddress = command[4:8] - self.address = address - - #print('Level geo: ' + hex(int.from_bytes(self.geoAddress, 'big'))) - def to_microcode(self): - command = bytearray(8) - command[0] = self.geoCmd - command[1] = 8 - command[2] = self.drawLayer << 4 - command[3] = self.modelID - command[4:8] = self.collisionAddress - - return command + def __init__(self, command=None, address=None): + if command is None: + self.geoCmd = None + self.drawLayer = None + self.modelID = None + self.geoAddress = None + else: + self.geoCmd = command[0] + self.drawLayer = command[2] >> 4 + self.modelID = command[3] + self.geoAddress = command[4:8] + self.address = address + + # print('Level geo: ' + hex(int.from_bytes(self.geoAddress, 'big'))) + + def to_microcode(self): + command = bytearray(8) + command[0] = self.geoCmd + command[1] = 8 + command[2] = self.drawLayer << 4 + command[3] = self.modelID + command[4:8] = self.collisionAddress + + return command + class SM64_Collider: - def __init__(self, command = None, address = None): - if command is None: - self.collisionAddress = None - self.address = None - else: - self.collisionAddress = command[4:8] - self.address = address - def to_microcode(self): - command = bytearray(8) - command[0] = L_LOAD_COLLISION - command[1] = 8 - command[4:8] = self.collisionAddress - - return command + def __init__(self, command=None, address=None): + if command is None: + self.collisionAddress = None + self.address = None + else: + self.collisionAddress = command[4:8] + self.address = address + + def to_microcode(self): + command = bytearray(8) + command[0] = L_LOAD_COLLISION + command[1] = 8 + command[4:8] = self.collisionAddress + + return command + class SM64_Dialog_ID: - def __init__(self, command = None, address = None): - if command is None: - self.ID = None - self.address = None - else: - self.ID = command[3] - self.address = address - def to_microcode(self): - command = bytearray(8) - command[0] = L_SHOW_DIALOG - command[1] = 4 - command[3] = self.ID - - return command + def __init__(self, command=None, address=None): + if command is None: + self.ID = None + self.address = None + else: + self.ID = command[3] + self.address = address + + def to_microcode(self): + command = bytearray(8) + command[0] = L_SHOW_DIALOG + command[1] = 4 + command[3] = self.ID + + return command + class SM64_Default_Terrain: - def __init__(self, command = None, address = None): - if command is None: - self.terrainType = None - self.address = None - else: - self.terrainType = command[3] - self.address = address - def to_microcode(self): - command = bytearray(8) - command[0] = L_SET_DEFAULT_TERRAIN - command[1] = 4 - command[3] = self.terrainType - - return command + def __init__(self, command=None, address=None): + if command is None: + self.terrainType = None + self.address = None + else: + self.terrainType = command[3] + self.address = address + + def to_microcode(self): + command = bytearray(8) + command[0] = L_SET_DEFAULT_TERRAIN + command[1] = 4 + command[3] = self.terrainType + + return command + class SM64_Object: - def __init__(self, command = None, address = None): - if command is None: - self.mask = None - self.modelID = None - self.position = [0,0,0] - self.rotation = [0,0,0] - self.behaviourParams = None - self.behaviourAddress = None - else: - self.mask = command[2] - self.modelID = command[3] - self.position = readVectorFromShorts(command, 4) - self.rotation = readEulerVectorFromShorts(command, 10) - self.behaviourParams = command[16:20] - self.behaviourAddress = command[20:24] - self.address = address - - def to_microcode(self): - command = bytearray(24) - command[0] = L_PLACE_OBJECT - command[1] = 0x18 - command[2] = self.mask - command[3] = self.modelID - writeVectorToShorts(command, 4, self.position) - writeEulerVectorToShorts(command, 10, self.rotation) - command[16:20] = self.behaviourParams - command[20:24] = self.behaviourAddress - - return command + def __init__(self, command=None, address=None): + if command is None: + self.mask = None + self.modelID = None + self.position = [0, 0, 0] + self.rotation = [0, 0, 0] + self.behaviourParams = None + self.behaviourAddress = None + else: + self.mask = command[2] + self.modelID = command[3] + self.position = readVectorFromShorts(command, 4) + self.rotation = readEulerVectorFromShorts(command, 10) + self.behaviourParams = command[16:20] + self.behaviourAddress = command[20:24] + self.address = address + + def to_microcode(self): + command = bytearray(24) + command[0] = L_PLACE_OBJECT + command[1] = 0x18 + command[2] = self.mask + command[3] = self.modelID + writeVectorToShorts(command, 4, self.position) + writeEulerVectorToShorts(command, 10, self.rotation) + command[16:20] = self.behaviourParams + command[20:24] = self.behaviourAddress + + return command + class SM64_Macro_Object: - def __init__(self, command = None, address = None): - if command is None: - self.objPlacementListPointer = None - #self.objectID = None - #self.position = [0,0,0] - else: - self.objPlacementListPointer = command[4:8] - self.address = address - - def to_microcode(self): - command = bytearray(8) - command[0] = L_PLACE_MACRO_OBJECT - command[1] = 8 - command[4:8] = self.objPlacementListPointer + def __init__(self, command=None, address=None): + if command is None: + self.objPlacementListPointer = None + # self.objectID = None + # self.position = [0,0,0] + else: + self.objPlacementListPointer = command[4:8] + self.address = address + + def to_microcode(self): + command = bytearray(8) + command[0] = L_PLACE_MACRO_OBJECT + command[1] = 8 + command[4:8] = self.objPlacementListPointer class SM64_Jet_Stream: - def __init__(self, command = None, address = None): - if command is None: - self.position = None - self.intensity = 0 - else: - self.position = readVectorFromShorts(command, 4) - self.intensity = readFloatFromShort(command, 10) - self.address = address - - def to_microcode(self, command = None, address = None): - command = bytearray(12) - command[0] = L_JET_STREAM - command[1] = 12 - writeVectorToShorts(command, 4, self.position) - writeFloatToShort(command, 10, self.intensity) - self.address = address - - return command + def __init__(self, command=None, address=None): + if command is None: + self.position = None + self.intensity = 0 + else: + self.position = readVectorFromShorts(command, 4) + self.intensity = readFloatFromShort(command, 10) + self.address = address + + def to_microcode(self, command=None, address=None): + command = bytearray(12) + command[0] = L_JET_STREAM + command[1] = 12 + writeVectorToShorts(command, 4, self.position) + writeFloatToShort(command, 10, self.intensity) + self.address = address + + return command + class SM64_Warp: - def __init__(self, command = None, address = None): - if command is None: - self.warpCmd = None - self.curWarpID = None - self.destCourseID = None - self.destCourseArea = None - self.destWarpID = None - else: - self.warpCmd = command[0] - self.curWarpID = command[2] - self.destCourseID = command[3] - self.destCourseArea = command[4] - self.destWarpID = command[5] - self.address = address - - def to_microcode(self): - command = bytearray(8) - command[0] = self.warpCmd - command[1] = 8 - command[2] = self.curWarpID - command[3] = self.destCourseID - command[4] = self.destCourseArea - command[5] = self.destWarpID - - return command + def __init__(self, command=None, address=None): + if command is None: + self.warpCmd = None + self.curWarpID = None + self.destCourseID = None + self.destCourseArea = None + self.destWarpID = None + else: + self.warpCmd = command[0] + self.curWarpID = command[2] + self.destCourseID = command[3] + self.destCourseArea = command[4] + self.destWarpID = command[5] + self.address = address + + def to_microcode(self): + command = bytearray(8) + command[0] = self.warpCmd + command[1] = 8 + command[2] = self.curWarpID + command[3] = self.destCourseID + command[4] = self.destCourseArea + command[5] = self.destWarpID + + return command + class SM64_Area_Warp: - def __init__(self, command = None, address = None): - if command is None: - self.collisionType = None - self.courseAreaID = None - self.teleportPosition = [0,0,0] - else: - self.collisionType = command[2] - self.courseAreaID = command[3] - self.teleportPosition = readVectorFromShorts(command, 4) - self.address = address - - def to_microcode(self): - command = bytearray(12) - command[0] = L_WARP_AREA - command[1] = 12 - command[2] = self.collisionType - command[3] = self.courseAreaID - writeVectorToShorts(command, 4, self.teleportPosition) - - return command + def __init__(self, command=None, address=None): + if command is None: + self.collisionType = None + self.courseAreaID = None + self.teleportPosition = [0, 0, 0] + else: + self.collisionType = command[2] + self.courseAreaID = command[3] + self.teleportPosition = readVectorFromShorts(command, 4) + self.address = address + + def to_microcode(self): + command = bytearray(12) + command[0] = L_WARP_AREA + command[1] = 12 + command[2] = self.collisionType + command[3] = self.courseAreaID + writeVectorToShorts(command, 4, self.teleportPosition) + + return command + class SM64_MarioStart: - def __init__(self, command = None, address = None): - if command is None: - self.areaID = None - self.position = (0,0,0) - self.yRotation = 0 - else: - self.areaID = command[2] - self.yRotation = readEulerFloatFromShort(command, 4) - self.position = readVectorFromShorts(command, 6) - self.address = address - - def to_microcode(self): - command = bytearray(12) - command[0] = L_SET_DEFAULT_MARIO_POS - command[1] = 12 - writeEulerFloatToShort(command, 4, self.yRotation) - writeVectorToShorts(command, 6, self.position) - - return command \ No newline at end of file + def __init__(self, command=None, address=None): + if command is None: + self.areaID = None + self.position = (0, 0, 0) + self.yRotation = 0 + else: + self.areaID = command[2] + self.yRotation = readEulerFloatFromShort(command, 4) + self.position = readVectorFromShorts(command, 6) + self.address = address + + def to_microcode(self): + command = bytearray(12) + command[0] = L_SET_DEFAULT_MARIO_POS + command[1] = 12 + writeEulerFloatToShort(command, 4, self.yRotation) + writeVectorToShorts(command, 6, self.position) + + return command diff --git a/fast64_internal/sm64/sm64_level_writer.py b/fast64_internal/sm64/sm64_level_writer.py index f0e02798a..36cba2c2a 100644 --- a/fast64_internal/sm64/sm64_level_writer.py +++ b/fast64_internal/sm64/sm64_level_writer.py @@ -14,1087 +14,1368 @@ from ..operators import ObjectDataExporter levelDefineArgs = { - 'internal name' : 0, - 'level enum' : 1, - 'course name' : 2, - 'folder name' : 3, - 'texture bin' : 4, - 'acoustic reach' : 5, - 'echo level 1' : 6, - 'echo level 2' : 7, - 'echo level 3' : 8, - 'dynamic music' : 9, - 'camera table' : 10, + "internal name": 0, + "level enum": 1, + "course name": 2, + "folder name": 3, + "texture bin": 4, + "acoustic reach": 5, + "echo level 1": 6, + "echo level 2": 7, + "echo level 3": 8, + "dynamic music": 9, + "camera table": 10, } + def createGeoFile(levelName, filepath): - result = '#include \n' +\ - '#include "sm64.h"\n' +\ - '#include "geo_commands.h"\n\n' +\ - '#include "game/level_geo.h"\n' +\ - '#include "game/geo_misc.h"\n' +\ - '#include "game/camera.h"\n' +\ - '#include "game/moving_texture.h"\n' +\ - '#include "game/screen_transition.h"\n' +\ - '#include "game/paintings.h"\n\n' +\ - '#include "make_const_nonconst.h"\n\n' +\ - '#include "levels/' + levelName + '/header.h"\n\n' - - geoFile = open(filepath, 'w', newline = '\n') - geoFile.write(result) - geoFile.close() + result = ( + "#include \n" + + '#include "sm64.h"\n' + + '#include "geo_commands.h"\n\n' + + '#include "game/level_geo.h"\n' + + '#include "game/geo_misc.h"\n' + + '#include "game/camera.h"\n' + + '#include "game/moving_texture.h"\n' + + '#include "game/screen_transition.h"\n' + + '#include "game/paintings.h"\n\n' + + '#include "make_const_nonconst.h"\n\n' + + '#include "levels/' + + levelName + + '/header.h"\n\n' + ) + + geoFile = open(filepath, "w", newline="\n") + geoFile.write(result) + geoFile.close() + def createLevelDataFile(levelName, filepath): - result = '#include "\n' +\ - '#include "sm64.h"\n' +\ - '#include "surface_terrains.h"\n' +\ - '#include "moving_texture_macros.h"\n' +\ - '#include "level_misc_macros.h"\n' +\ - '#include "macro_preset_names.h"\n' +\ - '#include "special_preset_names.h"\n' +\ - '#include "textures.h"\n' +\ - '#include "dialog_ids.h"\n\n' +\ - '#include "make_const_nonconst.h"\n\n' - - levelDataFile = open(filepath, 'w', newline = '\n') - levelDataFile.write(result) - levelDataFile.close() + result = ( + '#include "\n' + + '#include "sm64.h"\n' + + '#include "surface_terrains.h"\n' + + '#include "moving_texture_macros.h"\n' + + '#include "level_misc_macros.h"\n' + + '#include "macro_preset_names.h"\n' + + '#include "special_preset_names.h"\n' + + '#include "textures.h"\n' + + '#include "dialog_ids.h"\n\n' + + '#include "make_const_nonconst.h"\n\n' + ) + + levelDataFile = open(filepath, "w", newline="\n") + levelDataFile.write(result) + levelDataFile.close() + def createHeaderFile(levelName, filepath): - result = '#ifndef ' + levelName.upper() + '_HEADER_H\n' +\ - '#define ' + levelName.upper() + '_HEADER_H\n\n' +\ - '#include "types.h"\n' +\ - '#include "game/moving_texture.h"\n\n' +\ - 'extern const LevelScript level_' + levelName + '_entry[];\n\n' +\ - '#endif\n' + result = ( + "#ifndef " + + levelName.upper() + + "_HEADER_H\n" + + "#define " + + levelName.upper() + + "_HEADER_H\n\n" + + '#include "types.h"\n' + + '#include "game/moving_texture.h"\n\n' + + "extern const LevelScript level_" + + levelName + + "_entry[];\n\n" + + "#endif\n" + ) + + headerFile = open(filepath, "w", newline="\n") + headerFile.write(result) + headerFile.close() - headerFile = open(filepath, 'w', newline = '\n') - headerFile.write(result) - headerFile.close() class ZoomOutMasks: - def __init__(self, masks, originalData): - self.masks = masks - self.originalData = originalData - - def to_c(self): - result = '' - #result += 'u8 sZoomOutAreaMasks[] = {\n' - result += '\n' - result += macrosToString(self.masks, True) - #result += '};\n' - return result - - def write(self, filepath): - matchResult = re.search('u8\s*sZoomOutAreaMasks\s*\[\]\s*=\s*\{' +\ - '(((?!\}).)*)\}\s*;', self.originalData, re.DOTALL) - - if matchResult is None: - raise PluginError("Could not find sZoomOutAreaMasks in \"" + filepath + '".') - data = self.originalData[:matchResult.start(1)] + self.to_c() + self.originalData[matchResult.end(1):] - - if data == self.originalData: - return - - maskFile = open(filepath, 'w', newline = '\n') - maskFile.write(data) - maskFile.close() - - def updateMaskCount(self, levelCount): - if len(self.masks) - 1 < int(levelCount / 2): - while len(self.masks) - 1 < int(levelCount / 2): - self.masks.append(['ZOOMOUT_AREA_MASK', [ - '0', '0', '0', '0', '0', '0', '0', '0', - ], '']) - else: - self.masks = self.masks[:int(levelCount / 2) + 1] - - def setMask(self, levelIndex, zoomFlags): - # sZoomOutAreaMasks has extra bits for one unused level at beginning - # Thus, we add one to index - index = int(levelIndex / 2) - if levelIndex % 2 == 1: - index += 1 - isLow = True - else: - isLow = False - mask = self.masks[index] - - base = 0 if isLow else 4 - mask[1][0 + base] = '1' if zoomFlags[0] else '0' - mask[1][1 + base] = '1' if zoomFlags[1] else '0' - mask[1][2 + base] = '1' if zoomFlags[2] else '0' - mask[1][3 + base] = '1' if zoomFlags[3] else '0' + def __init__(self, masks, originalData): + self.masks = masks + self.originalData = originalData + + def to_c(self): + result = "" + # result += 'u8 sZoomOutAreaMasks[] = {\n' + result += "\n" + result += macrosToString(self.masks, True) + # result += '};\n' + return result + + def write(self, filepath): + matchResult = re.search( + "u8\s*sZoomOutAreaMasks\s*\[\]\s*=\s*\{" + "(((?!\}).)*)\}\s*;", + self.originalData, + re.DOTALL, + ) + + if matchResult is None: + raise PluginError('Could not find sZoomOutAreaMasks in "' + filepath + '".') + data = ( + self.originalData[: matchResult.start(1)] + + self.to_c() + + self.originalData[matchResult.end(1) :] + ) + + if data == self.originalData: + return + + maskFile = open(filepath, "w", newline="\n") + maskFile.write(data) + maskFile.close() + + def updateMaskCount(self, levelCount): + if len(self.masks) - 1 < int(levelCount / 2): + while len(self.masks) - 1 < int(levelCount / 2): + self.masks.append( + [ + "ZOOMOUT_AREA_MASK", + [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + ], + "", + ] + ) + else: + self.masks = self.masks[: int(levelCount / 2) + 1] + + def setMask(self, levelIndex, zoomFlags): + # sZoomOutAreaMasks has extra bits for one unused level at beginning + # Thus, we add one to index + index = int(levelIndex / 2) + if levelIndex % 2 == 1: + index += 1 + isLow = True + else: + isLow = False + mask = self.masks[index] + + base = 0 if isLow else 4 + mask[1][0 + base] = "1" if zoomFlags[0] else "0" + mask[1][1 + base] = "1" if zoomFlags[1] else "0" + mask[1][2 + base] = "1" if zoomFlags[2] else "0" + mask[1][3 + base] = "1" if zoomFlags[3] else "0" + class CourseDefines: - def __init__(self, headerInfo, courses, bonusCourses, originalData): - self.headerInfo = headerInfo - self.courses = courses - self.bonusCourses = bonusCourses - self.originalData = originalData - - def to_c(self): - result = self.headerInfo - result += macrosToString(self.courses, False, tabDepth = 0) - result += 'DEFINE_COURSES_END()\n' - result += macrosToString(self.bonusCourses, False, tabDepth = 0) - return result - - def write(self, filepath): - data = self.to_c() - if data == self.originalData: - return - defineFile = open(filepath, 'w', newline = '\n') - defineFile.write(data) - defineFile.close() - - def getOrMakeMacroByCourseName(self, courseEnum, isBonus): - for course in self.courses: - if course[1][0] == courseEnum: - return course - for bonusCourse in self.bonusCourses: - if bonusCourse[1][0] == courseEnum: - return bonusCourse - if not isBonus: - macroCmd = ['DEFINE_COURSE', [ - courseEnum, - '0x44444440' - ], ''] - - self.courses.append(macroCmd) - return macroCmd - - else: - macroCmd = ['DEFINE_BONUS_COURSE', [ - courseEnum, - '0x44444440' - ], ''] - - self.bonusCourses.append(macroCmd) - return macroCmd + def __init__(self, headerInfo, courses, bonusCourses, originalData): + self.headerInfo = headerInfo + self.courses = courses + self.bonusCourses = bonusCourses + self.originalData = originalData + + def to_c(self): + result = self.headerInfo + result += macrosToString(self.courses, False, tabDepth=0) + result += "DEFINE_COURSES_END()\n" + result += macrosToString(self.bonusCourses, False, tabDepth=0) + return result + + def write(self, filepath): + data = self.to_c() + if data == self.originalData: + return + defineFile = open(filepath, "w", newline="\n") + defineFile.write(data) + defineFile.close() + + def getOrMakeMacroByCourseName(self, courseEnum, isBonus): + for course in self.courses: + if course[1][0] == courseEnum: + return course + for bonusCourse in self.bonusCourses: + if bonusCourse[1][0] == courseEnum: + return bonusCourse + if not isBonus: + macroCmd = ["DEFINE_COURSE", [courseEnum, "0x44444440"], ""] + + self.courses.append(macroCmd) + return macroCmd + + else: + macroCmd = ["DEFINE_BONUS_COURSE", [courseEnum, "0x44444440"], ""] + + self.bonusCourses.append(macroCmd) + return macroCmd + class LevelDefines: - def __init__(self, headerInfo, defineMacros, originalData): - self.headerInfo = headerInfo - self.defineMacros = defineMacros - self.originalData = originalData - self.newLevelAdded = False - - def to_c(self): - result = self.headerInfo - result += macrosToString(self.defineMacros, False, tabDepth = 0) - return result - - def write(self, filepath, headerPath): - data = self.to_c() - if data == self.originalData: - return - defineFile = open(filepath, 'w', newline = '\n') - defineFile.write(data) - defineFile.close() - - # Headers won't be updated unless this file is touched - if self.newLevelAdded: - os.utime(headerPath) - - def getOrMakeMacroByLevelName(self, levelName): - for macro in self.defineMacros: - if macro[0] == 'DEFINE_LEVEL' and macro[1][3] == levelName: - return macro - macroCmd = ['DEFINE_LEVEL', [ - '"' + levelName.upper() + '"', - 'LEVEL_' + levelName.upper(), - 'COURSE_' + levelName.upper(), - levelName, - 'generic', - '20000', - '0x00', - '0x00', - '0x00', - '_', - '_' - ], ''] - self.newLevelAdded = True - self.defineMacros.append(macroCmd) - return macroCmd + def __init__(self, headerInfo, defineMacros, originalData): + self.headerInfo = headerInfo + self.defineMacros = defineMacros + self.originalData = originalData + self.newLevelAdded = False + + def to_c(self): + result = self.headerInfo + result += macrosToString(self.defineMacros, False, tabDepth=0) + return result + + def write(self, filepath, headerPath): + data = self.to_c() + if data == self.originalData: + return + defineFile = open(filepath, "w", newline="\n") + defineFile.write(data) + defineFile.close() + + # Headers won't be updated unless this file is touched + if self.newLevelAdded: + os.utime(headerPath) + + def getOrMakeMacroByLevelName(self, levelName): + for macro in self.defineMacros: + if macro[0] == "DEFINE_LEVEL" and macro[1][3] == levelName: + return macro + macroCmd = [ + "DEFINE_LEVEL", + [ + '"' + levelName.upper() + '"', + "LEVEL_" + levelName.upper(), + "COURSE_" + levelName.upper(), + levelName, + "generic", + "20000", + "0x00", + "0x00", + "0x00", + "_", + "_", + ], + "", + ] + self.newLevelAdded = True + self.defineMacros.append(macroCmd) + return macroCmd + class PersistentBlocks: - beginMagic = 'Fast64 begin persistent block' - endMagic = 'Fast64 end persistent block' - - beginRegex = re.compile(fr'.*{beginMagic} (\[[\w ]+\]).*') - endRegex = re.compile(fr'.*{endMagic} (\[[\w ]+\]).*') - - includes = '[includes]' - scripts = '[scripts]' - levelCommands = '[level commands]' - areaCommands = '[area commands]' - - @classmethod - def new(cls): - return { - cls.includes: [], - cls.scripts: [], - cls.levelCommands: [], - cls.areaCommands: defaultdict(list) - } + beginMagic = "Fast64 begin persistent block" + endMagic = "Fast64 end persistent block" + + beginRegex = re.compile(fr".*{beginMagic} (\[[\w ]+\]).*") + endRegex = re.compile(fr".*{endMagic} (\[[\w ]+\]).*") + + includes = "[includes]" + scripts = "[scripts]" + levelCommands = "[level commands]" + areaCommands = "[area commands]" + + @classmethod + def new(cls): + return { + cls.includes: [], + cls.scripts: [], + cls.levelCommands: [], + cls.areaCommands: defaultdict(list), + } + class LevelScript: - def __init__(self, name): - self.name = name - self.segmentLoads = [] - self.mario = 'MARIO(MODEL_MARIO, 0x00000001, bhvMario),' - self.levelFunctions = [] - self.modelLoads = [] - self.actorIncludes = [] - self.marioStart = None - self.persistentBlocks = PersistentBlocks.new() - - def to_c(self, areaString): - result = '#include \n' +\ - '#include "sm64.h"\n' +\ - '#include "behavior_data.h"\n' +\ - '#include "model_ids.h"\n' +\ - '#include "seq_ids.h"\n' +\ - '#include "dialog_ids.h"\n' +\ - '#include "segment_symbols.h"\n' +\ - '#include "level_commands.h"\n\n' +\ - '#include "game/level_update.h"\n\n' +\ - '#include "levels/scripts.h"\n\n' - - for actorInclude in self.actorIncludes: - result += actorInclude + '\n' - - result += f'\n{self.get_persistent_block(PersistentBlocks.includes)}\n\n' - - result += '#include "make_const_nonconst.h"\n' - result += '#include "levels/' + self.name + '/header.h"\n\n' - - result += f'{self.get_persistent_block(PersistentBlocks.scripts)}\n\n' - - result += 'const LevelScript level_' + self.name + '_entry[] = {\n' - result += '\tINIT_LEVEL(),\n' - for segmentLoad in self.segmentLoads: - result += '\t' + macroToString(segmentLoad, True) + '\n' - result += '\tALLOC_LEVEL_POOL(),\n' - result += '\t' + self.mario + '\n' - for levelFunction in self.levelFunctions: - result += '\t' + macroToString(levelFunction, True) + '\n' - for modelLoad in self.modelLoads: - result += '\t' + macroToString(modelLoad, True) + '\n' - result += '\n' - - result += f'{self.get_persistent_block(PersistentBlocks.levelCommands, nTabs=1)}\n\n' - - result += areaString - - result += '\tFREE_LEVEL_POOL(),\n' - if self.marioStart is not None: - result += '\t' + self.marioStart.to_c() + ',\n' - else: - result += '\tMARIO_POS(1, 0, 0, 0, 0),\n' - result += \ - '\tCALL(0, lvl_init_or_update),\n' +\ - '\tCALL_LOOP(1, lvl_init_or_update),\n' +\ - '\tCLEAR_LEVEL(),\n' +\ - '\tSLEEP_BEFORE_EXIT(1),\n' +\ - '\tEXIT(),\n};\n' - - return result - - def get_persistent_block(self, retainType: str, nTabs = 0, areaIndex: str = None): - tabs = '\t' * nTabs - lines = [f'{tabs}/* {PersistentBlocks.beginMagic} {retainType} */'] - if areaIndex: - lines.extend(self.persistentBlocks[PersistentBlocks.areaCommands].get(areaIndex, [])) - else: - lines.extend(self.persistentBlocks.get(retainType, [])) - lines.append(f'{tabs}/* {PersistentBlocks.endMagic} {retainType} */') - return '\n'.join(lines) + def __init__(self, name): + self.name = name + self.segmentLoads = [] + self.mario = "MARIO(MODEL_MARIO, 0x00000001, bhvMario)," + self.levelFunctions = [] + self.modelLoads = [] + self.actorIncludes = [] + self.marioStart = None + self.persistentBlocks = PersistentBlocks.new() + + def to_c(self, areaString): + result = ( + "#include \n" + + '#include "sm64.h"\n' + + '#include "behavior_data.h"\n' + + '#include "model_ids.h"\n' + + '#include "seq_ids.h"\n' + + '#include "dialog_ids.h"\n' + + '#include "segment_symbols.h"\n' + + '#include "level_commands.h"\n\n' + + '#include "game/level_update.h"\n\n' + + '#include "levels/scripts.h"\n\n' + ) + + for actorInclude in self.actorIncludes: + result += actorInclude + "\n" + + result += f"\n{self.get_persistent_block(PersistentBlocks.includes)}\n\n" + + result += '#include "make_const_nonconst.h"\n' + result += '#include "levels/' + self.name + '/header.h"\n\n' + + result += f"{self.get_persistent_block(PersistentBlocks.scripts)}\n\n" + + result += "const LevelScript level_" + self.name + "_entry[] = {\n" + result += "\tINIT_LEVEL(),\n" + for segmentLoad in self.segmentLoads: + result += "\t" + macroToString(segmentLoad, True) + "\n" + result += "\tALLOC_LEVEL_POOL(),\n" + result += "\t" + self.mario + "\n" + for levelFunction in self.levelFunctions: + result += "\t" + macroToString(levelFunction, True) + "\n" + for modelLoad in self.modelLoads: + result += "\t" + macroToString(modelLoad, True) + "\n" + result += "\n" + + result += ( + f"{self.get_persistent_block(PersistentBlocks.levelCommands, nTabs=1)}\n\n" + ) + + result += areaString + + result += "\tFREE_LEVEL_POOL(),\n" + if self.marioStart is not None: + result += "\t" + self.marioStart.to_c() + ",\n" + else: + result += "\tMARIO_POS(1, 0, 0, 0, 0),\n" + result += ( + "\tCALL(0, lvl_init_or_update),\n" + + "\tCALL_LOOP(1, lvl_init_or_update),\n" + + "\tCLEAR_LEVEL(),\n" + + "\tSLEEP_BEFORE_EXIT(1),\n" + + "\tEXIT(),\n};\n" + ) + + return result + + def get_persistent_block(self, retainType: str, nTabs=0, areaIndex: str = None): + tabs = "\t" * nTabs + lines = [f"{tabs}/* {PersistentBlocks.beginMagic} {retainType} */"] + if areaIndex: + lines.extend( + self.persistentBlocks[PersistentBlocks.areaCommands].get(areaIndex, []) + ) + else: + lines.extend(self.persistentBlocks.get(retainType, [])) + lines.append(f"{tabs}/* {PersistentBlocks.endMagic} {retainType} */") + return "\n".join(lines) + def parseCourseDefines(filepath): - if not os.path.exists(filepath): - raise PluginError("Path \"" + filepath + '" does not exist, could not read course defines file.') - scriptFile = open(filepath, 'r', newline = '\n') - scriptData = scriptFile.read() - scriptFile.close() - - matchResult = re.search('(\w*)\((((?!\)).)+)\)', scriptData, re.DOTALL) - if matchResult is None: - raise PluginError("Path \"" + filepath + '" does not have any course define macros in it.') - headerInfo = scriptData[:matchResult.start(0)] - defineMacros = stringToMacros(scriptData) - courses = [] - bonusCourses = [] - - for macro in defineMacros: - if macro[0] == 'DEFINE_COURSE': - courses.append(macro) - elif macro[0] == 'DEFINE_BONUS_COURSE': - bonusCourses.append(macro) - - return CourseDefines(headerInfo, courses, bonusCourses, scriptData) + if not os.path.exists(filepath): + raise PluginError( + 'Path "' + + filepath + + '" does not exist, could not read course defines file.' + ) + scriptFile = open(filepath, "r", newline="\n") + scriptData = scriptFile.read() + scriptFile.close() + + matchResult = re.search("(\w*)\((((?!\)).)+)\)", scriptData, re.DOTALL) + if matchResult is None: + raise PluginError( + 'Path "' + filepath + '" does not have any course define macros in it.' + ) + headerInfo = scriptData[: matchResult.start(0)] + defineMacros = stringToMacros(scriptData) + courses = [] + bonusCourses = [] + + for macro in defineMacros: + if macro[0] == "DEFINE_COURSE": + courses.append(macro) + elif macro[0] == "DEFINE_BONUS_COURSE": + bonusCourses.append(macro) + + return CourseDefines(headerInfo, courses, bonusCourses, scriptData) + def parseLevelDefines(filepath): - if not os.path.exists(filepath): - raise PluginError("Path \"" + filepath + '" does not exist, could not read level defines file.') - scriptFile = open(filepath, 'r', newline = '\n') - scriptData = scriptFile.read() - scriptFile.close() + if not os.path.exists(filepath): + raise PluginError( + 'Path "' + filepath + '" does not exist, could not read level defines file.' + ) + scriptFile = open(filepath, "r", newline="\n") + scriptData = scriptFile.read() + scriptFile.close() - matchResult = re.search('(\w*)\((((?!\)).)*)\)', scriptData, re.DOTALL) - if matchResult is None: - raise PluginError("Path \"" + filepath + '" does not have any level define macros in it.') - headerInfo = scriptData[:matchResult.start(0)] - defineMacros = stringToMacros(scriptData) + matchResult = re.search("(\w*)\((((?!\)).)*)\)", scriptData, re.DOTALL) + if matchResult is None: + raise PluginError( + 'Path "' + filepath + '" does not have any level define macros in it.' + ) + headerInfo = scriptData[: matchResult.start(0)] + defineMacros = stringToMacros(scriptData) + + return LevelDefines(headerInfo, defineMacros, scriptData) - return LevelDefines(headerInfo, defineMacros, scriptData) def parseZoomMasks(filepath): - if not os.path.exists(filepath): - raise PluginError("Path \"" + filepath + '" does not exist, could not read camera.c file.') - cameraFile = open(filepath, 'r', newline = '\n') - cameraData = cameraFile.read() - cameraFile.close() + if not os.path.exists(filepath): + raise PluginError( + 'Path "' + filepath + '" does not exist, could not read camera.c file.' + ) + cameraFile = open(filepath, "r", newline="\n") + cameraData = cameraFile.read() + cameraFile.close() + + matchResult = re.search( + "u8\s*sZoomOutAreaMasks\s*\[\]\s*=\s*\{" + "(((?!\}).)*)\}\s*;", + cameraData, + re.DOTALL, + ) - matchResult = re.search('u8\s*sZoomOutAreaMasks\s*\[\]\s*=\s*\{' +\ - '(((?!\}).)*)\}\s*;', cameraData, re.DOTALL) + if matchResult is None: + raise PluginError('Could not find sZoomOutAreaMasks in "' + filepath + '".') - if matchResult is None: - raise PluginError("Could not find sZoomOutAreaMasks in \"" + filepath + '".') + zoomMaskString = matchResult.group(1) + zoomMacros = stringToMacros(zoomMaskString) - zoomMaskString = matchResult.group(1) - zoomMacros = stringToMacros(zoomMaskString) + return ZoomOutMasks(zoomMacros, cameraData) - return ZoomOutMasks(zoomMacros, cameraData) def replaceSegmentLoad(levelscript, segmentName, command, changedSegment): - changedLoad = None - for segmentLoad in levelscript.segmentLoads: - segmentString = segmentLoad[1][0].lower() - segment = int(segmentString, 16 if 'x' in segmentString else 10) - if segmentLoad[0] == command and segment == changedSegment: - changedLoad = segmentLoad - if changedLoad is None: - changedLoad = [command, [hex(changedSegment), '', ''], ''] - levelscript.segmentLoads.append(changedLoad) - - changedLoad[1][1] = segmentName + 'SegmentRomStart' - changedLoad[1][2] = segmentName + 'SegmentRomEnd' + changedLoad = None + for segmentLoad in levelscript.segmentLoads: + segmentString = segmentLoad[1][0].lower() + segment = int(segmentString, 16 if "x" in segmentString else 10) + if segmentLoad[0] == command and segment == changedSegment: + changedLoad = segmentLoad + if changedLoad is None: + changedLoad = [command, [hex(changedSegment), "", ""], ""] + levelscript.segmentLoads.append(changedLoad) + + changedLoad[1][1] = segmentName + "SegmentRomStart" + changedLoad[1][2] = segmentName + "SegmentRomEnd" + def stringToMacros(data): - macroData = [] - for matchResult in re.finditer('(\w*)\((((?!\)).)*)\),?(((?!\n)\s)*\/\/((?!\n).)*)?', data): - macro = matchResult.group(1) - arguments = matchResult.group(2) - if matchResult.group(4) is not None: - comment = matchResult.group(4).strip() - else: - comment = '' - arguments = re.sub('\/\*(\*(?!\/)|[^*])*\*\/', '', arguments) - arguments = arguments.split(',') - for i in range(len(arguments)): - arguments[i] = arguments[i].strip() - - macroData.append([macro, arguments, comment]) - - return macroData + macroData = [] + for matchResult in re.finditer( + "(\w*)\((((?!\)).)*)\),?(((?!\n)\s)*\/\/((?!\n).)*)?", data + ): + macro = matchResult.group(1) + arguments = matchResult.group(2) + if matchResult.group(4) is not None: + comment = matchResult.group(4).strip() + else: + comment = "" + arguments = re.sub("\/\*(\*(?!\/)|[^*])*\*\/", "", arguments) + arguments = arguments.split(",") + for i in range(len(arguments)): + arguments[i] = arguments[i].strip() + + macroData.append([macro, arguments, comment]) + + return macroData -def macroToString(macroCmd, useComma): - result = macroCmd[0] + '(' - for arg in macroCmd[1]: - result += arg + ', ' - result = result[:-2] + ')' + (',' if useComma else '') - result += " " + macroCmd[2] - return result - -def macrosToString(macroCmds, useComma, tabDepth = 1): - result = '' - for macroCmd in macroCmds: - result += '\t' * tabDepth + macroToString(macroCmd, useComma) + '\n' - return result -def setStartLevel(basePath, levelEnum): - filepath = os.path.join(basePath, 'levels/menu/script.c') - data = getDataFromFile(filepath) +def macroToString(macroCmd, useComma): + result = macroCmd[0] + "(" + for arg in macroCmd[1]: + result += arg + ", " + result = result[:-2] + ")" + ("," if useComma else "") + result += " " + macroCmd[2] + return result - newData = re.sub('SET\_REG\((((?!\)).)*)\)', 'SET_REG(' + levelEnum + ')', data, count = 1) - if newData != data: - saveDataToFile(filepath, newData) +def macrosToString(macroCmds, useComma, tabDepth=1): + result = "" + for macroCmd in macroCmds: + result += "\t" * tabDepth + macroToString(macroCmd, useComma) + "\n" + return result -def addActSelectorIgnore(basePath, levelEnum): - filepath = os.path.join(basePath, 'src/game/level_update.c') - data = getDataFromFile(filepath) - checkResult = re.search('if\s*\(gCurrLevelNum\s*==\s*' + levelEnum + '\)\s*return\s*0;', data, re.DOTALL) - if checkResult is not None: - return +def setStartLevel(basePath, levelEnum): + filepath = os.path.join(basePath, "levels/menu/script.c") + data = getDataFromFile(filepath) - # This won't actually match whole function, but only up to first closing bracket. - # This should be okay though... ? - matchResultFunction = re.search('s32\s*lvl\_set\_current\_level\s*\((((?!\)).)*)\)\s*\{' +\ - '(((?!\}).)*)\}', data, re.DOTALL) + newData = re.sub( + "SET\_REG\((((?!\)).)*)\)", "SET_REG(" + levelEnum + ")", data, count=1 + ) + if newData != data: + saveDataToFile(filepath, newData) - if matchResultFunction is None: - raise PluginError("Could not find lvl_set_current_level in \"" + filepath + '".') - functionContents = matchResultFunction.group(3) +def addActSelectorIgnore(basePath, levelEnum): + filepath = os.path.join(basePath, "src/game/level_update.c") + data = getDataFromFile(filepath) + + checkResult = re.search( + "if\s*\(gCurrLevelNum\s*==\s*" + levelEnum + "\)\s*return\s*0;", data, re.DOTALL + ) + if checkResult is not None: + return + + # This won't actually match whole function, but only up to first closing bracket. + # This should be okay though... ? + matchResultFunction = re.search( + "s32\s*lvl\_set\_current\_level\s*\((((?!\)).)*)\)\s*\{" + "(((?!\}).)*)\}", + data, + re.DOTALL, + ) + + if matchResultFunction is None: + raise PluginError('Could not find lvl_set_current_level in "' + filepath + '".') + + functionContents = matchResultFunction.group(3) + + matchResult = re.search( + "gCurrCourseNum\s*\=\s*gLevelToCourseNumTable(((?!\;).)*)\;", + functionContents, + re.DOTALL, + ) + if matchResult is None: + raise PluginError( + 'Could not find gCurrCourseNum setting in lvl_set_current_level in "' + + filepath + + '".' + ) + + functionContents = ( + functionContents[: matchResult.end(0)] + + "\n\tif (gCurrLevelNum == " + + levelEnum + + ") return 0;" + + functionContents[matchResult.end(0) :] + ) + + newData = ( + data[: matchResultFunction.start(3)] + + functionContents + + data[matchResultFunction.end(3) :] + ) + + saveDataToFile(filepath, newData) - matchResult = re.search('gCurrCourseNum\s*\=\s*gLevelToCourseNumTable(((?!\;).)*)\;', functionContents, re.DOTALL) - if matchResult is None: - raise PluginError("Could not find gCurrCourseNum setting in lvl_set_current_level in \"" + filepath + '".') - functionContents = functionContents[:matchResult.end(0)] + \ - '\n\tif (gCurrLevelNum == ' + levelEnum + ') return 0;' +\ - functionContents[matchResult.end(0):] +def removeActSelectorIgnore(basePath, levelEnum): + filepath = os.path.join(basePath, "src/game/level_update.c") + data = getDataFromFile(filepath) - newData = data[:matchResultFunction.start(3)] + functionContents + data[matchResultFunction.end(3):] + newData = re.sub( + "if\s*\(gCurrLevelNum\s*\=\=\s*" + levelEnum + "\)\s*return\s*0\;\n", + "", + data, + re.DOTALL, + ) + if data != newData: + saveDataToFile(filepath, newData) - saveDataToFile(filepath, newData) -def removeActSelectorIgnore(basePath, levelEnum): - filepath = os.path.join(basePath, 'src/game/level_update.c') - data = getDataFromFile(filepath) +areaNumReg = re.compile(r".*AREA\(([0-9]+),.+\),") - newData = re.sub('if\s*\(gCurrLevelNum\s*\=\=\s*' + levelEnum + '\)\s*return\s*0\;\n', '', data, re.DOTALL) - if data != newData: - saveDataToFile(filepath, newData) -areaNumReg = re.compile(r'.*AREA\(([0-9]+),.+\),') def parseLevelPersistentBlocks(scriptData: str, levelScript: LevelScript): - curBlock: str = None - areaIndex: str = None - - for line in scriptData.splitlines(): - if curBlock and PersistentBlocks.endMagic in line: - endMatch = PersistentBlocks.endRegex.match(line) - if endMatch and endMatch.group(1) != curBlock: - raise PluginError(f'script.c: Non-matching end block ({endMatch.group(1)}) found for {curBlock}') - curBlock = None - areaIndex = None - continue - - areaIndexMatch = areaNumReg.match(line) - if areaIndexMatch: - areaIndex = areaIndexMatch.group(1) - - elif curBlock and curBlock == PersistentBlocks.areaCommands: - if areaIndex: - levelScript.persistentBlocks[curBlock][areaIndex].append(line) - else: - raise PluginError(f'script.c: "{PersistentBlocks.beginMagic} {PersistentBlocks.areaCommands}" found outside of area block') - - elif curBlock: - levelScript.persistentBlocks[curBlock].append(line) - - elif PersistentBlocks.beginMagic in line: - blockNameMatch = PersistentBlocks.beginRegex.match(line) - if curBlock and blockNameMatch: - raise PluginError(f'script.c: Found new persistent block ({blockNameMatch.group(1)}) while looking for an end block for {curBlock}') - elif blockNameMatch: - curBlock = blockNameMatch.group(1) - - if curBlock: - raise PluginError(f'script.c: "{PersistentBlocks.beginMagic} {curBlock}" never found a "{PersistentBlocks.endMagic}"') + curBlock: str = None + areaIndex: str = None + + for line in scriptData.splitlines(): + if curBlock and PersistentBlocks.endMagic in line: + endMatch = PersistentBlocks.endRegex.match(line) + if endMatch and endMatch.group(1) != curBlock: + raise PluginError( + f"script.c: Non-matching end block ({endMatch.group(1)}) found for {curBlock}" + ) + curBlock = None + areaIndex = None + continue + + areaIndexMatch = areaNumReg.match(line) + if areaIndexMatch: + areaIndex = areaIndexMatch.group(1) + + elif curBlock and curBlock == PersistentBlocks.areaCommands: + if areaIndex: + levelScript.persistentBlocks[curBlock][areaIndex].append(line) + else: + raise PluginError( + f'script.c: "{PersistentBlocks.beginMagic} {PersistentBlocks.areaCommands}" found outside of area block' + ) + + elif curBlock: + levelScript.persistentBlocks[curBlock].append(line) + + elif PersistentBlocks.beginMagic in line: + blockNameMatch = PersistentBlocks.beginRegex.match(line) + if curBlock and blockNameMatch: + raise PluginError( + f"script.c: Found new persistent block ({blockNameMatch.group(1)}) while looking for an end block for {curBlock}" + ) + elif blockNameMatch: + curBlock = blockNameMatch.group(1) + + if curBlock: + raise PluginError( + f'script.c: "{PersistentBlocks.beginMagic} {curBlock}" never found a "{PersistentBlocks.endMagic}"' + ) def parseLevelScript(filepath, levelName): - scriptPath = os.path.join(filepath, 'script.c') - scriptData = getDataFromFile(scriptPath) - - levelscript = LevelScript(levelName) - - for matchResult in re.finditer('#include\s*"actors/(\w*)\.h"', scriptData): - levelscript.actorIncludes.append(matchResult.group(0)) - - matchResult = re.search('const\s*LevelScript\s*level\_\w*\_entry\[\]\s*=\s*\{' +\ - '(((?!\}).)*)\}\s*;', scriptData, re.DOTALL) - - if matchResult is None: - raise PluginError("Could not find entry levelscript in \"" + scriptPath + '".') - - scriptContents = matchResult.group(1) - - macroData = stringToMacros(scriptContents) - inArea = False - for macroCmd in macroData: - if not inArea: - if macroCmd[0] == 'LOAD_MIO0' or \ - macroCmd[0] == 'LOAD_MIO0_TEXTURE' or \ - macroCmd[0] == 'LOAD_YAY0' or \ - macroCmd[0] == 'LOAD_YAY0_TEXTURE' or \ - macroCmd[0] == 'LOAD_RAW': - levelscript.segmentLoads.append(macroCmd) - elif macroCmd[0] == 'JUMP_LINK': - levelscript.levelFunctions.append(macroCmd) - elif macroCmd[0] == 'LOAD_MODEL_FROM_GEO': - levelscript.modelLoads.append(macroCmd) - elif macroCmd[0] == 'MARIO': - levelscript.mario = macroToString(macroCmd, True) - - if macroCmd[0] == 'AREA': - inArea = True - elif macroCmd[0] == 'END_AREA': - inArea = False - - parseLevelPersistentBlocks(scriptData, levelscript) - return levelscript + scriptPath = os.path.join(filepath, "script.c") + scriptData = getDataFromFile(scriptPath) + + levelscript = LevelScript(levelName) + + for matchResult in re.finditer('#include\s*"actors/(\w*)\.h"', scriptData): + levelscript.actorIncludes.append(matchResult.group(0)) + + matchResult = re.search( + "const\s*LevelScript\s*level\_\w*\_entry\[\]\s*=\s*\{" + "(((?!\}).)*)\}\s*;", + scriptData, + re.DOTALL, + ) + + if matchResult is None: + raise PluginError('Could not find entry levelscript in "' + scriptPath + '".') + + scriptContents = matchResult.group(1) + + macroData = stringToMacros(scriptContents) + inArea = False + for macroCmd in macroData: + if not inArea: + if ( + macroCmd[0] == "LOAD_MIO0" + or macroCmd[0] == "LOAD_MIO0_TEXTURE" + or macroCmd[0] == "LOAD_YAY0" + or macroCmd[0] == "LOAD_YAY0_TEXTURE" + or macroCmd[0] == "LOAD_RAW" + ): + levelscript.segmentLoads.append(macroCmd) + elif macroCmd[0] == "JUMP_LINK": + levelscript.levelFunctions.append(macroCmd) + elif macroCmd[0] == "LOAD_MODEL_FROM_GEO": + levelscript.modelLoads.append(macroCmd) + elif macroCmd[0] == "MARIO": + levelscript.mario = macroToString(macroCmd, True) + + if macroCmd[0] == "AREA": + inArea = True + elif macroCmd[0] == "END_AREA": + inArea = False + + parseLevelPersistentBlocks(scriptData, levelscript) + return levelscript + def overwritePuppycamData(filePath, levelToReplace, newPuppycamTriggers): - # Splits the file into what's before, inside, and after the array - arrayEntiresRegex = '(.+struct\s+newcam_hardpos\s+newcam_fixedcam\[\]\s+=\s+{)(.+)(\};)' - # Splits the individual entries in the array apart - structEntry = '(.+?\{.+?\}.+?\n)' - - if os.path.exists(filePath): - dataFile = open(filePath, 'r') - data = dataFile.read() - dataFile.close() - - matchResult = re.search(arrayEntiresRegex, data, re.DOTALL) - - if matchResult: - data = '' - entriesString = matchResult.group(2) - - # Iterate through each existing entry, getting rid of any that are in the level we're importing to. - entriesList = re.findall(structEntry, entriesString, re.DOTALL) - for entry in entriesList: - if re.search('(\{\s?' + levelToReplace + '\s?,)', re.sub('(/\*.+?\*/)|(//.+?\n)', '', entry), re.DOTALL) is None: - data += entry - - # Add the new entries from this export, then put the file back together again. - data += '\n\n' + newPuppycamTriggers - data = matchResult.group(1) + data + '\n' + matchResult.group(3) - else: - raise PluginError("Could not find 'struct newcam_hardpos newcam_fixedcam[]'.") - - dataFile = open(filePath, 'w', newline='\n') - dataFile.write(data) - dataFile.close() - else: - raise PluginError(filePath + " does not exist.") + # Splits the file into what's before, inside, and after the array + arrayEntiresRegex = ( + "(.+struct\s+newcam_hardpos\s+newcam_fixedcam\[\]\s+=\s+{)(.+)(\};)" + ) + # Splits the individual entries in the array apart + structEntry = "(.+?\{.+?\}.+?\n)" + + if os.path.exists(filePath): + dataFile = open(filePath, "r") + data = dataFile.read() + dataFile.close() + + matchResult = re.search(arrayEntiresRegex, data, re.DOTALL) + + if matchResult: + data = "" + entriesString = matchResult.group(2) + + # Iterate through each existing entry, getting rid of any that are in the level we're importing to. + entriesList = re.findall(structEntry, entriesString, re.DOTALL) + for entry in entriesList: + if ( + re.search( + "(\{\s?" + levelToReplace + "\s?,)", + re.sub("(/\*.+?\*/)|(//.+?\n)", "", entry), + re.DOTALL, + ) + is None + ): + data += entry + + # Add the new entries from this export, then put the file back together again. + data += "\n\n" + newPuppycamTriggers + data = matchResult.group(1) + data + "\n" + matchResult.group(3) + else: + raise PluginError( + "Could not find 'struct newcam_hardpos newcam_fixedcam[]'." + ) + + dataFile = open(filePath, "w", newline="\n") + dataFile.write(data) + dataFile.close() + else: + raise PluginError(filePath + " does not exist.") + class SM64OptionalFileStatus: - def __init__(self): - self.cameraC = False - self.starSelectC = False - -def exportLevelC(obj, transformMatrix, f3dType, isHWv1, levelName, exportDir, - savePNG, customExport, levelCameraVolumeName, DLFormat): - - fileStatus = SM64OptionalFileStatus() - - if customExport: - levelDir = os.path.join(exportDir, levelName) - else: - levelDir = os.path.join(exportDir, 'levels/' + levelName) - - if customExport or not os.path.exists(os.path.join(levelDir, 'script.c')): - prevLevelScript = LevelScript(levelName) - else: - prevLevelScript = parseLevelScript(levelDir, levelName) - - if not os.path.exists(levelDir): - os.mkdir(levelDir) - areaDict = {} - - geoString = '' - levelDataString = '' - headerString = '' - areaString = '' - cameraVolumeString = "struct CameraTrigger " + levelCameraVolumeName + "[] = {\n" - puppycamVolumeString = '' - - fModel = SM64Model(f3dType, isHWv1, levelName + '_dl', DLFormat) - childAreas = [child for child in obj.children if child.data is None and child.sm64_obj_type == 'Area Root'] - if len(childAreas) == 0: - raise PluginError("The level root has no child empties with the 'Area Root' object type.") - - usesEnvFX = False - echoLevels = ['0x00', '0x00', '0x00'] - zoomFlags = [False, False, False, False] - - if bpy.context.scene.exportHiddenGeometry: - hiddenObjs = unhideAllAndGetHiddenList(bpy.context.scene) - - for child in childAreas: - if len(child.children) == 0: - raise PluginError("Area for " + child.name + " has no children.") - if child.areaIndex in areaDict: - raise PluginError(child.name + " shares the same area index as " + areaDict[child.areaIndex].name) - #if child.areaCamera is None: - # raise PluginError(child.name + ' does not have an area camera set.') - #setOrigin(obj, child) - areaDict[child.areaIndex] = child - - areaIndex = child.areaIndex - areaName = 'area_' + str(areaIndex) - areaDir = os.path.join(levelDir, areaName) - if not os.path.exists(areaDir): - os.mkdir(areaDir) - - envOption = child.envOption if child.envOption != 'Custom' else child.envType - usesEnvFX |= envOption != 'ENVFX_MODE_NONE' - - if child.areaIndex == 1 or child.areaIndex == 2 or child.areaIndex == 3: - echoLevels[child.areaIndex - 1] = child.echoLevel - if child.areaIndex == 1 or child.areaIndex == 2 or child.areaIndex == 3 or child.areaIndex == 4: - zoomFlags[child.areaIndex - 1] = child.zoomOutOnPause - - # Needs to be done BEFORE collision parsing - setRooms(child) - - geolayoutGraph, fModel = \ - convertObjectToGeolayout(obj, transformMatrix, - f3dType, isHWv1, child.areaCamera, levelName + '_' + areaName, fModel, child, DLFormat, not savePNG) - geolayoutGraphC = geolayoutGraph.to_c() - - # Write geolayout - geoFile = open(os.path.join(areaDir, 'geo.inc.c'), 'w', newline = '\n') - geoFile.write(geolayoutGraphC.source) - geoFile.close() - geoString += '#include "levels/' + levelName + '/' + areaName + '/geo.inc.c"\n' - headerString += geolayoutGraphC.header - - # Write collision - collision = exportCollisionCommon(child, transformMatrix, True, True, - levelName + '_' + areaName, child.areaIndex) - collisionC = collision.to_c() - colFile = open(os.path.join(areaDir, 'collision.inc.c'), 'w', newline = '\n') - colFile.write(collisionC.source) - colFile.close() - levelDataString += '#include "levels/' + levelName + '/' + areaName + '/collision.inc.c"\n' - headerString += collisionC.header - - # Write rooms - if child.enableRoomSwitch: - roomsC = collision.to_c_rooms() - roomFile = open(os.path.join(areaDir, 'room.inc.c'), 'w', newline = '\n') - roomFile.write(roomsC.source) - roomFile.close() - levelDataString += '#include "levels/' + levelName + '/' + areaName + '/room.inc.c"\n' - headerString += roomsC.header - - # Get area - area = exportAreaCommon(child, transformMatrix, - geolayoutGraph.startGeolayout, collision, levelName + '_' + areaName) - if area.mario_start is not None: - prevLevelScript.marioStart = area.mario_start - persistentBlockString = prevLevelScript.get_persistent_block(PersistentBlocks.areaCommands, nTabs=2, areaIndex=str(area.index)) - areaString += area.to_c_script( - child.enableRoomSwitch, - persistentBlockString=persistentBlockString - ) - cameraVolumeString += area.to_c_camera_volumes() - puppycamVolumeString += area.to_c_puppycam_volumes() - - # Write macros - macroFile = open(os.path.join(areaDir, 'macro.inc.c'), 'w', newline = '\n') - macrosC = area.to_c_macros() - macroFile.write(macrosC.source) - macroFile.close() - levelDataString += '#include "levels/' + levelName + '/' + areaName + '/macro.inc.c"\n' - headerString += macrosC.header - - # Write splines - splineFile = open(os.path.join(areaDir, 'spline.inc.c'), 'w', newline = '\n') - splinesC = area.to_c_splines() - splineFile.write(splinesC.source) - splineFile.close() - levelDataString += '#include "levels/' + levelName + '/' + areaName + '/spline.inc.c"\n' - headerString += splinesC.header - - cameraVolumeString += '\tNULL_TRIGGER\n};' - - # Generate levelscript string - compressionFmt = bpy.context.scene.compressionFormat - replaceSegmentLoad(prevLevelScript, - '_' + levelName + '_segment_7', 'LOAD_' + compressionFmt.upper(), 0x07) - if usesEnvFX: - replaceSegmentLoad(prevLevelScript, - '_effect_' + compressionFmt, 'LOAD_' + compressionFmt.upper(), 0x0B) - if not obj.useBackgroundColor: - segment = '' - if obj.background == 'CUSTOM': - segment = obj.fast64.sm64.level.backgroundSegment - else: - segment = backgroundSegments[obj.background] + '_skybox' - - replaceSegmentLoad(prevLevelScript, - '_' + segment + '_' + compressionFmt, 'LOAD_' + compressionFmt.upper(), 0x0A) - levelscriptString = prevLevelScript.to_c(areaString) - - if bpy.context.scene.exportHiddenGeometry: - hideObjsInList(hiddenObjs) - - # Remove old areas. - for f in os.listdir(levelDir): - if re.search('area\_\d+', f): - existingArea = False - for index, areaObj in areaDict.items(): - if f == 'area_' + str(index): - existingArea = True - if not existingArea: - shutil.rmtree(os.path.join(levelDir, f)) - - gfxFormatter = SM64GfxFormatter(ScrollMethod.Vertex) - exportData = fModel.to_c(TextureExportSettings(savePNG, savePNG, 'levels/' + levelName, levelDir), gfxFormatter) - staticData = exportData.staticData - dynamicData = exportData.dynamicData - texC = exportData.textureData - - scrollData, hasScrolling = fModel.to_c_vertex_scroll(levelName, gfxFormatter) - scroll_data = scrollData.source - headerScroll = scrollData.header - - if fModel.texturesSavedLastExport > 0: - levelDataString = '#include "levels/' + levelName + '/texture_include.inc.c"\n' + levelDataString - texPath = os.path.join(levelDir, 'texture_include.inc.c') - texFile = open(texPath, 'w', newline='\n') - texFile.write(texC.source) - texFile.close() - - modifyTexScrollFiles(exportDir, levelDir, headerScroll, scroll_data, hasScrolling) - - # Write materials - if DLFormat == DLFormat.Static: - staticData.append(dynamicData) - else: - geoString = writeMaterialFiles(exportDir, levelDir, - '#include "levels/' + levelName + '/header.h"', - '#include "levels/' + levelName + '/material.inc.h"', - dynamicData.header, dynamicData.source, geoString, customExport) - - modelPath = os.path.join(levelDir, 'model.inc.c') - modelFile = open(modelPath, 'w', newline='\n') - modelFile.write(staticData.source) - modelFile.close() - - fModel.freePalettes() - - levelDataString += '#include "levels/' + levelName + '/model.inc.c"\n' - headerString += staticData.header - #headerString += '\nextern const LevelScript level_' + levelName + '_entry[];\n' - #headerString += '\n#endif\n' - - # Write geolayout - geoFile = open(os.path.join(levelDir, 'geo.inc.c'), 'w', newline='\n') - geoFile.write(geoString) - geoFile.close() - - levelDataFile = open(os.path.join(levelDir, 'leveldata.inc.c'), 'w', newline='\n') - levelDataFile.write(levelDataString) - levelDataFile.close() - - headerFile = open(os.path.join(levelDir, 'header.inc.h'), 'w', newline='\n') - headerFile.write(headerString) - headerFile.close() - - scriptFile = open(os.path.join(levelDir, 'script.c'), 'w', newline = '\n') - scriptFile.write(levelscriptString) - scriptFile.close() - - if customExport: - cameraVolumeString = '// Replace the level specific camera volume struct in src/game/camera.c with this.\n' +\ - '// Make sure to also add the struct name to the LEVEL_DEFINE in levels/level_defines.h.\n' +\ - cameraVolumeString - cameraFile = open(os.path.join(levelDir, 'camera_trigger.inc.c'), 'w', newline='\n') - cameraFile.write(cameraVolumeString) - cameraFile.close() - - hasPuppyCamData = puppycamVolumeString != "" - puppycamVolumeString = '// Put these structs into the newcam_fixedcam[] array in enhancements/puppycam_angles.inc.c. \n' +\ - puppycamVolumeString - - if hasPuppyCamData: - cameraFile = open(os.path.join(levelDir, 'puppycam_trigger.inc.c'), 'w', newline='\n') - cameraFile.write(puppycamVolumeString) - cameraFile.close() - - if not customExport: - if DLFormat != DLFormat.Static: - # Write material headers - writeMaterialHeaders(exportDir, - '#include "levels/' + levelName + '/material.inc.c"', - '#include "levels/' + levelName + '/material.inc.h"') - - # Export camera triggers - cameraPath = os.path.join(exportDir, 'src/game/camera.c') - if os.path.exists(cameraPath): - overwriteData('struct\s*CameraTrigger\s*', levelCameraVolumeName, cameraVolumeString, cameraPath, - 'struct CameraTrigger *sCameraTriggers', False) - fileStatus.cameraC = True - - # Export puppycam triggers - # If this isn't an ultrapuppycam repo, don't try and export ultrapuppycam triggers - puppycamAnglesPath = os.path.join(exportDir, 'enhancements/puppycam_angles.inc.c') - if os.path.exists(puppycamAnglesPath) and puppycamVolumeString != "": - overwritePuppycamData(puppycamAnglesPath, levelIDNames[levelName], puppycamVolumeString) - - levelHeadersPath = os.path.join(exportDir, 'levels/level_headers.h.in') - levelDefinesPath = os.path.join(exportDir, 'levels/level_defines.h') - levelDefines = parseLevelDefines(levelDefinesPath) - levelDefineMacro = levelDefines.getOrMakeMacroByLevelName(levelName) - levelIndex = levelDefines.defineMacros.index(levelDefineMacro) - levelEnum = levelDefineMacro[1][levelDefineArgs['level enum']] - - levelDefineMacro[1][levelDefineArgs['camera table']] = levelCameraVolumeName - levelDefineMacro[1][levelDefineArgs['acoustic reach']] = obj.acousticReach - levelDefineMacro[1][levelDefineArgs['echo level 1']] = echoLevels[0] - levelDefineMacro[1][levelDefineArgs['echo level 2']] = echoLevels[1] - levelDefineMacro[1][levelDefineArgs['echo level 3']] = echoLevels[2] - - levelDefines.write(levelDefinesPath, levelHeadersPath) - - courseDefinesPath = os.path.join(exportDir, 'levels/course_defines.h') - courseDefines = parseCourseDefines(courseDefinesPath) - courseEnum = levelDefineMacro[1][levelDefineArgs['course name']] - courseMacro = courseDefines.getOrMakeMacroByCourseName(courseEnum, False) - courseMacro[1][1] = obj.starGetCutscenes.value() - courseDefines.write(courseDefinesPath) - - if os.path.exists(cameraPath): - zoomMasks = parseZoomMasks(cameraPath) - zoomMasks.updateMaskCount(len(levelDefines.defineMacros)) - zoomMasks.setMask(levelIndex, zoomFlags) - zoomMasks.write(cameraPath) - - if obj.actSelectorIgnore: - addActSelectorIgnore(exportDir, levelEnum) - else: - removeActSelectorIgnore(exportDir, levelEnum) - - if obj.setAsStartLevel: - setStartLevel(exportDir, levelEnum) - - geoPath = os.path.join(levelDir, 'geo.c') - levelDataPath = os.path.join(levelDir, 'leveldata.c') - headerPath = os.path.join(levelDir, 'header.h') - - # Create files if not already existing - if not os.path.exists(geoPath): - createGeoFile(levelName, geoPath) - if not os.path.exists(levelDataPath): - createLevelDataFile(levelName, levelDataPath) - if not os.path.exists(headerPath): - createHeaderFile(levelName, headerPath) - - # Write level data - writeIfNotFound(geoPath, '\n#include "levels/' + levelName + '/geo.inc.c"\n', '') - writeIfNotFound(levelDataPath, '\n#include "levels/' + levelName + '/leveldata.inc.c"\n', '') - writeIfNotFound(headerPath, '\n#include "levels/' + levelName + '/header.inc.h"\n', '#endif') - - if fModel.texturesSavedLastExport == 0: - textureIncludePath = os.path.join(levelDir, 'texture_include.inc.c') - if os.path.exists(textureIncludePath): - os.remove(textureIncludePath) - # This one is for backwards compatibility purposes - deleteIfFound(os.path.join(levelDir, 'texture.inc.c'), - '#include "levels/' + levelName + '/texture_include.inc.c"') - - # This one is for backwards compatibility purposes - deleteIfFound(levelDataPath, - '#include "levels/' + levelName + '/texture_include.inc.c"') - - texscrollIncludeC = '#include "levels/' + levelName + '/texscroll.inc.c"' - texscrollIncludeH = '#include "levels/' + levelName + '/texscroll.inc.h"' - texscrollGroup = levelName - texscrollGroupInclude = '#include "levels/' + levelName + '/header.h"' - - texScrollFileStatus = modifyTexScrollHeadersGroup(exportDir, texscrollIncludeC, texscrollIncludeH, - texscrollGroup, headerScroll, texscrollGroupInclude, hasScrolling) - - if texScrollFileStatus is not None: - fileStatus.starSelectC = texScrollFileStatus.starSelectC - - return fileStatus + def __init__(self): + self.cameraC = False + self.starSelectC = False + + +def exportLevelC( + obj, + transformMatrix, + f3dType, + isHWv1, + levelName, + exportDir, + savePNG, + customExport, + levelCameraVolumeName, + DLFormat, +): + + fileStatus = SM64OptionalFileStatus() + + if customExport: + levelDir = os.path.join(exportDir, levelName) + else: + levelDir = os.path.join(exportDir, "levels/" + levelName) + + if customExport or not os.path.exists(os.path.join(levelDir, "script.c")): + prevLevelScript = LevelScript(levelName) + else: + prevLevelScript = parseLevelScript(levelDir, levelName) + + if not os.path.exists(levelDir): + os.mkdir(levelDir) + areaDict = {} + + geoString = "" + levelDataString = "" + headerString = "" + areaString = "" + cameraVolumeString = "struct CameraTrigger " + levelCameraVolumeName + "[] = {\n" + puppycamVolumeString = "" + + fModel = SM64Model(f3dType, isHWv1, levelName + "_dl", DLFormat) + childAreas = [ + child + for child in obj.children + if child.data is None and child.sm64_obj_type == "Area Root" + ] + if len(childAreas) == 0: + raise PluginError( + "The level root has no child empties with the 'Area Root' object type." + ) + + usesEnvFX = False + echoLevels = ["0x00", "0x00", "0x00"] + zoomFlags = [False, False, False, False] + + if bpy.context.scene.exportHiddenGeometry: + hiddenObjs = unhideAllAndGetHiddenList(bpy.context.scene) + + for child in childAreas: + if len(child.children) == 0: + raise PluginError("Area for " + child.name + " has no children.") + if child.areaIndex in areaDict: + raise PluginError( + child.name + + " shares the same area index as " + + areaDict[child.areaIndex].name + ) + # if child.areaCamera is None: + # raise PluginError(child.name + ' does not have an area camera set.') + # setOrigin(obj, child) + areaDict[child.areaIndex] = child + + areaIndex = child.areaIndex + areaName = "area_" + str(areaIndex) + areaDir = os.path.join(levelDir, areaName) + if not os.path.exists(areaDir): + os.mkdir(areaDir) + + envOption = child.envOption if child.envOption != "Custom" else child.envType + usesEnvFX |= envOption != "ENVFX_MODE_NONE" + + if child.areaIndex == 1 or child.areaIndex == 2 or child.areaIndex == 3: + echoLevels[child.areaIndex - 1] = child.echoLevel + if ( + child.areaIndex == 1 + or child.areaIndex == 2 + or child.areaIndex == 3 + or child.areaIndex == 4 + ): + zoomFlags[child.areaIndex - 1] = child.zoomOutOnPause + + # Needs to be done BEFORE collision parsing + setRooms(child) + + geolayoutGraph, fModel = convertObjectToGeolayout( + obj, + transformMatrix, + f3dType, + isHWv1, + child.areaCamera, + levelName + "_" + areaName, + fModel, + child, + DLFormat, + not savePNG, + ) + geolayoutGraphC = geolayoutGraph.to_c() + + # Write geolayout + geoFile = open(os.path.join(areaDir, "geo.inc.c"), "w", newline="\n") + geoFile.write(geolayoutGraphC.source) + geoFile.close() + geoString += '#include "levels/' + levelName + "/" + areaName + '/geo.inc.c"\n' + headerString += geolayoutGraphC.header + + # Write collision + collision = exportCollisionCommon( + child, + transformMatrix, + True, + True, + levelName + "_" + areaName, + child.areaIndex, + ) + collisionC = collision.to_c() + colFile = open(os.path.join(areaDir, "collision.inc.c"), "w", newline="\n") + colFile.write(collisionC.source) + colFile.close() + levelDataString += ( + '#include "levels/' + levelName + "/" + areaName + '/collision.inc.c"\n' + ) + headerString += collisionC.header + + # Write rooms + if child.enableRoomSwitch: + roomsC = collision.to_c_rooms() + roomFile = open(os.path.join(areaDir, "room.inc.c"), "w", newline="\n") + roomFile.write(roomsC.source) + roomFile.close() + levelDataString += ( + '#include "levels/' + levelName + "/" + areaName + '/room.inc.c"\n' + ) + headerString += roomsC.header + + # Get area + area = exportAreaCommon( + child, + transformMatrix, + geolayoutGraph.startGeolayout, + collision, + levelName + "_" + areaName, + ) + if area.mario_start is not None: + prevLevelScript.marioStart = area.mario_start + persistentBlockString = prevLevelScript.get_persistent_block( + PersistentBlocks.areaCommands, nTabs=2, areaIndex=str(area.index) + ) + areaString += area.to_c_script( + child.enableRoomSwitch, persistentBlockString=persistentBlockString + ) + cameraVolumeString += area.to_c_camera_volumes() + puppycamVolumeString += area.to_c_puppycam_volumes() + + # Write macros + macroFile = open(os.path.join(areaDir, "macro.inc.c"), "w", newline="\n") + macrosC = area.to_c_macros() + macroFile.write(macrosC.source) + macroFile.close() + levelDataString += ( + '#include "levels/' + levelName + "/" + areaName + '/macro.inc.c"\n' + ) + headerString += macrosC.header + + # Write splines + splineFile = open(os.path.join(areaDir, "spline.inc.c"), "w", newline="\n") + splinesC = area.to_c_splines() + splineFile.write(splinesC.source) + splineFile.close() + levelDataString += ( + '#include "levels/' + levelName + "/" + areaName + '/spline.inc.c"\n' + ) + headerString += splinesC.header + + cameraVolumeString += "\tNULL_TRIGGER\n};" + + # Generate levelscript string + compressionFmt = bpy.context.scene.compressionFormat + replaceSegmentLoad( + prevLevelScript, + "_" + levelName + "_segment_7", + "LOAD_" + compressionFmt.upper(), + 0x07, + ) + if usesEnvFX: + replaceSegmentLoad( + prevLevelScript, + "_effect_" + compressionFmt, + "LOAD_" + compressionFmt.upper(), + 0x0B, + ) + if not obj.useBackgroundColor: + segment = "" + if obj.background == "CUSTOM": + segment = obj.fast64.sm64.level.backgroundSegment + else: + segment = backgroundSegments[obj.background] + "_skybox" + + replaceSegmentLoad( + prevLevelScript, + "_" + segment + "_" + compressionFmt, + "LOAD_" + compressionFmt.upper(), + 0x0A, + ) + levelscriptString = prevLevelScript.to_c(areaString) + + if bpy.context.scene.exportHiddenGeometry: + hideObjsInList(hiddenObjs) + + # Remove old areas. + for f in os.listdir(levelDir): + if re.search("area\_\d+", f): + existingArea = False + for index, areaObj in areaDict.items(): + if f == "area_" + str(index): + existingArea = True + if not existingArea: + shutil.rmtree(os.path.join(levelDir, f)) + + gfxFormatter = SM64GfxFormatter(ScrollMethod.Vertex) + exportData = fModel.to_c( + TextureExportSettings(savePNG, savePNG, "levels/" + levelName, levelDir), + gfxFormatter, + ) + staticData = exportData.staticData + dynamicData = exportData.dynamicData + texC = exportData.textureData + + scrollData, hasScrolling = fModel.to_c_vertex_scroll(levelName, gfxFormatter) + scroll_data = scrollData.source + headerScroll = scrollData.header + + if fModel.texturesSavedLastExport > 0: + levelDataString = ( + '#include "levels/' + + levelName + + '/texture_include.inc.c"\n' + + levelDataString + ) + texPath = os.path.join(levelDir, "texture_include.inc.c") + texFile = open(texPath, "w", newline="\n") + texFile.write(texC.source) + texFile.close() + + modifyTexScrollFiles(exportDir, levelDir, headerScroll, scroll_data, hasScrolling) + + # Write materials + if DLFormat == DLFormat.Static: + staticData.append(dynamicData) + else: + geoString = writeMaterialFiles( + exportDir, + levelDir, + '#include "levels/' + levelName + '/header.h"', + '#include "levels/' + levelName + '/material.inc.h"', + dynamicData.header, + dynamicData.source, + geoString, + customExport, + ) + + modelPath = os.path.join(levelDir, "model.inc.c") + modelFile = open(modelPath, "w", newline="\n") + modelFile.write(staticData.source) + modelFile.close() + + fModel.freePalettes() + + levelDataString += '#include "levels/' + levelName + '/model.inc.c"\n' + headerString += staticData.header + # headerString += '\nextern const LevelScript level_' + levelName + '_entry[];\n' + # headerString += '\n#endif\n' + + # Write geolayout + geoFile = open(os.path.join(levelDir, "geo.inc.c"), "w", newline="\n") + geoFile.write(geoString) + geoFile.close() + + levelDataFile = open(os.path.join(levelDir, "leveldata.inc.c"), "w", newline="\n") + levelDataFile.write(levelDataString) + levelDataFile.close() + + headerFile = open(os.path.join(levelDir, "header.inc.h"), "w", newline="\n") + headerFile.write(headerString) + headerFile.close() + + scriptFile = open(os.path.join(levelDir, "script.c"), "w", newline="\n") + scriptFile.write(levelscriptString) + scriptFile.close() + + if customExport: + cameraVolumeString = ( + "// Replace the level specific camera volume struct in src/game/camera.c with this.\n" + + "// Make sure to also add the struct name to the LEVEL_DEFINE in levels/level_defines.h.\n" + + cameraVolumeString + ) + cameraFile = open( + os.path.join(levelDir, "camera_trigger.inc.c"), "w", newline="\n" + ) + cameraFile.write(cameraVolumeString) + cameraFile.close() + + hasPuppyCamData = puppycamVolumeString != "" + puppycamVolumeString = ( + "// Put these structs into the newcam_fixedcam[] array in enhancements/puppycam_angles.inc.c. \n" + + puppycamVolumeString + ) + + if hasPuppyCamData: + cameraFile = open( + os.path.join(levelDir, "puppycam_trigger.inc.c"), "w", newline="\n" + ) + cameraFile.write(puppycamVolumeString) + cameraFile.close() + + if not customExport: + if DLFormat != DLFormat.Static: + # Write material headers + writeMaterialHeaders( + exportDir, + '#include "levels/' + levelName + '/material.inc.c"', + '#include "levels/' + levelName + '/material.inc.h"', + ) + + # Export camera triggers + cameraPath = os.path.join(exportDir, "src/game/camera.c") + if os.path.exists(cameraPath): + overwriteData( + "struct\s*CameraTrigger\s*", + levelCameraVolumeName, + cameraVolumeString, + cameraPath, + "struct CameraTrigger *sCameraTriggers", + False, + ) + fileStatus.cameraC = True + + # Export puppycam triggers + # If this isn't an ultrapuppycam repo, don't try and export ultrapuppycam triggers + puppycamAnglesPath = os.path.join( + exportDir, "enhancements/puppycam_angles.inc.c" + ) + if os.path.exists(puppycamAnglesPath) and puppycamVolumeString != "": + overwritePuppycamData( + puppycamAnglesPath, levelIDNames[levelName], puppycamVolumeString + ) + + levelHeadersPath = os.path.join(exportDir, "levels/level_headers.h.in") + levelDefinesPath = os.path.join(exportDir, "levels/level_defines.h") + levelDefines = parseLevelDefines(levelDefinesPath) + levelDefineMacro = levelDefines.getOrMakeMacroByLevelName(levelName) + levelIndex = levelDefines.defineMacros.index(levelDefineMacro) + levelEnum = levelDefineMacro[1][levelDefineArgs["level enum"]] + + levelDefineMacro[1][levelDefineArgs["camera table"]] = levelCameraVolumeName + levelDefineMacro[1][levelDefineArgs["acoustic reach"]] = obj.acousticReach + levelDefineMacro[1][levelDefineArgs["echo level 1"]] = echoLevels[0] + levelDefineMacro[1][levelDefineArgs["echo level 2"]] = echoLevels[1] + levelDefineMacro[1][levelDefineArgs["echo level 3"]] = echoLevels[2] + + levelDefines.write(levelDefinesPath, levelHeadersPath) + + courseDefinesPath = os.path.join(exportDir, "levels/course_defines.h") + courseDefines = parseCourseDefines(courseDefinesPath) + courseEnum = levelDefineMacro[1][levelDefineArgs["course name"]] + courseMacro = courseDefines.getOrMakeMacroByCourseName(courseEnum, False) + courseMacro[1][1] = obj.starGetCutscenes.value() + courseDefines.write(courseDefinesPath) + + if os.path.exists(cameraPath): + zoomMasks = parseZoomMasks(cameraPath) + zoomMasks.updateMaskCount(len(levelDefines.defineMacros)) + zoomMasks.setMask(levelIndex, zoomFlags) + zoomMasks.write(cameraPath) + + if obj.actSelectorIgnore: + addActSelectorIgnore(exportDir, levelEnum) + else: + removeActSelectorIgnore(exportDir, levelEnum) + + if obj.setAsStartLevel: + setStartLevel(exportDir, levelEnum) + + geoPath = os.path.join(levelDir, "geo.c") + levelDataPath = os.path.join(levelDir, "leveldata.c") + headerPath = os.path.join(levelDir, "header.h") + + # Create files if not already existing + if not os.path.exists(geoPath): + createGeoFile(levelName, geoPath) + if not os.path.exists(levelDataPath): + createLevelDataFile(levelName, levelDataPath) + if not os.path.exists(headerPath): + createHeaderFile(levelName, headerPath) + + # Write level data + writeIfNotFound( + geoPath, '\n#include "levels/' + levelName + '/geo.inc.c"\n', "" + ) + writeIfNotFound( + levelDataPath, '\n#include "levels/' + levelName + '/leveldata.inc.c"\n', "" + ) + writeIfNotFound( + headerPath, '\n#include "levels/' + levelName + '/header.inc.h"\n', "#endif" + ) + + if fModel.texturesSavedLastExport == 0: + textureIncludePath = os.path.join(levelDir, "texture_include.inc.c") + if os.path.exists(textureIncludePath): + os.remove(textureIncludePath) + # This one is for backwards compatibility purposes + deleteIfFound( + os.path.join(levelDir, "texture.inc.c"), + '#include "levels/' + levelName + '/texture_include.inc.c"', + ) + + # This one is for backwards compatibility purposes + deleteIfFound( + levelDataPath, '#include "levels/' + levelName + '/texture_include.inc.c"' + ) + + texscrollIncludeC = '#include "levels/' + levelName + '/texscroll.inc.c"' + texscrollIncludeH = '#include "levels/' + levelName + '/texscroll.inc.h"' + texscrollGroup = levelName + texscrollGroupInclude = '#include "levels/' + levelName + '/header.h"' + + texScrollFileStatus = modifyTexScrollHeadersGroup( + exportDir, + texscrollIncludeC, + texscrollIncludeH, + texscrollGroup, + headerScroll, + texscrollGroupInclude, + hasScrolling, + ) + + if texScrollFileStatus is not None: + fileStatus.starSelectC = texScrollFileStatus.starSelectC + + return fileStatus + def addGeoC(levelName): - header = \ - '#include \n' \ - '#include "sm64.h"\n' \ - '#include "geo_commands.h"\n' \ - '\n' \ - '#include "game/level_geo.h"\n' \ - '#include "game/geo_misc.h"\n' \ - '#include "game/camera.h"\n' \ - '#include "game/moving_texture.h"\n' \ - '#include "game/screen_transition.h"\n' \ - '#include "game/paintings.h"\n\n' - - header += '#include "levels/' + levelName + '/header.h"\n' - return header + header = ( + "#include \n" + '#include "sm64.h"\n' + '#include "geo_commands.h"\n' + "\n" + '#include "game/level_geo.h"\n' + '#include "game/geo_misc.h"\n' + '#include "game/camera.h"\n' + '#include "game/moving_texture.h"\n' + '#include "game/screen_transition.h"\n' + '#include "game/paintings.h"\n\n' + ) + + header += '#include "levels/' + levelName + '/header.h"\n' + return header + def addLevelDataC(levelName): - header = \ - '#include \n' \ - '#include "sm64.h"\n' \ - '#include "surface_terrains.h"\n' \ - '#include "moving_texture_macros.h"\n' \ - '#include "level_misc_macros.h"\n' \ - '#include "macro_preset_names.h"\n' \ - '#include "special_preset_names.h"\n' \ - '#include "textures.h"\n' \ - '#include "dialog_ids.h"\n' \ - '\n' \ - '#include "make_const_nonconst.h"\n' - - return header + header = ( + "#include \n" + '#include "sm64.h"\n' + '#include "surface_terrains.h"\n' + '#include "moving_texture_macros.h"\n' + '#include "level_misc_macros.h"\n' + '#include "macro_preset_names.h"\n' + '#include "special_preset_names.h"\n' + '#include "textures.h"\n' + '#include "dialog_ids.h"\n' + "\n" + '#include "make_const_nonconst.h"\n' + ) + + return header + def addHeaderC(levelName): - header = \ - '#ifndef ' + levelName.upper() + '_HEADER_H\n' +\ - '#define ' + levelName.upper() + '_HEADER_H\n' +\ - '\n' \ - '#include "types.h"\n' \ - '#include "game/moving_texture.h"\n\n' + header = ( + "#ifndef " + + levelName.upper() + + "_HEADER_H\n" + + "#define " + + levelName.upper() + + "_HEADER_H\n" + + "\n" + '#include "types.h"\n' + '#include "game/moving_texture.h"\n\n' + ) + + return header - return header class SM64_ExportLevel(ObjectDataExporter): - # set bl_ properties - bl_idname = 'object.sm64_export_level' - bl_label = "Export Level" - bl_options = {'REGISTER', 'UNDO', 'PRESET'} - - def execute(self, context): - - try: - if context.mode != 'OBJECT': - raise PluginError("Operator can only be used in object mode.") - if len(context.selected_objects) == 0: - raise PluginError("Object not selected.") - obj = context.selected_objects[0] - if obj.data is not None or obj.sm64_obj_type != 'Level Root': - raise PluginError("The selected object is not an empty with the Level Root type.") - - scaleValue = bpy.context.scene.blenderToSM64Scale - finalTransform = mathutils.Matrix.Diagonal( - mathutils.Vector((scaleValue, scaleValue, scaleValue)) - ).to_4x4() - - except Exception as e: - raisePluginError(self, e) - return {'CANCELLED'} # must return a set - try: - self.store_object_data() - - applyRotation([obj], math.radians(90), 'X') - if context.scene.levelCustomExport: - exportPath = bpy.path.abspath(context.scene.levelExportPath) - levelName = context.scene.levelName - triggerName = 'sCam' + context.scene.levelName.title().replace(' ', '').replace('_', '') - else: - exportPath = bpy.path.abspath(context.scene.decompPath) - if context.scene.levelOption == 'custom': - levelName = context.scene.levelName - triggerName = 'sCam' + context.scene.levelName.title().replace(' ', '').replace('_', '') - else: - levelName = context.scene.levelOption - triggerName = cameraTriggerNames[context.scene.levelOption] - if not context.scene.levelCustomExport: - applyBasicTweaks(exportPath) - #cProfile.runctx('exportLevelC(obj, finalTransform,' +\ - # 'context.scene.f3d_type, context.scene.isHWv1, levelName, exportPath,' +\ - # 'context.scene.saveTextures or bpy.context.scene.ignoreTextureRestrictions,' +\ - # 'context.scene.levelCustomExport, triggerName, DLFormat.Static)', - # globals(), locals(), "E:/blender.prof") - #p = pstats.Stats("E:/blender.prof") - #p.sort_stats("cumulative").print_stats(2000) - fileStatus = exportLevelC(obj, finalTransform, - context.scene.f3d_type, context.scene.isHWv1, levelName, exportPath, - context.scene.saveTextures or bpy.context.scene.ignoreTextureRestrictions, - context.scene.levelCustomExport, triggerName, DLFormat.Static) - - cameraWarning(self, fileStatus) - starSelectWarning(self, fileStatus) - - applyRotation([obj], math.radians(-90), 'X') - self.cleanup_temp_object_data() - - self.report({'INFO'}, 'Success!') - self.show_warnings() - return {'FINISHED'} # must return a set - - except Exception as e: - if context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - - applyRotation([obj], math.radians(-90), 'X') - self.cleanup_temp_object_data() - - obj.select_set(True) - context.view_layer.objects.active = obj - self.reset_warnings() - raisePluginError(self, e) - return {'CANCELLED'} # must return a set + # set bl_ properties + bl_idname = "object.sm64_export_level" + bl_label = "Export Level" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + def execute(self, context): + + try: + if context.mode != "OBJECT": + raise PluginError("Operator can only be used in object mode.") + if len(context.selected_objects) == 0: + raise PluginError("Object not selected.") + obj = context.selected_objects[0] + if obj.data is not None or obj.sm64_obj_type != "Level Root": + raise PluginError( + "The selected object is not an empty with the Level Root type." + ) + + scaleValue = bpy.context.scene.blenderToSM64Scale + finalTransform = mathutils.Matrix.Diagonal( + mathutils.Vector((scaleValue, scaleValue, scaleValue)) + ).to_4x4() + + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} # must return a set + try: + self.store_object_data() + + applyRotation([obj], math.radians(90), "X") + if context.scene.levelCustomExport: + exportPath = bpy.path.abspath(context.scene.levelExportPath) + levelName = context.scene.levelName + triggerName = "sCam" + context.scene.levelName.title().replace( + " ", "" + ).replace("_", "") + else: + exportPath = bpy.path.abspath(context.scene.decompPath) + if context.scene.levelOption == "custom": + levelName = context.scene.levelName + triggerName = "sCam" + context.scene.levelName.title().replace( + " ", "" + ).replace("_", "") + else: + levelName = context.scene.levelOption + triggerName = cameraTriggerNames[context.scene.levelOption] + if not context.scene.levelCustomExport: + applyBasicTweaks(exportPath) + # cProfile.runctx('exportLevelC(obj, finalTransform,' +\ + # 'context.scene.f3d_type, context.scene.isHWv1, levelName, exportPath,' +\ + # 'context.scene.saveTextures or bpy.context.scene.ignoreTextureRestrictions,' +\ + # 'context.scene.levelCustomExport, triggerName, DLFormat.Static)', + # globals(), locals(), "E:/blender.prof") + # p = pstats.Stats("E:/blender.prof") + # p.sort_stats("cumulative").print_stats(2000) + fileStatus = exportLevelC( + obj, + finalTransform, + context.scene.f3d_type, + context.scene.isHWv1, + levelName, + exportPath, + context.scene.saveTextures + or bpy.context.scene.ignoreTextureRestrictions, + context.scene.levelCustomExport, + triggerName, + DLFormat.Static, + ) + + cameraWarning(self, fileStatus) + starSelectWarning(self, fileStatus) + + applyRotation([obj], math.radians(-90), "X") + self.cleanup_temp_object_data() + + self.report({"INFO"}, "Success!") + self.show_warnings() + return {"FINISHED"} # must return a set + + except Exception as e: + if context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + + applyRotation([obj], math.radians(-90), "X") + self.cleanup_temp_object_data() + + obj.select_set(True) + context.view_layer.objects.active = obj + self.reset_warnings() + raisePluginError(self, e) + return {"CANCELLED"} # must return a set + class SM64_ExportLevelPanel(SM64_Panel): - bl_idname = "SM64_PT_export_level" - bl_label = "SM64 Level Exporter" - goal = 'Export Level' - decomp_only = True - - # called every frame - def draw(self, context): - col = self.layout.column() - col.label(text = 'This is for decomp only.') - col.operator(SM64_ExportLevel.bl_idname) - col.prop(context.scene, 'levelCustomExport') - if context.scene.levelCustomExport: - prop_split(col, context.scene, 'levelExportPath', 'Directory') - prop_split(col, context.scene, 'levelName', 'Name') - customExportWarning(col) - else: - col.prop(context.scene, 'levelOption') - if context.scene.levelOption == 'custom': - levelName = context.scene.levelName - box = col.box() - box.label(text = 'Adding levels may require modifying the save file format.') - box.label(text = 'Check src/game/save_file.c.') - prop_split(col, context.scene, 'levelName', 'Name') - else: - levelName = context.scene.levelOption - decompFolderMessage(col) - writeBox = makeWriteInfoBox(col) - writeBox.label(text = 'levels/' + toAlnum(levelName) + ' (data).') - writeBox.label(text = 'src/game/camera.c (camera volume).') - writeBox.label(text = 'levels/level_defines.h (camera volume).') - -sm64_level_classes = ( - SM64_ExportLevel, -) - -sm64_level_panel_classes = ( - SM64_ExportLevelPanel, -) + bl_idname = "SM64_PT_export_level" + bl_label = "SM64 Level Exporter" + goal = "Export Level" + decomp_only = True + + # called every frame + def draw(self, context): + col = self.layout.column() + col.label(text="This is for decomp only.") + col.operator(SM64_ExportLevel.bl_idname) + col.prop(context.scene, "levelCustomExport") + if context.scene.levelCustomExport: + prop_split(col, context.scene, "levelExportPath", "Directory") + prop_split(col, context.scene, "levelName", "Name") + customExportWarning(col) + else: + col.prop(context.scene, "levelOption") + if context.scene.levelOption == "custom": + levelName = context.scene.levelName + box = col.box() + box.label( + text="Adding levels may require modifying the save file format." + ) + box.label(text="Check src/game/save_file.c.") + prop_split(col, context.scene, "levelName", "Name") + else: + levelName = context.scene.levelOption + decompFolderMessage(col) + writeBox = makeWriteInfoBox(col) + writeBox.label(text="levels/" + toAlnum(levelName) + " (data).") + writeBox.label(text="src/game/camera.c (camera volume).") + writeBox.label(text="levels/level_defines.h (camera volume).") + + +sm64_level_classes = (SM64_ExportLevel,) + +sm64_level_panel_classes = (SM64_ExportLevelPanel,) + def sm64_level_panel_register(): - for cls in sm64_level_panel_classes: - register_class(cls) + for cls in sm64_level_panel_classes: + register_class(cls) + def sm64_level_panel_unregister(): - for cls in sm64_level_panel_classes: - unregister_class(cls) + for cls in sm64_level_panel_classes: + unregister_class(cls) + def sm64_level_register(): - for cls in sm64_level_classes: - register_class(cls) + for cls in sm64_level_classes: + register_class(cls) + + bpy.types.Scene.levelName = bpy.props.StringProperty(name="Name", default="bob") + bpy.types.Scene.levelOption = bpy.props.EnumProperty( + name="Level", items=enumLevelNames, default="bob" + ) + bpy.types.Scene.levelExportPath = bpy.props.StringProperty( + name="Directory", subtype="FILE_PATH" + ) + bpy.types.Scene.levelCustomExport = bpy.props.BoolProperty( + name="Custom Export Path" + ) - bpy.types.Scene.levelName = bpy.props.StringProperty(name = 'Name', default = 'bob') - bpy.types.Scene.levelOption = bpy.props.EnumProperty(name = "Level", items = enumLevelNames, default = 'bob') - bpy.types.Scene.levelExportPath = bpy.props.StringProperty( - name = 'Directory', subtype = 'FILE_PATH') - bpy.types.Scene.levelCustomExport = bpy.props.BoolProperty( - name = 'Custom Export Path') def sm64_level_unregister(): - for cls in reversed(sm64_level_classes): - unregister_class(cls) + for cls in reversed(sm64_level_classes): + unregister_class(cls) - del bpy.types.Scene.levelName - del bpy.types.Scene.levelExportPath - del bpy.types.Scene.levelCustomExport - del bpy.types.Scene.levelOption + del bpy.types.Scene.levelName + del bpy.types.Scene.levelExportPath + del bpy.types.Scene.levelCustomExport + del bpy.types.Scene.levelOption diff --git a/fast64_internal/sm64/sm64_objects.py b/fast64_internal/sm64/sm64_objects.py index 0c66e41ea..6cb9adf0b 100644 --- a/fast64_internal/sm64/sm64_objects.py +++ b/fast64_internal/sm64/sm64_objects.py @@ -11,1848 +11,2482 @@ from ..f3d.f3d_material import sm64EnumDrawLayers enumTerrain = [ - ('Custom', 'Custom', 'Custom'), - ('TERRAIN_GRASS', 'Grass', 'Grass'), - ('TERRAIN_STONE', 'Stone', 'Stone'), - ('TERRAIN_SNOW', 'Snow', 'Snow'), - ('TERRAIN_SAND', 'Sand', 'Sand'), - ('TERRAIN_SPOOKY', 'Spooky', 'Spooky'), - ('TERRAIN_WATER', 'Water', 'Water'), - ('TERRAIN_SLIDE', 'Slide', 'Slide'), + ("Custom", "Custom", "Custom"), + ("TERRAIN_GRASS", "Grass", "Grass"), + ("TERRAIN_STONE", "Stone", "Stone"), + ("TERRAIN_SNOW", "Snow", "Snow"), + ("TERRAIN_SAND", "Sand", "Sand"), + ("TERRAIN_SPOOKY", "Spooky", "Spooky"), + ("TERRAIN_WATER", "Water", "Water"), + ("TERRAIN_SLIDE", "Slide", "Slide"), ] enumMusicSeq = [ - ('Custom', 'Custom', 'Custom'), - ('SEQ_LEVEL_BOSS_KOOPA', 'Boss Koopa', 'Boss Koopa'), - ('SEQ_LEVEL_BOSS_KOOPA_FINAL', 'Boss Koopa Final', 'Boss Koopa Final'), - ('SEQ_LEVEL_GRASS', 'Grass Level', 'Grass Level'), - ('SEQ_LEVEL_HOT', 'Hot Level', 'Hot Level'), - ('SEQ_LEVEL_INSIDE_CASTLE', 'Inside Castle', 'Inside Castle'), - ('SEQ_LEVEL_KOOPA_ROAD', 'Koopa Road', 'Koopa Road'), - ('SEQ_LEVEL_SLIDE', 'Slide Level', 'Slide Level'), - ('SEQ_LEVEL_SNOW', 'Snow Level', 'Snow Level'), - ('SEQ_LEVEL_SPOOKY', 'Spooky Level', 'Spooky Level'), - ('SEQ_LEVEL_UNDERGROUND', 'Underground Level', 'Underground Level'), - ('SEQ_LEVEL_WATER', 'Water Level', 'Water Level'), - ('SEQ_MENU_FILE_SELECT', 'File Select', 'File Select'), - ('SEQ_MENU_STAR_SELECT', 'Star Select Menu', 'Star Select Menu'), - ('SEQ_MENU_TITLE_SCREEN', 'Title Screen', 'Title Screen'), - ('SEQ_EVENT_BOSS', 'Boss', 'Boss'), - ('SEQ_EVENT_CUTSCENE_COLLECT_KEY', 'Collect Key', 'Collect Key'), - ('SEQ_EVENT_CUTSCENE_COLLECT_STAR', 'Collect Star', 'Collect Star'), - ('SEQ_EVENT_CUTSCENE_CREDITS', 'Credits', 'Credits'), - ('SEQ_EVENT_CUTSCENE_ENDING', 'Ending Cutscene', 'Ending Cutscene'), - ('SEQ_EVENT_CUTSCENE_INTRO', 'Intro Cutscene', 'Intro Cutscene'), - ('SEQ_EVENT_CUTSCENE_LAKITU', 'Lakitu Cutscene', 'Lakitu Cutscene'), - ('SEQ_EVENT_CUTSCENE_STAR_SPAWN', 'Star Spawn', 'Star Spawn'), - ('SEQ_EVENT_CUTSCENE_VICTORY', 'Victory Cutscene', 'Victory Cutscene'), - ('SEQ_EVENT_ENDLESS_STAIRS', 'Endless Stairs', 'Endless Stairs'), - ('SEQ_EVENT_HIGH_SCORE', 'High Score', 'High Score'), - ('SEQ_EVENT_KOOPA_MESSAGE', 'Koopa Message', 'Koopa Message'), - ('SEQ_EVENT_MERRY_GO_ROUND', 'Merry Go Round', 'Merry Go Round'), - ('SEQ_EVENT_METAL_CAP', 'Metal Cap', 'Metal Cap'), - ('SEQ_EVENT_PEACH_MESSAGE', 'Peach Message', 'Peach Message'), - ('SEQ_EVENT_PIRANHA_PLANT', 'Piranha Lullaby', 'Piranha Lullaby'), - ('SEQ_EVENT_POWERUP', 'Powerup', 'Powerup'), - ('SEQ_EVENT_RACE', 'Race', 'Race'), - ('SEQ_EVENT_SOLVE_PUZZLE', 'Solve Puzzle', 'Solve Puzzle'), - ('SEQ_SOUND_PLAYER', 'Sound Player', 'Sound Player'), - ('SEQ_EVENT_TOAD_MESSAGE', 'Toad Message', 'Toad Message'), + ("Custom", "Custom", "Custom"), + ("SEQ_LEVEL_BOSS_KOOPA", "Boss Koopa", "Boss Koopa"), + ("SEQ_LEVEL_BOSS_KOOPA_FINAL", "Boss Koopa Final", "Boss Koopa Final"), + ("SEQ_LEVEL_GRASS", "Grass Level", "Grass Level"), + ("SEQ_LEVEL_HOT", "Hot Level", "Hot Level"), + ("SEQ_LEVEL_INSIDE_CASTLE", "Inside Castle", "Inside Castle"), + ("SEQ_LEVEL_KOOPA_ROAD", "Koopa Road", "Koopa Road"), + ("SEQ_LEVEL_SLIDE", "Slide Level", "Slide Level"), + ("SEQ_LEVEL_SNOW", "Snow Level", "Snow Level"), + ("SEQ_LEVEL_SPOOKY", "Spooky Level", "Spooky Level"), + ("SEQ_LEVEL_UNDERGROUND", "Underground Level", "Underground Level"), + ("SEQ_LEVEL_WATER", "Water Level", "Water Level"), + ("SEQ_MENU_FILE_SELECT", "File Select", "File Select"), + ("SEQ_MENU_STAR_SELECT", "Star Select Menu", "Star Select Menu"), + ("SEQ_MENU_TITLE_SCREEN", "Title Screen", "Title Screen"), + ("SEQ_EVENT_BOSS", "Boss", "Boss"), + ("SEQ_EVENT_CUTSCENE_COLLECT_KEY", "Collect Key", "Collect Key"), + ("SEQ_EVENT_CUTSCENE_COLLECT_STAR", "Collect Star", "Collect Star"), + ("SEQ_EVENT_CUTSCENE_CREDITS", "Credits", "Credits"), + ("SEQ_EVENT_CUTSCENE_ENDING", "Ending Cutscene", "Ending Cutscene"), + ("SEQ_EVENT_CUTSCENE_INTRO", "Intro Cutscene", "Intro Cutscene"), + ("SEQ_EVENT_CUTSCENE_LAKITU", "Lakitu Cutscene", "Lakitu Cutscene"), + ("SEQ_EVENT_CUTSCENE_STAR_SPAWN", "Star Spawn", "Star Spawn"), + ("SEQ_EVENT_CUTSCENE_VICTORY", "Victory Cutscene", "Victory Cutscene"), + ("SEQ_EVENT_ENDLESS_STAIRS", "Endless Stairs", "Endless Stairs"), + ("SEQ_EVENT_HIGH_SCORE", "High Score", "High Score"), + ("SEQ_EVENT_KOOPA_MESSAGE", "Koopa Message", "Koopa Message"), + ("SEQ_EVENT_MERRY_GO_ROUND", "Merry Go Round", "Merry Go Round"), + ("SEQ_EVENT_METAL_CAP", "Metal Cap", "Metal Cap"), + ("SEQ_EVENT_PEACH_MESSAGE", "Peach Message", "Peach Message"), + ("SEQ_EVENT_PIRANHA_PLANT", "Piranha Lullaby", "Piranha Lullaby"), + ("SEQ_EVENT_POWERUP", "Powerup", "Powerup"), + ("SEQ_EVENT_RACE", "Race", "Race"), + ("SEQ_EVENT_SOLVE_PUZZLE", "Solve Puzzle", "Solve Puzzle"), + ("SEQ_SOUND_PLAYER", "Sound Player", "Sound Player"), + ("SEQ_EVENT_TOAD_MESSAGE", "Toad Message", "Toad Message"), ] enumWarpType = [ - ("Warp", "Warp", "Warp"), - ("Painting", "Painting", "Painting"), - ("Instant", "Instant", "Instant"), + ("Warp", "Warp", "Warp"), + ("Painting", "Painting", "Painting"), + ("Instant", "Instant", "Instant"), ] enumWarpFlag = [ - ("Custom", "Custom", "Custom"), - ("WARP_NO_CHECKPOINT", 'No Checkpoint', 'No Checkpoint'), - ("WARP_CHECKPOINT", 'Checkpoint', 'Checkpoint'), + ("Custom", "Custom", "Custom"), + ("WARP_NO_CHECKPOINT", "No Checkpoint", "No Checkpoint"), + ("WARP_CHECKPOINT", "Checkpoint", "Checkpoint"), ] enumEnvFX = [ - ('Custom', 'Custom', 'Custom'), - ('ENVFX_MODE_NONE', 'None', 'None'), - ('ENVFX_SNOW_NORMAL', 'Snow', 'Used in CCM, SL'), - ('ENVFX_SNOW_WATER', 'Water Bubbles', 'Used in Secret Aquarium, Sunken Ships'), - ('ENVFX_SNOW_BLIZZARD', 'Blizzard', 'Unused'), - ('ENVFX_FLOWERS', 'Flowers', 'Unused'), - ('ENVFX_LAVA_BUBBLES', 'Lava Bubbles', 'Used in LLL, BitFS, Bowser 2'), - ('ENVFX_WHIRLPOOL_BUBBLES', 'Whirpool Bubbles', 'Used in DDD where whirpool is'), - ('ENVFX_JETSTREAM_BUBBLES', 'Jetstream Bubbles', 'Used in JRB, DDD where jetstream is'), + ("Custom", "Custom", "Custom"), + ("ENVFX_MODE_NONE", "None", "None"), + ("ENVFX_SNOW_NORMAL", "Snow", "Used in CCM, SL"), + ("ENVFX_SNOW_WATER", "Water Bubbles", "Used in Secret Aquarium, Sunken Ships"), + ("ENVFX_SNOW_BLIZZARD", "Blizzard", "Unused"), + ("ENVFX_FLOWERS", "Flowers", "Unused"), + ("ENVFX_LAVA_BUBBLES", "Lava Bubbles", "Used in LLL, BitFS, Bowser 2"), + ("ENVFX_WHIRLPOOL_BUBBLES", "Whirpool Bubbles", "Used in DDD where whirpool is"), + ( + "ENVFX_JETSTREAM_BUBBLES", + "Jetstream Bubbles", + "Used in JRB, DDD where jetstream is", + ), ] enumCameraMode = [ - ('Custom', 'Custom', 'Custom'), - ('CAMERA_MODE_NONE', 'None', 'None'), - ('CAMERA_MODE_RADIAL', 'Radial', 'Radial'), - ('CAMERA_MODE_OUTWARD_RADIAL', 'Outward Radial', 'Outward Radial'), - ('CAMERA_MODE_BEHIND_MARIO', 'Behind Mario', 'Behind Mario'), - ('CAMERA_MODE_CLOSE', 'Close', 'Close'), - ('CAMERA_MODE_C_UP', 'C Up', 'C Up'), - ('CAMERA_MODE_WATER_SURFACE', 'Water Surface', 'Water Surface'), - ('CAMERA_MODE_SLIDE_HOOT', 'Slide/Hoot', 'Slide/Hoot'), - ('CAMERA_MODE_INSIDE_CANNON', 'Inside Cannon', 'Inside Cannon'), - ('CAMERA_MODE_BOSS_FIGHT', 'Boss Fight', 'Boss Fight'), - ('CAMERA_MODE_PARALLEL_TRACKING', 'Parallel Tracking', 'Parallel Tracking'), - ('CAMERA_MODE_FIXED', 'Fixed', 'Fixed'), - ('CAMERA_MODE_8_DIRECTIONS', '8 Directions', '8 Directions'), - ('CAMERA_MODE_FREE_ROAM', 'Free Roam', 'Free Roam'), - ('CAMERA_MODE_SPIRAL_STAIRS', 'Spiral Stairs', 'Spiral Stairs'), + ("Custom", "Custom", "Custom"), + ("CAMERA_MODE_NONE", "None", "None"), + ("CAMERA_MODE_RADIAL", "Radial", "Radial"), + ("CAMERA_MODE_OUTWARD_RADIAL", "Outward Radial", "Outward Radial"), + ("CAMERA_MODE_BEHIND_MARIO", "Behind Mario", "Behind Mario"), + ("CAMERA_MODE_CLOSE", "Close", "Close"), + ("CAMERA_MODE_C_UP", "C Up", "C Up"), + ("CAMERA_MODE_WATER_SURFACE", "Water Surface", "Water Surface"), + ("CAMERA_MODE_SLIDE_HOOT", "Slide/Hoot", "Slide/Hoot"), + ("CAMERA_MODE_INSIDE_CANNON", "Inside Cannon", "Inside Cannon"), + ("CAMERA_MODE_BOSS_FIGHT", "Boss Fight", "Boss Fight"), + ("CAMERA_MODE_PARALLEL_TRACKING", "Parallel Tracking", "Parallel Tracking"), + ("CAMERA_MODE_FIXED", "Fixed", "Fixed"), + ("CAMERA_MODE_8_DIRECTIONS", "8 Directions", "8 Directions"), + ("CAMERA_MODE_FREE_ROAM", "Free Roam", "Free Roam"), + ("CAMERA_MODE_SPIRAL_STAIRS", "Spiral Stairs", "Spiral Stairs"), ] enumBackground = [ - ('OCEAN_SKY', 'Ocean Sky', 'Ocean Sky'), - ('FLAMING_SKY', 'Flaming Sky', 'Flaming Sky'), - ('UNDERWATER_CITY', 'Underwater City', 'Underwater City'), - ('BELOW_CLOUDS', 'Below Clouds', 'Below Clouds'), - ('SNOW_MOUNTAINS', 'Snow Mountains', 'Snow Mountains'), - ('DESERT', 'Desert', 'Desert'), - ('HAUNTED', 'Haunted', 'Haunted'), - ('GREEN_SKY', 'Green Sky', 'Green Sky'), - ('ABOVE_CLOUDS', 'Above Clouds', 'Above Clouds'), - ('PURPLE_SKY', 'Purple Sky', 'Purple Sky'), - ('CUSTOM', 'Custom', 'Custom'), + ("OCEAN_SKY", "Ocean Sky", "Ocean Sky"), + ("FLAMING_SKY", "Flaming Sky", "Flaming Sky"), + ("UNDERWATER_CITY", "Underwater City", "Underwater City"), + ("BELOW_CLOUDS", "Below Clouds", "Below Clouds"), + ("SNOW_MOUNTAINS", "Snow Mountains", "Snow Mountains"), + ("DESERT", "Desert", "Desert"), + ("HAUNTED", "Haunted", "Haunted"), + ("GREEN_SKY", "Green Sky", "Green Sky"), + ("ABOVE_CLOUDS", "Above Clouds", "Above Clouds"), + ("PURPLE_SKY", "Purple Sky", "Purple Sky"), + ("CUSTOM", "Custom", "Custom"), ] backgroundSegments = { - 'OCEAN_SKY' : 'water', - 'FLAMING_SKY' : 'bitfs', - 'UNDERWATER_CITY' : 'wdw', - 'BELOW_CLOUDS' : 'cloud_floor', - 'SNOW_MOUNTAINS' : 'ccm', - 'DESERT' : 'ssl', - 'HAUNTED' : 'bbh', - 'GREEN_SKY' : 'bidw', - 'ABOVE_CLOUDS' : 'clouds', - 'PURPLE_SKY' : 'bits', + "OCEAN_SKY": "water", + "FLAMING_SKY": "bitfs", + "UNDERWATER_CITY": "wdw", + "BELOW_CLOUDS": "cloud_floor", + "SNOW_MOUNTAINS": "ccm", + "DESERT": "ssl", + "HAUNTED": "bbh", + "GREEN_SKY": "bidw", + "ABOVE_CLOUDS": "clouds", + "PURPLE_SKY": "bits", } enumWaterBoxType = [ - ("Water", 'Water', "Water"), - ('Toxic Haze', 'Toxic Haze', 'Toxic Haze') + ("Water", "Water", "Water"), + ("Toxic Haze", "Toxic Haze", "Toxic Haze"), ] + class InlineGeolayoutObjConfig: - def __init__( - self, name, geo_node, - can_have_dl=False, - must_have_dl=False, - must_have_geo=False, - uses_location=False, - uses_rotation=False, - uses_scale=False - ): - self.name = name - self.geo_node = geo_node - self.can_have_dl = can_have_dl or must_have_dl - self.must_have_dl = must_have_dl - self.must_have_geo = must_have_geo - self.uses_location = uses_location - self.uses_rotation = uses_rotation - self.uses_scale = uses_scale + def __init__( + self, + name, + geo_node, + can_have_dl=False, + must_have_dl=False, + must_have_geo=False, + uses_location=False, + uses_rotation=False, + uses_scale=False, + ): + self.name = name + self.geo_node = geo_node + self.can_have_dl = can_have_dl or must_have_dl + self.must_have_dl = must_have_dl + self.must_have_geo = must_have_geo + self.uses_location = uses_location + self.uses_rotation = uses_rotation + self.uses_scale = uses_scale + inlineGeoLayoutObjects = { - 'Geo ASM' : InlineGeolayoutObjConfig('Geo ASM', FunctionNode), - 'Geo Branch' : InlineGeolayoutObjConfig('Geo Branch', JumpNode, - must_have_geo=True), - 'Geo Translate/Rotate' : InlineGeolayoutObjConfig('Geo Translate/Rotate', TranslateRotateNode, - can_have_dl=True, uses_location=True, uses_rotation=True), - 'Geo Translate Node' : InlineGeolayoutObjConfig('Geo Translate Node', TranslateNode, - can_have_dl=True, uses_location=True), - 'Geo Rotation Node' : InlineGeolayoutObjConfig('Geo Rotation Node', RotateNode, - can_have_dl=True, uses_rotation=True), - 'Geo Billboard' : InlineGeolayoutObjConfig('Geo Billboard', BillboardNode, - can_have_dl=True, uses_location=True), - 'Geo Scale' : InlineGeolayoutObjConfig('Geo Scale', ScaleNode, - can_have_dl=True, uses_scale=True), - 'Geo Displaylist' : InlineGeolayoutObjConfig('Geo Displaylist', DisplayListNode, - must_have_dl=True), - 'Custom Geo Command' : InlineGeolayoutObjConfig('Custom Geo Command', CustomNode), + "Geo ASM": InlineGeolayoutObjConfig("Geo ASM", FunctionNode), + "Geo Branch": InlineGeolayoutObjConfig("Geo Branch", JumpNode, must_have_geo=True), + "Geo Translate/Rotate": InlineGeolayoutObjConfig( + "Geo Translate/Rotate", + TranslateRotateNode, + can_have_dl=True, + uses_location=True, + uses_rotation=True, + ), + "Geo Translate Node": InlineGeolayoutObjConfig( + "Geo Translate Node", TranslateNode, can_have_dl=True, uses_location=True + ), + "Geo Rotation Node": InlineGeolayoutObjConfig( + "Geo Rotation Node", RotateNode, can_have_dl=True, uses_rotation=True + ), + "Geo Billboard": InlineGeolayoutObjConfig( + "Geo Billboard", BillboardNode, can_have_dl=True, uses_location=True + ), + "Geo Scale": InlineGeolayoutObjConfig( + "Geo Scale", ScaleNode, can_have_dl=True, uses_scale=True + ), + "Geo Displaylist": InlineGeolayoutObjConfig( + "Geo Displaylist", DisplayListNode, must_have_dl=True + ), + "Custom Geo Command": InlineGeolayoutObjConfig("Custom Geo Command", CustomNode), } # When adding new types related to geolayout, # Make sure to add exceptions to enumSM64EmptyWithGeolayout enumObjectType = [ - ('None', 'None', 'None'), - ('Level Root', 'Level Root', 'Level Root'), - ('Area Root', 'Area Root', 'Area Root'), - ('Object', 'Object', 'Object'), - ('Macro', 'Macro', 'Macro'), - ('Special', 'Special', 'Special'), - ('Mario Start', 'Mario Start', 'Mario Start'), - ('Whirlpool', 'Whirlpool', 'Whirlpool'), - ('Water Box', 'Water Box', 'Water Box'), - ('Camera Volume', 'Camera Volume', 'Camera Volume'), - ('Switch', 'Switch Node', 'Switch Node'), - ('Puppycam Volume', 'Puppycam Volume', 'Puppycam Volume'), - ('', 'Inline Geolayout Commands', ''), # This displays as a column header for the next set of options - *[(key, key, key) for key in inlineGeoLayoutObjects.keys()] + ("None", "None", "None"), + ("Level Root", "Level Root", "Level Root"), + ("Area Root", "Area Root", "Area Root"), + ("Object", "Object", "Object"), + ("Macro", "Macro", "Macro"), + ("Special", "Special", "Special"), + ("Mario Start", "Mario Start", "Mario Start"), + ("Whirlpool", "Whirlpool", "Whirlpool"), + ("Water Box", "Water Box", "Water Box"), + ("Camera Volume", "Camera Volume", "Camera Volume"), + ("Switch", "Switch Node", "Switch Node"), + ("Puppycam Volume", "Puppycam Volume", "Puppycam Volume"), + ( + "", + "Inline Geolayout Commands", + "", + ), # This displays as a column header for the next set of options + *[(key, key, key) for key in inlineGeoLayoutObjects.keys()], ] enumPuppycamMode = [ - ('Custom', 'Custom', 'Custom'), - ('NC_MODE_NORMAL', 'Normal', 'Normal'), - ('NC_MODE_SLIDE', 'Slide', 'Slide'), - ('NC_MODE_FIXED', 'Fixed Position', 'Fixed Position'), - ('NC_MODE_2D', 'Two Dimensional', 'Two Dimensional'), - ('NC_MODE_8D', '8 Directions', '8 Directions'), - ('NC_MODE_FIXED_NOMOVE', 'Fixed, No Move', 'Fixed, No Move'), - ('NC_MODE_NOTURN', 'No Turning', 'No Turning'), - ('NC_MODE_NOROTATE', 'No Rotation', 'No Rotation'), + ("Custom", "Custom", "Custom"), + ("NC_MODE_NORMAL", "Normal", "Normal"), + ("NC_MODE_SLIDE", "Slide", "Slide"), + ("NC_MODE_FIXED", "Fixed Position", "Fixed Position"), + ("NC_MODE_2D", "Two Dimensional", "Two Dimensional"), + ("NC_MODE_8D", "8 Directions", "8 Directions"), + ("NC_MODE_FIXED_NOMOVE", "Fixed, No Move", "Fixed, No Move"), + ("NC_MODE_NOTURN", "No Turning", "No Turning"), + ("NC_MODE_NOROTATE", "No Rotation", "No Rotation"), ] enumPuppycamFlags = [ - ('NC_FLAG_XTURN', 'X Turn', 'the camera\'s yaw can be moved by the player.'), - ('NC_FLAG_YTURN', 'Y Turn', 'the camera\'s pitch can be moved by the player.'), - ('NC_FLAG_ZOOM', 'Zoom', 'the camera\'s distance can be set by the player.'), - ('NC_FLAG_8D', '8 Directions', 'the camera will snap to an 8 directional axis'), - ('NC_FLAG_4D', '4 Directions', 'the camera will snap to a 4 directional axis'), - ('NC_FLAG_2D', '2D', 'the camera will stick to 2D.'), - ('NC_FLAG_FOCUSX', 'Use X Focus', 'the camera will point towards its focus on the X axis.'), - ('NC_FLAG_FOCUSY', 'Use Y Focus', 'the camera will point towards its focus on the Y axis.'), - ('NC_FLAG_FOCUSZ', 'Use Z Focus', 'the camera will point towards its focus on the Z axis.'), - ('NC_FLAG_POSX', 'Move on X axis', 'the camera will move along the X axis.'), - ('NC_FLAG_POSY', 'Move on Y axis', 'the camera will move along the Y axis.'), - ('NC_FLAG_POSZ', 'Move on Z axis', 'the camera will move along the Z axis.'), - ('NC_FLAG_COLLISION', 'Collision', 'the camera will collide and correct itself with terrain.'), - ('NC_FLAG_SLIDECORRECT', 'Slide Correction', 'the camera will attempt to centre itself behind Mario whenever he\'s sliding.'), + ("NC_FLAG_XTURN", "X Turn", "the camera's yaw can be moved by the player."), + ("NC_FLAG_YTURN", "Y Turn", "the camera's pitch can be moved by the player."), + ("NC_FLAG_ZOOM", "Zoom", "the camera's distance can be set by the player."), + ("NC_FLAG_8D", "8 Directions", "the camera will snap to an 8 directional axis"), + ("NC_FLAG_4D", "4 Directions", "the camera will snap to a 4 directional axis"), + ("NC_FLAG_2D", "2D", "the camera will stick to 2D."), + ( + "NC_FLAG_FOCUSX", + "Use X Focus", + "the camera will point towards its focus on the X axis.", + ), + ( + "NC_FLAG_FOCUSY", + "Use Y Focus", + "the camera will point towards its focus on the Y axis.", + ), + ( + "NC_FLAG_FOCUSZ", + "Use Z Focus", + "the camera will point towards its focus on the Z axis.", + ), + ("NC_FLAG_POSX", "Move on X axis", "the camera will move along the X axis."), + ("NC_FLAG_POSY", "Move on Y axis", "the camera will move along the Y axis."), + ("NC_FLAG_POSZ", "Move on Z axis", "the camera will move along the Z axis."), + ( + "NC_FLAG_COLLISION", + "Collision", + "the camera will collide and correct itself with terrain.", + ), + ( + "NC_FLAG_SLIDECORRECT", + "Slide Correction", + "the camera will attempt to centre itself behind Mario whenever he's sliding.", + ), ] + class SM64_Object: - def __init__(self, model, position, rotation, behaviour, bparam, acts): - self.model = model - self.behaviour = behaviour - self.bparam = bparam - self.acts = acts - self.position = position - self.rotation = rotation - - def to_c(self): - if self.acts == 0x1F: - return 'OBJECT(' + str(self.model) + ', ' + \ - str(int(round(self.position[0]))) + ', ' + \ - str(int(round(self.position[1]))) + ', ' + \ - str(int(round(self.position[2]))) + ', ' + \ - str(int(round(math.degrees(self.rotation[0])))) + ', ' + \ - str(int(round(math.degrees(self.rotation[1])))) + ', ' + \ - str(int(round(math.degrees(self.rotation[2])))) + ', ' + \ - str(self.bparam) + ', ' + str(self.behaviour) + ')' - else: - return 'OBJECT_WITH_ACTS(' + str(self.model) + ', ' + \ - str(int(round(self.position[0]))) + ', ' + \ - str(int(round(self.position[1]))) + ', ' + \ - str(int(round(self.position[2]))) + ', ' + \ - str(int(round(math.degrees(self.rotation[0])))) + ', ' + \ - str(int(round(math.degrees(self.rotation[1])))) + ', ' + \ - str(int(round(math.degrees(self.rotation[2])))) + ', ' + \ - str(self.bparam) + ', ' + str(self.behaviour) + ', ' + str(self.acts) + ')' + def __init__(self, model, position, rotation, behaviour, bparam, acts): + self.model = model + self.behaviour = behaviour + self.bparam = bparam + self.acts = acts + self.position = position + self.rotation = rotation + + def to_c(self): + if self.acts == 0x1F: + return ( + "OBJECT(" + + str(self.model) + + ", " + + str(int(round(self.position[0]))) + + ", " + + str(int(round(self.position[1]))) + + ", " + + str(int(round(self.position[2]))) + + ", " + + str(int(round(math.degrees(self.rotation[0])))) + + ", " + + str(int(round(math.degrees(self.rotation[1])))) + + ", " + + str(int(round(math.degrees(self.rotation[2])))) + + ", " + + str(self.bparam) + + ", " + + str(self.behaviour) + + ")" + ) + else: + return ( + "OBJECT_WITH_ACTS(" + + str(self.model) + + ", " + + str(int(round(self.position[0]))) + + ", " + + str(int(round(self.position[1]))) + + ", " + + str(int(round(self.position[2]))) + + ", " + + str(int(round(math.degrees(self.rotation[0])))) + + ", " + + str(int(round(math.degrees(self.rotation[1])))) + + ", " + + str(int(round(math.degrees(self.rotation[2])))) + + ", " + + str(self.bparam) + + ", " + + str(self.behaviour) + + ", " + + str(self.acts) + + ")" + ) + class SM64_Whirpool: - def __init__(self, index, condition, strength, position): - self.index = index - self.condition = condition - self.strength = strength - self.position = position - - def to_c(self): - return 'WHIRPOOL(' + str(self.index) + ', ' + str(self.condition) + ', ' +\ - str(int(round(self.position[0]))) + ', ' + \ - str(int(round(self.position[1]))) + ', ' + \ - str(int(round(self.position[2]))) + ', ' + \ - str(self.strength) + ')' + def __init__(self, index, condition, strength, position): + self.index = index + self.condition = condition + self.strength = strength + self.position = position + + def to_c(self): + return ( + "WHIRPOOL(" + + str(self.index) + + ", " + + str(self.condition) + + ", " + + str(int(round(self.position[0]))) + + ", " + + str(int(round(self.position[1]))) + + ", " + + str(int(round(self.position[2]))) + + ", " + + str(self.strength) + + ")" + ) + class SM64_Macro_Object: - def __init__(self, preset, position, rotation, bparam): - self.preset = preset - self.bparam = bparam - self.position = position - self.rotation = rotation - - def to_c(self): - if self.bparam is None: - return 'MACRO_OBJECT(' + str(self.preset) + ', ' + \ - str(int(round(math.degrees(self.rotation[1])))) + ', ' + \ - str(int(round(self.position[0]))) + ', ' + \ - str(int(round(self.position[1]))) + ', ' + \ - str(int(round(self.position[2]))) + ')' - else: - return 'MACRO_OBJECT_WITH_BEH_PARAM(' + str(self.preset) + ', ' + \ - str(int(round(math.degrees(self.rotation[1])))) + ', ' + \ - str(int(round(self.position[0]))) + ', ' + \ - str(int(round(self.position[1]))) + ', ' + \ - str(int(round(self.position[2]))) + ', ' + \ - str(self.bparam) + ')' + def __init__(self, preset, position, rotation, bparam): + self.preset = preset + self.bparam = bparam + self.position = position + self.rotation = rotation + + def to_c(self): + if self.bparam is None: + return ( + "MACRO_OBJECT(" + + str(self.preset) + + ", " + + str(int(round(math.degrees(self.rotation[1])))) + + ", " + + str(int(round(self.position[0]))) + + ", " + + str(int(round(self.position[1]))) + + ", " + + str(int(round(self.position[2]))) + + ")" + ) + else: + return ( + "MACRO_OBJECT_WITH_BEH_PARAM(" + + str(self.preset) + + ", " + + str(int(round(math.degrees(self.rotation[1])))) + + ", " + + str(int(round(self.position[0]))) + + ", " + + str(int(round(self.position[1]))) + + ", " + + str(int(round(self.position[2]))) + + ", " + + str(self.bparam) + + ")" + ) + class SM64_Special_Object: - def __init__(self, preset, position, rotation, bparam): - self.preset = preset - self.bparam = bparam - self.position = position - self.rotation = rotation - - def to_binary(self): - data = int(self.preset).to_bytes(2, 'big') - if len(self.position) > 3: - raise PluginError("Object position should not be " + \ - str(len(self.position) + ' fields long.')) - for index in self.position: - data.extend(int(round(index)).to_bytes(2, 'big', signed = False)) - if self.rotation is not None: - data.extend(int(round(math.degrees(self.rotation[1]))).to_bytes(2, 'big')) - if self.bparam is not None: - data.extend(int(self.bparam).to_bytes(2, 'big')) - return data - - def to_c(self): - if self.rotation is None: - return 'SPECIAL_OBJECT(' + str(self.preset) + ', ' +\ - str(int(round(self.position[0]))) + ', ' + \ - str(int(round(self.position[1]))) + ', ' + \ - str(int(round(self.position[2]))) + '),\n' - elif self.bparam is None: - return 'SPECIAL_OBJECT_WITH_YAW(' + str(self.preset) + ', ' +\ - str(int(round(self.position[0]))) + ', ' + \ - str(int(round(self.position[1]))) + ', ' + \ - str(int(round(self.position[2]))) + ', ' + \ - str(int(round(math.degrees(self.rotation[1])))) + '),\n' - else: - return 'SPECIAL_OBJECT_WITH_YAW_AND_PARAM(' + str(self.preset) + ', ' +\ - str(int(round(self.position[0]))) + ', ' + \ - str(int(round(self.position[1]))) + ', ' + \ - str(int(round(self.position[2]))) + ', ' + \ - str(int(round(math.degrees(self.rotation[1])))) + ', ' + \ - str(self.bparam) + '),\n' + def __init__(self, preset, position, rotation, bparam): + self.preset = preset + self.bparam = bparam + self.position = position + self.rotation = rotation + + def to_binary(self): + data = int(self.preset).to_bytes(2, "big") + if len(self.position) > 3: + raise PluginError( + "Object position should not be " + + str(len(self.position) + " fields long.") + ) + for index in self.position: + data.extend(int(round(index)).to_bytes(2, "big", signed=False)) + if self.rotation is not None: + data.extend(int(round(math.degrees(self.rotation[1]))).to_bytes(2, "big")) + if self.bparam is not None: + data.extend(int(self.bparam).to_bytes(2, "big")) + return data + + def to_c(self): + if self.rotation is None: + return ( + "SPECIAL_OBJECT(" + + str(self.preset) + + ", " + + str(int(round(self.position[0]))) + + ", " + + str(int(round(self.position[1]))) + + ", " + + str(int(round(self.position[2]))) + + "),\n" + ) + elif self.bparam is None: + return ( + "SPECIAL_OBJECT_WITH_YAW(" + + str(self.preset) + + ", " + + str(int(round(self.position[0]))) + + ", " + + str(int(round(self.position[1]))) + + ", " + + str(int(round(self.position[2]))) + + ", " + + str(int(round(math.degrees(self.rotation[1])))) + + "),\n" + ) + else: + return ( + "SPECIAL_OBJECT_WITH_YAW_AND_PARAM(" + + str(self.preset) + + ", " + + str(int(round(self.position[0]))) + + ", " + + str(int(round(self.position[1]))) + + ", " + + str(int(round(self.position[2]))) + + ", " + + str(int(round(math.degrees(self.rotation[1])))) + + ", " + + str(self.bparam) + + "),\n" + ) + class SM64_Mario_Start: - def __init__(self, area, position, rotation): - self.area = area - self.position = position - self.rotation = rotation + def __init__(self, area, position, rotation): + self.area = area + self.position = position + self.rotation = rotation + + def to_c(self): + return ( + "MARIO_POS(" + + str(self.area) + + ", " + + str(int(round(math.degrees(self.rotation[1])))) + + ", " + + str(int(round(self.position[0]))) + + ", " + + str(int(round(self.position[1]))) + + ", " + + str(int(round(self.position[2]))) + + ")" + ) - def to_c(self): - return 'MARIO_POS(' + str(self.area) + ', ' + str(int(round(math.degrees(self.rotation[1])))) + ', ' +\ - str(int(round(self.position[0]))) + ', ' + str(int(round(self.position[1]))) + ', ' + str(int(round(self.position[2]))) + ')' class SM64_Area: - def __init__(self, index, music_seq, music_preset, - terrain_type, geolayout, collision, warpNodes, name, startDialog): - self.cameraVolumes = [] - self.puppycamVolumes = [] - self.name = toAlnum(name) - self.geolayout = geolayout - self.collision = collision - self.index = index - self.objects = [] - self.macros = [] - self.specials = [] - self.water_boxes = [] - self.music_preset = music_preset - self.music_seq = music_seq - self.terrain_type = terrain_type - self.warpNodes = warpNodes - self.mario_start = None - self.splines = [] - self.startDialog = startDialog - - def macros_name(self): - return self.name + '_macro_objs' - - def to_c_script(self, includeRooms, persistentBlockString: str = ''): - data = '' - data += '\tAREA(' + str(self.index) + ', ' + self.geolayout.name + '),\n' - for warpNode in self.warpNodes: - data += '\t\t' + warpNode + ',\n' - for obj in self.objects: - data += '\t\t' + obj.to_c() + ',\n' - data += '\t\tTERRAIN(' + self.collision.name + '),\n' - if includeRooms: - data += '\t\tROOMS(' + self.collision.rooms_name() + '),\n' - data += '\t\tMACRO_OBJECTS(' + self.macros_name() + '),\n' - if self.music_seq is None: - data += '\t\tSTOP_MUSIC(0),\n' - else: - data += '\t\tSET_BACKGROUND_MUSIC(' + self.music_preset + ', ' + self.music_seq + '),\n' - if self.startDialog is not None: - data += '\t\tSHOW_DIALOG(0x00, ' + self.startDialog + '),\n' - data += '\t\tTERRAIN_TYPE(' + self.terrain_type + '),\n' - data += f'{persistentBlockString}\n' - data += '\tEND_AREA(),\n\n' - return data - - def to_c_macros(self): - data = CData() - data.header = 'extern const MacroObject ' + self.macros_name() + '[];\n' - data.source += 'const MacroObject ' + self.macros_name() + '[] = {\n' - for macro in self.macros: - data.source += '\t' + macro.to_c() + ',\n' - data.source += '\tMACRO_OBJECT_END(),\n};\n\n' - - return data - - def to_c_camera_volumes(self): - data = '' - for camVolume in self.cameraVolumes: - data += '\t' + camVolume.to_c() + '\n' - return data - - def to_c_puppycam_volumes(self): - data = '' - for puppycamVolume in self.puppycamVolumes: - data += '\t' + puppycamVolume.to_c() + '\n' - return data - - def hasCutsceneSpline(self): - for spline in self.splines: - if spline.splineType == 'Cutscene': - return True - return False - - def to_c_splines(self): - data = CData() - for spline in self.splines: - data.append(spline.to_c()) - if self.hasCutsceneSpline(): - data.source = '#include "src/game/camera.h"\n\n' + data.source - data.header = '#include "src/game/camera.h"\n\n' + data.header - return data + def __init__( + self, + index, + music_seq, + music_preset, + terrain_type, + geolayout, + collision, + warpNodes, + name, + startDialog, + ): + self.cameraVolumes = [] + self.puppycamVolumes = [] + self.name = toAlnum(name) + self.geolayout = geolayout + self.collision = collision + self.index = index + self.objects = [] + self.macros = [] + self.specials = [] + self.water_boxes = [] + self.music_preset = music_preset + self.music_seq = music_seq + self.terrain_type = terrain_type + self.warpNodes = warpNodes + self.mario_start = None + self.splines = [] + self.startDialog = startDialog + + def macros_name(self): + return self.name + "_macro_objs" + + def to_c_script(self, includeRooms, persistentBlockString: str = ""): + data = "" + data += "\tAREA(" + str(self.index) + ", " + self.geolayout.name + "),\n" + for warpNode in self.warpNodes: + data += "\t\t" + warpNode + ",\n" + for obj in self.objects: + data += "\t\t" + obj.to_c() + ",\n" + data += "\t\tTERRAIN(" + self.collision.name + "),\n" + if includeRooms: + data += "\t\tROOMS(" + self.collision.rooms_name() + "),\n" + data += "\t\tMACRO_OBJECTS(" + self.macros_name() + "),\n" + if self.music_seq is None: + data += "\t\tSTOP_MUSIC(0),\n" + else: + data += ( + "\t\tSET_BACKGROUND_MUSIC(" + + self.music_preset + + ", " + + self.music_seq + + "),\n" + ) + if self.startDialog is not None: + data += "\t\tSHOW_DIALOG(0x00, " + self.startDialog + "),\n" + data += "\t\tTERRAIN_TYPE(" + self.terrain_type + "),\n" + data += f"{persistentBlockString}\n" + data += "\tEND_AREA(),\n\n" + return data + + def to_c_macros(self): + data = CData() + data.header = "extern const MacroObject " + self.macros_name() + "[];\n" + data.source += "const MacroObject " + self.macros_name() + "[] = {\n" + for macro in self.macros: + data.source += "\t" + macro.to_c() + ",\n" + data.source += "\tMACRO_OBJECT_END(),\n};\n\n" + + return data + + def to_c_camera_volumes(self): + data = "" + for camVolume in self.cameraVolumes: + data += "\t" + camVolume.to_c() + "\n" + return data + + def to_c_puppycam_volumes(self): + data = "" + for puppycamVolume in self.puppycamVolumes: + data += "\t" + puppycamVolume.to_c() + "\n" + return data + + def hasCutsceneSpline(self): + for spline in self.splines: + if spline.splineType == "Cutscene": + return True + return False + + def to_c_splines(self): + data = CData() + for spline in self.splines: + data.append(spline.to_c()) + if self.hasCutsceneSpline(): + data.source = '#include "src/game/camera.h"\n\n' + data.source + data.header = '#include "src/game/camera.h"\n\n' + data.header + return data + class CollisionWaterBox: - def __init__(self, waterBoxType, position, scale, emptyScale): - # The scale ordering is due to the fact that scaling happens AFTER rotation. - # Thus the translation uses Y-up, while the scale uses Z-up. - self.waterBoxType = waterBoxType - self.low = (position[0] - scale[0] * emptyScale, position[2] - scale[1] * emptyScale) - self.high = (position[0] + scale[0] * emptyScale, position[2] + scale[1] * emptyScale) - self.height = position[1] + scale[2] * emptyScale - - def to_binary(self): - data = bytearray([0x00, 0x00 if self.waterBoxType == 'Water' else 0x32]) - data.extend(int(round(self.low[0])).to_bytes(2, 'big', signed=True)) - data.extend(int(round(self.low[1])).to_bytes(2, 'big', signed=True)) - data.extend(int(round(self.high[0])).to_bytes(2, 'big', signed=True)) - data.extend(int(round(self.high[1])).to_bytes(2, 'big', signed=True)) - data.extend(int(round(self.height)).to_bytes(2, 'big', signed=True)) - return data - - def to_c(self): - data = 'COL_WATER_BOX(' + \ - ('0x00' if self.waterBoxType == 'Water' else '0x32') + ', ' + \ - str(int(round(self.low[0]))) + ', ' + \ - str(int(round(self.low[1]))) + ', ' + \ - str(int(round(self.high[0]))) + ', ' + \ - str(int(round(self.high[1]))) + ', ' + \ - str(int(round(self.height))) + '),\n' - return data + def __init__(self, waterBoxType, position, scale, emptyScale): + # The scale ordering is due to the fact that scaling happens AFTER rotation. + # Thus the translation uses Y-up, while the scale uses Z-up. + self.waterBoxType = waterBoxType + self.low = ( + position[0] - scale[0] * emptyScale, + position[2] - scale[1] * emptyScale, + ) + self.high = ( + position[0] + scale[0] * emptyScale, + position[2] + scale[1] * emptyScale, + ) + self.height = position[1] + scale[2] * emptyScale + + def to_binary(self): + data = bytearray([0x00, 0x00 if self.waterBoxType == "Water" else 0x32]) + data.extend(int(round(self.low[0])).to_bytes(2, "big", signed=True)) + data.extend(int(round(self.low[1])).to_bytes(2, "big", signed=True)) + data.extend(int(round(self.high[0])).to_bytes(2, "big", signed=True)) + data.extend(int(round(self.high[1])).to_bytes(2, "big", signed=True)) + data.extend(int(round(self.height)).to_bytes(2, "big", signed=True)) + return data + + def to_c(self): + data = ( + "COL_WATER_BOX(" + + ("0x00" if self.waterBoxType == "Water" else "0x32") + + ", " + + str(int(round(self.low[0]))) + + ", " + + str(int(round(self.low[1]))) + + ", " + + str(int(round(self.high[0]))) + + ", " + + str(int(round(self.high[1]))) + + ", " + + str(int(round(self.height))) + + "),\n" + ) + return data + class CameraVolume: - def __init__(self, area, functionName, position, rotation, scale, emptyScale): - # The scale ordering is due to the fact that scaling happens AFTER rotation. - # Thus the translation uses Y-up, while the scale uses Z-up. - self.area = area - self.functionName = functionName - self.position = position - self.scale = mathutils.Vector((scale[0], scale[2], scale[1])) * emptyScale - self.rotation = rotation - - def to_binary(self): - raise PluginError("Binary exporting not implemented for camera volumens.") - - def to_c(self): - data = '{' + \ - str(self.area) + ', ' + str(self.functionName) + ', ' + \ - str(int(round(self.position[0]))) + ', ' + \ - str(int(round(self.position[1]))) + ', ' + \ - str(int(round(self.position[2]))) + ', ' + \ - str(int(round(self.scale[0]))) + ', ' + \ - str(int(round(self.scale[1]))) + ', ' + \ - str(int(round(self.scale[2]))) + ', ' + \ - str(convertRadiansToS16(self.rotation[1])) + '},' - return data + def __init__(self, area, functionName, position, rotation, scale, emptyScale): + # The scale ordering is due to the fact that scaling happens AFTER rotation. + # Thus the translation uses Y-up, while the scale uses Z-up. + self.area = area + self.functionName = functionName + self.position = position + self.scale = mathutils.Vector((scale[0], scale[2], scale[1])) * emptyScale + self.rotation = rotation + + def to_binary(self): + raise PluginError("Binary exporting not implemented for camera volumens.") + + def to_c(self): + data = ( + "{" + + str(self.area) + + ", " + + str(self.functionName) + + ", " + + str(int(round(self.position[0]))) + + ", " + + str(int(round(self.position[1]))) + + ", " + + str(int(round(self.position[2]))) + + ", " + + str(int(round(self.scale[0]))) + + ", " + + str(int(round(self.scale[1]))) + + ", " + + str(int(round(self.scale[2]))) + + ", " + + str(convertRadiansToS16(self.rotation[1])) + + "}," + ) + return data + class PuppycamVolume: + def __init__( + self, + area, + level, + permaswap, + functionName, + position, + scale, + emptyScale, + camPos, + camFocus, + mode, + ): + self.level = level + self.area = area + self.functionName = functionName + self.permaswap = permaswap + self.mode = mode + + # camPos and camFocus are in blender scale, z-up + # xyz, beginning and end + self.begin = ( + position[0] - scale[0], + position[1] - scale[2], + position[2] - scale[1], + ) + self.end = ( + position[0] + scale[0], + position[1] + scale[2], + position[2] + scale[1], + ) + camScaleValue = bpy.context.scene.blenderToSM64Scale + + # xyz for pos and focus obtained from chosen empties or from selected camera (32767 is ignore flag) + if camPos != (32767, 32767, 32767): + self.camPos = ( + camPos[0] * camScaleValue, + camPos[2] * camScaleValue, + camPos[1] * camScaleValue * -1, + ) + else: + self.camPos = camPos + + if camFocus != (32767, 32767, 32767): + self.camFocus = ( + camFocus[0] * camScaleValue, + camFocus[2] * camScaleValue, + camFocus[1] * camScaleValue * -1, + ) + else: + self.camFocus = camFocus + + def to_binary(self): + raise PluginError("Binary exporting not implemented for puppycam volumes.") + + def to_c(self): + data = ( + "{" + + str(self.level) + + ", " + + str(self.area) + + ", " + + ("1" if self.permaswap else "0") + + ", " + + str(self.mode) + + (", &" if str(self.functionName) != "0" else ", ") + + str(self.functionName) + + ", " + + str(int(round(self.begin[0]))) + + ", " + + str(int(round(self.begin[1]))) + + ", " + + str(int(round(self.begin[2]))) + + ", " + + str(int(round(self.end[0]))) + + ", " + + str(int(round(self.end[1]))) + + ", " + + str(int(round(self.end[2]))) + + ", " + + str(int(round(self.camPos[0]))) + + ", " + + str(int(round(self.camPos[1]))) + + ", " + + str(int(round(self.camPos[2]))) + + ", " + + str(int(round(self.camFocus[0]))) + + ", " + + str(int(round(self.camFocus[1]))) + + ", " + + str(int(round(self.camFocus[2]))) + + "}," + ) + return data - def __init__(self, area, level, permaswap, functionName, position, scale, emptyScale, camPos, camFocus, mode): - self.level = level - self.area = area - self.functionName = functionName - self.permaswap = permaswap - self.mode = mode - - #camPos and camFocus are in blender scale, z-up - # xyz, beginning and end - self.begin = (position[0] - scale[0], position[1] - scale[2], position[2] - scale[1]) - self.end = (position[0] + scale[0], position[1] + scale[2], position[2] + scale[1]) - camScaleValue = bpy.context.scene.blenderToSM64Scale - - # xyz for pos and focus obtained from chosen empties or from selected camera (32767 is ignore flag) - if camPos != (32767, 32767, 32767): - self.camPos = (camPos[0] * camScaleValue, camPos[2] * camScaleValue, camPos[1] * camScaleValue * -1) - else: - self.camPos = camPos - - if camFocus != (32767, 32767, 32767): - self.camFocus = (camFocus[0] * camScaleValue, camFocus[2] * camScaleValue, camFocus[1] * camScaleValue * -1) - else: - self.camFocus = camFocus - - def to_binary(self): - raise PluginError("Binary exporting not implemented for puppycam volumes.") - - def to_c(self): - data = '{' + \ - str(self.level) + ', ' + str(self.area) + ', ' + ('1' if self.permaswap else '0') + ', ' + \ - str(self.mode) + (', &' if str(self.functionName) != '0' else ', ') + str(self.functionName) + ', ' + \ - str(int(round(self.begin[0]))) + ', ' + \ - str(int(round(self.begin[1]))) + ', ' + \ - str(int(round(self.begin[2]))) + ', ' + \ - str(int(round(self.end[0]))) + ', ' + \ - str(int(round(self.end[1]))) + ', ' + \ - str(int(round(self.end[2]))) + ', ' + \ - str(int(round(self.camPos[0]))) + ', ' + \ - str(int(round(self.camPos[1]))) + ', ' + \ - str(int(round(self.camPos[2]))) + ', ' + \ - str(int(round(self.camFocus[0]))) + ', ' + \ - str(int(round(self.camFocus[1]))) + ', ' + \ - str(int(round(self.camFocus[2]))) + '},' - return data def exportAreaCommon(areaObj, transformMatrix, geolayout, collision, name): - bpy.ops.object.select_all(action = 'DESELECT') - areaObj.select_set(True) - - if not areaObj.noMusic: - if areaObj.musicSeqEnum != 'Custom': - musicSeq = areaObj.musicSeqEnum - else: - musicSeq = areaObj.music_seq - else: - musicSeq = None - - if areaObj.terrainEnum != 'Custom': - terrainType = areaObj.terrainEnum - else: - terrainType = areaObj.terrain_type + bpy.ops.object.select_all(action="DESELECT") + areaObj.select_set(True) + + if not areaObj.noMusic: + if areaObj.musicSeqEnum != "Custom": + musicSeq = areaObj.musicSeqEnum + else: + musicSeq = areaObj.music_seq + else: + musicSeq = None + + if areaObj.terrainEnum != "Custom": + terrainType = areaObj.terrainEnum + else: + terrainType = areaObj.terrain_type + + area = SM64_Area( + areaObj.areaIndex, + musicSeq, + areaObj.music_preset, + terrainType, + geolayout, + collision, + [areaObj.warpNodes[i].to_c() for i in range(len(areaObj.warpNodes))], + name, + areaObj.startDialog if areaObj.showStartDialog else None, + ) - area = SM64_Area(areaObj.areaIndex, musicSeq, areaObj.music_preset, - terrainType, geolayout, collision, - [areaObj.warpNodes[i].to_c() for i in range(len(areaObj.warpNodes))], - name, areaObj.startDialog if areaObj.showStartDialog else None) + start_process_sm64_objects(areaObj, area, transformMatrix, False) - start_process_sm64_objects(areaObj, area, transformMatrix, False) + return area - return area # These are all done in reference to refresh 8 def handleRefreshDiffModelIDs(modelID): - if bpy.context.scene.refreshVer == 'Refresh 8' or \ - bpy.context.scene.refreshVer == 'Refresh 7': - pass - elif bpy.context.scene.refreshVer == 'Refresh 6': - if modelID == 'MODEL_TWEESTER': - modelID = 'MODEL_TORNADO' - elif bpy.context.scene.refreshVer == 'Refresh 5' or \ - bpy.context.scene.refreshVer == 'Refresh 4' or \ - bpy.context.scene.refreshVer == 'Refresh 3': - if modelID == 'MODEL_TWEESTER': - modelID = 'MODEL_TORNADO' - elif modelID == 'MODEL_WAVE_TRAIL': - modelID = "MODEL_WATER_WAVES" - elif modelID == 'MODEL_IDLE_WATER_WAVE': - modelID = 'MODEL_WATER_WAVES_SURF' - elif modelID == 'MODEL_SMALL_WATER_SPLASH': - modelID = 'MODEL_SPOT_ON_GROUND' - - return modelID + if ( + bpy.context.scene.refreshVer == "Refresh 8" + or bpy.context.scene.refreshVer == "Refresh 7" + ): + pass + elif bpy.context.scene.refreshVer == "Refresh 6": + if modelID == "MODEL_TWEESTER": + modelID = "MODEL_TORNADO" + elif ( + bpy.context.scene.refreshVer == "Refresh 5" + or bpy.context.scene.refreshVer == "Refresh 4" + or bpy.context.scene.refreshVer == "Refresh 3" + ): + if modelID == "MODEL_TWEESTER": + modelID = "MODEL_TORNADO" + elif modelID == "MODEL_WAVE_TRAIL": + modelID = "MODEL_WATER_WAVES" + elif modelID == "MODEL_IDLE_WATER_WAVE": + modelID = "MODEL_WATER_WAVES_SURF" + elif modelID == "MODEL_SMALL_WATER_SPLASH": + modelID = "MODEL_SPOT_ON_GROUND" + + return modelID + def handleRefreshDiffSpecials(preset): - if bpy.context.scene.refreshVer == 'Refresh 8' or \ - bpy.context.scene.refreshVer == 'Refresh 7' or \ - bpy.context.scene.refreshVer == 'Refresh 6' or \ - bpy.context.scene.refreshVer == 'Refresh 5' or \ - bpy.context.scene.refreshVer == 'Refresh 4' or \ - bpy.context.scene.refreshVer == 'Refresh 3': - pass - return preset + if ( + bpy.context.scene.refreshVer == "Refresh 8" + or bpy.context.scene.refreshVer == "Refresh 7" + or bpy.context.scene.refreshVer == "Refresh 6" + or bpy.context.scene.refreshVer == "Refresh 5" + or bpy.context.scene.refreshVer == "Refresh 4" + or bpy.context.scene.refreshVer == "Refresh 3" + ): + pass + return preset + def handleRefreshDiffMacros(preset): - if bpy.context.scene.refreshVer == 'Refresh 8' or \ - bpy.context.scene.refreshVer == 'Refresh 7' or \ - bpy.context.scene.refreshVer == 'Refresh 6' or \ - bpy.context.scene.refreshVer == 'Refresh 5' or \ - bpy.context.scene.refreshVer == 'Refresh 4' or \ - bpy.context.scene.refreshVer == 'Refresh 3': - pass - return preset + if ( + bpy.context.scene.refreshVer == "Refresh 8" + or bpy.context.scene.refreshVer == "Refresh 7" + or bpy.context.scene.refreshVer == "Refresh 6" + or bpy.context.scene.refreshVer == "Refresh 5" + or bpy.context.scene.refreshVer == "Refresh 4" + or bpy.context.scene.refreshVer == "Refresh 3" + ): + pass + return preset + def start_process_sm64_objects(obj, area, transformMatrix, specialsOnly): - #spaceRotation = mathutils.Quaternion((1, 0, 0), math.radians(90.0)).to_matrix().to_4x4() + # spaceRotation = mathutils.Quaternion((1, 0, 0), math.radians(90.0)).to_matrix().to_4x4() + + # We want translations to be relative to area obj, but rotation/scale to be world space + translation, rotation, scale = obj.matrix_world.decompose() + process_sm64_objects( + obj, + area, + mathutils.Matrix.Translation(translation), + transformMatrix, + specialsOnly, + ) - # We want translations to be relative to area obj, but rotation/scale to be world space - translation, rotation, scale = obj.matrix_world.decompose() - process_sm64_objects(obj, area, - mathutils.Matrix.Translation(translation), transformMatrix, specialsOnly) def process_sm64_objects(obj, area, rootMatrix, transformMatrix, specialsOnly): - translation, originalRotation, scale = \ - (transformMatrix @ rootMatrix.inverted() @ obj.matrix_world).decompose() - - finalTransform = mathutils.Matrix.Translation(translation) @ \ - originalRotation.to_matrix().to_4x4() @ \ - mathutils.Matrix.Diagonal(scale).to_4x4() - - # Hacky solution to handle Z-up to Y-up conversion - rotation = originalRotation @ mathutils.Quaternion((1, 0, 0), math.radians(90.0)) - - if obj.data is None: - if obj.sm64_obj_type == 'Area Root' and obj.areaIndex != area.index: - return - if specialsOnly: - if obj.sm64_obj_type == 'Special': - preset = obj.sm64_special_enum if obj.sm64_special_enum != 'Custom' else obj.sm64_obj_preset - preset = handleRefreshDiffSpecials(preset) - area.specials.append(SM64_Special_Object(preset, translation, - rotation.to_euler() if obj.sm64_obj_set_yaw else None, - obj.fast64.sm64.game_object.get_behavior_params() if (obj.sm64_obj_set_yaw and obj.sm64_obj_set_bparam) else None)) - elif obj.sm64_obj_type == 'Water Box': - checkIdentityRotation(obj, rotation, False) - area.water_boxes.append(CollisionWaterBox(obj.waterBoxType, - translation, scale, obj.empty_display_size)) - else: - if obj.sm64_obj_type == 'Object': - modelID = obj.sm64_model_enum if obj.sm64_model_enum != 'Custom' else obj.sm64_obj_model - modelID = handleRefreshDiffModelIDs(modelID) - behaviour = func_map[bpy.context.scene.refreshVer][obj.sm64_behaviour_enum] if \ - obj.sm64_behaviour_enum != 'Custom' else obj.sm64_obj_behaviour - area.objects.append(SM64_Object(modelID, translation, rotation.to_euler(), - behaviour, obj.fast64.sm64.game_object.get_behavior_params(), get_act_string(obj))) - elif obj.sm64_obj_type == 'Macro': - macro = obj.sm64_macro_enum if obj.sm64_macro_enum != 'Custom' else obj.sm64_obj_preset - area.macros.append(SM64_Macro_Object(macro, translation, rotation.to_euler(), - obj.fast64.sm64.game_object.get_behavior_params() if obj.sm64_obj_set_bparam else None)) - elif obj.sm64_obj_type == 'Mario Start': - mario_start = SM64_Mario_Start(obj.sm64_obj_mario_start_area, translation, rotation.to_euler()) - area.objects.append(mario_start) - area.mario_start = mario_start - elif obj.sm64_obj_type == 'Trajectory': - pass - elif obj.sm64_obj_type == 'Whirpool': - area.objects.append(SM64_Whirpool(obj.whirlpool_index, - obj.whirpool_condition, obj.whirpool_strength, translation)) - elif obj.sm64_obj_type == 'Camera Volume': - checkIdentityRotation(obj, rotation, True) - if obj.cameraVolumeGlobal: - triggerIndex = -1 - else: - triggerIndex = area.index - area.cameraVolumes.append(CameraVolume(triggerIndex, obj.cameraVolumeFunction, - translation, rotation.to_euler(), scale, obj.empty_display_size)) - - elif obj.sm64_obj_type == 'Puppycam Volume': - checkIdentityRotation(obj, rotation, False) - - triggerIndex = area.index - puppycamProp = obj.puppycamProp - if(puppycamProp.puppycamUseFlags): - puppycamModeString = '0' - if puppycamProp.NC_FLAG_XTURN: - puppycamModeString += " | NC_FLAG_XTURN" - if puppycamProp.NC_FLAG_YTURN: - puppycamModeString += " | NC_FLAG_YTURN" - if puppycamProp.NC_FLAG_ZOOM: - puppycamModeString += " | NC_FLAG_ZOOM" - if puppycamProp.NC_FLAG_8D: - puppycamModeString += " | NC_FLAG_8D" - if puppycamProp.NC_FLAG_4D: - puppycamModeString += " | NC_FLAG_4D" - if puppycamProp.NC_FLAG_2D: - puppycamModeString += " | NC_FLAG_2D" - if puppycamProp.NC_FLAG_FOCUSX: - puppycamModeString += " | NC_FLAG_FOCUSX" - if puppycamProp.NC_FLAG_FOCUSY: - puppycamModeString += " | NC_FLAG_FOCUSY" - if puppycamProp.NC_FLAG_FOCUSZ: - puppycamModeString += " | NC_FLAG_FOCUSZ" - if puppycamProp.NC_FLAG_POSX: - puppycamModeString += " | NC_FLAG_POSX" - if puppycamProp.NC_FLAG_POSY: - puppycamModeString += " | NC_FLAG_POSY" - if puppycamProp.NC_FLAG_POSZ: - puppycamModeString += " | NC_FLAG_POSZ" - if puppycamProp.NC_FLAG_COLLISION: - puppycamModeString += " | NC_FLAG_COLLISION" - if puppycamProp.NC_FLAG_SLIDECORRECT: - puppycamModeString += " | NC_FLAG_SLIDECORRECT" - else: - puppycamModeString = (puppycamProp.puppycamMode if puppycamProp.puppycamMode != 'Custom' else puppycamProp.puppycamType) - - - if (not puppycamProp.puppycamUseEmptiesForPos) and puppycamProp.puppycamCamera is not None: - puppycamCamPosCoords = puppycamProp.puppycamCamera.location - elif puppycamProp.puppycamUseEmptiesForPos and puppycamProp.puppycamCamPos != "": - puppycamPosObject = bpy.context.scene.objects[puppycamProp.puppycamCamPos] - puppycamCamPosCoords = puppycamPosObject.location - else: - puppycamCamPosCoords = (32767, 32767, 32767) - - if (not puppycamProp.puppycamUseEmptiesForPos) and puppycamProp.puppycamCamera is not None: - puppycamCamFocusCoords = (puppycamProp.puppycamCamera.matrix_local @ mathutils.Vector((0, 0, -1)))[:] - elif puppycamProp.puppycamUseEmptiesForPos and puppycamProp.puppycamCamFocus != "": - puppycamFocObject = bpy.context.scene.objects[puppycamProp.puppycamCamFocus] - puppycamCamFocusCoords = puppycamFocObject.location - else: - puppycamCamFocusCoords = (32767, 32767, 32767) - - area.puppycamVolumes.append(PuppycamVolume(triggerIndex, levelIDNames[bpy.data.scenes["Scene"].levelOption], - puppycamProp.puppycamVolumePermaswap, puppycamProp.puppycamVolumeFunction, translation, scale, obj.empty_display_size, puppycamCamPosCoords, puppycamCamFocusCoords, puppycamModeString)) - - - elif not specialsOnly and assertCurveValid(obj): - area.splines.append(convertSplineObject(area.name + '_spline_' + obj.name , obj, finalTransform)) - - - for child in obj.children: - process_sm64_objects(child, area, rootMatrix, transformMatrix, specialsOnly) + translation, originalRotation, scale = ( + transformMatrix @ rootMatrix.inverted() @ obj.matrix_world + ).decompose() + + finalTransform = ( + mathutils.Matrix.Translation(translation) + @ originalRotation.to_matrix().to_4x4() + @ mathutils.Matrix.Diagonal(scale).to_4x4() + ) + + # Hacky solution to handle Z-up to Y-up conversion + rotation = originalRotation @ mathutils.Quaternion((1, 0, 0), math.radians(90.0)) + + if obj.data is None: + if obj.sm64_obj_type == "Area Root" and obj.areaIndex != area.index: + return + if specialsOnly: + if obj.sm64_obj_type == "Special": + preset = ( + obj.sm64_special_enum + if obj.sm64_special_enum != "Custom" + else obj.sm64_obj_preset + ) + preset = handleRefreshDiffSpecials(preset) + area.specials.append( + SM64_Special_Object( + preset, + translation, + rotation.to_euler() if obj.sm64_obj_set_yaw else None, + obj.fast64.sm64.game_object.get_behavior_params() + if (obj.sm64_obj_set_yaw and obj.sm64_obj_set_bparam) + else None, + ) + ) + elif obj.sm64_obj_type == "Water Box": + checkIdentityRotation(obj, rotation, False) + area.water_boxes.append( + CollisionWaterBox( + obj.waterBoxType, translation, scale, obj.empty_display_size + ) + ) + else: + if obj.sm64_obj_type == "Object": + modelID = ( + obj.sm64_model_enum + if obj.sm64_model_enum != "Custom" + else obj.sm64_obj_model + ) + modelID = handleRefreshDiffModelIDs(modelID) + behaviour = ( + func_map[bpy.context.scene.refreshVer][obj.sm64_behaviour_enum] + if obj.sm64_behaviour_enum != "Custom" + else obj.sm64_obj_behaviour + ) + area.objects.append( + SM64_Object( + modelID, + translation, + rotation.to_euler(), + behaviour, + obj.fast64.sm64.game_object.get_behavior_params(), + get_act_string(obj), + ) + ) + elif obj.sm64_obj_type == "Macro": + macro = ( + obj.sm64_macro_enum + if obj.sm64_macro_enum != "Custom" + else obj.sm64_obj_preset + ) + area.macros.append( + SM64_Macro_Object( + macro, + translation, + rotation.to_euler(), + obj.fast64.sm64.game_object.get_behavior_params() + if obj.sm64_obj_set_bparam + else None, + ) + ) + elif obj.sm64_obj_type == "Mario Start": + mario_start = SM64_Mario_Start( + obj.sm64_obj_mario_start_area, translation, rotation.to_euler() + ) + area.objects.append(mario_start) + area.mario_start = mario_start + elif obj.sm64_obj_type == "Trajectory": + pass + elif obj.sm64_obj_type == "Whirpool": + area.objects.append( + SM64_Whirpool( + obj.whirlpool_index, + obj.whirpool_condition, + obj.whirpool_strength, + translation, + ) + ) + elif obj.sm64_obj_type == "Camera Volume": + checkIdentityRotation(obj, rotation, True) + if obj.cameraVolumeGlobal: + triggerIndex = -1 + else: + triggerIndex = area.index + area.cameraVolumes.append( + CameraVolume( + triggerIndex, + obj.cameraVolumeFunction, + translation, + rotation.to_euler(), + scale, + obj.empty_display_size, + ) + ) + + elif obj.sm64_obj_type == "Puppycam Volume": + checkIdentityRotation(obj, rotation, False) + + triggerIndex = area.index + puppycamProp = obj.puppycamProp + if puppycamProp.puppycamUseFlags: + puppycamModeString = "0" + if puppycamProp.NC_FLAG_XTURN: + puppycamModeString += " | NC_FLAG_XTURN" + if puppycamProp.NC_FLAG_YTURN: + puppycamModeString += " | NC_FLAG_YTURN" + if puppycamProp.NC_FLAG_ZOOM: + puppycamModeString += " | NC_FLAG_ZOOM" + if puppycamProp.NC_FLAG_8D: + puppycamModeString += " | NC_FLAG_8D" + if puppycamProp.NC_FLAG_4D: + puppycamModeString += " | NC_FLAG_4D" + if puppycamProp.NC_FLAG_2D: + puppycamModeString += " | NC_FLAG_2D" + if puppycamProp.NC_FLAG_FOCUSX: + puppycamModeString += " | NC_FLAG_FOCUSX" + if puppycamProp.NC_FLAG_FOCUSY: + puppycamModeString += " | NC_FLAG_FOCUSY" + if puppycamProp.NC_FLAG_FOCUSZ: + puppycamModeString += " | NC_FLAG_FOCUSZ" + if puppycamProp.NC_FLAG_POSX: + puppycamModeString += " | NC_FLAG_POSX" + if puppycamProp.NC_FLAG_POSY: + puppycamModeString += " | NC_FLAG_POSY" + if puppycamProp.NC_FLAG_POSZ: + puppycamModeString += " | NC_FLAG_POSZ" + if puppycamProp.NC_FLAG_COLLISION: + puppycamModeString += " | NC_FLAG_COLLISION" + if puppycamProp.NC_FLAG_SLIDECORRECT: + puppycamModeString += " | NC_FLAG_SLIDECORRECT" + else: + puppycamModeString = ( + puppycamProp.puppycamMode + if puppycamProp.puppycamMode != "Custom" + else puppycamProp.puppycamType + ) + + if ( + not puppycamProp.puppycamUseEmptiesForPos + ) and puppycamProp.puppycamCamera is not None: + puppycamCamPosCoords = puppycamProp.puppycamCamera.location + elif ( + puppycamProp.puppycamUseEmptiesForPos + and puppycamProp.puppycamCamPos != "" + ): + puppycamPosObject = bpy.context.scene.objects[ + puppycamProp.puppycamCamPos + ] + puppycamCamPosCoords = puppycamPosObject.location + else: + puppycamCamPosCoords = (32767, 32767, 32767) + + if ( + not puppycamProp.puppycamUseEmptiesForPos + ) and puppycamProp.puppycamCamera is not None: + puppycamCamFocusCoords = ( + puppycamProp.puppycamCamera.matrix_local + @ mathutils.Vector((0, 0, -1)) + )[:] + elif ( + puppycamProp.puppycamUseEmptiesForPos + and puppycamProp.puppycamCamFocus != "" + ): + puppycamFocObject = bpy.context.scene.objects[ + puppycamProp.puppycamCamFocus + ] + puppycamCamFocusCoords = puppycamFocObject.location + else: + puppycamCamFocusCoords = (32767, 32767, 32767) + + area.puppycamVolumes.append( + PuppycamVolume( + triggerIndex, + levelIDNames[bpy.data.scenes["Scene"].levelOption], + puppycamProp.puppycamVolumePermaswap, + puppycamProp.puppycamVolumeFunction, + translation, + scale, + obj.empty_display_size, + puppycamCamPosCoords, + puppycamCamFocusCoords, + puppycamModeString, + ) + ) + + elif not specialsOnly and assertCurveValid(obj): + area.splines.append( + convertSplineObject(area.name + "_spline_" + obj.name, obj, finalTransform) + ) + + for child in obj.children: + process_sm64_objects(child, area, rootMatrix, transformMatrix, specialsOnly) + def get_act_string(obj): - if obj.sm64_obj_use_act1 and obj.sm64_obj_use_act2 and obj.sm64_obj_use_act3 and \ - obj.sm64_obj_use_act4 and obj.sm64_obj_use_act5 and obj.sm64_obj_use_act6: - return 0x1F - elif not obj.sm64_obj_use_act1 and not obj.sm64_obj_use_act2 and not obj.sm64_obj_use_act3 and \ - not obj.sm64_obj_use_act4 and not obj.sm64_obj_use_act5 and not obj.sm64_obj_use_act6: - return 0 - else: - data = '' - if obj.sm64_obj_use_act1: - data += (" | " if len(data) > 0 else '') + 'ACT_1' - if obj.sm64_obj_use_act2: - data += (" | " if len(data) > 0 else '') + 'ACT_2' - if obj.sm64_obj_use_act3: - data += (" | " if len(data) > 0 else '') + 'ACT_3' - if obj.sm64_obj_use_act4: - data += (" | " if len(data) > 0 else '') + 'ACT_4' - if obj.sm64_obj_use_act5: - data += (" | " if len(data) > 0 else '') + 'ACT_5' - if obj.sm64_obj_use_act6: - data += (" | " if len(data) > 0 else '') + 'ACT_6' - return data + if ( + obj.sm64_obj_use_act1 + and obj.sm64_obj_use_act2 + and obj.sm64_obj_use_act3 + and obj.sm64_obj_use_act4 + and obj.sm64_obj_use_act5 + and obj.sm64_obj_use_act6 + ): + return 0x1F + elif ( + not obj.sm64_obj_use_act1 + and not obj.sm64_obj_use_act2 + and not obj.sm64_obj_use_act3 + and not obj.sm64_obj_use_act4 + and not obj.sm64_obj_use_act5 + and not obj.sm64_obj_use_act6 + ): + return 0 + else: + data = "" + if obj.sm64_obj_use_act1: + data += (" | " if len(data) > 0 else "") + "ACT_1" + if obj.sm64_obj_use_act2: + data += (" | " if len(data) > 0 else "") + "ACT_2" + if obj.sm64_obj_use_act3: + data += (" | " if len(data) > 0 else "") + "ACT_3" + if obj.sm64_obj_use_act4: + data += (" | " if len(data) > 0 else "") + "ACT_4" + if obj.sm64_obj_use_act5: + data += (" | " if len(data) > 0 else "") + "ACT_5" + if obj.sm64_obj_use_act6: + data += (" | " if len(data) > 0 else "") + "ACT_6" + return data + class SearchModelIDEnumOperator(bpy.types.Operator): - bl_idname = "object.search_model_id_enum_operator" - bl_label = "Search Model IDs" - bl_property = "sm64_model_enum" - bl_options = {'REGISTER', 'UNDO'} + bl_idname = "object.search_model_id_enum_operator" + bl_label = "Search Model IDs" + bl_property = "sm64_model_enum" + bl_options = {"REGISTER", "UNDO"} + + sm64_model_enum: bpy.props.EnumProperty(items=enumModelIDs) - sm64_model_enum : bpy.props.EnumProperty(items = enumModelIDs) + def execute(self, context): + context.object.sm64_model_enum = self.sm64_model_enum + bpy.context.region.tag_redraw() + self.report({"INFO"}, "Selected: " + self.sm64_model_enum) + return {"FINISHED"} - def execute(self, context): - context.object.sm64_model_enum = self.sm64_model_enum - bpy.context.region.tag_redraw() - self.report({'INFO'}, "Selected: " + self.sm64_model_enum) - return {'FINISHED'} + def invoke(self, context, event): + context.window_manager.invoke_search_popup(self) + return {"RUNNING_MODAL"} - def invoke(self, context, event): - context.window_manager.invoke_search_popup(self) - return {'RUNNING_MODAL'} class SearchBehaviourEnumOperator(bpy.types.Operator): - bl_idname = "object.search_behaviour_enum_operator" - bl_label = "Search Behaviours" - bl_property = "sm64_behaviour_enum" - bl_options = {'REGISTER', 'UNDO'} + bl_idname = "object.search_behaviour_enum_operator" + bl_label = "Search Behaviours" + bl_property = "sm64_behaviour_enum" + bl_options = {"REGISTER", "UNDO"} - sm64_behaviour_enum : bpy.props.EnumProperty(items = enumBehaviourPresets) + sm64_behaviour_enum: bpy.props.EnumProperty(items=enumBehaviourPresets) - def execute(self, context): - context.object.sm64_behaviour_enum = self.sm64_behaviour_enum - bpy.context.region.tag_redraw() - name = func_map[context.scene.refreshVer][self.sm64_behaviour_enum] if \ - self.sm64_behaviour_enum != 'Custom' else 'Custom' - self.report({'INFO'}, "Selected: " + name) - return {'FINISHED'} + def execute(self, context): + context.object.sm64_behaviour_enum = self.sm64_behaviour_enum + bpy.context.region.tag_redraw() + name = ( + func_map[context.scene.refreshVer][self.sm64_behaviour_enum] + if self.sm64_behaviour_enum != "Custom" + else "Custom" + ) + self.report({"INFO"}, "Selected: " + name) + return {"FINISHED"} + + def invoke(self, context, event): + context.window_manager.invoke_search_popup(self) + return {"RUNNING_MODAL"} - def invoke(self, context, event): - context.window_manager.invoke_search_popup(self) - return {'RUNNING_MODAL'} class SearchMacroEnumOperator(bpy.types.Operator): - bl_idname = "object.search_macro_enum_operator" - bl_label = "Search Macros" - bl_property = "sm64_macro_enum" - bl_options = {'REGISTER', 'UNDO'} + bl_idname = "object.search_macro_enum_operator" + bl_label = "Search Macros" + bl_property = "sm64_macro_enum" + bl_options = {"REGISTER", "UNDO"} + + sm64_macro_enum: bpy.props.EnumProperty(items=enumMacrosNames) - sm64_macro_enum : bpy.props.EnumProperty(items = enumMacrosNames) + def execute(self, context): + context.object.sm64_macro_enum = self.sm64_macro_enum + bpy.context.region.tag_redraw() + self.report({"INFO"}, "Selected: " + self.sm64_macro_enum) + return {"FINISHED"} - def execute(self, context): - context.object.sm64_macro_enum = self.sm64_macro_enum - bpy.context.region.tag_redraw() - self.report({'INFO'}, "Selected: " + self.sm64_macro_enum) - return {'FINISHED'} + def invoke(self, context, event): + context.window_manager.invoke_search_popup(self) + return {"RUNNING_MODAL"} - def invoke(self, context, event): - context.window_manager.invoke_search_popup(self) - return {'RUNNING_MODAL'} class SearchSpecialEnumOperator(bpy.types.Operator): - bl_idname = "object.search_special_enum_operator" - bl_label = "Search Specials" - bl_property = "sm64_special_enum" - bl_options = {'REGISTER', 'UNDO'} + bl_idname = "object.search_special_enum_operator" + bl_label = "Search Specials" + bl_property = "sm64_special_enum" + bl_options = {"REGISTER", "UNDO"} - sm64_special_enum : bpy.props.EnumProperty(items = enumSpecialsNames) + sm64_special_enum: bpy.props.EnumProperty(items=enumSpecialsNames) - def execute(self, context): - context.object.sm64_special_enum = self.sm64_special_enum - bpy.context.region.tag_redraw() - self.report({'INFO'}, "Selected: " + self.sm64_special_enum) - return {'FINISHED'} + def execute(self, context): + context.object.sm64_special_enum = self.sm64_special_enum + bpy.context.region.tag_redraw() + self.report({"INFO"}, "Selected: " + self.sm64_special_enum) + return {"FINISHED"} + + def invoke(self, context, event): + context.window_manager.invoke_search_popup(self) + return {"RUNNING_MODAL"} - def invoke(self, context, event): - context.window_manager.invoke_search_popup(self) - return {'RUNNING_MODAL'} class SM64ObjectPanel(bpy.types.Panel): - bl_label = "Object Inspector" - bl_idname = "OBJECT_PT_SM64_Object_Inspector" - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "object" - bl_options = {'HIDE_HEADER'} - - @classmethod - def poll(cls, context): - return context.scene.gameEditorMode == "SM64" and (context.object is not None and context.object.data is None) - - def draw_inline_obj(self, box: bpy.types.UILayout, obj: bpy.types.Object): - obj_details: InlineGeolayoutObjConfig = inlineGeoLayoutObjects.get(obj.sm64_obj_type) - - # display transformation warnings - warnings = set() - if obj_details.uses_scale and not obj_scale_is_unified(obj): - warnings.add("Object's scale must all be the same exact value (e.g. 2, 2, 2)") - - if not obj_details.uses_scale and not all_values_equal_x(obj.scale, 1): - warnings.add("Object's scale values must all be set to 1") - - loc = obj.matrix_local.decompose()[0] - if not obj_details.uses_location and not all_values_equal_x(loc, 0): - warnings.add("Object's relative location must be set to 0") - - if not obj_details.uses_rotation and not all_values_equal_x(obj.rotation_euler, 0): - warnings.add("Object's rotations must be set to 0") - - if len(warnings): - warning_box = box.box() - warning_box.alert = True - warning_box.label(text = "Warning: Unexpected export results from these issues:", icon = 'ERROR') - for warning in warnings: - warning_box.label(text = warning, icon = 'ERROR') - warning_box.label(text = f'Relative location: {", ".join([str(l) for l in loc])}') - - if obj.sm64_obj_type == 'Geo ASM': - prop_split(box, obj.fast64.sm64.geo_asm, 'func', 'Function') - prop_split(box, obj.fast64.sm64.geo_asm, 'param', 'Parameter') - return - - elif obj.sm64_obj_type == 'Custom Geo Command': - prop_split(box, obj, 'customGeoCommand', 'Geo Macro') - prop_split(box, obj, 'customGeoCommandArgs', 'Parameters') - return - - if obj_details.can_have_dl: - prop_split(box, obj, 'draw_layer_static', 'Draw Layer') - - if not obj_details.must_have_dl: - prop_split(box, obj, 'useDLReference', 'Use DL Reference') - - if obj_details.must_have_dl or obj.useDLReference: - # option to specify a mesh instead of string reference - prop_split(box, obj, 'dlReference', 'Displaylist variable or hex address') - - if obj_details.must_have_geo: - prop_split(box, obj, 'geoReference', 'Geolayout variable or hex address') - - if obj_details.uses_rotation or obj_details.uses_location or obj_details.uses_scale: - info_box = box.box() - info_box.label(text = "Note: uses empty object's:") - if obj_details.uses_location: - info_box.label(text = 'Location', icon = 'DOT') - if obj_details.uses_rotation: - info_box.label(text = 'Rotation', icon = 'DOT') - if obj_details.uses_scale: - info_box.label(text = 'Scale', icon = 'DOT') - - if len(obj.children): - if checkIsSM64PreInlineGeoLayout(obj.sm64_obj_type): - box.box().label(text = 'Children of this object will just be the following geo commands.') - else: - box.box().label(text = 'Children of this object will be wrapped in GEO_OPEN_NODE and GEO_CLOSE_NODE.') - - def draw_behavior_params(self, obj: bpy.types.Object, parent_box: bpy.types.UILayout): - game_object = obj.fast64.sm64.game_object # .bparams - parent_box.separator() - box = parent_box.box() - box.label(text = "Behavior Parameters") - - box.prop(game_object, 'use_individual_params', text = "Use Individual Behavior Params") - - if game_object.use_individual_params: - individuals = box.box() - individuals.label(text = "Individual Behavior Parameters") - row = individuals.row() - for i in range(1, 5): - column = row.column() - column.label(text = f"Param {i}") - column.prop(game_object, f'bparam{i}', text="") - individuals.separator() - individuals.label(text = f"Result: {game_object.get_combined_bparams()}") - else: - box.separator() - box.label(text = "All Behavior Parameters") - box.prop(game_object, 'bparams', text="") - parent_box.separator() - - def draw(self, context): - prop_split(self.layout, context.scene, "gameEditorMode", "Game") - box = self.layout.box().column() - column = self.layout.box().column() # added just for puppycam trigger importing - box.box().label(text = 'SM64 Object Inspector') - obj = context.object - prop_split(box, obj, 'sm64_obj_type', 'Object Type') - if obj.sm64_obj_type == 'Object': - prop_split(box, obj, 'sm64_model_enum', 'Model') - if obj.sm64_model_enum == 'Custom': - prop_split(box, obj, 'sm64_obj_model', 'Model ID') - box.operator(SearchModelIDEnumOperator.bl_idname, icon = 'VIEWZOOM') - box.box().label(text = 'Model IDs defined in include/model_ids.h.') - prop_split(box, obj, 'sm64_behaviour_enum', 'Behaviour') - if obj.sm64_behaviour_enum == 'Custom': - prop_split(box, obj, 'sm64_obj_behaviour', 'Behaviour Name') - box.operator(SearchBehaviourEnumOperator.bl_idname, icon = 'VIEWZOOM') - behaviourLabel = box.box() - behaviourLabel.label(text = 'Behaviours defined in include/behaviour_data.h.') - behaviourLabel.label(text = 'Actual contents in data/behaviour_data.c.') - self.draw_behavior_params(obj, box) - self.draw_acts(obj, box) - - elif obj.sm64_obj_type == 'Macro': - prop_split(box, obj, 'sm64_macro_enum', 'Preset') - if obj.sm64_macro_enum == 'Custom': - prop_split(box, obj, 'sm64_obj_preset', 'Preset Name') - box.operator(SearchMacroEnumOperator.bl_idname, icon = 'VIEWZOOM') - box.box().label(text = 'Macro presets defined in include/macro_preset_names.h.') - box.prop(obj, 'sm64_obj_set_bparam', text = 'Set Behaviour Parameter') - if obj.sm64_obj_set_bparam: - self.draw_behavior_params(obj, box) - - elif obj.sm64_obj_type == 'Special': - prop_split(box, obj, 'sm64_special_enum', 'Preset') - if obj.sm64_special_enum == 'Custom': - prop_split(box, obj, 'sm64_obj_preset', 'Preset Name') - box.operator(SearchSpecialEnumOperator.bl_idname, icon = 'VIEWZOOM') - box.box().label(text = 'Special presets defined in include/special_preset_names.h.') - box.prop(obj, 'sm64_obj_set_yaw', text = 'Set Yaw') - if obj.sm64_obj_set_yaw: - box.prop(obj, 'sm64_obj_set_bparam', text = 'Set Behaviour Parameter') - if obj.sm64_obj_set_bparam: - self.draw_behavior_params(obj, box) - - elif obj.sm64_obj_type == 'Mario Start': - prop_split(box, obj, 'sm64_obj_mario_start_area', 'Area') - - elif obj.sm64_obj_type == 'Trajectory': - pass - - elif obj.sm64_obj_type == 'Whirlpool': - prop_split(box, obj, 'whirpool_index', 'Index') - prop_split(box, obj, 'whirpool_condition', 'Condition') - prop_split(box, obj, 'whirpool_strength', 'Strength') - pass - - elif obj.sm64_obj_type == 'Water Box': - prop_split(box, obj, 'waterBoxType', 'Water Box Type') - box.box().label(text = "Water box area defined by top face of box shaped empty.") - box.box().label(text = "No rotation allowed.") - - elif obj.sm64_obj_type == 'Level Root': - levelObj = obj.fast64.sm64.level - if obj.useBackgroundColor: - prop_split(box, obj, 'backgroundColor', 'Background Color') - box.prop(obj, 'useBackgroundColor') - else: - #prop_split(box, obj, 'backgroundID', 'Background ID') - prop_split(box, obj, 'background', 'Background') - if obj.background == 'CUSTOM': - prop_split(box, levelObj, 'backgroundID', 'Custom ID') - prop_split(box, levelObj, 'backgroundSegment', 'Custom Background Segment') - segmentExportBox = box.box() - segmentExportBox.label(text = f'Exported Segment: _{levelObj.backgroundSegment}_{context.scene.compressionFormat}SegmentRomStart') - box.prop(obj, 'useBackgroundColor') - #box.box().label(text = 'Background IDs defined in include/geo_commands.h.') - box.prop(obj, 'actSelectorIgnore') - box.prop(obj, 'setAsStartLevel') - prop_split(box, obj, 'acousticReach', 'Acoustic Reach') - obj.starGetCutscenes.draw(box) - - elif obj.sm64_obj_type == 'Area Root': - # Code that used to be in area inspector - prop_split(box, obj, 'areaIndex', 'Area Index') - box.prop(obj, 'noMusic', text = 'Disable Music') - if not obj.noMusic: - prop_split(box, obj, 'music_preset', 'Music Preset') - prop_split(box, obj, 'musicSeqEnum', 'Music Sequence') - if obj.musicSeqEnum == 'Custom': - prop_split(box, obj, 'music_seq', '') - - prop_split(box, obj, 'terrainEnum', 'Terrain') - if obj.terrainEnum == 'Custom': - prop_split(box, obj, 'terrain_type', '') - prop_split(box, obj, 'envOption', 'Environment Type') - if obj.envOption == 'Custom': - prop_split(box, obj, 'envType', "") - prop_split(box, obj, 'camOption', 'Camera Type') - if obj.camOption == 'Custom': - prop_split(box, obj, 'camType', '') - camBox = box.box() - camBox.label(text = 'Warning: Camera modes can be overriden by area specific camera code.') - camBox.label(text = 'Check the switch statment in camera_course_processing() in src/game/camera.c.') - - fogBox = box.box() - fogInfoBox = fogBox.box() - fogInfoBox.label(text = 'Warning: Fog only applies to materials that:') - fogInfoBox.label(text = '- use fog') - fogInfoBox.label(text = '- have global fog enabled.') - prop_split(fogBox, obj, 'area_fog_color', 'Area Fog Color') - prop_split(fogBox, obj, 'area_fog_position', 'Area Fog Position') - - if obj.areaIndex == 1 or obj.areaIndex == 2 or obj.areaIndex == 3: - prop_split(box, obj, 'echoLevel', 'Echo Level') - - if obj.areaIndex == 1 or obj.areaIndex == 2 or obj.areaIndex == 3 or obj.areaIndex == 4: - box.prop(obj, 'zoomOutOnPause') - - box.prop(obj.fast64.sm64.area, 'disable_background') - - areaLayout = box.box() - areaLayout.enabled = not obj.fast64.sm64.area.disable_background - areaLayout.prop(obj, 'areaOverrideBG') - if obj.areaOverrideBG: - prop_split(areaLayout, obj, 'areaBGColor', 'Background Color') - - box.prop(obj, 'showStartDialog') - if obj.showStartDialog: - prop_split(box, obj, 'startDialog', "Start Dialog") - dialogBox = box.box() - dialogBox.label(text = 'See text/us/dialogs.h for values.') - dialogBox.label(text = 'See load_level_init_text() in src/game/level_update.c for conditions.') - box.prop(obj, 'enableRoomSwitch') - if obj.enableRoomSwitch: - infoBox = box.box() - infoBox.label(text = 'Every child hierarchy of the area root will be treated as its own room (except for the first one.)') - infoBox.label(text = 'You can use empties with the "None" type as empty geolayout nodes to group related geometry under.') - infoBox.label(text = 'Children will ordered alphabetically, with the first child being always visible.') - box.prop(obj, 'useDefaultScreenRect') - if not obj.useDefaultScreenRect: - prop_split(box, obj, 'screenPos', 'Screen Position') - prop_split(box, obj, 'screenSize', 'Screen Size') - - prop_split(box, obj, 'clipPlanes', 'Clip Planes') - - box.label(text = "Warp Nodes") - box.operator(AddWarpNode.bl_idname).option = len(obj.warpNodes) - for i in range(len(obj.warpNodes)): - drawWarpNodeProperty(box, obj.warpNodes[i], i) - - elif obj.sm64_obj_type == 'Camera Volume': - prop_split(box, obj, 'cameraVolumeFunction', 'Camera Function') - box.prop(obj, 'cameraVolumeGlobal') - box.box().label(text = "Only vertical axis rotation allowed.") - - elif obj.sm64_obj_type == 'Puppycam Volume': - puppycamProp = obj.puppycamProp - prop_split(column, puppycamProp, 'puppycamVolumeFunction', 'Puppycam Function') - column.prop(puppycamProp, 'puppycamVolumePermaswap') - column.prop(puppycamProp, 'puppycamUseFlags') - - column.prop(puppycamProp, 'puppycamUseEmptiesForPos') - - if puppycamProp.puppycamUseEmptiesForPos: - column.label(text = "Fixed Camera Position (Optional)") - column.prop_search(puppycamProp, "puppycamCamPos", bpy.data, "objects", text = '') - - column.label(text = "Fixed Camera Focus (Optional)") - column.prop_search(puppycamProp, "puppycamCamFocus", bpy.data, "objects", text = '') - else: - column.label(text = "Fixed Camera Position (Optional)") - column.prop(puppycamProp, "puppycamCamera") - if puppycamProp.puppycamCamera is not None: - column.box().label(text = "FOV not exported, only for preview camera.") - prop_split(column, puppycamProp, 'puppycamFOV', 'Camera FOV') - column.operator("mesh.puppycam_setup_camera", text = 'Setup Camera', icon = 'VIEW_CAMERA') - - if puppycamProp.puppycamUseFlags: - for i, flagSet in enumerate(enumPuppycamFlags): - column.prop(puppycamProp, flagSet[0]) - else: - prop_split(column, puppycamProp, 'puppycamMode', 'Camera Mode') - if puppycamProp.puppycamMode == 'Custom': - prop_split(column, puppycamProp, 'puppycamType', '') - - column.box().label(text = "No rotation allowed.") - - elif obj.sm64_obj_type == 'Switch': - prop_split(box, obj, 'switchFunc', 'Function') - prop_split(box, obj, 'switchParam', 'Parameter') - box.box().label(text = 'Children will ordered alphabetically.') - - elif obj.sm64_obj_type in inlineGeoLayoutObjects: - self.draw_inline_obj(box, obj) - - elif obj.sm64_obj_type == 'None': - box.box().label(text = 'This can be used as an empty transform node in a geolayout hierarchy.') - - def draw_acts(self, obj, layout): - layout.label(text = 'Acts') - acts = layout.row() - self.draw_act(obj, acts, 1) - self.draw_act(obj, acts, 2) - self.draw_act(obj, acts, 3) - self.draw_act(obj, acts, 4) - self.draw_act(obj, acts, 5) - self.draw_act(obj, acts, 6) - - def draw_act(self, obj, layout, value): - layout = layout.column() - layout.label(text = str(value)) - layout.prop(obj, 'sm64_obj_use_act' + str(value), text = '') + bl_label = "Object Inspector" + bl_idname = "OBJECT_PT_SM64_Object_Inspector" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "object" + bl_options = {"HIDE_HEADER"} + + @classmethod + def poll(cls, context): + return context.scene.gameEditorMode == "SM64" and ( + context.object is not None and context.object.data is None + ) + + def draw_inline_obj(self, box: bpy.types.UILayout, obj: bpy.types.Object): + obj_details: InlineGeolayoutObjConfig = inlineGeoLayoutObjects.get( + obj.sm64_obj_type + ) + + # display transformation warnings + warnings = set() + if obj_details.uses_scale and not obj_scale_is_unified(obj): + warnings.add( + "Object's scale must all be the same exact value (e.g. 2, 2, 2)" + ) + + if not obj_details.uses_scale and not all_values_equal_x(obj.scale, 1): + warnings.add("Object's scale values must all be set to 1") + + loc = obj.matrix_local.decompose()[0] + if not obj_details.uses_location and not all_values_equal_x(loc, 0): + warnings.add("Object's relative location must be set to 0") + + if not obj_details.uses_rotation and not all_values_equal_x( + obj.rotation_euler, 0 + ): + warnings.add("Object's rotations must be set to 0") + + if len(warnings): + warning_box = box.box() + warning_box.alert = True + warning_box.label( + text="Warning: Unexpected export results from these issues:", + icon="ERROR", + ) + for warning in warnings: + warning_box.label(text=warning, icon="ERROR") + warning_box.label( + text=f'Relative location: {", ".join([str(l) for l in loc])}' + ) + + if obj.sm64_obj_type == "Geo ASM": + prop_split(box, obj.fast64.sm64.geo_asm, "func", "Function") + prop_split(box, obj.fast64.sm64.geo_asm, "param", "Parameter") + return + + elif obj.sm64_obj_type == "Custom Geo Command": + prop_split(box, obj, "customGeoCommand", "Geo Macro") + prop_split(box, obj, "customGeoCommandArgs", "Parameters") + return + + if obj_details.can_have_dl: + prop_split(box, obj, "draw_layer_static", "Draw Layer") + + if not obj_details.must_have_dl: + prop_split(box, obj, "useDLReference", "Use DL Reference") + + if obj_details.must_have_dl or obj.useDLReference: + # option to specify a mesh instead of string reference + prop_split( + box, obj, "dlReference", "Displaylist variable or hex address" + ) + + if obj_details.must_have_geo: + prop_split(box, obj, "geoReference", "Geolayout variable or hex address") + + if ( + obj_details.uses_rotation + or obj_details.uses_location + or obj_details.uses_scale + ): + info_box = box.box() + info_box.label(text="Note: uses empty object's:") + if obj_details.uses_location: + info_box.label(text="Location", icon="DOT") + if obj_details.uses_rotation: + info_box.label(text="Rotation", icon="DOT") + if obj_details.uses_scale: + info_box.label(text="Scale", icon="DOT") + + if len(obj.children): + if checkIsSM64PreInlineGeoLayout(obj.sm64_obj_type): + box.box().label( + text="Children of this object will just be the following geo commands." + ) + else: + box.box().label( + text="Children of this object will be wrapped in GEO_OPEN_NODE and GEO_CLOSE_NODE." + ) + + def draw_behavior_params( + self, obj: bpy.types.Object, parent_box: bpy.types.UILayout + ): + game_object = obj.fast64.sm64.game_object # .bparams + parent_box.separator() + box = parent_box.box() + box.label(text="Behavior Parameters") + + box.prop( + game_object, "use_individual_params", text="Use Individual Behavior Params" + ) + + if game_object.use_individual_params: + individuals = box.box() + individuals.label(text="Individual Behavior Parameters") + row = individuals.row() + for i in range(1, 5): + column = row.column() + column.label(text=f"Param {i}") + column.prop(game_object, f"bparam{i}", text="") + individuals.separator() + individuals.label(text=f"Result: {game_object.get_combined_bparams()}") + else: + box.separator() + box.label(text="All Behavior Parameters") + box.prop(game_object, "bparams", text="") + parent_box.separator() + + def draw(self, context): + prop_split(self.layout, context.scene, "gameEditorMode", "Game") + box = self.layout.box().column() + column = self.layout.box().column() # added just for puppycam trigger importing + box.box().label(text="SM64 Object Inspector") + obj = context.object + prop_split(box, obj, "sm64_obj_type", "Object Type") + if obj.sm64_obj_type == "Object": + prop_split(box, obj, "sm64_model_enum", "Model") + if obj.sm64_model_enum == "Custom": + prop_split(box, obj, "sm64_obj_model", "Model ID") + box.operator(SearchModelIDEnumOperator.bl_idname, icon="VIEWZOOM") + box.box().label(text="Model IDs defined in include/model_ids.h.") + prop_split(box, obj, "sm64_behaviour_enum", "Behaviour") + if obj.sm64_behaviour_enum == "Custom": + prop_split(box, obj, "sm64_obj_behaviour", "Behaviour Name") + box.operator(SearchBehaviourEnumOperator.bl_idname, icon="VIEWZOOM") + behaviourLabel = box.box() + behaviourLabel.label(text="Behaviours defined in include/behaviour_data.h.") + behaviourLabel.label(text="Actual contents in data/behaviour_data.c.") + self.draw_behavior_params(obj, box) + self.draw_acts(obj, box) + + elif obj.sm64_obj_type == "Macro": + prop_split(box, obj, "sm64_macro_enum", "Preset") + if obj.sm64_macro_enum == "Custom": + prop_split(box, obj, "sm64_obj_preset", "Preset Name") + box.operator(SearchMacroEnumOperator.bl_idname, icon="VIEWZOOM") + box.box().label( + text="Macro presets defined in include/macro_preset_names.h." + ) + box.prop(obj, "sm64_obj_set_bparam", text="Set Behaviour Parameter") + if obj.sm64_obj_set_bparam: + self.draw_behavior_params(obj, box) + + elif obj.sm64_obj_type == "Special": + prop_split(box, obj, "sm64_special_enum", "Preset") + if obj.sm64_special_enum == "Custom": + prop_split(box, obj, "sm64_obj_preset", "Preset Name") + box.operator(SearchSpecialEnumOperator.bl_idname, icon="VIEWZOOM") + box.box().label( + text="Special presets defined in include/special_preset_names.h." + ) + box.prop(obj, "sm64_obj_set_yaw", text="Set Yaw") + if obj.sm64_obj_set_yaw: + box.prop(obj, "sm64_obj_set_bparam", text="Set Behaviour Parameter") + if obj.sm64_obj_set_bparam: + self.draw_behavior_params(obj, box) + + elif obj.sm64_obj_type == "Mario Start": + prop_split(box, obj, "sm64_obj_mario_start_area", "Area") + + elif obj.sm64_obj_type == "Trajectory": + pass + + elif obj.sm64_obj_type == "Whirlpool": + prop_split(box, obj, "whirpool_index", "Index") + prop_split(box, obj, "whirpool_condition", "Condition") + prop_split(box, obj, "whirpool_strength", "Strength") + pass + + elif obj.sm64_obj_type == "Water Box": + prop_split(box, obj, "waterBoxType", "Water Box Type") + box.box().label( + text="Water box area defined by top face of box shaped empty." + ) + box.box().label(text="No rotation allowed.") + + elif obj.sm64_obj_type == "Level Root": + levelObj = obj.fast64.sm64.level + if obj.useBackgroundColor: + prop_split(box, obj, "backgroundColor", "Background Color") + box.prop(obj, "useBackgroundColor") + else: + # prop_split(box, obj, 'backgroundID', 'Background ID') + prop_split(box, obj, "background", "Background") + if obj.background == "CUSTOM": + prop_split(box, levelObj, "backgroundID", "Custom ID") + prop_split( + box, levelObj, "backgroundSegment", "Custom Background Segment" + ) + segmentExportBox = box.box() + segmentExportBox.label( + text=f"Exported Segment: _{levelObj.backgroundSegment}_{context.scene.compressionFormat}SegmentRomStart" + ) + box.prop(obj, "useBackgroundColor") + # box.box().label(text = 'Background IDs defined in include/geo_commands.h.') + box.prop(obj, "actSelectorIgnore") + box.prop(obj, "setAsStartLevel") + prop_split(box, obj, "acousticReach", "Acoustic Reach") + obj.starGetCutscenes.draw(box) + + elif obj.sm64_obj_type == "Area Root": + # Code that used to be in area inspector + prop_split(box, obj, "areaIndex", "Area Index") + box.prop(obj, "noMusic", text="Disable Music") + if not obj.noMusic: + prop_split(box, obj, "music_preset", "Music Preset") + prop_split(box, obj, "musicSeqEnum", "Music Sequence") + if obj.musicSeqEnum == "Custom": + prop_split(box, obj, "music_seq", "") + + prop_split(box, obj, "terrainEnum", "Terrain") + if obj.terrainEnum == "Custom": + prop_split(box, obj, "terrain_type", "") + prop_split(box, obj, "envOption", "Environment Type") + if obj.envOption == "Custom": + prop_split(box, obj, "envType", "") + prop_split(box, obj, "camOption", "Camera Type") + if obj.camOption == "Custom": + prop_split(box, obj, "camType", "") + camBox = box.box() + camBox.label( + text="Warning: Camera modes can be overriden by area specific camera code." + ) + camBox.label( + text="Check the switch statment in camera_course_processing() in src/game/camera.c." + ) + + fogBox = box.box() + fogInfoBox = fogBox.box() + fogInfoBox.label(text="Warning: Fog only applies to materials that:") + fogInfoBox.label(text="- use fog") + fogInfoBox.label(text="- have global fog enabled.") + prop_split(fogBox, obj, "area_fog_color", "Area Fog Color") + prop_split(fogBox, obj, "area_fog_position", "Area Fog Position") + + if obj.areaIndex == 1 or obj.areaIndex == 2 or obj.areaIndex == 3: + prop_split(box, obj, "echoLevel", "Echo Level") + + if ( + obj.areaIndex == 1 + or obj.areaIndex == 2 + or obj.areaIndex == 3 + or obj.areaIndex == 4 + ): + box.prop(obj, "zoomOutOnPause") + + box.prop(obj.fast64.sm64.area, "disable_background") + + areaLayout = box.box() + areaLayout.enabled = not obj.fast64.sm64.area.disable_background + areaLayout.prop(obj, "areaOverrideBG") + if obj.areaOverrideBG: + prop_split(areaLayout, obj, "areaBGColor", "Background Color") + + box.prop(obj, "showStartDialog") + if obj.showStartDialog: + prop_split(box, obj, "startDialog", "Start Dialog") + dialogBox = box.box() + dialogBox.label(text="See text/us/dialogs.h for values.") + dialogBox.label( + text="See load_level_init_text() in src/game/level_update.c for conditions." + ) + box.prop(obj, "enableRoomSwitch") + if obj.enableRoomSwitch: + infoBox = box.box() + infoBox.label( + text="Every child hierarchy of the area root will be treated as its own room (except for the first one.)" + ) + infoBox.label( + text='You can use empties with the "None" type as empty geolayout nodes to group related geometry under.' + ) + infoBox.label( + text="Children will ordered alphabetically, with the first child being always visible." + ) + box.prop(obj, "useDefaultScreenRect") + if not obj.useDefaultScreenRect: + prop_split(box, obj, "screenPos", "Screen Position") + prop_split(box, obj, "screenSize", "Screen Size") + + prop_split(box, obj, "clipPlanes", "Clip Planes") + + box.label(text="Warp Nodes") + box.operator(AddWarpNode.bl_idname).option = len(obj.warpNodes) + for i in range(len(obj.warpNodes)): + drawWarpNodeProperty(box, obj.warpNodes[i], i) + + elif obj.sm64_obj_type == "Camera Volume": + prop_split(box, obj, "cameraVolumeFunction", "Camera Function") + box.prop(obj, "cameraVolumeGlobal") + box.box().label(text="Only vertical axis rotation allowed.") + + elif obj.sm64_obj_type == "Puppycam Volume": + puppycamProp = obj.puppycamProp + prop_split( + column, puppycamProp, "puppycamVolumeFunction", "Puppycam Function" + ) + column.prop(puppycamProp, "puppycamVolumePermaswap") + column.prop(puppycamProp, "puppycamUseFlags") + + column.prop(puppycamProp, "puppycamUseEmptiesForPos") + + if puppycamProp.puppycamUseEmptiesForPos: + column.label(text="Fixed Camera Position (Optional)") + column.prop_search( + puppycamProp, "puppycamCamPos", bpy.data, "objects", text="" + ) + + column.label(text="Fixed Camera Focus (Optional)") + column.prop_search( + puppycamProp, "puppycamCamFocus", bpy.data, "objects", text="" + ) + else: + column.label(text="Fixed Camera Position (Optional)") + column.prop(puppycamProp, "puppycamCamera") + if puppycamProp.puppycamCamera is not None: + column.box().label( + text="FOV not exported, only for preview camera." + ) + prop_split(column, puppycamProp, "puppycamFOV", "Camera FOV") + column.operator( + "mesh.puppycam_setup_camera", + text="Setup Camera", + icon="VIEW_CAMERA", + ) + + if puppycamProp.puppycamUseFlags: + for i, flagSet in enumerate(enumPuppycamFlags): + column.prop(puppycamProp, flagSet[0]) + else: + prop_split(column, puppycamProp, "puppycamMode", "Camera Mode") + if puppycamProp.puppycamMode == "Custom": + prop_split(column, puppycamProp, "puppycamType", "") + + column.box().label(text="No rotation allowed.") + + elif obj.sm64_obj_type == "Switch": + prop_split(box, obj, "switchFunc", "Function") + prop_split(box, obj, "switchParam", "Parameter") + box.box().label(text="Children will ordered alphabetically.") + + elif obj.sm64_obj_type in inlineGeoLayoutObjects: + self.draw_inline_obj(box, obj) + + elif obj.sm64_obj_type == "None": + box.box().label( + text="This can be used as an empty transform node in a geolayout hierarchy." + ) + + def draw_acts(self, obj, layout): + layout.label(text="Acts") + acts = layout.row() + self.draw_act(obj, acts, 1) + self.draw_act(obj, acts, 2) + self.draw_act(obj, acts, 3) + self.draw_act(obj, acts, 4) + self.draw_act(obj, acts, 5) + self.draw_act(obj, acts, 6) + + def draw_act(self, obj, layout, value): + layout = layout.column() + layout.label(text=str(value)) + layout.prop(obj, "sm64_obj_use_act" + str(value), text="") + enumStarGetCutscene = [ - ('Custom', 'Custom', 'Custom'), - ('0', 'Lakitu Flies Away', 'Lakitu Flies Away'), - ('1', 'Rotate Around Mario', 'Rotate Around Mario'), - ('2', 'Closeup Of Mario', 'Closeup Of Mario'), - ('3', 'Bowser Keys', 'Bowser Keys'), - ('4', '100 Coin Star', '100 Coin Star'), + ("Custom", "Custom", "Custom"), + ("0", "Lakitu Flies Away", "Lakitu Flies Away"), + ("1", "Rotate Around Mario", "Rotate Around Mario"), + ("2", "Closeup Of Mario", "Closeup Of Mario"), + ("3", "Bowser Keys", "Bowser Keys"), + ("4", "100 Coin Star", "100 Coin Star"), ] + class WarpNodeProperty(bpy.types.PropertyGroup): - warpType : bpy.props.EnumProperty(name = 'Warp Type', items = enumWarpType, default = 'Warp') - warpID : bpy.props.StringProperty(name = 'Warp ID', default = '0x0A') - destLevelEnum : bpy.props.EnumProperty(name = 'Destination Level', default = 'bob', items = enumLevelNames) - destLevel : bpy.props.StringProperty(name = 'Destination Level Value', default = 'LEVEL_BOB') - destArea : bpy.props.StringProperty(name = 'Destination Area', default = '0x01') - destNode : bpy.props.StringProperty(name = 'Destination Node', default = '0x0A') - warpFlags : bpy.props.StringProperty(name = 'Warp Flags', default = 'WARP_NO_CHECKPOINT') - warpFlagEnum : bpy.props.EnumProperty(name = 'Warp Flags Value', default = 'WARP_NO_CHECKPOINT', items = enumWarpFlag) - instantOffset : bpy.props.IntVectorProperty(name = 'Offset', - size = 3, default = (0,0,0)) - instantWarpObject1 : bpy.props.PointerProperty(name = 'Object 1', type = bpy.types.Object) - instantWarpObject2 : bpy.props.PointerProperty(name = 'Object 2', type = bpy.types.Object) - useOffsetObjects : bpy.props.BoolProperty(name = 'Use Offset Objects', default = False) - - expand : bpy.props.BoolProperty() - - def uses_area_nodes(self): - return self.instantWarpObject1.sm64_obj_type == 'Area Root' and self.instantWarpObject2.sm64_obj_type == 'Area Root' - - def calc_offsets_from_objects(self, reverse = False): - if self.instantWarpObject1 is None or self.instantWarpObject2 is None: - raise PluginError(f'Warp Start and Warp End in Warp Node {self.warpID} must have objects selected.') - - difference = self.instantWarpObject2.location - self.instantWarpObject1.location - - if reverse: - difference *= -1 - - # Convert from Blender space to SM64 space - ret = Vector() - ret.x = int(round(difference.x * bpy.context.scene.blenderF3DScale)) - ret.y = int(round(difference.z * bpy.context.scene.blenderF3DScale)) - ret.z = int(round(-difference.y * bpy.context.scene.blenderF3DScale)) - return ret - - def to_c(self): - if self.warpType == 'Instant': - offset = Vector() - - if self.useOffsetObjects: - offset = self.calc_offsets_from_objects(self.uses_area_nodes()) - else: - offset.x = self.instantOffset[0] - offset.y = self.instantOffset[1] - offset.z = self.instantOffset[2] - - return 'INSTANT_WARP(' + str(self.warpID) + ', ' + str(self.destArea) +\ - ', ' + str(int(offset.x)) + ', ' + str(int(offset.y)) + \ - ', ' + str(int(offset.z)) + ')' - else: - if self.warpType == 'Warp': - cmd = 'WARP_NODE' - elif self.warpType == 'Painting': - cmd = 'PAINTING_WARP_NODE' - - if self.destLevelEnum == 'custom': - destLevel = self.destLevel - else: - destLevel = levelIDNames[self.destLevelEnum] - - if self.warpFlagEnum == 'Custom': - warpFlags = self.warpFlags - else: - warpFlags = self.warpFlagEnum - return cmd + '(' + str(self.warpID) + ', ' + str(destLevel) + ', ' +\ - str(self.destArea) + ', ' + str(self.destNode) + ', ' + str(warpFlags) + ')' + warpType: bpy.props.EnumProperty( + name="Warp Type", items=enumWarpType, default="Warp" + ) + warpID: bpy.props.StringProperty(name="Warp ID", default="0x0A") + destLevelEnum: bpy.props.EnumProperty( + name="Destination Level", default="bob", items=enumLevelNames + ) + destLevel: bpy.props.StringProperty( + name="Destination Level Value", default="LEVEL_BOB" + ) + destArea: bpy.props.StringProperty(name="Destination Area", default="0x01") + destNode: bpy.props.StringProperty(name="Destination Node", default="0x0A") + warpFlags: bpy.props.StringProperty(name="Warp Flags", default="WARP_NO_CHECKPOINT") + warpFlagEnum: bpy.props.EnumProperty( + name="Warp Flags Value", default="WARP_NO_CHECKPOINT", items=enumWarpFlag + ) + instantOffset: bpy.props.IntVectorProperty(name="Offset", size=3, default=(0, 0, 0)) + instantWarpObject1: bpy.props.PointerProperty( + name="Object 1", type=bpy.types.Object + ) + instantWarpObject2: bpy.props.PointerProperty( + name="Object 2", type=bpy.types.Object + ) + useOffsetObjects: bpy.props.BoolProperty(name="Use Offset Objects", default=False) + + expand: bpy.props.BoolProperty() + + def uses_area_nodes(self): + return ( + self.instantWarpObject1.sm64_obj_type == "Area Root" + and self.instantWarpObject2.sm64_obj_type == "Area Root" + ) + + def calc_offsets_from_objects(self, reverse=False): + if self.instantWarpObject1 is None or self.instantWarpObject2 is None: + raise PluginError( + f"Warp Start and Warp End in Warp Node {self.warpID} must have objects selected." + ) + + difference = self.instantWarpObject2.location - self.instantWarpObject1.location + + if reverse: + difference *= -1 + + # Convert from Blender space to SM64 space + ret = Vector() + ret.x = int(round(difference.x * bpy.context.scene.blenderF3DScale)) + ret.y = int(round(difference.z * bpy.context.scene.blenderF3DScale)) + ret.z = int(round(-difference.y * bpy.context.scene.blenderF3DScale)) + return ret + + def to_c(self): + if self.warpType == "Instant": + offset = Vector() + + if self.useOffsetObjects: + offset = self.calc_offsets_from_objects(self.uses_area_nodes()) + else: + offset.x = self.instantOffset[0] + offset.y = self.instantOffset[1] + offset.z = self.instantOffset[2] + + return ( + "INSTANT_WARP(" + + str(self.warpID) + + ", " + + str(self.destArea) + + ", " + + str(int(offset.x)) + + ", " + + str(int(offset.y)) + + ", " + + str(int(offset.z)) + + ")" + ) + else: + if self.warpType == "Warp": + cmd = "WARP_NODE" + elif self.warpType == "Painting": + cmd = "PAINTING_WARP_NODE" + + if self.destLevelEnum == "custom": + destLevel = self.destLevel + else: + destLevel = levelIDNames[self.destLevelEnum] + + if self.warpFlagEnum == "Custom": + warpFlags = self.warpFlags + else: + warpFlags = self.warpFlagEnum + return ( + cmd + + "(" + + str(self.warpID) + + ", " + + str(destLevel) + + ", " + + str(self.destArea) + + ", " + + str(self.destNode) + + ", " + + str(warpFlags) + + ")" + ) + class AddWarpNode(bpy.types.Operator): - bl_idname = 'bone.add_warp_node' - bl_label = 'Add Warp Node' - bl_options = {'REGISTER', 'UNDO'} - option : bpy.props.IntProperty() - def execute(self, context): - obj = context.object - obj.warpNodes.add() - obj.warpNodes.move(len(obj.warpNodes)-1, self.option) - self.report({'INFO'}, 'Success!') - return {'FINISHED'} + bl_idname = "bone.add_warp_node" + bl_label = "Add Warp Node" + bl_options = {"REGISTER", "UNDO"} + option: bpy.props.IntProperty() + + def execute(self, context): + obj = context.object + obj.warpNodes.add() + obj.warpNodes.move(len(obj.warpNodes) - 1, self.option) + self.report({"INFO"}, "Success!") + return {"FINISHED"} + class RemoveWarpNode(bpy.types.Operator): - bl_idname = 'bone.remove_warp_node' - bl_label = 'Remove Warp Node' - bl_options = {'REGISTER', 'UNDO'} - option : bpy.props.IntProperty() - def execute(self, context): - context.object.warpNodes.remove(self.option) - self.report({'INFO'}, 'Success!') - return {'FINISHED'} + bl_idname = "bone.remove_warp_node" + bl_label = "Remove Warp Node" + bl_options = {"REGISTER", "UNDO"} + option: bpy.props.IntProperty() + + def execute(self, context): + context.object.warpNodes.remove(self.option) + self.report({"INFO"}, "Success!") + return {"FINISHED"} + def drawWarpNodeProperty(layout, warpNode, index): - box = layout.box().column() - #box.box().label(text = 'Switch Option ' + str(index + 1)) - box.prop(warpNode, 'expand', text = 'Warp Node ' + \ - str(warpNode.warpID), icon = 'TRIA_DOWN' if warpNode.expand else \ - 'TRIA_RIGHT') - if warpNode.expand: - prop_split(box, warpNode, 'warpType', 'Warp Type') - if warpNode.warpType == 'Instant': - prop_split(box, warpNode, 'warpID', 'Warp ID') - prop_split(box, warpNode, 'destArea', 'Destination Area') - prop_split(box, warpNode, 'useOffsetObjects', 'Use Offset Objects?') - if warpNode.useOffsetObjects: - prop_split(box, warpNode, 'instantWarpObject1', 'Warp Start') - prop_split(box, warpNode, 'instantWarpObject2', 'Warp End') - writeBox = box.box() - if warpNode.instantWarpObject1 is None or warpNode.instantWarpObject2 is None: - writeBox.label(text='Both Objects must be selected for offset') - else: - usesAreaNodes = warpNode.uses_area_nodes() - difference = warpNode.calc_offsets_from_objects(usesAreaNodes) - writeBox.label(text='Current Offset: ') - - writeBox.label(text=f'X: {difference.x}') - writeBox.label(text=f'Y: {difference.y}') - writeBox.label(text=f'Z: {difference.z}') - - if usesAreaNodes: - writeBox.label(text='(When using two area nodes, the calculation is reversed)') - else: - prop_split(box, warpNode, 'instantOffset', 'Offset') - else: - prop_split(box, warpNode, 'warpID', 'Warp ID') - prop_split(box, warpNode, 'destLevelEnum', 'Destination Level') - if warpNode.destLevelEnum == 'custom': - prop_split(box, warpNode, 'destLevel', '') - prop_split(box, warpNode, 'destArea', 'Destination Area') - prop_split(box, warpNode, 'destNode', 'Destination Node') - prop_split(box, warpNode, 'warpFlagEnum', 'Warp Flags') - if warpNode.warpFlagEnum == 'Custom': - prop_split(box, warpNode, 'warpFlags', 'Warp Flags Value') - - buttons = box.row(align = True) - buttons.operator(RemoveWarpNode.bl_idname, - text = 'Remove Option').option = index - buttons.operator(AddWarpNode.bl_idname, - text = 'Add Option').option = index + 1 + box = layout.box().column() + # box.box().label(text = 'Switch Option ' + str(index + 1)) + box.prop( + warpNode, + "expand", + text="Warp Node " + str(warpNode.warpID), + icon="TRIA_DOWN" if warpNode.expand else "TRIA_RIGHT", + ) + if warpNode.expand: + prop_split(box, warpNode, "warpType", "Warp Type") + if warpNode.warpType == "Instant": + prop_split(box, warpNode, "warpID", "Warp ID") + prop_split(box, warpNode, "destArea", "Destination Area") + prop_split(box, warpNode, "useOffsetObjects", "Use Offset Objects?") + if warpNode.useOffsetObjects: + prop_split(box, warpNode, "instantWarpObject1", "Warp Start") + prop_split(box, warpNode, "instantWarpObject2", "Warp End") + writeBox = box.box() + if ( + warpNode.instantWarpObject1 is None + or warpNode.instantWarpObject2 is None + ): + writeBox.label(text="Both Objects must be selected for offset") + else: + usesAreaNodes = warpNode.uses_area_nodes() + difference = warpNode.calc_offsets_from_objects(usesAreaNodes) + writeBox.label(text="Current Offset: ") + + writeBox.label(text=f"X: {difference.x}") + writeBox.label(text=f"Y: {difference.y}") + writeBox.label(text=f"Z: {difference.z}") + + if usesAreaNodes: + writeBox.label( + text="(When using two area nodes, the calculation is reversed)" + ) + else: + prop_split(box, warpNode, "instantOffset", "Offset") + else: + prop_split(box, warpNode, "warpID", "Warp ID") + prop_split(box, warpNode, "destLevelEnum", "Destination Level") + if warpNode.destLevelEnum == "custom": + prop_split(box, warpNode, "destLevel", "") + prop_split(box, warpNode, "destArea", "Destination Area") + prop_split(box, warpNode, "destNode", "Destination Node") + prop_split(box, warpNode, "warpFlagEnum", "Warp Flags") + if warpNode.warpFlagEnum == "Custom": + prop_split(box, warpNode, "warpFlags", "Warp Flags Value") + + buttons = box.row(align=True) + buttons.operator(RemoveWarpNode.bl_idname, text="Remove Option").option = index + buttons.operator(AddWarpNode.bl_idname, text="Add Option").option = index + 1 class StarGetCutscenesProperty(bpy.types.PropertyGroup): - star1_option : bpy.props.EnumProperty(items = enumStarGetCutscene, default = '4', name = '1') - star2_option : bpy.props.EnumProperty(items = enumStarGetCutscene, default = '4', name = '2') - star3_option : bpy.props.EnumProperty(items = enumStarGetCutscene, default = '4', name = '3') - star4_option : bpy.props.EnumProperty(items = enumStarGetCutscene, default = '4', name = '4') - star5_option : bpy.props.EnumProperty(items = enumStarGetCutscene, default = '4', name = '5') - star6_option : bpy.props.EnumProperty(items = enumStarGetCutscene, default = '4', name = '6') - star7_option : bpy.props.EnumProperty(items = enumStarGetCutscene, default = '4', name = '7') - - star1_value : bpy.props.IntProperty(default = 0, min = 0, max = 15, name = 'Value') - star2_value : bpy.props.IntProperty(default = 0, min = 0, max = 15, name = 'Value') - star3_value : bpy.props.IntProperty(default = 0, min = 0, max = 15, name = 'Value') - star4_value : bpy.props.IntProperty(default = 0, min = 0, max = 15, name = 'Value') - star5_value : bpy.props.IntProperty(default = 0, min = 0, max = 15, name = 'Value') - star6_value : bpy.props.IntProperty(default = 0, min = 0, max = 15, name = 'Value') - star7_value : bpy.props.IntProperty(default = 0, min = 0, max = 15, name = 'Value') - - def value(self): - value = '0x' - value += self.star1_option if self.star1_option != 'Custom' else format(self.star1_value, 'X') - value += self.star2_option if self.star2_option != 'Custom' else format(self.star2_value, 'X') - value += self.star3_option if self.star3_option != 'Custom' else format(self.star3_value, 'X') - value += self.star4_option if self.star4_option != 'Custom' else format(self.star4_value, 'X') - value += self.star5_option if self.star5_option != 'Custom' else format(self.star5_value, 'X') - value += self.star6_option if self.star6_option != 'Custom' else format(self.star6_value, 'X') - value += self.star7_option if self.star7_option != 'Custom' else format(self.star7_value, 'X') - value += '0' - return value - - def draw(self, layout): - layout.label(text = 'Star Get Cutscenes') - layout.prop(self, 'star1_option') - if self.star1_option == 'Custom': - prop_split(layout, self, 'star1_value', '') - layout.prop(self, 'star2_option') - if self.star2_option == 'Custom': - prop_split(layout, self, 'star2_value', '') - layout.prop(self, 'star3_option') - if self.star3_option == 'Custom': - prop_split(layout, self, 'star3_value', '') - layout.prop(self, 'star4_option') - if self.star4_option == 'Custom': - prop_split(layout, self, 'star4_value', '') - layout.prop(self, 'star5_option') - if self.star5_option == 'Custom': - prop_split(layout, self, 'star5_value', '') - layout.prop(self, 'star6_option') - if self.star6_option == 'Custom': - prop_split(layout, self, 'star6_value', '') - layout.prop(self, 'star7_option') - if self.star7_option == 'Custom': - prop_split(layout, self, 'star7_value', '') + star1_option: bpy.props.EnumProperty( + items=enumStarGetCutscene, default="4", name="1" + ) + star2_option: bpy.props.EnumProperty( + items=enumStarGetCutscene, default="4", name="2" + ) + star3_option: bpy.props.EnumProperty( + items=enumStarGetCutscene, default="4", name="3" + ) + star4_option: bpy.props.EnumProperty( + items=enumStarGetCutscene, default="4", name="4" + ) + star5_option: bpy.props.EnumProperty( + items=enumStarGetCutscene, default="4", name="5" + ) + star6_option: bpy.props.EnumProperty( + items=enumStarGetCutscene, default="4", name="6" + ) + star7_option: bpy.props.EnumProperty( + items=enumStarGetCutscene, default="4", name="7" + ) + + star1_value: bpy.props.IntProperty(default=0, min=0, max=15, name="Value") + star2_value: bpy.props.IntProperty(default=0, min=0, max=15, name="Value") + star3_value: bpy.props.IntProperty(default=0, min=0, max=15, name="Value") + star4_value: bpy.props.IntProperty(default=0, min=0, max=15, name="Value") + star5_value: bpy.props.IntProperty(default=0, min=0, max=15, name="Value") + star6_value: bpy.props.IntProperty(default=0, min=0, max=15, name="Value") + star7_value: bpy.props.IntProperty(default=0, min=0, max=15, name="Value") + + def value(self): + value = "0x" + value += ( + self.star1_option + if self.star1_option != "Custom" + else format(self.star1_value, "X") + ) + value += ( + self.star2_option + if self.star2_option != "Custom" + else format(self.star2_value, "X") + ) + value += ( + self.star3_option + if self.star3_option != "Custom" + else format(self.star3_value, "X") + ) + value += ( + self.star4_option + if self.star4_option != "Custom" + else format(self.star4_value, "X") + ) + value += ( + self.star5_option + if self.star5_option != "Custom" + else format(self.star5_value, "X") + ) + value += ( + self.star6_option + if self.star6_option != "Custom" + else format(self.star6_value, "X") + ) + value += ( + self.star7_option + if self.star7_option != "Custom" + else format(self.star7_value, "X") + ) + value += "0" + return value + + def draw(self, layout): + layout.label(text="Star Get Cutscenes") + layout.prop(self, "star1_option") + if self.star1_option == "Custom": + prop_split(layout, self, "star1_value", "") + layout.prop(self, "star2_option") + if self.star2_option == "Custom": + prop_split(layout, self, "star2_value", "") + layout.prop(self, "star3_option") + if self.star3_option == "Custom": + prop_split(layout, self, "star3_value", "") + layout.prop(self, "star4_option") + if self.star4_option == "Custom": + prop_split(layout, self, "star4_value", "") + layout.prop(self, "star5_option") + if self.star5_option == "Custom": + prop_split(layout, self, "star5_value", "") + layout.prop(self, "star6_option") + if self.star6_option == "Custom": + prop_split(layout, self, "star6_value", "") + layout.prop(self, "star7_option") + if self.star7_option == "Custom": + prop_split(layout, self, "star7_value", "") + def onUpdateObjectType(self, context): - isNoneEmpty = self.sm64_obj_type == "None" - isBoxEmpty = self.sm64_obj_type == 'Water Box' or self.sm64_obj_type == 'Camera Volume' - self.show_name = not (isBoxEmpty or isNoneEmpty) - self.show_axis = not (isBoxEmpty or isNoneEmpty) + isNoneEmpty = self.sm64_obj_type == "None" + isBoxEmpty = ( + self.sm64_obj_type == "Water Box" or self.sm64_obj_type == "Camera Volume" + ) + self.show_name = not (isBoxEmpty or isNoneEmpty) + self.show_axis = not (isBoxEmpty or isNoneEmpty) + + if isBoxEmpty: + self.empty_display_type = "CUBE" - if isBoxEmpty: - self.empty_display_type = "CUBE" class PuppycamSetupCamera(bpy.types.Operator): - """Setup Camera""" - bl_idname = "mesh.puppycam_setup_camera" - bl_label = "Set up Camera" - bl_options = {'REGISTER'} + """Setup Camera""" + + bl_idname = "mesh.puppycam_setup_camera" + bl_label = "Set up Camera" + bl_options = {"REGISTER"} - def execute(self, context): - scene = context.scene - cameraObject = bpy.context.active_object.puppycamProp.puppycamCamera.data.name + def execute(self, context): + scene = context.scene + cameraObject = bpy.context.active_object.puppycamProp.puppycamCamera.data.name - scene.camera = bpy.context.active_object.puppycamProp.puppycamCamera - bpy.data.cameras[cameraObject].show_name = True - bpy.data.cameras[cameraObject].show_safe_areas = True + scene.camera = bpy.context.active_object.puppycamProp.puppycamCamera + bpy.data.cameras[cameraObject].show_name = True + bpy.data.cameras[cameraObject].show_safe_areas = True - scene.safe_areas.title[0] = 0 - scene.safe_areas.title[1] = 8/240 # Use the safe areas to denote where default 8 pixel black bars will be - scene.safe_areas.action = (0, 0) + scene.safe_areas.title[0] = 0 + scene.safe_areas.title[1] = ( + 8 / 240 + ) # Use the safe areas to denote where default 8 pixel black bars will be + scene.safe_areas.action = (0, 0) - # If you could set resolution on a per-camera basis, I'd do that instead. Oh well. - scene.render.resolution_x = 320 - scene.render.resolution_y = 240 + # If you could set resolution on a per-camera basis, I'd do that instead. Oh well. + scene.render.resolution_x = 320 + scene.render.resolution_y = 240 - bpy.data.cameras[cameraObject].angle = math.radians(bpy.context.active_object.puppycamProp.puppycamFOV * (4/3)) + bpy.data.cameras[cameraObject].angle = math.radians( + bpy.context.active_object.puppycamProp.puppycamFOV * (4 / 3) + ) - return {'FINISHED'} + return {"FINISHED"} def sm64_is_camera_poll(self, object): - return object.type == 'CAMERA' + return object.type == "CAMERA" + class PuppycamProperty(bpy.types.PropertyGroup): - puppycamVolumeFunction : bpy.props.StringProperty( - name = 'Puppycam Function', default = '0') + puppycamVolumeFunction: bpy.props.StringProperty( + name="Puppycam Function", default="0" + ) - puppycamVolumePermaswap : bpy.props.BoolProperty( - name = 'Permaswap') + puppycamVolumePermaswap: bpy.props.BoolProperty(name="Permaswap") + + puppycamUseEmptiesForPos: bpy.props.BoolProperty( + name="Use Empty Objects for positions" + ) - puppycamUseEmptiesForPos : bpy.props.BoolProperty( - name = 'Use Empty Objects for positions') + puppycamCamera: bpy.props.PointerProperty( + type=bpy.types.Object, poll=sm64_is_camera_poll + ) - puppycamCamera : bpy.props.PointerProperty( - type=bpy.types.Object, - poll=sm64_is_camera_poll + puppycamFOV: bpy.props.FloatProperty( + name="Field Of View", min=0, max=180, default=45 ) - puppycamFOV : bpy.props.FloatProperty( - name = 'Field Of View', min = 0, max = 180, default = 45 - ) + puppycamMode: bpy.props.EnumProperty( + items=enumPuppycamMode, default="NC_MODE_NORMAL" + ) - puppycamMode : bpy.props.EnumProperty( - items = enumPuppycamMode, default = 'NC_MODE_NORMAL') + puppycamType: bpy.props.StringProperty(name="Custom Mode", default="NC_MODE_NORMAL") - puppycamType : bpy.props.StringProperty( - name = 'Custom Mode', default = 'NC_MODE_NORMAL') + puppycamCamPos: bpy.props.StringProperty(name="Fixed Camera Position") - puppycamCamPos : bpy.props.StringProperty( - name = 'Fixed Camera Position') + puppycamCamFocus: bpy.props.StringProperty(name="Fixed Camera Focus") - puppycamCamFocus : bpy.props.StringProperty( - name = 'Fixed Camera Focus') + puppycamUseFlags: bpy.props.BoolProperty(name="Use Flags") - puppycamUseFlags : bpy.props.BoolProperty( - name = 'Use Flags') + NC_FLAG_XTURN: bpy.props.BoolProperty(name="X Turn") - NC_FLAG_XTURN : bpy.props.BoolProperty( - name = 'X Turn') + NC_FLAG_YTURN: bpy.props.BoolProperty(name="Y Turn") - NC_FLAG_YTURN : bpy.props.BoolProperty( - name = 'Y Turn') + NC_FLAG_ZOOM: bpy.props.BoolProperty(name="Y Turn") - NC_FLAG_ZOOM : bpy.props.BoolProperty( - name = 'Y Turn') + NC_FLAG_8D: bpy.props.BoolProperty(name="8 Directions") - NC_FLAG_8D : bpy.props.BoolProperty( - name = '8 Directions') + NC_FLAG_4D: bpy.props.BoolProperty(name="4 Directions") - NC_FLAG_4D : bpy.props.BoolProperty( - name = '4 Directions') + NC_FLAG_2D: bpy.props.BoolProperty(name="2D") - NC_FLAG_2D : bpy.props.BoolProperty( - name = '2D') + NC_FLAG_FOCUSX: bpy.props.BoolProperty(name="Use X Focus") - NC_FLAG_FOCUSX : bpy.props.BoolProperty( - name = 'Use X Focus') + NC_FLAG_FOCUSY: bpy.props.BoolProperty(name="Use Y Focus") - NC_FLAG_FOCUSY : bpy.props.BoolProperty( - name = 'Use Y Focus') + NC_FLAG_FOCUSZ: bpy.props.BoolProperty(name="Use Z Focus") - NC_FLAG_FOCUSZ : bpy.props.BoolProperty( - name = 'Use Z Focus') + NC_FLAG_POSX: bpy.props.BoolProperty(name="Move on X axis") - NC_FLAG_POSX : bpy.props.BoolProperty( - name = 'Move on X axis') + NC_FLAG_POSY: bpy.props.BoolProperty(name="Move on Y axis") - NC_FLAG_POSY : bpy.props.BoolProperty( - name = 'Move on Y axis') + NC_FLAG_POSZ: bpy.props.BoolProperty(name="Move on Z axis") - NC_FLAG_POSZ : bpy.props.BoolProperty( - name = 'Move on Z axis') + NC_FLAG_COLLISION: bpy.props.BoolProperty(name="Camera Collision") - NC_FLAG_COLLISION : bpy.props.BoolProperty( - name = 'Camera Collision') + NC_FLAG_SLIDECORRECT: bpy.props.BoolProperty(name="Slide Correction") - NC_FLAG_SLIDECORRECT : bpy.props.BoolProperty( - name = 'Slide Correction') class SM64_GeoASMProperties(bpy.types.PropertyGroup): - name = "Geo ASM Properties" - func: bpy.props.StringProperty(name = "Geo ASM Func", default="", description="Name of function for C, hex address for binary.") - param: bpy.props.StringProperty(name = "Geo ASM Param", default="0", description="Function parameter. (Binary exporting will cast to int)") + name = "Geo ASM Properties" + func: bpy.props.StringProperty( + name="Geo ASM Func", + default="", + description="Name of function for C, hex address for binary.", + ) + param: bpy.props.StringProperty( + name="Geo ASM Param", + default="0", + description="Function parameter. (Binary exporting will cast to int)", + ) + + @staticmethod + def upgrade_object(obj: bpy.types.Object): + geo_asm = obj.fast64.sm64.geo_asm - @staticmethod - def upgrade_object(obj: bpy.types.Object): - geo_asm = obj.fast64.sm64.geo_asm + func = obj.get("geoASMFunc") or obj.get("geo_func") or geo_asm.func + geo_asm.func = func - func = obj.get("geoASMFunc") or obj.get("geo_func") or geo_asm.func - geo_asm.func = func + param = obj.get("geoASMParam") or obj.get("func_param") or geo_asm.param + geo_asm.param = str(param) - param = obj.get("geoASMParam") or obj.get("func_param") or geo_asm.param - geo_asm.param = str(param) class SM64_AreaProperties(bpy.types.PropertyGroup): - name = "Area Properties" - disable_background: bpy.props.BoolProperty(name = "Disable Background", default=False, description="Disable rendering background. Ideal for interiors or areas that should never see a background.") + name = "Area Properties" + disable_background: bpy.props.BoolProperty( + name="Disable Background", + default=False, + description="Disable rendering background. Ideal for interiors or areas that should never see a background.", + ) + class SM64_LevelProperties(bpy.types.PropertyGroup): - name = "SM64 Level Properties" - backgroundID: bpy.props.StringProperty( - name = 'Background Define', default = 'BACKGROUND_CUSTOM', - description = - 'The background define that is passed into GEO_BACKGROUND\n' - '(ex. BACKGROUND_OCEAN_SKY, BACKGROUND_GREEN_SKY)') - - backgroundSegment: bpy.props.StringProperty( - name = 'Background Segment', default = "water_skybox", - description = - 'Segment that will be loaded.\n' - 'This will be suffixed with _yay0SegmentRomStart or _mio0SegmentRomStart\n' - '(ex. water_skybox, bidw_skybox)') + name = "SM64 Level Properties" + backgroundID: bpy.props.StringProperty( + name="Background Define", + default="BACKGROUND_CUSTOM", + description="The background define that is passed into GEO_BACKGROUND\n" + "(ex. BACKGROUND_OCEAN_SKY, BACKGROUND_GREEN_SKY)", + ) + + backgroundSegment: bpy.props.StringProperty( + name="Background Segment", + default="water_skybox", + description="Segment that will be loaded.\n" + "This will be suffixed with _yay0SegmentRomStart or _mio0SegmentRomStart\n" + "(ex. water_skybox, bidw_skybox)", + ) + DEFAULT_BEHAVIOR_PARAMS = "0x00000000" + class SM64_GameObjectProperties(bpy.types.PropertyGroup): - name = "Game Object Properties" - bparams: bpy.props.StringProperty(name = "Behavior Parameters", description="All Behavior Parameters", default=DEFAULT_BEHAVIOR_PARAMS) - - use_individual_params: bpy.props.BoolProperty(name="Use Individual Behavior Params", description="Use Individual Behavior Params", default=True) - bparam1: bpy.props.StringProperty(name = "Behavior Param 1", description="First Behavior Param", default="") - bparam2: bpy.props.StringProperty(name = "Behavior Param 2", description="Second Behavior Param", default="") - bparam3: bpy.props.StringProperty(name = "Behavior Param 3", description="Third Behavior Param", default="") - bparam4: bpy.props.StringProperty(name = "Behavior Param 4", description="Fourth Behavior Param", default="") - - @staticmethod - def upgrade_object(obj): - game_object: SM64_GameObjectProperties = obj.fast64.sm64.game_object - - game_object.bparams = obj.get("sm64_obj_bparam", game_object.bparams) - - # delete legacy property - if "sm64_obj_bparam" in obj: - del obj["sm64_obj_bparam"] - - # get combined bparams, if they arent the default value then return because they have been set - combined_bparams = game_object.get_combined_bparams() - if combined_bparams != DEFAULT_BEHAVIOR_PARAMS: - return - - # If bparams arent the default bparams, disable `use_individual_params` - if (game_object.bparams != DEFAULT_BEHAVIOR_PARAMS): - game_object.use_individual_params = False - - def get_combined_bparams(self): - params = [self.bparam1, self.bparam2, self.bparam3, self.bparam4] - fmt_params = [] - for i, p in enumerate(params): - if len(p) == 0: - continue - shift = 8 * (3 - i) - fmt_params.append(f"({p} << {shift})" if shift > 0 else f"({p})") - - if len(fmt_params) == 0: - return DEFAULT_BEHAVIOR_PARAMS - else: - return ' | '.join(fmt_params) - - def get_behavior_params(self): - if self.use_individual_params: - return self.get_combined_bparams() - return self.bparams + name = "Game Object Properties" + bparams: bpy.props.StringProperty( + name="Behavior Parameters", + description="All Behavior Parameters", + default=DEFAULT_BEHAVIOR_PARAMS, + ) -class SM64_ObjectProperties(bpy.types.PropertyGroup): - version: bpy.props.IntProperty(name="SM64_ObjectProperties Version", default=0) - cur_version = 3 # version after property migration - - geo_asm: bpy.props.PointerProperty(type=SM64_GeoASMProperties) - level: bpy.props.PointerProperty(type=SM64_LevelProperties) - area: bpy.props.PointerProperty(type=SM64_AreaProperties) - game_object: bpy.props.PointerProperty(type=SM64_GameObjectProperties) - - @staticmethod - def upgrade_changed_props(): - for obj in bpy.data.objects: - if obj.fast64.sm64.version == 0: - SM64_GeoASMProperties.upgrade_object(obj) - if obj.fast64.sm64.version < 3: - SM64_GameObjectProperties.upgrade_object(obj) - obj.fast64.sm64.version = SM64_ObjectProperties.cur_version + use_individual_params: bpy.props.BoolProperty( + name="Use Individual Behavior Params", + description="Use Individual Behavior Params", + default=True, + ) + bparam1: bpy.props.StringProperty( + name="Behavior Param 1", description="First Behavior Param", default="" + ) + bparam2: bpy.props.StringProperty( + name="Behavior Param 2", description="Second Behavior Param", default="" + ) + bparam3: bpy.props.StringProperty( + name="Behavior Param 3", description="Third Behavior Param", default="" + ) + bparam4: bpy.props.StringProperty( + name="Behavior Param 4", description="Fourth Behavior Param", default="" + ) -sm64_obj_classes = ( - WarpNodeProperty, - AddWarpNode, - RemoveWarpNode, + @staticmethod + def upgrade_object(obj): + game_object: SM64_GameObjectProperties = obj.fast64.sm64.game_object - SearchModelIDEnumOperator, - SearchBehaviourEnumOperator, - SearchSpecialEnumOperator, - SearchMacroEnumOperator, + game_object.bparams = obj.get("sm64_obj_bparam", game_object.bparams) - StarGetCutscenesProperty, + # delete legacy property + if "sm64_obj_bparam" in obj: + del obj["sm64_obj_bparam"] - PuppycamProperty, - PuppycamSetupCamera, + # get combined bparams, if they arent the default value then return because they have been set + combined_bparams = game_object.get_combined_bparams() + if combined_bparams != DEFAULT_BEHAVIOR_PARAMS: + return - SM64_GeoASMProperties, - SM64_LevelProperties, - SM64_AreaProperties, - SM64_GameObjectProperties, - SM64_ObjectProperties, -) + # If bparams arent the default bparams, disable `use_individual_params` + if game_object.bparams != DEFAULT_BEHAVIOR_PARAMS: + game_object.use_individual_params = False + + def get_combined_bparams(self): + params = [self.bparam1, self.bparam2, self.bparam3, self.bparam4] + fmt_params = [] + for i, p in enumerate(params): + if len(p) == 0: + continue + shift = 8 * (3 - i) + fmt_params.append(f"({p} << {shift})" if shift > 0 else f"({p})") + + if len(fmt_params) == 0: + return DEFAULT_BEHAVIOR_PARAMS + else: + return " | ".join(fmt_params) + + def get_behavior_params(self): + if self.use_individual_params: + return self.get_combined_bparams() + return self.bparams + + +class SM64_ObjectProperties(bpy.types.PropertyGroup): + version: bpy.props.IntProperty(name="SM64_ObjectProperties Version", default=0) + cur_version = 3 # version after property migration + geo_asm: bpy.props.PointerProperty(type=SM64_GeoASMProperties) + level: bpy.props.PointerProperty(type=SM64_LevelProperties) + area: bpy.props.PointerProperty(type=SM64_AreaProperties) + game_object: bpy.props.PointerProperty(type=SM64_GameObjectProperties) -sm64_obj_panel_classes = ( - SM64ObjectPanel, + @staticmethod + def upgrade_changed_props(): + for obj in bpy.data.objects: + if obj.fast64.sm64.version == 0: + SM64_GeoASMProperties.upgrade_object(obj) + if obj.fast64.sm64.version < 3: + SM64_GameObjectProperties.upgrade_object(obj) + obj.fast64.sm64.version = SM64_ObjectProperties.cur_version + + +sm64_obj_classes = ( + WarpNodeProperty, + AddWarpNode, + RemoveWarpNode, + SearchModelIDEnumOperator, + SearchBehaviourEnumOperator, + SearchSpecialEnumOperator, + SearchMacroEnumOperator, + StarGetCutscenesProperty, + PuppycamProperty, + PuppycamSetupCamera, + SM64_GeoASMProperties, + SM64_LevelProperties, + SM64_AreaProperties, + SM64_GameObjectProperties, + SM64_ObjectProperties, ) + +sm64_obj_panel_classes = (SM64ObjectPanel,) + + def sm64_obj_panel_register(): - for cls in sm64_obj_panel_classes: - register_class(cls) + for cls in sm64_obj_panel_classes: + register_class(cls) + def sm64_obj_panel_unregister(): - for cls in sm64_obj_panel_classes: - unregister_class(cls) + for cls in sm64_obj_panel_classes: + unregister_class(cls) + def sm64_obj_register(): - for cls in sm64_obj_classes: - register_class(cls) + for cls in sm64_obj_classes: + register_class(cls) - bpy.types.Object.puppycamProp = bpy.props.PointerProperty(type = PuppycamProperty) + bpy.types.Object.puppycamProp = bpy.props.PointerProperty(type=PuppycamProperty) - bpy.types.Object.sm64_model_enum = bpy.props.EnumProperty( - name = 'Model', items = enumModelIDs) + bpy.types.Object.sm64_model_enum = bpy.props.EnumProperty( + name="Model", items=enumModelIDs + ) - bpy.types.Object.sm64_macro_enum = bpy.props.EnumProperty( - name = 'Macro', items = enumMacrosNames) + bpy.types.Object.sm64_macro_enum = bpy.props.EnumProperty( + name="Macro", items=enumMacrosNames + ) - bpy.types.Object.sm64_special_enum = bpy.props.EnumProperty( - name = 'Special', items = enumSpecialsNames) + bpy.types.Object.sm64_special_enum = bpy.props.EnumProperty( + name="Special", items=enumSpecialsNames + ) - bpy.types.Object.sm64_behaviour_enum = bpy.props.EnumProperty( - name = 'Behaviour', items = enumBehaviourPresets) + bpy.types.Object.sm64_behaviour_enum = bpy.props.EnumProperty( + name="Behaviour", items=enumBehaviourPresets + ) - #bpy.types.Object.sm64_model = bpy.props.StringProperty( - # name = 'Model Name') - #bpy.types.Object.sm64_macro = bpy.props.StringProperty( - # name = 'Macro Name') - #bpy.types.Object.sm64_special = bpy.props.StringProperty( - # name = 'Special Name') - #bpy.types.Object.sm64_behaviour = bpy.props.StringProperty( - # name = 'Behaviour Name') + # bpy.types.Object.sm64_model = bpy.props.StringProperty( + # name = 'Model Name') + # bpy.types.Object.sm64_macro = bpy.props.StringProperty( + # name = 'Macro Name') + # bpy.types.Object.sm64_special = bpy.props.StringProperty( + # name = 'Special Name') + # bpy.types.Object.sm64_behaviour = bpy.props.StringProperty( + # name = 'Behaviour Name') + + bpy.types.Object.sm64_obj_type = bpy.props.EnumProperty( + name="SM64 Object Type", + items=enumObjectType, + default="None", + update=onUpdateObjectType, + ) - bpy.types.Object.sm64_obj_type = bpy.props.EnumProperty( - name = 'SM64 Object Type', items = enumObjectType, default = 'None', update = onUpdateObjectType) + bpy.types.Object.sm64_obj_model = bpy.props.StringProperty( + name="Model", default="MODEL_NONE" + ) - bpy.types.Object.sm64_obj_model = bpy.props.StringProperty( - name = 'Model', default = 'MODEL_NONE') + bpy.types.Object.sm64_obj_preset = bpy.props.StringProperty(name="Preset") - bpy.types.Object.sm64_obj_preset = bpy.props.StringProperty( - name = 'Preset') + bpy.types.Object.sm64_obj_behaviour = bpy.props.StringProperty(name="Behaviour") - bpy.types.Object.sm64_obj_behaviour = bpy.props.StringProperty( - name = 'Behaviour') + bpy.types.Object.sm64_obj_mario_start_area = bpy.props.StringProperty( + name="Area", default="0x01" + ) - bpy.types.Object.sm64_obj_mario_start_area = bpy.props.StringProperty( - name = 'Area', default = '0x01') + bpy.types.Object.whirpool_index = bpy.props.StringProperty( + name="Index", default="0" + ) + bpy.types.Object.whirpool_condition = bpy.props.StringProperty( + name="Condition", default="3" + ) + bpy.types.Object.whirpool_strength = bpy.props.StringProperty( + name="Strength", default="-30" + ) + bpy.types.Object.waterBoxType = bpy.props.EnumProperty( + name="Water Box Type", items=enumWaterBoxType, default="Water" + ) - bpy.types.Object.whirpool_index = bpy.props.StringProperty( - name = 'Index', default = '0') - bpy.types.Object.whirpool_condition = bpy.props.StringProperty( - name = 'Condition', default = '3') - bpy.types.Object.whirpool_strength = bpy.props.StringProperty( - name = 'Strength', default = '-30') - bpy.types.Object.waterBoxType = bpy.props.EnumProperty( - name = 'Water Box Type', items = enumWaterBoxType, default = 'Water') + bpy.types.Object.sm64_obj_use_act1 = bpy.props.BoolProperty( + name="Act 1", default=True + ) + bpy.types.Object.sm64_obj_use_act2 = bpy.props.BoolProperty( + name="Act 2", default=True + ) + bpy.types.Object.sm64_obj_use_act3 = bpy.props.BoolProperty( + name="Act 3", default=True + ) + bpy.types.Object.sm64_obj_use_act4 = bpy.props.BoolProperty( + name="Act 4", default=True + ) + bpy.types.Object.sm64_obj_use_act5 = bpy.props.BoolProperty( + name="Act 5", default=True + ) + bpy.types.Object.sm64_obj_use_act6 = bpy.props.BoolProperty( + name="Act 6", default=True + ) - bpy.types.Object.sm64_obj_use_act1 = bpy.props.BoolProperty( - name = 'Act 1', default = True) - bpy.types.Object.sm64_obj_use_act2 = bpy.props.BoolProperty( - name = 'Act 2', default = True) - bpy.types.Object.sm64_obj_use_act3 = bpy.props.BoolProperty( - name = 'Act 3', default = True) - bpy.types.Object.sm64_obj_use_act4 = bpy.props.BoolProperty( - name = 'Act 4', default = True) - bpy.types.Object.sm64_obj_use_act5 = bpy.props.BoolProperty( - name = 'Act 5', default = True) - bpy.types.Object.sm64_obj_use_act6 = bpy.props.BoolProperty( - name = 'Act 6', default = True) + bpy.types.Object.sm64_obj_set_bparam = bpy.props.BoolProperty( + name="Set Behaviour Parameter", default=True + ) - bpy.types.Object.sm64_obj_set_bparam = bpy.props.BoolProperty( - name = 'Set Behaviour Parameter', default = True) + bpy.types.Object.sm64_obj_set_yaw = bpy.props.BoolProperty( + name="Set Yaw", default=False + ) - bpy.types.Object.sm64_obj_set_yaw = bpy.props.BoolProperty( - name = 'Set Yaw', default = False) + bpy.types.Object.useBackgroundColor = bpy.props.BoolProperty( + name="Use Solid Color For Background", default=False + ) - bpy.types.Object.useBackgroundColor = bpy.props.BoolProperty( - name = 'Use Solid Color For Background', default = False) + # bpy.types.Object.backgroundID = bpy.props.StringProperty( + # name = 'Background ID', default = 'BACKGROUND_OCEAN_SKY') - #bpy.types.Object.backgroundID = bpy.props.StringProperty( - # name = 'Background ID', default = 'BACKGROUND_OCEAN_SKY') + bpy.types.Object.background = bpy.props.EnumProperty( + name="Background", items=enumBackground, default="OCEAN_SKY" + ) - bpy.types.Object.background = bpy.props.EnumProperty( - name = 'Background', items = enumBackground, default = 'OCEAN_SKY') + bpy.types.Object.backgroundColor = bpy.props.FloatVectorProperty( + name="Background Color", + subtype="COLOR", + size=4, + min=0, + max=1, + default=(0, 0, 0, 1), + ) - bpy.types.Object.backgroundColor = bpy.props.FloatVectorProperty( - name = 'Background Color', subtype='COLOR', size = 4, - min = 0, max = 1, default = (0,0,0,1)) + bpy.types.Object.screenPos = bpy.props.IntVectorProperty( + name="Screen Position", + size=2, + default=(160, 120), + min=-(2 ** 15), + max=2 ** 15 - 1, + ) - bpy.types.Object.screenPos = bpy.props.IntVectorProperty( - name = 'Screen Position', size = 2, default = (160, 120), - min = -2**15, max = 2**15 - 1) + bpy.types.Object.screenSize = bpy.props.IntVectorProperty( + name="Screen Size", size=2, default=(160, 120), min=-(2 ** 15), max=2 ** 15 - 1 + ) - bpy.types.Object.screenSize = bpy.props.IntVectorProperty( - name = 'Screen Size', size = 2, default = (160, 120), - min = -2**15, max = 2**15 - 1) + bpy.types.Object.useDefaultScreenRect = bpy.props.BoolProperty( + name="Use Default Screen Rect", default=True + ) - bpy.types.Object.useDefaultScreenRect = bpy.props.BoolProperty( - name = 'Use Default Screen Rect', default = True) + bpy.types.Object.clipPlanes = bpy.props.IntVectorProperty( + name="Clip Planes", size=2, min=0, default=(100, 30000) + ) - bpy.types.Object.clipPlanes = bpy.props.IntVectorProperty( - name = 'Clip Planes', size = 2, min = 0, default = (100, 30000) - ) + bpy.types.Object.area_fog_color = bpy.props.FloatVectorProperty( + name="Area Fog Color", + subtype="COLOR", + size=4, + min=0, + max=1, + default=(0, 0, 0, 1), + ) - bpy.types.Object.area_fog_color = bpy.props.FloatVectorProperty( - name = 'Area Fog Color', subtype='COLOR', size = 4, - min = 0, max = 1, default = (0,0,0,1)) + bpy.types.Object.area_fog_position = bpy.props.FloatVectorProperty( + name="Area Fog Position", size=2, default=(970, 1000) + ) - bpy.types.Object.area_fog_position = bpy.props.FloatVectorProperty( - name = 'Area Fog Position', size = 2, default = (970, 1000)) + bpy.types.Object.areaOverrideBG = bpy.props.BoolProperty(name="Override Background") - bpy.types.Object.areaOverrideBG = bpy.props.BoolProperty( - name = 'Override Background') + bpy.types.Object.areaBGColor = bpy.props.FloatVectorProperty( + name="Background Color", + subtype="COLOR", + size=4, + min=0, + max=1, + default=(0, 0, 0, 1), + ) - bpy.types.Object.areaBGColor = bpy.props.FloatVectorProperty( - name = 'Background Color', subtype='COLOR', size = 4, - min = 0, max = 1, default = (0,0,0,1)) + bpy.types.Object.camOption = bpy.props.EnumProperty( + items=enumCameraMode, default="CAMERA_MODE_8_DIRECTIONS" + ) - bpy.types.Object.camOption = bpy.props.EnumProperty( - items = enumCameraMode, default = 'CAMERA_MODE_8_DIRECTIONS') + bpy.types.Object.camType = bpy.props.StringProperty( + name="Camera Type", default="CAMERA_MODE_8_DIRECTIONS" + ) - bpy.types.Object.camType = bpy.props.StringProperty( - name = 'Camera Type', default = 'CAMERA_MODE_8_DIRECTIONS') + bpy.types.Object.envOption = bpy.props.EnumProperty( + items=enumEnvFX, default="ENVFX_MODE_NONE" + ) - bpy.types.Object.envOption = bpy.props.EnumProperty( - items = enumEnvFX, default = 'ENVFX_MODE_NONE') + bpy.types.Object.envType = bpy.props.StringProperty( + name="Environment Type", default="ENVFX_MODE_NONE" + ) - bpy.types.Object.envType = bpy.props.StringProperty( - name = 'Environment Type', default = 'ENVFX_MODE_NONE') + bpy.types.Object.fov = bpy.props.FloatProperty( + name="Field Of View", min=0, max=180, default=45 + ) - bpy.types.Object.fov = bpy.props.FloatProperty( - name = 'Field Of View', min = 0, max = 180, default = 45 - ) + bpy.types.Object.dynamicFOV = bpy.props.BoolProperty( + name="Dynamic FOV", default=True + ) - bpy.types.Object.dynamicFOV = bpy.props.BoolProperty( - name = 'Dynamic FOV', default = True) + bpy.types.Object.cameraVolumeFunction = bpy.props.StringProperty( + name="Camera Function", default="cam_castle_hmc_start_pool_cutscene" + ) + bpy.types.Object.cameraVolumeGlobal = bpy.props.BoolProperty(name="Is Global") - bpy.types.Object.cameraVolumeFunction = bpy.props.StringProperty( - name = 'Camera Function', default = 'cam_castle_hmc_start_pool_cutscene') - bpy.types.Object.cameraVolumeGlobal = bpy.props.BoolProperty( - name = 'Is Global') + bpy.types.Object.starGetCutscenes = bpy.props.PointerProperty( + name="Star Get Cutscenes", type=StarGetCutscenesProperty + ) - bpy.types.Object.starGetCutscenes = bpy.props.PointerProperty( - name = "Star Get Cutscenes", type = StarGetCutscenesProperty) + bpy.types.Object.acousticReach = bpy.props.StringProperty( + name="Acoustic Reach", default="20000" + ) - bpy.types.Object.acousticReach = bpy.props.StringProperty( - name = 'Acoustic Reach', default = '20000') + bpy.types.Object.echoLevel = bpy.props.StringProperty( + name="Echo Level", default="0x00" + ) - bpy.types.Object.echoLevel = bpy.props.StringProperty( - name = 'Echo Level', default = '0x00') + bpy.types.Object.zoomOutOnPause = bpy.props.BoolProperty( + name="Zoom Out On Pause", default=True + ) - bpy.types.Object.zoomOutOnPause = bpy.props.BoolProperty( - name = 'Zoom Out On Pause', default = True) + bpy.types.Object.areaIndex = bpy.props.IntProperty(name="Index", min=0, default=1) - bpy.types.Object.areaIndex = bpy.props.IntProperty(name = 'Index', - min = 0, default = 1) + bpy.types.Object.music_preset = bpy.props.StringProperty( + name="Music Preset", default="0x00" + ) + bpy.types.Object.music_seq = bpy.props.StringProperty( + name="Music Sequence Value", default="SEQ_LEVEL_GRASS" + ) + bpy.types.Object.noMusic = bpy.props.BoolProperty(name="No Music", default=False) + bpy.types.Object.terrain_type = bpy.props.StringProperty( + name="Terrain Type", default="TERRAIN_GRASS" + ) + bpy.types.Object.terrainEnum = bpy.props.EnumProperty( + name="Terrain", items=enumTerrain, default="TERRAIN_GRASS" + ) + bpy.types.Object.musicSeqEnum = bpy.props.EnumProperty( + name="Music Sequence", items=enumMusicSeq, default="SEQ_LEVEL_GRASS" + ) - bpy.types.Object.music_preset = bpy.props.StringProperty( - name = "Music Preset", default = '0x00') - bpy.types.Object.music_seq = bpy.props.StringProperty( - name = "Music Sequence Value", default = 'SEQ_LEVEL_GRASS') - bpy.types.Object.noMusic = bpy.props.BoolProperty( - name = 'No Music', default = False) - bpy.types.Object.terrain_type = bpy.props.StringProperty( - name = "Terrain Type", default = 'TERRAIN_GRASS') - bpy.types.Object.terrainEnum = bpy.props.EnumProperty( - name = 'Terrain', items = enumTerrain, default = "TERRAIN_GRASS") - bpy.types.Object.musicSeqEnum = bpy.props.EnumProperty( - name = 'Music Sequence', items = enumMusicSeq, default = "SEQ_LEVEL_GRASS") + bpy.types.Object.areaCamera = bpy.props.PointerProperty(type=bpy.types.Camera) + bpy.types.Object.warpNodes = bpy.props.CollectionProperty(type=WarpNodeProperty) - bpy.types.Object.areaCamera = bpy.props.PointerProperty(type = bpy.types.Camera) - bpy.types.Object.warpNodes = bpy.props.CollectionProperty( - type = WarpNodeProperty) + bpy.types.Object.showStartDialog = bpy.props.BoolProperty(name="Show Start Dialog") + bpy.types.Object.startDialog = bpy.props.StringProperty( + name="Start Dialog", default="DIALOG_000" + ) + bpy.types.Object.actSelectorIgnore = bpy.props.BoolProperty( + name="Skip Act Selector" + ) + bpy.types.Object.setAsStartLevel = bpy.props.BoolProperty(name="Set As Start Level") - bpy.types.Object.showStartDialog = bpy.props.BoolProperty(name = "Show Start Dialog") - bpy.types.Object.startDialog = bpy.props.StringProperty(name = 'Start Dialog', default = 'DIALOG_000') - bpy.types.Object.actSelectorIgnore = bpy.props.BoolProperty(name = 'Skip Act Selector') - bpy.types.Object.setAsStartLevel = bpy.props.BoolProperty(name = 'Set As Start Level') + bpy.types.Object.switchFunc = bpy.props.StringProperty( + name="Function", + default="", + description="Name of function for C, hex address for binary.", + ) - bpy.types.Object.switchFunc = bpy.props.StringProperty( - name = 'Function', default = '', - description = 'Name of function for C, hex address for binary.') + bpy.types.Object.switchParam = bpy.props.IntProperty( + name="Function Parameter", min=-(2 ** (15)), max=2 ** (15) - 1, default=0 + ) - bpy.types.Object.switchParam = bpy.props.IntProperty( - name = 'Function Parameter', min = -2**(15), max = 2**(15) - 1, default = 0) + bpy.types.Object.useDLReference = bpy.props.BoolProperty( + name="Use displaylist reference" + ) + bpy.types.Object.dlReference = bpy.props.StringProperty( + name="Displaylist variable name or hex address for binary." + ) - bpy.types.Object.useDLReference = bpy.props.BoolProperty(name = 'Use displaylist reference') - bpy.types.Object.dlReference = bpy.props.StringProperty(name = 'Displaylist variable name or hex address for binary.') + bpy.types.Object.geoReference = bpy.props.StringProperty( + name="Geolayout variable name or hex address for binary" + ) - bpy.types.Object.geoReference = bpy.props.StringProperty(name = 'Geolayout variable name or hex address for binary') + bpy.types.Object.customGeoCommand = bpy.props.StringProperty( + name="Geolayout macro command", default="" + ) + bpy.types.Object.customGeoCommandArgs = bpy.props.StringProperty( + name="Geolayout macro arguments", default="" + ) - bpy.types.Object.customGeoCommand = bpy.props.StringProperty(name = 'Geolayout macro command', default = '') - bpy.types.Object.customGeoCommandArgs = bpy.props.StringProperty(name = 'Geolayout macro arguments', default = '') + bpy.types.Object.enableRoomSwitch = bpy.props.BoolProperty( + name="Enable Room System" + ) - bpy.types.Object.enableRoomSwitch = bpy.props.BoolProperty(name = 'Enable Room System') def sm64_obj_unregister(): - del bpy.types.Object.sm64_model_enum - del bpy.types.Object.sm64_macro_enum - del bpy.types.Object.sm64_special_enum - del bpy.types.Object.sm64_behaviour_enum - - #del bpy.types.Object.sm64_model - #del bpy.types.Object.sm64_macro - #del bpy.types.Object.sm64_special - #del bpy.types.Object.sm64_behaviour - - del bpy.types.Object.sm64_obj_type - del bpy.types.Object.sm64_obj_model - del bpy.types.Object.sm64_obj_preset - del bpy.types.Object.sm64_obj_behaviour - - del bpy.types.Object.whirpool_index - del bpy.types.Object.whirpool_condition - del bpy.types.Object.whirpool_strength - - del bpy.types.Object.waterBoxType - - del bpy.types.Object.sm64_obj_use_act1 - del bpy.types.Object.sm64_obj_use_act2 - del bpy.types.Object.sm64_obj_use_act3 - del bpy.types.Object.sm64_obj_use_act4 - del bpy.types.Object.sm64_obj_use_act5 - del bpy.types.Object.sm64_obj_use_act6 - - del bpy.types.Object.sm64_obj_set_bparam - del bpy.types.Object.sm64_obj_set_yaw - - del bpy.types.Object.useBackgroundColor - #del bpy.types.Object.backgroundID - del bpy.types.Object.background - del bpy.types.Object.backgroundColor - - del bpy.types.Object.screenPos - del bpy.types.Object.screenSize - del bpy.types.Object.useDefaultScreenRect - del bpy.types.Object.clipPlanes - del bpy.types.Object.area_fog_color - del bpy.types.Object.area_fog_position - del bpy.types.Object.areaOverrideBG - del bpy.types.Object.areaBGColor - del bpy.types.Object.camOption - del bpy.types.Object.camType - del bpy.types.Object.envOption - del bpy.types.Object.envType - del bpy.types.Object.fov - del bpy.types.Object.dynamicFOV - - del bpy.types.Object.cameraVolumeFunction - del bpy.types.Object.cameraVolumeGlobal - - del bpy.types.Object.starGetCutscenes - - del bpy.types.Object.acousticReach - del bpy.types.Object.echoLevel - del bpy.types.Object.zoomOutOnPause - - del bpy.types.Object.areaIndex - del bpy.types.Object.music_preset - del bpy.types.Object.music_seq - del bpy.types.Object.terrain_type - del bpy.types.Object.areaCamera - del bpy.types.Object.noMusic - - del bpy.types.Object.showStartDialog - del bpy.types.Object.startDialog - del bpy.types.Object.actSelectorIgnore - del bpy.types.Object.setAsStartLevel - del bpy.types.Object.switchFunc - del bpy.types.Object.switchParam - del bpy.types.Object.enableRoomSwitch - - for cls in reversed(sm64_obj_classes): - unregister_class(cls) - -''' + del bpy.types.Object.sm64_model_enum + del bpy.types.Object.sm64_macro_enum + del bpy.types.Object.sm64_special_enum + del bpy.types.Object.sm64_behaviour_enum + + # del bpy.types.Object.sm64_model + # del bpy.types.Object.sm64_macro + # del bpy.types.Object.sm64_special + # del bpy.types.Object.sm64_behaviour + + del bpy.types.Object.sm64_obj_type + del bpy.types.Object.sm64_obj_model + del bpy.types.Object.sm64_obj_preset + del bpy.types.Object.sm64_obj_behaviour + + del bpy.types.Object.whirpool_index + del bpy.types.Object.whirpool_condition + del bpy.types.Object.whirpool_strength + + del bpy.types.Object.waterBoxType + + del bpy.types.Object.sm64_obj_use_act1 + del bpy.types.Object.sm64_obj_use_act2 + del bpy.types.Object.sm64_obj_use_act3 + del bpy.types.Object.sm64_obj_use_act4 + del bpy.types.Object.sm64_obj_use_act5 + del bpy.types.Object.sm64_obj_use_act6 + + del bpy.types.Object.sm64_obj_set_bparam + del bpy.types.Object.sm64_obj_set_yaw + + del bpy.types.Object.useBackgroundColor + # del bpy.types.Object.backgroundID + del bpy.types.Object.background + del bpy.types.Object.backgroundColor + + del bpy.types.Object.screenPos + del bpy.types.Object.screenSize + del bpy.types.Object.useDefaultScreenRect + del bpy.types.Object.clipPlanes + del bpy.types.Object.area_fog_color + del bpy.types.Object.area_fog_position + del bpy.types.Object.areaOverrideBG + del bpy.types.Object.areaBGColor + del bpy.types.Object.camOption + del bpy.types.Object.camType + del bpy.types.Object.envOption + del bpy.types.Object.envType + del bpy.types.Object.fov + del bpy.types.Object.dynamicFOV + + del bpy.types.Object.cameraVolumeFunction + del bpy.types.Object.cameraVolumeGlobal + + del bpy.types.Object.starGetCutscenes + + del bpy.types.Object.acousticReach + del bpy.types.Object.echoLevel + del bpy.types.Object.zoomOutOnPause + + del bpy.types.Object.areaIndex + del bpy.types.Object.music_preset + del bpy.types.Object.music_seq + del bpy.types.Object.terrain_type + del bpy.types.Object.areaCamera + del bpy.types.Object.noMusic + + del bpy.types.Object.showStartDialog + del bpy.types.Object.startDialog + del bpy.types.Object.actSelectorIgnore + del bpy.types.Object.setAsStartLevel + del bpy.types.Object.switchFunc + del bpy.types.Object.switchParam + del bpy.types.Object.enableRoomSwitch + + for cls in reversed(sm64_obj_classes): + unregister_class(cls) + + +""" object: model, bparam, behaviour, acts macro: preset, [bparam] special: preset, [yaw, [bparam]] trajectory: id -''' +""" diff --git a/fast64_internal/sm64/sm64_rom_tweaks.py b/fast64_internal/sm64/sm64_rom_tweaks.py index af513f4fa..d005afa0d 100644 --- a/fast64_internal/sm64/sm64_rom_tweaks.py +++ b/fast64_internal/sm64/sm64_rom_tweaks.py @@ -1,39 +1,41 @@ from .sm64_constants import loadSegmentAddresses + def ExtendBank0x04(romfile, segmentData, segment4): - # Extend bank 0x04 - romfile.seek(loadSegmentAddresses[0x04] + 4) - oldStart = int.from_bytes(romfile.read(4), 'big') - romfile.seek(loadSegmentAddresses[0x04] + 4) - romfile.write(int.to_bytes(segment4[0], 4, 'big')) + # Extend bank 0x04 + romfile.seek(loadSegmentAddresses[0x04] + 4) + oldStart = int.from_bytes(romfile.read(4), "big") + romfile.seek(loadSegmentAddresses[0x04] + 4) + romfile.write(int.to_bytes(segment4[0], 4, "big")) + + romfile.seek(loadSegmentAddresses[0x04] + 8) + oldEnd = int.from_bytes(romfile.read(4), "big") + romfile.seek(loadSegmentAddresses[0x04] + 8) + romfile.write(int.to_bytes(segment4[1], 4, "big")) - romfile.seek(loadSegmentAddresses[0x04] + 8) - oldEnd = int.from_bytes(romfile.read(4), 'big') - romfile.seek(loadSegmentAddresses[0x04] + 8) - romfile.write(int.to_bytes(segment4[1], 4, 'big')) + romfile.seek(oldStart) + oldData = romfile.read(oldEnd - oldStart) - romfile.seek(oldStart) - oldData = romfile.read(oldEnd - oldStart) + if oldEnd - oldStart > segment4[1] - segment4[0]: + print("Not enough space to copy old data.") + raise PluginError("Not enough space to copy old data.") - if oldEnd - oldStart > segment4[1] - segment4[0]: - print("Not enough space to copy old data.") - raise PluginError("Not enough space to copy old data.") + romfile.seek(segment4[0]) + romfile.write(oldData) - romfile.seek(segment4[0]) - romfile.write(oldData) + segmentData[0x04] = (segment4[0], segment4[1]) - segmentData[0x04] = (segment4[0], segment4[1]) def DisableLowPolyMario(romfile, geoStartAddress): - # disable low poly mario - romfile.seek(geoStartAddress + 0x42) - romfile.write(bytearray.fromhex('2E 18')) + # disable low poly mario + romfile.seek(geoStartAddress + 0x42) + romfile.write(bytearray.fromhex("2E 18")) -def readSegment4(romfile, segmentData): - romfile.seek(loadSegmentAddresses[0x04] + 0x4) - seg4start = int.from_bytes(romfile.read(4), 'big') - romfile.seek(loadSegmentAddresses[0x04] + 0x8) - seg4end = int.from_bytes(romfile.read(4), 'big') - segmentData[0x04] = (seg4start, seg4end) +def readSegment4(romfile, segmentData): + romfile.seek(loadSegmentAddresses[0x04] + 0x4) + seg4start = int.from_bytes(romfile.read(4), "big") + romfile.seek(loadSegmentAddresses[0x04] + 0x8) + seg4end = int.from_bytes(romfile.read(4), "big") + segmentData[0x04] = (seg4start, seg4end) diff --git a/fast64_internal/sm64/sm64_spline.py b/fast64_internal/sm64/sm64_spline.py index b1d37c618..64edef3dc 100644 --- a/fast64_internal/sm64/sm64_spline.py +++ b/fast64_internal/sm64/sm64_spline.py @@ -4,162 +4,199 @@ from ..utility import * enumSplineTypes = [ - ("Trajectory", "Trajectory", "Exports to Trajectory[]. Used for movement"), - ('Cutscene', 'Cutscene', 'Exports to CutsceneSplinePoint[]. Used for cutscenes'), - ('Vector', 'Vector', 'Exports to Vec4s[]. Used for the jumbo star keyframes'), + ("Trajectory", "Trajectory", "Exports to Trajectory[]. Used for movement"), + ("Cutscene", "Cutscene", "Exports to CutsceneSplinePoint[]. Used for cutscenes"), + ("Vector", "Vector", "Exports to Vec4s[]. Used for the jumbo star keyframes"), ] + class SM64Spline: - def __init__(self, name, splineType): - self.name = toAlnum(name) - self.splineType = splineType - self.points = [] - self.speeds = [] - - def to_c(self): - data = CData() - if self.splineType == 'Trajectory': - data.header = 'extern const Trajectory ' + self.name + '[];\n' - data.source += 'const Trajectory ' + self.name + '[] = {\n' - for index in range(len(self.points)): - point = self.points[index] - data.source += "\tTRAJECTORY_POS( " + str(index) \ - + ", " + str(int(round(point[0]))) \ - + ", " + str(int(round(point[1]))) \ - + ", " + str(int(round(point[2]))) \ - + "),\n" - data.source += "\tTRAJECTORY_END(),\n};\n" - return data - elif self.splineType == 'Cutscene': - data.header = 'extern struct CutsceneSplinePoint ' + self.name + '[];\n' - data.source += 'struct CutsceneSplinePoint ' + self.name + '[] = {\n' - for index in range(len(self.points)): - point = self.points[index] - if index == len(self.points) - 1: - splineIndex = -1 # last keyframe - else: - splineIndex = index - data.source += "\t{ " + str(splineIndex) \ - + ", " + str(int(round(self.speeds[index]))) \ - + ", { " + str(int(round(point[0]))) \ - + ", " + str(int(round(point[1]))) \ - + ", " + str(int(round(point[2]))) \ - + " }},\n" - data.source += "};\n" - return data - elif self.splineType == 'Vector': - data.header = 'extern const Vec4s ' + self.name + '[];\n' - data.source += 'const Vec4s ' + self.name + '[] = {\n' - for index in range(len(self.points)): - point = self.points[index] - if index >= len(self.points) - 3: - speed = 0 # last 3 points of spline - else: - speed = self.speeds[index] - data.source += "\t{ " + str(int(round(speed))) \ - + ", " + str(int(round(point[0]))) \ - + ", " + str(int(round(point[1]))) \ - + ", " + str(int(round(point[2]))) \ - + " },\n" - data.source += "};\n" - return data - else: - raise PluginError("Invalid SM64 spline type: " + self.splineType) + def __init__(self, name, splineType): + self.name = toAlnum(name) + self.splineType = splineType + self.points = [] + self.speeds = [] + + def to_c(self): + data = CData() + if self.splineType == "Trajectory": + data.header = "extern const Trajectory " + self.name + "[];\n" + data.source += "const Trajectory " + self.name + "[] = {\n" + for index in range(len(self.points)): + point = self.points[index] + data.source += ( + "\tTRAJECTORY_POS( " + + str(index) + + ", " + + str(int(round(point[0]))) + + ", " + + str(int(round(point[1]))) + + ", " + + str(int(round(point[2]))) + + "),\n" + ) + data.source += "\tTRAJECTORY_END(),\n};\n" + return data + elif self.splineType == "Cutscene": + data.header = "extern struct CutsceneSplinePoint " + self.name + "[];\n" + data.source += "struct CutsceneSplinePoint " + self.name + "[] = {\n" + for index in range(len(self.points)): + point = self.points[index] + if index == len(self.points) - 1: + splineIndex = -1 # last keyframe + else: + splineIndex = index + data.source += ( + "\t{ " + + str(splineIndex) + + ", " + + str(int(round(self.speeds[index]))) + + ", { " + + str(int(round(point[0]))) + + ", " + + str(int(round(point[1]))) + + ", " + + str(int(round(point[2]))) + + " }},\n" + ) + data.source += "};\n" + return data + elif self.splineType == "Vector": + data.header = "extern const Vec4s " + self.name + "[];\n" + data.source += "const Vec4s " + self.name + "[] = {\n" + for index in range(len(self.points)): + point = self.points[index] + if index >= len(self.points) - 3: + speed = 0 # last 3 points of spline + else: + speed = self.speeds[index] + data.source += ( + "\t{ " + + str(int(round(speed))) + + ", " + + str(int(round(point[0]))) + + ", " + + str(int(round(point[1]))) + + ", " + + str(int(round(point[2]))) + + " },\n" + ) + data.source += "};\n" + return data + else: + raise PluginError("Invalid SM64 spline type: " + self.splineType) + def convertSplineObject(name, obj, transform): - sm64_spline = SM64Spline(name, obj.data.sm64_spline_type) + sm64_spline = SM64Spline(name, obj.data.sm64_spline_type) + + spline = obj.data.splines[0] + for point in spline.points: + position = transform @ point.co + sm64_spline.points.append(position) + sm64_spline.speeds.append(int(round(point.radius))) + + return sm64_spline - spline = obj.data.splines[0] - for point in spline.points: - position = transform @ point.co - sm64_spline.points.append(position) - sm64_spline.speeds.append(int(round(point.radius))) - - return sm64_spline def onSplineTypeSet(self, context): - if self.sm64_spline_type == 'Trajectory': - self.splines.active.order_u = 1 - else: - self.splines.active.order_u = 4 + if self.sm64_spline_type == "Trajectory": + self.splines.active.order_u = 1 + else: + self.splines.active.order_u = 4 + class SM64_ExportSpline(bpy.types.Operator): - bl_idname = "object.sm64_export_spline" - bl_label = "Export Spline" - bl_options = {'REGISTER', 'UNDO'} + bl_idname = "object.sm64_export_spline" + bl_label = "Export Spline" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + context.object.sm64_special_enum = self.sm64_special_enum + bpy.context.region.tag_redraw() + self.report({"INFO"}, "Selected: " + self.sm64_special_enum) + return {"FINISHED"} - def execute(self, context): - context.object.sm64_special_enum = self.sm64_special_enum - bpy.context.region.tag_redraw() - self.report({'INFO'}, "Selected: " + self.sm64_special_enum) - return {'FINISHED'} class SM64SplinePanel(bpy.types.Panel): - bl_label = "Spline Inspector" - bl_idname = "OBJECT_PT_SM64_Spline_Inspector" - bl_space_type = 'PROPERTIES' - bl_region_type = 'WINDOW' - bl_context = "object" - bl_options = {'HIDE_HEADER'} - - @classmethod - def poll(cls, context): - return context.scene.gameEditorMode == "SM64" and (context.object is not None and \ - type(context.object.data) == bpy.types.Curve) - - def draw(self, context): - box = self.layout.box() - box.box().label(text = 'SM64 Spline Inspector') - curve = context.object.data - if curve.splines[0].type != 'NURBS': - box.label(text = 'Only NURBS curves are compatible.') - else: - prop_split(box, curve, 'sm64_spline_type', 'Spline Type') - if curve.sm64_spline_type == 'Cutscene' or\ - curve.sm64_spline_type == 'Vector': - pointIndex = 0 - for point in curve.splines.active.points: - if point.select: - prop_split(box.box(), point, 'radius', 'Point ' + str(pointIndex) + " Speed") - pointIndex += 1 + bl_label = "Spline Inspector" + bl_idname = "OBJECT_PT_SM64_Spline_Inspector" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "object" + bl_options = {"HIDE_HEADER"} + + @classmethod + def poll(cls, context): + return context.scene.gameEditorMode == "SM64" and ( + context.object is not None and type(context.object.data) == bpy.types.Curve + ) + + def draw(self, context): + box = self.layout.box() + box.box().label(text="SM64 Spline Inspector") + curve = context.object.data + if curve.splines[0].type != "NURBS": + box.label(text="Only NURBS curves are compatible.") + else: + prop_split(box, curve, "sm64_spline_type", "Spline Type") + if ( + curve.sm64_spline_type == "Cutscene" + or curve.sm64_spline_type == "Vector" + ): + pointIndex = 0 + for point in curve.splines.active.points: + if point.select: + prop_split( + box.box(), + point, + "radius", + "Point " + str(pointIndex) + " Speed", + ) + pointIndex += 1 + def assertCurveValid(obj): - curve = obj.data - if not isinstance(curve, bpy.types.Curve) or curve.splines[0].type != 'NURBS': - # Curve was likely not intended to be exported - return False - if len(curve.splines) != 1: - # Curve was intended to be exported but has multiple disconnected segments - raise PluginError('Exported curves should have only one single segment, found ' + str(len(curve.splines))) - return True + curve = obj.data + if not isinstance(curve, bpy.types.Curve) or curve.splines[0].type != "NURBS": + # Curve was likely not intended to be exported + return False + if len(curve.splines) != 1: + # Curve was intended to be exported but has multiple disconnected segments + raise PluginError( + "Exported curves should have only one single segment, found " + + str(len(curve.splines)) + ) + return True + + +sm64_spline_classes = (SM64_ExportSpline,) -sm64_spline_classes = ( - SM64_ExportSpline, -) +sm64_spline_panel_classes = (SM64SplinePanel,) -sm64_spline_panel_classes = ( - SM64SplinePanel, -) def sm64_spline_panel_register(): - for cls in sm64_spline_panel_classes: - register_class(cls) + for cls in sm64_spline_panel_classes: + register_class(cls) + def sm64_spline_panel_unregister(): - for cls in sm64_spline_panel_classes: - unregister_class(cls) + for cls in sm64_spline_panel_classes: + unregister_class(cls) def sm64_spline_register(): - for cls in sm64_spline_classes: - register_class(cls) + for cls in sm64_spline_classes: + register_class(cls) + + bpy.types.Curve.sm64_spline_type = bpy.props.EnumProperty( + name="Type", items=enumSplineTypes, update=onSplineTypeSet + ) - bpy.types.Curve.sm64_spline_type = bpy.props.EnumProperty( - name = 'Type', items = enumSplineTypes, update = onSplineTypeSet) def sm64_spline_unregister(): - del bpy.types.Curve.sm64_spline_type + del bpy.types.Curve.sm64_spline_type - for cls in reversed(sm64_spline_classes): - unregister_class(cls) \ No newline at end of file + for cls in reversed(sm64_spline_classes): + unregister_class(cls) diff --git a/fast64_internal/sm64/sm64_texscroll.py b/fast64_internal/sm64/sm64_texscroll.py index 8cb0709a8..e9fee55bc 100644 --- a/fast64_internal/sm64/sm64_texscroll.py +++ b/fast64_internal/sm64/sm64_texscroll.py @@ -6,426 +6,540 @@ # This is for writing framework for scroll code. # Actual scroll code found in f3d_gbi.py (FVertexScrollData) + class SM64TexScrollFileStatus: - def __init__(self): - self.starSelectC = False + def __init__(self): + self.starSelectC = False + def readSegmentInfo(baseDir): - ldPath = os.path.join(baseDir, 'sm64.ld') - ldFile = open(ldPath, 'r', newline = '\n') - ldData = ldFile.read() - ldFile.close() - - compressionFmt = bpy.context.scene.compressionFormat - segDict = {} - for matchResult in re.finditer('(?>" in value: - i = value.index(">>") - return hexOrDecInt(value[:i]) >> hexOrDecInt(value[i + 2:]) - elif 'x' in value: - return int(value, 16) - else: - return int(value) + if isinstance(value, int): + return value + elif "<<" in value: + i = value.index("<<") + return hexOrDecInt(value[:i]) << hexOrDecInt(value[i + 2 :]) + elif ">>" in value: + i = value.index(">>") + return hexOrDecInt(value[:i]) >> hexOrDecInt(value[i + 2 :]) + elif "x" in value: + return int(value, 16) + else: + return int(value) + def getOrMakeVertexGroup(obj, groupName): - for group in obj.vertex_groups: - if group.name == groupName: - return group - return obj.vertex_groups.new(name = groupName) + for group in obj.vertex_groups: + if group.name == groupName: + return group + return obj.vertex_groups.new(name=groupName) + def unhideAllAndGetHiddenList(scene): - hiddenObjs = [] - for obj in scene.objects: - if obj.hide_get(): - hiddenObjs.append(obj) + hiddenObjs = [] + for obj in scene.objects: + if obj.hide_get(): + hiddenObjs.append(obj) + + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + bpy.ops.object.hide_view_clear() + return hiddenObjs - if bpy.context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = "OBJECT") - bpy.ops.object.hide_view_clear() - return hiddenObjs def hideObjsInList(hiddenObjs): - for obj in hiddenObjs: - obj.hide_set(True) + for obj in hiddenObjs: + obj.hide_set(True) def readFile(filepath): - datafile = open(filepath, 'r', newline = '\n', encoding = 'utf-8') - data = datafile.read() - datafile.close() - return data + datafile = open(filepath, "r", newline="\n", encoding="utf-8") + data = datafile.read() + datafile.close() + return data + def writeFile(filepath, data): - datafile = open(filepath, 'w', newline = '\n', encoding = 'utf-8') - datafile.write(data) - datafile.close() + datafile = open(filepath, "w", newline="\n", encoding="utf-8") + datafile.write(data) + datafile.close() + def checkObjectReference(obj, title): - if obj.name not in bpy.context.view_layer.objects: - raise PluginError(title + " not in current view layer.\n The object is either in a different view layer or is deleted.") + if obj.name not in bpy.context.view_layer.objects: + raise PluginError( + title + + " not in current view layer.\n The object is either in a different view layer or is deleted." + ) + def parentObject(parent, child): - bpy.ops.object.select_all(action = "DESELECT") + bpy.ops.object.select_all(action="DESELECT") + + child.select_set(True) + parent.select_set(True) + bpy.context.view_layer.objects.active = parent + bpy.ops.object.parent_set(type="OBJECT", keep_transform=True) - child.select_set(True) - parent.select_set(True) - bpy.context.view_layer.objects.active = parent - bpy.ops.object.parent_set(type='OBJECT', keep_transform=True) def attemptModifierApply(modifier): - try: - bpy.ops.object.modifier_apply(modifier=modifier.name) - except Exception as e: - print("Skipping modifier " + str(modifier.name)) + try: + bpy.ops.object.modifier_apply(modifier=modifier.name) + except Exception as e: + print("Skipping modifier " + str(modifier.name)) + def getFMeshName(vertexGroup, namePrefix, drawLayer, isSkinned): - fMeshName = toAlnum(namePrefix + ('_' if namePrefix != '' else '') + vertexGroup) - if isSkinned: - fMeshName += '_skinned' - fMeshName += '_mesh' - if drawLayer is not None: - fMeshName += '_layer_' + str(drawLayer) - return fMeshName + fMeshName = toAlnum(namePrefix + ("_" if namePrefix != "" else "") + vertexGroup) + if isSkinned: + fMeshName += "_skinned" + fMeshName += "_mesh" + if drawLayer is not None: + fMeshName += "_layer_" + str(drawLayer) + return fMeshName + def checkUniqueBoneNames(fModel, name, vertexGroup): - if name in fModel.meshes: - raise PluginError(vertexGroup + " has already been processed. Make " +\ - "sure this bone name is unique, even across all switch option " +\ - "armatures, and that any integer keys are not strings.") + if name in fModel.meshes: + raise PluginError( + vertexGroup + + " has already been processed. Make " + + "sure this bone name is unique, even across all switch option " + + "armatures, and that any integer keys are not strings." + ) + def getGroupIndexFromname(obj, name): - for group in obj.vertex_groups: - if group.name == name: - return group.index - return None + for group in obj.vertex_groups: + if group.name == name: + return group.index + return None + def getGroupNameFromIndex(obj, index): - for group in obj.vertex_groups: - if group.index == index: - return group.name - return None + for group in obj.vertex_groups: + if group.index == index: + return group.name + return None def copyPropertyCollection(oldProp, newProp): - newProp.clear() - for item in oldProp: - newItem = newProp.add() - if isinstance(item, bpy.types.PropertyGroup): - copyPropertyGroup(item, newItem) - elif type(item).__name__ == "bpy_prop_collection_idprop": - copyPropertyCollection(item, newItem) - else: - newItem = item + newProp.clear() + for item in oldProp: + newItem = newProp.add() + if isinstance(item, bpy.types.PropertyGroup): + copyPropertyGroup(item, newItem) + elif type(item).__name__ == "bpy_prop_collection_idprop": + copyPropertyCollection(item, newItem) + else: + newItem = item + def copyPropertyGroup(oldProp, newProp): - for sub_value_attr in oldProp.bl_rna.properties.keys(): - if sub_value_attr == "rna_type": - continue - sub_value = getattr(oldProp, sub_value_attr) - if isinstance(sub_value, bpy.types.PropertyGroup): - copyPropertyGroup(sub_value, getattr(newProp, sub_value_attr)) - elif type(sub_value).__name__ == "bpy_prop_collection_idprop": - newCollection = getattr(newProp, sub_value_attr) - copyPropertyCollection(sub_value, newCollection) - else: - setattr(newProp, sub_value_attr, sub_value) + for sub_value_attr in oldProp.bl_rna.properties.keys(): + if sub_value_attr == "rna_type": + continue + sub_value = getattr(oldProp, sub_value_attr) + if isinstance(sub_value, bpy.types.PropertyGroup): + copyPropertyGroup(sub_value, getattr(newProp, sub_value_attr)) + elif type(sub_value).__name__ == "bpy_prop_collection_idprop": + newCollection = getattr(newProp, sub_value_attr) + copyPropertyCollection(sub_value, newCollection) + else: + setattr(newProp, sub_value_attr, sub_value) + def propertyCollectionEquals(oldProp, newProp): - if len(oldProp) != len(newProp): - print("Unequal size: " + str(oldProp) + " " + str(len(oldProp)) + ", " + str(newProp) + str(len(newProp))) - return False - - equivalent = True - for i in range(len(oldProp)): - item = oldProp[i] - newItem = newProp[i] - if isinstance(item, bpy.types.PropertyGroup): - equivalent &= propertyGroupEquals(item, newItem) - elif type(item).__name__ == "bpy_prop_collection_idprop": - equivalent &= propertyCollectionEquals(item, newItem) - else: - try: - iterator = iter(item) - except TypeError: - isEquivalent = newItem == item - else: - isEquivalent = tuple([i for i in newItem]) == tuple([ i for i in item]) - if not isEquivalent: - pass #print("Not equivalent: " + str(item) + " " + str(newItem)) - equivalent &= isEquivalent - - return equivalent + if len(oldProp) != len(newProp): + print( + "Unequal size: " + + str(oldProp) + + " " + + str(len(oldProp)) + + ", " + + str(newProp) + + str(len(newProp)) + ) + return False + + equivalent = True + for i in range(len(oldProp)): + item = oldProp[i] + newItem = newProp[i] + if isinstance(item, bpy.types.PropertyGroup): + equivalent &= propertyGroupEquals(item, newItem) + elif type(item).__name__ == "bpy_prop_collection_idprop": + equivalent &= propertyCollectionEquals(item, newItem) + else: + try: + iterator = iter(item) + except TypeError: + isEquivalent = newItem == item + else: + isEquivalent = tuple([i for i in newItem]) == tuple([i for i in item]) + if not isEquivalent: + pass # print("Not equivalent: " + str(item) + " " + str(newItem)) + equivalent &= isEquivalent + + return equivalent + def propertyGroupEquals(oldProp, newProp): - equivalent = True - for sub_value_attr in oldProp.bl_rna.properties.keys(): - if sub_value_attr == "rna_type": - continue - sub_value = getattr(oldProp, sub_value_attr) - if isinstance(sub_value, bpy.types.PropertyGroup): - equivalent &= propertyGroupEquals(sub_value, getattr(newProp, sub_value_attr)) - elif type(sub_value).__name__ == "bpy_prop_collection_idprop": - newCollection = getattr(newProp, sub_value_attr) - copyPropertyCollection(sub_value, newCollection) - else: - newValue = getattr(newProp, sub_value_attr) - try: - iterator = iter(newValue) - except TypeError: - isEquivalent = newValue == sub_value - else: - isEquivalent = tuple([i for i in newValue]) == tuple([i for i in sub_value]) - - if not isEquivalent: - pass #print("Not equivalent: " + str(sub_value) + " " + str(newValue) + " " + str(sub_value_attr)) - equivalent &= isEquivalent - - return equivalent + equivalent = True + for sub_value_attr in oldProp.bl_rna.properties.keys(): + if sub_value_attr == "rna_type": + continue + sub_value = getattr(oldProp, sub_value_attr) + if isinstance(sub_value, bpy.types.PropertyGroup): + equivalent &= propertyGroupEquals( + sub_value, getattr(newProp, sub_value_attr) + ) + elif type(sub_value).__name__ == "bpy_prop_collection_idprop": + newCollection = getattr(newProp, sub_value_attr) + copyPropertyCollection(sub_value, newCollection) + else: + newValue = getattr(newProp, sub_value_attr) + try: + iterator = iter(newValue) + except TypeError: + isEquivalent = newValue == sub_value + else: + isEquivalent = tuple([i for i in newValue]) == tuple( + [i for i in sub_value] + ) + + if not isEquivalent: + pass # print("Not equivalent: " + str(sub_value) + " " + str(newValue) + " " + str(sub_value_attr)) + equivalent &= isEquivalent + + return equivalent + def writeCData(data, headerPath, sourcePath): - sourceFile = open(sourcePath, 'w', newline = '\n', encoding = 'utf-8') - sourceFile.write(data.source) - sourceFile.close() + sourceFile = open(sourcePath, "w", newline="\n", encoding="utf-8") + sourceFile.write(data.source) + sourceFile.close() + + headerFile = open(headerPath, "w", newline="\n", encoding="utf-8") + headerFile.write(data.header) + headerFile.close() - headerFile = open(headerPath, 'w', newline = '\n', encoding = 'utf-8') - headerFile.write(data.header) - headerFile.close() def writeCDataSourceOnly(data, sourcePath): - sourceFile = open(sourcePath, 'w', newline = '\n', encoding = 'utf-8') - sourceFile.write(data.source) - sourceFile.close() + sourceFile = open(sourcePath, "w", newline="\n", encoding="utf-8") + sourceFile.write(data.source) + sourceFile.close() + def writeCDataHeaderOnly(data, headerPath): - headerFile = open(headerPath, 'w', newline = '\n', encoding = 'utf-8') - headerFile.write(data.header) - headerFile.close() + headerFile = open(headerPath, "w", newline="\n", encoding="utf-8") + headerFile.write(data.header) + headerFile.close() + class CData: - def __init__(self): - self.source = "" - self.header = "" + def __init__(self): + self.source = "" + self.header = "" + + def append(self, other): + self.source += other.source + self.header += other.header - def append(self, other): - self.source += other.source - self.header += other.header def getObjectFromData(data): - for obj in bpy.data.objects: - if obj.data == data: - return obj - return None + for obj in bpy.data.objects: + if obj.data == data: + return obj + return None + def getTabbedText(text, tabCount): - return text.replace('\n', '\n' + '\t' * tabCount) + return text.replace("\n", "\n" + "\t" * tabCount) + def extendedRAMLabel(layout): - return - infoBox = layout.box() - infoBox.label(text = 'Be sure to add: ') - infoBox.label(text = '"#define USE_EXT_RAM"') - infoBox.label(text = 'to include/segments.h.') - infoBox.label(text = 'Extended RAM prevents crashes.') + return + infoBox = layout.box() + infoBox.label(text="Be sure to add: ") + infoBox.label(text='"#define USE_EXT_RAM"') + infoBox.label(text="to include/segments.h.") + infoBox.label(text="Extended RAM prevents crashes.") + def checkExpanded(filepath): - size = os.path.getsize(filepath) - if size < 9000000: # check if 8MB - raise PluginError("ROM at " + filepath + " is too small. You may be using an unexpanded ROM. You can expand a ROM by opening it in SM64 Editor or ROM Manager.") + size = os.path.getsize(filepath) + if size < 9000000: # check if 8MB + raise PluginError( + "ROM at " + + filepath + + " is too small. You may be using an unexpanded ROM. You can expand a ROM by opening it in SM64 Editor or ROM Manager." + ) + def getPathAndLevel(customExport, exportPath, levelName, levelOption): - if customExport: - exportPath = bpy.path.abspath(exportPath) - levelName = levelName - else: - exportPath = bpy.path.abspath(bpy.context.scene.decompPath) - if levelOption == 'custom': - levelName = levelName - else: - levelName = levelOption - return exportPath, levelName + if customExport: + exportPath = bpy.path.abspath(exportPath) + levelName = levelName + else: + exportPath = bpy.path.abspath(bpy.context.scene.decompPath) + if levelOption == "custom": + levelName = levelName + else: + levelName = levelOption + return exportPath, levelName + def findStartBones(armatureObj): - noParentBones = sorted([bone.name for bone in armatureObj.data.bones if \ - bone.parent is None and (bone.geo_cmd != 'SwitchOption' and bone.geo_cmd != 'Ignore')]) - - if len(noParentBones) == 0: - raise PluginError("No non switch option start bone could be found " +\ - 'in ' + armatureObj.name + '. Is this the root armature?') - else: - return noParentBones - - if len(noParentBones) == 1: - return noParentBones[0] - elif len(noParentBones) == 0: - raise PluginError("No non switch option start bone could be found " +\ - 'in ' + armatureObj.name + '. Is this the root armature?') - else: - raise PluginError("Too many parentless bones found. Make sure your bone hierarchy starts from a single bone, " +\ - "and that any bones not related to a hierarchy have their geolayout command set to \"Ignore\".") + noParentBones = sorted( + [ + bone.name + for bone in armatureObj.data.bones + if bone.parent is None + and (bone.geo_cmd != "SwitchOption" and bone.geo_cmd != "Ignore") + ] + ) + + if len(noParentBones) == 0: + raise PluginError( + "No non switch option start bone could be found " + + "in " + + armatureObj.name + + ". Is this the root armature?" + ) + else: + return noParentBones + + if len(noParentBones) == 1: + return noParentBones[0] + elif len(noParentBones) == 0: + raise PluginError( + "No non switch option start bone could be found " + + "in " + + armatureObj.name + + ". Is this the root armature?" + ) + else: + raise PluginError( + "Too many parentless bones found. Make sure your bone hierarchy starts from a single bone, " + + 'and that any bones not related to a hierarchy have their geolayout command set to "Ignore".' + ) + def getDataFromFile(filepath): - if not os.path.exists(filepath): - raise PluginError("Path \"" + filepath + '" does not exist.') - dataFile = open(filepath, 'r', newline = '\n') - data = dataFile.read() - dataFile.close() - return data + if not os.path.exists(filepath): + raise PluginError('Path "' + filepath + '" does not exist.') + dataFile = open(filepath, "r", newline="\n") + data = dataFile.read() + dataFile.close() + return data + def saveDataToFile(filepath, data): - dataFile = open(filepath, 'w', newline = '\n') - dataFile.write(data) - dataFile.close() + dataFile = open(filepath, "w", newline="\n") + dataFile.write(data) + dataFile.close() -def applyBasicTweaks(baseDir): - enableExtendedRAM(baseDir) - return -def enableExtendedRAM(baseDir): - segmentPath = os.path.join(baseDir, 'include/segments.h') +def applyBasicTweaks(baseDir): + enableExtendedRAM(baseDir) + return - segmentFile = open(segmentPath, 'r', newline = '\n') - segmentData = segmentFile.read() - segmentFile.close() - matchResult = re.search('#define\s*USE\_EXT\_RAM', segmentData) +def enableExtendedRAM(baseDir): + segmentPath = os.path.join(baseDir, "include/segments.h") - if not matchResult: - matchResult = re.search('#ifndef\s*USE\_EXT\_RAM', segmentData) - if matchResult is None: - raise PluginError("When trying to enable extended RAM, " +\ - "could not find '#ifndef USE_EXT_RAM' in include/segments.h.") - segmentData = segmentData[:matchResult.start(0)] + \ - '#define USE_EXT_RAM\n' + \ - segmentData[matchResult.start(0):] + segmentFile = open(segmentPath, "r", newline="\n") + segmentData = segmentFile.read() + segmentFile.close() - segmentFile = open(segmentPath, 'w', newline = '\n') - segmentFile.write(segmentData) - segmentFile.close() + matchResult = re.search("#define\s*USE\_EXT\_RAM", segmentData) -def writeMaterialHeaders(exportDir, matCInclude, matHInclude): - writeIfNotFound(os.path.join(exportDir, 'src/game/materials.c'), - '\n' + matCInclude, '') - writeIfNotFound(os.path.join(exportDir, 'src/game/materials.h'), - '\n' + matHInclude, '#endif') + if not matchResult: + matchResult = re.search("#ifndef\s*USE\_EXT\_RAM", segmentData) + if matchResult is None: + raise PluginError( + "When trying to enable extended RAM, " + + "could not find '#ifndef USE_EXT_RAM' in include/segments.h." + ) + segmentData = ( + segmentData[: matchResult.start(0)] + + "#define USE_EXT_RAM\n" + + segmentData[matchResult.start(0) :] + ) -def writeMaterialFiles(exportDir, assetDir, headerInclude, matHInclude, - headerDynamic, dynamic_data, geoString, customExport): - if not customExport: - writeMaterialBase(exportDir) - levelMatCPath = os.path.join(assetDir, 'material.inc.c') - levelMatHPath = os.path.join(assetDir, 'material.inc.h') + segmentFile = open(segmentPath, "w", newline="\n") + segmentFile.write(segmentData) + segmentFile.close() - levelMatCFile = open(levelMatCPath, 'w', newline = '\n') - levelMatCFile.write(dynamic_data) - levelMatCFile.close() - headerDynamic = headerInclude + '\n\n' + headerDynamic - levelMatHFile = open(levelMatHPath, 'w', newline = '\n') - levelMatHFile.write(headerDynamic) - levelMatHFile.close() +def writeMaterialHeaders(exportDir, matCInclude, matHInclude): + writeIfNotFound( + os.path.join(exportDir, "src/game/materials.c"), "\n" + matCInclude, "" + ) + writeIfNotFound( + os.path.join(exportDir, "src/game/materials.h"), "\n" + matHInclude, "#endif" + ) + + +def writeMaterialFiles( + exportDir, + assetDir, + headerInclude, + matHInclude, + headerDynamic, + dynamic_data, + geoString, + customExport, +): + if not customExport: + writeMaterialBase(exportDir) + levelMatCPath = os.path.join(assetDir, "material.inc.c") + levelMatHPath = os.path.join(assetDir, "material.inc.h") + + levelMatCFile = open(levelMatCPath, "w", newline="\n") + levelMatCFile.write(dynamic_data) + levelMatCFile.close() + + headerDynamic = headerInclude + "\n\n" + headerDynamic + levelMatHFile = open(levelMatHPath, "w", newline="\n") + levelMatHFile.write(headerDynamic) + levelMatHFile.close() + + return matHInclude + "\n\n" + geoString - return matHInclude + '\n\n' + geoString def writeMaterialBase(baseDir): - matHPath = os.path.join(baseDir, 'src/game/materials.h') - if not os.path.exists(matHPath): - matHFile = open(matHPath, 'w', newline = '\n') + matHPath = os.path.join(baseDir, "src/game/materials.h") + if not os.path.exists(matHPath): + matHFile = open(matHPath, "w", newline="\n") + + # Write material.inc.h + matHFile.write("#ifndef MATERIALS_H\n" + "#define MATERIALS_H\n\n" + "#endif") - # Write material.inc.h - matHFile.write( - '#ifndef MATERIALS_H\n' +\ - '#define MATERIALS_H\n\n' + \ - '#endif') + matHFile.close() - matHFile.close() + matCPath = os.path.join(baseDir, "src/game/materials.c") + if not os.path.exists(matCPath): + matCFile = open(matCPath, "w", newline="\n") + matCFile.write( + '#include "types.h"\n' + + '#include "rendering_graph_node.h"\n' + + '#include "object_fields.h"\n' + + '#include "materials.h"' + ) - matCPath = os.path.join(baseDir, 'src/game/materials.c') - if not os.path.exists(matCPath): - matCFile = open(matCPath, 'w', newline = '\n') - matCFile.write( - '#include "types.h"\n' +\ - '#include "rendering_graph_node.h"\n' +\ - '#include "object_fields.h"\n' +\ - '#include "materials.h"') + # Write global texture load function here + # Write material.inc.c + # Write update_materials - # Write global texture load function here - # Write material.inc.c - # Write update_materials + matCFile.close() - matCFile.close() def getRGBA16Tuple(color): - return ((int(round(color[0] * 0x1F)) & 0x1F) << 11) | \ - ((int(round(color[1] * 0x1F)) & 0x1F) << 6) | \ - ((int(round(color[2] * 0x1F)) & 0x1F) << 1) | \ - (1 if color[3] > 0.5 else 0) + return ( + ((int(round(color[0] * 0x1F)) & 0x1F) << 11) + | ((int(round(color[1] * 0x1F)) & 0x1F) << 6) + | ((int(round(color[2] * 0x1F)) & 0x1F) << 1) + | (1 if color[3] > 0.5 else 0) + ) + def getIA16Tuple(color): - intensity = mathutils.Color(color[0:3]).v - alpha = color[3] - return (int(round(intensity * 0xFF)) << 8) | int(alpha * 0xFF) + intensity = mathutils.Color(color[0:3]).v + alpha = color[3] + return (int(round(intensity * 0xFF)) << 8) | int(alpha * 0xFF) + def convertRadiansToS16(value): - value = math.degrees(value) - # ??? Why is this negative? - # TODO: Figure out why this has to be this way - value = 360 - (value % 360) - return hex(round(value / 360 * 0xFFFF)) + value = math.degrees(value) + # ??? Why is this negative? + # TODO: Figure out why this has to be this way + value = 360 - (value % 360) + return hex(round(value / 360 * 0xFFFF)) + def cast_integer(value: int, bits: int, signed: bool): wrap = 1 << bits value %= wrap return value - wrap if signed and value & (1 << (bits - 1)) else value + to_s16 = lambda x: cast_integer(round(x), 16, True) radians_to_s16 = lambda d: to_s16(d * 0x10000 / (2 * math.pi)) + def decompFolderMessage(layout): - layout.box().label(text = 'This will export to your decomp folder.') + layout.box().label(text="This will export to your decomp folder.") + def customExportWarning(layout): - layout.box().label(text = 'This will not write any headers/dependencies.') + layout.box().label(text="This will not write any headers/dependencies.") + def raisePluginError(operator, exception): - print(traceback.format_exc()) - if bpy.context.scene.fullTraceback: - operator.report({'ERROR'}, traceback.format_exc()) - else: - operator.report({'ERROR'}, str(exception)) + print(traceback.format_exc()) + if bpy.context.scene.fullTraceback: + operator.report({"ERROR"}, traceback.format_exc()) + else: + operator.report({"ERROR"}, str(exception)) + def highlightWeightErrors(obj, elements, elementType): - return # Doesn't work currently - if bpy.context.mode != 'OBJECT': - bpy.ops.object.mode_set(mode = 'OBJECT') - bpy.ops.object.select_all(action = "DESELECT") - obj.select_set(True) - bpy.context.view_layer.objects.active = obj - bpy.ops.object.mode_set(mode = 'EDIT') - bpy.ops.mesh.select_all(action = "DESELECT") - bpy.ops.mesh.select_mode(type = elementType) - bpy.ops.object.mode_set(mode = 'OBJECT') - print(elements) - for element in elements: - element.select = True + return # Doesn't work currently + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + bpy.ops.object.select_all(action="DESELECT") + obj.select_set(True) + bpy.context.view_layer.objects.active = obj + bpy.ops.object.mode_set(mode="EDIT") + bpy.ops.mesh.select_all(action="DESELECT") + bpy.ops.mesh.select_mode(type=elementType) + bpy.ops.object.mode_set(mode="OBJECT") + print(elements) + for element in elements: + element.select = True + def checkIdentityRotation(obj, rotation, allowYaw): - rotationDiff = rotation.to_euler() - if abs(rotationDiff.x) > 0.001 or (not allowYaw and abs(rotationDiff.y) > 0.001) or abs(rotationDiff.z) > 0.001: - raise PluginError("Box \"" + obj.name + "\" cannot have a non-zero world rotation " + \ - ("(except yaw)" if allowYaw else "") + ", currently at (" + \ - str(rotationDiff[0]) + ', ' + str(rotationDiff[1]) + ', ' + str(rotationDiff[2]) + ')') + rotationDiff = rotation.to_euler() + if ( + abs(rotationDiff.x) > 0.001 + or (not allowYaw and abs(rotationDiff.y) > 0.001) + or abs(rotationDiff.z) > 0.001 + ): + raise PluginError( + 'Box "' + + obj.name + + '" cannot have a non-zero world rotation ' + + ("(except yaw)" if allowYaw else "") + + ", currently at (" + + str(rotationDiff[0]) + + ", " + + str(rotationDiff[1]) + + ", " + + str(rotationDiff[2]) + + ")" + ) + def setOrigin(target, obj): - bpy.ops.object.select_all(action = "DESELECT") - obj.select_set(True) - bpy.context.view_layer.objects.active = obj - bpy.ops.object.transform_apply() - bpy.context.scene.cursor.location = target.location - bpy.ops.object.origin_set(type = 'ORIGIN_CURSOR') - bpy.ops.object.select_all(action = "DESELECT") + bpy.ops.object.select_all(action="DESELECT") + obj.select_set(True) + bpy.context.view_layer.objects.active = obj + bpy.ops.object.transform_apply() + bpy.context.scene.cursor.location = target.location + bpy.ops.object.origin_set(type="ORIGIN_CURSOR") + bpy.ops.object.select_all(action="DESELECT") + def checkIfPathExists(filePath): - if not os.path.exists(filePath): - raise PluginError(filePath + " does not exist.") + if not os.path.exists(filePath): + raise PluginError(filePath + " does not exist.") + def makeWriteInfoBox(layout): - writeBox = layout.box() - writeBox.label(text = 'Along with header edits, this will write to:') - return writeBox + writeBox = layout.box() + writeBox.label(text="Along with header edits, this will write to:") + return writeBox + def writeBoxExportType(writeBox, headerType, name, levelName, levelOption): - if headerType == 'Actor': - writeBox.label(text = 'actors/' + toAlnum(name)) - elif headerType == 'Level': - if levelOption != 'custom': - levelName = levelOption - writeBox.label(text = 'levels/' + toAlnum(levelName) + '/' + toAlnum(name)) + if headerType == "Actor": + writeBox.label(text="actors/" + toAlnum(name)) + elif headerType == "Level": + if levelOption != "custom": + levelName = levelOption + writeBox.label(text="levels/" + toAlnum(levelName) + "/" + toAlnum(name)) + def getExportDir(customExport, dirPath, headerType, levelName, texDir, dirName): - # Get correct directory from decomp base, and overwrite texDir - if not customExport: - if headerType == 'Actor': - dirPath = os.path.join(dirPath, 'actors') - texDir = 'actors/' + dirName - elif headerType == 'Level': - dirPath = os.path.join(dirPath, 'levels/' + levelName) - texDir = 'levels/' + levelName + # Get correct directory from decomp base, and overwrite texDir + if not customExport: + if headerType == "Actor": + dirPath = os.path.join(dirPath, "actors") + texDir = "actors/" + dirName + elif headerType == "Level": + dirPath = os.path.join(dirPath, "levels/" + levelName) + texDir = "levels/" + levelName + + return dirPath, texDir - return dirPath, texDir def overwriteData(headerRegex, name, value, filePath, writeNewBeforeString, isFunction): - if os.path.exists(filePath): - dataFile = open(filePath, 'r') - data = dataFile.read() - dataFile.close() - - matchResult = re.search(headerRegex + re.escape(name) + \ - ('\s*\((((?!\)).)*)\)\s*\{(((?!\}).)*)\}' if isFunction else \ - '\[\]\s*=\s*\{(((?!;).)*);'), data, re.DOTALL) - if matchResult: - data = data[:matchResult.start(0)] + value + data[matchResult.end(0):] - else: - if writeNewBeforeString is not None: - cmdPos = data.find(writeNewBeforeString) - if cmdPos == -1: - raise PluginError("Could not find '" + writeNewBeforeString + "'.") - data = data[:cmdPos] + value + '\n' + data[cmdPos:] - else: - data += '\n' + value - dataFile = open(filePath, 'w', newline='\n') - dataFile.write(data) - dataFile.close() - else: - raise PluginError(filePath + " does not exist.") + if os.path.exists(filePath): + dataFile = open(filePath, "r") + data = dataFile.read() + dataFile.close() + + matchResult = re.search( + headerRegex + + re.escape(name) + + ( + "\s*\((((?!\)).)*)\)\s*\{(((?!\}).)*)\}" + if isFunction + else "\[\]\s*=\s*\{(((?!;).)*);" + ), + data, + re.DOTALL, + ) + if matchResult: + data = data[: matchResult.start(0)] + value + data[matchResult.end(0) :] + else: + if writeNewBeforeString is not None: + cmdPos = data.find(writeNewBeforeString) + if cmdPos == -1: + raise PluginError("Could not find '" + writeNewBeforeString + "'.") + data = data[:cmdPos] + value + "\n" + data[cmdPos:] + else: + data += "\n" + value + dataFile = open(filePath, "w", newline="\n") + dataFile.write(data) + dataFile.close() + else: + raise PluginError(filePath + " does not exist.") + def writeIfNotFound(filePath, stringValue, footer): - if os.path.exists(filePath): - fileData = open(filePath, 'r') - fileData.seek(0) - stringData = fileData.read() - fileData.close() - if stringValue not in stringData: - if len(footer) > 0: - footerIndex = stringData.rfind(footer) - if footerIndex == -1: - raise PluginError("Footer " + footer + " does not exist.") - stringData = stringData[:footerIndex] + stringValue + '\n' + stringData[footerIndex:] - else: - stringData += stringValue - fileData = open(filePath, 'w', newline = '\n') - fileData.write(stringData) - fileData.close() - else: - raise PluginError(filePath + " does not exist.") + if os.path.exists(filePath): + fileData = open(filePath, "r") + fileData.seek(0) + stringData = fileData.read() + fileData.close() + if stringValue not in stringData: + if len(footer) > 0: + footerIndex = stringData.rfind(footer) + if footerIndex == -1: + raise PluginError("Footer " + footer + " does not exist.") + stringData = ( + stringData[:footerIndex] + + stringValue + + "\n" + + stringData[footerIndex:] + ) + else: + stringData += stringValue + fileData = open(filePath, "w", newline="\n") + fileData.write(stringData) + fileData.close() + else: + raise PluginError(filePath + " does not exist.") + def deleteIfFound(filePath, stringValue): - if os.path.exists(filePath): - fileData = open(filePath, 'r') - fileData.seek(0) - stringData = fileData.read() - fileData.close() - if stringValue in stringData: - stringData = stringData.replace(stringValue, '') - fileData = open(filePath, 'w', newline = '\n') - fileData.write(stringData) - fileData.close() + if os.path.exists(filePath): + fileData = open(filePath, "r") + fileData.seek(0) + stringData = fileData.read() + fileData.close() + if stringValue in stringData: + stringData = stringData.replace(stringValue, "") + fileData = open(filePath, "w", newline="\n") + fileData.write(stringData) + fileData.close() + def yield_children(obj: bpy.types.Object): - yield obj - if obj.children: - for o in obj.children: - yield from yield_children(o) + yield obj + if obj.children: + for o in obj.children: + yield from yield_children(o) + def store_original_mtx(): - active_obj = bpy.context.view_layer.objects.active - for obj in yield_children(active_obj): - obj['original_mtx'] = obj.matrix_local + active_obj = bpy.context.view_layer.objects.active + for obj in yield_children(active_obj): + obj["original_mtx"] = obj.matrix_local + def rotate_bounds(bounds, mtx: mathutils.Matrix): - return [ - (mtx @ mathutils.Vector(b)).to_tuple() - for b in bounds - ] + return [(mtx @ mathutils.Vector(b)).to_tuple() for b in bounds] + def obj_scale_is_unified(obj): - '''Combine scale values into a set to ensure all values are the same''' - return len(set(obj.scale)) == 1 + """Combine scale values into a set to ensure all values are the same""" + return len(set(obj.scale)) == 1 + def translation_rotation_from_mtx(mtx: mathutils.Matrix): - '''Strip scale from matrix''' - t, r, _ = mtx.decompose() - return Matrix.Translation(t) @ r.to_matrix().to_4x4() + """Strip scale from matrix""" + t, r, _ = mtx.decompose() + return Matrix.Translation(t) @ r.to_matrix().to_4x4() + def scale_mtx_from_vector(scale: mathutils.Vector): - return mathutils.Matrix.Diagonal(scale[0:3]).to_4x4() - -def copy_object_and_apply(obj: bpy.types.Object, apply_scale = False, apply_modifiers = False): - if apply_scale or apply_modifiers: - # it's a unique mesh, use object name - obj['instanced_mesh_name'] = obj.name - - obj.original_name = obj.name - if apply_scale: - obj['original_mtx'] = translation_rotation_from_mtx(mathutils.Matrix(obj['original_mtx'])) - - obj_copy = obj.copy() - obj_copy.parent = None - # reset transformations - obj_copy.location = mathutils.Vector([0.0, 0.0, 0.0]) - obj_copy.scale = mathutils.Vector([1.0, 1.0, 1.0]) - obj_copy.rotation_quaternion = mathutils.Quaternion([1, 0, 0, 0]) - obj_copy.data = obj_copy.data.copy() - - if apply_modifiers: - # In order to correctly apply modifiers, we have to go through blender and add the object to the collection, then apply modifiers - prev_active = bpy.context.view_layer.objects.active - bpy.context.collection.objects.link(obj_copy) - obj_copy.select_set(True) - bpy.context.view_layer.objects.active = obj_copy - for modifier in obj_copy.modifiers: - attemptModifierApply(modifier) - - bpy.context.view_layer.objects.active = prev_active - - mtx = transform_mtx_blender_to_n64() - if apply_scale: - mtx = mtx @ scale_mtx_from_vector(obj.scale) - - obj_copy.data.transform(mtx) - # Flag used for finding these temp objects - obj_copy['temp_export'] = True - - # Override for F3D culling bounds (used in addCullCommand) - bounds_mtx = transform_mtx_blender_to_n64() - if apply_scale: - bounds_mtx = bounds_mtx @ scale_mtx_from_vector(obj.scale) # apply scale if needed - obj_copy['culling_bounds'] = rotate_bounds(obj_copy.bound_box, bounds_mtx) + return mathutils.Matrix.Diagonal(scale[0:3]).to_4x4() + + +def copy_object_and_apply( + obj: bpy.types.Object, apply_scale=False, apply_modifiers=False +): + if apply_scale or apply_modifiers: + # it's a unique mesh, use object name + obj["instanced_mesh_name"] = obj.name + + obj.original_name = obj.name + if apply_scale: + obj["original_mtx"] = translation_rotation_from_mtx( + mathutils.Matrix(obj["original_mtx"]) + ) + + obj_copy = obj.copy() + obj_copy.parent = None + # reset transformations + obj_copy.location = mathutils.Vector([0.0, 0.0, 0.0]) + obj_copy.scale = mathutils.Vector([1.0, 1.0, 1.0]) + obj_copy.rotation_quaternion = mathutils.Quaternion([1, 0, 0, 0]) + obj_copy.data = obj_copy.data.copy() + + if apply_modifiers: + # In order to correctly apply modifiers, we have to go through blender and add the object to the collection, then apply modifiers + prev_active = bpy.context.view_layer.objects.active + bpy.context.collection.objects.link(obj_copy) + obj_copy.select_set(True) + bpy.context.view_layer.objects.active = obj_copy + for modifier in obj_copy.modifiers: + attemptModifierApply(modifier) + + bpy.context.view_layer.objects.active = prev_active + + mtx = transform_mtx_blender_to_n64() + if apply_scale: + mtx = mtx @ scale_mtx_from_vector(obj.scale) + + obj_copy.data.transform(mtx) + # Flag used for finding these temp objects + obj_copy["temp_export"] = True + + # Override for F3D culling bounds (used in addCullCommand) + bounds_mtx = transform_mtx_blender_to_n64() + if apply_scale: + bounds_mtx = bounds_mtx @ scale_mtx_from_vector( + obj.scale + ) # apply scale if needed + obj_copy["culling_bounds"] = rotate_bounds(obj_copy.bound_box, bounds_mtx) + def store_original_meshes(add_warning: Callable[[str], None]): - ''' - - Creates new objects at 0, 0, 0 with shared mesh - - Original mesh name is saved to each object - ''' - instanced_meshes = set() - active_obj = bpy.context.view_layer.objects.active - for obj in yield_children(active_obj): - if obj.data is not None: - has_modifiers = len(obj.modifiers) != 0 - has_uneven_scale = not obj_scale_is_unified(obj) - shares_mesh = obj.data.users > 1 - can_instance = not has_modifiers and not has_uneven_scale - should_instance = can_instance and (shares_mesh or obj.scaleFromGeolayout) - - if should_instance: - # add `_shared_mesh` to instanced name because `obj.data.name` can be the same as object names - obj['instanced_mesh_name'] = f'{obj.data.name}_shared_mesh' - obj.original_name = obj.name - - if obj.data.name not in instanced_meshes: - instanced_meshes.add(obj.data.name) - copy_object_and_apply(obj) - else: - if shares_mesh and has_modifiers: - add_warning( - f'Object "{obj.name}" cannot be instanced due to having modifiers so an extra displaylist will be created. Remove modifiers to allow instancing.') - if shares_mesh and has_uneven_scale: - add_warning( - f'Object "{obj.name}" cannot be instanced due to uneven object scaling and an extra displaylist will be created. Set all scale values to the same value to allow instancing.') - - copy_object_and_apply(obj, apply_scale=True, apply_modifiers=has_modifiers) - bpy.context.view_layer.objects.active = active_obj + """ + - Creates new objects at 0, 0, 0 with shared mesh + - Original mesh name is saved to each object + """ + instanced_meshes = set() + active_obj = bpy.context.view_layer.objects.active + for obj in yield_children(active_obj): + if obj.data is not None: + has_modifiers = len(obj.modifiers) != 0 + has_uneven_scale = not obj_scale_is_unified(obj) + shares_mesh = obj.data.users > 1 + can_instance = not has_modifiers and not has_uneven_scale + should_instance = can_instance and (shares_mesh or obj.scaleFromGeolayout) + + if should_instance: + # add `_shared_mesh` to instanced name because `obj.data.name` can be the same as object names + obj["instanced_mesh_name"] = f"{obj.data.name}_shared_mesh" + obj.original_name = obj.name + + if obj.data.name not in instanced_meshes: + instanced_meshes.add(obj.data.name) + copy_object_and_apply(obj) + else: + if shares_mesh and has_modifiers: + add_warning( + f'Object "{obj.name}" cannot be instanced due to having modifiers so an extra displaylist will be created. Remove modifiers to allow instancing.' + ) + if shares_mesh and has_uneven_scale: + add_warning( + f'Object "{obj.name}" cannot be instanced due to uneven object scaling and an extra displaylist will be created. Set all scale values to the same value to allow instancing.' + ) + + copy_object_and_apply( + obj, apply_scale=True, apply_modifiers=has_modifiers + ) + bpy.context.view_layer.objects.active = active_obj + def get_obj_temp_mesh(obj): - for o in bpy.data.objects: - if ( - o.get('temp_export') - and o.get('instanced_mesh_name') == obj.get('instanced_mesh_name') - ): - return o + for o in bpy.data.objects: + if o.get("temp_export") and o.get("instanced_mesh_name") == obj.get( + "instanced_mesh_name" + ): + return o + def duplicateHierarchy(obj, ignoreAttr, includeEmpties, areaIndex): - # Duplicate objects to apply scale / modifiers / linked data - bpy.ops.object.select_all(action = 'DESELECT') - selectMeshChildrenOnly(obj, None, includeEmpties, areaIndex) - obj.select_set(True) - bpy.context.view_layer.objects.active = obj - bpy.ops.object.duplicate() - try: - tempObj = bpy.context.view_layer.objects.active - allObjs = bpy.context.selected_objects - - bpy.ops.object.make_single_user(obdata = True) - bpy.ops.object.transform_apply(location = False, - rotation = True, scale = True, properties = False) - - for selectedObj in allObjs: - bpy.ops.object.select_all(action = 'DESELECT') - selectedObj.select_set(True) - bpy.context.view_layer.objects.active = selectedObj - - for modifier in selectedObj.modifiers: - attemptModifierApply(modifier) - for selectedObj in allObjs: - if ignoreAttr is not None and getattr(selectedObj, ignoreAttr): - for child in selectedObj.children: - bpy.ops.object.select_all(action = 'DESELECT') - child.select_set(True) - bpy.context.view_layer.objects.active = child - bpy.ops.object.parent_clear(type='CLEAR_KEEP_TRANSFORM') - selectedObj.parent.select_set(True) - bpy.context.view_layer.objects.active = selectedObj.parent - bpy.ops.object.parent_set(keep_transform = True) - selectedObj.parent = None - return tempObj, allObjs - except Exception as e: - cleanupDuplicatedObjects(allObjs) - obj.select_set(True) - bpy.context.view_layer.objects.active = obj - raise Exception(str(e)) + # Duplicate objects to apply scale / modifiers / linked data + bpy.ops.object.select_all(action="DESELECT") + selectMeshChildrenOnly(obj, None, includeEmpties, areaIndex) + obj.select_set(True) + bpy.context.view_layer.objects.active = obj + bpy.ops.object.duplicate() + try: + tempObj = bpy.context.view_layer.objects.active + allObjs = bpy.context.selected_objects + + bpy.ops.object.make_single_user(obdata=True) + bpy.ops.object.transform_apply( + location=False, rotation=True, scale=True, properties=False + ) + + for selectedObj in allObjs: + bpy.ops.object.select_all(action="DESELECT") + selectedObj.select_set(True) + bpy.context.view_layer.objects.active = selectedObj + + for modifier in selectedObj.modifiers: + attemptModifierApply(modifier) + for selectedObj in allObjs: + if ignoreAttr is not None and getattr(selectedObj, ignoreAttr): + for child in selectedObj.children: + bpy.ops.object.select_all(action="DESELECT") + child.select_set(True) + bpy.context.view_layer.objects.active = child + bpy.ops.object.parent_clear(type="CLEAR_KEEP_TRANSFORM") + selectedObj.parent.select_set(True) + bpy.context.view_layer.objects.active = selectedObj.parent + bpy.ops.object.parent_set(keep_transform=True) + selectedObj.parent = None + return tempObj, allObjs + except Exception as e: + cleanupDuplicatedObjects(allObjs) + obj.select_set(True) + bpy.context.view_layer.objects.active = obj + raise Exception(str(e)) + enumSM64PreInlineGeoLayoutObjects = { - 'Geo ASM', - 'Geo Branch', - 'Geo Displaylist', - 'Custom Geo Command' + "Geo ASM", + "Geo Branch", + "Geo Displaylist", + "Custom Geo Command", } + + def checkIsSM64PreInlineGeoLayout(sm64_obj_type): - return sm64_obj_type in enumSM64PreInlineGeoLayoutObjects + return sm64_obj_type in enumSM64PreInlineGeoLayoutObjects + enumSM64InlineGeoLayoutObjects = { - 'Geo ASM', - 'Geo Branch', - 'Geo Translate/Rotate', - 'Geo Translate Node', - 'Geo Rotation Node', - 'Geo Billboard', - 'Geo Scale', - 'Geo Displaylist', - 'Custom Geo Command' + "Geo ASM", + "Geo Branch", + "Geo Translate/Rotate", + "Geo Translate Node", + "Geo Rotation Node", + "Geo Billboard", + "Geo Scale", + "Geo Displaylist", + "Custom Geo Command", } + + def checkIsSM64InlineGeoLayout(sm64_obj_type): - return sm64_obj_type in enumSM64InlineGeoLayoutObjects + return sm64_obj_type in enumSM64InlineGeoLayoutObjects + + +enumSM64EmptyWithGeolayout = {"None", "Level Root", "Area Root", "Switch"} + -enumSM64EmptyWithGeolayout = { - 'None', - 'Level Root', - 'Area Root', - 'Switch' -} def checkSM64EmptyUsesGeoLayout(sm64_obj_type): - return sm64_obj_type in enumSM64EmptyWithGeolayout or checkIsSM64InlineGeoLayout(sm64_obj_type) + return sm64_obj_type in enumSM64EmptyWithGeolayout or checkIsSM64InlineGeoLayout( + sm64_obj_type + ) + def selectMeshChildrenOnly(obj, ignoreAttr, includeEmpties, areaIndex): - checkArea = areaIndex is not None and obj.data is None - if checkArea and obj.sm64_obj_type == 'Area Root' and obj.areaIndex != areaIndex: - return - ignoreObj = ignoreAttr is not None and getattr(obj, ignoreAttr) - isMesh = isinstance(obj.data, bpy.types.Mesh) - isEmpty = ( - obj.data is None - and includeEmpties - and checkSM64EmptyUsesGeoLayout(obj.sm64_obj_type) - ) - if (isMesh or isEmpty) and not ignoreObj: - obj.select_set(True) - obj.original_name = obj.name - for child in obj.children: - if checkArea and obj.sm64_obj_type == 'Level Root': - if not (child.data is None and child.sm64_obj_type == 'Area Root'): - continue - selectMeshChildrenOnly(child, ignoreAttr, includeEmpties, areaIndex) + checkArea = areaIndex is not None and obj.data is None + if checkArea and obj.sm64_obj_type == "Area Root" and obj.areaIndex != areaIndex: + return + ignoreObj = ignoreAttr is not None and getattr(obj, ignoreAttr) + isMesh = isinstance(obj.data, bpy.types.Mesh) + isEmpty = ( + obj.data is None + and includeEmpties + and checkSM64EmptyUsesGeoLayout(obj.sm64_obj_type) + ) + if (isMesh or isEmpty) and not ignoreObj: + obj.select_set(True) + obj.original_name = obj.name + for child in obj.children: + if checkArea and obj.sm64_obj_type == "Level Root": + if not (child.data is None and child.sm64_obj_type == "Area Root"): + continue + selectMeshChildrenOnly(child, ignoreAttr, includeEmpties, areaIndex) + def cleanupDuplicatedObjects(selected_objects): - meshData = [] - for selectedObj in selected_objects: - if selectedObj.data is not None and isinstance(selectedObj.data, bpy.types.Mesh): - meshData.append(selectedObj.data) - for selectedObj in selected_objects: - bpy.data.objects.remove(selectedObj) - for mesh in meshData: - bpy.data.meshes.remove(mesh) + meshData = [] + for selectedObj in selected_objects: + if selectedObj.data is not None and isinstance( + selectedObj.data, bpy.types.Mesh + ): + meshData.append(selectedObj.data) + for selectedObj in selected_objects: + bpy.data.objects.remove(selectedObj) + for mesh in meshData: + bpy.data.meshes.remove(mesh) + def cleanupTempMeshes(): - '''Delete meshes that have been duplicated for instancing''' - remove_data = [] - for obj in bpy.data.objects: - if obj.get('temp_export'): - remove_data.append(obj.data) - bpy.data.objects.remove(obj) - else: - if obj.get('instanced_mesh_name'): - del obj['instanced_mesh_name'] - if obj.get('original_mtx'): - del obj['original_mtx'] - - for data in remove_data: - data_type = type(data) - if data_type == bpy.types.Mesh: - bpy.data.meshes.remove(data) - elif data_type == bpy.types.Curve: - bpy.data.curves.remove(data) + """Delete meshes that have been duplicated for instancing""" + remove_data = [] + for obj in bpy.data.objects: + if obj.get("temp_export"): + remove_data.append(obj.data) + bpy.data.objects.remove(obj) + else: + if obj.get("instanced_mesh_name"): + del obj["instanced_mesh_name"] + if obj.get("original_mtx"): + del obj["original_mtx"] + + for data in remove_data: + data_type = type(data) + if data_type == bpy.types.Mesh: + bpy.data.meshes.remove(data) + elif data_type == bpy.types.Curve: + bpy.data.curves.remove(data) + def combineObjects(obj, includeChildren, ignoreAttr, areaIndex): - obj.original_name = obj.name - - # Duplicate objects to apply scale / modifiers / linked data - bpy.ops.object.select_all(action = 'DESELECT') - if includeChildren: - selectMeshChildrenOnly(obj, ignoreAttr, False, areaIndex) - else: - obj.select_set(True) - if len(bpy.context.selected_objects) == 0: - return None, [] - bpy.ops.object.duplicate() - joinedObj = None - try: - # duplicate obj and apply modifiers / make single user - allObjs = bpy.context.selected_objects - bpy.ops.object.make_single_user(obdata = True) - bpy.ops.object.transform_apply(location = False, - rotation = True, scale = True, properties = False) - for selectedObj in allObjs: - bpy.ops.object.select_all(action = 'DESELECT') - selectedObj.select_set(True) - for modifier in selectedObj.modifiers: - attemptModifierApply(modifier) - - bpy.ops.object.select_all(action = 'DESELECT') - - # Joining causes orphan data, so we remove it manually. - meshList = [] - for selectedObj in allObjs: - selectedObj.select_set(True) - meshList.append(selectedObj.data) - - joinedObj = bpy.context.selected_objects[0] - bpy.context.view_layer.objects.active = joinedObj - joinedObj.select_set(True) - meshList.remove(joinedObj.data) - bpy.ops.object.join() - setOrigin(obj, joinedObj) - - bpy.ops.object.select_all(action = 'DESELECT') - bpy.context.view_layer.objects.active = joinedObj - joinedObj.select_set(True) - - # Need to clear parent transform in order to correctly apply transform. - bpy.ops.object.parent_clear(type='CLEAR_KEEP_TRANSFORM') - bpy.ops.object.transform_apply(location = False, - rotation = True, scale = True, properties = False) - bpy.context.view_layer.objects.active = joinedObj - joinedObj.select_set(True) - bpy.ops.object.transform_apply(location = False, - rotation = True, scale = True, properties = False) - - except Exception as e: - cleanupDuplicatedObjects(allObjs) - obj.select_set(True) - bpy.context.view_layer.objects.active = obj - raise Exception(str(e)) - - return joinedObj, meshList + obj.original_name = obj.name + + # Duplicate objects to apply scale / modifiers / linked data + bpy.ops.object.select_all(action="DESELECT") + if includeChildren: + selectMeshChildrenOnly(obj, ignoreAttr, False, areaIndex) + else: + obj.select_set(True) + if len(bpy.context.selected_objects) == 0: + return None, [] + bpy.ops.object.duplicate() + joinedObj = None + try: + # duplicate obj and apply modifiers / make single user + allObjs = bpy.context.selected_objects + bpy.ops.object.make_single_user(obdata=True) + bpy.ops.object.transform_apply( + location=False, rotation=True, scale=True, properties=False + ) + for selectedObj in allObjs: + bpy.ops.object.select_all(action="DESELECT") + selectedObj.select_set(True) + for modifier in selectedObj.modifiers: + attemptModifierApply(modifier) + + bpy.ops.object.select_all(action="DESELECT") + + # Joining causes orphan data, so we remove it manually. + meshList = [] + for selectedObj in allObjs: + selectedObj.select_set(True) + meshList.append(selectedObj.data) + + joinedObj = bpy.context.selected_objects[0] + bpy.context.view_layer.objects.active = joinedObj + joinedObj.select_set(True) + meshList.remove(joinedObj.data) + bpy.ops.object.join() + setOrigin(obj, joinedObj) + + bpy.ops.object.select_all(action="DESELECT") + bpy.context.view_layer.objects.active = joinedObj + joinedObj.select_set(True) + + # Need to clear parent transform in order to correctly apply transform. + bpy.ops.object.parent_clear(type="CLEAR_KEEP_TRANSFORM") + bpy.ops.object.transform_apply( + location=False, rotation=True, scale=True, properties=False + ) + bpy.context.view_layer.objects.active = joinedObj + joinedObj.select_set(True) + bpy.ops.object.transform_apply( + location=False, rotation=True, scale=True, properties=False + ) + + except Exception as e: + cleanupDuplicatedObjects(allObjs) + obj.select_set(True) + bpy.context.view_layer.objects.active = obj + raise Exception(str(e)) + + return joinedObj, meshList + def cleanupCombineObj(tempObj, meshList): - for mesh in meshList: - bpy.data.meshes.remove(mesh) - cleanupDuplicatedObjects([tempObj]) - #obj.select_set(True) - #bpy.context.view_layer.objects.active = obj + for mesh in meshList: + bpy.data.meshes.remove(mesh) + cleanupDuplicatedObjects([tempObj]) + # obj.select_set(True) + # bpy.context.view_layer.objects.active = obj + def writeInsertableFile(filepath, dataType, address_ptrs, startPtr, data): - address = 0 - openfile = open(filepath, 'wb') - - # 0-4 - Data Type - openfile.write(dataType.to_bytes(4, 'big')) - address += 4 - - # 4-8 - Data Size - openfile.seek(address) - openfile.write(len(data).to_bytes(4, 'big')) - address += 4 - - # 8-12 Start Address - openfile.seek(address) - openfile.write(startPtr.to_bytes(4, 'big')) - address += 4 - - # 12-16 - Number of pointer addresses - openfile.seek(address) - openfile.write(len(address_ptrs).to_bytes(4, 'big')) - address += 4 - - # 16-? - Pointer address list - for i in range(len(address_ptrs)): - openfile.seek(address) - openfile.write(address_ptrs[i].to_bytes(4, 'big')) - address += 4 - - openfile.seek(address) - openfile.write(data) - openfile.close() + address = 0 + openfile = open(filepath, "wb") + + # 0-4 - Data Type + openfile.write(dataType.to_bytes(4, "big")) + address += 4 + + # 4-8 - Data Size + openfile.seek(address) + openfile.write(len(data).to_bytes(4, "big")) + address += 4 + + # 8-12 Start Address + openfile.seek(address) + openfile.write(startPtr.to_bytes(4, "big")) + address += 4 + + # 12-16 - Number of pointer addresses + openfile.seek(address) + openfile.write(len(address_ptrs).to_bytes(4, "big")) + address += 4 + + # 16-? - Pointer address list + for i in range(len(address_ptrs)): + openfile.seek(address) + openfile.write(address_ptrs[i].to_bytes(4, "big")) + address += 4 + + openfile.seek(address) + openfile.write(data) + openfile.close() + def colorTo16bitRGBA(color): - r = int(round(color[0] * 31)) - g = int(round(color[1] * 31)) - b = int(round(color[2] * 31)) - a = 1 if color[3] > 0.5 else 0 + r = int(round(color[0] * 31)) + g = int(round(color[1] * 31)) + b = int(round(color[2] * 31)) + a = 1 if color[3] > 0.5 else 0 + + return (r << 11) | (g << 6) | (b << 1) | a - return (r << 11) | (g << 6) | (b << 1) | a # On 2.83/2.91 the rotate operator rotates in the opposite direction (???) def getDirectionGivenAppVersion(): - if bpy.app.version[1] == 83 or bpy.app.version[1] == 91: - return -1 - else: - return 1 + if bpy.app.version[1] == 83 or bpy.app.version[1] == 91: + return -1 + else: + return 1 + def applyRotation(objList, angle, axis): - bpy.context.scene.tool_settings.use_transform_data_origin = False - bpy.context.scene.tool_settings.use_transform_pivot_point_align = False - bpy.context.scene.tool_settings.use_transform_skip_children = False + bpy.context.scene.tool_settings.use_transform_data_origin = False + bpy.context.scene.tool_settings.use_transform_pivot_point_align = False + bpy.context.scene.tool_settings.use_transform_skip_children = False + + bpy.ops.object.select_all(action="DESELECT") + for obj in objList: + obj.select_set(True) + bpy.context.view_layer.objects.active = objList[0] - bpy.ops.object.select_all(action = "DESELECT") - for obj in objList: - obj.select_set(True) - bpy.context.view_layer.objects.active = objList[0] + direction = getDirectionGivenAppVersion() - direction = getDirectionGivenAppVersion() + bpy.ops.transform.rotate( + value=direction * angle, orient_axis=axis, orient_type="GLOBAL" + ) + bpy.ops.object.transform_apply( + location=False, rotation=True, scale=True, properties=False + ) - bpy.ops.transform.rotate(value = direction * angle, orient_axis = axis, orient_type='GLOBAL') - bpy.ops.object.transform_apply(location = False, - rotation = True, scale = True, properties = False) def doRotation(angle, axis): - direction = getDirectionGivenAppVersion() - bpy.ops.transform.rotate(value = direction * angle, orient_axis = axis, orient_type='GLOBAL') + direction = getDirectionGivenAppVersion() + bpy.ops.transform.rotate( + value=direction * angle, orient_axis=axis, orient_type="GLOBAL" + ) + def getAddressFromRAMAddress(RAMAddress): - addr = RAMAddress - 0x80000000 - if addr < 0: - raise PluginError("Invalid RAM address.") - return addr + addr = RAMAddress - 0x80000000 + if addr < 0: + raise PluginError("Invalid RAM address.") + return addr + def getObjectQuaternion(obj): - if obj.rotation_mode == 'QUATERNION': - rotation = mathutils.Quaternion(obj.rotation_quaternion) - elif obj.rotation_mode == 'AXIS_ANGLE': - rotation = mathutils.Quaternion(obj.rotation_axis_angle) - else: - rotation = mathutils.Euler( - obj.rotation_euler, obj.rotation_mode).to_quaternion() - return rotation + if obj.rotation_mode == "QUATERNION": + rotation = mathutils.Quaternion(obj.rotation_quaternion) + elif obj.rotation_mode == "AXIS_ANGLE": + rotation = mathutils.Quaternion(obj.rotation_axis_angle) + else: + rotation = mathutils.Euler( + obj.rotation_euler, obj.rotation_mode + ).to_quaternion() + return rotation + def tempName(name): - letters = string.digits - return name + '_temp' + "".join(random.choice(letters) for i in range(10)) + letters = string.digits + return name + "_temp" + "".join(random.choice(letters) for i in range(10)) + def label_split(layout, name, text): - split = layout.split(factor = 0.5) - split.label(text = name) - split.label(text = text) + split = layout.split(factor=0.5) + split.label(text=name) + split.label(text=text) + def enum_label_split(layout, name, data, prop, enumItems): - split = layout.split(factor = 0.5) - split.label(text = name) - split.enum_item_name(data, prop, enumItems) + split = layout.split(factor=0.5) + split.label(text=name) + split.enum_item_name(data, prop, enumItems) + def prop_split(layout, data, field, name, **prop_kwargs): - split = layout.split(factor = 0.5) - split.label(text = name) - split.prop(data, field, text = '', **prop_kwargs) + split = layout.split(factor=0.5) + split.label(text=name) + split.prop(data, field, text="", **prop_kwargs) + def toAlnum(name): - if name is None or name == '': - return None - for i in range(len(name)): - if not name[i].isalnum(): - name = name[:i] + '_' + name[i+1:] - if name[0].isdigit(): - name = '_' + name - return name + if name is None or name == "": + return None + for i in range(len(name)): + if not name[i].isalnum(): + name = name[:i] + "_" + name[i + 1 :] + if name[0].isdigit(): + name = "_" + name + return name + def get64bitAlignedAddr(address): - endNibble = hex(address)[-1] - if endNibble != '0' and endNibble != '8': - address = ceil(address / 8) * 8 - return address - -def getNameFromPath(path, removeExtension = False): - if path[:2] == '//': - path = path[2:] - name = os.path.basename(path) - if removeExtension: - name = os.path.splitext(name)[0] - return toAlnum(name) + endNibble = hex(address)[-1] + if endNibble != "0" and endNibble != "8": + address = ceil(address / 8) * 8 + return address + + +def getNameFromPath(path, removeExtension=False): + if path[:2] == "//": + path = path[2:] + name = os.path.basename(path) + if removeExtension: + name = os.path.splitext(name)[0] + return toAlnum(name) + def gammaCorrect(color): - return [ - gammaCorrectValue(color[0]), - gammaCorrectValue(color[1]), - gammaCorrectValue(color[2])] + return [ + gammaCorrectValue(color[0]), + gammaCorrectValue(color[1]), + gammaCorrectValue(color[2]), + ] + def gammaCorrectValue(u): - if u < 0.0031308: - y = u * 12.92 - else: - y = 1.055 * pow(u, (1/2.4)) - 0.055 + if u < 0.0031308: + y = u * 12.92 + else: + y = 1.055 * pow(u, (1 / 2.4)) - 0.055 + + return min(max(y, 0), 1) - return min(max(y, 0), 1) def gammaInverse(color): - return [ - gammaInverseValue(color[0]), - gammaInverseValue(color[1]), - gammaInverseValue(color[2])] + return [ + gammaInverseValue(color[0]), + gammaInverseValue(color[1]), + gammaInverseValue(color[2]), + ] + def gammaInverseValue(u): - if u < 0.04045: - y = u / 12.92 - else: - y = ((u + 0.055) / 1.055) ** 2.4 + if u < 0.04045: + y = u / 12.92 + else: + y = ((u + 0.055) / 1.055) ** 2.4 + + return min(max(y, 0), 1) - return min(max(y, 0), 1) def printBlenderMessage(msgSet, message, blenderOp): - if blenderOp is not None: - blenderOp.report(msgSet, message) - else: - print(message) + if blenderOp is not None: + blenderOp.report(msgSet, message) + else: + print(message) + def bytesToInt(value): - return int.from_bytes(value, 'big') + return int.from_bytes(value, "big") + + +def bytesToHex(value, byteSize=4): + return format(bytesToInt(value), "#0" + str(byteSize * 2 + 2) + "x") + + +def bytesToHexClean(value, byteSize=4): + return format(bytesToInt(value), "0" + str(byteSize * 2) + "x") -def bytesToHex(value, byteSize = 4): - return format(bytesToInt(value), '#0' + str(byteSize * 2 + 2) + 'x') -def bytesToHexClean(value, byteSize = 4): - return format(bytesToInt(value), '0' + str(byteSize * 2) + 'x') +def intToHex(value, byteSize=4): + return format(value, "#0" + str(byteSize * 2 + 2) + "x") -def intToHex(value, byteSize = 4): - return format(value, '#0' + str(byteSize * 2 + 2) + 'x') def intToBytes(value, byteSize): - return bytes.fromhex(intToHex(value, byteSize)[2:]) + return bytes.fromhex(intToHex(value, byteSize)[2:]) + # byte input # returns an integer, usually used for file seeking positions def decodeSegmentedAddr(address, segmentData): - #print(bytesAsHex(address)) - if address[0] not in segmentData: - raise PluginError("Segment " + str(address[0]) + ' not found in segment list.') - segmentStart = segmentData[address[0]][0] - return segmentStart + bytesToInt(address[1:4]) + # print(bytesAsHex(address)) + if address[0] not in segmentData: + raise PluginError("Segment " + str(address[0]) + " not found in segment list.") + segmentStart = segmentData[address[0]][0] + return segmentStart + bytesToInt(address[1:4]) + -#int input +# int input # returns bytes, usually used for writing new segmented addresses def encodeSegmentedAddr(address, segmentData): - segment = getSegment(address, segmentData) - segmentStart = segmentData[segment][0] + segment = getSegment(address, segmentData) + segmentStart = segmentData[segment][0] + + segmentedAddr = address - segmentStart + return intToBytes(segment, 1) + intToBytes(segmentedAddr, 3) - segmentedAddr = address - segmentStart - return intToBytes(segment, 1) + intToBytes(segmentedAddr, 3) def getSegment(address, segmentData): - for segment, interval in segmentData.items(): - if address in range(*interval): - return segment + for segment, interval in segmentData.items(): + if address in range(*interval): + return segment + + raise PluginError( + "Address " + hex(address) + " is not found in any of the provided segments." + ) - raise PluginError("Address " + hex(address) + \ - " is not found in any of the provided segments.") # Position def readVectorFromShorts(command, offset): - return [readFloatFromShort(command, valueOffset) for valueOffset - in range(offset, offset + 6, 2)] + return [ + readFloatFromShort(command, valueOffset) + for valueOffset in range(offset, offset + 6, 2) + ] + def readFloatFromShort(command, offset): - return int.from_bytes(command[offset: offset + 2], - 'big', signed = True) / bpy.context.scene.blenderToSM64Scale + return ( + int.from_bytes(command[offset : offset + 2], "big", signed=True) + / bpy.context.scene.blenderToSM64Scale + ) + def writeVectorToShorts(command, offset, values): - for i in range(3): - valueOffset = offset + i * 2 - writeFloatToShort(command, valueOffset, values[i]) + for i in range(3): + valueOffset = offset + i * 2 + writeFloatToShort(command, valueOffset, values[i]) + def writeFloatToShort(command, offset, value): - command[offset : offset + 2] = \ - int(round(value * bpy.context.scene.blenderToSM64Scale)).to_bytes( - 2, 'big', signed = True) + command[offset : offset + 2] = int( + round(value * bpy.context.scene.blenderToSM64Scale) + ).to_bytes(2, "big", signed=True) + def convertFloatToShort(value): - return int(round((value * bpy.context.scene.blenderToSM64Scale))) + return int(round((value * bpy.context.scene.blenderToSM64Scale))) + def convertEulerFloatToShort(value): - return int(round(degrees(value))) + return int(round(degrees(value))) + # Rotation @@ -1085,117 +1299,150 @@ def convertEulerFloatToShort(value): # Zero rotation starts at Z+ on an XZ plane and goes counterclockwise. # 2**16 - 1 is the last value before looping around again. def readEulerVectorFromShorts(command, offset): - return [readEulerFloatFromShort(command, valueOffset) for valueOffset - in range(offset, offset + 6, 2)] + return [ + readEulerFloatFromShort(command, valueOffset) + for valueOffset in range(offset, offset + 6, 2) + ] + def readEulerFloatFromShort(command, offset): - return radians(int.from_bytes(command[offset: offset + 2], - 'big', signed = True)) + return radians(int.from_bytes(command[offset : offset + 2], "big", signed=True)) + def writeEulerVectorToShorts(command, offset, values): - for i in range(3): - valueOffset = offset + i * 2 - writeEulerFloatToShort(command, valueOffset, values[i]) + for i in range(3): + valueOffset = offset + i * 2 + writeEulerFloatToShort(command, valueOffset, values[i]) + def writeEulerFloatToShort(command, offset, value): - command[offset : offset + 2] = int(round(degrees(value))).to_bytes( - 2, 'big', signed = True) + command[offset : offset + 2] = int(round(degrees(value))).to_bytes( + 2, "big", signed=True + ) + # convert 32 bit (8888) to 16 bit (5551) color def convert32to16bitRGBA(oldPixel): - if oldPixel[3] > 127: - alpha = 1 - else: - alpha = 0 - newPixel = (oldPixel[0] >> 3) << 11 |\ - (oldPixel[1] >> 3) << 6 |\ - (oldPixel[2] >> 3) << 1 |\ - alpha - return newPixel.to_bytes(2, 'big') + if oldPixel[3] > 127: + alpha = 1 + else: + alpha = 0 + newPixel = ( + (oldPixel[0] >> 3) << 11 + | (oldPixel[1] >> 3) << 6 + | (oldPixel[2] >> 3) << 1 + | alpha + ) + return newPixel.to_bytes(2, "big") + # convert normalized RGB values to bytes (0-255) def convertRGB(normalizedRGB): - return bytearray([ - int(normalizedRGB[0] * 255), - int(normalizedRGB[1] * 255), - int(normalizedRGB[2] * 255) - ]) + return bytearray( + [ + int(normalizedRGB[0] * 255), + int(normalizedRGB[1] * 255), + int(normalizedRGB[2] * 255), + ] + ) + + # convert normalized RGB values to bytes (0-255) def convertRGBA(normalizedRGBA): - return bytearray([ - int(normalizedRGBA[0] * 255), - int(normalizedRGBA[1] * 255), - int(normalizedRGBA[2] * 255), - int(normalizedRGBA[3] * 255) - ]) + return bytearray( + [ + int(normalizedRGBA[0] * 255), + int(normalizedRGBA[1] * 255), + int(normalizedRGBA[2] * 255), + int(normalizedRGBA[3] * 255), + ] + ) + def vector3ComponentMultiply(a, b): - return mathutils.Vector( - (a.x * b.x, a.y * b.y, a.z * b.z) - ) + return mathutils.Vector((a.x * b.x, a.y * b.y, a.z * b.z)) + # Position values are signed shorts. def convertPosition(position): - positionShorts = [int(floatValue) for floatValue in position] - F3DPosition = bytearray(0) - for shortData in [shortValue.to_bytes(2, 'big', signed=True) for shortValue in positionShorts]: - F3DPosition.extend(shortData) - return F3DPosition + positionShorts = [int(floatValue) for floatValue in position] + F3DPosition = bytearray(0) + for shortData in [ + shortValue.to_bytes(2, "big", signed=True) for shortValue in positionShorts + ]: + F3DPosition.extend(shortData) + return F3DPosition + # UVs in F3D are a fixed point short: s10.5 (hence the 2**5) # fixed point is NOT exponent+mantissa, it is integer+fraction def convertUV(normalizedUVs, textureWidth, textureHeight): - #print(str(normalizedUVs[0]) + " - " + str(normalizedUVs[1])) - F3DUVs = convertFloatToFixed16Bytes(normalizedUVs[0] * textureWidth) +\ - convertFloatToFixed16Bytes(normalizedUVs[1] * textureHeight) - return F3DUVs + # print(str(normalizedUVs[0]) + " - " + str(normalizedUVs[1])) + F3DUVs = convertFloatToFixed16Bytes( + normalizedUVs[0] * textureWidth + ) + convertFloatToFixed16Bytes(normalizedUVs[1] * textureHeight) + return F3DUVs + def convertFloatToFixed16Bytes(value): - value *= 2**5 - value = min(max(value, -2**15), 2**15 - 1) + value *= 2 ** 5 + value = min(max(value, -(2 ** 15)), 2 ** 15 - 1) + + return int(round(value)).to_bytes(2, "big", signed=True) - return int(round(value)).to_bytes(2, 'big', signed = True) def convertFloatToFixed16(value): - return int(round(value * (2**5))) + return int(round(value * (2 ** 5))) - # We want support for large textures with 32 bit UVs - #value *= 2**5 - #value = min(max(value, -2**15), 2**15 - 1) - #return int.from_bytes( - # int(round(value)).to_bytes(2, 'big', signed = True), 'big') + # We want support for large textures with 32 bit UVs + # value *= 2**5 + # value = min(max(value, -2**15), 2**15 - 1) + # return int.from_bytes( + # int(round(value)).to_bytes(2, 'big', signed = True), 'big') # Normal values are signed bytes (-128 to 127) # Normalized magnitude = 127 def convertNormal(normal): - F3DNormal = bytearray(0) - for axis in normal: - F3DNormal.extend(int(axis * 127).to_bytes(1, 'big', signed=True)) - return F3DNormal + F3DNormal = bytearray(0) + for axis in normal: + F3DNormal.extend(int(axis * 127).to_bytes(1, "big", signed=True)) + return F3DNormal + def byteMask(data, offset, amount): - return bitMask(data, offset * 8, amount * 8) + return bitMask(data, offset * 8, amount * 8) + + def bitMask(data, offset, amount): - return (~(-1 << amount) << offset & data) >> offset + return (~(-1 << amount) << offset & data) >> offset + def read16bitRGBA(data): - r = bitMask(data, 11, 5) / ((2**5) - 1) - g = bitMask(data, 6, 5) / ((2**5) - 1) - b = bitMask(data, 1, 5) / ((2**5) - 1) - a = bitMask(data, 0, 1) / ((2**1) - 1) + r = bitMask(data, 11, 5) / ((2 ** 5) - 1) + g = bitMask(data, 6, 5) / ((2 ** 5) - 1) + b = bitMask(data, 1, 5) / ((2 ** 5) - 1) + a = bitMask(data, 0, 1) / ((2 ** 1) - 1) - return [r,g,b,a] + return [r, g, b, a] + + +def join_c_args(args: "list[str]"): + return ", ".join(args) -def join_c_args(args: 'list[str]'): - return ', '.join(args) def translate_blender_to_n64(translate: mathutils.Vector): - return transform_mtx_blender_to_n64() @ translate + return transform_mtx_blender_to_n64() @ translate + def rotate_quat_blender_to_n64(rotation: mathutils.Quaternion): - new_rot = (transform_mtx_blender_to_n64() @ rotation.to_matrix().to_4x4() @ transform_mtx_blender_to_n64().inverted()) + new_rot = ( + transform_mtx_blender_to_n64() + @ rotation.to_matrix().to_4x4() + @ transform_mtx_blender_to_n64().inverted() + ) return new_rot.to_quaternion() + def all_values_equal_x(vals: Iterable, test): - return len(set(vals) - set([test])) == 0 + return len(set(vals) - set([test])) == 0 diff --git a/fast64_internal/utility_anim.py b/fast64_internal/utility_anim.py index 147ef5bbf..e6d6d1c1d 100644 --- a/fast64_internal/utility_anim.py +++ b/fast64_internal/utility_anim.py @@ -1,56 +1,69 @@ import bpy, math, mathutils + class ValueFrameData: - def __init__(self, boneIndex, field, frames): - self.boneIndex = boneIndex - self.field = field - self.frames = frames + def __init__(self, boneIndex, field, frames): + self.boneIndex = boneIndex + self.field = field + self.frames = frames + def saveQuaternionFrame(frameData, rotation): - for i in range(3): - field = rotation.to_euler()[i] - value = (math.degrees(field) % 360 ) / 360 - frameData[i].frames.append(min(int(round(value * (2**16 - 1))), 2**16 - 1)) + for i in range(3): + field = rotation.to_euler()[i] + value = (math.degrees(field) % 360) / 360 + frameData[i].frames.append(min(int(round(value * (2 ** 16 - 1))), 2 ** 16 - 1)) + def removeTrailingFrames(frameData): - for i in range(3): - if len(frameData[i].frames) < 2: - continue - lastUniqueFrame = len(frameData[i].frames) - 1 - while lastUniqueFrame > 0: - if frameData[i].frames[lastUniqueFrame] == \ - frameData[i].frames[lastUniqueFrame - 1]: - lastUniqueFrame -= 1 - else: - break - frameData[i].frames = frameData[i].frames[:lastUniqueFrame + 1] - + for i in range(3): + if len(frameData[i].frames) < 2: + continue + lastUniqueFrame = len(frameData[i].frames) - 1 + while lastUniqueFrame > 0: + if ( + frameData[i].frames[lastUniqueFrame] + == frameData[i].frames[lastUniqueFrame - 1] + ): + lastUniqueFrame -= 1 + else: + break + frameData[i].frames = frameData[i].frames[: lastUniqueFrame + 1] + + def squashFramesIfAllSame(frameData): - for i in range(3): - if len(frameData[i].frames) < 2: - continue - f0 = frameData[i].frames[0] - for j in range(1, len(frameData[i].frames)): - d = abs(frameData[i].frames[j] - f0) - # Allow a change of +/-1 from original frame due to rounding. - if d >= 2 and d != 0xFFFF: - break - else: - frameData[i].frames = frameData[i].frames[0:1] + for i in range(3): + if len(frameData[i].frames) < 2: + continue + f0 = frameData[i].frames[0] + for j in range(1, len(frameData[i].frames)): + d = abs(frameData[i].frames[j] - f0) + # Allow a change of +/-1 from original frame due to rounding. + if d >= 2 and d != 0xFFFF: + break + else: + frameData[i].frames = frameData[i].frames[0:1] + def saveTranslationFrame(frameData, translation): - for i in range(3): - frameData[i].frames.append(min(int(round(translation[i])), 2**16 - 1)) + for i in range(3): + frameData[i].frames.append(min(int(round(translation[i])), 2 ** 16 - 1)) + def getFrameInterval(anim): - frameInterval = [0,0] + frameInterval = [0, 0] + + # frame_start is minimum 0 + frameInterval[0] = max( + bpy.context.scene.frame_start, int(round(anim.frame_range[0])) + ) - # frame_start is minimum 0 - frameInterval[0] = max(bpy.context.scene.frame_start, - int(round(anim.frame_range[0]))) + frameInterval[1] = ( + max( + min(bpy.context.scene.frame_end, int(round(anim.frame_range[1]))), + frameInterval[0], + ) + + 1 + ) - frameInterval[1] = \ - max(min(bpy.context.scene.frame_end, - int(round(anim.frame_range[1]))), frameInterval[0]) + 1 - - return frameInterval + return frameInterval