diff options
Diffstat (limited to 'src/battle')
-rw-r--r-- | src/battle/anim/dark.c | 2 | ||||
-rw-r--r-- | src/battle/anim/ghost.c | 426 | ||||
-rw-r--r-- | src/battle/battle_anim.c | 6 | ||||
-rw-r--r-- | src/battle/battle_anim_812C144.c | 238 |
4 files changed, 668 insertions, 4 deletions
diff --git a/src/battle/anim/dark.c b/src/battle/anim/dark.c index a7026edff..59db85342 100644 --- a/src/battle/anim/dark.c +++ b/src/battle/anim/dark.c @@ -1024,7 +1024,7 @@ void sub_80E0A4C(u8 taskId) if (IsContest()) { - species = EWRAM_19348; + species = EWRAM_19348[0]; } else { diff --git a/src/battle/anim/ghost.c b/src/battle/anim/ghost.c index fd33d4782..85879c86c 100644 --- a/src/battle/anim/ghost.c +++ b/src/battle/anim/ghost.c @@ -1,15 +1,29 @@ #include "global.h" +#include "sound.h" +#include "constants/songs.h" +#include "trig.h" #include "rom_8077ABC.h" #include "battle_anim.h" extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; +extern u8 gUnknown_0202F7D2; void sub_80DDB6C(struct Sprite *sprite); +void sub_80DDBD8(struct Sprite *); +void sub_80DDC4C(struct Sprite *); +void sub_80DDCC8(struct Sprite *); void sub_80DDD58(struct Sprite *sprite); +void sub_80DDD78(struct Sprite *); +void sub_80DDE7C(u8 taskId); +void sub_80DDED0(u8 taskId); void sub_80DDF40(struct Sprite *sprite); +void sub_80DDFE8(struct Sprite *); void sub_80DE0FC(struct Sprite *sprite); +void sub_80DE114(struct Sprite *); +void sub_80DE2DC(u8 taskId); +void sub_80DE3D4(u8 taskId); void sub_80DE7B8(struct Sprite *sprite); void sub_80DEF3C(struct Sprite *sprite); void sub_80DF0B8(struct Sprite *sprite); @@ -189,3 +203,415 @@ const struct SpriteTemplate gSpriteTemplate_83DAF98 = .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_80DF49C, }; + +void sub_80DDB6C(struct Sprite *sprite) +{ + InitAnimSpritePos(sprite, 1); + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2); + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3); + sub_8078BD4(sprite); + sprite->callback = sub_80DDBD8; + sprite->data[6] = 16; + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = sprite->data[6]; +} + +void sub_80DDBD8(struct Sprite *sprite) +{ + s16 r0; + s16 r2; + sub_80DDCC8(sprite); + if (TranslateAnimSpriteByDeltas(sprite)) + { + sprite->callback = sub_80DDC4C; + return; + } + sprite->pos2.x += Sin(sprite->data[5], 10); + sprite->pos2.y += Cos(sprite->data[5], 15); + r2 = sprite->data[5]; + sprite->data[5] = (sprite->data[5] + 5) & 0xFF; + r0 = sprite->data[5]; + if (r2 != 0 && r2 <= 196) + return; + if (r0 <= 0) + return; + PlaySE12WithPanning(SE_W109, gUnknown_0202F7D2); +} + +void sub_80DDC4C(struct Sprite *sprite) +{ + s16 r2; + s16 r0; + sprite->data[0] = 1; + TranslateAnimSpriteByDeltas(sprite); + sprite->pos2.x += Sin(sprite->data[5],10); + sprite->pos2.y += Cos(sprite->data[5],15); + + r2 = sprite->data[5]; + sprite->data[5] = (sprite->data[5] + 5) & 0xFF; + r0 = sprite->data[5]; + + if(r2 == 0 || r2 > 196) + if(r0 > 0) + PlaySE(SE_W109); + + if(sprite->data[6] == 0) + { + sprite->invisible = TRUE; + sprite->callback = sub_807861C; + } + else + sub_80DDCC8(sprite); +} + +void sub_80DDCC8(struct Sprite *sprite) +{ + + s16 r0; + if(sprite->data[6] > 0xFF) + { + if(++sprite->data[6] == 0x10d) + sprite->data[6] = 0; + return; + } + + r0 = sprite->data[7]; + sprite->data[7]++; + + if((r0 & 0xFF) == 0) + { + sprite->data[7] &= 0xff00; + if((sprite->data[7] & 0x100) != 0) + sprite->data[6]++; + else + sprite->data[6]--; + } + else + return; + + REG_BLDALPHA = BLDALPHA_BLEND(sprite->data[6], 16 - sprite->data[6]); + if(sprite->data[6] == 0 || sprite->data[6] == 16) + sprite->data[7] ^= 0x100; + if(sprite->data[6] == 0) + sprite->data[6] = 0x100; +} + +void sub_80DDD58(struct Sprite *sprite) +{ + sub_8078764(sprite, 1); + sprite->callback = sub_80DDD78; + sub_80DDD78(sprite); +} + +void sub_80DDD78(struct Sprite *sprite) +{ + u16 temp1; + sprite->pos2.x = Sin(sprite->data[0], 32); + sprite->pos2.y = Cos(sprite->data[0], 8); + temp1 = sprite->data[0] - 65; + if (temp1 <= 130) + sprite->oam.priority = 2; + else + sprite->oam.priority = 1; + sprite->data[0] = (sprite->data[0] + 19) & 0xFF; + sprite->data[2] += 80; + sprite->pos2.y += sprite->data[2] >> 8; + sprite->data[7] += 1; + if (sprite->data[7] == 61) + DestroyAnimSprite(sprite); +} + +void sub_80DDDF0(u8 taskId) +{ + u8 spriteId; + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = 0x1000; + spriteId = GetAnimBattlerSpriteId(0); + sub_8078E70(spriteId, 1); + obj_id_set_rotscale(spriteId, 128, 128, 0); + gSprites[spriteId].invisible = FALSE; + gTasks[taskId].data[0] = 128; + gTasks[taskId].data[1] = *gBattleAnimArgs; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 16; + gTasks[taskId].func = sub_80DDE7C; +} + +void sub_80DDE7C(u8 taskId) +{ + gTasks[taskId].data[10] += 1; + if (gTasks[taskId].data[10] == 3) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[2] += 1; + gTasks[taskId].data[3] -= 1; + REG_BLDALPHA = gTasks[taskId].data[3] << 8 | gTasks[taskId].data[2]; + if (gTasks[taskId].data[2] != 9) + return; + gTasks[taskId].func = sub_80DDED0; + } +} + +void sub_80DDED0(u8 taskId) +{ + u8 spriteId; + if (gTasks[taskId].data[1] > 0) + { + gTasks[taskId].data[1] -= 1; + return; + } + spriteId = GetAnimBattlerSpriteId(0); + gTasks[taskId].data[0] += 8; + if (gTasks[taskId].data[0] <= 0xFF) + { + obj_id_set_rotscale(spriteId, gTasks[taskId].data[0], gTasks[taskId].data[0], 0); + return; + } + sub_8078F40(spriteId); + DestroyAnimVisualTask(taskId); + REG_BLDCNT = 0; + REG_BLDALPHA = 0; +} + +void sub_80DDF40(struct Sprite *sprite) +{ + u16 r5, r6; + r5 = sprite->pos1.x; + r6 = sprite->pos1.y; + sprite->pos1.x = GetBattlerSpriteCoord(gAnimBankAttacker, 2); + sprite->pos1.y = GetBattlerSpriteCoord(gAnimBankAttacker, 3); + sprite->data[0] = 0; + sprite->data[1] = gBattleAnimArgs[0]; + sprite->data[2] = gBattleAnimArgs[1]; + sprite->data[3] = gBattleAnimArgs[2]; + sprite->data[4] = sprite->pos1.x << 4; + sprite->data[5] = sprite->pos1.y << 4; + sprite->data[6] = (((s16)r5 - sprite->pos1.x) << 4) / (gBattleAnimArgs[0] << 1); + sprite->data[7] = (((s16)r6 - sprite->pos1.y) << 4) / (gBattleAnimArgs[0] << 1); + sprite->callback = sub_80DDFE8; +} + +void sub_80DDFE8(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->data[4] += sprite->data[6]; + sprite->data[5] += sprite->data[7]; + sprite->pos1.x = sprite->data[4] >> 4; + sprite->pos1.y = sprite->data[5] >> 4; + sprite->data[1] -= 1; + if (sprite->data[1] > 0) + break; + sprite->data[0] += 1; + break; + case 1: + sprite->data[2] -= 1; + if (sprite->data[2] > 0) + break; + sprite->data[1] = GetBattlerSpriteCoord(gAnimBankTarget, 2); + sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 3); + sprite->data[4] = sprite->pos1.x << 4; + sprite->data[5] = sprite->pos1.y << 4; + sprite->data[6] = ((sprite->data[1] - sprite->pos1.x) << 4) / sprite->data[3]; + sprite->data[7] = ((sprite->data[2] - sprite->pos1.y) << 4) / sprite->data[3]; + sprite->data[0] += 1; + break; + case 2: + sprite->data[4] += sprite->data[6]; + sprite->data[5] += sprite->data[7]; + sprite->pos1.x = sprite->data[4] >> 4; + sprite->pos1.y = sprite->data[5] >> 4; + sprite->data[3] -= 1; + if (sprite->data[3] > 0) + break; + sprite->pos1.x = GetBattlerSpriteCoord(gAnimBankTarget, 2); + sprite->pos1.y = GetBattlerSpriteCoord(gAnimBankTarget, 3); + sprite->data[0] += 1; + break; + case 3: + move_anim_8074EE0(sprite); + break; + } +} + +void sub_80DE0FC(struct Sprite *sprite) +{ + sub_8078764(sprite, 1); + sprite->callback = sub_80DE114; +} + +/* NONMATCHING */ +NAKED +void sub_80DE114(struct Sprite *sprite) +{ + asm_unified("\tpush {r4-r6,lr}\n" + "\tadds r3, r0, 0\n" + "\tmovs r5, 0\n" + "\tmovs r6, 0\n" + "\tadds r0, 0x3F\n" + "\tldrb r1, [r0]\n" + "\tmovs r0, 0x10\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _080DE1AA\n" + "\tadds r1, r3, 0\n" + "\tadds r1, 0x3E\n" + "\tldrb r2, [r1]\n" + "\tmovs r0, 0x4\n" + "\tands r0, r2\n" + "\tadds r4, r1, 0\n" + "\tcmp r0, 0\n" + "\tbne _080DE13E\n" + "\tmovs r0, 0x4\n" + "\torrs r0, r2\n" + "\tstrb r0, [r4]\n" + "_080DE13E:\n" + "\tmovs r1, 0x2E\n" + "\tldrsh r0, [r3, r1]\n" + "\tcmp r0, 0\n" + "\tbeq _080DE14E\n" + "\tcmp r0, 0x1\n" + "\tbeq _080DE158\n" + "\tmovs r6, 0x1\n" + "\tb _080DE162\n" + "_080DE14E:\n" + "\tmovs r1, 0x30\n" + "\tldrsh r0, [r3, r1]\n" + "\tcmp r0, 0x2\n" + "\tbne _080DE162\n" + "\tb _080DE166\n" + "_080DE158:\n" + "\tmovs r1, 0x30\n" + "\tldrsh r0, [r3, r1]\n" + "\tcmp r0, 0x4\n" + "\tbne _080DE162\n" + "\tmovs r5, 0x1\n" + "_080DE162:\n" + "\tcmp r5, 0\n" + "\tbeq _080DE198\n" + "_080DE166:\n" + "\tldrb r2, [r4]\n" + "\tlsls r0, r2, 29\n" + "\tlsrs r0, 31\n" + "\tmovs r1, 0x1\n" + "\teors r1, r0\n" + "\tlsls r1, 2\n" + "\tmovs r0, 0x5\n" + "\tnegs r0, r0\n" + "\tands r0, r2\n" + "\torrs r0, r1\n" + "\tstrb r0, [r4]\n" + "\tldrh r0, [r3, 0x32]\n" + "\tadds r0, 0x1\n" + "\tmovs r1, 0\n" + "\tstrh r0, [r3, 0x32]\n" + "\tstrh r1, [r3, 0x30]\n" + "\tlsls r0, 16\n" + "\tasrs r0, 16\n" + "\tcmp r0, 0x5\n" + "\tbne _080DE1AA\n" + "\tstrh r1, [r3, 0x32]\n" + "\tldrh r0, [r3, 0x2E]\n" + "\tadds r0, 0x1\n" + "\tstrh r0, [r3, 0x2E]\n" + "\tb _080DE1AA\n" + "_080DE198:\n" + "\tcmp r6, 0\n" + "\tbeq _080DE1A4\n" + "\tadds r0, r3, 0\n" + "\tbl DestroyAnimSprite\n" + "\tb _080DE1AA\n" + "_080DE1A4:\n" + "\tldrh r0, [r3, 0x30]\n" + "\tadds r0, 0x1\n" + "\tstrh r0, [r3, 0x30]\n" + "_080DE1AA:\n" + "\tpop {r4-r6}\n" + "\tpop {r0}\n" + "\tbx r0\n"); +} + +void sub_80DE1B0(u8 taskId) +{ + struct Task *task; + + task = &gTasks[taskId]; + task->data[0] = duplicate_obj_of_side_rel2move_in_transparent_mode(1); + if (task->data[0] < 0) + { + DestroyAnimVisualTask(taskId); + return; + } + task->data[1] = 0; + task->data[2] = 15; + task->data[3] = 2; + task->data[4] = 0; + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = (task->data[3] << 8) | task->data[2]; + gSprites[task->data[0]].data[0] = 80; + if (GetBattlerSide(gAnimBankTarget) == 0) + { + gSprites[task->data[0]].data[1] = -144; + gSprites[task->data[0]].data[2] = 112; + } + else + { + gSprites[task->data[0]].data[1] = 144; + gSprites[task->data[0]].data[2] = -112; + } + gSprites[task->data[0]].data[3] = 0; + gSprites[task->data[0]].data[4] = 0; + StoreSpriteCallbackInData(&gSprites[task->data[0]], SpriteCallbackDummy); + gSprites[task->data[0]].callback = sub_8078394; + task->func = sub_80DE2DC; +} + +void sub_80DE2DC(u8 taskId) +{ + struct Task *task; + + task = &gTasks[taskId]; + switch (task->data[4]) + { + case 0: + task->data[1] += 1; + task->data[5] = task->data[1] & 3; + if (task->data[5] == 1) + if (task->data[2] > 0) + task->data[2] -= 1; + if (task->data[5] == 3) + if (task->data[3] <= 15) + task->data[3] += 1; + REG_BLDALPHA = (task->data[3] << 8) | task->data[2]; + if (task->data[3] != 16 || task->data[2] != 0) + break; + if (task->data[1] <= 80) + break; + obj_delete_but_dont_free_vram(&gSprites[task->data[0]]); + task->data[4] = 1; + break; + case 1: + if (++task->data[6] <= 1) + break; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + task->data[4] += 1; + break; + case 2: + DestroyAnimVisualTask(taskId); + } +} + +void sub_80DE3AC(u8 taskId) +{ + struct Task *task; + + task = &gTasks[taskId]; + task->data[15] = 0; + task->func = sub_80DE3D4; + sub_80DE3D4(taskId); +} diff --git a/src/battle/battle_anim.c b/src/battle/battle_anim.c index f3b0056ac..ebfe2401d 100644 --- a/src/battle/battle_anim.c +++ b/src/battle/battle_anim.c @@ -1499,7 +1499,7 @@ void LaunchBattleAnimation(const u8 *const moveAnims[], u16 move, u8 isMoveAnim) else { for (i = 0; i < 4; i++) - gAnimSpeciesByBanks[i] = EWRAM_19348; + gAnimSpeciesByBanks[i] = EWRAM_19348[0]; } if (isMoveAnim == 0) @@ -1933,7 +1933,7 @@ void MoveBattlerSpriteToBG(u8 bank, u8 toBG_2) spriteId = gBankSpriteIds[bank]; gBattle_BG1_X = -(gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x) + 32; - if (IsContest() != 0 && IsSpeciesNotUnown(EWRAM_19348) != 0) + if (IsContest() != 0 && IsSpeciesNotUnown(EWRAM_19348[0]) != 0) gBattle_BG1_X--; gBattle_BG1_Y = -(gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) + 32; gSprites[gBankSpriteIds[bank]].invisible = TRUE; @@ -1987,7 +1987,7 @@ static void sub_8076380(void) struct UnknownStruct2 s; u16 *ptr; - if (IsSpeciesNotUnown(EWRAM_19348)) + if (IsSpeciesNotUnown(EWRAM_19348[0])) { sub_8078914(&s); ptr = s.unk4; diff --git a/src/battle/battle_anim_812C144.c b/src/battle/battle_anim_812C144.c index 601e3c6df..cef1fb97c 100644 --- a/src/battle/battle_anim_812C144.c +++ b/src/battle/battle_anim_812C144.c @@ -1,12 +1,17 @@ #include "global.h" #include "battle.h" #include "battle_anim.h" +#include "contest.h" +#include "data2.h" +#include "decompress.h" +#include "ewram.h" #include "palette.h" #include "random.h" #include "rom_8077ABC.h" #include "scanline_effect.h" #include "sound.h" #include "trig.h" +#include "constants/songs.h" extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; @@ -18,15 +23,25 @@ extern u16 gBattle_WIN0V; extern u16 gBattle_WIN1H; extern u16 gBattle_WIN1V; extern u16 gBattle_BG1_X; +extern u16 gBattle_BG1_Y; extern u16 gBattle_BG2_X; +extern u16 gBattle_BG2_Y; extern const struct SpriteTemplate gBattleAnimSpriteTemplate_83D7220; extern const struct SpriteTemplate gSpriteTemplate_8402500; +extern const union AffineAnimCmd *const gSpriteAffineAnimTable_81E7C18[]; +extern const union AffineAnimCmd *const gSpriteAffineAnimTable_81E7BEC[]; extern const union AffineAnimCmd gUnknown_08402400[]; extern const union AffineAnimCmd gUnknown_084024B0[]; extern const union AffineAnimCmd gUnknown_08402518[]; extern const union AffineAnimCmd gUnknown_08402540[]; extern const union AffineAnimCmd gUnknown_08402590[]; +extern const u32 gUnknown_08D2AA98[]; +extern const u32 gUnknown_08D2A9E0[]; +extern const u16 gUnknown_08D2AA80[]; +extern const s8 gUnknown_084025C0[]; +extern u8 gBattleMonForms[]; +extern u8 gBankSpriteIds[]; extern u8 sub_8046234(s16 x, s16 y, u8 a3); @@ -1124,3 +1139,226 @@ void sub_812D790(u8 taskId) DestroyAnimVisualTask(taskId); } } + +void sub_812D7E8(u8 taskId) +{ + int i, j; + u8 position; + struct Struct_sub_8078914 subStruct; + u8 *dest; + u8 *src; + u16 *field_4; + u16 *ptr; + u16 stretch; + + switch (gTasks[taskId].data[0]) + { + case 0: + REG_MOSAIC = 0; + if (GetBattlerPosition_permutated(gAnimBankAttacker) == 1) + REG_BG1CNT_BITFIELD.mosaic = 1; + else + REG_BG2CNT_BITFIELD.mosaic = 1; + + gTasks[taskId].data[10] = gBattleAnimArgs[0]; + gTasks[taskId].data[0]++; + break; + case 1: + if (gTasks[taskId].data[2]++ > 1) + { + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[1]++; + stretch = gTasks[taskId].data[1]; + REG_MOSAIC = (stretch << 4) | stretch; + if (stretch == 15) + gTasks[taskId].data[0]++; + } + break; + case 2: + sub_8031FC4(gAnimBankAttacker, gAnimBankTarget, gTasks[taskId].data[10]); + sub_8078954(&subStruct, gAnimBankAttacker); + + if (IsContest()) + position = 0; + else + position = GetBattlerPosition(gAnimBankAttacker); + + dest = gUnknown_081FAF4C[position] + (gBattleMonForms[gAnimBankAttacker] << 11); + src = subStruct.field_0; + DmaCopy32(3, dest, src, 0x800); + + if (IsContest()) + { + if (IsSpeciesNotUnown(EWRAM_19348[0]) != IsSpeciesNotUnown(EWRAM_19348[1])) + { + field_4 = (u16 *)subStruct.field_4; + for (i = 0; i < 8; i++) + { + for (j = 0; j < 4; j++) + { + u16 temp = field_4[j + i * 0x20]; + field_4[j + i * 0x20] = field_4[(7 - j) + i * 0x20]; + field_4[(7 - j) + i * 0x20] = temp; + } + } + + for (i = 0; i < 8; i++) + { + for (j = 0; j < 8; j++) + { + field_4[j + i * 0x20] ^= 0x400; + } + } + } + + ptr = EWRAM_19348; + if (IsSpeciesNotUnown(ptr[1])) + gSprites[gBankSpriteIds[gAnimBankAttacker]].affineAnims = gSpriteAffineAnimTable_81E7C18; + else + gSprites[gBankSpriteIds[gAnimBankAttacker]].affineAnims = gSpriteAffineAnimTable_81E7BEC; + + StartSpriteAffineAnim(&gSprites[gBankSpriteIds[gAnimBankAttacker]], 0); + } + + gTasks[taskId].data[0]++; + break; + case 3: + if (gTasks[taskId].data[2]++ > 1) + { + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[1]--; + stretch = gTasks[taskId].data[1]; + REG_MOSAIC = (stretch << 4) | stretch; + + if (stretch == 0) + gTasks[taskId].data[0]++; + } + break; + case 4: + REG_MOSAIC = 0; + if (GetBattlerPosition_permutated(gAnimBankAttacker) == 1) + REG_BG1CNT_BITFIELD.mosaic = 0; + else + REG_BG2CNT_BITFIELD.mosaic = 0; + + if (!IsContest()) + { + if (GetBattlerSide(gAnimBankAttacker) == B_SIDE_OPPONENT) + { + if (gTasks[taskId].data[10] == 0) + sub_8032984(gAnimBankAttacker, eTransformStatuses[gAnimBankAttacker].species); + } + } + + DestroyAnimVisualTask(taskId); + break; + } +} + +void c3_80DFBE4(u8 taskId) +{ + gBattleAnimArgs[7] = gSprites[gBankSpriteIds[gAnimBankAttacker]].invisible; + DestroyAnimVisualTask(taskId); +} + +void sub_812DB58(u8 taskId) +{ + sub_8031FC4(gAnimBankAttacker, gAnimBankTarget, 1); + DestroyAnimVisualTask(taskId); +} + +void sub_812DB84(u8 taskId) +{ + struct Struct_sub_8078914 subStruct; + + switch (gTasks[taskId].data[0]) + { + case 0: + REG_BLDCNT = BLDCNT_TGT2_BD | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 + | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1; + REG_BLDALPHA = 0x1000; + REG_BG1CNT_BITFIELD.screenSize = 0; + REG_BG1CNT_BITFIELD.priority = 1; + if (!IsContest()) + REG_BG1CNT_BITFIELD.charBaseBlock = 1; + + sub_8078914(&subStruct); + DmaClear32(3, subStruct.field_4, 0x1000); + LZDecompressVram(gUnknown_08D2AA98, subStruct.field_4); + LZDecompressVram(gUnknown_08D2A9E0, subStruct.field_0); + LoadCompressedPalette(gUnknown_08D2AA80, subStruct.field_8 * 16, 32); + if (IsContest()) + { + sub_80763FC(subStruct.field_8, (u16 *)subStruct.field_4, 0, 0); + gBattle_BG1_X = -56; + gBattle_BG1_Y = 0; + } + else + { + if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER) + gBattle_BG1_X = -135; + else + gBattle_BG1_X = -10; + + gBattle_BG1_Y = 0; + } + + gTasks[taskId].data[10] = gBattle_BG1_X; + gTasks[taskId].data[11] = gBattle_BG1_Y; + + gTasks[taskId].data[0]++; + PlaySE12WithPanning(SE_W234, BattleAnimAdjustPanning(-64)); + break; + case 1: + if (gTasks[taskId].data[4]++ > 0) + { + gTasks[taskId].data[4] = 0; + if (++gTasks[taskId].data[1] > 12) + gTasks[taskId].data[1] = 12; + + REG_BLDALPHA = ((16 - gTasks[taskId].data[1]) << 8) | gTasks[taskId].data[1]; + + if (gTasks[taskId].data[1] == 12) + gTasks[taskId].data[0]++; + } + break; + case 2: + if (--gTasks[taskId].data[1] < 0) + gTasks[taskId].data[1] = 0; + + REG_BLDALPHA = ((16 - gTasks[taskId].data[1]) << 8) | gTasks[taskId].data[1]; + + if (gTasks[taskId].data[1] == 0) + { + gBattle_BG1_X = gUnknown_084025C0[gTasks[taskId].data[2]] + gTasks[taskId].data[10]; + if (++gTasks[taskId].data[2] == 4) + gTasks[taskId].data[0] = 4; + else + gTasks[taskId].data[0] = 3; + } + break; + case 3: + if (++gTasks[taskId].data[3] == 4) + { + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[0] = 1; + PlaySE12WithPanning(SE_W234, BattleAnimAdjustPanning(-64)); + } + break; + case 4: + sub_8078914(&subStruct); + DmaFill32Large(3, 0, subStruct.field_0, 0x2000, 0x1000); + DmaClear32(3, subStruct.field_4, 0x800); + + if (!IsContest()) + REG_BG1CNT_BITFIELD.charBaseBlock = 0; + + REG_BG1CNT_BITFIELD.priority = 1; + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + DestroyAnimVisualTask(taskId); + break; + } +} |