collect_rings: match finish

This commit is contained in:
Oliver Bell committed 2025-05-31 13:54:50 +01:00
1 parent d06f1a56db
commit e443e7f215
13 files changed
+69 -313

No files matched your search

+2 -1
View File
@@ -369,7 +369,8 @@
"ceiling_slope.h": "c",
"french_horn.h": "c",
"pipe_sequence.h": "c",
"terrain_collision.h": "c"
"terrain_collision.h": "c",
"indicators.h": "c"
},
"asm-code-lens.donated": true,
"editor.formatOnSave": true,
+2 -2
View File
@@ -3,7 +3,7 @@
#include "global.h"
void sub_8019CCC(u8 sioId, u8 count);
void sub_8019F08(void);
void CreateMultiplayerFinishResult(u8 sioId, u8 count);
void CreateMultiplayerFinishHandler(void);
#endif // GUARD_MULTIPLAYER_FINISH_H
+4
View File
@@ -35,4 +35,8 @@ void sub_8018818(void);
extern bool8 gShouldSpawnMPAttack2Effect;
#if COLLECT_RINGS_ROM
extern const u16 gUnknown_02015B18[];
#endif
#endif
+2 -1
View File
@@ -111,7 +111,8 @@ SA2_C_FILES := \
sa2/game/sa1_sa2_shared/rings_manager.c \
sa2/game/multiboot/collect_rings/time_display.c \
sa2/game/multiplayer/indicators.c \
sa2/game/multiplayer/mp_player.c
sa2/game/multiplayer/mp_player.c \
sa2/game/multiplayer/finish.c
SA2_C_ASM_FILES := \
sa2/lib/m4a/m4a0.s \
+5 -268
View File
@@ -4,274 +4,11 @@
.syntax unified
.arm
thumb_func_start sub_0200A058
sub_0200A058: @ 0x0200A058
push {r4, r5, r6, lr}
movs r2, #0
ldr r6, _0200A0C4 @ =gCurTask
ldr r0, [r6]
ldrh r1, [r0, #6]
movs r0, #0xc0
lsls r0, r0, #0x12
adds r5, r1, r0
ldr r0, _0200A0C8 @ =gGameMode
ldrb r0, [r0]
cmp r0, #5
beq _0200A072
movs r2, #0xf0
_0200A072:
ldr r0, _0200A0CC @ =gRoomEventQueueWritePos
ldr r1, _0200A0D0 @ =gRoomEventQueueSendPos
ldrb r0, [r0]
ldrb r1, [r1]
cmp r0, r1
bne _0200A0BE
ldrh r0, [r5]
adds r1, r0, #1
strh r1, [r5]
lsls r0, r0, #0x10
lsrs r0, r0, #0x10
cmp r0, r2
bls _0200A0BE
ldr r1, _0200A0D4 @ =gBldRegs
movs r4, #0
movs r0, #0xbf
strh r0, [r1]
strh r4, [r1, #4]
ldr r0, _0200A0D8 @ =0x0201F270
movs r1, #4
bl m4aMPlayFadeOut
ldr r0, _0200A0DC @ =0x0201F2B0
movs r1, #4
bl m4aMPlayFadeOut
ldr r0, _0200A0E0 @ =0x0201F2F0
movs r1, #4
bl m4aMPlayFadeOut
ldr r0, _0200A0E4 @ =0x0201F340
movs r1, #4
bl m4aMPlayFadeOut
strh r4, [r5]
ldr r1, [r6]
ldr r0, _0200A0E8 @ =sub_0200A0EC
str r0, [r1, #8]
_0200A0BE:
pop {r4, r5, r6}
pop {r0}
bx r0
.align 2, 0
_0200A0C4: .4byte gCurTask
_0200A0C8: .4byte gGameMode
_0200A0CC: .4byte gRoomEventQueueWritePos
_0200A0D0: .4byte gRoomEventQueueSendPos
_0200A0D4: .4byte gBldRegs
_0200A0D8: .4byte 0x0201F270
_0200A0DC: .4byte 0x0201F2B0
_0200A0E0: .4byte 0x0201F2F0
_0200A0E4: .4byte 0x0201F340
_0200A0E8: .4byte sub_0200A0EC
thumb_func_start sub_0200A0EC
sub_0200A0EC: @ 0x0200A0EC
push {r4, r5, r6, r7, lr}
mov r7, sb
mov r6, r8
push {r6, r7}
sub sp, #8
ldr r0, _0200A1D8 @ =gCurTask
ldr r0, [r0]
ldrh r1, [r0, #6]
movs r0, #0xc0
lsls r0, r0, #0x12
adds r1, r1, r0
ldrh r0, [r1]
adds r0, #0x40
strh r0, [r1]
ldr r2, _0200A1DC @ =gBldRegs
lsls r0, r0, #0x10
lsrs r0, r0, #0x18
strh r0, [r2, #4]
ldrh r1, [r1]
ldr r0, _0200A1E0 @ =0x00000FFF
cmp r1, r0
bhi _0200A11A
b _0200A256
_0200A11A:
movs r0, #0xbf
strh r0, [r2]
movs r0, #0
strh r0, [r2, #4]
ldr r0, _0200A1E4 @ =gGameMode
ldrb r0, [r0]
cmp r0, #5
beq _0200A12C
b _0200A232
_0200A12C:
ldr r1, _0200A1E8 @ =gUnknown_02015B20
mov r0, sp
movs r2, #4
bl memcpy
add r4, sp, #4
adds r0, r4, #0
movs r1, #0
movs r2, #4
bl memset
bl m4aMPlayAllStop
ldr r0, _0200A1EC @ =gMultiplayerCharRings
ldr r0, [r0]
str r0, [sp, #4]
movs r7, #0
mov sb, r4
movs r0, #3
mov ip, r0
_0200A154:
movs r4, #0
cmp r4, ip
bhs _0200A19C
mov r6, sb
mov r8, ip
_0200A15E:
adds r3, r6, r4
adds r5, r4, #1
adds r2, r6, r5
ldrb r0, [r3]
ldrb r1, [r2]
cmp r0, r1
bhs _0200A196
eors r1, r0
strb r1, [r3]
ldrb r0, [r2]
eors r0, r1
strb r0, [r2]
ldrb r1, [r3]
eors r0, r1
strb r0, [r3]
mov r1, sp
adds r3, r1, r4
adds r2, r1, r5
ldrb r1, [r3]
ldrb r0, [r2]
eors r1, r0
strb r1, [r3]
ldrb r0, [r2]
eors r0, r1
strb r0, [r2]
ldrb r1, [r3]
eors r0, r1
strb r0, [r3]
_0200A196:
adds r4, r5, #0
cmp r4, r8
blo _0200A15E
_0200A19C:
movs r0, #1
rsbs r0, r0, #0
add ip, r0
adds r7, #1
cmp r7, #3
bls _0200A154
movs r7, #0
mov r4, sb
ldr r6, _0200A1F0 @ =gUnknown_030054B4
ldr r5, _0200A1F4 @ =gMultiplayerCharacters
mov r3, sp
mov r2, sp
ldr r1, _0200A1F8 @ =gMPRingCollectWins
mov r8, r1
_0200A1B8:
cmp r7, #0
beq _0200A1FC
adds r0, r4, r7
ldrb r0, [r0]
ldrb r1, [r4]
cmp r0, r1
beq _0200A204
ldrb r0, [r2]
adds r0, r0, r6
strb r7, [r0]
ldrb r0, [r2]
adds r0, r0, r5
movs r1, #1
strb r1, [r0]
b _0200A22A
.align 2, 0
_0200A1D8: .4byte gCurTask
_0200A1DC: .4byte gBldRegs
_0200A1E0: .4byte 0x00000FFF
_0200A1E4: .4byte gGameMode
_0200A1E8: .4byte gUnknown_02015B20
_0200A1EC: .4byte gMultiplayerCharRings
_0200A1F0: .4byte gUnknown_030054B4
_0200A1F4: .4byte gMultiplayerCharacters
_0200A1F8: .4byte gMPRingCollectWins
_0200A1FC:
ldrb r1, [r4, #1]
ldrb r0, [r4]
cmp r0, r1
bne _0200A214
_0200A204:
ldrb r0, [r2]
adds r0, r0, r6
strb r7, [r0]
ldrb r0, [r2]
adds r0, r0, r5
movs r1, #2
strb r1, [r0]
b _0200A22A
_0200A214:
ldrb r0, [r3]
adds r0, r0, r6
strb r7, [r0]
ldrb r1, [r3]
add r1, r8
ldrb r0, [r1]
adds r0, #1
strb r0, [r1]
ldrb r0, [r3]
adds r0, r0, r5
strb r7, [r0]
_0200A22A:
adds r2, #1
adds r7, #1
cmp r7, #3
bls _0200A1B8
_0200A232:
ldr r1, _0200A264 @ =0x0000FFFF
movs r0, #0
bl TasksDestroyInPriorityRange
ldr r1, _0200A268 @ =gBackgroundsCopyQueueCursor
ldr r0, _0200A26C @ =gBackgroundsCopyQueueIndex
ldrb r0, [r0]
strb r0, [r1]
ldr r1, _0200A270 @ =gUnknown_03005390
movs r0, #0
strb r0, [r1]
ldr r1, _0200A274 @ =gVramGraphicsCopyCursor
ldr r0, _0200A278 @ =gVramGraphicsCopyQueueIndex
ldrb r0, [r0]
strb r0, [r1]
movs r0, #1
bl CreateMultiplayerSinglePakResultsScreen
_0200A256:
add sp, #8
pop {r3, r4}
mov r8, r3
mov sb, r4
pop {r4, r5, r6, r7}
pop {r0}
bx r0
.align 2, 0
_0200A264: .4byte 0x0000FFFF
_0200A268: .4byte gBackgroundsCopyQueueCursor
_0200A26C: .4byte gBackgroundsCopyQueueIndex
_0200A270: .4byte gUnknown_03005390
_0200A274: .4byte gVramGraphicsCopyCursor
_0200A278: .4byte gVramGraphicsCopyQueueIndex
thumb_func_start sub_0200A27C
sub_0200A27C: @ 0x0200A27C
thumb_func_start CreateMultiplayerFinishHandler
CreateMultiplayerFinishHandler: @ 0x0200A27C
push {r4, lr}
sub sp, #4
ldr r0, _0200A2A4 @ =sub_0200A058
ldr r0, _0200A2A4 @ =Task_801A04C
movs r2, #0x80
lsls r2, r2, #6
movs r4, #0
@@ -289,7 +26,7 @@ sub_0200A27C: @ 0x0200A27C
pop {r0}
bx r0
.align 2, 0
_0200A2A4: .4byte sub_0200A058
_0200A2A4: .4byte Task_801A04C
thumb_func_start sub_0200A2A8
sub_0200A2A8: @ 0x0200A2A8
@@ -17760,7 +17497,7 @@ _02012656:
movs r0, #1
orrs r0, r2
strh r0, [r4]
bl sub_0200A27C
bl CreateMultiplayerFinishHandler
_0201268E:
pop {r4, r5, r6, r7}
pop {r0}
@@ -1,13 +1,5 @@
.section .rodata
.global gUnknown_02015B18
gUnknown_02015B18:
.incbin "data/rom_data.bin", 0x00015A58, 0x8
.global gUnknown_02015B20
gUnknown_02015B20:
.incbin "data/rom_data.bin", 0x00015A60, 0x4
.global gUnknown_02015B24
gUnknown_02015B24:
.incbin "data/rom_data.bin", 0x00015A64, 0x14
@@ -35,6 +35,7 @@ SECTIONS {
build/collect_rings/src/sa2/game/multiboot/collect_rings/time_display.o(.text);
build/collect_rings/src/sa2/game/multiplayer/indicators.o(.text);
build/collect_rings/src/sa2/game/multiplayer/mp_player.o(.text);
build/collect_rings/src/sa2/game/multiplayer/finish.o(.text);
build/collect_rings/asm/code.o(.text);
build/collect_rings/src/sa2/lib/m4a/m4a0.o(.text);
build/collect_rings/src/sa2/lib/m4a/m4a.o(.text);
@@ -62,6 +63,8 @@ SECTIONS {
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/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);
build/collect_rings/data/data.o(.rodata);
build/collect_rings/src/sa2/lib/m4a/m4a_tables.o(.rodata);
build/collect_rings/data/sound_data.o(.rodata);
+4 -4
View File
@@ -198,7 +198,7 @@ static void StageGoalToggle_HandleMultiplayerFinish(void)
}
}
sub_8019CCC(SIO_MULTI_CNT->id, count);
CreateMultiplayerFinishResult(SIO_MULTI_CNT->id, count);
player->unk5C |= 1;
if (count == 0) {
@@ -241,9 +241,9 @@ static UNUSED void StageGoalToggle_ForceMultiplayerFinish(void)
if (gUnknown_030054B4[j] == -1) {
if ((gMultiplayerConnections & (0x10 << (j))) >> ((j + 4))
== (gMultiplayerConnections & (0x10 << (SIO_MULTI_CNT->id))) >> (SIO_MULTI_CNT->id + 4)) {
sub_8019CCC(j, thing);
CreateMultiplayerFinishResult(j, thing);
} else {
sub_8019CCC(j, thing ^ 1);
CreateMultiplayerFinishResult(j, thing ^ 1);
}
}
}
@@ -287,7 +287,7 @@ static void StageGoalToggle_PlayerReachedGoal(void)
}
}
sub_8019F08();
CreateMultiplayerFinishHandler();
TaskDestroy(gCurTask);
}
}
+4 -4
View File
@@ -19,6 +19,10 @@
#include "multi_boot.h"
#include "sio32_multi_load.h"
#if COLLECT_RINGS_ROM
#include "game/multiplayer/mp_player.h"
#endif
#include "data/collect_rings.h"
#include "constants/animations.h"
@@ -64,10 +68,6 @@ void sub_8082BF8(struct MultiplayerSinglePakResultsScreen *);
void sub_8082CEC(Sprite *s, void *vramAddr, u16 animId, u8 variant, s16 x, s16 y, u16 oamFlags, u8 unk25, u32 unk10);
#if COLLECT_RINGS_ROM
extern const u16 gUnknown_02015B18[];
#endif
// TODO: Maybe rename because this is also called before the 1st round?
void CreateMultiplayerSinglePakResultsScreen(u32 a)
{
+28 -16
View File
@@ -9,6 +9,12 @@
#include "game/multiplayer/finish.h"
#include "game/multiplayer/mp_player.h"
#include "game/multiplayer/results.h"
#include "game/multiplayer/multiplayer_event_mgr.h"
#include "game/multiboot/collect_rings/results.h"
#include "lib/m4a/m4a.h"
#include "constants/animations.h"
#include "constants/text.h"
@@ -19,9 +25,19 @@ typedef struct {
u8 unk31;
} MpFinish1; /* size: 0x34 */
typedef struct {
u16 unk0;
} Finish2; /* size: 4 */
void Task_801A04C(void);
void Task_TransitionToResultsScreen(void);
void Task_8019E70(void);
void TaskDestructor_8019EF4(struct Task *);
#ifndef COLLECT_RINGS_ROM
// TODO: split finish result
const TileInfo gUnknown_080D5768[2][7] = { {
// Japanese
{ 0, SA2_ANIM_MP_RESULT_JP, SA2_ANIM_MP_RESULT_WIN },
@@ -57,7 +73,7 @@ const TileInfo gUnknown_080D5768[2][7] = { {
(source + (_id)); \
})
void sub_8019CCC(u8 sioId, u8 count)
void CreateMultiplayerFinishResult(u8 sioId, u8 count)
{
u32 i = 0;
@@ -136,19 +152,7 @@ void TaskDestructor_8019EF4(struct Task *t)
VramFree(s->graphics.dest);
}
#include "game/multiboot/collect_rings/results.h"
#include "game/multiplayer/results.h"
#include "game/multiplayer/multiplayer_event_mgr.h"
#include "lib/m4a/m4a.h"
typedef struct {
u16 unk0;
} Finish2; /* size: 4 */
void Task_801A04C(void);
void Task_TransitionToResultsScreen(void);
void sub_8019F08(void)
void CreateMultiplayerFinishHandler(void)
{
u32 i;
u32 r2;
@@ -205,10 +209,11 @@ void sub_8019F08(void)
mpt = gMultiplayerPlayerTasks[i];
mpp = TASK_DATA(mpt);
mpp->unk5C |= 1;
sub_8019CCC(i, r6);
CreateMultiplayerFinishResult(i, r6);
}
}
}
#endif
void Task_801A04C(void)
{
@@ -325,6 +330,7 @@ void Task_TransitionToResultsScreen(void)
}
// _0801A232
#ifndef COLLECT_RINGS_ROM
{
s16 pid;
s32 foeResult;
@@ -356,6 +362,7 @@ void Task_TransitionToResultsScreen(void)
RecordOwnMultiplayerResult(ownResult);
WriteSaveGame();
}
#endif
#ifndef NON_MATCHING
_0801A2DA:
#endif
@@ -367,11 +374,16 @@ void Task_TransitionToResultsScreen(void)
PAUSE_GRAPHICS_QUEUE();
}
#ifndef COLLECT_RINGS_ROM
if (gGameMode != GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) {
DmaFill32(3, 0, &gMultiSioSend, sizeof(struct MultiSioData_0_0));
CreateMultiplayerResultsScreen(1);
} else {
} else
#endif
{
#ifndef COLLECT_RINGS_ROM
DmaFill32(3, 0, &gMultiSioSend, sizeof(struct MultiSioData_0_0));
#endif
CreateMultiplayerSinglePakResultsScreen(1);
}
+6
View File
@@ -43,6 +43,12 @@ void sub_8017670(void);
void sub_8017C28(void);
void LaunchPlayer(s16);
#if COLLECT_RINGS_ROM
// Can't be sure this was defined here, but it works as it
// may have something to do with the characters
const u16 gUnknown_02015B18[] = { 0x55, 0x59, 0x5D, 0x61 };
#endif
void CreateMultiplayerPlayer(u8 id)
{
u16 *p;
+5 -5
View File
@@ -212,7 +212,7 @@ void ReceiveRoomEvent_ReachedStageGoal(union MultiSioData *recv, u8 i)
}
if (gUnknown_030054B4[i] == -1) {
sub_8019CCC(i, count2);
CreateMultiplayerFinishResult(i, count2);
} else {
somebool = 1;
}
@@ -221,7 +221,7 @@ void ReceiveRoomEvent_ReachedStageGoal(union MultiSioData *recv, u8 i)
for (j = 0; j < 4 && gMultiplayerPlayerTasks[j] != NULL; j++) {
if (j != i && gUnknown_030054B4[j] == -1
&& (gMultiplayerConnections & (0x10 << (j))) >> ((j + 4)) == (gMultiplayerConnections & (0x10 << (i))) >> (i + 4)) {
sub_8019CCC(j, count2);
CreateMultiplayerFinishResult(j, count2);
if (j == SIO_MULTI_CNT->id) {
Player_TransitionCancelFlyingAndBoost(&gPlayer);
gPlayer.moveState &= ~MOVESTATE_STOOD_ON_OBJ;
@@ -265,11 +265,11 @@ void ReceiveRoomEvent_ReachedStageGoal(union MultiSioData *recv, u8 i)
mpp2 = TASK_DATA(gMultiplayerPlayerTasks[j]);
if (gUnknown_030054B4[j] == -1) {
if (gGameMode == GAME_MODE_TEAM_PLAY) {
sub_8019CCC(j, 1);
CreateMultiplayerFinishResult(j, 1);
} else {
u32 temp;
RoomEvent *roomEvent;
sub_8019CCC(j, count - 1);
CreateMultiplayerFinishResult(j, count - 1);
mpp2->unk5C |= 1;
gPlayer.moveState |= MOVESTATE_IGNORE_INPUT;
gPlayer.heldInput = 0;
@@ -284,7 +284,7 @@ void ReceiveRoomEvent_ReachedStageGoal(union MultiSioData *recv, u8 i)
}
if (!somebool) {
sub_8019F08();
CreateMultiplayerFinishHandler();
}
}
}
+4 -4
View File
@@ -429,9 +429,9 @@ void Task_GameStage(void)
} else {
gStageFlags |= STAGE_FLAG__ACT_START;
#if (GAME == GAME_SA1)
sa2__sub_8019F08();
sa2__CreateMultiplayerFinishHandler();
#elif (GAME == GAME_SA2)
sub_8019F08();
CreateMultiplayerFinishHandler();
#endif
}
} else {
@@ -465,9 +465,9 @@ void Task_GameStage(void)
} else {
gStageFlags |= STAGE_FLAG__ACT_START;
#if (GAME == GAME_SA1)
sa2__sub_8019F08();
sa2__CreateMultiplayerFinishHandler();
#elif (GAME == GAME_SA2)
sub_8019F08();
CreateMultiplayerFinishHandler();
#endif
}
}