From 9ac913c5270c7cc5fc245c2cce6b9e64e848f7e9 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 23 Aug 2017 19:36:25 +0200 Subject: start working on reshow battle screen --- src/reshow_battle_screen.c | 262 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 262 insertions(+) create mode 100644 src/reshow_battle_screen.c (limited to 'src/reshow_battle_screen.c') diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c new file mode 100644 index 000000000..6643ba4b2 --- /dev/null +++ b/src/reshow_battle_screen.c @@ -0,0 +1,262 @@ +#include "global.h" +#include "battle.h" +#include "palette.h" +#include "main.h" +#include "unknown_task.h" +#include "text.h" +#include "rom_8077ABC.h" + +extern struct Window gUnknown_03004210; +extern u16 gUnknown_03004280; +extern u16 gUnknown_03004288; +extern u16 gUnknown_030042A4; +extern u16 gUnknown_030042C0; +extern u16 gUnknown_030041B0; +extern u16 gUnknown_030041B4; +extern u16 gUnknown_030041B8; +extern u16 gUnknown_030042A0; +extern u8 gReservedSpritePaletteCount; +extern u8 gActionSelectionCursor[4]; +extern u8 gBankInMenu; +extern u16 gBattlePartyID[4]; +extern u8 gNoOfAllBanks; +extern u16 gBattleTypeFlags; +extern u8 gObjectBankIDs[4]; + +bool8 sub_800E414(u8 a0); +bool8 sub_8031C30(u8 a0); +void sub_8031EE8(void); +void sub_80327CC(void); +void sub_8032984(u8 a, u16 b); +void sub_800FCD4(void); +void BattleLoadOpponentMonSprite(struct Pokemon *, u8 bank); +void BattleLoadPlayerMonSprite(struct Pokemon *, u8 bank); +void BattleLoadSubstituteSprite(u8 bank, u8 b); +void LoadPlayerTrainerBankSprite(u16 a0, u8 bank); +u8 sub_8077F7C(u8 bank); +u8 sub_8077F68(u8 bank); + +// this file's functions +static void CB2_ReshowBattleScreenAfterMenu(void); +static bool8 LoadAppropiateBankSprite(u8 bank); +void sub_807B184(u8 bank); +void sub_807B508(u8 bank); +void sub_807B06C(void); + +#define RESHOW_STATE 0x1FFFF +#define HELPER_STATE 0x1FFFE + +struct BGCNT +{ + u16 priority : 2; + u16 charBaseBlock : 2; + u16 reserved : 2; + u16 mosaic : 1; + u16 colors : 1; + u16 screenBaseBlock : 5; + u16 screenSize : 2; +}; + +void nullsub_14(void) +{ + +} + +void ReshowBattleScreenAfterMenu(void) +{ + gPaletteFade.bufferTransferDisabled = 1; + SetHBlankCallback(0); + SetVBlankCallback(0); + REG_MOSAIC = 0; + ewram[RESHOW_STATE] = 0; + ewram[HELPER_STATE] = 0; + SetMainCallback2(CB2_ReshowBattleScreenAfterMenu); +} + +static void CB2_ReshowBattleScreenAfterMenu(void) +{ + switch (ewram[RESHOW_STATE]) + { + case 0: + dp12_8087EA4(); + SetUpWindowConfig(&gWindowConfig_81E6C58); + ResetPaletteFade(); + InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58); + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 0; + gUnknown_030042C0 = 0; + gUnknown_030041B4 = 0; + gUnknown_03004288 = 0; + gUnknown_03004280 = 0; + gUnknown_030041B0 = 0; + gUnknown_030041B8 = 0; + break; + case 1: + { + const u32 zero = 0; + CpuFastSet(&zero, (void*) VRAM, 0x1006000); + } + break; + case 2: + if (!sub_800E414(ewram[HELPER_STATE])) + { + ewram[HELPER_STATE]++; + ewram[RESHOW_STATE]--; + } + else + ewram[HELPER_STATE] = 0; + break; + case 3: + ResetSpriteData(); + break; + case 4: + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 4; + break; + case 5: + sub_8031EE8(); + break; + case 6: + if (sub_8031C30(ewram[HELPER_STATE])) + ewram[HELPER_STATE] = 0; + else + { + ewram[HELPER_STATE]++; + ewram[RESHOW_STATE]--; + } + break; + case 7: + if (!LoadAppropiateBankSprite(0)) + ewram[RESHOW_STATE]--; + break; + case 8: + if (!LoadAppropiateBankSprite(1)) + ewram[RESHOW_STATE]--; + break; + case 9: + if (!LoadAppropiateBankSprite(2)) + ewram[RESHOW_STATE]--; + break; + case 10: + if (!LoadAppropiateBankSprite(3)) + ewram[RESHOW_STATE]--; + break; + case 11: + sub_807B184(0); + break; + case 12: + sub_807B184(1); + break; + case 13: + sub_807B184(2); + break; + case 14: + sub_807B184(3); + break; + case 15: + sub_807B508(0); + break; + case 16: + sub_807B508(1); + break; + case 17: + sub_807B508(2); + break; + case 18: + sub_807B508(3); + break; + case 19: + { + u8 opponentBank; + u16 species; + + sub_80327CC(); + + opponentBank = GetBankByPlayerAI(1); + species = GetMonData(&gEnemyParty[gBattlePartyID[opponentBank]], MON_DATA_SPECIES); + sub_8032984(opponentBank, species); + + if (IsDoubleBattle()) + { + opponentBank = GetBankByPlayerAI(3); + species = GetMonData(&gEnemyParty[gBattlePartyID[opponentBank]], MON_DATA_SPECIES); + sub_8032984(opponentBank, species); + } + sub_802E3E4(gActionSelectionCursor[gBankInMenu], 0); + } + break; + default: + SetHBlankCallback(sub_800FCD4); + SetVBlankCallback(sub_800FCFC); + sub_807B06C(); + BeginHardwarePaletteFade(0xFF, 0, 0x10, 0, 1); + gPaletteFade.bufferTransferDisabled = 0; + SetMainCallback2(sub_800F808); + break; + } + ewram[RESHOW_STATE]++; +} + +void sub_807B06C(void) +{ + struct BGCNT *regBgcnt1, *regBgcnt2; + + sub_800D6D4(); + + regBgcnt1 = (void*)(®_BG1CNT); + regBgcnt1->charBaseBlock = 0; + + regBgcnt2 = (void*)(®_BG2CNT); + regBgcnt2->charBaseBlock = 0; +} + +static bool8 LoadAppropiateBankSprite(u8 bank) +{ + if (bank < gNoOfAllBanks) + { + if (GetBankSide(bank)) + { + if (!ewram17800[bank].substituteSprite) + BattleLoadOpponentMonSprite(&gEnemyParty[gBattlePartyID[bank]], bank); + else + BattleLoadSubstituteSprite(bank, 0); + } + else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0) + LoadPlayerTrainerBankSprite(gSaveBlock2.playerGender, 0); + else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0) + LoadPlayerTrainerBankSprite(2, 0); + else if (!ewram17800[bank].substituteSprite) + BattleLoadPlayerMonSprite(&gPlayerParty[gBattlePartyID[bank]], bank); + else + BattleLoadSubstituteSprite(bank, 0); + + ewram[HELPER_STATE] = 0; + } + return 1; +} + +void sub_807B184(u8 bank) +{ + if (bank < gNoOfAllBanks) + { + u16 species; + s16 posX, posY; + u8 subpriority; + + if (ewram17800[bank].substituteSprite) + posY = sub_8077F7C(); + else + posY = sub_8077F68(); + if (GetBankSide(bank)) + { + if (GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_HP)) + { + species = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES); + GetMonSpriteTemplate_803C56C(species, GetBankIdentity(bank)); + posX = sub_8077ABC(bank); + subpriority = sub_8079E90(bank); + gObjectBankIDs[] = todo; + } + } + } +} -- cgit v1.2.3 From 78027fb38d7a9cd25bbbb765b88915d7b63f4839 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 23 Aug 2017 23:04:00 +0200 Subject: reshow battle screen is decompiled --- src/reshow_battle_screen.c | 106 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 93 insertions(+), 13 deletions(-) (limited to 'src/reshow_battle_screen.c') diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c index 6643ba4b2..1ed5da7d3 100644 --- a/src/reshow_battle_screen.c +++ b/src/reshow_battle_screen.c @@ -5,7 +5,9 @@ #include "unknown_task.h" #include "text.h" #include "rom_8077ABC.h" +#include "data2.h" +extern struct SpriteTemplate gUnknown_02024E8C; extern struct Window gUnknown_03004210; extern u16 gUnknown_03004280; extern u16 gUnknown_03004288; @@ -22,6 +24,8 @@ extern u16 gBattlePartyID[4]; extern u8 gNoOfAllBanks; extern u16 gBattleTypeFlags; extern u8 gObjectBankIDs[4]; +extern u8 gBattleMonForms[4]; +extern u8 gHealthboxIDs[4]; bool8 sub_800E414(u8 a0); bool8 sub_8031C30(u8 a0); @@ -35,6 +39,13 @@ void BattleLoadSubstituteSprite(u8 bank, u8 b); void LoadPlayerTrainerBankSprite(u16 a0, u8 bank); u8 sub_8077F7C(u8 bank); u8 sub_8077F68(u8 bank); +void nullsub_11(u8 healthboxID, u8 a1); +void sub_8043DB0(u8 bank); +u8 battle_make_oam_normal_battle(u8 bank); +u8 battle_make_oam_safari_battle(void); +void sub_8045A5C(u8 healthboxID, struct Pokemon*, u8); +void sub_8043F44(u8 bank); +void sub_8043DFC(u8 healthboxID); // this file's functions static void CB2_ReshowBattleScreenAfterMenu(void); @@ -239,24 +250,93 @@ void sub_807B184(u8 bank) { if (bank < gNoOfAllBanks) { - u16 species; - s16 posX, posY; - u8 subpriority; + u8 posY; if (ewram17800[bank].substituteSprite) - posY = sub_8077F7C(); + posY = sub_8077F7C(bank); else - posY = sub_8077F68(); + posY = sub_8077F68(bank); if (GetBankSide(bank)) { - if (GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_HP)) - { - species = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES); - GetMonSpriteTemplate_803C56C(species, GetBankIdentity(bank)); - posX = sub_8077ABC(bank); - subpriority = sub_8079E90(bank); - gObjectBankIDs[] = todo; - } + if (GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_HP) == 0) + return; + GetMonSpriteTemplate_803C56C(GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES), GetBankIdentity(bank)); + gObjectBankIDs[bank] = CreateSprite(&gUnknown_02024E8C, sub_8077ABC(bank, 2), posY, sub_8079E90(bank)); + gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank; + gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy; + gSprites[gObjectBankIDs[bank]].data0 = bank; + gSprites[gObjectBankIDs[bank]].data2 = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES); + StartSpriteAnim(&gSprites[gObjectBankIDs[bank]], gBattleMonForms[bank]); + } + else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0) + { + GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBankIdentity(0)); + gObjectBankIDs[bank] = CreateSprite(&gUnknown_02024E8C, 0x50, + (8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80, + sub_8079E90(0)); + gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank; + gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy; + gSprites[gObjectBankIDs[bank]].data0 = bank; + } + else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0) + { + GetMonSpriteTemplate_803C5A0(2, GetBankIdentity(0)); + gObjectBankIDs[bank] = CreateSprite(&gUnknown_02024E8C, 0x50, + (8 - gTrainerBackPicCoords[2].coords) * 4 + 80, + sub_8079E90(0)); + gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank; + gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy; + gSprites[gObjectBankIDs[bank]].data0 = bank; + } + else + { + if (GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_HP) == 0) + return; + GetMonSpriteTemplate_803C56C(GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES), GetBankIdentity(bank)); + gObjectBankIDs[bank] = CreateSprite(&gUnknown_02024E8C, sub_8077ABC(bank, 2), posY, sub_8079E90(bank)); + gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank; + gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy; + gSprites[gObjectBankIDs[bank]].data0 = bank; + gSprites[gObjectBankIDs[bank]].data2 = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES); + StartSpriteAnim(&gSprites[gObjectBankIDs[bank]], gBattleMonForms[bank]); + } + gSprites[gObjectBankIDs[bank]].invisible = ewram17800[bank].invisible; + } +} + +void sub_807B508(u8 bank) +{ + if (bank < gNoOfAllBanks) + { + u8 healthboxID; + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0) + healthboxID = battle_make_oam_safari_battle(); + else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0) + return; + else + healthboxID = battle_make_oam_normal_battle(bank); + gHealthboxIDs[bank] = healthboxID; + sub_8043F44(bank); + sub_8043DFC(healthboxID); + if (GetBankSide(bank)) + sub_8045A5C(gHealthboxIDs[bank], &gEnemyParty[gBattlePartyID[bank]], 0); + else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + sub_8045A5C(gHealthboxIDs[bank], &gPlayerParty[gBattlePartyID[bank]], 10); + else + sub_8045A5C(gHealthboxIDs[bank], &gPlayerParty[gBattlePartyID[bank]], 0); + if (GetBankIdentity(bank) == 3 || GetBankIdentity(bank) == 2) + nullsub_11(gHealthboxIDs[bank], 1); + else + nullsub_11(gHealthboxIDs[bank], 0); + if (GetBankSide(bank)) + { + if (GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_HP) == 0) + sub_8043DB0(healthboxID); + } + else if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) + { + if (GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_HP) == 0) + sub_8043DB0(healthboxID); } } } -- cgit v1.2.3 From 79ae2bac1e970ddc5828092f7f9ffee094b50220 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 23 Aug 2017 23:23:06 +0200 Subject: reuse struct, static and make it compile --- src/reshow_battle_screen.c | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) (limited to 'src/reshow_battle_screen.c') diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c index 1ed5da7d3..202431ae9 100644 --- a/src/reshow_battle_screen.c +++ b/src/reshow_battle_screen.c @@ -1,5 +1,6 @@ #include "global.h" #include "battle.h" +#include "battle_anim.h" #include "palette.h" #include "main.h" #include "unknown_task.h" @@ -50,24 +51,13 @@ void sub_8043DFC(u8 healthboxID); // this file's functions static void CB2_ReshowBattleScreenAfterMenu(void); static bool8 LoadAppropiateBankSprite(u8 bank); -void sub_807B184(u8 bank); -void sub_807B508(u8 bank); -void sub_807B06C(void); +static void sub_807B184(u8 bank); +static void sub_807B508(u8 bank); +static void sub_807B06C(void); #define RESHOW_STATE 0x1FFFF #define HELPER_STATE 0x1FFFE -struct BGCNT -{ - u16 priority : 2; - u16 charBaseBlock : 2; - u16 reserved : 2; - u16 mosaic : 1; - u16 colors : 1; - u16 screenBaseBlock : 5; - u16 screenSize : 2; -}; - void nullsub_14(void) { @@ -208,9 +198,9 @@ static void CB2_ReshowBattleScreenAfterMenu(void) ewram[RESHOW_STATE]++; } -void sub_807B06C(void) +static void sub_807B06C(void) { - struct BGCNT *regBgcnt1, *regBgcnt2; + struct BGCntrlBitfield *regBgcnt1, *regBgcnt2; sub_800D6D4(); @@ -246,7 +236,7 @@ static bool8 LoadAppropiateBankSprite(u8 bank) return 1; } -void sub_807B184(u8 bank) +static void sub_807B184(u8 bank) { if (bank < gNoOfAllBanks) { @@ -304,7 +294,7 @@ void sub_807B184(u8 bank) } } -void sub_807B508(u8 bank) +static void sub_807B508(u8 bank) { if (bank < gNoOfAllBanks) { -- cgit v1.2.3 From d87b8b03f19002705e27e08dfcbd1beaed0cb005 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 24 Aug 2017 10:48:29 +0200 Subject: change ewram defines --- src/reshow_battle_screen.c | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) (limited to 'src/reshow_battle_screen.c') diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c index 202431ae9..343c8f183 100644 --- a/src/reshow_battle_screen.c +++ b/src/reshow_battle_screen.c @@ -55,8 +55,8 @@ static void sub_807B184(u8 bank); static void sub_807B508(u8 bank); static void sub_807B06C(void); -#define RESHOW_STATE 0x1FFFF -#define HELPER_STATE 0x1FFFE +#define gReshowState ewram[0x1FFFF] +#define gHelperState ewram[0x1FFFE] void nullsub_14(void) { @@ -69,14 +69,14 @@ void ReshowBattleScreenAfterMenu(void) SetHBlankCallback(0); SetVBlankCallback(0); REG_MOSAIC = 0; - ewram[RESHOW_STATE] = 0; - ewram[HELPER_STATE] = 0; + gReshowState = 0; + gHelperState = 0; SetMainCallback2(CB2_ReshowBattleScreenAfterMenu); } static void CB2_ReshowBattleScreenAfterMenu(void) { - switch (ewram[RESHOW_STATE]) + switch (gReshowState) { case 0: dp12_8087EA4(); @@ -99,13 +99,13 @@ static void CB2_ReshowBattleScreenAfterMenu(void) } break; case 2: - if (!sub_800E414(ewram[HELPER_STATE])) + if (!sub_800E414(gHelperState)) { - ewram[HELPER_STATE]++; - ewram[RESHOW_STATE]--; + gHelperState++; + gReshowState--; } else - ewram[HELPER_STATE] = 0; + gHelperState = 0; break; case 3: ResetSpriteData(); @@ -118,29 +118,29 @@ static void CB2_ReshowBattleScreenAfterMenu(void) sub_8031EE8(); break; case 6: - if (sub_8031C30(ewram[HELPER_STATE])) - ewram[HELPER_STATE] = 0; + if (sub_8031C30(gHelperState)) + gHelperState = 0; else { - ewram[HELPER_STATE]++; - ewram[RESHOW_STATE]--; + gHelperState++; + gReshowState--; } break; case 7: if (!LoadAppropiateBankSprite(0)) - ewram[RESHOW_STATE]--; + gReshowState--; break; case 8: if (!LoadAppropiateBankSprite(1)) - ewram[RESHOW_STATE]--; + gReshowState--; break; case 9: if (!LoadAppropiateBankSprite(2)) - ewram[RESHOW_STATE]--; + gReshowState--; break; case 10: if (!LoadAppropiateBankSprite(3)) - ewram[RESHOW_STATE]--; + gReshowState--; break; case 11: sub_807B184(0); @@ -195,7 +195,7 @@ static void CB2_ReshowBattleScreenAfterMenu(void) SetMainCallback2(sub_800F808); break; } - ewram[RESHOW_STATE]++; + gReshowState++; } static void sub_807B06C(void) @@ -231,7 +231,7 @@ static bool8 LoadAppropiateBankSprite(u8 bank) else BattleLoadSubstituteSprite(bank, 0); - ewram[HELPER_STATE] = 0; + gHelperState = 0; } return 1; } -- cgit v1.2.3