From efa422d6fadb6addd769eadf3d867900cb5b3d84 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Wed, 17 Aug 2022 13:14:34 -0400 Subject: [PATCH] Sync battle anim - mons --- include/battle_anim.h | 26 +- include/data.h | 4 + include/palette.h | 2 +- src/battle_anim.c | 4 +- src/battle_anim_dark.c | 2 +- src/battle_anim_effects_1.c | 6 +- src/battle_anim_effects_2.c | 2 +- src/battle_anim_ice.c | 6 +- src/battle_anim_mon_movement.c | 12 +- src/battle_anim_mons.c | 559 ++++++++++++++++++------------- src/battle_anim_status_effects.c | 14 +- src/battle_anim_utility_funcs.c | 14 +- src/palette.c | 4 +- src/trade.c | 2 +- 14 files changed, 386 insertions(+), 271 deletions(-) diff --git a/include/battle_anim.h b/include/battle_anim.h index c5c7626f8..cd5785871 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -365,11 +365,11 @@ void TranslateSpriteInCircle(struct Sprite *sprite); void TranslateSpriteInGrowingCircle(struct Sprite *sprite); void TranslateSpriteInEllipse(struct Sprite *sprite); void WaitAnimForDuration(struct Sprite *sprite); -void SetupLinearTranslationWithFixedDuration(struct Sprite *sprite); +void ConvertPosDataToTranslateLinearData(struct Sprite *sprite); void TranslateSpriteLinear(struct Sprite *sprite); void TranslateSpriteLinearFixedPoint(struct Sprite *sprite); -void TranslateMonSpriteLinear(struct Sprite *sprite); -void TranslateMonSpriteLinearFixedPoint(struct Sprite *sprite); +void TranslateSpriteLinearById(struct Sprite *sprite); +void TranslateSpriteLinearByIdFixedPoint(struct Sprite *sprite); void TranslateSpriteLinearAndFlicker(struct Sprite *sprite); void DestroySpriteAndMatrix(struct Sprite *sprite); void RunStoredCallbackWhenAffineAnimEnds(struct Sprite *sprite); @@ -398,7 +398,7 @@ void InitAnimBgTilemapBuffer(u32 bgId, const void *src); void AnimLoadCompressedBgTilemap(u32 bgId, const u32 *src); u8 GetBattleBgPaletteNum(void); void ToggleBg3Mode(bool8 arg0); -void StartSpriteLinearTranslationFromCurrentPos(struct Sprite *sprite); +void TradeMenuBouncePartySprites(struct Sprite *sprite); void InitSpriteDataForLinearTranslation(struct Sprite *sprite); void InitAnimLinearTranslation(struct Sprite *sprite); void StartAnimLinearTranslation(struct Sprite *sprite); @@ -406,11 +406,11 @@ void PlayerThrowBall_StartAnimLinearTranslation(struct Sprite *sprite); bool8 AnimTranslateLinear(struct Sprite *sprite); void AnimTranslateLinear_WithFollowup(struct Sprite *sprite); void InitAnimLinearTranslationWithSpeed(struct Sprite *sprite); -void BattleAnim_InitAndRunLinearTranslationWithDuration(struct Sprite *sprite); +void InitAnimLinearTranslationWithSpeedAndPos(struct Sprite *sprite); void InitAndRunAnimFastLinearTranslation(struct Sprite *sprite); bool8 AnimFastTranslateLinear(struct Sprite *sprite); void InitAnimFastLinearTranslationWithSpeed(struct Sprite *sprite); -void InitAndStartAnimFastLinearTranslationWithSpeed(struct Sprite *sprite); +void InitAnimFastLinearTranslationWithSpeedAndPos(struct Sprite *sprite); void SetSpriteRotScale(u8 spriteId, s16 xScale, s16 yScale, u16 rotation); void PrepareBattlerSpriteForRotScale(u8 spriteId, u8 objMode); void ResetSpriteRotScale(u8 spriteId); @@ -420,7 +420,7 @@ void TryResetSpriteAffineState(struct Sprite *sprite); u16 ArcTan2Neg(s16 a, s16 b); void SetGreyscaleOrOriginalPalette(u16 paletteNum, bool8 restoreOriginalColor); u32 GetBattlePalettesMask(bool8 battleBackground, bool8 attacker, bool8 target, bool8 attackerPartner, bool8 targetPartner, bool8 a6, bool8 a7); -u32 SelectBattlerSpritePalettes(bool8 playerLeft, bool8 playerRight, bool8 foeLeft, bool8 foeRight); +u32 GetBattleMonSpritePalettesMask(bool8 playerLeft, bool8 playerRight, bool8 foeLeft, bool8 foeRight); u8 GetSpritePalIdxByBattler(u8 a1); void AnimSpriteOnMonPos(struct Sprite *sprite); void TranslateAnimSpriteToTargetMonLocation(struct Sprite *sprite); @@ -440,7 +440,7 @@ void *LoadPointerFromVars(s16 lo, s16 hi); void BattleAnimHelper_SetSpriteSquashParams(struct Task *task, u8 spriteId, s16 xScale0, s16 yScale0, s16 xScale1, s16 yScale1, u16 duration); u8 BattleAnimHelper_RunSpriteSquash(struct Task *task); void AnimTask_GetFrustrationPowerLevel(u8 taskId); -void ResetSpritePriorityOfAllVisibleBattlers(void); +void InitPrioritiesForVisibleBattlers(void); u8 GetBattlerSpriteSubpriority(u8 battlerId); u8 GetBattlerSpriteBGPriority(u8 battlerId); @@ -451,12 +451,12 @@ u8 CreateAdditionalMonSpriteForMoveAnim(u16 species, bool8 isBackpic, u8 templat void DestroySpriteAndFreeResources_(struct Sprite *sprite); s16 GetBattlerSpriteCoordAttr(u8 battlerId, u8 attr); void SetAverageBattlerPositions(u8 battlerId, bool8 respectMonPicOffsets, s16 *x, s16 *y); -u8 CreateCloneOfSpriteInWindowMode(s32 battlerId, u8 spriteId, s32 species); -void SpriteCB_AnimTranslateSpriteLinearAndFlicker(struct Sprite *sprite); -void SpriteCB_AnimTranslateSpriteLinearAndFlicker2(struct Sprite *sprite); -void SpriteCB_TrackOffsetFromAttackerAndWaitAnim(struct Sprite *sprite); +u8 CreateInvisibleSpriteCopy(s32 battlerId, u8 spriteId, s32 species); +void AnimTranslateLinearAndFlicker_Flipped(struct Sprite *sprite); +void AnimTranslateLinearAndFlicker(struct Sprite *sprite); +void AnimSpinningSparkle(struct Sprite *sprite); void AnimTask_AttackerPunchWithTrace(u8 taskId); -void SpriteCB_WeatherBallUp(struct Sprite *sprite); +void AnimWeatherBallUp(struct Sprite *sprite); void AnimWeatherBallDown(struct Sprite *sprite); // battle_anim_mon_movement.c diff --git a/include/data.h b/include/data.h index 55eda56a4..2fa86fc0d 100644 --- a/include/data.h +++ b/include/data.h @@ -14,6 +14,10 @@ struct MonCoords u8 y_offset; }; +#define MON_COORDS_SIZE(width, height)(DIV_ROUND_UP(width, 8) << 4 | DIV_ROUND_UP(height, 8)) +#define GET_MON_COORDS_WIDTH(size)((size >> 4) * 8) +#define GET_MON_COORDS_HEIGHT(size)((size & 0xF) * 8) + extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1]; extern const u8 gMoveNames[][13]; extern const u16 gUnknown_8251CB8[]; diff --git a/include/palette.h b/include/palette.h index 55054b63d..c510a5d2f 100644 --- a/include/palette.h +++ b/include/palette.h @@ -78,7 +78,7 @@ void sub_80716F8(const u16 *src, u16 *dst, u16 count, u8 a4); void sub_80717A8(u32 a1, s8 a2, u8 a3, u8 a4, u16 a5, u8 a6, u8 a7); bool32 sub_807185C(u8 var); void sub_8071898(void); -void ResetPaletteStructByUid(u16 a1); +void PaletteStruct_ResetById(u16 a1); void ResetPaletteStruct(u8 paletteNum); #endif // GUARD_PALETTE_H diff --git a/src/battle_anim.c b/src/battle_anim.c index 26246bf5b..855059a32 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1823,7 +1823,7 @@ void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMo { s32 i; - ResetSpritePriorityOfAllVisibleBattlers(); + InitPrioritiesForVisibleBattlers(); UpdateOamPriorityInAllHealthboxes(0); for (i = 0; i < MAX_BATTLERS_COUNT; i++) { @@ -2128,7 +2128,7 @@ static void ScriptCmd_end(void) if (!continuousAnim) { m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 256); - ResetSpritePriorityOfAllVisibleBattlers(); + InitPrioritiesForVisibleBattlers(); UpdateOamPriorityInAllHealthboxes(1); gAnimScriptActive = FALSE; } diff --git a/src/battle_anim_dark.c b/src/battle_anim_dark.c index 1923a9dea..7b0a81bb3 100644 --- a/src/battle_anim_dark.c +++ b/src/battle_anim_dark.c @@ -802,7 +802,7 @@ void AnimTask_MetallicShine(u8 taskId) else species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); - newSpriteId = CreateCloneOfSpriteInWindowMode(gBattleAnimAttacker, spriteId, species); + newSpriteId = CreateInvisibleSpriteCopy(gBattleAnimAttacker, spriteId, species); GetBattleAnimBg1Data(&animBg); AnimLoadCompressedBgTilemap(animBg.bgId, gMetalShineTilemap); AnimLoadCompressedBgGfx(animBg.bgId, gMetalShineGfx, animBg.tilesOffset); diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index d03206ded..3e22541be 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -4418,7 +4418,7 @@ static void AnimBowMon_Step1(struct Sprite* sprite) sprite->data[2] = 0; sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker]; StoreSpriteCallbackInData6(sprite, AnimBowMon_Step1_Callback); - sprite->callback = TranslateMonSpriteLinear; + sprite->callback = TranslateSpriteLinearById; } static void AnimBowMon_Step1_Callback(struct Sprite* sprite) @@ -4448,7 +4448,7 @@ static void AnimBowMon_Step2(struct Sprite* sprite) sprite->data[2] = 0; sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker]; StoreSpriteCallbackInData6(sprite, AnimBowMon_Step4); - sprite->callback = TranslateMonSpriteLinear; + sprite->callback = TranslateSpriteLinearById; } static void AnimBowMon_Step3(struct Sprite* sprite) @@ -4996,7 +4996,7 @@ void AnimTask_FadeScreenBlue(u8 taskId) gTasks[taskId].data[7] = 13; gTasks[taskId].data[8] = 14; gTasks[taskId].data[9] = 15; - b = SelectBattlerSpritePalettes(1, 1, 1, 1); + b = GetBattleMonSpritePalettesMask(1, 1, 1, 1); c = a | b; StorePointerInVars(&gTasks[taskId].data[14], &gTasks[taskId].data[15], (void *)c); b = b | (0x10000 << IndexOfSpritePaletteTag(ANIM_TAG_MOON)); diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c index ab870f792..17e58280e 100644 --- a/src/battle_anim_effects_2.c +++ b/src/battle_anim_effects_2.c @@ -1747,7 +1747,7 @@ void AnimCoinThrow(struct Sprite *sprite) sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = r6; sprite->data[4] = r7; - sprite->callback = BattleAnim_InitAndRunLinearTranslationWithDuration; + sprite->callback = InitAnimLinearTranslationWithSpeedAndPos; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } diff --git a/src/battle_anim_ice.c b/src/battle_anim_ice.c index f5e4a32dc..f70edfb83 100644 --- a/src/battle_anim_ice.c +++ b/src/battle_anim_ice.c @@ -531,7 +531,7 @@ static void AnimUnusedIceCrystalThrow(struct Sprite *sprite) sprite->data[2] = gBattleAnimArgs[2] + targetX; sprite->data[3] = gBattleAnimArgs[1] + attackerY; sprite->data[4] = gBattleAnimArgs[3] + targetY; - SetupLinearTranslationWithFixedDuration(sprite); + ConvertPosDataToTranslateLinearData(sprite); // won't match with while loop for (; (targetX >= -32 && targetX <= DISPLAY_WIDTH + 32) && (targetY >= -32 && targetY <= DISPLAY_HEIGHT + 32); targetX += sprite->data[1], targetY += sprite->data[2]) @@ -548,7 +548,7 @@ static void AnimUnusedIceCrystalThrow(struct Sprite *sprite) sprite->data[2] = targetX; sprite->data[3] = attackerY; sprite->data[4] = targetY; - SetupLinearTranslationWithFixedDuration(sprite); + ConvertPosDataToTranslateLinearData(sprite); sprite->data[3] = gBattleAnimArgs[5]; sprite->data[4] = gBattleAnimArgs[6]; sprite->callback = AnimUnusedIceCrystalThrow_Step; @@ -686,7 +686,7 @@ static void AnimSwirlingSnowball(struct Sprite *sprite) sprite->x2 = sprite->y2 = 0; for (i = 0; i < 8; ++i) sprite->data[i] = tempDataHolder[i]; - sprite->callback = InitAndStartAnimFastLinearTranslationWithSpeed; + sprite->callback = InitAnimFastLinearTranslationWithSpeedAndPos; StoreSpriteCallbackInData6(sprite, AnimSwirlingSnowball_Step1); } diff --git a/src/battle_anim_mon_movement.c b/src/battle_anim_mon_movement.c index f7a8703ca..16114456f 100644 --- a/src/battle_anim_mon_movement.c +++ b/src/battle_anim_mon_movement.c @@ -397,14 +397,14 @@ static void DoHorizontalLunge(struct Sprite *sprite) sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker]; sprite->data[4] = gBattleAnimArgs[0]; StoreSpriteCallbackInData6(sprite, ReverseHorizontalLungeDirection); - sprite->callback = TranslateMonSpriteLinear; + sprite->callback = TranslateSpriteLinearById; } static void ReverseHorizontalLungeDirection(struct Sprite *sprite) { sprite->data[0] = sprite->data[4]; sprite->data[1] = -sprite->data[1]; - sprite->callback = TranslateMonSpriteLinear; + sprite->callback = TranslateSpriteLinearById; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } @@ -424,14 +424,14 @@ static void DoVerticalDip(struct Sprite *sprite) sprite->data[3] = spriteId; sprite->data[4] = gBattleAnimArgs[0]; StoreSpriteCallbackInData6(sprite, ReverseVerticalDipDirection); - sprite->callback = TranslateMonSpriteLinear; + sprite->callback = TranslateSpriteLinearById; } static void ReverseVerticalDipDirection(struct Sprite *sprite) { sprite->data[0] = sprite->data[4]; sprite->data[2] = -sprite->data[2]; - sprite->callback = TranslateMonSpriteLinear; + sprite->callback = TranslateSpriteLinearById; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } @@ -523,7 +523,7 @@ static void SlideMonToOffset(struct Sprite *sprite) sprite->data[5] = monSpriteId; sprite->invisible = TRUE; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); - sprite->callback = TranslateMonSpriteLinearFixedPoint; + sprite->callback = TranslateSpriteLinearByIdFixedPoint; } static void SlideMonToOffsetAndBack(struct Sprite *sprite) @@ -556,7 +556,7 @@ static void SlideMonToOffsetAndBack(struct Sprite *sprite) StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); else StoreSpriteCallbackInData6(sprite, SlideMonToOffsetAndBack_End); - sprite->callback = TranslateMonSpriteLinearFixedPoint; + sprite->callback = TranslateSpriteLinearByIdFixedPoint; } static void SlideMonToOffsetAndBack_End(struct Sprite *sprite) diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index 75fd70ae4..c0a7848b7 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -20,30 +20,30 @@ static u8 GetBattlerSpriteFinal_Y(u8 battlerId, u16 species, bool8 a3); static void PlayerThrowBall_AnimTranslateLinear_WithFollowup(struct Sprite *sprite); -static void SpriteCB_RunAnimFastLinearTranslation(struct Sprite *sprite); -static bool8 Dummy_ReturnFalse(void); +static void AnimFastTranslateLinearWaitEnd(struct Sprite *sprite); +static bool8 ShouldRotScaleSpeciesBeFlipped(void); static void AnimThrowProjectile_Step(struct Sprite *sprite); static void AnimTask_AlphaFadeIn_Step(u8 taskId); static void AnimTask_BlendMonInAndOutSetup(struct Task *task); -static void AnimTask_BlendMonInAndOutStep(u8 taskId); +static void AnimTask_BlendMonInAndOut_Step(u8 taskId); static u16 GetBattlerYDeltaFromSpriteId(u8 spriteId); static void AnimTask_AttackerPunchWithTrace_Step(u8 taskId); -static void PunchAnim_CreateTraceSprite(struct Task *task, u8 taskId); -static void SpriteCB_PunchTrace(struct Sprite *sprite); -static void SpriteCB_WeatherBallUp_Step(struct Sprite *sprite); +static void CreateBattlerTrace(struct Task *task, u8 taskId); +static void AnimBattlerTrace(struct Sprite *sprite); +static void AnimWeatherBallUp_Step(struct Sprite *sprite); static EWRAM_DATA union AffineAnimCmd *sAnimTaskAffineAnim = NULL; -UNUSED static EWRAM_DATA u32 gUnknown_2037F2C = 0; // not used +static EWRAM_DATA u32 sUnused = 0; -static const struct UCoords8 sBattlerCoords[][4] = +static const struct UCoords8 sBattlerCoords[][MAX_BATTLERS_COUNT] = { - { + { // Single battle { 72, 80 }, { 176, 40 }, { 48, 40 }, { 112, 80 }, }, - { + { // Double battle { 32, 80 }, { 200, 40 }, { 90, 88 }, @@ -52,36 +52,40 @@ static const struct UCoords8 sBattlerCoords[][4] = }; // One entry for each of the four Castform forms. -const struct MonCoords gCastformFrontSpriteCoords[] = +const struct MonCoords gCastformFrontSpriteCoords[NUM_CASTFORM_FORMS] = { - { .size = 0x44, .y_offset = 17 }, // NORMAL - { .size = 0x66, .y_offset = 9 }, // SUN - { .size = 0x46, .y_offset = 9 }, // RAIN - { .size = 0x86, .y_offset = 8 }, // HAIL + [CASTFORM_NORMAL] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 17 }, + [CASTFORM_FIRE] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9 }, + [CASTFORM_WATER] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 9 }, + [CASTFORM_ICE] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8 }, }; -static const u8 sCastformElevations[] = +static const u8 sCastformElevations[NUM_CASTFORM_FORMS] = { - 13, // NORMAL - 14, // SUN - 13, // RAIN - 13, // HAIL + [CASTFORM_NORMAL] = 13, + [CASTFORM_FIRE] = 14, + [CASTFORM_WATER] = 13, + [CASTFORM_ICE] = 13, }; // Y position of the backsprite for each of the four Castform forms. -static const u8 sCastformBackSpriteYCoords[] = +static const u8 sCastformBackSpriteYCoords[NUM_CASTFORM_FORMS] = { - 0, // NORMAL - 0, // SUN - 0, // RAIN - 0, // HAIL + [CASTFORM_NORMAL] = 0, + [CASTFORM_FIRE] = 0, + [CASTFORM_WATER] = 0, + [CASTFORM_ICE] = 0, }; -static const struct SpriteTemplate sSpriteTemplates_AdditionalForAnim[] = +// Placeholders for pokemon sprites to be created for a move animation effect (e.g. Role Play / Snatch) +#define TAG_MOVE_EFFECT_MON_1 55125 +#define TAG_MOVE_EFFECT_MON_2 55126 + +static const struct SpriteTemplate sSpriteTemplates_MoveEffectMons[] = { { - .tileTag = 55125, - .paletteTag = 55125, + .tileTag = TAG_MOVE_EFFECT_MON_1, + .paletteTag = TAG_MOVE_EFFECT_MON_1, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, @@ -89,8 +93,8 @@ static const struct SpriteTemplate sSpriteTemplates_AdditionalForAnim[] = .callback = SpriteCallbackDummy, }, { - .tileTag = 55126, - .paletteTag = 55126, + .tileTag = TAG_MOVE_EFFECT_MON_2, + .paletteTag = TAG_MOVE_EFFECT_MON_2, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, @@ -99,10 +103,10 @@ static const struct SpriteTemplate sSpriteTemplates_AdditionalForAnim[] = } }; -static const struct SpriteSheet sMoveAnimAdtlSprSheets[] = +static const struct SpriteSheet sSpriteSheets_MoveEffectMons[] = { - { gMiscBlank_Gfx, 0x800, 55125 }, - { gMiscBlank_Gfx, 0x800, 55126 }, // unused + { gMiscBlank_Gfx, MON_PIC_SIZE, TAG_MOVE_EFFECT_MON_1 }, + { gMiscBlank_Gfx, MON_PIC_SIZE, TAG_MOVE_EFFECT_MON_2 }, }; u8 GetBattlerSpriteCoord(u8 battlerId, u8 coordType) @@ -252,8 +256,8 @@ static u8 GetBattlerSpriteFinal_Y(u8 battlerId, u16 species, bool8 a3) { if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) y += 8; - if (y > 104) - y = 104; + if (y > DISPLAY_HEIGHT - MON_PIC_HEIGHT + 8) + y = DISPLAY_HEIGHT - MON_PIC_HEIGHT + 8; } return y; } @@ -346,7 +350,7 @@ u8 GetAnimBattlerSpriteId(u8 animBattler) } else { - return 0xFF; + return SPRITE_NONE; } } else if (animBattler == ANIM_TARGET) @@ -358,13 +362,13 @@ u8 GetAnimBattlerSpriteId(u8 animBattler) } else { - return 0xFF; + return SPRITE_NONE; } } else if (animBattler == ANIM_ATK_PARTNER) { if (!IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker))) - return 0xFF; + return SPRITE_NONE; else return gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]; } @@ -373,7 +377,7 @@ u8 GetAnimBattlerSpriteId(u8 animBattler) if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimTarget))) return gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimTarget)]; else - return 0xFF; + return SPRITE_NONE; } } @@ -390,20 +394,40 @@ static void SetCallbackToStoredInData6(struct Sprite *sprite) sprite->callback = (SpriteCallback)callback; } +// Sprite data for TranslateSpriteInCircle/Ellipse and related +#define sCirclePos data[0] +#define sAmplitude data[1] +#define sCircleSpeed data[2] +#define sDuration data[3] + +// TranslateSpriteInGrowingCircle +#define sAmplitudeSpeed data[4] +#define sAmplitudeChange data[5] + +// TranslateSpriteInEllipse +#define sAmplitudeX sAmplitude +#define sAmplitudeY data[4] + +// TranslateSpriteInLissajousCurve +#define sCirclePosX sCirclePos +#define sCircleSpeedX sCircleSpeed +#define sCirclePosY data[4] +#define sCircleSpeedY data[5] + // x = a * sin(theta0 + dtheta * t) // y = a * cos(theta0 + dtheta * t) void TranslateSpriteInCircle(struct Sprite *sprite) { - if (sprite->data[3]) + if (sprite->sDuration) { - sprite->x2 = Sin(sprite->data[0], sprite->data[1]); - sprite->y2 = Cos(sprite->data[0], sprite->data[1]); - sprite->data[0] += sprite->data[2]; - if (sprite->data[0] >= 0x100) - sprite->data[0] -= 0x100; - else if (sprite->data[0] < 0) - sprite->data[0] += 0x100; - --sprite->data[3]; + sprite->x2 = Sin(sprite->sCirclePos, sprite->sAmplitude); + sprite->y2 = Cos(sprite->sCirclePos, sprite->sAmplitude); + sprite->sCirclePos += sprite->sCircleSpeed; + if (sprite->sCirclePos >= 0x100) + sprite->sCirclePos -= 0x100; + else if (sprite->sCirclePos < 0) + sprite->sCirclePos += 0x100; + sprite->sDuration--; } else { @@ -415,17 +439,17 @@ void TranslateSpriteInCircle(struct Sprite *sprite) // y = (a0 + da * t) * cos(theta0 + dtheta * t) void TranslateSpriteInGrowingCircle(struct Sprite *sprite) { - if (sprite->data[3]) + if (sprite->sDuration) { - sprite->x2 = Sin(sprite->data[0], (sprite->data[5] >> 8) + sprite->data[1]); - sprite->y2 = Cos(sprite->data[0], (sprite->data[5] >> 8) + sprite->data[1]); - sprite->data[0] += sprite->data[2]; - sprite->data[5] += sprite->data[4]; - if (sprite->data[0] >= 0x100) - sprite->data[0] -= 0x100; - else if (sprite->data[0] < 0) - sprite->data[0] += 0x100; - --sprite->data[3]; + sprite->x2 = Sin(sprite->sCirclePos, (sprite->sAmplitudeChange >> 8) + sprite->sAmplitude); + sprite->y2 = Cos(sprite->sCirclePos, (sprite->sAmplitudeChange >> 8) + sprite->sAmplitude); + sprite->sCirclePos += sprite->sCircleSpeed; + sprite->sAmplitudeChange += sprite->sAmplitudeSpeed; + if (sprite->sCirclePos >= 0x100) + sprite->sCirclePos -= 0x100; + else if (sprite->sCirclePos < 0) + sprite->sCirclePos += 0x100; + sprite->sDuration--; } else { @@ -433,26 +457,30 @@ void TranslateSpriteInGrowingCircle(struct Sprite *sprite) } } -// not used +// Unused +// Exact shape depends on arguments. Can move in a figure-8-like pattern, or circular, etc. // x = alpl * sin(alpha0 + dalpha * t) // y = ampl * cos(beta0 + dbeta * t) -static void TranslateSpriteInLissajousCurveOverDuration(struct Sprite *sprite) +static void TranslateSpriteInLissajousCurve(struct Sprite *sprite) { - if (sprite->data[3]) + if (sprite->sDuration) { - sprite->x2 = Sin(sprite->data[0], sprite->data[1]); - sprite->y2 = Cos(sprite->data[4], sprite->data[1]); - sprite->data[0] += sprite->data[2]; - sprite->data[4] += sprite->data[5]; - if (sprite->data[0] >= 0x100) - sprite->data[0] -= 0x100; - else if (sprite->data[0] < 0) - sprite->data[0] += 0x100; - if (sprite->data[4] >= 0x100) - sprite->data[4] -= 0x100; - else if (sprite->data[4] < 0) - sprite->data[4] += 0x100; - --sprite->data[3]; + sprite->x2 = Sin(sprite->sCirclePosX, sprite->sAmplitude); + sprite->y2 = Cos(sprite->sCirclePosY, sprite->sAmplitude); + sprite->sCirclePosX += sprite->sCircleSpeedX; + sprite->sCirclePosY += sprite->sCircleSpeedY; + + if (sprite->sCirclePosX >= 0x100) + sprite->sCirclePosX -= 0x100; + else if (sprite->sCirclePosX < 0) + sprite->sCirclePosX += 0x100; + + if (sprite->sCirclePosY >= 0x100) + sprite->sCirclePosY -= 0x100; + else if (sprite->sCirclePosY < 0) + sprite->sCirclePosY += 0x100; + + sprite->sDuration--; } else { @@ -464,16 +492,16 @@ static void TranslateSpriteInLissajousCurveOverDuration(struct Sprite *sprite) // y = b * cos(theta0 + dtheta * t) void TranslateSpriteInEllipse(struct Sprite *sprite) { - if (sprite->data[3]) + if (sprite->sDuration) { - sprite->x2 = Sin(sprite->data[0], sprite->data[1]); - sprite->y2 = Cos(sprite->data[0], sprite->data[4]); - sprite->data[0] += sprite->data[2]; - if (sprite->data[0] >= 0x100) - sprite->data[0] -= 0x100; - else if (sprite->data[0] < 0) - sprite->data[0] += 0x100; - --sprite->data[3]; + sprite->x2 = Sin(sprite->sCirclePos, sprite->sAmplitudeX); + sprite->y2 = Cos(sprite->sCirclePos, sprite->sAmplitudeY); + sprite->sCirclePos += sprite->sCircleSpeed; + if (sprite->sCirclePos >= 0x100) + sprite->sCirclePos -= 0x100; + else if (sprite->sCirclePos < 0) + sprite->sCirclePos += 0x100; + sprite->sDuration--; } else { @@ -481,6 +509,19 @@ void TranslateSpriteInEllipse(struct Sprite *sprite) } } +#undef sCirclePos +#undef sAmplitude +#undef sCircleSpeed +#undef sDuration +#undef sAmplitudeSpeed +#undef sAmplitudeChange +#undef sAmplitudeX +#undef sAmplitudeY +#undef sCirclePosX +#undef sCircleSpeedX +#undef sCirclePosY +#undef sCircleSpeedY + // Simply waits until the sprite's data[0] hits zero. // This is used to let sprite anims or affine anims to run for a designated // duration. @@ -492,34 +533,46 @@ void WaitAnimForDuration(struct Sprite *sprite) SetCallbackToStoredInData6(sprite); } -static void SetupAndStartSpriteLinearTranslation(struct Sprite *sprite) +// Sprite data for ConvertPosDataToTranslateLinearData +#define sStepsX data[0] +#define sStartX data[1] +#define sTargetX data[2] +#define sStartY data[3] +#define sTargetY data[4] + +// Sprite data for TranslateSpriteLinear +#define sMoveSteps data[0] +#define sSpeedX data[1] +#define sSpeedY data[2] + +static void AnimPosToTranslateLinear(struct Sprite *sprite) { - SetupLinearTranslationWithFixedDuration(sprite); + ConvertPosDataToTranslateLinearData(sprite); sprite->callback = TranslateSpriteLinear; sprite->callback(sprite); } -void SetupLinearTranslationWithFixedDuration(struct Sprite *sprite) +void ConvertPosDataToTranslateLinearData(struct Sprite *sprite) { s16 old; - s32 xDiff; + int xDiff; - if (sprite->data[1] > sprite->data[2]) - sprite->data[0] = -sprite->data[0]; - xDiff = sprite->data[2] - sprite->data[1]; - old = sprite->data[0]; - sprite->data[0] = abs(xDiff / sprite->data[0]); - sprite->data[2] = (sprite->data[4] - sprite->data[3]) / sprite->data[0]; - sprite->data[1] = old; + if (sprite->sStartX > sprite->sTargetX) + sprite->sStepsX = -sprite->sStepsX; + xDiff = sprite->sTargetX - sprite->sStartX; + old = sprite->sStepsX; + sprite->sMoveSteps = abs(xDiff / sprite->sStepsX); + sprite->sSpeedY = (sprite->sTargetY - sprite->sStartY) / sprite->sMoveSteps; + sprite->sSpeedX = old; } void TranslateSpriteLinear(struct Sprite *sprite) { - if (sprite->data[0] > 0) + if (sprite->sMoveSteps > 0) { - --sprite->data[0]; - sprite->x2 += sprite->data[1]; - sprite->y2 += sprite->data[2]; + sprite->sMoveSteps--; + sprite->x2 += sprite->sSpeedX; + sprite->y2 += sprite->sSpeedY; } else { @@ -561,17 +614,18 @@ static void TranslateSpriteLinearFixedPointIconFrame(struct Sprite *sprite) UpdateMonIconFrame(sprite); } -// not used -static void SetupAndStartSpriteLinearTranslationToTarget(struct Sprite *sprite) +// Unused +static void TranslateSpriteToBattleTargetPos(struct Sprite *sprite) { sprite->data[1] = sprite->x + sprite->x2; sprite->data[3] = sprite->y + sprite->y2; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); - sprite->callback = SetupAndStartSpriteLinearTranslation; + sprite->callback = AnimPosToTranslateLinear; } -void TranslateMonSpriteLinear(struct Sprite *sprite) +// Same as TranslateSpriteLinear but takes an id to specify which sprite to move +void TranslateSpriteLinearById(struct Sprite *sprite) { if (sprite->data[0] > 0) { @@ -585,7 +639,7 @@ void TranslateMonSpriteLinear(struct Sprite *sprite) } } -void TranslateMonSpriteLinearFixedPoint(struct Sprite *sprite) +void TranslateSpriteLinearByIdFixedPoint(struct Sprite *sprite) { if (sprite->data[0] > 0) { @@ -628,20 +682,26 @@ void DestroySpriteAndMatrix(struct Sprite *sprite) DestroyAnimSprite(sprite); } -// not used +// Unused static void SetupAndStartSpriteLinearTranslationToAttacker(struct Sprite *sprite) { - sprite->data[1] = sprite->x + sprite->x2; - sprite->data[3] = sprite->y + sprite->y2; - sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); - sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); - sprite->callback = SetupAndStartSpriteLinearTranslation; + sprite->sStartX = sprite->x + sprite->x2; + sprite->sStartY = sprite->y + sprite->y2; + sprite->sTargetX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); + sprite->sTargetY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); + sprite->callback = AnimPosToTranslateLinear; } -// not used -static void SpriteResetPaletteStructAndDestroy(struct Sprite *sprite) +#undef sStepsX +#undef sStartX +#undef sTargetX +#undef sStartY +#undef sTargetY + +// Unused +static void EndUnkPaletteAnim(struct Sprite *sprite) { - ResetPaletteStructByUid(sprite->data[5]); + PaletteStruct_ResetById(sprite->data[5]); DestroySpriteAndMatrix(sprite); } @@ -809,11 +869,14 @@ bool8 IsDoubleBattle(void) return IS_DOUBLE_BATTLE(); } +#define BG_ANIM_PAL_1 8 +#define BG_ANIM_PAL_2 9 + void GetBattleAnimBg1Data(struct BattleAnimBgData *animBgData) { animBgData->bgTiles = gBattleAnimMons_BgTilesBuffer; animBgData->bgTilemap = (u16 *)gBattleAnimMons_BgTilemapBuffer; - animBgData->paletteId = 8; + animBgData->paletteId = BG_ANIM_PAL_1; animBgData->bgId = 1; animBgData->tilesOffset = 0x200; animBgData->unused = 0; @@ -829,7 +892,7 @@ void GetBattleAnimBgData(struct BattleAnimBgData *animBgData, u32 bgId) { animBgData->bgTiles = gBattleAnimMons_BgTilesBuffer; animBgData->bgTilemap = (u16 *)gBattleAnimMons_BgTilemapBuffer; - animBgData->paletteId = 9; + animBgData->paletteId = BG_ANIM_PAL_2; animBgData->bgId = 2; animBgData->tilesOffset = 0x300; animBgData->unused = 0; @@ -842,14 +905,14 @@ void GetBattleAnimBgDataByPriorityRank(struct BattleAnimBgData *animBgData, u8 u animBgData->bgTilemap = (u16 *)gBattleAnimMons_BgTilemapBuffer; if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1) { - animBgData->paletteId = 8; + animBgData->paletteId = BG_ANIM_PAL_1; animBgData->bgId = 1; animBgData->tilesOffset = 0x200; animBgData->unused = 0; } else { - animBgData->paletteId = 9; + animBgData->paletteId = BG_ANIM_PAL_2; animBgData->bgId = 2; animBgData->tilesOffset = 0x300; animBgData->unused = 0; @@ -888,12 +951,16 @@ void AnimLoadCompressedBgTilemap(u32 bgId, const u32 *src) u8 GetBattleBgPaletteNum(void) { + /* + if (IsContest()) + return 1; + */ return 2; } -void ToggleBg3Mode(bool8 arg0) +void ToggleBg3Mode(bool8 largeScreenSize) { - if (!arg0) + if (!largeScreenSize) { SetAnimBgAttribute(3, BG_ANIM_SCREEN_SIZE, 0); SetAnimBgAttribute(3, BG_ANIM_AREA_OVERFLOW_MODE, 1); @@ -905,7 +972,7 @@ void ToggleBg3Mode(bool8 arg0) } } -void StartSpriteLinearTranslationFromCurrentPos(struct Sprite *sprite) +void TradeMenuBouncePartySprites(struct Sprite *sprite) { sprite->data[1] = sprite->x; sprite->data[3] = sprite->y; @@ -1019,7 +1086,7 @@ void InitAnimLinearTranslationWithSpeed(struct Sprite *sprite) InitAnimLinearTranslation(sprite); } -void BattleAnim_InitAndRunLinearTranslationWithDuration(struct Sprite *sprite) +void InitAnimLinearTranslationWithSpeedAndPos(struct Sprite *sprite) { sprite->sTransl_InitX = sprite->x; sprite->sTransl_InitY = sprite->y; @@ -1058,7 +1125,7 @@ void InitAndRunAnimFastLinearTranslation(struct Sprite *sprite) sprite->sTransl_InitX = sprite->x; sprite->sTransl_InitY = sprite->y; InitAnimFastLinearTranslation(sprite); - sprite->callback = SpriteCB_RunAnimFastLinearTranslation; + sprite->callback = AnimFastTranslateLinearWaitEnd; sprite->callback(sprite); } @@ -1088,7 +1155,7 @@ bool8 AnimFastTranslateLinear(struct Sprite *sprite) return FALSE; } -static void SpriteCB_RunAnimFastLinearTranslation(struct Sprite *sprite) +static void AnimFastTranslateLinearWaitEnd(struct Sprite *sprite) { if (AnimFastTranslateLinear(sprite)) SetCallbackToStoredInData6(sprite); @@ -1102,12 +1169,12 @@ void InitAnimFastLinearTranslationWithSpeed(struct Sprite *sprite) InitAnimFastLinearTranslation(sprite); } -void InitAndStartAnimFastLinearTranslationWithSpeed(struct Sprite *sprite) +void InitAnimFastLinearTranslationWithSpeedAndPos(struct Sprite *sprite) { sprite->data[1] = sprite->x; sprite->data[3] = sprite->y; InitAnimFastLinearTranslationWithSpeed(sprite); - sprite->callback = SpriteCB_RunAnimFastLinearTranslation; + sprite->callback = AnimFastTranslateLinearWaitEnd; sprite->callback(sprite); } @@ -1120,7 +1187,7 @@ void SetSpriteRotScale(u8 spriteId, s16 xScale, s16 yScale, u16 rotation) src.xScale = xScale; src.yScale = yScale; src.rotation = rotation; - if (Dummy_ReturnFalse()) + if (ShouldRotScaleSpeciesBeFlipped()) src.xScale = -src.xScale; i = gSprites[spriteId].oam.matrixNum; ObjAffineSet(&src, &matrix, 1, 2); @@ -1130,8 +1197,18 @@ void SetSpriteRotScale(u8 spriteId, s16 xScale, s16 yScale, u16 rotation) gOamMatrices[i].d = matrix.d; } -static bool8 Dummy_ReturnFalse(void) +// Pokémon in Contests (except Unown) should be flipped. +static bool8 ShouldRotScaleSpeciesBeFlipped(void) { + /* + if (IsContest()) + { + if (gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].data[2] == SPECIES_UNOWN) + return FALSE; + else + return TRUE; + } + */ return FALSE; } @@ -1185,7 +1262,7 @@ void TrySetSpriteRotScale(struct Sprite *sprite, bool8 recalcCenterVector, s16 x src.xScale = xScale; src.yScale = yScale; src.rotation = rotation; - if (Dummy_ReturnFalse()) + if (ShouldRotScaleSpeciesBeFlipped()) src.xScale = -src.xScale; i = sprite->oam.matrixNum; ObjAffineSet(&src, &matrix, 1, 2); @@ -1242,14 +1319,14 @@ void SetGreyscaleOrOriginalPalette(u16 paletteNum, bool8 restoreOriginalColor) } } -u32 GetBattlePalettesMask(bool8 battleBackground, bool8 attacker, bool8 target, bool8 attackerPartner, bool8 targetPartner, bool8 a6, bool8 a7) +u32 GetBattlePalettesMask(bool8 battleBackground, bool8 attacker, bool8 target, bool8 attackerPartner, bool8 targetPartner, bool8 anim1, bool8 anim2) { u32 selectedPalettes = 0; u32 shift; if (battleBackground) { - selectedPalettes = 0xe; + selectedPalettes = 0xe; // Palettes 1, 2, and 3 } if (attacker) { @@ -1277,27 +1354,25 @@ u32 GetBattlePalettesMask(bool8 battleBackground, bool8 attacker, bool8 target, selectedPalettes |= 1 << shift; } } - if (a6) - { - selectedPalettes |= 0x100; - } - if (a7) - { - selectedPalettes |= 0x200; - } + if (anim1) + selectedPalettes |= 1 << BG_ANIM_PAL_1; + + if (anim2) + selectedPalettes |= 1 << BG_ANIM_PAL_2; + return selectedPalettes; } -u32 SelectBattlerSpritePalettes(bool8 playerLeft, bool8 playerRight, bool8 foeLeft, bool8 foeRight) +u32 GetBattleMonSpritePalettesMask(bool8 playerLeft, bool8 playerRight, bool8 foeLeft, bool8 foeRight) { - u32 var = 0; + u32 selectedPalettes = 0; u32 shift; if (playerLeft) { if (IsBattlerSpriteVisible(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT))) { - var |= 1 << (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) + 16); + selectedPalettes |= 1 << (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) + 16); } } if (playerRight) @@ -1305,7 +1380,7 @@ u32 SelectBattlerSpritePalettes(bool8 playerLeft, bool8 playerRight, bool8 foeLe if (IsBattlerSpriteVisible(GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT))) { shift = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT) + 16; - var |= 1 << shift; + selectedPalettes |= 1 << shift; } } if (foeLeft) @@ -1313,7 +1388,7 @@ u32 SelectBattlerSpritePalettes(bool8 playerLeft, bool8 playerRight, bool8 foeLe if (IsBattlerSpriteVisible(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))) { shift = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT) + 16; - var |= 1 << shift; + selectedPalettes |= 1 << shift; } } if (foeRight) @@ -1321,18 +1396,18 @@ u32 SelectBattlerSpritePalettes(bool8 playerLeft, bool8 playerRight, bool8 foeLe if (IsBattlerSpriteVisible(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))) { shift = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT) + 16; - var |= 1 << shift; + selectedPalettes |= 1 << shift; } } - return var; + return selectedPalettes; } -u8 GetSpritePalIdxByBattler(u8 a1) +u8 GetSpritePalIdxByBattler(u8 battler) { - return a1; + return battler; } -// not used +// Unused static u8 GetSpritePalIdxByPosition(u8 position) { return GetBattlerAtPosition(position); @@ -1451,7 +1526,7 @@ s16 CloneBattlerSpriteWithBlend(u8 animBattler) u16 i; u8 spriteId = GetAnimBattlerSpriteId(animBattler); - if (spriteId != 0xFF) + if (spriteId != SPRITE_NONE) { for (i = 0; i < MAX_SPRITES; ++i) { @@ -1473,6 +1548,7 @@ void DestroySpriteWithActiveSheet(struct Sprite *sprite) DestroySprite(sprite); } +// Only used to fade Moonlight moon sprite in void AnimTask_AlphaFadeIn(u8 taskId) { s16 v1 = 0, v2 = 0; @@ -1553,10 +1629,10 @@ static void AnimTask_BlendMonInAndOutSetup(struct Task *task) task->data[5] = gBattleAnimArgs[3]; task->data[6] = 0; task->data[7] = gBattleAnimArgs[4]; - task->func = AnimTask_BlendMonInAndOutStep; + task->func = AnimTask_BlendMonInAndOut_Step; } -static void AnimTask_BlendMonInAndOutStep(u8 taskId) +static void AnimTask_BlendMonInAndOut_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; @@ -1591,6 +1667,7 @@ static void AnimTask_BlendMonInAndOutStep(u8 taskId) } } +// See AnimTask_BlendMonInAndOut. Same, but ANIM_TAG_* instead of mon void AnimTask_BlendPalInAndOutByTag(u8 taskId) { u8 palette = IndexOfSpritePaletteTag(gBattleAnimArgs[0]); @@ -1691,12 +1768,12 @@ bool8 RunAffineAnimFromTaskData(struct Task *task) // matrix's scale in the y dimension. void SetBattlerSpriteYOffsetFromYScale(u8 spriteId) { - s32 var = 64 - GetBattlerYDeltaFromSpriteId(spriteId) * 2; + s32 var = MON_PIC_HEIGHT - GetBattlerYDeltaFromSpriteId(spriteId) * 2; u16 matrix = gSprites[spriteId].oam.matrixNum; - s32 var2 = (var << 8) / gOamMatrices[matrix].d; + s32 var2 = SAFE_DIV(var << 8, gOamMatrices[matrix].d); - if (var2 > 128) - var2 = 128; + if (var2 > MON_PIC_HEIGHT * 2) + var2 = MON_PIC_HEIGHT * 2; gSprites[spriteId].y2 = (var - var2) / 2; } @@ -1704,12 +1781,12 @@ void SetBattlerSpriteYOffsetFromYScale(u8 spriteId) // matrix's scale in the y dimension. void SetBattlerSpriteYOffsetFromOtherYScale(u8 spriteId, u8 otherSpriteId) { - s32 var = 64 - GetBattlerYDeltaFromSpriteId(otherSpriteId) * 2; + s32 var = MON_PIC_HEIGHT - GetBattlerYDeltaFromSpriteId(otherSpriteId) * 2; u16 matrix = gSprites[spriteId].oam.matrixNum; s32 var2 = SAFE_DIV((var << 8), gOamMatrices[matrix].d); - if (var2 > 128) - var2 = 128; + if (var2 > MON_PIC_HEIGHT * 2) + var2 = MON_PIC_HEIGHT * 2; gSprites[spriteId].y2 = (var - var2) / 2; } @@ -1744,7 +1821,7 @@ static u16 GetBattlerYDeltaFromSpriteId(u8 spriteId) } } } - return 64; + return MON_PIC_HEIGHT; } void StorePointerInVars(s16 *lo, s16 *hi, const void *ptr) @@ -1758,16 +1835,16 @@ void *LoadPointerFromVars(s16 lo, s16 hi) return (void *)((u16)lo | ((u16)hi << 16)); } -void BattleAnimHelper_SetSpriteSquashParams(struct Task *task, u8 spriteId, s16 xScale0, s16 yScale0, s16 xScale1, s16 yScale1, u16 duration) +void BattleAnimHelper_SetSpriteSquashParams(struct Task *task, u8 spriteId, s16 xScaleStart, s16 yScaleStart, s16 xScaleEnd, s16 yScaleEnd, u16 duration) { task->data[8] = duration; task->data[15] = spriteId; - task->data[9] = xScale0; - task->data[10] = yScale0; - task->data[13] = xScale1; - task->data[14] = yScale1; - task->data[11] = (xScale1 - xScale0) / duration; - task->data[12] = (yScale1 - yScale0) / duration; + task->data[9] = xScaleStart; + task->data[10] = yScaleStart; + task->data[13] = xScaleEnd; + task->data[14] = yScaleEnd; + task->data[11] = (xScaleEnd - xScaleStart) / duration; + task->data[12] = (yScaleEnd - yScaleStart) / duration; } u8 BattleAnimHelper_RunSpriteSquash(struct Task *task) @@ -1804,12 +1881,12 @@ void AnimTask_GetFrustrationPowerLevel(u8 taskId) powerLevel = 2; else powerLevel = 3; - gBattleAnimArgs[7] = powerLevel; + gBattleAnimArgs[ARG_RET_ID] = powerLevel; DestroyAnimVisualTask(taskId); } -// not used -static void SetOamPriorityOfAllVisibleBattlers(u8 priority) +// Unused +static void SetPriorityForVisibleBattlers(u8 priority) { if (IsBattlerSpriteVisible(gBattleAnimTarget)) gSprites[gBattlerSpriteIds[gBattleAnimTarget]].oam.priority = priority; @@ -1821,7 +1898,7 @@ static void SetOamPriorityOfAllVisibleBattlers(u8 priority) gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority = priority; } -void ResetSpritePriorityOfAllVisibleBattlers(void) +void InitPrioritiesForVisibleBattlers(void) { s32 i; @@ -1871,11 +1948,12 @@ u8 GetBattlerSpriteBGPriorityRank(u8 battlerId) return 1; } +// Create pokemon sprite to be used for a move animation effect (e.g. Role Play / Snatch) u8 CreateAdditionalMonSpriteForMoveAnim(u16 species, bool8 isBackpic, u8 templateId, s16 x, s16 y, u8 subpriority, u32 personality, u32 trainerId, u32 battlerId, bool32 ignoreDeoxys) { u8 spriteId; - u16 sheet = LoadSpriteSheet(&sMoveAnimAdtlSprSheets[templateId]); - u16 palette = AllocSpritePalette(sSpriteTemplates_AdditionalForAnim[templateId].paletteTag); + u16 sheet = LoadSpriteSheet(&sSpriteSheets_MoveEffectMons[templateId]); + u16 palette = AllocSpritePalette(sSpriteTemplates_MoveEffectMons[templateId].paletteTag); if (gMonSpritesGfxPtr != NULL && gMonSpritesGfxPtr->multiUseBuffer == NULL) gMonSpritesGfxPtr->multiUseBuffer = AllocZeroed(0x2000); @@ -1914,9 +1992,9 @@ u8 CreateAdditionalMonSpriteForMoveAnim(u16 species, bool8 isBackpic, u8 templat RequestDma3Copy(gMonSpritesGfxPtr->multiUseBuffer, (void *)(OBJ_VRAM0 + (sheet * 0x20)), 0x800, 1); FREE_AND_SET_NULL(gMonSpritesGfxPtr->multiUseBuffer); if (!isBackpic) - spriteId = CreateSprite(&sSpriteTemplates_AdditionalForAnim[templateId], x, y + gMonFrontPicCoords[species].y_offset, subpriority); + spriteId = CreateSprite(&sSpriteTemplates_MoveEffectMons[templateId], x, y + gMonFrontPicCoords[species].y_offset, subpriority); else - spriteId = CreateSprite(&sSpriteTemplates_AdditionalForAnim[templateId], x, y + gMonBackPicCoords[species].y_offset, subpriority); + spriteId = CreateSprite(&sSpriteTemplates_MoveEffectMons[templateId], x, y + gMonBackPicCoords[species].y_offset, subpriority); return spriteId; } @@ -2005,17 +2083,17 @@ s16 GetBattlerSpriteCoordAttr(u8 battlerId, u8 attr) switch (attr) { case BATTLER_COORD_ATTR_HEIGHT: - return (coords->size & 0xf) * 8; + return GET_MON_COORDS_HEIGHT(coords->size); case BATTLER_COORD_ATTR_WIDTH: - return (coords->size >> 4) * 8; + return GET_MON_COORDS_WIDTH(coords->size); case BATTLER_COORD_ATTR_LEFT: - return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2) - ((coords->size >> 4) * 4); + return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2) - (GET_MON_COORDS_WIDTH(coords->size) / 2); case BATTLER_COORD_ATTR_RIGHT: - return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2) + ((coords->size >> 4) * 4); + return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2) + (GET_MON_COORDS_WIDTH(coords->size) / 2); case BATTLER_COORD_ATTR_TOP: - return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET) - ((coords->size & 0xf) * 4); + return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET) - (GET_MON_COORDS_HEIGHT(coords->size) / 2); case BATTLER_COORD_ATTR_BOTTOM: - return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET) + ((coords->size & 0xf) * 4); + return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET) + (GET_MON_COORDS_HEIGHT(coords->size) / 2); case BATTLER_COORD_ATTR_RAW_BOTTOM: ret = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y) + 31; return ret - coords->y_offset; @@ -2056,7 +2134,7 @@ void SetAverageBattlerPositions(u8 battlerId, bool8 respectMonPicOffsets, s16 *x *y = (battlerY + partnerY) / 2; } -u8 CreateCloneOfSpriteInWindowMode(s32 battlerId, u8 spriteId, s32 species) +u8 CreateInvisibleSpriteCopy(s32 battlerId, u8 spriteId, s32 species) { u8 newSpriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); @@ -2069,7 +2147,7 @@ u8 CreateCloneOfSpriteInWindowMode(s32 battlerId, u8 spriteId, s32 species) return newSpriteId; } -void SpriteCB_AnimTranslateSpriteLinearAndFlicker(struct Sprite *sprite) +void AnimTranslateLinearAndFlicker_Flipped(struct Sprite *sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) @@ -2091,7 +2169,8 @@ void SpriteCB_AnimTranslateSpriteLinearAndFlicker(struct Sprite *sprite) sprite->callback = TranslateSpriteLinearAndFlicker; } -void SpriteCB_AnimTranslateSpriteLinearAndFlicker2(struct Sprite *sprite) +// Used by three different unused battle anim sprite templates. +void AnimTranslateLinearAndFlicker(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { @@ -2112,7 +2191,8 @@ void SpriteCB_AnimTranslateSpriteLinearAndFlicker2(struct Sprite *sprite) sprite->callback = TranslateSpriteLinearAndFlicker; } -void SpriteCB_TrackOffsetFromAttackerAndWaitAnim(struct Sprite *sprite) +// Used by Detect/Disable +void AnimSpinningSparkle(struct Sprite *sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) @@ -2124,26 +2204,43 @@ void SpriteCB_TrackOffsetFromAttackerAndWaitAnim(struct Sprite *sprite) StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } +// Task and sprite data for AnimTask_AttackerPunchWithTrace +#define tBattlerSpriteId data[0] +#define tMoveSpeed data[1] +#define tState data[2] +#define tCounter data[3] +#define tPaletteNum data[4] +#define tNumTracesActive data[5] +#define tPriority data[6] + +#define sActiveTime data[0] +#define sTaskId data[1] +#define sSpriteId data[2] + void AnimTask_AttackerPunchWithTrace(u8 taskId) { u16 src; u16 dest; struct Task *task = &gTasks[taskId]; - task->data[0] = GetAnimBattlerSpriteId(ANIM_ATTACKER); - task->data[1] = ((GetBattlerSide(gBattleAnimAttacker)) != B_SIDE_PLAYER) ? -8 : 8; - task->data[2] = 0; - task->data[3] = 0; - gSprites[task->data[0]].x2 -= task->data[0]; - task->data[4] = AllocSpritePalette(10097); - task->data[5] = 0; - dest = (task->data[4] + 0x10) * 0x10; - src = (gSprites[task->data[0]].oam.paletteNum + 0x10) * 0x10; - task->data[6] = GetBattlerSpriteSubpriority(gBattleAnimAttacker); - if (task->data[6] == 20 || task->data[6] == 40) - task->data[6] = 2; + task->tBattlerSpriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); + task->tMoveSpeed = (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) ? -8 : 8; + task->tState = 0; + task->tCounter = 0; + gSprites[task->tBattlerSpriteId].x2 -= task->tBattlerSpriteId; + task->tPaletteNum = AllocSpritePalette(ANIM_TAG_BENT_SPOON); + task->tNumTracesActive = 0; + + dest = (task->tPaletteNum + 16) * 16; + src = (gSprites[task->tBattlerSpriteId].oam.paletteNum + 0x10) * 0x10; + + // Set trace's priority based on battler's subpriority + task->tPriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker); + if (task->tPriority == 20 || task->tPriority == 40) + task->tPriority = 2; else - task->data[6] = 3; + task->tPriority = 3; + CpuCopy32(&gPlttBufferUnfaded[src], &gPlttBufferFaded[dest], 0x20); BlendPalette(dest, 16, gBattleAnimArgs[1], gBattleAnimArgs[0]); task->func = AnimTask_AttackerPunchWithTrace_Step; @@ -2152,28 +2249,30 @@ void AnimTask_AttackerPunchWithTrace(u8 taskId) static void AnimTask_AttackerPunchWithTrace_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; - switch (task->data[2]) + switch (task->tState) { case 0: - PunchAnim_CreateTraceSprite(task, taskId); - gSprites[task->data[0]].x2 += task->data[1]; - if (++task->data[3] == 5) + // Move forward + CreateBattlerTrace(task, taskId); + gSprites[task->tBattlerSpriteId].x2 += task->tMoveSpeed; + if (++task->tCounter == 5) { - --task->data[3]; - ++task->data[2]; + task->tCounter--; + task->tState++; } break; case 1: - PunchAnim_CreateTraceSprite(task, taskId); - gSprites[task->data[0]].x2 -= task->data[1]; - if (--task->data[3] == 0) + // Move back (do same number of traces as before) + CreateBattlerTrace(task, taskId); + gSprites[task->tBattlerSpriteId].x2 -= task->tMoveSpeed; + if (--task->tCounter == 0) { - gSprites[task->data[0]].x2 = 0; - ++task->data[2]; + gSprites[task->tBattlerSpriteId].x2 = 0; + task->tState++; } break; case 2: - if (!task->data[5]) + if (task->tNumTracesActive == 0) { FreeSpritePaletteByTag(ANIM_TAG_BENT_SPOON); DestroyAnimVisualTask(taskId); @@ -2182,33 +2281,45 @@ static void AnimTask_AttackerPunchWithTrace_Step(u8 taskId) } } -static void PunchAnim_CreateTraceSprite(struct Task *task, u8 taskId) +static void CreateBattlerTrace(struct Task *task, u8 taskId) { s16 spriteId = CloneBattlerSpriteWithBlend(0); - if (spriteId >= 0) { - gSprites[spriteId].oam.priority = task->data[6]; - gSprites[spriteId].oam.paletteNum = task->data[4]; - gSprites[spriteId].data[0] = 8; - gSprites[spriteId].data[1] = taskId; - gSprites[spriteId].data[2] = spriteId; - gSprites[spriteId].x2 = gSprites[task->data[0]].x2; - gSprites[spriteId].callback = SpriteCB_PunchTrace; - ++task->data[5]; + gSprites[spriteId].oam.priority = task->tPriority; + gSprites[spriteId].oam.paletteNum = task->tPaletteNum; + gSprites[spriteId].sActiveTime = 8; + gSprites[spriteId].sTaskId = taskId; + gSprites[spriteId].sSpriteId = spriteId; + gSprites[spriteId].x2 = gSprites[task->tBattlerSpriteId].x2; + gSprites[spriteId].callback = AnimBattlerTrace; + task->tNumTracesActive++; } } -static void SpriteCB_PunchTrace(struct Sprite *sprite) +// Just waits until destroyed +static void AnimBattlerTrace(struct Sprite *sprite) { - if (--sprite->data[0] == 0) + if (--sprite->sActiveTime == 0) { - --gTasks[sprite->data[1]].data[5]; + gTasks[sprite->sTaskId].tNumTracesActive--; DestroySpriteWithActiveSheet(sprite); } } -void SpriteCB_WeatherBallUp(struct Sprite *sprite) +#undef tBattlerSpriteId +#undef tMoveSpeed +#undef tState +#undef tCounter +#undef tPaletteNum +#undef tNumTracesActive +#undef tPriority + +#undef sActiveTime +#undef sTaskId +#undef sSpriteId + +void AnimWeatherBallUp(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); @@ -2217,10 +2328,10 @@ void SpriteCB_WeatherBallUp(struct Sprite *sprite) else sprite->data[0] = -10; sprite->data[1] = -40; - sprite->callback = SpriteCB_WeatherBallUp_Step; + sprite->callback = AnimWeatherBallUp_Step; } -static void SpriteCB_WeatherBallUp_Step(struct Sprite *sprite) +static void AnimWeatherBallUp_Step(struct Sprite *sprite) { sprite->data[2] += sprite->data[0]; sprite->data[3] += sprite->data[1]; diff --git a/src/battle_anim_status_effects.c b/src/battle_anim_status_effects.c index 4abcb083a..3e5ed87fa 100644 --- a/src/battle_anim_status_effects.c +++ b/src/battle_anim_status_effects.c @@ -43,7 +43,7 @@ const struct SpriteTemplate gSpriteTemplate_83BF3F8 = .anims = sSpriteAnimTable_83BF3F4, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_AnimTranslateSpriteLinearAndFlicker2, + .callback = AnimTranslateLinearAndFlicker, }; const struct SpriteTemplate gSpriteTemplate_83BF410 = @@ -54,7 +54,7 @@ const struct SpriteTemplate gSpriteTemplate_83BF410 = .anims = sSpriteAnimTable_83BF3F4, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_AnimTranslateSpriteLinearAndFlicker, + .callback = AnimTranslateLinearAndFlicker_Flipped, }; static const union AnimCmd sUnknown_83BF428[] = @@ -76,7 +76,7 @@ const struct SpriteTemplate gWeatherBallUpSpriteTemplate = .anims = sSpriteAnimTable_83BF430, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_WeatherBallUp, + .callback = AnimWeatherBallUp, }; const struct SpriteTemplate gWeatherBallNormalDownSpriteTemplate = @@ -113,7 +113,7 @@ const struct SpriteTemplate gSpriteTemplate_83BF480 = .anims = sSpriteAnimTable_83BF47C, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_TrackOffsetFromAttackerAndWaitAnim, + .callback = AnimSpinningSparkle, }; const struct SpriteTemplate gSpriteTemplate_83BF498 = @@ -124,7 +124,7 @@ const struct SpriteTemplate gSpriteTemplate_83BF498 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_AnimTranslateSpriteLinearAndFlicker2, + .callback = AnimTranslateLinearAndFlicker, }; static const union AnimCmd sUnknown_83BF4B0[] = @@ -160,7 +160,7 @@ const struct SpriteTemplate gSpriteTemplate_83BF4D4 = .anims = sSpriteAniimTable_83BF4C8, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_AnimTranslateSpriteLinearAndFlicker2, + .callback = AnimTranslateLinearAndFlicker, }; static const union AnimCmd sUnknown_83BF4EC[] = @@ -194,7 +194,7 @@ const struct SpriteTemplate gSpriteTemplate_83BF514 = .anims = sSpriteAnimTable_83BF4F4, .images = NULL, .affineAnims = sSpriteAffineAnimTable_83BF510, - .callback = SpriteCB_AnimTranslateSpriteLinearAndFlicker, + .callback = AnimTranslateLinearAndFlicker_Flipped, }; static const u8 sUnknown_83BF52C[] = _("TASK OVER\nタスクがオ-バ-しました"); diff --git a/src/battle_anim_utility_funcs.c b/src/battle_anim_utility_funcs.c index 4a44031db..638ac7a6e 100644 --- a/src/battle_anim_utility_funcs.c +++ b/src/battle_anim_utility_funcs.c @@ -54,7 +54,7 @@ void AnimTask_BlendSelected(u8 taskId) { u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gBattleAnimArgs[0]); - selectedPalettes |= SelectBattlerSpritePalettes( + selectedPalettes |= GetBattleMonSpritePalettesMask( (gBattleAnimArgs[0] >> 7) & 1, (gBattleAnimArgs[0] >> 8) & 1, (gBattleAnimArgs[0] >> 9) & 1, @@ -330,7 +330,7 @@ void AnimTask_SetUpCurseBackground(u8 taskId) else species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); - newSpriteId = CreateCloneOfSpriteInWindowMode(gBattleAnimAttacker, spriteId, species); + newSpriteId = CreateInvisibleSpriteCopy(gBattleAnimAttacker, spriteId, species); GetBattleAnimBg1Data(&animBgData); AnimLoadCompressedBgTilemap(animBgData.bgId, gFile_graphics_battle_anims_masks_curse_tilemap); if (IsContest()) @@ -446,11 +446,11 @@ static void StatsChangeAnimation_Step2(u8 taskId) u8 battlerSpriteId; battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler1]; - spriteId = CreateCloneOfSpriteInWindowMode(sAnimStatsChangeData->battler1, battlerSpriteId, sAnimStatsChangeData->species); + spriteId = CreateInvisibleSpriteCopy(sAnimStatsChangeData->battler1, battlerSpriteId, sAnimStatsChangeData->species); if (sAnimStatsChangeData->data[3]) { battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler2]; - newSpriteId = CreateCloneOfSpriteInWindowMode(sAnimStatsChangeData->battler2, battlerSpriteId, sAnimStatsChangeData->species); + newSpriteId = CreateInvisibleSpriteCopy(sAnimStatsChangeData->battler2, battlerSpriteId, sAnimStatsChangeData->species); } GetBattleAnimBg1Data(&animBgData); if (sAnimStatsChangeData->data[0] == 0) @@ -580,7 +580,7 @@ static void StatsChangeAnimation_Step3(u8 taskId) void AnimTask_Flash(u8 taskId) { - u32 selectedPalettes = SelectBattlerSpritePalettes(1, 1, 1, 1); + u32 selectedPalettes = GetBattleMonSpritePalettesMask(1, 1, 1, 1); sub_80BB790(selectedPalettes, 0); gTasks[taskId].data[14] = selectedPalettes >> 16; @@ -753,9 +753,9 @@ void StartMonScrollingBgMask(u8 taskId, s32 unused, u16 arg2, u8 battler1, u8 ar species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES); else species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES); - spriteId = CreateCloneOfSpriteInWindowMode(battler1, gBattlerSpriteIds[battler1], species); + spriteId = CreateInvisibleSpriteCopy(battler1, gBattlerSpriteIds[battler1], species); if (arg4) - newSpriteId = CreateCloneOfSpriteInWindowMode(battler2, gBattlerSpriteIds[battler2], species); + newSpriteId = CreateInvisibleSpriteCopy(battler2, gBattlerSpriteIds[battler2], species); GetBattleAnimBg1Data(&animBgData); AnimLoadCompressedBgTilemap(animBgData.bgId, tilemap); if (IsContest()) diff --git a/src/palette.c b/src/palette.c index 014199a7a..ebb64bb55 100644 --- a/src/palette.c +++ b/src/palette.c @@ -319,7 +319,7 @@ static void sub_80709B4(struct PaletteStruct *a1) return; if (val > 2) return; - ResetPaletteStructByUid(a1->base->uid); + PaletteStruct_ResetById(a1->base->uid); } } else @@ -328,7 +328,7 @@ static void sub_80709B4(struct PaletteStruct *a1) } } -void ResetPaletteStructByUid(u16 a1) +void PaletteStruct_ResetById(u16 a1) { u8 paletteNum = GetPaletteNumByUid(a1); if (paletteNum != 16) diff --git a/src/trade.c b/src/trade.c index 392a23061..c5a580b1b 100644 --- a/src/trade.c +++ b/src/trade.c @@ -2140,7 +2140,7 @@ static void HandleRedrawTradeMenuOnSide(u8 side) gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].data[4] = (sTradeMonSpriteCoords[whichParty * PARTY_SIZE][1] * 8) - 12; StoreSpriteCallbackInData6(&gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]], SpriteCB_MonIcon); sTradeMenuResourcesPtr->menuRedrawState[side]++; - StartSpriteLinearTranslationFromCurrentPos(&gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]]); + TradeMenuBouncePartySprites(&gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]]); CopyToBgTilemapBufferRect_ChangePalette(1, sTradePartyBoxTilemap, side * 15, 0, 15, 17, 0); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(0);