diff options
author | DizzyEggg <jajkodizzy@wp.pl> | 2017-10-09 18:18:40 +0200 |
---|---|---|
committer | DizzyEggg <jajkodizzy@wp.pl> | 2017-10-09 18:18:40 +0200 |
commit | ab03b03c4bb872af131a9c52ef285c488b8e4865 (patch) | |
tree | 6fdb26cd12c2847401cf0af40192d48bffcc2c79 /src | |
parent | 96c5966ff3676eb1b3463808b83b42e13e1591fd (diff) |
decompile reshow battle screen
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_2.c | 4 | ||||
-rw-r--r-- | src/battle_dome_cards.c | 4 | ||||
-rw-r--r-- | src/pokemon_2.c | 6 | ||||
-rw-r--r-- | src/reshow_battle_screen.c | 365 |
4 files changed, 372 insertions, 7 deletions
diff --git a/src/battle_2.c b/src/battle_2.c index fd7cf6863..13b483ba0 100644 --- a/src/battle_2.c +++ b/src/battle_2.c @@ -219,7 +219,7 @@ extern void sub_81B9150(void); extern void sub_800AC34(void); extern void sub_80B3AF8(u8 taskId); // cable club extern void sub_8076918(u8 bank); -extern void sub_80729D0(u8 healthoxSpriteId); +extern void SetHealthboxSpriteVisible(u8 healthoxSpriteId); extern void sub_81A56B4(void); // battle frontier 2 extern u8 sub_81A9E28(void); // battle frontier 2 extern void sub_81A56E8(u8 bank); // battle frontier 2 @@ -2441,7 +2441,7 @@ static void sub_8039838(struct Sprite *sprite) if (sprite->animEnded) { sub_8076918(sprite->tBank); - sub_80729D0(gHealthBoxesIds[sprite->tBank]); + SetHealthboxSpriteVisible(gHealthBoxesIds[sprite->tBank]); sprite->callback = sub_8039894; StartSpriteAnimIfDifferent(sprite, 0); BeginNormalPaletteFade(0x20000, 0, 10, 0, 0x2108); diff --git a/src/battle_dome_cards.c b/src/battle_dome_cards.c index c0557ac70..5251ee06a 100644 --- a/src/battle_dome_cards.c +++ b/src/battle_dome_cards.c @@ -17,7 +17,7 @@ extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[]; extern const union AffineAnimCmd *const gUnknown_082FF618[]; extern const union AffineAnimCmd *const gUnknown_082FF694[]; extern const union AnimCmd *const gUnknown_082FF70C[]; -extern const union AnimCmd *const *const gUnknown_08309AAC[NUM_SPECIES]; +extern const union AnimCmd *const *const gMonAnimationsSpriteAnimsPtrTable[NUM_SPECIES]; extern const union AnimCmd *const *const gUnknown_0830536C[]; extern const u8 gUnknown_0831F578[]; @@ -282,7 +282,7 @@ u16 sub_818D3E4(u16 species, u32 otId, u32 personality, u8 flags, s16 x, s16 y, images[j].size = 0x800; } gUnknown_0203CCEC.tileTag = 0xFFFF; - gUnknown_0203CCEC.anims = gUnknown_08309AAC[species]; + gUnknown_0203CCEC.anims = gMonAnimationsSpriteAnimsPtrTable[species]; gUnknown_0203CCEC.images = images; if (flags2 == 0x01) { diff --git a/src/pokemon_2.c b/src/pokemon_2.c index 8a16954a7..ee54f0e4d 100644 --- a/src/pokemon_2.c +++ b/src/pokemon_2.c @@ -28,7 +28,7 @@ extern const u32 gBitTable[]; extern const struct SpriteTemplate gUnknown_08329D98[]; extern const struct SpriteTemplate gUnknown_08329DF8[]; extern const union AnimCmd* gUnknown_082FF70C[]; -extern const union AnimCmd* const * const gUnknown_08309AAC[]; +extern const union AnimCmd* const * const gMonAnimationsSpriteAnimsPtrTable[]; extern const union AnimCmd* const * const gUnknown_08305D0C[]; extern const union AnimCmd* const * const gUnknown_0830536C[]; extern const u8 gText_BadEgg[]; @@ -165,9 +165,9 @@ void sub_806A068(u16 species, u8 bankIdentity) if (bankIdentity == 0 || bankIdentity == 2) gUnknown_0202499C.anims = gUnknown_082FF70C; else if (species > 500) - gUnknown_0202499C.anims = gUnknown_08309AAC[species - 500]; + gUnknown_0202499C.anims = gMonAnimationsSpriteAnimsPtrTable[species - 500]; else - gUnknown_0202499C.anims = gUnknown_08309AAC[species]; + gUnknown_0202499C.anims = gMonAnimationsSpriteAnimsPtrTable[species]; } void sub_806A12C(u16 trainerSpriteId, u8 bankIdentity) diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c new file mode 100644 index 000000000..1c13448d4 --- /dev/null +++ b/src/reshow_battle_screen.c @@ -0,0 +1,365 @@ +#include "global.h" +#include "reshow_battle_screen.h" +#include "battle.h" +#include "palette.h" +#include "main.h" +#include "unknown_task.h" +#include "text.h" +#include "gpu_regs.h" +#include "bg.h" +#include "battle_controllers.h" +#include "link.h" +#include "sprite.h" +#include "species.h" +#include "battle_interface.h" + +extern u16 gBattle_BG0_X; +extern u16 gBattle_BG0_Y; +extern u16 gBattle_BG1_X; +extern u16 gBattle_BG1_Y; +extern u16 gBattle_BG2_X; +extern u16 gBattle_BG2_Y; +extern u16 gBattle_BG3_X; +extern u16 gBattle_BG3_Y; +extern u8 gReservedSpritePaletteCount; +extern u8 gActionSelectionCursor[BATTLE_BANKS_COUNT]; +extern u8 gBankInMenu; +extern u16 gBattlePartyID[BATTLE_BANKS_COUNT]; +extern u8 gNoOfAllBanks; +extern u32 gBattleTypeFlags; +extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT]; +extern u8 gBattleMonForms[BATTLE_BANKS_COUNT]; +extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT]; +extern struct SpriteTemplate gUnknown_0202499C; + +extern const union AnimCmd * const * const gMonAnimationsSpriteAnimsPtrTable[]; + +extern void dp12_8087EA4(void); +extern void trs_config(void); +extern bool8 IsDoubleBattle(void); +extern u8 sub_80A614C(u8 bank); +extern u8 sub_80A6138(u8 bank); +extern u8 sub_80A82E4(u8 bank); +extern void sub_806A068(u16 species, u8 bankIdentity); +extern void sub_806A12C(u16 backPicId, u8 bankIdentity); +extern u8 sub_80A5C6C(u8 bank, u8 caseId); + +// this file's functions +static void CB2_ReshowBattleScreenAfterMenu(void); +static bool8 LoadBankSpriteGfx(u8 bank); +static void CreateBankSprite(u8 bank); +static void CreateHealthboxSprite(u8 bank); +static void sub_80A95F4(void); + +void nullsub_35(void) +{ + +} + +void ReshowBattleScreenAfterMenu(void) +{ + gPaletteFade.bufferTransferDisabled = 1; + SetHBlankCallback(NULL); + SetVBlankCallback(NULL); + SetGpuReg(REG_OFFSET_MOSAIC, 0); + gBattleScripting.reshowMainState = 0; + gBattleScripting.reshowHelperState = 0; + SetMainCallback2(CB2_ReshowBattleScreenAfterMenu); +} + +static void CB2_ReshowBattleScreenAfterMenu(void) +{ + switch (gBattleScripting.reshowMainState) + { + case 0: + dp12_8087EA4(); + trs_config(); + SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 0); + SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 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 1: + CpuFastFill(0, (void*)(VRAM), VRAM_SIZE); + break; + case 2: + LoadBattleTextboxAndBackground(); + break; + case 3: + ResetSpriteData(); + break; + case 4: + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 4; + break; + case 5: + sub_805E350(); + break; + case 6: + if (BattleLoadAllHealthBoxesGfx(gBattleScripting.reshowHelperState)) + { + gBattleScripting.reshowHelperState = 0; + } + else + { + gBattleScripting.reshowHelperState++; + gBattleScripting.reshowMainState--; + } + break; + case 7: + if (!LoadBankSpriteGfx(0)) + gBattleScripting.reshowMainState--; + break; + case 8: + if (!LoadBankSpriteGfx(1)) + gBattleScripting.reshowMainState--; + break; + case 9: + if (!LoadBankSpriteGfx(2)) + gBattleScripting.reshowMainState--; + break; + case 10: + if (!LoadBankSpriteGfx(3)) + gBattleScripting.reshowMainState--; + break; + case 11: + CreateBankSprite(0); + break; + case 12: + CreateBankSprite(1); + break; + case 13: + CreateBankSprite(2); + break; + case 14: + CreateBankSprite(3); + break; + case 15: + CreateHealthboxSprite(0); + break; + case 16: + CreateHealthboxSprite(1); + break; + case 17: + CreateHealthboxSprite(2); + break; + case 18: + CreateHealthboxSprite(3); + break; + case 19: + { + u8 opponentBank; + u16 species; + + LoadAndCreateEnemyShadowSprites(); + + opponentBank = GetBankByIdentity(IDENTITY_OPPONENT_MON1); + species = GetMonData(&gEnemyParty[gBattlePartyID[opponentBank]], MON_DATA_SPECIES); + SetBankEnemyShadowSpriteCallback(opponentBank, species); + + if (IsDoubleBattle()) + { + opponentBank = GetBankByIdentity(IDENTITY_OPPONENT_MON2); + species = GetMonData(&gEnemyParty[gBattlePartyID[opponentBank]], MON_DATA_SPECIES); + SetBankEnemyShadowSpriteCallback(opponentBank, species); + } + + ActionSelectionCreateCursorAt(gActionSelectionCursor[gBankInMenu], 0); + + if (gLinkVSyncDisabled != 0 && gReceivedRemoteLinkPlayers != 0) + { + sub_800E0E8(); + sub_800DFB4(0, 0); + } + } + break; + default: + SetVBlankCallback(VBlankCB_Battle); + sub_80A95F4(); + BeginHardwarePaletteFade(0xFF, 0, 0x10, 0, 1); + gPaletteFade.bufferTransferDisabled = 0; + SetMainCallback2(BattleMainCB2); + sub_805EF14(); + break; + } + + gBattleScripting.reshowMainState++; +} + +// todo: find a better place for the struct declaration +struct BGCntrlBitfield +{ + volatile u16 priority:2; + volatile u16 charBaseBlock:2; + volatile u16 field_0_2:4; + volatile u16 field_1_0:5; + volatile u16 areaOverflowMode:1; + volatile u16 screenSize:2; +}; + +static void sub_80A95F4(void) +{ + struct BGCntrlBitfield *regBgcnt1, *regBgcnt2; + + regBgcnt1 = (struct BGCntrlBitfield *)(®_BG1CNT); + regBgcnt1->charBaseBlock = 0; + + regBgcnt2 = (struct BGCntrlBitfield *)(®_BG2CNT); + regBgcnt2->charBaseBlock = 0; +} + +static bool8 LoadBankSpriteGfx(u8 bank) +{ + if (bank < gNoOfAllBanks) + { + if (GetBankSide(bank) != SIDE_PLAYER) + { + if (!gBattleSpritesDataPtr->bankData[bank].behindSubstitute) + BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlePartyID[bank]], bank); + else + BattleLoadSubstituteSpriteGfx(bank, FALSE); + } + else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0) + LoadBackTrainerBankSpriteGfx(gSaveBlock2Ptr->playerGender, bank); + else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0) + LoadBackTrainerBankSpriteGfx(BACK_PIC_WALLY, bank); + else if (!gBattleSpritesDataPtr->bankData[bank].behindSubstitute) + BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlePartyID[bank]], bank); + else + BattleLoadSubstituteSpriteGfx(bank, FALSE); + + gBattleScripting.reshowHelperState = 0; + } + return TRUE; +} + +// todo: get rid of it once the struct is declared in a header +struct MonCoords +{ + // This would use a bitfield, but sub_8079F44 + // uses it as a u8 and casting won't match. + u8 coords; // u8 x:4, y:4; + u8 y_offset; +}; +extern const struct MonCoords gTrainerBackPicCoords[]; + +static void CreateBankSprite(u8 bank) +{ + if (bank < gNoOfAllBanks) + { + u8 posY; + + if (gBattleSpritesDataPtr->bankData[bank].behindSubstitute) + posY = sub_80A614C(bank); + else + posY = sub_80A6138(bank); + + if (GetBankSide(bank) != SIDE_PLAYER) + { + if (GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_HP) == 0) + return; + + sub_806A068(GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES), GetBankIdentity(bank)); + gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, sub_80A5C6C(bank, 2), posY, sub_80A82E4(bank)); + gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; + gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; + gSprites[gBankSpriteIds[bank]].data0 = bank; + gSprites[gBankSpriteIds[bank]].data2 = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES); + + StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]); + if (gBattleSpritesDataPtr->bankData[bank].transformSpecies == SPECIES_CASTFORM) + gSprites[gBankSpriteIds[bank]].anims = gMonAnimationsSpriteAnimsPtrTable[SPECIES_CASTFORM]; + } + else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0) + { + sub_806A12C(gSaveBlock2Ptr->playerGender, GetBankIdentity(IDENTITY_PLAYER_MON1)); + gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, 0x50, + (8 - gTrainerBackPicCoords[gSaveBlock2Ptr->playerGender].coords) * 4 + 80, + sub_80A82E4(0)); + gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; + gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; + gSprites[gBankSpriteIds[bank]].data0 = bank; + } + else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0) + { + sub_806A12C(BACK_PIC_WALLY, GetBankIdentity(0)); + gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, 0x50, + (8 - gTrainerBackPicCoords[BACK_PIC_WALLY].coords) * 4 + 80, + sub_80A82E4(0)); + gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; + gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; + gSprites[gBankSpriteIds[bank]].data0 = bank; + } + else + { + if (GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_HP) == 0) + return; + + sub_806A068(GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES), GetBankIdentity(bank)); + gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, sub_80A5C6C(bank, 2), posY, sub_80A82E4(bank)); + gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank; + gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy; + gSprites[gBankSpriteIds[bank]].data0 = bank; + gSprites[gBankSpriteIds[bank]].data2 = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES); + + StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]); + if (gBattleSpritesDataPtr->bankData[bank].transformSpecies == SPECIES_CASTFORM) + gSprites[gBankSpriteIds[bank]].anims = gMonAnimationsSpriteAnimsPtrTable[SPECIES_CASTFORM]; + } + + gSprites[gBankSpriteIds[bank]].invisible = gBattleSpritesDataPtr->bankData[bank].invisible; + } +} + +static void CreateHealthboxSprite(u8 bank) +{ + if (bank < gNoOfAllBanks) + { + u8 healthboxSpriteId; + + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0) + healthboxSpriteId = CreateSafariPlayerHealthboxSprites(); + else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0) + return; + else + healthboxSpriteId = CreateBankHealthboxSprites(bank); + + gHealthBoxesIds[bank] = healthboxSpriteId; + SetBankHealthboxSpritePos(bank); + SetHealthboxSpriteVisible(healthboxSpriteId); + + if (GetBankSide(bank) != SIDE_PLAYER) + UpdateHealthboxAttribute(gHealthBoxesIds[bank], &gEnemyParty[gBattlePartyID[bank]], HEALTHBOX_ALL); + else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + UpdateHealthboxAttribute(gHealthBoxesIds[bank], &gPlayerParty[gBattlePartyID[bank]], HEALTHBOX_SAFARI_ALL_TEXT); + else + UpdateHealthboxAttribute(gHealthBoxesIds[bank], &gPlayerParty[gBattlePartyID[bank]], HEALTHBOX_ALL); + + if (GetBankIdentity(bank) == IDENTITY_OPPONENT_MON2 || GetBankIdentity(bank) == IDENTITY_PLAYER_MON2) + nullsub_30(gHealthBoxesIds[bank], TRUE); + else + nullsub_30(gHealthBoxesIds[bank], FALSE); + + if (GetBankSide(bank) != SIDE_PLAYER) + { + if (GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_HP) == 0) + SetHealthboxSpriteInvisible(healthboxSpriteId); + } + else if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) + { + if (GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_HP) == 0) + SetHealthboxSpriteInvisible(healthboxSpriteId); + } + } +} |