diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle/anim/ice.c | 1825 |
1 files changed, 1809 insertions, 16 deletions
diff --git a/src/battle/anim/ice.c b/src/battle/anim/ice.c index 50c8b9030..d072b7712 100644 --- a/src/battle/anim/ice.c +++ b/src/battle/anim/ice.c @@ -1,25 +1,59 @@ #include "global.h" +#include "main.h" +#include "trig.h" #include "rom_8077ABC.h" +#include "battle.h" #include "battle_anim.h" +#include "constants/battle_constants.h" +#include "task.h" +#include "decompress.h" +#include "palette.h" +#include "random.h" extern s16 gBattleAnimArgs[]; -extern u8 gAnimBankAttacker; -extern u8 gAnimBankTarget; - -void sub_80D7704(struct Sprite *sprite); -void sub_80D78EC(struct Sprite *sprite); -void sub_80D792C(struct Sprite *sprite); -void sub_80D79B4(struct Sprite *sprite); -void sub_80D7A64(struct Sprite *sprite); -void sub_80D7CD4(struct Sprite *sprite); -void sub_80D7E88(struct Sprite *sprite); -void sub_80D7F10(struct Sprite *sprite); -void sub_80D83E0(struct Sprite *sprite); -void sub_80D8700(struct Sprite *sprite); -void sub_80D8D1C(struct Sprite *sprite); +extern u8 gAnimBankAttacker; +extern u8 gAnimBankTarget; +extern u8 gAnimVisualTaskCount; +extern u8 gBanksBySide[]; +extern u8 gBankSpriteIds[]; + +extern u16 gBattle_BG1_X; +extern u16 gBattle_BG1_Y; + +extern const u8 gUnknown_083970E8[]; + +extern struct INCBIN_U8 gBattleAnimFogTilemap; +extern struct INCBIN_U8 gWeatherFog1Tiles; + +static void sub_80D7704(struct Sprite *sprite); +static void sub_80D78EC(struct Sprite *sprite); +static void sub_80D792C(struct Sprite *sprite); +static void sub_80D79B4(struct Sprite *sprite); +static void sub_80D7A28(struct Sprite *sprite); +static void sub_80D7A64(struct Sprite *sprite); +static void sub_80D7CD4(struct Sprite *sprite); +static void sub_80D7E88(struct Sprite *sprite); +static void sub_80D7F10(struct Sprite *sprite); +static void sub_80D83E0(struct Sprite *sprite); +static void sub_80D8700(struct Sprite *sprite); +static void sub_80D8D1C(struct Sprite *sprite); void sub_807A9BC(struct Sprite *sprite); -void unc_080B06FC(struct Sprite *sprite); -void sub_80D8F10(struct Sprite *sprite); +static void unc_080B06FC(struct Sprite *sprite); +static void sub_80D8F10(struct Sprite *sprite); +static void sub_80D7BA0(struct Sprite *sprite); +static void sub_80D7C08(struct Sprite *sprite); +static void sub_80D7C8C(struct Sprite *sprite); +static void sub_80D7E18(struct Sprite *sprite); +static void sub_80D8048(struct Sprite *sprite); +static void sub_80D8874(struct Sprite *sprite); +static void sub_80D8E00(struct Sprite *sprite); +static void sub_80D8EE0(struct Sprite *sprite); +static void sub_80D8F74(struct Sprite *sprite); + +static void sub_80D81E0(u8 taskId); +static void sub_80D851C(u8 taskId); +static void sub_80D8AF8(u8 taskId); +bool8 sub_80D8BA8(u8 a1, u8 a2, u8 a3, u8 a4); const union AnimCmd gSpriteAnim_83D9B58[] = { @@ -493,3 +527,1762 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_83D9F0C = .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_80D8F10, }; + +/* + * possible moves include: aurora beam, blizzard, hail, haze, ice ball, + * ice beam, ice punch, icicle spear, icy wind, + * mist, powder snow, sheer cold, + */ + +/* +// NOT EQUIVALENT +static void sub_80D7704(struct Sprite *sprite) +{ + // + //u16 battler1, battler2, battler3, battler4; // + u16 r9, r8, r3, r6; + //s16 r4, r10; + + sprite->oam.tileNum += 7; + + //u8 battler1, battler2, battler3, battler4; + + //battler1 = GetBattlerSpriteCoord(gAnimBankTarget, 2); + //battler2 = GetBattlerSpriteCoord(gAnimBankTarget, 3); + //battler3 = GetBattlerSpriteCoord(gAnimBankAttacker, 2); + //battler4 = GetBattlerSpriteCoord(gAnimBankAttacker, 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(gAnimBankTarget, 2); + r8 = GetBattlerSpriteCoord(gAnimBankTarget, 3); + r3 = GetBattlerSpriteCoord(gAnimBankAttacker, 2); + r6 = GetBattlerSpriteCoord(gAnimBankAttacker, 3); + + sprite->data[0] = gBattleAnimArgs[4]; + + 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; + + + 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 @ =gAnimBankTarget\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 @ =gAnimBankAttacker\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 gAnimBankTarget\n" + "_080D7818: .4byte gAnimBankAttacker\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"); +} + +void sub_80D7888(struct Sprite *sprite) +{ + if (sprite->data[0] != 0) + { + sprite->data[5] += sprite->data[1]; + sprite->data[6] += sprite->data[2]; + sprite->pos2.x = sprite->data[5]; + sprite->pos2.y = sprite->data[6]; + sprite->pos2.x += Sin(sprite->data[7], sprite->data[3]); + sprite->pos2.y += Sin(sprite->data[7], sprite->data[3]); + sprite->data[7] = (sprite->data[7] + sprite->data[4]) & 0xFF; + sprite->data[0] -= 1; + } + else + { + DestroyAnimSprite(sprite); + } +} + +static void sub_80D78EC(struct Sprite *sprite) +{ + sprite->data[0] = gBattleAnimArgs[0]; + sprite->data[1] = 60; + sprite->data[2] = 9; + sprite->data[3] = 30; + sprite->data[4] = 65024; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); + sprite->callback = sub_8078174; + sub_8078174(sprite); +} + +static void sub_80D792C(struct Sprite *sprite) +{ + InitAnimSpritePos(sprite, 1); + sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2); + + if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER) + sprite->data[2] -= gBattleAnimArgs[2]; + else + sprite->data[2] += gBattleAnimArgs[2]; + + sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3) + gBattleAnimArgs[3]; + sprite->data[0] = gBattleAnimArgs[4]; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); + sprite->callback = StartAnimLinearTranslation; +} + +static void sub_80D79B4(struct Sprite *sprite) +{ + if (gBattleAnimArgs[2] == 0) + { + sub_8078764(sprite, 1); + } + else + { + SetAverageBattlerPositions(gAnimBankTarget, 1, &sprite->pos1.x, &sprite->pos1.y); + if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER) + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + } + + StoreSpriteCallbackInData(sprite, sub_80D7A28); + sprite->callback = sub_80785E4; +} + +static void sub_80D7A28(struct Sprite *sprite) +{ + sprite->invisible ^= 1; + sprite->data[0] += 1; + if (sprite->data[0] == 20) + move_anim_8074EE0(sprite); +} + +static void sub_80D7A64(struct Sprite *sprite) +{ + int i; + s16 tempDataHolder[8]; + + InitAnimSpritePos(sprite, 1); + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[1] = sprite->pos1.x; + sprite->data[3] = sprite->pos1.y; + + if (gBattleAnimArgs[5] == 0) + { + sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2); + sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3) + gBattleAnimArgs[3]; + } + else + { + SetAverageBattlerPositions(gAnimBankTarget, 1, &sprite->data[2], &sprite->data[4]); + } + + if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER) + sprite->data[2] -= gBattleAnimArgs[2]; + else + sprite->data[2] += gBattleAnimArgs[2]; + + for (i = 0; i < 8; i++) + tempDataHolder[i] = sprite->data[i]; + + sub_8078D60(sprite); + sprite->data[1] ^= 1; + sprite->data[2] ^= 1; + + while (1) + { + sprite->data[0] = 1; + sub_8078CE8(sprite); + + if ((u32)(sprite->pos1.x + sprite->pos2.x + 16) > 272 + || sprite->pos1.y + sprite->pos2.y > 160 + || sprite->pos1.y + sprite->pos2.y < -16) + break; + } + + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.y = 0; + sprite->pos2.x = 0; + + for (i = 0; i < 8; i++) + sprite->data[i] = tempDataHolder[i]; + + sprite->callback = sub_8078D8C; + StoreSpriteCallbackInData(sprite, sub_80D7BA0); +} + +static void sub_80D7BA0(struct Sprite *sprite) +{ + s16 tempVar; + + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.y = 0; + sprite->pos2.x = 0; + sprite->data[0] = 128; + + tempVar = GetBattlerSide(gAnimBankAttacker) != 0 ? 20 : 65516; + + sprite->data[3] = Sin(sprite->data[0], tempVar); + sprite->data[4] = Cos(sprite->data[0], 0xF); + sprite->data[5] = 0; + sprite->callback = sub_80D7C08; + sub_80D7C08(sprite); +} + +static void sub_80D7C08(struct Sprite *sprite) +{ + s16 tempVar; + tempVar = GetBattlerSide(gAnimBankAttacker) != 0 ? 20 : 65516; + + if (sprite->data[5] <= 31) + { + sprite->pos2.x = Sin(sprite->data[0], tempVar) - sprite->data[3]; + sprite->pos2.y = Cos(sprite->data[0], 15) - sprite->data[4]; + sprite->data[0] = (sprite->data[0] + 16) & 0xFF; + sprite->data[5] += 1; + } + else + { + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.y = 0; + sprite->pos2.x = 0; + sprite->data[4] = 0; + sprite->data[3] = 0; + sprite->callback = sub_80D7C8C; + } +} + +static void sub_80D7C8C(struct Sprite *sprite) +{ + sprite->data[0] = 1; + sub_8078CE8(sprite); + + if ((u32)(sprite->pos1.x + sprite->pos2.x + 16) > 272 + || sprite->pos1.y + sprite->pos2.y > 256 + || sprite->pos1.y + sprite->pos2.y < -16) + DestroyAnimSprite(sprite); +} + +static void sub_80D7CD4(struct Sprite *sprite) +{ + int i; + s16 tempDataHolder[8]; + + InitAnimSpritePos(sprite, 1); + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[1] = sprite->pos1.x; + sprite->data[3] = sprite->pos1.y; + + if (gBattleAnimArgs[7] == 0) + { + sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2); + sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3); + } + else + { + SetAverageBattlerPositions(gAnimBankTarget, 1, &sprite->data[2], &sprite->data[4]); + } + + if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER) + sprite->data[2] -= gBattleAnimArgs[2]; + else + sprite->data[2] += gBattleAnimArgs[2]; + + sprite->data[4] += gBattleAnimArgs[3]; + sub_8078D60(sprite); + for (i = 0; i < 8; i++) + tempDataHolder[i] = sprite->data[i]; + + sprite->data[1] ^= 1; + sprite->data[2] ^= 1; + + while (1) + { + sprite->data[0] = 1; + sub_8078CE8(sprite); + if ((u32)(sprite->pos1.x + sprite->pos2.x + 16) > 272 + || sprite->pos1.y + sprite->pos2.y > 160 + || sprite->pos1.y + sprite->pos2.y < -16) + break; + } + + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.y = 0; + sprite->pos2.x = 0; + + for (i = 0; i < 8; i++) + sprite->data[i] = tempDataHolder[i]; + + sprite->data[5] = gBattleAnimArgs[5]; + sprite->data[6] = gBattleAnimArgs[6]; + sprite->callback = sub_80D7E18; +} + +static void sub_80D7E18(struct Sprite *sprite) +{ + sub_8078CE8(sprite); + if (sprite->data[0] == 0) + sprite->data[0] = 1; + + sprite->pos2.y += Sin(sprite->data[7], sprite->data[5]); + sprite->data[7] = (sprite->data[7] + sprite->data[6]) & 0xFF; + if (sprite->data[0] == 1) + { + if ((u32)(sprite->pos1.x + sprite->pos2.x + 16) > 272 + || sprite->pos1.y + sprite->pos2.y > 160 + || sprite->pos1.y + sprite->pos2.y < -16) + DestroyAnimSprite(sprite); + } +} + +static void sub_80D7E88(struct Sprite *sprite) +{ + if (sprite->data[0] == 0) + { + if (gBattleAnimArgs[2] == 0) + { + sub_8078764(sprite, 0); + } + else + { + SetAverageBattlerPositions(gAnimBankTarget, 0, &sprite->pos1.x, &sprite->pos1.y); + + if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER) + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + } + + sprite->data[0]++; + } + else + { + if (sprite->animEnded) + DestroyAnimSprite(sprite); + } +} + +static void sub_80D7F10(struct Sprite *sprite) +{ + s16 tempVar; + u8 battler; + + if (gBattleAnimArgs[4] == 0) + { + if (gBattleAnimArgs[5] == 0) + { + InitAnimSpritePos(sprite, 0); + } + else + { + SetAverageBattlerPositions(gAnimBankAttacker, 0, &sprite->pos1.x, &sprite->pos1.y); + if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER) + sprite->pos1.x -= gBattleAnimArgs[0]; + else + sprite->pos1.x += gBattleAnimArgs[0]; + + sprite->pos1.y += gBattleAnimArgs[1]; + } + + battler = gAnimBankAttacker; + } + else + { + if (gBattleAnimArgs[5] == 0) + { + sub_8078764(sprite, 0); + } + else + { + SetAverageBattlerPositions(gAnimBankTarget, 0, &sprite->pos1.x, &sprite->pos1.y); + if (GetBattlerSide(gAnimBankTarget) != B_SIDE_PLAYER) + sprite->pos1.x -= gBattleAnimArgs[0]; + else + sprite->pos1.x += gBattleAnimArgs[0]; + + sprite->pos1.y += gBattleAnimArgs[1]; + } + + battler = gAnimBankTarget; + } + + sprite->data[7] = battler; + if (gBattleAnimArgs[5] == 0 || !IsDoubleBattle()) + tempVar = 0x20; + else + tempVar = 0x40; + + sprite->data[6] = tempVar; + if (GetBattlerSide(gAnimBankTarget) == B_SIDE_PLAYER) + sprite->pos1.y += 8; + + sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = sprite->pos1.x; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[2]; + + InitAnimLinearTranslation(sprite); + + sprite->data[5] = 64; + sprite->callback = sub_80D8048; + sub_80D8048(sprite); +} + +static void sub_80D8048(struct Sprite *sprite) +{ + if (!TranslateAnimLinear(sprite)) + { + sprite->pos2.x += Sin(sprite->data[5], sprite->data[6]); + sprite->pos2.y += Cos(sprite->data[5], -6); + + if ((u16)(sprite->data[5] - 64) <= 0x7F) + sprite->oam.priority = sub_8079ED4(sprite->data[7]); + else + sprite->oam.priority = sub_8079ED4(sprite->data[7]) + 1; + + sprite->data[5] = (sprite->data[5] + 3) & 0xFF; + } + else + { + DestroyAnimSprite(sprite); + } +} + +// Used in haze +void sub_80D80E0(u8 taskId) +{ + struct Struct_sub_8078914 subStruct; + + REG_BLDCNT = 0x3F42; + REG_BLDALPHA = 0x1000; + REG_BG1CNT_BITFIELD.priority = 1; + REG_BG1CNT_BITFIELD.screenSize = 0; + + if (!IsContest()) + REG_BG1CNT_BITFIELD.charBaseBlock = 1; + + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + + sub_8078914(&subStruct); + DmaFill32Defvars(3, 0, subStruct.field_4, 0x1000); + DmaCopy16Defvars(3, &gWeatherFog1Tiles, subStruct.field_0, 0x800); + LZDecompressVram(&gBattleAnimFogTilemap, subStruct.field_4); + LoadPalette(&gUnknown_083970E8, subStruct.field_8 * 16, 32); + + if (IsContest()) + sub_80763FC(subStruct.field_8, (u16 *)subStruct.field_4, 0, 0); + + gTasks[taskId].func = sub_80D81E0; +} + +static void sub_80D81E0(u8 taskId) +{ + struct Struct_sub_8078914 subStruct; + + gBattle_BG1_X += 0xFFFF; + gBattle_BG1_Y += 0; + + switch (gTasks[taskId].data[12]) + { + case 0: + if (++gTasks[taskId].data[10] == 4) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[9]++; + gTasks[taskId].data[11] = gUnknown_083D9D6C[gTasks[taskId].data[9]]; + + REG_BLDALPHA = gTasks[taskId].data[11] | ((16 - gTasks[taskId].data[11]) << 8); + if (gTasks[taskId].data[11] == 9) + { + gTasks[taskId].data[12]++; + gTasks[taskId].data[11] = 0; + } + } + break; + case 1: + if (++gTasks[taskId].data[11] == 0x51) + { + gTasks[taskId].data[11] = 9; + gTasks[taskId].data[12]++; + } + break; + case 2: + if (++gTasks[taskId].data[10] == 4) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[11]--; + + REG_BLDALPHA = gTasks[taskId].data[11] | ((16 - gTasks[taskId].data[11]) << 8); + if (gTasks[taskId].data[11] == 0) + { + gTasks[taskId].data[12]++; + gTasks[taskId].data[11] = 0; + } + } + break; + case 3: + sub_8078914(&subStruct); + DmaFill32Large(3, 0, subStruct.field_0, 0x2000, 0x1000); + DmaClear32(3, subStruct.field_4, 0x800); + + if (!IsContest()) + REG_BG1CNT_BITFIELD.charBaseBlock = 0; + + gTasks[taskId].data[12]++; + // fall through + case 4: + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BG1CNT_BITFIELD.priority = 1; + DestroyAnimVisualTask(taskId); + } +} + +static void sub_80D83E0(struct Sprite *sprite) +{ + sprite->pos1.x = GetBattlerSpriteCoord(gAnimBankAttacker, 2); + sprite->pos1.y = GetBattlerSpriteCoord(gAnimBankAttacker, 3); + sprite->callback = TranslateAnimSpriteToTargetMonLocation; +} + +void sub_80D8414(u8 taskId) +{ + struct Struct_sub_8078914 subStruct; + + REG_BLDCNT = 0x3F42; + REG_BLDALPHA = 0x1000; + REG_BG1CNT_BITFIELD.priority = 1; + REG_BG1CNT_BITFIELD.screenSize = 0; + + if (!IsContest()) + REG_BG1CNT_BITFIELD.charBaseBlock = 1; + + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + + sub_8078914(&subStruct); + DmaFill32Defvars(3, 0, subStruct.field_4, 0x1000); + DmaCopy16Defvars(3, &gWeatherFog1Tiles, subStruct.field_0, 0x800); + LZDecompressVram(&gBattleAnimFogTilemap, subStruct.field_4); + LoadPalette(&gUnknown_083970E8, subStruct.field_8 * 16, 32); + + if (IsContest()) + sub_80763FC(subStruct.field_8, (u16 *)subStruct.field_4, 0, 0); + + gTasks[taskId].data[15] = -1; + gTasks[taskId].func = sub_80D851C; +} + +static void sub_80D851C(u8 taskId) +{ + struct Struct_sub_8078914 subStruct; + + gBattle_BG1_X += gTasks[taskId].data[15]; + gBattle_BG1_Y += 0; + + switch (gTasks[taskId].data[12]) + { + case 0: + gTasks[taskId].data[9] += 1; + gTasks[taskId].data[11] = gUnknown_083D9D98[gTasks[taskId].data[9]]; + REG_BLDALPHA = gTasks[taskId].data[11] | ((17 - gTasks[taskId].data[11]) << 8); + if (gTasks[taskId].data[11] == 5) + { + gTasks[taskId].data[12]++; + gTasks[taskId].data[11] = 0; + } + break; + case 1: + if (++gTasks[taskId].data[11] == 0x51) + { + gTasks[taskId].data[11] = 5; + gTasks[taskId].data[12]++; + } + break; + case 2: + if (++gTasks[taskId].data[10] == 4) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[11] -= 1; + REG_BLDALPHA = gTasks[taskId].data[11] | ((16 - gTasks[taskId].data[11]) << 8); + if (gTasks[taskId].data[11] == 0) + { + gTasks[taskId].data[12]++; + gTasks[taskId].data[11] = 0; + } + } + break; + case 3: + sub_8078914(&subStruct); + DmaFill32Large(3, 0, subStruct.field_0, 0x2000, 0x1000); + DmaClear32(3, subStruct.field_4, 0x800); + + if (!IsContest()) + REG_BG1CNT_BITFIELD.charBaseBlock = 0; + + gTasks[taskId].data[12]++; + // fall through + case 4: + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BG1CNT_BITFIELD.priority = 1; + DestroyAnimVisualTask(taskId); + } +} + +static void sub_80D8700(struct Sprite *sprite) +{ + sprite->data[0] = gBattleAnimArgs[0]; + + if (GetBattlerSpriteCoord(gAnimBankAttacker, 2) < GetBattlerSpriteCoord(gAnimBankTarget, 2)) + sprite->data[7] = 0x8000; + + if (!(gBanksBySide[gAnimBankTarget] & 1)) + { + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + gBattleAnimArgs[3] = -gBattleAnimArgs[3]; + + if ((sprite->data[7] & 0x8000) && !(gBanksBySide[gAnimBankAttacker] & 1)) + sprite->subpriority = gSprites[GetAnimBattlerSpriteId(1)].subpriority + 1; + + sprite->data[6] = 1; + } + + sprite->pos1.x = GetBattlerSpriteCoord(gAnimBankAttacker, 2); + sprite->pos1.y = GetBattlerSpriteCoord(gAnimBankAttacker, 3); + if (gBattleAnimArgs[7]) + { + sprite->data[1] = sprite->pos1.x + gBattleAnimArgs[1]; + sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2) + gBattleAnimArgs[3]; + sprite->data[3] = sprite->pos1.y + gBattleAnimArgs[2]; + sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3) + gBattleAnimArgs[4]; + sprite->data[7] |= sub_8079ED4(gAnimBankTarget) << 8; + } + else + { + sprite->data[1] = sprite->pos1.x + gBattleAnimArgs[1]; + sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 0) + gBattleAnimArgs[3]; + sprite->data[3] = sprite->pos1.y + gBattleAnimArgs[2]; + sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 1) + gBattleAnimArgs[4]; + sprite->data[7] |= sub_8079ED4(gAnimBankTarget) << 8; + } + + if (IsContest()) + { + sprite->data[6] = 1; + sprite->subpriority = 0x80; + } + + InitAnimLinearTranslation(sprite); + sprite->callback = sub_80D8874; +} + +/* +// (Probably) not equivalent +static void sub_80D8874(struct Sprite *sprite) +{ + s16 r0, r3; + s8 r1; + + // is this a temp var? + if ((sprite->data[7] & 0xFF) != 1) // cmp 1 + { + // + if ((sprite->data[7] & 0xFF) <= 1) // cmp 2 + { + // + if ((sprite->data[7] & 0xFF) != 0) // cmp 3 + { + // _AD0 + return; + } + // _896 (else?) + TranslateAnimLinear(sprite); + sprite->pos2.x += ((sprite->data[5] * 2 + gSineTable[0]) >> 4); + + if (sprite->data[6] != 0) // cmp 5 + { + // ... + r0 = sprite->data[5] - 8; + } + else // == + { + // _8C4 + r0 = sprite->data[5] + 8; + } + // _8C8 + sprite->data[5] = r0 & 0xFF; + + if (sprite->data[0] >= 0) // cmp 6 + { + // _AD0 + return; + } + // < _8D6 (else?) + // is this a temp var? + sprite->pos1.x = GetBattlerSpriteCoord(gAnimBankTarget, 0); + sprite->data[1] = GetBattlerSpriteCoord(gAnimBankTarget, 0); + sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 0); + + // is sprite->pos2.y + sprite->pos1.y also a temp var??? + sprite->pos1.y += sprite->pos2.y; + sprite->data[3] = sprite->pos2.y + sprite->pos1.y; + sprite->data[4] = sprite->pos2.y + sprite->pos1.y + 0x1D; + + sprite->data[7] += 1; + + if ((gMain.inBattle & 2) != 0 + || (gBanksBySide[gAnimBankTarget] & 1) != 0) // cmp 7 || cmp 8 + { + // ... + sprite->data[5] = 204; + } + else + { + // _938 + sprite->data[5] = 80; + } + // _93A + sprite->pos2.y = 0; + + sprite->pos2.x = (sprite->data[5] * 2 + gSineTable[0]) >> 3; + sprite->data[5] = (sprite->data[5] + 2) & 0xFF; + + InitAnimLinearTranslation(sprite); + + return; + } + else // > + { + // _88E // could this be an else if? + if ((sprite->data[7] & 0xFF) == 2) // cmp 4 + { + // _A94 + if (TranslateAnimLinear(sprite) != 0) // cmp 15 + { + if ((sprite->oam.affineMode & 1) != 0) // cmp 16 + { + //... + FreeOamMatrix(sprite->oam.matrixNum); + sprite->oam.affineMode = (sprite->oam.affineMode & -4); + } + // _AC2 + DestroySprite(sprite); // &sprite? + gAnimVisualTaskCount--; + + return; + } // else? + return; + } + else + { + // _894 + return; + } + } + } + else // == + { + // _968 + TranslateAnimLinear(sprite); + + sprite->pos2.x += (sprite->data[5] * 2 + gSineTable[0]) >> 3; // ??? + sprite->pos2.y += (-3 * gSineTable[(sprite->data[5] + 64) << 1]) >> 8; // which one of these is closer? + + if ((gMain.inBattle & 2) != 0) // cmp 9 + { + // + r3 = sprite->data[5]; + + if ((u16)(sprite->data[5] - 64) <= 0x7F) // cmp 10 + { + // ... + r1 = sprite->data[7]; + } + else + { + // _9D4 + r1 = sprite->data[7] + 1; + } + // _9DC + sprite->oam.priority = (sprite->oam.priority & -13) | (r1 & 3) << 2; + r0 = r3 + 4; + } + else // == + { + // _9F2 + if ((u16)(sprite->data[5] - 64) <= 0x7F) // cmp 11 + { + // ... &spite->subpriority ??? + r1 = sprite->subpriority; + r0 = 128; + } + else // > + { + // _A06 + r1 = sprite->subpriority; + r0 = 140; + } + // _A0C // *r1 ??? + sprite->subpriority = r0; + r0 = sprite->data[5] - 4; + } + // _A12 + sprite->data[5] = r0 & 0xFF; + sprite->data[0] = 768; + + sprite->pos1.x = sprite->pos2.x + sprite->pos1.x;//+= sprite->pos2.x; + sprite->data[1] = sprite->pos2.x + sprite->pos1.x; + + sprite->pos1.y = sprite->pos2.y + sprite->pos1.y; + sprite->data[3] = sprite->pos2.y + sprite->pos1.y; + + sprite->data[4] = sprite->pos2.y + sprite->pos1.y + 4; + + if (sprite->data[0] <= 0) // cmp 12 + { + // + if ((gMain.inBattle & 2) != 0 + || (gBanksBySide[gAnimBankTarget] & 1) != 0) // cmp 13 || cmp 14 + { + // + r0 = 0x80 << 1; + } + else + { + // _A78 + r0 = 0xFFF0; + } + // _A7A + sprite->data[2] = r0; + sprite->data[7] += 1; + + sprite->pos2.y = 0; + sprite->pos1.x = 0; + + sub_8078BD4(sprite); + } + // _AD0 + return; + } + + // _AD0 / return + return; +} +*/ + +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 @ =gAnimBankTarget\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 @ =gBanksBySide\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 gAnimBankTarget\n" + "_080D892C: .4byte gMain\n" + "_080D8930: .4byte 0x0000043d\n" + "_080D8934: .4byte gBanksBySide\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 @ =gBanksBySide\n" + "\tldr r0, _080D8A74 @ =gAnimBankTarget\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 gBanksBySide\n" + "_080D8A74: .4byte gAnimBankTarget\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"); +} + +void sub_80D8ADC(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + task->func = sub_80D8AF8; +} + +static void sub_80D8AF8(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + switch (task->data[0]) + { + case 0: + if (++task->data[4] > 2) + { + task->data[4] = 0; + task->data[5] = 0; + task->data[2] = 0; + task->data[0]++; + } + break; + case 1: + if (task->data[5] == 0) + { + if (sub_80D8BA8(task->data[3], task->data[2], taskId, 1)) + task->data[1]++; + + if (++task->data[2] == 3) + { + if (++task->data[3] == 10) + task->data[0]++; + else + task->data[0]--; + } + else + { + task->data[5] = 1; + } + + } + else + { + task->data[5]--; + } + break; + case 2: + if (task->data[1] == 0) + DestroyAnimVisualTask(taskId); + break; + } +} + +/* +// +void sub_80D8BA8(u8 a1, u8 a2, u8 a3, u8 a4)//(u8 spriteId, u8 taskId, u8 a3)//(u8 taskId) +{ + // + //struct Task *task = &gTasks[a2]; + //u16 i, j; + //task->data[3]++; + //u8 r5bank = ; + + if (gUnknown_083D9DC4[a1+0x3] >> 4 != 2 + || IsAnimBankSpriteVisible(GetBattlerAtPosition(gUnknown_083D9DC4[a1+0x2]))) + { + // + } + else + { + // _C94 + } + // _CA6 +} +*/ + +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 sub_807A100\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 sub_807A100\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 sub_807A100\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 sub_807A100\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 @ =gSpriteTemplate_83D9E3C\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 gSpriteTemplate_83D9E3C\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 sub_80D8D1C(struct Sprite *sprite) +{ + u8 spriteId; + + sprite->pos1.x += 4; + sprite->pos1.y += 8; + + if (sprite->pos1.x < sprite->data[3] && sprite->pos1.y < sprite->data[4]) + return; + + if (sprite->data[0] == 1 && sprite->data[5] == 0) + { + spriteId = CreateSprite(&gBattleAnimSpriteTemplate_83D9C78, + sprite->data[3], sprite->data[4], sprite->subpriority); + + sprite->data[0] = spriteId; + if (spriteId != 64) + { + gSprites[sprite->data[0]].callback = sub_80D8E00; + gSprites[sprite->data[0]].data[6] = sprite->data[6]; + gSprites[sprite->data[0]].data[7] = sprite->data[7]; + } + + FreeOamMatrix(sprite->oam.matrixNum); + DestroySprite(sprite); + } + else + { + gTasks[sprite->data[6]].data[sprite->data[7]]--; + FreeOamMatrix(sprite->oam.matrixNum); + DestroySprite(sprite); + } +} + +static void sub_80D8E00(struct Sprite *sprite) +{ + if (++sprite->data[0] == 20) + { + gTasks[sprite->data[6]].data[sprite->data[7]]--; + FreeOamMatrix(sprite->oam.matrixNum); + DestroySprite(sprite); + } +} + +// Does this animate icicle arc for icicle spear? +static void unc_080B06FC(struct Sprite *sprite) +{ + u8 animNum = gAnimDisableStructPtr->rolloutTimer2 - gAnimDisableStructPtr->rolloutTimer1 - 1; + + if (animNum > 4) + animNum = 4; + + StartSpriteAffineAnim(sprite, animNum); + InitAnimSpritePos(sprite, 1); + + sprite->data[0] = gBattleAnimArgs[4]; + + if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER) + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + + sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2) + gBattleAnimArgs[2]; + sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3) + gBattleAnimArgs[3]; + sprite->data[5] = gBattleAnimArgs[5]; + + InitAnimArcTranslation(sprite); + + sprite->callback = sub_80D8EE0; +} + +static void sub_80D8EE0(struct Sprite *sprite) +{ + if (!TranslateAnimArc(sprite)) + return; + + StartSpriteAnim(sprite, 1); + sprite->callback = sub_8078600; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); +} + +static void sub_80D8F10(struct Sprite *sprite) +{ + s16 randA, randB; + + sprite->oam.tileNum += 8; + sub_8078764(sprite, 1); + + randA = (Random() & 0xFF) + 256; + randB = Random() & 0x1FF; + + if (randB > 0xFF) + randB = 256 - randB; + + sprite->data[1] = randA; + sprite->data[2] = randB; + sprite->callback = sub_80D8F74; +} + +static void sub_80D8F74(struct Sprite *sprite) +{ + sprite->data[3] += sprite->data[1]; + sprite->data[4] += sprite->data[2]; + + if (sprite->data[1] & 1) + sprite->pos2.x = -(sprite->data[3] >> 8); + else + sprite->pos2.x = sprite->data[3] >> 8; + + sprite->pos2.y = sprite->data[4] >> 8; + if (++sprite->data[0] == 21) + DestroyAnimSprite(sprite); +} + +// Counter for icicle spear? +void sub_80D8FC0(u8 taskId) +{ + u8 arg = gBattleAnimArgs[0]; + + gBattleAnimArgs[arg] = gAnimDisableStructPtr->rolloutTimer2 - gAnimDisableStructPtr->rolloutTimer1 - 1; + DestroyAnimVisualTask(taskId); +} |