diff options
Diffstat (limited to 'src/battle')
-rw-r--r-- | src/battle/anim/dark.c | 254 | ||||
-rw-r--r-- | src/battle/anim/flying.c | 208 | ||||
-rw-r--r-- | src/battle/anim/ice.c | 939 | ||||
-rw-r--r-- | src/battle/anim/psychic.c | 135 | ||||
-rw-r--r-- | src/battle/anim/water.c | 1043 |
5 files changed, 327 insertions, 2252 deletions
diff --git a/src/battle/anim/dark.c b/src/battle/anim/dark.c index d3d992bda..08aafe195 100644 --- a/src/battle/anim/dark.c +++ b/src/battle/anim/dark.c @@ -730,215 +730,55 @@ static void sub_80E0620(u8 taskId) } } -// static void sub_80E079C(struct Task *task) -// { -// int var0, var1; -// s16 var2; -// s16 i, j; - -// var2 = task->data[5] - task->data[4]; -// if (var2 != 0) -// { -// var0 = task->data[13] / var2; -// var1 = task->data[6]; - -// for (i = 0; i < task->data[4]; i++) -// { -// gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[10] - (i - 159); -// } - -// for (i = task->data[4]; i <= task->data[5]; i++) -// { -// if (i >= 0) -// { -// gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = (var1 - i) + task->data[10]; -// } - -// var1 += var0; -// } - -// for (j = i; j < task->data[7]; j++) -// { -// if (j >= 0) -// { -// gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][j] = (task->data[10] + 159) - j; -// } -// } -// } -// else -// { -// for (i = 0; i < 112; i++) -// { -// gScanlineEffectRegBuffers[0][i] = task->data[10] + 159 - i; -// gScanlineEffectRegBuffers[1][i] = task->data[10] + 159 - i; -// } -// } -// } - -NAKED static void sub_80E079C(struct Task *task) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - adds r6, r0, 0\n\ - ldrh r0, [r6, 0x12]\n\ - ldrh r4, [r6, 0x10]\n\ - subs r0, r4\n\ - lsls r0, 16\n\ - asrs r1, r0, 16\n\ - cmp r1, 0\n\ - beq _080E0890\n\ - movs r2, 0x22\n\ - ldrsh r0, [r6, r2]\n\ - bl __divsi3\n\ - mov r8, r0\n\ - movs r3, 0x14\n\ - ldrsh r0, [r6, r3]\n\ - lsls r5, r0, 8\n\ - lsls r0, r4, 16\n\ - movs r4, 0\n\ - cmp r0, 0\n\ - ble _080E07FC\n\ - ldr r0, _080E0888 @ =gScanlineEffectRegBuffers\n\ - mov r12, r0\n\ - ldr r7, _080E088C @ =gScanlineEffect\n\ -_080E07D0:\n\ - lsls r2, r4, 16\n\ - asrs r2, 16\n\ - lsls r3, r2, 1\n\ - ldrb r1, [r7, 0x14]\n\ - lsls r0, r1, 4\n\ - subs r0, r1\n\ - lsls r0, 7\n\ - adds r3, r0\n\ - add r3, r12\n\ - adds r1, r2, 0\n\ - subs r1, 0x9F\n\ - ldrh r0, [r6, 0x1C]\n\ - subs r0, r1\n\ - strh r0, [r3]\n\ - adds r2, 0x1\n\ - lsls r2, 16\n\ - lsrs r4, r2, 16\n\ - asrs r2, 16\n\ - movs r1, 0x10\n\ - ldrsh r0, [r6, r1]\n\ - cmp r2, r0\n\ - blt _080E07D0\n\ -_080E07FC:\n\ - ldrh r4, [r6, 0x10]\n\ - lsls r3, r4, 16\n\ - asrs r1, r3, 16\n\ - movs r2, 0x12\n\ - ldrsh r0, [r6, r2]\n\ - cmp r1, r0\n\ - bgt _080E0846\n\ - ldr r0, _080E0888 @ =gScanlineEffectRegBuffers\n\ - mov r12, r0\n\ - ldr r7, _080E088C @ =gScanlineEffect\n\ -_080E0810:\n\ - asrs r4, r3, 16\n\ - cmp r4, 0\n\ - blt _080E0832\n\ - asrs r1, r5, 8\n\ - subs r1, r4\n\ - lsls r3, r4, 1\n\ - ldrb r2, [r7, 0x14]\n\ - lsls r0, r2, 4\n\ - subs r0, r2\n\ - lsls r0, 7\n\ - adds r3, r0\n\ - add r3, r12\n\ - lsls r1, 16\n\ - asrs r1, 16\n\ - ldrh r2, [r6, 0x1C]\n\ - adds r1, r2\n\ - strh r1, [r3]\n\ -_080E0832:\n\ - add r5, r8\n\ - adds r0, r4, 0x1\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - lsls r3, r4, 16\n\ - asrs r1, r3, 16\n\ - movs r2, 0x12\n\ - ldrsh r0, [r6, r2]\n\ - cmp r1, r0\n\ - ble _080E0810\n\ -_080E0846:\n\ - movs r3, 0x1C\n\ - ldrsh r0, [r6, r3]\n\ - adds r0, 0x9F\n\ - lsls r2, r4, 16\n\ - asrs r1, r2, 16\n\ - subs r5, r0, r1\n\ - movs r3, 0x16\n\ - ldrsh r0, [r6, r3]\n\ - cmp r1, r0\n\ - bge _080E08BE\n\ - ldr r7, _080E0888 @ =gScanlineEffectRegBuffers\n\ - ldr r4, _080E088C @ =gScanlineEffect\n\ -_080E085E:\n\ - asrs r3, r2, 16\n\ - cmp r3, 0\n\ - blt _080E0876\n\ - lsls r2, r3, 1\n\ - ldrb r1, [r4, 0x14]\n\ - lsls r0, r1, 4\n\ - subs r0, r1\n\ - lsls r0, 7\n\ - adds r2, r0\n\ - adds r2, r7\n\ - strh r5, [r2]\n\ - subs r5, 0x1\n\ -_080E0876:\n\ - adds r0, r3, 0x1\n\ - lsls r2, r0, 16\n\ - asrs r1, r2, 16\n\ - movs r3, 0x16\n\ - ldrsh r0, [r6, r3]\n\ - cmp r1, r0\n\ - blt _080E085E\n\ - b _080E08BE\n\ - .align 2, 0\n\ -_080E0888: .4byte gScanlineEffectRegBuffers\n\ -_080E088C: .4byte gScanlineEffect\n\ -_080E0890:\n\ - movs r1, 0x1C\n\ - ldrsh r0, [r6, r1]\n\ - adds r5, r0, 0\n\ - adds r5, 0x9F\n\ - movs r4, 0\n\ - ldr r3, _080E08C8 @ =gScanlineEffectRegBuffers\n\ - movs r2, 0xF0\n\ - lsls r2, 3\n\ - adds r6, r3, r2\n\ -_080E08A2:\n\ - lsls r0, r4, 16\n\ - asrs r0, 16\n\ - lsls r2, r0, 1\n\ - adds r1, r2, r3\n\ - strh r5, [r1]\n\ - adds r2, r6\n\ - strh r5, [r2]\n\ - subs r5, 0x1\n\ - adds r0, 0x1\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x6F\n\ - ble _080E08A2\n\ -_080E08BE:\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080E08C8: .4byte gScanlineEffectRegBuffers\n\ - .syntax divided\n"); + int var0, var1; + s16 var2; + s16 i; + int var4; + + var2 = task->data[5] - task->data[4]; + if (var2 != 0) + { + var0 = task->data[13] / var2; + var1 = task->data[6] << 8; + + for (i = 0; i < task->data[4]; i++) + { + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[10] - (i - 159); + } + + for (i = task->data[4]; i <= task->data[5]; i++) + { + if (i >= 0) + { + s16 var3 = (var1 >> 8) - i; + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var3 + task->data[10]; + } + + var1 += var0; + } + + var4 = task->data[10] - (i - 159); + for (i = i; i < task->data[7]; i++) + { + if (i >= 0) + { + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var4; + var4--; + } + } + } + else + { + var4 = task->data[10] + 159; + for (i = 0; i < 112; i++) + { + gScanlineEffectRegBuffers[0][i] = var4; + gScanlineEffectRegBuffers[1][i] = var4; + var4--; + } + } } static void sub_80E08CC(u8 priority) 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/ice.c b/src/battle/anim/ice.c index e41057d72..438c61f9f 100644 --- a/src/battle/anim/ice.c +++ b/src/battle/anim/ice.c @@ -26,6 +26,7 @@ extern struct INCBIN_U8 gBattleAnimFogTilemap; extern struct INCBIN_U8 gWeatherFog1Tiles; static void sub_80D7704(struct Sprite *sprite); +static void sub_80D7888(struct Sprite *sprite); static void AnimIcePunchSwirlingParticle(struct Sprite *sprite); static void AnimIceBeamParticle(struct Sprite *sprite); static void AnimIceEffectParticle(struct Sprite *sprite); @@ -53,7 +54,15 @@ static void AnimIceBallParticle(struct Sprite *sprite); static void AnimTask_Haze2(u8 taskId); static void AnimTask_OverlayFogTiles(u8 taskId); static void AnimTask_Hail2(u8 taskId); -bool8 sub_80D8BA8(u8 a1, u8 a2, u8 a3, u8 a4); +bool8 sub_80D8BA8(u8 hailStructId, u8 affineAnimNum, u8 taskId, u8 c); + +struct HailStruct +{ + s32 x:10; + s32 y:10; + s32 bPosition:8; + s32 unk3:4; +}; const union AnimCmd gSpriteAnim_83D9B58[] = { @@ -374,18 +383,18 @@ const struct SpriteTemplate gPoisonGasCloudSpriteTemplate = .callback = InitPoisonGasCloudAnim, }; -const u8 gUnknown_083D9DC4[][4] = -{ - {0x64, 0xE0, 0x01, 0x20}, - {0x55, 0xE0, 0x01, 0x00}, - {0xF2, 0xE0, 0x11, 0x10}, - {0x42, 0xE0, 0x21, 0x10}, - {0xB6, 0xE0, 0x31, 0x00}, - {0x3C, 0xE0, 0x01, 0x20}, - {0xD6, 0xE0, 0x11, 0x00}, - {0x71, 0xE0, 0x01, 0x10}, - {0xD2, 0xE0, 0x31, 0x10}, - {0x26, 0xE0, 0x21, 0x00}, +const struct HailStruct gUnknown_083D9DC4[] = +{ + {.x = 100, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .unk3 = 2}, + {.x = 85, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .unk3 = 0}, + {.x = 242, .y = 120, .bPosition = B_POSITION_OPPONENT_LEFT, .unk3 = 1}, + {.x = 66, .y = 120, .bPosition = B_POSITION_PLAYER_RIGHT, .unk3 = 1}, + {.x = 182, .y = 120, .bPosition = B_POSITION_OPPONENT_RIGHT, .unk3 = 0}, + {.x = 60, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .unk3 = 2}, + {.x = 214, .y = 120, .bPosition = B_POSITION_OPPONENT_LEFT, .unk3 = 0}, + {.x = 113, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .unk3 = 1}, + {.x = 210, .y = 120, .bPosition = B_POSITION_OPPONENT_RIGHT, .unk3 = 1}, + {.x = 38, .y = 120, .bPosition = B_POSITION_PLAYER_RIGHT, .unk3 = 0}, }; const union AffineAnimCmd gSpriteAffineAnim_83D9DEC[] = @@ -528,266 +537,46 @@ const struct SpriteTemplate gIceBallParticleSpriteTemplate = .callback = InitIceBallParticle, }; -// unknown - potentially used in weather ball -// TODO: decompile function and name it -/* -// NOT EQUIVALENT static void sub_80D7704(struct Sprite *sprite) { - // - //u16 battler1, battler2, battler3, battler4; // - u16 r9, r8, r3, r6; - //s16 r4, r10; + s16 targetX, targetY, attackerX, attackerY; sprite->oam.tileNum += 7; - - //u8 battler1, battler2, battler3, battler4; - - //battler1 = GetBattlerSpriteCoord(gBattleAnimTarget, 2); - //battler2 = GetBattlerSpriteCoord(gBattleAnimTarget, 3); - //battler3 = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); - //battler4 = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); - - //sprite->oam.tileNum += 7; - - //sprite->data[0] = gBattleAnimArgs[4]; - - //sprite->data[1] = battler3 + gBattleAnimArgs[0]; //??? - //sprite->data[2] = battler1 + gBattleAnimArgs[2]; - //sprite->data[3] = battler4 + gBattleAnimArgs[1]; - //sprite->data[4] = battler2 + gBattleAnimArgs[3]; - - r9 = GetBattlerSpriteCoord(gBattleAnimTarget, 2); - r8 = GetBattlerSpriteCoord(gBattleAnimTarget, 3); - r3 = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); - r6 = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); - + targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); + attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); + attackerY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[1] = gBattleAnimArgs[0] + attackerX; + sprite->data[2] = gBattleAnimArgs[2] + targetX; + sprite->data[3] = gBattleAnimArgs[1] + attackerY; + sprite->data[4] = gBattleAnimArgs[3] + targetY; + sub_8078314(sprite); - sprite->data[1] = r3 + gBattleAnimArgs[0]; //??? - sprite->data[2] = r9 + gBattleAnimArgs[2]; - sprite->data[3] = r6 + gBattleAnimArgs[1]; - sprite->data[4] = r8 + gBattleAnimArgs[3]; - - //sprite->data[0] = gBattleAnimArgs; + for (;(targetX >= -32 && targetX <= 272) && (targetY >= -32 && targetY <= 192); + targetX += sprite->data[1], targetY += sprite->data[2]) + ; + sprite->data[1] = -sprite->data[1]; + sprite->data[2] = -sprite->data[2]; + for (;(attackerX >= -32 && attackerX <= 272) && (attackerY >= -32 && attackerY <= 192); + attackerX += sprite->data[1], attackerY += sprite->data[2]) + ; + sprite->pos1.x = attackerX; + sprite->pos1.y = attackerY; + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[1] = attackerX; + sprite->data[2] = targetX; + sprite->data[3] = attackerY; + sprite->data[4] = targetY; sub_8078314(sprite); - - if ((u32)(r9 + 32) <= 304 || (u32)(r8 + 32) <= 224) // cmp 1 - { - r4 = sprite->data[1]; - r10 = 304; - - // _080D77AA - for (int i = 0; i < 3; i++) - { - // - if (((u32)((s16)r9 + r4) + (0x80 << 14)) >> 16 > 304 - || ((u32)((s16)r8 + r4) + (0x80 << 14)) >> 16 > 0xE0) - { - break; - } - } - } - // _080D77DE -} -*/ - -NAKED static void sub_80D7704(struct Sprite *sprite) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x4\n" - "\tadds r5, r0, 0\n" - "\tldrh r2, [r5, 0x4]\n" - "\tlsls r1, r2, 22\n" - "\tlsrs r1, 22\n" - "\tadds r1, 0x7\n" - "\tldr r3, _080D780C @ =0x000003ff\n" - "\tadds r0, r3, 0\n" - "\tands r1, r0\n" - "\tldr r0, _080D7810 @ =0xfffffc00\n" - "\tands r0, r2\n" - "\torrs r0, r1\n" - "\tstrh r0, [r5, 0x4]\n" - "\tldr r4, _080D7814 @ =gBattleAnimTarget\n" - "\tldrb r0, [r4]\n" - "\tmovs r1, 0x2\n" - "\tbl GetBattlerSpriteCoord\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r9, r0\n" - "\tldrb r0, [r4]\n" - "\tmovs r1, 0x3\n" - "\tbl GetBattlerSpriteCoord\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r8, r0\n" - "\tldr r4, _080D7818 @ =gBattleAnimAttacker\n" - "\tldrb r0, [r4]\n" - "\tmovs r1, 0x2\n" - "\tbl GetBattlerSpriteCoord\n" - "\tlsls r0, 24\n" - "\tlsrs r3, r0, 24\n" - "\tldrb r0, [r4]\n" - "\tmovs r1, 0x3\n" - "\tstr r3, [sp]\n" - "\tbl GetBattlerSpriteCoord\n" - "\tlsls r0, 24\n" - "\tlsrs r6, r0, 24\n" - "\tldr r1, _080D781C @ =gBattleAnimArgs\n" - "\tldrh r0, [r1, 0x8]\n" - "\tstrh r0, [r5, 0x2E]\n" - "\tldrh r0, [r1]\n" - "\tldr r3, [sp]\n" - "\tadds r0, r3\n" - "\tstrh r0, [r5, 0x30]\n" - "\t ldrh r0, [r1, 0x4]\n" - "\t mov r4, r9\n" - "\t adds r0, r4, r0\n" - "\tstrh r0, [r5, 0x32]\n" - "\tldrh r0, [r1, 0x2]\n" - "\tadds r0, r6\n" - "\tstrh r0, [r5, 0x34]\n" - "\tldrh r0, [r1, 0x6]\n" - "\tmov r7, r8\n" - "\tadds r0, r7, r0\n" - "\tstrh r0, [r5, 0x36]\n" - "\tadds r0, r5, 0\n" - "\tbl sub_8078314\n" - "\tadds r4, 0x20\n" - "\tmovs r0, 0x98\n" - "\tlsls r0, 1\n" - "\tmov r12, r0\n" - "\tldr r3, [sp]\n" - "\tcmp r4, r12\n" - "\tbhi _080D77DE\n" - "\tadds r0, r7, 0\n" - "\tadds r0, 0x20\n" - "\tldrh r1, [r5, 0x30]\n" - "\tldrh r2, [r5, 0x32]\n" - "\tcmp r0, 0xE0\n" - "\tbhi _080D77DE\n" - "\tadds r4, r1, 0\n" - "\tmov r10, r12\n" - "_080D77AA:\n" - "\tmov r7, r9\n" - "\tlsls r1, r7, 16\n" - "\tasrs r1, 16\n" - "\tadds r1, r4\n" - "\tlsls r1, 16\n" - "\tmov r7, r8\n" - "\tlsls r0, r7, 16\n" - "\tasrs r0, 16\n" - "\tadds r0, r2\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r8, r0\n" - "\tlsrs r0, r1, 16\n" - "\tmov r9, r0\n" - "\tmovs r7, 0x80\n" - "\tlsls r7, 14\n" - "\tadds r1, r7\n" - "\tlsrs r1, 16\n" - "\tcmp r1, r10\n" - "\tbhi _080D77DE\n" - "\tmov r1, r8\n" - "\tlsls r0, r1, 16\n" - "\tadds r0, r7\n" - "\tlsrs r0, 16\n" - "\tcmp r0, 0xE0\n" - "\tbls _080D77AA\n" - "_080D77DE:\n" - "\tldrh r0, [r5, 0x30]\n" - "\tnegs r7, r0\n" - "\tstrh r7, [r5, 0x30]\n" - "\tldrh r0, [r5, 0x32]\n" - "\tnegs r4, r0\n" - "\tstrh r4, [r5, 0x32]\n" - "\tlsls r0, r3, 16\n" - "\tmovs r1, 0x80\n" - "\tlsls r1, 14\n" - "\tadds r0, r1\n" - "\tlsrs r0, 16\n" - "\tmovs r2, 0x98\n" - "\tlsls r2, 1\n" - "\tmov r12, r2\n" - "\tldr r1, _080D781C @ =gBattleAnimArgs\n" - "\tmov r10, r1\n" - "\tcmp r0, r12\n" - "\tbhi _080D784A\n" - "\tlsls r1, r6, 16\n" - "\tmovs r2, 0x80\n" - "\tlsls r2, 14\n" - "\tadds r0, r1, r2\n" - "\tb _080D7842\n" - "\t.align 2, 0\n" - "_080D780C: .4byte 0x000003ff\n" - "_080D7810: .4byte 0xfffffc00\n" - "_080D7814: .4byte gBattleAnimTarget\n" - "_080D7818: .4byte gBattleAnimAttacker\n" - "_080D781C: .4byte gBattleAnimArgs\n" - "_080D7820:\n" - "\tlsls r1, r3, 16\n" - "\tasrs r1, 16\n" - "\tadds r1, r7\n" - "\tlsls r1, 16\n" - "\tasrs r0, r2, 16\n" - "\tadds r0, r4\n" - "\tlsls r0, 16\n" - "\tlsrs r6, r0, 16\n" - "\tlsrs r3, r1, 16\n" - "\tmovs r0, 0x80\n" - "\tlsls r0, 14\n" - "\tadds r1, r0\n" - "\tlsrs r1, 16\n" - "\tcmp r1, r12\n" - "\tbhi _080D784A\n" - "\tlsls r1, r6, 16\n" - "\tadds r0, r1, r0\n" - "_080D7842:\n" - "\tlsrs r0, 16\n" - "\tadds r2, r1, 0\n" - "\tcmp r0, 0xE0\n" - "\tbls _080D7820\n" - "_080D784A:\n" - "\tstrh r3, [r5, 0x20]\n" - "\tstrh r6, [r5, 0x22]\n" - "\tmov r1, r10\n" - "\tldrh r0, [r1, 0x8]\n" - "\tstrh r0, [r5, 0x2E]\n" - "\tstrh r3, [r5, 0x30]\n" - "\tmov r2, r9\n" - "\tstrh r2, [r5, 0x32]\n" - "\tstrh r6, [r5, 0x34]\n" - "\tmov r3, r8\n" - "\tstrh r3, [r5, 0x36]\n" - "\tadds r0, r5, 0\n" - "\tbl sub_8078314\n" - "\tmov r7, r10\n" - "\tldrh r0, [r7, 0xA]\n" - "\tstrh r0, [r5, 0x34]\n" - "\tldrh r0, [r7, 0xC]\n" - "\tstrh r0, [r5, 0x36]\n" - "\tldr r0, _080D7884 @ =sub_80D7888\n" - "\tstr r0, [r5, 0x1C]\n" - "\tadd sp, 0x4\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_080D7884: .4byte sub_80D7888"); + sprite->data[3] = gBattleAnimArgs[5]; + sprite->data[4] = gBattleAnimArgs[6]; + sprite->callback = sub_80D7888; } -void sub_80D7888(struct Sprite *sprite) +static void sub_80D7888(struct Sprite *sprite) { if (sprite->data[0] != 0) { @@ -1460,13 +1249,9 @@ static void InitPoisonGasCloudAnim(struct Sprite *sprite) } // Animates the gas clouds towards the target mon in Poison Gas. -// functionally correct, but there appears to be an unused local variable causing -// switch case 1 to not match -#ifdef NONMATCHING static void sub_80D8874(struct Sprite *sprite) { int value; - register s16 value2 asm("r5"); switch (sprite->data[7] & 0xFF) { @@ -1481,19 +1266,20 @@ static void sub_80D8874(struct Sprite *sprite) if (sprite->data[0] <= 0) { - value2 = 80; - sprite->data[0] = value2; - sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0); + sprite->data[0] = 80; + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); sprite->data[1] = sprite->pos1.x; sprite->data[2] = sprite->pos1.x; sprite->pos1.y += sprite->pos2.y; sprite->data[3] = sprite->pos1.y; sprite->data[4] = sprite->pos1.y + 29; sprite->data[7]++; - if (gMain.inBattle && gBattlerPositions[gBattleAnimTarget] & 1) + if (!gMain.inBattle) + sprite->data[5] = 80; + else if (gBattlerPositions[gBattleAnimTarget] & 1) sprite->data[5] = 204; else - sprite->data[5] = value2; + sprite->data[5] = 80; sprite->pos2.y = 0; value = gSineTable[sprite->data[5]]; @@ -1530,12 +1316,13 @@ static void sub_80D8874(struct Sprite *sprite) if (sprite->data[0] <= 0) { - asm("mov r2, #0"); // unused local variable? sprite->data[0] = 0x300; sprite->data[1] = sprite->pos1.x += sprite->pos2.x; sprite->data[3] = sprite->pos1.y += sprite->pos2.y; sprite->data[4] = sprite->pos1.y + 4; - if (gMain.inBattle && gBattlerPositions[gBattleAnimTarget] & 1) + if (!gMain.inBattle) + sprite->data[2] = -0x10; + else if (gBattlerPositions[gBattleAnimTarget] & 1) sprite->data[2] = 0x100; else sprite->data[2] = -0x10; @@ -1560,321 +1347,6 @@ static void sub_80D8874(struct Sprite *sprite) break; } } -#else -NAKED static void sub_80D8874(struct Sprite *sprite) -{ - asm_unified("\tpush {r4-r6,lr}\n" - "\tadds r4, r0, 0\n" - "\tldrh r0, [r4, 0x3C]\n" - "\tmovs r5, 0xFF\n" - "\tmovs r1, 0xFF\n" - "\tands r1, r0\n" - "\tcmp r1, 0x1\n" - "\tbeq _080D8968\n" - "\tcmp r1, 0x1\n" - "\tbgt _080D888E\n" - "\tcmp r1, 0\n" - "\tbeq _080D8896\n" - "\tb _080D8AD0\n" - "_080D888E:\n" - "\tcmp r1, 0x2\n" - "\tbne _080D8894\n" - "\tb _080D8A94\n" - "_080D8894:\n" - "\tb _080D8AD0\n" - "_080D8896:\n" - "\tadds r0, r4, 0\n" - "\tbl TranslateAnimLinear\n" - "\tldr r1, _080D88C0 @ =gSineTable\n" - "\tmovs r2, 0x38\n" - "\tldrsh r0, [r4, r2]\n" - "\tlsls r0, 1\n" - "\tadds r0, r1\n" - "\tmovs r1, 0\n" - "\tldrsh r0, [r0, r1]\n" - "\tasrs r0, 4\n" - "\tldrh r2, [r4, 0x24]\n" - "\tadds r0, r2\n" - "\tstrh r0, [r4, 0x24]\n" - "\tmovs r1, 0x3A\n" - "\tldrsh r0, [r4, r1]\n" - "\tcmp r0, 0\n" - "\tbeq _080D88C4\n" - "\tldrh r0, [r4, 0x38]\n" - "\tsubs r0, 0x8\n" - "\tb _080D88C8\n" - "\t.align 2, 0\n" - "_080D88C0: .4byte gSineTable\n" - "_080D88C4:\n" - "\tldrh r0, [r4, 0x38]\n" - "\tadds r0, 0x8\n" - "_080D88C8:\n" - "\tands r0, r5\n" - "\tstrh r0, [r4, 0x38]\n" - "\tmovs r2, 0x2E\n" - "\tldrsh r0, [r4, r2]\n" - "\tcmp r0, 0\n" - "\tble _080D88D6\n" - "\tb _080D8AD0\n" - "_080D88D6:\n" - "\tmovs r5, 0x50\n" - "\tstrh r5, [r4, 0x2E]\n" - "\tldr r6, _080D8928 @ =gBattleAnimTarget\n" - "\tldrb r0, [r6]\n" - "\tmovs r1, 0\n" - "\tbl GetBattlerSpriteCoord\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tstrh r0, [r4, 0x20]\n" - "\tstrh r0, [r4, 0x30]\n" - "\tstrh r0, [r4, 0x32]\n" - "\tldrh r0, [r4, 0x26]\n" - "\tldrh r1, [r4, 0x22]\n" - "\tadds r0, r1\n" - "\tstrh r0, [r4, 0x22]\n" - "\tstrh r0, [r4, 0x34]\n" - "\tadds r0, 0x1D\n" - "\tstrh r0, [r4, 0x36]\n" - "\tldrh r0, [r4, 0x3C]\n" - "\tadds r0, 0x1\n" - "\tstrh r0, [r4, 0x3C]\n" - "\tldr r0, _080D892C @ =gMain\n" - "\tldr r2, _080D8930 @ =0x0000043d\n" - "\tadds r0, r2\n" - "\tldrb r1, [r0]\n" - "\tmovs r0, 0x2\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _080D8938\n" - "\tldr r1, _080D8934 @ =gBattlerPositions\n" - "\tldrb r0, [r6]\n" - "\tadds r0, r1\n" - "\tldrb r1, [r0]\n" - "\tmovs r0, 0x1\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _080D8938\n" - "\tmovs r0, 0xCC\n" - "\tstrh r0, [r4, 0x38]\n" - "\tb _080D893A\n" - "\t.align 2, 0\n" - "_080D8928: .4byte gBattleAnimTarget\n" - "_080D892C: .4byte gMain\n" - "_080D8930: .4byte 0x0000043d\n" - "_080D8934: .4byte gBattlerPositions\n" - "_080D8938:\n" - "\tstrh r5, [r4, 0x38]\n" - "_080D893A:\n" - "\tmovs r0, 0\n" - "\tstrh r0, [r4, 0x26]\n" - "\tldr r1, _080D8964 @ =gSineTable\n" - "\tmovs r2, 0x38\n" - "\tldrsh r0, [r4, r2]\n" - "\tlsls r0, 1\n" - "\tadds r0, r1\n" - "\tmovs r1, 0\n" - "\tldrsh r0, [r0, r1]\n" - "\tasrs r0, 3\n" - "\tstrh r0, [r4, 0x24]\n" - "\tldrh r0, [r4, 0x38]\n" - "\tadds r0, 0x2\n" - "\tmovs r1, 0xFF\n" - "\tands r0, r1\n" - "\tstrh r0, [r4, 0x38]\n" - "\tadds r0, r4, 0\n" - "\tbl InitAnimLinearTranslation\n" - "\tb _080D8AD0\n" - "\t.align 2, 0\n" - "_080D8964: .4byte gSineTable\n" - "_080D8968:\n" - "\tadds r0, r4, 0\n" - "\tbl TranslateAnimLinear\n" - "\tldr r1, _080D89C8 @ =gSineTable\n" - "\tmovs r2, 0x38\n" - "\tldrsh r0, [r4, r2]\n" - "\tlsls r0, 1\n" - "\tadds r0, r1\n" - "\tmovs r2, 0\n" - "\tldrsh r0, [r0, r2]\n" - "\tasrs r0, 3\n" - "\tldrh r2, [r4, 0x24]\n" - "\tadds r0, r2\n" - "\tstrh r0, [r4, 0x24]\n" - "\tmovs r2, 0x38\n" - "\tldrsh r0, [r4, r2]\n" - "\tadds r0, 0x40\n" - "\tlsls r0, 1\n" - "\tadds r0, r1\n" - "\tmovs r2, 0\n" - "\tldrsh r1, [r0, r2]\n" - "\tlsls r0, r1, 1\n" - "\tadds r0, r1\n" - "\tnegs r0, r0\n" - "\tasrs r0, 8\n" - "\tldrh r1, [r4, 0x26]\n" - "\tadds r0, r1\n" - "\tstrh r0, [r4, 0x26]\n" - "\tldr r0, _080D89CC @ =gMain\n" - "\tldr r2, _080D89D0 @ =0x0000043d\n" - "\tadds r0, r2\n" - "\tldrb r1, [r0]\n" - "\tmovs r0, 0x2\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _080D89F2\n" - "\tldrh r1, [r4, 0x38]\n" - "\tadds r0, r1, 0\n" - "\tsubs r0, 0x40\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tadds r3, r1, 0\n" - "\tcmp r0, 0x7F\n" - "\tbhi _080D89D4\n" - "\tldrh r1, [r4, 0x3C]\n" - "\tlsls r1, 16\n" - "\tasrs r1, 24\n" - "\tb _080D89DC\n" - "\t.align 2, 0\n" - "_080D89C8: .4byte gSineTable\n" - "_080D89CC: .4byte gMain\n" - "_080D89D0: .4byte 0x0000043d\n" - "_080D89D4:\n" - "\tldrh r1, [r4, 0x3C]\n" - "\tlsls r1, 16\n" - "\tasrs r1, 24\n" - "\tadds r1, 0x1\n" - "_080D89DC:\n" - "\tmovs r0, 0x3\n" - "\tands r1, r0\n" - "\tlsls r1, 2\n" - "\tldrb r2, [r4, 0x5]\n" - "\tmovs r0, 0xD\n" - "\tnegs r0, r0\n" - "\tands r0, r2\n" - "\torrs r0, r1\n" - "\tstrb r0, [r4, 0x5]\n" - "\tadds r0, r3, 0x4\n" - "\tb _080D8A12\n" - "_080D89F2:\n" - "\tldrh r0, [r4, 0x38]\n" - "\tsubs r0, 0x40\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tcmp r0, 0x7F\n" - "\tbhi _080D8A06\n" - "\tadds r1, r4, 0\n" - "\tadds r1, 0x43\n" - "\tmovs r0, 0x80\n" - "\tb _080D8A0C\n" - "_080D8A06:\n" - "\tadds r1, r4, 0\n" - "\tadds r1, 0x43\n" - "\tmovs r0, 0x8C\n" - "_080D8A0C:\n" - "\tstrb r0, [r1]\n" - "\tldrh r0, [r4, 0x38]\n" - "\tsubs r0, 0x4\n" - "_080D8A12:\n" - "\tmovs r1, 0xFF\n" - "\tands r0, r1\n" - "\tstrh r0, [r4, 0x38]\n" - "\tmovs r1, 0x2E\n" - "\tldrsh r0, [r4, r1]\n" - "\tcmp r0, 0\n" - "\tbgt _080D8AD0\n" - "\tmovs r2, 0\n" - "\tmovs r0, 0xC0\n" - "\tlsls r0, 2\n" - "\tstrh r0, [r4, 0x2E]\n" - "\tldrh r0, [r4, 0x24]\n" - "\tldrh r1, [r4, 0x20]\n" - "\tadds r0, r1\n" - "\tstrh r0, [r4, 0x20]\n" - "\tstrh r0, [r4, 0x30]\n" - "\tldrh r0, [r4, 0x26]\n" - "\tldrh r1, [r4, 0x22]\n" - "\tadds r0, r1\n" - "\tstrh r0, [r4, 0x22]\n" - "\tstrh r0, [r4, 0x34]\n" - "\tadds r0, 0x4\n" - "\tstrh r0, [r4, 0x36]\n" - "\tldr r0, _080D8A68 @ =gMain\n" - "\tldr r1, _080D8A6C @ =0x0000043d\n" - "\tadds r0, r1\n" - "\tldrb r1, [r0]\n" - "\tmovs r0, 0x2\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _080D8A78\n" - "\tldr r1, _080D8A70 @ =gBattlerPositions\n" - "\tldr r0, _080D8A74 @ =gBattleAnimTarget\n" - "\tldrb r0, [r0]\n" - "\tadds r0, r1\n" - "\tldrb r1, [r0]\n" - "\tmovs r0, 0x1\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _080D8A78\n" - "\tmovs r0, 0x80\n" - "\tlsls r0, 1\n" - "\tb _080D8A7A\n" - "\t.align 2, 0\n" - "_080D8A68: .4byte gMain\n" - "_080D8A6C: .4byte 0x0000043d\n" - "_080D8A70: .4byte gBattlerPositions\n" - "_080D8A74: .4byte gBattleAnimTarget\n" - "_080D8A78:\n" - "\tldr r0, _080D8A90 @ =0x0000fff0\n" - "_080D8A7A:\n" - "\tstrh r0, [r4, 0x32]\n" - "\tldrh r0, [r4, 0x3C]\n" - "\tadds r0, 0x1\n" - "\tmovs r1, 0\n" - "\tstrh r0, [r4, 0x3C]\n" - "\tstrh r1, [r4, 0x26]\n" - "\tstrh r1, [r4, 0x24]\n" - "\tadds r0, r4, 0\n" - "\tbl sub_8078BD4\n" - "\tb _080D8AD0\n" - "\t.align 2, 0\n" - "_080D8A90: .4byte 0x0000fff0\n" - "_080D8A94:\n" - "\tadds r0, r4, 0\n" - "\tbl TranslateAnimLinear\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _080D8AD0\n" - "\tldrb r0, [r4, 0x1]\n" - "\tlsls r0, 30\n" - "\tlsrs r0, 30\n" - "\tmovs r1, 0x1\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbeq _080D8AC2\n" - "\tldrb r0, [r4, 0x3]\n" - "\tlsls r0, 26\n" - "\tlsrs r0, 27\n" - "\tbl FreeOamMatrix\n" - "\tldrb r1, [r4, 0x1]\n" - "\tmovs r0, 0x4\n" - "\tnegs r0, r0\n" - "\tands r0, r1\n" - "\tstrb r0, [r4, 0x1]\n" - "_080D8AC2:\n" - "\tadds r0, r4, 0\n" - "\tbl DestroySprite\n" - "\tldr r1, _080D8AD8 @ =gAnimVisualTaskCount\n" - "\tldrb r0, [r1]\n" - "\tsubs r0, 0x1\n" - "\tstrb r0, [r1]\n" - "_080D8AD0:\n" - "\tpop {r4-r6}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_080D8AD8: .4byte gAnimVisualTaskCount"); -} -#endif // NONMATCHING // Creates Hail. void AnimTask_Hail1(u8 taskId) @@ -1929,266 +1401,63 @@ static void AnimTask_Hail2(u8 taskId) } } - -/* -// Something to do with Hail. -// possibly equivalent, possibly not -bool8 sub_80D8BA8(u8 a1, u8 a2, u8 a3, u8 a4)//(u8 spriteId, u8 taskId, u8 a3)//(u8 taskId) +bool8 sub_80D8BA8(u8 hailStructId, u8 affineAnimNum, u8 taskId, u8 c) { - // - //struct Task *task = &gTasks[a2]; - //u16 i, j; - //task->data[3]++; - //u8 r5bank = ; - - //const struct SpriteTemplate *spriteTemplate; - u8 spriteId; + u8 id; + s16 battlerX, battlerY; + s16 spriteX; + bool8 possibleBool = FALSE; + s8 unk = gUnknown_083D9DC4[hailStructId].unk3; - s16 r6, r7; - - u32 tempA, tempB; // u32? s16? u16? u8? int? - - //u8 r6, r7; - - tempA = a3 + 0; - tempB = 0; - - // is that gunknown a tempvar? - - if (gUnknown_083D9DC4[a1][3] != 2 - || IsAnimBankSpriteVisible(GetBattlerAtPosition(gUnknown_083D9DC4[a1][2]))) + if (unk != 2) { - //return TRUE; - tempB = 1; - - r7 = GetBattlerSpriteCoord(GetBattlerAtPosition(gUnknown_083D9DC4[a1][2]), 2); - r6 = GetBattlerSpriteCoord(GetBattlerAtPosition(gUnknown_083D9DC4[a1][2]), 3); - - switch (gUnknown_083D9DC4[a1][3]) + id = GetBattlerAtPosition(gUnknown_083D9DC4[hailStructId].bPosition); + if (IsAnimBankSpriteVisible(id)) { - case 0: - // - r7 -= GetBattlerSpriteCoordAttr(GetBattlerAtPosition(gUnknown_083D9DC4[a1][2]), 1) / 6; - r6 -= GetBattlerSpriteCoordAttr(GetBattlerAtPosition(gUnknown_083D9DC4[a1][2]), 0) / 6; - break; - case 1: - // - r7 += GetBattlerSpriteCoordAttr(GetBattlerAtPosition(gUnknown_083D9DC4[a1][2]), 1) / 6; - r6 += GetBattlerSpriteCoordAttr(GetBattlerAtPosition(gUnknown_083D9DC4[a1][2]), 0) / 6; + possibleBool = TRUE; + battlerX = GetBattlerSpriteCoord(id, BATTLER_COORD_X_2); + battlerY = GetBattlerSpriteCoord(id, BATTLER_COORD_Y_PIC_OFFSET); + switch (unk) + { + case 0: + battlerX -= GetBattlerSpriteCoordAttr(id, BATTLER_COORD_ATTR_WIDTH) / 6; + battlerY -= GetBattlerSpriteCoordAttr(id, BATTLER_COORD_ATTR_HEIGHT) / 6; + break; + case 1: + battlerX += GetBattlerSpriteCoordAttr(id, BATTLER_COORD_ATTR_WIDTH) / 6; + battlerY += GetBattlerSpriteCoordAttr(id, BATTLER_COORD_ATTR_HEIGHT) / 6; + break; + } + } + else + { + battlerX = (gUnknown_083D9DC4[hailStructId].x); + battlerY = (gUnknown_083D9DC4[hailStructId].y); } } - else { - // _94 - r7 = gUnknown_083D9DC4[a1][0]; - r6 = gUnknown_083D9DC4[a1][1]; + battlerX = (gUnknown_083D9DC4[hailStructId].x); + battlerY = (gUnknown_083D9DC4[hailStructId].y); } - - spriteId = CreateSprite(&HailSpriteTemplate, r7 - r6, -0x8, 0x12); - - if (spriteId != 0x40) + spriteX = battlerX - ((battlerY + 8) / 2); + id = CreateSprite(&gHailSpriteTemplate, spriteX, -8, 18); + if (id == MAX_SPRITES) { - // - StartSpriteAffineAnim(&gSprites[spriteId], a2); - - gSprites[spriteId].data[0] = tempB; - gSprites[spriteId].data[3] = r7; - gSprites[spriteId].data[4] = r6; - - gSprites[spriteId].data[5] = a2; - gSprites[spriteId].data[6] = tempA; - gSprites[spriteId].data[7] = a4; - + return FALSE; + } + else + { + StartSpriteAffineAnim(&gSprites[id], affineAnimNum); + gSprites[id].data[0] = possibleBool; + gSprites[id].data[3] = battlerX; + gSprites[id].data[4] = battlerY; + gSprites[id].data[5] = affineAnimNum; + gSprites[id].data[6] = taskId; + gSprites[id].data[7] = c; return TRUE; } - - return FALSE; - -} -//*/ - -//* -NAKED bool8 sub_80D8BA8(u8 a1, u8 a2, u8 a3, u8 a4) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x8\n" - "\tlsls r0, 24\n" - "\tlsls r1, 24\n" - "\tlsrs r1, 24\n" - "\tmov r9, r1\n" - "\tlsls r2, 24\n" - "\tlsrs r2, 24\n" - "\tstr r2, [sp]\n" - "\tlsls r3, 24\n" - "\tlsrs r3, 24\n" - "\tmov r10, r3\n" - "\tmovs r1, 0\n" - "\tstr r1, [sp, 0x4]\n" - "\tldr r1, _080D8C20 @ =gUnknown_083D9DC4\n" - "\tlsrs r0, 22\n" - "\tadds r4, r0, r1\n" - "\tldrb r0, [r4, 0x3]\n" - "\tlsls r0, 24\n" - "\tasrs r0, 28\n" - "\tmov r8, r0\n" - "\tcmp r0, 0x2\n" - "\tbeq _080D8C94\n" - "\tldrh r0, [r4, 0x2]\n" - "\tlsls r0, 20\n" - "\tlsrs r0, 24\n" - "\tbl GetBattlerAtPosition\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tadds r0, r5, 0\n" - "\tbl IsAnimBankSpriteVisible\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _080D8C94\n" - "\tmovs r0, 0x1\n" - "\tstr r0, [sp, 0x4]\n" - "\tadds r0, r5, 0\n" - "\tmovs r1, 0x2\n" - "\tbl GetBattlerSpriteCoord\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tadds r0, r5, 0\n" - "\tmovs r1, 0x3\n" - "\tbl GetBattlerSpriteCoord\n" - "\tlsls r0, 24\n" - "\tlsrs r6, r0, 24\n" - "\tmov r1, r8\n" - "\tcmp r1, 0\n" - "\tbeq _080D8C24\n" - "\tcmp r1, 0x1\n" - "\tbeq _080D8C5A\n" - "\tb _080D8CA6\n" - "\t.align 2, 0\n" - "_080D8C20: .4byte gUnknown_083D9DC4\n" - "_080D8C24:\n" - "\tadds r0, r5, 0\n" - "\tmovs r1, 0x1\n" - "\tbl GetBattlerSpriteCoordAttr\n" - "\tlsls r0, 16\n" - "\tasrs r0, 16\n" - "\tmovs r1, 0x6\n" - "\tbl __divsi3\n" - "\tlsls r1, r7, 16\n" - "\tasrs r1, 16\n" - "\tsubs r1, r0\n" - "\tlsls r1, 16\n" - "\tlsrs r7, r1, 16\n" - "\tadds r0, r5, 0\n" - "\tmovs r1, 0\n" - "\tbl GetBattlerSpriteCoordAttr\n" - "\tlsls r0, 16\n" - "\tasrs r0, 16\n" - "\tmovs r1, 0x6\n" - "\tbl __divsi3\n" - "\tlsls r1, r6, 16\n" - "\tasrs r1, 16\n" - "\tsubs r1, r0\n" - "\tb _080D8C8E\n" - "_080D8C5A:\n" - "\tadds r0, r5, 0\n" - "\tmovs r1, 0x1\n" - "\tbl GetBattlerSpriteCoordAttr\n" - "\tlsls r0, 16\n" - "\tasrs r0, 16\n" - "\tmovs r1, 0x6\n" - "\tbl __divsi3\n" - "\tlsls r1, r7, 16\n" - "\tasrs r1, 16\n" - "\tadds r1, r0\n" - "\tlsls r1, 16\n" - "\tlsrs r7, r1, 16\n" - "\tadds r0, r5, 0\n" - "\tmovs r1, 0\n" - "\tbl GetBattlerSpriteCoordAttr\n" - "\tlsls r0, 16\n" - "\tasrs r0, 16\n" - "\tmovs r1, 0x6\n" - "\tbl __divsi3\n" - "\tlsls r1, r6, 16\n" - "\tasrs r1, 16\n" - "\tadds r1, r0\n" - "_080D8C8E:\n" - "\tlsls r1, 16\n" - "\tlsrs r6, r1, 16\n" - "\tb _080D8CA6\n" - "_080D8C94:\n" - "\tldrh r0, [r4]\n" - "\tlsls r0, 22\n" - "\tasrs r0, 6\n" - "\tlsrs r7, r0, 16\n" - "\tldr r0, [r4]\n" - "\tlsls r0, 12\n" - "\tasrs r0, 22\n" - "\tlsls r0, 16\n" - "\tlsrs r6, r0, 16\n" - "_080D8CA6:\n" - "\tlsls r0, r6, 16\n" - "\tasrs r0, 16\n" - "\tadds r0, 0x8\n" - "\tlsrs r1, r0, 31\n" - "\tadds r0, r1\n" - "\tasrs r0, 1\n" - "\tlsls r1, r7, 16\n" - "\tasrs r1, 16\n" - "\tsubs r1, r0\n" - "\tldr r0, _080D8D00 @ =HailSpriteTemplate\n" - "\tlsls r1, 16\n" - "\tasrs r1, 16\n" - "\tmovs r2, 0x8\n" - "\tnegs r2, r2\n" - "\tmovs r3, 0x12\n" - "\tbl CreateSprite\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tcmp r5, 0x40\n" - "\tbeq _080D8D08\n" - "\tlsls r4, r5, 4\n" - "\tadds r4, r5\n" - "\tlsls r4, 2\n" - "\tldr r0, _080D8D04 @ =gSprites\n" - "\tadds r4, r0\n" - "\tadds r0, r4, 0\n" - "\tmov r1, r9\n" - "\tbl StartSpriteAffineAnim\n" - "\tmov r0, sp\n" - "\tldrh r0, [r0, 0x4]\n" - "\tstrh r0, [r4, 0x2E]\n" - "\tstrh r7, [r4, 0x34]\n" - "\tstrh r6, [r4, 0x36]\n" - "\tmov r1, r9\n" - "\tstrh r1, [r4, 0x38]\n" - "\tmov r0, sp\n" - "\tldrh r0, [r0]\n" - "\tstrh r0, [r4, 0x3A]\n" - "\tmov r1, r10\n" - "\tstrh r1, [r4, 0x3C]\n" - "\tmovs r0, 0x1\n" - "\tb _080D8D0A\n" - "\t.align 2, 0\n" - "_080D8D00: .4byte gHailSpriteTemplate\n" - "_080D8D04: .4byte gSprites\n" - "_080D8D08:\n" - "\tmovs r0, 0\n" - "_080D8D0A:\n" - "\tadd sp, 0x8\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1"); } -//*/ static void AnimHailBegin(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..135ed43cb 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 *); @@ -44,7 +47,7 @@ void sub_80D4BF0(struct Sprite *sprite); void sub_80D4C18(struct Sprite *); void sub_80D4CEC(struct Sprite *); void sub_80D4C64(struct Sprite *sprite); -void sub_80D4D64(struct Sprite*, int, int); +void sub_80D4D64(struct Sprite*, s32, s32); void sub_80E1864(u8); static void sub_80D3874(struct Sprite *sprite); @@ -260,329 +263,104 @@ static void sub_80D3874(struct Sprite *sprite) } } -NAKED void AnimTask_CreateSurfWave(u8 taskId) { - asm(".syntax unified\n\ - .equ REG_BLDCNT, 0x4000050\n\ - .equ REG_BG1CNT, 0x400000A\n\ - .equ REG_BG1HOFS, 0x4000014\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x14\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r10, r0\n\ - ldr r1, _080D398C @ =REG_BLDCNT\n\ - ldr r2, _080D3990 @ =0x00003f42\n\ - adds r0, r2, 0\n\ - strh r0, [r1]\n\ - adds r1, 0x2\n\ - movs r3, 0x80\n\ - lsls r3, 5\n\ - adds r0, r3, 0\n\ - strh r0, [r1]\n\ - ldr r2, _080D3994 @ =REG_BG1CNT\n\ - ldrb r1, [r2]\n\ - movs r0, 0x4\n\ - negs r0, r0\n\ - ands r0, r1\n\ - movs r1, 0x1\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldrb r1, [r2, 0x1]\n\ - movs r0, 0x3F\n\ - ands r0, r1\n\ - movs r1, 0x40\n\ - orrs r0, r1\n\ - strb r0, [r2, 0x1]\n\ - mov r0, sp\n\ - bl sub_8078914\n\ - ldr r2, [sp]\n\ - movs r3, 0x80\n\ - lsls r3, 6\n\ - add r6, sp, 0x10\n\ - add r0, sp, 0xC\n\ - mov r12, r0\n\ - movs r5, 0\n\ - ldr r1, _080D3998 @ =0x040000d4\n\ - movs r4, 0x80\n\ - lsls r4, 5\n\ - mov r8, r6\n\ - ldr r7, _080D399C @ =0x85000400\n\ - movs r0, 0x85\n\ - lsls r0, 24\n\ - mov r9, r0\n\ -_080D3920:\n\ - str r5, [sp, 0x10]\n\ - mov r0, r8\n\ - str r0, [r1]\n\ - str r2, [r1, 0x4]\n\ - str r7, [r1, 0x8]\n\ - ldr r0, [r1, 0x8]\n\ - adds r2, r4\n\ - subs r3, r4\n\ - cmp r3, r4\n\ - bhi _080D3920\n\ - str r5, [sp, 0x10]\n\ - str r6, [r1]\n\ - str r2, [r1, 0x4]\n\ - lsrs r0, r3, 2\n\ - mov r2, r9\n\ - orrs r0, r2\n\ - str r0, [r1, 0x8]\n\ - ldr r0, [r1, 0x8]\n\ - movs r0, 0\n\ - mov r3, r12\n\ - strb r0, [r3]\n\ - strb r0, [r3]\n\ - ldr r1, [sp, 0x4]\n\ - movs r0, 0\n\ - str r0, [sp, 0x10]\n\ - ldr r0, _080D3998 @ =0x040000d4\n\ - str r6, [r0]\n\ - str r1, [r0, 0x4]\n\ - ldr r1, _080D399C @ =0x85000400\n\ - str r1, [r0, 0x8]\n\ - ldr r0, [r0, 0x8]\n\ - bl IsContest\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _080D39B8\n\ - ldr r2, _080D3994 @ =REG_BG1CNT\n\ - ldrb r1, [r2]\n\ - movs r0, 0xD\n\ - negs r0, r0\n\ - ands r0, r1\n\ - movs r1, 0x4\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r0, _080D39A0 @ =gBattleAnimAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _080D39A8\n\ - ldr r0, _080D39A4 @ =gUnknown_08E70968\n\ - b _080D39AA\n\ - .align 2, 0\n\ -_080D398C: .4byte REG_BLDCNT\n\ -_080D3990: .4byte 0x00003f42\n\ -_080D3994: .4byte REG_BG1CNT\n\ -_080D3998: .4byte 0x040000d4\n\ -_080D399C: .4byte 0x85000400\n\ -_080D39A0: .4byte gBattleAnimAttacker\n\ -_080D39A4: .4byte gUnknown_08E70968\n\ -_080D39A8:\n\ - ldr r0, _080D39B4 @ =gUnknown_08E70C38\n\ -_080D39AA:\n\ - ldr r1, [sp, 0x4]\n\ - bl LZDecompressVram\n\ - b _080D39CE\n\ - .align 2, 0\n\ -_080D39B4: .4byte gUnknown_08E70C38\n\ -_080D39B8:\n\ - ldr r0, _080D39F0 @ =gUnknown_08E70F0C\n\ - ldr r1, [sp, 0x4]\n\ - bl LZDecompressVram\n\ - mov r0, sp\n\ - ldrb r0, [r0, 0x8]\n\ - ldr r1, [sp, 0x4]\n\ - movs r2, 0\n\ - movs r3, 0x1\n\ - bl sub_80763FC\n\ -_080D39CE:\n\ - ldr r0, _080D39F4 @ =gBattleAnimBackgroundImage_Surf\n\ - ldr r1, [sp]\n\ - bl LZDecompressVram\n\ - ldr r0, _080D39F8 @ =gBattleAnimArgs\n\ - movs r1, 0\n\ - ldrsh r0, [r0, r1]\n\ - cmp r0, 0\n\ - bne _080D3A00\n\ - ldr r0, _080D39FC @ =gBattleAnimBackgroundPalette_Surf\n\ - mov r1, sp\n\ - ldrb r1, [r1, 0x8]\n\ - lsls r1, 4\n\ - movs r2, 0x20\n\ - bl LoadCompressedPalette\n\ - b _080D3A0E\n\ - .align 2, 0\n\ -_080D39F0: .4byte gUnknown_08E70F0C\n\ -_080D39F4: .4byte gBattleAnimBackgroundImage_Surf\n\ -_080D39F8: .4byte gBattleAnimArgs\n\ -_080D39FC: .4byte gBattleAnimBackgroundPalette_Surf\n\ -_080D3A00:\n\ - ldr r0, _080D3A78 @ =gBattleAnimBackgroundImageMuddyWater_Pal\n\ - mov r1, sp\n\ - ldrb r1, [r1, 0x8]\n\ - lsls r1, 4\n\ - movs r2, 0x20\n\ - bl LoadCompressedPalette\n\ -_080D3A0E:\n\ - ldr r0, _080D3A7C @ =sub_80D3D68\n\ - ldr r4, _080D3A80 @ =gTasks\n\ - mov r2, r10\n\ - lsls r5, r2, 2\n\ - adds r1, r5, r2\n\ - lsls r1, 3\n\ - adds r6, r1, r4\n\ - ldrb r1, [r6, 0x7]\n\ - adds r1, 0x1\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - bl CreateTask\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ - movs r3, 0\n\ - mov r9, r3\n\ - mov r0, r8\n\ - strh r0, [r6, 0x26]\n\ - mov r1, r8\n\ - lsls r0, r1, 2\n\ - add r0, r8\n\ - lsls r0, 3\n\ - adds r7, r0, r4\n\ - mov r2, r9\n\ - strh r2, [r7, 0x8]\n\ - movs r0, 0x80\n\ - lsls r0, 5\n\ - strh r0, [r7, 0xA]\n\ - strh r0, [r7, 0xC]\n\ - bl IsContest\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - cmp r4, 0\n\ - beq _080D3A94\n\ - ldr r3, _080D3A84 @ =0x0000ffb0\n\ - adds r0, r3, 0\n\ - ldr r1, _080D3A88 @ =gBattle_BG1_X\n\ - strh r0, [r1]\n\ - ldr r2, _080D3A8C @ =0x0000ffd0\n\ - adds r0, r2, 0\n\ - ldr r3, _080D3A90 @ =gBattle_BG1_Y\n\ - strh r0, [r3]\n\ - movs r0, 0x2\n\ - strh r0, [r6, 0x8]\n\ - movs r0, 0x1\n\ - strh r0, [r6, 0xA]\n\ - mov r0, r9\n\ - strh r0, [r7, 0xE]\n\ - b _080D3AEE\n\ - .align 2, 0\n\ -_080D3A78: .4byte gBattleAnimBackgroundImageMuddyWater_Pal\n\ -_080D3A7C: .4byte sub_80D3D68\n\ -_080D3A80: .4byte gTasks\n\ -_080D3A84: .4byte 0x0000ffb0\n\ -_080D3A88: .4byte gBattle_BG1_X\n\ -_080D3A8C: .4byte 0x0000ffd0\n\ -_080D3A90: .4byte gBattle_BG1_Y\n\ -_080D3A94:\n\ - ldr r0, _080D3AC4 @ =gBattleAnimAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - cmp r1, 0x1\n\ - bne _080D3AD8\n\ - ldr r2, _080D3AC8 @ =0x0000ff20\n\ - adds r0, r2, 0\n\ - ldr r3, _080D3ACC @ =gBattle_BG1_X\n\ - strh r0, [r3]\n\ - movs r2, 0x80\n\ - lsls r2, 1\n\ - adds r0, r2, 0\n\ - ldr r3, _080D3AD0 @ =gBattle_BG1_Y\n\ - strh r0, [r3]\n\ - movs r0, 0x2\n\ - strh r0, [r6, 0x8]\n\ - ldr r0, _080D3AD4 @ =0x0000ffff\n\ - strh r0, [r6, 0xA]\n\ - strh r1, [r7, 0xE]\n\ - b _080D3AEE\n\ - .align 2, 0\n\ -_080D3AC4: .4byte gBattleAnimAttacker\n\ -_080D3AC8: .4byte 0x0000ff20\n\ -_080D3ACC: .4byte gBattle_BG1_X\n\ -_080D3AD0: .4byte gBattle_BG1_Y\n\ -_080D3AD4: .4byte 0x0000ffff\n\ -_080D3AD8:\n\ - ldr r0, _080D3B1C @ =gBattle_BG1_X\n\ - strh r4, [r0]\n\ - ldr r1, _080D3B20 @ =0x0000ffd0\n\ - adds r0, r1, 0\n\ - ldr r2, _080D3B24 @ =gBattle_BG1_Y\n\ - strh r0, [r2]\n\ - ldr r0, _080D3B28 @ =0x0000fffe\n\ - strh r0, [r6, 0x8]\n\ - movs r0, 0x1\n\ - strh r0, [r6, 0xA]\n\ - strh r4, [r7, 0xE]\n\ -_080D3AEE:\n\ - ldr r1, _080D3B2C @ =REG_BG1HOFS\n\ - ldr r3, _080D3B1C @ =gBattle_BG1_X\n\ - ldrh r0, [r3]\n\ - strh r0, [r1]\n\ - adds r1, 0x2\n\ - ldr r2, _080D3B24 @ =gBattle_BG1_Y\n\ - ldrh r0, [r2]\n\ - strh r0, [r1]\n\ - ldr r1, _080D3B30 @ =gTasks\n\ - mov r3, r8\n\ - lsls r0, r3, 2\n\ - add r0, r8\n\ - lsls r0, 3\n\ - adds r2, r0, r1\n\ - movs r3, 0xE\n\ - ldrsh r0, [r2, r3]\n\ - cmp r0, 0\n\ - bne _080D3B34\n\ - movs r0, 0x30\n\ - strh r0, [r2, 0x10]\n\ - movs r0, 0x70\n\ - b _080D3B38\n\ - .align 2, 0\n\ -_080D3B1C: .4byte gBattle_BG1_X\n\ -_080D3B20: .4byte 0x0000ffd0\n\ -_080D3B24: .4byte gBattle_BG1_Y\n\ -_080D3B28: .4byte 0x0000fffe\n\ -_080D3B2C: .4byte REG_BG1HOFS\n\ -_080D3B30: .4byte gTasks\n\ -_080D3B34:\n\ - movs r0, 0\n\ - strh r0, [r2, 0x10]\n\ -_080D3B38:\n\ - strh r0, [r2, 0x12]\n\ - mov r2, r10\n\ - adds r0, r5, r2\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - movs r1, 0x1\n\ - strh r1, [r0, 0x14]\n\ - ldr r1, _080D3B5C @ =sub_80D3B60\n\ - str r1, [r0]\n\ - add sp, 0x14\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\ -_080D3B5C: .4byte sub_80D3B60\n\ - .syntax divided\n"); + struct Struct_sub_8078914 subStruct; + u8 taskId2; + u16 *BGptrX = &gBattle_BG1_X; + u16 *BGptrY = &gBattle_BG1_Y; + vu8 cpuDelay; // explanation below + + 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); + + // This is gone in FireRed and Emerald. + Dma3FillLarge32_(0, subStruct.field_0, 0x2000); // ! + /* + Many games use wasteful NOPs; some of which are + even moreso than regular ones. This is so that + hardware operations can finish. + + This is just an example. Also, this is apparently + not a macro, as making it a macro results in a + NONMATCHING. + */ + cpuDelay = 0; // stall the CPU + cpuDelay = 0; // stall the CPU + Dma3FillLarge32_(0, subStruct.field_4, 0x1000); // ! + + if (!IsContest()) + { + 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()) + { + *BGptrX = -80; + *BGptrY = -48; + gTasks[taskId].data[0] = 2; + gTasks[taskId].data[1] = 1; + gTasks[taskId2].data[3] = 0; + } + else if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) + { + *BGptrX = -224; + *BGptrY = 256; + gTasks[taskId].data[0] = 2; + gTasks[taskId].data[1] = -1; + gTasks[taskId2].data[3] = 1; + } + else + { + *BGptrX = 0; + *BGptrY = -48; + gTasks[taskId].data[0] = -2; + gTasks[taskId].data[1] = 1; + gTasks[taskId2].data[3] = 0; + } + REG_BG1HOFS = *BGptrX; + REG_BG1VOFS = *BGptrY; + 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; } #ifdef NONMATCHING void sub_80D3B60(u8 taskId) { struct Struct_sub_8078914 unk; + + vu8 cpuDelay; // yet again u8 i; u16 rgbBuffer; u16 *BGptrX = &gBattle_BG1_X; @@ -609,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) @@ -624,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 @@ -882,44 +673,35 @@ _080D3D32:\n\ } #endif -#ifdef NONMATCHING void sub_80D3D68(u8 taskId) { s16 i; struct ScanlineEffectParams params; struct Task *task = &gTasks[taskId]; - // u16 *scanlineBuffer; switch (task->data[0]) { case 0: for (i = 0; i < task->data[4]; i++) { - /* scanlineBuffer = &gScanlineEffectRegBuffers[0][i]; - *(u16 *)(&gScanlineEffect) = task->data[2]; - *scanlineBuffer = task->data[2] & -1; */ - gScanlineEffectRegBuffers[1][i] = task->data[2]; - gScanlineEffectRegBuffers[0][i] = (u16)((int)(task->data[2] & 0xFFFF)); + /* variable initialization isn't literal to ASM */ + gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[2]; } for (i = task->data[4]; i < task->data[5]; i++) { - gScanlineEffectRegBuffers[1][i] = task->data[1]; - gScanlineEffectRegBuffers[0][i] = (u16)((int)(task->data[1] & 0xFFFF)); + gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[1]; } for (i = task->data[5]; i < 160; i++) { - gScanlineEffectRegBuffers[1][i] = task->data[2]; - gScanlineEffectRegBuffers[0][i] = (u16)((int)(task->data[2] & 0xFFFF)); + gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[2]; } if (task->data[4] == 0) { - gScanlineEffectRegBuffers[1][i] = task->data[1]; - gScanlineEffectRegBuffers[0][i] = task->data[1]; + gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[1]; } else { - gScanlineEffectRegBuffers[1][i] = task->data[2]; - gScanlineEffectRegBuffers[0][i] = task->data[2]; + gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[1][i] = task->data[2]; } params.dmaDest = (vu16 *)REG_ADDR_BLDALPHA; params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; @@ -975,391 +757,6 @@ void sub_80D3D68(u8 taskId) break; } } -#else -NAKED -void sub_80D3D68(u8 taskId) -{ - asm_unified("push {r4-r7,lr}\n\ - sub sp, 0xC\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - lsls r0, r7, 2\n\ - adds r0, r7\n\ - lsls r0, 3\n\ - ldr r1, =gTasks\n\ - adds r4, r0, r1\n\ - movs r1, 0x8\n\ - ldrsh r0, [r4, r1]\n\ - cmp r0, 0x1\n\ - bne _080D3D84\n\ - b _080D3EBC\n\ -_080D3D84:\n\ - cmp r0, 0x1\n\ - bgt _080D3D94\n\ - cmp r0, 0\n\ - beq _080D3D9C\n\ - b _080D4032\n\ - .align 2, 0\n\ - .pool\n\ -_080D3D94:\n\ - cmp r0, 0x2\n\ - bne _080D3D9A\n\ - b _080D3F88\n\ -_080D3D9A:\n\ - b _080D4032\n\ -_080D3D9C:\n\ - movs r3, 0\n\ - movs r2, 0x10\n\ - ldrsh r0, [r4, r2]\n\ - ldr r1, =gScanlineEffectRegBuffers\n\ - mov r12, r1\n\ - cmp r3, r0\n\ - bge _080D3DDA\n\ - mov r7, r12\n\ - movs r5, 0xF0\n\ - lsls r5, 3\n\ - add r5, r12\n\ - ldr r6, =0x0000ffff\n\ -_080D3DB4:\n\ - lsls r2, r3, 16\n\ - asrs r2, 16\n\ - lsls r1, r2, 1\n\ - adds r3, r1, r7\n\ - adds r1, r5\n\ - ldrh r0, [r4, 0xC]\n\ - strh r0, [r1]\n\ - ldrh r1, [r4, 0xC]\n\ - adds r0, r6, 0\n\ - ands r0, r1\n\ - strh r0, [r3]\n\ - adds r2, 0x1\n\ - lsls r2, 16\n\ - lsrs r3, r2, 16\n\ - asrs r2, 16\n\ - movs r1, 0x10\n\ - ldrsh r0, [r4, r1]\n\ - cmp r2, r0\n\ - blt _080D3DB4\n\ -_080D3DDA:\n\ - ldrh r3, [r4, 0x10]\n\ - lsls r2, r3, 16\n\ - asrs r1, r2, 16\n\ - movs r3, 0x12\n\ - ldrsh r0, [r4, r3]\n\ - cmp r1, r0\n\ - bge _080D3E14\n\ - ldr r5, =gScanlineEffectRegBuffers\n\ - movs r0, 0xF0\n\ - lsls r0, 3\n\ - adds r6, r5, r0\n\ - ldr r7, =0x0000ffff\n\ -_080D3DF2:\n\ - asrs r2, 16\n\ - lsls r1, r2, 1\n\ - adds r3, r1, r5\n\ - adds r1, r6\n\ - ldrh r0, [r4, 0xA]\n\ - strh r0, [r1]\n\ - ldrh r1, [r4, 0xA]\n\ - adds r0, r7, 0\n\ - ands r0, r1\n\ - strh r0, [r3]\n\ - adds r2, 0x1\n\ - lsls r2, 16\n\ - asrs r1, r2, 16\n\ - movs r3, 0x12\n\ - ldrsh r0, [r4, r3]\n\ - cmp r1, r0\n\ - blt _080D3DF2\n\ -_080D3E14:\n\ - ldrh r3, [r4, 0x12]\n\ - lsls r2, r3, 16\n\ - asrs r0, r2, 16\n\ - cmp r0, 0x9F\n\ - bgt _080D3E4A\n\ - ldr r5, =gScanlineEffectRegBuffers\n\ - movs r0, 0xF0\n\ - lsls r0, 3\n\ - adds r6, r5, r0\n\ - ldr r7, =0x0000ffff\n\ -_080D3E28:\n\ - asrs r2, 16\n\ - lsls r1, r2, 1\n\ - adds r3, r1, r5\n\ - adds r1, r6\n\ - ldrh r0, [r4, 0xC]\n\ - strh r0, [r1]\n\ - ldrh r1, [r4, 0xC]\n\ - adds r0, r7, 0\n\ - ands r0, r1\n\ - strh r0, [r3]\n\ - adds r2, 0x1\n\ - lsls r2, 16\n\ - lsrs r3, r2, 16\n\ - lsls r2, r3, 16\n\ - asrs r0, r2, 16\n\ - cmp r0, 0x9F\n\ - ble _080D3E28\n\ -_080D3E4A:\n\ - movs r1, 0x10\n\ - ldrsh r0, [r4, r1]\n\ - cmp r0, 0\n\ - bne _080D3E74\n\ - lsls r0, r3, 16\n\ - asrs r0, 15\n\ - mov r3, r12\n\ - adds r2, r0, r3\n\ - movs r1, 0xF0\n\ - lsls r1, 3\n\ - add r1, r12\n\ - adds r0, r1\n\ - ldrh r1, [r4, 0xA]\n\ - strh r1, [r0]\n\ - ldrh r0, [r4, 0xA]\n\ - b _080D3E8A\n\ - .align 2, 0\n\ - .pool\n\ -_080D3E74:\n\ - lsls r0, r3, 16\n\ - asrs r0, 15\n\ - mov r1, r12\n\ - adds r2, r0, r1\n\ - movs r1, 0xF0\n\ - lsls r1, 3\n\ - add r1, r12\n\ - adds r0, r1\n\ - ldrh r1, [r4, 0xC]\n\ - strh r1, [r0]\n\ - ldrh r0, [r4, 0xC]\n\ -_080D3E8A:\n\ - strh r0, [r2]\n\ - ldr r0, =0x04000052\n\ - str r0, [sp]\n\ - ldr r0, =0xa2600001\n\ - str r0, [sp, 0x4]\n\ - mov r1, sp\n\ - movs r2, 0\n\ - movs r0, 0x1\n\ - strb r0, [r1, 0x8]\n\ - mov r0, sp\n\ - strb r2, [r0, 0x9]\n\ - ldr r0, [sp]\n\ - ldr r1, [sp, 0x4]\n\ - ldr r2, [sp, 0x8]\n\ - bl ScanlineEffect_SetParams\n\ - ldrh r0, [r4, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r4, 0x8]\n\ - b _080D4032\n\ - .align 2, 0\n\ - .pool\n\ -_080D3EBC:\n\ - movs r2, 0xE\n\ - ldrsh r1, [r4, r2]\n\ - cmp r1, 0\n\ - bne _080D3ED4\n\ - ldrh r0, [r4, 0x10]\n\ - subs r0, 0x1\n\ - strh r0, [r4, 0x10]\n\ - lsls r0, 16\n\ - cmp r0, 0\n\ - bgt _080D3EE8\n\ - strh r1, [r4, 0x10]\n\ - b _080D3EE2\n\ -_080D3ED4:\n\ - ldrh r0, [r4, 0x12]\n\ - adds r0, 0x1\n\ - strh r0, [r4, 0x12]\n\ - lsls r0, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x6F\n\ - ble _080D3EE8\n\ -_080D3EE2:\n\ - ldrh r0, [r4, 0x8]\n\ - adds r0, 0x1\n\ - strh r0, [r4, 0x8]\n\ -_080D3EE8:\n\ - movs r3, 0\n\ - movs r1, 0x10\n\ - ldrsh r0, [r4, r1]\n\ - cmp r3, r0\n\ - bge _080D3F1C\n\ - ldr r6, =gScanlineEffectRegBuffers\n\ - ldr r5, =gScanlineEffect\n\ -_080D3EF6:\n\ - lsls r1, r3, 16\n\ - asrs r1, 16\n\ - lsls r3, r1, 1\n\ - ldrb r2, [r5, 0x14]\n\ - lsls r0, r2, 4\n\ - subs r0, r2\n\ - lsls r0, 7\n\ - adds r3, r0\n\ - adds r3, r6\n\ - ldrh r0, [r4, 0xC]\n\ - strh r0, [r3]\n\ - adds r1, 0x1\n\ - lsls r1, 16\n\ - lsrs r3, r1, 16\n\ - asrs r1, 16\n\ - movs r2, 0x10\n\ - ldrsh r0, [r4, r2]\n\ - cmp r1, r0\n\ - blt _080D3EF6\n\ -_080D3F1C:\n\ - ldrh r3, [r4, 0x10]\n\ - lsls r2, r3, 16\n\ - asrs r1, r2, 16\n\ - movs r3, 0x12\n\ - ldrsh r0, [r4, r3]\n\ - cmp r1, r0\n\ - bge _080D3F50\n\ - ldr r6, =gScanlineEffectRegBuffers\n\ - ldr r5, =gScanlineEffect\n\ -_080D3F2E:\n\ - asrs r3, r2, 16\n\ - lsls r2, r3, 1\n\ - ldrb r1, [r5, 0x14]\n\ - lsls r0, r1, 4\n\ - subs r0, r1\n\ - lsls r0, 7\n\ - adds r2, r0\n\ - adds r2, r6\n\ - ldrh r0, [r4, 0xA]\n\ - strh r0, [r2]\n\ - adds r3, 0x1\n\ - lsls r2, r3, 16\n\ - asrs r1, r2, 16\n\ - movs r3, 0x12\n\ - ldrsh r0, [r4, r3]\n\ - cmp r1, r0\n\ - blt _080D3F2E\n\ -_080D3F50:\n\ - ldrh r3, [r4, 0x12]\n\ - lsls r1, r3, 16\n\ - asrs r0, r1, 16\n\ - cmp r0, 0x9F\n\ - bgt _080D4032\n\ - ldr r6, =gScanlineEffectRegBuffers\n\ - ldr r5, =gScanlineEffect\n\ -_080D3F5E:\n\ - asrs r3, r1, 16\n\ - lsls r2, r3, 1\n\ - ldrb r1, [r5, 0x14]\n\ - lsls r0, r1, 4\n\ - subs r0, r1\n\ - lsls r0, 7\n\ - adds r2, r0\n\ - adds r2, r6\n\ - ldrh r0, [r4, 0xC]\n\ - strh r0, [r2]\n\ - adds r3, 0x1\n\ - lsls r1, r3, 16\n\ - asrs r0, r1, 16\n\ - cmp r0, 0x9F\n\ - ble _080D3F5E\n\ - b _080D4032\n\ - .align 2, 0\n\ - .pool\n\ -_080D3F88:\n\ - movs r3, 0\n\ - movs r1, 0x10\n\ - ldrsh r0, [r4, r1]\n\ - cmp r3, r0\n\ - bge _080D3FBC\n\ - ldr r6, =gScanlineEffectRegBuffers\n\ - ldr r5, =gScanlineEffect\n\ -_080D3F96:\n\ - lsls r1, r3, 16\n\ - asrs r1, 16\n\ - lsls r3, r1, 1\n\ - ldrb r2, [r5, 0x14]\n\ - lsls r0, r2, 4\n\ - subs r0, r2\n\ - lsls r0, 7\n\ - adds r3, r0\n\ - adds r3, r6\n\ - ldrh r0, [r4, 0xC]\n\ - strh r0, [r3]\n\ - adds r1, 0x1\n\ - lsls r1, 16\n\ - lsrs r3, r1, 16\n\ - asrs r1, 16\n\ - movs r2, 0x10\n\ - ldrsh r0, [r4, r2]\n\ - cmp r1, r0\n\ - blt _080D3F96\n\ -_080D3FBC:\n\ - ldrh r3, [r4, 0x10]\n\ - lsls r2, r3, 16\n\ - asrs r1, r2, 16\n\ - movs r3, 0x12\n\ - ldrsh r0, [r4, r3]\n\ - cmp r1, r0\n\ - bge _080D3FF0\n\ - ldr r6, =gScanlineEffectRegBuffers\n\ - ldr r5, =gScanlineEffect\n\ -_080D3FCE:\n\ - asrs r3, r2, 16\n\ - lsls r2, r3, 1\n\ - ldrb r1, [r5, 0x14]\n\ - lsls r0, r1, 4\n\ - subs r0, r1\n\ - lsls r0, 7\n\ - adds r2, r0\n\ - adds r2, r6\n\ - ldrh r0, [r4, 0xA]\n\ - strh r0, [r2]\n\ - adds r3, 0x1\n\ - lsls r2, r3, 16\n\ - asrs r1, r2, 16\n\ - movs r3, 0x12\n\ - ldrsh r0, [r4, r3]\n\ - cmp r1, r0\n\ - blt _080D3FCE\n\ -_080D3FF0:\n\ - ldrh r3, [r4, 0x12]\n\ - lsls r1, r3, 16\n\ - asrs r0, r1, 16\n\ - cmp r0, 0x9F\n\ - bgt _080D401C\n\ - ldr r6, =gScanlineEffectRegBuffers\n\ - ldr r5, =gScanlineEffect\n\ -_080D3FFE:\n\ - asrs r3, r1, 16\n\ - lsls r2, r3, 1\n\ - ldrb r1, [r5, 0x14]\n\ - lsls r0, r1, 4\n\ - subs r0, r1\n\ - lsls r0, 7\n\ - adds r2, r0\n\ - adds r2, r6\n\ - ldrh r0, [r4, 0xC]\n\ - strh r0, [r2]\n\ - adds r3, 0x1\n\ - lsls r1, r3, 16\n\ - asrs r0, r1, 16\n\ - cmp r0, 0x9F\n\ - ble _080D3FFE\n\ -_080D401C:\n\ - movs r0, 0x26\n\ - ldrsh r1, [r4, r0]\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - cmp r1, r0\n\ - bne _080D4032\n\ - bl ScanlineEffect_Stop\n\ - adds r0, r7, 0\n\ - bl DestroyTask\n\ -_080D4032:\n\ - add sp, 0xC\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ - .pool\n"); -} -#endif void sub_80D4044(struct Sprite *sprite) { @@ -1892,17 +1289,32 @@ 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 strange here... + combinedX = sprite->pos1.x + sprite->pos2.x; + combinedY = sprite->pos1.y + sprite->pos2.y; + + // ...then goes back to normal right here. + // Nothing but this appears to reproduce the behavior. + if (xDiff) // yDiff works too, but not sprite. + { + u8 unk = -unk; // this can be any sort of negation + } + + randomSomethingY = yDiff + (Random() % 10) - 5; + randomSomethingX = -xDiff + (Random() % 10) - 5; + for (i = 0; i <= 0; i++) { spriteId = CreateSprite(&gSpriteTemplate_83D9420, combinedX, combinedY + something, 130); @@ -1926,184 +1338,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 |