From 51dd3ef0db5c5aa29d33bf36e7ca1e761bed750b Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Thu, 3 Sep 2026 12:29:10 -0700 Subject: [PATCH 01/15] Recover gm_1832 data layout Delete a duplicate unused "ScItrAllstar_scene_data" array, move the "IrRdMap" definition ahead of the first " " literal, and order the .sbss statics by their DOL addresses. .data and .sdata now match byte-for-byte and every data symbol lands at its target offset. --- src/melee/gm/gm_1832.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/melee/gm/gm_1832.c b/src/melee/gm/gm_1832.c index d66f4801f1..1855689920 100644 --- a/src/melee/gm/gm_1832.c +++ b/src/melee/gm/gm_1832.c @@ -84,13 +84,12 @@ static struct gm_1832_8047368C_t { } lbl_8047368C; ASSERT_SIZE(struct gm_1832_8047368C_t, 0x24); +static HSD_GObj* lbl_804D65F0; static HSD_Archive* lbl_804D65F4; static HSD_Archive* lbl_804D65F8; -static HSD_GObj* lbl_804D65F0; +static SceneDesc* lbl_804D65FC; static SceneDesc* lbl_804D6600; -static int lbl_804D6608; - typedef struct { HSD_GObjEvent v[6]; } ClassicProcArray; @@ -149,6 +148,9 @@ static struct { /* 0x6A8 */ ClassicCharLayout x6A8[28]; }* lbl_804D6604; +static int lbl_804D6608; +static int lbl_804D660C; + void fn_8018325C(HSD_GObj* arg0, int arg1) { Vec3 pos; @@ -974,6 +976,8 @@ void fn_80186080(void) } } +static char lbl_804D40B0[] = "IrRdMap"; + void fn_801861B8(void) { HSD_Text* text; @@ -1026,8 +1030,6 @@ void fn_801861B8(void) } } -static SceneDesc* lbl_804D65FC; - void fn_80186400(void) { HSD_GObj* gobj = GObj_Create(0xE, 0xF, 0); @@ -1048,8 +1050,6 @@ void fn_80186400(void) } } -static char lbl_804D40B0[] = "IrRdMap"; - typedef struct ClassicArchiveNameArray { const char* v[4]; } ClassicArchiveNameArray; @@ -1195,6 +1195,9 @@ void gm_Scene_IntroEasy_OnFrame(void) } } +static HSD_Archive* lbl_804D6610; +static SceneDesc* lbl_804D6614; + static struct enterdata { int x0, x4; } lbl_804D6618; @@ -1360,8 +1363,6 @@ void fn_80186F6C(HSD_GObj* arg0) } } -static HSD_Archive* lbl_804D6610; - #ifdef MUST_MATCH static const f32 gm_1832_sdata2_tail5[1] = { 1.0f }; @@ -1398,8 +1399,6 @@ void fn_80187494(HSD_GObj* gobj, int arg1) } } -static SceneDesc* lbl_804D6614; - #ifdef MUST_MATCH static const f32 gm_1832_sdata2_tail6[1] = { 10000.0f }; #endif @@ -1708,8 +1707,6 @@ void fn_80187CF4(HSD_GObj* gobj) HSD_JObjAnimAll(gobj->hsd_obj); } -static char gm_Scene_IntroAllstar_SceneDataName[] = "ScItrAllstar_scene_data"; - static char* lbl_803D9750[] = { "mc01", "mc02", From 113846814e8bd18848d63c7f95230ca0e92d1df0 Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Thu, 3 Sep 2026 12:56:46 -0700 Subject: [PATCH 02/15] Type gm_1832's classic-mode character table The 115-float blob at 0x803D9248 is exactly one ClassicCharData (scale[28], offset[28], samus_extra), so define it with that type instead of casting an f32 array. Byte-identical .data, and fn_801851C0 is unchanged. --- src/melee/gm/gm_1832.c | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/melee/gm/gm_1832.c b/src/melee/gm/gm_1832.c index 1855689920..a9d2cdec80 100644 --- a/src/melee/gm/gm_1832.c +++ b/src/melee/gm/gm_1832.c @@ -349,19 +349,27 @@ void fn_80184A94(HSD_GObj* gobj) fn_80184138(gobj, 2); } -static f32 lbl_803D9248[] = { - 0.6f, 0.35f, 0.6f, 0.5f, 0.6f, 0.35f, 0.6f, 0.6f, 0.7f, 0.6f, - 0.5f, 0.6f, 0.6f, 0.6f, 0.5f, 0.5f, 0.6f, 0.5f, 0.6f, 0.6f, - 0.5f, 0.6f, 0.6f, 0.6f, 0.6f, 0.5f, 0.5f, 0.5f, 0.0f, -6.0f, - 0.0f, 0.0f, -3.5f, 0.0f, -1.0f, -3.5f, 0.0f, 0.0f, -3.5f, 0.0f, - 0.0f, -1.0f, 0.0f, 0.0f, -3.0f, 0.0f, 0.0f, -5.0f, 0.0f, 0.0f, - -3.5f, 0.0f, 0.0f, -3.5f, 0.0f, 0.0f, -3.5f, 0.0f, 0.0f, -3.0f, - 0.0f, -0.5f, -3.5f, 0.0f, -2.0f, -6.0f, 0.0f, 0.0f, -2.5f, 0.0f, - 0.0f, -2.5f, 0.0f, -1.0f, -1.0f, 0.0f, 0.0f, -5.0f, 0.0f, 0.0f, - -3.0f, 0.0f, -1.0f, -6.0f, 0.0f, -1.0f, -2.5f, 0.0f, -1.0f, -3.5f, - 0.0f, 0.0f, -3.5f, 0.0f, 0.0f, -4.0f, 0.0f, -1.0f, -3.5f, 0.0f, - 0.0f, -1.5f, 0.0f, 0.0f, -4.5f, 0.0f, 0.0f, -3.5f, 0.0f, 0.0f, - -3.5f, 0.0f, 3.0f, 4.0f, -5.0f, +typedef struct ClassicCharData { + /* 0x000 */ f32 scale[28]; + /* 0x070 */ Vec3 offset[28]; + /* 0x1C0 */ Vec3 samus_extra; +} ClassicCharData; + +static ClassicCharData lbl_803D9248 = { + { 0.6f, 0.35f, 0.6f, 0.5f, 0.6f, 0.35f, 0.6f, 0.6f, 0.7f, 0.6f, + 0.5f, 0.6f, 0.6f, 0.6f, 0.5f, 0.5f, 0.6f, 0.5f, 0.6f, 0.6f, + 0.5f, 0.6f, 0.6f, 0.6f, 0.6f, 0.5f, 0.5f, 0.5f }, + { { 0.0f, -6.0f, 0.0f }, { 0.0f, -3.5f, 0.0f }, { -1.0f, -3.5f, 0.0f }, + { 0.0f, -3.5f, 0.0f }, { 0.0f, -1.0f, 0.0f }, { 0.0f, -3.0f, 0.0f }, + { 0.0f, -5.0f, 0.0f }, { 0.0f, -3.5f, 0.0f }, { 0.0f, -3.5f, 0.0f }, + { 0.0f, -3.5f, 0.0f }, { 0.0f, -3.0f, 0.0f }, { -0.5f, -3.5f, 0.0f }, + { -2.0f, -6.0f, 0.0f }, { 0.0f, -2.5f, 0.0f }, { 0.0f, -2.5f, 0.0f }, + { -1.0f, -1.0f, 0.0f }, { 0.0f, -5.0f, 0.0f }, { 0.0f, -3.0f, 0.0f }, + { -1.0f, -6.0f, 0.0f }, { -1.0f, -2.5f, 0.0f }, { -1.0f, -3.5f, 0.0f }, + { 0.0f, -3.5f, 0.0f }, { 0.0f, -4.0f, 0.0f }, { -1.0f, -3.5f, 0.0f }, + { 0.0f, -1.5f, 0.0f }, { 0.0f, -4.5f, 0.0f }, { 0.0f, -3.5f, 0.0f }, + { 0.0f, -3.5f, 0.0f } }, + { 3.0f, 4.0f, -5.0f }, }; static char lbl_803D9414[] = { 0x82, 0x73, 0x82, 0x85, 0x82, 0x81, @@ -540,12 +548,6 @@ void fn_8018504C(void) } } -typedef struct ClassicCharData { - f32 scale[28]; - Vec3 offset[28]; - Vec3 samus_extra; -} ClassicCharData; - s32 fn_801851C0(void) { u8 pad_stack[8]; @@ -554,7 +556,7 @@ s32 fn_801851C0(void) s32 result; for (i = 0; i < (s32) lbl_804735E8.xE0; i++) { - ClassicCharData* data = (ClassicCharData*) lbl_803D9248; + ClassicCharData* data = &lbl_803D9248; result = i + 1; Player_SetPlayerCharacter(result, (CharacterKind) lbl_8047368C.xF4[0]); Player_SetPlayerId(result, 0); From b6a121a1414b35bc5b337100290561fb41637a6c Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Thu, 3 Sep 2026 13:17:23 -0700 Subject: [PATCH 03/15] Move the 1/60 constant at 0x804DA5F8 into gm_1884 gm_1884's fn_801891F4 is the only referrer of that .sdata2 entry, and an MWCC literal pool is per-translation-unit, so it cannot belong to gm_1832. The split boundary put it in gm_1832, which a MUST_MATCH seed then reproduced; flipping gm_1832 to Matching therefore failed to link with "undefined: 'lbl_804DA5F8'". Move the boundary and drop the seed. The DOL stays byte-identical. --- config/GALE01/splits.txt | 4 ++-- src/melee/gm/gm_1832.c | 7 ------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/config/GALE01/splits.txt b/config/GALE01/splits.txt index 3008aea477..0048ebf899 100644 --- a/config/GALE01/splits.txt +++ b/config/GALE01/splits.txt @@ -2348,7 +2348,7 @@ melee/gm/gm_1832.c: .bss start:0x804735A8 end:0x80473700 .sdata start:0x804D4090 end:0x804D4140 .sbss start:0x804D65F0 end:0x804D6628 - .sdata2 start:0x804DA538 end:0x804DA600 + .sdata2 start:0x804DA538 end:0x804DA5F8 melee/gm/gm_1884.c: .text start:0x80188454 end:0x8018A514 @@ -2357,7 +2357,7 @@ melee/gm/gm_1884.c: .bss start:0x80473700 end:0x80473AB8 .sdata start:0x804D4140 end:0x804D4158 .sbss start:0x804D6628 end:0x804D6630 - .sdata2 start:0x804DA600 end:0x804DA650 + .sdata2 start:0x804DA5F8 end:0x804DA650 melee/gm/gmtoulib.c: .text start:0x8018A514 end:0x80190ABC diff --git a/src/melee/gm/gm_1832.c b/src/melee/gm/gm_1832.c index a9d2cdec80..f61a47541d 100644 --- a/src/melee/gm/gm_1832.c +++ b/src/melee/gm/gm_1832.c @@ -1535,12 +1535,6 @@ static const f32 gm_1832_sdata2_tail7[1] ATTRIBUTE_ALIGN(8) = { 0.0f }; static const f64 gm_1832_sdata2_tail8[1] = { S32_TO_F32 }; #endif -static inline void gm_1832_sdata2_order_tail9(int unused) -{ - (void) unused; - (void) 0.0166666675f; -} - void fn_80187910(HSD_GObj* arg0) { Vec3 sp10; @@ -1575,7 +1569,6 @@ void fn_80187910(HSD_GObj* arg0) sp10.y *= scale; sp10.z *= scale; HSD_CObjSetEyePosition(cobj, &sp10); - gm_1832_sdata2_order_tail9(0); } typedef struct { From 489def4943cdb771652ca30700b5fdf9c31e4cd2 Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Thu, 3 Sep 2026 13:30:47 -0700 Subject: [PATCH 04/15] Split gm_1832.c into three translation units MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The .sdata pool holds two copies each of "jobj.h", "jobj" and "IrAls", and .data holds two copies of "ScItrAllstar_scene_data" — with -str reuse a single TU cannot emit any of those twice. The .sbss also has 4-byte holes at 0x804D660C and 0x804D6624 that are exactly the 8-byte inter-unit alignment padding, and each intro scene owns a disjoint .bss object. Split at the scene boundaries: gm_1832.c keeps Classic/Easy, gm_186E.c takes All-Star, gm_1879.c takes Normal. This drops the duplicate-literal arrays and most of the .sdata2 ordering seeds that only existed to fake a merged pool, and every section is byte-exact against its new split range. The DOL is unchanged. --- config/GALE01/splits.txt | 28 +- configure.py | 2 + src/melee/gm/gm_1832.c | 716 -------------------------------------- src/melee/gm/gm_1832.h | 17 - src/melee/gm/gm_186E.c | 287 +++++++++++++++ src/melee/gm/gm_186E.h | 17 + src/melee/gm/gm_1879.c | 485 ++++++++++++++++++++++++++ src/melee/gm/gm_1879.h | 18 + src/melee/gm/gm_unsplit.h | 2 + src/melee/gr/grcorneria.c | 2 +- 10 files changed, 834 insertions(+), 740 deletions(-) create mode 100644 src/melee/gm/gm_186E.c create mode 100644 src/melee/gm/gm_186E.h create mode 100644 src/melee/gm/gm_1879.c create mode 100644 src/melee/gm/gm_1879.h diff --git a/config/GALE01/splits.txt b/config/GALE01/splits.txt index 0048ebf899..4235b07476 100644 --- a/config/GALE01/splits.txt +++ b/config/GALE01/splits.txt @@ -2342,13 +2342,29 @@ melee/gm/gmregclear.c: .sdata2 start:0x804DA428 end:0x804DA538 melee/gm/gm_1832.c: - .text start:0x8018325C end:0x80188454 + .text start:0x8018325C end:0x80186EFC .rodata start:0x803B7C28 end:0x803B7C68 - .data start:0x803D9248 end:0x803D9828 - .bss start:0x804735A8 end:0x80473700 - .sdata start:0x804D4090 end:0x804D4140 - .sbss start:0x804D65F0 end:0x804D6628 - .sdata2 start:0x804DA538 end:0x804DA5F8 + .data start:0x803D9248 end:0x803D9498 + .bss start:0x804735A8 end:0x804736B0 + .sdata start:0x804D4090 end:0x804D40C0 + .sbss start:0x804D65F0 end:0x804D6610 + .sdata2 start:0x804DA538 end:0x804DA5C8 + +melee/gm/gm_186E.c: + .text start:0x80186EFC end:0x80187910 + .data start:0x803D9498 end:0x803D9750 + .bss start:0x804736B0 end:0x804736C0 + .sdata start:0x804D40C0 end:0x804D40D8 + .sbss start:0x804D6610 end:0x804D6620 + .sdata2 start:0x804DA5C8 end:0x804DA5E8 + +melee/gm/gm_1879.c: + .text start:0x80187910 end:0x80188454 + .data start:0x803D9750 end:0x803D9828 + .bss start:0x804736C0 end:0x80473700 + .sdata start:0x804D40D8 end:0x804D4140 + .sbss start:0x804D6620 end:0x804D6628 + .sdata2 start:0x804DA5E8 end:0x804DA5F8 melee/gm/gm_1884.c: .text start:0x80188454 end:0x8018A514 diff --git a/configure.py b/configure.py index 8ca3f46556..7154dc90a6 100755 --- a/configure.py +++ b/configure.py @@ -1155,6 +1155,8 @@ def MatchingFor(*versions): Object(Matching, "melee/gm/gmregcommon.c"), Object(Linkable, "melee/gm/gmregclear.c"), Object(Linkable, "melee/gm/gm_1832.c"), + Object(Linkable, "melee/gm/gm_186E.c"), + Object(Linkable, "melee/gm/gm_1879.c"), Object(Linkable, "melee/gm/gm_1884.c"), Object(Linkable, "melee/gm/gmtoulib.c"), Object(Matching, "melee/gm/gmtou_0.c"), diff --git a/src/melee/gm/gm_1832.c b/src/melee/gm/gm_1832.c index f61a47541d..62c67cc5b0 100644 --- a/src/melee/gm/gm_1832.c +++ b/src/melee/gm/gm_1832.c @@ -149,7 +149,6 @@ static struct { }* lbl_804D6604; static int lbl_804D6608; -static int lbl_804D660C; void fn_8018325C(HSD_GObj* arg0, int arg1) { @@ -1196,22 +1195,6 @@ void gm_Scene_IntroEasy_OnFrame(void) gm_801A4B60(); } } - -static HSD_Archive* lbl_804D6610; -static SceneDesc* lbl_804D6614; - -static struct enterdata { - int x0, x4; -} lbl_804D6618; - -typedef struct gm_804736B0_t { - int x0, x4; - HSD_JObj* x8; - HSD_JObj* xC; -} gm_804736B0_t; - -gm_804736B0_t lbl_804736B0; - /// Classic Mode intro scene enter data (0x20 bytes) typedef struct ClassicModeEnterData { /* 0x00 */ int x0; @@ -1249,702 +1232,3 @@ void gm_Scene_IntroEasy_OnEnter(void* arg0_) gm_80167858((int) (s8) lbl_8047368C.xEC, lbl_8047368C.xED, 0xB, 0x2D); gm_80168F88(); } - -static inline void gm_1832_sdata2_order_tail1(int unused) -{ - (void) unused; - (void) 7.0f; -} - -#ifdef MUST_MATCH -static const f32 gm_1832_sdata2_tail0[1] ATTRIBUTE_ALIGN(8) = { 0.0f }; -#endif - -void fn_80186EFC(HSD_GObj* gobj) -{ - HSD_JObj* jobj = GET_JOBJ(gobj); - gm_804736B0_t* state = &lbl_804736B0; - int* counter; - PAD_STACK(8); - gm_1832_sdata2_order_tail1(0); - HSD_JObjReqAnimAll(state->xC, 0.0f); - HSD_JObjAnimAll(jobj); - counter = &state->x4; - if (*counter < 0x8C) { - (*counter)++; - } else { - state->x0 = 1; - } -} - -#ifdef MUST_MATCH -static const f32 gm_1832_sdata2_tail2[1] = { 3.0f }; -static const f32 gm_1832_sdata2_tail3[1] = { 5.0f }; -#endif - -typedef struct gm_80186F6C_Entry { - /* 0x00 */ f32 x0; - /* 0x04 */ f32 x4; - /* 0x08 */ f32 x8; - /* 0x0C */ f32 xC; - /* 0x10 */ f32 x10; - /* 0x14 */ f32 x14; -} gm_80186F6C_Entry; - -static gm_80186F6C_Entry lbl_803D9498[] = { - { 0.0f, -4.5f, 0.0f, 1.0f, 1.0f, 1.0f }, - { 0.0f, 1.5f, 0.0f, 0.6f, 0.6f, 0.6f }, - { 0.0f, -5.3f, 0.0f, 1.3f, 1.3f, 1.3f }, - { 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f }, - { 0.0f, 5.5f, 0.0f, 0.75f, 0.75f, 0.75f }, - { -1.1f, -2.0f, 0.0f, 0.5f, 0.5f, 0.5f }, - { -1.0f, -3.5f, 0.0f, 1.3f, 1.3f, 1.3f }, - { -1.0f, -0.5f, 0.0f, 1.35f, 1.35f, 1.35f }, - { -1.0f, -2.0f, 0.0f, 1.4f, 1.4f, 1.4f }, - { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f }, - { 0.0f, -6.0f, 0.0f, 1.0f, 1.0f, 1.0f }, - { -1.0f, -0.5f, 0.0f, 1.1f, 1.1f, 1.1f }, - { -2.0f, -6.5f, 0.0f, 1.3f, 1.3f, 1.3f }, - { -0.5f, 2.5f, 0.0f, 1.0f, 1.0f, 1.0f }, - { -0.8f, 5.0f, 0.0f, 0.7f, 0.7f, 0.7f }, - { -1.0f, 4.0f, 0.0f, 0.8f, 0.8f, 0.8f }, - { 0.0f, -5.0f, 0.0f, 1.0f, 1.0f, 1.0f }, - { 0.0f, 2.0f, 0.0f, 0.9f, 0.9f, 0.9f }, - { -1.0f, -12.5f, 0.0f, 1.8f, 1.8f, 1.8f }, - { -3.5f, 0.0f, 0.0f, 1.8f, 1.8f, 1.8f }, - { 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, 1.0f }, - { 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f }, - { 0.0f, -2.5f, 0.0f, 1.1f, 1.1f, 1.1f }, - { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f }, - { 0.0f, 5.5f, 0.0f, 0.4f, 0.4f, 0.4f }, - { 1.0f, -11.0f, 0.0f, 1.3f, 1.3f, 1.3f }, - { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f }, - { -1.1f, 2.5f, 0.0f, 0.4f, 0.4f, 0.4f }, -}; - -/// Duplicate literals owned by the original All-Star intro split. -static char gm_80186F6C_JObjFile[7] ATTRIBUTE_ALIGN(8) = "jobj.h"; -static char gm_80186F6C_JObjCondition[5] = "jobj"; -static char gm_Scene_IntroAllstar_ArchiveName[] = "IrAls"; - -void fn_80186F6C(HSD_GObj* arg0) -{ - Vec3 pos; - HSD_JObj* jobj = arg0->hsd_obj; - HSD_JObj* child = lbl_804736B0.x8; - gm_80186F6C_Entry* entry = lbl_803D9498; - PAD_STACK(4); - - HSD_JObjGetTranslation(child, &pos); - - pos.x -= 7.0f; - pos.x += entry[lbl_804D6618.x0].x0; - pos.y += entry[lbl_804D6618.x0].x4; - pos.z += entry[lbl_804D6618.x0].x8; - - HSD_JObjSetTranslate(jobj, &pos); - - HSD_JObjSetScaleX(jobj, entry[lbl_804D6618.x0].xC); - HSD_JObjSetScaleY(jobj, entry[lbl_804D6618.x0].x10); - HSD_JObjSetScaleZ(jobj, entry[lbl_804D6618.x0].x14); - - { - HSD_GObj* entity2 = Player_GetEntityAtIndex(0, 1); - if (entity2 != NULL) { - HSD_JObj* jobj2 = entity2->hsd_obj; - - HSD_JObjGetTranslation(jobj, &pos); - pos.x += 3.0f; - pos.z -= 5.0f; - pos.y += 4.0f; - HSD_JObjSetTranslate(jobj2, &pos); - - HSD_JObjGetScale(jobj, &pos); - HSD_JObjSetScale(jobj2, &pos); - } - } -} - -#ifdef MUST_MATCH -static const f32 gm_1832_sdata2_tail5[1] = { 1.0f }; - -#pragma push -#pragma dont_inline on -#endif -HSD_GObjProc* fn_801873F0(void) -{ - ftDemo_ObjAllocInit(); - Player_InitAllPlayers(); - Player_80036E20(lbl_804D6618.x0, lbl_804D6610, 1); - Player_SetPlayerCharacter(0, lbl_804D6618.x0); - Player_SetCostumeId(0, lbl_804D6618.x4); - Player_SetPlayerId(0, 0); - Player_SetSlottype(0, Gm_PKind_Demo); - Player_SetFacingDirection(0, 0.0f); - Player_SetModelScale(0, 1.0f); - Player_80036F34(0, 6); - return HSD_GObj_SetupProc(Player_GetEntity(0), fn_80186F6C, 0x16U); -} -#ifdef MUST_MATCH -#pragma pop -#endif - -void fn_80187494(HSD_GObj* gobj, int arg1) -{ - int temp_ret = HSD_CObjSetCurrent(gobj->hsd_obj); - PAD_STACK(4); - if (temp_ret != 0) { - Camera_800313E0(gobj, 1); - gobj->gxlink_prios = 0x801; - HSD_GObj_80390ED0(gobj, 7); - HSD_CObjEndCurrent(); - } -} - -#ifdef MUST_MATCH -static const f32 gm_1832_sdata2_tail6[1] = { 10000.0f }; -#endif - -void fn_801874FC(void) -{ - HSD_JObj* sp8; - HSD_GObj* gobj; - HSD_JObj* jobj; - - gobj = GObj_Create(0xE, 0xF, 0); - jobj = HSD_JObjLoadJoint(lbl_804D6614->models[0]->joint); - HSD_GObjObject_80390A70(gobj, HSD_GObj_JObjKind, jobj); - GObj_SetupGXLink(gobj, HSD_GObj_JObjCallback, 0xB, 0); - HSD_GObj_SetupProc(gobj, fn_80186EFC, 0); - gm_8016895C(jobj, lbl_804D6614->models[0], 0); - HSD_JObjReqAnimAll(jobj, 0.0f); - HSD_JObjAnimAll(jobj); - lb_80011E24(jobj, &sp8, 0x3A, -1); - HSD_JObjSetTranslateZ(sp8, 10000.0F); - lb_80011E24(jobj, &sp8, 0x3B, -1); - HSD_JObjSetTranslateZ(sp8, 10000.0F); - lb_80011E24(jobj, &lbl_804736B0.x8, 5, -1); - lb_80011E24(jobj, &lbl_804736B0.xC, 6, -1); -} - -/// #fn_801874FC - -#ifdef MUST_MATCH -#pragma push -#pragma dont_inline on -#endif -void fn_80187714(void) -{ - Camera_80028B9C(6); - lb_8000FCDC(); - mpColl_80041C78(); - Ground_801C0378(64); - Stage_802251E8(St_Kind_Dummy, NULL); - Stage_8022524C(); - Item_80266FA8(); - Item_80266FCC(); - efLib_Init(); - efAsync_LoadSync(0); -} -#ifdef MUST_MATCH -#pragma pop -#endif - -void gm_Scene_IntroAllstar_OnFrame(void) -{ - if (lbl_804736B0.x0 != 0) { - lbArchive_80016EFC(lbl_804D6610); - lbAudioAx_800236DC(); - gm_801A4B60(); - } -} - -#ifdef MUST_MATCH -#pragma push -#pragma dont_inline on -#endif -void gm_Scene_IntroAllstar_OnEnter(void* arg0_) -{ - struct enterdata* arg0 = arg0_; - HSD_GObj* temp_r30; - HSD_GObj* temp_r30_2; - HSD_GObj* temp_r30_3; - HSD_LObj* lobj; - HSD_CObj* cobj; - HSD_Fog* fog; - PAD_STACK(8); - - lbl_804736B0.x0 = 0; - lbl_804736B0.x4 = 0; - - lbl_804D6618 = *arg0; - fn_80187714(); - lbl_804D6610 = lbArchive_80016DBC("IrAls", &lbl_804D6614, - "ScItrAllstar_scene_data", 0); - - temp_r30 = GObj_Create(0x13, 0x14, 0); - cobj = HSD_CObjLoadDesc(lbl_804D6614->cameras[0].desc); - HSD_GObjObject_80390A70(temp_r30, HSD_GObj_CameraKind, cobj); - GObj_SetupGXLinkMax(temp_r30, fn_80187494, 8); - temp_r30->gxlink_prios = 0x801; - - temp_r30_2 = GObj_Create(0xB, 3, 0); - lobj = lb_80011AC4(lbl_804D6614->lights); - HSD_GObjObject_80390A70(temp_r30_2, HSD_GObj_LightKind, lobj); - GObj_SetupGXLink(temp_r30_2, HSD_GObj_LObjCallback, 0, 0); - fn_801874FC(); - - temp_r30_3 = GObj_Create(0xE, 0xF, 0); - fog = HSD_FogLoadDesc(lbl_804D6614->fogs[0].desc); - HSD_GObjObject_80390A70(temp_r30_3, HSD_GObj_FogKind, fog); - GObj_SetupGXLink(temp_r30_3, HSD_GObj_FogCallback, 0xB, 0); - fn_801873F0(); - lbAudioAx_80023F28(0x2D); -} -#ifdef MUST_MATCH -#pragma pop -#endif - -typedef struct gm_1832_StageState { - u8 stage_index : 5; - u8 done : 1; - u8 flash : 1; - u8 active : 1; -} gm_1832_StageState; - -static struct gm_1832_804736C0_t { - DynamicModelDesc*** x0; - HSD_CameraAnim** x4; - HSD_GObj* x8; - u8 pad_C[0x28]; - u16 x34; - gm_1832_StageState x36; - struct { - u8 frame_counter : 4; - u8 anim_state : 2; - u8 state2 : 2; - } x37; - u8 x38; - u8 pad_39[7]; -} lbl_804736C0; -ASSERT_SIZE(struct gm_1832_804736C0_t, 0x40); -typedef struct gm_1832_804736C0_t gm_1832_804736C0_t; - -#ifdef MUST_MATCH -static const f32 gm_1832_sdata2_tail7[1] ATTRIBUTE_ALIGN(8) = { 0.0f }; -static const f64 gm_1832_sdata2_tail8[1] = { S32_TO_F32 }; -#endif - -void fn_80187910(HSD_GObj* arg0) -{ - Vec3 sp10; - gm_1832_804736C0_t* data; - HSD_CObj* cobj; - s32 frame; - f32 scale; - - PAD_STACK(4); - data = &lbl_804736C0; - cobj = arg0->hsd_obj; - if (gm_GetButtonsTriggered(data->x38) & PAD_BUTTON_A) { - data->x37.frame_counter = (s32) cobj->eyepos->aobj->curr_frame / 300; - if (++data->x37.frame_counter >= 8U) { - data->x37.frame_counter = 0; - } - frame = data->x37.frame_counter * 0x12C; - HSD_CObjRemoveAnim(cobj); - HSD_CObjAddAnim(cobj, *(HSD_CameraAnim**) data->x4[1]); - HSD_CObjReqAnim(cobj, (f32) frame); - } - HSD_CObjAnim(cobj); - HSD_CObjGetInterest(cobj, &sp10); - scale = Ground_801C0498(); - sp10.x *= scale; - sp10.y *= scale; - sp10.z *= scale; - HSD_CObjSetInterest(cobj, &sp10); - HSD_CObjGetEyePosition(cobj, &sp10); - scale = Ground_801C0498(); - sp10.x *= scale; - sp10.y *= scale; - sp10.z *= scale; - HSD_CObjSetEyePosition(cobj, &sp10); -} - -typedef struct { - u8 pad_hi : 4; - u8 state : 2; - u8 pad_lo : 2; -} x37_state_bits; - -static inline void fn_80187AB4_LoadAnim(HSD_JObj* jobj, - gm_1832_804736C0_t* data) -{ - DynamicModelDesc* desc = (*data->x0)[11 - data->x36.stage_index]; - int anim_state; - - if (desc->anims != NULL) { - anim_state = data->x37.anim_state; - if (desc->anims[anim_state] != NULL) { - lb_8000C0E8(jobj, anim_state, desc); - HSD_JObjReqAnimAll(jobj, 0.0f); - HSD_JObjAnimAll(jobj); - } - } -} - -void fn_80187AB4(HSD_GObj* gobj) -{ - gm_1832_804736C0_t* data = &lbl_804736C0; - HSD_JObj* jobj = GET_JOBJ(gobj); - int state = data->x37.anim_state; - PAD_STACK(16); - - switch (state) { - case 0: - if (lb_8000B09C(jobj) == 0) { - data->x37.anim_state = 1; - fn_80187AB4_LoadAnim(jobj, data); - data->x34 = 0x960; - } - break; - case 1: - if ((u32) data->x36.active == 1U) { - data->x36.flash = 1; - } - if (data->x36.flash) { - data->x37.anim_state = 2; - data->x36.done = 1; - lbBgFlash_8002063C(1); - } - if (lb_8000B09C(jobj) == 0) { - fn_80187AB4_LoadAnim(jobj, data); - } - break; - case 2: - if (lb_8000B09C(jobj) == 0) { - data->x36.done = 1; - HSD_GObjPLink_80390228(gobj); - } - break; - } - HSD_JObjAnimAll(GET_JOBJ(gobj)); -} - -void fn_80187C9C(HSD_GObj* gobj, int arg1) -{ - GXSetZMode(0, GX_NEVER, 0); - HSD_GObj_JObjCallback(gobj, arg1); - HSD_StateInvalidate(0x40); -} - -void fn_80187CF4(HSD_GObj* gobj) -{ - gm_1832_804736C0_t* data = &lbl_804736C0; - HSD_JObj* jobj = gobj->hsd_obj; - int state = data->x37.state2; - DynamicModelDesc* desc; - int anim_state; - - switch (state) { - case 0: - if (lb_8000B09C(jobj) == 0) { - data->x37.state2 = 1; - anim_state = data->x37.state2; - desc = (*data->x0)[12]; - if (desc->anims[anim_state] != NULL) { - lb_8000C0E8(jobj, anim_state, desc); - HSD_JObjReqAnimAll(jobj, 0.0f); - HSD_JObjAnimAll(jobj); - } - } - break; - case 1: - if (lb_8000B09C(jobj) == 0) { - data->x37.state2 = 2; - anim_state = data->x37.state2; - desc = (*data->x0)[12]; - if (desc->anims[anim_state] != NULL) { - lb_8000C0E8(jobj, anim_state, desc); - HSD_JObjReqAnimAll(jobj, 0.0f); - HSD_JObjAnimAll(jobj); - } - } - break; - case 2: - if (gm_GetButtonsTriggered(data->x38) & PAD_BUTTON_START) { - sfxForward(); - data->x36.active = 1; - data->x37.state2 = 3; - anim_state = data->x37.state2; - desc = (*data->x0)[12]; - if (desc->anims[anim_state] != NULL) { - lb_8000C0E8(jobj, anim_state, desc); - HSD_JObjReqAnimAll(jobj, 0.0f); - HSD_JObjAnimAll(jobj); - } - } else if (lb_8000B09C(jobj) == 0) { - anim_state = data->x37.state2; - desc = (*data->x0)[12]; - if (desc->anims[anim_state] != NULL) { - lb_8000C0E8(jobj, anim_state, desc); - HSD_JObjReqAnimAll(jobj, 0.0f); - HSD_JObjAnimAll(jobj); - } - } - break; - case 3: - if (lb_8000B09C(jobj) == 0) { - HSD_GObjPLink_80390228(gobj); - } - break; - } - HSD_JObjAnimAll(gobj->hsd_obj); -} - -static char* lbl_803D9750[] = { - "mc01", - "mc02", - "mc03", - "mc04", - "mc05", - "mc06", - "mc07", - "mc08", - "mc09", - "mc10", - "mc11", - "mc12", - (char*) 0x1C, - (char*) 0x1C, - (char*) 0x1C, - (char*) 0x1C, - (char*) 0x1C, - (char*) 0x1C, - (char*) 0x1C, - (char*) 0x1C, - (char*) 0x1C, - (char*) 0x14, - (char*) 0x14, - (char*) 0x1C, - (char*) 0x20000, - (char*) 0x10000000, - (char*) 0x20, - (char*) 0x100, - (char*) 0x20000, - (char*) 0x10000, - (char*) 0x100, - (char*) 0x04000000, - (char*) 0x802, - (char*) 0x4000, - (char*) 8, - (char*) 0xC00, - (char*) 0x10000, - (char*) 0x01000000, - (char*) 0x20000, - (char*) 0x40, - (char*) 0x80, - (char*) 0x200000, - NULL, - (char*) 0x2000, - NULL, - (char*) 0x60000, - (char*) 0x200000, - (char*) 0x9000, - (char*) 0x53634974, - (char*) 0x724E6F72, - (char*) 0x6D616C5F, - (char*) 0x7363656E, - (char*) 0x655F6461, - (char*) 0x74610000, -}; - -static HSD_Archive* lbl_804D6620; - -typedef struct gm_80187F48_EnterData { - u8 x0; - u8 stage_index; - u16 stkind; -} gm_80187F48_EnterData; - -static inline StKind gm_GetStKind(gm_80187F48_EnterData* data) -{ - return data->stkind; -} - -static inline u64 gm_80187F48_GetAudioConfig(u8 stage_index, char** table) -{ - return lbAudioAx_80026E84(Player_GetPlayerCharacter(0)) | - ((u64*) &table[24])[stage_index]; -} - -static inline void gm_80187F48_SetupCamera(HSD_GObj* gobj, - gm_1832_804736C0_t* data, - HSD_CObj* cobj) -{ - HSD_GObj_SetupProc(gobj, fn_80187910, 0); - HSD_CObjAddAnim(cobj, *(HSD_CameraAnim**) data->x4[1]); - HSD_CObjReqAnim(cobj, 0.0f); -} - -static inline void gm_80187F48_OnEnter_inline(gm_80187F48_EnterData* arg0) -{ - gm_1832_804736C0_t* data; - char** table = lbl_803D9750; - HSD_CObj* cobj; - HSD_GObj* gobj; - u8 stage_index; - - data = &lbl_804736C0; - data->x38 = arg0->x0; - lb_8000FCDC(); - mpColl_80041C78(); - Ground_801C0378(0x40); - Stage_802251E8(gm_GetStKind(arg0), NULL); - Item_80266F70(); - Item_80266FCC(); - efLib_Init(); - efAsync_LoadSync(0); - efAsync_LoadSync(0x1F); - Stage_8022524C(); - Player_InitAllPlayers(); - lbBgFlash_800209F4(); - - stage_index = arg0->stage_index; - data->x37.anim_state = 0; - data->x37.frame_counter = 0; - data->x34 = 0; - data->x36.done = 0; - data->x36.flash = 0; - data->x36.stage_index = stage_index; - data->x37.state2 = 0; - data->x36.active = 0; - - stage_index = arg0->stage_index; - lbl_804D6620 = lbArchive_80016DBC("IrNml", &data->x0, &table[48], - &data->x4, table[stage_index], NULL); - - lbAudioAx_80026F2C((s32) table[stage_index + 12]); - lbAudioAx_8002702C((s32) table[stage_index + 12], - gm_80187F48_GetAudioConfig(stage_index, table)); - lbAudioAx_80027168(); - lbAudioAx_80027648(); - - gobj = GObj_Create(0x13, 0x14, 0); - data->x8 = gobj; - cobj = HSD_CObjLoadDesc((HSD_CObjDesc*) *data->x4); - HSD_GObjObject_80390A70(gobj, HSD_GObj_CameraKind, cobj); - GObj_SetupGXLinkMax(gobj, (GObj_RenderFunc) (Event) Camera_800304E0, 8); - gm_80187F48_SetupCamera(gobj, data, cobj); - - { - HSD_GObj* scene_gobj = GObj_Create(0x13, 0x14, 0); - HSD_CObj* scene_cobj = - HSD_CObjLoadDesc(((SceneDesc*) data->x0)->cameras[0].desc); - HSD_GObjObject_80390A70(scene_gobj, HSD_GObj_CameraKind, scene_cobj); - GObj_SetupGXLinkMax(scene_gobj, HSD_GObj_803910D8, 8); - scene_gobj->gxlink_prios = 0xC00; - } - - { - HSD_GObj* light_gobj = GObj_Create(0xB, 3, 0); - HSD_LObj* lobj = lb_80011AC4(((SceneDesc*) data->x0)->lights); - HSD_GObjObject_80390A70(light_gobj, HSD_GObj_LightKind, lobj); - GObj_SetupGXLink(light_gobj, HSD_GObj_LObjCallback, 0xA, 0); - } - - { - HSD_JObj* model_jobj; - HSD_GObj* model_gobj; - model_gobj = GObj_Create(0xE, 0xF, 0); - model_jobj = - HSD_JObjLoadJoint((*data->x0)[11 - data->x36.stage_index]->joint); - lb_80011C18(model_jobj, 0x08000000); - HSD_GObjObject_80390A70(model_gobj, HSD_GObj_JObjKind, model_jobj); - GObj_SetupGXLink(model_gobj, fn_80187C9C, 0xB, 0xB); - - fn_80187AB4_LoadAnim(model_jobj, data); - HSD_GObj_SetupProc(model_gobj, fn_80187AB4, 0); - } - - { - HSD_GObj* model_gobj = GObj_Create(0xE, 0xF, 0); - HSD_JObj* model_jobj = HSD_JObjLoadJoint((*data->x0)[12]->joint); - int model_anim_idx; - DynamicModelDesc* model_desc; - lb_80011C18(model_jobj, 0x08000000); - HSD_GObjObject_80390A70(model_gobj, HSD_GObj_JObjKind, model_jobj); - GObj_SetupGXLink(model_gobj, fn_80187C9C, 0xB, 0xB); - - model_anim_idx = data->x37.state2; - model_desc = (*data->x0)[12]; - if (model_desc->anims[model_anim_idx] != NULL) { - lb_8000C0E8(model_jobj, model_anim_idx, model_desc); - HSD_JObjReqAnimAll(model_jobj, 0.0f); - HSD_JObjAnimAll(model_jobj); - } - - HSD_JObjReqAnimAll(model_jobj, 0.0f); - HSD_JObjAnimAll(model_jobj); - HSD_GObj_SetupProc(model_gobj, fn_80187CF4, 0); - } - lbAudioAx_80023F28(0x2E); -} - -void gm_Scene_IntroNormal_OnEnter(void* arg0) -{ - PAD_STACK(16); - gm_80187F48_OnEnter_inline(arg0); -} - -void gm_Scene_IntroNormal_OnLeave(void* arg0) -{ - HSD_Archive** var = &lbl_804D6620; - lbArchive_80016EFC(*var); -} - -void gm_Scene_IntroNormal_OnFrame(void) -{ - if (lbl_804736C0.x36.done) { - gm_801A4B60(); - } -} - -f32 gm_801883C0(void) -{ - HSD_GObj* gobj; - HSD_CObj* cobj; - HSD_AObj* aobj; - - gobj = lbl_804736C0.x8; - if (gobj == NULL) { - goto return_default; - } - - cobj = gobj->hsd_obj; - goto check_cobj; - -return_default: - return 0.0f; - -check_cobj: - aobj = cobj->eyepos->aobj; - if (aobj != NULL) { - return aobj->curr_frame; - } - - aobj = cobj->interest->aobj; - if (aobj != NULL) { - return aobj->curr_frame; - } - - return 0.0f; -} - -bool gm_8018841C(void) -{ - if (gm_GetCurrentGameMode() == GM_TRAINING) { - return true; - } - return false; -} diff --git a/src/melee/gm/gm_1832.h b/src/melee/gm/gm_1832.h index b64a8fe9f5..a1a691930d 100644 --- a/src/melee/gm/gm_1832.h +++ b/src/melee/gm/gm_1832.h @@ -32,22 +32,5 @@ /* 186634 */ void fn_80186634(void*); /* 186DFC */ void gm_Scene_IntroEasy_OnFrame(void); /* 186E30 */ void gm_Scene_IntroEasy_OnEnter(void*); -/* 186EFC */ void fn_80186EFC(HSD_GObj*); -/* 186F6C */ void fn_80186F6C(HSD_GObj*); -/* 1873F0 */ HSD_GObjProc* fn_801873F0(void); -/* 187494 */ void fn_80187494(HSD_GObj*, int); -/* 1874FC */ UNK_RET fn_801874FC(UNK_PARAMS); -/* 187714 */ UNK_RET fn_80187714(UNK_PARAMS); -/* 18776C */ void gm_Scene_IntroAllstar_OnFrame(void); -/* 1877A8 */ void gm_Scene_IntroAllstar_OnEnter(UNK_T); -/* 187910 */ void fn_80187910(HSD_GObj*); -/* 187AB4 */ void fn_80187AB4(HSD_GObj*); -/* 187C9C */ void fn_80187C9C(HSD_GObj*, int); -/* 187CF4 */ void fn_80187CF4(HSD_GObj*); -/* 187F48 */ void gm_Scene_IntroNormal_OnEnter(UNK_T); -/* 188364 */ void gm_Scene_IntroNormal_OnLeave(UNK_T); -/* 18838C */ void gm_Scene_IntroNormal_OnFrame(void); -/* 1883C0 */ f32 gm_801883C0(void); -/* 18841C */ bool gm_8018841C(void); #endif diff --git a/src/melee/gm/gm_186E.c b/src/melee/gm/gm_186E.c new file mode 100644 index 0000000000..e76594a40e --- /dev/null +++ b/src/melee/gm/gm_186E.c @@ -0,0 +1,287 @@ +#include "gm_186E.h" + +#include "gm_unsplit.h" + +#include "cm/camera.h" +#include "dolphin/pad.h" +#include "ef/efasync.h" +#include "ef/eflib.h" +#include "ft/ftdemo.h" +#include "gm/gm_1601.h" +#include "gm/gm_1A36.h" +#include "gm/gm_1A3F.h" +#include "gm/gm_1A45.h" +#include "gm/types.h" +#include "gr/ground.h" +#include "gr/stage.h" +#include "it/item.h" +#include "lb/lb_00B0.h" +#include "lb/lb_00F9.h" +#include "lb/lbarchive.h" +#include "lb/lbaudio_ax.h" +#include "lb/lbbgflash.h" +#include "lb/lblanguage.h" +#include "lb/lbspdisplay.h" +#include "mn/inlines.h" +#include "mn/mnname.h" +#include "mp/mpcoll.h" +#include "pl/player.h" +#include "sc/types.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +static HSD_Archive* lbl_804D6610; +static SceneDesc* lbl_804D6614; + +static struct enterdata { + int x0, x4; +} lbl_804D6618; + +typedef struct gm_804736B0_t { + int x0, x4; + HSD_JObj* x8; + HSD_JObj* xC; +} gm_804736B0_t; + +gm_804736B0_t lbl_804736B0; +void fn_80186EFC(HSD_GObj* gobj) +{ + HSD_JObj* jobj = GET_JOBJ(gobj); + gm_804736B0_t* state = &lbl_804736B0; + int* counter; + PAD_STACK(8); + HSD_JObjReqAnimAll(state->xC, 0.0f); + HSD_JObjAnimAll(jobj); + counter = &state->x4; + if (*counter < 0x8C) { + (*counter)++; + } else { + state->x0 = 1; + } +} + +typedef struct gm_80186F6C_Entry { + /* 0x00 */ f32 x0; + /* 0x04 */ f32 x4; + /* 0x08 */ f32 x8; + /* 0x0C */ f32 xC; + /* 0x10 */ f32 x10; + /* 0x14 */ f32 x14; +} gm_80186F6C_Entry; + +static gm_80186F6C_Entry lbl_803D9498[] = { + { 0.0f, -4.5f, 0.0f, 1.0f, 1.0f, 1.0f }, + { 0.0f, 1.5f, 0.0f, 0.6f, 0.6f, 0.6f }, + { 0.0f, -5.3f, 0.0f, 1.3f, 1.3f, 1.3f }, + { 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f }, + { 0.0f, 5.5f, 0.0f, 0.75f, 0.75f, 0.75f }, + { -1.1f, -2.0f, 0.0f, 0.5f, 0.5f, 0.5f }, + { -1.0f, -3.5f, 0.0f, 1.3f, 1.3f, 1.3f }, + { -1.0f, -0.5f, 0.0f, 1.35f, 1.35f, 1.35f }, + { -1.0f, -2.0f, 0.0f, 1.4f, 1.4f, 1.4f }, + { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f }, + { 0.0f, -6.0f, 0.0f, 1.0f, 1.0f, 1.0f }, + { -1.0f, -0.5f, 0.0f, 1.1f, 1.1f, 1.1f }, + { -2.0f, -6.5f, 0.0f, 1.3f, 1.3f, 1.3f }, + { -0.5f, 2.5f, 0.0f, 1.0f, 1.0f, 1.0f }, + { -0.8f, 5.0f, 0.0f, 0.7f, 0.7f, 0.7f }, + { -1.0f, 4.0f, 0.0f, 0.8f, 0.8f, 0.8f }, + { 0.0f, -5.0f, 0.0f, 1.0f, 1.0f, 1.0f }, + { 0.0f, 2.0f, 0.0f, 0.9f, 0.9f, 0.9f }, + { -1.0f, -12.5f, 0.0f, 1.8f, 1.8f, 1.8f }, + { -3.5f, 0.0f, 0.0f, 1.8f, 1.8f, 1.8f }, + { 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, 1.0f }, + { 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f }, + { 0.0f, -2.5f, 0.0f, 1.1f, 1.1f, 1.1f }, + { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f }, + { 0.0f, 5.5f, 0.0f, 0.4f, 0.4f, 0.4f }, + { 1.0f, -11.0f, 0.0f, 1.3f, 1.3f, 1.3f }, + { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f }, + { -1.1f, 2.5f, 0.0f, 0.4f, 0.4f, 0.4f }, +}; + +void fn_80186F6C(HSD_GObj* arg0) +{ + Vec3 pos; + HSD_JObj* jobj = arg0->hsd_obj; + HSD_JObj* child = lbl_804736B0.x8; + gm_80186F6C_Entry* entry = lbl_803D9498; + PAD_STACK(4); + + HSD_JObjGetTranslation(child, &pos); + + pos.x -= 7.0f; + pos.x += entry[lbl_804D6618.x0].x0; + pos.y += entry[lbl_804D6618.x0].x4; + pos.z += entry[lbl_804D6618.x0].x8; + + HSD_JObjSetTranslate(jobj, &pos); + + HSD_JObjSetScaleX(jobj, entry[lbl_804D6618.x0].xC); + HSD_JObjSetScaleY(jobj, entry[lbl_804D6618.x0].x10); + HSD_JObjSetScaleZ(jobj, entry[lbl_804D6618.x0].x14); + + { + HSD_GObj* entity2 = Player_GetEntityAtIndex(0, 1); + if (entity2 != NULL) { + HSD_JObj* jobj2 = entity2->hsd_obj; + + HSD_JObjGetTranslation(jobj, &pos); + pos.x += 3.0f; + pos.z -= 5.0f; + pos.y += 4.0f; + HSD_JObjSetTranslate(jobj2, &pos); + + HSD_JObjGetScale(jobj, &pos); + HSD_JObjSetScale(jobj2, &pos); + } + } +} + +#ifdef MUST_MATCH +#pragma push +#pragma dont_inline on +#endif +HSD_GObjProc* fn_801873F0(void) +{ + ftDemo_ObjAllocInit(); + Player_InitAllPlayers(); + Player_80036E20(lbl_804D6618.x0, lbl_804D6610, 1); + Player_SetPlayerCharacter(0, lbl_804D6618.x0); + Player_SetCostumeId(0, lbl_804D6618.x4); + Player_SetPlayerId(0, 0); + Player_SetSlottype(0, Gm_PKind_Demo); + Player_SetFacingDirection(0, 0.0f); + Player_SetModelScale(0, 1.0f); + Player_80036F34(0, 6); + return HSD_GObj_SetupProc(Player_GetEntity(0), fn_80186F6C, 0x16U); +} +#ifdef MUST_MATCH +#pragma pop +#endif + +void fn_80187494(HSD_GObj* gobj, int arg1) +{ + int temp_ret = HSD_CObjSetCurrent(gobj->hsd_obj); + PAD_STACK(4); + if (temp_ret != 0) { + Camera_800313E0(gobj, 1); + gobj->gxlink_prios = 0x801; + HSD_GObj_80390ED0(gobj, 7); + HSD_CObjEndCurrent(); + } +} + +void fn_801874FC(void) +{ + HSD_JObj* sp8; + HSD_GObj* gobj; + HSD_JObj* jobj; + + gobj = GObj_Create(0xE, 0xF, 0); + jobj = HSD_JObjLoadJoint(lbl_804D6614->models[0]->joint); + HSD_GObjObject_80390A70(gobj, HSD_GObj_JObjKind, jobj); + GObj_SetupGXLink(gobj, HSD_GObj_JObjCallback, 0xB, 0); + HSD_GObj_SetupProc(gobj, fn_80186EFC, 0); + gm_8016895C(jobj, lbl_804D6614->models[0], 0); + HSD_JObjReqAnimAll(jobj, 0.0f); + HSD_JObjAnimAll(jobj); + lb_80011E24(jobj, &sp8, 0x3A, -1); + HSD_JObjSetTranslateZ(sp8, 10000.0F); + lb_80011E24(jobj, &sp8, 0x3B, -1); + HSD_JObjSetTranslateZ(sp8, 10000.0F); + lb_80011E24(jobj, &lbl_804736B0.x8, 5, -1); + lb_80011E24(jobj, &lbl_804736B0.xC, 6, -1); +} + +/// #fn_801874FC + +#ifdef MUST_MATCH +#pragma push +#pragma dont_inline on +#endif +void fn_80187714(void) +{ + Camera_80028B9C(6); + lb_8000FCDC(); + mpColl_80041C78(); + Ground_801C0378(64); + Stage_802251E8(St_Kind_Dummy, NULL); + Stage_8022524C(); + Item_80266FA8(); + Item_80266FCC(); + efLib_Init(); + efAsync_LoadSync(0); +} +#ifdef MUST_MATCH +#pragma pop +#endif + +void gm_Scene_IntroAllstar_OnFrame(void) +{ + if (lbl_804736B0.x0 != 0) { + lbArchive_80016EFC(lbl_804D6610); + lbAudioAx_800236DC(); + gm_801A4B60(); + } +} + +#ifdef MUST_MATCH +#pragma push +#pragma dont_inline on +#endif +void gm_Scene_IntroAllstar_OnEnter(void* arg0_) +{ + struct enterdata* arg0 = arg0_; + HSD_GObj* temp_r30; + HSD_GObj* temp_r30_2; + HSD_GObj* temp_r30_3; + HSD_LObj* lobj; + HSD_CObj* cobj; + HSD_Fog* fog; + PAD_STACK(8); + + lbl_804736B0.x0 = 0; + lbl_804736B0.x4 = 0; + + lbl_804D6618 = *arg0; + fn_80187714(); + lbl_804D6610 = lbArchive_80016DBC("IrAls", &lbl_804D6614, + "ScItrAllstar_scene_data", 0); + + temp_r30 = GObj_Create(0x13, 0x14, 0); + cobj = HSD_CObjLoadDesc(lbl_804D6614->cameras[0].desc); + HSD_GObjObject_80390A70(temp_r30, HSD_GObj_CameraKind, cobj); + GObj_SetupGXLinkMax(temp_r30, fn_80187494, 8); + temp_r30->gxlink_prios = 0x801; + + temp_r30_2 = GObj_Create(0xB, 3, 0); + lobj = lb_80011AC4(lbl_804D6614->lights); + HSD_GObjObject_80390A70(temp_r30_2, HSD_GObj_LightKind, lobj); + GObj_SetupGXLink(temp_r30_2, HSD_GObj_LObjCallback, 0, 0); + fn_801874FC(); + + temp_r30_3 = GObj_Create(0xE, 0xF, 0); + fog = HSD_FogLoadDesc(lbl_804D6614->fogs[0].desc); + HSD_GObjObject_80390A70(temp_r30_3, HSD_GObj_FogKind, fog); + GObj_SetupGXLink(temp_r30_3, HSD_GObj_FogCallback, 0xB, 0); + fn_801873F0(); + lbAudioAx_80023F28(0x2D); +} +#ifdef MUST_MATCH +#pragma pop +#endif diff --git a/src/melee/gm/gm_186E.h b/src/melee/gm/gm_186E.h new file mode 100644 index 0000000000..719debf6b2 --- /dev/null +++ b/src/melee/gm/gm_186E.h @@ -0,0 +1,17 @@ +#ifndef MELEE_GM_186E_H +#define MELEE_GM_186E_H + +#include + +#include + +/* 186EFC */ void fn_80186EFC(HSD_GObj*); +/* 186F6C */ void fn_80186F6C(HSD_GObj*); +/* 1873F0 */ HSD_GObjProc* fn_801873F0(void); +/* 187494 */ void fn_80187494(HSD_GObj*, int); +/* 1874FC */ UNK_RET fn_801874FC(UNK_PARAMS); +/* 187714 */ UNK_RET fn_80187714(UNK_PARAMS); +/* 18776C */ void gm_Scene_IntroAllstar_OnFrame(void); +/* 1877A8 */ void gm_Scene_IntroAllstar_OnEnter(UNK_T); + +#endif diff --git a/src/melee/gm/gm_1879.c b/src/melee/gm/gm_1879.c new file mode 100644 index 0000000000..c47fed125a --- /dev/null +++ b/src/melee/gm/gm_1879.c @@ -0,0 +1,485 @@ +#include "gm_1879.h" + +#include "gm_unsplit.h" + +#include "cm/camera.h" +#include "dolphin/pad.h" +#include "ef/efasync.h" +#include "ef/eflib.h" +#include "ft/ftdemo.h" +#include "gm/gm_1601.h" +#include "gm/gm_1A36.h" +#include "gm/gm_1A3F.h" +#include "gm/gm_1A45.h" +#include "gm/types.h" +#include "gr/ground.h" +#include "gr/stage.h" +#include "it/item.h" +#include "lb/lb_00B0.h" +#include "lb/lb_00F9.h" +#include "lb/lbarchive.h" +#include "lb/lbaudio_ax.h" +#include "lb/lbbgflash.h" +#include "lb/lblanguage.h" +#include "lb/lbspdisplay.h" +#include "mn/inlines.h" +#include "mn/mnname.h" +#include "mp/mpcoll.h" +#include "pl/player.h" +#include "sc/types.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +typedef struct gm_1832_StageState { + u8 stage_index : 5; + u8 done : 1; + u8 flash : 1; + u8 active : 1; +} gm_1832_StageState; + +static struct gm_1832_804736C0_t { + DynamicModelDesc*** x0; + HSD_CameraAnim** x4; + HSD_GObj* x8; + u8 pad_C[0x28]; + u16 x34; + gm_1832_StageState x36; + struct { + u8 frame_counter : 4; + u8 anim_state : 2; + u8 state2 : 2; + } x37; + u8 x38; + u8 pad_39[7]; +} lbl_804736C0; +ASSERT_SIZE(struct gm_1832_804736C0_t, 0x40); +typedef struct gm_1832_804736C0_t gm_1832_804736C0_t; + +static inline void fn_80187AB4_LoadAnim(HSD_JObj* jobj, + gm_1832_804736C0_t* data) +{ + DynamicModelDesc* desc = (*data->x0)[11 - data->x36.stage_index]; + int anim_state; + + if (desc->anims != NULL) { + anim_state = data->x37.anim_state; + if (desc->anims[anim_state] != NULL) { + lb_8000C0E8(jobj, anim_state, desc); + HSD_JObjReqAnimAll(jobj, 0.0f); + HSD_JObjAnimAll(jobj); + } + } +} + +void fn_80187910(HSD_GObj* arg0) +{ + Vec3 sp10; + gm_1832_804736C0_t* data; + HSD_CObj* cobj; + s32 frame; + f32 scale; + + PAD_STACK(4); + (void) 0.0f; + data = &lbl_804736C0; + cobj = arg0->hsd_obj; + if (gm_GetButtonsTriggered(data->x38) & PAD_BUTTON_A) { + data->x37.frame_counter = (s32) cobj->eyepos->aobj->curr_frame / 300; + if (++data->x37.frame_counter >= 8U) { + data->x37.frame_counter = 0; + } + frame = data->x37.frame_counter * 0x12C; + HSD_CObjRemoveAnim(cobj); + HSD_CObjAddAnim(cobj, *(HSD_CameraAnim**) data->x4[1]); + HSD_CObjReqAnim(cobj, (f32) frame); + } + HSD_CObjAnim(cobj); + HSD_CObjGetInterest(cobj, &sp10); + scale = Ground_801C0498(); + sp10.x *= scale; + sp10.y *= scale; + sp10.z *= scale; + HSD_CObjSetInterest(cobj, &sp10); + HSD_CObjGetEyePosition(cobj, &sp10); + scale = Ground_801C0498(); + sp10.x *= scale; + sp10.y *= scale; + sp10.z *= scale; + HSD_CObjSetEyePosition(cobj, &sp10); +} + +typedef struct { + u8 pad_hi : 4; + u8 state : 2; + u8 pad_lo : 2; +} x37_state_bits; + +void fn_80187AB4(HSD_GObj* gobj) +{ + gm_1832_804736C0_t* data = &lbl_804736C0; + HSD_JObj* jobj = GET_JOBJ(gobj); + int state = data->x37.anim_state; + PAD_STACK(16); + + switch (state) { + case 0: + if (lb_8000B09C(jobj) == 0) { + data->x37.anim_state = 1; + fn_80187AB4_LoadAnim(jobj, data); + data->x34 = 0x960; + } + break; + case 1: + if ((u32) data->x36.active == 1U) { + data->x36.flash = 1; + } + if (data->x36.flash) { + data->x37.anim_state = 2; + data->x36.done = 1; + lbBgFlash_8002063C(1); + } + if (lb_8000B09C(jobj) == 0) { + fn_80187AB4_LoadAnim(jobj, data); + } + break; + case 2: + if (lb_8000B09C(jobj) == 0) { + data->x36.done = 1; + HSD_GObjPLink_80390228(gobj); + } + break; + } + HSD_JObjAnimAll(GET_JOBJ(gobj)); +} + +void fn_80187C9C(HSD_GObj* gobj, int arg1) +{ + GXSetZMode(0, GX_NEVER, 0); + HSD_GObj_JObjCallback(gobj, arg1); + HSD_StateInvalidate(0x40); +} + +void fn_80187CF4(HSD_GObj* gobj) +{ + gm_1832_804736C0_t* data = &lbl_804736C0; + HSD_JObj* jobj = gobj->hsd_obj; + int state = data->x37.state2; + DynamicModelDesc* desc; + int anim_state; + + switch (state) { + case 0: + if (lb_8000B09C(jobj) == 0) { + data->x37.state2 = 1; + anim_state = data->x37.state2; + desc = (*data->x0)[12]; + if (desc->anims[anim_state] != NULL) { + lb_8000C0E8(jobj, anim_state, desc); + HSD_JObjReqAnimAll(jobj, 0.0f); + HSD_JObjAnimAll(jobj); + } + } + break; + case 1: + if (lb_8000B09C(jobj) == 0) { + data->x37.state2 = 2; + anim_state = data->x37.state2; + desc = (*data->x0)[12]; + if (desc->anims[anim_state] != NULL) { + lb_8000C0E8(jobj, anim_state, desc); + HSD_JObjReqAnimAll(jobj, 0.0f); + HSD_JObjAnimAll(jobj); + } + } + break; + case 2: + if (gm_GetButtonsTriggered(data->x38) & PAD_BUTTON_START) { + sfxForward(); + data->x36.active = 1; + data->x37.state2 = 3; + anim_state = data->x37.state2; + desc = (*data->x0)[12]; + if (desc->anims[anim_state] != NULL) { + lb_8000C0E8(jobj, anim_state, desc); + HSD_JObjReqAnimAll(jobj, 0.0f); + HSD_JObjAnimAll(jobj); + } + } else if (lb_8000B09C(jobj) == 0) { + anim_state = data->x37.state2; + desc = (*data->x0)[12]; + if (desc->anims[anim_state] != NULL) { + lb_8000C0E8(jobj, anim_state, desc); + HSD_JObjReqAnimAll(jobj, 0.0f); + HSD_JObjAnimAll(jobj); + } + } + break; + case 3: + if (lb_8000B09C(jobj) == 0) { + HSD_GObjPLink_80390228(gobj); + } + break; + } + HSD_JObjAnimAll(gobj->hsd_obj); +} + +static char* lbl_803D9750[] = { + "mc01", + "mc02", + "mc03", + "mc04", + "mc05", + "mc06", + "mc07", + "mc08", + "mc09", + "mc10", + "mc11", + "mc12", + (char*) 0x1C, + (char*) 0x1C, + (char*) 0x1C, + (char*) 0x1C, + (char*) 0x1C, + (char*) 0x1C, + (char*) 0x1C, + (char*) 0x1C, + (char*) 0x1C, + (char*) 0x14, + (char*) 0x14, + (char*) 0x1C, + (char*) 0x20000, + (char*) 0x10000000, + (char*) 0x20, + (char*) 0x100, + (char*) 0x20000, + (char*) 0x10000, + (char*) 0x100, + (char*) 0x04000000, + (char*) 0x802, + (char*) 0x4000, + (char*) 8, + (char*) 0xC00, + (char*) 0x10000, + (char*) 0x01000000, + (char*) 0x20000, + (char*) 0x40, + (char*) 0x80, + (char*) 0x200000, + NULL, + (char*) 0x2000, + NULL, + (char*) 0x60000, + (char*) 0x200000, + (char*) 0x9000, + (char*) 0x53634974, + (char*) 0x724E6F72, + (char*) 0x6D616C5F, + (char*) 0x7363656E, + (char*) 0x655F6461, + (char*) 0x74610000, +}; + +static HSD_Archive* lbl_804D6620; + +typedef struct gm_80187F48_EnterData { + u8 x0; + u8 stage_index; + u16 stkind; +} gm_80187F48_EnterData; + +static inline StKind gm_GetStKind(gm_80187F48_EnterData* data) +{ + return data->stkind; +} + +static inline u64 gm_80187F48_GetAudioConfig(u8 stage_index, char** table) +{ + return lbAudioAx_80026E84(Player_GetPlayerCharacter(0)) | + ((u64*) &table[24])[stage_index]; +} + +static inline void gm_80187F48_SetupCamera(HSD_GObj* gobj, + gm_1832_804736C0_t* data, + HSD_CObj* cobj) +{ + HSD_GObj_SetupProc(gobj, fn_80187910, 0); + HSD_CObjAddAnim(cobj, *(HSD_CameraAnim**) data->x4[1]); + HSD_CObjReqAnim(cobj, 0.0f); +} + +static inline void gm_80187F48_OnEnter_inline(gm_80187F48_EnterData* arg0) +{ + gm_1832_804736C0_t* data; + char** table = lbl_803D9750; + HSD_CObj* cobj; + HSD_GObj* gobj; + u8 stage_index; + + data = &lbl_804736C0; + data->x38 = arg0->x0; + lb_8000FCDC(); + mpColl_80041C78(); + Ground_801C0378(0x40); + Stage_802251E8(gm_GetStKind(arg0), NULL); + Item_80266F70(); + Item_80266FCC(); + efLib_Init(); + efAsync_LoadSync(0); + efAsync_LoadSync(0x1F); + Stage_8022524C(); + Player_InitAllPlayers(); + lbBgFlash_800209F4(); + + stage_index = arg0->stage_index; + data->x37.anim_state = 0; + data->x37.frame_counter = 0; + data->x34 = 0; + data->x36.done = 0; + data->x36.flash = 0; + data->x36.stage_index = stage_index; + data->x37.state2 = 0; + data->x36.active = 0; + + stage_index = arg0->stage_index; + lbl_804D6620 = lbArchive_80016DBC("IrNml", &data->x0, &table[48], + &data->x4, table[stage_index], NULL); + + lbAudioAx_80026F2C((s32) table[stage_index + 12]); + lbAudioAx_8002702C((s32) table[stage_index + 12], + gm_80187F48_GetAudioConfig(stage_index, table)); + lbAudioAx_80027168(); + lbAudioAx_80027648(); + + gobj = GObj_Create(0x13, 0x14, 0); + data->x8 = gobj; + cobj = HSD_CObjLoadDesc((HSD_CObjDesc*) *data->x4); + HSD_GObjObject_80390A70(gobj, HSD_GObj_CameraKind, cobj); + GObj_SetupGXLinkMax(gobj, (GObj_RenderFunc) (Event) Camera_800304E0, 8); + gm_80187F48_SetupCamera(gobj, data, cobj); + + { + HSD_GObj* scene_gobj = GObj_Create(0x13, 0x14, 0); + HSD_CObj* scene_cobj = + HSD_CObjLoadDesc(((SceneDesc*) data->x0)->cameras[0].desc); + HSD_GObjObject_80390A70(scene_gobj, HSD_GObj_CameraKind, scene_cobj); + GObj_SetupGXLinkMax(scene_gobj, HSD_GObj_803910D8, 8); + scene_gobj->gxlink_prios = 0xC00; + } + + { + HSD_GObj* light_gobj = GObj_Create(0xB, 3, 0); + HSD_LObj* lobj = lb_80011AC4(((SceneDesc*) data->x0)->lights); + HSD_GObjObject_80390A70(light_gobj, HSD_GObj_LightKind, lobj); + GObj_SetupGXLink(light_gobj, HSD_GObj_LObjCallback, 0xA, 0); + } + + { + HSD_JObj* model_jobj; + HSD_GObj* model_gobj; + model_gobj = GObj_Create(0xE, 0xF, 0); + model_jobj = + HSD_JObjLoadJoint((*data->x0)[11 - data->x36.stage_index]->joint); + lb_80011C18(model_jobj, 0x08000000); + HSD_GObjObject_80390A70(model_gobj, HSD_GObj_JObjKind, model_jobj); + GObj_SetupGXLink(model_gobj, fn_80187C9C, 0xB, 0xB); + + fn_80187AB4_LoadAnim(model_jobj, data); + HSD_GObj_SetupProc(model_gobj, fn_80187AB4, 0); + } + + { + HSD_GObj* model_gobj = GObj_Create(0xE, 0xF, 0); + HSD_JObj* model_jobj = HSD_JObjLoadJoint((*data->x0)[12]->joint); + int model_anim_idx; + DynamicModelDesc* model_desc; + lb_80011C18(model_jobj, 0x08000000); + HSD_GObjObject_80390A70(model_gobj, HSD_GObj_JObjKind, model_jobj); + GObj_SetupGXLink(model_gobj, fn_80187C9C, 0xB, 0xB); + + model_anim_idx = data->x37.state2; + model_desc = (*data->x0)[12]; + if (model_desc->anims[model_anim_idx] != NULL) { + lb_8000C0E8(model_jobj, model_anim_idx, model_desc); + HSD_JObjReqAnimAll(model_jobj, 0.0f); + HSD_JObjAnimAll(model_jobj); + } + + HSD_JObjReqAnimAll(model_jobj, 0.0f); + HSD_JObjAnimAll(model_jobj); + HSD_GObj_SetupProc(model_gobj, fn_80187CF4, 0); + } + lbAudioAx_80023F28(0x2E); +} + +void gm_Scene_IntroNormal_OnEnter(void* arg0) +{ + PAD_STACK(16); + gm_80187F48_OnEnter_inline(arg0); +} + +void gm_Scene_IntroNormal_OnLeave(void* arg0) +{ + HSD_Archive** var = &lbl_804D6620; + lbArchive_80016EFC(*var); +} + +void gm_Scene_IntroNormal_OnFrame(void) +{ + if (lbl_804736C0.x36.done) { + gm_801A4B60(); + } +} + +f32 gm_801883C0(void) +{ + HSD_GObj* gobj; + HSD_CObj* cobj; + HSD_AObj* aobj; + + gobj = lbl_804736C0.x8; + if (gobj == NULL) { + goto return_default; + } + + cobj = gobj->hsd_obj; + goto check_cobj; + +return_default: + return 0.0f; + +check_cobj: + aobj = cobj->eyepos->aobj; + if (aobj != NULL) { + return aobj->curr_frame; + } + + aobj = cobj->interest->aobj; + if (aobj != NULL) { + return aobj->curr_frame; + } + + return 0.0f; +} + +bool gm_8018841C(void) +{ + if (gm_GetCurrentGameMode() == GM_TRAINING) { + return true; + } + return false; +} diff --git a/src/melee/gm/gm_1879.h b/src/melee/gm/gm_1879.h new file mode 100644 index 0000000000..a4d94b22fc --- /dev/null +++ b/src/melee/gm/gm_1879.h @@ -0,0 +1,18 @@ +#ifndef MELEE_GM_1879_H +#define MELEE_GM_1879_H + +#include + +#include + +/* 187910 */ void fn_80187910(HSD_GObj*); +/* 187AB4 */ void fn_80187AB4(HSD_GObj*); +/* 187C9C */ void fn_80187C9C(HSD_GObj*, int); +/* 187CF4 */ void fn_80187CF4(HSD_GObj*); +/* 187F48 */ void gm_Scene_IntroNormal_OnEnter(UNK_T); +/* 188364 */ void gm_Scene_IntroNormal_OnLeave(UNK_T); +/* 18838C */ void gm_Scene_IntroNormal_OnFrame(void); +/* 1883C0 */ f32 gm_801883C0(void); +/* 18841C */ bool gm_8018841C(void); + +#endif diff --git a/src/melee/gm/gm_unsplit.h b/src/melee/gm/gm_unsplit.h index 8855ebc5d1..d4d140d112 100644 --- a/src/melee/gm/gm_unsplit.h +++ b/src/melee/gm/gm_unsplit.h @@ -18,6 +18,8 @@ #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export +#include // IWYU pragma: export +#include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export diff --git a/src/melee/gr/grcorneria.c b/src/melee/gr/grcorneria.c index 01d4bfc8bc..f4687d5425 100644 --- a/src/melee/gr/grcorneria.c +++ b/src/melee/gr/grcorneria.c @@ -16,7 +16,7 @@ #include "cm/camera.h" #include "ft/ftlib.h" -#include "gm/gm_1832.h" +#include "gm/gm_1879.h" #include "gm/gm_1A45.h" #include "gm/gmregclear.h" #include "if/ifcoget.h" From 050de53b906d85cd63bc0f2f6d301a68efff7b2c Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Thu, 3 Sep 2026 13:31:22 -0700 Subject: [PATCH 05/15] Link gm_186E All eight All-Star intro functions and every data section match, so flip the unit to Matching and record the compiler's literal-pool names from `ninja apply`. The DOL stays byte-identical. --- config/GALE01/symbols.txt | 22 +++++++++++----------- configure.py | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/config/GALE01/symbols.txt b/config/GALE01/symbols.txt index f20e54213c..23e001e620 100644 --- a/config/GALE01/symbols.txt +++ b/config/GALE01/symbols.txt @@ -22210,7 +22210,7 @@ lbl_803D9468 = .data:0x803D9468; // type:object size:0xE data:string lbl_803D9478 = .data:0x803D9478; // type:object size:0xC data:string lbl_803D9484 = .data:0x803D9484; // type:object size:0x11 data:string lbl_803D9498 = .data:0x803D9498; // type:object size:0x2A0 -lbl_803D9738 = .data:0x803D9738; // type:object size:0x18 data:string +@369 = .data:0x803D9738; // type:object size:0x18 scope:local data:string lbl_803D9750 = .data:0x803D9750; // type:object size:0xD8 lbl_803D9828 = .data:0x803D9828; // type:object size:0x7C scope:local data:short jumptable_803D98A4 = .data:0x803D98A4; // type:object size:0x24 scope:local @@ -26998,9 +26998,9 @@ lbl_804D40A0 = .sdata:0x804D40A0; // type:object size:0x5 data:string lbl_804D40A8 = .sdata:0x804D40A8; // type:object size:0x6 data:string lbl_804D40B0 = .sdata:0x804D40B0; // type:object size:0x8 data:string lbl_804D40B8 = .sdata:0x804D40B8; // type:object size:0x2 data:string -lbl_804D40C0 = .sdata:0x804D40C0; // type:object size:0x7 data:string -lbl_804D40C8 = .sdata:0x804D40C8; // type:object size:0x5 data:string -lbl_804D40D0 = .sdata:0x804D40D0; // type:object size:0x6 data:string +@318 = .sdata:0x804D40C0; // type:object size:0x7 scope:local data:string +@319 = .sdata:0x804D40C8; // type:object size:0x5 scope:local data:string +@368 = .sdata:0x804D40D0; // type:object size:0x6 scope:local data:string lbl_804D40D8 = .sdata:0x804D40D8; // type:object size:0x5 data:string lbl_804D40E0 = .sdata:0x804D40E0; // type:object size:0x5 data:string lbl_804D40E8 = .sdata:0x804D40E8; // type:object size:0x5 data:string @@ -31639,13 +31639,13 @@ lbl_804DA5B0 = .sdata2:0x804DA5B0; // type:object size:0x8 align:8 data:double lbl_804DA5B8 = .sdata2:0x804DA5B8; // type:object size:0x4 align:4 data:float lbl_804DA5BC = .sdata2:0x804DA5BC; // type:object size:0x4 align:4 data:float lbl_804DA5C0 = .sdata2:0x804DA5C0; // type:object size:0x4 align:4 data:float -lbl_804DA5C8 = .sdata2:0x804DA5C8; // type:object size:0x4 align:4 data:float -lbl_804DA5CC = .sdata2:0x804DA5CC; // type:object size:0x4 align:4 data:float -lbl_804DA5D0 = .sdata2:0x804DA5D0; // type:object size:0x4 align:4 data:float -lbl_804DA5D4 = .sdata2:0x804DA5D4; // type:object size:0x4 align:4 data:float -lbl_804DA5D8 = .sdata2:0x804DA5D8; // type:object size:0x4 align:4 data:float -lbl_804DA5DC = .sdata2:0x804DA5DC; // type:object size:0x4 align:4 data:float -lbl_804DA5E0 = .sdata2:0x804DA5E0; // type:object size:0x4 align:4 data:float +@234 = .sdata2:0x804DA5C8; // type:object size:0x4 scope:local align:4 data:float +@320 = .sdata2:0x804DA5CC; // type:object size:0x4 scope:local align:4 data:float +@321 = .sdata2:0x804DA5D0; // type:object size:0x4 scope:local align:4 data:float +@322 = .sdata2:0x804DA5D4; // type:object size:0x4 scope:local align:4 data:float +@323 = .sdata2:0x804DA5D8; // type:object size:0x4 scope:local align:4 data:float +@325 = .sdata2:0x804DA5DC; // type:object size:0x4 scope:local align:4 data:float +@358 = .sdata2:0x804DA5E0; // type:object size:0x4 scope:local align:4 data:float lbl_804DA5E8 = .sdata2:0x804DA5E8; // type:object size:0x4 align:4 data:float lbl_804DA5F0 = .sdata2:0x804DA5F0; // type:object size:0x8 align:8 data:double lbl_804DA5F8 = .sdata2:0x804DA5F8; // type:object size:0x4 align:4 data:float diff --git a/configure.py b/configure.py index 7154dc90a6..fd46331edf 100755 --- a/configure.py +++ b/configure.py @@ -1155,7 +1155,7 @@ def MatchingFor(*versions): Object(Matching, "melee/gm/gmregcommon.c"), Object(Linkable, "melee/gm/gmregclear.c"), Object(Linkable, "melee/gm/gm_1832.c"), - Object(Linkable, "melee/gm/gm_186E.c"), + Object(Matching, "melee/gm/gm_186E.c"), Object(Linkable, "melee/gm/gm_1879.c"), Object(Linkable, "melee/gm/gm_1884.c"), Object(Linkable, "melee/gm/gmtoulib.c"), From e573c6203dd475001a13f23e1eaf93daab0a3e1f Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Thu, 3 Sep 2026 13:38:41 -0700 Subject: [PATCH 06/15] Correct gm_Scene_IntroNormal_OnEnter's stack padding The split unit needs 24 bytes of padding, not 16, to reach retail's 0x48 frame. --- src/melee/gm/gm_1879.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/melee/gm/gm_1879.c b/src/melee/gm/gm_1879.c index c47fed125a..7df61f40e2 100644 --- a/src/melee/gm/gm_1879.c +++ b/src/melee/gm/gm_1879.c @@ -428,7 +428,7 @@ static inline void gm_80187F48_OnEnter_inline(gm_80187F48_EnterData* arg0) void gm_Scene_IntroNormal_OnEnter(void* arg0) { - PAD_STACK(16); + PAD_STACK(24); gm_80187F48_OnEnter_inline(arg0); } From a8727627ed6519d19c9a947b14bda3d67381206a Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Thu, 3 Sep 2026 13:49:54 -0700 Subject: [PATCH 07/15] Trim gm_186E's unused includes and pool gm_1879's stage-state address The All-Star unit inherited the merged file's full include list; drop the twelve headers it does not need (object stays byte-identical). Reading the late stage index through a pooled `&data->x36` also recovers retail's addressing there, leaving gm_Scene_IntroNormal_OnEnter differing only in register assignment. --- src/melee/gm/gm_186E.c | 13 ------------- src/melee/gm/gm_1879.c | 3 ++- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/src/melee/gm/gm_186E.c b/src/melee/gm/gm_186E.c index e76594a40e..3ce4d33e70 100644 --- a/src/melee/gm/gm_186E.c +++ b/src/melee/gm/gm_186E.c @@ -3,27 +3,19 @@ #include "gm_unsplit.h" #include "cm/camera.h" -#include "dolphin/pad.h" #include "ef/efasync.h" #include "ef/eflib.h" #include "ft/ftdemo.h" #include "gm/gm_1601.h" -#include "gm/gm_1A36.h" -#include "gm/gm_1A3F.h" #include "gm/gm_1A45.h" -#include "gm/types.h" #include "gr/ground.h" #include "gr/stage.h" #include "it/item.h" -#include "lb/lb_00B0.h" #include "lb/lb_00F9.h" #include "lb/lbarchive.h" #include "lb/lbaudio_ax.h" -#include "lb/lbbgflash.h" #include "lb/lblanguage.h" #include "lb/lbspdisplay.h" -#include "mn/inlines.h" -#include "mn/mnname.h" #include "mp/mpcoll.h" #include "pl/player.h" #include "sc/types.h" @@ -34,13 +26,8 @@ #include #include #include -#include #include #include -#include -#include -#include -#include #include #include #include diff --git a/src/melee/gm/gm_1879.c b/src/melee/gm/gm_1879.c index 7df61f40e2..7ff46eed26 100644 --- a/src/melee/gm/gm_1879.c +++ b/src/melee/gm/gm_1879.c @@ -391,9 +391,10 @@ static inline void gm_80187F48_OnEnter_inline(gm_80187F48_EnterData* arg0) { HSD_JObj* model_jobj; HSD_GObj* model_gobj; + gm_1832_StageState* state = &data->x36; model_gobj = GObj_Create(0xE, 0xF, 0); model_jobj = - HSD_JObjLoadJoint((*data->x0)[11 - data->x36.stage_index]->joint); + HSD_JObjLoadJoint((*data->x0)[11 - state->stage_index]->joint); lb_80011C18(model_jobj, 0x08000000); HSD_GObjObject_80390A70(model_gobj, HSD_GObj_JObjKind, model_jobj); GObj_SetupGXLink(model_gobj, fn_80187C9C, 0xB, 0xB); From 8af6df161f478b7526c44203dfab0045edf99569 Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Thu, 3 Sep 2026 14:26:13 -0700 Subject: [PATCH 08/15] Match fn_801851C0 and link gm_1832 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The 0x1CC blob at 0x803D9248 is three adjacent statics — a 28-entry scale table, a 28-entry offset table and Samus's extra offset — not one struct behind a pointer. Spelled that way MWCC roots every access at the first array with the field offsets as displacements, which is retail's addressing, and the address web then ranks below the .bss root instead of above it. Flip the unit to Matching; the DOL stays byte-identical and `ninja apply` records the compiler's literal-pool names. --- config/GALE01/symbols.txt | 86 ++++++++++++++++++++------------------- configure.py | 2 +- src/melee/gm/gm_1832.c | 51 +++++++++++------------ 3 files changed, 70 insertions(+), 69 deletions(-) diff --git a/config/GALE01/symbols.txt b/config/GALE01/symbols.txt index 23e001e620..f5c6090217 100644 --- a/config/GALE01/symbols.txt +++ b/config/GALE01/symbols.txt @@ -22199,16 +22199,19 @@ lbl_803D8D08 = .data:0x803D8D08; // type:object size:0x480 @1966 = .data:0x803D91EC; // type:object size:0x19 scope:local data:string @1967 = .data:0x803D9208; // type:object size:0x1B scope:local data:string @1968 = .data:0x803D9224; // type:object size:0x1F scope:local data:string -lbl_803D9248 = .data:0x803D9248; // type:object size:0x1CC +gm_1832_CharScale = .data:0x803D9248; // type:object size:0x70 scope:local +...data.0 = .data:0x803D9248; // type:label scope:local +gm_1832_CharOffset = .data:0x803D92B8; // type:object size:0x150 scope:local +gm_1832_SamusOffset = .data:0x803D9408; // type:object size:0xC scope:local lbl_803D9414 = .data:0x803D9414; // type:object size:0xC data:byte -lbl_803D9420 = .data:0x803D9420; // type:object size:0x9 data:string -lbl_803D942C = .data:0x803D942C; // type:object size:0x9 data:string -lbl_803D9438 = .data:0x803D9438; // type:object size:0xC data:string +@755 = .data:0x803D9420; // type:object size:0x9 scope:local data:string +@756 = .data:0x803D942C; // type:object size:0x9 scope:local data:string +@757 = .data:0x803D9438; // type:object size:0x9 scope:local data:string lbl_803D9444 = .data:0x803D9444; // type:object size:0x18 data:string -lbl_803D945C = .data:0x803D945C; // type:object size:0xC data:string -lbl_803D9468 = .data:0x803D9468; // type:object size:0xE data:string -lbl_803D9478 = .data:0x803D9478; // type:object size:0xC data:string -lbl_803D9484 = .data:0x803D9484; // type:object size:0x11 data:string +@1074 = .data:0x803D945C; // type:object size:0xC scope:local data:string +@1075 = .data:0x803D9468; // type:object size:0xE scope:local data:string +@1198 = .data:0x803D9478; // type:object size:0xC scope:local data:string +@1199 = .data:0x803D9484; // type:object size:0x11 scope:local data:string lbl_803D9498 = .data:0x803D9498; // type:object size:0x2A0 @369 = .data:0x803D9738; // type:object size:0x18 scope:local data:string lbl_803D9750 = .data:0x803D9750; // type:object size:0xD8 @@ -26160,6 +26163,7 @@ lbl_80472EC8 = .bss:0x80472EC8; // type:object size:0x10 data:4byte lbl_80472ED8 = .bss:0x80472ED8; // type:object size:0x6BC data:4byte lbl_80473594 = .bss:0x80473594; // type:object size:0x14 data:byte lbl_804735A8 = .bss:0x804735A8; // type:object size:0x40 data:4byte +...bss.0 = .bss:0x804735A8; // type:label scope:local lbl_804735E8 = .bss:0x804735E8; // type:object size:0xA4 data:4byte lbl_8047368C = .bss:0x8047368C; // type:object size:0x24 data:4byte lbl_804736B0 = .bss:0x804736B0; // type:object size:0x10 data:4byte @@ -26992,12 +26996,12 @@ lbl_804D4078 = .sdata:0x804D4078; // type:object size:0x5 data:string lbl_804D4080 = .sdata:0x804D4080; // type:object size:0x6 data:string lbl_804D4088 = .sdata:0x804D4088; // type:object size:0x3 data:sjis lbl_804D408C = .sdata:0x804D408C; // type:object size:0x1 data:string -lbl_804D4090 = .sdata:0x804D4090; // type:object size:0x7 data:string -lbl_804D4098 = .sdata:0x804D4098; // type:object size:0x5 data:string +@558 = .sdata:0x804D4090; // type:object size:0x7 scope:local data:string +@559 = .sdata:0x804D4098; // type:object size:0x5 scope:local data:string lbl_804D40A0 = .sdata:0x804D40A0; // type:object size:0x5 data:string -lbl_804D40A8 = .sdata:0x804D40A8; // type:object size:0x6 data:string +@754 = .sdata:0x804D40A8; // type:object size:0x6 scope:local data:string lbl_804D40B0 = .sdata:0x804D40B0; // type:object size:0x8 data:string -lbl_804D40B8 = .sdata:0x804D40B8; // type:object size:0x2 data:string +@1109 = .sdata:0x804D40B8; // type:object size:0x2 scope:local data:string @318 = .sdata:0x804D40C0; // type:object size:0x7 scope:local data:string @319 = .sdata:0x804D40C8; // type:object size:0x5 scope:local data:string @368 = .sdata:0x804D40D0; // type:object size:0x6 scope:local data:string @@ -31610,35 +31614,35 @@ lbl_804DA520 = .sdata2:0x804DA520; // type:object size:0x4 align:4 data:float lbl_804DA524 = .sdata2:0x804DA524; // type:object size:0x4 align:4 data:float lbl_804DA528 = .sdata2:0x804DA528; // type:object size:0x4 align:4 data:float lbl_804DA530 = .sdata2:0x804DA530; // type:object size:0x8 align:8 data:double -lbl_804DA538 = .sdata2:0x804DA538; // type:object size:0x4 align:4 data:float -lbl_804DA53C = .sdata2:0x804DA53C; // type:object size:0x4 align:4 data:float -lbl_804DA540 = .sdata2:0x804DA540; // type:object size:0x4 align:4 data:float -lbl_804DA544 = .sdata2:0x804DA544; // type:object size:0x4 align:4 data:float -lbl_804DA548 = .sdata2:0x804DA548; // type:object size:0x4 align:4 data:float -lbl_804DA54C = .sdata2:0x804DA54C; // type:object size:0x4 align:4 data:float -lbl_804DA550 = .sdata2:0x804DA550; // type:object size:0x4 align:4 data:float -lbl_804DA554 = .sdata2:0x804DA554; // type:object size:0x4 align:4 data:float -lbl_804DA558 = .sdata2:0x804DA558; // type:object size:0x4 align:4 data:float -lbl_804DA55C = .sdata2:0x804DA55C; // type:object size:0x4 align:4 data:float -lbl_804DA560 = .sdata2:0x804DA560; // type:object size:0x8 align:8 data:double -lbl_804DA568 = .sdata2:0x804DA568; // type:object size:0x4 align:4 data:float -lbl_804DA56C = .sdata2:0x804DA56C; // type:object size:0x4 align:4 data:float -lbl_804DA570 = .sdata2:0x804DA570; // type:object size:0x4 align:4 data:float -lbl_804DA574 = .sdata2:0x804DA574; // type:object size:0x4 align:4 data:float -lbl_804DA578 = .sdata2:0x804DA578; // type:object size:0x4 align:4 data:float -lbl_804DA57C = .sdata2:0x804DA57C; // type:object size:0x4 align:4 data:float -lbl_804DA580 = .sdata2:0x804DA580; // type:object size:0x4 align:4 data:float -lbl_804DA584 = .sdata2:0x804DA584; // type:object size:0x4 align:4 data:float -lbl_804DA588 = .sdata2:0x804DA588; // type:object size:0x4 align:4 data:float -lbl_804DA58C = .sdata2:0x804DA58C; // type:object size:0x4 align:4 data:float -lbl_804DA590 = .sdata2:0x804DA590; // type:object size:0x4 align:4 data:float -lbl_804DA598 = .sdata2:0x804DA598; // type:object size:0x8 align:8 data:double -lbl_804DA5A0 = .sdata2:0x804DA5A0; // type:object size:0x8 align:8 data:double -lbl_804DA5A8 = .sdata2:0x804DA5A8; // type:object size:0x8 align:8 data:double -lbl_804DA5B0 = .sdata2:0x804DA5B0; // type:object size:0x8 align:8 data:double -lbl_804DA5B8 = .sdata2:0x804DA5B8; // type:object size:0x4 align:4 data:float -lbl_804DA5BC = .sdata2:0x804DA5BC; // type:object size:0x4 align:4 data:float -lbl_804DA5C0 = .sdata2:0x804DA5C0; // type:object size:0x4 align:4 data:float +@560 = .sdata2:0x804DA538; // type:object size:0x4 scope:local align:4 data:float +@561 = .sdata2:0x804DA53C; // type:object size:0x4 scope:local align:4 data:float +@562 = .sdata2:0x804DA540; // type:object size:0x4 scope:local align:4 data:float +@563 = .sdata2:0x804DA544; // type:object size:0x4 scope:local align:4 data:float +@564 = .sdata2:0x804DA548; // type:object size:0x4 scope:local align:4 data:float +@565 = .sdata2:0x804DA54C; // type:object size:0x4 scope:local align:4 data:float +@566 = .sdata2:0x804DA550; // type:object size:0x4 scope:local align:4 data:float +@567 = .sdata2:0x804DA554; // type:object size:0x4 scope:local align:4 data:float +@568 = .sdata2:0x804DA558; // type:object size:0x4 scope:local align:4 data:float +@745 = .sdata2:0x804DA55C; // type:object size:0x4 scope:local align:4 data:float +@747 = .sdata2:0x804DA560; // type:object size:0x8 scope:local align:8 data:double +@844 = .sdata2:0x804DA568; // type:object size:0x4 scope:local align:4 data:float +@845 = .sdata2:0x804DA56C; // type:object size:0x4 scope:local align:4 data:float +@909 = .sdata2:0x804DA570; // type:object size:0x4 scope:local align:4 data:float +@910 = .sdata2:0x804DA574; // type:object size:0x4 scope:local align:4 data:float +@911 = .sdata2:0x804DA578; // type:object size:0x4 scope:local align:4 data:float +@912 = .sdata2:0x804DA57C; // type:object size:0x4 scope:local align:4 data:float +@913 = .sdata2:0x804DA580; // type:object size:0x4 scope:local align:4 data:float +@914 = .sdata2:0x804DA584; // type:object size:0x4 scope:local align:4 data:float +@915 = .sdata2:0x804DA588; // type:object size:0x4 scope:local align:4 data:float +@916 = .sdata2:0x804DA58C; // type:object size:0x4 scope:local align:4 data:float +@917 = .sdata2:0x804DA590; // type:object size:0x4 scope:local align:4 data:float +@918 = .sdata2:0x804DA598; // type:object size:0x8 scope:local align:8 data:double +@919 = .sdata2:0x804DA5A0; // type:object size:0x8 scope:local align:8 data:double +@920 = .sdata2:0x804DA5A8; // type:object size:0x8 scope:local align:8 data:double +@921 = .sdata2:0x804DA5B0; // type:object size:0x8 scope:local align:8 data:double +@922 = .sdata2:0x804DA5B8; // type:object size:0x4 scope:local align:4 data:float +@923 = .sdata2:0x804DA5BC; // type:object size:0x4 scope:local align:4 data:float +@924 = .sdata2:0x804DA5C0; // type:object size:0x4 scope:local align:4 data:float @234 = .sdata2:0x804DA5C8; // type:object size:0x4 scope:local align:4 data:float @320 = .sdata2:0x804DA5CC; // type:object size:0x4 scope:local align:4 data:float @321 = .sdata2:0x804DA5D0; // type:object size:0x4 scope:local align:4 data:float diff --git a/configure.py b/configure.py index fd46331edf..3d1d8907cd 100755 --- a/configure.py +++ b/configure.py @@ -1154,7 +1154,7 @@ def MatchingFor(*versions): Object(Matching, "melee/gm/gm_17BA.c"), Object(Matching, "melee/gm/gmregcommon.c"), Object(Linkable, "melee/gm/gmregclear.c"), - Object(Linkable, "melee/gm/gm_1832.c"), + Object(Matching, "melee/gm/gm_1832.c"), Object(Matching, "melee/gm/gm_186E.c"), Object(Linkable, "melee/gm/gm_1879.c"), Object(Linkable, "melee/gm/gm_1884.c"), diff --git a/src/melee/gm/gm_1832.c b/src/melee/gm/gm_1832.c index 62c67cc5b0..1fe33093c9 100644 --- a/src/melee/gm/gm_1832.c +++ b/src/melee/gm/gm_1832.c @@ -348,29 +348,27 @@ void fn_80184A94(HSD_GObj* gobj) fn_80184138(gobj, 2); } -typedef struct ClassicCharData { - /* 0x000 */ f32 scale[28]; - /* 0x070 */ Vec3 offset[28]; - /* 0x1C0 */ Vec3 samus_extra; -} ClassicCharData; - -static ClassicCharData lbl_803D9248 = { - { 0.6f, 0.35f, 0.6f, 0.5f, 0.6f, 0.35f, 0.6f, 0.6f, 0.7f, 0.6f, - 0.5f, 0.6f, 0.6f, 0.6f, 0.5f, 0.5f, 0.6f, 0.5f, 0.6f, 0.6f, - 0.5f, 0.6f, 0.6f, 0.6f, 0.6f, 0.5f, 0.5f, 0.5f }, - { { 0.0f, -6.0f, 0.0f }, { 0.0f, -3.5f, 0.0f }, { -1.0f, -3.5f, 0.0f }, - { 0.0f, -3.5f, 0.0f }, { 0.0f, -1.0f, 0.0f }, { 0.0f, -3.0f, 0.0f }, - { 0.0f, -5.0f, 0.0f }, { 0.0f, -3.5f, 0.0f }, { 0.0f, -3.5f, 0.0f }, - { 0.0f, -3.5f, 0.0f }, { 0.0f, -3.0f, 0.0f }, { -0.5f, -3.5f, 0.0f }, - { -2.0f, -6.0f, 0.0f }, { 0.0f, -2.5f, 0.0f }, { 0.0f, -2.5f, 0.0f }, - { -1.0f, -1.0f, 0.0f }, { 0.0f, -5.0f, 0.0f }, { 0.0f, -3.0f, 0.0f }, - { -1.0f, -6.0f, 0.0f }, { -1.0f, -2.5f, 0.0f }, { -1.0f, -3.5f, 0.0f }, - { 0.0f, -3.5f, 0.0f }, { 0.0f, -4.0f, 0.0f }, { -1.0f, -3.5f, 0.0f }, - { 0.0f, -1.5f, 0.0f }, { 0.0f, -4.5f, 0.0f }, { 0.0f, -3.5f, 0.0f }, - { 0.0f, -3.5f, 0.0f } }, - { 3.0f, 4.0f, -5.0f }, +static f32 gm_1832_CharScale[28] = { 0.6f, 0.35f, 0.6f, 0.5f, 0.6f, 0.35f, + 0.6f, 0.6f, 0.7f, 0.6f, 0.5f, 0.6f, + 0.6f, 0.6f, 0.5f, 0.5f, 0.6f, 0.5f, + 0.6f, 0.6f, 0.5f, 0.6f, 0.6f, 0.6f, + 0.6f, 0.5f, 0.5f, 0.5f }; + +static Vec3 gm_1832_CharOffset[28] = { + { 0.0f, -6.0f, 0.0f }, { 0.0f, -3.5f, 0.0f }, { -1.0f, -3.5f, 0.0f }, + { 0.0f, -3.5f, 0.0f }, { 0.0f, -1.0f, 0.0f }, { 0.0f, -3.0f, 0.0f }, + { 0.0f, -5.0f, 0.0f }, { 0.0f, -3.5f, 0.0f }, { 0.0f, -3.5f, 0.0f }, + { 0.0f, -3.5f, 0.0f }, { 0.0f, -3.0f, 0.0f }, { -0.5f, -3.5f, 0.0f }, + { -2.0f, -6.0f, 0.0f }, { 0.0f, -2.5f, 0.0f }, { 0.0f, -2.5f, 0.0f }, + { -1.0f, -1.0f, 0.0f }, { 0.0f, -5.0f, 0.0f }, { 0.0f, -3.0f, 0.0f }, + { -1.0f, -6.0f, 0.0f }, { -1.0f, -2.5f, 0.0f }, { -1.0f, -3.5f, 0.0f }, + { 0.0f, -3.5f, 0.0f }, { 0.0f, -4.0f, 0.0f }, { -1.0f, -3.5f, 0.0f }, + { 0.0f, -1.5f, 0.0f }, { 0.0f, -4.5f, 0.0f }, { 0.0f, -3.5f, 0.0f }, + { 0.0f, -3.5f, 0.0f } }; +static Vec3 gm_1832_SamusOffset = { 3.0f, 4.0f, -5.0f }; + static char lbl_803D9414[] = { 0x82, 0x73, 0x82, 0x85, 0x82, 0x81, 0x82, 0x8D, 0, 0, 0, 0 }; @@ -555,22 +553,21 @@ s32 fn_801851C0(void) s32 result; for (i = 0; i < (s32) lbl_804735E8.xE0; i++) { - ClassicCharData* data = &lbl_803D9248; result = i + 1; Player_SetPlayerCharacter(result, (CharacterKind) lbl_8047368C.xF4[0]); Player_SetPlayerId(result, 0); Player_SetSlottype(result, Gm_PKind_Demo); Player_SetFacingDirection(result, 0.0f); Player_SetCostumeId(result, i); - pos = data->offset[lbl_8047368C.xF4[0]]; + pos = gm_1832_CharOffset[lbl_8047368C.xF4[0]]; Player_80032768(result, &pos); if (lbl_8047368C.xF4[0] == 0xE) { - pos.x += data->samus_extra.x; - pos.y += data->samus_extra.y; - pos.z += data->samus_extra.z; + pos.x += gm_1832_SamusOffset.x; + pos.y += gm_1832_SamusOffset.y; + pos.z += gm_1832_SamusOffset.z; Player_80032828(result, 1, &pos); } - Player_SetModelScale(result, data->scale[lbl_8047368C.xF4[0]]); + Player_SetModelScale(result, gm_1832_CharScale[lbl_8047368C.xF4[0]]); Player_SetFlagsBit5(result, lbl_8047368C.x100[0]); Player_80037054(result, 6); } From b57bf4bf6c1855039fd715e0f10272f608f9f31d Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Thu, 3 Sep 2026 14:45:01 -0700 Subject: [PATCH 09/15] Expand gm_80187F48_SetupCamera at its only call site The camera setup was split into a helper inline that retail does not have; expanding it and declaring gobj before cobj takes gm_Scene_IntroNormal_OnEnter from 98.28% to 99.73%, leaving twelve rows that differ only in register assignment. --- src/melee/gm/gm_1879.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/melee/gm/gm_1879.c b/src/melee/gm/gm_1879.c index 7ff46eed26..6c84ac8748 100644 --- a/src/melee/gm/gm_1879.c +++ b/src/melee/gm/gm_1879.c @@ -313,21 +313,12 @@ static inline u64 gm_80187F48_GetAudioConfig(u8 stage_index, char** table) ((u64*) &table[24])[stage_index]; } -static inline void gm_80187F48_SetupCamera(HSD_GObj* gobj, - gm_1832_804736C0_t* data, - HSD_CObj* cobj) -{ - HSD_GObj_SetupProc(gobj, fn_80187910, 0); - HSD_CObjAddAnim(cobj, *(HSD_CameraAnim**) data->x4[1]); - HSD_CObjReqAnim(cobj, 0.0f); -} - static inline void gm_80187F48_OnEnter_inline(gm_80187F48_EnterData* arg0) { gm_1832_804736C0_t* data; char** table = lbl_803D9750; - HSD_CObj* cobj; HSD_GObj* gobj; + HSD_CObj* cobj; u8 stage_index; data = &lbl_804736C0; @@ -370,7 +361,9 @@ static inline void gm_80187F48_OnEnter_inline(gm_80187F48_EnterData* arg0) cobj = HSD_CObjLoadDesc((HSD_CObjDesc*) *data->x4); HSD_GObjObject_80390A70(gobj, HSD_GObj_CameraKind, cobj); GObj_SetupGXLinkMax(gobj, (GObj_RenderFunc) (Event) Camera_800304E0, 8); - gm_80187F48_SetupCamera(gobj, data, cobj); + HSD_GObj_SetupProc(gobj, fn_80187910, 0); + HSD_CObjAddAnim(cobj, *(HSD_CameraAnim**) data->x4[1]); + HSD_CObjReqAnim(cobj, 0.0f); { HSD_GObj* scene_gobj = GObj_Create(0x13, 0x14, 0); From 8a8be797499576e500ef15468777c71b95bf6bcc Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Thu, 3 Sep 2026 14:50:53 -0700 Subject: [PATCH 10/15] Type the normal-intro stage table The 0xD8 blob at 0x803D9750 was declared as one char* array, which forced `&table[48]`, `table[stage_index + 12]` and `((u64*) &table[24])[stage_index]` at the use sites and spelled "ScItrNormal_scene_data" out as six (char*) word casts. It is four objects: twelve archive names, twelve bgm ids, twelve u64 audio masks and the scene-data name. Byte-identical .data and identical code. --- src/melee/gm/gm_1879.c | 86 +++++++++++------------------------------- 1 file changed, 23 insertions(+), 63 deletions(-) diff --git a/src/melee/gm/gm_1879.c b/src/melee/gm/gm_1879.c index 6c84ac8748..8245ebf683 100644 --- a/src/melee/gm/gm_1879.c +++ b/src/melee/gm/gm_1879.c @@ -237,63 +237,23 @@ void fn_80187CF4(HSD_GObj* gobj) HSD_JObjAnimAll(gobj->hsd_obj); } -static char* lbl_803D9750[] = { - "mc01", - "mc02", - "mc03", - "mc04", - "mc05", - "mc06", - "mc07", - "mc08", - "mc09", - "mc10", - "mc11", - "mc12", - (char*) 0x1C, - (char*) 0x1C, - (char*) 0x1C, - (char*) 0x1C, - (char*) 0x1C, - (char*) 0x1C, - (char*) 0x1C, - (char*) 0x1C, - (char*) 0x1C, - (char*) 0x14, - (char*) 0x14, - (char*) 0x1C, - (char*) 0x20000, - (char*) 0x10000000, - (char*) 0x20, - (char*) 0x100, - (char*) 0x20000, - (char*) 0x10000, - (char*) 0x100, - (char*) 0x04000000, - (char*) 0x802, - (char*) 0x4000, - (char*) 8, - (char*) 0xC00, - (char*) 0x10000, - (char*) 0x01000000, - (char*) 0x20000, - (char*) 0x40, - (char*) 0x80, - (char*) 0x200000, - NULL, - (char*) 0x2000, - NULL, - (char*) 0x60000, - (char*) 0x200000, - (char*) 0x9000, - (char*) 0x53634974, - (char*) 0x724E6F72, - (char*) 0x6D616C5F, - (char*) 0x7363656E, - (char*) 0x655F6461, - (char*) 0x74610000, +static char* gm_1832_NormalArchiveNames[12] = { + "mc01", "mc02", "mc03", "mc04", "mc05", "mc06", + "mc07", "mc08", "mc09", "mc10", "mc11", "mc12", }; +static s32 gm_1832_NormalBgmIds[12] = { 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, + 0x1C, 0x1C, 0x1C, 0x14, 0x14, 0x1C }; + +static u64 gm_1832_NormalAudioMasks[12] = { + 0x0002000010000000, 0x0000002000000100, 0x0002000000010000, + 0x0000010004000000, 0x0000080200004000, 0x0000000800000C00, + 0x0001000001000000, 0x0002000000000040, 0x0000008000200000, + 0x0000000000002000, 0x0000000000060000, 0x0020000000009000, +}; + +static char gm_1832_NormalSceneDataName[] = "ScItrNormal_scene_data"; + static HSD_Archive* lbl_804D6620; typedef struct gm_80187F48_EnterData { @@ -307,16 +267,15 @@ static inline StKind gm_GetStKind(gm_80187F48_EnterData* data) return data->stkind; } -static inline u64 gm_80187F48_GetAudioConfig(u8 stage_index, char** table) +static inline u64 gm_80187F48_GetAudioConfig(u8 stage_index) { return lbAudioAx_80026E84(Player_GetPlayerCharacter(0)) | - ((u64*) &table[24])[stage_index]; + gm_1832_NormalAudioMasks[stage_index]; } static inline void gm_80187F48_OnEnter_inline(gm_80187F48_EnterData* arg0) { gm_1832_804736C0_t* data; - char** table = lbl_803D9750; HSD_GObj* gobj; HSD_CObj* cobj; u8 stage_index; @@ -347,12 +306,13 @@ static inline void gm_80187F48_OnEnter_inline(gm_80187F48_EnterData* arg0) data->x36.active = 0; stage_index = arg0->stage_index; - lbl_804D6620 = lbArchive_80016DBC("IrNml", &data->x0, &table[48], - &data->x4, table[stage_index], NULL); + lbl_804D6620 = lbArchive_80016DBC( + "IrNml", &data->x0, gm_1832_NormalSceneDataName, &data->x4, + gm_1832_NormalArchiveNames[stage_index], NULL); - lbAudioAx_80026F2C((s32) table[stage_index + 12]); - lbAudioAx_8002702C((s32) table[stage_index + 12], - gm_80187F48_GetAudioConfig(stage_index, table)); + lbAudioAx_80026F2C(gm_1832_NormalBgmIds[stage_index]); + lbAudioAx_8002702C(gm_1832_NormalBgmIds[stage_index], + gm_80187F48_GetAudioConfig(stage_index)); lbAudioAx_80027168(); lbAudioAx_80027648(); From a8e6c61da323fadd9e0222bf99c4d0f472b4e8ba Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Thu, 3 Sep 2026 14:55:27 -0700 Subject: [PATCH 11/15] Scope the normal-intro stage index to its archive and audio setup Reading it into a block-local for the archive/BGM group instead of reusing the outer local matches retail's register assignment there; five rows left. --- src/melee/gm/gm_1879.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/melee/gm/gm_1879.c b/src/melee/gm/gm_1879.c index 8245ebf683..c9b3a984fb 100644 --- a/src/melee/gm/gm_1879.c +++ b/src/melee/gm/gm_1879.c @@ -305,14 +305,16 @@ static inline void gm_80187F48_OnEnter_inline(gm_80187F48_EnterData* arg0) data->x37.state2 = 0; data->x36.active = 0; - stage_index = arg0->stage_index; - lbl_804D6620 = lbArchive_80016DBC( - "IrNml", &data->x0, gm_1832_NormalSceneDataName, &data->x4, - gm_1832_NormalArchiveNames[stage_index], NULL); - - lbAudioAx_80026F2C(gm_1832_NormalBgmIds[stage_index]); - lbAudioAx_8002702C(gm_1832_NormalBgmIds[stage_index], - gm_80187F48_GetAudioConfig(stage_index)); + { + u8 si = arg0->stage_index; + lbl_804D6620 = lbArchive_80016DBC( + "IrNml", &data->x0, gm_1832_NormalSceneDataName, &data->x4, + gm_1832_NormalArchiveNames[si], NULL); + + lbAudioAx_80026F2C(gm_1832_NormalBgmIds[si]); + lbAudioAx_8002702C(gm_1832_NormalBgmIds[si], + gm_80187F48_GetAudioConfig(si)); + } lbAudioAx_80027168(); lbAudioAx_80027648(); From eadaf923679960fa5f4bd9300967e035e5645615 Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Thu, 3 Sep 2026 15:27:38 -0700 Subject: [PATCH 12/15] Type the normal-intro scene descriptor `x0` was declared `DynamicModelDesc***` and then cast to `SceneDesc*` for its camera and light lists; it is a SceneDesc, and `models` sits at offset 0 so `(*x0)[i]` and `x0->models[i]` compile identically. `x4` is likewise one SceneCameraDesc, whose `desc` and `anims` the old `*x4` / `*(HSD_CameraAnim**) x4[1]` spellings were reaching by offset. Every object is unchanged. --- src/melee/gm/gm_1879.c | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/melee/gm/gm_1879.c b/src/melee/gm/gm_1879.c index c9b3a984fb..084e5c66f7 100644 --- a/src/melee/gm/gm_1879.c +++ b/src/melee/gm/gm_1879.c @@ -52,8 +52,8 @@ typedef struct gm_1832_StageState { } gm_1832_StageState; static struct gm_1832_804736C0_t { - DynamicModelDesc*** x0; - HSD_CameraAnim** x4; + SceneDesc* x0; + struct SceneCameraDesc* x4; HSD_GObj* x8; u8 pad_C[0x28]; u16 x34; @@ -72,7 +72,7 @@ typedef struct gm_1832_804736C0_t gm_1832_804736C0_t; static inline void fn_80187AB4_LoadAnim(HSD_JObj* jobj, gm_1832_804736C0_t* data) { - DynamicModelDesc* desc = (*data->x0)[11 - data->x36.stage_index]; + DynamicModelDesc* desc = data->x0->models[11 - data->x36.stage_index]; int anim_state; if (desc->anims != NULL) { @@ -104,7 +104,7 @@ void fn_80187910(HSD_GObj* arg0) } frame = data->x37.frame_counter * 0x12C; HSD_CObjRemoveAnim(cobj); - HSD_CObjAddAnim(cobj, *(HSD_CameraAnim**) data->x4[1]); + HSD_CObjAddAnim(cobj, *data->x4->anims); HSD_CObjReqAnim(cobj, (f32) frame); } HSD_CObjAnim(cobj); @@ -186,7 +186,7 @@ void fn_80187CF4(HSD_GObj* gobj) if (lb_8000B09C(jobj) == 0) { data->x37.state2 = 1; anim_state = data->x37.state2; - desc = (*data->x0)[12]; + desc = data->x0->models[12]; if (desc->anims[anim_state] != NULL) { lb_8000C0E8(jobj, anim_state, desc); HSD_JObjReqAnimAll(jobj, 0.0f); @@ -198,7 +198,7 @@ void fn_80187CF4(HSD_GObj* gobj) if (lb_8000B09C(jobj) == 0) { data->x37.state2 = 2; anim_state = data->x37.state2; - desc = (*data->x0)[12]; + desc = data->x0->models[12]; if (desc->anims[anim_state] != NULL) { lb_8000C0E8(jobj, anim_state, desc); HSD_JObjReqAnimAll(jobj, 0.0f); @@ -212,7 +212,7 @@ void fn_80187CF4(HSD_GObj* gobj) data->x36.active = 1; data->x37.state2 = 3; anim_state = data->x37.state2; - desc = (*data->x0)[12]; + desc = data->x0->models[12]; if (desc->anims[anim_state] != NULL) { lb_8000C0E8(jobj, anim_state, desc); HSD_JObjReqAnimAll(jobj, 0.0f); @@ -220,7 +220,7 @@ void fn_80187CF4(HSD_GObj* gobj) } } else if (lb_8000B09C(jobj) == 0) { anim_state = data->x37.state2; - desc = (*data->x0)[12]; + desc = data->x0->models[12]; if (desc->anims[anim_state] != NULL) { lb_8000C0E8(jobj, anim_state, desc); HSD_JObjReqAnimAll(jobj, 0.0f); @@ -320,17 +320,16 @@ static inline void gm_80187F48_OnEnter_inline(gm_80187F48_EnterData* arg0) gobj = GObj_Create(0x13, 0x14, 0); data->x8 = gobj; - cobj = HSD_CObjLoadDesc((HSD_CObjDesc*) *data->x4); + cobj = HSD_CObjLoadDesc(data->x4->desc); HSD_GObjObject_80390A70(gobj, HSD_GObj_CameraKind, cobj); GObj_SetupGXLinkMax(gobj, (GObj_RenderFunc) (Event) Camera_800304E0, 8); HSD_GObj_SetupProc(gobj, fn_80187910, 0); - HSD_CObjAddAnim(cobj, *(HSD_CameraAnim**) data->x4[1]); + HSD_CObjAddAnim(cobj, *data->x4->anims); HSD_CObjReqAnim(cobj, 0.0f); { HSD_GObj* scene_gobj = GObj_Create(0x13, 0x14, 0); - HSD_CObj* scene_cobj = - HSD_CObjLoadDesc(((SceneDesc*) data->x0)->cameras[0].desc); + HSD_CObj* scene_cobj = HSD_CObjLoadDesc(data->x0->cameras[0].desc); HSD_GObjObject_80390A70(scene_gobj, HSD_GObj_CameraKind, scene_cobj); GObj_SetupGXLinkMax(scene_gobj, HSD_GObj_803910D8, 8); scene_gobj->gxlink_prios = 0xC00; @@ -338,7 +337,7 @@ static inline void gm_80187F48_OnEnter_inline(gm_80187F48_EnterData* arg0) { HSD_GObj* light_gobj = GObj_Create(0xB, 3, 0); - HSD_LObj* lobj = lb_80011AC4(((SceneDesc*) data->x0)->lights); + HSD_LObj* lobj = lb_80011AC4(data->x0->lights); HSD_GObjObject_80390A70(light_gobj, HSD_GObj_LightKind, lobj); GObj_SetupGXLink(light_gobj, HSD_GObj_LObjCallback, 0xA, 0); } @@ -348,8 +347,8 @@ static inline void gm_80187F48_OnEnter_inline(gm_80187F48_EnterData* arg0) HSD_GObj* model_gobj; gm_1832_StageState* state = &data->x36; model_gobj = GObj_Create(0xE, 0xF, 0); - model_jobj = - HSD_JObjLoadJoint((*data->x0)[11 - state->stage_index]->joint); + model_jobj = HSD_JObjLoadJoint( + data->x0->models[11 - state->stage_index]->joint); lb_80011C18(model_jobj, 0x08000000); HSD_GObjObject_80390A70(model_gobj, HSD_GObj_JObjKind, model_jobj); GObj_SetupGXLink(model_gobj, fn_80187C9C, 0xB, 0xB); @@ -360,7 +359,7 @@ static inline void gm_80187F48_OnEnter_inline(gm_80187F48_EnterData* arg0) { HSD_GObj* model_gobj = GObj_Create(0xE, 0xF, 0); - HSD_JObj* model_jobj = HSD_JObjLoadJoint((*data->x0)[12]->joint); + HSD_JObj* model_jobj = HSD_JObjLoadJoint(data->x0->models[12]->joint); int model_anim_idx; DynamicModelDesc* model_desc; lb_80011C18(model_jobj, 0x08000000); @@ -368,7 +367,7 @@ static inline void gm_80187F48_OnEnter_inline(gm_80187F48_EnterData* arg0) GObj_SetupGXLink(model_gobj, fn_80187C9C, 0xB, 0xB); model_anim_idx = data->x37.state2; - model_desc = (*data->x0)[12]; + model_desc = data->x0->models[12]; if (model_desc->anims[model_anim_idx] != NULL) { lb_8000C0E8(model_jobj, model_anim_idx, model_desc); HSD_JObjReqAnimAll(model_jobj, 0.0f); From 2b07851120ad018c625ec9d7a98a350af8bf74ec Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Thu, 3 Sep 2026 16:26:03 -0700 Subject: [PATCH 13/15] Match gm_Scene_IntroNormal_OnEnter The first intro model's anim setup is expanded at its call site rather than routed through fn_80187AB4_LoadAnim, so its locals live in the caller's block scope instead of the inline's temp band. --- src/melee/gm/gm_1879.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/melee/gm/gm_1879.c b/src/melee/gm/gm_1879.c index 084e5c66f7..166d31c51c 100644 --- a/src/melee/gm/gm_1879.c +++ b/src/melee/gm/gm_1879.c @@ -346,6 +346,11 @@ static inline void gm_80187F48_OnEnter_inline(gm_80187F48_EnterData* arg0) HSD_JObj* model_jobj; HSD_GObj* model_gobj; gm_1832_StageState* state = &data->x36; + DynamicModelDesc* model_desc; + HSD_AnimJoint** anims; + int model_stage; + int model_anim_idx; + model_gobj = GObj_Create(0xE, 0xF, 0); model_jobj = HSD_JObjLoadJoint( data->x0->models[11 - state->stage_index]->joint); @@ -353,7 +358,18 @@ static inline void gm_80187F48_OnEnter_inline(gm_80187F48_EnterData* arg0) HSD_GObjObject_80390A70(model_gobj, HSD_GObj_JObjKind, model_jobj); GObj_SetupGXLink(model_gobj, fn_80187C9C, 0xB, 0xB); - fn_80187AB4_LoadAnim(model_jobj, data); + model_stage = state->stage_index; + (void) model_stage; + model_desc = data->x0->models[11 - model_stage]; + anims = model_desc->anims; + if (anims != NULL) { + model_anim_idx = data->x37.anim_state; + if (anims[model_anim_idx] != NULL) { + lb_8000C0E8(model_jobj, model_anim_idx, model_desc); + HSD_JObjReqAnimAll(model_jobj, 0.0f); + HSD_JObjAnimAll(model_jobj); + } + } HSD_GObj_SetupProc(model_gobj, fn_80187AB4, 0); } @@ -383,7 +399,7 @@ static inline void gm_80187F48_OnEnter_inline(gm_80187F48_EnterData* arg0) void gm_Scene_IntroNormal_OnEnter(void* arg0) { - PAD_STACK(24); + PAD_STACK(32); gm_80187F48_OnEnter_inline(arg0); } From 2678b62758bcb50da7a8d1023b02b9da2babd908 Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Thu, 3 Sep 2026 16:26:07 -0700 Subject: [PATCH 14/15] Mark gm_1879 as matching --- config/GALE01/symbols.txt | 37 +++++++++++++++++++++---------------- configure.py | 2 +- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/config/GALE01/symbols.txt b/config/GALE01/symbols.txt index f5c6090217..7671c1ecd1 100644 --- a/config/GALE01/symbols.txt +++ b/config/GALE01/symbols.txt @@ -22214,7 +22214,11 @@ lbl_803D9444 = .data:0x803D9444; // type:object size:0x18 data:string @1199 = .data:0x803D9484; // type:object size:0x11 scope:local data:string lbl_803D9498 = .data:0x803D9498; // type:object size:0x2A0 @369 = .data:0x803D9738; // type:object size:0x18 scope:local data:string -lbl_803D9750 = .data:0x803D9750; // type:object size:0xD8 +gm_1832_NormalArchiveNames = .data:0x803D9750; // type:object size:0x30 scope:local +...data.0 = .data:0x803D9750; // type:label scope:local +gm_1832_NormalBgmIds = .data:0x803D9780; // type:object size:0x30 scope:local +gm_1832_NormalAudioMasks = .data:0x803D97B0; // type:object size:0x60 scope:local +gm_1832_NormalSceneDataName = .data:0x803D9810; // type:object size:0x17 scope:local data:string lbl_803D9828 = .data:0x803D9828; // type:object size:0x7C scope:local data:short jumptable_803D98A4 = .data:0x803D98A4; // type:object size:0x24 scope:local lbl_803D98C8 = .data:0x803D98C8; // type:object size:0x1B data:string @@ -26168,6 +26172,7 @@ lbl_804735E8 = .bss:0x804735E8; // type:object size:0xA4 data:4byte lbl_8047368C = .bss:0x8047368C; // type:object size:0x24 data:4byte lbl_804736B0 = .bss:0x804736B0; // type:object size:0x10 data:4byte lbl_804736C0 = .bss:0x804736C0; // type:object size:0x40 data:4byte +...bss.0 = .bss:0x804736C0; // type:label scope:local lbl_80473700 = .bss:0x80473700; // type:object size:0x114 data:4byte gm_80473814 = .bss:0x80473814; // type:object size:0x204 scope:global data:byte gm_80473A18 = .bss:0x80473A18; // type:object size:0xA0 scope:global data:byte @@ -27005,19 +27010,19 @@ lbl_804D40B0 = .sdata:0x804D40B0; // type:object size:0x8 data:string @318 = .sdata:0x804D40C0; // type:object size:0x7 scope:local data:string @319 = .sdata:0x804D40C8; // type:object size:0x5 scope:local data:string @368 = .sdata:0x804D40D0; // type:object size:0x6 scope:local data:string -lbl_804D40D8 = .sdata:0x804D40D8; // type:object size:0x5 data:string -lbl_804D40E0 = .sdata:0x804D40E0; // type:object size:0x5 data:string -lbl_804D40E8 = .sdata:0x804D40E8; // type:object size:0x5 data:string -lbl_804D40F0 = .sdata:0x804D40F0; // type:object size:0x5 data:string -lbl_804D40F8 = .sdata:0x804D40F8; // type:object size:0x5 data:string -lbl_804D4100 = .sdata:0x804D4100; // type:object size:0x5 data:string -lbl_804D4108 = .sdata:0x804D4108; // type:object size:0x5 data:string -lbl_804D4110 = .sdata:0x804D4110; // type:object size:0x5 data:string -lbl_804D4118 = .sdata:0x804D4118; // type:object size:0x5 data:string -lbl_804D4120 = .sdata:0x804D4120; // type:object size:0x5 data:string -lbl_804D4128 = .sdata:0x804D4128; // type:object size:0x5 data:string -lbl_804D4130 = .sdata:0x804D4130; // type:object size:0x5 data:string -lbl_804D4138 = .sdata:0x804D4138; // type:object size:0x6 data:string +@319 = .sdata:0x804D40D8; // type:object size:0x5 scope:local data:string +@320 = .sdata:0x804D40E0; // type:object size:0x5 scope:local data:string +@321 = .sdata:0x804D40E8; // type:object size:0x5 scope:local data:string +@322 = .sdata:0x804D40F0; // type:object size:0x5 scope:local data:string +@323 = .sdata:0x804D40F8; // type:object size:0x5 scope:local data:string +@324 = .sdata:0x804D4100; // type:object size:0x5 scope:local data:string +@325 = .sdata:0x804D4108; // type:object size:0x5 scope:local data:string +@326 = .sdata:0x804D4110; // type:object size:0x5 scope:local data:string +@327 = .sdata:0x804D4118; // type:object size:0x5 scope:local data:string +@328 = .sdata:0x804D4120; // type:object size:0x5 scope:local data:string +@329 = .sdata:0x804D4128; // type:object size:0x5 scope:local data:string +@330 = .sdata:0x804D4130; // type:object size:0x5 scope:local data:string +@380 = .sdata:0x804D4138; // type:object size:0x6 scope:local data:string lbl_804D4140 = .sdata:0x804D4140; // type:object size:0x7 data:string lbl_804D4148 = .sdata:0x804D4148; // type:object size:0x5 data:string lbl_804D4150 = .sdata:0x804D4150; // type:object size:0x8 data:string @@ -31650,8 +31655,8 @@ lbl_804DA530 = .sdata2:0x804DA530; // type:object size:0x8 align:8 data:double @323 = .sdata2:0x804DA5D8; // type:object size:0x4 scope:local align:4 data:float @325 = .sdata2:0x804DA5DC; // type:object size:0x4 scope:local align:4 data:float @358 = .sdata2:0x804DA5E0; // type:object size:0x4 scope:local align:4 data:float -lbl_804DA5E8 = .sdata2:0x804DA5E8; // type:object size:0x4 align:4 data:float -lbl_804DA5F0 = .sdata2:0x804DA5F0; // type:object size:0x8 align:8 data:double +@240 = .sdata2:0x804DA5E8; // type:object size:0x4 scope:local align:4 data:float +@242 = .sdata2:0x804DA5F0; // type:object size:0x8 scope:local align:8 data:double lbl_804DA5F8 = .sdata2:0x804DA5F8; // type:object size:0x4 align:4 data:float lbl_804DA600 = .sdata2:0x804DA600; // type:object size:0x8 align:8 data:double lbl_804DA608 = .sdata2:0x804DA608; // type:object size:0x4 align:4 data:float diff --git a/configure.py b/configure.py index 3d1d8907cd..f3bdd10972 100755 --- a/configure.py +++ b/configure.py @@ -1156,7 +1156,7 @@ def MatchingFor(*versions): Object(Linkable, "melee/gm/gmregclear.c"), Object(Matching, "melee/gm/gm_1832.c"), Object(Matching, "melee/gm/gm_186E.c"), - Object(Linkable, "melee/gm/gm_1879.c"), + Object(Matching, "melee/gm/gm_1879.c"), Object(Linkable, "melee/gm/gm_1884.c"), Object(Linkable, "melee/gm/gmtoulib.c"), Object(Matching, "melee/gm/gmtou_0.c"), From 62778fdc9c622a93bc1ce75a403aca0f8a5d529d Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Thu, 3 Sep 2026 16:35:33 -0700 Subject: [PATCH 15/15] Drop the intro TUs' unused includes clang-tidy's misc-include-cleaner is enabled repository-wide and the CI hook runs with --fix, so an unused include fails the Ninja (GALE01, clang) job. --- src/melee/gm/gm_1832.c | 7 ------- src/melee/gm/gm_186E.c | 2 -- src/melee/gm/gm_1879.c | 8 -------- 3 files changed, 17 deletions(-) diff --git a/src/melee/gm/gm_1832.c b/src/melee/gm/gm_1832.c index 1fe33093c9..66de49f315 100644 --- a/src/melee/gm/gm_1832.c +++ b/src/melee/gm/gm_1832.c @@ -3,26 +3,19 @@ #include "gm_unsplit.h" #include "cm/camera.h" -#include "dolphin/pad.h" #include "ef/efasync.h" #include "ef/eflib.h" #include "ft/ftdemo.h" #include "gm/gm_1601.h" -#include "gm/gm_1A36.h" -#include "gm/gm_1A3F.h" #include "gm/gm_1A45.h" -#include "gm/types.h" #include "gr/ground.h" #include "gr/stage.h" #include "it/item.h" -#include "lb/lb_00B0.h" #include "lb/lb_00F9.h" #include "lb/lbarchive.h" #include "lb/lbaudio_ax.h" -#include "lb/lbbgflash.h" #include "lb/lblanguage.h" #include "lb/lbspdisplay.h" -#include "mn/inlines.h" #include "mn/mnname.h" #include "mp/mpcoll.h" #include "pl/player.h" diff --git a/src/melee/gm/gm_186E.c b/src/melee/gm/gm_186E.c index 3ce4d33e70..03360ebc96 100644 --- a/src/melee/gm/gm_186E.c +++ b/src/melee/gm/gm_186E.c @@ -14,7 +14,6 @@ #include "lb/lb_00F9.h" #include "lb/lbarchive.h" #include "lb/lbaudio_ax.h" -#include "lb/lblanguage.h" #include "lb/lbspdisplay.h" #include "mp/mpcoll.h" #include "pl/player.h" @@ -29,7 +28,6 @@ #include #include #include -#include #include static HSD_Archive* lbl_804D6610; static SceneDesc* lbl_804D6614; diff --git a/src/melee/gm/gm_1879.c b/src/melee/gm/gm_1879.c index 166d31c51c..1ec11d9293 100644 --- a/src/melee/gm/gm_1879.c +++ b/src/melee/gm/gm_1879.c @@ -6,8 +6,6 @@ #include "dolphin/pad.h" #include "ef/efasync.h" #include "ef/eflib.h" -#include "ft/ftdemo.h" -#include "gm/gm_1601.h" #include "gm/gm_1A36.h" #include "gm/gm_1A3F.h" #include "gm/gm_1A45.h" @@ -20,10 +18,8 @@ #include "lb/lbarchive.h" #include "lb/lbaudio_ax.h" #include "lb/lbbgflash.h" -#include "lb/lblanguage.h" #include "lb/lbspdisplay.h" #include "mn/inlines.h" -#include "mn/mnname.h" #include "mp/mpcoll.h" #include "pl/player.h" #include "sc/types.h" @@ -37,12 +33,8 @@ #include #include #include -#include -#include -#include #include #include -#include #include typedef struct gm_1832_StageState { u8 stage_index : 5;