summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjiangzhengwenjz <jiangzhengwenjzw@qq.com>2019-08-02 07:28:09 +0800
committerjiangzhengwenjz <jiangzhengwenjzw@qq.com>2019-08-02 07:28:09 +0800
commit742a7ee1beab323e30d60c599697a2a831c4f4de (patch)
tree0398c32de72a880fae0223d017fa3ab814e9c472 /src
parentc2964e818143757ca5586b1a811669a1c287e870 (diff)
ported reshow_battle_screen from pokeem
Diffstat (limited to 'src')
-rw-r--r--src/battle_controller_safari.c2
-rw-r--r--src/battle_gfx_sfx_util.c6
-rw-r--r--src/reshow_battle_screen.c322
3 files changed, 326 insertions, 4 deletions
diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c
index b3c6ab2e5..1e2fe6ee0 100644
--- a/src/battle_controller_safari.c
+++ b/src/battle_controller_safari.c
@@ -347,7 +347,7 @@ static void SafariHandleReturnMonToBall(void)
static void SafariHandleDrawTrainerPic(void)
{
- sub_8034750(gSaveBlock2Ptr->playerGender, gActiveBattler);
+ DecompressTrainerBackPalette(gSaveBlock2Ptr->playerGender, gActiveBattler);
SetMultiuseSpriteTemplateToTrainerBack(gSaveBlock2Ptr->playerGender, GetBattlerPosition(gActiveBattler));
gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate,
80,
diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c
index ba691801f..3789b04c2 100644
--- a/src/battle_gfx_sfx_util.c
+++ b/src/battle_gfx_sfx_util.c
@@ -420,7 +420,7 @@ void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battlerId)
}
}
-void DecompressGhostFrontPic(u16 frontPicId, u8 battlerId)
+void DecompressGhostFrontPic(struct Pokemon *unused, u8 battlerId)
{
u16 palOffset;
void *buffer;
@@ -448,9 +448,9 @@ void DecompressTrainerFrontPic(u16 frontPicId, u8 battlerId)
LoadCompressedSpritePaletteUsingHeap(&gTrainerFrontPicPaletteTable[frontPicId]);
}
-void sub_8034750(u16 a1, u8 a2)
+void DecompressTrainerBackPalette(u16 index, u8 palette)
{
- LoadCompressedPalette(gUnknown_8239FD4[a1].data, (a2 + 16) * 16, 0x20);
+ LoadCompressedPalette(gUnknown_8239FD4[index].data, (palette + 16) * 16, 0x20);
}
void nullsub_16(u8 a1)
diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c
new file mode 100644
index 000000000..c75e8c583
--- /dev/null
+++ b/src/reshow_battle_screen.c
@@ -0,0 +1,322 @@
+#include "global.h"
+#include "bg.h"
+#include "palette.h"
+#include "pokemon.h"
+#include "main.h"
+#include "link.h"
+#include "data2.h"
+#include "sprite.h"
+#include "text.h"
+#include "gpu_regs.h"
+#include "scanline_effect.h"
+#include "help_system.h"
+#include "battle.h"
+#include "battle_interface.h"
+#include "battle_anim.h"
+#include "battle_controllers.h"
+#include "reshow_battle_screen.h"
+#include "constants/species.h"
+
+static void CB2_ReshowBattleScreenAfterMenu(void);
+static void sub_8077AAC(void);
+static bool8 LoadBattlerSpriteGfx(u8 battlerId);
+static void CreateBattlerSprite(u8 battlerId);
+static void CreateHealthboxSprite(u8 battlerId);
+
+void nullsub_44(void)
+{
+}
+
+void ReshowBattleScreenAfterMenu(void)
+{
+ gPaletteFade.bufferTransferDisabled = 1;
+ SetHBlankCallback(NULL);
+ SetGpuReg(REG_OFFSET_MOSAIC, 0);
+ gBattleScripting.reshowMainState = 0;
+ gBattleScripting.reshowHelperState = 0;
+ if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ HelpSystem_SetSomeVariable2(0x19);
+ else
+ HelpSystem_SetSomeVariable2(0x18);
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
+ {
+ HelpSystem_SetSomeVariable2(0x1A);
+ }
+ else
+ {
+ HelpSystem_SetSomeVariable2(0x17);
+ }
+ }
+ SetMainCallback2(CB2_ReshowBattleScreenAfterMenu);
+}
+
+static void CB2_ReshowBattleScreenAfterMenu(void)
+{
+ u8 opponentBattler;
+ u16 species;
+
+ switch (gBattleScripting.reshowMainState)
+ {
+ case 0:
+ ResetSpriteData();
+ break;
+ case 1:
+ SetVBlankCallback(NULL);
+ ScanlineEffect_Clear();
+ sub_800F324();
+ SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);
+ SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+ ResetPaletteFade();
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ gBattle_BG2_X = 0;
+ gBattle_BG2_Y = 0;
+ gBattle_BG3_X = 0;
+ gBattle_BG3_Y = 0;
+ break;
+ case 2:
+ CpuFastFill(0, (void *)VRAM, VRAM_SIZE);
+ break;
+ case 3:
+ LoadBattleTextboxAndBackground();
+ break;
+ case 4:
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 4;
+ break;
+ case 5:
+ ClearSpritesHealthboxAnimData();
+ break;
+ case 6:
+ if (BattleLoadAllHealthBoxesGfx(gBattleScripting.reshowHelperState))
+ {
+ gBattleScripting.reshowHelperState = 0;
+ }
+ else
+ {
+ ++gBattleScripting.reshowHelperState;
+ --gBattleScripting.reshowMainState;
+ }
+ break;
+ case 7:
+ if (!LoadBattlerSpriteGfx(0))
+ --gBattleScripting.reshowMainState;
+ break;
+ case 8:
+ if (!LoadBattlerSpriteGfx(1))
+ --gBattleScripting.reshowMainState;
+ break;
+ case 9:
+ if (!LoadBattlerSpriteGfx(2))
+ --gBattleScripting.reshowMainState;
+ break;
+ case 0xA:
+ if (!LoadBattlerSpriteGfx(3))
+ --gBattleScripting.reshowMainState;
+ break;
+ case 0xB:
+ CreateBattlerSprite(0);
+ break;
+ case 0xC:
+ CreateBattlerSprite(1);
+ break;
+ case 0xD:
+ CreateBattlerSprite(2);
+ break;
+ case 0xE:
+ CreateBattlerSprite(3);
+ break;
+ case 0xF:
+ CreateHealthboxSprite(0);
+ break;
+ case 0x10:
+ CreateHealthboxSprite(1);
+ break;
+ case 0x11:
+ CreateHealthboxSprite(2);
+ break;
+ case 0x12:
+ CreateHealthboxSprite(3);
+ break;
+ case 0x13:
+ LoadAndCreateEnemyShadowSprites();
+ opponentBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
+ species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[opponentBattler]], MON_DATA_SPECIES);
+ SetBattlerShadowSpriteCallback(opponentBattler, species);
+ if (IsDoubleBattle())
+ {
+ opponentBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
+ species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[opponentBattler]], MON_DATA_SPECIES);
+ SetBattlerShadowSpriteCallback(opponentBattler, species);
+ }
+ ActionSelectionCreateCursorAt(gActionSelectionCursor[gBattlerInMenuId], 0);
+ if (gWirelessCommType && gReceivedRemoteLinkPlayers)
+ {
+ LoadWirelessStatusIndicatorSpriteGfx();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ }
+ break;
+ case 0x14:
+ SetVBlankCallback(VBlankCB_Battle);
+ sub_8077AAC();
+ BeginHardwarePaletteFade(0xFF, 0, 0x10, 0, 1);
+ gPaletteFade.bufferTransferDisabled = 0;
+ SetMainCallback2(BattleMainCB2);
+ sub_80357C8();
+ break;
+ default:
+ break;
+ }
+ ++gBattleScripting.reshowMainState;
+}
+
+static void sub_8077AAC(void)
+{
+ EnableInterrupts(INTR_FLAG_VBLANK);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_WININ, 0x3F);
+ SetGpuReg(REG_OFFSET_WINOUT, 0x3F);
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WIN1H, 0);
+ SetGpuReg(REG_OFFSET_WIN1V, 0);
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_OBJWIN_ON);
+}
+
+static bool8 LoadBattlerSpriteGfx(u8 battler)
+{
+ if (battler < gBattlersCount)
+ {
+ if (GetBattlerSide(battler) != B_SIDE_PLAYER)
+ {
+ if ((gBattleTypeFlags & (BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_GHOST)) == BATTLE_TYPE_GHOST)
+ DecompressGhostFrontPic(&gEnemyParty[gBattlerPartyIndexes[battler]], battler);
+ else if (!gBattleSpritesDataPtr->battlerData[battler].behindSubstitute)
+ BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battler]], battler);
+ else
+ BattleLoadSubstituteOrMonSpriteGfx(battler, FALSE);
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == B_POSITION_PLAYER_LEFT) // Should be checking position, not battler.
+ DecompressTrainerBackPalette(gSaveBlock2Ptr->playerGender, battler);
+ else if (gBattleTypeFlags & BATTLE_TYPE_OLDMAN_TUTORIAL && battler == B_POSITION_PLAYER_LEFT) // Should be checking position, not battler.
+ DecompressTrainerBackPalette(5, battler);
+ else if (!gBattleSpritesDataPtr->battlerData[battler].behindSubstitute)
+ BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler);
+ else
+ BattleLoadSubstituteOrMonSpriteGfx(battler, FALSE);
+ gBattleScripting.reshowHelperState = 0;
+ }
+ return TRUE;
+}
+
+static void CreateBattlerSprite(u8 battler)
+{
+ if (battler < gBattlersCount)
+ {
+ u8 posY;
+
+ if ((gBattleTypeFlags & (BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_GHOST)) == BATTLE_TYPE_GHOST)
+ posY = GetGhostSpriteDefault_Y(battler);
+ else if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute)
+ posY = GetSubstituteSpriteDefault_Y(battler);
+ else
+ posY = GetBattlerSpriteDefault_Y(battler);
+ if (GetBattlerSide(battler) != B_SIDE_PLAYER)
+ {
+ if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0)
+ return;
+ SetMultiuseSpriteTemplateToPokemon(GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), GetBattlerPosition(battler));
+ gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battler, 2), posY, GetBattlerSpriteSubpriority(battler));
+ gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler;
+ gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy;
+ gSprites[gBattlerSpriteIds[battler]].data[0] = battler;
+ gSprites[gBattlerSpriteIds[battler]].data[2] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], gBattleMonForms[battler]);
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == B_POSITION_PLAYER_LEFT)
+ {
+ SetMultiuseSpriteTemplateToTrainerBack(gSaveBlock2Ptr->playerGender, GetBattlerPosition(B_POSITION_PLAYER_LEFT));
+ gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, 0x50,
+ (8 - gTrainerBackPicCoords[gSaveBlock2Ptr->playerGender].size) * 4 + 80,
+ GetBattlerSpriteSubpriority(0));
+ gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler;
+ gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy;
+ gSprites[gBattlerSpriteIds[battler]].data[0] = battler;
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_OLDMAN_TUTORIAL && battler == B_POSITION_PLAYER_LEFT)
+ {
+ SetMultiuseSpriteTemplateToTrainerBack(5, GetBattlerPosition(0));
+ gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, 0x50,
+ (8 - gTrainerBackPicCoords[5].size) * 4 + 80,
+ GetBattlerSpriteSubpriority(0));
+ gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler;
+ gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy;
+ gSprites[gBattlerSpriteIds[battler]].data[0] = battler;
+ }
+ else if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0)
+ {
+ return;
+ }
+ else
+ {
+ SetMultiuseSpriteTemplateToPokemon(GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), GetBattlerPosition(battler));
+ gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battler, 2), posY, GetBattlerSpriteSubpriority(battler));
+ gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler;
+ gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy;
+ gSprites[gBattlerSpriteIds[battler]].data[0] = battler;
+ gSprites[gBattlerSpriteIds[battler]].data[2] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES);
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], gBattleMonForms[battler]);
+ }
+ gSprites[gBattlerSpriteIds[battler]].invisible = gBattleSpritesDataPtr->battlerData[battler].invisible;
+ }
+}
+
+static void CreateHealthboxSprite(u8 battler)
+{
+ if (battler < gBattlersCount)
+ {
+ u8 healthboxSpriteId;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == B_POSITION_PLAYER_LEFT)
+ healthboxSpriteId = CreateSafariPlayerHealthboxSprites();
+ else if (gBattleTypeFlags & BATTLE_TYPE_OLDMAN_TUTORIAL && battler == B_POSITION_PLAYER_LEFT)
+ return;
+ else
+ healthboxSpriteId = CreateBattlerHealthboxSprites(battler);
+ gHealthboxSpriteIds[battler] = healthboxSpriteId;
+ InitBattlerHealthboxCoords(battler);
+ SetHealthboxSpriteVisible(healthboxSpriteId);
+ if (GetBattlerSide(battler) != B_SIDE_PLAYER)
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], &gEnemyParty[gBattlerPartyIndexes[battler]], HEALTHBOX_ALL);
+ else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], &gPlayerParty[gBattlerPartyIndexes[battler]], HEALTHBOX_SAFARI_ALL_TEXT);
+ else
+ UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], &gPlayerParty[gBattlerPartyIndexes[battler]], HEALTHBOX_ALL);
+ if (GetBattlerPosition(battler) == B_POSITION_OPPONENT_RIGHT || GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT)
+ DummyBattleInterfaceFunc(gHealthboxSpriteIds[battler], TRUE);
+ else
+ DummyBattleInterfaceFunc(gHealthboxSpriteIds[battler], FALSE);
+ if (GetBattlerSide(battler) != B_SIDE_PLAYER)
+ {
+ if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0)
+ SetHealthboxSpriteInvisible(healthboxSpriteId);
+ }
+ else if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI) && GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0)
+ {
+ SetHealthboxSpriteInvisible(healthboxSpriteId);
+ }
+ }
+}