From 6bca3518b04e1077567e3a12b779a8e71bd7b9b6 Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Fri, 27 Mar 2026 19:06:52 +0100 Subject: [PATCH 01/17] Start Rings Manager --- asm/code_0_3.s | 2 +- asm/game__sa1_sa2_shared__rings_manager.s | 44 +- include/module_unclear.h | 2 +- src/game/enemies/bu_bu.c | 2 +- .../unfinished__rings_manager.c | 1081 +++++++++++++++++ src/platform/shared/stub.c | 2 +- 6 files changed, 1107 insertions(+), 26 deletions(-) create mode 100644 src/game/sa1_sa2_shared/unfinished__rings_manager.c diff --git a/asm/code_0_3.s b/asm/code_0_3.s index 846bc1965..34db73c67 100644 --- a/asm/code_0_3.s +++ b/asm/code_0_3.s @@ -700,7 +700,7 @@ _0802B2AA: lsls r1, r7, #0x10 asrs r0, r0, #0x10 asrs r1, r1, #0x10 - bl sub_8029C54 + bl CreateCollectRingEffect cmp r5, #0 beq _0802B2CA mov r2, r8 diff --git a/asm/game__sa1_sa2_shared__rings_manager.s b/asm/game__sa1_sa2_shared__rings_manager.s index bc41d78ce..f78d2ff20 100644 --- a/asm/game__sa1_sa2_shared__rings_manager.s +++ b/asm/game__sa1_sa2_shared__rings_manager.s @@ -21,13 +21,13 @@ CreateStageRingsManager: @ 0x08029AE0 adds r4, r0, #0 cmp r1, #0x48 beq _08029B04 - ldr r0, _08029B00 @ =sub_8029DE0 + ldr r0, _08029B00 @ =Task_RingsMgrStage b _08029B06 .align 2, 0 _08029AFC: .4byte gStageData -_08029B00: .4byte sub_8029DE0 +_08029B00: .4byte Task_RingsMgrStage _08029B04: - ldr r0, _08029B4C @ =sub_802A6C4 + ldr r0, _08029B4C @ =Task_RingsMgrExtraZone _08029B06: movs r2, #0xa0 lsls r2, r2, #6 @@ -62,7 +62,7 @@ _08029B32: ldr r0, _08029B5C @ =0x06014180 b _08029B66 .align 2, 0 -_08029B4C: .4byte sub_802A6C4 +_08029B4C: .4byte Task_RingsMgrExtraZone _08029B50: .4byte TaskDestructor_RingsMgr _08029B54: .4byte gUnknown_080CEF58 _08029B58: .4byte gStageData @@ -184,8 +184,8 @@ _08029C48: .4byte gMPlayInfo_SE1 _08029C4C: .4byte song117 _08029C50: .4byte 0x0000FFFF - thumb_func_start sub_8029C54 -sub_8029C54: @ 0x08029C54 + thumb_func_start CreateCollectRingEffect +CreateCollectRingEffect: @ 0x08029C54 push {r4, r5, r6, r7, lr} sub sp, #4 lsls r0, r0, #0x10 @@ -281,8 +281,8 @@ _08029D18: .4byte gStageData @ --- entities_manager ? --- - thumb_func_start sub_8029D1C -sub_8029D1C: @ 0x08029D1C + thumb_func_start CreateCollectRingEffectNoSfx +CreateCollectRingEffectNoSfx: @ 0x08029D1C push {r4, r5, r6, r7, lr} sub sp, #4 lsls r0, r0, #0x10 @@ -375,8 +375,8 @@ _08029DD4: .4byte 0x00000536 _08029DD8: .4byte 0x0000FFFF _08029DDC: .4byte gStageData - thumb_func_start sub_8029DE0 -sub_8029DE0: @ 0x08029DE0 + thumb_func_start Task_RingsMgrStage +Task_RingsMgrStage: @ 0x08029DE0 push {r4, r5, r6, r7, lr} mov r7, sl mov r6, sb @@ -697,7 +697,7 @@ _0802A034: asrs r0, r0, #0x10 lsls r1, r6, #0x10 asrs r1, r1, #0x10 - bl sub_8029C54 + bl CreateCollectRingEffect movs r0, #0xfe strb r0, [r5] _0802A044: @@ -1276,7 +1276,7 @@ _0802A46A: asrs r0, r0, #0x10 lsls r1, r6, #0x10 asrs r1, r1, #0x10 - bl sub_8029C54 + bl CreateCollectRingEffect b _0802A4AE .align 2, 0 _0802A490: .4byte gStageData @@ -1285,14 +1285,14 @@ _0802A494: asrs r0, r0, #0x10 lsls r1, r6, #0x10 asrs r1, r1, #0x10 - bl sub_8029D1C + bl CreateCollectRingEffectNoSfx b _0802A4AE _0802A4A2: lsls r0, r7, #0x10 asrs r0, r0, #0x10 lsls r1, r6, #0x10 asrs r1, r1, #0x10 - bl sub_8029D1C + bl CreateCollectRingEffectNoSfx _0802A4AE: movs r0, #0xfe strb r0, [r5] @@ -1574,8 +1574,8 @@ _0802A6B8: .4byte 0x80000003 _0802A6BC: .4byte gCamera _0802A6C0: .4byte 0x000001FF - thumb_func_start sub_802A6C4 -sub_802A6C4: @ 0x0802A6C4 + thumb_func_start Task_RingsMgrExtraZone +Task_RingsMgrExtraZone: @ 0x0802A6C4 push {r4, r5, r6, r7, lr} mov r7, sl mov r6, sb @@ -1874,7 +1874,7 @@ _0802A8F6: asrs r0, r0, #0x10 lsls r1, r6, #0x10 asrs r1, r1, #0x10 - bl sub_8029C54 + bl CreateCollectRingEffect movs r0, #0xfe strb r0, [r5] _0802A90C: @@ -2161,7 +2161,7 @@ sub_802AB10: @ 0x0802AB10 lsrs r4, r4, #0x10 lsls r5, r5, #0x10 lsrs r5, r5, #0x10 - ldr r0, _0802AB7C @ =sub_802AB8C + ldr r0, _0802AB7C @ =Task_802AB8C movs r2, #0x80 lsls r2, r2, #6 movs r6, #0 @@ -2203,13 +2203,13 @@ sub_802AB10: @ 0x0802AB10 pop {r0} bx r0 .align 2, 0 -_0802AB7C: .4byte sub_802AB8C +_0802AB7C: .4byte Task_802AB8C _0802AB80: .4byte 0x06014180 _0802AB84: .4byte 0x00000535 _0802AB88: .4byte 0x00041200 - thumb_func_start sub_802AB8C -sub_802AB8C: @ 0x0802AB8C + thumb_func_start Task_802AB8C +Task_802AB8C: @ 0x0802AB8C push {r4, r5, r6, r7, lr} mov r7, sl mov r6, sb @@ -2350,7 +2350,7 @@ _0802AC84: asrs r0, r0, #0x10 mov r2, r8 asrs r1, r2, #0x10 - bl sub_8029C54 + bl CreateCollectRingEffect _0802ACA4: ldr r0, _0802ACB0 @ =gCurTask ldr r0, [r0] diff --git a/include/module_unclear.h b/include/module_unclear.h index ce6f380d0..f3a7ca9f6 100644 --- a/include/module_unclear.h +++ b/include/module_unclear.h @@ -126,7 +126,7 @@ typedef struct Strc3001CFC { extern struct Task *gTask_03001CFC; // -> Strc3001CFC s32 sub_8011BFC(u8, Player *p); -extern void sub_8029C54(s32 param0, s32 param1); +extern void CreateCollectRingEffect(s32 param0, s32 param1); void sub_80533F4(u32 character); // related to Special Springs diff --git a/src/game/enemies/bu_bu.c b/src/game/enemies/bu_bu.c index 258e5edee..42561f38a 100644 --- a/src/game/enemies/bu_bu.c +++ b/src/game/enemies/bu_bu.c @@ -235,7 +235,7 @@ bool32 sub_805EEB4(BuBu *enemy) } if ((mat1 == 1) && (mat2 == 1)) { - sub_8029C54(I(strc->unk28[i].unk0), I(strc->unk28[i].unk4)); + CreateCollectRingEffect(I(strc->unk28[i].unk0), I(strc->unk28[i].unk4)); } } } diff --git a/src/game/sa1_sa2_shared/unfinished__rings_manager.c b/src/game/sa1_sa2_shared/unfinished__rings_manager.c new file mode 100644 index 000000000..dad24993d --- /dev/null +++ b/src/game/sa1_sa2_shared/unfinished__rings_manager.c @@ -0,0 +1,1081 @@ +#define NULL 0 + +void AddRings(s32); +void TaskDestructor_RingsMgr(Task *); +void Task_RingsMgrExtraZone(); +void Task_RingsMgrStage(); +void sub_802AB10(s16 arg0, s16 arg1, Player *p); +void sub_802AB8C(); +void Task_802ACF0(); +extern u32 *gUnknown_080CEF58[]; +extern struct MP2KSongHeader song117; + +typedef struct RingsManager { + /* 0x00 */ Sprite s; + /* 0x28 */ u8 *ringPositions; +} RingsManager; + +typedef struct RingsMgrUnk2C { + /* 0x00 */ Sprite s; + /* 0x28 */ u8 unk28; + /* 0x29 */ u8 unk29; +} RingsMgrUnk2C; + +typedef struct RingsMgrUnk30 { + /* 0x00 */ Sprite s; + /* 0x28 */ Player *p; + /* 0x2C */ s16 magnitude; +} RingsMgrUnk30; + +void CreateStageRingsManager(void) +{ + Task *t; + s32 temp_r4; + s32 var_r0_2; + u16 temp_r0; + u32 **temp_r4_2; + u32 **ringsArray; + u32 **ringsCompressed; + void (*var_r0)(); + RingsManager *temp_r0_2; + s16 mapIndex = gStageData.currMapIndex; + void *var_r5; + Sprite *s; + + if (gStageData.gameMode != 7) { + if (mapIndex != 72) { + t = TaskCreate(Task_RingsMgrStage, sizeof(RingsManager), 0x2800U, 0U, TaskDestructor_RingsMgr); + } else { + t = TaskCreate(Task_RingsMgrExtraZone, sizeof(RingsManager), 0x2800U, 0U, TaskDestructor_RingsMgr); + } + + // NOTE: First 4 byte of RL-compressed data contains uncompressed size. + ringsArray = gUnknown_080CEF58; + ringsCompressed = &ringsArray[mapIndex]; + var_r5 = EwramMalloc(**ringsCompressed >> 8); + RLUnCompWram(*ringsCompressed, var_r5); + } + temp_r0_2 = TASK_DATA(t); + temp_r0_2->ringPositions = var_r5; + s = &temp_r0_2->s; + if (gStageData.gameMode < 6) { + s->tiles = OBJ_VRAM0 + 0x4180; + } else if (gStageData.gameMode == 6) { + s->tiles = OBJ_VRAM0 + 0x41A0; + } + + s->frameFlags = 0x41200; + s->anim = ANIM_RING; + s->x = DISPLAY_CENTER_X; + s->y = DISPLAY_CENTER_Y; + s->oamFlags = 0x280; + s->qAnimDelay = 0; + s->prevAnim = 0xFFFF; + s->variant = 0; + s->prevVariant = 0xFF; + s->animSpeed = 0x10; + s->palId = 0; + s->hitboxes[0].index = -1; +} + +void PlayRingCollectSE(void) +{ + if ((gStageData.gameMode != 2) + && (((gStageData.unk4 != 9) && (gStageData.unk4 != 4) && (gStageData.unk4 != 5) && (gStageData.unk4 != 6)) + || (gStageData.zone != 7))) { + if (gStageData.rings & 1) { + MPlayStart(&gMPlayInfo_SE2, &song117); + m4aMPlayImmInit(&gMPlayInfo_SE2); + m4aMPlayVolumeControl(&gMPlayInfo_SE2, 0xFFFFU, 128); + m4aMPlayPanpotControl(&gMPlayInfo_SE2, 0xFFFFU, -64); + } else { + MPlayStart(&gMPlayInfo_SE1, &song117); + m4aMPlayImmInit(&gMPlayInfo_SE1); + m4aMPlayVolumeControl(&gMPlayInfo_SE1, 0xFFFFU, 128); + m4aMPlayPanpotControl(&gMPlayInfo_SE1, 0xFFFFU, +64); + } + } +} + +void CreateCollectRingEffect(s16 worldX, s16 worldY) +{ + RingsMgrUnk2C *strc; + Sprite *s; + s32 var_r0; + u16 temp_r2; + + if (gStageData.unkB5 < 8) { + strc = TASK_DATA(TaskCreate(Task_802ACF0, sizeof(RingsMgrUnk2C), 0x2810U, 0U, NULL)); + strc->unk29 = 0; + strc->unk28 = (s8)(1 & gStageData.rings); + s = &strc->s; + if (gStageData.gameMode < 6) { + s->tiles = OBJ_VRAM0 + 0x4380; + } else if (gStageData.gameMode == 6) { + s->tiles = OBJ_VRAM0 + 0x43A0; + } + s->frameFlags = 0x41200; + s->anim = ANIM_RING_COLLECT_EFFECT; + // NOTE: Initializing sprite pos to world pos + s->x = worldX; + s->y = worldY; + s->oamFlags = 0x280; + s->qAnimDelay = 0; + s->prevAnim = 0xFFFF; + s->variant = 0; + s->prevVariant = 0xFF; + s->animSpeed = 0x10; + s->palId = 0; + s->hitboxes[0].index = -1; + gStageData.unkB5++; + PlayRingCollectSE(); + } +} + +// Like CreateCollectRingEffect(), just no sound effect. +void CreateCollectRingEffectNoSfx(s16 worldX, s16 worldY) +{ + RingsMgrUnk2C *strc; + Sprite *s; + s32 var_r0; + u16 temp_r2; + + if (gStageData.unkB5 < 8) { + strc = TASK_DATA(TaskCreate(Task_802ACF0, sizeof(RingsMgrUnk2C), 0x2810U, 0U, NULL)); + strc->unk29 = 0; + strc->unk28 = (s8)(1 & gStageData.rings); + s = &strc->s; + if (gStageData.gameMode < 6) { + s->tiles = OBJ_VRAM0 + 0x4380; + } else if (gStageData.gameMode == 6) { + s->tiles = OBJ_VRAM0 + 0x43A0; + } + s->frameFlags = 0x41200; + s->anim = ANIM_RING_COLLECT_EFFECT; + // NOTE: Initializing sprite pos to world pos + s->x = worldX; + s->y = worldY; + s->oamFlags = 0x280; + s->qAnimDelay = 0; + s->prevAnim = 0xFFFF; + s->variant = 0; + s->prevVariant = 0xFF; + s->animSpeed = 0x10; + s->palId = 0; + s->hitboxes[0].index = -1; + gStageData.unkB5++; + } +} + +#if 0 +void Task_RingsMgrStage(void) { + Sprite *sp4; + void *sp8; + SpriteOffset *spC; + u32 sp10; + u32 sp14; + s32 sp18; + s32 sp1C; + ? *sp20; + ? *sp24; + s32 sp28; + ? *sp2C; + ? *sp30; + s32 sp34; + s32 sp38; + s32 sp3C; + s32 sp40; + u8 *sp44; + OamData *sp48; + OamData *temp_r0_14; + OamData *temp_r0_7; + OamData *temp_r2_12; + OamData *temp_r2_14; + Player *temp_r0; + Player *temp_r0_2; + Player *var_sb; + Sprite *temp_r1; + s16 temp_r6_4; + s16 temp_r7; + s16 temp_r7_2; + s16 temp_r7_3; + s32 temp_r0_11; + s32 temp_r0_12; + s32 temp_r0_13; + s32 temp_r0_3; + s32 temp_r0_5; + s32 temp_r0_6; + s32 temp_r1_10; + s32 temp_r1_11; + s32 temp_r1_12; + s32 temp_r1_2; + s32 temp_r1_4; + s32 temp_r1_5; + s32 temp_r1_6; + s32 temp_r1_7; + s32 temp_r1_9; + s32 temp_r2_10; + s32 temp_r2_11; + s32 temp_r2_3; + s32 temp_r2_4; + s32 temp_r2_7; + s32 temp_r2_8; + s32 temp_r2_9; + s32 temp_r6_2; + s32 temp_r6_3; + s32 temp_r6_5; + s32 temp_r7_4; + s32 var_r0; + s32 var_r0_2; + s32 var_r1_4; + s32 var_r2; + s32 var_r2_2; + s32 var_r3; + s32 var_r3_2; + s8 *temp_r1_3; + s8 *temp_r1_8; + s8 *temp_r2_2; + s8 *temp_r2_6; + s8 temp_r3; + s8 temp_r3_2; + s8 temp_r3_3; + s8 temp_r3_4; + u16 temp_r0_15; + u16 temp_r0_16; + u16 temp_r0_8; + u16 temp_r0_9; + u16 temp_r2_13; + u16 temp_r2_15; + u16 temp_r3_5; + u16 temp_r3_6; + u32 temp_r1_13; + u32 temp_r1_15; + u32 temp_r1_16; + u32 temp_r2; + u32 var_r8; + u32 var_r8_2; + u32 var_r8_3; + u32 var_r8_4; + u32 var_sl; + u32 var_sl_2; + u32 var_sl_3; + u32 var_sl_4; + u8 *var_r5; + u8 *var_r5_2; + u8 temp_r0_10; + u8 temp_r0_4; + u8 temp_r1_14; + u8 temp_r1_17; + u8 temp_r2_5; + u8 var_r1; + u8 var_r1_2; + u8 var_r1_3; + void *temp_r6; + void *var_r5_3; + void *var_r5_4; + + var_sb = saved_reg_r9; + temp_r1 = gCurTask->data + 0x03000000; + sp4 = temp_r1; + sp8 = temp_r1->unk28; + sp18 = 0; + UpdateSpriteAnimation(sp4); + temp_r2 = sp4->frameNum; + if ((temp_r2 >> 0x1C) == 0) { + spC = &gRefSpriteTables->dimensions[sp4->anim][temp_r2]; + } else { + spC = gRefSpriteTables->dimensions[sp4->anim] + (temp_r2 * 0x10); + } + temp_r6 = sp8 + 4; + sp10 = (u32) (u16) sp8->unk4; + sp8 = temp_r6 + 4 + 4; + sp14 = (u32) (u16) temp_r6->unk4; + if ((u32) gStageData.gameMode > 5U) { + sp1C = 0; + sp2C = &subroutine_arg0; +loop_94: + sp28 = 0; + temp_r0 = &gPlayers[sp1C]; + temp_r1_2 = 0x1C & temp_r0->unk2B; + sp40 = sp1C + 1; + if (temp_r1_2 == 0x14) { + + } else if (temp_r1_2 == 8) { + + } else { + temp_r0_2 = &gPlayers[gStageData.playerIndex]; + if ((temp_r0 == temp_r0_2) || (temp_r0 == &gPlayers[(u32) (temp_r0_2->unk2B << 0x1E) >> 0x1E])) { + sp28 = 1; + } + sp40 = sp1C + 1; + if (temp_r0->moveState & 0x100) { + + } else if (temp_r0->charFlags.anim0 == 0x66) { + + } else if (temp_r0->unk48 != 0) { + + } else { + temp_r1_3 = &temp_r0->spriteOffsetX; + sp2C->unk0 = (s8) (0 - (u8) *temp_r1_3); + temp_r2_2 = &temp_r0->spriteOffsetY; + sp2C->unk1 = (s8) (0 - (u8) *temp_r2_2); + sp2C->unk2 = (u8) *temp_r1_3; + sp2C->unk3 = (u8) *temp_r2_2; + temp_r1_4 = (s32) temp_r0->qWorldY >> 8; + var_sl = (u32) ((temp_r1_4 + sp2C->unk1) << 8) >> 0x10; + if ((s32) var_sl > (s32) ((s32) ((s8) sp2C->unk3 + temp_r1_4 + 8) >> 8)) { + + } else if (var_sl >= sp14) { + + } else { + sp30 = &subroutine_arg0; +loop_112: + var_r2 = temp_r0->qWorldX; + temp_r1_5 = var_r2 >> 8; + var_r8 = (u32) (((temp_r1_5 + sp30->unk0) - 8) << 8) >> 0x10; + var_r0 = (s32) (sp30->unk2 + temp_r1_5 + 0x10) >> 8; + var_r3 = temp_r0->qWorldY; + sp3C = var_sl + 1; +loop_135: + if (((s32) var_r8 <= var_r0) && (var_r8 < sp10)) { + temp_r0_3 = *((var_r8 * 4) + ((sp10 * var_sl * 4) + sp8)); + sp38 = var_r8 + 1; + if (temp_r0_3 != 0) { + var_r5 = sp8 + (temp_r0_3 - 8); + var_r1 = *var_r5; + if (var_r1 != 0xFF) { + do { + if (var_r1 == 0xFE) { + var_r5 += 2; + } else { + temp_r7 = (var_r5->unk0 * 8) + (var_r8 << 8); + temp_r6_2 = (var_r5->unk1 * 8) + (var_sl << 8); + temp_r2_3 = temp_r7 - 8; + temp_r3 = subroutine_arg0.unk0; + temp_r1_6 = ((s32) temp_r0->qWorldX >> 8) + temp_r3; + if (temp_r2_3 <= temp_r1_6) { + if ((s32) (temp_r7 + 8) < temp_r1_6) { + if (temp_r2_3 >= temp_r1_6) { + goto block_121; + } + } else { + goto block_122; + } + } else { +block_121: + if ((s32) (temp_r1_6 + (subroutine_arg0.unk2 - temp_r3)) >= temp_r2_3) { +block_122: + temp_r2_4 = temp_r6_2 - 0x10; + temp_r3_2 = subroutine_arg0.unk1; + temp_r1_7 = ((s32) temp_r0->qWorldY >> 8) + temp_r3_2; + if (temp_r2_4 <= temp_r1_7) { + if (temp_r6_2 < temp_r1_7) { + if (temp_r2_4 >= temp_r1_7) { + goto block_125; + } + } else { + goto block_126; + } + } else { +block_125: + if ((s32) (temp_r1_7 + (subroutine_arg0.unk3 - temp_r3_2)) >= temp_r2_4) { +block_126: + if (sp28 != 0) { + if (gStageData.playerIndex == sp1C) { + AddRings(1); + CreateCollectRingEffect((s32) temp_r7, (s32) (s16) temp_r6_2); + } else { + CreateCollectRingEffectNoSfx((u16) temp_r7, (u16) (s16) temp_r6_2); + } + } else { + CreateCollectRingEffectNoSfx((u16) temp_r7, (u16) (s16) temp_r6_2); + } + var_r5->unk0 = 0xFE; + } + } + } + } + var_r5 += 2; + var_r3 = temp_r0->qWorldY; + var_r2 = temp_r0->qWorldX; + } + var_r1 = *var_r5; + } while (var_r1 != 0xFF); + } + } + var_r8 = (u32) (u16) sp38; + var_r0 = (s32) (sp30->unk2 + (var_r2 >> 8) + 0x10) >> 8; + goto loop_135; + } + var_sl = (u32) (u16) sp3C; + if (((s32) var_sl <= (s32) ((s32) (sp30->unk3 + (var_r3 >> 8) + 8) >> 8)) && (var_sl < sp14)) { + goto loop_112; + } + } + } + } + temp_r0_4 = (u8) sp40; + sp1C = (s32) temp_r0_4; + if ((u32) temp_r0_4 <= 3U) { + goto loop_94; + } + goto block_143; + } + sp1C = 0; + sp20 = &subroutine_arg0; +loop_6: + if (sp1C == 0) { + var_r1_2 = gStageData.playerIndex; + } else { + var_r1_2 = (u8) ((u32) (var_sb->unk2B << 0x1E) >> 0x1E); + } + var_sb = &gPlayers[var_r1_2]; + if (var_sb->moveState & 0x100) { + goto block_90; + } + if (var_sb->charFlags.anim0 == 0x66) { + goto block_90; + } + if (var_sb->unk48 != 0) { + goto block_90; + } + temp_r2_5 = var_sb->unk2B; + sp44 = var_sb + 0x2B; + if (((0x1C & temp_r2_5) == 8) && (*((((u32) (temp_r2_5 << 0x1E) >> 0x1E) * 0x150) + &gPlayers->moveState) & 0x100)) { + goto block_90; + } + temp_r1_8 = &var_sb->spriteOffsetX; + sp20->unk0 = (s8) (0 - (u8) *temp_r1_8); + temp_r2_6 = &var_sb->spriteOffsetY; + sp20->unk1 = (s8) (0 - (u8) *temp_r2_6); + sp20->unk2 = (u8) *temp_r1_8; + sp20->unk3 = (u8) *temp_r2_6; + temp_r1_9 = (s32) var_sb->qWorldY >> 8; + var_sl_2 = (u32) ((temp_r1_9 + sp20->unk1) << 8) >> 0x10; + if ((s32) var_sl_2 > (s32) ((s32) ((s8) sp20->unk3 + temp_r1_9 + 8) >> 8)) { + + } else if (var_sl_2 >= sp14) { + + } else { + sp24 = &subroutine_arg0; +loop_23: + var_r2_2 = var_sb->qWorldX; + temp_r1_10 = var_r2_2 >> 8; + var_r8_2 = (u32) (((temp_r1_10 + sp24->unk0) - 8) << 8) >> 0x10; + var_r3_2 = var_sb->qWorldY; + sp3C = var_sl_2 + 1; + if ((s32) var_r8_2 > (s32) ((s32) (sp24->unk2 + temp_r1_10 + 0x10) >> 8)) { + + } else if (var_r8_2 >= sp10) { + + } else { +loop_27: + temp_r0_5 = *((var_r8_2 * 4) + ((sp10 * var_sl_2 * 4) + sp8)); + sp38 = var_r8_2 + 1; + if (temp_r0_5 != 0) { + var_r5_2 = sp8 + (temp_r0_5 - 8); + var_r1_3 = *var_r5_2; + if (var_r1_3 != 0xFF) { + do { + if (var_r1_3 == 0xFE) { + var_r5_2 += 2; + } else { + temp_r7_2 = (var_r5_2->unk0 * 8) + (var_r8_2 << 8); + temp_r6_3 = (var_r5_2->unk1 * 8) + (var_sl_2 << 8); + temp_r2_7 = temp_r7_2 - 8; + temp_r3_3 = subroutine_arg0.unk0; + temp_r1_11 = ((s32) var_sb->qWorldX >> 8) + temp_r3_3; + if (temp_r2_7 <= temp_r1_11) { + if ((s32) (temp_r7_2 + 8) < temp_r1_11) { + if (temp_r2_7 >= temp_r1_11) { + goto block_35; + } + } else { + goto block_36; + } + } else { +block_35: + if ((s32) (temp_r1_11 + (subroutine_arg0.unk2 - temp_r3_3)) >= temp_r2_7) { +block_36: + temp_r2_8 = temp_r6_3 - 0x10; + temp_r3_4 = subroutine_arg0.unk1; + temp_r1_12 = ((s32) var_sb->qWorldY >> 8) + temp_r3_4; + if (temp_r2_8 <= temp_r1_12) { + if (temp_r6_3 < temp_r1_12) { + if (temp_r2_8 >= temp_r1_12) { + goto block_39; + } + } else { + goto block_40; + } + } else { +block_39: + if ((s32) (temp_r1_12 + (subroutine_arg0.unk3 - temp_r3_4)) >= temp_r2_8) { +block_40: + if ((sp1C == 0) || ((0x1C & *sp44) == 8)) { + AddRings(1); + } + CreateCollectRingEffect((s32) temp_r7_2, (s32) (s16) temp_r6_3); + var_r5_2->unk0 = 0xFE; + } + } + } + } + var_r5_2 += 2; + var_r3_2 = var_sb->qWorldY; + var_r2_2 = var_sb->qWorldX; + } + var_r1_3 = *var_r5_2; + } while (var_r1_3 != 0xFF); + } + } + var_r8_2 = (u32) (u16) sp38; + if (((s32) var_r8_2 <= (s32) ((s32) (sp24->unk2 + (var_r2_2 >> 8) + 0x10) >> 8)) && (var_r8_2 < sp10)) { + goto loop_27; + } + } + var_sl_2 = (u32) (u16) sp3C; + if (((s32) var_sl_2 <= (s32) ((s32) (sp24->unk3 + (var_r3_2 >> 8) + 8) >> 8)) && (var_sl_2 < sp14)) { + goto loop_23; + } + } + var_sl_3 = (u32) (gCamera.y << 8) >> 0x10; + if (!(0x20 & var_sb->unk13C)) { + goto block_90; + } + if ((s32) (var_sl_3 << 8) >= (s32) (gCamera.y + 0xA0)) { + goto block_90; + } + if (var_sl_3 >= sp14) { + goto block_90; + } +loop_58: + temp_r1_13 = (u32) (gCamera.x << 8) >> 0x10; + var_r8_3 = temp_r1_13; + if ((s32) (temp_r1_13 << 8) >= (s32) (gCamera.x + 0xF0)) { + goto block_87; + } + temp_r2_9 = sp10 * var_sl_3; + var_r0_2 = *((var_r8_3 * 4) + ((temp_r2_9 * 4) + sp8)); + sp34 = temp_r2_9; + if (var_r8_3 >= sp10) { + goto block_87; + } +loop_62: + if (var_r0_2 == 0) { + goto block_84; + } + var_r5_3 = sp8 + (var_r0_2 - 8); +loop_82: + temp_r1_14 = var_r5_3->unk0; + switch (temp_r1_14) { /* irregular */ + default: + temp_r7_3 = (var_r5_3->unk0 * 8) + (var_r8_3 << 8); + temp_r6_4 = (var_r5_3->unk1 * 8) + (var_sl_3 << 8); + if ((u32) ((temp_r7_3 - gCamera.x) + 8) <= 0x100U) { + temp_r0_6 = temp_r6_4 - gCamera.y; + if ((temp_r0_6 >= 0) && ((s32) (temp_r0_6 - 0x10) <= 0xA0)) { + temp_r2_10 = (s32) var_sb->qWorldX >> 8; + if (((s32) (temp_r7_3 - 0x40) <= temp_r2_10) && ((s32) (temp_r7_3 + 0x40) >= temp_r2_10)) { + temp_r2_11 = (s32) var_sb->qWorldY >> 8; + if (((s32) (temp_r6_4 - 0x48) <= temp_r2_11) && ((s32) (temp_r6_4 + 0x38) >= temp_r2_11)) { + sub_802AB10(temp_r7_3, temp_r6_4, var_sb); + var_r5_3->unk0 = 0xFEU; + goto block_74; + } + } + var_r5_3 += 2; + if ((sp18 == 0) || (sp4->oamBaseIndex == 0xFF)) { + sp4->oamBaseIndex = 0xFF; + sp4->x = temp_r7_3 - gCamera.x; + sp4->y = temp_r6_4 - gCamera.y; + DisplaySprite(sp4); + goto block_81; + } + temp_r2_12 = &gOamMallocBuffer[sp4->oamBaseIndex]; + sp48 = temp_r2_12; + temp_r0_7 = OamMalloc((u8) ((u32) ((u16) sp4->oamFlags & 0x7C0) >> 6)); + if (iwram_end == temp_r0_7) { + return; + } + (void *)0x040000D4->unk0 = temp_r2_12; + (void *)0x040000D4->unk4 = temp_r0_7; + (void *)0x040000D4->unk8 = 0x80000003; + temp_r3_5 = temp_r0_7->all.attr1 & 0xFE00; + temp_r0_7->all.attr1 = temp_r3_5; + temp_r2_13 = temp_r0_7->all.attr0 & 0xFF00; + temp_r0_7->all.attr0 = temp_r2_13; + temp_r0_7->all.attr0 = temp_r2_13 + (u8) ((temp_r6_4 - gCamera.y) - (u16) spC->offsetY); + temp_r0_7->all.attr1 = temp_r3_5 + (((temp_r7_3 - gCamera.x) - (u16) spC->offsetX) & 0x1FF); +block_81: + sp18 = (s32) (u8) (sp18 + 1); + goto loop_82; + } + } + case 0xFE: +block_74: + var_r5_3 += 2; + goto loop_82; + case 0xFF: +block_84: + temp_r0_8 = var_r8_3 + 1; + var_r8_3 = (u32) temp_r0_8; + if ((s32) (temp_r0_8 << 8) < (s32) (gCamera.x + 0xF0)) { + var_r0_2 = *((var_r8_3 * 4) + ((sp34 * 4) + sp8)); + if (var_r8_3 < sp10) { + goto loop_62; + } + } +block_87: + temp_r0_9 = var_sl_3 + 1; + var_sl_3 = (u32) temp_r0_9; + if (((s32) (temp_r0_9 << 8) < (s32) (gCamera.y + 0xA0)) && (var_sl_3 < sp14)) { + goto loop_58; + } +block_90: + temp_r0_10 = sp1C + 1; + sp1C = (s32) temp_r0_10; + if ((u32) temp_r0_10 <= 1U) { + goto loop_6; + } +block_143: + temp_r0_11 = gCamera.y; + temp_r1_15 = (u32) (temp_r0_11 << 8) >> 0x10; + var_sl_4 = temp_r1_15; + var_r1_4 = temp_r1_15 << 8; +loop_168: + if ((var_r1_4 < (s32) (temp_r0_11 + 0xA0)) && (var_sl_4 < sp14)) { + temp_r1_16 = (u32) (gCamera.x << 8) >> 0x10; + var_r8_4 = temp_r1_16; + if ((s32) (temp_r1_16 << 8) >= (s32) (gCamera.x + 0xF0)) { + goto block_167; + } + if (var_r8_4 >= sp10) { + goto block_167; + } +loop_148: + temp_r0_12 = *((var_r8_4 * 4) + ((sp10 * var_sl_4 * 4) + sp8)); + if (temp_r0_12 == 0) { + goto block_164; + } + var_r5_4 = sp8 + (temp_r0_12 - 8); +loop_162: + temp_r1_17 = var_r5_4->unk0; + switch (temp_r1_17) { /* switch 1; irregular */ + default: /* switch 1 */ + temp_r7_4 = (var_r5_4->unk0 * 8) + (var_r8_4 << 8); + temp_r6_5 = (var_r5_4->unk1 * 8) + (var_sl_4 << 8); + if (((u32) ((temp_r7_4 - gCamera.x) + 8) > 0x100U) || (temp_r0_13 = temp_r6_5 - gCamera.y, (temp_r0_13 < 0)) || ((s32) (temp_r0_13 - 0x10) > 0xA0)) { + case 0xFE: /* switch 1 */ + var_r5_4 += 2; + goto loop_162; + } + var_r5_4 += 2; + if ((sp18 == 0) || (sp4->oamBaseIndex == 0xFF)) { + sp4->oamBaseIndex = 0xFF; + sp4->x = temp_r7_4 - gCamera.x; + sp4->y = temp_r6_5 - gCamera.y; + DisplaySprite(sp4); + goto block_161; + } + temp_r2_14 = &gOamMallocBuffer[sp4->oamBaseIndex]; + sp48 = temp_r2_14; + temp_r0_14 = OamMalloc((u8) ((u32) ((u16) sp4->oamFlags & 0x7C0) >> 6)); + if (iwram_end != temp_r0_14) { + (void *)0x040000D4->unk0 = temp_r2_14; + (void *)0x040000D4->unk4 = temp_r0_14; + (void *)0x040000D4->unk8 = 0x80000003; + temp_r3_6 = temp_r0_14->all.attr1 & 0xFE00; + temp_r0_14->all.attr1 = temp_r3_6; + temp_r2_15 = temp_r0_14->all.attr0 & 0xFF00; + temp_r0_14->all.attr0 = temp_r2_15; + temp_r0_14->all.attr0 = temp_r2_15 + (u8) ((temp_r6_5 - gCamera.y) - (u16) spC->offsetY); + temp_r0_14->all.attr1 = temp_r3_6 + (((temp_r7_4 - gCamera.x) - (u16) spC->offsetX) & 0x1FF); +block_161: + sp18 = (s32) (u8) (sp18 + 1); + goto loop_162; + } + break; + case 0xFF: /* switch 1 */ +block_164: + temp_r0_15 = var_r8_4 + 1; + var_r8_4 = (u32) temp_r0_15; + if (((s32) (temp_r0_15 << 8) < (s32) (gCamera.x + 0xF0)) && (var_r8_4 < sp10)) { + goto loop_148; + } +block_167: + temp_r0_16 = var_sl_4 + 1; + var_sl_4 = (u32) temp_r0_16; + var_r1_4 = temp_r0_16 << 8; + goto loop_168; + } + } + return; + } +} + +void Task_RingsMgrExtraZone(void) { + Sprite *sp4; + void *sp8; + SpriteOffset *spC; + u32 sp10; + u32 sp14; + s32 sp18; + ? *sp1C; + s32 sp20; + s32 sp24; + s32 sp28; + OamData *sp2C; + OamData *temp_r0_6; + OamData *temp_r2_5; + Player *var_sl; + Sprite *temp_r1; + s16 temp_r7; + s32 temp_r0_2; + s32 temp_r0_3; + s32 temp_r0_4; + s32 temp_r0_5; + s32 temp_r1_2; + s32 temp_r1_3; + s32 temp_r1_4; + s32 temp_r1_5; + s32 temp_r2_2; + s32 temp_r2_3; + s32 temp_r2_4; + s32 temp_r6; + s32 temp_r6_2; + s32 temp_r7_2; + s32 var_r0; + s32 var_r1_3; + s32 var_r2_2; + s32 var_r3; + s8 temp_r3; + s8 temp_r3_2; + struct Camera *var_r2_3; + u16 temp_r0_7; + u16 temp_r0_8; + u16 temp_r2_6; + u16 temp_r3_3; + u32 temp_r1_6; + u32 temp_r1_7; + u32 temp_r2; + u32 var_r8; + u32 var_r8_2; + u32 var_sb; + u32 var_sb_2; + u8 *var_r5; + u8 temp_r1_8; + u8 var_r1; + u8 var_r1_2; + u8 var_r2; + void *temp_r0; + void *var_r5_2; + + var_sl = saved_reg_r10; + temp_r1 = gCurTask->data + 0x03000000; + sp4 = temp_r1; + sp8 = temp_r1->unk28; + sp18 = 0; + if (gCamera.unk6A != 0) { + RLUnCompWram(*(((s32) (gStageData.currMapIndex << 0x10) >> 0xE) + &gUnknown_080CEF58), sp8); + } + if ((gStageData.zone == 8) && (gStageData.unk4 != 3)) { + return; + } + subroutine_arg0.unk0 = -0xA; + subroutine_arg0.unk1 = 0xF6U; + subroutine_arg0.unk2 = 0xA; + subroutine_arg0.unk3 = 0xAU; + UpdateSpriteAnimation(sp4); + temp_r2 = sp4->frameNum; + if ((temp_r2 >> 0x1C) == 0) { + spC = &gRefSpriteTables->dimensions[sp4->anim][temp_r2]; + } else { + spC = gRefSpriteTables->dimensions[sp4->anim] + (temp_r2 * 0x10); + } + temp_r0 = sp8 + 4; + sp10 = (u32) (u16) sp8->unk4; + sp8 = temp_r0 + 4 + 4; + sp14 = (u32) (u16) temp_r0->unk4; + var_r2 = 0; +loop_9: + if (var_r2 == 0) { + var_r1 = gStageData.playerIndex; + } else { + var_r1 = (u8) ((u32) (var_sl->unk2B << 0x1E) >> 0x1E); + } + var_sl = &gPlayers[var_r1]; + sp28 = var_r2 + 1; + if (var_sl->moveState & 0x100) { + + } else if (var_sl->charFlags.anim0 == 0x66) { + + } else if (var_sl->unk48 != 0) { + + } else { + temp_r2_2 = var_sl->qWorldY; + temp_r1_2 = temp_r2_2 >> 8; + var_sb = (u32) ((temp_r1_2 + (s8) subroutine_arg0.unk1) << 8) >> 0x10; + var_r3 = temp_r2_2; + if ((s32) var_sb > (s32) ((s32) ((temp_r1_2 + (s8) subroutine_arg0.unk3) - 0x10) >> 8)) { + + } else if (var_sb >= sp14) { + + } else { + sp1C = &subroutine_arg0; +loop_23: + var_r2_2 = var_sl->qWorldX; + temp_r1_3 = var_r2_2 >> 8; + var_r8 = (u32) (((temp_r1_3 + sp1C->unk0) - 8) << 8) >> 0x10; + sp24 = var_sb + 1; + if (((s32) var_r8 <= (s32) ((s32) ((temp_r1_3 + sp1C->unk2) - 8) >> 8)) && (var_r8 < sp10)) { +loop_25: + temp_r0_2 = *((var_r8 * 4) + ((sp10 * var_sb * 4) + sp8)); + sp20 = var_r8 + 1; + if (temp_r0_2 != 0) { + var_r5 = sp8 + (temp_r0_2 - 8); + var_r1_2 = *var_r5; + if (var_r1_2 != 0xFF) { + do { + if (var_r1_2 == 0xFE) { + var_r5 += 2; + } else { + temp_r7 = (var_r5->unk0 * 8) + (var_r8 << 8); + temp_r6 = (var_r5->unk1 * 8) + (var_sb << 8); + if (1 != 0) { + temp_r2_3 = temp_r7 - 8; + temp_r3 = subroutine_arg0.unk0; + temp_r1_4 = ((s32) var_sl->qWorldX >> 8) + temp_r3; + if (temp_r2_3 <= temp_r1_4) { + if ((s32) (temp_r7 + 8) < temp_r1_4) { + if (temp_r2_3 >= temp_r1_4) { + goto block_34; + } + } else { + goto block_35; + } + } else { +block_34: + if ((s32) (temp_r1_4 + (subroutine_arg0.unk2 - temp_r3)) >= temp_r2_3) { +block_35: + temp_r2_4 = temp_r6 - 0x10; + temp_r3_2 = (s8) subroutine_arg0.unk1; + temp_r1_5 = ((s32) var_sl->qWorldY >> 8) + temp_r3_2; + if (temp_r2_4 <= temp_r1_5) { + if (temp_r6 < temp_r1_5) { + if (temp_r2_4 >= temp_r1_5) { + goto block_38; + } + } else { + goto block_39; + } + } else { +block_38: + if ((s32) (temp_r1_5 + ((s8) subroutine_arg0.unk3 - temp_r3_2)) >= temp_r2_4) { +block_39: + AddRings(1); + CreateCollectRingEffect((s32) temp_r7, (s32) (s16) temp_r6); + var_r5->unk0 = 0xFE; + } + } + } + } + } + var_r5 += 2; + var_r3 = var_sl->qWorldY; + var_r2_2 = var_sl->qWorldX; + } + var_r1_2 = *var_r5; + } while (var_r1_2 != 0xFF); + } + } + var_r8 = (u32) (u16) sp20; + if (((s32) var_r8 <= (s32) ((s32) (((var_r2_2 >> 8) + sp1C->unk2) - 8) >> 8)) && (var_r8 < sp10)) { + goto loop_25; + } + } + var_sb = (u32) (u16) sp24; + if (((s32) var_sb <= (s32) ((s32) (((var_r3 >> 8) + sp1C->unk3) - 0x10) >> 8)) && (var_sb < sp14)) { + goto loop_23; + } + } + } + var_r2 = (u8) sp28; + if ((u32) var_r2 <= 1U) { + goto loop_9; + } + var_r2_3 = &gCamera; + temp_r1_6 = (u32) (gCamera.y << 8) >> 0x10; + var_sb_2 = temp_r1_6; + var_r1_3 = temp_r1_6 << 8; + var_r0 = gCamera.y + 0xA0; +loop_72: + if ((var_r1_3 < var_r0) && (var_sb_2 < sp14)) { + temp_r0_3 = var_r2_3->x; + temp_r1_7 = (u32) (temp_r0_3 << 8) >> 0x10; + var_r8_2 = temp_r1_7; + if ((s32) (temp_r1_7 << 8) >= (s32) (temp_r0_3 + 0xF0)) { + goto block_71; + } + if (var_r8_2 >= sp10) { + goto block_71; + } +loop_54: + temp_r0_4 = *((var_r8_2 * 4) + ((sp10 * var_sb_2 * 4) + sp8)); + if (temp_r0_4 != 0) { + var_r5_2 = sp8 + (temp_r0_4 - 8); +loop_67: + temp_r1_8 = var_r5_2->unk0; + if (temp_r1_8 == 0xFF) { + goto block_68; + } + if ((temp_r1_8 == 0xFE) || (temp_r7_2 = (var_r5_2->unk0 * 8) + (var_r8_2 << 8), temp_r6_2 = (var_r5_2->unk1 * 8) + (var_sb_2 << 8), ((u32) ((temp_r7_2 - gCamera.x) + 8) > 0x100U)) || (temp_r0_5 = temp_r6_2 - gCamera.y, (temp_r0_5 < 0)) || ((s32) (temp_r0_5 - 0x10) > 0xA0)) { + var_r5_2 += 2; + goto loop_67; + } + var_r5_2 += 2; + if ((sp18 == 0) || (sp4->oamBaseIndex == 0xFF)) { + sp4->oamBaseIndex = 0xFF; + sp4->x = temp_r7_2 - gCamera.x; + sp4->y = temp_r6_2 - gCamera.y; + DisplaySprite(sp4); + goto block_66; + } + temp_r2_5 = &gOamMallocBuffer[sp4->oamBaseIndex]; + sp2C = temp_r2_5; + temp_r0_6 = OamMalloc((u8) ((u32) ((u16) sp4->oamFlags & 0x7C0) >> 6)); + if (iwram_end != temp_r0_6) { + (void *)0x040000D4->unk0 = temp_r2_5; + (void *)0x040000D4->unk4 = temp_r0_6; + (void *)0x040000D4->unk8 = 0x80000003; + temp_r3_3 = temp_r0_6->all.attr1 & 0xFE00; + temp_r0_6->all.attr1 = temp_r3_3; + temp_r2_6 = temp_r0_6->all.attr0 & 0xFF00; + temp_r0_6->all.attr0 = temp_r2_6; + temp_r0_6->all.attr0 = temp_r2_6 + (u8) ((temp_r6_2 - gCamera.y) - (u16) spC->offsetY); + temp_r0_6->all.attr1 = temp_r3_3 + (((temp_r7_2 - gCamera.x) - (u16) spC->offsetX) & 0x1FF); +block_66: + sp18 = (s32) (u8) (sp18 + 1); + goto loop_67; + } + } else { +block_68: + temp_r0_7 = var_r8_2 + 1; + var_r8_2 = (u32) temp_r0_7; + if (((s32) (temp_r0_7 << 8) < (s32) (gCamera.x + 0xF0)) && (var_r8_2 < sp10)) { + goto loop_54; + } +block_71: + temp_r0_8 = var_sb_2 + 1; + var_sb_2 = (u32) temp_r0_8; + var_r1_3 = temp_r0_8 << 8; + var_r2_3 = &gCamera; + var_r0 = var_r2_3->y + 0xA0; + goto loop_72; + } + } +} +#endif + +void sub_802AB10(s16 worldX, s16 worldY, Player *p) +{ + u16 temp_r0; + RingsMgrUnk30 *strc30; + Sprite *s; + + strc30 = TASK_DATA(TaskCreate(sub_802AB8C, sizeof(RingsMgrUnk30), 0x2000U, 0U, NULL)); + s = &strc30->s; + strc30->p = p; + strc30->magnitude = 0; + s->x = worldX; + s->y = worldY; + s->tiles = OBJ_VRAM0 + 0x4180; + s->oamFlags = 0x280; + s->anim = ANIM_RING; + s->variant = 0; + s->animCursor = 0; + s->qAnimDelay = 0; + s->prevVariant = 0xFF; + s->animSpeed = 0x10; + s->palId = 0; + s->frameFlags = 0x41200; +} + +void sub_802AB8C(void) +{ + RingsMgrUnk30 *strc30; + s16 temp_r0_2; + s32 sxMinus8; + s32 temp_r5_2; + s8 temp_r3_2; + s8 temp_r6; + s16 syTemp; + s16 sxTemp; + PlayerSpriteInfo *temp_r0_5; + PlayerSpriteInfo *psiPlayer; + Player *p; + Sprite *s; + s16 dx, dy; + + strc30 = TASK_DATA(gCurTask); + p = strc30->p; + s = &strc30->s; + dx = I(p->qWorldX) - s->x; + dy = I(p->qWorldY) - s->y; + temp_r0_2 = sa2__sub_8004418(dy, dx); + strc30->magnitude += 64; + s->x += (strc30->magnitude * COS(temp_r0_2)) >> 0x16; + s->y += (strc30->magnitude * SIN(temp_r0_2)) >> 0x16; + syTemp = s->y; + sxTemp = s->x; + + if (((((s->x - 8) <= HB_LEFT(I(p->qWorldX), p->spriteInfoBody->s.hitboxes[0].b)) + && ((s->x + 8) >= HB_LEFT(I(p->qWorldX), p->spriteInfoBody->s.hitboxes[0].b))) + || (((s->x - 8) >= HB_LEFT(I(p->qWorldX), p->spriteInfoBody->s.hitboxes[0].b)) + && (HB_RIGHT(I(p->qWorldX), p->spriteInfoBody->s.hitboxes[0].b) >= (s->x - 8)))) + && (((syTemp - 16 > HB_TOP(I(p->qWorldY), p->spriteInfoBody->s.hitboxes[0].b)) + && (HB_BOTTOM(I(p->qWorldY), p->spriteInfoBody->s.hitboxes[0].b) >= syTemp - 16)) + || ((syTemp >= HB_TOP(I(p->qWorldY), p->spriteInfoBody->s.hitboxes[0].b)) + && (HB_BOTTOM(I(p->qWorldY), p->spriteInfoBody->s.hitboxes[0].b) >= syTemp - 16)))) { + if (!(p->moveState & MOVESTATE_100)) { + AddRings(1); + CreateCollectRingEffect(sxTemp, syTemp); + } + TaskDestroy(gCurTask); + return; + } + +block_past_if: + s->x -= gCamera.x; + s->y -= gCamera.y; + UpdateSpriteAnimation(s); + DisplaySprite(s); + s->x = sxTemp; + s->y = syTemp; +} + +void Task_802ACF0(void) +{ + RingsMgrUnk2C *strc2C = TASK_DATA(gCurTask); + Sprite *s = &strc2C->s; + s16 temp_r5 = s->x; + s16 temp_r6 = s->y; + + s->x -= gCamera.x; + s->y -= gCamera.y; + if (UpdateSpriteAnimation(s) == ACMD_RESULT__ENDED) { + DisplaySprite(s); + gStageData.unkB5 -= 1; + TaskDestroy(gCurTask); + return; + } + DisplaySprite(s); + s->x = (s16)temp_r5; + s->y = (s16)temp_r6; +} + +void TaskDestructor_RingsMgr(Task *t) +{ + RingsManager *mgr = TASK_DATA(t); + EwramFree(mgr->ringPositions); +} \ No newline at end of file diff --git a/src/platform/shared/stub.c b/src/platform/shared/stub.c index b4840fbe4..7a9de478f 100644 --- a/src/platform/shared/stub.c +++ b/src/platform/shared/stub.c @@ -81,7 +81,7 @@ void sub_80299FC() { } void sub_8029A18() { } void sub_80275B8(u32 level, u8 param1, u8 param2) { } void TaskDestructor_8029774(struct Task *t) { } -void sub_8029C54(s32 param0, s32 param1) { } +void CreateCollectRingEffect(s32 param0, s32 param1) { } bool32 sub_802C080(Player *p) { return FALSE; } bool32 sub_802C0D4(Player *p) { return FALSE; } bool32 sub_802C140(s32 worldX, s32 worldY, s32 screenX, s32 screenY) { return FALSE; } From 4364b879f572b20a4ee2e57b1e74ab7f1e3a1c0d Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Sat, 28 Mar 2026 15:20:16 +0100 Subject: [PATCH 02/17] Match sub_802AB8C --- src/game/sa1_sa2_shared/unfinished__rings_manager.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/game/sa1_sa2_shared/unfinished__rings_manager.c b/src/game/sa1_sa2_shared/unfinished__rings_manager.c index dad24993d..7eab72add 100644 --- a/src/game/sa1_sa2_shared/unfinished__rings_manager.c +++ b/src/game/sa1_sa2_shared/unfinished__rings_manager.c @@ -1033,9 +1033,9 @@ void sub_802AB8C(void) && ((s->x + 8) >= HB_LEFT(I(p->qWorldX), p->spriteInfoBody->s.hitboxes[0].b))) || (((s->x - 8) >= HB_LEFT(I(p->qWorldX), p->spriteInfoBody->s.hitboxes[0].b)) && (HB_RIGHT(I(p->qWorldX), p->spriteInfoBody->s.hitboxes[0].b) >= (s->x - 8)))) - && (((syTemp - 16 > HB_TOP(I(p->qWorldY), p->spriteInfoBody->s.hitboxes[0].b)) - && (HB_BOTTOM(I(p->qWorldY), p->spriteInfoBody->s.hitboxes[0].b) >= syTemp - 16)) - || ((syTemp >= HB_TOP(I(p->qWorldY), p->spriteInfoBody->s.hitboxes[0].b)) + && (((syTemp - 16 <= HB_TOP(I(p->qWorldY), p->spriteInfoBody->s.hitboxes[0].b)) + && (syTemp >= HB_TOP(I(p->qWorldY), p->spriteInfoBody->s.hitboxes[0].b))) + || ((syTemp - 16 >= HB_TOP(I(p->qWorldY), p->spriteInfoBody->s.hitboxes[0].b)) && (HB_BOTTOM(I(p->qWorldY), p->spriteInfoBody->s.hitboxes[0].b) >= syTemp - 16)))) { if (!(p->moveState & MOVESTATE_100)) { AddRings(1); @@ -1045,7 +1045,6 @@ void sub_802AB8C(void) return; } -block_past_if: s->x -= gCamera.x; s->y -= gCamera.y; UpdateSpriteAnimation(s); From f72a9fbed9342651d51a9bb7b0685c2b42e225cd Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Sat, 28 Mar 2026 17:55:39 +0100 Subject: [PATCH 03/17] Make Task_RingsMgrExtraZone compilable --- data/data.s | 1 + .../unfinished__rings_manager.c | 341 +++++++++--------- 2 files changed, 171 insertions(+), 171 deletions(-) diff --git a/data/data.s b/data/data.s index c72b694ce..06d306e82 100644 --- a/data/data.s +++ b/data/data.s @@ -252,6 +252,7 @@ gUnknown_080CEF2C: gUnknown_080CEF50: .incbin "baserom_sa3.gba", 0x000CEF50, 0x8 +@ ring positions .global gUnknown_080CEF58 gUnknown_080CEF58: .incbin "baserom_sa3.gba", 0x000CEF58, 73*4 @ size = * diff --git a/src/game/sa1_sa2_shared/unfinished__rings_manager.c b/src/game/sa1_sa2_shared/unfinished__rings_manager.c index 7eab72add..e7cf20603 100644 --- a/src/game/sa1_sa2_shared/unfinished__rings_manager.c +++ b/src/game/sa1_sa2_shared/unfinished__rings_manager.c @@ -1,5 +1,3 @@ -#define NULL 0 - void AddRings(s32); void TaskDestructor_RingsMgr(Task *); void Task_RingsMgrExtraZone(); @@ -348,10 +346,10 @@ void Task_RingsMgrStage(void) { if (var_r1 == 0xFE) { var_r5 += 2; } else { - temp_r7 = (var_r5->unk0 * 8) + (var_r8 << 8); - temp_r6_2 = (var_r5->unk1 * 8) + (var_sl << 8); + temp_r7 = (var_r5[0] * 8) + (var_r8 << 8); + temp_r6_2 = (var_r5[1] * 8) + (var_sl << 8); temp_r2_3 = temp_r7 - 8; - temp_r3 = subroutine_arg0.unk0; + temp_r3 = sp00[0]; temp_r1_6 = ((s32) temp_r0->qWorldX >> 8) + temp_r3; if (temp_r2_3 <= temp_r1_6) { if ((s32) (temp_r7 + 8) < temp_r1_6) { @@ -363,10 +361,10 @@ void Task_RingsMgrStage(void) { } } else { block_121: - if ((s32) (temp_r1_6 + (subroutine_arg0.unk2 - temp_r3)) >= temp_r2_3) { + if ((s32) (temp_r1_6 + (sp00[2] - temp_r3)) >= temp_r2_3) { block_122: temp_r2_4 = temp_r6_2 - 0x10; - temp_r3_2 = subroutine_arg0.unk1; + temp_r3_2 = sp00[1]; temp_r1_7 = ((s32) temp_r0->qWorldY >> 8) + temp_r3_2; if (temp_r2_4 <= temp_r1_7) { if (temp_r6_2 < temp_r1_7) { @@ -378,7 +376,7 @@ void Task_RingsMgrStage(void) { } } else { block_125: - if ((s32) (temp_r1_7 + (subroutine_arg0.unk3 - temp_r3_2)) >= temp_r2_4) { + if ((s32) (temp_r1_7 + (sp00[3] - temp_r3_2)) >= temp_r2_4) { block_126: if (sp28 != 0) { if (gStageData.playerIndex == sp1C) { @@ -390,7 +388,7 @@ void Task_RingsMgrStage(void) { } else { CreateCollectRingEffectNoSfx((u16) temp_r7, (u16) (s16) temp_r6_2); } - var_r5->unk0 = 0xFE; + var_r5[0] = 0xFE; } } } @@ -480,10 +478,10 @@ void Task_RingsMgrStage(void) { if (var_r1_3 == 0xFE) { var_r5_2 += 2; } else { - temp_r7_2 = (var_r5_2->unk0 * 8) + (var_r8_2 << 8); - temp_r6_3 = (var_r5_2->unk1 * 8) + (var_sl_2 << 8); + temp_r7_2 = (var_r5_2[0] * 8) + (var_r8_2 << 8); + temp_r6_3 = (var_r5_2[1] * 8) + (var_sl_2 << 8); temp_r2_7 = temp_r7_2 - 8; - temp_r3_3 = subroutine_arg0.unk0; + temp_r3_3 = sp00[0]; temp_r1_11 = ((s32) var_sb->qWorldX >> 8) + temp_r3_3; if (temp_r2_7 <= temp_r1_11) { if ((s32) (temp_r7_2 + 8) < temp_r1_11) { @@ -495,10 +493,10 @@ void Task_RingsMgrStage(void) { } } else { block_35: - if ((s32) (temp_r1_11 + (subroutine_arg0.unk2 - temp_r3_3)) >= temp_r2_7) { + if ((s32) (temp_r1_11 + (sp00[2] - temp_r3_3)) >= temp_r2_7) { block_36: temp_r2_8 = temp_r6_3 - 0x10; - temp_r3_4 = subroutine_arg0.unk1; + temp_r3_4 = sp00[1]; temp_r1_12 = ((s32) var_sb->qWorldY >> 8) + temp_r3_4; if (temp_r2_8 <= temp_r1_12) { if (temp_r6_3 < temp_r1_12) { @@ -510,13 +508,13 @@ void Task_RingsMgrStage(void) { } } else { block_39: - if ((s32) (temp_r1_12 + (subroutine_arg0.unk3 - temp_r3_4)) >= temp_r2_8) { + if ((s32) (temp_r1_12 + (sp00[3] - temp_r3_4)) >= temp_r2_8) { block_40: if ((sp1C == 0) || ((0x1C & *sp44) == 8)) { AddRings(1); } CreateCollectRingEffect((s32) temp_r7_2, (s32) (s16) temp_r6_3); - var_r5_2->unk0 = 0xFE; + var_r5_2[0] = 0xFE; } } } @@ -713,32 +711,35 @@ void Task_RingsMgrStage(void) { return; } } +#endif -void Task_RingsMgrExtraZone(void) { - Sprite *sp4; - void *sp8; - SpriteOffset *spC; +void Task_RingsMgrExtraZone(void) +{ + u8 sp00[4]; + RingsManager *sp4; + u8 *ringPosBuffer; + const SpriteOffset *spC; u32 sp10; u32 sp14; s32 sp18; - ? *sp1C; + u8 *sp1C; s32 sp20; s32 sp24; s32 sp28; OamData *sp2C; OamData *temp_r0_6; OamData *temp_r2_5; - Player *var_sl; - Sprite *temp_r1; + Player *p; s16 temp_r7; + s32 temp_r0; s32 temp_r0_2; s32 temp_r0_3; s32 temp_r0_4; s32 temp_r0_5; + s32 temp_r1; s32 temp_r1_2; s32 temp_r1_3; s32 temp_r1_4; - s32 temp_r1_5; s32 temp_r2_2; s32 temp_r2_3; s32 temp_r2_4; @@ -751,231 +752,229 @@ void Task_RingsMgrExtraZone(void) { s32 var_r3; s8 temp_r3; s8 temp_r3_2; - struct Camera *var_r2_3; + struct Camera *cam; u16 temp_r0_7; u16 temp_r0_8; u16 temp_r2_6; u16 temp_r3_3; + u32 temp_r1_5; u32 temp_r1_6; - u32 temp_r1_7; u32 temp_r2; u32 var_r8; u32 var_r8_2; u32 var_sb; u32 var_sb_2; u8 *var_r5; - u8 temp_r1_8; + u8 *var_r5_2; + u8 temp_r1_7; u8 var_r1; u8 var_r1_2; u8 var_r2; - void *temp_r0; - void *var_r5_2; - var_sl = saved_reg_r10; - temp_r1 = gCurTask->data + 0x03000000; - sp4 = temp_r1; - sp8 = temp_r1->unk28; + RingsManager *mgr = TASK_DATA(gCurTask); + + p = NULL; + sp4 = mgr; + ringPosBuffer = mgr->ringPositions; sp18 = 0; if (gCamera.unk6A != 0) { - RLUnCompWram(*(((s32) (gStageData.currMapIndex << 0x10) >> 0xE) + &gUnknown_080CEF58), sp8); + RLUnCompWram(gUnknown_080CEF58[gStageData.currMapIndex], ringPosBuffer); } if ((gStageData.zone == 8) && (gStageData.unk4 != 3)) { return; } - subroutine_arg0.unk0 = -0xA; - subroutine_arg0.unk1 = 0xF6U; - subroutine_arg0.unk2 = 0xA; - subroutine_arg0.unk3 = 0xAU; - UpdateSpriteAnimation(sp4); - temp_r2 = sp4->frameNum; + sp00[0] = -10; + sp00[1] = -10; + sp00[2] = 10; + sp00[3] = 10; + UpdateSpriteAnimation(&sp4->s); + temp_r2 = sp4->s.frameNum; if ((temp_r2 >> 0x1C) == 0) { - spC = &gRefSpriteTables->dimensions[sp4->anim][temp_r2]; + spC = &gRefSpriteTables->dimensions[sp4->s.anim][temp_r2]; } else { - spC = gRefSpriteTables->dimensions[sp4->anim] + (temp_r2 * 0x10); + spC = gRefSpriteTables->dimensions[sp4->s.anim] + (temp_r2 * 0x10); } - temp_r0 = sp8 + 4; - sp10 = (u32) (u16) sp8->unk4; - sp8 = temp_r0 + 4 + 4; - sp14 = (u32) (u16) temp_r0->unk4; + sp10 = (ringPosBuffer[4] + 4); + temp_r0 = ringPosBuffer[4] + 4; + ringPosBuffer = ringPosBuffer + 4 + 4 + 4; + sp14 = (u32)(u16)temp_r0; var_r2 = 0; -loop_9: - if (var_r2 == 0) { - var_r1 = gStageData.playerIndex; - } else { - var_r1 = (u8) ((u32) (var_sl->unk2B << 0x1E) >> 0x1E); - } - var_sl = &gPlayers[var_r1]; - sp28 = var_r2 + 1; - if (var_sl->moveState & 0x100) { - - } else if (var_sl->charFlags.anim0 == 0x66) { + do { + loop_9: + p = GET_SP_PLAYER_V0(var_r2); - } else if (var_sl->unk48 != 0) { + sp28 = var_r2 + 1; + if (p->moveState & 0x100) { - } else { - temp_r2_2 = var_sl->qWorldY; - temp_r1_2 = temp_r2_2 >> 8; - var_sb = (u32) ((temp_r1_2 + (s8) subroutine_arg0.unk1) << 8) >> 0x10; - var_r3 = temp_r2_2; - if ((s32) var_sb > (s32) ((s32) ((temp_r1_2 + (s8) subroutine_arg0.unk3) - 0x10) >> 8)) { + } else if (p->charFlags.anim0 == 0x66) { - } else if (var_sb >= sp14) { + } else if (p->unk48 != 0) { } else { - sp1C = &subroutine_arg0; -loop_23: - var_r2_2 = var_sl->qWorldX; - temp_r1_3 = var_r2_2 >> 8; - var_r8 = (u32) (((temp_r1_3 + sp1C->unk0) - 8) << 8) >> 0x10; - sp24 = var_sb + 1; - if (((s32) var_r8 <= (s32) ((s32) ((temp_r1_3 + sp1C->unk2) - 8) >> 8)) && (var_r8 < sp10)) { -loop_25: - temp_r0_2 = *((var_r8 * 4) + ((sp10 * var_sb * 4) + sp8)); - sp20 = var_r8 + 1; - if (temp_r0_2 != 0) { - var_r5 = sp8 + (temp_r0_2 - 8); - var_r1_2 = *var_r5; - if (var_r1_2 != 0xFF) { - do { - if (var_r1_2 == 0xFE) { - var_r5 += 2; - } else { - temp_r7 = (var_r5->unk0 * 8) + (var_r8 << 8); - temp_r6 = (var_r5->unk1 * 8) + (var_sb << 8); - if (1 != 0) { - temp_r2_3 = temp_r7 - 8; - temp_r3 = subroutine_arg0.unk0; - temp_r1_4 = ((s32) var_sl->qWorldX >> 8) + temp_r3; - if (temp_r2_3 <= temp_r1_4) { - if ((s32) (temp_r7 + 8) < temp_r1_4) { - if (temp_r2_3 >= temp_r1_4) { - goto block_34; + temp_r2_2 = p->qWorldY; + temp_r1 = temp_r2_2 >> 8; + var_sb = (u32)((temp_r1 + (s8)sp00[1]) << 8) >> 0x10; + var_r3 = temp_r2_2; + if ((s32)var_sb > (s32)((s32)((temp_r1 + (s8)sp00[3]) - 0x10) >> 8)) { + + } else if (var_sb >= sp14) { + + } else { + sp1C = (u8 *)&sp00; + loop_23: + var_r2_2 = p->qWorldX; + temp_r1_2 = var_r2_2 >> 8; + var_r8 = (u32)(((temp_r1_2 + sp1C[0]) - 8) << 8) >> 0x10; + sp24 = var_sb + 1; + if (((s32)var_r8 <= (s32)((s32)((temp_r1_2 + sp1C[2]) - 8) >> 8)) && (var_r8 < sp10)) { + loop_25: + temp_r0_2 = *((var_r8 * 4) + ((sp10 * var_sb * 4) + ringPosBuffer)); + sp20 = var_r8 + 1; + if (temp_r0_2 != 0) { + var_r5 = &ringPosBuffer[temp_r0_2 - 8]; + var_r1_2 = *var_r5; + if (var_r1_2 != 0xFF) { + do { + if (var_r1_2 == 0xFE) { + var_r5 += 2; + } else { + temp_r7 = (var_r5[0] * 8) + (var_r8 << 8); + temp_r6 = (var_r5[1] * 8) + (var_sb << 8); + if (1 != 0) { + temp_r2_3 = temp_r7 - 8; + temp_r3 = sp00[0]; + temp_r1_3 = ((s32)p->qWorldX >> 8) + temp_r3; + if (temp_r2_3 <= temp_r1_3) { + if ((s32)(temp_r7 + 8) < temp_r1_3) { + if (temp_r2_3 >= temp_r1_3) { + goto block_34; + } + } else { + goto block_35; } } else { - goto block_35; - } - } else { -block_34: - if ((s32) (temp_r1_4 + (subroutine_arg0.unk2 - temp_r3)) >= temp_r2_3) { -block_35: - temp_r2_4 = temp_r6 - 0x10; - temp_r3_2 = (s8) subroutine_arg0.unk1; - temp_r1_5 = ((s32) var_sl->qWorldY >> 8) + temp_r3_2; - if (temp_r2_4 <= temp_r1_5) { - if (temp_r6 < temp_r1_5) { - if (temp_r2_4 >= temp_r1_5) { - goto block_38; + block_34: + if ((s32)(temp_r1_3 + (sp00[2] - temp_r3)) >= temp_r2_3) { + block_35: + temp_r2_4 = temp_r6 - 0x10; + temp_r3_2 = (s8)sp00[1]; + temp_r1_4 = ((s32)p->qWorldY >> 8) + temp_r3_2; + if (temp_r2_4 <= temp_r1_4) { + if (temp_r6 < temp_r1_4) { + if (temp_r2_4 >= temp_r1_4) { + goto block_38; + } + } else { + goto block_39; } } else { - goto block_39; - } - } else { -block_38: - if ((s32) (temp_r1_5 + ((s8) subroutine_arg0.unk3 - temp_r3_2)) >= temp_r2_4) { -block_39: - AddRings(1); - CreateCollectRingEffect((s32) temp_r7, (s32) (s16) temp_r6); - var_r5->unk0 = 0xFE; + block_38: + if ((s32)(temp_r1_4 + ((s8)sp00[3] - temp_r3_2)) >= temp_r2_4) { + block_39: + AddRings(1); + sub_8029C54((u16)temp_r7, (u16)(s16)temp_r6); + var_r5[0] = 0xFE; + } } } } } + var_r5 += 2; + var_r3 = p->qWorldY; + var_r2_2 = p->qWorldX; } - var_r5 += 2; - var_r3 = var_sl->qWorldY; - var_r2_2 = var_sl->qWorldX; - } - var_r1_2 = *var_r5; - } while (var_r1_2 != 0xFF); + var_r1_2 = *var_r5; + } while (var_r1_2 != 0xFF); + } + } + var_r8 = (u32)(u16)sp20; + if (((s32)var_r8 <= (s32)((s32)(((var_r2_2 >> 8) + sp1C[2]) - 8) >> 8)) && (var_r8 < sp10)) { + goto loop_25; } } - var_r8 = (u32) (u16) sp20; - if (((s32) var_r8 <= (s32) ((s32) (((var_r2_2 >> 8) + sp1C->unk2) - 8) >> 8)) && (var_r8 < sp10)) { - goto loop_25; + var_sb = (u32)(u16)sp24; + if (((s32)var_sb <= (s32)((s32)(((var_r3 >> 8) + sp1C[3]) - 0x10) >> 8)) && (var_sb < sp14)) { + goto loop_23; } } - var_sb = (u32) (u16) sp24; - if (((s32) var_sb <= (s32) ((s32) (((var_r3 >> 8) + sp1C->unk3) - 0x10) >> 8)) && (var_sb < sp14)) { - goto loop_23; - } } - } - var_r2 = (u8) sp28; - if ((u32) var_r2 <= 1U) { - goto loop_9; - } - var_r2_3 = &gCamera; - temp_r1_6 = (u32) (gCamera.y << 8) >> 0x10; - var_sb_2 = temp_r1_6; - var_r1_3 = temp_r1_6 << 8; - var_r0 = gCamera.y + 0xA0; + var_r2 = (u8)sp28; + if ((u32)var_r2 <= 1U) { + goto loop_9; + } + } while (var_r2 < NUM_SINGLE_PLAYER_CHARS); + cam = &gCamera; + temp_r1_5 = (u32)(gCamera.y << 8) >> 0x10; + var_sb_2 = temp_r1_5; + var_r1_3 = temp_r1_5 << 8; + var_r0 = gCamera.y + DISPLAY_HEIGHT; loop_72: if ((var_r1_3 < var_r0) && (var_sb_2 < sp14)) { - temp_r0_3 = var_r2_3->x; - temp_r1_7 = (u32) (temp_r0_3 << 8) >> 0x10; - var_r8_2 = temp_r1_7; - if ((s32) (temp_r1_7 << 8) >= (s32) (temp_r0_3 + 0xF0)) { + temp_r0_3 = cam->x; + temp_r1_6 = (u32)(temp_r0_3 << 8) >> 0x10; + var_r8_2 = temp_r1_6; + if ((s32)(temp_r1_6 << 8) >= (s32)(temp_r0_3 + 0xF0)) { goto block_71; } if (var_r8_2 >= sp10) { goto block_71; } -loop_54: - temp_r0_4 = *((var_r8_2 * 4) + ((sp10 * var_sb_2 * 4) + sp8)); + loop_54: + temp_r0_4 = *((var_r8_2 * 4) + ((sp10 * var_sb_2 * 4) + ringPosBuffer)); if (temp_r0_4 != 0) { - var_r5_2 = sp8 + (temp_r0_4 - 8); -loop_67: - temp_r1_8 = var_r5_2->unk0; - if (temp_r1_8 == 0xFF) { + var_r5_2 = &ringPosBuffer[temp_r0_4 - 8]; + loop_67: + temp_r1_7 = var_r5_2[0]; + if (temp_r1_7 == 0xFF) { goto block_68; } - if ((temp_r1_8 == 0xFE) || (temp_r7_2 = (var_r5_2->unk0 * 8) + (var_r8_2 << 8), temp_r6_2 = (var_r5_2->unk1 * 8) + (var_sb_2 << 8), ((u32) ((temp_r7_2 - gCamera.x) + 8) > 0x100U)) || (temp_r0_5 = temp_r6_2 - gCamera.y, (temp_r0_5 < 0)) || ((s32) (temp_r0_5 - 0x10) > 0xA0)) { + if ((temp_r1_7 == 0xFE) + || (temp_r7_2 = (var_r5_2[0] * 8) + (var_r8_2 << 8), temp_r6_2 = (var_r5_2[1] * 8) + (var_sb_2 << 8), + ((u32)((temp_r7_2 - gCamera.x) + 8) > 0x100U)) + || (temp_r0_5 = temp_r6_2 - gCamera.y, (temp_r0_5 < 0)) || ((s32)(temp_r0_5 - 0x10) > 0xA0)) { var_r5_2 += 2; goto loop_67; } var_r5_2 += 2; - if ((sp18 == 0) || (sp4->oamBaseIndex == 0xFF)) { - sp4->oamBaseIndex = 0xFF; - sp4->x = temp_r7_2 - gCamera.x; - sp4->y = temp_r6_2 - gCamera.y; - DisplaySprite(sp4); + if ((sp18 == 0) || (sp4->s.oamBaseIndex == 0xFF)) { + sp4->s.oamBaseIndex = 0xFF; + sp4->s.x = temp_r7_2 - gCamera.x; + sp4->s.y = temp_r6_2 - gCamera.y; + DisplaySprite(&sp4->s); goto block_66; } - temp_r2_5 = &gOamMallocBuffer[sp4->oamBaseIndex]; + temp_r2_5 = &gOamMallocBuffer[sp4->s.oamBaseIndex]; sp2C = temp_r2_5; - temp_r0_6 = OamMalloc((u8) ((u32) ((u16) sp4->oamFlags & 0x7C0) >> 6)); + temp_r0_6 = OamMalloc((u8)((u32)((u16)sp4->s.oamFlags & 0x7C0) >> 6)); if (iwram_end != temp_r0_6) { - (void *)0x040000D4->unk0 = temp_r2_5; - (void *)0x040000D4->unk4 = temp_r0_6; - (void *)0x040000D4->unk8 = 0x80000003; + DmaCopy16(3, temp_r2_5, temp_r0_6, 6); temp_r3_3 = temp_r0_6->all.attr1 & 0xFE00; temp_r0_6->all.attr1 = temp_r3_3; temp_r2_6 = temp_r0_6->all.attr0 & 0xFF00; temp_r0_6->all.attr0 = temp_r2_6; - temp_r0_6->all.attr0 = temp_r2_6 + (u8) ((temp_r6_2 - gCamera.y) - (u16) spC->offsetY); - temp_r0_6->all.attr1 = temp_r3_3 + (((temp_r7_2 - gCamera.x) - (u16) spC->offsetX) & 0x1FF); -block_66: - sp18 = (s32) (u8) (sp18 + 1); + temp_r0_6->all.attr0 = temp_r2_6 + (u8)((temp_r6_2 - gCamera.y) - (u16)spC->offsetY); + temp_r0_6->all.attr1 = temp_r3_3 + (((temp_r7_2 - gCamera.x) - (u16)spC->offsetX) & 0x1FF); + block_66: + sp18 = (s32)(u8)(sp18 + 1); goto loop_67; } } else { -block_68: + block_68: temp_r0_7 = var_r8_2 + 1; - var_r8_2 = (u32) temp_r0_7; - if (((s32) (temp_r0_7 << 8) < (s32) (gCamera.x + 0xF0)) && (var_r8_2 < sp10)) { + var_r8_2 = (u32)temp_r0_7; + if (((s32)(temp_r0_7 << 8) < (s32)(gCamera.x + 0xF0)) && (var_r8_2 < sp10)) { goto loop_54; } -block_71: + block_71: temp_r0_8 = var_sb_2 + 1; - var_sb_2 = (u32) temp_r0_8; + var_sb_2 = (u32)temp_r0_8; var_r1_3 = temp_r0_8 << 8; - var_r2_3 = &gCamera; - var_r0 = var_r2_3->y + 0xA0; + cam = &gCamera; + var_r0 = cam->y + 0xA0; goto loop_72; } } } -#endif void sub_802AB10(s16 worldX, s16 worldY, Player *p) { From cd09f899c364433dd9456babf8ad03d6405ce6a1 Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Sun, 29 Mar 2026 22:40:47 +0200 Subject: [PATCH 04/17] Progress on Task_RingsMgrExtraZone --- include/game/sa1_sa2_shared/rings_manager.h | 40 ++ include/module_unclear.h | 2 +- .../unfinished__rings_manager.c | 412 ++++++++---------- 3 files changed, 221 insertions(+), 233 deletions(-) create mode 100644 include/game/sa1_sa2_shared/rings_manager.h diff --git a/include/game/sa1_sa2_shared/rings_manager.h b/include/game/sa1_sa2_shared/rings_manager.h new file mode 100644 index 000000000..f0d2ed370 --- /dev/null +++ b/include/game/sa1_sa2_shared/rings_manager.h @@ -0,0 +1,40 @@ +#ifndef GUARD_RINGS_MANAGER_H +#define GUARD_RINGS_MANAGER_H + +#include "global.h" +#include "rect.h" +#include "constants/zones.h" + +#define MP_COLLECT_RINGS_COMPRESSED_POS_DATA ((u8 **)(EWRAM_START + 0x33008)) +#define MP_COLLECT_RINGS_COMPRESSED_SIZE (u8 **)(EWRAM_START + 0x3300C) +#define MP_COLLECT_RINGS_BUFFER (u8 *)(EWRAM_START + 0x3F000) + +#ifndef COLLECT_RINGS_ROM +#define RESERVED_RING_TILES_VRAM (void *)(OBJ_VRAM0 + 0x1F00) +#else +#define RESERVED_RING_TILES_VRAM (void *)(OBJ_VRAM0 + 0x2E40) +#endif + +#ifndef COLLECT_RINGS_ROM +#define RESERVED_RING_EFFECT_TILES_VRAM (void *)(OBJ_VRAM0 + 0x2100) +#else +#define RESERVED_RING_EFFECT_TILES_VRAM (void *)(OBJ_VRAM0 + 0x3040) +#endif + +#define RECT_TOUCHING_RING(posX, posY, ringIntX, ringIntY, rect) \ + ((((ringIntX - TILE_WIDTH) <= RECT_LEFT((posX), rect) && (ringIntX + TILE_WIDTH) >= RECT_LEFT((posX), rect)) \ + || ((ringIntX - TILE_WIDTH) >= RECT_LEFT((posX), rect) && RECT_RIGHT((posX), rect) >= (ringIntX - TILE_WIDTH))) \ + && ((((ringIntY - (TILE_WIDTH * 2)) <= RECT_TOP((posY), rect) && ringIntY >= RECT_TOP((posY), rect)) \ + || ((ringIntY - (TILE_WIDTH * 2)) >= RECT_TOP((posY), rect) && RECT_BOTTOM((posY), rect) >= (ringIntY - (TILE_WIDTH * 2)))))) + +#define HB_TOUCHING_RING(posX, posY, ringIntX, ringIntY, hb) \ + ((((ringIntX - TILE_WIDTH) <= HB_LEFT((posX), hb) && (ringIntX + TILE_WIDTH) >= HB_LEFT((posX), hb)) \ + || ((ringIntX - TILE_WIDTH) >= HB_LEFT((posX), hb) && HB_RIGHT((posX), hb) >= (ringIntX - TILE_WIDTH))) \ + && ((((ringIntY - (TILE_WIDTH * 2)) <= HB_TOP((posY), hb) && ringIntY >= HB_TOP((posY), hb)) \ + || ((ringIntY - (TILE_WIDTH * 2)) >= HB_TOP((posY), hb) && HB_BOTTOM((posY), hb) >= (ringIntY - (TILE_WIDTH * 2)))))) + +extern const u8 *const gSpritePosData_rings[NUM_LEVEL_IDS]; + +void CreateStageRingsManager(void); + +#endif // GUARD_RINGS_MANAGER_H \ No newline at end of file diff --git a/include/module_unclear.h b/include/module_unclear.h index f3a7ca9f6..026f8ae01 100644 --- a/include/module_unclear.h +++ b/include/module_unclear.h @@ -126,7 +126,7 @@ typedef struct Strc3001CFC { extern struct Task *gTask_03001CFC; // -> Strc3001CFC s32 sub_8011BFC(u8, Player *p); -extern void CreateCollectRingEffect(s32 param0, s32 param1); +extern void CreateCollectRingEffect(s16 param0, s16 param1); // TODO: Move to correct module void sub_80533F4(u32 character); // related to Special Springs diff --git a/src/game/sa1_sa2_shared/unfinished__rings_manager.c b/src/game/sa1_sa2_shared/unfinished__rings_manager.c index e7cf20603..f99bfad1a 100644 --- a/src/game/sa1_sa2_shared/unfinished__rings_manager.c +++ b/src/game/sa1_sa2_shared/unfinished__rings_manager.c @@ -1,4 +1,7 @@ -void AddRings(s32); +#include "global.h" +#include "game/sa1_sa2_shared/rings_manager.h" + +void AddRings(s32 count); void TaskDestructor_RingsMgr(Task *); void Task_RingsMgrExtraZone(); void Task_RingsMgrStage(); @@ -10,7 +13,7 @@ extern struct MP2KSongHeader song117; typedef struct RingsManager { /* 0x00 */ Sprite s; - /* 0x28 */ u8 *ringPositions; + /* 0x28 */ void *ringPositions; } RingsManager; typedef struct RingsMgrUnk2C { @@ -25,6 +28,40 @@ typedef struct RingsMgrUnk30 { /* 0x2C */ s16 magnitude; } RingsMgrUnk30; +#define READ_START_INDEX(p, hrc, rx, ry) (*((u32 *)((((u8 *)(p)) + (((hrc) * (ry)) * (sizeof(u32)))) + ((rx) * (sizeof(u32)))))) +#define DATA_START(data) (void *)((u8 *)(data) - (sizeof(u32) * 2)) + +#define TO_REGION(pos) ((pos) >> 8) + +#define REGION_LOWER(posX, bound, offset) \ + ({ \ + s32 a = (posX); \ + s32 b = (bound); \ + TO_REGION(a + b + offset); \ + }) + +// Swapped for the region upper calc?? +#define REGION_UPPER(posX, bound, offset) \ + ({ \ + s32 a = (posX); \ + s32 b = (bound); \ + TO_REGION(b + a + offset); \ + }) + +// From header... +#define RECT_TOUCHING_RING(posX, posY, ringIntX, ringIntY, rect) \ + ((((ringIntX - TILE_WIDTH) <= RECT_LEFT((posX), rect) && (ringIntX + TILE_WIDTH) >= RECT_LEFT((posX), rect)) \ + || ((ringIntX - TILE_WIDTH) >= RECT_LEFT((posX), rect) && RECT_RIGHT((posX), rect) >= (ringIntX - TILE_WIDTH))) \ + && ((((ringIntY - (TILE_WIDTH * 2)) <= RECT_TOP((posY), rect) && ringIntY >= RECT_TOP((posY), rect)) \ + || ((ringIntY - (TILE_WIDTH * 2)) >= RECT_TOP((posY), rect) && RECT_BOTTOM((posY), rect) >= (ringIntY - (TILE_WIDTH * 2)))))) + +// From header... +#define HB_TOUCHING_RING(posX, posY, ringIntX, ringIntY, hb) \ + ((((ringIntX - TILE_WIDTH) <= HB_LEFT((posX), hb) && (ringIntX + TILE_WIDTH) >= HB_LEFT((posX), hb)) \ + || ((ringIntX - TILE_WIDTH) >= HB_LEFT((posX), hb) && HB_RIGHT((posX), hb) >= (ringIntX - TILE_WIDTH))) \ + && ((((ringIntY - (TILE_WIDTH * 2)) <= HB_TOP((posY), hb) && ringIntY >= HB_TOP((posY), hb)) \ + || ((ringIntY - (TILE_WIDTH * 2)) >= HB_TOP((posY), hb) && HB_BOTTOM((posY), hb) >= (ringIntY - (TILE_WIDTH * 2)))))) + void CreateStageRingsManager(void) { Task *t; @@ -715,263 +752,174 @@ void Task_RingsMgrStage(void) { void Task_RingsMgrExtraZone(void) { - u8 sp00[4]; - RingsManager *sp4; - u8 *ringPosBuffer; - const SpriteOffset *spC; - u32 sp10; - u32 sp14; - s32 sp18; - u8 *sp1C; - s32 sp20; - s32 sp24; - s32 sp28; - OamData *sp2C; - OamData *temp_r0_6; - OamData *temp_r2_5; + s8 rect[4]; + bool32 sp08 = TRUE; + const SpriteOffset *dimensions; + RingsManager *mgr; + u32 *rings; + u32 h_regionCount, v_regionCount; + OamData *oamAllocated; + OamData *oamDat; Player *p; - s16 temp_r7; - s32 temp_r0; - s32 temp_r0_2; - s32 temp_r0_3; - s32 temp_r0_4; - s32 temp_r0_5; - s32 temp_r1; - s32 temp_r1_2; - s32 temp_r1_3; - s32 temp_r1_4; - s32 temp_r2_2; - s32 temp_r2_3; - s32 temp_r2_4; - s32 temp_r6; - s32 temp_r6_2; - s32 temp_r7_2; - s32 var_r0; - s32 var_r1_3; - s32 var_r2_2; - s32 var_r3; - s8 temp_r3; - s8 temp_r3_2; + s32 rx; + s32 ry; struct Camera *cam; - u16 temp_r0_7; - u16 temp_r0_8; - u16 temp_r2_6; - u16 temp_r3_3; - u32 temp_r1_5; - u32 temp_r1_6; - u32 temp_r2; - u32 var_r8; - u32 var_r8_2; - u32 var_sb; - u32 var_sb_2; - u8 *var_r5; - u8 *var_r5_2; - u8 temp_r1_7; - u8 var_r1; - u8 var_r1_2; - u8 var_r2; + MapEntity_Ring *meRing; + u8 pid; + u16 regionX, regionY; + Sprite *s; + s16 mapIndex; + u8 drawCount; - RingsManager *mgr = TASK_DATA(gCurTask); + mgr = TASK_DATA(gCurTask); - p = NULL; - sp4 = mgr; - ringPosBuffer = mgr->ringPositions; - sp18 = 0; + rings = mgr->ringPositions; + mapIndex = gStageData.currMapIndex; + drawCount = 0; if (gCamera.unk6A != 0) { - RLUnCompWram(gUnknown_080CEF58[gStageData.currMapIndex], ringPosBuffer); + RLUnCompWram(gUnknown_080CEF58[mapIndex], rings); } if ((gStageData.zone == 8) && (gStageData.unk4 != 3)) { return; } - sp00[0] = -10; - sp00[1] = -10; - sp00[2] = 10; - sp00[3] = 10; - UpdateSpriteAnimation(&sp4->s); - temp_r2 = sp4->s.frameNum; - if ((temp_r2 >> 0x1C) == 0) { - spC = &gRefSpriteTables->dimensions[sp4->s.anim][temp_r2]; + rect[0] = -10; + rect[1] = -10; + rect[2] = +10; + rect[3] = +10; + UpdateSpriteAnimation(&mgr->s); + if ((mgr->s.frameNum >> 28) == 0) { + dimensions = &gRefSpriteTables->dimensions[mgr->s.anim][mgr->s.frameNum]; } else { - spC = gRefSpriteTables->dimensions[sp4->s.anim] + (temp_r2 * 0x10); + dimensions = &gRefSpriteTables->dimensions[mgr->s.anim][mgr->s.frameNum * 8]; } - sp10 = (ringPosBuffer[4] + 4); - temp_r0 = ringPosBuffer[4] + 4; - ringPosBuffer = ringPosBuffer + 4 + 4 + 4; - sp14 = (u32)(u16)temp_r0; - var_r2 = 0; - do { - loop_9: - p = GET_SP_PLAYER_V0(var_r2); + (rings[4] + 4); + rings[4] + 4; + rings = rings + 4 + 4 + 4; - sp28 = var_r2 + 1; - if (p->moveState & 0x100) { + pid = 0; + do { + s16 leftIndex; + p = GET_SP_PLAYER_V0(pid); - } else if (p->charFlags.anim0 == 0x66) { + // Handle collisions + for (regionY = REGION_LOWER(I(p->qWorldY), rect[1], 0); + regionY <= REGION_UPPER(I(p->qWorldY), rect[3], TILE_WIDTH) && regionY < v_regionCount; regionY++) { - } else if (p->unk48 != 0) { + for (regionX = REGION_LOWER(I(p->qWorldX), rect[leftIndex], -TILE_WIDTH); + regionX <= REGION_UPPER(I(p->qWorldX), rect[2], TILE_WIDTH * 2) && regionX < h_regionCount; regionX++) { - } else { - temp_r2_2 = p->qWorldY; - temp_r1 = temp_r2_2 >> 8; - var_sb = (u32)((temp_r1 + (s8)sp00[1]) << 8) >> 0x10; - var_r3 = temp_r2_2; - if ((s32)var_sb > (s32)((s32)((temp_r1 + (s8)sp00[3]) - 0x10) >> 8)) { + u32 offset = READ_START_INDEX(rings, h_regionCount, regionX, regionY); + if (offset) { + meRing = DATA_START(rings) + offset; - } else if (var_sb >= sp14) { + while (meRing->x != (u8)MAP_ENTITY_STATE_ARRAY_END) { + if (meRing->x != (u8)MAP_ENTITY_STATE_INITIALIZED) { + // _080080D6 + rx = TO_WORLD_POS(meRing->x, regionX); + ry = TO_WORLD_POS(meRing->y, regionY); - } else { - sp1C = (u8 *)&sp00; - loop_23: - var_r2_2 = p->qWorldX; - temp_r1_2 = var_r2_2 >> 8; - var_r8 = (u32)(((temp_r1_2 + sp1C[0]) - 8) << 8) >> 0x10; - sp24 = var_sb + 1; - if (((s32)var_r8 <= (s32)((s32)((temp_r1_2 + sp1C[2]) - 8) >> 8)) && (var_r8 < sp10)) { - loop_25: - temp_r0_2 = *((var_r8 * 4) + ((sp10 * var_sb * 4) + ringPosBuffer)); - sp20 = var_r8 + 1; - if (temp_r0_2 != 0) { - var_r5 = &ringPosBuffer[temp_r0_2 - 8]; - var_r1_2 = *var_r5; - if (var_r1_2 != 0xFF) { - do { - if (var_r1_2 == 0xFE) { - var_r5 += 2; - } else { - temp_r7 = (var_r5[0] * 8) + (var_r8 << 8); - temp_r6 = (var_r5[1] * 8) + (var_sb << 8); - if (1 != 0) { - temp_r2_3 = temp_r7 - 8; - temp_r3 = sp00[0]; - temp_r1_3 = ((s32)p->qWorldX >> 8) + temp_r3; - if (temp_r2_3 <= temp_r1_3) { - if ((s32)(temp_r7 + 8) < temp_r1_3) { - if (temp_r2_3 >= temp_r1_3) { - goto block_34; - } - } else { - goto block_35; - } - } else { - block_34: - if ((s32)(temp_r1_3 + (sp00[2] - temp_r3)) >= temp_r2_3) { - block_35: - temp_r2_4 = temp_r6 - 0x10; - temp_r3_2 = (s8)sp00[1]; - temp_r1_4 = ((s32)p->qWorldY >> 8) + temp_r3_2; - if (temp_r2_4 <= temp_r1_4) { - if (temp_r6 < temp_r1_4) { - if (temp_r2_4 >= temp_r1_4) { - goto block_38; - } - } else { - goto block_39; - } - } else { - block_38: - if ((s32)(temp_r1_4 + ((s8)sp00[3] - temp_r3_2)) >= temp_r2_4) { - block_39: - AddRings(1); - sub_8029C54((u16)temp_r7, (u16)(s16)temp_r6); - var_r5[0] = 0xFE; - } - } + if (sp08 != FALSE +#if (GAME == GAME_SA2) + || (gCurrentLevel != LEVEL_INDEX(ZONE_FINAL, ACT_TRUE_AREA_53) && !(p->moveState & MOVESTATE_2)) +#endif + ) { + if (RECT_TOUCHING_RING(I(p->qWorldX), I(p->qWorldY), rx, ry, (Rect8 *)rect)) { +#if (GAME == GAME_SA3) + AddRings(1); +#else +#ifndef COLLECT_RINGS_ROM + INCREMENT_RINGS(1); +#else + { + s32 prevLives, newLives; + s32 oldRings = gRingCount; + gRingCount += 1; + if (!(IS_EXTRA_STAGE(CURRENT_LEVEL(0)))) { + newLives = Div(gRingCount, 100); + prevLives = Div(oldRings, 100); + if ((newLives != prevLives) && (gGameMode == GAME_MODE_SINGLE_PLAYER)) { + if (gNumLives < 255) { + gNumLives++; + }; } } } - var_r5 += 2; - var_r3 = p->qWorldY; - var_r2_2 = p->qWorldX; +#endif // COLLECT_RINGS_ROM + if (gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS && gRingCount > 255) + { + gRingCount = 255; + } +#endif // (GAME == GAME_SA3) + + + CreateCollectRingEffect(rx, ry); + meRing->x = (u8)MAP_ENTITY_STATE_INITIALIZED; } - var_r1_2 = *var_r5; - } while (var_r1_2 != 0xFF); + } } + meRing++; } - var_r8 = (u32)(u16)sp20; - if (((s32)var_r8 <= (s32)((s32)(((var_r2_2 >> 8) + sp1C[2]) - 8) >> 8)) && (var_r8 < sp10)) { - goto loop_25; - } - } - var_sb = (u32)(u16)sp24; - if (((s32)var_sb <= (s32)((s32)(((var_r3 >> 8) + sp1C[3]) - 0x10) >> 8)) && (var_sb < sp14)) { - goto loop_23; } } } - var_r2 = (u8)sp28; - if ((u32)var_r2 <= 1U) { - goto loop_9; - } - } while (var_r2 < NUM_SINGLE_PLAYER_CHARS); - cam = &gCamera; - temp_r1_5 = (u32)(gCamera.y << 8) >> 0x10; - var_sb_2 = temp_r1_5; - var_r1_3 = temp_r1_5 << 8; - var_r0 = gCamera.y + DISPLAY_HEIGHT; -loop_72: - if ((var_r1_3 < var_r0) && (var_sb_2 < sp14)) { - temp_r0_3 = cam->x; - temp_r1_6 = (u32)(temp_r0_3 << 8) >> 0x10; - var_r8_2 = temp_r1_6; - if ((s32)(temp_r1_6 << 8) >= (s32)(temp_r0_3 + 0xF0)) { - goto block_71; - } - if (var_r8_2 >= sp10) { - goto block_71; - } - loop_54: - temp_r0_4 = *((var_r8_2 * 4) + ((sp10 * var_sb_2 * 4) + ringPosBuffer)); - if (temp_r0_4 != 0) { - var_r5_2 = &ringPosBuffer[temp_r0_4 - 8]; - loop_67: - temp_r1_7 = var_r5_2[0]; - if (temp_r1_7 == 0xFF) { - goto block_68; - } - if ((temp_r1_7 == 0xFE) - || (temp_r7_2 = (var_r5_2[0] * 8) + (var_r8_2 << 8), temp_r6_2 = (var_r5_2[1] * 8) + (var_sb_2 << 8), - ((u32)((temp_r7_2 - gCamera.x) + 8) > 0x100U)) - || (temp_r0_5 = temp_r6_2 - gCamera.y, (temp_r0_5 < 0)) || ((s32)(temp_r0_5 - 0x10) > 0xA0)) { - var_r5_2 += 2; - goto loop_67; - } - var_r5_2 += 2; - if ((sp18 == 0) || (sp4->s.oamBaseIndex == 0xFF)) { - sp4->s.oamBaseIndex = 0xFF; - sp4->s.x = temp_r7_2 - gCamera.x; - sp4->s.y = temp_r6_2 - gCamera.y; - DisplaySprite(&sp4->s); - goto block_66; - } - temp_r2_5 = &gOamMallocBuffer[sp4->s.oamBaseIndex]; - sp2C = temp_r2_5; - temp_r0_6 = OamMalloc((u8)((u32)((u16)sp4->s.oamFlags & 0x7C0) >> 6)); - if (iwram_end != temp_r0_6) { - DmaCopy16(3, temp_r2_5, temp_r0_6, 6); - temp_r3_3 = temp_r0_6->all.attr1 & 0xFE00; - temp_r0_6->all.attr1 = temp_r3_3; - temp_r2_6 = temp_r0_6->all.attr0 & 0xFF00; - temp_r0_6->all.attr0 = temp_r2_6; - temp_r0_6->all.attr0 = temp_r2_6 + (u8)((temp_r6_2 - gCamera.y) - (u16)spC->offsetY); - temp_r0_6->all.attr1 = temp_r3_3 + (((temp_r7_2 - gCamera.x) - (u16)spC->offsetX) & 0x1FF); - block_66: - sp18 = (s32)(u8)(sp18 + 1); - goto loop_67; - } - } else { - block_68: - temp_r0_7 = var_r8_2 + 1; - var_r8_2 = (u32)temp_r0_7; - if (((s32)(temp_r0_7 << 8) < (s32)(gCamera.x + 0xF0)) && (var_r8_2 < sp10)) { - goto loop_54; + } while (++pid < NUM_SINGLE_PLAYER_CHARS); + + for (; TO_WORLD_POS(0, regionY) < gCamera.y + DISPLAY_HEIGHT && regionY < v_regionCount; regionY++) { +#ifndef NON_MATCHING + while (0) + ; +#endif + for (regionX = TO_REGION(gCamera.x); TO_WORLD_POS(0, regionX) < gCamera.x + DISPLAY_WIDTH && regionX < h_regionCount; + regionX++) { + u32 offset = READ_START_INDEX(rings, h_regionCount, regionX, regionY); + + if (offset != 0) { + meRing = DATA_START(rings) + offset; + while (meRing->x != (u8)MAP_ENTITY_STATE_ARRAY_END) { + if (meRing->x == (u8)MAP_ENTITY_STATE_INITIALIZED) { + meRing++; + continue; + } + + rx = TO_WORLD_POS(meRing->x, regionX); + ry = TO_WORLD_POS(meRing->y, regionY); + + if (rx - gCamera.x < -TILE_WIDTH || (rx - gCamera.x) + TILE_WIDTH > DISPLAY_WIDTH + 2 * TILE_WIDTH + || ry - gCamera.y < 0 || (ry - gCamera.y) - 2 * TILE_WIDTH > DISPLAY_HEIGHT) { + meRing++; + } else { + meRing++; + + if ((drawCount == 0) || s->oamBaseIndex == 0xFF) { + s->oamBaseIndex = 0xFF; + s->x = rx - gCamera.x; + s->y = ry - gCamera.y; + DisplaySprite(s); + } else { + OamData *oamDat = &gOamMallocBuffer[s->oamBaseIndex]; + OamData *oamAllocated = OamMalloc(GET_SPRITE_OAM_ORDER(s)); + + if (iwram_end == oamAllocated) + return; + + DmaCopy16(3, oamDat, oamAllocated, sizeof(OamDataShort)); + +#if !EXTENDED_OAM + // TODO: Can these be done more explicitly? + oamAllocated->all.attr1 &= 0xFE00; + oamAllocated->all.attr0 &= 0xFF00; + oamAllocated->all.attr0 += ((ry - gCamera.y) - dimensions->offsetY) & 0xFF; + oamAllocated->all.attr1 += ((rx - gCamera.x) - dimensions->offsetX) & 0x1FF; +#else + oamAllocated->split.x = ((rx - gCamera.x) - dimensions->offsetX); + oamAllocated->split.y = ((ry - gCamera.y) - dimensions->offsetY); +#endif + } + + drawCount++; + } + } } - block_71: - temp_r0_8 = var_sb_2 + 1; - var_sb_2 = (u32)temp_r0_8; - var_r1_3 = temp_r0_8 << 8; - cam = &gCamera; - var_r0 = cam->y + 0xA0; - goto loop_72; } } } From fc8d1ac794299713b177816c2a3cc56c24b10f6b Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Sun, 29 Mar 2026 22:59:27 +0200 Subject: [PATCH 05/17] More progress on Task_RingsMgrExtraZone --- .../unfinished__rings_manager.c | 81 ++++++++++--------- 1 file changed, 45 insertions(+), 36 deletions(-) diff --git a/src/game/sa1_sa2_shared/unfinished__rings_manager.c b/src/game/sa1_sa2_shared/unfinished__rings_manager.c index f99bfad1a..ba1b355f6 100644 --- a/src/game/sa1_sa2_shared/unfinished__rings_manager.c +++ b/src/game/sa1_sa2_shared/unfinished__rings_manager.c @@ -753,10 +753,11 @@ void Task_RingsMgrStage(void) { void Task_RingsMgrExtraZone(void) { s8 rect[4]; - bool32 sp08 = TRUE; + Sprite *s; + bool32 sp08 = TRUE; // not sp+8 in SA3! + u32 *rings; const SpriteOffset *dimensions; RingsManager *mgr; - u32 *rings; u32 h_regionCount, v_regionCount; OamData *oamAllocated; OamData *oamDat; @@ -767,11 +768,11 @@ void Task_RingsMgrExtraZone(void) MapEntity_Ring *meRing; u8 pid; u16 regionX, regionY; - Sprite *s; s16 mapIndex; u8 drawCount; mgr = TASK_DATA(gCurTask); + s = &mgr->s; rings = mgr->ringPositions; mapIndex = gStageData.currMapIndex; @@ -786,11 +787,11 @@ void Task_RingsMgrExtraZone(void) rect[1] = -10; rect[2] = +10; rect[3] = +10; - UpdateSpriteAnimation(&mgr->s); - if ((mgr->s.frameNum >> 28) == 0) { - dimensions = &gRefSpriteTables->dimensions[mgr->s.anim][mgr->s.frameNum]; + UpdateSpriteAnimation(s); + if ((s->frameNum >> 28) == 0) { + dimensions = &gRefSpriteTables->dimensions[s->anim][s->frameNum]; } else { - dimensions = &gRefSpriteTables->dimensions[mgr->s.anim][mgr->s.frameNum * 8]; + dimensions = &gRefSpriteTables->dimensions[s->anim][s->frameNum * 8]; } (rings[4] + 4); rings[4] + 4; @@ -801,6 +802,11 @@ void Task_RingsMgrExtraZone(void) s16 leftIndex; p = GET_SP_PLAYER_V0(pid); +#if (GAME == GAME_SA3) + if(p->moveState & MOVESTATE_100) + continue; +#endif + // Handle collisions for (regionY = REGION_LOWER(I(p->qWorldY), rect[1], 0); regionY <= REGION_UPPER(I(p->qWorldY), rect[3], TILE_WIDTH) && regionY < v_regionCount; regionY++) { @@ -813,50 +819,53 @@ void Task_RingsMgrExtraZone(void) meRing = DATA_START(rings) + offset; while (meRing->x != (u8)MAP_ENTITY_STATE_ARRAY_END) { - if (meRing->x != (u8)MAP_ENTITY_STATE_INITIALIZED) { - // _080080D6 - rx = TO_WORLD_POS(meRing->x, regionX); - ry = TO_WORLD_POS(meRing->y, regionY); + if (meRing->x == (u8)MAP_ENTITY_STATE_INITIALIZED) { + meRing++; + continue; + } + + rx = TO_WORLD_POS(meRing->x, regionX); + ry = TO_WORLD_POS(meRing->y, regionY); - if (sp08 != FALSE + if (sp08 != FALSE #if (GAME == GAME_SA2) - || (gCurrentLevel != LEVEL_INDEX(ZONE_FINAL, ACT_TRUE_AREA_53) && !(p->moveState & MOVESTATE_2)) + || (gCurrentLevel != LEVEL_INDEX(ZONE_FINAL, ACT_TRUE_AREA_53) && !(p->moveState & MOVESTATE_2)) #endif - ) { - if (RECT_TOUCHING_RING(I(p->qWorldX), I(p->qWorldY), rx, ry, (Rect8 *)rect)) { + ) { + if (RECT_TOUCHING_RING(I(p->qWorldX), I(p->qWorldY), rx, ry, (Rect8 *)rect)) { #if (GAME == GAME_SA3) - AddRings(1); + AddRings(1); #else #ifndef COLLECT_RINGS_ROM - INCREMENT_RINGS(1); + INCREMENT_RINGS(1); #else - { - s32 prevLives, newLives; - s32 oldRings = gRingCount; - gRingCount += 1; - if (!(IS_EXTRA_STAGE(CURRENT_LEVEL(0)))) { - newLives = Div(gRingCount, 100); - prevLives = Div(oldRings, 100); - if ((newLives != prevLives) && (gGameMode == GAME_MODE_SINGLE_PLAYER)) { - if (gNumLives < 255) { - gNumLives++; - }; - } + { + s32 prevLives, newLives; + s32 oldRings = gRingCount; + gRingCount += 1; + if (!(IS_EXTRA_STAGE(CURRENT_LEVEL(0)))) { + newLives = Div(gRingCount, 100); + prevLives = Div(oldRings, 100); + if ((newLives != prevLives) && (gGameMode == GAME_MODE_SINGLE_PLAYER)) { + if (gNumLives < 255) { + gNumLives++; + }; } } + } #endif // COLLECT_RINGS_ROM - if (gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS && gRingCount > 255) - { - gRingCount = 255; - } + if (gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS && gRingCount > 255) + { + gRingCount = 255; + } #endif // (GAME == GAME_SA3) - CreateCollectRingEffect(rx, ry); - meRing->x = (u8)MAP_ENTITY_STATE_INITIALIZED; - } + CreateCollectRingEffect(rx, ry); + meRing->x = (u8)MAP_ENTITY_STATE_INITIALIZED; } } + meRing++; } } From ff2e6803c390a047cfd1b3a5c513276964ccebd7 Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Sun, 29 Mar 2026 23:04:51 +0200 Subject: [PATCH 06/17] Make rings_manager compile again --- .../unfinished__rings_manager.c | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/game/sa1_sa2_shared/unfinished__rings_manager.c b/src/game/sa1_sa2_shared/unfinished__rings_manager.c index ba1b355f6..b422872a1 100644 --- a/src/game/sa1_sa2_shared/unfinished__rings_manager.c +++ b/src/game/sa1_sa2_shared/unfinished__rings_manager.c @@ -1,5 +1,17 @@ #include "global.h" +#include "core.h" +#include "malloc_ewram.h" +#include "rect.h" +#include "trig.h" +#include "sprite.h" +#include "lib/m4a/m4a.h" +#include "game/camera.h" +#include "game/entity.h" +#include "game/player.h" +#include "game/stage.h" #include "game/sa1_sa2_shared/rings_manager.h" +#include "constants/animations.h" +#include "constants/move_states.h" void AddRings(s32 count); void TaskDestructor_RingsMgr(Task *); @@ -803,7 +815,7 @@ void Task_RingsMgrExtraZone(void) p = GET_SP_PLAYER_V0(pid); #if (GAME == GAME_SA3) - if(p->moveState & MOVESTATE_100) + if (p->moveState & MOVESTATE_100) continue; #endif @@ -831,7 +843,7 @@ void Task_RingsMgrExtraZone(void) #if (GAME == GAME_SA2) || (gCurrentLevel != LEVEL_INDEX(ZONE_FINAL, ACT_TRUE_AREA_53) && !(p->moveState & MOVESTATE_2)) #endif - ) { + ) { if (RECT_TOUCHING_RING(I(p->qWorldX), I(p->qWorldY), rx, ry, (Rect8 *)rect)) { #if (GAME == GAME_SA3) AddRings(1); @@ -854,18 +866,16 @@ void Task_RingsMgrExtraZone(void) } } #endif // COLLECT_RINGS_ROM - if (gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS && gRingCount > 255) - { + if (gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS && gRingCount > 255) { gRingCount = 255; } #endif // (GAME == GAME_SA3) - CreateCollectRingEffect(rx, ry); meRing->x = (u8)MAP_ENTITY_STATE_INITIALIZED; } } - + meRing++; } } @@ -878,8 +888,7 @@ void Task_RingsMgrExtraZone(void) while (0) ; #endif - for (regionX = TO_REGION(gCamera.x); TO_WORLD_POS(0, regionX) < gCamera.x + DISPLAY_WIDTH && regionX < h_regionCount; - regionX++) { + for (regionX = TO_REGION(gCamera.x); TO_WORLD_POS(0, regionX) < gCamera.x + DISPLAY_WIDTH && regionX < h_regionCount; regionX++) { u32 offset = READ_START_INDEX(rings, h_regionCount, regionX, regionY); if (offset != 0) { @@ -893,8 +902,8 @@ void Task_RingsMgrExtraZone(void) rx = TO_WORLD_POS(meRing->x, regionX); ry = TO_WORLD_POS(meRing->y, regionY); - if (rx - gCamera.x < -TILE_WIDTH || (rx - gCamera.x) + TILE_WIDTH > DISPLAY_WIDTH + 2 * TILE_WIDTH - || ry - gCamera.y < 0 || (ry - gCamera.y) - 2 * TILE_WIDTH > DISPLAY_HEIGHT) { + if (rx - gCamera.x < -TILE_WIDTH || (rx - gCamera.x) + TILE_WIDTH > DISPLAY_WIDTH + 2 * TILE_WIDTH || ry - gCamera.y < 0 + || (ry - gCamera.y) - 2 * TILE_WIDTH > DISPLAY_HEIGHT) { meRing++; } else { meRing++; From a2e7e42a57146da07de8ea1a40aec247d8b6ddbe Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Mon, 30 Mar 2026 17:56:27 +0200 Subject: [PATCH 07/17] More progress in Task_RingsMgrExtraZone --- .../unfinished__rings_manager.c | 113 +++++++++--------- 1 file changed, 54 insertions(+), 59 deletions(-) diff --git a/src/game/sa1_sa2_shared/unfinished__rings_manager.c b/src/game/sa1_sa2_shared/unfinished__rings_manager.c index b422872a1..8e11438a4 100644 --- a/src/game/sa1_sa2_shared/unfinished__rings_manager.c +++ b/src/game/sa1_sa2_shared/unfinished__rings_manager.c @@ -60,20 +60,6 @@ typedef struct RingsMgrUnk30 { TO_REGION(b + a + offset); \ }) -// From header... -#define RECT_TOUCHING_RING(posX, posY, ringIntX, ringIntY, rect) \ - ((((ringIntX - TILE_WIDTH) <= RECT_LEFT((posX), rect) && (ringIntX + TILE_WIDTH) >= RECT_LEFT((posX), rect)) \ - || ((ringIntX - TILE_WIDTH) >= RECT_LEFT((posX), rect) && RECT_RIGHT((posX), rect) >= (ringIntX - TILE_WIDTH))) \ - && ((((ringIntY - (TILE_WIDTH * 2)) <= RECT_TOP((posY), rect) && ringIntY >= RECT_TOP((posY), rect)) \ - || ((ringIntY - (TILE_WIDTH * 2)) >= RECT_TOP((posY), rect) && RECT_BOTTOM((posY), rect) >= (ringIntY - (TILE_WIDTH * 2)))))) - -// From header... -#define HB_TOUCHING_RING(posX, posY, ringIntX, ringIntY, hb) \ - ((((ringIntX - TILE_WIDTH) <= HB_LEFT((posX), hb) && (ringIntX + TILE_WIDTH) >= HB_LEFT((posX), hb)) \ - || ((ringIntX - TILE_WIDTH) >= HB_LEFT((posX), hb) && HB_RIGHT((posX), hb) >= (ringIntX - TILE_WIDTH))) \ - && ((((ringIntY - (TILE_WIDTH * 2)) <= HB_TOP((posY), hb) && ringIntY >= HB_TOP((posY), hb)) \ - || ((ringIntY - (TILE_WIDTH * 2)) >= HB_TOP((posY), hb) && HB_BOTTOM((posY), hb) >= (ringIntY - (TILE_WIDTH * 2)))))) - void CreateStageRingsManager(void) { Task *t; @@ -782,6 +768,7 @@ void Task_RingsMgrExtraZone(void) u16 regionX, regionY; s16 mapIndex; u8 drawCount; + s16 leftIndex; mgr = TASK_DATA(gCurTask); s = &mgr->s; @@ -801,17 +788,20 @@ void Task_RingsMgrExtraZone(void) rect[3] = +10; UpdateSpriteAnimation(s); if ((s->frameNum >> 28) == 0) { + // Default behavior from SA1 / SA2 dimensions = &gRefSpriteTables->dimensions[s->anim][s->frameNum]; } else { - dimensions = &gRefSpriteTables->dimensions[s->anim][s->frameNum * 8]; + // TODO: WTF!?!? + dimensions = (const SpriteOffset *)&((const SpriteOffset2 *)gRefSpriteTables->dimensions[s->anim])[s->frameNum]; } - (rings[4] + 4); - rings[4] + 4; - rings = rings + 4 + 4 + 4; + + rings++; + + h_regionCount = (u16)*rings++; + v_regionCount = (u16)*rings++; pid = 0; do { - s16 leftIndex; p = GET_SP_PLAYER_V0(pid); #if (GAME == GAME_SA3) @@ -819,64 +809,69 @@ void Task_RingsMgrExtraZone(void) continue; #endif - // Handle collisions - for (regionY = REGION_LOWER(I(p->qWorldY), rect[1], 0); - regionY <= REGION_UPPER(I(p->qWorldY), rect[3], TILE_WIDTH) && regionY < v_regionCount; regionY++) { +#if (GAME == GAME_SA3) + if ((p->charFlags.anim0 != 0x66) && (p->unk48 == 0)) +#endif // (GAME == GAME_SA3) + { + // Handle collisions + for (regionY = REGION_LOWER(I(p->qWorldY), rect[1], 0); + regionY <= REGION_UPPER(I(p->qWorldY), rect[3], -(2 * TILE_WIDTH)) && regionY < v_regionCount; regionY++) { - for (regionX = REGION_LOWER(I(p->qWorldX), rect[leftIndex], -TILE_WIDTH); - regionX <= REGION_UPPER(I(p->qWorldX), rect[2], TILE_WIDTH * 2) && regionX < h_regionCount; regionX++) { + for (regionX = REGION_LOWER(I(p->qWorldX), rect[0], -TILE_WIDTH); + regionX <= REGION_UPPER(I(p->qWorldX), rect[2], -TILE_WIDTH) && regionX < h_regionCount; regionX++) { - u32 offset = READ_START_INDEX(rings, h_regionCount, regionX, regionY); - if (offset) { - meRing = DATA_START(rings) + offset; + u32 offset = READ_START_INDEX(rings, h_regionCount, regionX, regionY); + if (offset) { + meRing = DATA_START(rings) + offset; - while (meRing->x != (u8)MAP_ENTITY_STATE_ARRAY_END) { - if (meRing->x == (u8)MAP_ENTITY_STATE_INITIALIZED) { - meRing++; - continue; - } + while (meRing->x != (u8)MAP_ENTITY_STATE_ARRAY_END) { + if (meRing->x == (u8)MAP_ENTITY_STATE_INITIALIZED) { + meRing++; + continue; + } - rx = TO_WORLD_POS(meRing->x, regionX); - ry = TO_WORLD_POS(meRing->y, regionY); + rx = TO_WORLD_POS(meRing->x, regionX); + ry = TO_WORLD_POS(meRing->y, regionY); - if (sp08 != FALSE + if (sp08 != FALSE #if (GAME == GAME_SA2) - || (gCurrentLevel != LEVEL_INDEX(ZONE_FINAL, ACT_TRUE_AREA_53) && !(p->moveState & MOVESTATE_2)) + || (gCurrentLevel != LEVEL_INDEX(ZONE_FINAL, ACT_TRUE_AREA_53) && !(p->moveState & MOVESTATE_2)) #endif - ) { - if (RECT_TOUCHING_RING(I(p->qWorldX), I(p->qWorldY), rx, ry, (Rect8 *)rect)) { + ) { + if (RECT_TOUCHING_RING(I(p->qWorldX), I(p->qWorldY), rx, ry, (Rect8 *)rect)) { #if (GAME == GAME_SA3) - AddRings(1); + AddRings(1); #else #ifndef COLLECT_RINGS_ROM - INCREMENT_RINGS(1); + INCREMENT_RINGS(1); #else - { - s32 prevLives, newLives; - s32 oldRings = gRingCount; - gRingCount += 1; - if (!(IS_EXTRA_STAGE(CURRENT_LEVEL(0)))) { - newLives = Div(gRingCount, 100); - prevLives = Div(oldRings, 100); - if ((newLives != prevLives) && (gGameMode == GAME_MODE_SINGLE_PLAYER)) { - if (gNumLives < 255) { - gNumLives++; - }; + { + s32 prevLives, newLives; + s32 oldRings = gRingCount; + gRingCount += 1; + if (!(IS_EXTRA_STAGE(CURRENT_LEVEL(0)))) { + newLives = Div(gRingCount, 100); + prevLives = Div(oldRings, 100); + if ((newLives != prevLives) && (gGameMode == GAME_MODE_SINGLE_PLAYER)) { + if (gNumLives < 255) { + gNumLives++; + }; + } } } - } #endif // COLLECT_RINGS_ROM - if (gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS && gRingCount > 255) { - gRingCount = 255; - } + if (gGameMode == GAME_MODE_MULTI_PLAYER_COLLECT_RINGS && gRingCount > 255) { + gRingCount = 255; + } #endif // (GAME == GAME_SA3) - CreateCollectRingEffect(rx, ry); - meRing->x = (u8)MAP_ENTITY_STATE_INITIALIZED; + CreateCollectRingEffect(rx, ry); + meRing->x = (u8)MAP_ENTITY_STATE_INITIALIZED; + } } - } - meRing++; + meRing++; + } } } } From d9bf259a423598541a26f6c407d39949104f4c1c Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Thu, 2 Apr 2026 18:57:35 +0200 Subject: [PATCH 08/17] Match Task_RingsMgrExtraZone --- .../sa1_sa2_shared/unfinished__rings_manager.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/game/sa1_sa2_shared/unfinished__rings_manager.c b/src/game/sa1_sa2_shared/unfinished__rings_manager.c index 8e11438a4..8a1d70331 100644 --- a/src/game/sa1_sa2_shared/unfinished__rings_manager.c +++ b/src/game/sa1_sa2_shared/unfinished__rings_manager.c @@ -752,6 +752,7 @@ void Task_RingsMgrExtraZone(void) { s8 rect[4]; Sprite *s; + u16 regionX, regionY; bool32 sp08 = TRUE; // not sp+8 in SA3! u32 *rings; const SpriteOffset *dimensions; @@ -765,7 +766,6 @@ void Task_RingsMgrExtraZone(void) struct Camera *cam; MapEntity_Ring *meRing; u8 pid; - u16 regionX, regionY; s16 mapIndex; u8 drawCount; s16 leftIndex; @@ -800,8 +800,7 @@ void Task_RingsMgrExtraZone(void) h_regionCount = (u16)*rings++; v_regionCount = (u16)*rings++; - pid = 0; - do { + for (pid = 0; pid < NUM_SINGLE_PLAYER_CHARS; pid++) { p = GET_SP_PLAYER_V0(pid); #if (GAME == GAME_SA3) @@ -815,10 +814,12 @@ void Task_RingsMgrExtraZone(void) { // Handle collisions for (regionY = REGION_LOWER(I(p->qWorldY), rect[1], 0); - regionY <= REGION_UPPER(I(p->qWorldY), rect[3], -(2 * TILE_WIDTH)) && regionY < v_regionCount; regionY++) { + // TODO: Check, why both uses of REGION_UPPER() only match like this in SA3! + // (Should in theory be roughly in-line with SA1/SA2...) + regionY <= REGION_UPPER(I(p->qWorldY), 0, rect[3] - (2 * TILE_WIDTH)) && regionY < v_regionCount; regionY++) { for (regionX = REGION_LOWER(I(p->qWorldX), rect[0], -TILE_WIDTH); - regionX <= REGION_UPPER(I(p->qWorldX), rect[2], -TILE_WIDTH) && regionX < h_regionCount; regionX++) { + regionX <= REGION_UPPER(I(p->qWorldX), 0, rect[2] - TILE_WIDTH) && regionX < h_regionCount; regionX++) { u32 offset = READ_START_INDEX(rings, h_regionCount, regionX, regionY); if (offset) { @@ -876,10 +877,10 @@ void Task_RingsMgrExtraZone(void) } } } - } while (++pid < NUM_SINGLE_PLAYER_CHARS); + } - for (; TO_WORLD_POS(0, regionY) < gCamera.y + DISPLAY_HEIGHT && regionY < v_regionCount; regionY++) { -#ifndef NON_MATCHING + for (regionY = TO_REGION(gCamera.y); TO_WORLD_POS(0, regionY) < gCamera.y + DISPLAY_HEIGHT && regionY < v_regionCount; regionY++) { +#if (!defined(NON_MATCHING) && (GAME <= GAME_SA2)) while (0) ; #endif From efaabf4a7919b4d38d2b02b52d55ceccb502a2a0 Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Fri, 3 Apr 2026 20:02:39 +0200 Subject: [PATCH 09/17] More progress --- include/sprite.h | 5 + .../unfinished__rings_manager.c | 422 ++++++++---------- 2 files changed, 181 insertions(+), 246 deletions(-) diff --git a/include/sprite.h b/include/sprite.h index 0070ec0f1..b00f20941 100644 --- a/include/sprite.h +++ b/include/sprite.h @@ -122,6 +122,11 @@ typedef struct { /* 0x0A */ s16 offsetY; } SpriteOffset; +typedef struct SpriteOffset2 { + SpriteOffset base; + u8 padding[4]; +} SpriteOffset2; + // TODO: Verify "(in)active" name #define HITBOX_STATE_INACTIVE -1 #define HITBOX_IS_ACTIVE(hb) ((hb).index != HITBOX_STATE_INACTIVE) diff --git a/src/game/sa1_sa2_shared/unfinished__rings_manager.c b/src/game/sa1_sa2_shared/unfinished__rings_manager.c index 8a1d70331..df3b1b937 100644 --- a/src/game/sa1_sa2_shared/unfinished__rings_manager.c +++ b/src/game/sa1_sa2_shared/unfinished__rings_manager.c @@ -200,20 +200,22 @@ void CreateCollectRingEffectNoSfx(s16 worldX, s16 worldY) } } -#if 0 -void Task_RingsMgrStage(void) { - Sprite *sp4; - void *sp8; +void Task_RingsMgrStage(void) +{ + s8 sp00[4]; + Sprite *s; + u32 *rings; SpriteOffset *spC; + const SpriteOffset *dimensions; u32 sp10; u32 sp14; s32 sp18; - s32 sp1C; - ? *sp20; - ? *sp24; + u8 i; + u8 *sp20; + u8 *sp24; s32 sp28; - ? *sp2C; - ? *sp30; + s8 *sp2C; + s8 *sp30; s32 sp34; s32 sp38; s32 sp3C; @@ -224,40 +226,9 @@ void Task_RingsMgrStage(void) { OamData *temp_r0_7; OamData *temp_r2_12; OamData *temp_r2_14; - Player *temp_r0; - Player *temp_r0_2; + Player *p; Player *var_sb; - Sprite *temp_r1; - s16 temp_r6_4; - s16 temp_r7; - s16 temp_r7_2; - s16 temp_r7_3; - s32 temp_r0_11; - s32 temp_r0_12; - s32 temp_r0_13; - s32 temp_r0_3; - s32 temp_r0_5; - s32 temp_r0_6; - s32 temp_r1_10; - s32 temp_r1_11; - s32 temp_r1_12; - s32 temp_r1_2; - s32 temp_r1_4; - s32 temp_r1_5; - s32 temp_r1_6; - s32 temp_r1_7; - s32 temp_r1_9; - s32 temp_r2_10; - s32 temp_r2_11; - s32 temp_r2_3; - s32 temp_r2_4; - s32 temp_r2_7; - s32 temp_r2_8; - s32 temp_r2_9; - s32 temp_r6_2; - s32 temp_r6_3; - s32 temp_r6_5; - s32 temp_r7_4; + RingsManager *mgr; s32 var_r0; s32 var_r0_2; s32 var_r1_4; @@ -265,26 +236,9 @@ void Task_RingsMgrStage(void) { s32 var_r2_2; s32 var_r3; s32 var_r3_2; - s8 *temp_r1_3; s8 *temp_r1_8; s8 *temp_r2_2; s8 *temp_r2_6; - s8 temp_r3; - s8 temp_r3_2; - s8 temp_r3_3; - s8 temp_r3_4; - u16 temp_r0_15; - u16 temp_r0_16; - u16 temp_r0_8; - u16 temp_r0_9; - u16 temp_r2_13; - u16 temp_r2_15; - u16 temp_r3_5; - u16 temp_r3_6; - u32 temp_r1_13; - u32 temp_r1_15; - u32 temp_r1_16; - u32 temp_r2; u32 var_r8; u32 var_r8_2; u32 var_r8_3; @@ -295,11 +249,6 @@ void Task_RingsMgrStage(void) { u32 var_sl_4; u8 *var_r5; u8 *var_r5_2; - u8 temp_r0_10; - u8 temp_r0_4; - u8 temp_r1_14; - u8 temp_r1_17; - u8 temp_r2_5; u8 var_r1; u8 var_r1_2; u8 var_r1_3; @@ -307,157 +256,138 @@ void Task_RingsMgrStage(void) { void *var_r5_3; void *var_r5_4; - var_sb = saved_reg_r9; - temp_r1 = gCurTask->data + 0x03000000; - sp4 = temp_r1; - sp8 = temp_r1->unk28; + // var_sb = saved_reg_r9; + mgr = TASK_DATA(gCurTask); + s = &mgr->s; + rings = mgr->ringPositions; sp18 = 0; - UpdateSpriteAnimation(sp4); - temp_r2 = sp4->frameNum; - if ((temp_r2 >> 0x1C) == 0) { - spC = &gRefSpriteTables->dimensions[sp4->anim][temp_r2]; + UpdateSpriteAnimation(s); + if ((s->frameNum >> 28) == 0) { + // Default behavior from SA1 / SA2 + dimensions = &gRefSpriteTables->dimensions[s->anim][s->frameNum]; } else { - spC = gRefSpriteTables->dimensions[sp4->anim] + (temp_r2 * 0x10); + // TODO: WTF!?!? + dimensions = (const SpriteOffset *)&((const SpriteOffset2 *)gRefSpriteTables->dimensions[s->anim])[s->frameNum]; } - temp_r6 = sp8 + 4; - sp10 = (u32) (u16) sp8->unk4; - sp8 = temp_r6 + 4 + 4; - sp14 = (u32) (u16) temp_r6->unk4; - if ((u32) gStageData.gameMode > 5U) { - sp1C = 0; - sp2C = &subroutine_arg0; -loop_94: - sp28 = 0; - temp_r0 = &gPlayers[sp1C]; - temp_r1_2 = 0x1C & temp_r0->unk2B; - sp40 = sp1C + 1; - if (temp_r1_2 == 0x14) { - - } else if (temp_r1_2 == 8) { - - } else { - temp_r0_2 = &gPlayers[gStageData.playerIndex]; - if ((temp_r0 == temp_r0_2) || (temp_r0 == &gPlayers[(u32) (temp_r0_2->unk2B << 0x1E) >> 0x1E])) { - sp28 = 1; - } - sp40 = sp1C + 1; - if (temp_r0->moveState & 0x100) { - - } else if (temp_r0->charFlags.anim0 == 0x66) { - - } else if (temp_r0->unk48 != 0) { - - } else { - temp_r1_3 = &temp_r0->spriteOffsetX; - sp2C->unk0 = (s8) (0 - (u8) *temp_r1_3); - temp_r2_2 = &temp_r0->spriteOffsetY; - sp2C->unk1 = (s8) (0 - (u8) *temp_r2_2); - sp2C->unk2 = (u8) *temp_r1_3; - sp2C->unk3 = (u8) *temp_r2_2; - temp_r1_4 = (s32) temp_r0->qWorldY >> 8; - var_sl = (u32) ((temp_r1_4 + sp2C->unk1) << 8) >> 0x10; - if ((s32) var_sl > (s32) ((s32) ((s8) sp2C->unk3 + temp_r1_4 + 8) >> 8)) { + temp_r6 = rings + 4; + // sp10 = (u32) (u16) rings->unk4; + // rings = temp_r6 + 4 + 4; + // sp14 = (u32) (u16) temp_r6->unk4; + if (!(GAME_MODE_IS_SINGLE_PLAYER(gStageData.gameMode) || (gStageData.gameMode == GAME_MODE_5))) { + for (i = 0; i < NUM_SINGLE_PLAYER_CHARS; i++) { + sp2C = &sp00[0]; + sp28 = 0; + p = &gPlayers[i]; + if ((p->charFlags.someIndex != 1) && (p->charFlags.someIndex != 2) && (p->charFlags.someIndex != 4)) { + Player *activePlayer = GET_SP_PLAYER_V0(PLAYER_1); + if ((p == activePlayer) || (p == GET_SP_PLAYER_V0(PLAYER_2))) { + sp28 = 1; + } - } else if (var_sl >= sp14) { + if (!(p->moveState & 0x100) && (p->charFlags.anim0 != 0x66) && (p->unk48 == 0)) { + sp2C[0] = -p->spriteOffsetX; + sp2C[1] = -p->spriteOffsetY; + sp2C[2] = +p->spriteOffsetX; + sp2C[3] = +p->spriteOffsetY; + var_sl = (u32)((I(p->qWorldY) + sp2C[1]) << 8) >> 0x10; - } else { - sp30 = &subroutine_arg0; -loop_112: - var_r2 = temp_r0->qWorldX; - temp_r1_5 = var_r2 >> 8; - var_r8 = (u32) (((temp_r1_5 + sp30->unk0) - 8) << 8) >> 0x10; - var_r0 = (s32) (sp30->unk2 + temp_r1_5 + 0x10) >> 8; - var_r3 = temp_r0->qWorldY; - sp3C = var_sl + 1; -loop_135: - if (((s32) var_r8 <= var_r0) && (var_r8 < sp10)) { - temp_r0_3 = *((var_r8 * 4) + ((sp10 * var_sl * 4) + sp8)); - sp38 = var_r8 + 1; - if (temp_r0_3 != 0) { - var_r5 = sp8 + (temp_r0_3 - 8); - var_r1 = *var_r5; - if (var_r1 != 0xFF) { - do { - if (var_r1 == 0xFE) { - var_r5 += 2; - } else { - temp_r7 = (var_r5[0] * 8) + (var_r8 << 8); - temp_r6_2 = (var_r5[1] * 8) + (var_sl << 8); - temp_r2_3 = temp_r7 - 8; - temp_r3 = sp00[0]; - temp_r1_6 = ((s32) temp_r0->qWorldX >> 8) + temp_r3; - if (temp_r2_3 <= temp_r1_6) { - if ((s32) (temp_r7 + 8) < temp_r1_6) { - if (temp_r2_3 >= temp_r1_6) { - goto block_121; + if ((var_sl <= (((s8)sp2C[3] + I(p->qWorldY) + 8) >> 8)) && (var_sl < sp14)) { + sp30 = &sp00[0]; +#if 0 + loop_112: + var_r2 = p->qWorldX; + temp_r1_5 = var_r2 >> 8; + var_r8 = (u32) (((temp_r1_5 + sp30->unk0) - 8) << 8) >> 0x10; + var_r0 = (sp30->unk2 + temp_r1_5 + 0x10) >> 8; + var_r3 = p->qWorldY; + sp3C = var_sl + 1; + loop_135: + if ((var_r8 <= var_r0) && (var_r8 < rings->unk4)) { + temp_r0_3 = *((var_r8 * 4) + ((rings->unk4 * var_sl * 4) + rings)); + sp38 = var_r8 + 1; + if (temp_r0_3 != 0) { + var_r5 = rings + (temp_r0_3 - 8); + var_r1 = *var_r5; + if (var_r1 != 0xFF) { + do { + if (var_r1 == 0xFE) { + var_r5 += 2; + } else { + temp_r7 = (var_r5[0] * 8) + (var_r8 << 8); + temp_r6_2 = (var_r5[1] * 8) + (var_sl << 8); + temp_r2_3 = temp_r7 - 8; + temp_r3 = sp00[0]; + temp_r1_6 = (p->qWorldX >> 8) + temp_r3; + if (temp_r2_3 <= temp_r1_6) { + if ((temp_r7 + 8) < temp_r1_6) { + if (temp_r2_3 >= temp_r1_6) { + goto block_121; + } + } else { + goto block_122; } } else { - goto block_122; - } - } else { -block_121: - if ((s32) (temp_r1_6 + (sp00[2] - temp_r3)) >= temp_r2_3) { -block_122: - temp_r2_4 = temp_r6_2 - 0x10; - temp_r3_2 = sp00[1]; - temp_r1_7 = ((s32) temp_r0->qWorldY >> 8) + temp_r3_2; - if (temp_r2_4 <= temp_r1_7) { - if (temp_r6_2 < temp_r1_7) { - if (temp_r2_4 >= temp_r1_7) { - goto block_125; + block_121: + if ((temp_r1_6 + (sp00[2] - temp_r3)) >= temp_r2_3) { + block_122: + temp_r2_4 = temp_r6_2 - 0x10; + temp_r3_2 = sp00[1]; + temp_r1_7 = (p->qWorldY >> 8) + temp_r3_2; + if (temp_r2_4 <= temp_r1_7) { + if (temp_r6_2 < temp_r1_7) { + if (temp_r2_4 >= temp_r1_7) { + goto block_125; + } + } else { + goto block_126; } } else { - goto block_126; - } - } else { -block_125: - if ((s32) (temp_r1_7 + (sp00[3] - temp_r3_2)) >= temp_r2_4) { -block_126: - if (sp28 != 0) { - if (gStageData.playerIndex == sp1C) { - AddRings(1); - CreateCollectRingEffect((s32) temp_r7, (s32) (s16) temp_r6_2); + block_125: + if ((temp_r1_7 + (sp00[3] - temp_r3_2)) >= temp_r2_4) { + block_126: + if (sp28 != 0) { + if (gStageData.playerIndex == i) { + AddRings(1); + CreateCollectRingEffect(temp_r7, (s16) temp_r6_2); + } else { + CreateCollectRingEffectNoSfx((u16) temp_r7, (u16) (s16) temp_r6_2); + } } else { CreateCollectRingEffectNoSfx((u16) temp_r7, (u16) (s16) temp_r6_2); } - } else { - CreateCollectRingEffectNoSfx((u16) temp_r7, (u16) (s16) temp_r6_2); + var_r5[0] = 0xFE; } - var_r5[0] = 0xFE; } } } + var_r5 += 2; + var_r3 = p->qWorldY; + var_r2 = p->qWorldX; } - var_r5 += 2; - var_r3 = temp_r0->qWorldY; - var_r2 = temp_r0->qWorldX; - } - var_r1 = *var_r5; - } while (var_r1 != 0xFF); + var_r1 = *var_r5; + } while (var_r1 != 0xFF); + } } + var_r8 = (u32) (u16) sp38; + var_r0 = (sp30->unk2 + (var_r2 >> 8) + 0x10) >> 8; + goto loop_135; } - var_r8 = (u32) (u16) sp38; - var_r0 = (s32) (sp30->unk2 + (var_r2 >> 8) + 0x10) >> 8; - goto loop_135; - } - var_sl = (u32) (u16) sp3C; - if (((s32) var_sl <= (s32) ((s32) (sp30->unk3 + (var_r3 >> 8) + 8) >> 8)) && (var_sl < sp14)) { - goto loop_112; + var_sl = (u32) (u16) sp3C; + if ((var_sl <= ((sp30->unk3 + (var_r3 >> 8) + 8) >> 8)) && (var_sl < sp14)) { + goto loop_112; + } +#endif } } } } - temp_r0_4 = (u8) sp40; - sp1C = (s32) temp_r0_4; - if ((u32) temp_r0_4 <= 3U) { - goto loop_94; - } - goto block_143; + // goto block_143; } - sp1C = 0; - sp20 = &subroutine_arg0; +#if 0 + i = 0; + sp20 = &sp00; loop_6: - if (sp1C == 0) { + if (i == 0) { var_r1_2 = gStageData.playerIndex; } else { var_r1_2 = (u8) ((u32) (var_sb->unk2B << 0x1E) >> 0x1E); @@ -483,30 +413,30 @@ void Task_RingsMgrStage(void) { sp20->unk1 = (s8) (0 - (u8) *temp_r2_6); sp20->unk2 = (u8) *temp_r1_8; sp20->unk3 = (u8) *temp_r2_6; - temp_r1_9 = (s32) var_sb->qWorldY >> 8; + temp_r1_9 = var_sb->qWorldY >> 8; var_sl_2 = (u32) ((temp_r1_9 + sp20->unk1) << 8) >> 0x10; - if ((s32) var_sl_2 > (s32) ((s32) ((s8) sp20->unk3 + temp_r1_9 + 8) >> 8)) { + if (var_sl_2 > (((s8) sp20->unk3 + temp_r1_9 + 8) >> 8)) { } else if (var_sl_2 >= sp14) { } else { - sp24 = &subroutine_arg0; + sp24 = &sp00; loop_23: var_r2_2 = var_sb->qWorldX; temp_r1_10 = var_r2_2 >> 8; var_r8_2 = (u32) (((temp_r1_10 + sp24->unk0) - 8) << 8) >> 0x10; var_r3_2 = var_sb->qWorldY; sp3C = var_sl_2 + 1; - if ((s32) var_r8_2 > (s32) ((s32) (sp24->unk2 + temp_r1_10 + 0x10) >> 8)) { + if (var_r8_2 > ((sp24->unk2 + temp_r1_10 + 0x10) >> 8)) { - } else if (var_r8_2 >= sp10) { + } else if (var_r8_2 >= rings->unk4) { } else { loop_27: - temp_r0_5 = *((var_r8_2 * 4) + ((sp10 * var_sl_2 * 4) + sp8)); + temp_r0_5 = *((var_r8_2 * 4) + ((rings->unk4 * var_sl_2 * 4) + rings)); sp38 = var_r8_2 + 1; if (temp_r0_5 != 0) { - var_r5_2 = sp8 + (temp_r0_5 - 8); + var_r5_2 = rings + (temp_r0_5 - 8); var_r1_3 = *var_r5_2; if (var_r1_3 != 0xFF) { do { @@ -517,9 +447,9 @@ void Task_RingsMgrStage(void) { temp_r6_3 = (var_r5_2[1] * 8) + (var_sl_2 << 8); temp_r2_7 = temp_r7_2 - 8; temp_r3_3 = sp00[0]; - temp_r1_11 = ((s32) var_sb->qWorldX >> 8) + temp_r3_3; + temp_r1_11 = (var_sb->qWorldX >> 8) + temp_r3_3; if (temp_r2_7 <= temp_r1_11) { - if ((s32) (temp_r7_2 + 8) < temp_r1_11) { + if ((temp_r7_2 + 8) < temp_r1_11) { if (temp_r2_7 >= temp_r1_11) { goto block_35; } @@ -528,11 +458,11 @@ void Task_RingsMgrStage(void) { } } else { block_35: - if ((s32) (temp_r1_11 + (sp00[2] - temp_r3_3)) >= temp_r2_7) { + if ((temp_r1_11 + (sp00[2] - temp_r3_3)) >= temp_r2_7) { block_36: temp_r2_8 = temp_r6_3 - 0x10; temp_r3_4 = sp00[1]; - temp_r1_12 = ((s32) var_sb->qWorldY >> 8) + temp_r3_4; + temp_r1_12 = (var_sb->qWorldY >> 8) + temp_r3_4; if (temp_r2_8 <= temp_r1_12) { if (temp_r6_3 < temp_r1_12) { if (temp_r2_8 >= temp_r1_12) { @@ -543,12 +473,12 @@ void Task_RingsMgrStage(void) { } } else { block_39: - if ((s32) (temp_r1_12 + (sp00[3] - temp_r3_4)) >= temp_r2_8) { + if ((temp_r1_12 + (sp00[3] - temp_r3_4)) >= temp_r2_8) { block_40: - if ((sp1C == 0) || ((0x1C & *sp44) == 8)) { + if ((i == 0) || ((0x1C & *sp44) == 8)) { AddRings(1); } - CreateCollectRingEffect((s32) temp_r7_2, (s32) (s16) temp_r6_3); + CreateCollectRingEffect(temp_r7_2, (s16) temp_r6_3); var_r5_2[0] = 0xFE; } } @@ -563,12 +493,12 @@ void Task_RingsMgrStage(void) { } } var_r8_2 = (u32) (u16) sp38; - if (((s32) var_r8_2 <= (s32) ((s32) (sp24->unk2 + (var_r2_2 >> 8) + 0x10) >> 8)) && (var_r8_2 < sp10)) { + if ((var_r8_2 <= ((sp24->unk2 + (var_r2_2 >> 8) + 0x10) >> 8)) && (var_r8_2 < rings->unk4)) { goto loop_27; } } var_sl_2 = (u32) (u16) sp3C; - if (((s32) var_sl_2 <= (s32) ((s32) (sp24->unk3 + (var_r3_2 >> 8) + 8) >> 8)) && (var_sl_2 < sp14)) { + if ((var_sl_2 <= ((sp24->unk3 + (var_r3_2 >> 8) + 8) >> 8)) && (var_sl_2 < sp14)) { goto loop_23; } } @@ -576,7 +506,7 @@ void Task_RingsMgrStage(void) { if (!(0x20 & var_sb->unk13C)) { goto block_90; } - if ((s32) (var_sl_3 << 8) >= (s32) (gCamera.y + 0xA0)) { + if ((var_sl_3 << 8) >= (gCamera.y + 0xA0)) { goto block_90; } if (var_sl_3 >= sp14) { @@ -585,11 +515,11 @@ void Task_RingsMgrStage(void) { loop_58: temp_r1_13 = (u32) (gCamera.x << 8) >> 0x10; var_r8_3 = temp_r1_13; - if ((s32) (temp_r1_13 << 8) >= (s32) (gCamera.x + 0xF0)) { + if ((temp_r1_13 << 8) >= (gCamera.x + 0xF0)) { goto block_87; } temp_r2_9 = sp10 * var_sl_3; - var_r0_2 = *((var_r8_3 * 4) + ((temp_r2_9 * 4) + sp8)); + var_r0_2 = *((var_r8_3 * 4) + ((temp_r2_9 * 4) + rings)); sp34 = temp_r2_9; if (var_r8_3 >= sp10) { goto block_87; @@ -598,7 +528,7 @@ void Task_RingsMgrStage(void) { if (var_r0_2 == 0) { goto block_84; } - var_r5_3 = sp8 + (var_r0_2 - 8); + var_r5_3 = rings + (var_r0_2 - 8); loop_82: temp_r1_14 = var_r5_3->unk0; switch (temp_r1_14) { /* irregular */ @@ -607,27 +537,27 @@ void Task_RingsMgrStage(void) { temp_r6_4 = (var_r5_3->unk1 * 8) + (var_sl_3 << 8); if ((u32) ((temp_r7_3 - gCamera.x) + 8) <= 0x100U) { temp_r0_6 = temp_r6_4 - gCamera.y; - if ((temp_r0_6 >= 0) && ((s32) (temp_r0_6 - 0x10) <= 0xA0)) { - temp_r2_10 = (s32) var_sb->qWorldX >> 8; - if (((s32) (temp_r7_3 - 0x40) <= temp_r2_10) && ((s32) (temp_r7_3 + 0x40) >= temp_r2_10)) { - temp_r2_11 = (s32) var_sb->qWorldY >> 8; - if (((s32) (temp_r6_4 - 0x48) <= temp_r2_11) && ((s32) (temp_r6_4 + 0x38) >= temp_r2_11)) { + if ((temp_r0_6 >= 0) && ((temp_r0_6 - 0x10) <= 0xA0)) { + temp_r2_10 = var_sb->qWorldX >> 8; + if (((temp_r7_3 - 0x40) <= temp_r2_10) && ((temp_r7_3 + 0x40) >= temp_r2_10)) { + temp_r2_11 = var_sb->qWorldY >> 8; + if (((temp_r6_4 - 0x48) <= temp_r2_11) && ((temp_r6_4 + 0x38) >= temp_r2_11)) { sub_802AB10(temp_r7_3, temp_r6_4, var_sb); var_r5_3->unk0 = 0xFEU; goto block_74; } } var_r5_3 += 2; - if ((sp18 == 0) || (sp4->oamBaseIndex == 0xFF)) { - sp4->oamBaseIndex = 0xFF; - sp4->x = temp_r7_3 - gCamera.x; - sp4->y = temp_r6_4 - gCamera.y; - DisplaySprite(sp4); + if ((sp18 == 0) || (s->oamBaseIndex == 0xFF)) { + s->oamBaseIndex = 0xFF; + s->x = temp_r7_3 - gCamera.x; + s->y = temp_r6_4 - gCamera.y; + DisplaySprite(s); goto block_81; } - temp_r2_12 = &gOamMallocBuffer[sp4->oamBaseIndex]; + temp_r2_12 = &gOamMallocBuffer[s->oamBaseIndex]; sp48 = temp_r2_12; - temp_r0_7 = OamMalloc((u8) ((u32) ((u16) sp4->oamFlags & 0x7C0) >> 6)); + temp_r0_7 = OamMalloc((u8) ((u32) ((u16) s->oamFlags & 0x7C0) >> 6)); if (iwram_end == temp_r0_7) { return; } @@ -641,7 +571,7 @@ void Task_RingsMgrStage(void) { temp_r0_7->all.attr0 = temp_r2_13 + (u8) ((temp_r6_4 - gCamera.y) - (u16) spC->offsetY); temp_r0_7->all.attr1 = temp_r3_5 + (((temp_r7_3 - gCamera.x) - (u16) spC->offsetX) & 0x1FF); block_81: - sp18 = (s32) (u8) (sp18 + 1); + sp18 = (u8) (sp18 + 1); goto loop_82; } } @@ -653,8 +583,8 @@ void Task_RingsMgrStage(void) { block_84: temp_r0_8 = var_r8_3 + 1; var_r8_3 = (u32) temp_r0_8; - if ((s32) (temp_r0_8 << 8) < (s32) (gCamera.x + 0xF0)) { - var_r0_2 = *((var_r8_3 * 4) + ((sp34 * 4) + sp8)); + if ((temp_r0_8 << 8) < (gCamera.x + 0xF0)) { + var_r0_2 = *((var_r8_3 * 4) + ((sp34 * 4) + rings)); if (var_r8_3 < sp10) { goto loop_62; } @@ -662,12 +592,12 @@ void Task_RingsMgrStage(void) { block_87: temp_r0_9 = var_sl_3 + 1; var_sl_3 = (u32) temp_r0_9; - if (((s32) (temp_r0_9 << 8) < (s32) (gCamera.y + 0xA0)) && (var_sl_3 < sp14)) { + if (((temp_r0_9 << 8) < (gCamera.y + 0xA0)) && (var_sl_3 < sp14)) { goto loop_58; } block_90: - temp_r0_10 = sp1C + 1; - sp1C = (s32) temp_r0_10; + temp_r0_10 = i + 1; + i = temp_r0_10; if ((u32) temp_r0_10 <= 1U) { goto loop_6; } @@ -677,47 +607,47 @@ void Task_RingsMgrStage(void) { var_sl_4 = temp_r1_15; var_r1_4 = temp_r1_15 << 8; loop_168: - if ((var_r1_4 < (s32) (temp_r0_11 + 0xA0)) && (var_sl_4 < sp14)) { + if ((var_r1_4 < (temp_r0_11 + 0xA0)) && (var_sl_4 < sp14)) { temp_r1_16 = (u32) (gCamera.x << 8) >> 0x10; var_r8_4 = temp_r1_16; - if ((s32) (temp_r1_16 << 8) >= (s32) (gCamera.x + 0xF0)) { + if ((temp_r1_16 << 8) >= (gCamera.x + 0xF0)) { goto block_167; } if (var_r8_4 >= sp10) { goto block_167; } loop_148: - temp_r0_12 = *((var_r8_4 * 4) + ((sp10 * var_sl_4 * 4) + sp8)); + temp_r0_12 = *((var_r8_4 * 4) + ((sp10 * var_sl_4 * 4) + rings)); if (temp_r0_12 == 0) { goto block_164; } - var_r5_4 = sp8 + (temp_r0_12 - 8); + var_r5_4 = rings + (temp_r0_12 - 8); loop_162: temp_r1_17 = var_r5_4->unk0; switch (temp_r1_17) { /* switch 1; irregular */ default: /* switch 1 */ temp_r7_4 = (var_r5_4->unk0 * 8) + (var_r8_4 << 8); temp_r6_5 = (var_r5_4->unk1 * 8) + (var_sl_4 << 8); - if (((u32) ((temp_r7_4 - gCamera.x) + 8) > 0x100U) || (temp_r0_13 = temp_r6_5 - gCamera.y, (temp_r0_13 < 0)) || ((s32) (temp_r0_13 - 0x10) > 0xA0)) { + if (((u32) ((temp_r7_4 - gCamera.x) + 8) > 0x100U) || (temp_r0_13 = temp_r6_5 - gCamera.y, (temp_r0_13 < 0)) || ((temp_r0_13 - 0x10) > 0xA0)) { case 0xFE: /* switch 1 */ var_r5_4 += 2; goto loop_162; } var_r5_4 += 2; - if ((sp18 == 0) || (sp4->oamBaseIndex == 0xFF)) { - sp4->oamBaseIndex = 0xFF; - sp4->x = temp_r7_4 - gCamera.x; - sp4->y = temp_r6_5 - gCamera.y; - DisplaySprite(sp4); + if ((sp18 == 0) || (s->oamBaseIndex == 0xFF)) { + s->oamBaseIndex = 0xFF; + s->x = temp_r7_4 - gCamera.x; + s->y = temp_r6_5 - gCamera.y; + DisplaySprite(s); goto block_161; } - temp_r2_14 = &gOamMallocBuffer[sp4->oamBaseIndex]; + temp_r2_14 = &gOamMallocBuffer[s->oamBaseIndex]; sp48 = temp_r2_14; - temp_r0_14 = OamMalloc((u8) ((u32) ((u16) sp4->oamFlags & 0x7C0) >> 6)); + temp_r0_14 = OamMalloc((u8) ((u32) ((u16) s->oamFlags & 0x7C0) >> 6)); if (iwram_end != temp_r0_14) { - (void *)0x040000D4->unk0 = temp_r2_14; - (void *)0x040000D4->unk4 = temp_r0_14; - (void *)0x040000D4->unk8 = 0x80000003; +// (void *)0x040000D4->unk0 = temp_r2_14; +// (void *)0x040000D4->unk4 = temp_r0_14; +// (void *)0x040000D4->unk8 = 0x80000003; temp_r3_6 = temp_r0_14->all.attr1 & 0xFE00; temp_r0_14->all.attr1 = temp_r3_6; temp_r2_15 = temp_r0_14->all.attr0 & 0xFF00; @@ -725,7 +655,7 @@ void Task_RingsMgrStage(void) { temp_r0_14->all.attr0 = temp_r2_15 + (u8) ((temp_r6_5 - gCamera.y) - (u16) spC->offsetY); temp_r0_14->all.attr1 = temp_r3_6 + (((temp_r7_4 - gCamera.x) - (u16) spC->offsetX) & 0x1FF); block_161: - sp18 = (s32) (u8) (sp18 + 1); + sp18 = (u8) (sp18 + 1); goto loop_162; } break; @@ -733,7 +663,7 @@ void Task_RingsMgrStage(void) { block_164: temp_r0_15 = var_r8_4 + 1; var_r8_4 = (u32) temp_r0_15; - if (((s32) (temp_r0_15 << 8) < (s32) (gCamera.x + 0xF0)) && (var_r8_4 < sp10)) { + if (((temp_r0_15 << 8) < (gCamera.x + 0xF0)) && (var_r8_4 < sp10)) { goto loop_148; } block_167: @@ -745,8 +675,8 @@ void Task_RingsMgrStage(void) { } return; } -} #endif +} void Task_RingsMgrExtraZone(void) { From 40def0f3e7a71e0cb5c397cb643ebe5da9529cb1 Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Sun, 5 Apr 2026 01:44:01 +0200 Subject: [PATCH 10/17] More Task_RingsMgrStage progress --- .../unfinished__rings_manager.c | 106 +++++------------- 1 file changed, 26 insertions(+), 80 deletions(-) diff --git a/src/game/sa1_sa2_shared/unfinished__rings_manager.c b/src/game/sa1_sa2_shared/unfinished__rings_manager.c index df3b1b937..6b00c3fdb 100644 --- a/src/game/sa1_sa2_shared/unfinished__rings_manager.c +++ b/src/game/sa1_sa2_shared/unfinished__rings_manager.c @@ -239,15 +239,15 @@ void Task_RingsMgrStage(void) s8 *temp_r1_8; s8 *temp_r2_2; s8 *temp_r2_6; - u32 var_r8; + u32 regionX; u32 var_r8_2; u32 var_r8_3; u32 var_r8_4; - u32 var_sl; + u32 regionY; u32 var_sl_2; u32 var_sl_3; u32 var_sl_4; - u8 *var_r5; + MapEntity_Ring *meRing; u8 *var_r5_2; u8 var_r1; u8 var_r1_2; @@ -289,94 +289,40 @@ void Task_RingsMgrStage(void) sp2C[1] = -p->spriteOffsetY; sp2C[2] = +p->spriteOffsetX; sp2C[3] = +p->spriteOffsetY; - var_sl = (u32)((I(p->qWorldY) + sp2C[1]) << 8) >> 0x10; - - if ((var_sl <= (((s8)sp2C[3] + I(p->qWorldY) + 8) >> 8)) && (var_sl < sp14)) { + for (regionY = (u32)((I(p->qWorldY) + sp2C[1]) << 8) >> 0x10; + ((regionY <= (((s8)sp2C[3] + I(p->qWorldY) + 8) >> 8)) && (regionY < sp14)); regionY++) { sp30 = &sp00[0]; -#if 0 - loop_112: var_r2 = p->qWorldX; - temp_r1_5 = var_r2 >> 8; - var_r8 = (u32) (((temp_r1_5 + sp30->unk0) - 8) << 8) >> 0x10; - var_r0 = (sp30->unk2 + temp_r1_5 + 0x10) >> 8; - var_r3 = p->qWorldY; - sp3C = var_sl + 1; - loop_135: - if ((var_r8 <= var_r0) && (var_r8 < rings->unk4)) { - temp_r0_3 = *((var_r8 * 4) + ((rings->unk4 * var_sl * 4) + rings)); - sp38 = var_r8 + 1; + for (regionX = (u32)(((I(p->qWorldX) + sp30[0]) - 8) << 8) >> 0x10; + ((regionX <= TO_REGION(sp30[2] + I(p->qWorldX) + 16)) && (regionX < *(rings + 1))); regionX++) { + s32 temp_r0_3 = *((regionX * 4) + ((*(rings + 1) * regionY * 4) + rings)); if (temp_r0_3 != 0) { - var_r5 = rings + (temp_r0_3 - 8); - var_r1 = *var_r5; - if (var_r1 != 0xFF) { - do { - if (var_r1 == 0xFE) { - var_r5 += 2; - } else { - temp_r7 = (var_r5[0] * 8) + (var_r8 << 8); - temp_r6_2 = (var_r5[1] * 8) + (var_sl << 8); - temp_r2_3 = temp_r7 - 8; - temp_r3 = sp00[0]; - temp_r1_6 = (p->qWorldX >> 8) + temp_r3; - if (temp_r2_3 <= temp_r1_6) { - if ((temp_r7 + 8) < temp_r1_6) { - if (temp_r2_3 >= temp_r1_6) { - goto block_121; - } + meRing = (MapEntity_Ring *)(rings + (temp_r0_3 - 8)); + while (meRing->x != (u8)MAP_ENTITY_STATE_ARRAY_END) { + if (meRing->x == (u8)MAP_ENTITY_STATE_INITIALIZED) { + meRing++; + } else { + s32 rx = TO_WORLD_POS(meRing->x, regionX); + s32 ry = TO_WORLD_POS(meRing->y, regionY); + + if (RECT_TOUCHING_RING(I(p->qWorldX), I(p->qWorldY), rx, ry, (Rect8 *)sp00)) { + if (sp28 != 0) { + if (gStageData.playerIndex == i) { + AddRings(1); + CreateCollectRingEffect(rx, ry); } else { - goto block_122; + CreateCollectRingEffectNoSfx(rx, ry); } } else { - block_121: - if ((temp_r1_6 + (sp00[2] - temp_r3)) >= temp_r2_3) { - block_122: - temp_r2_4 = temp_r6_2 - 0x10; - temp_r3_2 = sp00[1]; - temp_r1_7 = (p->qWorldY >> 8) + temp_r3_2; - if (temp_r2_4 <= temp_r1_7) { - if (temp_r6_2 < temp_r1_7) { - if (temp_r2_4 >= temp_r1_7) { - goto block_125; - } - } else { - goto block_126; - } - } else { - block_125: - if ((temp_r1_7 + (sp00[3] - temp_r3_2)) >= temp_r2_4) { - block_126: - if (sp28 != 0) { - if (gStageData.playerIndex == i) { - AddRings(1); - CreateCollectRingEffect(temp_r7, (s16) temp_r6_2); - } else { - CreateCollectRingEffectNoSfx((u16) temp_r7, (u16) (s16) temp_r6_2); - } - } else { - CreateCollectRingEffectNoSfx((u16) temp_r7, (u16) (s16) temp_r6_2); - } - var_r5[0] = 0xFE; - } - } - } + CreateCollectRingEffectNoSfx(rx, ry); } - var_r5 += 2; - var_r3 = p->qWorldY; - var_r2 = p->qWorldX; + meRing->x = (u8)MAP_ENTITY_STATE_INITIALIZED; } - var_r1 = *var_r5; - } while (var_r1 != 0xFF); + meRing++; + } } } - var_r8 = (u32) (u16) sp38; - var_r0 = (sp30->unk2 + (var_r2 >> 8) + 0x10) >> 8; - goto loop_135; } - var_sl = (u32) (u16) sp3C; - if ((var_sl <= ((sp30->unk3 + (var_r3 >> 8) + 8) >> 8)) && (var_sl < sp14)) { - goto loop_112; - } -#endif } } } From 15269cb1d12779367e24807d6a551b23837bf0fb Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Sun, 5 Apr 2026 23:51:47 +0200 Subject: [PATCH 11/17] Move Task_RingsMgrStage into non-matching --- ...ished__rings_manager.c => rings_manager.c} | 612 +++++++----------- 1 file changed, 236 insertions(+), 376 deletions(-) rename src/game/sa1_sa2_shared/{unfinished__rings_manager.c => rings_manager.c} (57%) diff --git a/src/game/sa1_sa2_shared/unfinished__rings_manager.c b/src/game/sa1_sa2_shared/rings_manager.c similarity index 57% rename from src/game/sa1_sa2_shared/unfinished__rings_manager.c rename to src/game/sa1_sa2_shared/rings_manager.c index 6b00c3fdb..938d4f424 100644 --- a/src/game/sa1_sa2_shared/unfinished__rings_manager.c +++ b/src/game/sa1_sa2_shared/rings_manager.c @@ -13,12 +13,11 @@ #include "constants/animations.h" #include "constants/move_states.h" -void AddRings(s32 count); void TaskDestructor_RingsMgr(Task *); void Task_RingsMgrExtraZone(); void Task_RingsMgrStage(); void sub_802AB10(s16 arg0, s16 arg1, Player *p); -void sub_802AB8C(); +void Task_802AB8C(); void Task_802ACF0(); extern u32 *gUnknown_080CEF58[]; extern struct MP2KSongHeader song117; @@ -60,6 +59,7 @@ typedef struct RingsMgrUnk30 { TO_REGION(b + a + offset); \ }) +#if 0 void CreateStageRingsManager(void) { Task *t; @@ -130,8 +130,19 @@ void PlayRingCollectSE(void) } } -void CreateCollectRingEffect(s16 worldX, s16 worldY) +void CreateCollectRingEffect(s32 inWorldX, s32 inWorldY) { + // NOTE: Needs to be like this for matching, because: + // In enemy/bu_bu.c, CreateCollectRingEffect() gets called, + // without casting down to s16 on the call-site. + // + // But EVERYTHING points at CreateCollectRingEffect taking two s16 values, + // so something must have gone wrong at the linking stage originally. + // To remedy this, we cast input values of CreateCollectRingEffect() down everywhere in this module. + // TODO: ^^^ Find a better solution for this, if possible! ^^^ + s16 worldX = inWorldX; + s16 worldY = inWorldY; + RingsMgrUnk2C *strc; Sprite *s; s32 var_r0; @@ -200,67 +211,26 @@ void CreateCollectRingEffectNoSfx(s16 worldX, s16 worldY) } } -void Task_RingsMgrStage(void) +// (99.24%) https://decomp.me/scratch/CaEBA +NONMATCH("asm/non_matching/game/shared/rm__Task_RingsMgrStage.inc", void Task_RingsMgrStage(void)) { - s8 sp00[4]; + s8 rect[4]; Sprite *s; u32 *rings; - SpriteOffset *spC; const SpriteOffset *dimensions; - u32 sp10; - u32 sp14; - s32 sp18; - u8 i; - u8 *sp20; - u8 *sp24; - s32 sp28; - s8 *sp2C; - s8 *sp30; - s32 sp34; - s32 sp38; - s32 sp3C; - s32 sp40; - u8 *sp44; - OamData *sp48; - OamData *temp_r0_14; - OamData *temp_r0_7; - OamData *temp_r2_12; - OamData *temp_r2_14; - Player *p; - Player *var_sb; + s32 rx, ry; RingsManager *mgr; - s32 var_r0; - s32 var_r0_2; - s32 var_r1_4; - s32 var_r2; - s32 var_r2_2; - s32 var_r3; - s32 var_r3_2; - s8 *temp_r1_8; - s8 *temp_r2_2; - s8 *temp_r2_6; - u32 regionX; - u32 var_r8_2; - u32 var_r8_3; - u32 var_r8_4; - u32 regionY; - u32 var_sl_2; - u32 var_sl_3; - u32 var_sl_4; + u16 h_regionCount, v_regionCount; + u8 drawCount; // sp18 + Player *p; MapEntity_Ring *meRing; - u8 *var_r5_2; - u8 var_r1; - u8 var_r1_2; - u8 var_r1_3; - void *temp_r6; - void *var_r5_3; - void *var_r5_4; - - // var_sb = saved_reg_r9; + u8 i; + u16 regionX, regionY; + mgr = TASK_DATA(gCurTask); s = &mgr->s; rings = mgr->ringPositions; - sp18 = 0; + drawCount = 0; UpdateSpriteAnimation(s); if ((s->frameNum >> 28) == 0) { // Default behavior from SA1 / SA2 @@ -269,56 +239,125 @@ void Task_RingsMgrStage(void) // TODO: WTF!?!? dimensions = (const SpriteOffset *)&((const SpriteOffset2 *)gRefSpriteTables->dimensions[s->anim])[s->frameNum]; } - temp_r6 = rings + 4; - // sp10 = (u32) (u16) rings->unk4; - // rings = temp_r6 + 4 + 4; - // sp14 = (u32) (u16) temp_r6->unk4; - if (!(GAME_MODE_IS_SINGLE_PLAYER(gStageData.gameMode) || (gStageData.gameMode == GAME_MODE_5))) { + rings++; + + h_regionCount = (u16)*rings++; + v_regionCount = (u16)*rings++; + + if ((GAME_MODE_IS_SINGLE_PLAYER(gStageData.gameMode) || (gStageData.gameMode == GAME_MODE_5))) { for (i = 0; i < NUM_SINGLE_PLAYER_CHARS; i++) { - sp2C = &sp00[0]; - sp28 = 0; - p = &gPlayers[i]; - if ((p->charFlags.someIndex != 1) && (p->charFlags.someIndex != 2) && (p->charFlags.someIndex != 4)) { - Player *activePlayer = GET_SP_PLAYER_V0(PLAYER_1); - if ((p == activePlayer) || (p == GET_SP_PLAYER_V0(PLAYER_2))) { - sp28 = 1; - } + p = GET_SP_PLAYER_V0(i); + + if (!(p->moveState & MOVESTATE_100) && (p->charFlags.anim0 != 0x66) && (p->unk48 == 0)) { + if ((p->charFlags.someIndex != 2) || !(gPlayers[p->charFlags.partnerIndex].moveState & MOVESTATE_100)) { + rect[0] = -p->spriteOffsetX; + rect[1] = -p->spriteOffsetY; + rect[2] = +p->spriteOffsetX; + rect[3] = +p->spriteOffsetY; + // Handle collisions + for (regionY = REGION_LOWER(I(p->qWorldY), rect[1], 0); + // TODO: Check, why both uses of REGION_UPPER() only match like this in SA3! + // (Should in theory be roughly in-line with SA1/SA2...) + regionY <= REGION_UPPER(I(p->qWorldY), rect[3], +(1 * TILE_WIDTH)) && regionY < v_regionCount; regionY++) { + + for (regionX = REGION_LOWER(I(p->qWorldX), rect[0], -TILE_WIDTH); + regionX <= REGION_UPPER(I(p->qWorldX), rect[2], (2 * TILE_WIDTH)) && regionX < h_regionCount; regionX++) { + + u32 offset = READ_START_INDEX(rings, h_regionCount, regionX, regionY); + if (offset) { + meRing = DATA_START(rings) + offset; - if (!(p->moveState & 0x100) && (p->charFlags.anim0 != 0x66) && (p->unk48 == 0)) { - sp2C[0] = -p->spriteOffsetX; - sp2C[1] = -p->spriteOffsetY; - sp2C[2] = +p->spriteOffsetX; - sp2C[3] = +p->spriteOffsetY; - for (regionY = (u32)((I(p->qWorldY) + sp2C[1]) << 8) >> 0x10; - ((regionY <= (((s8)sp2C[3] + I(p->qWorldY) + 8) >> 8)) && (regionY < sp14)); regionY++) { - sp30 = &sp00[0]; - var_r2 = p->qWorldX; - for (regionX = (u32)(((I(p->qWorldX) + sp30[0]) - 8) << 8) >> 0x10; - ((regionX <= TO_REGION(sp30[2] + I(p->qWorldX) + 16)) && (regionX < *(rings + 1))); regionX++) { - s32 temp_r0_3 = *((regionX * 4) + ((*(rings + 1) * regionY * 4) + rings)); - if (temp_r0_3 != 0) { - meRing = (MapEntity_Ring *)(rings + (temp_r0_3 - 8)); while (meRing->x != (u8)MAP_ENTITY_STATE_ARRAY_END) { if (meRing->x == (u8)MAP_ENTITY_STATE_INITIALIZED) { meRing++; - } else { - s32 rx = TO_WORLD_POS(meRing->x, regionX); - s32 ry = TO_WORLD_POS(meRing->y, regionY); - - if (RECT_TOUCHING_RING(I(p->qWorldX), I(p->qWorldY), rx, ry, (Rect8 *)sp00)) { - if (sp28 != 0) { - if (gStageData.playerIndex == i) { - AddRings(1); - CreateCollectRingEffect(rx, ry); - } else { - CreateCollectRingEffectNoSfx(rx, ry); - } + continue; + } + + rx = TO_WORLD_POS(meRing->x, regionX); + ry = TO_WORLD_POS(meRing->y, regionY); + + if (RECT_TOUCHING_RING(I(p->qWorldX), I(p->qWorldY), rx, ry, (Rect8 *)rect)) { + if ((i == 0) || (p->charFlags.someIndex == 2)) { + AddRings(1); + } + CreateCollectRingEffect(rx, ry); + + meRing->x = (u8)MAP_ENTITY_STATE_INITIALIZED; + } + + meRing++; + } + } + } + } + + // if(p->unk13C & 0x20) + regionY = TO_REGION(gCamera.y); + if (p->unk13C & 0x20) { + for (; TO_WORLD_POS(0, regionY) < gCamera.y + DISPLAY_HEIGHT && regionY < v_regionCount; regionY++) { +#if (!defined(NON_MATCHING) && (GAME <= GAME_SA2)) + while (0) + ; +#endif + for (regionX = TO_REGION(gCamera.x); TO_WORLD_POS(0, regionX) < gCamera.x + DISPLAY_WIDTH; regionX++) { + u32 offset = READ_START_INDEX(rings, h_regionCount, regionX, regionY); + + if(regionX >= h_regionCount) + { + break; + } + + if (offset != 0) { + meRing = DATA_START(rings) + offset; + while (meRing->x != (u8)MAP_ENTITY_STATE_ARRAY_END) { + if (meRing->x == (u8)MAP_ENTITY_STATE_INITIALIZED) { + meRing++; + continue; + } + + rx = TO_WORLD_POS(meRing->x, regionX); + ry = TO_WORLD_POS(meRing->y, regionY); + + if (rx - gCamera.x < -TILE_WIDTH + || (rx - gCamera.x) + TILE_WIDTH > DISPLAY_WIDTH + 2 * TILE_WIDTH || ry - gCamera.y < 0 + || (ry - gCamera.y) - 2 * TILE_WIDTH > DISPLAY_HEIGHT) { + meRing++; + } else if ((((rx - 64) <= I(p->qWorldX)) && (rx + 64) >= I(p->qWorldX)) + && (((ry - 72) <= I(p->qWorldY)) && ((ry + 56) >= I(p->qWorldY)))) { + sub_802AB10(rx, ry, p); + meRing->x = (u8)MAP_ENTITY_STATE_INITIALIZED; + meRing++; + } else { + meRing++; + + if ((drawCount == 0) || s->oamBaseIndex == 0xFF) { + s->oamBaseIndex = 0xFF; + s->x = rx - gCamera.x; + s->y = ry - gCamera.y; + DisplaySprite(s); } else { - CreateCollectRingEffectNoSfx(rx, ry); + OamData *oamDat = &gOamMallocBuffer[s->oamBaseIndex]; + OamData *oamAllocated = OamMalloc(GET_SPRITE_OAM_ORDER(s)); + + if (iwram_end == oamAllocated) + return; + + DmaCopy16(3, oamDat, oamAllocated, sizeof(OamDataShort)); + +#if !EXTENDED_OAM + // TODO: Can these be done more explicitly? + oamAllocated->all.attr1 &= 0xFE00; + oamAllocated->all.attr0 &= 0xFF00; + oamAllocated->all.attr0 += ((ry - gCamera.y) - dimensions->offsetY) & 0xFF; + oamAllocated->all.attr1 += ((rx - gCamera.x) - dimensions->offsetX) & 0x1FF; +#else + oamAllocated->split.x = ((rx - gCamera.x) - dimensions->offsetX); + oamAllocated->split.y = ((ry - gCamera.y) - dimensions->offsetY); +#endif } - meRing->x = (u8)MAP_ENTITY_STATE_INITIALIZED; + + drawCount++; } - meRing++; } } } @@ -326,303 +365,124 @@ void Task_RingsMgrStage(void) } } } + } - // goto block_143; - } -#if 0 - i = 0; - sp20 = &sp00; -loop_6: - if (i == 0) { - var_r1_2 = gStageData.playerIndex; } else { - var_r1_2 = (u8) ((u32) (var_sb->unk2B << 0x1E) >> 0x1E); - } - var_sb = &gPlayers[var_r1_2]; - if (var_sb->moveState & 0x100) { - goto block_90; - } - if (var_sb->charFlags.anim0 == 0x66) { - goto block_90; - } - if (var_sb->unk48 != 0) { - goto block_90; - } - temp_r2_5 = var_sb->unk2B; - sp44 = var_sb + 0x2B; - if (((0x1C & temp_r2_5) == 8) && (*((((u32) (temp_r2_5 << 0x1E) >> 0x1E) * 0x150) + &gPlayers->moveState) & 0x100)) { - goto block_90; - } - temp_r1_8 = &var_sb->spriteOffsetX; - sp20->unk0 = (s8) (0 - (u8) *temp_r1_8); - temp_r2_6 = &var_sb->spriteOffsetY; - sp20->unk1 = (s8) (0 - (u8) *temp_r2_6); - sp20->unk2 = (u8) *temp_r1_8; - sp20->unk3 = (u8) *temp_r2_6; - temp_r1_9 = var_sb->qWorldY >> 8; - var_sl_2 = (u32) ((temp_r1_9 + sp20->unk1) << 8) >> 0x10; - if (var_sl_2 > (((s8) sp20->unk3 + temp_r1_9 + 8) >> 8)) { - - } else if (var_sl_2 >= sp14) { + for (i = 0; i < 4; i++) { + u8 sp28 = 0; + p = &gPlayers[i]; + if (p->charFlags.someIndex != 5 && p->charFlags.someIndex != 2) { + if (p == GET_SP_PLAYER_V0(PLAYER_1) || p == GET_SP_PLAYER_V0(PLAYER_2)) { + sp28 = 1; + } + if (!(p->moveState & 0x100) && (p->charFlags.anim0 != 0x66) && (p->unk48 == 0)) { + rect[0] = -p->spriteOffsetX; + rect[1] = -p->spriteOffsetY; + rect[2] = +p->spriteOffsetX; + rect[3] = +p->spriteOffsetY; - } else { - sp24 = &sp00; -loop_23: - var_r2_2 = var_sb->qWorldX; - temp_r1_10 = var_r2_2 >> 8; - var_r8_2 = (u32) (((temp_r1_10 + sp24->unk0) - 8) << 8) >> 0x10; - var_r3_2 = var_sb->qWorldY; - sp3C = var_sl_2 + 1; - if (var_r8_2 > ((sp24->unk2 + temp_r1_10 + 0x10) >> 8)) { + // Handle collisions + for (regionY = REGION_LOWER(I(p->qWorldY), rect[1], 0); + regionY <= REGION_UPPER(I(p->qWorldY), rect[3], +(1 * TILE_WIDTH)) && regionY < v_regionCount; regionY++) { + for (regionX = REGION_LOWER(I(p->qWorldX), rect[0], -TILE_WIDTH); + regionX <= REGION_UPPER(I(p->qWorldX), rect[2], (2 * TILE_WIDTH)) && regionX < h_regionCount; regionX++) { - } else if (var_r8_2 >= rings->unk4) { + u32 offset = READ_START_INDEX(rings, h_regionCount, regionX, regionY); + if (offset) { + meRing = DATA_START(rings) + offset; - } else { -loop_27: - temp_r0_5 = *((var_r8_2 * 4) + ((rings->unk4 * var_sl_2 * 4) + rings)); - sp38 = var_r8_2 + 1; - if (temp_r0_5 != 0) { - var_r5_2 = rings + (temp_r0_5 - 8); - var_r1_3 = *var_r5_2; - if (var_r1_3 != 0xFF) { - do { - if (var_r1_3 == 0xFE) { - var_r5_2 += 2; - } else { - temp_r7_2 = (var_r5_2[0] * 8) + (var_r8_2 << 8); - temp_r6_3 = (var_r5_2[1] * 8) + (var_sl_2 << 8); - temp_r2_7 = temp_r7_2 - 8; - temp_r3_3 = sp00[0]; - temp_r1_11 = (var_sb->qWorldX >> 8) + temp_r3_3; - if (temp_r2_7 <= temp_r1_11) { - if ((temp_r7_2 + 8) < temp_r1_11) { - if (temp_r2_7 >= temp_r1_11) { - goto block_35; + while (meRing->x != (u8)MAP_ENTITY_STATE_ARRAY_END) { + if (meRing->x == (u8)MAP_ENTITY_STATE_INITIALIZED) { + meRing++; + continue; } - } else { - goto block_36; - } - } else { -block_35: - if ((temp_r1_11 + (sp00[2] - temp_r3_3)) >= temp_r2_7) { -block_36: - temp_r2_8 = temp_r6_3 - 0x10; - temp_r3_4 = sp00[1]; - temp_r1_12 = (var_sb->qWorldY >> 8) + temp_r3_4; - if (temp_r2_8 <= temp_r1_12) { - if (temp_r6_3 < temp_r1_12) { - if (temp_r2_8 >= temp_r1_12) { - goto block_39; - } - } else { - goto block_40; - } - } else { -block_39: - if ((temp_r1_12 + (sp00[3] - temp_r3_4)) >= temp_r2_8) { -block_40: - if ((i == 0) || ((0x1C & *sp44) == 8)) { + + rx = TO_WORLD_POS(meRing->x, regionX); + ry = TO_WORLD_POS(meRing->y, regionY); + + if (RECT_TOUCHING_RING(I(p->qWorldX), I(p->qWorldY), rx, ry, (Rect8 *)rect)) { + if (sp28 != 0) { + if (gStageData.playerIndex == i) { AddRings(1); + CreateCollectRingEffect(rx, ry); + } else { + CreateCollectRingEffectNoSfx(rx, ry); } - CreateCollectRingEffect(temp_r7_2, (s16) temp_r6_3); - var_r5_2[0] = 0xFE; + } else { + CreateCollectRingEffectNoSfx(rx, ry); } + meRing->x = (u8)MAP_ENTITY_STATE_INITIALIZED; } + + meRing++; } } - var_r5_2 += 2; - var_r3_2 = var_sb->qWorldY; - var_r2_2 = var_sb->qWorldX; } - var_r1_3 = *var_r5_2; - } while (var_r1_3 != 0xFF); + } } } - var_r8_2 = (u32) (u16) sp38; - if ((var_r8_2 <= ((sp24->unk2 + (var_r2_2 >> 8) + 0x10) >> 8)) && (var_r8_2 < rings->unk4)) { - goto loop_27; - } - } - var_sl_2 = (u32) (u16) sp3C; - if ((var_sl_2 <= ((sp24->unk3 + (var_r3_2 >> 8) + 8) >> 8)) && (var_sl_2 < sp14)) { - goto loop_23; } } - var_sl_3 = (u32) (gCamera.y << 8) >> 0x10; - if (!(0x20 & var_sb->unk13C)) { - goto block_90; - } - if ((var_sl_3 << 8) >= (gCamera.y + 0xA0)) { - goto block_90; - } - if (var_sl_3 >= sp14) { - goto block_90; - } -loop_58: - temp_r1_13 = (u32) (gCamera.x << 8) >> 0x10; - var_r8_3 = temp_r1_13; - if ((temp_r1_13 << 8) >= (gCamera.x + 0xF0)) { - goto block_87; - } - temp_r2_9 = sp10 * var_sl_3; - var_r0_2 = *((var_r8_3 * 4) + ((temp_r2_9 * 4) + rings)); - sp34 = temp_r2_9; - if (var_r8_3 >= sp10) { - goto block_87; - } -loop_62: - if (var_r0_2 == 0) { - goto block_84; - } - var_r5_3 = rings + (var_r0_2 - 8); -loop_82: - temp_r1_14 = var_r5_3->unk0; - switch (temp_r1_14) { /* irregular */ - default: - temp_r7_3 = (var_r5_3->unk0 * 8) + (var_r8_3 << 8); - temp_r6_4 = (var_r5_3->unk1 * 8) + (var_sl_3 << 8); - if ((u32) ((temp_r7_3 - gCamera.x) + 8) <= 0x100U) { - temp_r0_6 = temp_r6_4 - gCamera.y; - if ((temp_r0_6 >= 0) && ((temp_r0_6 - 0x10) <= 0xA0)) { - temp_r2_10 = var_sb->qWorldX >> 8; - if (((temp_r7_3 - 0x40) <= temp_r2_10) && ((temp_r7_3 + 0x40) >= temp_r2_10)) { - temp_r2_11 = var_sb->qWorldY >> 8; - if (((temp_r6_4 - 0x48) <= temp_r2_11) && ((temp_r6_4 + 0x38) >= temp_r2_11)) { - sub_802AB10(temp_r7_3, temp_r6_4, var_sb); - var_r5_3->unk0 = 0xFEU; - goto block_74; + + for (regionY = TO_REGION(gCamera.y); TO_WORLD_POS(0, regionY) < gCamera.y + DISPLAY_HEIGHT && regionY < v_regionCount; regionY++) { +#if (!defined(NON_MATCHING) && (GAME <= GAME_SA2)) + while (0) + ; +#endif + for (regionX = TO_REGION(gCamera.x); TO_WORLD_POS(0, regionX) < gCamera.x + DISPLAY_WIDTH && regionX < h_regionCount; regionX++) { + u32 offset = READ_START_INDEX(rings, h_regionCount, regionX, regionY); + + if (offset != 0) { + meRing = DATA_START(rings) + offset; + while (meRing->x != (u8)MAP_ENTITY_STATE_ARRAY_END) { + if (meRing->x == (u8)MAP_ENTITY_STATE_INITIALIZED) { + meRing++; + continue; + } + + rx = TO_WORLD_POS(meRing->x, regionX); + ry = TO_WORLD_POS(meRing->y, regionY); + + if (rx - gCamera.x < -TILE_WIDTH || (rx - gCamera.x) + TILE_WIDTH > DISPLAY_WIDTH + 2 * TILE_WIDTH || ry - gCamera.y < 0 + || (ry - gCamera.y) - 2 * TILE_WIDTH > DISPLAY_HEIGHT) { + meRing++; + } else { + meRing++; + + if ((drawCount == 0) || s->oamBaseIndex == 0xFF) { + s->oamBaseIndex = 0xFF; + s->x = rx - gCamera.x; + s->y = ry - gCamera.y; + DisplaySprite(s); + } else { + OamData *oamDat = &gOamMallocBuffer[s->oamBaseIndex]; + OamData *oamAllocated = OamMalloc(GET_SPRITE_OAM_ORDER(s)); + + if (iwram_end == oamAllocated) + return; + + DmaCopy16(3, oamDat, oamAllocated, sizeof(OamDataShort)); + +#if !EXTENDED_OAM + // TODO: Can these be done more explicitly? + oamAllocated->all.attr1 &= 0xFE00; + oamAllocated->all.attr0 &= 0xFF00; + oamAllocated->all.attr0 += ((ry - gCamera.y) - dimensions->offsetY) & 0xFF; + oamAllocated->all.attr1 += ((rx - gCamera.x) - dimensions->offsetX) & 0x1FF; +#else + oamAllocated->split.x = ((rx - gCamera.x) - dimensions->offsetX); + oamAllocated->split.y = ((ry - gCamera.y) - dimensions->offsetY); +#endif + } + + drawCount++; } } - var_r5_3 += 2; - if ((sp18 == 0) || (s->oamBaseIndex == 0xFF)) { - s->oamBaseIndex = 0xFF; - s->x = temp_r7_3 - gCamera.x; - s->y = temp_r6_4 - gCamera.y; - DisplaySprite(s); - goto block_81; - } - temp_r2_12 = &gOamMallocBuffer[s->oamBaseIndex]; - sp48 = temp_r2_12; - temp_r0_7 = OamMalloc((u8) ((u32) ((u16) s->oamFlags & 0x7C0) >> 6)); - if (iwram_end == temp_r0_7) { - return; - } - (void *)0x040000D4->unk0 = temp_r2_12; - (void *)0x040000D4->unk4 = temp_r0_7; - (void *)0x040000D4->unk8 = 0x80000003; - temp_r3_5 = temp_r0_7->all.attr1 & 0xFE00; - temp_r0_7->all.attr1 = temp_r3_5; - temp_r2_13 = temp_r0_7->all.attr0 & 0xFF00; - temp_r0_7->all.attr0 = temp_r2_13; - temp_r0_7->all.attr0 = temp_r2_13 + (u8) ((temp_r6_4 - gCamera.y) - (u16) spC->offsetY); - temp_r0_7->all.attr1 = temp_r3_5 + (((temp_r7_3 - gCamera.x) - (u16) spC->offsetX) & 0x1FF); -block_81: - sp18 = (u8) (sp18 + 1); - goto loop_82; - } - } - case 0xFE: -block_74: - var_r5_3 += 2; - goto loop_82; - case 0xFF: -block_84: - temp_r0_8 = var_r8_3 + 1; - var_r8_3 = (u32) temp_r0_8; - if ((temp_r0_8 << 8) < (gCamera.x + 0xF0)) { - var_r0_2 = *((var_r8_3 * 4) + ((sp34 * 4) + rings)); - if (var_r8_3 < sp10) { - goto loop_62; - } - } -block_87: - temp_r0_9 = var_sl_3 + 1; - var_sl_3 = (u32) temp_r0_9; - if (((temp_r0_9 << 8) < (gCamera.y + 0xA0)) && (var_sl_3 < sp14)) { - goto loop_58; - } -block_90: - temp_r0_10 = i + 1; - i = temp_r0_10; - if ((u32) temp_r0_10 <= 1U) { - goto loop_6; - } -block_143: - temp_r0_11 = gCamera.y; - temp_r1_15 = (u32) (temp_r0_11 << 8) >> 0x10; - var_sl_4 = temp_r1_15; - var_r1_4 = temp_r1_15 << 8; -loop_168: - if ((var_r1_4 < (temp_r0_11 + 0xA0)) && (var_sl_4 < sp14)) { - temp_r1_16 = (u32) (gCamera.x << 8) >> 0x10; - var_r8_4 = temp_r1_16; - if ((temp_r1_16 << 8) >= (gCamera.x + 0xF0)) { - goto block_167; - } - if (var_r8_4 >= sp10) { - goto block_167; - } -loop_148: - temp_r0_12 = *((var_r8_4 * 4) + ((sp10 * var_sl_4 * 4) + rings)); - if (temp_r0_12 == 0) { - goto block_164; - } - var_r5_4 = rings + (temp_r0_12 - 8); -loop_162: - temp_r1_17 = var_r5_4->unk0; - switch (temp_r1_17) { /* switch 1; irregular */ - default: /* switch 1 */ - temp_r7_4 = (var_r5_4->unk0 * 8) + (var_r8_4 << 8); - temp_r6_5 = (var_r5_4->unk1 * 8) + (var_sl_4 << 8); - if (((u32) ((temp_r7_4 - gCamera.x) + 8) > 0x100U) || (temp_r0_13 = temp_r6_5 - gCamera.y, (temp_r0_13 < 0)) || ((temp_r0_13 - 0x10) > 0xA0)) { - case 0xFE: /* switch 1 */ - var_r5_4 += 2; - goto loop_162; - } - var_r5_4 += 2; - if ((sp18 == 0) || (s->oamBaseIndex == 0xFF)) { - s->oamBaseIndex = 0xFF; - s->x = temp_r7_4 - gCamera.x; - s->y = temp_r6_5 - gCamera.y; - DisplaySprite(s); - goto block_161; - } - temp_r2_14 = &gOamMallocBuffer[s->oamBaseIndex]; - sp48 = temp_r2_14; - temp_r0_14 = OamMalloc((u8) ((u32) ((u16) s->oamFlags & 0x7C0) >> 6)); - if (iwram_end != temp_r0_14) { -// (void *)0x040000D4->unk0 = temp_r2_14; -// (void *)0x040000D4->unk4 = temp_r0_14; -// (void *)0x040000D4->unk8 = 0x80000003; - temp_r3_6 = temp_r0_14->all.attr1 & 0xFE00; - temp_r0_14->all.attr1 = temp_r3_6; - temp_r2_15 = temp_r0_14->all.attr0 & 0xFF00; - temp_r0_14->all.attr0 = temp_r2_15; - temp_r0_14->all.attr0 = temp_r2_15 + (u8) ((temp_r6_5 - gCamera.y) - (u16) spC->offsetY); - temp_r0_14->all.attr1 = temp_r3_6 + (((temp_r7_4 - gCamera.x) - (u16) spC->offsetX) & 0x1FF); -block_161: - sp18 = (u8) (sp18 + 1); - goto loop_162; - } - break; - case 0xFF: /* switch 1 */ -block_164: - temp_r0_15 = var_r8_4 + 1; - var_r8_4 = (u32) temp_r0_15; - if (((temp_r0_15 << 8) < (gCamera.x + 0xF0)) && (var_r8_4 < sp10)) { - goto loop_148; - } -block_167: - temp_r0_16 = var_sl_4 + 1; - var_sl_4 = (u32) temp_r0_16; - var_r1_4 = temp_r0_16 << 8; - goto loop_168; } } - return; } -#endif } +END_NONMATCH void Task_RingsMgrExtraZone(void) { @@ -637,8 +497,7 @@ void Task_RingsMgrExtraZone(void) OamData *oamAllocated; OamData *oamDat; Player *p; - s32 rx; - s32 ry; + s32 rx, ry; struct Camera *cam; MapEntity_Ring *meRing; u8 pid; @@ -820,7 +679,7 @@ void sub_802AB10(s16 worldX, s16 worldY, Player *p) RingsMgrUnk30 *strc30; Sprite *s; - strc30 = TASK_DATA(TaskCreate(sub_802AB8C, sizeof(RingsMgrUnk30), 0x2000U, 0U, NULL)); + strc30 = TASK_DATA(TaskCreate(Task_802AB8C, sizeof(RingsMgrUnk30), 0x2000U, 0U, NULL)); s = &strc30->s; strc30->p = p; strc30->magnitude = 0; @@ -838,7 +697,7 @@ void sub_802AB10(s16 worldX, s16 worldY, Player *p) s->frameFlags = 0x41200; } -void sub_802AB8C(void) +void Task_802AB8C(void) { RingsMgrUnk30 *strc30; s16 temp_r0_2; @@ -914,4 +773,5 @@ void TaskDestructor_RingsMgr(Task *t) { RingsManager *mgr = TASK_DATA(t); EwramFree(mgr->ringPositions); -} \ No newline at end of file +} +#endif From f73d31646153a163f8476c041f3f6731585f5b2b Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Mon, 6 Apr 2026 00:00:28 +0200 Subject: [PATCH 12/17] Finish rings_manager.c --- asm/code_0_2.s | 4 +- asm/game__sa1_sa2_shared__rings_manager.s | 2448 ----------------- .../game/shared/rm__Task_RingsMgrStage.inc | 1201 ++++++++ include/game/sa1_sa2_shared/rings_manager.h | 4 + include/module_unclear.h | 1 - ldscript.txt | 2 +- src/game/enemies/bu_bu.c | 2 + src/game/sa1_sa2_shared/rings_manager.c | 29 +- 8 files changed, 1222 insertions(+), 2469 deletions(-) create mode 100644 asm/non_matching/game/shared/rm__Task_RingsMgrStage.inc diff --git a/asm/code_0_2.s b/asm/code_0_2.s index 8b3d12893..a6dcb69a7 100644 --- a/asm/code_0_2.s +++ b/asm/code_0_2.s @@ -11034,7 +11034,7 @@ _080269E0: lsrs r0, r0, #0x16 cmp r1, r0 bhs _08026A06 - bl sub_8029BB0 + bl PlayRingCollectSE _08026A06: ldrh r0, [r7, #0xe] lsls r0, r0, #0x16 @@ -11080,7 +11080,7 @@ _08026A32: cmp r0, #0 bne _08026AA0 adds r6, r1, #0 - bl sub_8029BB0 + bl PlayRingCollectSE ldrh r0, [r7, #0xe] lsls r0, r0, #0x16 lsrs r0, r0, #0x16 diff --git a/asm/game__sa1_sa2_shared__rings_manager.s b/asm/game__sa1_sa2_shared__rings_manager.s index f78d2ff20..e69de29bb 100644 --- a/asm/game__sa1_sa2_shared__rings_manager.s +++ b/asm/game__sa1_sa2_shared__rings_manager.s @@ -1,2448 +0,0 @@ -.include "asm/macros.inc" -.include "constants/constants.inc" - -.text -.syntax unified -.arm - -@ --- src/game/sa1_sa2_shared/rings_manager.c --- - - thumb_func_start CreateStageRingsManager -CreateStageRingsManager: @ 0x08029AE0 - push {r4, r5, r6, lr} - sub sp, #4 - ldr r0, _08029AFC @ =gStageData - ldrh r1, [r0, #0xe] - ldrb r0, [r0, #3] - cmp r0, #7 - beq _08029B32 - lsls r0, r1, #0x10 - asrs r1, r0, #0x10 - adds r4, r0, #0 - cmp r1, #0x48 - beq _08029B04 - ldr r0, _08029B00 @ =Task_RingsMgrStage - b _08029B06 - .align 2, 0 -_08029AFC: .4byte gStageData -_08029B00: .4byte Task_RingsMgrStage -_08029B04: - ldr r0, _08029B4C @ =Task_RingsMgrExtraZone -_08029B06: - movs r2, #0xa0 - lsls r2, r2, #6 - ldr r1, _08029B50 @ =TaskDestructor_RingsMgr - str r1, [sp] - movs r1, #0x2c - movs r3, #0 - bl TaskCreate - adds r6, r0, #0 - ldr r0, _08029B54 @ =gUnknown_080CEF58 - asrs r4, r4, #0xe - adds r4, r4, r0 - ldr r0, [r4] - ldr r0, [r0] - lsrs r0, r0, #8 - bl EwramMalloc - adds r5, r0, #0 - ldr r0, [r4] - adds r1, r5, #0 - bl RLUnCompWram -_08029B32: - ldrh r0, [r6, #6] - movs r1, #0xc0 - lsls r1, r1, #0x12 - adds r0, r0, r1 - str r5, [r0, #0x28] - adds r3, r0, #0 - ldr r0, _08029B58 @ =gStageData - ldrb r0, [r0, #3] - cmp r0, #5 - bhi _08029B60 - ldr r0, _08029B5C @ =0x06014180 - b _08029B66 - .align 2, 0 -_08029B4C: .4byte Task_RingsMgrExtraZone -_08029B50: .4byte TaskDestructor_RingsMgr -_08029B54: .4byte gUnknown_080CEF58 -_08029B58: .4byte gStageData -_08029B5C: .4byte 0x06014180 -_08029B60: - cmp r0, #6 - bne _08029B68 - ldr r0, _08029BA0 @ =0x060141A0 -_08029B66: - str r0, [r3] -_08029B68: - ldr r0, _08029BA4 @ =0x00041200 - str r0, [r3, #8] - movs r2, #0 - movs r1, #0 - ldr r0, _08029BA8 @ =0x00000535 - strh r0, [r3, #0xc] - movs r0, #0x78 - strh r0, [r3, #0x10] - movs r0, #0x50 - strh r0, [r3, #0x12] - movs r0, #0xa0 - lsls r0, r0, #2 - strh r0, [r3, #0x14] - strh r1, [r3, #0x16] - ldr r0, _08029BAC @ =0x0000FFFF - strh r0, [r3, #0x18] - strb r2, [r3, #0x1a] - movs r0, #0xff - strb r0, [r3, #0x1b] - movs r0, #0x10 - strb r0, [r3, #0x1c] - strb r2, [r3, #0x1f] - subs r0, #0x11 - str r0, [r3, #0x20] - add sp, #4 - pop {r4, r5, r6} - pop {r0} - bx r0 - .align 2, 0 -_08029BA0: .4byte 0x060141A0 -_08029BA4: .4byte 0x00041200 -_08029BA8: .4byte 0x00000535 -_08029BAC: .4byte 0x0000FFFF - - thumb_func_start sub_8029BB0 -sub_8029BB0: @ 0x08029BB0 - push {r4, r5, lr} - ldr r0, _08029C0C @ =gStageData - ldrb r1, [r0, #3] - adds r2, r0, #0 - cmp r1, #2 - beq _08029C42 - ldrb r0, [r2, #4] - cmp r0, #9 - beq _08029BCE - cmp r0, #4 - beq _08029BCE - cmp r0, #5 - beq _08029BCE - cmp r0, #6 - bne _08029BD4 -_08029BCE: - ldrb r0, [r2, #9] - cmp r0, #7 - beq _08029C42 -_08029BD4: - adds r0, r2, #0 - adds r0, #0xac - ldrh r1, [r0] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - beq _08029C1C - ldr r4, _08029C10 @ =gMPlayInfo_SE2 - ldr r1, _08029C14 @ =song117 (SE_RING_OLD_2) - adds r0, r4, #0 - bl MPlayStart - adds r0, r4, #0 - bl m4aMPlayImmInit - ldr r5, _08029C18 @ =0x0000FFFF - adds r0, r4, #0 - adds r1, r5, #0 - movs r2, #0x80 - bl m4aMPlayVolumeControl - movs r2, #0x40 - rsbs r2, r2, #0 - adds r0, r4, #0 - adds r1, r5, #0 - bl m4aMPlayPanpotControl - b _08029C42 - .align 2, 0 -_08029C0C: .4byte gStageData -_08029C10: .4byte gMPlayInfo_SE2 -_08029C14: .4byte song117 @ SE_RING_OLD_2 -_08029C18: .4byte 0x0000FFFF -_08029C1C: - ldr r4, _08029C48 @ =gMPlayInfo_SE1 - ldr r1, _08029C4C @ =song117 - adds r0, r4, #0 - bl MPlayStart - adds r0, r4, #0 - bl m4aMPlayImmInit - ldr r5, _08029C50 @ =0x0000FFFF - adds r0, r4, #0 - adds r1, r5, #0 - movs r2, #0x80 - bl m4aMPlayVolumeControl - adds r0, r4, #0 - adds r1, r5, #0 - movs r2, #0x40 - bl m4aMPlayPanpotControl -_08029C42: - pop {r4, r5} - pop {r0} - bx r0 - .align 2, 0 -_08029C48: .4byte gMPlayInfo_SE1 -_08029C4C: .4byte song117 -_08029C50: .4byte 0x0000FFFF - - thumb_func_start CreateCollectRingEffect -CreateCollectRingEffect: @ 0x08029C54 - push {r4, r5, r6, r7, lr} - sub sp, #4 - lsls r0, r0, #0x10 - lsrs r7, r0, #0x10 - lsls r1, r1, #0x10 - lsrs r6, r1, #0x10 - ldr r5, _08029CA4 @ =gStageData - adds r0, r5, #0 - adds r0, #0xb5 - ldrb r0, [r0] - cmp r0, #7 - bhi _08029CFE - ldr r0, _08029CA8 @ =sub_802ACF0 - ldr r2, _08029CAC @ =0x00002810 - movs r4, #0 - str r4, [sp] - movs r1, #0x2c - movs r3, #0 - bl TaskCreate - ldrh r2, [r0, #6] - movs r3, #0xc0 - lsls r3, r3, #0x12 - ldr r1, _08029CB0 @ =0x03000029 - adds r0, r2, r1 - strb r4, [r0] - adds r0, r5, #0 - adds r0, #0xac - ldrb r1, [r0] - movs r0, #1 - ands r0, r1 - ldr r4, _08029CB4 @ =0x03000028 - adds r1, r2, r4 - strb r0, [r1] - orrs r3, r2 - ldrb r0, [r5, #3] - cmp r0, #5 - bhi _08029CBC - ldr r0, _08029CB8 @ =0x06014380 - b _08029CC2 - .align 2, 0 -_08029CA4: .4byte gStageData -_08029CA8: .4byte sub_802ACF0 -_08029CAC: .4byte 0x00002810 -_08029CB0: .4byte 0x03000029 -_08029CB4: .4byte 0x03000028 -_08029CB8: .4byte 0x06014380 -_08029CBC: - cmp r0, #6 - bne _08029CC4 - ldr r0, _08029D08 @ =0x060143A0 -_08029CC2: - str r0, [r3] -_08029CC4: - ldr r0, _08029D0C @ =0x00041200 - str r0, [r3, #8] - movs r2, #0 - movs r1, #0 - ldr r0, _08029D10 @ =0x00000536 - strh r0, [r3, #0xc] - strh r7, [r3, #0x10] - strh r6, [r3, #0x12] - movs r0, #0xa0 - lsls r0, r0, #2 - strh r0, [r3, #0x14] - strh r1, [r3, #0x16] - ldr r0, _08029D14 @ =0x0000FFFF - strh r0, [r3, #0x18] - strb r2, [r3, #0x1a] - movs r0, #0xff - strb r0, [r3, #0x1b] - movs r0, #0x10 - strb r0, [r3, #0x1c] - strb r2, [r3, #0x1f] - subs r0, #0x11 - str r0, [r3, #0x20] - ldr r1, _08029D18 @ =gStageData - adds r1, #0xb5 - ldrb r0, [r1] - adds r0, #1 - strb r0, [r1] - bl sub_8029BB0 -_08029CFE: - add sp, #4 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_08029D08: .4byte 0x060143A0 -_08029D0C: .4byte 0x00041200 -_08029D10: .4byte 0x00000536 -_08029D14: .4byte 0x0000FFFF -_08029D18: .4byte gStageData - -@ --- entities_manager ? --- - - thumb_func_start CreateCollectRingEffectNoSfx -CreateCollectRingEffectNoSfx: @ 0x08029D1C - push {r4, r5, r6, r7, lr} - sub sp, #4 - lsls r0, r0, #0x10 - lsrs r7, r0, #0x10 - lsls r1, r1, #0x10 - lsrs r6, r1, #0x10 - ldr r5, _08029D6C @ =gStageData - adds r0, r5, #0 - adds r0, #0xb5 - ldrb r0, [r0] - cmp r0, #7 - bhi _08029DC2 - ldr r0, _08029D70 @ =sub_802ACF0 - ldr r2, _08029D74 @ =0x00002810 - movs r4, #0 - str r4, [sp] - movs r1, #0x2c - movs r3, #0 - bl TaskCreate - ldrh r2, [r0, #6] - movs r3, #0xc0 - lsls r3, r3, #0x12 - ldr r1, _08029D78 @ =0x03000029 - adds r0, r2, r1 - strb r4, [r0] - adds r0, r5, #0 - adds r0, #0xac - ldrb r1, [r0] - movs r0, #1 - ands r0, r1 - ldr r4, _08029D7C @ =0x03000028 - adds r1, r2, r4 - strb r0, [r1] - orrs r3, r2 - ldrb r0, [r5, #3] - cmp r0, #5 - bhi _08029D84 - ldr r0, _08029D80 @ =0x06014380 - b _08029D8A - .align 2, 0 -_08029D6C: .4byte gStageData -_08029D70: .4byte sub_802ACF0 -_08029D74: .4byte 0x00002810 -_08029D78: .4byte 0x03000029 -_08029D7C: .4byte 0x03000028 -_08029D80: .4byte 0x06014380 -_08029D84: - cmp r0, #6 - bne _08029D8C - ldr r0, _08029DCC @ =0x060143A0 -_08029D8A: - str r0, [r3] -_08029D8C: - ldr r0, _08029DD0 @ =0x00041200 - str r0, [r3, #8] - movs r2, #0 - movs r1, #0 - ldr r0, _08029DD4 @ =0x00000536 - strh r0, [r3, #0xc] - strh r7, [r3, #0x10] - strh r6, [r3, #0x12] - movs r0, #0xa0 - lsls r0, r0, #2 - strh r0, [r3, #0x14] - strh r1, [r3, #0x16] - ldr r0, _08029DD8 @ =0x0000FFFF - strh r0, [r3, #0x18] - strb r2, [r3, #0x1a] - movs r0, #0xff - strb r0, [r3, #0x1b] - movs r0, #0x10 - strb r0, [r3, #0x1c] - strb r2, [r3, #0x1f] - subs r0, #0x11 - str r0, [r3, #0x20] - ldr r1, _08029DDC @ =gStageData - adds r1, #0xb5 - ldrb r0, [r1] - adds r0, #1 - strb r0, [r1] -_08029DC2: - add sp, #4 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_08029DCC: .4byte 0x060143A0 -_08029DD0: .4byte 0x00041200 -_08029DD4: .4byte 0x00000536 -_08029DD8: .4byte 0x0000FFFF -_08029DDC: .4byte gStageData - - thumb_func_start Task_RingsMgrStage -Task_RingsMgrStage: @ 0x08029DE0 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #0x4c - ldr r0, _08029E2C @ =gCurTask - ldr r0, [r0] - ldrh r1, [r0, #6] - movs r0, #0xc0 - lsls r0, r0, #0x12 - adds r1, r1, r0 - str r1, [sp, #4] - ldr r0, [r1, #0x28] - str r0, [sp, #8] - movs r1, #0 - str r1, [sp, #0x18] - ldr r0, [sp, #4] - bl UpdateSpriteAnimation - ldr r3, [sp, #4] - ldr r2, [r3, #4] - lsrs r0, r2, #0x1c - cmp r0, #0 - bne _08029E34 - ldr r0, _08029E30 @ =gRefSpriteTables - ldr r0, [r0] - ldrh r1, [r3, #0xc] - ldr r0, [r0, #4] - lsls r1, r1, #2 - adds r1, r1, r0 - lsls r0, r2, #1 - adds r0, r0, r2 - lsls r0, r0, #2 - ldr r1, [r1] - adds r1, r1, r0 - str r1, [sp, #0xc] - b _08029E4A - .align 2, 0 -_08029E2C: .4byte gCurTask -_08029E30: .4byte gRefSpriteTables -_08029E34: - ldr r0, _08029E80 @ =gRefSpriteTables - ldr r1, [r0] - ldr r4, [sp, #4] - ldrh r0, [r4, #0xc] - ldr r1, [r1, #4] - lsls r0, r0, #2 - adds r0, r0, r1 - lsls r1, r2, #4 - ldr r0, [r0] - adds r0, r0, r1 - str r0, [sp, #0xc] -_08029E4A: - ldr r6, [sp, #8] - adds r6, #4 - ldm r6!, {r0} - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - str r0, [sp, #0x10] - ldm r6!, {r0} - str r6, [sp, #8] - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - str r0, [sp, #0x14] - ldr r0, _08029E84 @ =gStageData - ldrb r0, [r0, #3] - cmp r0, #5 - bls _08029E6A - b _0802A2BC -_08029E6A: - movs r0, #0 - str r0, [sp, #0x1c] - mov r1, sp - str r1, [sp, #0x20] -_08029E72: - ldr r2, [sp, #0x1c] - cmp r2, #0 - bne _08029E88 - ldr r0, _08029E84 @ =gStageData - ldrb r1, [r0, #6] - b _08029E92 - .align 2, 0 -_08029E80: .4byte gRefSpriteTables -_08029E84: .4byte gStageData -_08029E88: - mov r0, sb - adds r0, #0x2b - ldrb r1, [r0] - lsls r1, r1, #0x1e - lsrs r1, r1, #0x1e -_08029E92: - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #2 - adds r0, r0, r1 - lsls r0, r0, #4 - ldr r1, _08029FB0 @ =gPlayers - adds r0, r0, r1 - mov sb, r0 - adds r4, r1, #0 - mov r3, sb - ldr r0, [r3, #4] - movs r3, #0x80 - lsls r3, r3, #1 - ands r0, r3 - cmp r0, #0 - beq _08029EB4 - b _0802A292 -_08029EB4: - mov r6, sb - movs r1, #0x30 - ldrsh r0, [r6, r1] - cmp r0, #0x66 - bne _08029EC0 - b _0802A292 -_08029EC0: - mov r0, sb - adds r0, #0x48 - movs r2, #0 - ldrsh r0, [r0, r2] - cmp r0, #0 - beq _08029ECE - b _0802A292 -_08029ECE: - mov r1, sb - adds r1, #0x2b - ldrb r2, [r1] - movs r0, #0x1c - ands r0, r2 - str r1, [sp, #0x44] - cmp r0, #8 - bne _08029EFA - lsls r1, r2, #0x1e - lsrs r1, r1, #0x1e - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #2 - adds r0, r0, r1 - lsls r0, r0, #4 - adds r1, r4, #4 - adds r0, r0, r1 - ldr r0, [r0] - ands r0, r3 - cmp r0, #0 - beq _08029EFA - b _0802A292 -_08029EFA: - mov r1, sb - adds r1, #0x24 - ldrb r0, [r1] - rsbs r0, r0, #0 - ldr r3, [sp, #0x20] - strb r0, [r3] - mov r2, sb - adds r2, #0x25 - ldrb r0, [r2] - rsbs r0, r0, #0 - strb r0, [r3, #1] - ldrb r0, [r1] - strb r0, [r3, #2] - ldrb r0, [r2] - strb r0, [r3, #3] - mov r4, sb - ldr r1, [r4, #0x14] - asrs r1, r1, #8 - movs r0, #1 - ldrsb r0, [r3, r0] - adds r0, r1, r0 - lsls r0, r0, #8 - lsrs r0, r0, #0x10 - mov sl, r0 - movs r0, #3 - ldrsb r0, [r3, r0] - adds r0, r0, r1 - adds r0, #8 - asrs r0, r0, #8 - cmp sl, r0 - ble _08029F3A - b _0802A098 -_08029F3A: - ldr r6, [sp, #0x14] - cmp sl, r6 - blo _08029F42 - b _0802A098 -_08029F42: - mov r0, sp - str r0, [sp, #0x24] -_08029F46: - mov r1, sb - ldr r2, [r1, #0x10] - asrs r1, r2, #8 - ldr r3, [sp, #0x24] - movs r0, #0 - ldrsb r0, [r3, r0] - adds r0, r1, r0 - subs r0, #8 - lsls r0, r0, #8 - lsrs r0, r0, #0x10 - mov r8, r0 - movs r0, #2 - ldrsb r0, [r3, r0] - adds r0, r0, r1 - adds r0, #0x10 - asrs r0, r0, #8 - mov r4, sb - ldr r3, [r4, #0x14] - mov r6, sl - adds r6, #1 - str r6, [sp, #0x3c] - cmp r8, r0 - ble _08029F76 - b _0802A076 -_08029F76: - ldr r0, [sp, #0x10] - cmp r8, r0 - blo _08029F7E - b _0802A076 -_08029F7E: - ldr r1, [sp, #0x10] - mov r0, sl - muls r0, r1, r0 - mov r4, r8 - lsls r1, r4, #2 - lsls r0, r0, #2 - ldr r6, [sp, #8] - adds r0, r0, r6 - adds r1, r1, r0 - ldr r0, [r1] - adds r4, #1 - str r4, [sp, #0x38] - cmp r0, #0 - beq _0802A054 - subs r0, #8 - adds r5, r6, r0 - ldrb r1, [r5] - adds r0, r1, #0 - cmp r0, #0xff - beq _0802A054 - mov r4, sp -_08029FA8: - cmp r1, #0xfe - bne _08029FB4 - adds r5, #2 - b _0802A04C - .align 2, 0 -_08029FB0: .4byte gPlayers -_08029FB4: - ldrb r1, [r5] - lsls r1, r1, #3 - mov r2, r8 - lsls r0, r2, #8 - adds r7, r1, r0 - ldrb r1, [r5, #1] - lsls r1, r1, #3 - mov r3, sl - lsls r0, r3, #8 - adds r6, r1, r0 - adds r2, r7, #0 - subs r2, #8 - mov r1, sb - ldr r0, [r1, #0x10] - asrs r0, r0, #8 - movs r3, #0 - ldrsb r3, [r4, r3] - adds r1, r0, r3 - cmp r2, r1 - bgt _08029FE8 - adds r0, r7, #0 - adds r0, #8 - cmp r0, r1 - bge _08029FF4 - cmp r2, r1 - blt _0802A044 -_08029FE8: - movs r0, #2 - ldrsb r0, [r4, r0] - subs r0, r0, r3 - adds r0, r1, r0 - cmp r0, r2 - blt _0802A044 -_08029FF4: - adds r2, r6, #0 - subs r2, #0x10 - mov r3, sb - ldr r0, [r3, #0x14] - asrs r0, r0, #8 - movs r3, #1 - ldrsb r3, [r4, r3] - adds r1, r0, r3 - cmp r2, r1 - bgt _0802A010 - cmp r6, r1 - bge _0802A01C - cmp r2, r1 - blt _0802A044 -_0802A010: - movs r0, #3 - ldrsb r0, [r4, r0] - subs r0, r0, r3 - adds r0, r1, r0 - cmp r0, r2 - blt _0802A044 -_0802A01C: - ldr r0, [sp, #0x1c] - cmp r0, #0 - beq _0802A02E - ldr r2, [sp, #0x44] - ldrb r1, [r2] - movs r0, #0x1c - ands r0, r1 - cmp r0, #8 - bne _0802A034 -_0802A02E: - movs r0, #1 - bl AddRings -_0802A034: - lsls r0, r7, #0x10 - asrs r0, r0, #0x10 - lsls r1, r6, #0x10 - asrs r1, r1, #0x10 - bl CreateCollectRingEffect - movs r0, #0xfe - strb r0, [r5] -_0802A044: - adds r5, #2 - mov r6, sb - ldr r3, [r6, #0x14] - ldr r2, [r6, #0x10] -_0802A04C: - ldrb r1, [r5] - adds r0, r1, #0 - cmp r0, #0xff - bne _08029FA8 -_0802A054: - ldr r1, [sp, #0x38] - lsls r0, r1, #0x10 - lsrs r0, r0, #0x10 - mov r8, r0 - asrs r1, r2, #8 - ldr r4, [sp, #0x24] - movs r0, #2 - ldrsb r0, [r4, r0] - adds r0, r0, r1 - adds r0, #0x10 - asrs r0, r0, #8 - cmp r8, r0 - bgt _0802A076 - ldr r6, [sp, #0x10] - cmp r8, r6 - bhs _0802A076 - b _08029F7E -_0802A076: - ldr r1, [sp, #0x3c] - lsls r0, r1, #0x10 - lsrs r0, r0, #0x10 - mov sl, r0 - asrs r1, r3, #8 - ldr r2, [sp, #0x24] - movs r0, #3 - ldrsb r0, [r2, r0] - adds r0, r0, r1 - adds r0, #8 - asrs r0, r0, #8 - cmp sl, r0 - bgt _0802A098 - ldr r3, [sp, #0x14] - cmp sl, r3 - bhs _0802A098 - b _08029F46 -_0802A098: - ldr r3, _0802A108 @ =gCamera - ldr r2, [r3, #4] - lsls r0, r2, #8 - lsrs r0, r0, #0x10 - mov sl, r0 - movs r0, #0x9e - lsls r0, r0, #1 - add r0, sb - ldrb r1, [r0] - movs r0, #0x20 - ands r0, r1 - cmp r0, #0 - bne _0802A0B4 - b _0802A292 -_0802A0B4: - mov r4, sl - lsls r1, r4, #8 - adds r0, r2, #0 - adds r0, #0xa0 - cmp r1, r0 - blt _0802A0C2 - b _0802A292 -_0802A0C2: - ldr r6, [sp, #0x14] - cmp sl, r6 - blo _0802A0CA - b _0802A292 -_0802A0CA: - ldr r0, [r3] - lsls r1, r0, #8 - lsrs r1, r1, #0x10 - mov r8, r1 - lsls r1, r1, #8 - adds r0, #0xf0 - cmp r1, r0 - blt _0802A0DC - b _0802A274 -_0802A0DC: - ldr r0, [sp, #0x10] - mov r2, sl - muls r2, r0, r2 - mov r3, r8 - lsls r1, r3, #2 - lsls r0, r2, #2 - ldr r4, [sp, #8] - adds r0, r0, r4 - adds r1, r1, r0 - ldr r0, [r1] - str r2, [sp, #0x34] - ldr r6, [sp, #0x10] - cmp r8, r6 - blo _0802A0FA - b _0802A274 -_0802A0FA: - cmp r0, #0 - bne _0802A100 - b _0802A246 -_0802A100: - subs r0, #8 - ldr r1, [sp, #8] - adds r5, r1, r0 - b _0802A23C - .align 2, 0 -_0802A108: .4byte gCamera -_0802A10C: - cmp r1, #0xfe - beq _0802A180 - ldrb r1, [r5] - lsls r1, r1, #3 - mov r2, r8 - lsls r0, r2, #8 - adds r7, r1, r0 - ldrb r1, [r5, #1] - lsls r1, r1, #3 - mov r3, sl - lsls r0, r3, #8 - adds r6, r1, r0 - ldr r4, _0802A184 @ =gCamera - ldr r0, [r4] - subs r0, r7, r0 - adds r0, #8 - movs r1, #0x80 - lsls r1, r1, #1 - cmp r0, r1 - bhi _0802A180 - ldr r0, [r4, #4] - subs r0, r6, r0 - cmp r0, #0 - blt _0802A180 - subs r0, #0x10 - cmp r0, #0xa0 - bgt _0802A180 - adds r1, r7, #0 - subs r1, #0x40 - mov r2, sb - ldr r0, [r2, #0x10] - asrs r2, r0, #8 - cmp r1, r2 - bgt _0802A188 - adds r0, r7, #0 - adds r0, #0x40 - cmp r0, r2 - blt _0802A188 - adds r1, r6, #0 - subs r1, #0x48 - mov r3, sb - ldr r0, [r3, #0x14] - asrs r2, r0, #8 - cmp r1, r2 - bgt _0802A188 - adds r0, r6, #0 - adds r0, #0x38 - cmp r0, r2 - blt _0802A188 - lsls r0, r7, #0x10 - asrs r0, r0, #0x10 - lsls r1, r6, #0x10 - asrs r1, r1, #0x10 - mov r2, sb - bl sub_802AB10 - movs r0, #0xfe - strb r0, [r5] -_0802A180: - adds r5, #2 - b _0802A23C - .align 2, 0 -_0802A184: .4byte gCamera -_0802A188: - adds r5, #2 - ldr r4, [sp, #4] - ldrb r1, [r4, #0x1d] - ldr r0, [sp, #0x18] - cmp r0, #0 - beq _0802A19A - adds r0, r1, #0 - cmp r0, #0xff - bne _0802A1BC -_0802A19A: - movs r0, #0xff - ldr r1, [sp, #4] - strb r0, [r1, #0x1d] - ldr r2, _0802A1B8 @ =gCamera - ldr r0, [r2] - subs r0, r7, r0 - strh r0, [r1, #0x10] - ldr r0, [r2, #4] - subs r0, r6, r0 - strh r0, [r1, #0x12] - ldr r0, [sp, #4] - bl DisplaySprite - b _0802A232 - .align 2, 0 -_0802A1B8: .4byte gCamera -_0802A1BC: - ldr r3, [sp, #4] - ldrb r1, [r3, #0x1d] - lsls r1, r1, #3 - ldr r0, _0802A2A4 @ =gOamMallocBuffer - adds r2, r1, r0 - ldrh r0, [r3, #0x14] - movs r4, #0xf8 - lsls r4, r4, #3 - adds r1, r4, #0 - ands r0, r1 - lsrs r0, r0, #6 - str r2, [sp, #0x48] - bl OamMalloc - adds r4, r0, #0 - ldr r0, _0802A2A8 @ =iwram_end - ldr r0, [r0] - ldr r2, [sp, #0x48] - cmp r0, r4 - bne _0802A1E6 - b _0802A69C -_0802A1E6: - ldr r1, _0802A2AC @ =0x040000D4 - str r2, [r1] - str r4, [r1, #4] - ldr r0, _0802A2B0 @ =0x80000003 - str r0, [r1, #8] - ldr r0, [r1, #8] - ldrh r3, [r4, #2] - movs r1, #0xfe - lsls r1, r1, #8 - adds r0, r1, #0 - ands r3, r0 - strh r3, [r4, #2] - ldrh r2, [r4] - movs r1, #0xff - lsls r1, r1, #8 - adds r0, r1, #0 - ands r2, r0 - strh r2, [r4] - ldr r1, _0802A2B4 @ =gCamera - ldr r0, [r1, #4] - subs r0, r6, r0 - ldr r6, [sp, #0xc] - ldrh r1, [r6, #0xa] - subs r0, r0, r1 - movs r1, #0xff - ands r0, r1 - adds r2, r2, r0 - strh r2, [r4] - ldr r1, _0802A2B4 @ =gCamera - ldr r0, [r1] - subs r0, r7, r0 - ldrh r1, [r6, #8] - subs r0, r0, r1 - ldr r2, _0802A2B8 @ =0x000001FF - adds r1, r2, #0 - ands r0, r1 - adds r3, r3, r0 - strh r3, [r4, #2] -_0802A232: - ldr r0, [sp, #0x18] - adds r0, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - str r0, [sp, #0x18] -_0802A23C: - ldrb r1, [r5] - adds r0, r1, #0 - cmp r0, #0xff - beq _0802A246 - b _0802A10C -_0802A246: - mov r0, r8 - adds r0, #1 - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - mov r8, r0 - lsls r1, r0, #8 - ldr r3, _0802A2B4 @ =gCamera - ldr r0, [r3] - adds r0, #0xf0 - cmp r1, r0 - bge _0802A274 - mov r4, r8 - lsls r1, r4, #2 - ldr r6, [sp, #0x34] - lsls r0, r6, #2 - ldr r2, [sp, #8] - adds r0, r0, r2 - adds r1, r1, r0 - ldr r0, [r1] - ldr r3, [sp, #0x10] - cmp r8, r3 - bhs _0802A274 - b _0802A0FA -_0802A274: - mov r0, sl - adds r0, #1 - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - mov sl, r0 - lsls r1, r0, #8 - ldr r3, _0802A2B4 @ =gCamera - ldr r0, [r3, #4] - adds r0, #0xa0 - cmp r1, r0 - bge _0802A292 - ldr r4, [sp, #0x14] - cmp sl, r4 - bhs _0802A292 - b _0802A0CA -_0802A292: - ldr r0, [sp, #0x1c] - adds r0, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - str r0, [sp, #0x1c] - cmp r0, #1 - bhi _0802A2A2 - b _08029E72 -_0802A2A2: - b _0802A514 - .align 2, 0 -_0802A2A4: .4byte gOamMallocBuffer -_0802A2A8: .4byte iwram_end -_0802A2AC: .4byte 0x040000D4 -_0802A2B0: .4byte 0x80000003 -_0802A2B4: .4byte gCamera -_0802A2B8: .4byte 0x000001FF -_0802A2BC: - movs r6, #0 - str r6, [sp, #0x1c] - mov r0, sp - str r0, [sp, #0x2c] -_0802A2C4: - movs r1, #0 - str r1, [sp, #0x28] - ldr r2, [sp, #0x1c] - lsls r0, r2, #2 - adds r0, r0, r2 - lsls r0, r0, #2 - adds r0, r0, r2 - lsls r0, r0, #4 - ldr r3, _0802A3C8 @ =gPlayers - adds r0, r0, r3 - mov sb, r0 - adds r0, #0x2b - ldrb r0, [r0] - movs r1, #0x1c - ands r1, r0 - adds r2, #1 - str r2, [sp, #0x40] - cmp r1, #0x14 - bne _0802A2EC - b _0802A506 -_0802A2EC: - cmp r1, #8 - bne _0802A2F2 - b _0802A506 -_0802A2F2: - ldr r0, _0802A3CC @ =gStageData - ldrb r1, [r0, #6] - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #2 - adds r0, r0, r1 - lsls r0, r0, #4 - adds r0, r0, r3 - cmp sb, r0 - beq _0802A31E - adds r0, #0x2b - ldrb r1, [r0] - lsls r1, r1, #0x1e - lsrs r1, r1, #0x1e - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #2 - adds r0, r0, r1 - lsls r0, r0, #4 - adds r0, r0, r3 - cmp sb, r0 - bne _0802A322 -_0802A31E: - movs r4, #1 - str r4, [sp, #0x28] -_0802A322: - mov r6, sb - ldr r1, [r6, #4] - movs r0, #0x80 - lsls r0, r0, #1 - ands r1, r0 - ldr r0, [sp, #0x1c] - adds r0, #1 - str r0, [sp, #0x40] - cmp r1, #0 - beq _0802A338 - b _0802A506 -_0802A338: - movs r1, #0x30 - ldrsh r0, [r6, r1] - cmp r0, #0x66 - bne _0802A342 - b _0802A506 -_0802A342: - mov r0, sb - adds r0, #0x48 - movs r2, #0 - ldrsh r0, [r0, r2] - cmp r0, #0 - beq _0802A350 - b _0802A506 -_0802A350: - mov r1, sb - adds r1, #0x24 - ldrb r0, [r1] - rsbs r0, r0, #0 - ldr r3, [sp, #0x2c] - strb r0, [r3] - mov r2, sb - adds r2, #0x25 - ldrb r0, [r2] - rsbs r0, r0, #0 - strb r0, [r3, #1] - ldrb r0, [r1] - strb r0, [r3, #2] - ldrb r0, [r2] - strb r0, [r3, #3] - ldr r1, [r6, #0x14] - asrs r1, r1, #8 - movs r0, #1 - ldrsb r0, [r3, r0] - adds r0, r1, r0 - lsls r0, r0, #8 - lsrs r0, r0, #0x10 - mov sl, r0 - movs r0, #3 - ldrsb r0, [r3, r0] - adds r0, r0, r1 - adds r0, #8 - asrs r0, r0, #8 - cmp sl, r0 - ble _0802A38E - b _0802A506 -_0802A38E: - ldr r4, [sp, #0x14] - cmp sl, r4 - blo _0802A396 - b _0802A506 -_0802A396: - mov r6, sp - str r6, [sp, #0x30] -_0802A39A: - mov r0, sb - ldr r2, [r0, #0x10] - asrs r1, r2, #8 - ldr r3, [sp, #0x30] - movs r0, #0 - ldrsb r0, [r3, r0] - adds r0, r1, r0 - subs r0, #8 - lsls r0, r0, #8 - lsrs r0, r0, #0x10 - mov r8, r0 - movs r0, #2 - ldrsb r0, [r3, r0] - adds r0, r0, r1 - adds r0, #0x10 - asrs r0, r0, #8 - mov r4, sb - ldr r3, [r4, #0x14] - mov r6, sl - adds r6, #1 - str r6, [sp, #0x3c] - b _0802A4D8 - .align 2, 0 -_0802A3C8: .4byte gPlayers -_0802A3CC: .4byte gStageData -_0802A3D0: - ldr r1, [sp, #0x10] - mov r0, sl - muls r0, r1, r0 - mov r4, r8 - lsls r1, r4, #2 - lsls r0, r0, #2 - ldr r6, [sp, #8] - adds r0, r0, r6 - adds r1, r1, r0 - ldr r0, [r1] - adds r4, #1 - str r4, [sp, #0x38] - cmp r0, #0 - beq _0802A4C2 - subs r0, #8 - adds r5, r6, r0 - ldrb r1, [r5] - adds r0, r1, #0 - cmp r0, #0xff - beq _0802A4C2 - mov r4, sp -_0802A3FA: - cmp r1, #0xfe - bne _0802A402 - adds r5, #2 - b _0802A4BA -_0802A402: - ldrb r1, [r5] - lsls r1, r1, #3 - mov r2, r8 - lsls r0, r2, #8 - adds r7, r1, r0 - ldrb r1, [r5, #1] - lsls r1, r1, #3 - mov r3, sl - lsls r0, r3, #8 - adds r6, r1, r0 - adds r2, r7, #0 - subs r2, #8 - mov r1, sb - ldr r0, [r1, #0x10] - asrs r0, r0, #8 - movs r3, #0 - ldrsb r3, [r4, r3] - adds r1, r0, r3 - cmp r2, r1 - bgt _0802A436 - adds r0, r7, #0 - adds r0, #8 - cmp r0, r1 - bge _0802A442 - cmp r2, r1 - blt _0802A4B2 -_0802A436: - movs r0, #2 - ldrsb r0, [r4, r0] - subs r0, r0, r3 - adds r0, r1, r0 - cmp r0, r2 - blt _0802A4B2 -_0802A442: - adds r2, r6, #0 - subs r2, #0x10 - mov r3, sb - ldr r0, [r3, #0x14] - asrs r0, r0, #8 - movs r3, #1 - ldrsb r3, [r4, r3] - adds r1, r0, r3 - cmp r2, r1 - bgt _0802A45E - cmp r6, r1 - bge _0802A46A - cmp r2, r1 - blt _0802A4B2 -_0802A45E: - movs r0, #3 - ldrsb r0, [r4, r0] - subs r0, r0, r3 - adds r0, r1, r0 - cmp r0, r2 - blt _0802A4B2 -_0802A46A: - ldr r0, [sp, #0x28] - cmp r0, #0 - beq _0802A4A2 - ldr r0, _0802A490 @ =gStageData - ldrb r0, [r0, #6] - ldr r1, [sp, #0x1c] - cmp r0, r1 - bne _0802A494 - movs r0, #1 - bl AddRings - lsls r0, r7, #0x10 - asrs r0, r0, #0x10 - lsls r1, r6, #0x10 - asrs r1, r1, #0x10 - bl CreateCollectRingEffect - b _0802A4AE - .align 2, 0 -_0802A490: .4byte gStageData -_0802A494: - lsls r0, r7, #0x10 - asrs r0, r0, #0x10 - lsls r1, r6, #0x10 - asrs r1, r1, #0x10 - bl CreateCollectRingEffectNoSfx - b _0802A4AE -_0802A4A2: - lsls r0, r7, #0x10 - asrs r0, r0, #0x10 - lsls r1, r6, #0x10 - asrs r1, r1, #0x10 - bl CreateCollectRingEffectNoSfx -_0802A4AE: - movs r0, #0xfe - strb r0, [r5] -_0802A4B2: - adds r5, #2 - mov r2, sb - ldr r3, [r2, #0x14] - ldr r2, [r2, #0x10] -_0802A4BA: - ldrb r1, [r5] - adds r0, r1, #0 - cmp r0, #0xff - bne _0802A3FA -_0802A4C2: - ldr r4, [sp, #0x38] - lsls r0, r4, #0x10 - lsrs r0, r0, #0x10 - mov r8, r0 - asrs r1, r2, #8 - ldr r6, [sp, #0x30] - movs r0, #2 - ldrsb r0, [r6, r0] - adds r0, r0, r1 - adds r0, #0x10 - asrs r0, r0, #8 -_0802A4D8: - cmp r8, r0 - bgt _0802A4E4 - ldr r0, [sp, #0x10] - cmp r8, r0 - bhs _0802A4E4 - b _0802A3D0 -_0802A4E4: - ldr r1, [sp, #0x3c] - lsls r0, r1, #0x10 - lsrs r0, r0, #0x10 - mov sl, r0 - asrs r1, r3, #8 - ldr r2, [sp, #0x30] - movs r0, #3 - ldrsb r0, [r2, r0] - adds r0, r0, r1 - adds r0, #8 - asrs r0, r0, #8 - cmp sl, r0 - bgt _0802A506 - ldr r3, [sp, #0x14] - cmp sl, r3 - bhs _0802A506 - b _0802A39A -_0802A506: - ldr r4, [sp, #0x40] - lsls r0, r4, #0x18 - lsrs r0, r0, #0x18 - str r0, [sp, #0x1c] - cmp r0, #3 - bhi _0802A514 - b _0802A2C4 -_0802A514: - ldr r2, _0802A524 @ =gCamera - ldr r0, [r2, #4] - lsls r1, r0, #8 - lsrs r1, r1, #0x10 - mov sl, r1 - lsls r1, r1, #8 - b _0802A68E - .align 2, 0 -_0802A524: .4byte gCamera -_0802A528: - ldr r0, [r2] - lsls r1, r0, #8 - lsrs r1, r1, #0x10 - mov r8, r1 - lsls r1, r1, #8 - adds r0, #0xf0 - cmp r1, r0 - blt _0802A53A - b _0802A67E -_0802A53A: - ldr r0, [sp, #0x10] - cmp r8, r0 - blo _0802A542 - b _0802A67E -_0802A542: - ldr r1, [sp, #0x10] - mov r0, sl - muls r0, r1, r0 - mov r2, r8 - lsls r1, r2, #2 - lsls r0, r0, #2 - ldr r3, [sp, #8] - adds r0, r0, r3 - adds r1, r1, r0 - ldr r0, [r1] - cmp r0, #0 - bne _0802A55C - b _0802A660 -_0802A55C: - subs r0, #8 - adds r5, r3, r0 - b _0802A656 -_0802A562: - cmp r1, #0xfe - beq _0802A59A - ldrb r1, [r5] - lsls r1, r1, #3 - mov r4, r8 - lsls r0, r4, #8 - adds r7, r1, r0 - ldrb r1, [r5, #1] - lsls r1, r1, #3 - mov r6, sl - lsls r0, r6, #8 - adds r6, r1, r0 - ldr r1, _0802A5A0 @ =gCamera - ldr r0, [r1] - subs r0, r7, r0 - adds r0, #8 - movs r1, #0x80 - lsls r1, r1, #1 - cmp r0, r1 - bhi _0802A59A - ldr r2, _0802A5A0 @ =gCamera - ldr r0, [r2, #4] - subs r0, r6, r0 - cmp r0, #0 - blt _0802A59A - subs r0, #0x10 - cmp r0, #0xa0 - ble _0802A5A4 -_0802A59A: - adds r5, #2 - b _0802A656 - .align 2, 0 -_0802A5A0: .4byte gCamera -_0802A5A4: - adds r5, #2 - ldr r3, [sp, #4] - ldrb r1, [r3, #0x1d] - ldr r4, [sp, #0x18] - cmp r4, #0 - beq _0802A5B6 - adds r0, r1, #0 - cmp r0, #0xff - bne _0802A5D8 -_0802A5B6: - movs r0, #0xff - ldr r1, [sp, #4] - strb r0, [r1, #0x1d] - ldr r2, _0802A5D4 @ =gCamera - ldr r0, [r2] - subs r0, r7, r0 - strh r0, [r1, #0x10] - ldr r0, [r2, #4] - subs r0, r6, r0 - strh r0, [r1, #0x12] - ldr r0, [sp, #4] - bl DisplaySprite - b _0802A64C - .align 2, 0 -_0802A5D4: .4byte gCamera -_0802A5D8: - ldr r3, [sp, #4] - ldrb r1, [r3, #0x1d] - lsls r1, r1, #3 - ldr r0, _0802A6AC @ =gOamMallocBuffer - adds r2, r1, r0 - ldrh r0, [r3, #0x14] - movs r4, #0xf8 - lsls r4, r4, #3 - adds r1, r4, #0 - ands r0, r1 - lsrs r0, r0, #6 - str r2, [sp, #0x48] - bl OamMalloc - adds r4, r0, #0 - ldr r0, _0802A6B0 @ =iwram_end - ldr r0, [r0] - ldr r2, [sp, #0x48] - cmp r0, r4 - beq _0802A69C - ldr r1, _0802A6B4 @ =0x040000D4 - str r2, [r1] - str r4, [r1, #4] - ldr r0, _0802A6B8 @ =0x80000003 - str r0, [r1, #8] - ldr r0, [r1, #8] - ldrh r3, [r4, #2] - movs r1, #0xfe - lsls r1, r1, #8 - adds r0, r1, #0 - ands r3, r0 - strh r3, [r4, #2] - ldrh r2, [r4] - movs r1, #0xff - lsls r1, r1, #8 - adds r0, r1, #0 - ands r2, r0 - strh r2, [r4] - ldr r1, _0802A6BC @ =gCamera - ldr r0, [r1, #4] - subs r0, r6, r0 - ldr r6, [sp, #0xc] - ldrh r1, [r6, #0xa] - subs r0, r0, r1 - movs r1, #0xff - ands r0, r1 - adds r2, r2, r0 - strh r2, [r4] - ldr r1, _0802A6BC @ =gCamera - ldr r0, [r1] - subs r0, r7, r0 - ldrh r1, [r6, #8] - subs r0, r0, r1 - ldr r2, _0802A6C0 @ =0x000001FF - adds r1, r2, #0 - ands r0, r1 - adds r3, r3, r0 - strh r3, [r4, #2] -_0802A64C: - ldr r0, [sp, #0x18] - adds r0, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - str r0, [sp, #0x18] -_0802A656: - ldrb r1, [r5] - adds r0, r1, #0 - cmp r0, #0xff - beq _0802A660 - b _0802A562 -_0802A660: - mov r0, r8 - adds r0, #1 - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - mov r8, r0 - lsls r1, r0, #8 - ldr r3, _0802A6BC @ =gCamera - ldr r0, [r3] - adds r0, #0xf0 - cmp r1, r0 - bge _0802A67E - ldr r4, [sp, #0x10] - cmp r8, r4 - bhs _0802A67E - b _0802A542 -_0802A67E: - mov r0, sl - adds r0, #1 - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - mov sl, r0 - lsls r1, r0, #8 - ldr r2, _0802A6BC @ =gCamera - ldr r0, [r2, #4] -_0802A68E: - adds r0, #0xa0 - cmp r1, r0 - bge _0802A69C - ldr r6, [sp, #0x14] - cmp sl, r6 - bhs _0802A69C - b _0802A528 -_0802A69C: - add sp, #0x4c - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0802A6AC: .4byte gOamMallocBuffer -_0802A6B0: .4byte iwram_end -_0802A6B4: .4byte 0x040000D4 -_0802A6B8: .4byte 0x80000003 -_0802A6BC: .4byte gCamera -_0802A6C0: .4byte 0x000001FF - - thumb_func_start Task_RingsMgrExtraZone -Task_RingsMgrExtraZone: @ 0x0802A6C4 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #0x30 - ldr r0, _0802A74C @ =gCurTask - ldr r0, [r0] - ldrh r1, [r0, #6] - movs r0, #0xc0 - lsls r0, r0, #0x12 - adds r1, r1, r0 - str r1, [sp, #4] - ldr r0, [r1, #0x28] - str r0, [sp, #8] - ldr r4, _0802A750 @ =gStageData - ldrh r1, [r4, #0xe] - movs r2, #0 - str r2, [sp, #0x18] - ldr r0, _0802A754 @ =gCamera - adds r0, #0x6a - movs r3, #0 - ldrsh r0, [r0, r3] - cmp r0, #0 - beq _0802A706 - ldr r0, _0802A758 @ =gUnknown_080CEF58 - lsls r1, r1, #0x10 - asrs r1, r1, #0xe - adds r1, r1, r0 - ldr r0, [r1] - ldr r1, [sp, #8] - bl RLUnCompWram -_0802A706: - ldrb r0, [r4, #9] - cmp r0, #8 - bne _0802A714 - ldrb r0, [r4, #4] - cmp r0, #3 - beq _0802A714 - b _0802AAE6 -_0802A714: - mov r0, sp - movs r1, #0xf6 - strb r1, [r0] - strb r1, [r0, #1] - movs r1, #0xa - strb r1, [r0, #2] - strb r1, [r0, #3] - ldr r0, [sp, #4] - bl UpdateSpriteAnimation - ldr r4, [sp, #4] - ldr r2, [r4, #4] - lsrs r0, r2, #0x1c - cmp r0, #0 - bne _0802A760 - ldr r0, _0802A75C @ =gRefSpriteTables - ldr r0, [r0] - ldrh r1, [r4, #0xc] - ldr r0, [r0, #4] - lsls r1, r1, #2 - adds r1, r1, r0 - lsls r0, r2, #1 - adds r0, r0, r2 - lsls r0, r0, #2 - ldr r1, [r1] - adds r1, r1, r0 - str r1, [sp, #0xc] - b _0802A776 - .align 2, 0 -_0802A74C: .4byte gCurTask -_0802A750: .4byte gStageData -_0802A754: .4byte gCamera -_0802A758: .4byte gUnknown_080CEF58 -_0802A75C: .4byte gRefSpriteTables -_0802A760: - ldr r0, _0802A79C @ =gRefSpriteTables - ldr r1, [r0] - ldr r6, [sp, #4] - ldrh r0, [r6, #0xc] - ldr r1, [r1, #4] - lsls r0, r0, #2 - adds r0, r0, r1 - lsls r1, r2, #4 - ldr r0, [r0] - adds r0, r0, r1 - str r0, [sp, #0xc] -_0802A776: - ldr r0, [sp, #8] - adds r0, #4 - adds r1, r0, #0 - ldm r1!, {r0} - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - str r0, [sp, #0x10] - ldm r1!, {r0} - str r1, [sp, #8] - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - str r0, [sp, #0x14] - movs r2, #0 -_0802A790: - cmp r2, #0 - bne _0802A7A4 - ldr r0, _0802A7A0 @ =gStageData - ldrb r1, [r0, #6] - b _0802A7AE - .align 2, 0 -_0802A79C: .4byte gRefSpriteTables -_0802A7A0: .4byte gStageData -_0802A7A4: - mov r0, sl - adds r0, #0x2b - ldrb r1, [r0] - lsls r1, r1, #0x1e - lsrs r1, r1, #0x1e -_0802A7AE: - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #2 - adds r0, r0, r1 - lsls r0, r0, #4 - ldr r1, _0802A884 @ =gPlayers - adds r0, r0, r1 - mov sl, r0 - mov r3, sl - ldr r1, [r3, #4] - movs r0, #0x80 - lsls r0, r0, #1 - ands r1, r0 - adds r2, #1 - str r2, [sp, #0x28] - cmp r1, #0 - beq _0802A7D2 - b _0802A95E -_0802A7D2: - movs r4, #0x30 - ldrsh r0, [r3, r4] - cmp r0, #0x66 - bne _0802A7DC - b _0802A95E -_0802A7DC: - mov r0, sl - adds r0, #0x48 - movs r6, #0 - ldrsh r0, [r0, r6] - cmp r0, #0 - beq _0802A7EA - b _0802A95E -_0802A7EA: - ldr r2, [r3, #0x14] - asrs r1, r2, #8 - mov r0, sp - ldrb r0, [r0, #1] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - adds r0, r1, r0 - lsls r0, r0, #8 - lsrs r0, r0, #0x10 - mov sb, r0 - mov r0, sp - ldrb r0, [r0, #3] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - adds r1, r1, r0 - subs r1, #0x10 - asrs r1, r1, #8 - adds r3, r2, #0 - cmp sb, r1 - ble _0802A814 - b _0802A95E -_0802A814: - ldr r0, [sp, #0x14] - cmp sb, r0 - blo _0802A81C - b _0802A95E -_0802A81C: - mov r1, sp - str r1, [sp, #0x1c] -_0802A820: - mov r4, sl - ldr r2, [r4, #0x10] - asrs r1, r2, #8 - ldr r6, [sp, #0x1c] - movs r0, #0 - ldrsb r0, [r6, r0] - adds r0, r1, r0 - subs r0, #8 - lsls r0, r0, #8 - lsrs r0, r0, #0x10 - mov r8, r0 - movs r0, #2 - ldrsb r0, [r6, r0] - adds r1, r1, r0 - subs r1, #8 - asrs r1, r1, #8 - mov r0, sb - adds r0, #1 - str r0, [sp, #0x24] - cmp r8, r1 - bgt _0802A93C - ldr r1, [sp, #0x10] - cmp r8, r1 - bhs _0802A93C -_0802A850: - ldr r4, [sp, #0x10] - mov r0, sb - muls r0, r4, r0 - mov r6, r8 - lsls r1, r6, #2 - lsls r0, r0, #2 - ldr r4, [sp, #8] - adds r0, r0, r4 - adds r1, r1, r0 - ldr r0, [r1] - adds r6, #1 - str r6, [sp, #0x20] - cmp r0, #0 - beq _0802A91C - subs r0, #8 - adds r5, r4, r0 - ldrb r1, [r5] - adds r0, r1, #0 - cmp r0, #0xff - beq _0802A91C - mov r4, sp -_0802A87A: - cmp r1, #0xfe - bne _0802A888 - adds r5, #2 - b _0802A914 - .align 2, 0 -_0802A884: .4byte gPlayers -_0802A888: - ldrb r1, [r5] - lsls r1, r1, #3 - mov r6, r8 - lsls r0, r6, #8 - adds r7, r1, r0 - ldrb r1, [r5, #1] - lsls r1, r1, #3 - mov r2, sb - lsls r0, r2, #8 - adds r6, r1, r0 - movs r3, #1 - cmp r3, #0 - beq _0802A90C - adds r2, r7, #0 - subs r2, #8 - mov r1, sl - ldr r0, [r1, #0x10] - asrs r0, r0, #8 - movs r3, #0 - ldrsb r3, [r4, r3] - adds r1, r0, r3 - cmp r2, r1 - bgt _0802A8C2 - adds r0, r7, #0 - adds r0, #8 - cmp r0, r1 - bge _0802A8CE - cmp r2, r1 - blt _0802A90C -_0802A8C2: - movs r0, #2 - ldrsb r0, [r4, r0] - subs r0, r0, r3 - adds r0, r1, r0 - cmp r0, r2 - blt _0802A90C -_0802A8CE: - adds r2, r6, #0 - subs r2, #0x10 - mov r3, sl - ldr r0, [r3, #0x14] - asrs r0, r0, #8 - movs r3, #1 - ldrsb r3, [r4, r3] - adds r1, r0, r3 - cmp r2, r1 - bgt _0802A8EA - cmp r6, r1 - bge _0802A8F6 - cmp r2, r1 - blt _0802A90C -_0802A8EA: - movs r0, #3 - ldrsb r0, [r4, r0] - subs r0, r0, r3 - adds r0, r1, r0 - cmp r0, r2 - blt _0802A90C -_0802A8F6: - movs r0, #1 - bl AddRings - lsls r0, r7, #0x10 - asrs r0, r0, #0x10 - lsls r1, r6, #0x10 - asrs r1, r1, #0x10 - bl CreateCollectRingEffect - movs r0, #0xfe - strb r0, [r5] -_0802A90C: - adds r5, #2 - mov r6, sl - ldr r3, [r6, #0x14] - ldr r2, [r6, #0x10] -_0802A914: - ldrb r1, [r5] - adds r0, r1, #0 - cmp r0, #0xff - bne _0802A87A -_0802A91C: - ldr r1, [sp, #0x20] - lsls r0, r1, #0x10 - lsrs r0, r0, #0x10 - mov r8, r0 - asrs r0, r2, #8 - ldr r4, [sp, #0x1c] - movs r1, #2 - ldrsb r1, [r4, r1] - adds r0, r0, r1 - subs r0, #8 - asrs r0, r0, #8 - cmp r8, r0 - bgt _0802A93C - ldr r6, [sp, #0x10] - cmp r8, r6 - blo _0802A850 -_0802A93C: - ldr r1, [sp, #0x24] - lsls r0, r1, #0x10 - lsrs r0, r0, #0x10 - mov sb, r0 - asrs r0, r3, #8 - ldr r2, [sp, #0x1c] - movs r1, #3 - ldrsb r1, [r2, r1] - adds r0, r0, r1 - subs r0, #0x10 - asrs r0, r0, #8 - cmp sb, r0 - bgt _0802A95E - ldr r4, [sp, #0x14] - cmp sb, r4 - bhs _0802A95E - b _0802A820 -_0802A95E: - ldr r6, [sp, #0x28] - lsls r0, r6, #0x18 - lsrs r2, r0, #0x18 - cmp r2, #1 - bhi _0802A96A - b _0802A790 -_0802A96A: - ldr r2, _0802A97C @ =gCamera - ldr r0, [r2, #4] - lsls r1, r0, #8 - lsrs r1, r1, #0x10 - mov sb, r1 - lsls r1, r1, #8 - adds r0, #0xa0 - mov sl, r2 - b _0802AADA - .align 2, 0 -_0802A97C: .4byte gCamera -_0802A980: - ldr r0, [r2] - lsls r1, r0, #8 - lsrs r1, r1, #0x10 - mov r8, r1 - lsls r1, r1, #8 - adds r0, #0xf0 - cmp r1, r0 - blt _0802A992 - b _0802AAC8 -_0802A992: - ldr r1, [sp, #0x10] - cmp r8, r1 - blo _0802A99A - b _0802AAC8 -_0802A99A: - ldr r2, [sp, #0x10] - mov r0, sb - muls r0, r2, r0 - mov r3, r8 - lsls r1, r3, #2 - lsls r0, r0, #2 - ldr r4, [sp, #8] - adds r0, r0, r4 - adds r1, r1, r0 - ldr r0, [r1] - cmp r0, #0 - beq _0802AAAA - subs r0, #8 - adds r5, r4, r0 - b _0802AAA2 -_0802A9B8: - cmp r1, #0xfe - beq _0802A9EE - ldrb r1, [r5] - lsls r1, r1, #3 - mov r6, r8 - lsls r0, r6, #8 - adds r7, r1, r0 - ldrb r1, [r5, #1] - lsls r1, r1, #3 - mov r2, sb - lsls r0, r2, #8 - adds r6, r1, r0 - mov r3, sl - ldr r0, [r3] - subs r0, r7, r0 - adds r0, #8 - movs r1, #0x80 - lsls r1, r1, #1 - cmp r0, r1 - bhi _0802A9EE - ldr r0, [r3, #4] - subs r0, r6, r0 - cmp r0, #0 - blt _0802A9EE - subs r0, #0x10 - cmp r0, #0xa0 - ble _0802A9F2 -_0802A9EE: - adds r5, #2 - b _0802AAA2 -_0802A9F2: - adds r5, #2 - ldr r4, [sp, #4] - ldrb r1, [r4, #0x1d] - ldr r0, [sp, #0x18] - cmp r0, #0 - beq _0802AA04 - adds r0, r1, #0 - cmp r0, #0xff - bne _0802AA20 -_0802AA04: - movs r0, #0xff - ldr r1, [sp, #4] - strb r0, [r1, #0x1d] - mov r2, sl - ldr r0, [r2] - subs r0, r7, r0 - strh r0, [r1, #0x10] - ldr r0, [r2, #4] - subs r0, r6, r0 - strh r0, [r1, #0x12] - ldr r0, [sp, #4] - bl DisplaySprite - b _0802AA94 -_0802AA20: - ldr r3, [sp, #4] - ldrb r1, [r3, #0x1d] - lsls r1, r1, #3 - ldr r0, _0802AAF8 @ =gOamMallocBuffer - adds r2, r1, r0 - ldrh r0, [r3, #0x14] - movs r4, #0xf8 - lsls r4, r4, #3 - adds r1, r4, #0 - ands r0, r1 - lsrs r0, r0, #6 - str r2, [sp, #0x2c] - bl OamMalloc - adds r4, r0, #0 - ldr r0, _0802AAFC @ =iwram_end - ldr r0, [r0] - ldr r2, [sp, #0x2c] - cmp r0, r4 - beq _0802AAE6 - ldr r1, _0802AB00 @ =0x040000D4 - str r2, [r1] - str r4, [r1, #4] - ldr r0, _0802AB04 @ =0x80000003 - str r0, [r1, #8] - ldr r0, [r1, #8] - ldrh r3, [r4, #2] - movs r1, #0xfe - lsls r1, r1, #8 - adds r0, r1, #0 - ands r3, r0 - strh r3, [r4, #2] - ldrh r2, [r4] - movs r1, #0xff - lsls r1, r1, #8 - adds r0, r1, #0 - ands r2, r0 - strh r2, [r4] - mov r1, sl - ldr r0, [r1, #4] - subs r0, r6, r0 - ldr r6, [sp, #0xc] - ldrh r1, [r6, #0xa] - subs r0, r0, r1 - movs r1, #0xff - ands r0, r1 - adds r2, r2, r0 - strh r2, [r4] - mov r1, sl - ldr r0, [r1] - subs r0, r7, r0 - ldrh r1, [r6, #8] - subs r0, r0, r1 - ldr r2, _0802AB08 @ =0x000001FF - adds r1, r2, #0 - ands r0, r1 - adds r3, r3, r0 - strh r3, [r4, #2] -_0802AA94: - ldr r0, [sp, #0x18] - adds r0, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - str r0, [sp, #0x18] - ldr r3, _0802AB0C @ =gCamera - mov sl, r3 -_0802AAA2: - ldrb r1, [r5] - adds r0, r1, #0 - cmp r0, #0xff - bne _0802A9B8 -_0802AAAA: - mov r0, r8 - adds r0, #1 - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - mov r8, r0 - lsls r1, r0, #8 - mov r4, sl - ldr r0, [r4] - adds r0, #0xf0 - cmp r1, r0 - bge _0802AAC8 - ldr r6, [sp, #0x10] - cmp r8, r6 - bhs _0802AAC8 - b _0802A99A -_0802AAC8: - mov r0, sb - adds r0, #1 - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - mov sb, r0 - lsls r1, r0, #8 - mov r2, sl - ldr r0, [r2, #4] - adds r0, #0xa0 -_0802AADA: - cmp r1, r0 - bge _0802AAE6 - ldr r0, [sp, #0x14] - cmp sb, r0 - bhs _0802AAE6 - b _0802A980 -_0802AAE6: - add sp, #0x30 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0802AAF8: .4byte gOamMallocBuffer -_0802AAFC: .4byte iwram_end -_0802AB00: .4byte 0x040000D4 -_0802AB04: .4byte 0x80000003 -_0802AB08: .4byte 0x000001FF -_0802AB0C: .4byte gCamera - - thumb_func_start sub_802AB10 -sub_802AB10: @ 0x0802AB10 - push {r4, r5, r6, lr} - mov r6, r8 - push {r6} - sub sp, #4 - adds r4, r0, #0 - adds r5, r1, #0 - mov r8, r2 - lsls r4, r4, #0x10 - lsrs r4, r4, #0x10 - lsls r5, r5, #0x10 - lsrs r5, r5, #0x10 - ldr r0, _0802AB7C @ =Task_802AB8C - movs r2, #0x80 - lsls r2, r2, #6 - movs r6, #0 - str r6, [sp] - movs r1, #0x30 - movs r3, #0 - bl TaskCreate - ldrh r0, [r0, #6] - movs r1, #0xc0 - lsls r1, r1, #0x12 - adds r0, r0, r1 - mov r1, r8 - str r1, [r0, #0x28] - movs r2, #0 - strh r6, [r0, #0x2c] - strh r4, [r0, #0x10] - strh r5, [r0, #0x12] - ldr r1, _0802AB80 @ =0x06014180 - str r1, [r0] - movs r1, #0xa0 - lsls r1, r1, #2 - strh r1, [r0, #0x14] - ldr r1, _0802AB84 @ =0x00000535 - strh r1, [r0, #0xc] - strb r2, [r0, #0x1a] - strh r6, [r0, #0xe] - strh r6, [r0, #0x16] - movs r1, #0xff - strb r1, [r0, #0x1b] - movs r1, #0x10 - strb r1, [r0, #0x1c] - strb r2, [r0, #0x1f] - ldr r1, _0802AB88 @ =0x00041200 - str r1, [r0, #8] - add sp, #4 - pop {r3} - mov r8, r3 - pop {r4, r5, r6} - pop {r0} - bx r0 - .align 2, 0 -_0802AB7C: .4byte Task_802AB8C -_0802AB80: .4byte 0x06014180 -_0802AB84: .4byte 0x00000535 -_0802AB88: .4byte 0x00041200 - - thumb_func_start Task_802AB8C -Task_802AB8C: @ 0x0802AB8C - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - ldr r0, _0802ACB0 @ =gCurTask - ldr r0, [r0] - ldrh r0, [r0, #6] - movs r1, #0xc0 - lsls r1, r1, #0x12 - adds r0, r0, r1 - ldr r7, [r0, #0x28] - adds r4, r0, #0 - ldr r1, [r7, #0x10] - asrs r1, r1, #8 - ldrh r0, [r4, #0x10] - subs r1, r1, r0 - ldr r0, [r7, #0x14] - asrs r0, r0, #8 - ldrh r2, [r4, #0x12] - subs r0, r0, r2 - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - lsls r1, r1, #0x10 - asrs r1, r1, #0x10 - bl sa2__sub_8004418 - ldrh r1, [r4, #0x2c] - adds r1, #0x40 - strh r1, [r4, #0x2c] - movs r1, #0x2c - ldrsh r2, [r4, r1] - ldr r3, _0802ACB4 @ =gSineTable - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - movs r5, #0x80 - lsls r5, r5, #1 - adds r1, r0, r5 - lsls r1, r1, #1 - adds r1, r1, r3 - movs r5, #0 - ldrsh r1, [r1, r5] - muls r1, r2, r1 - asrs r1, r1, #0x16 - ldrh r2, [r4, #0x10] - adds r1, r1, r2 - strh r1, [r4, #0x10] - movs r5, #0x2c - ldrsh r1, [r4, r5] - lsls r0, r0, #1 - adds r0, r0, r3 - movs r2, #0 - ldrsh r0, [r0, r2] - muls r0, r1, r0 - asrs r0, r0, #0x16 - ldrh r5, [r4, #0x12] - adds r0, r0, r5 - strh r0, [r4, #0x12] - ldrh r0, [r4, #0x12] - mov sb, r0 - ldrh r1, [r4, #0x10] - mov sl, r1 - movs r2, #0x10 - ldrsh r3, [r4, r2] - adds r2, r3, #0 - subs r2, #8 - ldr r1, [r7, #0x10] - asrs r1, r1, #8 - adds r0, r7, #0 - adds r0, #0xe0 - ldr r5, [r0] - adds r0, r5, #0 - adds r0, #0x30 - movs r6, #0 - ldrsb r6, [r0, r6] - adds r1, r1, r6 - cmp r2, r1 - bgt _0802AC34 - adds r0, r3, #0 - adds r0, #8 - cmp r0, r1 - bge _0802AC46 - cmp r2, r1 - blt _0802ACB8 -_0802AC34: - adds r0, r5, #0 - adds r0, #0x32 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - subs r0, r0, r6 - adds r0, r1, r0 - cmp r0, r2 - blt _0802ACB8 -_0802AC46: - mov r5, sb - lsls r2, r5, #0x10 - asrs r6, r2, #0x10 - adds r5, r6, #0 - subs r5, #0x10 - ldr r1, [r7, #0x14] - asrs r1, r1, #8 - adds r0, r7, #0 - adds r0, #0xe0 - ldr r0, [r0] - adds r3, r0, #0 - adds r3, #0x31 - ldrb r3, [r3] - lsls r3, r3, #0x18 - asrs r3, r3, #0x18 - adds r1, r1, r3 - mov r8, r2 - cmp r5, r1 - bgt _0802AC74 - cmp r6, r1 - bge _0802AC84 - cmp r5, r1 - blt _0802ACB8 -_0802AC74: - adds r0, #0x33 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - subs r0, r0, r3 - adds r0, r1, r0 - cmp r0, r5 - blt _0802ACB8 -_0802AC84: - ldr r0, [r7, #4] - movs r1, #0x80 - lsls r1, r1, #1 - ands r0, r1 - cmp r0, #0 - bne _0802ACA4 - movs r0, #1 - bl AddRings - mov r1, sl - lsls r0, r1, #0x10 - asrs r0, r0, #0x10 - mov r2, r8 - asrs r1, r2, #0x10 - bl CreateCollectRingEffect -_0802ACA4: - ldr r0, _0802ACB0 @ =gCurTask - ldr r0, [r0] - bl TaskDestroy - b _0802ACDE - .align 2, 0 -_0802ACB0: .4byte gCurTask -_0802ACB4: .4byte gSineTable -_0802ACB8: - ldr r2, _0802ACEC @ =gCamera - ldr r1, [r2] - ldrh r0, [r4, #0x10] - subs r0, r0, r1 - strh r0, [r4, #0x10] - ldr r1, [r2, #4] - ldrh r0, [r4, #0x12] - subs r0, r0, r1 - strh r0, [r4, #0x12] - adds r0, r4, #0 - bl UpdateSpriteAnimation - adds r0, r4, #0 - bl DisplaySprite - mov r5, sl - strh r5, [r4, #0x10] - mov r0, sb - strh r0, [r4, #0x12] -_0802ACDE: - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0802ACEC: .4byte gCamera - - thumb_func_start sub_802ACF0 -sub_802ACF0: @ 0x0802ACF0 - push {r4, r5, r6, r7, lr} - ldr r7, _0802AD34 @ =gCurTask - ldr r0, [r7] - ldrh r1, [r0, #6] - movs r0, #0xc0 - lsls r0, r0, #0x12 - adds r4, r1, r0 - ldrh r5, [r4, #0x10] - ldrh r6, [r4, #0x12] - ldr r1, _0802AD38 @ =gCamera - ldr r0, [r1] - subs r0, r5, r0 - strh r0, [r4, #0x10] - ldr r1, [r1, #4] - ldrh r0, [r4, #0x12] - subs r0, r0, r1 - strh r0, [r4, #0x12] - adds r0, r4, #0 - bl UpdateSpriteAnimation - cmp r0, #0 - bne _0802AD40 - adds r0, r4, #0 - bl DisplaySprite - ldr r0, _0802AD3C @ =gStageData - adds r0, #0xb5 - ldrb r1, [r0] - subs r1, #1 - strb r1, [r0] - ldr r0, [r7] - bl TaskDestroy - b _0802AD4A - .align 2, 0 -_0802AD34: .4byte gCurTask -_0802AD38: .4byte gCamera -_0802AD3C: .4byte gStageData -_0802AD40: - adds r0, r4, #0 - bl DisplaySprite - strh r5, [r4, #0x10] - strh r6, [r4, #0x12] -_0802AD4A: - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - - thumb_func_start TaskDestructor_RingsMgr -TaskDestructor_RingsMgr: @ 0x0802AD50 - push {lr} - ldrh r0, [r0, #6] - movs r1, #0xc0 - lsls r1, r1, #0x12 - adds r0, r0, r1 - ldr r0, [r0, #0x28] - bl EwramFree - pop {r0} - bx r0 diff --git a/asm/non_matching/game/shared/rm__Task_RingsMgrStage.inc b/asm/non_matching/game/shared/rm__Task_RingsMgrStage.inc new file mode 100644 index 000000000..ad37118bd --- /dev/null +++ b/asm/non_matching/game/shared/rm__Task_RingsMgrStage.inc @@ -0,0 +1,1201 @@ + +.syntax unified +.text + push {r4, r5, r6, r7, lr} + mov r7, sl + mov r6, sb + mov r5, r8 + push {r5, r6, r7} + sub sp, #0x4c + ldr r0, _08029E2C @ =gCurTask + ldr r0, [r0] + ldrh r1, [r0, #6] + movs r0, #0xc0 + lsls r0, r0, #0x12 + adds r1, r1, r0 + str r1, [sp, #4] + ldr r0, [r1, #0x28] + str r0, [sp, #8] + movs r1, #0 + str r1, [sp, #0x18] + ldr r0, [sp, #4] + bl UpdateSpriteAnimation + ldr r3, [sp, #4] + ldr r2, [r3, #4] + lsrs r0, r2, #0x1c + cmp r0, #0 + bne _08029E34 + ldr r0, _08029E30 @ =gRefSpriteTables + ldr r0, [r0] + ldrh r1, [r3, #0xc] + ldr r0, [r0, #4] + lsls r1, r1, #2 + adds r1, r1, r0 + lsls r0, r2, #1 + adds r0, r0, r2 + lsls r0, r0, #2 + ldr r1, [r1] + adds r1, r1, r0 + str r1, [sp, #0xc] + b _08029E4A + .align 2, 0 +_08029E2C: .4byte gCurTask +_08029E30: .4byte gRefSpriteTables +_08029E34: + ldr r0, _08029E80 @ =gRefSpriteTables + ldr r1, [r0] + ldr r4, [sp, #4] + ldrh r0, [r4, #0xc] + ldr r1, [r1, #4] + lsls r0, r0, #2 + adds r0, r0, r1 + lsls r1, r2, #4 + ldr r0, [r0] + adds r0, r0, r1 + str r0, [sp, #0xc] +_08029E4A: + ldr r6, [sp, #8] + adds r6, #4 + ldm r6!, {r0} + lsls r0, r0, #0x10 + lsrs r0, r0, #0x10 + str r0, [sp, #0x10] + ldm r6!, {r0} + str r6, [sp, #8] + lsls r0, r0, #0x10 + lsrs r0, r0, #0x10 + str r0, [sp, #0x14] + ldr r0, _08029E84 @ =gStageData + ldrb r0, [r0, #3] + cmp r0, #5 + bls _08029E6A + b _0802A2BC +_08029E6A: + movs r0, #0 + str r0, [sp, #0x1c] + mov r1, sp + str r1, [sp, #0x20] +_08029E72: + ldr r2, [sp, #0x1c] + cmp r2, #0 + bne _08029E88 + ldr r0, _08029E84 @ =gStageData + ldrb r1, [r0, #6] + b _08029E92 + .align 2, 0 +_08029E80: .4byte gRefSpriteTables +_08029E84: .4byte gStageData +_08029E88: + mov r0, sb + adds r0, #0x2b + ldrb r1, [r0] + lsls r1, r1, #0x1e + lsrs r1, r1, #0x1e +_08029E92: + lsls r0, r1, #2 + adds r0, r0, r1 + lsls r0, r0, #2 + adds r0, r0, r1 + lsls r0, r0, #4 + ldr r1, _08029FB0 @ =gPlayers + adds r0, r0, r1 + mov sb, r0 + adds r4, r1, #0 + mov r3, sb + ldr r0, [r3, #4] + movs r3, #0x80 + lsls r3, r3, #1 + ands r0, r3 + cmp r0, #0 + beq _08029EB4 + b _0802A292 +_08029EB4: + mov r6, sb + movs r1, #0x30 + ldrsh r0, [r6, r1] + cmp r0, #0x66 + bne _08029EC0 + b _0802A292 +_08029EC0: + mov r0, sb + adds r0, #0x48 + movs r2, #0 + ldrsh r0, [r0, r2] + cmp r0, #0 + beq _08029ECE + b _0802A292 +_08029ECE: + mov r1, sb + adds r1, #0x2b + ldrb r2, [r1] + movs r0, #0x1c + ands r0, r2 + str r1, [sp, #0x44] + cmp r0, #8 + bne _08029EFA + lsls r1, r2, #0x1e + lsrs r1, r1, #0x1e + lsls r0, r1, #2 + adds r0, r0, r1 + lsls r0, r0, #2 + adds r0, r0, r1 + lsls r0, r0, #4 + adds r1, r4, #4 + adds r0, r0, r1 + ldr r0, [r0] + ands r0, r3 + cmp r0, #0 + beq _08029EFA + b _0802A292 +_08029EFA: + mov r1, sb + adds r1, #0x24 + ldrb r0, [r1] + rsbs r0, r0, #0 + ldr r3, [sp, #0x20] + strb r0, [r3] + mov r2, sb + adds r2, #0x25 + ldrb r0, [r2] + rsbs r0, r0, #0 + strb r0, [r3, #1] + ldrb r0, [r1] + strb r0, [r3, #2] + ldrb r0, [r2] + strb r0, [r3, #3] + mov r4, sb + ldr r1, [r4, #0x14] + asrs r1, r1, #8 + movs r0, #1 + ldrsb r0, [r3, r0] + adds r0, r1, r0 + lsls r0, r0, #8 + lsrs r0, r0, #0x10 + mov sl, r0 + movs r0, #3 + ldrsb r0, [r3, r0] + adds r0, r0, r1 + adds r0, #8 + asrs r0, r0, #8 + cmp sl, r0 + ble _08029F3A + b _0802A098 +_08029F3A: + ldr r6, [sp, #0x14] + cmp sl, r6 + blo _08029F42 + b _0802A098 +_08029F42: + mov r0, sp + str r0, [sp, #0x24] +_08029F46: + mov r1, sb + ldr r2, [r1, #0x10] + asrs r1, r2, #8 + ldr r3, [sp, #0x24] + movs r0, #0 + ldrsb r0, [r3, r0] + adds r0, r1, r0 + subs r0, #8 + lsls r0, r0, #8 + lsrs r0, r0, #0x10 + mov r8, r0 + movs r0, #2 + ldrsb r0, [r3, r0] + adds r0, r0, r1 + adds r0, #0x10 + asrs r0, r0, #8 + mov r4, sb + ldr r3, [r4, #0x14] + mov r6, sl + adds r6, #1 + str r6, [sp, #0x3c] + cmp r8, r0 + ble _08029F76 + b _0802A076 +_08029F76: + ldr r0, [sp, #0x10] + cmp r8, r0 + blo _08029F7E + b _0802A076 +_08029F7E: + ldr r1, [sp, #0x10] + mov r0, sl + muls r0, r1, r0 + mov r4, r8 + lsls r1, r4, #2 + lsls r0, r0, #2 + ldr r6, [sp, #8] + adds r0, r0, r6 + adds r1, r1, r0 + ldr r0, [r1] + adds r4, #1 + str r4, [sp, #0x38] + cmp r0, #0 + beq _0802A054 + subs r0, #8 + adds r5, r6, r0 + ldrb r1, [r5] + adds r0, r1, #0 + cmp r0, #0xff + beq _0802A054 + mov r4, sp +_08029FA8: + cmp r1, #0xfe + bne _08029FB4 + adds r5, #2 + b _0802A04C + .align 2, 0 +_08029FB0: .4byte gPlayers +_08029FB4: + ldrb r1, [r5] + lsls r1, r1, #3 + mov r2, r8 + lsls r0, r2, #8 + adds r7, r1, r0 + ldrb r1, [r5, #1] + lsls r1, r1, #3 + mov r3, sl + lsls r0, r3, #8 + adds r6, r1, r0 + adds r2, r7, #0 + subs r2, #8 + mov r1, sb + ldr r0, [r1, #0x10] + asrs r0, r0, #8 + movs r3, #0 + ldrsb r3, [r4, r3] + adds r1, r0, r3 + cmp r2, r1 + bgt _08029FE8 + adds r0, r7, #0 + adds r0, #8 + cmp r0, r1 + bge _08029FF4 + cmp r2, r1 + blt _0802A044 +_08029FE8: + movs r0, #2 + ldrsb r0, [r4, r0] + subs r0, r0, r3 + adds r0, r1, r0 + cmp r0, r2 + blt _0802A044 +_08029FF4: + adds r2, r6, #0 + subs r2, #0x10 + mov r3, sb + ldr r0, [r3, #0x14] + asrs r0, r0, #8 + movs r3, #1 + ldrsb r3, [r4, r3] + adds r1, r0, r3 + cmp r2, r1 + bgt _0802A010 + cmp r6, r1 + bge _0802A01C + cmp r2, r1 + blt _0802A044 +_0802A010: + movs r0, #3 + ldrsb r0, [r4, r0] + subs r0, r0, r3 + adds r0, r1, r0 + cmp r0, r2 + blt _0802A044 +_0802A01C: + ldr r0, [sp, #0x1c] + cmp r0, #0 + beq _0802A02E + ldr r2, [sp, #0x44] + ldrb r1, [r2] + movs r0, #0x1c + ands r0, r1 + cmp r0, #8 + bne _0802A034 +_0802A02E: + movs r0, #1 + bl AddRings +_0802A034: + lsls r0, r7, #0x10 + asrs r0, r0, #0x10 + lsls r1, r6, #0x10 + asrs r1, r1, #0x10 + bl CreateCollectRingEffect + movs r0, #0xfe + strb r0, [r5] +_0802A044: + adds r5, #2 + mov r6, sb + ldr r3, [r6, #0x14] + ldr r2, [r6, #0x10] +_0802A04C: + ldrb r1, [r5] + adds r0, r1, #0 + cmp r0, #0xff + bne _08029FA8 +_0802A054: + ldr r1, [sp, #0x38] + lsls r0, r1, #0x10 + lsrs r0, r0, #0x10 + mov r8, r0 + asrs r1, r2, #8 + ldr r4, [sp, #0x24] + movs r0, #2 + ldrsb r0, [r4, r0] + adds r0, r0, r1 + adds r0, #0x10 + asrs r0, r0, #8 + cmp r8, r0 + bgt _0802A076 + ldr r6, [sp, #0x10] + cmp r8, r6 + bhs _0802A076 + b _08029F7E +_0802A076: + ldr r1, [sp, #0x3c] + lsls r0, r1, #0x10 + lsrs r0, r0, #0x10 + mov sl, r0 + asrs r1, r3, #8 + ldr r2, [sp, #0x24] + movs r0, #3 + ldrsb r0, [r2, r0] + adds r0, r0, r1 + adds r0, #8 + asrs r0, r0, #8 + cmp sl, r0 + bgt _0802A098 + ldr r3, [sp, #0x14] + cmp sl, r3 + bhs _0802A098 + b _08029F46 +_0802A098: + ldr r3, _0802A108 @ =gCamera + ldr r2, [r3, #4] + lsls r0, r2, #8 + lsrs r0, r0, #0x10 + mov sl, r0 + movs r0, #0x9e + lsls r0, r0, #1 + add r0, sb + ldrb r1, [r0] + movs r0, #0x20 + ands r0, r1 + cmp r0, #0 + bne _0802A0B4 + b _0802A292 +_0802A0B4: + mov r4, sl + lsls r1, r4, #8 + adds r0, r2, #0 + adds r0, #0xa0 + cmp r1, r0 + blt _0802A0C2 + b _0802A292 +_0802A0C2: + ldr r6, [sp, #0x14] + cmp sl, r6 + blo _0802A0CA + b _0802A292 +_0802A0CA: + ldr r0, [r3] + lsls r1, r0, #8 + lsrs r1, r1, #0x10 + mov r8, r1 + lsls r1, r1, #8 + adds r0, #0xf0 + cmp r1, r0 + blt _0802A0DC + b _0802A274 +_0802A0DC: + ldr r0, [sp, #0x10] + mov r2, sl + muls r2, r0, r2 + mov r3, r8 + lsls r1, r3, #2 + lsls r0, r2, #2 + ldr r4, [sp, #8] + adds r0, r0, r4 + adds r1, r1, r0 + ldr r0, [r1] + str r2, [sp, #0x34] + ldr r6, [sp, #0x10] + cmp r8, r6 + blo _0802A0FA + b _0802A274 +_0802A0FA: + cmp r0, #0 + bne _0802A100 + b _0802A246 +_0802A100: + subs r0, #8 + ldr r1, [sp, #8] + adds r5, r1, r0 + b _0802A23C + .align 2, 0 +_0802A108: .4byte gCamera +_0802A10C: + cmp r1, #0xfe + beq _0802A180 + ldrb r1, [r5] + lsls r1, r1, #3 + mov r2, r8 + lsls r0, r2, #8 + adds r7, r1, r0 + ldrb r1, [r5, #1] + lsls r1, r1, #3 + mov r3, sl + lsls r0, r3, #8 + adds r6, r1, r0 + ldr r4, _0802A184 @ =gCamera + ldr r0, [r4] + subs r0, r7, r0 + adds r0, #8 + movs r1, #0x80 + lsls r1, r1, #1 + cmp r0, r1 + bhi _0802A180 + ldr r0, [r4, #4] + subs r0, r6, r0 + cmp r0, #0 + blt _0802A180 + subs r0, #0x10 + cmp r0, #0xa0 + bgt _0802A180 + adds r1, r7, #0 + subs r1, #0x40 + mov r2, sb + ldr r0, [r2, #0x10] + asrs r2, r0, #8 + cmp r1, r2 + bgt _0802A188 + adds r0, r7, #0 + adds r0, #0x40 + cmp r0, r2 + blt _0802A188 + adds r1, r6, #0 + subs r1, #0x48 + mov r3, sb + ldr r0, [r3, #0x14] + asrs r2, r0, #8 + cmp r1, r2 + bgt _0802A188 + adds r0, r6, #0 + adds r0, #0x38 + cmp r0, r2 + blt _0802A188 + lsls r0, r7, #0x10 + asrs r0, r0, #0x10 + lsls r1, r6, #0x10 + asrs r1, r1, #0x10 + mov r2, sb + bl sub_802AB10 + movs r0, #0xfe + strb r0, [r5] +_0802A180: + adds r5, #2 + b _0802A23C + .align 2, 0 +_0802A184: .4byte gCamera +_0802A188: + adds r5, #2 + ldr r4, [sp, #4] + ldrb r1, [r4, #0x1d] + ldr r0, [sp, #0x18] + cmp r0, #0 + beq _0802A19A + adds r0, r1, #0 + cmp r0, #0xff + bne _0802A1BC +_0802A19A: + movs r0, #0xff + ldr r1, [sp, #4] + strb r0, [r1, #0x1d] + ldr r2, _0802A1B8 @ =gCamera + ldr r0, [r2] + subs r0, r7, r0 + strh r0, [r1, #0x10] + ldr r0, [r2, #4] + subs r0, r6, r0 + strh r0, [r1, #0x12] + ldr r0, [sp, #4] + bl DisplaySprite + b _0802A232 + .align 2, 0 +_0802A1B8: .4byte gCamera +_0802A1BC: + ldr r3, [sp, #4] + ldrb r1, [r3, #0x1d] + lsls r1, r1, #3 + ldr r0, _0802A2A4 @ =gOamMallocBuffer + adds r2, r1, r0 + ldrh r0, [r3, #0x14] + movs r4, #0xf8 + lsls r4, r4, #3 + adds r1, r4, #0 + ands r0, r1 + lsrs r0, r0, #6 + str r2, [sp, #0x48] + bl OamMalloc + adds r4, r0, #0 + ldr r0, _0802A2A8 @ =iwram_end + ldr r0, [r0] + ldr r2, [sp, #0x48] + cmp r0, r4 + bne _0802A1E6 + b _0802A69C +_0802A1E6: + ldr r1, _0802A2AC @ =0x040000D4 + str r2, [r1] + str r4, [r1, #4] + ldr r0, _0802A2B0 @ =0x80000003 + str r0, [r1, #8] + ldr r0, [r1, #8] + ldrh r3, [r4, #2] + movs r1, #0xfe + lsls r1, r1, #8 + adds r0, r1, #0 + ands r3, r0 + strh r3, [r4, #2] + ldrh r2, [r4] + movs r1, #0xff + lsls r1, r1, #8 + adds r0, r1, #0 + ands r2, r0 + strh r2, [r4] + ldr r1, _0802A2B4 @ =gCamera + ldr r0, [r1, #4] + subs r0, r6, r0 + ldr r6, [sp, #0xc] + ldrh r1, [r6, #0xa] + subs r0, r0, r1 + movs r1, #0xff + ands r0, r1 + adds r2, r2, r0 + strh r2, [r4] + ldr r1, _0802A2B4 @ =gCamera + ldr r0, [r1] + subs r0, r7, r0 + ldrh r1, [r6, #8] + subs r0, r0, r1 + ldr r2, _0802A2B8 @ =0x000001FF + adds r1, r2, #0 + ands r0, r1 + adds r3, r3, r0 + strh r3, [r4, #2] +_0802A232: + ldr r0, [sp, #0x18] + adds r0, #1 + lsls r0, r0, #0x18 + lsrs r0, r0, #0x18 + str r0, [sp, #0x18] +_0802A23C: + ldrb r1, [r5] + adds r0, r1, #0 + cmp r0, #0xff + beq _0802A246 + b _0802A10C +_0802A246: + mov r0, r8 + adds r0, #1 + lsls r0, r0, #0x10 + lsrs r0, r0, #0x10 + mov r8, r0 + lsls r1, r0, #8 + ldr r3, _0802A2B4 @ =gCamera + ldr r0, [r3] + adds r0, #0xf0 + cmp r1, r0 + bge _0802A274 + mov r4, r8 + lsls r1, r4, #2 + ldr r6, [sp, #0x34] + lsls r0, r6, #2 + ldr r2, [sp, #8] + adds r0, r0, r2 + adds r1, r1, r0 + ldr r0, [r1] + ldr r3, [sp, #0x10] + cmp r8, r3 + bhs _0802A274 + b _0802A0FA +_0802A274: + mov r0, sl + adds r0, #1 + lsls r0, r0, #0x10 + lsrs r0, r0, #0x10 + mov sl, r0 + lsls r1, r0, #8 + ldr r3, _0802A2B4 @ =gCamera + ldr r0, [r3, #4] + adds r0, #0xa0 + cmp r1, r0 + bge _0802A292 + ldr r4, [sp, #0x14] + cmp sl, r4 + bhs _0802A292 + b _0802A0CA +_0802A292: + ldr r0, [sp, #0x1c] + adds r0, #1 + lsls r0, r0, #0x18 + lsrs r0, r0, #0x18 + str r0, [sp, #0x1c] + cmp r0, #1 + bhi _0802A2A2 + b _08029E72 +_0802A2A2: + b _0802A514 + .align 2, 0 +_0802A2A4: .4byte gOamMallocBuffer +_0802A2A8: .4byte iwram_end +_0802A2AC: .4byte 0x040000D4 +_0802A2B0: .4byte 0x80000003 +_0802A2B4: .4byte gCamera +_0802A2B8: .4byte 0x000001FF +_0802A2BC: + movs r6, #0 + str r6, [sp, #0x1c] + mov r0, sp + str r0, [sp, #0x2c] +_0802A2C4: + movs r1, #0 + str r1, [sp, #0x28] + ldr r2, [sp, #0x1c] + lsls r0, r2, #2 + adds r0, r0, r2 + lsls r0, r0, #2 + adds r0, r0, r2 + lsls r0, r0, #4 + ldr r3, _0802A3C8 @ =gPlayers + adds r0, r0, r3 + mov sb, r0 + adds r0, #0x2b + ldrb r0, [r0] + movs r1, #0x1c + ands r1, r0 + adds r2, #1 + str r2, [sp, #0x40] + cmp r1, #0x14 + bne _0802A2EC + b _0802A506 +_0802A2EC: + cmp r1, #8 + bne _0802A2F2 + b _0802A506 +_0802A2F2: + ldr r0, _0802A3CC @ =gStageData + ldrb r1, [r0, #6] + lsls r0, r1, #2 + adds r0, r0, r1 + lsls r0, r0, #2 + adds r0, r0, r1 + lsls r0, r0, #4 + adds r0, r0, r3 + cmp sb, r0 + beq _0802A31E + adds r0, #0x2b + ldrb r1, [r0] + lsls r1, r1, #0x1e + lsrs r1, r1, #0x1e + lsls r0, r1, #2 + adds r0, r0, r1 + lsls r0, r0, #2 + adds r0, r0, r1 + lsls r0, r0, #4 + adds r0, r0, r3 + cmp sb, r0 + bne _0802A322 +_0802A31E: + movs r4, #1 + str r4, [sp, #0x28] +_0802A322: + mov r6, sb + ldr r1, [r6, #4] + movs r0, #0x80 + lsls r0, r0, #1 + ands r1, r0 + ldr r0, [sp, #0x1c] + adds r0, #1 + str r0, [sp, #0x40] + cmp r1, #0 + beq _0802A338 + b _0802A506 +_0802A338: + movs r1, #0x30 + ldrsh r0, [r6, r1] + cmp r0, #0x66 + bne _0802A342 + b _0802A506 +_0802A342: + mov r0, sb + adds r0, #0x48 + movs r2, #0 + ldrsh r0, [r0, r2] + cmp r0, #0 + beq _0802A350 + b _0802A506 +_0802A350: + mov r1, sb + adds r1, #0x24 + ldrb r0, [r1] + rsbs r0, r0, #0 + ldr r3, [sp, #0x2c] + strb r0, [r3] + mov r2, sb + adds r2, #0x25 + ldrb r0, [r2] + rsbs r0, r0, #0 + strb r0, [r3, #1] + ldrb r0, [r1] + strb r0, [r3, #2] + ldrb r0, [r2] + strb r0, [r3, #3] + ldr r1, [r6, #0x14] + asrs r1, r1, #8 + movs r0, #1 + ldrsb r0, [r3, r0] + adds r0, r1, r0 + lsls r0, r0, #8 + lsrs r0, r0, #0x10 + mov sl, r0 + movs r0, #3 + ldrsb r0, [r3, r0] + adds r0, r0, r1 + adds r0, #8 + asrs r0, r0, #8 + cmp sl, r0 + ble _0802A38E + b _0802A506 +_0802A38E: + ldr r4, [sp, #0x14] + cmp sl, r4 + blo _0802A396 + b _0802A506 +_0802A396: + mov r6, sp + str r6, [sp, #0x30] +_0802A39A: + mov r0, sb + ldr r2, [r0, #0x10] + asrs r1, r2, #8 + ldr r3, [sp, #0x30] + movs r0, #0 + ldrsb r0, [r3, r0] + adds r0, r1, r0 + subs r0, #8 + lsls r0, r0, #8 + lsrs r0, r0, #0x10 + mov r8, r0 + movs r0, #2 + ldrsb r0, [r3, r0] + adds r0, r0, r1 + adds r0, #0x10 + asrs r0, r0, #8 + mov r4, sb + ldr r3, [r4, #0x14] + mov r6, sl + adds r6, #1 + str r6, [sp, #0x3c] + b _0802A4D8 + .align 2, 0 +_0802A3C8: .4byte gPlayers +_0802A3CC: .4byte gStageData +_0802A3D0: + ldr r1, [sp, #0x10] + mov r0, sl + muls r0, r1, r0 + mov r4, r8 + lsls r1, r4, #2 + lsls r0, r0, #2 + ldr r6, [sp, #8] + adds r0, r0, r6 + adds r1, r1, r0 + ldr r0, [r1] + adds r4, #1 + str r4, [sp, #0x38] + cmp r0, #0 + beq _0802A4C2 + subs r0, #8 + adds r5, r6, r0 + ldrb r1, [r5] + adds r0, r1, #0 + cmp r0, #0xff + beq _0802A4C2 + mov r4, sp +_0802A3FA: + cmp r1, #0xfe + bne _0802A402 + adds r5, #2 + b _0802A4BA +_0802A402: + ldrb r1, [r5] + lsls r1, r1, #3 + mov r2, r8 + lsls r0, r2, #8 + adds r7, r1, r0 + ldrb r1, [r5, #1] + lsls r1, r1, #3 + mov r3, sl + lsls r0, r3, #8 + adds r6, r1, r0 + adds r2, r7, #0 + subs r2, #8 + mov r1, sb + ldr r0, [r1, #0x10] + asrs r0, r0, #8 + movs r3, #0 + ldrsb r3, [r4, r3] + adds r1, r0, r3 + cmp r2, r1 + bgt _0802A436 + adds r0, r7, #0 + adds r0, #8 + cmp r0, r1 + bge _0802A442 + cmp r2, r1 + blt _0802A4B2 +_0802A436: + movs r0, #2 + ldrsb r0, [r4, r0] + subs r0, r0, r3 + adds r0, r1, r0 + cmp r0, r2 + blt _0802A4B2 +_0802A442: + adds r2, r6, #0 + subs r2, #0x10 + mov r3, sb + ldr r0, [r3, #0x14] + asrs r0, r0, #8 + movs r3, #1 + ldrsb r3, [r4, r3] + adds r1, r0, r3 + cmp r2, r1 + bgt _0802A45E + cmp r6, r1 + bge _0802A46A + cmp r2, r1 + blt _0802A4B2 +_0802A45E: + movs r0, #3 + ldrsb r0, [r4, r0] + subs r0, r0, r3 + adds r0, r1, r0 + cmp r0, r2 + blt _0802A4B2 +_0802A46A: + ldr r0, [sp, #0x28] + cmp r0, #0 + beq _0802A4A2 + ldr r0, _0802A490 @ =gStageData + ldrb r0, [r0, #6] + ldr r1, [sp, #0x1c] + cmp r0, r1 + bne _0802A494 + movs r0, #1 + bl AddRings + lsls r0, r7, #0x10 + asrs r0, r0, #0x10 + lsls r1, r6, #0x10 + asrs r1, r1, #0x10 + bl CreateCollectRingEffect + b _0802A4AE + .align 2, 0 +_0802A490: .4byte gStageData +_0802A494: + lsls r0, r7, #0x10 + asrs r0, r0, #0x10 + lsls r1, r6, #0x10 + asrs r1, r1, #0x10 + bl CreateCollectRingEffectNoSfx + b _0802A4AE +_0802A4A2: + lsls r0, r7, #0x10 + asrs r0, r0, #0x10 + lsls r1, r6, #0x10 + asrs r1, r1, #0x10 + bl CreateCollectRingEffectNoSfx +_0802A4AE: + movs r0, #0xfe + strb r0, [r5] +_0802A4B2: + adds r5, #2 + mov r2, sb + ldr r3, [r2, #0x14] + ldr r2, [r2, #0x10] +_0802A4BA: + ldrb r1, [r5] + adds r0, r1, #0 + cmp r0, #0xff + bne _0802A3FA +_0802A4C2: + ldr r4, [sp, #0x38] + lsls r0, r4, #0x10 + lsrs r0, r0, #0x10 + mov r8, r0 + asrs r1, r2, #8 + ldr r6, [sp, #0x30] + movs r0, #2 + ldrsb r0, [r6, r0] + adds r0, r0, r1 + adds r0, #0x10 + asrs r0, r0, #8 +_0802A4D8: + cmp r8, r0 + bgt _0802A4E4 + ldr r0, [sp, #0x10] + cmp r8, r0 + bhs _0802A4E4 + b _0802A3D0 +_0802A4E4: + ldr r1, [sp, #0x3c] + lsls r0, r1, #0x10 + lsrs r0, r0, #0x10 + mov sl, r0 + asrs r1, r3, #8 + ldr r2, [sp, #0x30] + movs r0, #3 + ldrsb r0, [r2, r0] + adds r0, r0, r1 + adds r0, #8 + asrs r0, r0, #8 + cmp sl, r0 + bgt _0802A506 + ldr r3, [sp, #0x14] + cmp sl, r3 + bhs _0802A506 + b _0802A39A +_0802A506: + ldr r4, [sp, #0x40] + lsls r0, r4, #0x18 + lsrs r0, r0, #0x18 + str r0, [sp, #0x1c] + cmp r0, #3 + bhi _0802A514 + b _0802A2C4 +_0802A514: + ldr r2, _0802A524 @ =gCamera + ldr r0, [r2, #4] + lsls r1, r0, #8 + lsrs r1, r1, #0x10 + mov sl, r1 + lsls r1, r1, #8 + b _0802A68E + .align 2, 0 +_0802A524: .4byte gCamera +_0802A528: + ldr r0, [r2] + lsls r1, r0, #8 + lsrs r1, r1, #0x10 + mov r8, r1 + lsls r1, r1, #8 + adds r0, #0xf0 + cmp r1, r0 + blt _0802A53A + b _0802A67E +_0802A53A: + ldr r0, [sp, #0x10] + cmp r8, r0 + blo _0802A542 + b _0802A67E +_0802A542: + ldr r1, [sp, #0x10] + mov r0, sl + muls r0, r1, r0 + mov r2, r8 + lsls r1, r2, #2 + lsls r0, r0, #2 + ldr r3, [sp, #8] + adds r0, r0, r3 + adds r1, r1, r0 + ldr r0, [r1] + cmp r0, #0 + bne _0802A55C + b _0802A660 +_0802A55C: + subs r0, #8 + adds r5, r3, r0 + b _0802A656 +_0802A562: + cmp r1, #0xfe + beq _0802A59A + ldrb r1, [r5] + lsls r1, r1, #3 + mov r4, r8 + lsls r0, r4, #8 + adds r7, r1, r0 + ldrb r1, [r5, #1] + lsls r1, r1, #3 + mov r6, sl + lsls r0, r6, #8 + adds r6, r1, r0 + ldr r1, _0802A5A0 @ =gCamera + ldr r0, [r1] + subs r0, r7, r0 + adds r0, #8 + movs r1, #0x80 + lsls r1, r1, #1 + cmp r0, r1 + bhi _0802A59A + ldr r2, _0802A5A0 @ =gCamera + ldr r0, [r2, #4] + subs r0, r6, r0 + cmp r0, #0 + blt _0802A59A + subs r0, #0x10 + cmp r0, #0xa0 + ble _0802A5A4 +_0802A59A: + adds r5, #2 + b _0802A656 + .align 2, 0 +_0802A5A0: .4byte gCamera +_0802A5A4: + adds r5, #2 + ldr r3, [sp, #4] + ldrb r1, [r3, #0x1d] + ldr r4, [sp, #0x18] + cmp r4, #0 + beq _0802A5B6 + adds r0, r1, #0 + cmp r0, #0xff + bne _0802A5D8 +_0802A5B6: + movs r0, #0xff + ldr r1, [sp, #4] + strb r0, [r1, #0x1d] + ldr r2, _0802A5D4 @ =gCamera + ldr r0, [r2] + subs r0, r7, r0 + strh r0, [r1, #0x10] + ldr r0, [r2, #4] + subs r0, r6, r0 + strh r0, [r1, #0x12] + ldr r0, [sp, #4] + bl DisplaySprite + b _0802A64C + .align 2, 0 +_0802A5D4: .4byte gCamera +_0802A5D8: + ldr r3, [sp, #4] + ldrb r1, [r3, #0x1d] + lsls r1, r1, #3 + ldr r0, _0802A6AC @ =gOamMallocBuffer + adds r2, r1, r0 + ldrh r0, [r3, #0x14] + movs r4, #0xf8 + lsls r4, r4, #3 + adds r1, r4, #0 + ands r0, r1 + lsrs r0, r0, #6 + str r2, [sp, #0x48] + bl OamMalloc + adds r4, r0, #0 + ldr r0, _0802A6B0 @ =iwram_end + ldr r0, [r0] + ldr r2, [sp, #0x48] + cmp r0, r4 + beq _0802A69C + ldr r1, _0802A6B4 @ =0x040000D4 + str r2, [r1] + str r4, [r1, #4] + ldr r0, _0802A6B8 @ =0x80000003 + str r0, [r1, #8] + ldr r0, [r1, #8] + ldrh r3, [r4, #2] + movs r1, #0xfe + lsls r1, r1, #8 + adds r0, r1, #0 + ands r3, r0 + strh r3, [r4, #2] + ldrh r2, [r4] + movs r1, #0xff + lsls r1, r1, #8 + adds r0, r1, #0 + ands r2, r0 + strh r2, [r4] + ldr r1, _0802A6BC @ =gCamera + ldr r0, [r1, #4] + subs r0, r6, r0 + ldr r6, [sp, #0xc] + ldrh r1, [r6, #0xa] + subs r0, r0, r1 + movs r1, #0xff + ands r0, r1 + adds r2, r2, r0 + strh r2, [r4] + ldr r1, _0802A6BC @ =gCamera + ldr r0, [r1] + subs r0, r7, r0 + ldrh r1, [r6, #8] + subs r0, r0, r1 + ldr r2, _0802A6C0 @ =0x000001FF + adds r1, r2, #0 + ands r0, r1 + adds r3, r3, r0 + strh r3, [r4, #2] +_0802A64C: + ldr r0, [sp, #0x18] + adds r0, #1 + lsls r0, r0, #0x18 + lsrs r0, r0, #0x18 + str r0, [sp, #0x18] +_0802A656: + ldrb r1, [r5] + adds r0, r1, #0 + cmp r0, #0xff + beq _0802A660 + b _0802A562 +_0802A660: + mov r0, r8 + adds r0, #1 + lsls r0, r0, #0x10 + lsrs r0, r0, #0x10 + mov r8, r0 + lsls r1, r0, #8 + ldr r3, _0802A6BC @ =gCamera + ldr r0, [r3] + adds r0, #0xf0 + cmp r1, r0 + bge _0802A67E + ldr r4, [sp, #0x10] + cmp r8, r4 + bhs _0802A67E + b _0802A542 +_0802A67E: + mov r0, sl + adds r0, #1 + lsls r0, r0, #0x10 + lsrs r0, r0, #0x10 + mov sl, r0 + lsls r1, r0, #8 + ldr r2, _0802A6BC @ =gCamera + ldr r0, [r2, #4] +_0802A68E: + adds r0, #0xa0 + cmp r1, r0 + bge _0802A69C + ldr r6, [sp, #0x14] + cmp sl, r6 + bhs _0802A69C + b _0802A528 +_0802A69C: + add sp, #0x4c + pop {r3, r4, r5} + mov r8, r3 + mov sb, r4 + mov sl, r5 + pop {r4, r5, r6, r7} + pop {r0} + bx r0 + .align 2, 0 +_0802A6AC: .4byte gOamMallocBuffer +_0802A6B0: .4byte iwram_end +_0802A6B4: .4byte 0x040000D4 +_0802A6B8: .4byte 0x80000003 +_0802A6BC: .4byte gCamera +_0802A6C0: .4byte 0x000001FF + +.syntax divided diff --git a/include/game/sa1_sa2_shared/rings_manager.h b/include/game/sa1_sa2_shared/rings_manager.h index f0d2ed370..ce49ea5c1 100644 --- a/include/game/sa1_sa2_shared/rings_manager.h +++ b/include/game/sa1_sa2_shared/rings_manager.h @@ -35,6 +35,10 @@ extern const u8 *const gSpritePosData_rings[NUM_LEVEL_IDS]; +void AddRings(s32 count); void CreateStageRingsManager(void); +void CreateCollectRingEffect( + s32 param0, s32 param1); // NOTE: this *should* take s16 parameters, see comment inside CreateCollectRingEffect for more details! +void CreateCollectRingEffectNoSfx(s16 worldX, s16 worldY); #endif // GUARD_RINGS_MANAGER_H \ No newline at end of file diff --git a/include/module_unclear.h b/include/module_unclear.h index 026f8ae01..3c0bb1d26 100644 --- a/include/module_unclear.h +++ b/include/module_unclear.h @@ -126,7 +126,6 @@ typedef struct Strc3001CFC { extern struct Task *gTask_03001CFC; // -> Strc3001CFC s32 sub_8011BFC(u8, Player *p); -extern void CreateCollectRingEffect(s16 param0, s16 param1); // TODO: Move to correct module void sub_80533F4(u32 character); // related to Special Springs diff --git a/ldscript.txt b/ldscript.txt index a2c2526f7..c81edfc4b 100644 --- a/ldscript.txt +++ b/ldscript.txt @@ -27,7 +27,7 @@ SECTIONS { asm/game_over.o(.text); src/game/stage/player.o(.text); asm/code_0_2.o(.text); - asm/game__sa1_sa2_shared__rings_manager.o(.text); + src/game/sa1_sa2_shared/rings_manager.o(.text); asm/code_0_3.o(.text); asm/itembox.o(.text); src/game/interactables/zone_warp.o(.text); diff --git a/src/game/enemies/bu_bu.c b/src/game/enemies/bu_bu.c index 42561f38a..1405eeb2c 100644 --- a/src/game/enemies/bu_bu.c +++ b/src/game/enemies/bu_bu.c @@ -6,6 +6,7 @@ #include "game/camera.h" #include "game/entity.h" #include "game/enemy_unknown.h" +#include "game/sa1_sa2_shared/rings_manager.h" #include "module_unclear.h" #include "game/player.h" #include "game/stage.h" @@ -235,6 +236,7 @@ bool32 sub_805EEB4(BuBu *enemy) } if ((mat1 == 1) && (mat2 == 1)) { + // // NOTE: this *should* take s16 parameters, see comment inside CreateCollectRingEffect for more details! CreateCollectRingEffect(I(strc->unk28[i].unk0), I(strc->unk28[i].unk4)); } } diff --git a/src/game/sa1_sa2_shared/rings_manager.c b/src/game/sa1_sa2_shared/rings_manager.c index 938d4f424..33f970402 100644 --- a/src/game/sa1_sa2_shared/rings_manager.c +++ b/src/game/sa1_sa2_shared/rings_manager.c @@ -59,7 +59,6 @@ typedef struct RingsMgrUnk30 { TO_REGION(b + a + offset); \ }) -#if 0 void CreateStageRingsManager(void) { Task *t; @@ -135,14 +134,14 @@ void CreateCollectRingEffect(s32 inWorldX, s32 inWorldY) // NOTE: Needs to be like this for matching, because: // In enemy/bu_bu.c, CreateCollectRingEffect() gets called, // without casting down to s16 on the call-site. - // + // // But EVERYTHING points at CreateCollectRingEffect taking two s16 values, // so something must have gone wrong at the linking stage originally. // To remedy this, we cast input values of CreateCollectRingEffect() down everywhere in this module. // TODO: ^^^ Find a better solution for this, if possible! ^^^ s16 worldX = inWorldX; s16 worldY = inWorldY; - + RingsMgrUnk2C *strc; Sprite *s; s32 var_r0; @@ -247,7 +246,7 @@ NONMATCH("asm/non_matching/game/shared/rm__Task_RingsMgrStage.inc", void Task_Ri if ((GAME_MODE_IS_SINGLE_PLAYER(gStageData.gameMode) || (gStageData.gameMode == GAME_MODE_5))) { for (i = 0; i < NUM_SINGLE_PLAYER_CHARS; i++) { p = GET_SP_PLAYER_V0(i); - + if (!(p->moveState & MOVESTATE_100) && (p->charFlags.anim0 != 0x66) && (p->unk48 == 0)) { if ((p->charFlags.someIndex != 2) || !(gPlayers[p->charFlags.partnerIndex].moveState & MOVESTATE_100)) { rect[0] = -p->spriteOffsetX; @@ -280,7 +279,7 @@ NONMATCH("asm/non_matching/game/shared/rm__Task_RingsMgrStage.inc", void Task_Ri if ((i == 0) || (p->charFlags.someIndex == 2)) { AddRings(1); } - CreateCollectRingEffect(rx, ry); + CreateCollectRingEffect((s16)rx, (s16)ry); meRing->x = (u8)MAP_ENTITY_STATE_INITIALIZED; } @@ -302,11 +301,10 @@ NONMATCH("asm/non_matching/game/shared/rm__Task_RingsMgrStage.inc", void Task_Ri for (regionX = TO_REGION(gCamera.x); TO_WORLD_POS(0, regionX) < gCamera.x + DISPLAY_WIDTH; regionX++) { u32 offset = READ_START_INDEX(rings, h_regionCount, regionX, regionY); - if(regionX >= h_regionCount) - { + if (regionX >= h_regionCount) { break; } - + if (offset != 0) { meRing = DATA_START(rings) + offset; while (meRing->x != (u8)MAP_ENTITY_STATE_ARRAY_END) { @@ -318,9 +316,8 @@ NONMATCH("asm/non_matching/game/shared/rm__Task_RingsMgrStage.inc", void Task_Ri rx = TO_WORLD_POS(meRing->x, regionX); ry = TO_WORLD_POS(meRing->y, regionY); - if (rx - gCamera.x < -TILE_WIDTH - || (rx - gCamera.x) + TILE_WIDTH > DISPLAY_WIDTH + 2 * TILE_WIDTH || ry - gCamera.y < 0 - || (ry - gCamera.y) - 2 * TILE_WIDTH > DISPLAY_HEIGHT) { + if (rx - gCamera.x < -TILE_WIDTH || (rx - gCamera.x) + TILE_WIDTH > DISPLAY_WIDTH + 2 * TILE_WIDTH + || ry - gCamera.y < 0 || (ry - gCamera.y) - 2 * TILE_WIDTH > DISPLAY_HEIGHT) { meRing++; } else if ((((rx - 64) <= I(p->qWorldX)) && (rx + 64) >= I(p->qWorldX)) && (((ry - 72) <= I(p->qWorldY)) && ((ry + 56) >= I(p->qWorldY)))) { @@ -365,7 +362,6 @@ NONMATCH("asm/non_matching/game/shared/rm__Task_RingsMgrStage.inc", void Task_Ri } } } - } } else { for (i = 0; i < 4; i++) { @@ -404,12 +400,12 @@ NONMATCH("asm/non_matching/game/shared/rm__Task_RingsMgrStage.inc", void Task_Ri if (sp28 != 0) { if (gStageData.playerIndex == i) { AddRings(1); - CreateCollectRingEffect(rx, ry); + CreateCollectRingEffect((s16)rx, (s16)ry); } else { - CreateCollectRingEffectNoSfx(rx, ry); + CreateCollectRingEffectNoSfx((s16)rx, (s16)ry); } } else { - CreateCollectRingEffectNoSfx(rx, ry); + CreateCollectRingEffectNoSfx((s16)rx, (s16)ry); } meRing->x = (u8)MAP_ENTITY_STATE_INITIALIZED; } @@ -601,7 +597,7 @@ void Task_RingsMgrExtraZone(void) } #endif // (GAME == GAME_SA3) - CreateCollectRingEffect(rx, ry); + CreateCollectRingEffect((s16)rx, (s16)ry); meRing->x = (u8)MAP_ENTITY_STATE_INITIALIZED; } } @@ -774,4 +770,3 @@ void TaskDestructor_RingsMgr(Task *t) RingsManager *mgr = TASK_DATA(t); EwramFree(mgr->ringPositions); } -#endif From a29a0f42af938a23f07bede94d2f1ecf462bebd7 Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Mon, 6 Apr 2026 00:48:12 +0200 Subject: [PATCH 13/17] Document 1st Zone on gSpritePosData_rings table --- asm/game__sa1_sa2_shared__rings_manager.s | 0 data/data.s | 82 ++++++++++++++++++++++- data/gfx_data_0.s | 35 +++++++++- src/game/sa1_sa2_shared/rings_manager.c | 16 ++--- src/platform/shared/stub.c | 2 +- 5 files changed, 122 insertions(+), 13 deletions(-) delete mode 100644 asm/game__sa1_sa2_shared__rings_manager.s diff --git a/asm/game__sa1_sa2_shared__rings_manager.s b/asm/game__sa1_sa2_shared__rings_manager.s deleted file mode 100644 index e69de29bb..000000000 diff --git a/data/data.s b/data/data.s index 06d306e82..57ada924b 100644 --- a/data/data.s +++ b/data/data.s @@ -253,9 +253,85 @@ gUnknown_080CEF50: .incbin "baserom_sa3.gba", 0x000CEF50, 0x8 @ ring positions - .global gUnknown_080CEF58 -gUnknown_080CEF58: - .incbin "baserom_sa3.gba", 0x000CEF58, 73*4 @ size = * + .global gSpritePosData_rings +gSpritePosData_rings: +.if 01 +mPtr NULL @ Zone 1 +mPtr zone1_sonic_factory_rings +mPtr zone1_hub_rings +mPtr zone1_act1_rings +mPtr zone1_act2_rings +mPtr zone1_act3_rings +mPtr NULL @act4 +mPtr zone1_boss_rings +mPtr zone1_bonus_capsule_rings +mPtr zone1_bonus_enemies_rings +.else +mPtr NULL @ Zone 2 +mPtr gUnknown_082C3618 +mPtr gUnknown_082BF0CC +mPtr gUnknown_082C0998 +mPtr gUnknown_082C2010 +mPtr gUnknown_082C32D4 +mPtr NULL +mPtr gUnknown_082D9DF0 +mPtr zone1_bonus_capsule_rings +mPtr gUnknown_082C378C +mPtr NULL @ Zone 3 +mPtr NULL +mPtr gUnknown_082C39B4 +mPtr gUnknown_082C4B50 +mPtr gUnknown_082C6398 +mPtr gUnknown_082C75CC +mPtr NULL +mPtr gUnknown_082D9E80 +mPtr zone1_bonus_capsule_rings +mPtr gUnknown_082C7A4C +mPtr NULL @ Zone 4 +mPtr NULL +mPtr gUnknown_082C7CA0 +mPtr gUnknown_082C885C +mPtr gUnknown_082C960C +mPtr gUnknown_082CA2FC +mPtr NULL +mPtr gUnknown_082D9F14 +mPtr zone1_bonus_capsule_rings +mPtr gUnknown_082CA758 +mPtr NULL @ Zone 5 +mPtr NULL +mPtr gUnknown_082CA9B0 +mPtr gUnknown_082CBA9C +mPtr gUnknown_082CD0C0 +mPtr gUnknown_082CE618 +mPtr NULL +mPtr gUnknown_082D9FB4 +mPtr zone1_bonus_capsule_rings +mPtr gUnknown_082CECAC +mPtr NULL @ Zone 6 +mPtr NULL +mPtr gUnknown_082CEFD0 +mPtr gUnknown_082D1B34 +mPtr gUnknown_082D3634 +mPtr gUnknown_082D48B4 +mPtr NULL +mPtr gUnknown_082DA040 +mPtr zone1_bonus_capsule_rings +mPtr gUnknown_082D4E0C +mPtr NULL @ Zone 7 +mPtr NULL +mPtr gUnknown_082D4FE8 +mPtr gUnknown_082D6864 +mPtr gUnknown_082D8AFC +mPtr gUnknown_082D97D0 +mPtr NULL +mPtr gUnknown_082DA0E0 +mPtr zone1_bonus_capsule_rings +mPtr gUnknown_082D9B90 +mPtr NULL @ Zone Final +mPtr gUnknown_082D9BF0 +mPtr gUnknown_082D9C6C +.endif + .incbin "baserom_sa3.gba", 0x000CEF58+(10*4), 63*4 @ size = * .global gSpriteInits_Enemies gSpriteInits_Enemies: @ 0x080CF07C diff --git a/data/gfx_data_0.s b/data/gfx_data_0.s index 9c36f2c6a..59f159641 100644 --- a/data/gfx_data_0.s +++ b/data/gfx_data_0.s @@ -7,7 +7,40 @@ .global gUnknown_082B9CD4 gUnknown_082B9CD4: - .incbin "baserom_sa3.gba", 0x002B9CD4, 0x2045C + .incbin "baserom_sa3.gba", 0x002B9CD4, 0x1464 + + .global zone1_act1_rings +zone1_act1_rings: + .incbin "baserom_sa3.gba", 0x002BB138, 0x7AC + + .global zone1_hub_rings +zone1_hub_rings: + .incbin "baserom_sa3.gba", 0x002BB8E4, 0x1870 + + .global zone1_act2_rings +zone1_act2_rings: + .incbin "baserom_sa3.gba", 0x002BD154, 0x1688 + + .global zone1_act3_rings +zone1_act3_rings: + .incbin "baserom_sa3.gba", 0x002BE7DC, 0x600 + + .global zone1_sonic_factory_rings +zone1_sonic_factory_rings: + .incbin "baserom_sa3.gba", 0x002BEDDC, 0x50 + + @ Dummy for all capsule minigames (they do not have rings) + .global zone1_bonus_capsule_rings +zone1_bonus_capsule_rings: + .incbin "baserom_sa3.gba", 0x002BEE2C, 0x134 + + .global zone1_bonus_enemies_rings +zone1_bonus_enemies_rings: + .incbin "baserom_sa3.gba", 0x002BEF60, 0x1ADE8 + + .global zone1_boss_rings +zone1_boss_rings: + .incbin "baserom_sa3.gba", 0x002D9D48, 0x3E8 .global gUnknown_082DA130 gUnknown_082DA130: diff --git a/src/game/sa1_sa2_shared/rings_manager.c b/src/game/sa1_sa2_shared/rings_manager.c index 33f970402..8c7ea8f95 100644 --- a/src/game/sa1_sa2_shared/rings_manager.c +++ b/src/game/sa1_sa2_shared/rings_manager.c @@ -19,12 +19,12 @@ void Task_RingsMgrStage(); void sub_802AB10(s16 arg0, s16 arg1, Player *p); void Task_802AB8C(); void Task_802ACF0(); -extern u32 *gUnknown_080CEF58[]; +extern const u8 *const gSpritePosData_rings[]; extern struct MP2KSongHeader song117; typedef struct RingsManager { /* 0x00 */ Sprite s; - /* 0x28 */ void *ringPositions; + /* 0x28 */ void *rings; } RingsManager; typedef struct RingsMgrUnk2C { @@ -82,13 +82,13 @@ void CreateStageRingsManager(void) } // NOTE: First 4 byte of RL-compressed data contains uncompressed size. - ringsArray = gUnknown_080CEF58; + ringsArray = (u32 **)gSpritePosData_rings; ringsCompressed = &ringsArray[mapIndex]; var_r5 = EwramMalloc(**ringsCompressed >> 8); RLUnCompWram(*ringsCompressed, var_r5); } temp_r0_2 = TASK_DATA(t); - temp_r0_2->ringPositions = var_r5; + temp_r0_2->rings = var_r5; s = &temp_r0_2->s; if (gStageData.gameMode < 6) { s->tiles = OBJ_VRAM0 + 0x4180; @@ -228,7 +228,7 @@ NONMATCH("asm/non_matching/game/shared/rm__Task_RingsMgrStage.inc", void Task_Ri mgr = TASK_DATA(gCurTask); s = &mgr->s; - rings = mgr->ringPositions; + rings = mgr->rings; drawCount = 0; UpdateSpriteAnimation(s); if ((s->frameNum >> 28) == 0) { @@ -504,11 +504,11 @@ void Task_RingsMgrExtraZone(void) mgr = TASK_DATA(gCurTask); s = &mgr->s; - rings = mgr->ringPositions; + rings = mgr->rings; mapIndex = gStageData.currMapIndex; drawCount = 0; if (gCamera.unk6A != 0) { - RLUnCompWram(gUnknown_080CEF58[mapIndex], rings); + RLUnCompWram(gSpritePosData_rings[mapIndex], rings); } if ((gStageData.zone == 8) && (gStageData.unk4 != 3)) { return; @@ -768,5 +768,5 @@ void Task_802ACF0(void) void TaskDestructor_RingsMgr(Task *t) { RingsManager *mgr = TASK_DATA(t); - EwramFree(mgr->ringPositions); + EwramFree(mgr->rings); } diff --git a/src/platform/shared/stub.c b/src/platform/shared/stub.c index 7a9de478f..87e78d60f 100644 --- a/src/platform/shared/stub.c +++ b/src/platform/shared/stub.c @@ -38,6 +38,7 @@ SaveSectorData gSaveSectorData = {}; struct Camera gCamera = {}; void sub_8000D68() { } +void AddRings() { } void Task_800303C() { } void sub_8003D2C() { } void sub_8003DC4() { } @@ -81,7 +82,6 @@ void sub_80299FC() { } void sub_8029A18() { } void sub_80275B8(u32 level, u8 param1, u8 param2) { } void TaskDestructor_8029774(struct Task *t) { } -void CreateCollectRingEffect(s32 param0, s32 param1) { } bool32 sub_802C080(Player *p) { return FALSE; } bool32 sub_802C0D4(Player *p) { return FALSE; } bool32 sub_802C140(s32 worldX, s32 worldY, s32 screenX, s32 screenY) { return FALSE; } From c6849c3e00105030630e27e8df41fe8500ec62ed Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Mon, 6 Apr 2026 16:02:33 +0200 Subject: [PATCH 14/17] Document gSpritePosData_rings pointers --- data/data.s | 152 ++++++++++++++++++++--------------------- data/gfx_data_0.s | 170 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 238 insertions(+), 84 deletions(-) diff --git a/data/data.s b/data/data.s index 57ada924b..5cfcbe9e5 100644 --- a/data/data.s +++ b/data/data.s @@ -250,88 +250,84 @@ gUnknown_080CEF2C: .global gUnknown_080CEF50 gUnknown_080CEF50: - .incbin "baserom_sa3.gba", 0x000CEF50, 0x8 + .byte 0x00, 0x00, 0x46, 0x01, 0xE9, 0x01, 0x8C, 0x02 @ ring positions .global gSpritePosData_rings gSpritePosData_rings: -.if 01 -mPtr NULL @ Zone 1 -mPtr zone1_sonic_factory_rings -mPtr zone1_hub_rings -mPtr zone1_act1_rings -mPtr zone1_act2_rings -mPtr zone1_act3_rings -mPtr NULL @act4 -mPtr zone1_boss_rings -mPtr zone1_bonus_capsule_rings -mPtr zone1_bonus_enemies_rings -.else -mPtr NULL @ Zone 2 -mPtr gUnknown_082C3618 -mPtr gUnknown_082BF0CC -mPtr gUnknown_082C0998 -mPtr gUnknown_082C2010 -mPtr gUnknown_082C32D4 -mPtr NULL -mPtr gUnknown_082D9DF0 -mPtr zone1_bonus_capsule_rings -mPtr gUnknown_082C378C -mPtr NULL @ Zone 3 -mPtr NULL -mPtr gUnknown_082C39B4 -mPtr gUnknown_082C4B50 -mPtr gUnknown_082C6398 -mPtr gUnknown_082C75CC -mPtr NULL -mPtr gUnknown_082D9E80 -mPtr zone1_bonus_capsule_rings -mPtr gUnknown_082C7A4C -mPtr NULL @ Zone 4 -mPtr NULL -mPtr gUnknown_082C7CA0 -mPtr gUnknown_082C885C -mPtr gUnknown_082C960C -mPtr gUnknown_082CA2FC -mPtr NULL -mPtr gUnknown_082D9F14 -mPtr zone1_bonus_capsule_rings -mPtr gUnknown_082CA758 -mPtr NULL @ Zone 5 -mPtr NULL -mPtr gUnknown_082CA9B0 -mPtr gUnknown_082CBA9C -mPtr gUnknown_082CD0C0 -mPtr gUnknown_082CE618 -mPtr NULL -mPtr gUnknown_082D9FB4 -mPtr zone1_bonus_capsule_rings -mPtr gUnknown_082CECAC -mPtr NULL @ Zone 6 -mPtr NULL -mPtr gUnknown_082CEFD0 -mPtr gUnknown_082D1B34 -mPtr gUnknown_082D3634 -mPtr gUnknown_082D48B4 -mPtr NULL -mPtr gUnknown_082DA040 -mPtr zone1_bonus_capsule_rings -mPtr gUnknown_082D4E0C -mPtr NULL @ Zone 7 -mPtr NULL -mPtr gUnknown_082D4FE8 -mPtr gUnknown_082D6864 -mPtr gUnknown_082D8AFC -mPtr gUnknown_082D97D0 -mPtr NULL -mPtr gUnknown_082DA0E0 -mPtr zone1_bonus_capsule_rings -mPtr gUnknown_082D9B90 -mPtr NULL @ Zone Final -mPtr gUnknown_082D9BF0 -mPtr gUnknown_082D9C6C -.endif - .incbin "baserom_sa3.gba", 0x000CEF58+(10*4), 63*4 @ size = * + mPtr NULL @ Zone 1 + mPtr sonic_factory_rings + mPtr zone1_zone_map_rings + mPtr zone1_act1_rings + mPtr zone1_act2_rings + mPtr zone1_act3_rings + mPtr NULL @act4 + mPtr zone1_boss_rings + mPtr zone1_bonus_capsule_rings + mPtr zone1_bonus_enemies_rings + mPtr NULL @ Zone 2 + mPtr chao_playground_rings + mPtr zone2_zone_map_rings + mPtr zone2_act1_rings + mPtr zone2_act2_rings + mPtr zone2_act3_rings + mPtr NULL + mPtr zone2_boss_rings + mPtr zone1_bonus_capsule_rings + mPtr zone2_bonus_enemies_rings + mPtr NULL @ Zone 3 + mPtr NULL + mPtr zone3_zone_map_rings + mPtr zone3_act1_rings + mPtr zone3_act2_rings + mPtr zone3_act3_rings + mPtr NULL + mPtr zone3_boss_rings + mPtr zone1_bonus_capsule_rings + mPtr zone3_bonus_enemies_rings + mPtr NULL @ Zone 4 + mPtr NULL + mPtr zone4_zone_map_rings + mPtr zone4_act1_rings + mPtr zone4_act2_rings + mPtr zone4_act3_rings + mPtr NULL + mPtr zone4_boss_rings + mPtr zone1_bonus_capsule_rings + mPtr zone4_bonus_enemies_rings + mPtr NULL @ Zone 5 + mPtr NULL + mPtr zone5_zone_map_rings + mPtr zone5_act1_rings + mPtr zone5_act2_rings + mPtr zone5_act3_rings + mPtr NULL + mPtr zone5_boss_rings + mPtr zone1_bonus_capsule_rings + mPtr zone5_bonus_enemies_rings + mPtr NULL @ Zone 6 + mPtr NULL + mPtr zone6_zone_map_rings + mPtr zone6_act1_rings + mPtr zone6_act2_rings + mPtr zone6_act3_rings + mPtr NULL + mPtr zone6_boss_rings + mPtr zone1_bonus_capsule_rings + mPtr zone6_bonus_enemies_rings + mPtr NULL @ Zone 7 + mPtr NULL + mPtr zone7_zone_map_rings + mPtr zone7_act1_rings + mPtr zone7_act2_rings + mPtr zone7_act3_rings + mPtr NULL + mPtr zone7_boss_rings + mPtr zone1_bonus_capsule_rings + mPtr zone7_bonus_enemies_rings + mPtr NULL @ Zone Final + mPtr altar_emerald_rings + mPtr nonaggression_rings .global gSpriteInits_Enemies gSpriteInits_Enemies: @ 0x080CF07C diff --git a/data/gfx_data_0.s b/data/gfx_data_0.s index 59f159641..5423f8466 100644 --- a/data/gfx_data_0.s +++ b/data/gfx_data_0.s @@ -13,8 +13,8 @@ gUnknown_082B9CD4: zone1_act1_rings: .incbin "baserom_sa3.gba", 0x002BB138, 0x7AC - .global zone1_hub_rings -zone1_hub_rings: + .global zone1_zone_map_rings +zone1_zone_map_rings: .incbin "baserom_sa3.gba", 0x002BB8E4, 0x1870 .global zone1_act2_rings @@ -25,8 +25,8 @@ zone1_act2_rings: zone1_act3_rings: .incbin "baserom_sa3.gba", 0x002BE7DC, 0x600 - .global zone1_sonic_factory_rings -zone1_sonic_factory_rings: + .global sonic_factory_rings +sonic_factory_rings: .incbin "baserom_sa3.gba", 0x002BEDDC, 0x50 @ Dummy for all capsule minigames (they do not have rings) @@ -36,12 +36,170 @@ zone1_bonus_capsule_rings: .global zone1_bonus_enemies_rings zone1_bonus_enemies_rings: - .incbin "baserom_sa3.gba", 0x002BEF60, 0x1ADE8 + .incbin "baserom_sa3.gba", 0x002BEF60, 0x16C + + .global zone2_zone_map_rings +zone2_zone_map_rings: + .incbin "baserom_sa3.gba", 0x002BF0CC, 0x18CC + + .global zone2_act1_rings +zone2_act1_rings: + .incbin "baserom_sa3.gba", 0x002C0998, 0x1678 + + .global zone2_act2_rings +zone2_act2_rings: + .incbin "baserom_sa3.gba", 0x002C2010, 0x12C4 + + .global zone2_act3_rings +zone2_act3_rings: + .incbin "baserom_sa3.gba", 0x002C32D4, 0x344 + + .global chao_playground_rings +chao_playground_rings: + .incbin "baserom_sa3.gba", 0x002C3618, 0x174 + + .global zone2_bonus_enemies_rings +zone2_bonus_enemies_rings: + .incbin "baserom_sa3.gba", 0x002C378C, 0x228 + + .global zone3_zone_map_rings +zone3_zone_map_rings: + .incbin "baserom_sa3.gba", 0x002C39B4, 0x119C + + .global zone3_act1_rings +zone3_act1_rings: + .incbin "baserom_sa3.gba", 0x002C4B50, 0x1848 + + .global zone3_act2_rings +zone3_act2_rings: + .incbin "baserom_sa3.gba", 0x002C6398, 0x1234 + + .global zone3_act3_rings +zone3_act3_rings: + .incbin "baserom_sa3.gba", 0x002C75CC, 0x480 + + .global zone3_bonus_enemies_rings +zone3_bonus_enemies_rings: + .incbin "baserom_sa3.gba", 0x002C7A4C, 0x254 + + .global zone4_zone_map_rings +zone4_zone_map_rings: + .incbin "baserom_sa3.gba", 0x002C7CA0, 0xBBC + + .global zone4_act1_rings +zone4_act1_rings: + .incbin "baserom_sa3.gba", 0x002C885C, 0xDB0 + + .global zone4_act2_rings +zone4_act2_rings: + .incbin "baserom_sa3.gba", 0x002C960C, 0xCF0 + + .global zone4_act3_rings +zone4_act3_rings: + .incbin "baserom_sa3.gba", 0x002CA2FC, 0x45C + + .global zone4_bonus_enemies_rings +zone4_bonus_enemies_rings: + .incbin "baserom_sa3.gba", 0x002CA758, 0x258 + + .global zone5_zone_map_rings +zone5_zone_map_rings: + .incbin "baserom_sa3.gba", 0x002CA9B0, 0x10EC + + .global zone5_act1_rings +zone5_act1_rings: + .incbin "baserom_sa3.gba", 0x002CBA9C, 0x1624 + + .global zone5_act2_rings +zone5_act2_rings: + .incbin "baserom_sa3.gba", 0x002CD0C0, 0x1558 + + .global zone5_act3_rings +zone5_act3_rings: + .incbin "baserom_sa3.gba", 0x002CE618, 0x694 + + .global zone5_bonus_enemies_rings +zone5_bonus_enemies_rings: + .incbin "baserom_sa3.gba", 0x002CECAC, 0x324 + + .global zone6_zone_map_rings +zone6_zone_map_rings: + .incbin "baserom_sa3.gba", 0x002CEFD0, 0x2B64 + + .global zone6_act1_rings +zone6_act1_rings: + .incbin "baserom_sa3.gba", 0x002D1B34, 0x1B00 + + .global zone6_act2_rings +zone6_act2_rings: + .incbin "baserom_sa3.gba", 0x002D3634, 0x1280 + + .global zone6_act3_rings +zone6_act3_rings: + .incbin "baserom_sa3.gba", 0x002D48B4, 0x558 + + .global zone6_bonus_enemies_rings +zone6_bonus_enemies_rings: + .incbin "baserom_sa3.gba", 0x002D4E0C, 0x1DC + + .global zone7_zone_map_rings +zone7_zone_map_rings: + .incbin "baserom_sa3.gba", 0x002D4FE8, 0x187C + + .global zone7_act1_rings +zone7_act1_rings: + .incbin "baserom_sa3.gba", 0x002D6864, 0x2298 + + .global zone7_act2_rings +zone7_act2_rings: + .incbin "baserom_sa3.gba", 0x002D8AFC, 0xCD4 + + .global zone7_act3_rings +zone7_act3_rings: + .incbin "baserom_sa3.gba", 0x002D97D0, 0x3C0 + + .global zone7_bonus_enemies_rings +zone7_bonus_enemies_rings: + .incbin "baserom_sa3.gba", 0x002D9B90, 0x60 + + .global altar_emerald_rings +altar_emerald_rings: + .incbin "baserom_sa3.gba", 0x002D9BF0, 0x7C + + .global nonaggression_rings +nonaggression_rings: + .incbin "baserom_sa3.gba", 0x002D9C6C, 0xDC .global zone1_boss_rings zone1_boss_rings: - .incbin "baserom_sa3.gba", 0x002D9D48, 0x3E8 + .incbin "baserom_sa3.gba", 0x002D9D48, 0xA8 + + .global zone2_boss_rings +zone2_boss_rings: + .incbin "baserom_sa3.gba", 0x002D9DF0, 0x90 + + .global zone3_boss_rings +zone3_boss_rings: + .incbin "baserom_sa3.gba", 0x002D9E80, 0x94 + + .global zone4_boss_rings +zone4_boss_rings: + .incbin "baserom_sa3.gba", 0x002D9F14, 0xA0 + + .global zone5_boss_rings +zone5_boss_rings: + .incbin "baserom_sa3.gba", 0x002D9FB4, 0x8C + + .global zone6_boss_rings +zone6_boss_rings: + .incbin "baserom_sa3.gba", 0x002DA040, 0xA0 + + .global zone7_boss_rings +zone7_boss_rings: + .incbin "baserom_sa3.gba", 0x002DA0E0, 0x50 .global gUnknown_082DA130 gUnknown_082DA130: .incbin "baserom_sa3.gba", 0x002DA130, 0x3C0 + +@ --- 0x082DA4F0 --- From a8577fd9a5b7f66169ede7b51a02b8fda1f23763 Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Mon, 6 Apr 2026 16:58:23 +0200 Subject: [PATCH 15/17] Move gSpritePosData_rings into non-matching --- data/data_0.s | 253 +++++++++++++++++++ data/{data.s => data_0_1.s} | 323 ------------------------ ldscript.txt | 4 +- src/game/sa1_sa2_shared/rings_manager.c | 81 ++++++ 4 files changed, 337 insertions(+), 324 deletions(-) create mode 100644 data/data_0.s rename data/{data.s => data_0_1.s} (73%) diff --git a/data/data_0.s b/data/data_0.s new file mode 100644 index 000000000..448ab0c1e --- /dev/null +++ b/data/data_0.s @@ -0,0 +1,253 @@ +.include "asm/macros/c_decl.inc" +.include "asm/macros/portable.inc" +.include "asm/macros/function.inc" +.include "constants/gba_constants.inc" +.include "constants/misc_constants.inc" + +.section .rodata + + .global gUnknown_080CE438 +gUnknown_080CE438: + .incbin "baserom_sa3.gba", 0x000CE438, 0x7A + + .global gUnknown_080CE4B2 +gUnknown_080CE4B2: + .incbin "baserom_sa3.gba", 0x000CE4B2, 0x7A + + .global gUnknown_080CE52C +gUnknown_080CE52C: + .incbin "baserom_sa3.gba", 0x000CE52C, 0x1C + + .global gUnknown_080CE548 +gUnknown_080CE548: + .incbin "baserom_sa3.gba", 0x000CE548, 0x4 + + .global gUnknown_080CE54C +gUnknown_080CE54C: + .incbin "baserom_sa3.gba", 0x000CE54C, 0x6C + + .global gUnknown_080CE5B8 +gUnknown_080CE5B8: + .incbin "baserom_sa3.gba", 0x000CE5B8, 0x12 + + .global gUnknown_080CE5CA +gUnknown_080CE5CA: + .incbin "baserom_sa3.gba", 0x000CE5CA, 0x14 + + .global gCharVoicesLifeLost +gCharVoicesLifeLost: + .short 0x267, 0x27A, 0x26B, 0x270, 0x276 + + .global gUnknown_080CE5E8 +gUnknown_080CE5E8: + .incbin "baserom_sa3.gba", 0x000CE5E8, 0xA + + .global gUnknown_080CE5F2 +gUnknown_080CE5F2: + .incbin "baserom_sa3.gba", 0x000CE5F2, 0xA + + .global gUnknown_080CE5FC +gUnknown_080CE5FC: + .incbin "baserom_sa3.gba", 0x000CE5FC, 0x10 + + .global gUnknown_080CE60C +gUnknown_080CE60C: + .incbin "baserom_sa3.gba", 0x000CE60C, 0x10 + + .global gUnknown_080CE61C +gUnknown_080CE61C: + .incbin "baserom_sa3.gba", 0x000CE61C, 0x20 + + .global gUnknown_080CE63C +gUnknown_080CE63C: + .incbin "baserom_sa3.gba", 0x000CE63C, 0x8 + + .global gUnknown_080CE644 +gUnknown_080CE644: + .incbin "baserom_sa3.gba", 0x000CE644, 0x64 + + .global gUnknown_080CE6A8 +gUnknown_080CE6A8: + .incbin "baserom_sa3.gba", 0x000CE6A8, 0x10 + + .global gUnknown_080CE6B8 +gUnknown_080CE6B8: + .incbin "baserom_sa3.gba", 0x000CE6B8, 0x14 + + .global gUnknown_080CE6CC +gUnknown_080CE6CC: + mPtr Player_8005BD4 + mPtr Player_8005CB8 + mPtr Player_8005DAC + mPtr sub_800D8DC + mPtr Player_8005E80 + mPtr Player_800D944 + mPtr Player_800613C + mPtr Player_80061D8 + mPtr Player_800A168 + mPtr sub_800DF9C + mPtr Player_HitWithoutRingsUpdate + mPtr sub_800913C + mPtr sub_8009518 + mPtr sub_80095E8 + mPtr Player_800AAC0 + mPtr Player_800AB48 + mPtr Player_800E348 + mPtr Player_800E370 + mPtr Player_800E398 + mPtr Player_800E3C4 + mPtr sub_800AF98 + mPtr Player_800E3EC + mPtr Player_800B004 + mPtr Player_800E468 + mPtr Player_800E490 + mPtr Player_800E4B8 + mPtr Player_800E4E0 + mPtr Player_800B128 + mPtr Player_800E564 + mPtr Player_800ED14 + mPtr Player_800ED34 + mPtr Player_800ED4C + mPtr Player_800DD0C + mPtr Player_800DD28 + mPtr Player_800B5A4 + mPtr Player_800DD44 + mPtr Player_800DDB4 + mPtr Player_800B628 + mPtr Player_800DDD0 + mPtr Player_800DE48 + mPtr Player_800B6C4 + mPtr Player_800B748 + mPtr Player_IceLauncherLaunch + mPtr Player_800B920 + mPtr Player_800DEC4 + mPtr Player_CollideGroundAfterIceLauncher + mPtr Player_800B81C + mPtr Player_nullsub_800EAA8 + mPtr Player_800E604 + mPtr Player_800DB7C + mPtr Player_800DCB4 + mPtr Player_800DBE8 + mPtr sub_800DC50 + mPtr 0 + + .global gUnknown_080CE7A4 +gUnknown_080CE7A4: + .incbin "baserom_sa3.gba", 0x000CE7A4, 0x4 + + .global gUnknown_080CE7A8 +gUnknown_080CE7A8: + .incbin "baserom_sa3.gba", 0x000CE7A8, 0x8 + + .global gUnknown_080CE7B0 +gUnknown_080CE7B0: + .incbin "baserom_sa3.gba", 0x000CE7B0, 0x8 + + .global gUnknown_080CE7B8 +gUnknown_080CE7B8: + .incbin "baserom_sa3.gba", 0x000CE7B8, 0x8 + + .global gUnknown_080CE7C0 +gUnknown_080CE7C0: + .incbin "baserom_sa3.gba", 0x000CE7C0, 0x8 + + .global gUnknown_080CE7C8 +gUnknown_080CE7C8: + .incbin "baserom_sa3.gba", 0x000CE7C8, 0x10 + + @ NOTE: Should likely belong to player.c! + .global gPlayerCharacterIdleAnims +gPlayerCharacterIdleAnims: + .short 0x0000, 0x00A3, 0x0146, 0x01E9, 0x028C + + @ TODO: Maybe sCharStateAnimInfo ? + .global gUnknown_080CE7E2 +gUnknown_080CE7E2: + .incbin "baserom_sa3.gba", 0x000CE7E2, 0x4D0 + + .global gUnknown_080CECB2 +gUnknown_080CECB2: + .incbin "baserom_sa3.gba", 0x000CECB2, 0x14 + + .global gUnknown_080CECC6 +gUnknown_080CECC6: + .incbin "baserom_sa3.gba", 0x000CECC6, 0xA + + .global gUnknown_080CECD0 +gUnknown_080CECD0: + .incbin "baserom_sa3.gba", 0x000CECD0, 0x14 + + .global gUnknown_080CECE4 +gUnknown_080CECE4: + .incbin "baserom_sa3.gba", 0x000CECE4, 0x14 + + .global gUnknown_080CECF8 +gUnknown_080CECF8: + .incbin "baserom_sa3.gba", 0x000CECF8, 0x60 + + .global gUnknown_080CED58 +gUnknown_080CED58: + .incbin "baserom_sa3.gba", 0x000CED58, 0x38 + + .global gUnknown_080CED90 +gUnknown_080CED90: + .incbin "baserom_sa3.gba", 0x000CED90, 0x58 + + .global gUnknown_080CEDE8 +gUnknown_080CEDE8: + .incbin "baserom_sa3.gba", 0x000CEDE8, 0x38 + + .global gUnknown_080CEE20 +gUnknown_080CEE20: + .incbin "baserom_sa3.gba", 0x000CEE20, 0x5 + + .global gUnknown_080CEE25 +gUnknown_080CEE25: + .incbin "baserom_sa3.gba", 0x000CEE25, 0x1B + + .global gUnknown_080CEE40 +gUnknown_080CEE40: + .incbin "baserom_sa3.gba", 0x000CEE40, 0x80 + + .global gUnknown_080CEEC0 +gUnknown_080CEEC0: + .incbin "baserom_sa3.gba", 0x000CEEC0, 0xC + + .global gUnknown_080CEECC +gUnknown_080CEECC: + .incbin "baserom_sa3.gba", 0x000CEECC, 0xC + + .global gUnknown_080CEED8 +gUnknown_080CEED8: + mPtr gPayload_08E2F418 + mPtr gPayload_08E31880 + mPtr gPayload_08E31880 + mPtr gPayload_08E33C30 + mPtr gPayload_08E33C30 + mPtr gPayload_08E360A4 + mPtr gPayload_08E360A4 + mPtr gPayload_08E38464 + mPtr gPayload_08E38464 + mPtr gPayload_08E3A7F0 + mPtr gPayload_08E3A7F0 + mPtr gPayload_08E3CB98 + + .global gUnknown_080CEF08 +gUnknown_080CEF08: + mPtr gUnknown_08E6DBE4 + mPtr gUnknown_08E74E1C + mPtr gUnknown_08E66DB4 + mPtr gUnknown_08E62B0C + mPtr NULL + mPtr gPayload_08E3CB9C + mPtr gUnknown_08E44B9C + mPtr gUnknown_08E4CB9C + mPtr gUnknown_08E54B9C + + .global gUnknown_080CEF2C +gUnknown_080CEF2C: + .incbin "baserom_sa3.gba", 0x000CEF2C, 0x24 + + .global gUnknown_080CEF50 +gUnknown_080CEF50: + .short 0x0000, 0x0146, 0x01E9, 0x028C diff --git a/data/data.s b/data/data_0_1.s similarity index 73% rename from data/data.s rename to data/data_0_1.s index 5cfcbe9e5..8ec4d0dd0 100644 --- a/data/data.s +++ b/data/data_0_1.s @@ -6,329 +6,6 @@ .section .rodata - .global gUnknown_080CE438 -gUnknown_080CE438: - .incbin "baserom_sa3.gba", 0x000CE438, 0x7A - - .global gUnknown_080CE4B2 -gUnknown_080CE4B2: - .incbin "baserom_sa3.gba", 0x000CE4B2, 0x7A - - .global gUnknown_080CE52C -gUnknown_080CE52C: - .incbin "baserom_sa3.gba", 0x000CE52C, 0x1C - - .global gUnknown_080CE548 -gUnknown_080CE548: - .incbin "baserom_sa3.gba", 0x000CE548, 0x4 - - .global gUnknown_080CE54C -gUnknown_080CE54C: - .incbin "baserom_sa3.gba", 0x000CE54C, 0x6C - - .global gUnknown_080CE5B8 -gUnknown_080CE5B8: - .incbin "baserom_sa3.gba", 0x000CE5B8, 0x12 - - .global gUnknown_080CE5CA -gUnknown_080CE5CA: - .incbin "baserom_sa3.gba", 0x000CE5CA, 0x14 - - .global gCharVoicesLifeLost -gCharVoicesLifeLost: - .short 0x267, 0x27A, 0x26B, 0x270, 0x276 - - .global gUnknown_080CE5E8 -gUnknown_080CE5E8: - .incbin "baserom_sa3.gba", 0x000CE5E8, 0xA - - .global gUnknown_080CE5F2 -gUnknown_080CE5F2: - .incbin "baserom_sa3.gba", 0x000CE5F2, 0xA - - .global gUnknown_080CE5FC -gUnknown_080CE5FC: - .incbin "baserom_sa3.gba", 0x000CE5FC, 0x10 - - .global gUnknown_080CE60C -gUnknown_080CE60C: - .incbin "baserom_sa3.gba", 0x000CE60C, 0x10 - - .global gUnknown_080CE61C -gUnknown_080CE61C: - .incbin "baserom_sa3.gba", 0x000CE61C, 0x20 - - .global gUnknown_080CE63C -gUnknown_080CE63C: - .incbin "baserom_sa3.gba", 0x000CE63C, 0x8 - - .global gUnknown_080CE644 -gUnknown_080CE644: - .incbin "baserom_sa3.gba", 0x000CE644, 0x64 - - .global gUnknown_080CE6A8 -gUnknown_080CE6A8: - .incbin "baserom_sa3.gba", 0x000CE6A8, 0x10 - - .global gUnknown_080CE6B8 -gUnknown_080CE6B8: - .incbin "baserom_sa3.gba", 0x000CE6B8, 0x14 - - .global gUnknown_080CE6CC -gUnknown_080CE6CC: - mPtr Player_8005BD4 - mPtr Player_8005CB8 - mPtr Player_8005DAC - mPtr sub_800D8DC - mPtr Player_8005E80 - mPtr Player_800D944 - mPtr Player_800613C - mPtr Player_80061D8 - mPtr Player_800A168 - mPtr sub_800DF9C - mPtr Player_HitWithoutRingsUpdate - mPtr sub_800913C - mPtr sub_8009518 - mPtr sub_80095E8 - mPtr Player_800AAC0 - mPtr Player_800AB48 - mPtr Player_800E348 - mPtr Player_800E370 - mPtr Player_800E398 - mPtr Player_800E3C4 - mPtr sub_800AF98 - mPtr Player_800E3EC - mPtr Player_800B004 - mPtr Player_800E468 - mPtr Player_800E490 - mPtr Player_800E4B8 - mPtr Player_800E4E0 - mPtr Player_800B128 - mPtr Player_800E564 - mPtr Player_800ED14 - mPtr Player_800ED34 - mPtr Player_800ED4C - mPtr Player_800DD0C - mPtr Player_800DD28 - mPtr Player_800B5A4 - mPtr Player_800DD44 - mPtr Player_800DDB4 - mPtr Player_800B628 - mPtr Player_800DDD0 - mPtr Player_800DE48 - mPtr Player_800B6C4 - mPtr Player_800B748 - mPtr Player_IceLauncherLaunch - mPtr Player_800B920 - mPtr Player_800DEC4 - mPtr Player_CollideGroundAfterIceLauncher - mPtr Player_800B81C - mPtr Player_nullsub_800EAA8 - mPtr Player_800E604 - mPtr Player_800DB7C - mPtr Player_800DCB4 - mPtr Player_800DBE8 - mPtr sub_800DC50 - mPtr 0 - - .global gUnknown_080CE7A4 -gUnknown_080CE7A4: - .incbin "baserom_sa3.gba", 0x000CE7A4, 0x4 - - .global gUnknown_080CE7A8 -gUnknown_080CE7A8: - .incbin "baserom_sa3.gba", 0x000CE7A8, 0x8 - - .global gUnknown_080CE7B0 -gUnknown_080CE7B0: - .incbin "baserom_sa3.gba", 0x000CE7B0, 0x8 - - .global gUnknown_080CE7B8 -gUnknown_080CE7B8: - .incbin "baserom_sa3.gba", 0x000CE7B8, 0x8 - - .global gUnknown_080CE7C0 -gUnknown_080CE7C0: - .incbin "baserom_sa3.gba", 0x000CE7C0, 0x8 - - .global gUnknown_080CE7C8 -gUnknown_080CE7C8: - .incbin "baserom_sa3.gba", 0x000CE7C8, 0x10 - - @ NOTE: Should likely belong to player.c! - .global gPlayerCharacterIdleAnims -gPlayerCharacterIdleAnims: - .short 0x0000, 0x00A3, 0x0146, 0x01E9, 0x028C - - @ TODO: Maybe sCharStateAnimInfo ? - .global gUnknown_080CE7E2 -gUnknown_080CE7E2: - .incbin "baserom_sa3.gba", 0x000CE7E2, 0x4D0 - - .global gUnknown_080CECB2 -gUnknown_080CECB2: - .incbin "baserom_sa3.gba", 0x000CECB2, 0x14 - - .global gUnknown_080CECC6 -gUnknown_080CECC6: - .incbin "baserom_sa3.gba", 0x000CECC6, 0xA - - .global gUnknown_080CECD0 -gUnknown_080CECD0: - .incbin "baserom_sa3.gba", 0x000CECD0, 0x14 - - .global gUnknown_080CECE4 -gUnknown_080CECE4: - .incbin "baserom_sa3.gba", 0x000CECE4, 0x14 - - .global gUnknown_080CECF8 -gUnknown_080CECF8: - .incbin "baserom_sa3.gba", 0x000CECF8, 0x60 - - .global gUnknown_080CED58 -gUnknown_080CED58: - .incbin "baserom_sa3.gba", 0x000CED58, 0x38 - - .global gUnknown_080CED90 -gUnknown_080CED90: - .incbin "baserom_sa3.gba", 0x000CED90, 0x58 - - .global gUnknown_080CEDE8 -gUnknown_080CEDE8: - .incbin "baserom_sa3.gba", 0x000CEDE8, 0x38 - - .global gUnknown_080CEE20 -gUnknown_080CEE20: - .incbin "baserom_sa3.gba", 0x000CEE20, 0x5 - - .global gUnknown_080CEE25 -gUnknown_080CEE25: - .incbin "baserom_sa3.gba", 0x000CEE25, 0x1B - - .global gUnknown_080CEE40 -gUnknown_080CEE40: - .incbin "baserom_sa3.gba", 0x000CEE40, 0x80 - - .global gUnknown_080CEEC0 -gUnknown_080CEEC0: - .incbin "baserom_sa3.gba", 0x000CEEC0, 0xC - - .global gUnknown_080CEECC -gUnknown_080CEECC: - .incbin "baserom_sa3.gba", 0x000CEECC, 0xC - - .global gUnknown_080CEED8 -gUnknown_080CEED8: - mPtr gPayload_08E2F418 - mPtr gPayload_08E31880 - mPtr gPayload_08E31880 - mPtr gPayload_08E33C30 - mPtr gPayload_08E33C30 - mPtr gPayload_08E360A4 - mPtr gPayload_08E360A4 - mPtr gPayload_08E38464 - mPtr gPayload_08E38464 - mPtr gPayload_08E3A7F0 - mPtr gPayload_08E3A7F0 - mPtr gPayload_08E3CB98 - - .global gUnknown_080CEF08 -gUnknown_080CEF08: - mPtr gUnknown_08E6DBE4 - mPtr gUnknown_08E74E1C - mPtr gUnknown_08E66DB4 - mPtr gUnknown_08E62B0C - mPtr NULL - mPtr gPayload_08E3CB9C - mPtr gUnknown_08E44B9C - mPtr gUnknown_08E4CB9C - mPtr gUnknown_08E54B9C - - .global gUnknown_080CEF2C -gUnknown_080CEF2C: - .incbin "baserom_sa3.gba", 0x000CEF2C, 0x24 - - .global gUnknown_080CEF50 -gUnknown_080CEF50: - .byte 0x00, 0x00, 0x46, 0x01, 0xE9, 0x01, 0x8C, 0x02 - -@ ring positions - .global gSpritePosData_rings -gSpritePosData_rings: - mPtr NULL @ Zone 1 - mPtr sonic_factory_rings - mPtr zone1_zone_map_rings - mPtr zone1_act1_rings - mPtr zone1_act2_rings - mPtr zone1_act3_rings - mPtr NULL @act4 - mPtr zone1_boss_rings - mPtr zone1_bonus_capsule_rings - mPtr zone1_bonus_enemies_rings - mPtr NULL @ Zone 2 - mPtr chao_playground_rings - mPtr zone2_zone_map_rings - mPtr zone2_act1_rings - mPtr zone2_act2_rings - mPtr zone2_act3_rings - mPtr NULL - mPtr zone2_boss_rings - mPtr zone1_bonus_capsule_rings - mPtr zone2_bonus_enemies_rings - mPtr NULL @ Zone 3 - mPtr NULL - mPtr zone3_zone_map_rings - mPtr zone3_act1_rings - mPtr zone3_act2_rings - mPtr zone3_act3_rings - mPtr NULL - mPtr zone3_boss_rings - mPtr zone1_bonus_capsule_rings - mPtr zone3_bonus_enemies_rings - mPtr NULL @ Zone 4 - mPtr NULL - mPtr zone4_zone_map_rings - mPtr zone4_act1_rings - mPtr zone4_act2_rings - mPtr zone4_act3_rings - mPtr NULL - mPtr zone4_boss_rings - mPtr zone1_bonus_capsule_rings - mPtr zone4_bonus_enemies_rings - mPtr NULL @ Zone 5 - mPtr NULL - mPtr zone5_zone_map_rings - mPtr zone5_act1_rings - mPtr zone5_act2_rings - mPtr zone5_act3_rings - mPtr NULL - mPtr zone5_boss_rings - mPtr zone1_bonus_capsule_rings - mPtr zone5_bonus_enemies_rings - mPtr NULL @ Zone 6 - mPtr NULL - mPtr zone6_zone_map_rings - mPtr zone6_act1_rings - mPtr zone6_act2_rings - mPtr zone6_act3_rings - mPtr NULL - mPtr zone6_boss_rings - mPtr zone1_bonus_capsule_rings - mPtr zone6_bonus_enemies_rings - mPtr NULL @ Zone 7 - mPtr NULL - mPtr zone7_zone_map_rings - mPtr zone7_act1_rings - mPtr zone7_act2_rings - mPtr zone7_act3_rings - mPtr NULL - mPtr zone7_boss_rings - mPtr zone1_bonus_capsule_rings - mPtr zone7_bonus_enemies_rings - mPtr NULL @ Zone Final - mPtr altar_emerald_rings - mPtr nonaggression_rings - .global gSpriteInits_Enemies gSpriteInits_Enemies: @ 0x080CF07C mPtr CreateEntity_Spinner diff --git a/ldscript.txt b/ldscript.txt index c81edfc4b..fd7889e73 100644 --- a/ldscript.txt +++ b/ldscript.txt @@ -262,7 +262,9 @@ SECTIONS { *libc.a:readr.o(.text); /* data */ - data/data.o(.rodata); + data/data_0.o(.rodata); + src/game/sa1_sa2_shared/rings_manager.o(.rodata); + data/data_0_1.o(.rodata); src/data/tilemap_table.o(.rodata); data/data_1_1.o(.rodata); src/game/math.o(.rodata); diff --git a/src/game/sa1_sa2_shared/rings_manager.c b/src/game/sa1_sa2_shared/rings_manager.c index 8c7ea8f95..618b5ccec 100644 --- a/src/game/sa1_sa2_shared/rings_manager.c +++ b/src/game/sa1_sa2_shared/rings_manager.c @@ -9,9 +9,11 @@ #include "game/entity.h" #include "game/player.h" #include "game/stage.h" +#include "game/assets/compressed/entities.h" #include "game/sa1_sa2_shared/rings_manager.h" #include "constants/animations.h" #include "constants/move_states.h" +#include "constants/zones.h" void TaskDestructor_RingsMgr(Task *); void Task_RingsMgrExtraZone(); @@ -59,6 +61,85 @@ typedef struct RingsMgrUnk30 { TO_REGION(b + a + offset); \ }) +//#if 0 +#ifndef COLLECT_RINGS_ROM +const u8 *const gSpritePosData_rings[NUM_LEVEL_IDS] = { + NULL, + sonic_factory_rings, + zone1_zone_map_rings, + zone1_act1_rings, + zone1_act2_rings, + zone1_act3_rings, + NULL, + zone1_boss_rings, + zone1_bonus_capsule_rings, + zone1_bonus_enemies_rings, + NULL, + chao_playground_rings, + zone2_zone_map_rings, + zone2_act1_rings, + zone2_act2_rings, + zone2_act3_rings, + NULL, + zone2_boss_rings, + zone1_bonus_capsule_rings, + zone2_bonus_enemies_rings, + NULL, + NULL, + zone3_zone_map_rings, + zone3_act1_rings, + zone3_act2_rings, + zone3_act3_rings, + NULL, + zone3_boss_rings, + zone1_bonus_capsule_rings, + zone3_bonus_enemies_rings, + NULL, + NULL, + zone4_zone_map_rings, + zone4_act1_rings, + zone4_act2_rings, + zone4_act3_rings, + NULL, + zone4_boss_rings, + zone1_bonus_capsule_rings, + zone4_bonus_enemies_rings, + NULL, + NULL, + zone5_zone_map_rings, + zone5_act1_rings, + zone5_act2_rings, + zone5_act3_rings, + NULL, + zone5_boss_rings, + zone1_bonus_capsule_rings, + zone5_bonus_enemies_rings, + NULL, + NULL, + zone6_zone_map_rings, + zone6_act1_rings, + zone6_act2_rings, + zone6_act3_rings, + NULL, + zone6_boss_rings, + zone1_bonus_capsule_rings, + zone6_bonus_enemies_rings, + NULL, + NULL, + zone7_zone_map_rings, + zone7_act1_rings, + zone7_act2_rings, + zone7_act3_rings, + NULL, + zone7_boss_rings, + zone1_bonus_capsule_rings, + zone7_bonus_enemies_rings, + NULL, + altar_emerald_rings, + nonaggression_rings, +}; +#endif + void CreateStageRingsManager(void) { Task *t; From 6f3de8a0c9782aacdb69966b185e0bc4c336c1a0 Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Mon, 6 Apr 2026 16:59:29 +0200 Subject: [PATCH 16/17] Remove temp comment --- src/game/sa1_sa2_shared/rings_manager.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/game/sa1_sa2_shared/rings_manager.c b/src/game/sa1_sa2_shared/rings_manager.c index 618b5ccec..d29f43f32 100644 --- a/src/game/sa1_sa2_shared/rings_manager.c +++ b/src/game/sa1_sa2_shared/rings_manager.c @@ -61,7 +61,6 @@ typedef struct RingsMgrUnk30 { TO_REGION(b + a + offset); \ }) -//#if 0 #ifndef COLLECT_RINGS_ROM const u8 *const gSpritePosData_rings[NUM_LEVEL_IDS] = { NULL, From dbd8363e8bd0a1697055bea9d0f0a44c5e4b0bc5 Mon Sep 17 00:00:00 2001 From: JaceCear <11230293+JaceCear@users.noreply.github.com> Date: Mon, 6 Apr 2026 17:05:28 +0200 Subject: [PATCH 17/17] Fix build --- include/game/assets/compressed/entities.h | 182 ++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 include/game/assets/compressed/entities.h diff --git a/include/game/assets/compressed/entities.h b/include/game/assets/compressed/entities.h new file mode 100644 index 000000000..1d29affc6 --- /dev/null +++ b/include/game/assets/compressed/entities.h @@ -0,0 +1,182 @@ +#ifndef GUARD_DATA_ENTITIES_H +#define GUARD_DATA_ENTITIES_H +#include "global.h" + +extern const u8 sonic_factory_rings[]; +extern const u8 chao_playground_rings[]; + +extern const u8 zone1_zone_map_rings[]; + +extern const u8 zone1_act1_rings[]; +extern const u8 zone1_act1_enemies[]; +extern const u8 zone1_act1_itemboxes[]; +extern const u8 zone1_act1_interactables[]; + +extern const u8 zone1_act2_rings[]; +extern const u8 zone1_act2_enemies[]; +extern const u8 zone1_act2_itemboxes[]; +extern const u8 zone1_act2_interactables[]; + +extern const u8 zone1_act3_rings[]; +extern const u8 zone1_act3_enemies[]; +extern const u8 zone1_act3_itemboxes[]; +extern const u8 zone1_act3_interactables[]; + +// Shared amongst all zones +extern const u8 zone1_bonus_capsule_rings[]; + +extern const u8 zone1_bonus_enemies_rings[]; + +extern const u8 zone1_boss_rings[]; +extern const u8 zone1_boss_enemies[]; +extern const u8 zone1_boss_itemboxes[]; +extern const u8 zone1_boss_interactables[]; + +extern const u8 zone2_zone_map_rings[]; + +extern const u8 zone2_act1_rings[]; +extern const u8 zone2_act1_enemies[]; +extern const u8 zone2_act1_itemboxes[]; +extern const u8 zone2_act1_interactables[]; + +extern const u8 zone2_act2_rings[]; +extern const u8 zone2_act2_enemies[]; +extern const u8 zone2_act2_itemboxes[]; +extern const u8 zone2_act2_interactables[]; + +extern const u8 zone2_act3_rings[]; +extern const u8 zone2_act3_enemies[]; +extern const u8 zone2_act3_itemboxes[]; +extern const u8 zone2_act3_interactables[]; + +extern const u8 zone2_bonus_enemies_rings[]; + +extern const u8 zone2_boss_rings[]; +extern const u8 zone2_boss_enemies[]; +extern const u8 zone2_boss_itemboxes[]; +extern const u8 zone2_boss_interactables[]; + +extern const u8 zone3_zone_map_rings[]; + +extern const u8 zone3_act1_rings[]; +extern const u8 zone3_act1_enemies[]; +extern const u8 zone3_act1_itemboxes[]; +extern const u8 zone3_act1_interactables[]; + +extern const u8 zone3_act2_rings[]; +extern const u8 zone3_act2_enemies[]; +extern const u8 zone3_act2_itemboxes[]; +extern const u8 zone3_act2_interactables[]; + +extern const u8 zone3_act3_rings[]; +extern const u8 zone3_act3_enemies[]; +extern const u8 zone3_act3_itemboxes[]; +extern const u8 zone3_act3_interactables[]; + +extern const u8 zone3_bonus_enemies_rings[]; + +extern const u8 zone3_boss_rings[]; +extern const u8 zone3_boss_enemies[]; +extern const u8 zone3_boss_itemboxes[]; +extern const u8 zone3_boss_interactables[]; + +extern const u8 zone4_zone_map_rings[]; + +extern const u8 zone4_act1_rings[]; +extern const u8 zone4_act1_enemies[]; +extern const u8 zone4_act1_itemboxes[]; +extern const u8 zone4_act1_interactables[]; + +extern const u8 zone4_act2_rings[]; +extern const u8 zone4_act2_enemies[]; +extern const u8 zone4_act2_itemboxes[]; +extern const u8 zone4_act2_interactables[]; + +extern const u8 zone4_act3_rings[]; +extern const u8 zone4_act3_enemies[]; +extern const u8 zone4_act3_itemboxes[]; +extern const u8 zone4_act3_interactables[]; + +extern const u8 zone4_bonus_enemies_rings[]; + +extern const u8 zone4_boss_rings[]; +extern const u8 zone4_boss_enemies[]; +extern const u8 zone4_boss_itemboxes[]; +extern const u8 zone4_boss_interactables[]; + +extern const u8 zone5_zone_map_rings[]; + +extern const u8 zone5_act1_rings[]; +extern const u8 zone5_act1_enemies[]; +extern const u8 zone5_act1_itemboxes[]; +extern const u8 zone5_act1_interactables[]; + +extern const u8 zone5_act2_rings[]; +extern const u8 zone5_act2_enemies[]; +extern const u8 zone5_act2_itemboxes[]; +extern const u8 zone5_act2_interactables[]; + +extern const u8 zone5_act3_rings[]; +extern const u8 zone5_act3_enemies[]; +extern const u8 zone5_act3_itemboxes[]; +extern const u8 zone5_act3_interactables[]; + +extern const u8 zone5_bonus_enemies_rings[]; + +extern const u8 zone5_boss_rings[]; +extern const u8 zone5_boss_enemies[]; +extern const u8 zone5_boss_itemboxes[]; +extern const u8 zone5_boss_interactables[]; + +extern const u8 zone6_zone_map_rings[]; + +extern const u8 zone6_act1_rings[]; +extern const u8 zone6_act1_enemies[]; +extern const u8 zone6_act1_itemboxes[]; +extern const u8 zone6_act1_interactables[]; + +extern const u8 zone6_act2_rings[]; +extern const u8 zone6_act2_enemies[]; +extern const u8 zone6_act2_itemboxes[]; +extern const u8 zone6_act2_interactables[]; + +extern const u8 zone6_act3_rings[]; +extern const u8 zone6_act3_enemies[]; +extern const u8 zone6_act3_itemboxes[]; +extern const u8 zone6_act3_interactables[]; + +extern const u8 zone6_bonus_enemies_rings[]; + +extern const u8 zone6_boss_rings[]; +extern const u8 zone6_boss_enemies[]; +extern const u8 zone6_boss_itemboxes[]; +extern const u8 zone6_boss_interactables[]; + +extern const u8 zone7_zone_map_rings[]; + +extern const u8 zone7_act1_rings[]; +extern const u8 zone7_act1_enemies[]; +extern const u8 zone7_act1_itemboxes[]; +extern const u8 zone7_act1_interactables[]; + +extern const u8 zone7_act2_rings[]; +extern const u8 zone7_act2_enemies[]; +extern const u8 zone7_act2_itemboxes[]; +extern const u8 zone7_act2_interactables[]; + +extern const u8 zone7_act3_rings[]; +extern const u8 zone7_act3_enemies[]; +extern const u8 zone7_act3_itemboxes[]; +extern const u8 zone7_act3_interactables[]; + +extern const u8 zone7_bonus_enemies_rings[]; + +extern const u8 zone7_boss_rings[]; +extern const u8 zone7_boss_enemies[]; +extern const u8 zone7_boss_itemboxes[]; +extern const u8 zone7_boss_interactables[]; + +extern const u8 altar_emerald_rings[]; +extern const u8 nonaggression_rings[]; + +#endif // GUARD_DATA_ENTITIES_H