diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle/anim/flying.c | 208 | ||||
-rw-r--r-- | src/battle/anim/psychic.c | 135 | ||||
-rw-r--r-- | src/battle/anim/water.c | 118 | ||||
-rw-r--r-- | src/battle_script_commands.c | 3 |
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++) |