sa1: match src/game/shared/stage/water_effects.c

This commit is contained in:
Oliver Bell committed 2026-04-23 20:18:29 +01:00
1 parent e9494fa607
commit 15e38aff6c
3 files changed
+45 -304

No files matched your search

@@ -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
+14 -27
View File
@@ -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)
+31
View File
@@ -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)
{