summaryrefslogtreecommitdiff
path: root/src/battle_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/battle_main.c')
-rw-r--r--src/battle_main.c538
1 files changed, 264 insertions, 274 deletions
diff --git a/src/battle_main.c b/src/battle_main.c
index 5bc80f61e..001e2ec17 100644
--- a/src/battle_main.c
+++ b/src/battle_main.c
@@ -68,9 +68,6 @@ extern const struct BgTemplate gBattleBgTemplates[];
extern const struct WindowTemplate *const gBattleWindowTemplates[];
// this file's functions
-#if !defined(NONMATCHING) && MODERN
-#define static
-#endif
static void CB2_InitBattleInternal(void);
static void CB2_PreInitMultiBattle(void);
static void CB2_PreInitIngamePlayerPartnerBattle(void);
@@ -81,8 +78,8 @@ static void TryCorrectShedinjaLanguage(struct Pokemon *mon);
static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 firstTrainer);
static void BattleMainCB1(void);
static void sub_8038538(struct Sprite *sprite);
-static void sub_8038F14(void);
-static void sub_8038F34(void);
+static void CB2_EndLinkBattle(void);
+static void EndLinkBattleInSteps(void);
static void sub_80392A8(void);
static void sub_803937C(void);
static void sub_803939C(void);
@@ -93,7 +90,7 @@ static void sub_80398D0(struct Sprite *sprite);
static void SpriteCB_AnimFaintOpponent(struct Sprite *sprite);
static void SpriteCb_BlinkVisible(struct Sprite *sprite);
static void SpriteCallbackDummy_3(struct Sprite *sprite);
-static void oac_poke_ally_(struct Sprite *sprite);
+static void SpriteCB_BattleSpriteSlideLeft(struct Sprite *sprite);
static void TurnValuesCleanUp(bool8 var0);
static void SpriteCB_BounceEffect(struct Sprite *sprite);
static void BattleStartClearSetData(void);
@@ -147,7 +144,7 @@ EWRAM_DATA u8 gBattleTextBuff3[TEXT_BUFF_ARRAY_COUNT] = {0};
EWRAM_DATA static u32 sUnusedUnknownArray[25] = {0};
EWRAM_DATA u32 gBattleTypeFlags = 0;
EWRAM_DATA u8 gBattleTerrain = 0;
-EWRAM_DATA u32 gUnknown_02022FF4 = 0;
+EWRAM_DATA u32 gUnusedFirstBattleVar1 = 0; // Never read
EWRAM_DATA struct UnknownPokemonStruct4 gMultiPartnerParty[MULTI_PARTY_SIZE] = {0};
EWRAM_DATA static struct UnknownPokemonStruct4* sMultiPartnerPartyBuffer = NULL;
EWRAM_DATA u8 *gUnknown_0202305C = NULL;
@@ -200,7 +197,7 @@ EWRAM_DATA u8 gMoveResultFlags = 0;
EWRAM_DATA u32 gHitMarker = 0;
EWRAM_DATA static u8 sUnusedBattlersArray[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA u8 gTakenDmgByBattler[MAX_BATTLERS_COUNT] = {0};
-EWRAM_DATA u8 gUnknown_0202428C = 0;
+EWRAM_DATA u8 gUnusedFirstBattleVar2 = 0; // Never read
EWRAM_DATA u16 gSideStatuses[2] = {0};
EWRAM_DATA struct SideTimer gSideTimers[2] = {0};
EWRAM_DATA u32 gStatuses3[MAX_BATTLERS_COUNT] = {0};
@@ -233,8 +230,8 @@ EWRAM_DATA u32 gTransformedPersonalities[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA u8 gPlayerDpadHoldFrames = 0;
EWRAM_DATA struct BattleSpriteData *gBattleSpritesDataPtr = NULL;
EWRAM_DATA struct MonSpritesGfx *gMonSpritesGfxPtr = NULL;
-EWRAM_DATA struct BattleHealthboxInfo *gUnknown_020244D8 = NULL;
-EWRAM_DATA struct BattleHealthboxInfo *gUnknown_020244DC = NULL;
+EWRAM_DATA struct BattleHealthboxInfo *gBattleControllerOpponentHealthboxData = NULL; // Never read
+EWRAM_DATA struct BattleHealthboxInfo *gBattleControllerOpponentFlankHealthboxData = NULL; // Never read
EWRAM_DATA u16 gBattleMovePower = 0;
EWRAM_DATA u16 gMoveToLearn = 0;
EWRAM_DATA u8 gBattleMonForms[MAX_BATTLERS_COUNT] = {0};
@@ -248,7 +245,7 @@ void (*gBattlerControllerFuncs[MAX_BATTLERS_COUNT])(void);
u8 gHealthboxSpriteIds[MAX_BATTLERS_COUNT];
u8 gMultiUsePlayerCursor;
u8 gNumberOfMovesToChoose;
-u8 gUnknown_03005D7C[MAX_BATTLERS_COUNT];
+u8 gBattleControllerData[MAX_BATTLERS_COUNT]; // Used by the battle controllers to store misc sprite/task IDs for each battler
// rom const data
static const struct ScanlineEffectParams sIntroScanlineParams16Bit =
@@ -275,7 +272,7 @@ const struct SpriteTemplate gUnknown_0831AC88 =
static const u8 sText_ShedinjaJpnName[] = _("ヌケニン"); // Nukenin
-const struct OamData gOamData_831ACA8 =
+const struct OamData gOamData_BattleSpriteOpponentSide =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_NORMAL,
@@ -290,7 +287,7 @@ const struct OamData gOamData_831ACA8 =
.affineParam = 0,
};
-const struct OamData gOamData_831ACB0 =
+const struct OamData gOamData_BattleSpritePlayerSide =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_NORMAL,
@@ -306,10 +303,10 @@ const struct OamData gOamData_831ACB0 =
};
// Unknown and unused data. Feel free to remove.
-static const u16 gUnknown_0831ACB8[] = {0, 5, 0xfffe, 0};
-static const u16 *const gUnknown_0831ACC0 = gUnknown_0831ACB8;
-static const u16 gUnknown_0831ACC4[] = {0xfff0, 0, 0x0400, 0, 0, 0, 0x3c00, 0, 0x7ffe, 1, 0, 0};
-static const u16 *const gUnknown_0831ACDC = gUnknown_0831ACC4;
+static const u16 sUnused1[] = {0, 5, 0xfffe, 0};
+static const u16 *const sUnused1Ptr = sUnused1;
+static const u16 sUnused2[] = {0xfff0, 0, 0x0400, 0, 0, 0, 0x3c00, 0, 0x7ffe, 1, 0, 0};
+static const u16 *const sUnused2Ptr = sUnused2;
static const s8 gUnknown_0831ACE0[] ={-32, -16, -16, -32, -32, 0, 0, 0};
@@ -437,24 +434,24 @@ const u8 gTypeEffectiveness[336] =
const u8 gTypeNames[NUMBER_OF_MON_TYPES][TYPE_NAME_LENGTH + 1] =
{
- _("NORMAL"),
- _("FIGHT"),
- _("FLYING"),
- _("POISON"),
- _("GROUND"),
- _("ROCK"),
- _("BUG"),
- _("GHOST"),
- _("STEEL"),
- _("???"),
- _("FIRE"),
- _("WATER"),
- _("GRASS"),
- _("ELECTR"),
- _("PSYCHC"),
- _("ICE"),
- _("DRAGON"),
- _("DARK"),
+ [TYPE_NORMAL] = _("NORMAL"),
+ [TYPE_FIGHTING] = _("FIGHT"),
+ [TYPE_FLYING] = _("FLYING"),
+ [TYPE_POISON] = _("POISON"),
+ [TYPE_GROUND] = _("GROUND"),
+ [TYPE_ROCK] = _("ROCK"),
+ [TYPE_BUG] = _("BUG"),
+ [TYPE_GHOST] = _("GHOST"),
+ [TYPE_STEEL] = _("STEEL"),
+ [TYPE_MYSTERY] = _("???"),
+ [TYPE_FIRE] = _("FIRE"),
+ [TYPE_WATER] = _("WATER"),
+ [TYPE_GRASS] = _("GRASS"),
+ [TYPE_ELECTRIC] = _("ELECTR"),
+ [TYPE_PSYCHIC] = _("PSYCHC"),
+ [TYPE_ICE] = _("ICE"),
+ [TYPE_DRAGON] = _("DRAGON"),
+ [TYPE_DARK] = _("DARK"),
};
// This is a factor in how much money you get for beating a trainer.
@@ -579,7 +576,7 @@ void CB2_InitBattle(void)
AllocateBattleResources();
AllocateBattleSpritesData();
AllocateMonSpritesGfx();
- sub_8185F84();
+ RecordedBattle_ClearFrontierPassFlag();
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
@@ -614,22 +611,22 @@ static void CB2_InitBattleInternal(void)
CpuFill32(0, (void*)(VRAM), VRAM_SIZE);
SetGpuReg(REG_OFFSET_MOSAIC, 0);
- SetGpuReg(REG_OFFSET_WIN0H, 240);
- SetGpuReg(REG_OFFSET_WIN0V, 0x5051);
+ SetGpuReg(REG_OFFSET_WIN0H, DISPLAY_WIDTH);
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(DISPLAY_HEIGHT / 2, DISPLAY_HEIGHT / 2 + 1));
SetGpuReg(REG_OFFSET_WININ, 0);
SetGpuReg(REG_OFFSET_WINOUT, 0);
- gBattle_WIN0H = 240;
+ gBattle_WIN0H = DISPLAY_WIDTH;
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId != TRAINER_STEVEN_PARTNER)
{
- gBattle_WIN0V = 159;
- gBattle_WIN1H = 240;
+ gBattle_WIN0V = DISPLAY_HEIGHT - 1;
+ gBattle_WIN1H = DISPLAY_WIDTH;
gBattle_WIN1V = 32;
}
else
{
- gBattle_WIN0V = 0x5051;
+ gBattle_WIN0V = WIN_RANGE(DISPLAY_HEIGHT / 2, DISPLAY_HEIGHT / 2 + 1);
ScanlineEffect_Clear();
i = 0;
@@ -700,46 +697,52 @@ static void CB2_InitBattleInternal(void)
gBattleCommunication[MULTIUSE_STATE] = 0;
}
-static void sub_8036A5C(void)
+#define BUFFER_PARTY_VS_SCREEN_STATUS(party, flags, i) \
+ for ((i) = 0; (i) < PARTY_SIZE; (i)++) \
+ { \
+ u16 species = GetMonData(&(party)[(i)], MON_DATA_SPECIES2); \
+ u16 hp = GetMonData(&(party)[(i)], MON_DATA_HP); \
+ u32 status = GetMonData(&(party)[(i)], MON_DATA_STATUS); \
+ \
+ if (species == SPECIES_NONE) \
+ continue; \
+ \
+ /* Is healthy mon? */ \
+ if (species != SPECIES_EGG && hp != 0 && status == 0) \
+ (flags) |= 1 << (i) * 2; \
+ \
+ if (species == SPECIES_NONE) /* Redundant */ \
+ continue; \
+ \
+ /* Is Egg or statused? */ \
+ if (hp != 0 && (species == SPECIES_EGG || status != 0)) \
+ (flags) |= 2 << (i) * 2; \
+ \
+ if (species == SPECIES_NONE) /* Redundant */ \
+ continue; \
+ \
+ /* Is fainted? */ \
+ if (species != SPECIES_EGG && hp == 0) \
+ (flags) |= 3 << (i) * 2; \
+ }
+
+// For Vs Screen at link battle start
+static void BufferPartyVsScreenHealth_AtStart(void)
{
- u16 r6 = 0;
- u16 species = 0;
- u16 hp = 0;
- u32 status = 0;
+ u16 flags = 0;
s32 i;
- for (i = 0; i < PARTY_SIZE; i++)
- {
- species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
- hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
- status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);
-
- if (species == SPECIES_NONE)
- continue;
- if (species != SPECIES_EGG && hp != 0 && status == 0)
- r6 |= 1 << i * 2;
-
- if (species == SPECIES_NONE)
- continue;
- if (hp != 0 && (species == SPECIES_EGG || status != 0))
- r6 |= 2 << i * 2;
-
- if (species == SPECIES_NONE)
- continue;
- if (species != SPECIES_EGG && hp == 0)
- r6 |= 3 << i * 2;
- }
-
- gBattleStruct->field_182 = r6;
- *(&gBattleStruct->field_183) = r6 >> 8;
- gBattleStruct->field_183 |= FlagGet(FLAG_SYS_FRONTIER_PASS) << 7;
+ BUFFER_PARTY_VS_SCREEN_STATUS(gPlayerParty, flags, i);
+ gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsLo = flags;
+ *(&gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsHi) = flags >> 8;
+ gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsHi |= FlagGet(FLAG_SYS_FRONTIER_PASS) << 7;
}
static void SetPlayerBerryDataInBattleStruct(void)
{
s32 i;
struct BattleStruct *battleStruct = gBattleStruct;
- struct BattleEnigmaBerry *battleBerry = &battleStruct->battleEnigmaBerry;
+ struct BattleEnigmaBerry *battleBerry = &battleStruct->multiBuffer.linkBattlerHeader.battleEnigmaBerry;
if (IsEnigmaBerryValid() == TRUE)
{
@@ -879,52 +882,56 @@ static void SetAllPlayersBerryData(void)
}
}
-static void sub_8036EB8(u8 arg0, u8 arg1)
+// This was inlined in Ruby/Sapphire
+static void FindLinkBattleMaster(u8 numPlayers, u8 multiPlayerId)
{
- u8 var = 0;
+ u8 found = 0;
- if (gBlockRecvBuffer[0][0] == 256)
+ // If player 1 is playing the minimum version, player 1 is master.
+ if (gBlockRecvBuffer[0][0] == 0x100)
{
- if (arg1 == 0)
+ if (multiPlayerId == 0)
gBattleTypeFlags |= BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER;
else
gBattleTypeFlags |= BATTLE_TYPE_TRAINER;
- var++;
+ found++;
}
- if (var == 0)
+ if (found == 0)
{
+ // If multiple different versions are being used, player 1 is master.
s32 i;
- for (i = 0; i < arg0; i++)
+ for (i = 0; i < numPlayers; i++)
{
if (gBlockRecvBuffer[0][0] != gBlockRecvBuffer[i][0])
break;
}
- if (i == arg0)
+ if (i == numPlayers)
{
- if (arg1 == 0)
+ if (multiPlayerId == 0)
gBattleTypeFlags |= BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER;
else
gBattleTypeFlags |= BATTLE_TYPE_TRAINER;
- var++;
+ found++;
}
- if (var == 0)
+ if (found == 0)
{
- for (i = 0; i < arg0; i++)
+ // Lowest index player with the highest game version is master.
+ for (i = 0; i < numPlayers; i++)
{
- if (gBlockRecvBuffer[i][0] == 0x300)
+ if (gBlockRecvBuffer[i][0] == 0x300 && i != multiPlayerId)
{
- if (i != arg1 && i < arg1)
+ if (i < multiPlayerId)
break;
}
- if (gBlockRecvBuffer[i][0] > 0x300 && i != arg1)
+ if (gBlockRecvBuffer[i][0] > 0x300 && i != multiPlayerId)
break;
}
- if (i == arg0)
+ if (i == numPlayers)
gBattleTypeFlags |= BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER;
else
gBattleTypeFlags |= BATTLE_TYPE_TRAINER;
@@ -967,9 +974,10 @@ static void CB2_HandleStartBattle(void)
{
if (IsLinkTaskFinished())
{
- *(&gBattleStruct->field_180) = 0;
- *(&gBattleStruct->field_181) = 3;
- sub_8036A5C();
+ // 0x300
+ *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureLo) = 0;
+ *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureHi) = 3;
+ BufferPartyVsScreenHealth_AtStart();
SetPlayerBerryDataInBattleStruct();
if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM)
@@ -978,7 +986,7 @@ static void CB2_HandleStartBattle(void)
gLinkPlayers[1].id = 1;
}
- SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->field_180, 32);
+ SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->multiBuffer.linkBattlerHeader, sizeof(gBattleStruct->multiBuffer.linkBattlerHeader));
gBattleCommunication[MULTIUSE_STATE] = 2;
}
if (gWirelessCommType)
@@ -999,16 +1007,16 @@ static void CB2_HandleStartBattle(void)
u8 taskId;
ResetBlockReceivedFlags();
- sub_8036EB8(2, playerMultiplayerId);
+ FindLinkBattleMaster(2, playerMultiplayerId);
SetAllPlayersBerryData();
taskId = CreateTask(InitLinkBattleVsScreen, 0);
gTasks[taskId].data[1] = 0x10E;
gTasks[taskId].data[2] = 0x5A;
gTasks[taskId].data[5] = 0;
- gTasks[taskId].data[3] = gBattleStruct->field_182 | (gBattleStruct->field_183 << 8);
+ gTasks[taskId].data[3] = gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsLo | (gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsHi << 8);
gTasks[taskId].data[4] = gBlockRecvBuffer[enemyMultiplayerId][1];
- sub_8185F90(gBlockRecvBuffer[playerMultiplayerId][1]);
- sub_8185F90(gBlockRecvBuffer[enemyMultiplayerId][1]);
+ RecordedBattle_SetFrontierPassFlagFromHword(gBlockRecvBuffer[playerMultiplayerId][1]);
+ RecordedBattle_SetFrontierPassFlagFromHword(gBlockRecvBuffer[enemyMultiplayerId][1]);
SetDeoxysStats();
gBattleCommunication[MULTIUSE_STATE]++;
}
@@ -1065,7 +1073,7 @@ static void CB2_HandleStartBattle(void)
}
break;
case 15:
- sub_8032768();
+ InitBattleControllers();
sub_8184E58();
gBattleCommunication[SPRITES_INIT_STATE1] = 0;
gBattleCommunication[SPRITES_INIT_STATE2] = 0;
@@ -1109,7 +1117,7 @@ static void CB2_HandleStartBattle(void)
SetMainCallback2(BattleMainCB2);
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
- gBattleTypeFlags |= BATTLE_TYPE_20;
+ gBattleTypeFlags |= BATTLE_TYPE_LINK_IN_BATTLE;
}
}
break;
@@ -1175,11 +1183,12 @@ static void CB2_HandleStartMultiPartnerBattle(void)
if (IsLinkTaskFinished())
{
- *(&gBattleStruct->field_180) = 0;
- *(&gBattleStruct->field_181) = 3;
- sub_8036A5C();
+ // 0x300
+ *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureLo) = 0;
+ *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureHi) = 3;
+ BufferPartyVsScreenHealth_AtStart();
SetPlayerBerryDataInBattleStruct();
- SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->field_180, 32);
+ SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->multiBuffer.linkBattlerHeader, sizeof(gBattleStruct->multiBuffer.linkBattlerHeader));
gBattleCommunication[MULTIUSE_STATE] = 2;
}
@@ -1201,7 +1210,7 @@ static void CB2_HandleStartMultiPartnerBattle(void)
u8 taskId;
ResetBlockReceivedFlags();
- sub_8036EB8(2, playerMultiplayerId);
+ FindLinkBattleMaster(2, playerMultiplayerId);
SetAllPlayersBerryData();
taskId = CreateTask(InitLinkBattleVsScreen, 0);
gTasks[taskId].data[1] = 0x10E;
@@ -1325,7 +1334,7 @@ static void CB2_HandleStartMultiPartnerBattle(void)
}
break;
case 13:
- sub_8032768();
+ InitBattleControllers();
sub_8184E58();
gBattleCommunication[SPRITES_INIT_STATE1] = 0;
gBattleCommunication[SPRITES_INIT_STATE2] = 0;
@@ -1357,13 +1366,13 @@ static void CB2_HandleStartMultiPartnerBattle(void)
case 16:
if (BattleInitAllSprites(&gBattleCommunication[SPRITES_INIT_STATE1], &gBattleCommunication[SPRITES_INIT_STATE2]))
{
- sub_8166188();
+ TrySetLinkBattleTowerEnemyPartyLevel();
gPreBattleCallback1 = gMain.callback1;
gMain.callback1 = BattleMainCB1;
SetMainCallback2(BattleMainCB2);
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
- gBattleTypeFlags |= BATTLE_TYPE_20;
+ gBattleTypeFlags |= BATTLE_TYPE_LINK_IN_BATTLE;
}
}
break;
@@ -1562,12 +1571,13 @@ static void CB2_HandleStartMultiBattle(void)
{
if (IsLinkTaskFinished())
{
- *(&gBattleStruct->field_180) = 0;
- *(&gBattleStruct->field_181) = 3;
- sub_8036A5C();
+ // 0x300
+ *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureLo) = 0;
+ *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureHi) = 3;
+ BufferPartyVsScreenHealth_AtStart();
SetPlayerBerryDataInBattleStruct();
- SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->field_180, 32);
+ SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->multiBuffer.linkBattlerHeader, sizeof(gBattleStruct->multiBuffer.linkBattlerHeader));
gBattleCommunication[MULTIUSE_STATE]++;
}
if (gWirelessCommType)
@@ -1586,7 +1596,7 @@ static void CB2_HandleStartMultiBattle(void)
if ((GetBlockReceivedStatus() & 0xF) == 0xF)
{
ResetBlockReceivedFlags();
- sub_8036EB8(4, playerMultiplayerId);
+ FindLinkBattleMaster(4, playerMultiplayerId);
SetAllPlayersBerryData();
SetDeoxysStats();
var = CreateTask(InitLinkBattleVsScreen, 0);
@@ -1598,7 +1608,7 @@ static void CB2_HandleStartMultiBattle(void)
for (id = 0; id < MAX_LINK_PLAYERS; id++)
{
- sub_8185F90(gBlockRecvBuffer[id][1]);
+ RecordedBattle_SetFrontierPassFlagFromHword(gBlockRecvBuffer[id][1]);
switch (gLinkPlayers[id].id)
{
case 0:
@@ -1762,7 +1772,7 @@ static void CB2_HandleStartMultiBattle(void)
}
break;
case 7:
- sub_8032768();
+ InitBattleControllers();
sub_8184E58();
gBattleCommunication[SPRITES_INIT_STATE1] = 0;
gBattleCommunication[SPRITES_INIT_STATE2] = 0;
@@ -1783,10 +1793,10 @@ static void CB2_HandleStartMultiBattle(void)
case 8:
if (IsLinkTaskFinished())
{
- u32* ptr = (u32*)(&gBattleStruct->field_180);
+ u32* ptr = gBattleStruct->multiBuffer.battleVideo;
ptr[0] = gBattleTypeFlags;
ptr[1] = gRecordedBattleRngSeed; // UB: overwrites berry data
- SendBlock(bitmask_all_link_players_but_self(), ptr, 8);
+ SendBlock(bitmask_all_link_players_but_self(), ptr, sizeof(gBattleStruct->multiBuffer.battleVideo));
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
@@ -1816,7 +1826,7 @@ static void CB2_HandleStartMultiBattle(void)
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT;
- gBattleTypeFlags |= BATTLE_TYPE_20;
+ gBattleTypeFlags |= BATTLE_TYPE_LINK_IN_BATTLE;
}
}
break;
@@ -1835,7 +1845,7 @@ void BattleMainCB2(void)
{
gSpecialVar_Result = gBattleOutcome = B_OUTCOME_PLAYER_TELEPORTED;
ResetPaletteFadeControl();
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
+ BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);
SetMainCallback2(CB2_QuitRecordedBattle);
}
}
@@ -1969,7 +1979,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
nameHash += gSpeciesNames[partyData[i].species][j];
personalityValue += nameHash << 8;
- fixedIV = partyData[i].iv * 31 / 255;
+ fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255;
CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);
break;
}
@@ -1981,7 +1991,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
nameHash += gSpeciesNames[partyData[i].species][j];
personalityValue += nameHash << 8;
- fixedIV = partyData[i].iv * 31 / 255;
+ fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255;
CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);
for (j = 0; j < MAX_MON_MOVES; j++)
@@ -1999,7 +2009,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
nameHash += gSpeciesNames[partyData[i].species][j];
personalityValue += nameHash << 8;
- fixedIV = partyData[i].iv * 31 / 255;
+ fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255;
CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);
SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem);
@@ -2013,7 +2023,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
nameHash += gSpeciesNames[partyData[i].species][j];
personalityValue += nameHash << 8;
- fixedIV = partyData[i].iv * 31 / 255;
+ fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255;
CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);
SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem);
@@ -2037,7 +2047,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
void sub_8038A04(void) // unused
{
if (REG_VCOUNT < 0xA0 && REG_VCOUNT >= 0x6F)
- SetGpuReg(REG_OFFSET_BG0CNT, 0x9800);
+ SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_SCREENBASE(24) | BGCNT_TXT256x512);
}
void VBlankCB_Battle(void)
@@ -2064,12 +2074,12 @@ void VBlankCB_Battle(void)
ScanlineEffect_InitHBlankDmaTransfer();
}
-void nullsub_17(struct Sprite *sprite)
+void SpriteCB_VsLetterDummy(struct Sprite *sprite)
{
}
-static void sub_8038B04(struct Sprite *sprite)
+static void SpriteCB_VsLetter(struct Sprite *sprite)
{
if (sprite->data[0] != 0)
sprite->pos1.x = sprite->data[1] + ((sprite->data[2] & 0xFF00) >> 8);
@@ -2080,107 +2090,67 @@ static void sub_8038B04(struct Sprite *sprite)
if (sprite->affineAnimEnded)
{
- FreeSpriteTilesByTag(0x2710);
- FreeSpritePaletteByTag(0x2710);
+ FreeSpriteTilesByTag(ANIM_SPRITES_START);
+ FreeSpritePaletteByTag(ANIM_SPRITES_START);
FreeSpriteOamMatrix(sprite);
DestroySprite(sprite);
}
}
-void sub_8038B74(struct Sprite *sprite)
+void SpriteCB_VsLetterInit(struct Sprite *sprite)
{
StartSpriteAffineAnim(sprite, 1);
- sprite->callback = sub_8038B04;
+ sprite->callback = SpriteCB_VsLetter;
PlaySE(SE_MUGSHOT);
}
-static void sub_8038B94(u8 taskId)
+static void BufferPartyVsScreenHealth_AtEnd(u8 taskId)
{
- struct Pokemon *sp4 = NULL;
- struct Pokemon *sp8 = NULL;
- u8 r2 = gBattleScripting.multiplayerId;
- u32 r7;
+ struct Pokemon *party1 = NULL;
+ struct Pokemon *party2 = NULL;
+ u8 multiplayerId = gBattleScripting.multiplayerId;
+ u32 flags;
s32 i;
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
- switch (gLinkPlayers[r2].id)
+ switch (gLinkPlayers[multiplayerId].id)
{
case 0:
case 2:
- sp4 = gPlayerParty;
- sp8 = gEnemyParty;
+ party1 = gPlayerParty;
+ party2 = gEnemyParty;
break;
case 1:
case 3:
- sp4 = gEnemyParty;
- sp8 = gPlayerParty;
+ party1 = gEnemyParty;
+ party2 = gPlayerParty;
break;
}
}
else
{
- sp4 = gPlayerParty;
- sp8 = gEnemyParty;
+ party1 = gPlayerParty;
+ party2 = gEnemyParty;
}
- r7 = 0;
- for (i = 0; i < PARTY_SIZE; i++)
- {
- u16 species = GetMonData(&sp4[i], MON_DATA_SPECIES2);
- u16 hp = GetMonData(&sp4[i], MON_DATA_HP);
- u32 status = GetMonData(&sp4[i], MON_DATA_STATUS);
-
- if (species == SPECIES_NONE)
- continue;
- if (species != SPECIES_EGG && hp != 0 && status == 0)
- r7 |= 1 << i * 2;
-
- if (species == SPECIES_NONE)
- continue;
- if (hp != 0 && (species == SPECIES_EGG || status != 0))
- r7 |= 2 << i * 2;
+ flags = 0;
+ BUFFER_PARTY_VS_SCREEN_STATUS(party1, flags, i);
+ gTasks[taskId].data[3] = flags;
- if (species == SPECIES_NONE)
- continue;
- if (species != SPECIES_EGG && hp == 0)
- r7 |= 3 << i * 2;
- }
- gTasks[taskId].data[3] = r7;
-
- r7 = 0;
- for (i = 0; i < PARTY_SIZE; i++)
- {
- u16 species = GetMonData(&sp8[i], MON_DATA_SPECIES2);
- u16 hp = GetMonData(&sp8[i], MON_DATA_HP);
- u32 status = GetMonData(&sp8[i], MON_DATA_STATUS);
-
- if (species == SPECIES_NONE)
- continue;
- if (species != SPECIES_EGG && hp != 0 && status == 0)
- r7 |= 1 << i * 2;
-
- if (species == SPECIES_NONE)
- continue;
- if (hp != 0 && (species == SPECIES_EGG || status != 0))
- r7 |= 2 << i * 2;
-
- if (species == SPECIES_NONE)
- continue;
- if (species != SPECIES_EGG && hp == 0)
- r7 |= 3 << i * 2;
- }
- gTasks[taskId].data[4] = r7;
+ flags = 0;
+ BUFFER_PARTY_VS_SCREEN_STATUS(party2, flags, i);
+ gTasks[taskId].data[4] = flags;
}
-void sub_8038D64(void)
+void CB2_InitEndLinkBattle(void)
{
s32 i;
u8 taskId;
SetHBlankCallback(NULL);
SetVBlankCallback(NULL);
- gBattleTypeFlags &= ~(BATTLE_TYPE_20);
+ gBattleTypeFlags &= ~(BATTLE_TYPE_LINK_IN_BATTLE);
if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
{
@@ -2193,12 +2163,12 @@ void sub_8038D64(void)
{
CpuFill32(0, (void*)(VRAM), VRAM_SIZE);
SetGpuReg(REG_OFFSET_MOSAIC, 0);
- SetGpuReg(REG_OFFSET_WIN0H, 0xF0);
- SetGpuReg(REG_OFFSET_WIN0V, 0x5051);
+ SetGpuReg(REG_OFFSET_WIN0H, DISPLAY_WIDTH);
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(DISPLAY_HEIGHT / 2, DISPLAY_HEIGHT / 2 + 1));
SetGpuReg(REG_OFFSET_WININ, 0);
SetGpuReg(REG_OFFSET_WINOUT, 0);
- gBattle_WIN0H = 0xF0;
- gBattle_WIN0V = 0x5051;
+ gBattle_WIN0H = DISPLAY_WIDTH;
+ gBattle_WIN0V = WIN_RANGE(DISPLAY_HEIGHT / 2, DISPLAY_HEIGHT / 2 + 1);
ScanlineEffect_Clear();
i = 0;
@@ -2233,24 +2203,26 @@ void sub_8038D64(void)
ResetSpriteData();
ResetTasks();
DrawBattleEntryBackground();
- SetGpuReg(REG_OFFSET_WINOUT, 0x37);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
FreeAllSpritePalettes();
gReservedSpritePaletteCount = 4;
SetVBlankCallback(VBlankCB_Battle);
+ // Show end Vs screen with battle results
taskId = CreateTask(InitLinkBattleVsScreen, 0);
gTasks[taskId].data[1] = 0x10E;
gTasks[taskId].data[2] = 0x5A;
gTasks[taskId].data[5] = 1;
- sub_8038B94(taskId);
- SetMainCallback2(sub_8038F14);
+ BufferPartyVsScreenHealth_AtEnd(taskId);
+
+ SetMainCallback2(CB2_EndLinkBattle);
gBattleCommunication[MULTIUSE_STATE] = 0;
}
}
-static void sub_8038F14(void)
+static void CB2_EndLinkBattle(void)
{
- sub_8038F34();
+ EndLinkBattleInSteps();
AnimateSprites();
BuildOamBuffer();
RunTextPrinters();
@@ -2258,7 +2230,7 @@ static void sub_8038F14(void)
RunTasks();
}
-static void sub_8038F34(void)
+static void EndLinkBattleInSteps(void)
{
s32 i;
@@ -2274,7 +2246,7 @@ static void sub_8038F34(void)
case 1:
if (--gBattleCommunication[1] == 0)
{
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
+ BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
@@ -2283,7 +2255,7 @@ static void sub_8038F34(void)
{
u8 monsCount;
- gMain.field_439_x4 = sub_8185FAC();
+ gMain.anyLinkBattlerHasFrontierPass = RecordedBattle_GetFrontierPassFlag();
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
monsCount = 4;
@@ -2299,7 +2271,7 @@ static void sub_8038F34(void)
FreeAllWindowBuffers();
SetMainCallback2(sub_80392A8);
}
- else if (!gMain.field_439_x4)
+ else if (!gMain.anyLinkBattlerHasFrontierPass)
{
SetMainCallback2(gMain.savedCallback);
FreeBattleResources();
@@ -2308,7 +2280,7 @@ static void sub_8038F34(void)
}
else if (gReceivedRemoteLinkPlayers == 0)
{
- CreateTask(sub_80B3AF8, 5);
+ CreateTask(Task_ReconnectWithLinkPlayers, 5);
gBattleCommunication[MULTIUSE_STATE]++;
}
else
@@ -2331,7 +2303,7 @@ static void sub_8038F34(void)
for (i = 0; i < 2; i++)
LoadChosenBattleElement(i);
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
+ BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK);
gBattleCommunication[MULTIUSE_STATE]++;
break;
case 4:
@@ -2339,7 +2311,7 @@ static void sub_8038F34(void)
gBattleCommunication[MULTIUSE_STATE]++;
break;
case 5:
- if (!FuncIsActiveTask(sub_80B3AF8))
+ if (!FuncIsActiveTask(Task_ReconnectWithLinkPlayers))
gBattleCommunication[MULTIUSE_STATE]++;
break;
case 6:
@@ -2363,9 +2335,9 @@ static void sub_8038F34(void)
gBattleCommunication[MULTIUSE_STATE]++;
break;
case 9:
- if (!gMain.field_439_x4 || gWirelessCommType || gReceivedRemoteLinkPlayers != 1)
+ if (!gMain.anyLinkBattlerHasFrontierPass || gWirelessCommType || gReceivedRemoteLinkPlayers != 1)
{
- gMain.field_439_x4 = 0;
+ gMain.anyLinkBattlerHasFrontierPass = 0;
SetMainCallback2(gMain.savedCallback);
FreeBattleResources();
FreeBattleSpritesData();
@@ -2375,7 +2347,7 @@ static void sub_8038F34(void)
}
}
-u32 sub_80391E0(u8 arrayId, u8 caseId)
+u32 GetBattleBgTemplateData(u8 arrayId, u8 caseId)
{
u32 ret = 0;
@@ -2396,7 +2368,7 @@ u32 sub_80391E0(u8 arrayId, u8 caseId)
case 4:
ret = gBattleBgTemplates[arrayId].paletteMode;
break;
- case 5:
+ case 5: // Only this case is used
ret = gBattleBgTemplates[arrayId].priority;
break;
case 6:
@@ -2436,7 +2408,7 @@ static void sub_80392A8(void)
gReservedSpritePaletteCount = 4;
SetVBlankCallback(VBlankCB_Battle);
SetMainCallback2(sub_803937C);
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
+ BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK);
gBattleCommunication[MULTIUSE_STATE] = 0;
}
@@ -2461,12 +2433,12 @@ static void sub_803939C(void)
gBattleCommunication[MULTIUSE_STATE]++;
break;
case 1:
- if (gMain.field_439_x4 && gReceivedRemoteLinkPlayers == 0)
- CreateTask(sub_80B3AF8, 5);
+ if (gMain.anyLinkBattlerHasFrontierPass && gReceivedRemoteLinkPlayers == 0)
+ CreateTask(Task_ReconnectWithLinkPlayers, 5);
gBattleCommunication[MULTIUSE_STATE]++;
break;
case 2:
- if (!FuncIsActiveTask(sub_80B3AF8))
+ if (!FuncIsActiveTask(Task_ReconnectWithLinkPlayers))
gBattleCommunication[MULTIUSE_STATE]++;
break;
case 3:
@@ -2531,7 +2503,7 @@ static void sub_803939C(void)
if (IsLinkTaskFinished() == TRUE)
{
HandleBattleWindow(0x18, 8, 0x1D, 0xD, WINDOW_CLEAR);
- if (gMain.field_439_x4)
+ if (gMain.anyLinkBattlerHasFrontierPass)
{
SetLinkStandbyCallback();
BattlePutTextOnWindow(gText_LinkStandby3, 0);
@@ -2542,15 +2514,15 @@ static void sub_803939C(void)
case 8:
if (--gBattleCommunication[1] == 0)
{
- if (gMain.field_439_x4 && !gWirelessCommType)
+ if (gMain.anyLinkBattlerHasFrontierPass && !gWirelessCommType)
SetCloseLinkCallback();
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
case 9:
- if (!gMain.field_439_x4 || gWirelessCommType || gReceivedRemoteLinkPlayers != 1)
+ if (!gMain.anyLinkBattlerHasFrontierPass || gWirelessCommType || gReceivedRemoteLinkPlayers != 1)
{
- gMain.field_439_x4 = 0;
+ gMain.anyLinkBattlerHasFrontierPass = 0;
if (!gPaletteFade.active)
{
SetMainCallback2(gMain.savedCallback);
@@ -2580,7 +2552,7 @@ static void sub_803939C(void)
case 11:
if (IsLinkTaskFinished() == TRUE && !IsTextPrinterActive(0) && --gBattleCommunication[1] == 0)
{
- if (gMain.field_439_x4)
+ if (gMain.anyLinkBattlerHasFrontierPass)
{
SetLinkStandbyCallback();
BattlePutTextOnWindow(gText_LinkStandby3, 0);
@@ -2592,11 +2564,11 @@ static void sub_803939C(void)
case 7:
if (!IsTextPrinterActive(0))
{
- if (gMain.field_439_x4)
+ if (gMain.anyLinkBattlerHasFrontierPass)
{
if (IsLinkTaskFinished() == TRUE)
{
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
+ BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);
gBattleCommunication[1] = 0x20;
gBattleCommunication[MULTIUSE_STATE] = 8;
}
@@ -2604,7 +2576,7 @@ static void sub_803939C(void)
}
else
{
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
+ BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);
gBattleCommunication[1] = 0x20;
gBattleCommunication[MULTIUSE_STATE] = 8;
}
@@ -2627,7 +2599,7 @@ static void TryCorrectShedinjaLanguage(struct Pokemon *mon)
}
}
-u32 sub_80397C4(u32 setId, u32 tableId)
+u32 GetBattleWindowTemplatePixelWidth(u32 setId, u32 tableId)
{
return gBattleWindowTemplates[setId][tableId].width * 8;
}
@@ -2658,7 +2630,7 @@ static void SpriteCb_WildMonShowHealthbox(struct Sprite *sprite)
{
if (sprite->animEnded)
{
- sub_8076918(sprite->sBattler);
+ StartHealthboxSlideIn(sprite->sBattler);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[sprite->sBattler]);
sprite->callback = SpriteCb_WildMonAnimate;
StartSpriteAnimIfDifferent(sprite, 0);
@@ -2679,7 +2651,8 @@ void SpriteCallbackDummy_2(struct Sprite *sprite)
}
-static void sub_80398BC(struct Sprite *sprite) // unused?
+// Unused
+static void sub_80398BC(struct Sprite *sprite)
{
sprite->data[3] = 6;
sprite->data[4] = 1;
@@ -2722,7 +2695,7 @@ void SpriteCB_FaintOpponentMon(struct Sprite *sprite)
if (species == SPECIES_UNOWN)
{
u32 personalityValue = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_PERSONALITY);
- u16 unownForm = ((((personalityValue & 0x3000000) >> 18) | ((personalityValue & 0x30000) >> 12) | ((personalityValue & 0x300) >> 6) | (personalityValue & 3)) % 0x1C);
+ u16 unownForm = GET_UNOWN_LETTER(personalityValue);
u16 unownSpecies;
if (unownForm == 0)
@@ -2803,7 +2776,7 @@ void SpriteCb_OpponentMonFromBall(struct Sprite *sprite)
{
if (sprite->affineAnimEnded)
{
- if (!(gHitMarker & HITMARKER_NO_ANIMATIONS) || gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
+ if (!(gHitMarker & HITMARKER_NO_ANIMATIONS) || gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK))
{
if (HasTwoFramesAnimation(sprite->sSpeciesId))
StartSpriteAnim(sprite, 1);
@@ -2812,12 +2785,13 @@ void SpriteCb_OpponentMonFromBall(struct Sprite *sprite)
}
}
-void sub_8039BB4(struct Sprite *sprite)
+// This callback is frequently overwritten by SpriteCB_TrainerSlideIn
+void SpriteCB_BattleSpriteStartSlideLeft(struct Sprite *sprite)
{
- sprite->callback = oac_poke_ally_;
+ sprite->callback = SpriteCB_BattleSpriteSlideLeft;
}
-static void oac_poke_ally_(struct Sprite *sprite)
+static void SpriteCB_BattleSpriteSlideLeft(struct Sprite *sprite)
{
if (!(gIntroSlideFlags & 1))
{
@@ -2830,7 +2804,8 @@ static void oac_poke_ally_(struct Sprite *sprite)
}
}
-void sub_80105DC(struct Sprite *sprite)
+// Unused
+static void sub_80105DC(struct Sprite *sprite)
{
sprite->callback = SpriteCallbackDummy_3;
}
@@ -2839,15 +2814,21 @@ static void SpriteCallbackDummy_3(struct Sprite *sprite)
{
}
-void sub_8039C00(struct Sprite *sprite)
+#define sSpeedX data[1]
+#define sSpeedY data[2]
+
+void SpriteCB_FaintSlideAnim(struct Sprite *sprite)
{
if (!(gIntroSlideFlags & 1))
{
- sprite->pos2.x += sprite->data[1];
- sprite->pos2.y += sprite->data[2];
+ sprite->pos2.x += sprite->sSpeedX;
+ sprite->pos2.y += sprite->sSpeedY;
}
}
+#undef sSpeedX
+#undef sSpeedY
+
#define sSinIndex data[0]
#define sDelta data[1]
#define sAmplitude data[2]
@@ -2967,7 +2948,7 @@ void sub_8039E9C(struct Sprite *sprite)
sprite->centerToCornerVecX = gUnknown_0831ACE0[sprite->animCmdIndex];
}
-void nullsub_20(void)
+void BeginBattleIntroDummy(void)
{
}
@@ -3041,7 +3022,7 @@ static void BattleStartClearSetData(void)
if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && gSaveBlock2Ptr->optionsBattleSceneOff == TRUE)
gHitMarker |= HITMARKER_NO_ANIMATIONS;
}
- else if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) && GetBattleSceneInRecordedBattle())
+ else if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) && GetBattleSceneInRecordedBattle())
gHitMarker |= HITMARKER_NO_ANIMATIONS;
gBattleScripting.battleStyle = gSaveBlock2Ptr->optionsBattleStyle;
@@ -3396,7 +3377,7 @@ static void BattleIntroDrawTrainersOrMonsSprites(void)
&& !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER
| BATTLE_TYPE_FRONTIER
| BATTLE_TYPE_LINK
- | BATTLE_TYPE_x2000000
+ | BATTLE_TYPE_RECORDED_LINK
| BATTLE_TYPE_TRAINER_HILL)))
{
HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality);
@@ -3409,7 +3390,7 @@ static void BattleIntroDrawTrainersOrMonsSprites(void)
if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER
| BATTLE_TYPE_FRONTIER
| BATTLE_TYPE_LINK
- | BATTLE_TYPE_x2000000
+ | BATTLE_TYPE_RECORDED_LINK
| BATTLE_TYPE_TRAINER_HILL)))
{
HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality);
@@ -3544,9 +3525,9 @@ static void BattleIntroPrintOpponentSendsOut(void)
if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED))
position = B_POSITION_OPPONENT_LEFT;
- else if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
+ else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK)
{
- if (gBattleTypeFlags & BATTLE_TYPE_x80000000)
+ if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER)
position = B_POSITION_OPPONENT_LEFT;
else
position = B_POSITION_PLAYER_LEFT;
@@ -3564,9 +3545,9 @@ static void BattleIntroOpponent2SendsOutMonAnimation(void)
if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED))
position = B_POSITION_OPPONENT_RIGHT;
- else if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
+ else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK)
{
- if (gBattleTypeFlags & BATTLE_TYPE_x80000000)
+ if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER)
position = B_POSITION_OPPONENT_RIGHT;
else
position = B_POSITION_PLAYER_RIGHT;
@@ -3592,9 +3573,9 @@ static void BattleIntroOpponent1SendsOutMonAnimation(void)
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
{
- if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
+ if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK)
{
- if (gBattleTypeFlags & BATTLE_TYPE_x80000000)
+ if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER)
position = B_POSITION_OPPONENT_LEFT;
else
position = B_POSITION_PLAYER_LEFT;
@@ -3635,7 +3616,7 @@ static void BattleIntroRecordMonsToDex(void)
&& !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER
| BATTLE_TYPE_FRONTIER
| BATTLE_TYPE_LINK
- | BATTLE_TYPE_x2000000
+ | BATTLE_TYPE_RECORDED_LINK
| BATTLE_TYPE_TRAINER_HILL)))
{
HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality);
@@ -3659,9 +3640,9 @@ static void BattleIntroPrintPlayerSendsOut(void)
if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED))
position = B_POSITION_PLAYER_LEFT;
- else if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
+ else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK)
{
- if (gBattleTypeFlags & BATTLE_TYPE_x80000000)
+ if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER)
position = B_POSITION_PLAYER_LEFT;
else
position = B_POSITION_OPPONENT_LEFT;
@@ -3682,9 +3663,9 @@ static void BattleIntroPlayer2SendsOutMonAnimation(void)
if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED))
position = B_POSITION_PLAYER_RIGHT;
- else if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
+ else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK)
{
- if (gBattleTypeFlags & BATTLE_TYPE_x80000000)
+ if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER)
position = B_POSITION_PLAYER_RIGHT;
else
position = B_POSITION_OPPONENT_RIGHT;
@@ -3714,9 +3695,9 @@ static void BattleIntroPlayer1SendsOutMonAnimation(void)
if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED))
position = B_POSITION_PLAYER_LEFT;
- else if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
+ else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK)
{
- if (gBattleTypeFlags & BATTLE_TYPE_x80000000)
+ if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER)
position = B_POSITION_PLAYER_LEFT;
else
position = B_POSITION_OPPONENT_LEFT;
@@ -3978,7 +3959,7 @@ u8 IsRunningFromBattleImpossible(void)
{
gBattleScripting.battler = i;
gLastUsedAbility = gBattleMons[i].ability;
- gBattleCommunication[MULTISTRING_CHOOSER] = 2;
+ gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PREVENTS_ESCAPE;
return 2;
}
if (side != GetBattlerSide(i)
@@ -3988,7 +3969,7 @@ u8 IsRunningFromBattleImpossible(void)
{
gBattleScripting.battler = i;
gLastUsedAbility = gBattleMons[i].ability;
- gBattleCommunication[MULTISTRING_CHOOSER] = 2;
+ gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PREVENTS_ESCAPE;
return 2;
}
}
@@ -3997,18 +3978,18 @@ u8 IsRunningFromBattleImpossible(void)
{
gBattleScripting.battler = i - 1;
gLastUsedAbility = gBattleMons[i - 1].ability;
- gBattleCommunication[MULTISTRING_CHOOSER] = 2;
+ gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PREVENTS_ESCAPE;
return 2;
}
if ((gBattleMons[gActiveBattler].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED))
|| (gStatuses3[gActiveBattler] & STATUS3_ROOTED))
{
- gBattleCommunication[MULTISTRING_CHOOSER] = 0;
+ gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CANT_ESCAPE;
return 1;
}
if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)
{
- gBattleCommunication[MULTISTRING_CHOOSER] = 1;
+ gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DONT_LEAVE_BIRCH;
return 1;
}
return 0;
@@ -4106,7 +4087,7 @@ static void HandleTurnActionSelectionState(void)
}
break;
case STATE_WAIT_ACTION_CHOSEN: // Try to perform an action.
- if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC))))
+ if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF << 28) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 12))))
{
RecordedBattle_SetBattlerAction(gActiveBattler, gBattleBufferB[gActiveBattler][1]);
gChosenActionByBattler[gActiveBattler] = gBattleBufferB[gActiveBattler][1];
@@ -4155,7 +4136,7 @@ static void HandleTurnActionSelectionState(void)
if (gBattleTypeFlags & (BATTLE_TYPE_LINK
| BATTLE_TYPE_FRONTIER_NO_PYRAMID
| BATTLE_TYPE_EREADER_TRAINER
- | BATTLE_TYPE_x2000000))
+ | BATTLE_TYPE_RECORDED_LINK))
{
RecordedBattle_ClearBattlerAction(gActiveBattler, 1);
gSelectionBattleScripts[gActiveBattler] = BattleScript_ActionSelectionItemsCantBeUsed;
@@ -4263,7 +4244,7 @@ static void HandleTurnActionSelectionState(void)
return;
}
else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER
- && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
+ && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK))
&& gBattleBufferB[gActiveBattler][1] == B_ACTION_RUN)
{
BattleScriptExecute(BattleScript_PrintCantRunFromTrainer);
@@ -4285,7 +4266,7 @@ static void HandleTurnActionSelectionState(void)
}
break;
case STATE_WAIT_ACTION_CASE_CHOSEN:
- if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC))))
+ if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF << 28) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 12))))
{
switch (gChosenActionByBattler[gActiveBattler])
{
@@ -4393,7 +4374,11 @@ static void HandleTurnActionSelectionState(void)
}
break;
case STATE_WAIT_ACTION_CONFIRMED_STANDBY:
- if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC))))
+ if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler])
+ | (0xF << 28)
+ | (gBitTable[gActiveBattler] << 4)
+ | (gBitTable[gActiveBattler] << 8)
+ | (gBitTable[gActiveBattler] << 12))))
{
if (AllAtActionConfirmed())
i = TRUE;
@@ -4415,7 +4400,7 @@ static void HandleTurnActionSelectionState(void)
}
break;
case STATE_WAIT_ACTION_CONFIRMED:
- if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC))))
+ if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF << 28) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 12))))
{
gBattleCommunication[ACTIONS_CONFIRMED_COUNT]++;
}
@@ -4429,7 +4414,7 @@ static void HandleTurnActionSelectionState(void)
{
gBattlerAttacker = gActiveBattler;
gBattlescriptCurrInstr = gSelectionBattleScripts[gActiveBattler];
- if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC))))
+ if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF << 28) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 12))))
{
gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]]();
}
@@ -4437,7 +4422,7 @@ static void HandleTurnActionSelectionState(void)
}
break;
case STATE_WAIT_SET_BEFORE_ACTION:
- if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC))))
+ if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF << 28) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 12))))
{
gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN;
}
@@ -4461,7 +4446,7 @@ static void HandleTurnActionSelectionState(void)
{
gBattlerAttacker = gActiveBattler;
gBattlescriptCurrInstr = gSelectionBattleScripts[gActiveBattler];
- if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC))))
+ if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF << 28) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 12))))
{
gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]]();
}
@@ -4574,7 +4559,7 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves)
}
// badge boost
- if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_FRONTIER))
+ if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_FRONTIER))
&& FlagGet(FLAG_BADGE03_GET)
&& GetBattlerSide(battler1) == B_SIDE_PLAYER)
{
@@ -4608,7 +4593,7 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves)
}
// badge boost
- if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_FRONTIER))
+ if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_FRONTIER))
&& FlagGet(FLAG_BADGE03_GET)
&& GetBattlerSide(battler2) == B_SIDE_PLAYER)
{
@@ -4892,7 +4877,7 @@ static void HandleEndTurn_BattleWon(void)
{
gCurrentActionFuncId = 0;
- if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
+ if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK))
{
gSpecialVar_Result = gBattleOutcome;
gBattleTextBuff1[0] = gBattleOutcome;
@@ -4950,7 +4935,7 @@ static void HandleEndTurn_BattleLost(void)
{
gCurrentActionFuncId = 0;
- if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
+ if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK))
{
if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
{
@@ -4962,7 +4947,7 @@ static void HandleEndTurn_BattleLost(void)
}
else
{
- gBattlescriptCurrInstr = BattleScript_82DAA0B;
+ gBattlescriptCurrInstr = BattleScript_FrontierLinkBattleLost;
gBattleOutcome &= ~(B_OUTCOME_LINK_BATTLE_RAN);
}
}
@@ -5031,7 +5016,7 @@ static void HandleEndTurn_FinishBattle(void)
if (gCurrentActionFuncId == B_ACTION_TRY_FINISH || gCurrentActionFuncId == B_ACTION_FINISHED)
{
if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK
- | BATTLE_TYPE_x2000000
+ | BATTLE_TYPE_RECORDED_LINK
| BATTLE_TYPE_FIRST_BATTLE
| BATTLE_TYPE_SAFARI
| BATTLE_TYPE_EREADER_TRAINER
@@ -5054,11 +5039,11 @@ static void HandleEndTurn_FinishBattle(void)
}
}
}
- PutPokemonTodayCaughtOnAir();
+ TryPutPokemonTodayOnAir();
}
if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK
- | BATTLE_TYPE_x2000000
+ | BATTLE_TYPE_RECORDED_LINK
| BATTLE_TYPE_TRAINER
| BATTLE_TYPE_FIRST_BATTLE
| BATTLE_TYPE_SAFARI
@@ -5067,7 +5052,7 @@ static void HandleEndTurn_FinishBattle(void)
| BATTLE_TYPE_WALLY_TUTORIAL))
&& gBattleResults.shinyWildMon)
{
- sub_80EE184();
+ TryPutBreakingNewsOnAir();
}
sub_8186444();
@@ -5124,7 +5109,7 @@ static void TryEvolvePokemon(void)
levelUpBits &= ~(gBitTable[i]);
gLeveledUpInBattle = levelUpBits;
- species = GetEvolutionTargetSpecies(&gPlayerParty[i], 0, levelUpBits);
+ species = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_NORMAL, levelUpBits);
if (species != SPECIES_NONE)
{
FreeAllWindowBuffers();
@@ -5163,7 +5148,12 @@ static void ReturnFromBattleToOverworld(void)
if (gBattleTypeFlags & BATTLE_TYPE_ROAMER)
{
UpdateRoamerHPStatus(&gEnemyParty[0]);
+
+#ifndef BUGFIX
if ((gBattleOutcome & B_OUTCOME_WON) || gBattleOutcome == B_OUTCOME_CAUGHT)
+#else
+ if ((gBattleOutcome == B_OUTCOME_WON) || gBattleOutcome == B_OUTCOME_CAUGHT) // Bug: When Roar is used by roamer, gBattleOutcome is B_OUTCOME_PLAYER_TELEPORTED (5).
+#endif // & with B_OUTCOME_WON (1) will return TRUE and deactivates the roamer.
SetRoamerInactive();
}