#include "global.h" #include "rom_8077ABC.h" #include "trig.h" #include "battle_anim.h" #include "sound.h" #include "scanline_effect.h" extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; extern u16 gBattle_BG2_X; extern u16 gBattle_BG1_X; static void sub_80D0D68(u8 taskId); static void sub_80D0E8C(struct Sprite* sprite); // draw (draws the Pokemon into the world using a pencil.) // Used in Sketch. void sub_80D0C88(u8 taskId) { struct Task* task = &gTasks[taskId]; struct ScanlineEffectParams params; s16 i; task->data[0] = sub_8077FC0(gAnimBankTarget) + 32; task->data[1] = 4; task->data[2] = 0; task->data[3] = 0; task->data[4] = 0; task->data[5] = 0; task->data[15] = sub_807A100(gAnimBankTarget, 0); if (GetBattlerPosition_permutated(gAnimBankTarget) == 1) { task->data[6] = gBattle_BG1_X; params.dmaDest = (u16 *)REG_ADDR_BG1HOFS; } else { task->data[6] = gBattle_BG2_X; params.dmaDest = (u16 *)REG_ADDR_BG2HOFS; } for (i = task->data[0] - 0x40; i <= task->data[0];i++) { if (i >= 0) { gScanlineEffectRegBuffers[0][i] = task->data[6] + 0xF0; gScanlineEffectRegBuffers[1][i] = task->data[6] + 0xF0; } } params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; params.initState = 1; params.unused9 = 0; ScanlineEffect_SetParams(params); task->func = sub_80D0D68; } void sub_80D0D68(u8 taskId) { struct Task* task = &gTasks[taskId]; switch (task->data[4]) { case 0: if (++task->data[5] > 20) task->data[4]++; break; case 1: if (++task->data[1] > 3) { task->data[1] = 0; task->data[2] = task->data[3] & 3; task->data[5] = task->data[0] - task->data[3]; switch (task->data[2]) { case 0: break; case 1: task->data[5] -= 2; break; case 2: task->data[5] += 1; break; case 3: task->data[5] += 1; break; } if (task->data[5] >= 0) { gScanlineEffectRegBuffers[0][task->data[5]] = task->data[6]; gScanlineEffectRegBuffers[1][task->data[5]] = task->data[6]; } if (++task->data[3] >= task->data[15]) { gScanlineEffect.state = 3; DestroyAnimVisualTask(taskId); } } break; } } void sub_80D0E30(struct Sprite* sprite) { sprite->pos1.x = GetBattlerSpriteCoord(gAnimBankTarget, 0) - 16; sprite->pos1.y = sub_8077FC0(gAnimBankTarget) + 16; sprite->data[0] = 0; sprite->data[1] = 0; sprite->data[2] = 0; sprite->data[3] = 16; sprite->data[4] = 0; sprite->data[5] = sub_807A100(gAnimBankTarget, 0) + 2; sprite->data[6] = BattleAnimAdjustPanning(0x3F); sprite->callback = sub_80D0E8C; } void sub_80D0E8C(struct Sprite* sprite) { switch (sprite->data[0]) { case 0: if (++sprite->data[2] > 1) { sprite->data[2] = 0; sprite->invisible = !sprite->invisible; } if (++sprite->data[1] > 16) { sprite->invisible = 0; sprite->data[0]++; } break; case 1: if (++sprite->data[1] > 3 && sprite->data[2] < sprite->data[5]) { sprite->data[1] = 0; sprite->pos1.y -= 1; sprite->data[2]++; if (sprite->data[2] % 10 == 0) PlaySE12WithPanning(0xCD, sprite->data[6]); } sprite->data[4] += sprite->data[3]; if (sprite->data[4] > 31) { sprite->data[4] = 0x40 - sprite->data[4]; sprite->data[3] *= -1; } else if (sprite->data[4] <= -32) { sprite->data[4] = -0x40 - sprite->data[4]; sprite->data[3] *= -1; } sprite->pos2.x = sprite->data[4]; if (sprite->data[5] == sprite->data[2]) { sprite->data[1] = 0; sprite->data[2] = 0; sprite->data[0]++; } break; case 2: if (++sprite->data[2] > 1) { sprite->data[2] = 0; sprite->invisible = !sprite->invisible; } if (++sprite->data[1] > 16) { sprite->invisible = 0; DestroyAnimSprite(sprite); } break; } }