summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/battle/anim/water.c274
1 files changed, 84 insertions, 190 deletions
diff --git a/src/battle/anim/water.c b/src/battle/anim/water.c
index ce66c2ec1..b241bd722 100644
--- a/src/battle/anim/water.c
+++ b/src/battle/anim/water.c
@@ -359,6 +359,8 @@ void AnimTask_CreateSurfWave(u8 taskId)
void sub_80D3B60(u8 taskId)
{
struct Struct_sub_8078914 unk;
+
+ vu8 cpuDelay; // yet again
u8 i;
u16 rgbBuffer;
u16 *BGptrX = &gBattle_BG1_X;
@@ -385,6 +387,7 @@ void sub_80D3B60(u8 taskId)
}
if (++gTasks[taskId].data[6] > 1)
{
+ // there is some weird math going on here
gTasks[taskId].data[6] = 0;
unkUse = ++gTasks[taskId].data[3];
if (unkUse <= 13)
@@ -400,8 +403,20 @@ void sub_80D3B60(u8 taskId)
}
if (!(gTasks[gTasks[taskId].data[15]].data[1] & 0x1F))
{
- gTasks[taskId].data[0] = gTasks[gTasks[taskId].data[15]].data[1] & 0x1F;
- gTasks[taskId].func = sub_80D3D68;
+ Dma3FillLarge32_(0, unk.field_0, 0x2000); // !
+ cpuDelay = 0; // stall the CPU
+ cpuDelay = 0; // stall the CPU
+ Dma3FillLarge32_(0, unk.field_4, 0x1000); // !
+ if (!IsContest)
+ REG_BG1CNT_BITFIELD.charBaseBlock = 1;
+ *BGptrX = 0;
+ *BGptrY = 0;
+
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+
+ gTasks[gTasks[taskId].data[15]].data[15] = 0xffff;
+ DestroyAnimVisualTask(taskId);
}
}
#else
@@ -1668,17 +1683,77 @@ void sub_80D4CEC(struct Sprite *sprite)
sprite->data[0]++;
}
-#ifdef NONMATCHING
-void sub_80D4D64(struct Sprite *sprite, int xDiff, int yDiff)
+void sub_80D4D64(struct Sprite *sprite, s32 xDiff, s32 yDiff)
{
- s16 something = sprite->data[0] / 2;
- s16 combinedX = sprite->pos1.x + sprite->pos2.x;
- s16 combinedY = sprite->pos1.y + sprite->pos2.y;
- s16 randomSomethingY = yDiff + (Random() % 10) - 5;
- s16 randomSomethingX = -xDiff + (Random() % 10) - 5;
s16 i;
u8 spriteId;
+ s16 combinedX;
+ s16 combinedY;
+ s16 something;
+ s16 randomSomethingX;
+ s16 randomSomethingY;
+
+ something = sprite->data[0] / 2;
+ // regalloc acts funny here...
+ combinedX = sprite->pos1.x + sprite->pos2.x;
+ combinedY = sprite->pos1.y + sprite->pos2.y;
+ /*
+ Then goes back to normal at this exact point. Something must have existed here.
+ Whatever it was, it's not the traditional if (0) or do {} while (0). Nor is it
+ var++--. It's something completely obscene.
+
+ Upon random experiments, there was an observation about how parameters affected
+ regalloc in ways more bizarre than local variables. xDiff++; xDiff--; had actually
+ changed the regalloc immensely:
+
+ mov r2, #0x2e
+ ldrsh r1, [r0, r2]
+ lsr r2, r1, #0x1f
+ add r1, r1, r2
+ lsl r1, r1, #0xf
+ lsr r1, r1, #0x10
+ str r1, [sp]
+
+ ldrh r3, [r0, #0x24]
+ mov r8, r3
+ ldrh r1, [r0, #0x20]
+ add r8, r8, r1
+ mov r2, r8
+ lsl r2, r2, #0x10
+ lsr r2, r2, #0x10
+ mov r8, r2
+
+ ldrh r6, [r0, #0x26]
+ ldrh r0, [r0, #0x22]
+ add r6, r6, r0
+ lsl r6, r6, #0x10
+ lsr r6, r6, #0x10
+
+ compared to doing the same to a local variable, where there was no change at
+ all. It's more similar to the actual ASM, but not quite, telling us that
+ something did indeed poke xDiff, but not through mathematical statements.
+ The only ideal possibility to turn to in this situation now would be an if
+ statement.
+ */
+ if (xDiff)
+ {
+ /*
+ if (xDiff) by itself won't match, so something needs to
+ be in here.
+
+ Virtually nothing what you are about to see is in the
+ assembly, you just have to to come up a strange variety
+ of compile time scenarios, question reality, and see if
+ something happens.
+ */
+ u8 unk = -unk; // ...this is what I came up with. It matches.
+ // i = -i; // This matches too. It might just work on any uninitialized.
+ }
+
+ randomSomethingY = yDiff + (Random() % 10) - 5;
+ randomSomethingX = -xDiff + (Random() % 10) - 5;
+
for (i = 0; i <= 0; i++)
{
spriteId = CreateSprite(&gSpriteTemplate_83D9420, combinedX, combinedY + something, 130);
@@ -1702,184 +1777,3 @@ void sub_80D4D64(struct Sprite *sprite, int xDiff, int yDiff)
gSprites[spriteId].data[2] = randomSomethingX;
}
}
-#else
-NAKED
-void sub_80D4D64(struct Sprite *sprite, int xDiff, int yDiff)
-{
- asm_unified("push {r4-r7,lr}\n\
- mov r7, r10\n\
- mov r6, r9\n\
- mov r5, r8\n\
- push {r5-r7}\n\
- sub sp, 0x18\n\
- adds r4, r1, 0\n\
- adds r5, r2, 0\n\
- movs r2, 0x2E\n\
- ldrsh r1, [r0, r2]\n\
- lsrs r2, r1, 31\n\
- adds r1, r2\n\
- lsls r1, 15\n\
- lsrs r1, 16\n\
- str r1, [sp]\n\
- ldrh r1, [r0, 0x24]\n\
- ldrh r3, [r0, 0x20]\n\
- adds r1, r3\n\
- lsls r1, 16\n\
- lsrs r1, 16\n\
- mov r8, r1\n\
- ldrh r1, [r0, 0x26]\n\
- ldrh r0, [r0, 0x22]\n\
- adds r1, r0\n\
- lsls r1, 16\n\
- lsrs r1, 16\n\
- mov r10, r1\n\
- bl Random\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- movs r1, 0xA\n\
- bl __umodsi3\n\
- adds r0, r5, r0\n\
- subs r0, 0x5\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- mov r9, r0\n\
- bl Random\n\
- negs r4, r4\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- movs r1, 0xA\n\
- bl __umodsi3\n\
- adds r4, r0\n\
- subs r4, 0x5\n\
- lsls r4, 16\n\
- lsrs r7, r4, 16\n\
- movs r6, 0\n\
- mov r0, r8\n\
- lsls r0, 16\n\
- mov r8, r0\n\
- mov r1, r10\n\
- lsls r1, 16\n\
- str r1, [sp, 0xC]\n\
- ldr r2, [sp]\n\
- lsls r2, 16\n\
- str r2, [sp, 0x10]\n\
- asrs r1, 16\n\
- lsls r0, r7, 16\n\
- asrs r5, r0, 16\n\
- str r0, [sp, 0x14]\n\
- negs r3, r5\n\
- str r3, [sp, 0x4]\n\
- asrs r0, r2, 16\n\
- adds r1, r0\n\
- lsls r1, 16\n\
- mov r10, r1\n\
-_080D4DF2:\n\
- ldr r0, =gSpriteTemplate_83D9420\n\
- mov r2, r8\n\
- asrs r1, r2, 16\n\
- mov r3, r10\n\
- asrs r2, r3, 16\n\
- movs r3, 0x82\n\
- bl CreateSprite\n\
- lsls r0, 24\n\
- lsrs r2, r0, 24\n\
- ldr r1, =gSprites\n\
- lsls r0, r2, 4\n\
- adds r0, r2\n\
- lsls r0, 2\n\
- adds r4, r0, r1\n\
- movs r0, 0x14\n\
- strh r0, [r4, 0x2E]\n\
- mov r0, r9\n\
- strh r0, [r4, 0x30]\n\
- ldr r0, =gBattleAnimAttacker\n\
- ldrb r0, [r0]\n\
- bl GetBattlerSubpriority\n\
- subs r0, 0x1\n\
- adds r1, r4, 0\n\
- adds r1, 0x43\n\
- strb r0, [r1]\n\
- cmp r5, 0\n\
- bge _080D4E40\n\
- mov r1, sp\n\
- ldrh r1, [r1, 0x4]\n\
- strh r1, [r4, 0x32]\n\
- b _080D4E42\n\
- .align 2, 0\n\
- .pool\n\
-_080D4E40:\n\
- strh r7, [r4, 0x32]\n\
-_080D4E42:\n\
- lsls r0, r6, 16\n\
- movs r2, 0x80\n\
- lsls r2, 9\n\
- adds r0, r2\n\
- lsrs r6, r0, 16\n\
- cmp r0, 0\n\
- ble _080D4DF2\n\
- movs r6, 0\n\
- ldr r3, [sp, 0xC]\n\
- asrs r1, r3, 16\n\
- ldr r0, [sp, 0x14]\n\
- asrs r5, r0, 16\n\
- negs r2, r5\n\
- str r2, [sp, 0x8]\n\
- ldr r3, [sp, 0x10]\n\
- asrs r0, r3, 16\n\
- subs r1, r0\n\
- lsls r1, 16\n\
- mov r10, r1\n\
-_080D4E68:\n\
- ldr r0, =gSpriteTemplate_83D9420\n\
- mov r2, r8\n\
- asrs r1, r2, 16\n\
- mov r3, r10\n\
- asrs r2, r3, 16\n\
- movs r3, 0x82\n\
- bl CreateSprite\n\
- lsls r0, 24\n\
- lsrs r2, r0, 24\n\
- ldr r1, =gSprites\n\
- lsls r0, r2, 4\n\
- adds r0, r2\n\
- lsls r0, 2\n\
- adds r4, r0, r1\n\
- movs r0, 0x14\n\
- strh r0, [r4, 0x2E]\n\
- mov r0, r9\n\
- strh r0, [r4, 0x30]\n\
- ldr r0, =gBattleAnimAttacker\n\
- ldrb r0, [r0]\n\
- bl GetBattlerSubpriority\n\
- subs r0, 0x1\n\
- adds r1, r4, 0\n\
- adds r1, 0x43\n\
- strb r0, [r1]\n\
- cmp r5, 0\n\
- ble _080D4EB8\n\
- mov r1, sp\n\
- ldrh r1, [r1, 0x8]\n\
- strh r1, [r4, 0x32]\n\
- b _080D4EBA\n\
- .align 2, 0\n\
- .pool\n\
-_080D4EB8:\n\
- strh r7, [r4, 0x32]\n\
-_080D4EBA:\n\
- lsls r0, r6, 16\n\
- movs r2, 0x80\n\
- lsls r2, 9\n\
- adds r0, r2\n\
- lsrs r6, r0, 16\n\
- cmp r0, 0\n\
- ble _080D4E68\n\
- add sp, 0x18\n\
- pop {r3-r5}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- mov r10, r5\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n");
-}
-#endif