From c8012f6d462b066a678bccf03dcc5544c0f0fb2a Mon Sep 17 00:00:00 2001 From: cawtds Date: Thu, 9 May 2024 18:22:50 +0200 Subject: [PATCH] generalized battleloadmonspritegfx --- include/battle_gfx_sfx_util.h | 3 +- src/battle_controller_link_opponent.c | 4 +- src/battle_controller_link_partner.c | 6 +- src/battle_controller_opponent.c | 4 +- src/battle_controller_player.c | 8 +- src/battle_controller_pokedude.c | 4 +- src/battle_gfx_sfx_util.c | 120 ++++++++++++-------------- src/reshow_battle_screen.c | 4 +- 8 files changed, 70 insertions(+), 83 deletions(-) diff --git a/include/battle_gfx_sfx_util.h b/include/battle_gfx_sfx_util.h index 5824891df..74b4d42fd 100644 --- a/include/battle_gfx_sfx_util.h +++ b/include/battle_gfx_sfx_util.h @@ -10,8 +10,7 @@ bool8 TryHandleLaunchBattleTableAnimation(u8 activeBattler, u8 atkBattler, u8 de void InitAndLaunchSpecialAnimation(u8 activeBattler, u8 atkBattler, u8 defBattler, u8 tableId); bool8 IsMoveWithoutAnimation(u16 moveId, u8 animationTurn); bool8 IsBattleSEPlaying(u8 battlerId); -void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battlerId); -void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battlerId); +void BattleLoadMonSpriteGfx(struct Pokemon *mon, u32 battlerId); void DecompressGhostFrontPic(struct Pokemon *unused, u8 battlerId); void DecompressTrainerFrontPic(u16 frontPicId, u8 battlerId); void DecompressTrainerBackPalette(u16 a1, u8 a2); diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index fad3d309d..8882bd2c7 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -1029,7 +1029,7 @@ static void LinkOpponentHandleLoadMonSprite(u32 battler) { u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); - BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battler]], battler); + BattleLoadMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battler]], battler); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battler)); gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, @@ -1062,7 +1062,7 @@ static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) gBattlerPartyIndexes[battlerId] = gBattleResources->bufferA[battlerId][1]; species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); - BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); + BattleLoadMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index 890c67260..51d286b28 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -993,7 +993,7 @@ static void LinkPartnerHandleLoadMonSprite(u32 battler) { u16 species; - BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler); + BattleLoadMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler); species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battler)); @@ -1012,7 +1012,7 @@ static void LinkPartnerHandleSwitchInAnim(u32 battler) { ClearTemporarySpeciesSpriteData(battler, gBattleResources->bufferA[battler][2]); gBattlerPartyIndexes[battler] = gBattleResources->bufferA[battler][1]; - BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler); + BattleLoadMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler); StartSendOutAnim(battler, gBattleResources->bufferA[battler][2]); gBattlerControllerFuncs[battler] = SwitchIn_TryShinyAnim; } @@ -1551,7 +1551,7 @@ static void Task_StartSendOutAnim(u8 taskId) battlerPartner = BATTLE_PARTNER(battler); gBattleResources->bufferA[battlerPartner][1] = gBattlerPartyIndexes[battlerPartner]; - BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battlerPartner]], battlerPartner); + BattleLoadMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battlerPartner]], battlerPartner); StartSendOutAnim(battlerPartner, FALSE); } gBattlerControllerFuncs[battler] = Intro_ShowHealthbox; diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index e98c903d2..931386471 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -1031,7 +1031,7 @@ static void OpponentHandleLoadMonSprite(u32 battler) } else { - BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battler]], battler); + BattleLoadMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battler]], battler); y = GetBattlerSpriteDefault_Y(battler); } SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battler)); @@ -1065,7 +1065,7 @@ static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) gBattlerPartyIndexes[battlerId] = gBattleResources->bufferA[battlerId][1]; species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); - BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); + BattleLoadMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index e8663a651..4649b3401 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -1657,7 +1657,7 @@ static void PrintLinkStandbyMsg(void) static void PlayerHandleLoadMonSprite(u32 battler) { - BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler); + BattleLoadMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler); gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; gBattlerControllerFuncs[battler] = CompleteOnBattlerSpritePosX_0; } @@ -1666,7 +1666,7 @@ static void PlayerHandleSwitchInAnim(u32 battler) { ClearTemporarySpeciesSpriteData(battler, gBattleResources->bufferA[battler][2]); gBattlerPartyIndexes[battler] = gBattleResources->bufferA[battler][1]; - BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler); + BattleLoadMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler); gActionSelectionCursor[battler] = 0; gMoveSelectionCursor[battler] = 0; StartSendOutAnim(battler, gBattleResources->bufferA[battler][2]); @@ -2332,7 +2332,7 @@ void SpriteCB_FreePlayerSpriteLoadMonSprite(struct Sprite *sprite) FreeSpriteOamMatrix(sprite); FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); DestroySprite(sprite); - BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battlerId]], battlerId); + BattleLoadMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battlerId]], battlerId); StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], 0); } @@ -2357,7 +2357,7 @@ static void Task_StartSendOutAnim(u8 taskId) StartSendOutAnim(battler, FALSE); gBattleResources->bufferA[battlerPartner][1] = gBattlerPartyIndexes[battlerPartner]; - BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battlerPartner]], battlerPartner); + BattleLoadMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battlerPartner]], battlerPartner); StartSendOutAnim(battlerPartner, FALSE); } gBattlerControllerFuncs[battler] = Intro_TryShinyAnimShowHealthbox; diff --git a/src/battle_controller_pokedude.c b/src/battle_controller_pokedude.c index 8c65248e0..3cdaff5a8 100644 --- a/src/battle_controller_pokedude.c +++ b/src/battle_controller_pokedude.c @@ -691,7 +691,7 @@ static void PokedudeHandleLoadMonSprite(u32 battler) u32 y; u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); - BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battler]], battler); + BattleLoadMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battler]], battler); y = GetBattlerSpriteDefault_Y(battler); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battler)); gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, @@ -712,7 +712,7 @@ static void PokedudeHandleSwitchInAnim(u32 battler) { ClearTemporarySpeciesSpriteData(battler, gBattleResources->bufferA[battler][2]); gBattlerPartyIndexes[battler] = gBattleResources->bufferA[battler][1]; - BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler); + BattleLoadMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler); gActionSelectionCursor[battler] = 0; gMoveSelectionCursor[battler] = 0; StartSendOutAnim(battler); diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 63fe94a50..8136a8039 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -313,89 +313,77 @@ bool8 IsBattleSEPlaying(u8 battlerId) } } -void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battlerId) +void BattleLoadMonSpriteGfx(struct Pokemon *mon, u32 battler) { - u32 monsPersonality, currentPersonality; - bool32 isShiny; - u16 species; - u8 position; - u16 paletteOffset; + u32 monsPersonality, currentPersonality, isShiny, species, paletteOffset, position; const void *lzPaletteData; - void *buffer; + struct Pokemon *illusionMon = GetIllusionMonPtr(battler); + + if (GetMonData(mon, MON_DATA_IS_EGG) || GetMonData(mon, MON_DATA_SPECIES) == SPECIES_NONE) // Don't load GFX of egg pokemon. + return; monsPersonality = GetMonData(mon, MON_DATA_PERSONALITY); - if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE) + isShiny = GetMonData(mon, MON_DATA_IS_SHINY); + + if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies == SPECIES_NONE) { species = GetMonData(mon, MON_DATA_SPECIES); currentPersonality = monsPersonality; } else { - species = gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies; - currentPersonality = gTransformedPersonalities[battlerId]; + species = gBattleSpritesDataPtr->battlerData[battler].transformSpecies; + if (B_TRANSFORM_SHINY >= GEN_4) + { + currentPersonality = gTransformedPersonalities[battler]; + } + else + { + currentPersonality = monsPersonality; + } } - isShiny = GetMonData(mon, MON_DATA_IS_SHINY, NULL); - position = GetBattlerPosition(battlerId); - HandleLoadSpecialPokePic(TRUE, gMonSpritesGfxPtr->sprites[position], species, currentPersonality); - - paletteOffset = OBJ_PLTT_ID(battlerId); - if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE) + + position = GetBattlerPosition(battler); + if (GetBattlerSide(battler) == B_SIDE_OPPONENT) + { + HandleLoadSpecialPokePic(TRUE, + gMonSpritesGfxPtr->sprites[position], + species, currentPersonality); + } + else + { + HandleLoadSpecialPokePic(FALSE, + gMonSpritesGfxPtr->sprites[position], + species, currentPersonality); + } + + paletteOffset = OBJ_PLTT_ID(battler); + + if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies == SPECIES_NONE) lzPaletteData = GetMonFrontSpritePal(mon); else - lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(species, isShiny, monsPersonality); - buffer = AllocZeroed(0x400); - LZDecompressWram(lzPaletteData, buffer); - LoadPalette(buffer, paletteOffset, PLTT_SIZE_4BPP); - LoadPalette(buffer, BG_PLTT_ID(8) + BG_PLTT_ID(battlerId), PLTT_SIZE_4BPP); - Free(buffer); + lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(species, isShiny, currentPersonality); + + LZDecompressWram(lzPaletteData, gDecompressionBuffer); + LoadPalette(gDecompressionBuffer, paletteOffset, PLTT_SIZE_4BPP); + LoadPalette(gDecompressionBuffer, BG_PLTT_ID(8) + BG_PLTT_ID(battler), PLTT_SIZE_4BPP); + // transform's pink color - if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) + if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies != SPECIES_NONE) { BlendPalette(paletteOffset, 16, 6, RGB_WHITE); - CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZE_4BPP); + CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZEOF(16)); } -} -void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battlerId) -{ - u32 monsPersonality, currentPersonality; - bool32 isShiny; - u16 species; - u8 position; - u16 paletteOffset; - const void *lzPaletteData; - void *buffer; - - monsPersonality = GetMonData(mon, MON_DATA_PERSONALITY); - if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE) + // dynamax tint + if (IsDynamaxed(battler)) { - species = GetMonData(mon, MON_DATA_SPECIES); - currentPersonality = monsPersonality; - } - else - { - species = gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies; - currentPersonality = gTransformedPersonalities[battlerId]; - } - isShiny = GetMonData(mon, MON_DATA_IS_SHINY, NULL); - position = GetBattlerPosition(battlerId); - HandleLoadSpecialPokePic(FALSE, gMonSpritesGfxPtr->sprites[position], species, currentPersonality); - - paletteOffset = OBJ_PLTT_ID(battlerId); - if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE) - lzPaletteData = GetMonFrontSpritePal(mon); - else - lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(species, isShiny, monsPersonality); - buffer = AllocZeroed(0x400); - LZDecompressWram(lzPaletteData, buffer); - LoadPalette(buffer, paletteOffset, PLTT_SIZE_4BPP); - LoadPalette(buffer, BG_PLTT_ID(8) + BG_PLTT_ID(battlerId), PLTT_SIZE_4BPP); - Free(buffer); - // transform's pink color - if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) - { - BlendPalette(paletteOffset, 16, 6, RGB_WHITE); - CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZE_4BPP); + // Calyrex and its forms have a blue dynamax aura instead of red. + if (GET_BASE_SPECIES_ID(species) == SPECIES_CALYREX) + BlendPalette(paletteOffset, 16, 4, RGB(12, 0, 31)); + else + BlendPalette(paletteOffset, 16, 4, RGB(31, 0, 12)); + CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, PLTT_SIZEOF(16)); } } @@ -732,9 +720,9 @@ void BattleLoadSubstituteOrMonSpriteGfx(u8 battlerId, bool8 loadMonSprite) else { if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) - BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); + BattleLoadMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); else - BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battlerId]], battlerId); + BattleLoadMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battlerId]], battlerId); } } diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c index 124b6468a..7ff849ee9 100644 --- a/src/reshow_battle_screen.c +++ b/src/reshow_battle_screen.c @@ -197,7 +197,7 @@ static bool8 LoadBattlerSpriteGfx(u8 battler) if (IS_BATTLE_TYPE_GHOST_WITHOUT_SCOPE(gBattleTypeFlags)) DecompressGhostFrontPic(&gEnemyParty[gBattlerPartyIndexes[battler]], battler); else if (!gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) - BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battler]], battler); + BattleLoadMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battler]], battler); else BattleLoadSubstituteOrMonSpriteGfx(battler, FALSE); } @@ -206,7 +206,7 @@ static bool8 LoadBattlerSpriteGfx(u8 battler) else if (gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL && battler == B_POSITION_PLAYER_LEFT) // Should be checking position, not battler. DecompressTrainerBackPalette(TRAINER_BACK_PIC_OLD_MAN, battler); else if (!gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) - BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler); + BattleLoadMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler); else BattleLoadSubstituteOrMonSpriteGfx(battler, FALSE); gBattleScripting.reshowHelperState = 0;