diff options
author | Kaz <kazbloxmc@gmail.com> | 2020-05-31 11:40:51 -0400 |
---|---|---|
committer | Kaz <kazbloxmc@gmail.com> | 2020-05-31 19:47:15 -0400 |
commit | 7c955c5762af37f3da257432a425664d25e168f2 (patch) | |
tree | 40e8a0564cdab0e5dcfb8423618c083d80d88f70 /src | |
parent | 8d0b9655ba2a71edc1c561f9efb7e977acc5b527 (diff) |
battle_script_commands.c: Further work on porting from pokefirered/pokeemerald.
battle/anim/ice.c: port rest of the functions from pokeemerald; file now "done."
Diffstat (limited to 'src')
-rw-r--r-- | src/battle/anim/ice.c | 939 | ||||
-rw-r--r-- | src/battle_script_commands.c | 648 |
2 files changed, 167 insertions, 1420 deletions
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_script_commands.c b/src/battle_script_commands.c index 1eb25e62f..a0f35776a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -11387,107 +11387,34 @@ static void atk9E_metronome(void) .word gBattlerTarget"); } #else -#ifdef NONMATCHING static void atk9E_metronome(void) { - // sMovesForbiddenToCopy - int i; - do + while (1) { - while ((gCurrentMove = (Random() & 0x1FF) + 1) > 0x162); - for (i = 0; sMovesForbiddenToCopy[i] != gCurrentMove && sMovesForbiddenToCopy[i] != 0xFFFF; i++); - } while (sMovesForbiddenToCopy[i] != 0xFFFF); - - gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; - gBattlerTarget = GetMoveTarget(gCurrentMove, 0); -} + s32 i; -#else -NAKED -static void atk9E_metronome(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - ldr r7, _08027938 @ =gCurrentMove\n\ - movs r6, 0xB1\n\ - lsls r6, 1\n\ - ldr r5, _0802793C @ =sMovesForbiddenToCopy\n\ - ldr r0, _08027940 @ =gBattlescriptCurrInstr\n\ - mov r8, r0\n\ -_080278CA:\n\ - bl Random\n\ - ldr r2, _08027944 @ =0x000001ff\n\ - adds r1, r2, 0\n\ - ands r0, r1\n\ - adds r0, 0x1\n\ - strh r0, [r7]\n\ - cmp r0, r6\n\ - bhi _080278CA\n\ - movs r0, 0x3\n\ -_080278DE:\n\ - subs r0, 0x1\n\ - cmp r0, 0\n\ - bge _080278DE\n\ - ldr r4, _08027938 @ =gCurrentMove\n\ - ldrh r2, [r4]\n\ - ldr r3, _08027948 @ =0x0000ffff\n\ - subs r0, r5, 0x2\n\ -_080278EC:\n\ - adds r0, 0x2\n\ - ldrh r1, [r0]\n\ - cmp r1, r2\n\ - beq _080278F8\n\ - cmp r1, r3\n\ - bne _080278EC\n\ -_080278F8:\n\ - ldr r0, _08027948 @ =0x0000ffff\n\ - cmp r1, r0\n\ - bne _080278CA\n\ - ldr r2, _0802794C @ =gHitMarker\n\ - ldr r0, [r2]\n\ - ldr r1, _08027950 @ =0xfffffbff\n\ - ands r0, r1\n\ - str r0, [r2]\n\ - ldr r3, _08027954 @ =gBattleScriptsForMoveEffects\n\ - ldr r2, _08027958 @ =gBattleMoves\n\ - ldrh r1, [r4]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r0, [r0]\n\ - lsls r0, 2\n\ - adds r0, r3\n\ - ldr r0, [r0]\n\ - mov r1, r8\n\ - str r0, [r1]\n\ - ldrh r0, [r4]\n\ - movs r1, 0\n\ - bl GetMoveTarget\n\ - ldr r1, _0802795C @ =gBattlerTarget\n\ - strb r0, [r1]\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08027938: .4byte gCurrentMove\n\ -_0802793C: .4byte sMovesForbiddenToCopy\n\ -_08027940: .4byte gBattlescriptCurrInstr\n\ -_08027944: .4byte 0x000001ff\n\ -_08027948: .4byte 0x0000ffff\n\ -_0802794C: .4byte gHitMarker\n\ -_08027950: .4byte 0xfffffbff\n\ -_08027954: .4byte gBattleScriptsForMoveEffects\n\ -_08027958: .4byte gBattleMoves\n\ -_0802795C: .4byte gBattlerTarget\n\ - .syntax divided"); + gCurrentMove = (Random() & 0x1FF) + 1; + if (gCurrentMove >= 355) + continue; + for (i = 0; i < MAX_MON_MOVES; ++i); // redundant + i = -1; + while (1) + { + ++i; + if (sMovesForbiddenToCopy[i] == gCurrentMove) + break; + if (sMovesForbiddenToCopy[i] == METRONOME_FORBIDDEN_END) + break; + } + if (sMovesForbiddenToCopy[i] == METRONOME_FORBIDDEN_END) + { + gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); + gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]; + gBattlerTarget = GetMoveTarget(gCurrentMove, 0); + return; + } + } } -#endif // NONMATCHING #endif static void atk9F_dmgtolevel(void) @@ -12632,25 +12559,29 @@ static void atkC3_trysetfutureattack(void) } } -#ifdef NONMATCHING static void atkC4_trydobeatup(void) { - register struct Pokemon* party asm("r7"); - if (GetBattlerSide(gBattlerAttacker) == 0) + struct Pokemon *party; + + if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) party = gPlayerParty; else party = gEnemyParty; - if (gBattleMons[gBattlerTarget].hp == 0) + { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + } else { - while (gBattleCommunication[0] < 6) + u8 beforeLoop = gBattleCommunication[0]; + + for (;gBattleCommunication[0] < 6; ++gBattleCommunication[0]) { - if (GetMonData(&party[gBattleCommunication[0]], MON_DATA_HP) && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) - && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) != SPECIES_EGG && !GetMonData(&party[gBattleCommunication[0]], MON_DATA_STATUS)) - break; - gBattleCommunication[0]++; + if (GetMonData(&party[gBattleCommunication[0]], MON_DATA_HP) + && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) + && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2) != SPECIES_EGG + && !GetMonData(&party[gBattleCommunication[0]], MON_DATA_STATUS)) + break; } if (gBattleCommunication[0] < 6) { @@ -12668,269 +12599,14 @@ static void atkC4_trydobeatup(void) gBattleMoveDamage = (gBattleMoveDamage / 50) + 2; if (gProtectStructs[gBattlerAttacker].helpingHand) gBattleMoveDamage = gBattleMoveDamage * 15 / 10; - - gBattleCommunication[0]++; + ++gBattleCommunication[0]; } - else if (gBattleCommunication[0] != 0) + else if (beforeLoop != 0) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5); } } -#else -NAKED -static void atkC4_trydobeatup(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - ldr r0, _08029A8C @ =gBattlerAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerSide\n\ - lsls r0, 24\n\ - ldr r7, _08029A90 @ =gEnemyParty\n\ - cmp r0, 0\n\ - bne _08029A62\n\ - ldr r7, _08029A94 @ =gPlayerParty\n\ -_08029A62:\n\ - ldr r2, _08029A98 @ =gBattleMons\n\ - ldr r0, _08029A9C @ =gBattlerTarget\n\ - ldrb r1, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r2\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - bne _08029AA4\n\ - ldr r3, _08029AA0 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - b _08029C40\n\ - .align 2, 0\n\ -_08029A8C: .4byte gBattlerAttacker\n\ -_08029A90: .4byte gEnemyParty\n\ -_08029A94: .4byte gPlayerParty\n\ -_08029A98: .4byte gBattleMons\n\ -_08029A9C: .4byte gBattlerTarget\n\ -_08029AA0: .4byte gBattlescriptCurrInstr\n\ -_08029AA4:\n\ - ldr r6, _08029BE0 @ =gBattleCommunication\n\ - ldrb r0, [r6]\n\ - mov r8, r0\n\ - cmp r0, 0x5\n\ - bls _08029AB0\n\ - b _08029C0C\n\ -_08029AB0:\n\ - adds r4, r6, 0\n\ - movs r5, 0x64\n\ -_08029AB4:\n\ - ldrb r0, [r4]\n\ - muls r0, r5\n\ - adds r0, r7, r0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08029AF8\n\ - ldrb r0, [r6]\n\ - muls r0, r5\n\ - adds r0, r7, r0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08029AF8\n\ - ldrb r0, [r4]\n\ - muls r0, r5\n\ - adds r0, r7, r0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - movs r1, 0xCE\n\ - lsls r1, 1\n\ - cmp r0, r1\n\ - beq _08029AF8\n\ - ldrb r0, [r4]\n\ - muls r0, r5\n\ - adds r0, r7, r0\n\ - movs r1, 0x37\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _08029B08\n\ -_08029AF8:\n\ - ldrb r0, [r4]\n\ - adds r0, 0x1\n\ - strb r0, [r4]\n\ - adds r6, r4, 0\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x5\n\ - bls _08029AB4\n\ -_08029B08:\n\ - ldr r1, _08029BE0 @ =gBattleCommunication\n\ - mov r9, r1\n\ - ldrb r2, [r1]\n\ - cmp r2, 0x5\n\ - bhi _08029C0C\n\ - ldr r1, _08029BE4 @ =gBattleTextBuff1\n\ - movs r0, 0xFD\n\ - strb r0, [r1]\n\ - movs r0, 0x4\n\ - strb r0, [r1, 0x1]\n\ - ldr r6, _08029BE8 @ =gBattlerAttacker\n\ - ldrb r0, [r6]\n\ - strb r0, [r1, 0x2]\n\ - strb r2, [r1, 0x3]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x4]\n\ - ldr r1, _08029BEC @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x9\n\ - str r0, [r1]\n\ - ldr r2, _08029BF0 @ =gBattleMoveDamage\n\ - mov r8, r2\n\ - ldr r5, _08029BF4 @ =gBaseStats\n\ - mov r1, r9\n\ - ldrb r0, [r1]\n\ - movs r4, 0x64\n\ - muls r0, r4\n\ - adds r0, r7, r0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - lsls r1, r0, 3\n\ - subs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r5\n\ - ldrb r3, [r1, 0x1]\n\ - mov r2, r8\n\ - str r3, [r2]\n\ - ldr r2, _08029BF8 @ =gBattleMoves\n\ - ldr r0, _08029BFC @ =gCurrentMove\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r0, [r0, 0x1]\n\ - muls r0, r3\n\ - mov r1, r8\n\ - str r0, [r1]\n\ - mov r2, r9\n\ - ldrb r0, [r2]\n\ - muls r0, r4\n\ - adds r0, r7, r0\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - lsls r0, 1\n\ - movs r1, 0x5\n\ - bl __udivsi3\n\ - adds r0, 0x2\n\ - mov r2, r8\n\ - ldr r1, [r2]\n\ - muls r0, r1\n\ - str r0, [r2]\n\ - ldr r3, _08029C00 @ =gBattleMons\n\ - ldr r1, _08029C04 @ =gBattlerTarget\n\ - ldrb r2, [r1]\n\ - movs r1, 0x58\n\ - muls r1, r2\n\ - adds r1, r3\n\ - ldrh r2, [r1]\n\ - lsls r1, r2, 3\n\ - subs r1, r2\n\ - lsls r1, 2\n\ - adds r1, r5\n\ - ldrb r1, [r1, 0x2]\n\ - bl __divsi3\n\ - mov r1, r8\n\ - str r0, [r1]\n\ - movs r1, 0x32\n\ - bl __divsi3\n\ - adds r2, r0, 0x2\n\ - mov r0, r8\n\ - str r2, [r0]\n\ - ldr r1, _08029C08 @ =gProtectStructs\n\ - ldrb r0, [r6]\n\ - lsls r0, 4\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - lsls r0, 28\n\ - cmp r0, 0\n\ - bge _08029BD4\n\ - lsls r0, r2, 4\n\ - subs r0, r2\n\ - movs r1, 0xA\n\ - bl __divsi3\n\ - mov r1, r8\n\ - str r0, [r1]\n\ -_08029BD4:\n\ - mov r2, r9\n\ - ldrb r0, [r2]\n\ - adds r0, 0x1\n\ - strb r0, [r2]\n\ - b _08029C46\n\ - .align 2, 0\n\ -_08029BE0: .4byte gBattleCommunication\n\ -_08029BE4: .4byte gBattleTextBuff1\n\ -_08029BE8: .4byte gBattlerAttacker\n\ -_08029BEC: .4byte gBattlescriptCurrInstr\n\ -_08029BF0: .4byte gBattleMoveDamage\n\ -_08029BF4: .4byte gBaseStats\n\ -_08029BF8: .4byte gBattleMoves\n\ -_08029BFC: .4byte gCurrentMove\n\ -_08029C00: .4byte gBattleMons\n\ -_08029C04: .4byte gBattlerTarget\n\ -_08029C08: .4byte gProtectStructs\n\ -_08029C0C:\n\ - mov r0, r8\n\ - cmp r0, 0\n\ - beq _08029C2C\n\ - ldr r3, _08029C28 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - b _08029C40\n\ - .align 2, 0\n\ -_08029C28: .4byte gBattlescriptCurrInstr\n\ -_08029C2C:\n\ - ldr r3, _08029C54 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x5]\n\ - ldrb r0, [r2, 0x6]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x7]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x8]\n\ -_08029C40:\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ -_08029C46:\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08029C54: .4byte gBattlescriptCurrInstr\n\ - .syntax divided"); -} -#endif // NONMATCHING static void atkC5_setsemiinvulnerablebit(void) { @@ -13345,248 +13021,50 @@ static void atkDD_weightdamagecalculation(void) gBattlescriptCurrInstr++; } -#ifdef NONMATCHING static void atkDE_assistattackselect(void) { - u32 chooseable_moves_no = 0; - struct Pokemon* party; - int i, j; - u16* chooseable_moves; - if (GetBattlerPosition(gBattlerAttacker) & 1) + s32 chooseableMovesNo = 0; + struct Pokemon *party; + s32 monId, moveId; + u16 *movesArray = (u16 *)&gBattleStruct->assistMove; + + if (GET_BATTLER_SIDE(gBattlerAttacker) != B_SIDE_PLAYER) party = gEnemyParty; else party = gPlayerParty; - - for (i = 0; i < 6; i++) + for (monId = 0; monId < PARTY_SIZE; ++monId) { - if (i == gBattlerPartyIndexes[gBattlerAttacker]) - break; - if (!GetMonData(&party[i], MON_DATA_SPECIES2) || GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG) - break; - chooseable_moves = &gBattleStruct->assistMove[chooseable_moves_no]; - for (j = 0; j < 4; j++) + if (monId == gBattlerPartyIndexes[gBattlerAttacker] + || GetMonData(&party[monId], MON_DATA_SPECIES2) == SPECIES_NONE + || GetMonData(&party[monId], MON_DATA_SPECIES2) == SPECIES_EGG) + continue; + for (moveId = 0; moveId < MAX_MON_MOVES; ++moveId) { - int k; - u16 move = GetMonData(&party[i], MON_DATA_MOVE1 + i); + s32 i = 0; + u16 move = GetMonData(&party[monId], MON_DATA_MOVE1 + moveId); + if (IsMoveUnchoosable(move)) - break; - //sMovesForbiddenToCopy[k] - for (k = 0; ;k++) - { - if (sMovesForbiddenToCopy[k] == 0xFFFF) - { - if (move) - { - *chooseable_moves = move; - chooseable_moves++; - chooseable_moves_no++; - } - break; - } - if (sMovesForbiddenToCopy[k] == move) - break; - } + continue; + for (; sMovesForbiddenToCopy[i] != ASSIST_FORBIDDEN_END && move != sMovesForbiddenToCopy[i]; ++i); + if (sMovesForbiddenToCopy[i] != ASSIST_FORBIDDEN_END || move == MOVE_NONE) + continue; + movesArray[chooseableMovesNo] = move; + ++chooseableMovesNo; } } - if (chooseable_moves_no) + if (chooseableMovesNo) { gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); - gRandomMove = gBattleStruct->assistMove[Random() % chooseable_moves_no]; + gRandomMove = movesArray[((Random() & 0xFF) * chooseableMovesNo) >> 8]; gBattlerTarget = GetMoveTarget(gRandomMove, 0); gBattlescriptCurrInstr += 5; } else + { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + } } -#else -NAKED -static void atkDE_assistattackselect(void) -{ - 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\ - sub sp, 0x8\n\ - movs r0, 0\n\ - mov r10, r0\n\ - ldr r0, _0802AB9C @ =gBattlerAttacker\n\ - ldrb r0, [r0]\n\ - bl GetBattlerPosition\n\ - movs r1, 0x1\n\ - ands r1, r0\n\ - ldr r0, _0802ABA0 @ =gPlayerParty\n\ - str r0, [sp]\n\ - cmp r1, 0\n\ - beq _0802AAAC\n\ - ldr r1, _0802ABA4 @ =gEnemyParty\n\ - str r1, [sp]\n\ -_0802AAAC:\n\ - movs r2, 0\n\ -_0802AAAE:\n\ - ldr r1, _0802ABA8 @ =gBattlerPartyIndexes\n\ - ldr r0, _0802AB9C @ =gBattlerAttacker\n\ - ldrb r0, [r0]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - adds r1, r2, 0x1\n\ - str r1, [sp, 0x4]\n\ - ldrh r0, [r0]\n\ - cmp r2, r0\n\ - beq _0802AB54\n\ - movs r0, 0x64\n\ - adds r6, r2, 0\n\ - muls r6, r0\n\ - ldr r0, [sp]\n\ - adds r4, r0, r6\n\ - adds r0, r4, 0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _0802AB54\n\ - adds r0, r4, 0\n\ - movs r1, 0x41\n\ - bl GetMonData\n\ - movs r1, 0xCE\n\ - lsls r1, 1\n\ - cmp r0, r1\n\ - beq _0802AB54\n\ - movs r5, 0\n\ - ldr r1, _0802ABAC @ =0x0000ffff\n\ - mov r8, r1\n\ - mov r9, r6\n\ - mov r1, r10\n\ - lsls r0, r1, 1\n\ - ldr r1, _0802ABB0 @ =gSharedMem + 0x16024\n\ - adds r6, r0, r1\n\ -_0802AAF8:\n\ - movs r7, 0\n\ - adds r1, r5, 0\n\ - adds r1, 0xD\n\ - ldr r0, [sp]\n\ - add r0, r9\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - adds r0, r4, 0\n\ - bl IsMoveUnchoosable\n\ - lsls r0, 24\n\ - adds r1, r5, 0x1\n\ - cmp r0, 0\n\ - bne _0802AB4E\n\ - ldr r0, _0802ABB4 @ =sMovesForbiddenToCopy\n\ - ldrh r2, [r0]\n\ - adds r3, r0, 0\n\ - cmp r2, r8\n\ - beq _0802AB42\n\ - cmp r4, r2\n\ - beq _0802AB38\n\ - ldr r5, _0802ABAC @ =0x0000ffff\n\ - adds r2, r3, 0\n\ -_0802AB2A:\n\ - adds r2, 0x2\n\ - adds r7, 0x1\n\ - ldrh r0, [r2]\n\ - cmp r0, r5\n\ - beq _0802AB42\n\ - cmp r4, r0\n\ - bne _0802AB2A\n\ -_0802AB38:\n\ - lsls r0, r7, 1\n\ - adds r0, r3\n\ - ldrh r0, [r0]\n\ - cmp r0, r8\n\ - bne _0802AB4E\n\ -_0802AB42:\n\ - cmp r4, 0\n\ - beq _0802AB4E\n\ - strh r4, [r6]\n\ - adds r6, 0x2\n\ - movs r0, 0x1\n\ - add r10, r0\n\ -_0802AB4E:\n\ - adds r5, r1, 0\n\ - cmp r5, 0x3\n\ - ble _0802AAF8\n\ -_0802AB54:\n\ - ldr r2, [sp, 0x4]\n\ - cmp r2, 0x5\n\ - ble _0802AAAE\n\ - mov r1, r10\n\ - cmp r1, 0\n\ - beq _0802ABCC\n\ - ldr r2, _0802ABB8 @ =gHitMarker\n\ - ldr r0, [r2]\n\ - ldr r1, _0802ABBC @ =0xfffffbff\n\ - ands r0, r1\n\ - str r0, [r2]\n\ - ldr r4, _0802ABC0 @ =gRandomMove\n\ - bl Random\n\ - movs r1, 0xFF\n\ - ands r1, r0\n\ - mov r0, r10\n\ - muls r0, r1\n\ - asrs r0, 8\n\ - lsls r0, 1\n\ - ldr r1, _0802ABB0 @ =gSharedMem + 0x16024\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - strh r0, [r4]\n\ - ldrh r0, [r4]\n\ - movs r1, 0\n\ - bl GetMoveTarget\n\ - ldr r1, _0802ABC4 @ =gBattlerTarget\n\ - strb r0, [r1]\n\ - ldr r1, _0802ABC8 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r1]\n\ - adds r0, 0x5\n\ - str r0, [r1]\n\ - b _0802ABE6\n\ - .align 2, 0\n\ -_0802AB9C: .4byte gBattlerAttacker\n\ -_0802ABA0: .4byte gPlayerParty\n\ -_0802ABA4: .4byte gEnemyParty\n\ -_0802ABA8: .4byte gBattlerPartyIndexes\n\ -_0802ABAC: .4byte 0x0000ffff\n\ -_0802ABB0: .4byte gSharedMem + 0x16024\n\ -_0802ABB4: .4byte sMovesForbiddenToCopy\n\ -_0802ABB8: .4byte gHitMarker\n\ -_0802ABBC: .4byte 0xfffffbff\n\ -_0802ABC0: .4byte gRandomMove\n\ -_0802ABC4: .4byte gBattlerTarget\n\ -_0802ABC8: .4byte gBattlescriptCurrInstr\n\ -_0802ABCC:\n\ - ldr r3, _0802ABF8 @ =gBattlescriptCurrInstr\n\ - ldr r2, [r3]\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2, 0x2]\n\ - lsls r0, 8\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x3]\n\ - lsls r0, 16\n\ - orrs r1, r0\n\ - ldrb r0, [r2, 0x4]\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ -_0802ABE6:\n\ - add sp, 0x8\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\ -_0802ABF8: .4byte gBattlescriptCurrInstr\n\ - .syntax divided"); -} - -#endif // NONMATCHING - static void atkDF_trysetmagiccoat(void) { gBattlerTarget = gBattlerAttacker; |