summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle/anim/flying.c208
-rw-r--r--src/battle/anim/psychic.c135
-rw-r--r--src/battle/anim/water.c118
-rw-r--r--src/battle_script_commands.c3
4 files changed, 158 insertions, 306 deletions
diff --git a/src/battle/anim/flying.c b/src/battle/anim/flying.c
index 407c9a08f..64991d161 100644
--- a/src/battle/anim/flying.c
+++ b/src/battle/anim/flying.c
@@ -2330,195 +2330,59 @@ void sub_80DB330(struct Sprite *sprite)
}
}
-#ifdef NONMATCHING
void sub_80DB374(struct Sprite *sprite)
{
- // NONMATCHING - Functionally equivalent - slight register swap at end
-
u32 matrixNum;
- int t1, t3;
- s16 t2;
+ int t1, t2;
switch (sprite->data[0])
{
+ case 0:
+ if (!gBattleAnimArgs[0])
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1);
+ }
+ else
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 1);
+ }
- case 0:
- if (!gBattleAnimArgs[0])
- {
- sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0);
- sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1);
- }
- else
- {
- sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
- sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 1);
- }
-
- sprite->data[1] = 512;
+ sprite->data[1] = 512;
- sub_8078FDC(sprite, 0, 256, sprite->data[1], 0);
- ++sprite->data[0];
- break;
- case 1:
- if (sprite->data[2] <= 11)
- {
- sprite->data[1] -= 40;
- }
- else
- {
- sprite->data[1] += 40;
- }
+ sub_8078FDC(sprite, 0, 256, sprite->data[1], 0);
+ sprite->data[0]++;
+ break;
+ case 1:
+ if (sprite->data[2] <= 11)
+ sprite->data[1] -= 40;
+ else
+ sprite->data[1] += 40;
- ++sprite->data[2];
+ sprite->data[2]++;
- sub_8078FDC(sprite, 0, 256, sprite->data[1], 0);
+ sub_8078FDC(sprite, 0, 256, sprite->data[1], 0);
- matrixNum = sprite->oam.matrixNum;
+ matrixNum = sprite->oam.matrixNum;
- t1 = 15616;
- t2 = gOamMatrices[matrixNum].d;
- t3 = t1 / t2 + 1;
+ t1 = 15616;
+ t2 = t1 / gOamMatrices[matrixNum].d + 1;
- if (t3 > 128)
- {
- t3 = 128;
- }
+ if (t2 > 128)
+ t2 = 128;
- /* NONMATCHING
- * compiles to:
- * asr r0, r0, #0x1
- strh r0, [r5, #0x26]
- * needed:
- * asrs r1, r0, 1
- * strh r1, [r5, 0x26] */
- sprite->pos2.y = (64 - t3) / 2;
+ t2 = (64 - t2) / 2;
+ sprite->pos2.y = t2;
- if (sprite->data[2] == 24)
- {
- sub_8079098(sprite);
- DestroyAnimSprite(sprite);
- }
+ if (sprite->data[2] == 24)
+ {
+ sub_8079098(sprite);
+ DestroyAnimSprite(sprite);
+ }
+ break;
}
}
-#else
-NAKED
-void sub_80DB374(struct Sprite *sprite)
-{
- asm_unified("push {r4,r5,lr}\n\
- sub sp, 0x4\n\
- adds r5, r0, 0\n\
- movs r1, 0x2E\n\
- ldrsh r0, [r5, r1]\n\
- cmp r0, 0\n\
- beq _080DB388\n\
- cmp r0, 0x1\n\
- beq _080DB3E0\n\
- b _080DB44C\n\
-_080DB388:\n\
- ldr r0, _080DB398 @ =gBattleAnimArgs\n\
- movs r2, 0\n\
- ldrsh r0, [r0, r2]\n\
- cmp r0, 0\n\
- bne _080DB3A0\n\
- ldr r4, _080DB39C @ =gBattleAnimAttacker\n\
- b _080DB3A2\n\
- .align 2, 0\n\
-_080DB398: .4byte gBattleAnimArgs\n\
-_080DB39C: .4byte gBattleAnimAttacker\n\
-_080DB3A0:\n\
- ldr r4, _080DB3DC @ =gBattleAnimTarget\n\
-_080DB3A2:\n\
- ldrb r0, [r4]\n\
- movs r1, 0\n\
- bl GetBattlerSpriteCoord\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- strh r0, [r5, 0x20]\n\
- ldrb r0, [r4]\n\
- movs r1, 0x1\n\
- bl GetBattlerSpriteCoord\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- strh r0, [r5, 0x22]\n\
- movs r0, 0\n\
- movs r3, 0x80\n\
- lsls r3, 2\n\
- strh r3, [r5, 0x30]\n\
- movs r2, 0x80\n\
- lsls r2, 1\n\
- str r0, [sp]\n\
- adds r0, r5, 0\n\
- movs r1, 0\n\
- bl sub_8078FDC\n\
- ldrh r0, [r5, 0x2E]\n\
- adds r0, 0x1\n\
- strh r0, [r5, 0x2E]\n\
- b _080DB44C\n\
- .align 2, 0\n\
-_080DB3DC: .4byte gBattleAnimTarget\n\
-_080DB3E0:\n\
- movs r1, 0x32\n\
- ldrsh r0, [r5, r1]\n\
- cmp r0, 0xB\n\
- bgt _080DB3EE\n\
- ldrh r0, [r5, 0x30]\n\
- subs r0, 0x28\n\
- b _080DB3F2\n\
-_080DB3EE:\n\
- ldrh r0, [r5, 0x30]\n\
- adds r0, 0x28\n\
-_080DB3F2:\n\
- strh r0, [r5, 0x30]\n\
- ldrh r0, [r5, 0x32]\n\
- adds r0, 0x1\n\
- movs r1, 0\n\
- strh r0, [r5, 0x32]\n\
- movs r2, 0x80\n\
- lsls r2, 1\n\
- movs r0, 0x30\n\
- ldrsh r3, [r5, r0]\n\
- str r1, [sp]\n\
- adds r0, r5, 0\n\
- bl sub_8078FDC\n\
- ldrb r1, [r5, 0x3]\n\
- lsls r1, 26\n\
- lsrs r1, 27\n\
- movs r0, 0xF4\n\
- lsls r0, 6\n\
- ldr r2, _080DB454 @ =gOamMatrices\n\
- lsls r1, 3\n\
- adds r1, r2\n\
- movs r2, 0x6\n\
- ldrsh r1, [r1, r2]\n\
- bl __divsi3\n\
- adds r1, r0, 0x1\n\
- cmp r1, 0x80\n\
- ble _080DB42C\n\
- movs r1, 0x80\n\
-_080DB42C:\n\
- movs r0, 0x40\n\
- subs r0, r1\n\
- lsrs r1, r0, 31\n\
- adds r0, r1\n\
- asrs r1, r0, 1\n\
- strh r1, [r5, 0x26]\n\
- movs r1, 0x32\n\
- ldrsh r0, [r5, r1]\n\
- cmp r0, 0x18\n\
- bne _080DB44C\n\
- adds r0, r5, 0\n\
- bl sub_8079098\n\
- adds r0, r5, 0\n\
- bl DestroyAnimSprite\n\
-_080DB44C:\n\
- add sp, 0x4\n\
- pop {r4,r5}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_080DB454: .4byte gOamMatrices\n");
-}
-#endif
void sub_80DB458(struct Sprite *sprite)
{
diff --git a/src/battle/anim/psychic.c b/src/battle/anim/psychic.c
index 84a7741e1..c76e522f4 100644
--- a/src/battle/anim/psychic.c
+++ b/src/battle/anim/psychic.c
@@ -1042,17 +1042,14 @@ static void sub_80DC3F4(u8 taskId)
}
}
-#ifdef NONMATCHING
void sub_80DC4F4(u8 taskId)
{
s16 spriteId;
- u8 matrixNum;
- register u8 matrixNum2 asm("r6");
+ s16 matrixNum;
struct Task *task = &gTasks[taskId];
matrixNum = AllocOamMatrix();
- matrixNum2 = matrixNum;
- if (matrixNum2 == 0xFF)
+ if (matrixNum == 0xFF)
{
DestroyAnimVisualTask(taskId);
return;
@@ -1068,7 +1065,7 @@ void sub_80DC4F4(u8 taskId)
gSprites[spriteId].callback = SpriteCallbackDummy;
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE;
- gSprites[spriteId].oam.matrixNum = matrixNum2;
+ gSprites[spriteId].oam.matrixNum = matrixNum;
gSprites[spriteId].affineAnimPaused = 1;
gSprites[spriteId].subpriority++;
obj_id_set_rotscale(spriteId, 256, 256, 0);
@@ -1079,132 +1076,6 @@ void sub_80DC4F4(u8 taskId)
task->data[15] = spriteId;
task->func = sub_80DC5F4;
}
-#else
-NAKED
-void sub_80DC4F4(u8 taskId)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r10\n\
- mov r6, r9\n\
- mov r5, r8\n\
- push {r5-r7}\n\
- lsls r0, 24\n\
- lsrs r4, r0, 24\n\
- mov r8, r4\n\
- lsls r0, r4, 2\n\
- adds r0, r4\n\
- lsls r0, 3\n\
- ldr r1, _080DC528 @ =gTasks\n\
- adds r7, r0, r1\n\
- bl AllocOamMatrix\n\
- lsls r0, 24\n\
- lsrs r5, r0, 24\n\
- mov r10, r5\n\
- adds r6, r5, 0\n\
- cmp r6, 0xFF\n\
- bne _080DC52C\n\
- adds r0, r4, 0\n\
- bl DestroyAnimVisualTask\n\
- b _080DC5D6\n\
- .align 2, 0\n\
-_080DC528: .4byte gTasks\n\
-_080DC52C:\n\
- ldr r1, _080DC550 @ =gBattleAnimArgs\n\
- ldrb r0, [r1]\n\
- bl duplicate_obj_of_side_rel2move_in_transparent_mode\n\
- lsls r0, 16\n\
- lsrs r1, r0, 16\n\
- mov r9, r1\n\
- asrs r0, 16\n\
- cmp r0, 0\n\
- bge _080DC554\n\
- adds r0, r5, 0\n\
- bl FreeOamMatrix\n\
- mov r0, r8\n\
- bl DestroyAnimVisualTask\n\
- b _080DC5D6\n\
- .align 2, 0\n\
-_080DC550: .4byte gBattleAnimArgs\n\
-_080DC554:\n\
- ldr r2, _080DC5E4 @ =gSprites\n\
- lsls r4, r0, 4\n\
- adds r4, r0\n\
- lsls r4, 2\n\
- adds r0, r2, 0\n\
- adds r0, 0x1C\n\
- adds r0, r4, r0\n\
- ldr r1, _080DC5E8 @ =SpriteCallbackDummy\n\
- str r1, [r0]\n\
- adds r4, r2\n\
- ldrb r0, [r4, 0x1]\n\
- movs r1, 0x3\n\
- orrs r0, r1\n\
- strb r0, [r4, 0x1]\n\
- movs r0, 0x1F\n\
- ands r6, r0\n\
- lsls r2, r6, 1\n\
- ldrb r1, [r4, 0x3]\n\
- movs r0, 0x3F\n\
- negs r0, r0\n\
- ands r0, r1\n\
- orrs r0, r2\n\
- strb r0, [r4, 0x3]\n\
- adds r2, r4, 0\n\
- adds r2, 0x2C\n\
- ldrb r0, [r2]\n\
- movs r1, 0x80\n\
- orrs r0, r1\n\
- strb r0, [r2]\n\
- adds r1, r4, 0\n\
- adds r1, 0x43\n\
- ldrb r0, [r1]\n\
- adds r0, 0x1\n\
- strb r0, [r1]\n\
- mov r1, r9\n\
- lsls r0, r1, 24\n\
- lsrs r0, 24\n\
- movs r2, 0x80\n\
- lsls r2, 1\n\
- adds r1, r2, 0\n\
- movs r3, 0\n\
- bl obj_id_set_rotscale\n\
- ldrb r3, [r4, 0x1]\n\
- lsrs r1, r3, 6\n\
- ldrb r2, [r4, 0x3]\n\
- lsrs r2, 6\n\
- lsls r3, 30\n\
- lsrs r3, 30\n\
- adds r0, r4, 0\n\
- bl CalcCenterToCornerVec\n\
- ldr r1, _080DC5EC @ =gBattleAnimArgs\n\
- ldrb r0, [r1]\n\
- bl GetAnimBattlerSpriteId\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- strh r0, [r7, 0x22]\n\
- mov r0, r10\n\
- strh r0, [r7, 0x24]\n\
- mov r1, r9\n\
- strh r1, [r7, 0x26]\n\
- ldr r0, _080DC5F0 @ =sub_80DC5F4\n\
- str r0, [r7]\n\
-_080DC5D6:\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\
- .align 2, 0\n\
-_080DC5E4: .4byte gSprites\n\
-_080DC5E8: .4byte SpriteCallbackDummy\n\
-_080DC5EC: .4byte gBattleAnimArgs\n\
-_080DC5F0: .4byte sub_80DC5F4\n\
- .syntax divided\n");
-}
-#endif // NONMATCHING
void sub_80DC5F4(u8 taskId)
{
diff --git a/src/battle/anim/water.c b/src/battle/anim/water.c
index 98e50f17f..9d89942aa 100644
--- a/src/battle/anim/water.c
+++ b/src/battle/anim/water.c
@@ -1,5 +1,7 @@
#include "global.h"
#include "battle.h"
+#include "decompress.h"
+#include "graphics.h"
#include "battle_anim.h"
#include "random.h"
#include "rom_8077ABC.h"
@@ -25,6 +27,7 @@ void sub_8078F40(u8);
void sub_8079A64(u8);
void sub_80D37FC(struct Sprite *sprite);
void sub_80D3838(struct Sprite *sprite);
+void sub_80D3B60(u8 taskId);
void sub_80D3D68(u8 taskId);
void sub_80D4044(struct Sprite *sprite);
void sub_80D40A8(struct Sprite *);
@@ -260,9 +263,121 @@ static void sub_80D3874(struct Sprite *sprite)
}
}
-NAKED
+/*
+ Presumably a macro GF used to stall the CPU for
+ a bit of time so that DMA can finish, likely for
+ debugging purposes.
+*/
+#define cpuWait() \
+{ \
+ vu8 cpuDelay = 0; \
+ cpu_delay = 0; \
+}
+
+/*
+ Despite how close the attempt is, there's still a regswap
+ that throws everything over. Could the way data is currently
+ linked be the problem here?
+*/
+#ifdef NONMATCHING
void AnimTask_CreateSurfWave(u8 taskId)
{
+ struct Struct_sub_8078914 subStruct;
+ u8 taskId2;
+ u16* x = &gBattle_BG1_X;
+ u16* y = &gBattle_BG1_Y;
+
+ REG_BLDCNT = BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL;
+ REG_BLDALPHA = 0x1000;
+ REG_BG1CNT_BITFIELD.priority = 1;
+ REG_BG1CNT_BITFIELD.screenSize = 1;
+
+ sub_8078914(&subStruct);
+
+ DmaFill32Defvars(3, 0, subStruct.field_0, 0x2000);
+ cpuWait(); // wait for DMA to finish
+ DmaFill32Defvars(3, 0, subStruct.field_4, 0x1000);
+
+ if (IsContest() == 0)
+ {
+ REG_BG1CNT_BITFIELD.charBaseBlock = 1;
+ if (GetBattlerSide(gBattleAnimAttacker) == 1)
+ {
+ LZDecompressVram(&gUnknown_08E70968, subStruct.field_4);
+ }
+ else
+ {
+ LZDecompressVram(&gUnknown_08E70C38, subStruct.field_4);
+ }
+ }
+ else
+ {
+ LZDecompressVram(&gUnknown_08E70F0C, subStruct.field_4);
+ sub_80763FC(subStruct.field_8, (u16 *)subStruct.field_4, 0, 1);
+ }
+
+ LZDecompressVram(&gBattleAnimBackgroundImage_Surf, subStruct.field_0);
+
+ if (gBattleAnimArgs[0] == 0)
+ {
+ LoadCompressedPalette(&gBattleAnimBackgroundPalette_Surf, 16 * subStruct.field_8, 32);
+ }
+ else
+ {
+ LoadCompressedPalette(&gBattleAnimBackgroundImageMuddyWater_Pal, 16 * subStruct.field_8, 32);
+ }
+
+ taskId2 = CreateTask(sub_80D3D68, gTasks[taskId].priority + 1);
+ gTasks[taskId].data[15] = taskId2;
+ gTasks[taskId2].data[0] = 0;
+ gTasks[taskId2].data[1] = 0x1000;
+ gTasks[taskId2].data[2] = 0x1000;
+
+ if (IsContest())
+ {
+ *x = -80;
+ *y = -48;
+ gTasks[taskId].data[0] = 2;
+ gTasks[taskId].data[1] = 1;
+ gTasks[taskId2].data[3] = 0;
+ }
+ else if (GetBattlerSide(gBattleAnimAttacker) == 1)
+ {
+ *x = -224;
+ *y = 256;
+ gTasks[taskId].data[0] = 2;
+ gTasks[taskId].data[1] = -1;
+ gTasks[taskId2].data[3] = 1;
+ }
+ else
+ {
+ *x = 0;
+ *y = -48;
+ gTasks[taskId].data[0] = -2;
+ gTasks[taskId].data[1] = 1;
+ gTasks[taskId2].data[3] = 0;
+ }
+
+ REG_BG1HOFS = *x;
+ REG_BG1VOFS = *y;
+
+ if(gTasks[taskId2].data[3] == 0)
+ {
+ gTasks[taskId2].data[4] = 48;
+ gTasks[taskId2].data[5] = 112;
+ }
+ else
+ {
+ gTasks[taskId2].data[4] = 0;
+ gTasks[taskId2].data[5] = 0;
+ }
+
+ gTasks[taskId].data[6] = 1;
+ gTasks[taskId].func = sub_80D3B60;
+}
+#else
+NAKED void AnimTask_CreateSurfWave(u8 taskId)
+{
asm(".syntax unified\n\
.equ REG_BLDCNT, 0x4000050\n\
.equ REG_BG1CNT, 0x400000A\n\
@@ -578,6 +693,7 @@ _080D3B38:\n\
_080D3B5C: .4byte sub_80D3B60\n\
.syntax divided\n");
}
+#endif // NONMATCHING
#ifdef NONMATCHING
void sub_80D3B60(u8 taskId)
diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c
index 132de3626..950536d6b 100644
--- a/src/battle_script_commands.c
+++ b/src/battle_script_commands.c
@@ -5572,6 +5572,7 @@ static void atk23_getexp(void)
}
}
+// very close permutation but still isn't right
#ifdef NONMATCHING
static void atk24(void)
{
@@ -5580,7 +5581,7 @@ static void atk24(void)
s32 found1;
s32 found2;
- // maybe it should be like this, plethora of other atk routines do it too
+ // should...? be like this, plethora of other attack routines do it too
if (gBattleControllerExecFlags == 0) // cmp r0, 0
{ // beq 0x80209C6
for (i = 0; i < 6; i++)