From 15e38aff6c72c6c273982e0ec647db64bce160ec Mon Sep 17 00:00:00 2001 From: Oliver Bell Date: Thu, 23 Apr 2026 20:18:29 +0100 Subject: [PATCH] sa1: match src/game/shared/stage/water_effects.c --- .../water_effects__Task_StageWaterTask.inc | 277 ------------------ sa1/src/game/shared/stage/water_effects.c | 41 +-- src/game/shared/stage/water_effects.c | 31 ++ 3 files changed, 45 insertions(+), 304 deletions(-) delete mode 100644 sa1/asm/non_matching/game/shared/stage/water_effects__Task_StageWaterTask.inc diff --git a/sa1/asm/non_matching/game/shared/stage/water_effects__Task_StageWaterTask.inc b/sa1/asm/non_matching/game/shared/stage/water_effects__Task_StageWaterTask.inc deleted file mode 100644 index dd597a938..000000000 --- a/sa1/asm/non_matching/game/shared/stage/water_effects__Task_StageWaterTask.inc +++ /dev/null @@ -1,277 +0,0 @@ -.include "constants/constants.inc" - -.syntax unified -.text - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - sub sp, #0x1c - ldr r7, _0804C698 @ =gWater - ldr r5, _0804C69C @ =gCamera - ldr r0, _0804C6A0 @ =gStageTime - ldr r1, [r0] - movs r2, #1 - ands r1, r2 - adds r6, r0, #0 - cmp r1, #0 - beq _0804C6AC - ldrh r0, [r7, #2] - movs r1, #2 - ldrsh r2, [r7, r1] - movs r3, #4 - ldrsh r1, [r7, r3] - cmp r2, r1 - beq _0804C6AC - cmp r2, r1 - bge _0804C6A4 - adds r0, #1 - b _0804C6AA - .align 2, 0 -_0804C698: .4byte gWater -_0804C69C: .4byte gCamera -_0804C6A0: .4byte gStageTime -_0804C6A4: - cmp r2, r1 - ble _0804C6AC - subs r0, #1 -_0804C6AA: - strh r0, [r7, #2] -_0804C6AC: - ldrh r2, [r7, #2] - movs r4, #2 - ldrsh r1, [r7, r4] - ldrh r3, [r5, #2] - movs r4, #2 - ldrsh r0, [r5, r4] - cmp r1, r0 - bgt _0804C6C0 - movs r0, #0 - b _0804C6D4 -_0804C6C0: - movs r0, #2 - ldrsh r1, [r7, r0] - movs r4, #2 - ldrsh r0, [r5, r4] - adds r0, #0xa0 - cmp r1, r0 - bge _0804C6D2 - subs r0, r2, r3 - b _0804C6D4 -_0804C6D2: - movs r0, #0xff -_0804C6D4: - strb r0, [r7, #1] - ldr r3, _0804C77C @ =gVBlankCallbacks - ldr r2, _0804C780 @ =gNumVBlankCallbacks - ldrb r0, [r2] - adds r1, r0, #1 - strb r1, [r2] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x16 - adds r0, r0, r3 - ldr r1, _0804C784 @ =sa2__sub_8011A4C - str r1, [r0] - ldr r2, _0804C788 @ =gFlags - ldr r0, [r2] - movs r1, #0x10 - orrs r0, r1 - str r0, [r2] - ldrb r0, [r7] - subs r0, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0x9e - bhi _0804C756 - adds r4, r7, #0 - adds r4, #0x14 - ldr r0, [r6] - adds r0, #1 - lsrs r0, r0, #2 - ldrh r5, [r5] - adds r0, r0, r5 - movs r1, #0xf - ands r0, r1 - rsbs r0, r0, #0 - strh r0, [r4, #0x16] - ldrb r0, [r7, #1] - adds r0, #1 - strh r0, [r4, #0x18] - ldr r0, [r4, #0x10] - movs r1, #0xc0 - lsls r1, r1, #0xc - orrs r0, r1 - str r0, [r4, #0x10] - adds r0, r4, #0 - bl UpdateSpriteAnimation - ldr r0, [r6] - movs r1, #2 - ands r0, r1 - cmp r0, #0 - beq _0804C756 - ldrh r0, [r4, #0x18] - subs r0, #1 - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - cmp r0, #0xee - bhi _0804C756 - movs r5, #0x10 -_0804C744: - adds r0, r4, #0 - bl DisplaySprite - ldrh r0, [r4, #0x16] - adds r0, #0x10 - strh r0, [r4, #0x16] - subs r5, #1 - cmp r5, #0 - bge _0804C744 -_0804C756: - ldrb r1, [r7, #1] - subs r0, r1, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - adds r3, r1, #0 - cmp r0, #0x9e - bhi _0804C798 - ldr r1, _0804C78C @ =gIntrTable - ldr r0, _0804C790 @ =sa2__VCountIntr_8011ACC - str r0, [r1, #0xc] - ldr r1, _0804C794 @ =gVCountSetting - subs r0, r3, #1 - strb r0, [r1] - ldr r2, _0804C788 @ =gFlags - ldr r0, [r2] - movs r1, #0x40 - orrs r0, r1 - b _0804C7AA - .align 2, 0 -_0804C77C: .4byte gVBlankCallbacks -_0804C780: .4byte gNumVBlankCallbacks -_0804C784: .4byte sa2__sub_8011A4C -_0804C788: .4byte gFlags -_0804C78C: .4byte gIntrTable -_0804C790: .4byte sa2__VCountIntr_8011ACC -_0804C794: .4byte gVCountSetting -_0804C798: - ldr r1, _0804C7C0 @ =gIntrTable - ldr r0, _0804C7C4 @ =gIntrTableTemplate - ldr r0, [r0, #0xc] - str r0, [r1, #0xc] - ldr r2, _0804C7C8 @ =gFlags - ldr r0, [r2] - movs r1, #0x41 - rsbs r1, r1, #0 - ands r0, r1 -_0804C7AA: - str r0, [r2] - lsls r0, r3, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0x9f - bls _0804C7CC - ldr r0, [r2] - movs r1, #5 - rsbs r1, r1, #0 - ands r0, r1 - str r0, [r2] - b _0804C86C - .align 2, 0 -_0804C7C0: .4byte gIntrTable -_0804C7C4: .4byte gIntrTableTemplate -_0804C7C8: .4byte gFlags -_0804C7CC: - ldr r0, _0804C878 @ =gStageTime - ldr r1, [r0] - lsls r3, r1, #2 - ldr r2, _0804C87C @ =gBgScrollRegs - movs r6, #0xe - ldrsh r0, [r2, r6] - ldrb r4, [r7, #1] - adds r0, r0, r4 - movs r4, #0x1f - ands r0, r4 - lsls r0, r0, #6 - adds r3, r3, r0 - ldr r6, _0804C880 @ =0x000003FF - adds r5, r6, #0 - ands r3, r5 - movs r0, #2 - str r0, [sp] - movs r0, #0x40 - str r0, [sp, #4] - lsls r1, r1, #1 - movs r6, #0xe - ldrsh r0, [r2, r6] - ldrb r6, [r7, #1] - adds r0, r0, r6 - ands r0, r4 - lsls r0, r0, #5 - adds r1, r1, r0 - movs r0, #0x80 - lsls r0, r0, #1 - adds r1, r1, r0 - ands r1, r5 - str r1, [sp, #8] - movs r0, #0xa - str r0, [sp, #0xc] - movs r0, #0x20 - str r0, [sp, #0x10] - movs r1, #0xc - ldrsh r0, [r2, r1] - str r0, [sp, #0x14] - movs r4, #0xe - ldrsh r0, [r2, r4] - str r0, [sp, #0x18] - movs r0, #3 - movs r1, #0 - movs r2, #0x20 - bl sa2__sub_8007738 - movs r5, #0x20 - ldr r2, _0804C884 @ =0x040000D4 - ldr r0, _0804C888 @ =gBgOffsetsHBlankPrimary - ldr r4, [r0] - ldr r0, _0804C88C @ =gHBlankCopySize - ldrb r3, [r0] - lsls r0, r3, #5 - adds r1, r0, r4 - movs r6, #0x84 - lsls r6, r6, #0x18 - mov ip, r6 - mov r8, r0 -_0804C842: - str r4, [r2] - str r1, [r2, #4] - lsls r0, r3, #5 - asrs r0, r0, #2 - mov r6, ip - orrs r0, r6 - str r0, [r2, #8] - ldr r0, [r2, #8] - add r1, r8 - adds r5, #0x20 - cmp r5, #0x9f - bls _0804C842 - ldrb r0, [r7, #1] - cmp r0, #0 - beq _0804C86C - ldr r0, _0804C890 @ =gFlags - ldr r1, [r0] - movs r2, #5 - rsbs r2, r2, #0 - ands r1, r2 - str r1, [r0] -_0804C86C: - add sp, #0x1c - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_0804C878: .4byte gStageTime -_0804C87C: .4byte gBgScrollRegs -_0804C880: .4byte 0x000003FF -_0804C884: .4byte 0x040000D4 -_0804C888: .4byte gBgOffsetsHBlankPrimary -_0804C88C: .4byte gHBlankCopySize -_0804C890: .4byte gFlags - -.syntax divided diff --git a/sa1/src/game/shared/stage/water_effects.c b/sa1/src/game/shared/stage/water_effects.c index 6ac273d87..579b9fba7 100644 --- a/sa1/src/game/shared/stage/water_effects.c +++ b/sa1/src/game/shared/stage/water_effects.c @@ -99,6 +99,7 @@ static inline void MaskPaletteWithUnderwaterColor_inline(u32 *dst, u32 *src, u32 } } +#if (GAME == GAME_SA1) void sub_804C40C(void) { Water *water = &gWater; @@ -106,6 +107,7 @@ void sub_804C40C(void) MaskPaletteWithUnderwaterColor_inline((u32 *)&sPaletteBuffer[0], (u32 *)&gObjPalette[0], water->mask, 16 * 16); MaskPaletteWithUnderwaterColor_inline((u32 *)&sPaletteBuffer[16 * 16], (u32 *)&gBgPalette[0], water->mask, 16 * 16); } +#endif #if (GAME == GAME_SA2) void InitWaterPalettes(void) @@ -209,21 +211,12 @@ void CreateStageWaterTask(s32 waterLevel, u32 p1, u32 mask) } } -// (91.10%) https://decomp.me/scratch/zSeoc -NONMATCH("asm/non_matching/game/shared/stage/water_effects__Task_StageWaterTask.inc", void Task_StageWaterTask(void)) +void Task_StageWaterTask(void) { Water *water = &gWater; struct Camera *cam = &gCamera; bool32 active; Sprite *s; - u8 unk1; -#ifndef NON_MATCHING - register u8 unk2_0 asm("r0"); - register u8 unk2_2 asm("r2"); -#else - u8 unk2_0; - u8 unk2_2; -#endif #if (HAS_RUN_ON_WATER) if ((gCurrentLevel == LEVEL_INDEX(ZONE_1, ACT_1)) && (I(gPlayer.qWorldX) > 6665) && (I(gPlayer.qWorldX) <= 10650)) { @@ -258,8 +251,7 @@ NONMATCH("asm/non_matching/game/shared/stage/water_effects__Task_StageWaterTask. gVBlankCallbacks[gNumVBlankCallbacks++] = SA2_LABEL(sub_8011A4C); gFlags |= FLAGS_EXECUTE_VBLANK_CALLBACKS; - unk1 = water->SA2_LABEL(unk1) - 1; - if (unk1 < DISPLAY_HEIGHT - 1) { + if (water->SA2_LABEL(unk1) > 0 && water->SA2_LABEL(unk1) < DISPLAY_HEIGHT) { s = &water->s; s->x = -((cam->x + ((gStageTime + 1) >> 2)) & 15); s->y = water->SA2_LABEL(unk2) + 1; @@ -278,10 +270,9 @@ NONMATCH("asm/non_matching/game/shared/stage/water_effects__Task_StageWaterTask. } } - unk2_0 = (water->SA2_LABEL(unk2)); - if ((unk2_2 = unk2_0 - 1) < DISPLAY_HEIGHT - 1) { + if (water->SA2_LABEL(unk2) > 0 && water->SA2_LABEL(unk2) < DISPLAY_HEIGHT) { gIntrTable[INTR_INDEX_VCOUNT] = SA2_LABEL(VCountIntr_8011ACC); - gVCountSetting = unk2_0 - 1; + gVCountSetting = water->SA2_LABEL(unk2) - 1; gFlags |= FLAGS_40; } else { gIntrTable[INTR_INDEX_VCOUNT] = gIntrTableTemplate[INTR_INDEX_VCOUNT]; @@ -289,24 +280,21 @@ NONMATCH("asm/non_matching/game/shared/stage/water_effects__Task_StageWaterTask. } #if (GAME == GAME_SA1) - if (unk2_0 >= DISPLAY_HEIGHT) { + if (water->SA2_LABEL(unk2) >= DISPLAY_HEIGHT) { gFlags &= ~FLAGS_EXECUTE_HBLANK_COPY; } else { - s32 r3 = gStageTime * 4; - u32 r5; - s32 adder; - void *ptr; - r3 += (gBgScrollRegs[3][1] + water->SA2_LABEL(unk2) % 32u) << 6; - r3 %= 1024u; +#ifndef NON_MATCHING + UNUSED u32 _; +#endif + u32 r5, i; + s32 r3 = CLAMP_SIN_PERIOD(((gStageTime * 4) + (((gBgScrollRegs[3][1] + water->SA2_LABEL(unk2)) % 32u) << 6))); SA2_LABEL(sub_8007738) (3, 0, 32, r3, 2, 64, (((gStageTime * 2 + (((gBgScrollRegs[3][1] + water->SA2_LABEL(unk2)) % 32u) << 5))) + 0x100) & ONE_CYCLE, 10, 32, gBgScrollRegs[3][0], gBgScrollRegs[3][1]); - for (r5 = 32, ptr = gBgOffsetsHBlankPrimary + (adder = (gHBlankCopySize << 5)); r5 < DISPLAY_HEIGHT;) { - DmaCopy32(3, gBgOffsetsHBlankPrimary, ptr, (gHBlankCopySize << 5)); - ptr += adder; - r5 += 0x20; + for (r5 = 32, i = 1; r5 < DISPLAY_HEIGHT; i++, r5 += 32) { + DmaCopy32(3, gBgOffsetsHBlankPrimary, gBgOffsetsHBlankPrimary + ((gHBlankCopySize << 5) * i), (gHBlankCopySize << 5)); } if (water->SA2_LABEL(unk2)) { @@ -315,7 +303,6 @@ NONMATCH("asm/non_matching/game/shared/stage/water_effects__Task_StageWaterTask. } #endif } -END_NONMATCH #if (HAS_RUN_ON_WATER) void CreateRunOnWaterEffect(void) diff --git a/src/game/shared/stage/water_effects.c b/src/game/shared/stage/water_effects.c index 50b08ce21..5ede89c63 100644 --- a/src/game/shared/stage/water_effects.c +++ b/src/game/shared/stage/water_effects.c @@ -84,6 +84,17 @@ static inline void MaskPaletteWithUnderwaterColor_inline(u32 *dst, u32 *src, u32 } } +#if (GAME == GAME_SA1) +void sub_804C40C(void) +{ + Water *water = &gWater; + + MaskPaletteWithUnderwaterColor_inline((u32 *)&sPaletteBuffer[0], (u32 *)&gObjPalette[0], water->mask, 16 * 16); + MaskPaletteWithUnderwaterColor_inline((u32 *)&sPaletteBuffer[16 * 16], (u32 *)&gBgPalette[0], water->mask, 16 * 16); +} +#endif + +#if (GAME == GAME_SA2) void InitWaterPalettes(void) { u16 animId, character; @@ -137,6 +148,26 @@ void InitWaterPalettes(void) MaskPaletteWithUnderwaterColor_inline((u32 *)wd->pal[16], (u32 *)&GET_PALETTE_COLOR_BG(0, 0), water->mask, 16 * PALETTE_LEN_4BPP); } +#endif + +#if (GAME == GAME_SA1) +void LoadPalette423Anim(void) +{ + Sprite s; + s.graphics.dest = NULL; + s.graphics.anim = SA1_ANIM_LOAD_PALETTE_423; + s.variant = 0; + s.oamFlags = 0; + s.frameFlags = 0; + s.graphics.size = 0; + s.prevVariant = -1; + s.qAnimDelay = Q(0); + s.animSpeed = SPRITE_ANIM_SPEED(1.0); + s.palId = 0; + + UpdateSpriteAnimation(&s); +} +#endif void CreateStageWaterTask(s32 waterLevel, u32 p1, u32 mask) {