diff --git a/src/battle_anim_throw.c b/src/battle_anim_throw.c index 47554ff50..bc456e209 100644 --- a/src/battle_anim_throw.c +++ b/src/battle_anim_throw.c @@ -102,6 +102,8 @@ static void TimerBallOpenParticleAnimation(u8); static void PremierBallOpenParticleAnimation(u8); static void CB_CriticalCaptureThrownBallMovement(struct Sprite *sprite); static void SpriteCB_SafariBaitOrRock_Init(struct Sprite *); +static void GhostBallDodge(struct Sprite *sprite); +static void GhostBallDodge2(struct Sprite *sprite); struct CaptureStar { @@ -1093,6 +1095,10 @@ static void SpriteCB_Ball_Arc(struct Sprite *sprite) { sprite->callback = SpriteCB_Ball_Block; } + else if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_GHOST_DODGE) + { + sprite->callback = GhostBallDodge; + } else { StartSpriteAnim(sprite, 1); @@ -2790,3 +2796,34 @@ static void CB_CriticalCaptureThrownBallMovement(struct Sprite *sprite) } } +// FRLG +static void GhostBallDodge(struct Sprite *sprite) +{ + sprite->x += sprite->x2; + sprite->y += sprite->y2; + sprite->x2 = sprite->y2 = 0; + sprite->data[0] = 0x22; + sprite->data[1] = sprite->x; + sprite->data[2] = sprite->x - 8; + sprite->data[3] = sprite->y; + sprite->data[4] = 0x90; + sprite->data[5] = 0x20; + InitAnimArcTranslation(sprite); + TranslateAnimVerticalArc(sprite); + sprite->callback = GhostBallDodge2; +} + +static void GhostBallDodge2(struct Sprite *sprite) +{ + if (!TranslateAnimVerticalArc(sprite)) + { + if ((sprite->y + sprite->y2) < 65) + return; + } + + sprite->data[0] = 0; + sprite->callback = DestroySpriteAfterOneFrame; + gDoingBattleAnim = FALSE; + UpdateOamPriorityInAllHealthboxes(1, FALSE); +} + diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 0204446e9..28ff53132 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -2536,6 +2536,8 @@ void BtlController_HandleDrawTrainerPic(u32 battler, u32 trainerPicId, bool32 is xPos, yPos, subpriority); + if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT) + gBattlerSpriteIds[battler] = gBattleStruct->trainerSlideSpriteIds[battler]; gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = battler; } @@ -2560,6 +2562,8 @@ void BtlController_HandleTrainerSlide(u32 battler, u32 trainerPicId) 80, (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80, 30); + if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT) + gBattlerSpriteIds[battler] = gBattleStruct->trainerSlideSpriteIds[battler]; gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = battler; gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].x2 = -96; gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].sSpeedX = 2;