From d1ce5ab8581c8f07d9c8aa7083fd1c7ce5be2451 Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Mon, 20 Oct 2025 12:52:58 +0200 Subject: [PATCH 01/15] Occurences of gLoadedSaveGame -> LOADED_SAVE --- src/game/multiboot/connection.c | 2 +- src/game/stage/player.c | 2 +- src/game/stage/stage.c | 16 ++-------------- 3 files changed, 4 insertions(+), 16 deletions(-) diff --git a/src/game/multiboot/connection.c b/src/game/multiboot/connection.c index f6fab8ca65..c4c4f88d98 100644 --- a/src/game/multiboot/connection.c +++ b/src/game/multiboot/connection.c @@ -292,7 +292,7 @@ void StartSinglePakConnect(void) t = TaskCreate(sub_8081604, sizeof(struct SinglePakConnectScreen), 0x2000, 0, NULL); connectScreen = TASK_DATA(t); - connectScreen->unkFA = gLoadedSaveGame->language; + connectScreen->unkFA = LOADED_SAVE->language; if ((u8)LanguageIndex(connectScreen->unkFA) > LanguageIndex(LANG_ITALIAN)) { connectScreen->unkFA = 1; diff --git a/src/game/stage/player.c b/src/game/stage/player.c index 3759fe1879..68202cebd1 100644 --- a/src/game/stage/player.c +++ b/src/game/stage/player.c @@ -3475,7 +3475,7 @@ void Task_PlayerHandleDeath(void) if (IS_SINGLE_PLAYER) { TaskDestroy(gCurTask); - if ((!gLoadedSaveGame->timeLimitDisabled + if ((!LOADED_SAVE->timeLimitDisabled && (gCourseTime > MAX_COURSE_TIME || (gStageFlags & STAGE_FLAG__TIMER_REVERSED && gCourseTime == 0))) || ((gGameMode == GAME_MODE_TIME_ATTACK || gGameMode == GAME_MODE_BOSS_TIME_ATTACK) && gCourseTime > MAX_COURSE_TIME)) { HandleDeath(); diff --git a/src/game/stage/stage.c b/src/game/stage/stage.c index c45b05380e..a4d7fd84de 100644 --- a/src/game/stage/stage.c +++ b/src/game/stage/stage.c @@ -414,15 +414,9 @@ void Task_GameStage(void) if (IS_SINGLE_PLAYER) { gStageFlags |= STAGE_FLAG__ACT_START; -#if (GAME == GAME_SA1) - if (gLoadedSaveGame.timeLimitDisabled) { + if (LOADED_SAVE->timeLimitDisabled) { return; } -#elif (GAME == GAME_SA2) - if (gLoadedSaveGame->timeLimitDisabled) { - return; - } -#endif gPlayer.itemEffect = 0; @@ -463,15 +457,9 @@ void Task_GameStage(void) if (IS_SINGLE_PLAYER) { gStageFlags |= STAGE_FLAG__ACT_START; -#if (GAME == GAME_SA1) - if (gLoadedSaveGame.timeLimitDisabled && (gGameMode == GAME_MODE_SINGLE_PLAYER || IS_MULTI_PLAYER)) { + if (LOADED_SAVE->timeLimitDisabled && (gGameMode == GAME_MODE_SINGLE_PLAYER || IS_MULTI_PLAYER)) { return; } -#elif (GAME == GAME_SA2) - if (gLoadedSaveGame->timeLimitDisabled && (gGameMode == GAME_MODE_SINGLE_PLAYER || IS_MULTI_PLAYER)) { - return; - } -#endif gPlayer.itemEffect = 0; From ac2eb9e74d11356c4e822ceca97e98bf4a5aba24 Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Mon, 20 Oct 2025 12:54:51 +0200 Subject: [PATCH 02/15] More occurences of gLoadedSaveGame -> LOADED_SAVE --- src/game/character_select.c | 2 +- src/game/stage/results.c | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/game/character_select.c b/src/game/character_select.c index f08fa9f29b..1989cc73cd 100644 --- a/src/game/character_select.c +++ b/src/game/character_select.c @@ -1596,7 +1596,7 @@ static void Task_MultiplayerWaitForSelections(void) union MultiSioData *send, *recv; u32 i, j; Sprite *s; - u8 charactersSelected[NUM_CHARACTERS] = { 0, 0, 0, 0, 0 }; + u8 charactersSelected[NUM_CHARACTERS] = { 0 }; struct CharacterSelectionScreen *characterScreen = TASK_DATA(gCurTask); BackgroundAnim(); diff --git a/src/game/stage/results.c b/src/game/stage/results.c index 0061deb6eb..7002203f37 100644 --- a/src/game/stage/results.c +++ b/src/game/stage/results.c @@ -80,7 +80,7 @@ u16 CreateStageResults(u32 courseTime, u16 ringCount, u8 spRingCount) u32 zero = 0; #endif - gLoadedSaveGame->score += (s16)gRingCount; + LOADED_SAVE->score += (s16)gRingCount; t = TaskCreate(Task_UpdateStageResults, sizeof(StageResults), 0xC100, 0, TaskDestructor_StageResults); outro = TASK_DATA(t); @@ -345,7 +345,7 @@ static void Task_UpdateStageResults(void) if (counter > outro->base.unk16C + 309) { if (IS_FINAL_STAGE(gCurrentLevel)) { if ((gMPlayInfo_BGM.status & 0xFFFF) == 0) { - gLoadedSaveGame->unlockedLevels[gSelectedCharacter] = LEVEL_INDEX(ZONE_FINAL, ACT_TRUE_AREA_53); + LOADED_SAVE->unlockedLevels[gSelectedCharacter] = LEVEL_INDEX(ZONE_FINAL, ACT_TRUE_AREA_53); WriteSaveGame(); TasksDestroyAll(); @@ -362,7 +362,7 @@ static void Task_UpdateStageResults(void) } else if (IS_EXTRA_STAGE(gCurrentLevel)) { if ((gMPlayInfo_BGM.status & 0xFFFF) == 0) { gCurrentLevel++; - gLoadedSaveGame->unlockedLevels[gSelectedCharacter] = gCurrentLevel; + LOADED_SAVE->unlockedLevels[gSelectedCharacter] = gCurrentLevel; TasksDestroyAll(); @@ -393,42 +393,42 @@ static void Task_UpdateStageResults(void) gCurrentLevel++; - if (gCurrentLevel > gLoadedSaveGame->unlockedLevels[gSelectedCharacter]) { - gLoadedSaveGame->unlockedLevels[gSelectedCharacter] = gCurrentLevel; + if (gCurrentLevel > LOADED_SAVE->unlockedLevels[gSelectedCharacter]) { + LOADED_SAVE->unlockedLevels[gSelectedCharacter] = gCurrentLevel; if (gSelectedCharacter == CHARACTER_SONIC) { switch (LEVEL_TO_ZONE(gCurrentLevel - 1)) { case ZONE_1: { - gLoadedSaveGame->unlockedCharacters |= CHARACTER_BIT(CHARACTER_CREAM); + LOADED_SAVE->unlockedCharacters |= CHARACTER_BIT(CHARACTER_CREAM); CreateCharacterUnlockCutScene(0); } break; case ZONE_3: { - gLoadedSaveGame->unlockedCharacters |= CHARACTER_BIT(CHARACTER_TAILS); + LOADED_SAVE->unlockedCharacters |= CHARACTER_BIT(CHARACTER_TAILS); CreateCharacterUnlockCutScene(2); } break; case ZONE_5: { - gLoadedSaveGame->unlockedCharacters |= CHARACTER_BIT(CHARACTER_KNUCKLES); + LOADED_SAVE->unlockedCharacters |= CHARACTER_BIT(CHARACTER_KNUCKLES); CreateCharacterUnlockCutScene(1); } break; default: { - CreateCourseSelectionScreen(gCurrentLevel, gLoadedSaveGame->unlockedLevels[gSelectedCharacter], 1); + CreateCourseSelectionScreen(gCurrentLevel, LOADED_SAVE->unlockedLevels[gSelectedCharacter], 1); } } } else { - CreateCourseSelectionScreen(gCurrentLevel, gLoadedSaveGame->unlockedLevels[gSelectedCharacter], 1); + CreateCourseSelectionScreen(gCurrentLevel, LOADED_SAVE->unlockedLevels[gSelectedCharacter], 1); } } else { - CreateCourseSelectionScreen(gCurrentLevel, gLoadedSaveGame->unlockedLevels[gSelectedCharacter], 4); + CreateCourseSelectionScreen(gCurrentLevel, LOADED_SAVE->unlockedLevels[gSelectedCharacter], 4); } WriteSaveGame(); return; } else { gCurrentLevel++; - if (gCurrentLevel > gLoadedSaveGame->unlockedLevels[gSelectedCharacter]) { - gLoadedSaveGame->unlockedLevels[gSelectedCharacter] = gCurrentLevel; + if (gCurrentLevel > LOADED_SAVE->unlockedLevels[gSelectedCharacter]) { + LOADED_SAVE->unlockedLevels[gSelectedCharacter] = gCurrentLevel; } if ((gPlayer.moveState & MOVESTATE_GOAL_REACHED) && (gSpecialRingCount >= SPECIAL_STAGE_REQUIRED_SP_RING_COUNT)) { From 90b54e7f26405552f1373e3ff1c196e26324ee2e Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Mon, 20 Oct 2025 12:55:13 +0200 Subject: [PATCH 03/15] Align Task_GameStage with SA1 --- src/game/stage/stage.c | 45 ++++++++++++++++-------------------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/src/game/stage/stage.c b/src/game/stage/stage.c index a4d7fd84de..8705312295 100644 --- a/src/game/stage/stage.c +++ b/src/game/stage/stage.c @@ -18,9 +18,11 @@ #include "game/stage/player.h" #include "game/stage/camera.h" #include "game/time_attack/lobby.h" +#if (GAME == GAME_SA1) +#include "game/time_over.h" +#endif #include "game/multiplayer/finish.h" #include "game/multiplayer/indicators.h" - #include "game/multiboot/collect_rings/time_display.h" #include "game/multiplayer/mp_player.h" @@ -314,6 +316,14 @@ void Task_GameStage(void) u32 timeStep; #ifndef COLLECT_RINGS_ROM if (IS_SINGLE_PLAYER) { +#if DEBUG +#include "game/character_select.h" + if (gInput & SELECT_BUTTON) { + TasksDestroyAll(); + CreateCharacterSelectionScreen(CHARACTER_TAILS); + return; + } +#endif if (!(gStageFlags & STAGE_FLAG__DISABLE_PAUSE_MENU) && (gPressedKeys & START_BUTTON) && !(gStageFlags & STAGE_FLAG__DEMO_RUNNING)) { CreatePauseMenu(); } @@ -344,12 +354,7 @@ void Task_GameStage(void) u32 temp = MultiplayerPseudoRandom32(); } -#if (GAME == GAME_SA1) - if (gCamera.sa2__unk50 & CAM_MODE_SPECTATOR) -#elif (GAME == GAME_SA2) - if (gCamera.unk50 & CAM_MODE_SPECTATOR) -#endif - { + if (gCamera.SA2_LABEL(unk50) & CAM_MODE_SPECTATOR) { if ((gInput & (L_BUTTON | R_BUTTON)) == (L_BUTTON | R_BUTTON)) { if (sioId != 3) { @@ -381,22 +386,12 @@ void Task_GameStage(void) gCamera.spectatorTarget = sioId; } -#if (GAME == GAME_SA1) - if (sa2__gUnknown_030053E0 > 0) { - sa2__gUnknown_030053E0--; + if (SA2_LABEL(gUnknown_030053E0) > 0) { + SA2_LABEL(gUnknown_030053E0)--; } -#elif (GAME == GAME_SA2) - if (gUnknown_030053E0 > 0) { - gUnknown_030053E0--; - } -#endif } -#if (GAME == GAME_SA1) - sa2__gUnknown_0300544C = gStageFlags; -#elif (GAME == GAME_SA2) - gUnknown_0300544C = gStageFlags; -#endif + SA2_LABEL(gUnknown_0300544C) = gStageFlags; if (gStageFlags & STAGE_FLAG__ACT_START) { return; @@ -429,6 +424,8 @@ void Task_GameStage(void) #if (GAME == GAME_SA1) if (gCurrentLevel == LEVEL_INDEX(ZONE_6, ACT_1)) #elif (GAME == GAME_SA2) + // NOTE(Jace): + // I wonder if the level index was hardcoded in the original source? if (gCurrentLevel == LEVEL_INDEX(ZONE_3, ACT_BOSS)) #endif { @@ -440,11 +437,7 @@ void Task_GameStage(void) #endif else { gStageFlags |= STAGE_FLAG__ACT_START; -#if (GAME == GAME_SA1) - sa2__CreateMultiplayerFinishHandler(); -#elif (GAME == GAME_SA2) CreateMultiplayerFinishHandler(); -#endif } } #ifndef COLLECT_RINGS_ROM @@ -472,11 +465,7 @@ void Task_GameStage(void) m4aSongNumStart(SE_TIME_UP); } else { gStageFlags |= STAGE_FLAG__ACT_START; -#if (GAME == GAME_SA1) - sa2__CreateMultiplayerFinishHandler(); -#elif (GAME == GAME_SA2) CreateMultiplayerFinishHandler(); -#endif } } #endif From 193f0259d0045f15dbf93b46cc25f9bfc86a6164 Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Mon, 20 Oct 2025 14:14:51 +0200 Subject: [PATCH 04/15] Rename gUnknown_080D5768 -> sMPFinishTileInfo --- src/game/multiplayer/finish.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/multiplayer/finish.c b/src/game/multiplayer/finish.c index 3573b6cfb5..ec3f8c9f0b 100644 --- a/src/game/multiplayer/finish.c +++ b/src/game/multiplayer/finish.c @@ -38,7 +38,7 @@ void TaskDestructor_8019EF4(struct Task *); #ifndef COLLECT_RINGS_ROM // TODO: split finish result -const TileInfo gUnknown_080D5768[2][7] = { { +const TileInfo sMPFinishTileInfo[2][7] = { { // Japanese { 0, SA2_ANIM_MP_RESULT_JP, SA2_ANIM_MP_RESULT_WIN }, { 0, SA2_ANIM_MP_RESULT_JP, SA2_ANIM_MP_RESULT_LOSE }, @@ -62,7 +62,7 @@ const TileInfo gUnknown_080D5768[2][7] = { { #define GET_MP_FINISH_RESULT_TILE_INFO(_id) \ ({ \ const TileInfo *source; \ - u8 *info = (u8 *)gUnknown_080D5768; \ + u8 *info = (u8 *)sMPFinishTileInfo; \ \ s32 index; \ \ From 7af47a066b570e43192253b61955f80ecf2510f6 Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Mon, 20 Oct 2025 14:15:36 +0200 Subject: [PATCH 05/15] More LOADED_SAVE renames --- src/game/multiplayer/finish.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/multiplayer/finish.c b/src/game/multiplayer/finish.c index ec3f8c9f0b..74cd683b8d 100644 --- a/src/game/multiplayer/finish.c +++ b/src/game/multiplayer/finish.c @@ -67,7 +67,7 @@ const TileInfo sMPFinishTileInfo[2][7] = { { s32 index; \ \ index \ - = ((gLoadedSaveGame->language == LANG_DEFAULT) || (gLoadedSaveGame->language == LANG_JAPANESE)) ? 0 : (7 * sizeof(TileInfo)); \ + = ((LOADED_SAVE->language == LANG_DEFAULT) || (LOADED_SAVE->language == LANG_JAPANESE)) ? 0 : (7 * sizeof(TileInfo)); \ source = (TileInfo *)(info + index); \ \ (source + (_id)); \ @@ -167,7 +167,7 @@ void CreateMultiplayerFinishHandler(void) } gMusicManagerState.unk0 = 0xFF; - gLoadedSaveGame->score += (s16)gRingCount; + LOADED_SAVE->score += (s16)gRingCount; if (gCourseTime <= MAX_COURSE_TIME) { if (!(gStageFlags & STAGE_FLAG__TIMER_REVERSED) || (gCourseTime != 0)) { From a31e3f565a2a0bb82a7f1466ec0ab067929c329c Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Mon, 20 Oct 2025 14:25:55 +0200 Subject: [PATCH 06/15] Formatter... --- src/game/multiplayer/finish.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/game/multiplayer/finish.c b/src/game/multiplayer/finish.c index 74cd683b8d..8d4b069475 100644 --- a/src/game/multiplayer/finish.c +++ b/src/game/multiplayer/finish.c @@ -66,8 +66,7 @@ const TileInfo sMPFinishTileInfo[2][7] = { { \ s32 index; \ \ - index \ - = ((LOADED_SAVE->language == LANG_DEFAULT) || (LOADED_SAVE->language == LANG_JAPANESE)) ? 0 : (7 * sizeof(TileInfo)); \ + index = ((LOADED_SAVE->language == LANG_DEFAULT) || (LOADED_SAVE->language == LANG_JAPANESE)) ? 0 : (7 * sizeof(TileInfo)); \ source = (TileInfo *)(info + index); \ \ (source + (_id)); \ From 40e1c2793804792217b36451d430296575dfae48 Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Mon, 20 Oct 2025 14:58:01 +0200 Subject: [PATCH 07/15] Start aligning mp_finish with SA1 --- src/game/multiplayer/finish.c | 60 +++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 17 deletions(-) diff --git a/src/game/multiplayer/finish.c b/src/game/multiplayer/finish.c index 8d4b069475..04a3815e78 100644 --- a/src/game/multiplayer/finish.c +++ b/src/game/multiplayer/finish.c @@ -32,12 +32,15 @@ typedef struct { void Task_801A04C(void); void Task_TransitionToResultsScreen(void); -void Task_8019E70(void); -void TaskDestructor_8019EF4(struct Task *); +void SA2_LABEL(Task_8019E70)(void); +void SA2_LABEL(TaskDestructor_8019EF4)(struct Task *); #ifndef COLLECT_RINGS_ROM // TODO: split finish result +#if (GAME == GAME_SA1) +extern const TileInfo sMPFinishTileInfo[2][7]; +#elif (GAME == GAME_SA2) const TileInfo sMPFinishTileInfo[2][7] = { { // Japanese { 0, SA2_ANIM_MP_RESULT_JP, SA2_ANIM_MP_RESULT_WIN }, @@ -58,6 +61,7 @@ const TileInfo sMPFinishTileInfo[2][7] = { { { 0, SA2_ANIM_MP_RESULT, SA2_ANIM_MP_RESULT_3RD }, { 0, SA2_ANIM_MP_RESULT, SA2_ANIM_MP_RESULT_4TH }, } }; +#endif #define GET_MP_FINISH_RESULT_TILE_INFO(_id) \ ({ \ @@ -76,8 +80,11 @@ void CreateMultiplayerFinishResult(u8 sioId, u8 count) { u32 i = 0; - if (gUnknown_030054B4[sioId] == -1) { - struct Task *t = TaskCreate(Task_8019E70, sizeof(MpFinish1), 0x2010, 0, TaskDestructor_8019EF4); +#if (GAME == GAME_SA2) + if (SA2_LABEL(gUnknown_030054B4)[sioId] == -1) +#endif + { + struct Task *t = TaskCreate(SA2_LABEL(Task_8019E70), sizeof(MpFinish1), 0x2010, 0, SA2_LABEL(TaskDestructor_8019EF4)); MpFinish1 *finish = TASK_DATA(t); struct Task **mpt = &gMultiplayerPlayerTasks[0]; Sprite *s; @@ -90,10 +97,10 @@ void CreateMultiplayerFinishResult(u8 sioId, u8 count) } if (count < 6) { - gUnknown_030054B4[sioId] = count; + SA2_LABEL(gUnknown_030054B4)[sioId] = count; } else { // BUG(?): Value underflows if i is 0 - gUnknown_030054B4[sioId] = i - 1; + SA2_LABEL(gUnknown_030054B4)[sioId] = i - 1; } finish->unk30 = sioId; @@ -101,8 +108,26 @@ void CreateMultiplayerFinishResult(u8 sioId, u8 count) s = &finish->s; s->graphics.size = 0; - s->graphics.dest = VramMalloc(12); +#if (GAME == GAME_SA1) + s->graphics.anim = 904; + + if (count == 5) { + s->variant = 1; + s->graphics.dest = VramMalloc(12); + } else if (count == 4) { + s->variant = 2; + s->graphics.dest = VramMalloc(12); + } else if ((i == 2) || (gGameMode == GAME_MODE_CHAO_HUNT) || (gGameMode == GAME_MODE_MULTI_PLAYER) + || (gGameMode == GAME_MODE_TEAM_PLAY)) { + s->variant = count; + s->graphics.dest = VramMalloc(12); + } else { + s->variant = count + 3; + s->graphics.dest = VramMalloc(8); + } +#elif (GAME == GAME_SA2) + s->graphics.dest = VramMalloc(12); if (count == 5) { s->graphics.anim = GET_MP_FINISH_RESULT_TILE_INFO(1)->anim; s->variant = GET_MP_FINISH_RESULT_TILE_INFO(1)->variant; @@ -116,6 +141,7 @@ void CreateMultiplayerFinishResult(u8 sioId, u8 count) s->graphics.anim = GET_MP_FINISH_RESULT_TILE_INFO(3)->anim; s->variant = count + GET_MP_FINISH_RESULT_TILE_INFO(3)->variant; } +#endif s->prevVariant = -1; s->oamFlags = SPRITE_OAM_ORDER(0); @@ -127,7 +153,7 @@ void CreateMultiplayerFinishResult(u8 sioId, u8 count) } } -void Task_8019E70(void) +void SA2_LABEL(Task_8019E70)(void) { MpFinish1 *finish = TASK_DATA(gCurTask); Sprite *s = &finish->s; @@ -144,7 +170,7 @@ void Task_8019E70(void) DisplaySprite(s); } -void TaskDestructor_8019EF4(struct Task *t) +void SA2_LABEL(TaskDestructor_8019EF4)(struct Task *t) { MpFinish1 *finish = TASK_DATA(t); Sprite *s = &finish->s; @@ -182,7 +208,7 @@ void CreateMultiplayerFinishHandler(void) break; } - if (gUnknown_030054B4[i] != -1) { + if (SA2_LABEL(gUnknown_030054B4)[i] != -1) { r2++; } } @@ -203,7 +229,7 @@ void CreateMultiplayerFinishHandler(void) break; } - if (gUnknown_030054B4[i] == -1) { + if (SA2_LABEL(gUnknown_030054B4)[i] == -1) { MultiplayerPlayer *mpp; mpt = gMultiplayerPlayerTasks[i]; mpp = TASK_DATA(mpt); @@ -275,14 +301,14 @@ void Task_TransitionToResultsScreen(void) if (i != 0) { if (sp04[i] != sp04[0]) { - gUnknown_030054B4[sp00[i]] = i; + SA2_LABEL(gUnknown_030054B4)[sp00[i]] = i; gMultiplayerCharacters[sp00[i]] = 1; } else { #ifndef NON_MATCHING // TODO: Match without goto goto else_block; #else - gUnknown_030054B4[sp00[i]] = i; + SA2_LABEL(gUnknown_030054B4)[sp00[i]] = i; gMultiplayerCharacters[sp00[i]] = 2; #endif } @@ -292,10 +318,10 @@ void Task_TransitionToResultsScreen(void) #ifndef NON_MATCHING else_block: #endif - gUnknown_030054B4[sp00[i]] = i; + SA2_LABEL(gUnknown_030054B4)[sp00[i]] = i; gMultiplayerCharacters[sp00[i]] = 2; } else { - gUnknown_030054B4[sp00[0]] = i; + SA2_LABEL(gUnknown_030054B4)[sp00[0]] = i; gMPRingCollectWins[sp00[0]]++; gMultiplayerCharacters[sp00[0]] = i; } @@ -342,9 +368,9 @@ void Task_TransitionToResultsScreen(void) if (pid == SIO_MULTI_CNT->id) continue; - if (gUnknown_030054B4[SIO_MULTI_CNT->id] < gUnknown_030054B4[pid]) { + if (SA2_LABEL(gUnknown_030054B4)[SIO_MULTI_CNT->id] < SA2_LABEL(gUnknown_030054B4)[pid]) { foeResult = 0; - } else if (gUnknown_030054B4[SIO_MULTI_CNT->id] > gUnknown_030054B4[pid]) { + } else if (SA2_LABEL(gUnknown_030054B4)[SIO_MULTI_CNT->id] > SA2_LABEL(gUnknown_030054B4)[pid]) { foeResult = 1; ownResult = 1; } else { From 9b6ce23aa17990aae11c6929e42ae60c3177baf9 Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Mon, 20 Oct 2025 20:12:31 +0200 Subject: [PATCH 08/15] Align CreateMultiplayerFinishHandler with current state in SA1 --- src/game/multiplayer/finish.c | 146 ++++++++++++++++++++++++++++++++-- src/game/stage/stage.c | 2 +- 2 files changed, 141 insertions(+), 7 deletions(-) diff --git a/src/game/multiplayer/finish.c b/src/game/multiplayer/finish.c index 04a3815e78..8d20d26b48 100644 --- a/src/game/multiplayer/finish.c +++ b/src/game/multiplayer/finish.c @@ -29,7 +29,7 @@ typedef struct { u16 unk0; } Finish2; /* size: 4 */ -void Task_801A04C(void); +void SA2_LABEL(Task_801A04C)(void); void Task_TransitionToResultsScreen(void); void SA2_LABEL(Task_8019E70)(void); @@ -61,7 +61,6 @@ const TileInfo sMPFinishTileInfo[2][7] = { { { 0, SA2_ANIM_MP_RESULT, SA2_ANIM_MP_RESULT_3RD }, { 0, SA2_ANIM_MP_RESULT, SA2_ANIM_MP_RESULT_4TH }, } }; -#endif #define GET_MP_FINISH_RESULT_TILE_INFO(_id) \ ({ \ @@ -75,6 +74,7 @@ const TileInfo sMPFinishTileInfo[2][7] = { { \ (source + (_id)); \ }) +#endif void CreateMultiplayerFinishResult(u8 sioId, u8 count) { @@ -177,20 +177,149 @@ void SA2_LABEL(TaskDestructor_8019EF4)(struct Task *t) VramFree(s->graphics.dest); } +// (97.32%) https://decomp.me/scratch/nE6RC +#if (GAME == GAME_SA1) +NONMATCH("asm/non_matching/game/multiplayer/finish__CreateMultiplayerFinishHandler.inc", void CreateMultiplayerFinishHandler(void)) +#elif (GAME == GAME_SA2) void CreateMultiplayerFinishHandler(void) +#endif { u32 i; u32 r2; u8 r6; +#if (GAME == GAME_SA1) + u8 arr[4] = { 0, 1, 2, 3 }; + u8 arr2[4] = { 0 }; +#endif struct Task *mpt; - struct Task *t = TaskCreate(Task_801A04C, sizeof(Finish2), 0x2000, 0, NULL); + struct Task *t = TaskCreate(SA2_LABEL(Task_801A04C), sizeof(Finish2), 0x2000, 0, NULL); Finish2 *f2 = TASK_DATA(t); + + // from M2C + u32 var_r6; + u32 var_r4; + u32 var_ip; + u8 *temp_r1_4; + u8 var_r5; + // end of m2c vars + f2->unk0 = 0; - if (gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) { + if (gGameMode != GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) { +#if (GAME == GAME_SA1) + gMusicManagerState.unk0 = 0xFF; + m4aSongNumStart(304); +#endif + } else { +#if (GAME == GAME_SA2) return; +#endif } +#if (GAME == GAME_SA1) + if (gGameMode == 4) { + *((u32 *)arr2) = *((u32 *)gMultiplayerCharRings); + + for (var_r6 = 0, var_ip = 3; var_r6 < 4; var_r6++) { + u32 var_r8 = var_ip; + for (var_r4 = 0; var_r4 < var_r8; var_r4++) { + if (arr2[var_r4 + 0] < arr2[var_r4 + 1]) { + XOR_SWAP(arr2[var_r4 + 0], arr2[var_r4 + 1]); + XOR_SWAP(arr[var_r4 + 0], arr[var_r4 + 1]); + } + } +#ifndef NON_MATCHING + asm("mov r1, #1\n" + "neg r1, r1\n" + "add %0, r1" + : "=r"(var_ip)); +#else + var_ip--; +#endif + } + for (var_r6 = 0; var_r6 < 4; var_r6++) { + u8 *ptr = &arr[var_r6]; + + if (var_r6 != 0) { + if (arr2[var_r6] != arr2[0]) { + SA2_LABEL(gUnknown_030054B4)[*ptr] = 1; + } else { + SA2_LABEL(gUnknown_030054B4)[*ptr] = 4; + } + } else if (arr2[0] == arr2[1]) { + SA2_LABEL(gUnknown_030054B4)[*ptr] = 4; + } else { + SA2_LABEL(gUnknown_030054B4)[arr[0]] = var_r6; + } + } + + for (var_r6 = 0; var_r6 < 4; var_r6++) { + if (gMultiplayerPlayerTasks[var_r6] != NULL) { + CreateMultiplayerFinishResult(var_r6, (u8)SA2_LABEL(gUnknown_030054B4)[var_r6]); + } + } + } else if (gGameMode == 5) { + for (var_r6 = 0; var_r6 < 4 && (gMultiplayerPlayerTasks[var_r6] != NULL); var_r6++) { + temp_r1_4 = &arr2[(gMultiplayerConnections & (0x10 << var_r6)) >> (var_r6 + 4)]; + *temp_r1_4 += gMultiplayerCharRings[var_r6]; + } + + if ((u32)arr2[0] < (u32)arr2[1]) { + XOR_SWAP(arr2[0], arr2[1]) + XOR_SWAP(arr[0], arr[1]) + } + if (arr2[0] == arr2[1]) { + for (var_r6 = 0; var_r6 < 4; var_r6++) { + if (gMultiplayerPlayerTasks[var_r6] != NULL) { + SA2_LABEL(gUnknown_030054B4)[var_r6] = 4; + } + } + } else { + for (var_r6 = 0; var_r6 < 4; var_r6++) { + if (gMultiplayerPlayerTasks[var_r6] != NULL) { + if (((gMultiplayerConnections & (0x10 << var_r6)) >> (var_r6 + 4)) == arr[0]) { + SA2_LABEL(gUnknown_030054B4)[var_r6] = 0; + } else { + SA2_LABEL(gUnknown_030054B4)[var_r6] = 1; + } + } + } + } + for (var_r6 = 0; var_r6 < 4; var_r6++) { + if (gMultiplayerPlayerTasks[var_r6] != NULL) { + CreateMultiplayerFinishResult(var_r6, SA2_LABEL(gUnknown_030054B4)[var_r6]); + } + } + } else if (gGameMode != 6) { + LOADED_SAVE->score += (s16)gRingCount; + if (((u32)gCourseTime > MAX_COURSE_TIME) || ((STAGE_FLAG__TIMER_REVERSED & gStageFlags) && (gCourseTime == 0))) { + u32 var_r2 = 0; + if ((gGameMode != 3) && (gGameMode != 5)) { + for (var_r4 = 0; var_r4 < 4 && (gMultiplayerPlayerTasks[var_r4] != NULL); var_r4++) { + if (SA2_LABEL(gUnknown_030054B4)[var_r4] != -1) { + var_r2 += 1; + } + } + + if (var_r2 == 0) { + var_r5 = 4; + } else if (var_r2 == (var_r4 - 1)) { + var_r5 = (u8)var_r2; + } else { + var_r5 = 5; + } + } else { + var_r5 = 4; + } + + for (var_r4 = 0; var_r4 < 4 && (gMultiplayerPlayerTasks[var_r4] != NULL); var_r4++) { + if ((SA2_LABEL(gUnknown_030054B4)[var_r4] == -1) || (gGameMode == 3) || (gGameMode == 5)) { + CreateMultiplayerFinishResult(var_r4, var_r5); + } + } + } + } +#elif (GAME == GAME_SA2) gMusicManagerState.unk0 = 0xFF; LOADED_SAVE->score += (s16)gRingCount; @@ -237,10 +366,15 @@ void CreateMultiplayerFinishHandler(void) CreateMultiplayerFinishResult(i, r6); } } +#endif } +#if (GAME == GAME_SA1) +END_NONMATCH #endif -void Task_801A04C(void) +#endif // COLLECT_RINGS_ROM + +void SA2_LABEL(Task_801A04C)(void) { u32 x = 0; Finish2 *f2 = TASK_DATA(gCurTask); @@ -423,7 +557,7 @@ void CreateMultiplayerFinishHandler(void) u32 r2; u8 r6; struct Task *mpt; - struct Task *t = TaskCreate(Task_801A04C, sizeof(Finish2), 0x2000, 0, NULL); + struct Task *t = TaskCreate(SA2_LABEL(Task_801A04C), sizeof(Finish2), 0x2000, 0, NULL); Finish2 *f2 = TASK_DATA(t); f2->unk0 = 0; } diff --git a/src/game/stage/stage.c b/src/game/stage/stage.c index 8705312295..e5d7a4474c 100644 --- a/src/game/stage/stage.c +++ b/src/game/stage/stage.c @@ -805,7 +805,7 @@ void TaskDestructor_GameStage(struct Task *t) #if (GAME == GAME_SA1) if ((gGameMode == GAME_MODE_TIME_ATTACK || (gGameMode == GAME_MODE_RACE) || (gGameMode == GAME_MODE_MULTI_PLAYER)) || (gStageFlags & STAGE_FLAG__DEMO_RUNNING)) { - gLoadedSaveGame.difficultyLevel = gDifficultyLevel; + LOADED_SAVE->difficultyLevel = gDifficultyLevel; } #endif gGameStageTask = NULL; From b945917664ab2402a64171eec46fc64ffb80d064 Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Mon, 20 Oct 2025 20:14:01 +0200 Subject: [PATCH 09/15] Move scratch link to SA1 func --- src/game/multiplayer/finish.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/multiplayer/finish.c b/src/game/multiplayer/finish.c index 8d20d26b48..e619e1bb7b 100644 --- a/src/game/multiplayer/finish.c +++ b/src/game/multiplayer/finish.c @@ -177,8 +177,8 @@ void SA2_LABEL(TaskDestructor_8019EF4)(struct Task *t) VramFree(s->graphics.dest); } -// (97.32%) https://decomp.me/scratch/nE6RC #if (GAME == GAME_SA1) +// (97.32%) https://decomp.me/scratch/nE6RC NONMATCH("asm/non_matching/game/multiplayer/finish__CreateMultiplayerFinishHandler.inc", void CreateMultiplayerFinishHandler(void)) #elif (GAME == GAME_SA2) void CreateMultiplayerFinishHandler(void) From 51bf187e71b9214d14d33535891cacb84af3653a Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Mon, 20 Oct 2025 22:07:01 +0200 Subject: [PATCH 10/15] Align MP finish.c with SA1 --- src/game/multiplayer/finish.c | 287 +++++++++++++++++++--------------- 1 file changed, 157 insertions(+), 130 deletions(-) diff --git a/src/game/multiplayer/finish.c b/src/game/multiplayer/finish.c index e619e1bb7b..ad12eb4c92 100644 --- a/src/game/multiplayer/finish.c +++ b/src/game/multiplayer/finish.c @@ -19,6 +19,15 @@ #include "constants/animations.h" #include "constants/text.h" +#if (GAME == GAME_SA1) && !(defined NON_MATCHING) +// Once CreateMultiplayerFinishHandler matches in SA1, +// this can go away. +asm(".section .rodata"); +asm(".align 2, 0"); +asm(".global gUnknown_080BB490"); +asm("gUnknown_080BB490:"); +#endif + typedef struct { Sprite s; u8 unk30; @@ -178,6 +187,7 @@ void SA2_LABEL(TaskDestructor_8019EF4)(struct Task *t) } #if (GAME == GAME_SA1) +extern const u8 gUnknown_080BB490[4]; // (97.32%) https://decomp.me/scratch/nE6RC NONMATCH("asm/non_matching/game/multiplayer/finish__CreateMultiplayerFinishHandler.inc", void CreateMultiplayerFinishHandler(void)) #elif (GAME == GAME_SA2) @@ -188,185 +198,196 @@ void CreateMultiplayerFinishHandler(void) u32 r2; u8 r6; #if (GAME == GAME_SA1) +#ifndef NON_MATCHING + u8 arr[4]; + u8 arr2[4]; + // Once CreateMultiplayerFinishHandler matches in SA1, + // this can go away. + memcpy(arr, &gUnknown_080BB490, 4); + memset(arr2, 0, 4); +#else u8 arr[4] = { 0, 1, 2, 3 }; u8 arr2[4] = { 0 }; #endif - struct Task *mpt; - struct Task *t = TaskCreate(SA2_LABEL(Task_801A04C), sizeof(Finish2), 0x2000, 0, NULL); - Finish2 *f2 = TASK_DATA(t); +#endif + { + struct Task *mpt; + struct Task *t = TaskCreate(SA2_LABEL(Task_801A04C), sizeof(Finish2), 0x2000, 0, NULL); + Finish2 *f2 = TASK_DATA(t); - // from M2C - u32 var_r6; - u32 var_r4; - u32 var_ip; - u8 *temp_r1_4; - u8 var_r5; - // end of m2c vars + // from M2C + u32 var_r6; + u32 var_r4; + u32 var_ip; + u8 *temp_r1_4; + u8 var_r5; + // end of m2c vars - f2->unk0 = 0; + f2->unk0 = 0; - if (gGameMode != GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) { + if (gGameMode != GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) { #if (GAME == GAME_SA1) - gMusicManagerState.unk0 = 0xFF; - m4aSongNumStart(304); + gMusicManagerState.unk0 = 0xFF; + m4aSongNumStart(304); #endif - } else { + } else { #if (GAME == GAME_SA2) - return; + return; #endif - } + } #if (GAME == GAME_SA1) - if (gGameMode == 4) { - *((u32 *)arr2) = *((u32 *)gMultiplayerCharRings); - - for (var_r6 = 0, var_ip = 3; var_r6 < 4; var_r6++) { - u32 var_r8 = var_ip; - for (var_r4 = 0; var_r4 < var_r8; var_r4++) { - if (arr2[var_r4 + 0] < arr2[var_r4 + 1]) { - XOR_SWAP(arr2[var_r4 + 0], arr2[var_r4 + 1]); - XOR_SWAP(arr[var_r4 + 0], arr[var_r4 + 1]); + if (gGameMode == 4) { + *((u32 *)arr2) = *((u32 *)gMultiplayerCharRings); + + for (var_r6 = 0, var_ip = 3; var_r6 < 4; var_r6++) { + u32 var_r8 = var_ip; + for (var_r4 = 0; var_r4 < var_r8; var_r4++) { + if (arr2[var_r4 + 0] < arr2[var_r4 + 1]) { + XOR_SWAP(arr2[var_r4 + 0], arr2[var_r4 + 1]); + XOR_SWAP(arr[var_r4 + 0], arr[var_r4 + 1]); + } } - } #ifndef NON_MATCHING - asm("mov r1, #1\n" - "neg r1, r1\n" - "add %0, r1" - : "=r"(var_ip)); + asm("mov r1, #1\n" + "neg r1, r1\n" + "add %0, r1" + : "=r"(var_ip)); #else - var_ip--; + var_ip--; #endif - } - for (var_r6 = 0; var_r6 < 4; var_r6++) { - u8 *ptr = &arr[var_r6]; + } + for (var_r6 = 0; var_r6 < 4; var_r6++) { + u8 *ptr = &arr[var_r6]; - if (var_r6 != 0) { - if (arr2[var_r6] != arr2[0]) { - SA2_LABEL(gUnknown_030054B4)[*ptr] = 1; - } else { + if (var_r6 != 0) { + if (arr2[var_r6] != arr2[0]) { + SA2_LABEL(gUnknown_030054B4)[*ptr] = 1; + } else { + SA2_LABEL(gUnknown_030054B4)[*ptr] = 4; + } + } else if (arr2[0] == arr2[1]) { SA2_LABEL(gUnknown_030054B4)[*ptr] = 4; + } else { + SA2_LABEL(gUnknown_030054B4)[arr[0]] = var_r6; } - } else if (arr2[0] == arr2[1]) { - SA2_LABEL(gUnknown_030054B4)[*ptr] = 4; - } else { - SA2_LABEL(gUnknown_030054B4)[arr[0]] = var_r6; - } - } - - for (var_r6 = 0; var_r6 < 4; var_r6++) { - if (gMultiplayerPlayerTasks[var_r6] != NULL) { - CreateMultiplayerFinishResult(var_r6, (u8)SA2_LABEL(gUnknown_030054B4)[var_r6]); } - } - } else if (gGameMode == 5) { - for (var_r6 = 0; var_r6 < 4 && (gMultiplayerPlayerTasks[var_r6] != NULL); var_r6++) { - temp_r1_4 = &arr2[(gMultiplayerConnections & (0x10 << var_r6)) >> (var_r6 + 4)]; - *temp_r1_4 += gMultiplayerCharRings[var_r6]; - } - if ((u32)arr2[0] < (u32)arr2[1]) { - XOR_SWAP(arr2[0], arr2[1]) - XOR_SWAP(arr[0], arr[1]) - } - if (arr2[0] == arr2[1]) { for (var_r6 = 0; var_r6 < 4; var_r6++) { if (gMultiplayerPlayerTasks[var_r6] != NULL) { - SA2_LABEL(gUnknown_030054B4)[var_r6] = 4; + CreateMultiplayerFinishResult(var_r6, (u8)SA2_LABEL(gUnknown_030054B4)[var_r6]); } } - } else { - for (var_r6 = 0; var_r6 < 4; var_r6++) { - if (gMultiplayerPlayerTasks[var_r6] != NULL) { - if (((gMultiplayerConnections & (0x10 << var_r6)) >> (var_r6 + 4)) == arr[0]) { - SA2_LABEL(gUnknown_030054B4)[var_r6] = 0; - } else { - SA2_LABEL(gUnknown_030054B4)[var_r6] = 1; + } else if (gGameMode == 5) { + for (var_r6 = 0; var_r6 < 4 && (gMultiplayerPlayerTasks[var_r6] != NULL); var_r6++) { + temp_r1_4 = &arr2[(gMultiplayerConnections & (0x10 << var_r6)) >> (var_r6 + 4)]; + *temp_r1_4 += gMultiplayerCharRings[var_r6]; + } + + if ((u32)arr2[0] < (u32)arr2[1]) { + XOR_SWAP(arr2[0], arr2[1]) + XOR_SWAP(arr[0], arr[1]) + } + if (arr2[0] == arr2[1]) { + for (var_r6 = 0; var_r6 < 4; var_r6++) { + if (gMultiplayerPlayerTasks[var_r6] != NULL) { + SA2_LABEL(gUnknown_030054B4)[var_r6] = 4; + } + } + } else { + for (var_r6 = 0; var_r6 < 4; var_r6++) { + if (gMultiplayerPlayerTasks[var_r6] != NULL) { + if (((gMultiplayerConnections & (0x10 << var_r6)) >> (var_r6 + 4)) == arr[0]) { + SA2_LABEL(gUnknown_030054B4)[var_r6] = 0; + } else { + SA2_LABEL(gUnknown_030054B4)[var_r6] = 1; + } } } } - } - for (var_r6 = 0; var_r6 < 4; var_r6++) { - if (gMultiplayerPlayerTasks[var_r6] != NULL) { - CreateMultiplayerFinishResult(var_r6, SA2_LABEL(gUnknown_030054B4)[var_r6]); + for (var_r6 = 0; var_r6 < 4; var_r6++) { + if (gMultiplayerPlayerTasks[var_r6] != NULL) { + CreateMultiplayerFinishResult(var_r6, SA2_LABEL(gUnknown_030054B4)[var_r6]); + } } - } - } else if (gGameMode != 6) { - LOADED_SAVE->score += (s16)gRingCount; - if (((u32)gCourseTime > MAX_COURSE_TIME) || ((STAGE_FLAG__TIMER_REVERSED & gStageFlags) && (gCourseTime == 0))) { - u32 var_r2 = 0; - if ((gGameMode != 3) && (gGameMode != 5)) { - for (var_r4 = 0; var_r4 < 4 && (gMultiplayerPlayerTasks[var_r4] != NULL); var_r4++) { - if (SA2_LABEL(gUnknown_030054B4)[var_r4] != -1) { - var_r2 += 1; + } else if (gGameMode != 6) { + LOADED_SAVE->score += (s16)gRingCount; + if (((u32)gCourseTime > MAX_COURSE_TIME) || ((STAGE_FLAG__TIMER_REVERSED & gStageFlags) && (gCourseTime == 0))) { + u32 var_r2 = 0; + if ((gGameMode != 3) && (gGameMode != 5)) { + for (var_r4 = 0; var_r4 < 4 && (gMultiplayerPlayerTasks[var_r4] != NULL); var_r4++) { + if (SA2_LABEL(gUnknown_030054B4)[var_r4] != -1) { + var_r2 += 1; + } } - } - if (var_r2 == 0) { - var_r5 = 4; - } else if (var_r2 == (var_r4 - 1)) { - var_r5 = (u8)var_r2; + if (var_r2 == 0) { + var_r5 = 4; + } else if (var_r2 == (var_r4 - 1)) { + var_r5 = (u8)var_r2; + } else { + var_r5 = 5; + } } else { - var_r5 = 5; + var_r5 = 4; } - } else { - var_r5 = 4; - } - for (var_r4 = 0; var_r4 < 4 && (gMultiplayerPlayerTasks[var_r4] != NULL); var_r4++) { - if ((SA2_LABEL(gUnknown_030054B4)[var_r4] == -1) || (gGameMode == 3) || (gGameMode == 5)) { - CreateMultiplayerFinishResult(var_r4, var_r5); + for (var_r4 = 0; var_r4 < 4 && (gMultiplayerPlayerTasks[var_r4] != NULL); var_r4++) { + if ((SA2_LABEL(gUnknown_030054B4)[var_r4] == -1) || (gGameMode == 3) || (gGameMode == 5)) { + CreateMultiplayerFinishResult(var_r4, var_r5); + } } } } - } #elif (GAME == GAME_SA2) - gMusicManagerState.unk0 = 0xFF; - LOADED_SAVE->score += (s16)gRingCount; + gMusicManagerState.unk0 = 0xFF; + LOADED_SAVE->score += (s16)gRingCount; - if (gCourseTime <= MAX_COURSE_TIME) { - if (!(gStageFlags & STAGE_FLAG__TIMER_REVERSED) || (gCourseTime != 0)) { - return; + if (gCourseTime <= MAX_COURSE_TIME) { + if (!(gStageFlags & STAGE_FLAG__TIMER_REVERSED) || (gCourseTime != 0)) { + return; + } } - } - r2 = 0; + r2 = 0; - if (gGameMode != GAME_MODE_TEAM_PLAY) { - for (i = 0; i < MULTI_SIO_PLAYERS_MAX; i++) { - if (gMultiplayerPlayerTasks[i] == NULL) { - break; - } + if (gGameMode != GAME_MODE_TEAM_PLAY) { + for (i = 0; i < MULTI_SIO_PLAYERS_MAX; i++) { + if (gMultiplayerPlayerTasks[i] == NULL) { + break; + } - if (SA2_LABEL(gUnknown_030054B4)[i] != -1) { - r2++; + if (SA2_LABEL(gUnknown_030054B4)[i] != -1) { + r2++; + } } - } - if (r2 == 0) { - r6 = 4; - } else if (r2 == (i - 1)) { - r6 = r2; + if (r2 == 0) { + r6 = 4; + } else if (r2 == (i - 1)) { + r6 = r2; + } else { + r6 = 5; + } } else { - r6 = 5; + r6 = 4; } - } else { - r6 = 4; - } - for (i = 0; i < MULTI_SIO_PLAYERS_MAX; i++) { - if (gMultiplayerPlayerTasks[i] == NULL) { - break; - } + for (i = 0; i < MULTI_SIO_PLAYERS_MAX; i++) { + if (gMultiplayerPlayerTasks[i] == NULL) { + break; + } - if (SA2_LABEL(gUnknown_030054B4)[i] == -1) { - MultiplayerPlayer *mpp; - mpt = gMultiplayerPlayerTasks[i]; - mpp = TASK_DATA(mpt); - mpp->unk5C |= 1; - CreateMultiplayerFinishResult(i, r6); + if (SA2_LABEL(gUnknown_030054B4)[i] == -1) { + MultiplayerPlayer *mpp; + mpt = gMultiplayerPlayerTasks[i]; + mpp = TASK_DATA(mpt); + mpp->unk5C |= 1; + CreateMultiplayerFinishResult(i, r6); + } } - } #endif + } } #if (GAME == GAME_SA1) END_NONMATCH @@ -399,6 +420,7 @@ void SA2_LABEL(Task_801A04C)(void) } } +#if 01 void Task_TransitionToResultsScreen(void) { u32 i; // r7 @@ -417,7 +439,9 @@ void Task_TransitionToResultsScreen(void) u8 sp00[4] = { 0, 1, 2, 3 }; u8 sp04[4] = { 0 }; +#if (GAME == GAME_SA2) m4aMPlayAllStop(); +#endif *((u32 *)sp04) = *((u32 *)gMultiplayerCharRings); for (i = 0; i < MULTI_SIO_PLAYERS_MAX; i++) { @@ -462,6 +486,7 @@ void Task_TransitionToResultsScreen(void) } } +#if (GAME == GAME_SA2) if (gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) { #ifndef NON_MATCHING // TODO: Match without goto @@ -486,10 +511,11 @@ void Task_TransitionToResultsScreen(void) return; #endif } +#endif } // _0801A232 -#ifndef COLLECT_RINGS_ROM +#if (GAME == GAME_SA2) && !(defined COLLECT_RINGS_ROM) { s16 pid; s32 foeResult; @@ -529,7 +555,7 @@ void Task_TransitionToResultsScreen(void) { // TODO: This is a macro! PAUSE_BACKGROUNDS_QUEUE(); - gUnknown_03005390 = 0; + SA2_LABEL(gUnknown_03005390) = 0; PAUSE_GRAPHICS_QUEUE(); } @@ -549,6 +575,7 @@ void Task_TransitionToResultsScreen(void) return; } } +#endif #if COLLECT_RINGS_ROM void CreateMultiplayerFinishHandler(void) From a157cb0eb081b7135aae98e114472d3585629f89 Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Mon, 20 Oct 2025 22:19:53 +0200 Subject: [PATCH 11/15] Add notes --- src/game/multiplayer/finish.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/game/multiplayer/finish.c b/src/game/multiplayer/finish.c index ad12eb4c92..250f2c003d 100644 --- a/src/game/multiplayer/finish.c +++ b/src/game/multiplayer/finish.c @@ -26,6 +26,12 @@ asm(".section .rodata"); asm(".align 2, 0"); asm(".global gUnknown_080BB490"); asm("gUnknown_080BB490:"); +// NOTE: +// As long as gUnknown_080BB490 is above data with this layout, this works out: +// asm(".byte 0, 1, 2, 3:"); +// But once CreateMultiplayerFinishHandler matches, +// the label won't be necessary. It's only here because +// the asm file out of asm/non_matching/ references it. #endif typedef struct { From 910f83217adc5e0abc5433c99791909cc27a509b Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Mon, 20 Oct 2025 22:55:36 +0200 Subject: [PATCH 12/15] Rename item_box -> itembox --- .../game/{mystery_item_box.h => mystery_itembox.h} | 0 .../game/sa1_sa2_shared/{item_box.h => itembox.h} | 0 ldscript.txt | 12 ++++++------ songs.mk | 4 ++-- sound/song_table.inc | 4 ++-- .../songs/midi/{se_item_box.mid => se_itembox.mid} | Bin .../midi/{se_item_box_2.mid => se_itembox_2.mid} | Bin src/game/{mystery_item_box.c => mystery_itembox.c} | 2 +- src/game/sa1_sa2_shared/{item_box.c => itembox.c} | 0 9 files changed, 11 insertions(+), 11 deletions(-) rename include/game/{mystery_item_box.h => mystery_itembox.h} (100%) rename include/game/sa1_sa2_shared/{item_box.h => itembox.h} (100%) rename sound/songs/midi/{se_item_box.mid => se_itembox.mid} (100%) mode change 100755 => 100644 rename sound/songs/midi/{se_item_box_2.mid => se_itembox_2.mid} (100%) mode change 100755 => 100644 rename src/game/{mystery_item_box.c => mystery_itembox.c} (99%) rename src/game/sa1_sa2_shared/{item_box.c => itembox.c} (100%) diff --git a/include/game/mystery_item_box.h b/include/game/mystery_itembox.h similarity index 100% rename from include/game/mystery_item_box.h rename to include/game/mystery_itembox.h diff --git a/include/game/sa1_sa2_shared/item_box.h b/include/game/sa1_sa2_shared/itembox.h similarity index 100% rename from include/game/sa1_sa2_shared/item_box.h rename to include/game/sa1_sa2_shared/itembox.h diff --git a/ldscript.txt b/ldscript.txt index 714773e0a5..add3c86660 100644 --- a/ldscript.txt +++ b/ldscript.txt @@ -110,7 +110,7 @@ SECTIONS src/game/sa1_sa2_shared/spot_light.o(.text); src/game/sa1_sa2_shared/pause_menu.o(.text); src/game/sa1_sa2_shared/collect_ring_effect.o(.text); - src/game/sa1_sa2_shared/item_box.o(.text); + src/game/sa1_sa2_shared/itembox.o(.text); src/game/sa1_sa2_shared/dust_cloud.o(.text); src/game/sa1_sa2_shared/magnetic_ring.o(.text); src/game/sa1_sa2_shared/music_manager.o(.text); @@ -293,7 +293,7 @@ SECTIONS src/game/math.o(.text); - src/game/mystery_item_box.o(.text); + src/game/mystery_itembox.o(.text); src/game/heart_particles_effect.o(.text); src/game/race_progress.o(.text); src/game/multiplayer/mp_attack_1_effect.o(.text); @@ -381,7 +381,7 @@ SECTIONS src/game/sa1_sa2_shared/unused_level_select.o(.rodata); src/game/sa1_sa2_shared/unused_flash_task.o(.rodata); src/game/sa1_sa2_shared/pause_menu.o(.rodata); - src/game/sa1_sa2_shared/item_box.o(.rodata); + src/game/sa1_sa2_shared/itembox.o(.rodata); src/game/sa1_sa2_shared/music_manager.o(.rodata); src/game/sa1_sa2_shared/input_buffer.o(.rodata); src/game/sa1_sa2_shared/interactables/spring.o(.rodata); @@ -472,7 +472,7 @@ SECTIONS src/game/multiboot/connection.o(.rodata); src/game/multiboot/collect_rings/time_display.o(.rodata); src/game/math.o(.rodata); - src/game/mystery_item_box.o(.rodata); + src/game/mystery_itembox.o(.rodata); src/game/race_progress.o(.rodata); src/game/multiplayer/mp_attack_1_effect.o(.rodata); src/game/multiplayer_lobby.o(.rodata); @@ -587,7 +587,7 @@ SECTIONS sound/songs/midi/se_amy_super_hammer_attack.o(.rodata); sound/songs/midi/se_amy_hammer_swirl.o(.rodata); sound/songs/midi/se_sa1_goal_post.o(.rodata); - sound/songs/midi/se_item_box.o(.rodata); + sound/songs/midi/se_itembox.o(.rodata); sound/songs/midi/se_timer.o(.rodata); sound/songs/midi/se_stage_result_counter.o(.rodata); sound/songs/midi/se_stage_result_counter_done.o(.rodata); @@ -599,7 +599,7 @@ SECTIONS sound/songs/midi/se_spin.o(.rodata); sound/songs/midi/se_148.o(.rodata); sound/songs/midi/se_time_up.o(.rodata); - sound/songs/midi/se_item_box_2.o(.rodata); + sound/songs/midi/se_itembox_2.o(.rodata); sound/songs/midi/se_151.o(.rodata); sound/songs/midi/se_checkpoint.o(.rodata); sound/songs/midi/se_spring.o(.rodata); diff --git a/songs.mk b/songs.mk index e79a35d946..b85ad53740 100644 --- a/songs.mk +++ b/songs.mk @@ -259,7 +259,7 @@ $(MID_SUBDIR)/se_amy_hammer_swirl.s: %.s: %.mid $(MID_SUBDIR)/se_sa1_goal_post.s: %.s: %.mid $(MID2AGB) $< $@ -C $(MIDI_COMMENTS) -E -R$(STD_REVERB) -G3 -P20 -V120 -$(MID_SUBDIR)/se_item_box.s: %.s: %.mid +$(MID_SUBDIR)/se_itembox.s: %.s: %.mid $(MID2AGB) $< $@ -C $(MIDI_COMMENTS) -E -R$(STD_REVERB) -G0 -P50 -V127 $(MID_SUBDIR)/se_timer.s: %.s: %.mid @@ -295,7 +295,7 @@ $(MID_SUBDIR)/se_148.s: %.s: %.mid $(MID_SUBDIR)/se_time_up.s: %.s: %.mid $(MID2AGB) $< $@ -C $(MIDI_COMMENTS) -E -R$(STD_REVERB) -G3 -P20 -V89 -$(MID_SUBDIR)/se_item_box_2.s: %.s: %.mid +$(MID_SUBDIR)/se_itembox_2.s: %.s: %.mid $(MID2AGB) $< $@ -C $(MIDI_COMMENTS) -E -R$(STD_REVERB) -G0 -P50 -V127 $(MID_SUBDIR)/se_151.s: %.s: %.mid diff --git a/sound/song_table.inc b/sound/song_table.inc index e350e4ddd1..0146a4b3cd 100644 --- a/sound/song_table.inc +++ b/sound/song_table.inc @@ -277,7 +277,7 @@ mAlignWord mAlignWord song C_DECL(dummy_song_header), 0, 0 mAlignWord - song C_DECL(se_item_box), 2, 2 + song C_DECL(se_itembox), 2, 2 mAlignWord song C_DECL(se_timer), 2, 2 mAlignWord @@ -301,7 +301,7 @@ mAlignWord mAlignWord song C_DECL(se_time_up), 3, 3 mAlignWord - song C_DECL(se_item_box_2), 2, 2 + song C_DECL(se_itembox_2), 2, 2 mAlignWord song C_DECL(se_151), 2, 2 mAlignWord diff --git a/sound/songs/midi/se_item_box.mid b/sound/songs/midi/se_itembox.mid old mode 100755 new mode 100644 similarity index 100% rename from sound/songs/midi/se_item_box.mid rename to sound/songs/midi/se_itembox.mid diff --git a/sound/songs/midi/se_item_box_2.mid b/sound/songs/midi/se_itembox_2.mid old mode 100755 new mode 100644 similarity index 100% rename from sound/songs/midi/se_item_box_2.mid rename to sound/songs/midi/se_itembox_2.mid diff --git a/src/game/mystery_item_box.c b/src/game/mystery_itembox.c similarity index 99% rename from src/game/mystery_item_box.c rename to src/game/mystery_itembox.c index 724d878876..880b6407f7 100644 --- a/src/game/mystery_item_box.c +++ b/src/game/mystery_itembox.c @@ -3,7 +3,7 @@ #include "game/sa1_sa2_shared/collision.h" #include "game/entity.h" -#include "game/mystery_item_box.h" +#include "game/mystery_itembox.h" #include "game/multiplayer/multiplayer_event_mgr.h" #include "game/sa1_sa2_shared/dust_cloud.h" #include "game/stage/player.h" diff --git a/src/game/sa1_sa2_shared/item_box.c b/src/game/sa1_sa2_shared/itembox.c similarity index 100% rename from src/game/sa1_sa2_shared/item_box.c rename to src/game/sa1_sa2_shared/itembox.c From 65da3a13098a143260b38efcd289bcde40b1cd3f Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Mon, 20 Oct 2025 23:57:28 +0200 Subject: [PATCH 13/15] Fix build --- ldscript.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ldscript.txt b/ldscript.txt index add3c86660..1c6a132314 100644 --- a/ldscript.txt +++ b/ldscript.txt @@ -375,7 +375,7 @@ SECTIONS src/game/assets/compressed/entities.o(.rodata); src/game/assets/compressed/roms.o(.rodata); - /* "SA1 Leftovers" data */ + /* "sa1_sa2_shared" data */ src/game/sa1_sa2_shared/rings_manager.o(.rodata); src/game/sa1_sa2_shared/entities_manager.o(.rodata); src/game/sa1_sa2_shared/unused_level_select.o(.rodata); From 34c6583262a1b3e6d33614eeb8562ef4ad8a022a Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Tue, 21 Oct 2025 00:04:31 +0200 Subject: [PATCH 14/15] Fix build --- src/game/sa1_sa2_shared/entities_manager.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/sa1_sa2_shared/entities_manager.c b/src/game/sa1_sa2_shared/entities_manager.c index 00239e1dd4..3890053df4 100644 --- a/src/game/sa1_sa2_shared/entities_manager.c +++ b/src/game/sa1_sa2_shared/entities_manager.c @@ -8,7 +8,7 @@ #include "game/sa1_sa2_shared/camera.h" #include "game/entity.h" -#include "game/sa1_sa2_shared/item_box.h" +#include "game/sa1_sa2_shared/itembox.h" #include "game/sa1_sa2_shared/entities_manager.h" #include "game/sa1_sa2_shared/enemy_defeat_score.h" @@ -84,7 +84,7 @@ #include "game/interactables_2/multiplayer_teleport.h" #include "game/interactables_2/sky_canyon_init.h" -#include "game/mystery_item_box.h" +#include "game/mystery_itembox.h" #include "game/enemies/kiki.h" #include "game/enemies/kura_kura.h" From feb16396af81556ad5aef64f90e284867f3e09e3 Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Tue, 21 Oct 2025 00:12:37 +0200 Subject: [PATCH 15/15] Fix collect_rings build --- .vscode/settings.json | 4 ++-- multi_boot/roms/collect_rings/Makefile | 4 ++-- multi_boot/roms/collect_rings/ldscript.txt | 6 +++--- multi_boot/roms/collect_rings/songs.mk | 2 +- multi_boot/roms/collect_rings/sound/song_table.inc | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 438f1b434d..fb3da782b8 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -199,8 +199,8 @@ "heart_particles_effect.h": "c", "results.h": "c", "time_display.h": "c", - "item_box.h": "c", - "mystery_item_box.h": "c", + "itembox.h": "c", + "mystery_itembox.h": "c", "stage_palette_loader.h": "c", "093.h": "c", "flying_handle.h": "c", diff --git a/multi_boot/roms/collect_rings/Makefile b/multi_boot/roms/collect_rings/Makefile index 111631b6b0..239955b572 100644 --- a/multi_boot/roms/collect_rings/Makefile +++ b/multi_boot/roms/collect_rings/Makefile @@ -122,7 +122,7 @@ SA2_C_FILES := \ sa2/game/multiboot/collect_rings/results.c \ sa2/game/sa1_sa2_shared/entities_manager.c \ sa2/game/sa1_sa2_shared/collision.c \ - sa2/game/mystery_item_box.c \ + sa2/game/mystery_itembox.c \ sa2/game/sa1_sa2_shared/rings_manager.c \ sa2/game/multiboot/collect_rings/time_display.c \ sa2/game/multiplayer/indicators.c \ @@ -160,7 +160,7 @@ SA2_MID_FILES := \ sa2/mus_fanfare.mid \ sa2/se_spin_dash_release.mid \ sa2/se_life_lost.mid \ - sa2/se_item_box_2.mid \ + sa2/se_itembox_2.mid \ sa2/se_spikes.mid \ sa2/se_276.mid \ sa2/se_grinding.mid \ diff --git a/multi_boot/roms/collect_rings/ldscript.txt b/multi_boot/roms/collect_rings/ldscript.txt index 027ce156f1..e8541bf48f 100644 --- a/multi_boot/roms/collect_rings/ldscript.txt +++ b/multi_boot/roms/collect_rings/ldscript.txt @@ -46,7 +46,7 @@ SECTIONS { build/collect_rings/src/sa2/game/multiboot/collect_rings/results.o(.text); build/collect_rings/src/sa2/game/sa1_sa2_shared/entities_manager.o(.text); build/collect_rings/src/sa2/game/sa1_sa2_shared/collision.o(.text); - build/collect_rings/src/sa2/game/mystery_item_box.o(.text); + build/collect_rings/src/sa2/game/mystery_itembox.o(.text); build/collect_rings/src/sa2/game/sa1_sa2_shared/rings_manager.o(.text); build/collect_rings/src/sa2/game/multiboot/collect_rings/time_display.o(.text); build/collect_rings/src/sa2/game/multiplayer/indicators.o(.text); @@ -95,7 +95,7 @@ SECTIONS { build/collect_rings/src/sa2/sprite.o(.rodata); build/collect_rings/src/sa2/game/multiplayer/multiplayer_event_mgr.o(.rodata); build/collect_rings/src/sa2/game/sa1_sa2_shared/entities_manager.o(.rodata); - build/collect_rings/src/sa2/game/mystery_item_box.o(.rodata); + build/collect_rings/src/sa2/game/mystery_itembox.o(.rodata); build/collect_rings/src/sa2/game/multiboot/collect_rings/time_display.o(.rodata); build/collect_rings/src/sa2/game/multiplayer/mp_player.o(.rodata); build/collect_rings/src/sa2/game/multiplayer/finish.o(.rodata); @@ -121,7 +121,7 @@ SECTIONS { build/collect_rings/sound/songs/midi/se_rings_lost__collect_rings.o(.rodata); build/collect_rings/sound/songs/midi/se_life_lost.o(.rodata); build/collect_rings/sound/songs/midi/se_time_up.o(.rodata); - build/collect_rings/sound/songs/midi/se_item_box_2.o(.rodata); + build/collect_rings/sound/songs/midi/se_itembox_2.o(.rodata); build/collect_rings/sound/songs/midi/se_spring__collect_rings.o(.rodata); build/collect_rings/sound/songs/midi/se_spikes.o(.rodata); build/collect_rings/sound/songs/midi/se_alarm_1.o(.rodata); diff --git a/multi_boot/roms/collect_rings/songs.mk b/multi_boot/roms/collect_rings/songs.mk index 53ceeb0b69..f736ac3a2b 100644 --- a/multi_boot/roms/collect_rings/songs.mk +++ b/multi_boot/roms/collect_rings/songs.mk @@ -49,7 +49,7 @@ $(MID_SUBDIR)/se_life_lost.s: %.s: %.mid $(MID_SUBDIR)/se_time_up.s: %.s: %.mid $(MID2AGB) $< $@ -C $(MIDI_COMMENTS) -E -R$(STD_REVERB) -G0 -P20 -V89 -$(MID_SUBDIR)/se_item_box_2.s: %.s: %.mid +$(MID_SUBDIR)/se_itembox_2.s: %.s: %.mid $(MID2AGB) $< $@ -C $(MIDI_COMMENTS) -E -R$(STD_REVERB) -G0 -P20 -V127 $(MID_SUBDIR)/se_151.s: %.s: %.mid diff --git a/multi_boot/roms/collect_rings/sound/song_table.inc b/multi_boot/roms/collect_rings/sound/song_table.inc index 741489c32f..30afe4a058 100644 --- a/multi_boot/roms/collect_rings/sound/song_table.inc +++ b/multi_boot/roms/collect_rings/sound/song_table.inc @@ -21,7 +21,7 @@ gSongTable: @ 0x02016D8C song se_rings_lost__collect_rings, 3, 3 song se_life_lost, 2, 2 song se_time_up, 2, 2 - song se_item_box_2, 2, 2 + song se_itembox_2, 2, 2 song se_spring__collect_rings, 2, 2 song se_spikes, 2, 2 song se_alarm_1, 2, 2