#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 gBattleAnimAttacker; extern u8 gBattleAnimTarget; extern u16 gBattle_BG2_X; extern u16 gBattle_BG1_X; void sub_80D0E30(struct Sprite* sprite); 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. const struct SpriteTemplate gBattleAnimSpriteTemplate_83D77E0 = { .tileTag = ANIM_TAG_PENCIL, .paletteTag = ANIM_TAG_PENCIL, .oam = &gOamData_837DF34, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_80D0E30, }; void sub_80D0C88(u8 taskId) { struct Task* task = &gTasks[taskId]; struct ScanlineEffectParams params; s16 i; task->data[0] = sub_8077FC0(gBattleAnimTarget) + 32; task->data[1] = 4; task->data[2] = 0; task->data[3] = 0; task->data[4] = 0; task->data[5] = 0; task->data[15] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, 0); if (GetBattlerPosition_permutated(gBattleAnimTarget) == 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; } static 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->x = GetBattlerSpriteCoord(gBattleAnimTarget, 0) - 16; sprite->y = sub_8077FC0(gBattleAnimTarget) + 16; sprite->data[0] = 0; sprite->data[1] = 0; sprite->data[2] = 0; sprite->data[3] = 16; sprite->data[4] = 0; sprite->data[5] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, 0) + 2; sprite->data[6] = BattleAnimAdjustPanning(SOUND_PAN_TARGET); sprite->callback = sub_80D0E8C; } static 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 = FALSE; sprite->data[0]++; } break; case 1: if (++sprite->data[1] > 3 && sprite->data[2] < sprite->data[5]) { sprite->data[1] = 0; sprite->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->x2 = 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 = FALSE; DestroyAnimSprite(sprite); } break; } }