diff options
Diffstat (limited to 'src/battle_anim_mon_movement.c')
-rw-r--r-- | src/battle_anim_mon_movement.c | 366 |
1 files changed, 247 insertions, 119 deletions
diff --git a/src/battle_anim_mon_movement.c b/src/battle_anim_mon_movement.c index 27e6ef28c..88fbce6da 100644 --- a/src/battle_anim_mon_movement.c +++ b/src/battle_anim_mon_movement.c @@ -6,43 +6,91 @@ #define abs(x) ((x) < 0 ? -(x) : (x)) -void sub_8098A6C(u8 taskId); -void sub_8098C08(u8 taskId); -void sub_8098D54(u8 taskId); -void sub_8098EF0(u8 taskId); -void sub_8099004(u8 taskId); -void sub_80990AC(struct Sprite * sprite); -void sub_8099120(struct Sprite * sprite); -void sub_8099144(struct Sprite * sprite); -void sub_8099190(struct Sprite * sprite); -void sub_80991B4(struct Sprite * sprite); -void sub_8099270(struct Sprite * sprite); -void sub_80992E0(struct Sprite * sprite); -void sub_8099394(struct Sprite * sprite); -void sub_809946C(struct Sprite * sprite); -void sub_8099530(u8 taskId); -void sub_8099594(u8 taskId); -void sub_80996B8(u8 taskId); -void sub_8099788(u8 taskId); -void sub_8099908(u8 taskId); -void sub_8099B54(u8 taskId); -void sub_8099CB8(u8 taskId); - -const struct SpriteTemplate gUnknown_83D4E4C[] = { - { - 0, 0, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_80990AC - }, { - 0, 0, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_8099144 - }, { - 0, 0, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_80991B4 - }, { - 0, 0, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_80992E0 - }, { - 0, 0, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_8099394 - } +static void AnimTask_ShakeMonStep(u8 taskId); +static void AnimTask_ShakeMon2Step(u8 taskId); +static void AnimTask_ShakeMonInPlaceStep(u8 taskId); +static void AnimTask_ShakeAndSinkMonStep(u8 taskId); +static void AnimTask_TranslateMonEllipticalStep(u8 taskId); +static void DoHorizontalLunge(struct Sprite * sprite); +static void ReverseHorizontalLungeDirection(struct Sprite * sprite); +static void DoVerticalDip(struct Sprite * sprite); +static void ReverseVerticalDipDirection(struct Sprite * sprite); +static void SlideMonToOriginalPos(struct Sprite * sprite); +static void SlideMonToOriginalPosStep(struct Sprite * sprite); +static void SlideMonToOffset(struct Sprite * sprite); +static void sub_8099394(struct Sprite * sprite); +static void sub_809946C(struct Sprite * sprite); +static void AnimTask_WindUpLungePart1(u8 taskId); +static void AnimTask_WindUpLungePart2(u8 taskId); +static void sub_80996B8(u8 taskId); +static void AnimTask_SwayMonStep(u8 taskId); +static void AnimTask_ScaleMonAndRestoreStep(u8 taskId); +static void sub_8099B54(u8 taskId); +static void sub_8099CB8(u8 taskId); + +const struct SpriteTemplate gHorizontalLungeSpriteTemplate = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &gDummyOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = DoHorizontalLunge, +}; + +const struct SpriteTemplate gVerticalDipSpriteTemplate = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &gDummyOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = DoVerticalDip, +}; + +const struct SpriteTemplate gSlideMonToOriginalPosSpriteTemplate = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &gDummyOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SlideMonToOriginalPos, +}; + +const struct SpriteTemplate gSlideMonToOffsetSpriteTemplate = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &gDummyOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SlideMonToOffset, +}; + +const struct SpriteTemplate gUnknown_83D4EB4 = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &gDummyOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8099394, }; -void sub_80989F8(u8 taskId) +// Task to facilitate simple shaking of a pokemon's picture in battle. +// The shaking alternates between the original position and the target position. +// arg 0: anim battler +// arg 1: x pixel offset +// arg 2: y pixel offset +// arg 3: num times to shake +// arg 4: frame delay +void AnimTask_ShakeMon(u8 taskId) { u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]); @@ -58,12 +106,12 @@ void sub_80989F8(u8 taskId) gTasks[taskId].data[3] = gBattleAnimArgs[4]; gTasks[taskId].data[4] = gBattleAnimArgs[1]; gTasks[taskId].data[5] = gBattleAnimArgs[2]; - gTasks[taskId].func = sub_8098A6C; + gTasks[taskId].func = AnimTask_ShakeMonStep; gTasks[taskId].func(taskId); } } -void sub_8098A6C(u8 taskId) +static void AnimTask_ShakeMonStep(u8 taskId) { if (gTasks[taskId].data[3] == 0) { @@ -87,7 +135,14 @@ void sub_8098A6C(u8 taskId) gTasks[taskId].data[3]--; } -void sub_8098B1C(u8 taskId) +// Task to facilitate simple shaking of a pokemon's picture in battle. +// The shaking alternates between the positive and negative versions of the specified pixel offsets. +// arg 0: anim battler +// arg 1: x pixel offset +// arg 2: y pixel offset +// arg 3: num times to shake +// arg 4: frame delay +void AnimTask_ShakeMon2(u8 taskId) { bool8 abort = FALSE; u8 spriteId; @@ -116,7 +171,7 @@ void sub_8098B1C(u8 taskId) battlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); break; } - if (!sub_8072DF0(battlerId)) + if (!IsBattlerSpriteVisible(battlerId)) abort = TRUE; spriteId = gBattlerSpriteIds[battlerId]; } @@ -134,12 +189,12 @@ void sub_8098B1C(u8 taskId) gTasks[taskId].data[3] = gBattleAnimArgs[4]; gTasks[taskId].data[4] = gBattleAnimArgs[1]; gTasks[taskId].data[5] = gBattleAnimArgs[2]; - gTasks[taskId].func = sub_8098C08; + gTasks[taskId].func = AnimTask_ShakeMon2Step; gTasks[taskId].func(taskId); } } -void sub_8098C08(u8 taskId) +static void AnimTask_ShakeMon2Step(u8 taskId) { if (gTasks[taskId].data[3] == 0) { @@ -163,7 +218,15 @@ void sub_8098C08(u8 taskId) gTasks[taskId].data[3]--; } -void sub_8098CD0(u8 taskId) +// Task to facilitate simple shaking of a pokemon's picture in battle. +// The shaking alternates between the positive and negative versions of the specified pixel offsets +// with respect to the current location of the mon's picture. +// arg 0: battler +// arg 1: x offset +// arg 2: y offset +// arg 3: num shakes +// arg 4: delay +void AnimTask_ShakeMonInPlace(u8 taskId) { u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]); @@ -180,12 +243,12 @@ void sub_8098CD0(u8 taskId) gTasks[taskId].data[4] = gBattleAnimArgs[4]; gTasks[taskId].data[5] = gBattleAnimArgs[1] * 2; gTasks[taskId].data[6] = gBattleAnimArgs[2] * 2; - gTasks[taskId].func = sub_8098D54; + gTasks[taskId].func = AnimTask_ShakeMonInPlaceStep; gTasks[taskId].func(taskId); } } -void sub_8098D54(u8 taskId) +static void AnimTask_ShakeMonInPlaceStep(u8 taskId) { if (gTasks[taskId].data[3] == 0) { @@ -219,7 +282,13 @@ void sub_8098D54(u8 taskId) gTasks[taskId].data[3]--; } -void sub_8098E90(u8 taskId) +// Shakes a mon bg horizontally and moves it downward linearly. +// arg 0: battler +// arg 1: x offset +// arg 2: frame delay between each movement +// arg 3: downward speed (subpixel) +// arg 4: duration +void AnimTask_ShakeAndSinkMon(u8 taskId) { u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]); @@ -229,11 +298,11 @@ void sub_8098E90(u8 taskId) gTasks[taskId].data[2] = gBattleAnimArgs[2]; gTasks[taskId].data[3] = gBattleAnimArgs[3]; gTasks[taskId].data[4] = gBattleAnimArgs[4]; - gTasks[taskId].func = sub_8098EF0; + gTasks[taskId].func = AnimTask_ShakeAndSinkMonStep; gTasks[taskId].func(taskId); } -void sub_8098EF0(u8 taskId) +static void AnimTask_ShakeAndSinkMonStep(u8 taskId) { u8 spriteId = gTasks[taskId].data[0]; s16 data1 = gTasks[taskId].data[1]; @@ -251,25 +320,32 @@ void sub_8098EF0(u8 taskId) DestroyAnimVisualTask(taskId); } -void sub_8098F84(u8 taskId) +// Moves a mon bg picture along an elliptical path that begins +// and ends at the mon's origin location. +// arg 0: battler +// arg 1: ellipse width +// arg 2: ellipse height +// arg 3: num loops +// arg 4: speed (valid values are 0-5) +void AnimTask_TranslateMonElliptical(u8 taskId) { - u8 r6 = 1; + u8 wavePeriod = 1; u8 i; u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]); if (gBattleAnimArgs[4] > 5) gBattleAnimArgs[4] = 5; for (i = 0; i < gBattleAnimArgs[4]; i++) - r6 *= 2; + wavePeriod *= 2; gTasks[taskId].data[0] = spriteId; gTasks[taskId].data[1] = gBattleAnimArgs[1]; gTasks[taskId].data[2] = gBattleAnimArgs[2]; gTasks[taskId].data[3] = gBattleAnimArgs[3]; - gTasks[taskId].data[4] = r6; - gTasks[taskId].func = sub_8099004; + gTasks[taskId].data[4] = wavePeriod; + gTasks[taskId].func = AnimTask_TranslateMonEllipticalStep; gTasks[taskId].func(taskId); } -void sub_8099004(u8 taskId) +static void AnimTask_TranslateMonEllipticalStep(u8 taskId) { u8 spriteId = gTasks[taskId].data[0]; gSprites[spriteId].pos2.x = Sin(gTasks[taskId].data[5], gTasks[taskId].data[1]); @@ -287,14 +363,26 @@ void sub_8099004(u8 taskId) } } -void sub_809907C(u8 taskId) +// Moves a mon bg picture along an elliptical path that begins +// and ends at the mon's origin location. Reverses the direction +// of the path if it's not on the player's side of the battle. +// arg 0: battler +// arg 1: ellipse width +// arg 2: ellipse height +// arg 3: num loops +// arg 4: speed (valid values are 0-5) +void AnimTask_TranslateMonEllipticalRespectSide(u8 taskId) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - sub_8098F84(taskId); + AnimTask_TranslateMonElliptical(taskId); } -void sub_80990AC(struct Sprite * sprite) +// Performs a simple horizontal lunge, where the mon moves +// horizontally, and then moves back in the opposite direction. +// arg 0: duration of single lunge direction +// arg 1: x pixel delta that is applied each frame +static void DoHorizontalLunge(struct Sprite * sprite) { sprite->invisible = TRUE; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) @@ -305,19 +393,24 @@ void sub_80990AC(struct Sprite * sprite) sprite->data[2] = 0; sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker]; sprite->data[4] = gBattleAnimArgs[0]; - StoreSpriteCallbackInData6(sprite, sub_8099120); - sprite->callback = sub_8074DC4; + StoreSpriteCallbackInData6(sprite, ReverseHorizontalLungeDirection); + sprite->callback = TranslateMonSpriteLinear; } -void sub_8099120(struct Sprite * sprite) +static void ReverseHorizontalLungeDirection(struct Sprite * sprite) { sprite->data[0] = sprite->data[4]; sprite->data[1] = -sprite->data[1]; - sprite->callback = sub_8074DC4; + sprite->callback = TranslateMonSpriteLinear; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } -void sub_8099144(struct Sprite * sprite) +// Performs a simple vertical dipping motion, where moves vertically, and then +// moves back in the opposite direction. +// arg 0: duration of single dip direction +// arg 1: y pixel delta that is applied each frame +// arg 2: battler +static void DoVerticalDip(struct Sprite * sprite) { u8 spriteId; sprite->invisible = TRUE; @@ -327,19 +420,24 @@ void sub_8099144(struct Sprite * sprite) sprite->data[2] = gBattleAnimArgs[1]; sprite->data[3] = spriteId; sprite->data[4] = gBattleAnimArgs[0]; - StoreSpriteCallbackInData6(sprite, sub_8099190); - sprite->callback = sub_8074DC4; + StoreSpriteCallbackInData6(sprite, ReverseVerticalDipDirection); + sprite->callback = TranslateMonSpriteLinear; } -void sub_8099190(struct Sprite * sprite) +static void ReverseVerticalDipDirection(struct Sprite * sprite) { sprite->data[0] = sprite->data[4]; sprite->data[2] = -sprite->data[2]; - sprite->callback = sub_8074DC4; + sprite->callback = TranslateMonSpriteLinear; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } -void sub_80991B4(struct Sprite * sprite) +// Linearly slides a mon's bg picture back to its original sprite position. +// The sprite parameter is a dummy sprite used for facilitating the movement with its callback. +// arg 0: 1 = target or 0 = attacker +// arg 1: direction (0 = horizontal and vertical, 1 = horizontal only, 2 = vertical only) +// arg 2: duration +static void SlideMonToOriginalPos(struct Sprite * sprite) { u8 spriteId; if (gBattleAnimArgs[0] == 0) @@ -351,7 +449,7 @@ void sub_80991B4(struct Sprite * sprite) sprite->data[2] = gSprites[spriteId].pos1.x; sprite->data[3] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y; sprite->data[4] = gSprites[spriteId].pos1.y; - sub_80754B8(sprite); + InitSpriteDataForLinearTranslation(sprite); sprite->data[3] = 0; sprite->data[4] = 0; sprite->data[5] = gSprites[spriteId].pos2.x; @@ -363,10 +461,10 @@ void sub_80991B4(struct Sprite * sprite) sprite->data[1] = 0; sprite->data[7] = gBattleAnimArgs[1]; sprite->data[7] |= spriteId << 8; - sprite->callback = sub_8099270; + sprite->callback = SlideMonToOriginalPosStep; } -void sub_8099270(struct Sprite * sprite) +static void SlideMonToOriginalPosStep(struct Sprite * sprite) { u8 data7 = sprite->data[7]; struct Sprite *otherSprite = &gSprites[sprite->data[7] >> 8]; @@ -388,7 +486,15 @@ void sub_8099270(struct Sprite * sprite) } } -void sub_80992E0(struct Sprite * sprite) +// Linearly translates a mon to a target offset. The horizontal offset +// is mirrored for the opponent's pokemon, and the vertical offset +// is only mirrored if arg 3 is set to 1. +// arg 0: 0 = attacker, 1 = target +// arg 1: target x pixel offset +// arg 2: target y pixel offset +// arg 3: mirror vertical translation for opposite battle side +// arg 4: duration +static void SlideMonToOffset(struct Sprite * sprite) { u8 battlerId; u8 spriteId; @@ -408,16 +514,16 @@ void sub_80992E0(struct Sprite * sprite) sprite->data[2] = gSprites[spriteId].pos1.x + gBattleAnimArgs[1]; sprite->data[3] = gSprites[spriteId].pos1.y; sprite->data[4] = gSprites[spriteId].pos1.y + gBattleAnimArgs[2]; - sub_80754B8(sprite); + InitSpriteDataForLinearTranslation(sprite); sprite->data[3] = 0; sprite->data[4] = 0; sprite->data[5] = spriteId; sprite->invisible = TRUE; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); - sprite->callback = sub_8074E14; + sprite->callback = TranslateMonSpriteLinearFixedPoint; } -void sub_8099394(struct Sprite * sprite) +static void sub_8099394(struct Sprite * sprite) { u8 battlerId; u8 spriteId; @@ -438,7 +544,7 @@ void sub_8099394(struct Sprite * sprite) sprite->data[2] = sprite->data[1] + gBattleAnimArgs[1]; sprite->data[3] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y; sprite->data[4] = sprite->data[3] + gBattleAnimArgs[2]; - sub_80754B8(sprite); + InitSpriteDataForLinearTranslation(sprite); sprite->data[3] = gSprites[spriteId].pos2.x << 8; sprite->data[4] = gSprites[spriteId].pos2.y << 8; sprite->data[5] = spriteId; @@ -447,19 +553,29 @@ void sub_8099394(struct Sprite * sprite) StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); else StoreSpriteCallbackInData6(sprite, sub_809946C); - sprite->callback = sub_8074E14; + sprite->callback = TranslateMonSpriteLinearFixedPoint; } -void sub_809946C(struct Sprite * sprite) +static void sub_809946C(struct Sprite * sprite) { gSprites[sprite->data[5]].pos2.x = 0; gSprites[sprite->data[5]].pos2.y = 0; DestroyAnimSprite(sprite); } -void sub_809949C(u8 taskId) +// Task to facilitate a two-part translation animation, in which the sprite +// is first translated in an arc to one position. Then, it "lunges" to a target +// x offset. Used in TAKE_DOWN, for example. +// arg 0: anim bank +// arg 1: horizontal speed (subpixel) +// arg 2: wave amplitude +// arg 3: first duration +// arg 4: delay before starting lunge +// arg 5: target x offset for lunge +// arg 6: lunge duration +void AnimTask_WindUpLunge(u8 taskId) { - u16 r7 = 0x8000 / gBattleAnimArgs[3]; + u16 wavePeriod = 0x8000 / gBattleAnimArgs[3]; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; @@ -472,11 +588,11 @@ void sub_809949C(u8 taskId) gTasks[taskId].data[4] = gBattleAnimArgs[4]; gTasks[taskId].data[5] = gBattleAnimArgs[5] * 256 / gBattleAnimArgs[6]; gTasks[taskId].data[6] = gBattleAnimArgs[6]; - gTasks[taskId].data[7] = r7; - gTasks[taskId].func = sub_8099530; + gTasks[taskId].data[7] = wavePeriod; + gTasks[taskId].func = AnimTask_WindUpLungePart1; } -void sub_8099530(u8 taskId) +static void AnimTask_WindUpLungePart1(u8 taskId) { u8 spriteId = gTasks[taskId].data[0]; gTasks[taskId].data[11] += gTasks[taskId].data[1]; @@ -484,10 +600,10 @@ void sub_8099530(u8 taskId) gSprites[spriteId].pos2.y = Sin((u8)(gTasks[taskId].data[10] >> 8), gTasks[taskId].data[2]); gTasks[taskId].data[10] += gTasks[taskId].data[7]; if (--gTasks[taskId].data[3] == 0) - gTasks[taskId].func = sub_8099594; + gTasks[taskId].func = AnimTask_WindUpLungePart2; } -void sub_8099594(u8 taskId) +static void AnimTask_WindUpLungePart2(u8 taskId) { u8 spriteId; @@ -514,7 +630,7 @@ void sub_80995FC(u8 taskId) spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]); break; case 2: - if (!sub_8072DF0(gBattleAnimAttacker ^ BIT_FLANK)) + if (!IsBattlerSpriteVisible(gBattleAnimAttacker ^ BIT_FLANK)) { DestroyAnimVisualTask(taskId); return; @@ -522,7 +638,7 @@ void sub_80995FC(u8 taskId) spriteId = gBattlerSpriteIds[gBattleAnimAttacker ^ BIT_FLANK]; break; case 3: - if (!sub_8072DF0(gBattleAnimTarget ^ BIT_FLANK)) + if (!IsBattlerSpriteVisible(gBattleAnimTarget ^ BIT_FLANK)) { DestroyAnimVisualTask(taskId); return; @@ -541,7 +657,7 @@ void sub_80995FC(u8 taskId) gTasks[taskId].func = sub_80996B8; } -void sub_80996B8(u8 taskId) +static void sub_80996B8(u8 taskId) { u8 spriteId = gTasks[taskId].data[0]; gSprites[spriteId].pos2.x += gTasks[taskId].data[1]; @@ -549,7 +665,15 @@ void sub_80996B8(u8 taskId) DestroyAnimVisualTask(taskId); } -void sub_8099704(u8 taskId) +// Task that facilitates translating the mon bg picture back and forth +// in a swaying motion (uses Sine wave). It can sway either horizontally +// or vertically, but not both. +// arg 0: direction (0 = horizontal, 1 = vertical) +// arg 1: wave amplitude +// arg 2: wave period +// arg 3: num sways +// arg 4: which mon (0 = attacker, 1 = target) +void AnimTask_SwayMon(u8 taskId) { u8 spriteId; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) @@ -565,32 +689,32 @@ void sub_8099704(u8 taskId) else gTasks[taskId].data[5] = gBattleAnimTarget; gTasks[taskId].data[12] = 1; - gTasks[taskId].func = sub_8099788; + gTasks[taskId].func = AnimTask_SwayMonStep; } -void sub_8099788(u8 taskId) +static void AnimTask_SwayMonStep(u8 taskId) { u8 spriteId; - u32 r8; - s16 r5; - u16 tmp; + u32 waveIndex; + s16 sineValue; + u16 sineIndex; spriteId = gTasks[taskId].data[4]; - tmp = gTasks[taskId].data[10] + gTasks[taskId].data[2]; - gTasks[taskId].data[10] = tmp; - r8 = tmp >> 8; - r5 = Sin(r8, gTasks[taskId].data[1]); + sineIndex = gTasks[taskId].data[10] + gTasks[taskId].data[2]; + gTasks[taskId].data[10] = sineIndex; + waveIndex = sineIndex >> 8; + sineValue = Sin(waveIndex, gTasks[taskId].data[1]); if (gTasks[taskId].data[0] == 0) { - gSprites[spriteId].pos2.x = r5; + gSprites[spriteId].pos2.x = sineValue; } else if (GetBattlerSide(gTasks[taskId].data[5]) == B_SIDE_PLAYER) { - gSprites[spriteId].pos2.y = abs(r5); + gSprites[spriteId].pos2.y = abs(sineValue); } else - gSprites[spriteId].pos2.y = -abs(r5); - if ((r8 > 0x7F && gTasks[taskId].data[11] == 0 && gTasks[taskId].data[12] == 1) || (r8 < 0x7F && gTasks[taskId].data[11] == 1 && gTasks[taskId].data[12] == 0)) + gSprites[spriteId].pos2.y = -abs(sineValue); + if ((waveIndex > 0x7F && gTasks[taskId].data[11] == 0 && gTasks[taskId].data[12] == 1) || (waveIndex < 0x7F && gTasks[taskId].data[11] == 1 && gTasks[taskId].data[12] == 0)) { gTasks[taskId].data[11] ^= 1; gTasks[taskId].data[12] ^= 1; @@ -603,10 +727,16 @@ void sub_8099788(u8 taskId) } } -void sub_80998B0(u8 taskId) +// Scales a mon's sprite, and then scales back to its original dimensions. +// arg 0: x scale delta +// arg 1: y scale delta +// arg 2: duration +// arg 3: anim bank +// arg 4: sprite object mode +void AnimTask_ScaleMonAndRestore(u8 taskId) { u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[3]); - sub_80758E0(spriteId, gBattleAnimArgs[4]); + PrepareBattlerSpriteForRotScale(spriteId, gBattleAnimArgs[4]); gTasks[taskId].data[0] = gBattleAnimArgs[0]; gTasks[taskId].data[1] = gBattleAnimArgs[1]; gTasks[taskId].data[2] = gBattleAnimArgs[2]; @@ -614,16 +744,16 @@ void sub_80998B0(u8 taskId) gTasks[taskId].data[4] = spriteId; gTasks[taskId].data[10] = 0x100; gTasks[taskId].data[11] = 0x100; - gTasks[taskId].func = sub_8099908; + gTasks[taskId].func = AnimTask_ScaleMonAndRestoreStep; } -void sub_8099908(u8 taskId) +static void AnimTask_ScaleMonAndRestoreStep(u8 taskId) { u8 spriteId; gTasks[taskId].data[10] += gTasks[taskId].data[0]; gTasks[taskId].data[11] += gTasks[taskId].data[1]; spriteId = gTasks[taskId].data[4]; - obj_id_set_rotscale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[11], 0); + SetSpriteRotScale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[11], 0); if (--gTasks[taskId].data[2] == 0) { if (gTasks[taskId].data[3] > 0) @@ -635,7 +765,7 @@ void sub_8099908(u8 taskId) } else { - sub_8075980(spriteId); + ResetSpriteRotScale(spriteId); DestroyAnimVisualTask(taskId); } } @@ -644,7 +774,7 @@ void sub_8099908(u8 taskId) void sub_8099980(u8 taskId) { u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]); - sub_80758E0(spriteId, 0); + PrepareBattlerSpriteForRotScale(spriteId, 0); gTasks[taskId].data[1] = 0; gTasks[taskId].data[2] = gBattleAnimArgs[0]; if (gBattleAnimArgs[3] != 1) @@ -654,7 +784,7 @@ void sub_8099980(u8 taskId) gTasks[taskId].data[4] = gBattleAnimArgs[1]; gTasks[taskId].data[5] = spriteId; gTasks[taskId].data[6] = gBattleAnimArgs[3]; - if (sub_8073788()) + if (IsContest()) gTasks[taskId].data[7] = 1; else { @@ -663,7 +793,7 @@ void sub_8099980(u8 taskId) else gTasks[taskId].data[7] = GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER ? 1 : 0; } - if (gTasks[taskId].data[7] && !sub_8073788()) + if (gTasks[taskId].data[7] && !IsContest()) { s16 tmp; tmp = gTasks[taskId].data[3]; @@ -677,7 +807,7 @@ void sub_8099980(u8 taskId) void sub_8099A78(u8 taskId) { u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]); - sub_80758E0(spriteId, 0); + PrepareBattlerSpriteForRotScale(spriteId, 0); gTasks[taskId].data[1] = 0; gTasks[taskId].data[2] = gBattleAnimArgs[0]; if (gBattleAnimArgs[2] == 0) @@ -709,11 +839,10 @@ void sub_8099A78(u8 taskId) gTasks[taskId].func = sub_8099B54; } -void sub_8099B54(u8 taskId) +static void sub_8099B54(u8 taskId) { - s16 tmp; gTasks[taskId].data[3] += gTasks[taskId].data[4]; - obj_id_set_rotscale(gTasks[taskId].data[5], 0x100, 0x100, gTasks[taskId].data[3]); + SetSpriteRotScale(gTasks[taskId].data[5], 0x100, 0x100, gTasks[taskId].data[3]); if (gTasks[taskId].data[7]) sub_80759DC(gTasks[taskId].data[5]); if (++gTasks[taskId].data[1] >= gTasks[taskId].data[2]) @@ -721,7 +850,7 @@ void sub_8099B54(u8 taskId) switch (gTasks[taskId].data[6]) { case 1: - sub_8075980(gTasks[taskId].data[5]); + ResetSpriteRotScale(gTasks[taskId].data[5]); // fallthrough case 0: default: @@ -729,8 +858,7 @@ void sub_8099B54(u8 taskId) break; case 2: gTasks[taskId].data[1] = 0; - tmp = gTasks[taskId].data[4]; - gTasks[taskId].data[4] = -tmp; + gTasks[taskId].data[4] *= -1; gTasks[taskId].data[6] = 1; break; } @@ -741,7 +869,7 @@ void sub_8099BD4(u8 taskId) { if (gBattleAnimArgs[0] == 0) { - gTasks[taskId].data[15] = gUnknown_2037EEC / 12; + gTasks[taskId].data[15] = gAnimMovePower / 12; if (gTasks[taskId].data[15] < 1) gTasks[taskId].data[15] = 1; if (gTasks[taskId].data[15] > 16) @@ -749,7 +877,7 @@ void sub_8099BD4(u8 taskId) } else { - gTasks[taskId].data[15] = gUnknown_2037EE8 / 12; + gTasks[taskId].data[15] = gAnimMoveDmg / 12; if (gTasks[taskId].data[15] < 1) gTasks[taskId].data[15] = 1; if (gTasks[taskId].data[15] > 16) @@ -769,7 +897,7 @@ void sub_8099BD4(u8 taskId) gTasks[taskId].func = sub_8099CB8; } -void sub_8099CB8(u8 taskId) +static void sub_8099CB8(u8 taskId) { struct Task *task = &gTasks[taskId]; if (++task->data[0] > task->data[1]) |